![fontspec 和 mhchem 之间的奇怪交互](https://linux22.com/image/367588/fontspec%20%E5%92%8C%20mhchem%20%E4%B9%8B%E9%97%B4%E7%9A%84%E5%A5%87%E6%80%AA%E4%BA%A4%E4%BA%92.png)
我使用mhchem
XeTeX 来处理化学公式。大约一年来,我遇到了一些非常奇怪的错误,似乎毫无原因。化学公式中的某些字符,尤其是希腊字母(\alpha
、\delta
等)会消失。这真的很烦人,而且没有办法解决这个错误,所以我最终\delta
用d,\alpha
和A等等。虽然不是最理想的,但我觉得不值得这么麻烦。
今天我花了很长时间尝试做一个最小的工作示例来最终解决这个问题,我发现了问题的原因:与诸如(一个包提供对中文,日文或韩文小部分的支持)fontspec
等链接的包的恶意交互。fontspec
xeCJK
这是 MWE。在这种情况下,没有遇到任何问题。
\documentclass[12pt]{article}
\usepackage{mhchem}
\begin{document}
$\ce{BaCe_{0.8}Y_{0.2}O_{3-\alpha}}$
\end{document}
在这种情况下,α未排版。
\documentclass[12pt]{article}
\usepackage{fontspec}
\usepackage{mhchem}
\begin{document}
$\ce{BaCe_{0.8}Y_{0.2}O_{3-\alpha}}$
\end{document}
这个问题从何而来,又该如何解决?
答案1
回答您修改后的问题
如何防止
fontspec
用不存在的字符替换公式中的数学字符mhchem
(摘自此评论)
- [推荐] 重新进入数学模式
- 全局取消希腊字体映射
例子:
\documentclass{article}
\usepackage{fontspec}
\usepackage[version=4]{mhchem}
\begin{document}
Re-enter the math mode: \par
$\ce{BaCe_{0.8}Y_{0.2}O_{3-$\alpha$}}$
\mhchemoptions{text-greek=default, math-greek=default}
\bigskip
Cancel the Greek font mapping: \par
$\ce{BaCe_{0.8}Y_{0.2}O_{3-\alpha}}$
\end{document}
解决方案的解释及其他
为何
fontspec
与 互动mhchem
?mhchem
加载包chemgreek
,后者提供了一个用于化学的直立希腊字母接口(摘自 的文档副标题chemgreek
)。在 中
chemgreek
,它设置了几个映射,每个映射都对应一个单独的包。正如您可能猜到的,有一个映射对应于fontspec
。chemgreek
然后使用宏\AtBeginDocument
(此时应该已经完成了包加载)在“那些”包中只有一个被加载时自动加载映射。为什么
\alpha
里面mhchem
默认是直立的?根据 的文件
mhchem
,Sec.希腊字符(第 8 页),如果希腊字母不是变量,则应按照印刷惯例将其排版为直立字体。如果需要斜体希腊字母,则应重新进入数学模式。单行配置起什么作用?
由文档
mhchem
,Sec.希腊字体(第 17-18 页),此配置取消了文本和数学模式下希腊字体的映射。顺便说一句,
mhchem
从当前活动映射中定义别名(称为“mhchem-text”和“mhchem-math”)。因此通过配置取消映射mhchem
比配置更合适chemgreek
。mhchem
综合以上三种解释,可以得出结论,和fontspec
/之间并不存在任何“不相容性”xeCJK
。