tufte-book
我目前正在使用课程和 XeLaTeX排版古典电动力学的讲义。
这是我第一次使用 XeLaTeX,因此我偶然发现了这两个包unicode-math
和mathspec
,其中包含一个 OpenType 数学字体(这里是 TeX Gyre Pagelle Math)。
我浏览了一下这两个包的文档,但无法找出哪个是“更好的做法”。
问题:我应该使用unicode-math
或mathspec
来处理我的 XeLaTeX 文档吗?
答案1
(请注意,该答案已被修改,以反映评论中提出的问题。)
unicode 数学
和包unicode-math
的mathspec
目标截然不同。该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
软件包与 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
包只能与 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)进行正确的数学排版,但您只能使用这些特别准备的字体。