使用 unicode-math 修复数学间距

使用 unicode-math 修复数学间距

我正在使用 lhs2TeX 将代码转换为 LaTeX。它将代码排版为数学模式。由于我也在同一个文档中编写数学公式,因此我使用 unicode-math 在不同的数学模式字体之间切换,以使两者更加明显(并且在我的数学中使用 Unicode 符号)。

lhs2TeX 使用宏设置变量标识符\Varid,通常设置为\mathit

这里的问题是,使用 unicode-math 时,\mathit无法正常工作。我不确定这是 unicode-math 的问题还是 OpenType 数学字体的问题,但最重要的是它没有将其参数排版为文本,而是像公式一样,字母之间有额外的间距。我还发现了一个关于此的错误报告

我可以\Varid用重新定义\textit,但这会导致另一个问题:我的标识符中有很多下标,而下划线在文本模式下不支持下标,所以这行不通。至少在我不用自定义 TeX 覆盖每个标识符来修复下标的情况下行不通。

这是一个演示该问题的例子。

\documentclass{minimal}

\usepackage{fontspec}
\setmainfont{TeX Gyre Pagella}

\usepackage{unicode-math}
\setmathfont[version=lm]{Latin Modern Math}
\setmathfont[version=pg]{TeX Gyre Pagella Math}


\begin{document}

\mathversion{lm}
% math in latin modern
    $x ∼ y$

\mathversion{pg}
% haskell code in tex gyre pagella

    \textit{factorial}

    $\mathit{factorial}$ \quad This should look like the former, not the latter.

    $factorial$

\mathversion{lm}
% latin modern again
    $x ∼ y$

\end{document}

输出的屏幕截图
(来源:戈德德兹信息

所以问题是:在这个设置下可以修复 mathit 吗?如果不能,我可以编写一个在数学模式下工作但选择正确字体的宏吗?或者我可以编写一个宏,在文本模式下本地重新定义下划线以执行下标吗?

编辑:这里的一个主要问题(不幸的是,这不是我的例子的一部分)是里面的 TeX 代码\Varid(可以重新定义)通常是自动生成的,并且通常包含_下标(否则必须为每个标识符手动重写,我尽量避免这种情况)。因此使用\textInstead 是有问题的。

编辑:事实上,这并不完全正确,因为像 这样的内容x1会被翻译成,当定义为 这样的内容\Varid{x}_1时,它就可以工作\Varid

\newfontfamily\haskvarfont{TeX Gyre Pagella}
\renewcommand{\Varid}[1]{\text{\haskvarfont\emph{#1}}}

答案1

这是错误决策的后果unicode-math:他们将\mathit正常的数学字母命名为斜体,而不是遵守 LaTeX 惯例将其称为\mathnormal\mathit应该选择文本斜体字体,以便进行unicode-math直接替换。

我不会期望在unicode-math加载或未加载时会有不同的输出;但是这个简单的例子显示了这个错误:

\documentclass{article}
%\usepackage{unicode-math}

\begin{document}

$\mathit{different}$

$different$

\end{document}

unicode-math如果注释掉这一行,我们得到

在此处输入图片描述

如果我取消注释该行,我会得到

在此处输入图片描述

确实错误的。

解决方法:

定义一个新的数学字母表:

\documentclass{article}
\usepackage{unicode-math}

\DeclareMathAlphabet{\Lmathit}{\encodingdefault}{\familydefault}{m}{it}

\begin{document}

$\Lmathit{different}$

$different$

\end{document}

如果你使用lhs2TeX,你可以添加

\renewcommand{\Conid}[1]{\Lmathit{#1}}
\renewcommand{\Varid}[1]{\Lmathit{#1}}

加载后。

这不应该引发错误;如果引发错误,则将你在和Too many math alphabets之间找到的代码添加到\makeatletter\makeatotherhttps://tex.stackexchange.com/a/100428/4427

答案2

\documentclass{article}
\usepackage{unicode-math}
\begin{document}

$\mathit{different}$

$\symit{different}$

$different$

\end{document}

在此处输入图片描述

相关内容