コマンドの結果をコマンドの引数として渡すにはどうすればよいでしょうか?

コマンドの結果をコマンドの引数として渡すにはどうすればよいでしょうか?

文字列を生成して後で使用するために保存したいのですが、次の状況では文字列ではなくコマンドが保存されます。

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

ここに画像の説明を入力してください

関連情報