使用 Unicode-math(LuaTeX 后端)输入素数的正确方法是什么

使用 Unicode-math(LuaTeX 后端)输入素数的正确方法是什么

我在 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 数学中,这个问题的处理方式略有不同,但有些字体仍然遵循旧的做法)。

相关内容