## 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...
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
\the\numexpr(2+3)*4\relax
In diesen Fällen kann man `{}` nicht auf gleiche Weise verwenden. `\relax` wird von `\numexpr` zum Beispiel aus dem Input-Stream entfernt, `{}` würde zurückbleiben. Darüber hinaus verlangen `\numexpr` und `\dimexpr` zwingend nach einem `\relax`, um das Ende eines Ausdrucks zu markieren.
Ein `{}` könnte an solchen Stellen auch 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 obigem Beispiel wie gewünscht funktioniert.
----------
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.
----------
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}
----------
### `{}` ###
`$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.
## 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.
`\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