例如,在 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 个寄存器,因此它们是一种稀缺资源。