![扩展由 \g@addto@macro 添加的代码参数](https://linux22.com/image/253900/%E6%89%A9%E5%B1%95%E7%94%B1%20%5Cg%40addto%40macro%20%E6%B7%BB%E5%8A%A0%E7%9A%84%E4%BB%A3%E7%A0%81%E5%8F%82%E6%95%B0.png)
我想要以下内容(它是大型代码块的一部分):
\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}