我有一个宏\mymacro@i
,我想用另一个 的扩展来“馈送”它\test
。使用\expandafter\mymacro@i\test
,它可以工作。
现在,\test
可以使用 来定义宏\csname
,比如/test
宏。我找不到 的组合来\expandafter
使其以与 相同的方式工作\test
。我该怎么办?
\documentclass{standalone}
\makeatletter
\expandafter\def\csname /test\endcsname{%
\foo{bar}}
\def\mymacro#1{%
\expandafter\mymacro@i\csname/#1\endcsname}
\def\mymacro@i\foo#1{%
\def\temp{#1}%
\show\temp}
\mymacro{test}
% Error: Use of \mymacro@i doesn't match its definition.
%
\def\test{\foo{bar}}
\def\mymacro#1{%
\expandafter\mymacro@i\test}
\def\mymacro@i\foo#1{%
\def\temp{#1}%
\show\temp}
\mymacro{test}
\begin{document}
\end{document}
答案1
现在您需要将其展开两次,一次\csname /#1\endcsname
展开\/#1
该宏。因此您需要添加二更多\expandafter
。第一个将\expandafter
在第二个之前扩展第三个,即,允许第三个扩展\csname
构造,然后第二个才扩展生成的宏\mymacro@i
。
\def\mymacro#1{%
\expandafter\expandafter
\expandafter\mymacro@i\csname/#1\endcsname}