我将把 catcode 更改为active
,然后实现我自己的小动词格式:
\if-not-active
\catcode`|=\active
\def|#1|{\foo{#1}}
\fi
我想让它不具侵入性,并首先检查它是否已处于活动状态。如果是,则不做任何更改。我该怎么做?
答案1
您可以访问任意字符的类别代码。
\ifnum\catcode`|=\active
\typeout{BEWARE! The bar is active!}%
\else
\catcode`|=\active
\def|#1|{\foo{#1}}
\fi
TeX 为字符维护几个数组,索引从 0 到 255(或使用 Unicode 引擎时为 0x10FFFF)
\catcode
\lccode
\uccode
\sfcode
\mathcode
\delcode
这些数组中的每个条目都是一个整数,您可以使用
<array name><integer>=<integer>
例如,普通的 TeX 首先分配
\catcode`{=1
\catcode`}=2
以便能够读取宏参数。其他分配都是硬连线的,例如将类别代码 0 分配给反斜杠或将空间因子代码 999 分配给大写字母。
如何表示整数并不重要。例如
\catcode`|=13
\catcode 124=13
\catcode`^^<=`\^^M
相当于
\catcode`|=\active
如果 TeX 在赋值不合理的情况下找到了其中一个数组的名称,它会将其解释为查询槽中的值。因此
\the\catcode`\\
将打印 0。但已经\catcode`|
返回一个整数,可以输入到\ifnum
或放在 TeX 需要整数的任何地方。
有点超载,但这样做是为了让 TeX 尽可能小,并且并不像一开始看起来那么神秘。
另一个重载情况是使用\font
,这是用于定义控制序列以表示字体更改的原语。如果您使用\font
TeX 期望字体切换命令的位置,它将指向当前字体。
因此,如果您想查询当前字体中 A 的宽度,可以使用
\fontcharwd\font`A
答案2
\ifnum\catcode`\|=\active
yes
\else
no
\fi
(\active
只是数字 13 的缩写)