如何扩展宏参数中的控制序列

如何扩展宏参数中的控制序列

考虑以下:

\def\foo#1#2 {%
  \if#1a%
    \message{#2}
  \fi}
\def\x{abc}
\edef\y{\foo\x}
\y

结果:! Argument of \foo has an extra }.

预期结果:bc

答案1

TeX 在吸收宏的参数时不会扩展标记。因此,在确定第一个参数是第一个参数后,仍在寻找第二个参数时\foo会发现。}\x

如果你的目的是用\foo空格分隔第二个参数,你应该这样做

\def\foo#1#2 {%
  \if#1a%
    \message{#2}
  \fi}
\def\x{abc }
\edef\y{\expandafter\foo\x}
\y

因此在开始寻找其参数\x之前,它会被扩展。\foo

该宏\y将扩展为\message{bc}。请注意替换文本中的尾随空格\x


您选择的分隔符在此特定情况下不是最佳分隔符。另一种策略是使用“保留”标记:

\def\foo#1#2\foo{%
  \if#1a%
    \message{#2}
  \fi}
\def\x{abc}
\edef\y{\expandafter\foo\x\foo}
\y

我使用它,\foo因为它不太可能出现在其自身的论点中。

相关内容