\makeatletter 和 \makeatother 起什么作用?

\makeatletter 和 \makeatother 起什么作用?

许多 LaTeX “技巧” 都以 开头\makeatletter和结尾\makeatother。这些命令有什么作用?

答案1

TeX 中的所有字符均被分配了类别代码或“catcode”。总共有 16 个 catcode,有些只包含一个字符,例如\(通常)catcode 0、{catcode 1 等。普通字符是 catcode 11;此类别通常包含所有字母字符。@符号的 catcode 为 12,这意味着它是不是被视为普通字母。其结果是,@在用户文档文件中,通常不能将其用作多字符宏名称的一部分。(所有其他非字母字符也禁止出现在宏名称中:例如,\foo123\foo?!不是有效的宏名称。)

然而,在 LaTeX 类和包文件中,@被视为普通字母(catcode 11),这允许包编写者使用 来创建宏名@。这样做的好处是,这些宏名会自动受到保护,不让普通用户使用:因为它们不能@用作普通字母,所以用户无法意外覆盖或更改作为包内部工作一部分的宏。

然而,有时在用户文档中需要访问此类包内部宏,因此命令\makeatletter\makeatother将 catcode@分别从 12 更改为 11 和从 11 更改为 12。

实际上,如果您需要修改@名称中包含符号的包内部宏,则需要用以下命令包围您的修改:

\makeatletter % changes the catcode of @ to 11
<your changes here>
\makeatother % changes the catcode of @ back to 12

这些命令不应在.sty.cls文件本身内使用,因为它们可能与加载包和类文件时发生的 catcode 更改相冲突。有关更多信息,请参阅在包或类文件中使用 \makeatletter 和 \makeatother 真的很糟糕吗?

相关内容