考虑下面的代码,在给我带来一些麻烦之后(特别是 catcode 9 和 15),它会打印出所有类别代码,直到 catcode 15。
\documentclass{minimal}
\parindent0pt
\begin{document}
\the\catcode`\\ \ control character \\
\the\catcode`{ \ open curly\\
\the\catcode`} \ closing curly \\
\the\catcode`$ \ dollar\\
\the\catcode`& \ alignment\\
\the\catcode`\
\ space \\\the\catcode`# \ sharp\\
\the\catcode`^ \ hat \\
\the\catcode`_ \ underscore \\
\number\catcode`\ \ space \\
\catcode `\y=9
\the\catcode`\y \ ignored character \\
\the\catcode`a \ letters\\
\number\catcode`@ \ restricted \\
\number\catcode`~ \ tilde \\
\the\catcode`\% \ comment\\
\catcode`\z = 15
\the\catcode`\z \ invalid character \\
\def\test{}
%\catcode `\t=16
\ifcat\test 16 16 control sequence\fi
\end{document}
现在,让 TeX 打印 catcode 16 让我感到困惑。首先,如果你取消注释该行,%\catcode \t=16
你会得到,
! Invalid code (16), should be in the range 0..15. l.23 \catcode\t=16
但是,如果你用\ifcat
控制序列测试,肯定等于类别代码 16。所以我的问题是,我怎样才能强制 TeX 将控制序列说成十六,为什么错误消息说 16 是无效代码,而 TeXbook 却说是呢?
Mildy 相关问题如何获取作为控制序列值的字符的类别代码?
答案1
确实有不\let
类别代码 16。此代码仅出于以下目的分配给控制序列(而不是字符) \ifcat
。
类似地,为了的目的,字符代码 256 被分配给相同的标记\if
。
您可以使用以下方式获取类别代码 9 和 15
\the\catcode`\^^@
\the\catcode`\^^?
(这些是默认设置中唯一具有这些类别代码的字符,字节 0 和 127)。
还要注意的是,它\ifcat
不会将标记与数字进行比较,但是二代币:
\ifcat ab
\ifcat a1
第一个结果为真,第二个结果为假。
引用自 TeXbook,第 209 页:
•
\ifcat<token1><token2>
(测试类别代码是否一致)
TeX 将扩展以下宏,\if
直到找到两个不可扩展的标记。如果任一标记是控制序列,TeX 会认为它具有字符代码 256 和类别代码 16,除非该控制序列的当前等效项等于\let
非活动字符标记。
关键词是认为.请看第38页:
标记可以是 (a) 带有附加类别代码的单个字符,也可以是 (b) 控制序列。
《TeX,程序》的第 506 节说明了这一点:如果下一个标记不是活动字符或控制序列(不是字符),则变量 *cur_chr* 获得值 256。