看完之后基本关于 catcode 我开始使用条件语句来自动设置前导码。令人惊讶的是,当我夹住命令时,我确实得到了错误Undefined control sequence. \if@oneside
,而且命令中还有 @:
\makeatletter % ??? why does it only work without catcode sandwich
\if@oneside\newcommand{\onetwoside}{oneside} \else\newcommand{\onetwoside}{twoside}\fi % Autoset var for later according to choosen layout
\makeatother
直接使用 if 就可以了。在哪里可以找到这方面的资料?
答案1
正如您所说,如果您不使用\makeatletter...\makeatother
一切“有效”(可以这么说……)。如果您调用,\onetwoside
您将得到“twoside”(尝试!)。
发生了什么?没有\makeatletter...\makeatother
这个@
,它就不是字母,因此也不是命令的一部分。人眼读到的\if@oneside
TeX 标记列表
\if
@
o
n
e
s
i
d
e
等等。
\if
开始读取并比较以下两个标记:(@
类别代码 12)和o
(类别代码 11)。它们肯定不一样,\if
条件计算结果为 false,跳过剩余的标记(neside
依此类推)并跳转到分支\else
。
如果您使用\makeatletter
和\makeatother
,TeX
尝试评估\if@oneside
不存在的(LaTeX 定义\if@twoside
),则会出现错误。