Wie übergeben Sie das Ergebnis eines Befehls als Argument für einen Befehl?

Wie übergeben Sie das Ergebnis eines Befehls als Argument für einen Befehl?

Ich möchte eine Zeichenfolge generieren und für die spätere Verwendung speichern. In der folgenden Situation wird jedoch der Befehl anstelle der Zeichenfolge gespeichert:

\newcounter{Counter}
\newcommand{\ParentNode} {NULL}
\newcommand{\ThisNode} {Node\theCounter}
\newcommand{\SetParentNode} {\renewcommand{\ParentNode}{\ThisNode}}

Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.\\
\SetParentNode
Current \textbf{\ThisNode} set as parent (\ParentNode).\\
\stepcounter{Counter}
Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.

Dies erzeugt bei mir folgende Ausgabe:

AktuellKnoten0mit ElternNULL.
AktuellKnoten0als übergeordneter Knoten (Node0) festgelegt.
AktuellKnoten1mit ElternKnoten1.

Diese Ausgabe sagt mir, \ParentNodedass die eigentlichen Befehle und nicht die Zeichenfolge gespeichert wurden. Irgendwas sagt mir, dass es eine einfache Lösung gibt, aber ich kann sie einfach nicht finden. Wie übergibt man das Ergebnis eines Befehls anstelle des Befehls selbst?

Antwort1

Die \SetParentNodeBedeutung des Makros muss erweitert werden, damit es sich die tatsächlichen Daten merkt und nicht nur Makros, die auf Daten verweisen. Daher verwende ich ein \edef.

\documentclass{article}
\newcounter{Counter}
\newcommand{\ParentNode} {NULL}
\newcommand{\ThisNode} {Node\theCounter}
\newcommand{\SetParentNode} {\edef\ParentNode{\ThisNode}}
\begin{document}
\noindent
Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.\\
\SetParentNode
Current \textbf{\ThisNode} set as parent (\ParentNode).\\
\stepcounter{Counter}
Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.
\end{document}

Bildbeschreibung hier eingeben

Der OP muss entscheiden, ob \ThisNodeer in ähnlicher Weise erweitert werden sollzum Zeitpunkt der Definitionim Gegensatz zum aktuellen Ansatz, der es zum Zeitpunkt des Rückrufs erweitert.

Antwort2

Solange eTeX-Erweiterungen verfügbar sind, können Sie dies wahrscheinlich mit einem Makro tun, \numexpranstatt ein Zählregister zu verschwenden.

Ich habe versucht, eine Variante zu implementieren, die ohne auskommt und \edefnur \expandafterMakroargumente austauscht ...

\documentclass{article}

\newcommand\exchange[2]{#2#1}

\newcommand\nodecounter{-1}%
\newcommand{\ParentNode}{PARENTOFNULL}
\newcommand\ThisNode{NULL}

\newcommand\SetThisNodeAsParentNodeAndSetNewNodeAsThisNode{%
  \expandafter\renewcommand\expandafter\ParentNode\expandafter{\ThisNode}%
  \expandafter\gdef\expandafter\nodecounter\expandafter{\number\numexpr\nodecounter+1\relax}%
  \expandafter\renewcommand
  \expandafter\ThisNode
  \expandafter{\romannumeral0\expandafter\exchange\expandafter{\nodecounter}{ Node}}%
}

\begin{document}
\SetThisNodeAsParentNodeAndSetNewNodeAsThisNode
\noindent Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.

\SetThisNodeAsParentNodeAndSetNewNodeAsThisNode
\noindent Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.

\SetThisNodeAsParentNodeAndSetNewNodeAsThisNode
\noindent Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Ich würde einen Befehl definieren \StepNode, anstatt mich darauf zu verlassen \stepcounter.

\documentclass{article}

\newcounter{Counter}
\newcommand{\ParentNode}{NULL}
\newcommand{\ThisNode}{}% for safety
\edef\ThisNode{Node\theCounter}% initialize

\newcommand{\SetParentNode}{\let\ParentNode=\ThisNode}

\newcommand{\StepNode}{%
  \stepcounter{Counter}%
  \edef\ThisNode{Node\theCounter}%
}

\begin{document}

Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.

\SetParentNode

Current \textbf{\ThisNode} set as parent (\ParentNode).

\StepNode

Current \textbf{\ThisNode} with parent \textbf{\ParentNode}.

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen