unicode-math 上标不对齐(使用 XeLaTeX)

unicode-math 上标不对齐(使用 XeLaTeX)

标题说的差不多,这让我很烦。我使用这个unicode-math包是因为我喜欢它提供的直立粗体希腊字母,因为我用它们来表示矢量符号,但我注意到了这个奇怪的问题。PS:我使用的是 XeLaTeX。

梅威瑟:

\documentclass{article}

\usepackage{unicode-math}

\begin{document}
    \[ \sin^{2}x+\cos^{2}x=1 \]
\end{document}

PS 2:这是我从全屏截图工具中获取的 Windows 标尺。

下标似乎受到的影响较小。

编辑:正如 Ulrike Fischer 指出的那样,我还必须修复其他三角宏,因此我复制粘贴了他的其他运算符的代码(全部基于宏的间距\cos)。

我会在下面留下代码,以便遇到同样问题的人不必担心。

\makeatletter
\def\sin{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font sin}}}
\def\sinh{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font sinh}}}
\def\cosh{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font cosh}}}
\def\tan{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font tan}}}
\def\tanh{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font tanh}}}
\def\cot{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font cot}}}
\def\coth{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font coth}}}
\def\sec{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font sec}}}
\def\csc{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font csc}}}
\makeatother

编辑2:我最近在使用 Ulrike Fischer 的解决方案时遇到了一些问题,即在使用带有修改后的宏hyperref\texofpdfstring命令时。我发现一个可行的解决方案是使用以下代码重新定义上述宏

\let\cmd\relax\DeclareMathOperator{\cmd}{definition}

而不仅仅是使用\def\cmd

和以前一样,我将提供其他宏的代码:

\makeatletter
\let\sin\relax\DeclareMathOperator{\sin}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font sin}}}
\let\sinh\relax\DeclareMathOperator{\sinh}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font sinh}}}
\let\cosh\relax\DeclareMathOperator{\cosh}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font cosh}}}
\let\tan\relax\DeclareMathOperator{\tan}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font tan}}}
\let\tanh\relax\DeclareMathOperator{\tanh}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font tanh}}}
\let\cot\relax\DeclareMathOperator{\cot}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font cot}}}
\let\coth\relax\DeclareMathOperator{\coth}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font coth}}}
\let\sec\relax\DeclareMathOperator{\sec}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font sec}}}
\let\csc\relax\DeclareMathOperator{\csc}{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font csc}}}
\makeatother

答案1

正如 wipet 指出的那样,放置位置取决于操作员的身高。您可以看到类似的效果(但很多不太明显)如果使用足够大的字母,也可以使用经典 tex:

\documentclass{article}

\usepackage{amsmath}
\usepackage{tikz}

\def\sin{\qopname\relax o{SIN}}
\begin{document}
    \[\tikz[overlay]\draw[red](0,4.4pt)--++(5,0); \sin^{2}x+\cos^{2}x=1 \]
\end{document}

在此处输入图片描述

这基本上意味着这些运算符的 amsopn 定义假设高度差异并不重要——这一假设在 unicode-math 的背景下不再成立。

例如,您可以像这样校正高度。可以看出,其他操作员也需要进行此类校正:

\documentclass{article}

\usepackage{unicode-math}
\usepackage{amsmath}
\usepackage{tikz}
\makeatletter
\def\sin{\qopname\relax o{\vphantom{\operator@font cos}\smash{\operator@font sin}}}
\begin{document}
    \[\tikz[overlay]\draw[red](0,4.4pt)--++(5,0); \cot^2 \tanh^2 \sin^{2}x+\cos^{2}x=1 \]
\end{document}

在此处输入图片描述

答案2

我尝试了 LuaTeX,没有尝试 XeTeX,但问题类似。

从Unicode数学字体中读取的位置参数有很多,它们列在LuaTeX手册的104-108页,指数的垂直位置主要由两个参数控制:

  • \Umathsupshiftup最小程度向上移动。(10pt 排版,拉丁现代数学,显示样式,值:3.63pt)

  • \Umathsupshiftdrop指数的底部向上移动到原子核的高度减去此值(10pt 排版,拉丁现代数学,显示样式,值:2.5pt)

假设我们在核中有“cos”,指数中有“2”。首先,“2”向上移动至“cos”的高度,然后向下移动\Umathsupshiftdrop。如果从基线到该“2”底部的距离小于,\Umathsupshiftup则忘记之前的计算并将“2”从基线向上移动到\Umathsupshiftup。当“cos”在核中时,第二种情况成立。但如果“sin”在核中,则第一种情况成立,因为“i”高于“cos”。我们可以设置

\Umathsupshiftdrop\displaystyle=3pt

那么第二种情况对于“sin”和“cos”都是正确的,并且指数将处于相同的高度。

这里提到的参数是从 Unicode 数学字体表 (MathConstants) 中读取的,因此“sin”和“cos”中指数的不同位置可以被视为 Latin Modern 字体的错误(或功能?)。

我不知道为什么 XeTeX 在定位方面比 LuaTeX 差异大。在 XeTeX 中\Umathsupshiftdrop表示为\fontdimen24。你可以用这个做实验。

相关内容