考虑以下:
\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
因为它不太可能出现在其自身的论点中。