Comment puis-je échapper au * en mode org pour éviter une police en gras

12

Si j'écris quelque chose comme *shrug*en mode org, il sera automatiquement police en texte gras . Comment puis-je empêcher cela, c'est-à-dire avoir réellement *shrug*apparaître textuellement lors de l'exportation?

Éditer:

Je veux toujours pouvoir utiliser une police en gras (sans avoir à changer la syntaxe en étoile par défaut pour le texte en gras), et le format de fichier exporté par mon fichier d'organisation ne devrait pas avoir d'importance, par exemple, il devrait fonctionner pour Markdown ainsi que pour HTML exportation.

Il s'agit de choses importantes , c'est pourquoi elles sont écrites en gras. Mais pour autre chose, je n'ai aucune idée * haussement d'épaules *.

timor
la source
1
Si vous exportez cela vers LaTeX plus tard, vous pouvez essayer \ast{}shrug\ast{}ou \star{}shrug\star{}, similaire, avec HTML, vous pouvez utiliser le codage d'entité:, &#2a;ou si l'ajout d'espaces avant ou après l'astérisque est une option, cela fonctionnerait aussi.
wvxvw
Il semble que la réponse de suvayu consistant à simplement l'envelopper dans des marqueurs textuels soit ce que vous voulez. Vous pouvez également modifier l'organisation-accent-alist de sorte qu'un autre caractère soit utilisé pour mettre du texte en gras.
user2699
Pas exactement. = * haussement d'épaules * = entraîne le HTML exporté à être enveloppé dans un code-tag, et dans le démarque a des backticks. Je veux qu'il ne soit pas du tout formaté.
timor
Question modifiée pour refléter que changer l'organisation-accent-aliste n'est pas vraiment une option. Je ne veux pas tout changer en gras qui existe déjà dans mon fichier .org.
timor
2
Le \ast{}shrug\ast{}mentionné par wvxvw est probablement votre meilleure option. il exporte vers html ∗shrug∗et vers latex en $\ast$shrug$\ast$utilisant les entités de caractères appropriées. org-toggle-pretty-entitiesles affiche sous forme de caractères UTF8 dans le tampon d'organisation.
mutbuerger

Réponses:

9

Cette réponse est inspirée des suggestions collectives sur la liste GNU emacs-org-mode d'utiliser le org-entity( C-h i g (org) Special symbols) \ast{}au lieu des caractères d' espace de largeur nulle (ce que j'ai suggéré dans mon autre réponse ici ).

Voici une solution générique où l'utilisateur n'a pas besoin de se souvenir des entités organisationnelles pour divers symboles. Il insère l'entité org (si disponible) lorsque l'utilisateur le fait C-u SYMBOL; fonctionne pour C-u *, C-u /, C-u =, etc.

(defun modi/org-entity-get-name (char)
  "Return the entity name for CHAR. For example, return \"ast\" for *."
  (let ((ll (append org-entities-user
                    org-entities))
        e name utf8)
    (catch 'break
      (while ll
        (setq e (pop ll))
        (when (not (stringp e))
          (setq utf8 (nth 6 e))
          (when (string= char utf8)
            (setq name (car e))
            (throw 'break name)))))))

(defun modi/org-insert-org-entity-maybe (&rest args)
  "When the universal prefix C-u is used before entering any character,
    insert the character's `org-entity' name if available.

    If C-u prefix is not used and if `org-entity' name is not available, the
    returned value `entity-name' will be nil."
  ;; It would be fine to use just (this-command-keys) instead of
  ;; (substring (this-command-keys) -1) below in emacs 25+.
  ;; But if the user pressed "C-u *", then
  ;;  - in emacs 24.5, (this-command-keys) would return "^U*", and
  ;;  - in emacs 25.x, (this-command-keys) would return "*".
  ;; But in both versions, (substring (this-command-keys) -1) will return
  ;; "*", which is what we want.
  ;; http://thread.gmane.org/gmane.emacs.orgmode/106974/focus=106996
  (let ((pressed-key (substring (this-command-keys) -1))
        entity-name)
    (when (and (listp args) (eq 4 (car args)))
      (setq entity-name (modi/org-entity-get-name pressed-key))
      (when entity-name
        (setq entity-name (concat "\\" entity-name "{}"))
        (insert entity-name)
        (message (concat "Inserted `org-entity' "
                         (propertize entity-name
                                     'face 'font-lock-function-name-face)
                         " for the symbol "
                         (propertize pressed-key
                                     'face 'font-lock-function-name-face)
                         "."))))
    entity-name))

;; Run `org-self-insert-command' only if `modi/org-insert-org-entity-maybe'
;; returns nil.
(advice-add 'org-self-insert-command :before-until #'modi/org-insert-org-entity-maybe)

Ainsi, lorsque l'utilisateur tape C-u *, \ast{}est inséré et le message ci-dessous s'affiche dans la zone d'écho,

'Org-entity' \ ast {} insérée pour le symbole *.

Si org-pretty-entitiesest réglé sur tci-dessus, l'inséré \ast{}sera affiché comme *.

Si an org-entityn'existe pas pour un caractère X et si l'utilisateur fait C-u X , X est simplement inséré 4 fois (comme d' C-uhabitude).

Kaushal Modi
la source
1
Cela semble vraiment pratique. Le seul drwaback (à mon avis) qui reste, est que le fichier .org, qui ne contient pas de constructions LaTeX jusqu'à présent, a maintenant des bits de syntaxe non-org-mode (LaTeX) dispersés dans le fichier. Soit dit en passant, y a-t-il une raison pour laquelle aucune construction comme celle-ci \*thisisnotbold\*n'existe?
timor
1
C'est aussi la syntaxe de l'organisation. Consultez la org-entitiesdocumentation.
Kaushal Modi
8

Utilisation du caractère unicode ZERO WIDTH SPACE

Vous pouvez échouer l'analyse en gras en ajoutant un caractère d'espace de largeur nulle (indiqué par [ZWS] dans les extraits ci-dessous) avant le premier astérisque ou après le deuxième astérisque.

Les deux extraits ci-dessous ont été exportés correctement au format HTML dans mes tests:

  • [ZWS] avant le premier astérisque

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • [ZWS] après le deuxième astérisque

    This is some *bold* test and this is *not bold*​[ZWS].
    

Vous pouvez entrer l'ESPACE LARGEUR ZÉRO (nom unicode) en faisant C-x 8 RET 200b RET.
Je l'utilise très souvent, donc je l'ai lié àC-x 8 0 .


Mise à jour

Selon la discussion sur la liste de diffusion emacs-org-mode , l'utilisation de caractères non ASCII pour l'échappement n'est pas recommandée; au lieu org-entitiesdoit être utilisé le cas échéant. Moi aussi, j'étais d'accord avec cela et j'ai trouvé une autre solution qui rend l'insertion org-entitiestrès facile ( C-u *dans ce cas).

Kaushal Modi
la source
Techniquement, c'est un moyen assez rapide de résoudre le problème. Est-ce que cela repose sur le mode organisationnel qui n'interprète pas le ZWS comme un espace blanc? De plus, je crains que la solution ne soit pas évidente pour les autres personnes éditant le fichier org ...
timor
@timor J'ai mis cette discussion sur la [email protected]liste de diffusion. Si vous êtes intéressé, vous pouvez suivre / compléter la discussion ici .
Kaushal Modi du
@timor, ce n'est pas évident, mais de toutes les solutions présentées ici, c'est la seule qui fonctionne sans modifier la configuration d'emacs, c'est donc la plus évidente si vous voulez partager vos fichiers.
user2699
@ user2699 FWIW, l'utilisation d'entités organisationnelles dans les fichiers fonctionnera immédiatement sans aucune configuration utilisateur .. c'est juste l'utilisation de plain ascii \ast{}dans les fichiers. Mon autre solution rend tout simplement l'entrée \ast{}plus rapide et plus facile à retenir.
Kaushal Modi
3

Par mot à mot, si vous voulez réellement utiliser un balisage dans le LaTeX exporté, vous pouvez simplement l'utiliser =*shrug*=. Cependant, si vous souhaitez simplement l'exporter en tant que *shrug*, et que vous souhaitez le faire tout le temps, je recommanderais des filtres . Si toutefois vous n'en avez besoin que pour certaines instances de *shrug*, vous devez utiliser l'alternative suggérée par @wvxvw. Vous pouvez le faire proprement en utilisant des macros . Quelques exemples suivent.

Filtres

(defun my-bold (contents backend info)
  (when (org-export-derived-backend-p backend 'latex)
    (replace-regexp-in-string "\\`\\\\textbf{\\(.+\\)}"
                              "\\\\ast{}\\1\\\\ast{}" contents)))

(add-to-list 'org-export-filter-bold-functions 'my-bold)

Essentiellement, le filtre ci-dessus recherche le \textbf{..}balisage dans la chaîne transcodée et le remplace par \ast{}..\ast{}, sans modifier ce qui a été enveloppé à l'intérieur {..}. Je n'ai pas testé l'expression régulière et la chaîne de remplacement, il pourrait donc y avoir des erreurs, mais vous avez compris. De même pour couvrir d'autres backends, on peut inclure des extraits supplémentaires comme celui-ci:

(when (org-export-derived-backend-p backend 'html)
   (replace-regexp-in-string "<b>\\(.+\\)</b>" "\&#2a;\\1\&#2a;" contents))

La même mise en garde vaut pour l'expression régulière ci-dessus.

Macros

Source de l'organisation:

#+macro: nobold @@latex:\ast{}$1\ast{}@@ @@html:&#2a;$1&#2a;@@

This text is *bold* this is nobold{{{not}}}

exporte vers LaTeX en tant que:

This text is \textbf{bold} this is \ast{}not\ast{}

et en HTML comme:

This text is <b>bold</b> this is  &#2a;not&#2a;

Vous pouvez bien sûr ajouter autant de backends que vous le souhaitez à la macro.

Edit: comme le souligne Kaushal dans les commentaires, l'extrait d'exportation de latex est facultatif dans ce cas. Je préfère cependant les utiliser chaque fois que du latex nu est impliqué, car j'ai du mal à garder une trace de la liste org-entitieset des règles spécifiques derrière l'identification du latex nu dans la source Org.

Remarque:

  • les exemples de filtres n'ont pas été testés,
  • Je n'en connais pas HTML, donc il pourrait y avoir des erreurs dans les bits respectifs.
Quarky
la source
Ne devrait pas cette définition macro suffisent: #+macro: nobold \ast{}$1\ast{}? astest l' un des membres de la org-entitiesliste, qui spécifie ce que le latex, html, ascii, les exportations etc devraient ressembler à : ("ast" "\\ast" t "&lowast;" "*" "*" "*"). L'ordre des éléments dans cette liste est "nom, remplacement LaTeX, mathématiques LaTeX, remplacement HTML, remplacement ASCII, remplacement Latin1, remplacement utf-8".
Kaushal Modi
@kaushalmodi Oui, ce serait le cas, cependant, puisque nous savons déjà qu'il s'agit de LaTeX, il n'y a aucun mal à le placer dans un extrait de latex. D'après mon expérience, l'utilisation d'extraits est beaucoup plus robuste en raison de son ambiguïté.
Quarky
-1

Ceci est contrôlé par la variable org-accent-alist, et peut être facilement modifié.

  • Mettez un point sur du texte en gras, utilisez la commande what-cursor-position C-u C-x =pour trouver le visage, notez qu'il a une propriété org-emphasis.
  • Appelez customize-groupet recherchez org-accent
  • org-accent-alist devrait apparaître, avec diverses options pour marquer le texte.
  • Supprimer l'entrée correspondant à *
  • Appliquer les modifications et redémarrer le mode organisation ou emacs
user2699
la source