¿Cómo se pasa el resultado de un comando como argumento para un comando?

¿Cómo se pasa el resultado de un comando como argumento para un comando?

Me gustaría generar una cadena y guardarla para usarla más adelante. Sin embargo, guarda el comando en lugar de la cadena en la siguiente situación:

\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}.

Esto genera el siguiente resultado para mí:

ActualNodo0con los padresNULO.
ActualNodo0establecido como padre (Nodo0).
ActualNodo1con los padresNodo1.

Este resultado me dice \ParentNodeque ha guardado los comandos reales y no la cadena. Algo me dice que hay una solución sencilla, pero no la encuentro. ¿Cómo se pasa el resultado de un comando en lugar del comando en sí?

Respuesta1

Se debe ampliar el significado de la \SetParentNodemacro, de modo que recuerde datos reales y no solo macros que apuntan a datos. Entonces uso un \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}

ingrese la descripción de la imagen aquí

El OP tendrá que decidir si \ThisNodese debe ampliar de manera similar.en el momento de la definicióna diferencia del enfoque actual, que lo amplía, en el momento de la retirada.

Respuesta2

Siempre que haya extensiones eTeX disponibles, probablemente pueda hacerlo con una macro y \numexpren lugar de desperdiciar un registro de conteo.

Intenté implementar una variante que prescinde de \edef, solo \expandafterintercambia argumentos macro...

\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}

ingrese la descripción de la imagen aquí

Respuesta3

Definiría un \StepNodecomando, en lugar de confiar en \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}

ingrese la descripción de la imagen aquí

información relacionada