In vielen Codebeispielen stößt man immer wieder auf \makeatletter und \makeatother. Was machen die genau bzw wofür sind die da?

gefragt 09 Jun '13, 19:05

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 11 Jul '13, 09:27


Für TeX hat jedes Zeichen einen „Kategorie-Code“ oder „category code“ zugeordnet, der seine Funktion festlegt. Insgesamt gibt es 16 Kategorie-Codes. Zum Beispiel hat \ üblicherweise Kategorie-Code 0 (= escape character, leitet eine Befehlssequenz ein), { hat 1 (= Beginn einer Gruppe), } hat 2 (Ende einer Gruppe) usw. Die „normalen“ Zeichen, d.h., die kleinen und großen Buchstaben haben Kategorie-Code 11 (= letter/Buchstabe), Ziffern, Satzzeichen und andere Symbole 12 (= other/anderes Zeichen). Das Zeichen @ hat ebenfalls Kategorie-Code 12. Wieso ist das wichtig? Nun, Befehlssequenzen können entweder nur aus Zeichen mit Kategorie-Code 11 oder aus einem Zeichen mit anderem Kategorie-Code bestehen.

Der Befehl

\makeatletter

weist nun dem Zeichen @ Kategorie-Code 11 zu, so dass es in Namen von Befehlssequenzen verwendet werden kann. Der Befehl

\makeatother

weist @ entsprechend Kategorie-Code 12 zu.

Verwendet wird @ als Buchstabe, um interne Makros zu schreiben, die nicht für den direkten Einsatz im Dokument gedacht sind. Hat man zum Beispiel

\makeatletter
\def\name#1{\gdef\@name{#1}}
\makeatother

dann kann \@name nicht direkt verwendet werden, solange @ Kategorie-Code 12 hat. Man würde stattdessen das Makro \@ gefolgt von den Buchstaben n, a, m und e aufrufen. Damit können interne Makros nicht aus Versehen aufgerufen oder überschrieben werden.

In Klassen- und Paket-Dateien sind \makeatletter und \makeatother nicht nötig, da dort @ schon von vornherein Kategorie-Code 11 hat, also als Buchstabe behandelt wird. Obwohl es heutzutage meistens wohl keinen Schaden anrichtet, sollten die Befehle darum in Klassen- und Paketdateien auch nicht verwendet werden.

Manchmal ist es jedoch nötig, im Dokument auf interne Befehle zuzugreifen. Hier kommen dann \makeatletter und \makeatother zum Einsatz. Wann immer man ein Makro, das ein @ im Namen hat definieren oder umdefinieren möchte, rahmt man die Modifikationen mit den beiden ein:

\makeatletter % setzt Kategorie-Code von @ auf 11
<Code mit Befehlen, die @ im Namen haben>
\makeatother % setzt Kategorie-Code von @ auf 12

Und bevor ich's vergesse: im LaTeX-Kernel (latex.ltx) sind die beiden Befehle folgendermaßen definiert:

\def\makeatletter{\catcode`\@11\relax}
\def\makeatother{\catcode`\@12\relax}

Übrigens: die LaTeX3-Programmiersprache expl3 verwendet nicht @ für interne Makros, sondern _ und :, die normalerweise Kategorie-Code 7 bzw. 12 haben. Ihre Verwendung ist allerdings wesentlich systematischer als beim @ in LaTeX 2e. Für expl3 Code verwendet man (nachdem man das Paket expl3 geladen hat) \ExplSyntaxOn und \ExplSyntaxOff. Ihre Funktion ist noch umfangreicher als alleine das Setzen Kategorie-Codes von _ und :, aber das ist vielleicht Thema für eine andere Frage.

Permanenter link

beantwortet 09 Jun '13, 19:31

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 27 Jun '13, 19:08

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×52
×7
×2

gestellte Frage: 09 Jun '13, 19:05

Frage wurde gesehen: 47,251 Mal

zuletzt geändert: 11 Jul '13, 09:27