Como você passa o resultado de um comando como argumento para um comando?

Como você passa o resultado de um comando como argumento para um comando?

Gostaria de gerar uma string e salvá-la para uso posterior. No entanto, ele salva o comando em vez da string na seguinte situação:

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

Isso gera a seguinte saída para mim:

AtualNó0Com os paisNULO.
AtualNó0definido como pai (Nó0).
AtualNó1Com os paisNó1.

Esta saída me diz \ParentNodeque salvou os comandos reais e não a string. Algo me diz que existe uma solução simples, mas simplesmente não consigo encontrá-la. Como você passa o resultado de um comando em vez do próprio comando?

Responder1

A \SetParentNodemacro deve ter seu significado ampliado, para que lembre dados reais e não apenas macros apontando para dados. Então eu uso um \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}

insira a descrição da imagem aqui

O OP terá que decidir se \ThisNodedeve ser expandido de forma semelhantena hora da definiçãoem oposição à abordagem atual, que a expande, no momento da recordação.

Responder2

Contanto que extensões eTeX estejam disponíveis, você provavelmente poderá fazer isso com uma macro e \numexprem vez de desperdiçar um registro de contagem.

Tentei implementar uma variante que dispensa \edef, apenas \expandaftere troca de argumentos de 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}

insira a descrição da imagem aqui

Responder3

Eu definiria um \StepNodecomando, em vez de confiar no arquivo \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}

insira a descrição da imagem aqui

informação relacionada