编辑

编辑

[请注意,我使用 LuaTeX 进行所有编译。]

考虑以下 MWE,它使用unicode-mathversion键为数学设置了多个版本。

\documentclass{article}
\usepackage[math-style=TeX]{unicode-math}
\setmathfont{Latin Modern Math}
\setmathfont{Latin Modern Math}[version=lm]% sanity check
\setmathfont{Asana Math}[version=asana]
\setmathfont{TeX Gyre Schola Math}[version=tgs]
\setmathfont{Tex Gyre Termes Math}[version=tgt]
% \setmathfont{Tex Gyre Schola Math}[version=tgs, range=it]
% \setmathfont{Tex Gyre Termes Math}[version=tgt]
\newcommand*\testmaths{%
\begin{equation}
  \int_{t = 0}^{x^2} t dt
\end{equation}
\[
  \sin^2{\theta} + \cos^2{\theta} = 1
\]
}
\begin{document}
Latin Modern Math (\verb|normal|):
\testmaths

\mathversion{asana}
Asana Math (\verb|asana|):
\testmaths

\mathversion{tgt}
TeX Gyre Termes Math (\verb|tgt|):
\testmaths

\mathversion{normal}
Latin Modern Math (\verb|normal|):
\testmaths

{%
  \mathversion{tgs}
  TeX Gyre Schola Math (\verb|tgs|):
  \testmaths
}

Latin Modern Math (\verb|normal|):
\testmaths

\mathversion{lm}
Latin Modern Math (\verb|lm|):
\testmaths
\end{document}

这很好用。

预期输出

但是,此代码不能与 结合使用range。虽然 的效果range是将指定的字体限制在给定的范围内,但其使用并不限于指定的version。相反,所有version都会受到影响。

% \setmathfont{TeX Gyre Schola Math}[version=tgs]
\setmathfont{Tex Gyre Termes Math}[version=tgt]
\setmathfont{Tex Gyre Schola Math}[version=tgs, range=it]
% \setmathfont{Tex Gyre Termes Math}[version=tgt]

所有版本均受影响

或者,改变顺序,指定版本中的指定范围最终只会产生空结果。

% \setmathfont{TeX Gyre Schola Math}[version=tgs]
% \setmathfont{Tex Gyre Termes Math}[version=tgt]
\setmathfont{Tex Gyre Schola Math}[version=tgs, range=it]
\setmathfont{Tex Gyre Termes Math}[version=tgt]

空虚

这是为什么?可以纠正吗?

编辑

当然,上述示例确实不完整,因为它们没有为替代数学版本定义足够的内容。为此,需要进行额外的配置以确保为替代数学版本设置所有范围。但是,除非对给定版本的所有范围使用单一字体,否则无法做到这一点。这与标准情况完全不同,在标准情况下,您必须使用多种字体才能确保完全覆盖。

这是一个使用 Arev 各种字体的非 LuaTeX 示例。这些命令大多来自。请注意,这些宏本质上都是为新版本arevmath.sty设置相关的。(即使在这里,事情也并不完整:有符号和数学字母需要担心。但希望基本思想是清楚的。)rangesansserif

\documentclass{article}
\usepackage{lmodern}
\DeclareMathVersion{sansserif}
% modified from arev - node that a complete set up would need additional stuff
\SetSymbolFont{operators}    {sansserif}{OT1}{zavm}{m}{n}
\SetSymbolFont{letters}      {sansserif}{OML}{zavm}{m}{it}
\SetSymbolFont{symbols}      {sansserif}{OMS}{zavm}{m}{n}
\SetSymbolFont{largesymbols} {sansserif}{OMX}{mdbch}{m}{n}
\SetMathAlphabet{\mathnormal}{sansserif}{OML}{zavm}{m}{it}
\SetMathAlphabet{\mathit}    {sansserif}{OML}{zavm}{m}{it}
\SetMathAlphabet{\mathrm}    {sansserif}{OT1}{zavm}{m}{n}
\SetMathAlphabet{\mathsf}    {sansserif}{OML}{zavm}{m}{it}
\SetMathAlphabet{\mathbf}    {sansserif}{OT1}{zavm}{b}{n}
\SetMathAlphabet{\mathtt}    {sansserif}{T1} {fvm} {m}{n}
\newcommand*\testmaths{%
\begin{equation}
  \int_{t = 0}^{x^2} t dt
\end{equation}
\[
  \sin^2{\theta} + \cos^2{\theta} = 1
\]
}
\begin{document}
Latin Modern Math (\verb|normal|):
\testmaths

\mathversion{sansserif}
Arev (\verb|sansserif|):
\testmaths

\mathversion{normal}
Latin Modern Math (\verb|normal|):
\testmaths
\end{document}

非 Unicode 大小写

问题是,unicode-math如果你想letters从一种数学字体和operators另一种数学字体中获取信息,该如何做等效的事情。

答案1

我认为这个问题的答案是“否”。目前它不起作用。unicode-math通过定义新的数学系列来实现范围选项,然后将符号指向该系列。代码不是“版本感知的”。

\documentclass{article}
\usepackage[math-style=TeX]{unicode-math}

\begin{document}
$ a $
[class: \Umathcharclass`\a]
[family: \Umathcharfam`\a]
[slot: \Umathcharslot`\a]


\setmathfont{Tex Gyre Schola Math}[range="61]

$ a $
[class: \Umathcharclass`\a]
[family: \Umathcharfam`\a]
[slot: \Umathcharslot`\a]

\setmathfont{Tex Gyre Termes Math}[range="61]

$ a $
[class: \Umathcharclass`\a]
[family: \Umathcharfam`\a]
[slot: \Umathcharslot`\a]

\end{document}

改变这一点非常困难——不仅在技术方面,而且在“逻辑”方面也是如此。unicode-math 必须存储一长串符号,如果数学版本发生变化,这些符号必须重新映射到其他字体,或者重新映射数学字体,并且在这两种情况下,它都必须注意不同数学版本中不同的范围块——这对维护者来说是一场噩梦。

虽然我确实理解人们喜欢更改(或添加)数学字体中的字形,但我认为range应谨慎使用该选项,并且不是用于大规模字体操作。我认为,复杂设置的未来不在于更多的 unicode-math 代码,而在于 luaotfload 的“组合”字体功能。

相关内容