2012-08-07 11 views
5

me gustaría destacar un nuevo comando que creé en LaTeX:Emacs auctex sintaxis personalizada destacado

\newcommand{\conceito}[3]{ 
    \subsection{#1} (Original: \textit{#2} #3). 
} 

utilizo este código de esta manera:

\conceito{Foo}{Bar}{Bla} 

he seguido el manual y poner este código en mi ~/.emacs, pero no funcionó:

(add-hook 'LaTeX-mode-hook 
    (lambda() 
     (font-lock-add-keywords nil 
      '((""\\<\\(\\conceito)\\>"" 1 font-lock-warning-face t))))) 

¿Qué pasa?

Respuesta

6

EDIT: Deokhwan Kim originalmente señaló que su expresión regular contiene dos comillas dobles consecutivos, y que el paréntesis de cierre ) necesita ser escapado con comillas, así:

(add-hook 'LaTeX-mode-hook 
    (lambda() 
     (font-lock-add-keywords nil 
      '(("\\<\\(\\conceito\\)\\>" 1 font-lock-warning-face t))))) 

Además de los puntos señaló por Deokhwan Kim, también existen las siguientes dos cuestiones:

  • se necesitan cuatro backslashs en lugar de dos frente a 'conceito': \\\\conceito

  • La secuencia de barra invertida \\< coincide con la cadena vacía solo al comienzo de una palabra, sin embargo, la barra invertida al comienzo de su nuevo comando LaTeX no se considera parte de una palabra, por lo que \\< no coincidirá.

Tal vez puedas probar:

(add-hook 'LaTeX-mode-hook 
    (lambda() 
     (font-lock-add-keywords nil 
      '(("\\(\\\\conceito\\)\\>" 1 font-lock-warning-face t))) 

EDIT: Otra buena observación de que Kim hizo Deokhwan es que en este caso particular, que realmente no necesita el paréntesis en absoluto, porque usted está tratando para que coincida con la expresión completa de todos modos. Por lo tanto una alternativa a la última línea podría ser:

'(("\\\\conceito\\>" 0 font-lock-warning-face t))))) 

El punto sobre el paréntesis es correcta, pero en realidad se podría ampliar su expresión regular para solo cuando una llave de apertura { sigue a la palabra "conceito". Pero ya que realmente no quiere destacar que abrazadera, usando subgrupos definidos por paréntesis está el camino a seguir:

(add-hook 'LaTeX-mode-hook 
    (lambda() 
     (font-lock-add-keywords nil 
      '(("\\(\\\\conceito\\)\\s-*{" 1 font-lock-warning-face t))) 

Tenga en cuenta que ya estamos probando para una { que sigue directamente después de "conceito" (a menos que haya espacio en blanco en el medio), ya no necesitamos la prueba para \\>.

En general, trate M-x re-constructor a las embarcaciones de expresión regular interactiva: puede editar una nueva expresión regular en una pequeña memoria intermedia y ver al instante lo que se destaca en la memoria intermedia desde la que llamó la re-constructor.

+0

Para el registro, en mi publicación eliminada, señalé algunos errores, como comillas dobles consecutivas '" "' y faltantes \\ antes ')', en la expresión regular en la pregunta. Pero Thomas me notificó que todavía me acechaban otros problemas y que mi solución no era suficiente. Así que eliminé mi publicación para evitar complicaciones. – dkim

+0

¡Buen trabajo! Una sugerencia más es que, en el último ejemplo, '\\ s- *' es mejor que no esté allí. En LaTeX, un argumento debería seguir inmediatamente a su macro sin ningún espacio entre ellos, ¿no es así? – dkim

+0

@Deokhwan Kim - No, el espacio en blanco está bien entre el comando y el '{'. – Thomas

2

GNU AUCTeX tiene una forma integrada de definir el resaltado personalizado a las macros definidas por el usuario. Eche un vistazo a la variable font-latex-user-keyword-classes y AUCTeX documentation.

Aquí hay un ejemplo simple (mi configuración):

(setq font-latex-user-keyword-classes 
     '(("shadow-hidden" (("hide" "{"))  shadow command) 
     ("shadow-mycomment" (("mycomment" "{")) shadow command) 
     ("shadow-comment" (("comment" "{")) shadow command))) 

Esto mostrará el contenido de \ ocultar {}, {} \ mycomment, y \ comentario {} macros en la cara sombra tenue.

Cuestiones relacionadas