2012-08-07 15 views
5

Ich mag würde einen neuen Befehl markieren ich in LaTeX erstellt:Emacs auctex benutzerdefinierte Syntax Highlight

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

ich diesen Code auf diese Weise verwenden:

\conceito{Foo}{Bar}{Bla} 

ich die manual gefolgt und setzen dieser Code in meinem ~/.emacs, aber es hat nicht funktioniert:

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

Was ist los?

Antwort

6

EDIT: Deokhwan Kim ursprünglich wies darauf hin, dass Ihr regexp zwei aufeinanderfolgende doppelte Anführungszeichen enthält, und dass die schließende Klammer muss ) auch mit Anführungszeichen entgangen sein:

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

Zusätzlich zu den Punkten wiesen darauf hin, von Deokhwan Kim, gibt es auch die folgenden zwei Probleme:

  • Sie benötigen vier Backslash statt zwei vor ‚conceito‘: \\\\conceito

  • Die Backslash-Sequenz \\< stimmt mit der leeren Zeichenfolge nur am Anfang eines Wortes überein. Der Backslash am Anfang des neuen LaTeX-Befehls wird jedoch nicht als Teil eines Worts betrachtet. Daher stimmt \\< nicht überein.

Versuchen Sie stattdessen:

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

EDIT: Eine weitere gute Beobachtung, dass Deokhwan Kim gemacht ist, dass in diesem besonderen Fall, Sie nicht wirklich die Klammer überhaupt brauchen, weil Sie versuchen, um dem ganzen Ausdruck trotzdem zu entsprechen. So eine Alternative zu der letzten Zeile könnte sein:

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

Der Punkt über die Klammer ist richtig, aber man könnte tatsächlich Ihren regexp nur Spiel verlängern, wenn eine Öffnung geschweifte Klammer { das Wort „conceito“ folgt. Aber da Sie nicht wirklich wollen, dass die Klammer markieren, Untergruppen von Klammern definiert verwendet wird, um den Weg zu gehen:

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

Beachten Sie, dass da wir testen für eine {, die direkt nach dem „conceito“ folgt (es sei denn, es gibt Whitespace dazwischen), brauchen wir den Test für \\> überhaupt nicht mehr.

In der Regel versuchen M-x Neu-Erstellungs interaktiv regulären Ausdrucks Handwerk: Sie einen neuen regulären Ausdruck in einem kleinen Puffer bearbeiten und sofort sehen, was in dem Puffer markiert ist, von dem Ihnen den Wieder Builder aufgerufen.

+0

Für die Aufzeichnung, in meinem gelöschten Post, wies ich auf einige Fehler, wie aufeinanderfolgende doppelte Anführungszeichen '" "' und fehlende \\ vor ')', im regulären Ausdruck in der Frage. Aber Thomas teilte mir mit, dass noch andere Probleme lauern und dass meine Lösung nicht ausreicht. Also habe ich meinen Beitrag gelöscht, um Komplikationen zu vermeiden. – dkim

+0

Gute Arbeit! Ein weiterer Vorschlag ist, dass '\\ s- *' im letzten Beispiel besser nicht da sein sollte. In LaTeX sollte ein Argument sofort seinem Makro folgen, ohne dass zwischen ihnen Platz ist, oder? – dkim

+0

@Deokhwan Kim - Nein, Leerzeichen sind in Ordnung zwischen dem Befehl und dem '{'. – Thomas

2

GNU AUCTeX bietet eine integrierte Möglichkeit, benutzerdefinierte Markierungen für benutzerdefinierte Makros zu definieren. Sehen Sie sich die Variablen font-latex-user-keyword-classes und AUCTeX documentation an.

Hier ist ein einfaches Beispiel (meine Konfiguration):

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

Diese den Inhalt \ ausblenden zeigen {} \ MyComment {} und \ Kommentar {} Makros in dem trüben Schatten Gesicht.