문자열을 생성하고 나중에 사용하기 위해 저장하고 싶습니다. 그러나 다음 상황에서는 문자열 대신 명령을 저장합니다.
\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}
\ThisNode
OP는 유사하게 확장해야 하는지 결정해야 합니다.정의할 때리콜 시점에 이를 확장하는 현재 접근 방식과는 대조적입니다.
답변2
\numexpr
eTeX 확장을 사용할 수 있는 한 카운트 레지스터를 낭비하는 대신 매크로를 사용하여 이를 수행할 수 있습니다 .
\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}