在一个项目中,我们使用商业文本字体。该项目不是数学相关的项目,但其中有一些数学。文本字体当然没有直接的数学字体。但 XITS Math 字体(它是标准 LaTeX 的一部分,至少是 TeX Live)似乎足够匹配。
我决定尝试一下,unicode-math
看看能否更接近,方法是将数学字体中的拉丁字母字体更改为斜体文本字体,数字取自直立文本字体。效果出奇地好。
但问题在于:由于我们混合了数学中使用的字体,数学重音的位置并不是特别好。
我准备了一个与我们的设置类似的 MWE,但使用 TeXLive 中已有的文本字体,因此大多数人都应该能够测试它。
\documentclass[a4paper]{article}
\usepackage{amsmath,unicode-math}
\setmathfont[Scale=MatchUppercase]{XITS Math}
\setmathfont[range=\mathup/{num},Numbers=Lining]{Cochineal-Roman}
\setmathfont[range=it/{latin,Latin},Ligatures={NoCommon, NoDiscretionary, NoHistoric, NoRequired, NoContextual}]{Cochineal-Italic}
\setmainfont{Cochineal}[
UprightFont = *-Roman ,
BoldFont= *-Bold ,
ItalicFont = *-Italic,
BoldItalicFont = *-BoldItalic,
Numbers=Lining,
]
\begin{document}
$ p^{\ast}=c\vert \hat{\jmath}\vert ^{1/2}e^{l-\hat{l}} $
\end{document}
导致
我们可以看到帽子放错了位置
如果我们仅使用 XITS Math,我们会得到
这是更加合理的。
所以我的问题是,考虑到重音符号可能是使用top_accent
XITS Math 字体中的数据放置的,我们如何在 Lua 中修补此字体设置,以便我们可以修复需要重音符号的字符上的重音符号位置?我看过一些应该能够做到这一点的代码示例,但当我们缺少这样的字体时,它无法正常工作。
顺便说一句:是的,我也可以在宏观层面上解决这个问题(改编自 egregs 的一个答案):
\usepackage{xparse}
\NewDocumentCommand{\myhat}{ m }{\myinnerhat{#1}}
% we are assuming \myhat is only being used in single chars
\ExplSyntaxOn
\NewDocumentCommand{\myinnerhat}{m}
{
\str_case_x:nnF { \tl_item:nn { #1 } { -1 } }
{
{\jmath}{\skew{5}{\hat}{\jmath}\mkern1mu}
{l}{\skew{5}{\hat}{l}}
}{
\hat{#1}
}
}
\ExplSyntaxOff