扩展由 \g@addto@macro 添加的代码参数

扩展由 \g@addto@macro 添加的代码参数

我想要以下内容(它是大型代码块的一部分):

\def\C{foobar}
\def\A{}
\g@addto@macro\A{\B{\C}}

现在\show\A输出\B{\C}

我想修改第三行,以便\show\A输出\B{foobar}

我相信一些技巧\expandafter应该会有所帮助,但我不熟悉它。(注意:expl3肯定会有所帮助,但我想避免它。)

完整 MWE:

\documentclass{article}

\begin{document}
\makeatletter

\def\C{foobar}
\def\A{}
\g@addto@macro\A{\B{\C}}

\show\A

\makeatother
\end{document}

答案1

\documentclass{article}

\begin{document}
\makeatletter

\def\C{\D}
\def\D{foobar}
\def\A{}
\edef\next{\noexpand\g@addto@macro\noexpand\A{\noexpand\B{\C}}}
\next
\show\A

\expandafter\g@addto@macro\expandafter\A\expandafter{\expandafter\B\expandafter{\C}}
\show\A
\makeatother
\end{document}

变体有所不同:\edef将完全展开,\expandafter只有一个级别。

答案2

作为参考,LaTeX3 解决方案看起来像这样

\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\tl_new:N \C
\tl_set:Nn \C { foobar }
\tl_new:N \A
\tl_gput_right:Nx \A { \exp_not:N \B { \exp_not:V \C } }
\ExplSyntaxOff

\show\A

\end{document}

(我们没有被告知有关的任何信息\B,所以我假设它可能是可扩展的。)我假设\C是一个变量,并且故意将它扩展为它的值:您可能会错过\exp_not:V并进行 x 型扩展。

答案3

\def\C{foobar}

\def\A{}
    
\expandafter\g@addto@macro\expandafter\A\expandafter{%
 \expandafter\noexpand\expandafter\B\expandafter{\C}}
    

或定义

\def\C{foobar}
    
\def\A{}
    
\edef\X{\noexpand\B{\C}}

    \expandafter\g@addto@macro\expandafter\A\expandafter{\X}
    

相关内容