\sqrt[x]{y} 与 unicode-math 不符

\sqrt[x]{y} 与 unicode-math 不符

我在使用 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将最后一个字体集映射到\setmathfontto \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@@t2098 行的 . 的重新定义,看起来好像它只会在amsmath未加载时重新定义,但后来它还是会这样做。非常令人困惑 ;-)。)

相关内容