如何获取作为控制序列值的字符的类别代码?
如果我这样做
The catcode for A is \the\catcode`A.
我明白了
The catcode for A is 11.
如果我这样做
\let\abc=A
The catcode for \abc\ is \the\catcode\abc.
我得到“缺失数字,视为零”。
我思考我的理解是这样的:\abc 被替换为字符代码、类别代码对 <65, 11>,但是 TeX 只期望 \the\catcode 后有一个数字,所以它插入了一个 0,而我的 A 则悬而未决。
答案1
可悲的是,Knuth 虽然很聪明,但在 TeXBook 中只为此类情况提供了很少的线索。
为了理解错误,我们首先需要理解 的定义\the
,它是 的情况catcode
\the<codename><8-bit number>
,<codename>
其中 代表\catcode
、
\mathcode
等\lccode
……
因此显然在这种情况下catcode
TeX 需要一个数字,因此 OP 提供的示例中产生了错误。
其他帖子提供的所有解决方案都围绕着以某种方式改变定义以产生所需的字符代码号,我在这里通过一些不同的例子来演示:
下面的例子在两种情况下都会产生正确的答案,
% results category 11
\makeatletter
\def\ABC{`@ }
\the\catcode\ABC
% results category 12
\makeatother
\def\ABC{`@ }
\the\catcode\ABC
虽然使用\ifcat
事物比较两个标记变得有点复杂,但如果你想比较两个活动字符,你必须说\noexpand
- Knuth 在练习 20.11 中有些晦涩地这么说!
考虑以下定义
\catcode`[=13 \catcode`]=13
\def[{*}
[
由于我们与 ']'进行比较,因此以下结果为 True,两者现在均为第 13 类
\ifcat\noexpand[\noexpand] True \else False \fi
也\ifcat[* True \else False \fi
为真
因为现在我们已经确定了两个事实\the\catcode
需要一个数字,并且如果你使用一个主动字符,无论隐式或显式,我们都可以理解为什么以下内容都会起作用!
\def\abc{`A}
\chardef\abc=65
或者 Joseph 的比较建议:
\let\abc=A
\ifcat\noexpand\abc A%
\TRUE
\else
\FALSE
\fi
答案2
这对我有用,使用\expandafter
:
\def\abc{A}
The catcode for \abc\ is \the\catcode\expandafter`\abc.
和印刷品
A 的类别代码为 11。
答案3
作为优秀的TeX 按主题分类在讨论中给了我们一个线索\ifcat
:
控制序列标记被认为具有类别代码 16,这使得它们彼此相等,并且与所有字符标记不相等。
\ifcat
此“魔法”类别代码无法通过常规方法访问。但是,如果您有隐式标记,则一切正常:
\let\ABC=A
\ifcat\noexpand\ABC A%
\TRUE
\else
\FALSE
\fi
虽然您这里不需要\noexpand
,但如果这是其中的一部分,\futurelet
那么您就会这样做,以防测试令牌是可扩展的。
答案4
\chardef\abc=65
The catcode for \abc\ is \the\catcode\abc