如何打印和分配类别代码?

如何打印和分配类别代码?

考虑下面的代码,在给我带来一些麻烦之后(特别是 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。

相关内容