![宏名称中的反斜杠](https://linux22.com/image/415914/%E5%AE%8F%E5%90%8D%E7%A7%B0%E4%B8%AD%E7%9A%84%E5%8F%8D%E6%96%9C%E6%9D%A0.png)
非常简单的代码:
\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
使用输入。第一个是“真正的”反斜杠,第二个是字符,是标记名称的一部分。