Da es hier einige gute Erklärungsthreads gibt, wage ich es einfach mal zu fragen:

Wann benötigt oder verwendet man

  • \edef
  • \gdef
  • \xdef
  • \let
  • \global
  • \xglobal
  • \noexpand
  • \expandafter
  • \newcommand
  • \newcommand*
  • \renewcommand
  • \providecommand
  • \DeclareRobustCommand
  • \NewDocumentCommand
  • ... (bitte editieren und eventuell fortsetzen)

gefragt 21 Sep '20, 01:29

haver555's gravatar image

haver555
199512
Akzeptiert-Rate: 9%

bearbeitet 23 Sep '20, 19:28

\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.

(21 Sep '20, 08:53) gast3

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.

(21 Sep '20, 08:55) gast3

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!

(21 Sep '20, 09:05) stefan ♦♦

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 die xparse-Anweisungen im LaTeX-Kern selbst verfügbar sind, braucht man TeX-Primitive noch seltener.

(21 Sep '20, 12:14) gast3

\newcommand* finde ich bei golatex nicht.

(21 Sep '20, 14:21) haver555

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.

(21 Sep '20, 16:05) gast3
Ergebnis 5 von 6 show 1 more comments

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.

Permanenter link
Dieser Antwort ist "Community Wiki" markiert.

beantwortet 22 Sep '20, 00:10

Skillmon's gravatar image

Skillmon
1.2k6
Akzeptiert-Rate: 47%

bearbeitet 23 Sep '20, 11:24

Ich werde die Tage weiter an dieser Antwort schreiben (es fehlt offensichtlich noch ein erheblicher Teil), allerdings sind alle eingeladen, sich daran zu beteiligen. Sollte etwas zu ausführlich geraten sein, bin ich für Kritik offen.

(22 Sep '20, 00:12) Skillmon
1

\providecommand definiert das Makro nur dann, wenn es noch nicht definiert ist. Ansonsten macht es nichts. Beispiel: \newcommand\aaa{aaa}\providecommand\aaa{bbb}\aaa gibt "aaa" aus (und nicht "bbb").

(23 Sep '20, 09:04) Axel

@Axel, du hast Recht, kleiner Fehler beim Betrachten der Definition von \provide@command (es macht nicht nichts, es definiert nur einfach stattdessen ein Dummymacro anstelle des eigentlichen).

(23 Sep '20, 11:22) Skillmon
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×18
×6
×6

gestellte Frage: 21 Sep '20, 01:29

Frage wurde gesehen: 4,689 Mal

zuletzt geändert: 23 Sep '20, 19:28