如何將命令的結果作為命令的參數傳遞?

如何將命令的結果作為命令的參數傳遞?

我想生成一個字串並保存以供以後使用。但是,在以下情況下它會保存命令而不是字串:

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

在此輸入影像描述

相關內容