将 fontdimen 参数提供给 TeX

将 fontdimen 参数提供给 TeX

我决定使用\fontdimen参数作为数组数字(用于存储有关 Unicode 字符属性的数据)。现在的问题是以最有效的方式填写这些\fontdimen参数。我更喜欢适用于 pdfTeX、XeTeX 和 LuaTeX 的方法。

最有效的方法是加载一个定义字体的tfm文件,其中包含许多参数。文件格式以两个字节开始,以有符号整数的形式声明其大小(以字为单位,= 32 位)(请参阅或unicodedata.tfm\fontdimentfmtexdoc tftopl一份旧的 TUGBoat 报纸\fontdimen),因此通过文件声明的最大参数数量tfm32738(由于一些标头信息,略小于 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

相关内容