unicode-math 和 mathspec 有什么区别?

unicode-math 和 mathspec 有什么区别?

tufte-book我目前正在使用课程和 XeLaTeX排版古典电动力学的讲义。

这是我第一次使用 XeLaTeX,因此我偶然发现了这两个包unicode-mathmathspec,其中包含一个 OpenType 数学字体(这里是 TeX Gyre Pagelle Math)。

我浏览了一下这两个包的文档,但无法找出哪个是“更好的做法”。

问题:我应该使用unicode-mathmathspec来处理我的 XeLaTeX 文档吗?

答案1

(请注意,该答案已被修改,以反映评论中提出的问题。)

unicode 数学

和包unicode-mathmathspec目标截然不同。该unicode-math包旨在将数学标记映射到 Unicode 字符,如 Latin Modern Math、STIX、Asana Math 等真正的 OpenType 数学字体所提供的字符。它还允许(尽可能)Unicode输入数学,以及输出,以便您可以在源中输入unicode数学字符,并让TeX正确地将它们解释为数学。

例如,您可以创建以下文档:

% !TEX TS-program = XeLaTeX

\documentclass[12pt]{article}
\usepackage{unicode-math}

\begin{document}

This is some math text entered with math in the source:
\[
∀X [ ∅ ∉ X ⇒ ∃f:X ⟶  ⋃ X\ ∀A ∈ X (f(A) ∈ A ) ]\]

This is some math text entered with regular markup

\[
\forall X [\emptyset \not\in X \Rightarrow \exists f:X \rightarrow  \bigcup X\ 
    \forall A \in X (f(A) \in A ) ]\]
\end{document}

这将产生

unicode-math 的输出

unicode-math软件包与 XeTeX 和 LuaTeX 兼容。

数学规范

mathspec软件包的设计不允许您在源数学输入中使用 Unicode 字符。相反,它允许您在数学中使用开放字体,这样您就可以将数学的文本字体与文档中的文本字体进行匹配。

例如,您可以使用:

% !TEX TS-program = XeLaTeX

\documentclass[12pt]{article}
\usepackage{mathspec}
\setmainfont{Linux Libertine O}
\setmathfont(Digits,Latin)[Scale=MatchLowercase]{Linux Libertine O}


\begin{document}
This is some text in Libertine \emph{X(f(A))}
\[
\forall X [\emptyset \not\in X \Rightarrow \exists f:X \rightarrow  \bigcup X\ 
    \forall A \in X (f(A) \in A ) ]\]
\end{document}

其结果为:

mathspec 输出

mathspec包只能与 XeTeX 一起使用;不能与 LuaTeX 一起使用。

你应该使用哪一个

如果您想使用其中一种可用的 OpenType 数学字体,那么使用unicode-math是有意义的。

如果您想将非数学字体与数学字体匹配,那么这mathspec可能会有所帮助,但由于 TeX 不会在不同字体的字符之间应用字距调整,因此使用mathspec有其缺点,因为您可能会发现从文本字体切换到数学字体会产生不好的间距,如给出的示例所示。

答案2

mathspec是一个巧妙的尝试,使得可以在 XeLaTeX 文档中使用数学,并使用标准数学字体的字母和符号的系统字体。

基本上,人们unicode-math只能使用专门定制的 OpenType 数学字体,例如 Latin Modern Math、TeX Gyre Termes Math、TeX Gyre Pagella Math、XITS Math、Asana Math(免费的)或 Cambria Math 和 Lucida Bright Math(非免费的)。

mathspec

使用此包,您可以对主系统字体进行有限的数学运算。只是一个愚蠢的例子:

\documentclass{article}
\usepackage{mathspec}
\setmainfont[Ligatures=TeX]{Old Standard}
\setmathsfont(Digits,Latin,Greek){Old Standard}
\begin{document}
Some text and a formula $a+b=\int_{\xi}^{\theta} f(x)\,dx$.
\end{document}

在此处输入图片描述

模拟的数学还不错,并且该软件包具有手动纠正可能的错误间距的功能,这种情况的发生是因为字体实际上不支持数学。例如,输入公式为

$a+b=\int_{\xi}^{\theta} "f(x)\,dx$

效果会更好

在此处输入图片描述

意思"是“在后面的字母两边增加一些空格”。

数字、拉丁字母和希腊字母可以取自不同的字体。

unicode-math

与 XeLaTeX 和 LuaLaTeX兼容unicode-math。以下是与 Lucida Bright 相同的示例:

\documentclass{article}
\usepackage{unicode-math}
\setmainfont[Ligatures=TeX,Scale=0.85]{Lucida Bright OT}
\setmathfont[Scale=0.85]{Lucida Bright Math OT}
\begin{document}
Some text and a formula $a+b=\int_{\xi}^{\theta} f(x)\,dx$.
\end{document}

在此处输入图片描述

间距无需手动干预即可正确,因为用于数学的字体是真实的数学字体。以下是与 TeX Gyre Pagella 相同的内容:

\documentclass{article}
\usepackage{unicode-math}
\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}
\setmathfont{TeX Gyre Pagella Math}
\begin{document}
Some text and a formula $a+b=\int_{\xi}^{\theta} f(x)\,dx$.
\end{document}

在此处输入图片描述

Unicode 输入

用 Unicode 符号输入数学,但这不是强制性的。用mathspec和都可以unicode-math。例如,用 的积分mathspec可以输入为

$∫_ξ^θ "f(x)\,dx$

前提是环境知晓,例如

\usepackage{newunicodechar}
\newunicodechar{∫}{\int}

一些符号(特别是字母)是已知的。

输入积分不需要特别注意

$∫_ξ^θ f(x)\,dx$

但是unicode-math,包可以理解传统的语法。

答案3

unicode-math主要关注于促进使用 Unicode 数学字体,即 LaTeX 中的 OpenType 数学字体。而 则mathspec允许在没有匹配的数学字体的情况下从文本字体中获取数学字母。

Unicode 定义了大量的数学符号,许多字体都包含这些符号,但正确的数学排版需要许多字体参数来辅助排版引擎,而这些参数必须由字体提供。传统上,TeX 字体会在 TFM 文件的字体维度中提供所需的参数,这意味着非 TFM 字体不能用于在 XeTeX(以及后来的 LuaTeX)中排版数学。当微软开始在 Word 中添加类似 TeX 的数学排版时,他们使用特殊的MATH表扩展了 OpenType 以保存数学排版所需的参数,XeTeX 实现了它(以及后来的 LuaTeX)并unicode-math编写为使用新字体提供宏支持。因此,unicode-math您可以使用适当的 OpenType 数学字体(如 TeX Gyre Pagelle Math)进行正确的数学排版,但您只能使用这些特别准备的字体。

相关内容