我在使用 XeLaTeX (0.9998) 和 (0.7a) 时遇到了问题unicode-math
。如果我使用\setmathfont
两次以上,则\sqrt
在指定上标时命令会中断。
\documentclass{minmal}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}
\setmathfont[range=\mathup/{num,latin,Latin}]{Linux Libertine O}
\setmathfont[range=\mathup/{greek,Greek}]{Symbola}
\begin{document}
\[ \sqrt[5]{2} \]
\end{document}
如果我排版此代码,XeLaTeX 将产生以下错误
Font \l_tmpb_font has only 8 fontdimen parameters.
如果我删除上标\sqrt
或删除最后一个\setmathfont
命令,文档就会正确编译。我已经用几个 OTF 文件测试了这段代码,它们都产生了相同的结果。(我知道生成的上标位置不正确,但一旦我知道文档可以排版,我就可以解决这个问题。)
我在 GitHub 上针对此问题提交了一个错误因为我相信这是软件包的问题,但是在这样做之前我应该在这里检查一下,如果我发现自己做了一些愚蠢的事情,我会很乐意关闭这个错误。
答案1
跟踪代码,问题在于unicode-math
重新定义\r@@t
,LaTeX 在排版带有索引的根时会使用它。LuaTeX 和 XeTeX 的重新定义不同,因此您只会在 XeTeX 中看到这个问题。在这种情况下,它是
\cs_set_nopar:Npn \r@@t #1 #2 {
\hbox_set:Nn \l_tmpa_box {
\c_math_toggle_token
\m@th
#1
\sqrtsign { #2 }
\c_math_toggle_token
}
\um_mathstyle_scale:Nnn #1 { \kern } {
\fontdimen 63 \l_um_font
}
\box_move_up:nn {
(\box_ht:N \l_tmpa_box - \box_dp:N \l_tmpa_box)
* \number \fontdimen 65 \l_um_font / 100
} {
\box_use:N \rootbox
}
\um_mathstyle_scale:Nnn #1 { \kern } {
\fontdimen 64 \l_um_font
}
\box_use_drop:N \l_tmpa_box
}
这里的关键是\fontdimen
业务:这些是“高数字”字体尺寸,传统 TeX 中没有。因此,这些不是为文本字体定义的:它们仅适用于“正确”的 Unicode 数学字体。因此,只有当您设置一些要从文本字体中获取的符号时,您才会看到错误。
答案2
显然,unicode-math
将最后一个字体集映射到\setmathfont
to \l_um_font
,然后使用它来\r@@t
获取\fontdimen
值。因此,您可以尝试一种解决方法,将其重新映射\l_um_font
到“主”数学字体:
\documentclass{article}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}
\setmathfont[range=\mathbb]{Arial}
\setmathfont[range=\int]{Latin Modern Math}
\begin{document}
\[ \sqrt[5]{2} \mathbb{ABC} \]
\end{document}
我不太清楚unicode-math
在这种情况下应该怎么做,但可能\r@@t
应该使用实际部首符号的字体。(并且它应该理清\r@@t
2098 行的 . 的重新定义,看起来好像它只会在amsmath
未加载时重新定义,但后来它还是会这样做。非常令人困惑 ;-)。)