Cómo obtener delimitadores del arco iris / bloques del arco iris para resaltar las matemáticas en línea en las ecuaciones de LaTeX


12

Estoy usando spacemacs con AUCTeX para la edición de LaTeX y me gustaría hacer que los delimitadores del arco iris y / o los bloques del arco iris resalten las ecuaciones matemáticas de LaTeX. Desafortunadamente, esto solo funciona en parte, es decir, algunas ecuaciones se resaltan y otras no:

Ejemplo: delimitadores del arco iris

En la captura de pantalla de ejemplo, las matemáticas en línea encerradas en $no se resaltan, mientras que el resto, incluidas las matemáticas en línea encerradas \(...\), sí.

Con rainbow-blocksesto empeora, ya que a veces funcionará en un lugar del documento y a veces no funcionará independientemente del alcance.

Ejemplo: bloques de arcoiris

P: ¿Alguien sabe por qué sucede esto o cómo rainbow-blockstrabajar para las matemáticas en línea en LaTeX? ¿Hay alguna alternativa de trabajo?


latex-mode en auctex parece definir "$" para tener una sintaxis especial en la tabla de sintaxis, por lo que quizás la fontificación sintáctica de font-lock está anulando cualquier fontificación basada en palabras clave.
Kirill

highlight-parenthesesusa superposiciones en lugar de bloqueo de fuente, y sería muy simple usar una tabla de sintaxis temporal mientras dure la función de superposición. github.com/nschum/highlight-parentheses.el La función que necesitaría ser alterada en esa biblioteca es hl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . Desafortunadamente, esa es otra biblioteca diferente a la que ha especificado, no sé cómo solucionarlo rainbow-delimiters, tal vez podría abre un problema en Github con el mantenedor.
abogados el

Al (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)))usarlo, es posible reemplazar la fuente dentro de una fórmula incrustada. Pero esto no funciona en un consejo general de rainbow-delimiters-propertize-delimiter. Esto indica que la fontificación de se latex-modelleva a cabo después de la fuente rainbow-delimiters-mode.
Tobias

rainbow-delimiters usa jit-lock directamente. Tal vez, la fuente sintáctica no usa jit-lock y tenemos un problema de sincronización debido a eso.
Tobias

Respuestas:


2

Lo siguiente es más como un comentario desde

  1. solo resuelve una pequeña parte del problema ( rainbow-delimiters-mode)
  2. no se prueba a fondo (solo con un archivo de látex)
  3. No entiendo completamente por qué funciona ( font-lock-modees realmente una maquinaria bastante complicada)

Al principio la solución para rainbow-delimiters-mode:

Reemplazamos la propiedad de texto font-lock-facepor faceen rainbow-delimiters-propertize-delimitery rainbow-delimiters-unpropertize-delimiter. Dado que defsubstse usa en el paquete en lugar de defunno podemos emplearlo, defaliaspero debemos modificar las funciones en sí mismas (hasta donde yo entiendo, por favor comente si estoy equivocado en este sentido).

Las funciones modificadas son:

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

Ahora el razonamiento:

Las fórmulas incrustadas entre los $ -delimitadores son sintaxis fontified por font-lock-mode (como ya señaló Kirill). El registro de esta fuente parece normal (ver variable font-lock-syntactic-face-functiony función font-latex-syntactic-face-function). Pero describe-charen los caracteres de una fórmula incrustada se muestra que la fuente sintáctica utiliza la facepropiedad-en lugar de la font-lock-facepropiedad.

Lo siguiente es hipotético ya que no entiendo completamente la maquinaria de bloqueo de fuentes que es bastante compleja.

Parece que facees más fuerte que font-lock-face. El uso de delimitadores de arco iris font-lock-faceestá dominado por la facefuente sintáctica. Sin embargo, tenemos la ventaja de que la fuente sintáctica viene primero que la fuente basada en búsqueda (palabra clave) que a su vez usa jit-lock (ver páginas de información de font-lock-mode).

Eso me lleva a la conclusión de que el problema se resuelve si usamos facein en rainbow-delimiterslugar de font-lock-face. Y aquí no sé las consecuencias completas. Pero, dado que rainbow-delimiterstambién se usa jit-lockdirectamente (y no a través font-lock-mode), estamos parados en un piso inestable de todos modos.

Tenga en cuenta que ya tuve algún contacto con rainbow-delimiters(consulte /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ) pero no con rainbow-blocks. Debido a que solo tengo un período de tiempo limitado en el que elegí concentrarme rainbow-delimiters. Tal vez, puede resolver el rainbow-blocksproblema de una manera similar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.