Como obter delimitadores de arco-íris / blocos de arco-íris para destacar a matemática em linha nas equações do LaTeX

12

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:

Exemplo: delimitadores de arco-íris

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-blocksisso, piora, pois às vezes funciona em um local do documento e às vezes não funciona, independentemente do escopo.

Exemplo: blocos de arco-íris

P: Alguém sabe por que isso acontece ou como começar a rainbow-blockstrabalhar com matemática em linha no LaTeX? Existem alternativas de trabalho?

nemesit
fonte
O modo látex no auctex parece definir "$" para ter uma sintaxe especial na tabela de sintaxe, portanto, talvez a fonte sintática do bloqueio de fonte esteja substituindo qualquer fonte baseada em palavra-chave.
Kirill
highlight-parenthesesusa 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 consertar rainbow-delimiters- talvez você possa abra um problema no Github com o mantenedor.
lawlist
Usando (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 de rainbow-delimiters-propertize-delimiter. Isso indica que a fonte latex-modeocorre após a fonte passar rainbow-delimiters-mode.
Tobias
Os delimitadores de arco-íris usam jit-lock diretamente. Talvez a fonte sintática não use jit-lock e tenhamos um problema de tempo por causa disso?
Tobias

Respostas:

2

A seguir, mais parece um comentário, pois

  1. resolve apenas uma pequena parte do problema ( rainbow-delimiters-mode)
  2. não é completamente testado (apenas com um arquivo de látex)
  3. Eu não entendo completamente por que funciona ( 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-facepor facein rainbow-delimiters-propertize-delimitere rainbow-delimiters-unpropertize-delimiter. Uma vez que defsubsté usado no pacote em vez de defunnão podemos empregar, defaliasmas 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:

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

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-functione função font-latex-syntactic-face-function). Mas, describe-charnos caracteres de uma fórmula incorporada, mostra que a fonte sintática usa a facepropriedade -propriedade em vez da font-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 que font-lock-face. Usos delimitadores de arco-íris font-lock-faceque são dominados pela facefonte 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 de font-lock-mode).

Isso me leva à conclusão de que o problema será resolvido se usarmos faceem rainbow-delimitersvez de font-lock-face. E aqui eu não conheço todas as consequências. Mas, como rainbow-delimiterstambém usa jit-lockdiretamente (e não completamente font-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 com rainbow-blocks. Porque tenho apenas um período limitado de tempo em que escolhi me concentrar rainbow-delimiters. Talvez você possa resolver o rainbow-blocksproblema-de maneira semelhante.

Tobias
fonte