Comment obtenir des délimiteurs / blocs arc-en-ciel pour mettre en évidence les mathématiques en ligne dans les équations LaTeX

12

J'utilise des spacemacs avec AUCTeX pour l'édition LaTeX et je voudrais que les délimiteurs arc-en-ciel et / ou les blocs arc-en-ciel mettent en évidence les équations mathématiques LaTeX. Malheureusement, cela ne fonctionne que partiellement, c'est-à-dire que certaines équations sont mises en évidence et d'autres non:

Exemple: délimiteurs arc-en-ciel

Dans l'exemple de capture d'écran, les mathématiques en ligne incluses dans $ne sont pas mises en surbrillance tandis que le reste - y compris les mathématiques en ligne incluses dans \(...\)- le fait.

Avec rainbow-blockscela empire, car cela fonctionnera parfois à un endroit du document et parfois ne fonctionnera pas quelle que soit la portée.

Exemple: blocs arc-en-ciel

Q: Quelqu'un sait-il pourquoi cela se produit ou comment commencer à rainbow-blockstravailler pour les mathématiques en ligne dans LaTeX? Existe-t-il des alternatives de travail?

nemesit
la source
latex-mode dans auctex semble définir "$" pour avoir une syntaxe spéciale dans la table de syntaxe, donc peut-être que la police syntaxique de font-lock remplace toute police basée sur mot-clé.
Kirill
highlight-parenthesesutilise des superpositions au lieu du verrouillage de police, et il serait très simple d'utiliser une table de syntaxe temporaire pour la durée de la fonction de superposition. github.com/nschum/highlight-parentheses.el La fonction qui devrait être modifiée dans cette bibliothèque est hl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . malheureusement, c'est une autre bibliothèque que celle que vous avez spécifiée - je ne sais pas comment corriger rainbow-delimiters- peut-être pourriez-vous ouvrir un problème sur Github avec le mainteneur.
Lawlist
En l'utilisant, (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)))il est possible de remplacer la fontification dans une formule incorporée. Mais cela ne fonctionne pas dans un conseil autour de rainbow-delimiters-propertize-delimiter. Cela indique que la fontification de latex-modea lieu après la fontification rainbow-delimiters-mode.
Tobias
rainbow-delimiters utilise directement jit-lock. Peut-être que la fontification syntaxique n'utilise pas jit-lock et nous avons un problème de timing à cause de cela?
Tobias

Réponses:

2

Ce qui suit ressemble plus à un commentaire puisque

  1. il ne résout qu'une petite partie du problème ( rainbow-delimiters-mode)
  2. il n'est pas testé à fond (juste avec un fichier latex)
  3. Je ne comprends pas complètement pourquoi cela fonctionne ( font-lock-modec'est vraiment une machine assez compliquée)

Dans un premier temps la solution pour rainbow-delimiters-mode:

Nous remplaçons la propriété text font-lock-facepar facein rainbow-delimiters-propertize-delimiteret rainbow-delimiters-unpropertize-delimiter. Étant donné que defsubstest utilisé dans le package au lieu de, defunnous ne pouvons pas l'utiliser, defaliasmais nous devons modifier les fonctions elles-mêmes (pour autant que je le comprenne - veuillez commenter si je me trompe à cet égard).

Les fonctions modifiées sont:

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

Maintenant, le raisonnement:

Les formules imbriquées entre les $ -delimiters sont des syntaxes caractérisées par font-lock-mode (comme Kirill l'a déjà souligné). L'enregistrement de cette fontification semble normal (voir variable font-lock-syntactic-face-functionet fonction font-latex-syntactic-face-function). Mais describe-charau niveau des caractères d'une formule intégrée, la police syntaxique utilise la facepropriété au lieu de la font-lock-facepropriété.

Ce qui suit est hypothétique car je ne comprends pas complètement le mécanisme de verrouillage des polices qui est assez complexe.

Il semble que ce facesoit plus fort que font-lock-face. Les délimiteurs arc-en-ciel font-lock-facesont dominés par facela fontification syntaxique. Néanmoins, nous avons l'avantage que la fontification syntaxique vient en premier avant la fontification basée sur la recherche (mot-clé) qui à son tour utilise jit-lock (voir les pages info de font-lock-mode).

Cela m'amène à la conclusion que le problème est résolu si nous utilisons faceau rainbow-delimiterslieu de font-lock-face. Et ici, je ne connais pas toutes les conséquences. Mais, puisque nous rainbow-delimitersutilisons également jit-lockdirectement (et non à travers font-lock-mode), nous sommes de toute façon sur un sol fragile.

Notez que j'ai déjà eu des contacts avec rainbow-delimiters(voir /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ) mais pas avec rainbow-blocks. Parce que je n'ai qu'un laps de temps limité sur lequel j'ai choisi de me concentrer rainbow-delimiters. Vous pouvez peut-être résoudre le problème de la rainbow-blocksmême manière.

Tobias
la source