在我看来这看起来像是一个unicode-math
错误,但也许这里的专家可以证实这一点。
我目前正在使用 Libertinus 数学字体系列和 luatex 撰写我的博士论文。对于化学方程式,我使用软件包mhchem
。
问题是,在align
环境中,我无法获得数学模式中的任何字符,即斜体(即使在用 $ ... $ 包围所需字符后明确地哄骗它)。这是一个最小的例子。
%! TEX program = lualatex
\documentclass[varwidth=true, border=10pt, convert={size=640x}]{standalone}
\usepackage[version=4,arrows=pgf]{mhchem}
\usepackage{unicode-math}
\setmathfont{Libertinus Math} % doesn't matter. All unicode math font behaves the same way
%\setmathfont{texgyrepagella-math.otf} % doesn't matter. All unicode math font behaves the same way
\begin{document}
\begin{center}
\ce{A_x <=> B + y C} \\
\end{center}
\begin{align}
\ce{A_x &<=> B + y C} \\
\ce{X + Y &-> Z}
\end{align}
\begin{align}
\ce{A_$x$ &<=> B + $y$ C} \\
\ce{X + Y &-> Z}
\end{align}
\end{document}
在第一个方程中,我得到了正确的行为,即x
和y
都正确斜体化。但在接下来的两个方程中,我无法得到这种期望的行为。特别是在第三个方程中,即使在用 $..$ 包围x
和之后y
,它仍然将它们排版为直立,如下所示
如果我注释掉与使用 unicode 数学相关的行,如下所示
%! TEX program = lualatex
\documentclass[varwidth=true, border=10pt, convert={size=640x}]{standalone}
\usepackage[version=4,arrows=pgf]{mhchem}
% \usepackage{unicode-math}
% \setmathfont{Libertinus Math} % doesn't matter. All unicode fonts have this issue
% \setmathfont{texgyrepagella-math.otf} % doesn't matter. All unicode fonts have this issue
并保留其余的源代码,luatex 运行为我提供了所有 3 种情况的正确输出,如下所示
和都以斜体正确排版。我能确认这是一个错误吗x
?y
unicode-math
答案1
mhchem v4.08(2018-06-22)已修复此问题。
答案2
虽然它没有回答为什么这个问题会出现组合的原始问题unicode-math
,mhchem
但我在这里使用替代chemformula
包的答案应该为面临这个(或类似)问题的人提供可行的解决方法。
%! TEX-program = lualatex
\documentclass[varwidth=true, border=10pt, convert={size=640x}]{standalone}
% \usepackage[version=4,arrows=pgf]{mhchem}
\usepackage{chemformula}
\usepackage{unicode-math}
\setmainfont[Numbers={Proportional},Ligatures={TeX, Common%, Historic, Contextual, Rare, Discretionary
}]{Libertinus Serif}
\setmonofont[Scale=0.8]{Libertinus Mono}
\setsansfont{Libertinus Sans}
\begin{document}
\begin{center}
\ch{A_{$x$} <=> B + $y$ C} \\
\end{center}
\begin{align}
\ch{A_{$x$} &<=> B + $y$ C} \\
\ch{X + Y &-> Z}
\end{align}
\end{document}
请注意,mhchem
已被注释掉,我们改用。还请注意,使用时下chemformula
标数学模式需要额外的分组。x
chemformula
无论如何,我们获得了所需的输出,如下所示:
也许一个合理的替代方案是使用chemformula
直到这个问题被解决。(不清楚是谁:unicode-math
团队还是mhchem
开发人员?)。
答案3
问题是,在数学中,mhchem 将所有内容都用 包围起来\mathrm
。这会改变 \Umathcode
。您可以尝试添加钩子 \symit。但如果参数不包含单个字符,则它不起作用(在这种情况下,mhchem 会主动将参数设置为罗马字符,即使没有 unicode-math)。
\documentclass{article}
\usepackage[version=4,arrows=pgf]{mhchem}
\usepackage{unicode-math}
\begin{document}
$\ce{A_{\symit{x}}}$
\makeatletter
\def\mhchem@hook@beforeItalicMath{\symit}
$ \ce{A_x} \ce{A_{xxxx}} $
%not a solution but only to demonstrate that removing the \mathrm avoids the problem:
\def\mhchem@option@mathFont{}%{\mathrm}
${\ce{A_x}}$
\end{document}