3
1

Der Titel der Frage sagt eigentlich alles. Hin und wieder sieht man Leute, die \newcommand* verwenden, und dann wieder \newcommand. Worin liegt der Unterschied?

gefragt 09 Jun '13, 22:54

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 26 Jan '16, 13:52

saputello's gravatar image

saputello
11.1k174365


\newcommand ist eine clevere Hülle für \def, die es auf einfache Weise erlaubt, z.B. ein optional Argument zu definieren, und unter anderem testet, ob eine Anweisung bereits existiert, was \def bekanntlich nicht macht. Da nun die allermeisten Befehle als Argument nicht mehrere Absätze erhalten, ist das Standardverhalten von \def, dass seine Argumente das Token \par nicht enthalten dürfen (oder, was gleichwertig ist, das Ende einer Zeile gefolgt von einer leeren Zeile). Das praktische daran ist, dass man, falls man das schließende } vergessen hat, schon beim nächsten Absatzende eine Fehlermeldung erhält anstatt erst am Ende des Dokuments. Wenn man nun mit \def ein Makro definieren möchte, das mehrere Absätze als Argument erhalten kann, muss man das explizit machen, indem man \def ein \long voranstellt:

\def\foo#1{<#1 darf kein \par enthalten>}                               % kurz
\long\def\bar#1{<hier kommt was mit #1, das jetzt \par enthalten darf>} % lang

Was hat das ganze mit \newcommand und der Frage zu tun? Nun, Leslie Lamport entschied aus Gründen, die mir unbekannt sind, dass Makros die mit \newcommand definiert werden, als Voreinstellung lang sind, also \long\def entsprechen, so dass ihre Argumente \par enthalten dürfen. Möchte man das nicht, sondern lieber die Fehlermeldungen haben, die kurze Makros liefern, so muss man \newcommand* verwenden.

\newcommand\bar[1]{<#1 darf \par enthalten>}       % lang
\newcommand*\foo[1]{<#1 darf kein \par enthalten>} % kurz

In den vielen Fällen wird \newcommand* daher bevorzugt eingesetzt.

Das LaTeX3-Paket xparse, das mit \NewDocumentCommand und Freunden sehr flexible Befehle zur Definition eingener Makros liefert, hat das Verhalten übrigens wieder umgedreht:

\NewDocumentCommand\bar{m}{<#1 darf kein \par enthalten>} % kurz
\NewDocumentCommand\foo{+m}{<#1 darf \par enthalten>}     % lang

Hier kann und muss man außerdem pro einzelnem Argument entscheiden, ob man es lang möchte oder nicht.

Permanenter link

beantwortet 09 Jun '13, 23:13

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 13 Jun '13, 10:57

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:

×52
×13
×1

gestellte Frage: 09 Jun '13, 22:54

Frage wurde gesehen: 16,503 Mal

zuletzt geändert: 26 Jan '16, 13:52