通读pi.tex
,我发现了使用作为维度数组的技巧\fontdimen
(相当于存储±(2^31-1)sp 之间的整数)。即,
\font\x=cmr10 at 1sp % or whatever font that is not used in the document.
\fontdimen 10000 \x = 1pt
\showthe\fontdimen 10000 \x % => 1pt
\bye
这种存储方法在内存方面非常高效(在 TeXLive 2012 中,pdfTeX 和 XeTeX 很乐意存储少于 3000000 个这样的参数,LuaTeX 会根据需要扩展内存),并且速度非常快(我进行了基准测试,一旦分配了空间,访问和修改速度与通常的 dimen 寄存器一样快)。
我看到的主要缺点是,一旦引入新字体(或者更确切地说,在定义另一种字体之前),就必须声明数组的大小:
\font\x=cmr10 at 1sp
\font\y=cmr10 at 2sp
\fontdimen1000\x=1pt % => error: '\x only has 7 fontdimen parameters'
\bye
使用字体内存来存储大量数据还有其他缺点吗?文档是否经常会达到 […]TeX 字体内存的界限(在这种情况下,我不应该将其用于字体以外的其他用途)?如果没有,我正在考虑将这种技术用于l3regex
,也许还用于 存储一些值表l3fp
。
答案1
这是可以做到的,当然最大的缺点是它们是全局的。加载字体后,您也可以使用其结构的其他部分。这张旧的 TUGBoat 纸Jonathan Fine 讨论了使用此类假字体的连字表来编码状态机。