使用由 \csname 定义的其他扩展来输入宏

使用由 \csname 定义的其他扩展来输入宏

我有一个宏\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}

相关内容