当我编译以下代码时出现错误:
“\abc 的使用与其定义不符”
\abc 的定义是什么?
\documentclass{article}
\begin{document}
\def\foo#1{\def\abc#1{test}}
\foo{gh}
\abc x y z
\end{document}
答案1
添加\show\foo
和\show\abc
。然后以交互模式运行 LaTeX:
\documentclass{article}
\begin{document}
\def\foo#1{\def\abc#1{test}}
\foo{gh}
\show\foo
\show\abc
\abc x y z
\end{document}
TeX 将因错误而停止并显示
> \foo=macro:
#1->\def \abc #1{test}.
l.8 \show\foo
按回车键查看下一条消息
> \abc=macro:
gh->test.
l.9 \show\abc
再次按回车键
! Use of \abc doesn't match its definition.
l.11 \abc x
y z
如果您无法以交互模式运行,请\meaning\foo
改为说并查看生成的输出。
\show
当要显示的令牌是宏时,格式为
<parameter text>-><replacement text>.
(请注意,最后一个句号不是替换文本的一部分)。
中的参数文本\foo
是#1
,这意味着 TeX 将按照通常的规则查找参数。请注意,参数文本表示 TeX必须找到。例如,如果你调用{\foo}
,TeX 会抱怨,因为它找不到参数:右括号不是适合作为参数的标记。
\abc
在参数文本显示为 的情况下gh
,这意味着在\abc
TeX必须找不到gh
。如果没有,则会引发错误。
但你实际上并不需要\show
: 只需遵循扩展即可。调用
\foo{gh}
将导致 TeX\foo
在查找参数后用其替换文本进行替换:
\def\abc gh{test}
可能并非\def\abcgh
你所期望的那样。在 的替换文本中\foo
,\abc
是一个标记,而 TeX 只处理标记。因此,•
对于除以标记,你得到
\def•\abc•g•h•{•t•e•s•t•}
参数文本是定义宏之后直到第一个 的任何内容{
。它可以包含#
,表示必需参数,就像 的情况一样\foo
,但这不是必须的。
答案2
\def\abc gh{test}
定义为必须跟在后面并扩展为\abc
的宏,使用如下gh
test
\abc gh x y z