为什么要通过 chardef 存储数字?

为什么要通过 chardef 存储数字?

例如,在 plain.tex 和 hyrules.tex (hyplain 包) 中我们发现这样的代码:

\chardef\active=13 \catcode`\~=\active
\chardef\myh@us@catcode=\the\catcode`\_
...
\catcode`\_=\myh@us@catcode

还有其他方法可以存储数字吗?为什么这种方法比其他方法更可取?

答案1

这个技巧节省了标记并避免了常量终止的问题。

例如,LaTeX 具有\chardef\@ne=1\mathchardef\@M=10000如果\penalty\@M存储的是 而不是

\def\nobreak{\penalty10000 }

(请注意额外的空间,参见如何正确使用主动角色?举个例子来说明这个空间有多重要)。

还要注意,\penalty\@M已经完成,并且 TeX 不会寻找要删除的空格标记,因为\@M它不可扩展。

在你的情况下,这样做是一样的

\edef\myh@us@catcode{\the\catcode`\_ }
...
\catcode`\_=\myh@us@catcode

\def\active{13 }可以替代\chardef\active=13,但使用后者可以避免扩展问题。

但是,您显示的代码的第一行最好是

\chardef\myh@us@catcode=\catcode`\_

因为\the没有任何用处:当 TeX 正在寻找 时<number>,诸如 和类似的原语\catcode都是\lccode允许的,并且将返回该值,而无需将其转换为十进制表示形式的额外步骤。

是的,我是的作者hyplain。:-) 失误。;-)

答案2

传统上,将这样的数字存储为\chardef(或\mathchardef获得更大的范围),例如纯 tex 具有

\chardef\@ne=1
\chardef\tw@=2
\chardef\thr@@=3
\chardef\sixt@@n=16
\chardef\@cclv=255
\mathchardef\@cclvi=256
\mathchardef\@m=1000
\mathchardef\@M=10000
\mathchardef\@MM=20000

这将数字存储为单个标记,因此在空间和时间上比说更高效

\def\@cclv{255 }

一种替代方案是计数寄存器,但在经典 TeX 中每种类型只有 256 个寄存器,因此它们是一种稀缺资源。

相关内容