\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.
beantwortet
09 Jun '13, 23:13
cgnieder
22.1k●25●34●63
Akzeptiert-Rate:
60%