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 nur vorgenommen, wenn das Macro bereits existiert 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 die Definition nur durchgeführt, wenn es noch nicht definiert 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.
\newcommand
und\newcommand*
stehen in jeder besseren LaTeX-Einführung.\def
,\edef
,\gdef
und\xdef
sind TeX-Primitive zur Definition von Makros, wobei\gdef
und\xdef
die globalen Varianten von\def
und\edef
sind. Die Definition gilt also nach Ende der aktuellen Gruppe weiter.\let
ist ein TeX-Primitv, um einem Makro die Definition eines anderen zuzuweisen.Ich glaube nicht, dass hier der beste Ort ist, um sämtliche TeX-Primitive und LaTeX-Anweisungen zu erklären. Dafür ist ein Wiki wie auf goLaTeX besser geeignet und ich lade alle ein, dort mitzuarbeiten.
Im goLaTeX-Wiki (Link im Kommentar von Ijon) stehen
\newcommand
und verwandtes,\def
,\let
u.a. erklärt. Ich stimme sowohl mit Ijon überein (Referenz und Details gern im Wiki) und sehe auch die Anfrage von @haver555 als nützlich an, hier übergreifend einmal zu notieren, wann man was verwenden kann (oder auch nicht sollte) z.B. dann kann man im Zweifel auch hierher verweisen. Auch der erste Kommentar von Ijon kann eine gute Basis für eine kommentierte Liste sein, mit Deeplinks zur Wiki-Befehlsseite. Wer mag, sehr willkommen!Generell sollte man immer die höchste Ebene verwenden, mit der ein Problem gelöst werden kann. Wie erwähnt, sind
\def
,\edef
,\gdef
,\xdef
und\let
TeX-Primitive. Dagegen sind\newcommand
,\renewcommand
,\providecommand
,\DeclareRobustCommand
und deren Sternvarianten LaTeX-Anwender-Anweisungen. Die TeX-Primitive stellen die unterste Ebene dar und sollten daher nur verwendet werden, wenn die LaTeX-Anwenderanweisungen nicht genügen. Seit diexparse
-Anweisungen im LaTeX-Kern selbst verfügbar sind, braucht man TeX-Primitive noch seltener.\newcommand*
finde ich bei golatex nicht.Die Frage nach dem Unterschied von
\newcommand
und\newcommand*
wäre ein Duplikat. Und wie gesagt, sollte das in jeder besseren (= halbwegs vollständigen) LaTeX-Einführung erklärt sein, da es sich dabei um LaTeX-Anweisungen auf Anwenderebene handelt.