宏名称中的反斜杠

宏名称中的反斜杠

非常简单的代码:

\def\a{12}
\def\a\b{34}
\a\b        % ok: 34
\a          % error
\bye

非常简单的问题:我想知道\def\a\b{34}tex 引擎如何处理以及为什么\a不再起作用:

! Use of \a doesn't match its definition.

答案1

您定义了\a两次。根据规则,第二次定义将覆盖第一次定义。

第二个定义是一个名为\a参数文本 \b. 按照规定,这精确的每次调用 时都需要 token \a

因此\a\b将扩展为替换文本,即34。调用\a将导致错误,因为查找\b失败。您可以注意到该消息是关于\a不匹配其定义。

根据标记化过程的规则\a\b标记,而不是一个。您不能定义名称中带有反斜杠的宏,除非您使用\csname...\endcsname或更改类别代码(但这样您将无法将其\用作命令名称的前缀)。

您可以查看 TeXbook 或 TeX by Topic 来查找“分隔参数”和“参数文本”。


顺便说一下,LaTeX 总是使用名称中带有反斜杠的宏。例如

\newcommand{\foo}[2][default]{#1--#2}

将定义\foo\\foo,尽管后者宏对最终用户不可用,除非\csname\string\foo\endcsname使用输入。第一个是“真正的”反斜杠,第二个是字符,是标记名称的一部分。

相关内容