LuaTeX 与 unicode-math,如何获取当前数学字体的字体 id

LuaTeX 与 unicode-math,如何获取当前数学字体的字体 id

如何查询当前数学字体的信息?

我在使用 unicode-math 和 Cambria Math 字体的文档中尝试了以下内容

\documentclass{article}
\usepackage{unicode-math}
\setmathfont{Cambria Math}

\begin{document}
Try to get math font name inside math mode.
\[
  \directlua{
    local font = fonts.identifiers[font.current()]
    local fullname = font.fullname
    tex.sprint(fullname)
  }
\]
\end{document}

但是,它是在数学字体中打印的周围文本字体的字体名称,如下图所示。 在此处输入图片描述

font.current()即使代码处于数学模式中,它似乎也会返回当前文本字体 ID 而不是数学字体。

接下来,我序列化了fonts.identifiers表并获取了数学字体的 ID。在此示例中,我font.current()用一个明确的数字替换了28它,上面的代码正确打印了数学字体名称,如下所示。 在此处输入图片描述

所以我猜想数学字体在fonts.identifiers表中确实有一个 ID。但我如何自动获取此 ID?

答案1

TeX 中没有“当前数学字体”的概念,LuaTeX 和 XeTeX 也是如此。符号使用公式末尾指定的字体排版,使用数学家族

但是,可以通过以\setmathfont一种稍微棘手的方式将所选的数学字体设为当前文本字体来访问:

\documentclass{article}
\usepackage{unicode-math}
\setmathfont{XITS Math}
\begin{document}
\sbox0{$$}\the\textfont2

\directlua{
  local font = fonts.identifiers[font.current()]
  local fullname = font.fullname
  tex.sprint(fullname)
}

\end{document}

这将打印“XITS Math-2”。这是因为\the\textfont2生成一个字体标识符,使系列 2 中的字体成为当前文本字体。在传统 TeX 中,\textfont2是用于文本大小中最常见符号的字体;unicode 数学将其用于所有已知符号,但出于技术原因,它还必须保留它的副本\textfont3,因此后缀为“2”。

之所以\sbox0{$$}需要,是因为 LaTeX 实际上直到排版公式时才将字体分配给数学系列。也可以这样说

\makeatletter\check@mathfonts\makeatother

因为\check@mathfonts是根据当前上下文将字体分配给系列的命令。

我猜想其他 Lua 工具也可以用来访问内部表中的字体编号。

相关内容