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

16 Aug '14, 10:44

cfeuersaenger's gravatar image

cfeuersaenger
3.7k23

_Hinweis_: diese Antwort stammt eigentlich aus der Originalfrage. Originalfrage http://texwelt.de/wissen/fragen/8404/ist-es-moglich-eigene-befehle-mit-mehr-als-einem-optionalen-argument-zu-definieren. Ich poste sie hier in einer modifizierten Kopie, damit wir die Knowledge-Base leichter lesbar haben. ------ Ich schlage folgende Variante mit `pgfkeys` vor. \documentclass{article} \usepackage{pgfkeys} \pgfkeys{ % dies DEKLARIERT keys mit dem angegebenen initial wert. % der suffix '/.initial' heisst "legen neuen Key mit dem % angegeben Wert an". /feynman/anrede/.initial=, /feynman/name/.initial=, /feynman/vorname/.initial=, } \newcommand{\name}[1]{% \begingroup % Dies nimmt die key-value-liste #1 und setzt alle keys. % Wenn jemand "anrede" schreibt, wird automatisch "/feynman/" % davor gehaengt: \pgfqkeys{/feynman}{#1}% % % hier hoelen wir Werte ab und speichern sie in Makros: \pgfkeysgetvalue{/feynman/anrede}\feynmanAnrede \pgfkeysgetvalue{/feynman/name}\feynmanName \pgfkeysgetvalue{/feynman/vorname}\feynmanVorname % % Nun kann man was damit machen - z.B. mithilfe von TeX % Programmierung: \ifx\feynmanAnrede\empty \else \textbf{\feynmanAnrede}~% \fi % \ifx\feynmanVorname\empty \PackageError{feynman}{Vorname fehlt}{}% \else \textsc{\feynmanVorname}~% \fi % \textit{\feynmanName}% \endgroup } \begin{document} \name{anrede=Frau, vorname=Maria, name=Musterfrau}% \name{vorname=Max, name=Mustermann} \end{document} ![alt text][1] Diese Variante unterscheidet sich von der anderen hier vorgestellten dadurch, dass sie die Werte "direkt" in den Key speichert anstelle noch ein extra-makro zu verwenden. Vorteil (neben vernachlaessigbaren Speichereinsparungen): man kann dann auch sowas wie `\pgfkeys{/feynman/name/.add={<prefix>}{<suffix>}` machen, um einen existierenden Wert zu veraendern. Ausserdem erleichtert das das Auslesen der Werte fuer Leute, nicht auf Anhieb wissen wie das keyvalue system implementiert ist. Mit einem Wort: fuer keys, die nur Werte enthalten, empfehle ich die Deklaration mit `/.initial` wie oben beschrieben - das skaliert und ist leichter zu dokumentieren. Details zu dem Stichwort "TeX Programmierung" habe ich mal zusammengeschrieben, man findet das - zusammen mit weiterfuehrenden Hinweisen zu `pgfkeys` bspw. unter http://tex.stackexchange.com/questions/12668/where-do-i-start-latex-programming/27589#27589 [1]: http://texwelt.de/wissen/upfiles/P_9.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

16 Aug '14, 10:43

cfeuersaenger's gravatar image

cfeuersaenger
3.7k23

_Hinweis_: diese Antwort stammt eigentlich aus der Originalfrage. Ich poste sie hier in einer modifizierten Kopie, damit wir die Knowledge-Base leichter lesbar haben. ------ Ich schlage folgende Variante mit `pgfkeys` vor. \documentclass{article} \usepackage{pgfkeys} \pgfkeys{ % dies DEKLARIERT keys mit dem angegebenen initial wert. % der suffix '/.initial' heisst "legen neuen Key mit dem % angegeben Wert an". /feynman/anrede/.initial=, /feynman/name/.initial=, /feynman/vorname/.initial=, } \newcommand{\name}[1]{% \begingroup % Dies nimmt die key-value-liste #1 und setzt alle keys. % Wenn jemand "anrede" schreibt, wird automatisch "/feynman/" % davor gehaengt: \pgfqkeys{/feynman}{#1}% % % hier hoelen wir Werte ab und speichern sie in Makros: \pgfkeysgetvalue{/feynman/anrede}\feynmanAnrede \pgfkeysgetvalue{/feynman/name}\feynmanName \pgfkeysgetvalue{/feynman/vorname}\feynmanVorname % % Nun kann man was damit machen - z.B. mithilfe von TeX % Programmierung: \ifx\feynmanAnrede\empty \else \textbf{\feynmanAnrede}~% \fi % \ifx\feynmanVorname\empty \PackageError{feynman}{Vorname fehlt}{}% \else \textsc{\feynmanVorname}~% \fi % \textit{\feynmanName}% \endgroup } \begin{document} \name{anrede=Frau, vorname=Maria, name=Musterfrau}% \name{vorname=Max, name=Mustermann} \end{document} ![alt text][1] Diese Variante unterscheidet sich von der anderen hier vorgestellten dadurch, dass sie die Werte "direkt" in den Key speichert anstelle noch ein extra-makro zu verwenden. Vorteil (neben vernachlaessigbaren Speichereinsparungen): man kann dann auch sowas wie `\pgfkeys{/feynman/name/.add={<prefix>}{<suffix>}` machen, um einen existierenden Wert zu veraendern. Ausserdem erleichtert das das Auslesen der Werte fuer Leute, nicht auf Anhieb wissen wie das keyvalue system implementiert ist. Mit einem Wort: fuer keys, die nur Werte enthalten, empfehle ich die Deklaration mit `/.initial` wie oben beschrieben - das skaliert und ist leichter zu dokumentieren. Details zu dem Stichwort "TeX Programmierung" habe ich mal zusammengeschrieben, man findet das - zusammen mit weiterfuehrenden Hinweisen zu `pgfkeys` bspw. unter http://tex.stackexchange.com/questions/12668/where-do-i-start-latex-programming/27589#27589 [1]: http://texwelt.de/wissen/upfiles/P_9.png