> Meines Wissens nach erlaubt
> `\newcommand{\name}[x][default_1]{definition}`
> bei einer Befehlsdefinition über
> `[x][default_1]` die Definition eines
> Befehls mit x Argumenten, wobei man
> nur für das erste einen Defaultwert
> angeben kann.
Stimmt, wobei x nicht größer als 9 sein kann. Die maximale Anzahl von neun Argumenten ist durch TeX vorgegeben und kann nicht umgangen werden. Sollte man je auf ein Makro mit mehr Argumenten treffen, dann täuscht es das nur vor (und wurde höchstwahrscheinlich schlecht designt: werd wer kann sich schon bei so vielen Argumenten die richtige Reihenfolge merken? Ich hab bei 4 schon Schwierigkeiten...).
Mit `\newcommand` lassen sich nur Befehle mit maximal einem optionalen Argument an der ersten Stelle definieren. Dass es natürlich auch anders geht, beweißt beweißen schon die zwei Makros, die wir alle jeden jede Woche viele Dutzend mal tippen:
\documentclass[<Optionen>]{<Klasse>}[<Version>]
\usepackage[<Optionen>]{<Pakete>}[<Version>]
Es gibt eine Reihe von Wegen, wie man derartige Makros definieren kann, sehr bequem geht es mit dem Paket [`xparse`][1]:
\usepackage{xparse}
\NewDocumentCommand\foo{O{}mO{bar}}{%
`#1' (optional, Default leer)
`#2' (benötigt)
`#3' (optional, Default: `bar')%
}
Die Argumente werden im zweiten Argument von `\NewDocumentCommand` spezifiziert, spezifiziert,
\NewDocumentComment{<befehl>}{<Argumente>}{<Definition>}
und zwar stehen bestimmte Buchstaben für bestimmte Typen von Argumenten. Ich will nicht alle aufzählen (dafür gibt es die Doku) sondern drei heraussuchen:
- `m` (*mandatory*): normales nicht-optionales Argument.
- `o` (*optional*): ein optionales Argument ohne Default-Wert. Ob es angegeben wurde, lässt sich mit `\IfNoValueTF{#1}{<wahr>}{<falsch>}` testen. Ein leeres aber vorhandenes Argument (wie etwa `\foo[]` würde hier `<falsch>` geben, da »leer« eben nicht das gleiche wie »nicht vorhanden« ist.
- `O{<default>}` (*optional*): ein optionales Argument, dem man in geschweiften Klammern einen Default-Wert geben kann.
Ich würde allerdings einen Befehl mit drei optionalen Argumenten vermeiden: kommen sie hintereinander, dann kann man die folgenden nur verwenden, wenn man die vorhergehenden auch setzt:
\foo[][bar] % das erste leer aber gesetzt, das zweite `bar'
Das Interface von `xparse` erlaubt auch Befehle mit anderen Klammern als der eckigen und geschweiften, es lassen sich auch Argumente mit geschweiften Klammern leicht optional machen. Bevor man sich damit aber austobt, sollte man sich besser überlegen, ob es sinnvoll ist, von der allgemeinen LaTeX-Praxis abzuweichen, und falls ja: warum.
----------
Um die Frage nach den Default-Werten für die anderen Argumente des Makros in der Fragestellung zu beantworten: man könnte darauf testen, ob die Argumente 2 und 3 etwas enthalten außer Leerzeichen und falls nicht, entsprechenden Text vorgeben. Für solche Tests mag ich das Paket [`etoolbox`][2] recht gerne:
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\name}[3][Herr]{%
\textbf{#1}~%
\textsc{\ifblank{#2}{Bitte Vornamen angeben!}{#2}}~%
\textit{\ifblank{#2}{Bitte Nachnamen angeben!}{#3}}%
}
\begin{document}
\name{}{}
\end{document}
![alt text][3]
[1]: http://www.ctan.org/pkg/xparse
[2]: http://www.ctan.org/pkg/etoolbox
[3]: http://texwelt.de/wissen/upfiles/befehl.png