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, 16:54

Clemens's gravatar image

Clemens
19.0k112960
Akzeptiert: 73%

bearbeitet 26 Jan, 07:52

saputello's gravatar image

saputello
18.4k22352


\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, 17:13

Clemens's gravatar image

Clemens
19.0k112960

bearbeitet 13 Jun '13, 04:57

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×45
×6
×1

Frage gestellt: 09 Jun '13, 16:54

Frage wurde angeschaut: 5,778 Mal

Zuletzt aktualisiert: 26 Jan, 07:52