Как передать результат команды в качестве аргумента команды?

Как передать результат команды в качестве аргумента команды?

Я хотел бы сгенерировать строку и сохранить ее для дальнейшего использования. Однако в следующей ситуации сохраняется команда вместо строки:

\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}

введите описание изображения здесь

Связанный контент