Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 8

29 Jan '14, 21:34

cgnieder's gravatar image

cgnieder
22.1k253463

## Grundsätzliches ## `\relax` ist _ein_ Token (ein Primitives), das nicht expandierbar ist und nichts macht, wenn es ausgeführt wird. `{}` sind _zwei_ Token, die (Standard-Kategoriecodes vorausgesetzt) eine leere Gruppe oder nicht begrenztes Argument darstellen. ## Eigenschaften ## ### `\relax` #### [@saputello][1] hat ja schon geschrieben, dass `\relax` beim Schreiben mit `\write` als es selbst geschrieben, also _nicht expandierbar_ ist. `\relax` (und jede Kontrollsequenz die mit `\let` äquivalent zu `\relax` gemacht wurde) bleibt also auch in einem `\edef` stehen: \edef\foo{\relax} \show\foo \bye zeigt im log > \foo=macro: ->\relax . l.2 \show\foo Das kann erwünscht oder unerwünscht sein... ### `{}` ### `$a+{}$` setzt `+` als Relation, d.h. mit entsprechend Leerraum herum, da {} ein *mathord atom* erzeugt. `$a+\relax$` wirkt wie `$a+$` und setzt `+` nicht als Relation, d.h. ohne extra Leerraum. Sowohl `{}` als auch `\relax` unterdrücken Ligaturen: Auflauf Auf{}lauf Auf\relax lauf Allerdings habe ich noch nie gesehen, dass `\relax` dafür eingesetzt wird. Übrigens funktioniert auch `{}` dafür nicht zuverlässig. Zum Beispiel werden Ligaturen mit LuaTeX damit _nicht_ unterdrückt. ## Anwendungen von `\relax` ## ### Assignments und `\numexpr` & `\dimexpr` ### Die Nicht-Expandierbarkeit macht man sich zunutze bei Assignments, die auf der Suche nach ihrem Argument die folgenden Token expandieren bis sie auf etwas Nicht-Expandierbares stoßen: \baselineskip=13pt\relax In diesen Fällen kann man `{}` nicht auf gleiche Weise verwenden. Ein Beispiel, wo `{}` Probleme verursacht, wird gleich gezeigt. Ähnlich verhält es sich mit `\ifnum`: \ifnum10>\mymacro\relax ...\else ...\fi `\numexpr` und `\dimexpr` sind hier besonders zu erwähnen. _Man sollte ihre Ausdrücke immer mit einem `\relax` `\\relax` beenden_, aus einem vergleichbaren Grund wie bei Assignments. `\relax` wird von ihnen aus dem Input-Stream entfernt, `{}` würde zurückbleiben. Die Tatsache, dass sie das `\relax` dann aus dem Imput-Stream entfernen, macht sie verschachtelt verwendbar. verwendbar und _trotz des `\\relax`_ expandierbar_. \the\numexpr(2+3)*4\relax Ein `{}` könnte an solchen Stellen durchaus Probleme verursachen, etwa in folgender Definition: \def\mylength{100pt{}} \hbox to \mylength {bla} % => expandiert zu \hbox to 100pt{}{bla} => wohl nicht gewünscht. `\def\mylength{100pt\relax}` hätte in diesem Beispiel wie gewünscht funktioniert. ### Einsatz in `\write` ### Man kann sich die Nicht-Expandierbarkeit in einem `\write` auch zunutze machen, um Befehle in eine Hilfsdatei zu schreiben: {\let\section\relax...\immediate\write\@auxout{... \section}} Hier wird `\section` lokal auf `\relax` gesetzt, wodurch es gefahrlos in die Hilfsdatei geschrieben werden kann. Das gleiche kann man mit `{}` nicht erreichen. ### Namen von Befehlssequenzen ### Wenn man `\csname foo\endcsname` aufruft und das Makro `\foo` vorher nicht definiert wurde, dann ist es danach äquivalent `\relax`: \csname foo\endcsname \show\foo \bye gibt im log: > \foo=\relax. l.2 \show\foo Auf dieser Tatsache beruht der Test `\expandafter\ifx\csname foo\endcsname\relax` ob ein Makro definiert ist. Das steht auch hinter der Technik, mit `\let\foo\relax` das Makro `\foo` zu „löschen“: \documentclass{article} \begin{document} \newcommand\foo{foo} \let\foo\relax% nun kann \foo mit \newcommand wieder definiert werden \newcommand\foo{bar} \end{document} <sub>Die Beispiele habe ich z.T. bei [David Carlisle][2] geklaut.</sub> [1]: http://texwelt.de/wissen/benutzer/16 [2]: http://tex.stackexchange.com/a/86396/5049
Klicke auf Einblenden/Ausblenden von Überarbeitungen 7
{} und Ligaturen mit LuaTeX

19 Nov '13, 00:38

cgnieder's gravatar image

cgnieder
22.1k253463

## Grundsätzliches ## `\relax` ist _ein_ Token (ein Primitives), das nicht expandierbar ist und nichts macht, wenn es ausgeführt wird. `{}` sind _zwei_ Token, die (Standard-Kategoriecodes vorausgesetzt) eine leere Gruppe oder nicht begrenztes Argument darstellen. ## Eigenschaften ## ### `\relax` #### [@saputello][1] hat ja schon geschrieben, dass `\relax` beim Schreiben mit `\write` als es selbst geschrieben, also _nicht expandierbar_ ist. `\relax` (und jede Kontrollsequenz die mit `\let` äquivalent zu `\relax` gemacht wurde) bleibt also auch in einem `\edef` stehen: \edef\foo{\relax} \show\foo \bye zeigt im log > \foo=macro: ->\relax . l.2 \show\foo Das kann erwünscht oder unerwünscht sein... ### `{}` ### `$a+{}$` setzt `+` als Relation, d.h. mit entsprechend Leerraum herum, da {} ein *mathord atom* erzeugt. `$a+\relax$` wirkt wie `$a+$` und setzt `+` nicht als Relation, d.h. ohne extra Leerraum. Sowohl `{}` als auch `\relax` unterdrücken Ligaturen: Auflauf Auf{}lauf Auf\relax lauf Allerdings habe ich noch nie gesehen, dass `\relax` dafür eingesetzt wird. wird. Übrigens funktioniert auch `{}` dafür nicht zuverlässig. Zum Beispiel werden Ligaturen mit LuaTeX damit _nicht_ unterdrückt. ## Anwendungen von `\relax` ## ### Assignments und `\numexpr` & `\dimexpr` ### Die Nicht-Expandierbarkeit macht man sich zunutze bei Assignments, die auf der Suche nach ihrem Argument die folgenden Token expandieren bis sie auf etwas Nicht-Expandierbares stoßen: \baselineskip=13pt\relax In diesen Fällen kann man `{}` nicht auf gleiche Weise verwenden. Ein Beispiel, wo `{}` Probleme verursacht, wird gleich gezeigt. Ähnlich verhält es sich mit `\ifnum`: \ifnum10>\mymacro\relax ...\else ...\fi `\numexpr` und `\dimexpr` sind hier besonders zu erwähnen. _Man sollte ihre Ausdrücke immer mit einem `\relax` beenden_, aus einem vergleichbaren Grund wie bei Assignments. `\relax` wird von ihnen aus dem Input-Stream entfernt, `{}` würde zurückbleiben. Die Tatsache, dass sie das `\relax` dann aus dem Imput-Stream entfernen, macht sie verschachtelt verwendbar. \the\numexpr(2+3)*4\relax Ein `{}` könnte an solchen Stellen durchaus Probleme verursachen, etwa in folgender Definition: \def\mylength{100pt{}} \hbox to \mylength {bla} % => expandiert zu \hbox to 100pt{}{bla} => wohl nicht gewünscht. `\def\mylength{100pt\relax}` hätte in diesem Beispiel wie gewünscht funktioniert. ### Einsatz in `\write` ### Man kann sich die Nicht-Expandierbarkeit in einem `\write` auch zunutze machen, um Befehle in eine Hilfsdatei zu schreiben: {\let\section\relax...\immediate\write\@auxout{... \section}} Hier wird `\section` lokal auf `\relax` gesetzt, wodurch es gefahrlos in die Hilfsdatei geschrieben werden kann. Das gleiche kann man mit `{}` nicht erreichen. ### Namen von Befehlssequenzen ### Wenn man `\csname foo\endcsname` aufruft und das Makro `\foo` vorher nicht definiert wurde, dann ist es danach äquivalent `\relax`: \csname foo\endcsname \show\foo \bye gibt im log: > \foo=\relax. l.2 \show\foo Auf dieser Tatsache beruht der Test `\expandafter\ifx\csname foo\endcsname\relax` ob ein Makro definiert ist. Das steht auch hinter der Technik, mit `\let\foo\relax` das Makro `\foo` zu „löschen“: \documentclass{article} \begin{document} \newcommand\foo{foo} \let\foo\relax% nun kann \foo mit \newcommand wieder definiert werden \newcommand\foo{bar} \end{document} <sub>Die Beispiele habe ich z.T. bei [David Carlisle][2] geklaut.</sub> [1]: http://texwelt.de/wissen/benutzer/16 [2]: http://tex.stackexchange.com/a/86396/5049
Klicke auf Einblenden/Ausblenden von Überarbeitungen 6

25 Jul '13, 10:47

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 5
Antwort restrukturiert

25 Jul '13, 10:39

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

24 Jul '13, 18:12

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

24 Jul '13, 18:10

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

24 Jul '13, 11:53

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

24 Jul '13, 11:25

cgnieder's gravatar image

cgnieder
22.1k253463