我是 Donald Arsenau 软件包的忠实用户dchem
,该软件包已私下发布很长时间,但他从未觉得它已经足够成熟到可以公开发布(或者,如果这不再是事实,那么公开发布显然在他的优先级列表中还不够高。)
我现在正尝试切换到xelatex/mathspec
。不幸的是,我发现此更改破坏了\ch
dchem 包的主要命令。我私下写信给 D. Arsenau,并在 ctt 上询问,但我也想尝试在这里寻求建议。
我试图将问题降至最低。因此,我提取了一行 dchem.sty,并将其重命名为gchem.sty
:
\newcommand\ch{\fam\z@\everymath{\fam\z@}}
% like \rm but don't have to repeat
此命令通常用于$\ch H_2O$
生成罗马mathrm
字体(更准确地说)的化学公式。
这行属于 dchem.sty 中的一些复杂条件,试图确定有关当前乳胶环境及其的一些信息\everymath
,并且根据条件分支的不同,实现方式略有不同,但我相信这一行是所有版本命令的精髓\ch
。
现在,我使用 Fourier 包编写一个简单的测试文件:
\documentclass{article}
\usepackage{fourier}
\usepackage{gchem}
\begin{document}
$\rm CH_2O$, $\ch CH_2O$
\end{document}
当我使用 pdflatex 处理此包时,用 生成的公式\rm
和用 生成的公式\ch
均按预期出现在 Utopia 中。
然后我修改测试文件以使用xelatex/mathspec
:
\documentclass{article}
\usepackage{mathspec}
\setmainfont{Minion Pro}
\setmathsfont(Digits,Latin,Greek){Minion Pro}
\setmathrm{Minion Pro}
\usepackage{gchem}
\begin{document}
$\rm CH_2O$, $\ch CH_2O$
\end{document}
xelatex
当我用(这是 XeTeX,版本 3.1415926-2.3-0.9997.5(MiKTeX 2.9))处理此文件时,\rm
公式按预期在 Minion Pro 中出现,但\ch
版本在 Computer Modern 中出现,除了下标 2 是 Minion Pro。
我有日志文件,包括启用了跟踪的文件,这些文件显示了\rm
和的行为之间的明显差异\ch
,如果需要,我可以发布或转发它们。
但我认为这些例子已经说明了要点:似乎\fam\z@
dchem 使用的短命令确实会切换到\mathrm
in pdflatex
,但在 中却不会xelatex
。这是预期的吗?如果不是,问题出在哪里?如果是,应该如何\ch
修改命令以兼容xetex
?
答案1
mathspec
不会改变基本数学组 0,但会分配新的数学字母或数学符号字体。应该与直立字符相对应的是用于数字的字体,因此
\makeatletter
\newcommand\ch{\fam\csname sym\eu@DigitsArabic@symfont\endcsname
\everymath{\fam\csname sym\eu@DigitsArabic@symfont\endcsname }}
\makeatother
可能就是您所需要的。
让我们看看会发生什么。在某个时刻,mathspec
声明
\DeclareSymbolFont{Digits:m:n}{EU1}{\eu@Digitsmathsfont}{m}{n}
并被\eu@Digitsmathsfont
翻译成正确的家族名称。这定义了一个新的数学组(在 TeXbook 中称为家族),LaTeX 通过将字符串添加到 来访问它sym
。Digits:m:n
但在我看来,使用 更安全,\eu@DigitsArabic@symfont
无论在什么情况下,它都是正确的字符串,与包加载时给出的选项无关。
所以我们要做的是
\fam\csname sym\eu@DigitsArabic@symfont\endcsname
由于\fam
期望后面有一个数字,它将扩展\csname...\endcsname
;这导致扩展\eu@DigitsArabic@symfont
(在您的情况下为Digits:m:n
)并形成令牌
\symDigits:m:n
这相当于分配给\DeclareSymbolFont
所需数学组的数字。