标题说的差不多,这让我很烦。我使用这个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
。你可以用这个做实验。