PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Selbstbezügliches \newcommand



Phylax
16-09-2008, 15:33
Servus,

habe mal den \newcommand-Befehl mit einer Definition getestet, in der er selber nochmals auftaucht:

\newcommand{\test}[1]{\newcommand{#1}{es klappt}}

dies erlaubt, durch

\test{neuko} den neuen Befehl \neuko zu definieren, dessen Ausgabe "es klappt ist". Das war trivial.

Problematisch wird es, wenn der Befehl \testb, einen Befehl \neukob definieren soll, der eine Variable nehmen kann.


\newcommand{\testb}[1]{\newcommand{#1}[1]{es klappt #1}}
\testb{\neukob}
\neukob{noch immer}

Das funktioniert nicht, offensichtlich weil die Variable #1 auf zwei verschiedenen Ebenen vorkommt.

Man muss sie verschieden benennen:


\newcommand{\testc}[1]{\newcommand{#1}[2]{es klappt #2}}
\testc{\neukoc}
\neukoc{noch immer}

gibt, wie man erwartet: "es klappt noch immer" aus, wenngleich man dann die (lästige) Fehlermeldung bekommt: "Illegal parameter number in definition of \testc"

Eine weiterführende Frage zu diesem Thema kommt noch, für den Augenblick belasse ich es bei dieser Information.

Meinen Respekt allen Profis hier im Forum, die es schaffen, mit dieser Flut an Fragen mitzuhalten.

Phylax

Stefan_K
16-09-2008, 16:22
Hallo Phylax,

ganz oben sollte es sicher

\test{\neuko}
heißen, also mit backslash.

Im weiteren versuche einmal:

\newcommand{\testb}[1]{\newcommand{#1}[1]{es klappt ##1}}

Viele Grüße,

Stefan

voss
16-09-2008, 16:45
gibt, wie man erwartet: "es klappt noch immer" aus, wenngleich man dann die (lästige) Fehlermeldung bekommt: "Illegal parameter number in definition of \testc"



\documentclass{article}
\makeatletter
\newcommand\testA[1]{%
\expandafter\newcommand\expandafter{\csname#1\endc sname}{es klappt A}}
\newcommand\testB[1]{%
\expandafter\newcommand\expandafter{\csname#1\endc sname}[1]{es klappt: ##1}}
\makeatother

\begin{document}

\testA{neukoA} \neukoA
\testB{BBBBB} \BBBBB{foo}

\end{document}

Herbert

Phylax
24-09-2008, 15:33
Hier ist jetzt mal ein ganz dickes Dankeschön fällig. Vor allem an voss / Herbert. Dein Beispiel war sehr erhellend und hat mir endlich gezeigt, wie man zwischen dem Makrobefehl und dessen expandierter Form unterscheiden kann. Dieser Unterschied war mir zwar intuitiv klar, ich wusste aber nicht, wie ich ihn angeben konnte.

Wie Ihr euch denken könnt, war das nicht nur eine Trockenübung und ich habe jetzt meine Layoutvorlage für unsere Zeitschrift fertig.
http://www.mrunix.de/forums/showthread.php?t=60882