Eine weitere Methode ist das Paket [`xkeyval`][1]. Das Paket ist eine Erweiterung von [`keyval`][2], einem Paket, das zum `required`-Teil einer TeX-Distribution gehört und z.B. von KOMA-Script oder `graphicx` verwendet wird. Der Standardbefehl zur Definition von Keys ist hier
\define@key{<Familie>}{<Key>}[<Leerwert>]{<Code>}
Und wird in dieser Form auch von `keyval` bereitgestellt. `xkeyval` erweitert den Befehl um ein weiteres optionales Argument <Präfix>, auf das ich aber nicht weiter eingehen will:
\define@key[<Präfix>]{<Familie>}{<Key>}[<Leerwert>]{<Code>}
Setzen kann man sie dann später mit
\setkeys{<Familie>}{<Keys>}
Das folgende Beispiel bastelt mein Beispiel aus der Antwort mit `pgfkeys` nach und verwendet `keyval`, der Output ist der gleiche. Auch hier werden die Keys in einer Gruppe gesetzt, damit die Werte nur für den aktuellen Gebrauch gesetzt werden.
\documentclass{article}
\usepackage{keyval}
\makeatletter
\newcommand*\name@anrede{Herr/Frau}
\newcommand*\name@vorname{Vorname}
\newcommand*\name@nachname{Nachname}
\define@key{name}{anrede} {\renewcommand*\name@anrede{#1}}
\define@key{name}{vorname} {\renewcommand*\name@vorname{#1}}
\define@key{name}{nachname}{\renewcommand*\name@nachname{#1}}
\newcommand*\name[1][]{%
\begingroup
\setkeys{name}{#1}%
\name@anrede\ \name@vorname\ \name@nachname
\endgroup
}
\makeatother
\begin{document}
\name\par
\name[anrede=Frau,nachname=Musterfrau,vorname=Mia]\par
\name
\end{document}
Mit `xkeyval` lässt sich das ganze etwas verkürzen. `xkeyval` kennt z.B. `\define@cmdkey`, bei dem der Wert in einem Makro gespeichert wird, das notfalls neu definiert wird.
\define@cmdkey[<Präfix>]{<Familie>}[<Befehl-Präfix>]{<Name>}{<Code>}
Das definierte Makro bekommt den Namen `\<Befehl-Präfix><Name>` oder – wenn `<Befehl-Präfix>` nicht vorgegeben wird – `\cmd<Präfix>@<Familie>@<Name>` . Damit wird aus dem Beispiel:
\documentclass{article}
\usepackage{xkeyval}
\makeatletter
\newcommand*\name@anrede{Herr/Frau}
\newcommand*\name@vorname{Vorname}
\newcommand*\name@nachname{Nachname}
\define@cmdkey{name}[name@]{anrede} {}
\define@cmdkey{name}[name@]{vorname} {}
\define@cmdkey{name}[name@]{nachname}{}
\newcommand*\name[1][]{%
\begingroup
\setkeys{name}{#1}%
\name@anrede\ \name@vorname\ \name@nachname
\endgroup
}
\makeatother
\begin{document}
\name\par
\name[anrede=Frau,nachname=Musterfrau,vorname=Mia]\par
\name
\end{document}
Definiert man die Makros vorher nicht selber, so kann man bei beiden Methoden durch Testen, ob das entsprechende Makro existiert, auch auf einfache Weise Fehlermeldungen oder anderes Verhalten etc. erreichen:
\documentclass{article}
\usepackage{xkeyval}
\makeatletter
\define@cmdkey{name}[name@]{anrede} {}
\define@cmdkey{name}[name@]{vorname} {}
\define@cmdkey{name}[name@]{nachname}{}
\newcommand*\name[1][]{%
\begingroup
\setkeys{name}{#1}%
\@ifundefined{name@anrede}
{Herr/Frau}
{\name@anrede}
\@ifundefined{name@vorname}
{Vorname}
{\name@vorname}
\@ifundefined{name@nachname}
{Nachname}
{\name@nachname}%
\endgroup
}
\makeatother
\begin{document}
\name\par
\name[anrede=Frau,nachname=Musterfrau,vorname=Mia]\par
\name
\end{document}
[1]: http://www.ctan.org/pkg/xkeyval
[2]: http://ctan.org/pkg/keyval