Estou usando spacemacs com o AUCTeX para edição em LaTeX e gostaria de fazer delimitadores de arco-íris e / ou blocos de arco-íris destacar as equações matemáticas de LaTeX. Infelizmente, isso funciona apenas parcialmente, ou seja, algumas equações são destacadas e outras não:
Na captura de tela de exemplo, a matemática em linha incluída $
não é destacada, enquanto o restante - incluindo a matemática em linha incluída \(...\)
- o faz.
Com rainbow-blocks
isso, piora, pois às vezes funciona em um local do documento e às vezes não funciona, independentemente do escopo.
P: Alguém sabe por que isso acontece ou como começar a rainbow-blocks
trabalhar com matemática em linha no LaTeX? Existem alternativas de trabalho?
latex
syntax-highlighting
nemesit
fonte
fonte
highlight-parentheses
usa sobreposições em vez de bloqueio de fonte e seria muito simples usar uma tabela de sintaxe temporária durante a função de sobreposição. github.com/nschum/highlight-parentheses.el A função que precisaria ser alterada nessa biblioteca éhl-paren-highlight
:(let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . .
Infelizmente, essa é outra biblioteca diferente daquela que você especificou - não sei como consertarrainbow-delimiters
- talvez você possa abra um problema no Github com o mantenedor.(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)))
é possível substituir o fontification dentro de uma fórmula incorporado. Mas isso não funciona em um conselho de cerca derainbow-delimiters-propertize-delimiter
. Isso indica que a fontelatex-mode
ocorre após a fonte passarrainbow-delimiters-mode
.Respostas:
A seguir, mais parece um comentário, pois
rainbow-delimiters-mode
)font-lock-mode
é realmente uma máquina bastante complicada)A princípio, a solução para
rainbow-delimiters-mode
:Substituímos a propriedade text
font-lock-face
porface
inrainbow-delimiters-propertize-delimiter
erainbow-delimiters-unpropertize-delimiter
. Uma vez quedefsubst
é usado no pacote em vez dedefun
não podemos empregar,defalias
mas devemos modificar as próprias funções (tanto quanto eu entendo - por favor, comente se eu estiver errado a esse respeito).As funções modificadas são:
Agora o raciocínio:
As fórmulas incorporadas entre os delimitadores $ são sintaxe tipificada pelo modo de bloqueio de fonte (como Kirill já apontou). O registro dessa fonte parece normal (consulte variável
font-lock-syntactic-face-function
e funçãofont-latex-syntactic-face-function
). Mas,describe-char
nos caracteres de uma fórmula incorporada, mostra que a fonte sintática usa aface
propriedade -propriedade em vez dafont-lock-face
-propriedade.O que se segue é hipotético, pois não compreendo completamente o mecanismo de bloqueio de fonte que é bastante complexo.
Parece que
face
é mais forte quefont-lock-face
. Usos delimitadores de arco-írisfont-lock-face
que são dominados pelaface
fonte sintática. No entanto, temos a vantagem de que a fonte sintática vem primeiro antes da fonte (palavra-chave) baseada em pesquisa (palavra-chave) que, por sua vez, usa jit-lock (consulte as páginas de informações defont-lock-mode
).Isso me leva à conclusão de que o problema será resolvido se usarmos
face
emrainbow-delimiters
vez defont-lock-face
. E aqui eu não conheço todas as consequências. Mas, comorainbow-delimiters
também usajit-lock
diretamente (e não completamentefont-lock-mode
), estamos em um piso instável de qualquer maneira.Observe que eu já tive algum contato
rainbow-delimiters
(consulte /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ), mas não comrainbow-blocks
. Porque tenho apenas um período limitado de tempo em que escolhi me concentrarrainbow-delimiters
. Talvez você possa resolver orainbow-blocks
problema-de maneira semelhante.fonte