\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 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:
$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.
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:
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:
\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 und trotz des \relax expandierbar_.
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:
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“:
Die Behandlung von \relax bei \numexpr und \dimexpr stellt eine Besonderheit dar, die nicht exemplarisch für andere Behandlungen von \relax ist. Grund dafür ist, dass \numexpr und \dimexpr immer nach einem \relax zur Beendigung des jeweiligen Ausdrucks verlangen. Dass sie das \relax dann entfernen ist notwendig, damit man Ausdrücke ineinander schachtelt kann beispielsweise \dimexpr 12pt*\numexpr 4+3\relax + 14pt\relax. Würde \numexpr das erste \relax nicht entfernen, würde die \dimexpr ebenfalls bei diesem enden.
@saputellomüssen impliziert meiner Meinung nach, dass es einen Fehler gäbe, wenn man es weglässt, was aber nicht passiert. \the\numexpr2+3 bla gibt einfach „5bla“
@Clemens: Ok, Du hast recht. Ich habe gerade noch einmal in die Syntaxdiagramme von e-TeX geschaut. Ich hatte bei optional spaces and \relax das optional nur auf spaces bezogen. Tatsächlich bezieht es sich aber auf spaces and \relax.
BTW: Der Vollständigkeit halber sei erwähnt, dass es auch noch \muexpr und \glueexpr gibt (was ich bei der Gelegenheit ebenfalls erst entdeckt und noch nie verwendet habe).
\relax ist ein TeX-Primitiv, das zu sich selbst expandiert und keine Dokument-Ausgabe erzeugt. Es ist transparent, das bedeutet, es führt – beispielsweise im Unterschied zu einem whatsit – auch nicht zu einer Umschaltung in den horizontalen Modus. Da es sich um eine command sequence handelt, werden Leerzeichen danach ignoriert. Beim Schreiben mit \write wird jede command sequence, die \relax ist, als sie selbst geschrieben.
{} ist (bei den voreingestellten category codes von plainTeX und LaTeX) je nach Kontext ein leeres Argument oder eine leere Gruppe. Im Falle einer leeren Gruppe wird diese bei der Ausgabe allerdings teilweise weg optimiert. Leerzeichen danach sind im horizontalen Modus jedoch signifikant. Beim Schreiben mit \write werden die Klammern mit geschrieben. Als Gruppenklammern expandieren sie ebenfalls immer wieder zu einer leeren Gruppe.