我想生成一個字串並保存以供以後使用。但是,在以下情況下它會保存命令而不是字串:
\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}