如何访问序言中的数学字体的 \fontdimen 参数?

如何访问序言中的数学字体的 \fontdimen 参数?

我想用\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值之间的关系。)

相关内容