Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

13 Jun '13, 10:57

cgnieder's gravatar image

cgnieder
22.1k253463

`\newcommand` ist eine clevere Hülle für `\def`, die es auf einfache Weise erlaubt, z.B. optionale Argumente 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`][1], 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. [1]: http://www.ctan.org/pkg/l3packages
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

10 Jun '13, 00:17

cgnieder's gravatar image

cgnieder
22.1k253463

`\newcommand` ist eine clevere Hülle für `\def`, die es auf einfache Weise erlaubt, z.B. optionale Argumente 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 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 LeTeX3-Paket LaTeX3-Paket [`xparse`][1], 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 Hier kann und muss man außerdem pro einzelnem Argument entscheiden, ob man es lang möchte oder nicht. [1]: http://www.ctan.org/pkg/l3packages
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

09 Jun '13, 23:17

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

09 Jun '13, 23:13

cgnieder's gravatar image

cgnieder
22.1k253463