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:
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-blocks
ihm schlimmer wird, wie es manchmal an einer Stelle des Dokuments arbeiten und manchmal nicht unabhängig von Umfang arbeiten.
F: Weiß jemand, warum dies passiert oder wie man rainbow-blocks
für Inline-Mathematik in LaTeX arbeitet? Gibt es funktionierende Alternativen?
latex
syntax-highlighting
nemesit
quelle
quelle
highlight-parentheses
verwendet 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, isthl-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 sollenrainbow-delimiters
- vielleicht könnten Sie das Eröffne mit dem Betreuer ein Problem mit Github.(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 vonrainbow-delimiters-propertize-delimiter
. Dies zeigt an, dass die Fontifizierung vonlatex-mode
nach der Fontifizierung durch erfolgtrainbow-delimiters-mode
.Antworten:
Das folgende ist eher wie ein Kommentar seit
rainbow-delimiters-mode
)font-lock-mode
ist wirklich eine ziemlich komplizierte Maschinerie)Zunächst die Lösung für
rainbow-delimiters-mode
:Wir ersetzen die Texteigenschaft
font-lock-face
durchface
inrainbow-delimiters-propertize-delimiter
undrainbow-delimiters-unpropertize-delimiter
. Dadefsubst
im Paket verwendet wirddefun
, können wirdefalias
die 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:
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-function
und Funktionfont-latex-syntactic-face-function
). Aberdescribe-char
an den Zeichen einer eingebetteten Formel zeigt sich, dass bei der syntaktischen Schrift dieface
Eigenschaft -property anstelle derfont-lock-face
Eigenschaft -property verwendet wird.Das Folgende ist hypothetisch, da ich die Schriftsperrmaschinerie, die ziemlich komplex ist, nicht vollständig verstehe.
Es scheint, das
face
ist stärker alsfont-lock-face
. Regenbogen-Trennzeichen verwenden,font-lock-face
dieface
von 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 vonfont-lock-mode
).Das führt mich zu dem Schluss , dass das Problem gelöst ist , wenn wir verwenden
face
inrainbow-delimiters
stattfont-lock-face
. Und hier kenne ich nicht die vollen Konsequenzen. Da wir aberrainbow-delimiters
auchjit-lock
direkt (und nicht durchfont-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 mitrainbow-blocks
. Weil ich nur einen begrenzten Zeitraum habe, habe ich mich darauf konzentriertrainbow-delimiters
. Vielleicht können Sie dasrainbow-blocks
Problem auf ähnliche Weise lösen .quelle