如何检查某些 \catcode 是否处于 \active 状态?

如何检查某些 \catcode 是否处于 \active 状态?

我将把 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,这是用于定义控制序列以表示字体更改的原语。如果您使用\fontTeX 期望字体切换命令的位置,它将指向当前字体。

因此,如果您想查询当前字体中 A 的宽度,可以使用

\fontcharwd\font`A

答案2

\ifnum\catcode`\|=\active
yes
\else
no
\fi

\active只是数字 13 的缩写)

相关内容