我在 Unicode-math 的 github 存储库中提出了一个关于此问题的问题。但是,我不确定这实际上是一个错误,还是我做错了什么。
这是一个简单的例子,
\documentclass{article}
\usepackage{unicode-math}
\setmathfont[version=Asana] {Asana Math}
\setmathfont[version=Cambria] {Cambria Math}
\setmathfont[version=LatinModern]{Latin Modern Math}
\setmathfont[version=Minion] {Minion Math}
\setmathfont[version=XITS] {XITS Math}
\def\testprime{f'x'f''''x''''\quad f\prime x\prime f\qprime x\qprime}
\setlength{\parindent}{0pt}
\begin{document}
\fontsize{36}{36}\selectfont
Asana \mathversion{Asana} \[ \testprime \]
Cambria \mathversion{Cambria} \[ \testprime \]
LatinModern \mathversion{LatinModern} \[ \testprime \]
Minion \mathversion{Minion} \[ \testprime \]
XITS \mathversion{XITS} \[ \testprime \]
\end{document}
似乎 ASCII 输入被转换成了上标,而\prime
“etc”却没有。
使用 Asana Math,ASCII 版本看起来不错,而\prime
版本看起来很糟糕。看起来 Asana Math 中的素数被设计为普通字形,需要将它们提升为上标才能正常工作。
对于拉丁现代数学,两种情况看起来都很糟糕。我认为这是 LM 大小写的字体问题。
对于其他三种字体,\prime
使用 ASCII 输入时看起来不错,但看起来很糟糕。在这些字体中,素数似乎被设计成上标字形,并且将它们进一步提升看起来并不好看。
有没有什么方法可以修改 ASCII 输入的行为?
此外,对于拉丁现代数学,''''
或都\qprime
不起作用,它们都不产生任何结果。我以为''''
应该使用负 kern 来伪造\qprime
不可用的 。
更新: 感谢@KhaledHosny 和@LeoLiu 的回答。现在似乎更复杂了。使用旧的 TeX 方式排版素数,当素数和下标都出现时,位置会正确。但是,为了符合 Unicode 标准,我认为字体应该将素数设计为上标字形,这意味着当它们在上标位置时看起来会很糟糕。现在我的临时解决方案是使用\prime
等。并在素数和下标之间添加负字距。
更新
感谢@LeoLiu 的回答,之前对我来说效果很好。这里只是对 的新版本的更新unicode-math
。主要变化是unicode-math
的内部宏的前缀现在是 ,__um
而不是um
。
\ExplSyntaxOn
\group_begin:
\char_set_catcode_active:N \'
\char_set_catcode_active:N \`
\char_set_catcode_active:n {"2032}
\char_set_catcode_active:n {"2033}
\char_set_catcode_active:n {"2034}
\char_set_catcode_active:n {"2057}
\char_set_catcode_active:n {"2035}
\char_set_catcode_active:n {"2036}
\char_set_catcode_active:n {"2037}
\cs_gset:Nn \__um_define_prime_chars: {
\cs_set_eq:NN ' \__um_scan_prime:
\cs_set_eq:NN ^^^^2032 \__um_scan_prime:
\cs_set_eq:NN ^^^^2033 \__um_scan_dprime:
\cs_set_eq:NN ^^^^2034 \__um_scan_trprime:
\cs_set_eq:NN ^^^^2057 \__um_scan_qprime:
\cs_set_eq:NN ` \__um_scan_backprime:
\cs_set_eq:NN ^^^^2035 \__um_scan_backprime:
\cs_set_eq:NN ^^^^2036 \__um_scan_backdprime:
\cs_set_eq:NN ^^^^2037 \__um_scan_backtrprime:
}
\group_end:
\ExplSyntaxOff
此外,似乎CambriaMath
和 的较新版本unicode-math
一起不再需要此修复。尽管 仍然需要MinionMath
。
答案1
在传统的 TeX 字体中,\prime
是一个像 Latin Modern Math 或 Asana Math 中那样的大字形。然而,Unicode 中没有这样的字符。符号 U+2032 被用作素数,但在 TeX 中看起来像$^\prime$
ie $'$
。这就带来了问题。
作为 Unicode 数学字体,Cambria/Minion/XITS 是正确的。然后\prime
命令应该不可用。这似乎是一个错误。我认为的维护者无能为力unicode-math
。Asana Math 和 Latin Modern Math 字体可能会被修改以符合 Unicode 标准;然后unicode-math
可以产生一致的结果。
Unicode 中的定义: http://www.unicode.org/charts/PDF/U2000.pdf
Cambria Math 的临时修复:
\documentclass{article}
\usepackage{unicode-math}
\setmathfont{Cambria Math}
\ExplSyntaxOn
\group_begin:
\char_set_catcode_active:N \'
\char_set_catcode_active:N \`
\char_set_catcode_active:n {"2032}
\char_set_catcode_active:n {"2033}
\char_set_catcode_active:n {"2034}
\char_set_catcode_active:n {"2057}
\char_set_catcode_active:n {"2035}
\char_set_catcode_active:n {"2036}
\char_set_catcode_active:n {"2037}
\cs_gset:Nn \um_define_prime_chars: {
\cs_set_eq:NN ' \um_scan_prime:
\cs_set_eq:NN ^^^^2032 \um_scan_prime:
\cs_set_eq:NN ^^^^2033 \um_scan_dprime:
\cs_set_eq:NN ^^^^2034 \um_scan_trprime:
\cs_set_eq:NN ^^^^2057 \um_scan_qprime:
\cs_set_eq:NN ` \um_scan_backprime:
\cs_set_eq:NN ^^^^2035 \um_scan_backprime:
\cs_set_eq:NN ^^^^2036 \um_scan_backdprime:
\cs_set_eq:NN ^^^^2037 \um_scan_backtrprime:
}
\group_end:
\ExplSyntaxOff
\begin{document}
$A' A'' A''' A''''$
\end{document}
答案2
您可以使用f'
或f^\prime
,这是输入素数的正确方法,即使不使用 也是如此unicode-math
。有些字体会给出上标素数 ,但\prime
您不应该依赖这一点。请参阅为什么 \prime 没有自动设置为上标?因为旧的 TeX 字体有这么大的素数字形(在 OpenType 数学中,这个问题的处理方式略有不同,但有些字体仍然遵循旧的做法)。