可能重复:
为什么 LaTeX 内部命令中带有 @?
LaTeX 中的符号是什么@
意思?我正在查看的源代码apa.cls
,其中有一个声明:
\newsavebox\gr@box
后来
\sbox\gr@box{\includegraphics[width=\linewidth]{#2}}.
它似乎不像@
一个正常的角色,但我无法弄清楚它到底在做什么,经过谷歌搜索后也没有找到任何东西(我多么希望谷歌有正则表达式功能!)谢谢。
编辑:谢谢你的帮助;在我浏览的链接中,我发现http://www.tug.org/pipermail/tugindia/2002-January/000178.html非常有用且简洁。总而言之,该@
字符通常不允许出现在宏的名称中,因此作为范围界定的一种技巧,LaTeX 软件包在内部将其声明为有效的名称字符并将其用于宏。您可以\makeatletter
在文档中使用这些宏,但显然必须非常小心,因为您现在可以覆盖必要的 LaTeX 内核宏;使用\makeatother
来恢复。
答案1
每个字符都有从 0 到 15 的类别代码。
- 0 - 转义字符;这表示控制序列的开始。反斜杠
\
(Unicode 代码点 U+005C)是默认转义字符。 - 1 - 组开始;这样的字符使 TeX 进入新的分组层级。左括号
{
是组开始字符。 - 2 - 组结束;TeX 关闭当前分组级别。TeX 将右括号
}
作为组结束字符。 - 3 – 数学移位;TeX 使用美元符号
$
来表示这一点。 - 4 – 对齐选项卡;TeX 使用与符号
&
。 - 5——行尾;TeX 认为该字符表示输入行的结束。
- 6 - 参数字符;这表示宏的参数。在 TeX 中,这是井号
#
。 - 7 - 上标;默认上标是脱字符
^
。 - 8 – 下标;默认上标是下划线
_
。 - 9 - 忽略;此类别的字符将从输入中删除。
- 10 - 空格;空格字符会受到特殊处理。TeX 将此类别分配给空格(Unicode 代码点 U+0020)和制表符(U+0009)。
a..z
11 - 字母;在 TeX 中,只有字符A..Z
属于此类别。宏包通常会将某些“秘密”字符(例如@
)变成字母,见下文。- 12 - 其他;TeX 将其他类别中没有的所有内容都归入此类别。例如,数字、标点符号和
@
。 - 13 - 活动;活动字符用作 TeX 命令,但前面无需转义字符。tie 字符
~
属于此类。 - 14 – 注释字符;默认注释字符是
%
。 - 15 - 无效字符;此类别指不应出现在输入中的字符。如果出现此类字符,TeX 会引发错误。
宏名称仅由字母组成(代码 11)。@
符号的类别代码为 12,因此不能包含在宏名称中。但是,您可以更改任何符号的类别
\catcode`\@ = 11 % Macro \makeatletter does the same
现在您可以@
在宏名称中使用字母。所有 LaTeX 包都会将 catcode 更改为@
11,并在最后将其返回为 12。
\catcode`\@ = 12 % Macro \makeatother does the same
注意,您可以将 catcode 更改为任何字符,而不仅仅是 @。例如,如果您想使用[
,]
作为打开和关闭组符号,请写
\catcode`\[ = 1
\catcode`\] = 2
答案2
宏名称中的 @ 字符只是将宏标记为包的内部宏,请参阅 https://texfaq.org/FAQ-atsigns
答案3
已解答这里。
LaTeX 命令是使用带有 @ 符号的命令构建的。为了防止这些命令被修改,@ 通常被重新定义为特殊符号。偶尔,如果您知道自己在做什么,您可以“make at letter”(\makeatletter)进行一些微调,然后在完成后再次“make at other”(\makeatother)。