Man sollte in einer solchen Auflistung am besten nach mehreren Kategorien unterscheiden. Da eine solche Unterscheidung in einer statisch angezeigten Antwort wie dieser nicht ohne Weiteres (und sicherlich nicht ohne erheblichen Mehraufwand) ansprechend möglich ist, versuche ich mich an einer verständlichen und übersichtlichen Darstellung, die möglichst viele Aspekte der einzelnen Varianten vergleicht.
Zunächst sei auf die TeX-Prmitiven, auf die sämtliche andere Arten der Befehlsdefinition aufbauen, eingegangen.
Teile dieser Antwort können Aspekte von TeX abdecken oder voraussetzen, wie sie von einem Neuling in der TeX-Sprache vielleicht nicht verstanden oder gewohnt sind. Ich bitte deshalb um Nacharbeit und markiere diese Antwort als Community-Wiki.
Diese Antwort könnte recht ausführlich werden, weshalb zunächst eine Zusammenfassung gegeben wird:
# Zusammenfassung
- TeX-Primitiven (`\def`, `\edef`, `\gdef`, `\xdef`): Vielseitig, unsicher. Sollten nur zur Programmierung nicht aber vom Anwender verwendet werden.
- `\newcommand`: nur neue Macros, maximal ein optionales Argument
- `\renewcommand`: wie `\newcommand`, allerdings nur zur Umdefinierung existierender Macros
- `\providecommand`: wie `\newcommand`, allerdings wird die Definition immer nur vorgenommen, egal ob wenn das Macro bereits existiert oder nicht.
und ansonsten die Anweisung ohne Fehler ignoriert.
- `\DeclareRobustCommand`: wie `\newcommand`, allerdings wird die Definition immer vorgenommen und die Macros expandieren nicht beim Schreiben in eine andere Datei.
# TeX-Primitive
Die sicherlich mächtigste und gleichzeitig instabilste Variante, neue Macros zu definieren. Die TeX-primitiven sind `\def`, `\edef`, `\gdef` und `\xdef`. Hinzu kommt noch `\let` als Primitive.
Die Primitive `\def` ermöglicht das Definieren von Macros mit nahezu beliebiger Form des Arguments mit notwendigen Token, die als Begrenzung einzelner Argumente fungieren können. Ein allgemeiner Aufruf sieht wie folgt aus:
```
\def\⟨Name⟩⟨Parametertext⟩{⟨Ersetzung⟩}
```
Grundsätzlich ist der Parametertext bei `\def` aus dem Parametertoken `#` und einer nachgestellten Zahl von 1 bis 9 aufgebaut mit zusätzlichen optionalen Token zur Begrenzung, Ende des Parametertexts bildet eine linke geschweifte Klammer (`{`). Ein Befehl, der mit `\def\macro{<Ersetzung>}` definiert wurde erhält keinen Parametertext und expandiert direkt zu`<Ersetzung>`. Hingegen nimmt der Befehl `\def\macro#1{<Ersetzung>}` einen Parameter entgegen (und auf dessen Wert kann in `<Ersetzung>` erneut mit `#1` Bezug genommen werden). Ein Parameter ohne Begrenzung (ohne folgenden Token im Parametertext) entspricht entweder einem einzelnen Token, oder, sollte der erste Token nach `\macro` einem Token der Kategorie 1 (also normalerweise einer linken geschweiften Klammer `{`) entsprechen, alles bis zum nächsten Token der Kategorie 2 (also einer rechten geschweiften Klammer `}`) der gleichen Ebene entsprechen (die Klammer nicht mit eingeschlossen). Die Definition `\def\macro#1|{<Ersetzung>}` beinhaltet einen Token nach `#1` und vor `{`, so dass `#1` Allem bis zum ersten `|` entspricht (vorausgesetzt, dieses `|` befindet sich nicht innerhalb von geschweiften Klammern) entspricht. Die Parameter sind dabei grundsätzlich "lazy/faul", nehmen also grundsätzlich so wenig wie möglich als Argument an, bis die entsprechenden begrenzenden Token (bzw. deren Kombination) gefunden werden.
Die Syntax des mit `\def` definierten Macros ist also sehr vielseitig, aber unflexibel. Ein gegebener Token innerhalb des Parametertexts muss tatsächlich aufgefunden werden, ansonsten wird ein TeX-Fehler ausgeworfen (`Use of \macro doesn't match its definition.`).
Außerdem wird bei der Verwendung von `\def` nicht überprüft, ob `\macro` bereits definiert ist oder nicht und eine bereits vorhandene Definition einfach überschrieben.
Der Unterschied von `\def` zu `\gdef` ist einfach erklärt, `\def` nimmt die Definition nur innerhalb der aktuellen Gruppe (und darunter liegender Gruppen) vor, während `\gdef` von hier an bis zur nächsten Stelle, an der `\macro` definiert wird, gilt.
Die Varianten `\edef` und `\xdef` hingegen expandieren die `<Ersetzung>` so weit wie möglich, bevor die eigentliche Definition vorgenommen wird. `\edef` arbeitet hierbei erneut auf Gruppenlevel, während `\xdef` global definiert.
Die Primitive `\let` weist einem Macro die gleiche Bedeutung des folgenden Token zu. `\let\macro\othermacro` sorgt also dafür, dass `\macro` sich ab sofort wie `\othermacro` verhält. Allerdings sind auch andere Token möglich, bspw. bewirkt `\let\macro A` dafür, dass `\macro` von nun an die gleiche Bedeutung wie ein `A` hat (mit einigen Einschränkungen).
Eine weitere Besonderheit der Primitiven liegt darin, dass sie Präfixe unterstützen, die eine Auswirkung auf die mit den Primitiven definierten Macros haben. Die Zahl der unterstützten Präfixe hängt von der verwendeten TeX-Engine ab. Der simpelste dieser Präfixe ist `\global`, der dafür sorgt, dass entsprechende Deklaration global (also nicht von der aktuellen Gruppe begrenzt) gilt. `\global` ist sowohl bei `\let` als auch bei `\def` verwendbar, anders als die folgenden Präfixe. `\long` sorgt dafür, dass die Argumente/Parameter eines mit `\def` (o.ä.) definierten Macros auch einen neuen Absatz beinhalten können. Der dritte Präfix, der im ursprünglich von DEK entwickelten TeX enthalten war, ist `\outer`. `\outer` sorgt dafür, dass ein Macro, das mit diesem Präfix definiert wurde, nicht Teil eines Arguments eines anderen Macros sein kann (eine Tatsache, die sich i.d.R. eher als hinderlich denn als nützlich herausstellt). Zusätzlich zu diesen drei Präfixen existiert noch `\protected`, das von der e-TeX Erweiterung hinzugefügt wurde. `\protected` sorgt dafür, dass ein entsprechendes Macro nicht innerhalb von `\edef`, `\xdef` oder ähnlichen Macros expandiert wird.
Kompliziertere Gebilde, wie bspw. optionale Argumente müssen durch weitere Tests und Hilfsmacros definiert werden.
# LaTeX2e
## `\newcommand`/`\renewcommand`/`\providecommand`
Die wohl bekannteste Methode, ein neues Macro zu definieren, bietet das Macro `\newcommand`. `\newcommand` definiert ein *neues* Macro (und sollte es bereits definiert sein, wird ein Fehler ausgeworfen). `\newcommand` unterstützt nur eine Anzahl an Argumenten (nicht aber eine rechtsseitige Begrenzung der Argumente wie sie `\def` bietet). Allgemein folgt der Aufruf der Form
```
\newcommand⟨*⟩\⟨Name⟩[⟨Anzahl Argumente⟩][⟨Standardwert optionalen Arguments⟩{⟨Ersetzung⟩}
```
Sowoh die Anzahl der Argumente als auch der Standardwert des optionalen Arguments und der Stern sind optionale Argumente. Wird keine Anzahl festgelegt, so nimmt das Macro keine Argumente entgegen, `\necommand\macro{⟨Ersetzung⟩}` entspricht also `\long\def\macro{⟨Ersetzung⟩}` nachdem geprüft wurde, ob das Macro bisher undefiniert ist. Macros, die mit `\newcommand` definiert werden, verwenden auf der Ebene der TeX-Primitiven grundsätzlich den Präfix `\long`, wenn allerdings der optionale Stern gegeben wird, sind die definierten Macros nicht `\long` (führen also zu einem Fehler, sollte eines ihrer Argumente einen neuen Absatz, also `\par`, enthalten). Wird eine Anzahl an Argumenten vorgegeben, so nimmt das definierte Macro eben so viele normale Argumente entgegen. `\newcommand\macro[3]{⟨Ersetzung⟩}` entspricht also `\long\def\macro#1#2#3{⟨Ersetzung⟩}`, und innerhalb der Ersetzung kann auf die einzelnen Argumente als `#1`, `#2` und `#3` Bezug genommen werden.
Sobald bei `\newcommand` auch das zweite optionale Argument gegeben wird, nimmt das definierte Macro ein optionales Argument entgegen, `\newcommand\macro[2][⟨Standardwert⟩]{⟨Ersetzung⟩}` definiert also ein Macro, welches zwei Argumente entgegen nimmt (und in der Ersetzung können diese entsprechend mit `#1` und `#2` verwendet werden), allerdings ist das *erste* Argument von `\macro` nun ein optionales Argument (in eckigen Klammern), welches nicht verwendet werden muss, und sollte es ausgelassen werden wird anstelle dessen der definierte Standardwert verwendet. Wichtig ist, dass ein optionales Argument, das mit `\newcommand` definiert wurde nur bis zur ersten rechten eckigen Klammer gelesen wird (nicht bis zur ausgeglichenen) vorausgesetzt, diese ist auf der gleichen Gruppenebene von geschweiften Klammern.
Zu `\newcommand` identisch ist `\renewcommand`, allerdings kann `\renewcommand` nur für Macros verwendet werden, die bereits definiert sind. Außerdem existiert noch `\providecommand`, das ebenfalls praktisch identisch ist, allerdings wird bei `\providecommand` getestet, ob das Macro bereits existiert und entsprechend `\newcommand` oder `\renewcommand` verwendet, das Macro wird also in jedem Fall so definiert, wie die Definition nur durchgeführt, wenn es mit `\providecommand` noch nicht definiert wird.
ist (aber ansonsten eben kein Fehler ausgeworfen).
## `\DeclareRobustCommand`
Ein weiteres Macro, das im Grunde wie `\newcommand` funktioniert. Der Unterschied besteht hier darin, dass nicht nur in jedem Fall die Definition vorgenommen wird (sollte ein Macro hierdurch umdefiniert werden, wird eine entsprechende Info in die log-Datei geschrieben). Außerdem sind Macros, die mit `\DeclareRobustCommand` definiert werden, während des Schreibens in eine andere Datei geschützt, sodass sie nicht expandieren, wenn sie beispielsweise im Argument von `\section` in die toc-Datei geschrieben werden, sondern erst, wenn der entsprechende Eintrag von TeX gesetzt wird.