![\makeatletter 和 \makeatother 起什么作用?](https://linux22.com/image/233897/%5Cmakeatletter%20%E5%92%8C%20%5Cmakeatother%20%E8%B5%B7%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
许多 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 真的很糟糕吗?。