我想生成一个字符串并保存以供以后使用。但是在以下情况下,它会保存命令而不是字符串:
\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}.
这将生成以下输出:
当前的节点0与父母无效的。
当前的节点0设置为父节点(Node0)。
当前节点1与父母节点1。
此输出告诉我\ParentNode
已保存实际命令而不是字符串。有些东西告诉我有一个简单的解决方案,但我就是找不到它。如何传递命令的结果而不是命令本身?
答案1
宏\SetParentNode
必须扩展其含义,以便它记住实际数据,而不仅仅是指向数据的宏。所以我使用了\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}
OP 必须决定是否\ThisNode
应进行类似的扩展定义时而不是像当前的做法那样,在召回时对其进行扩展。
答案2
只要 eTeX 扩展可用,您就可以使用宏来完成它,而\numexpr
不必浪费计数寄存器。
我试图实现一个不需要的变体\edef
,只需要\expandafter
交换宏参数......
\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}
答案3
我会定义一个\StepNode
命令,而不是依赖于\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}