Я хотел бы сгенерировать строку и сохранить ее для дальнейшего использования. Однако в следующей ситуации сохраняется команда вместо строки:
\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
следует ли его аналогичным образом расширить.на момент определенияв отличие от текущего подхода, который расширяет его на момент отзыва.
решение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}