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 \ParentNode
que 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 \SetParentNode
macro 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}
O OP terá que decidir se \ThisNode
deve 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 \numexpr
em vez de desperdiçar um registro de contagem.
Tentei implementar uma variante que dispensa \edef
, apenas \expandafter
e 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}
Responder3
Eu definiria um \StepNode
comando, 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}