Come ottenere delimitatori arcobaleno / blocchi arcobaleno per evidenziare la matematica in linea nelle equazioni LaTeX


12

Sto usando spacemacs con AUCTeX per l'editing di LaTeX e vorrei che i delimitatori arcobaleno e / o i blocchi arcobaleno evidenziassero le equazioni matematiche di LaTeX. Sfortunatamente questo funziona solo in parte, cioè alcune equazioni vengono evidenziate e altre no:

Esempio: delimitatori arcobaleno

Nello screenshot di esempio, la matematica in linea racchiusa in $non viene evidenziata mentre il resto - inclusa la matematica in linea racchiusa in \(...\)- lo fa.

Con rainbow-blocksciò peggiora, poiché a volte funzionerà in un punto del documento e a volte non funzionerà indipendentemente dall'ambito.

Esempio: blocchi arcobaleno

D: Qualcuno sa perché questo accada o come iniziare a rainbow-blockslavorare per la matematica in linea in LaTeX? Ci sono alternative di lavoro?


La modalità latex in auctex sembra definire "$" per avere una sintassi speciale nella tabella della sintassi, quindi forse la fontificazione sintattica di font-lock sta scavalcando qualsiasi fontificazione basata su parole chiave.
Kirill,

highlight-parenthesesutilizza le sovrapposizioni anziché il blocco dei caratteri e sarebbe molto semplice utilizzare una tabella di sintassi temporanea per la durata della funzione di sovrapposizione. github.com/nschum/highlight-parentheses.el La funzione che dovrebbe essere modificata in quella libreria è hl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . Sfortunatamente, questa è un'altra libreria rispetto a quella che hai specificato - Non so come risolvere rainbow-delimiters- forse potresti aprire un problema su Github con il manutentore.
elenco delle leggi

Usandolo (with-silent-modifications (remove-text-properties (region-beginning) (region-end) '(face nil font-lock-face nil)) (add-text-properties (region-beginning) (region-end) '(face rainbow-delimiters-depth-1-face)))è possibile sostituire la fontificazione all'interno di una formula incorporata. Ma questo non funziona in un consiglio di circa rainbow-delimiters-propertize-delimiter. Ciò indica che la fontificazione di latex-modeavviene dopo la fontificazione rainbow-delimiters-mode.
Tobias,

rainbow-delimiters usa direttamente jit-lock. Forse, la fontificazione sintattica non usa jit-lock e abbiamo un problema di temporizzazione a causa di ciò?
Tobias,

Risposte:


2

Quanto segue è più simile a un commento da allora

  1. risolve solo una piccola parte del problema ( rainbow-delimiters-mode)
  2. non è stato testato a fondo (solo con un file in lattice)
  3. Non capisco completamente perché funzioni ( font-lock-modeè davvero un macchinario abbastanza complicato)

Inizialmente la soluzione per rainbow-delimiters-mode:

Sostituiamo la proprietà text font-lock-facecon facein rainbow-delimiters-propertize-delimitere rainbow-delimiters-unpropertize-delimiter. Poiché defsubstviene utilizzato nel pacchetto anziché defunnon possiamo utilizzarlo defaliasma dobbiamo modificare le funzioni stesse (per quanto ne capisco - si prega di commentare se sbaglio in questo senso).

Le funzioni modificate sono:

(defsubst rainbow-delimiters-propertize-delimiter (loc depth)
  "Highlight a single delimiter at LOC according to DEPTH.

LOC is the location of the character to add text properties to.
DEPTH is the nested depth at LOC, which determines the face to use.

Sets text properties:
`font-lock-face' to the appropriate delimiter face.
`rear-nonsticky' to prevent color from bleeding into subsequent characters typed by the user."
  (with-silent-modifications
    (let ((delim-face (if (<= depth 0)
                          'rainbow-delimiters-unmatched-face
                        (rainbow-delimiters-depth-face depth))))
      ;; (when (eq depth -1) (message "Unmatched delimiter at char %s." loc))
      (add-text-properties loc (1+ loc)
               ;; 2015-05-24: Changed font-lock-face to face to enable rainbow after syntax fontification in latex-mode
               ;; (see http://emacs.stackexchange.com/questions/4260/how-to-get-rainbow-delimiters-rainbow-blocks-to-highlight-in-line-math-in-latex)
                           `(face ,delim-face
                             rear-nonsticky t)))))


(defsubst rainbow-delimiters-unpropertize-delimiter (loc)
  "Remove text properties set by rainbow-delimiters mode from char at LOC."
  (with-silent-modifications
    (remove-text-properties loc (1+ loc)
                ;; 2015-05-24: See corresponding line in `rainbow-delimiters-propertize-delimiter'.
                            '(face nil
                              rear-nonsticky nil))))

Ora il ragionamento:

Le formule incorporate tra i $ -delimiter sono sintattiche definite da font-lock-mode (come già sottolineato da Kirill). La registrazione di questa fontificazione sembra normale (vedi variabile font-lock-syntactic-face-functione funzione font-latex-syntactic-face-function). Ma describe-charai caratteri di una formula incorporata mostra che la fontificazione sintattica usa la faceproprietà anziché la font-lock-faceproprietà.

Quanto segue è ipotetico poiché non capisco completamente il meccanismo di blocco dei caratteri che è piuttosto complesso.

Sembra che facesia più forte di font-lock-face. Usi delimitatori arcobaleno font-lock-facedominati dalla facefontificazione sintattica. Tuttavia, abbiamo il vantaggio che la fontificazione sintattica viene prima della fontificazione basata sulla ricerca (parola chiave) che a sua volta utilizza jit-lock (vedere le pagine di informazioni font-lock-mode).

Questo mi porta alla conclusione che il problema è risolto se usiamo facenel rainbow-delimitersposto di font-lock-face. E qui non conosco le conseguenze complete. Ma dal momento che rainbow-delimitersutilizza anche jit-lockdirettamente (e non attraverso font-lock-mode) siamo comunque su un pavimento traballante.

Si noti che avevo già qualche contatto con rainbow-delimiters(consultare /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ) ma non con rainbow-blocks. Poiché ho solo un periodo di tempo limitato, ho scelto di concentrarmi rainbow-delimiters. Forse, puoi risolvere il rainbow-blocksproblema in modo simile.

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.