Come posso sfuggire a * in modalità org per impedire la fontificazione in grassetto


12

Se scrivo qualcosa come *shrug*in modalità org, verrà automaticamente classificato come grassetto . Come posso evitarlo, vale a dire in realtà *shrug*apparire alla lettera quando esportato?

Modificare:

Voglio ancora essere in grado di utilizzare la fontificazione in grassetto (senza dover cambiare la sintassi a stella predefinita per il testo in grassetto) e non dovrebbe importare in quale formato di file viene esportato il mio file org, ad esempio dovrebbe funzionare per Markdown e HTML esportare.

Queste sono alcune cose importanti , ecco perché è scritto in grassetto. Ma per qualcos'altro, non ho idea * scrollata di spalle *.


1
Se lo stai esportando in LaTeX in un secondo momento, potresti provare \ast{}shrug\ast{}o \star{}shrug\star{}, in modo simile, con HTML puoi usare la codifica di entità: &#2a;o se l'aggiunta di spazi prima o dopo l'asterisco è un'opzione, funzionerebbe anche.
wvxvw,

Sembra che la risposta di Suvayu di semplicemente avvolgerlo in marcatori testuali sia ciò che desideri. In alternativa, è possibile modificare l'enfasi dell'organizzazione in modo che un altro carattere venga utilizzato per mettere in grassetto il testo.
user2699

Non esattamente. = * scrollata di spalle * = fa codesì che l'HTML esportato venga racchiuso in un -tag e nel markdown abbia backtick. Voglio che non sia affatto formattato.
Timor,

Domanda modificata per riflettere che il cambiamento dell'enfasi dell'organizzazione non è in realtà un'opzione. Non voglio cambiare tutto in grassetto che già esiste nel mio file .org.
Timor,

2
Il \ast{}shrug\ast{}citato da wvxvw è probabilmente la tua migliore opzione. esporta in html come ∗shrug∗e in lattice come $\ast$shrug$\ast$usando le entità carattere appropriate. org-toggle-pretty-entitiesli visualizza come caratteri UTF8 nel buffer dell'organizzazione.
Mutbuerger,

Risposte:


9

Questa risposta si ispira a suggerimenti collettivi sulla lista GNU in modalità emacs-org per usare i caratteri org-entity( C-h i g (org) Special symbols) \ast{}anziché lo spazio di larghezza zero (che ho suggerito nell'altra mia risposta qui ).

Di seguito è una soluzione generica in cui l'utente non ha bisogno di ricordare le entità organizzative per vari simboli. Inserisce l'entità org (se disponibile) quando l'utente lo fa C-u SYMBOL; funziona per 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)

Pertanto, quando l'utente digita C-u *, \ast{}viene inserito e il messaggio seguente viene visualizzato nell'area di eco,

Inserito 'org-entity' \ ast {} per il simbolo *.

Se org-pretty-entitiesimpostato su tsopra, quello inserito \ast{}verrà visualizzato come *.

Se an org-entitynon esiste per un personaggio X e se l'utente fa C-u X , X viene semplicemente inserito 4 volte (come C-ufarebbe di solito).


1
Questo sembra davvero conveniente. L'unico drwaback (secondo me) che rimane è che il file .org, che finora non contiene alcun costrutto LaTeX, ora ha frammenti di sintassi non-org-mode (LaTeX) sparsi in tutto il file. A proposito, c'è una ragione per cui non \*thisisnotbold\*esiste un costrutto simile ?
Timor,

1
Anche questa è sintassi dell'organizzazione. Consulta la org-entitiesdocumentazione.
Kaushal Modi,

8

Utilizzo del carattere unicode ZERO WIDTH SPACE

Puoi evitare l'analisi in grassetto dell'enfasi aggiungendo un carattere di spazio di larghezza zero (indicato da [ZWS] negli snippet seguenti) prima del primo asterisco o dopo il secondo asterisco.

Entrambi i seguenti frammenti sono stati esportati bene in HTML nei miei test:

  • [ZWS] prima del primo asterisco

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • [ZWS] dopo il secondo asterisco

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

Puoi inserire ZERO WIDTH SPACE (nome unicode) facendo C-x 8 RET 200b RET.
Lo uso molto spesso, quindi l' ho legato aC-x 8 0 .


Aggiornare

Come da discussione sulla mailing list di emacs-org-mode , non è raccomandato l'uso di caratteri non ASCII per la fuga; invece org-entitiesdovrebbe essere usato se applicabile. Anch'io sono d'accordo con questo e ho trovato un'altra soluzione che rende l'inserimento org-entitiesdavvero semplice ( C-u *in questo caso).


Tecnicamente questo è un modo abbastanza veloce per risolvere il problema. Fa affidamento sulla modalità org che non interpreta ZWS come spazio bianco? Inoltre, temo che la soluzione non sia obiettiva per le altre persone che modificano il file org ...
Timor,

@timor Ho sollevato questa discussione sulla emacs-orgmode@gnu.orgmailing list. Se interessati, è possibile seguire / aggiungere alla discussione qui .
Kaushal Modi,

@timor, non è ovvio, ma di tutte le soluzioni fornite qui è l'unica che funziona senza modificare la configurazione di emacs, quindi è la più ovvia se vuoi condividere i tuoi file.
user2699

@ user2699 FWIW, l'uso delle entità organizzative nei file funzionerà immediatamente senza alcuna configurazione dell'utente .. è solo l'uso di ascii \ast{}nei file. L' altra mia soluzione rende semplicemente l'accesso \ast{}più veloce e più facile da ricordare.
Kaushal Modi,

3

In parole povere, se intendi effettivamente usare un po 'di markup nel LaTeX esportato, allora puoi semplicemente usare =*shrug*=. Tuttavia, se vuoi solo che venga esportato come *shrug*, e vuoi farlo sempre, consiglierei i filtri . Se tuttavia, questo è necessario solo per alcuni casi di *shrug*, è necessario utilizzare l'alternativa suggerita da @wvxvw. Puoi farlo in modo pulito usando le macro . Seguono alcuni esempi.

filtri

(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)

In sostanza il filtro sopra cerca il \textbf{..}markup nella stringa transcodificata e lo sostituisce con \ast{}..\ast{}, senza cambiare ciò che è stato racchiuso all'interno {..}. Non ho testato l'espressione regolare e la stringa di sostituzione, quindi potrebbero esserci degli errori, ma hai capito. Analogamente per coprire altri backend, è possibile includere frammenti extra come questo:

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

Lo stesso avvertimento vale per l'espressione regolare sopra.

Macro

Fonte dell'organizzazione:

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

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

esporta in LaTeX come:

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

e in HTML come:

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

Ovviamente puoi aggiungere tutti i backend che desideri alla macro.

Modifica: come sottolinea Kaushal nei commenti, lo snippet di esportazione per il lattice è facoltativo in questo caso. Preferisco comunque usarli ogni volta che è coinvolto il lattice nudo, poiché trovo piuttosto difficile tenere traccia dell'elenco org-entitiese delle regole specifiche dietro l'identificazione del lattice nudo nella fonte Org.

Nota:

  • gli esempi di filtro non sono stati testati,
  • Non ne conosco nessuno HTML, quindi potrebbero esserci degli errori nei rispettivi bit.

Non dovrebbe questa definizione basti macro: #+macro: nobold \ast{}$1\ast{}? astè uno dei membri della org-entitieslista, che specifica quali il lattice, HTML, ASCII, ecc esportazioni dovrebbe essere simile: ("ast" "\\ast" t "&lowast;" "*" "*" "*"). L'ordine degli elementi in quell'elenco è "nome, sostituzione LaTeX, LaTeX mathp, sostituzione HTML, sostituzione ASCII, sostituzione Latin1, sostituzione utf-8".
Kaushal Modi,

@kaushalmodi Sì, lo sarebbe, tuttavia, poiché sappiamo già che è LaTeX, non c'è nulla di male nel metterlo all'interno di un frammento di lattice. Nella mia esperienza l'uso di frammenti è molto più robusto a causa della sua inequivocabilità.
Quarky,

-1

Questo è controllato dalla variabile org-enfasi-alist e può essere facilmente modificato.

  • Metti il ​​punto sopra il testo in grassetto, usa il comando what-cursore-position C-u C-x =per trovare la faccia, nota che ha proprietà org-emphasis.
  • Chiama customize-groupe cerca l'enfasi dell'organizzazione
  • org-enfasi-alist dovrebbe apparire, con varie opzioni per contrassegnare il testo.
  • Elimina la voce corrispondente a *
  • Applica le modifiche e riavvia la modalità organizzazione o emacs
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.