我想用\fontdimen
标准数学字体的参数进行一些计算来计算适当的长度\scriptstrut
(见我的这个答案)。我更愿意在前导码中执行一次计算,而不是在每次出现时都执行\scriptstrut
。但是,问题是标准数学字体仅在出现第一个数学位时加载,因此类似
\edef\mylength{\the\fontdimen17\textfont2}
在序言中不起作用。可以使用\AtBeginDocument
,但字体仍然未加载。是否有一些“官方”方法可以解决这个问题?
答案1
只有四个主要数学系列具有固定的系列编号:编号 0 为“数学罗马”字体,编号 1 为“数学斜体”,编号 2 为“数学符号”,编号 3 为“数学扩展”。所有其他定义的字母或数学符号字体在首次使用时都会获得一个系列编号(LaTeXspeak 中的数学组编号)。
负责将字体与数学系列关联起来的主要 LaTeX 宏是\check@mathfonts
,任何数学公式都会调用它。对应关系不是固定的,因为字体必须根据当前字体大小而变化。
一旦字体与数学组关联,您就可以访问 fontdimen 参数。因此
\newlength{\mylen}
\makeatletter
\AtBeginDocument{
\check@mathfonts\setlength{\mylen}{\fontdimen17\textfont2}
}
\makeatother
应该这样做。这很重要,\AtBeginDocument
因为许多数学字体包此时都在发挥作用。
如果您要访问的内容不是四个主要系列之一,则“框”方法很方便;必须排版某些内容才能与\mathtt
数学组数字相关联。例如
\sbox0{$\mathtt{\global\mylen=\fontdimen2\textfont\mathgroup}$}
将访问与所关联字体相关的第二个 fontdimen 参数\mathtt
。
答案2
一种方法是在文档开头的一次性框内进行设置
\documentclass{article}
\makeatletter
\AtBeginDocument{
\sbox{\@tempboxa}{%
\ensuremath{\xdef\mylength{\the\fontdimen17\textfont2}}%
}%
}
\makeatother
\begin{document}
\show\mylength
\end{document}
之所以需要这样做,是因为 LaTeX 直到需要时才会加载数学字体(由于 TeX 对数学字母的限制),所以我们必须等到最后一刻才能获取信息,还需要强制数学模式真正加载字体。同时,我们不希望有任何输出,因此使用了一个框。
(siunitx
使用同样的技巧找出\mathsf
/\mathtt
和\fam
值之间的关系。)