Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4
Kategorie-Code von _ berichtigt

27 Jun '13, 19:08

cgnieder's gravatar image

cgnieder
22.1k253463

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 auch Kategorie-Code 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`][1] 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. [1]: http://www.ctan.org/pkg/l3kernel
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

09 Jun '13, 21:01

cgnieder's gravatar image

cgnieder
22.1k253463

Für TeX haben bekommen hat jedes Zeichen einen „Kategorie-Code“ oder „category code“ zugeordnet. 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). 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 auch Kategorie-Code `12` haben. Ihre Verwendung ist allerdings wesentlich systematischer als beim `@` in LaTeX 2e. Für `expl3` Code verwendet man (nachdem man das Paket [`expl3`][1] 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. [1]: http://www.ctan.org/pkg/l3kernel
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

09 Jun '13, 20:36

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

09 Jun '13, 19:31

cgnieder's gravatar image

cgnieder
22.1k253463