我决定使用\fontdimen
参数作为数组数字(用于存储有关 Unicode 字符属性的数据)。现在的问题是以最有效的方式填写这些\fontdimen
参数。我更喜欢适用于 pdfTeX、XeTeX 和 LuaTeX 的方法。
最有效的方法是加载一个定义字体的tfm
文件,其中包含许多参数。文件格式以两个字节开始,以有符号整数的形式声明其大小(以字为单位,= 32 位)(请参阅或unicodedata.tfm
\fontdimen
tfm
texdoc tftopl
一份旧的 TUGBoat 报纸\fontdimen
),因此通过文件声明的最大参数数量tfm
为32738
(由于一些标头信息,略小于 2^15)。我需要大约 2^17。
tfm
也许除了向 TeX 提供字体度量之外,还存在其他文件格式?
另一种方法,速度要慢得多,是在 TeX 中执行:
\font\foo=cmr10 at 1sp
\fontdimen 1\foo = 13459847sp
\fontdimen 2\foo = 14839847sp
% ...
\fontdimen 1114111\foo = 10872349sp
这(大概)会比较慢,因为 TeX 必须解析每个维度,并且每个条目在文件中大约占用 10 个字符。从空间上讲,这可以改进并减少到每个条目 4 个字节,但这需要 TeX 做更多的工作来解码。
答案1
如果您希望每次有人编译文档时都将其加载到内存中,那么我认为您要做的就是在转储格式之前加载字体。如您所知,TFM 对参数数量的限制\fontdimen
纯粹是文件格式的限制。
这是我的special
格式。
\font\unicodedata=cmtt6 at 1sp
\count0=0
\loop\ifnum\count0<"20000
\advance\count0 by1
\fontdimen\count0 \unicodedata=\count0 sp\relax
\repeat
\dump
\end
我可以运行¹ pdftex -ini '&plain' special
,它会转储加载了字体规格special.fmt
的文本\unicodedata
。输出将包含以下行
\font\unicodedata=cmtt6 at 0.00002pt
现在,在testspecial.tex
,我有
\def\X#1{%
\message{^^JUnicode data #1=\number\fontdimen#1\unicodedata}%
}
\X{42}
\X{65536}
\X{"20000}
\end
运行pdftex '&special' testspecial
产生²
(./testspecial.tex
Unicode data 42=42
Unicode data 65536=65536
Unicode data "20000=131072 )
¹ 我不确定为什么运行后
pdftex -ini '&plain' special
找不到plain.fmt
。我很确定我以前曾成功使用过它。TeX 按主题分类说使用initex
,但也找不到plain.fmt
,然后尝试initex.fmt
,但仍然失败。
² 我也不确定是什么导致了输出中出现额外的换行符testspecial.tex
。