Wie man Regenbogen-Begrenzer / Regenbogen-Blöcke dazu bringt, Inline-Mathematik in LaTeX-Gleichungen hervorzuheben

12

Ich verwende Spacemacs mit AUCTeX für die LaTeX-Bearbeitung und möchte, dass Regenbogenbegrenzer und / oder Regenbogenblöcke LaTeX-Mathematikgleichungen hervorheben. Leider funktioniert dies nur teilweise, dh einige Gleichungen werden hervorgehoben und andere nicht:

Beispiel: Regenbogen-Begrenzer

In dem Beispiel-Screenshot wird die in eingeschlossene Inline-Mathematik $nicht hervorgehoben, während der Rest - einschließlich der in eingeschlossenen Inline-Mathematik \(...\)- dies tut.

Mit rainbow-blocksihm schlimmer wird, wie es manchmal an einer Stelle des Dokuments arbeiten und manchmal nicht unabhängig von Umfang arbeiten.

Beispiel: Regenbogenblöcke

F: Weiß jemand, warum dies passiert oder wie man rainbow-blocksfür Inline-Mathematik in LaTeX arbeitet? Gibt es funktionierende Alternativen?

nemesit
quelle
Der Latex-Modus in auctex scheint zu definieren, dass "$" eine spezielle Syntax in der Syntaxtabelle hat. Daher überschreibt die syntaktische Fontifizierung von font-lock möglicherweise jede keyword-basierte Fontifizierung.
Kirill
highlight-parenthesesverwendet Overlays anstelle von Font Lock, und es wäre sehr einfach, eine temporäre Syntaxtabelle für die Dauer der Overlay-Funktion zu verwenden. github.com/nschum/highlight-parentheses.el Die Funktion, die in dieser Bibliothek geändert werden müsste, ist hl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . Leider ist dies eine andere Bibliothek als die, die Sie angegeben haben - ich weiß nicht, wie Sie das beheben sollen rainbow-delimiters- vielleicht könnten Sie das Eröffne mit dem Betreuer ein Problem mit Github.
Gesetzesliste
Mit (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)))dieser Option können Sie die Schriftart innerhalb einer eingebetteten Formel ersetzen. Dies funktioniert aber nicht in einem Rundum-Rat von rainbow-delimiters-propertize-delimiter. Dies zeigt an, dass die Fontifizierung von latex-modenach der Fontifizierung durch erfolgt rainbow-delimiters-mode.
Tobias
rainbow-delimiters verwendet direkt jit-lock. Vielleicht benutzt die syntaktische Fontifizierung kein JIT-Lock und wir bekommen deswegen ein Timing-Problem?
Tobias

Antworten:

2

Das folgende ist eher wie ein Kommentar seit

  1. es löst nur einen kleinen Teil des Problems ( rainbow-delimiters-mode)
  2. es wird nicht gründlich getestet (nur mit einer latex-datei)
  3. Ich verstehe nicht ganz, warum es funktioniert ( font-lock-modeist wirklich eine ziemlich komplizierte Maschinerie)

Zunächst die Lösung für rainbow-delimiters-mode:

Wir ersetzen die Texteigenschaft font-lock-facedurch facein rainbow-delimiters-propertize-delimiterund rainbow-delimiters-unpropertize-delimiter. Da defsubstim Paket verwendet wird defun, können wir defaliasdie Funktionen selbst nicht einsetzen, sondern müssen sie modifizieren (soweit ich es verstehe - bitte kommentieren, wenn ich diesbezüglich falsch liege).

Die geänderten Funktionen sind:

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

Nun die Argumentation:

Die eingebetteten Formeln zwischen den $ -Delimitern sind syntaktisch durch den Font-Lock-Modus gekennzeichnet (wie bereits von Kirill hervorgehoben). Die Registrierung dieser Schrift sieht normal aus (siehe Variable font-lock-syntactic-face-functionund Funktion font-latex-syntactic-face-function). Aber describe-charan den Zeichen einer eingebetteten Formel zeigt sich, dass bei der syntaktischen Schrift die faceEigenschaft -property anstelle der font-lock-faceEigenschaft -property verwendet wird.

Das Folgende ist hypothetisch, da ich die Schriftsperrmaschinerie, die ziemlich komplex ist, nicht vollständig verstehe.

Es scheint, das faceist stärker als font-lock-face. Regenbogen-Trennzeichen verwenden, font-lock-facedie facevon syntaktischer Fontifizierung dominiert werden . Wir haben jedoch den Vorteil, dass die syntaktische Fontifizierung vor der suchbasierten Fontifizierung (Keyword) an erster Stelle steht, die wiederum JIT-LOCK verwendet (siehe Infoseiten von font-lock-mode).

Das führt mich zu dem Schluss , dass das Problem gelöst ist , wenn wir verwenden facein rainbow-delimitersstatt font-lock-face. Und hier kenne ich nicht die vollen Konsequenzen. Da wir aber rainbow-delimitersauch jit-lockdirekt (und nicht durch font-lock-mode) stehen, stehen wir sowieso auf einem wackeligen Boden.

Beachten Sie, dass ich bereits Kontakt mit rainbow-delimiters(siehe /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ) hatte, aber nicht mit rainbow-blocks. Weil ich nur einen begrenzten Zeitraum habe, habe ich mich darauf konzentriert rainbow-delimiters. Vielleicht können Sie das rainbow-blocksProblem auf ähnliche Weise lösen .

Tobias
quelle