XeTeX 是一个 TeX 引擎,直接读取 UTF-8 并使用系统上已安装的字体。如果没有 TFM 或映射文件设置,您只需通过 fontspec 包命名字体,OpenType 字体就可以工作。它是由 Jonathan Kew 编写的,您通常将其调用为 xelatex。
XeTeX 是什么
在经典的 TeX 和 pdfTeX 中,使用字体意味着准备 TFM(TeX 字体指标) 尺寸文件,并通过 .map 文件将其映射到真实字体 - 一种繁琐的舞蹈。 XeTeX 消除了这个繁琐的工作:它允许您命名操作系统知道的任何字体(OpenType / TrueType 和 macOS 上的 AAT)并直接使用它。默认情况下,输入被解释为 UTF-8,因此您可以将日语、希腊语或重音字母写为文字字符。
Jonathan Kew 最初是为 SIL International 编写的,围绕当时的 Mac 排版技术 AAT(Apple Advanced Typography) 构建; 第一个版本于 2004 年 4 月发布,仅适用于 Mac OS X,后来它成为在 Windows 和 Linux 上运行的跨平台引擎。它内部包含 e-TeX 扩展集,因此现代 LaTeX 假定的设施都存在。
名字中的 Xe 是 TeX 最后的 X(希腊语 χ)翻转的结果,是“TeX 的反面”的双关语。在英语中,它被非正式地读作“zee-tech”或“zi-tech”,尽管发音有所不同。
一个最小的例子
这是使用 xelatex 编译的最小文档。它加载 fontspec 并使用 \setmainfont 设置正文字体,将字体命名为系统所知。 Latin Modern 或 TeX Gyre 等捆绑字体无需额外安装即可使用,但 OS 字体(如 Hiragino Mincho ProN)的命名方式完全相同。
\documentclass{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}
\begin{document}
Hello, \XeTeX! こんにちは、世界。
\[ E = mc^2 \]
\end{document}关键是你不要加载inputenc或fontenc。 UTF-8 输入和 Unicode 字体是基线,因此 pdfLaTeX 所需的字符编码咒语会消失。您使用单个 xelatex document.tex 进行编译(如果有交叉引用,则编译两次)。
字体 — fontspec 是明星
在实践中,您可以通过fontspec 包获得 XeTeX 的字体功能。您可以如下设置正文、无衬线字体和等宽字体,还可以为特定目的启动新的字体系列。
\usepackage{fontspec}
\setmainfont{TeX Gyre Pagella}
\setsansfont{TeX Gyre Heros}
\setmonofont{TeX Gyre Cursor}
\newfontfamily\headingfont{TeX Gyre Adventor}fontspec 还公开了烘焙到字体中的 OpenType 功能。通过其选项,您可以切换历史连字、小型大写字母或老式数字等。字体不具备的功能根本没有任何效果。
\setmainfont{TeX Gyre Pagella}[
Ligatures = {Common, Historic},
Numbers = OldStyle,
SmallCapsFeatures = {Letters = SmallCaps},
]
% 生の OpenType / Graphite タグを直接指定:
\newfontfamily\swashfont{EB Garamond}[RawFeature = {+swsh}]为了更好地控制,有一些选项,例如 Renderer(选择 HarfBuzz / AAT / Graphite 整形器)和 RawFeature(直接传递字体的原始特征标签)。为了在文档中切换输入编码,引擎提供了内置的 \XeTeXinputencoding。当您需要 Unicode 数学字体(STIX 两个数学、拉丁现代数学等)时,您可以将 XeTeX 与 unicode-math 包配对。
管道 — XDV 到 PDF
其中pdfTeX直接写入PDF,XeTeX分两个阶段工作。引擎首先发出一个中间 XDV(扩展 DVI;XeTeX 设备独立) 文件,然后捆绑的 xdvipdfmx 驱动程序将其转换为 PDF。从您的角度来看,一次运行 xelatex 即可完成所有操作,但在内部,这两个阶段按顺序运行(从版本 0.997 开始,xdvipdfmx 已成为所有平台上的默认驱动程序)。
此设计对于 \special、依赖于驱动程序的选项和图形包含很重要。因为 xdvipdfmx 是实际生成 PDF 的东西,所以当像 graphicx 这样的包需要显式驱动程序时,您将其指向 xetex(即 xdvipdfmx)。大多数软件包都会自动检测 XeTeX,因此您很少需要考虑它。
调试时,请记住这个两级管道。即使您输入了 xelatex,图像、字体嵌入或 PDF 书签方面的失败通常也会在日志中以 xdvipdfmx 消息结束。通过将第一个 TeX 错误行与最终驱动程序行分开来读取 .log;它可以快速告诉您问题是 TeX 语法还是驱动程序无法处理图形或字体。
多语言和复杂的脚本
XeTeX 如此广泛使用的原因之一是它从右到左 (RTL) 和复杂脚本的优势。现代 XeTeX 使用 HarfBuzz 形状字形(在 2013 年的 0.9999 版本中采用,取代了旧的 ICU LayoutEngine),因此它可以正确设置阿拉伯语连接和丰富的连字脚本。
要切换语言,您可以使用 XeTeX / LuaTeX 时代的 polyglossia 包(经典 babel 的替代品)。 RTL 排版由 bidi 包处理,当您请求阿拉伯语、希伯来语等时,polyglossia 会自动加载 bidi。中文、韩语和日语 (CJK) 均使用 xeCJK 进行处理 - 尽管对于日语来说,许多人仍然更喜欢 LuaTeX-ja (luatexja) 或 upLaTeX 进行垂直书写和日语排版的更精细规则。
XeTeX 与 LuaTeX
XeTeX 和 LuaTeX 共享相同的现代基础 - Unicode 输入加上系统字体 - 但它们具有不同的气质。 XeTeX 更简单、快速:它适合“我只想将 OS 字体与 Unicode 一起使用”,并且多年的使用使其稳定且成熟。相比之下,LuaTeX 在排版引擎中嵌入了 Lua 语言,让您可以通过低级挂钩对其行为进行详细编程。
另一方面是 XeTeX 无法运行 Lua 并且具有较少的低级钩子。新字体技术和排版机械的开发往往聚集在LuaTeX一边。作为粗略的分工:XeTeX 用于轻松和稳定,LuaTeX 用于可编程性和长寿。
| 方面 | XeTeX | LuaTeX |
|---|---|---|
Unicode 入力 | 是(默认为 UTF-8) | 是(默认为 UTF-8) |
システムフォント | 直接通过 fontspec | 直接通过 fontspec |
シェーピング | HarfBuzz / AAT / 石墨 | HarfBuzz (luaotfload) |
PDF 化 | XDV → xdvipdfmx(两个阶段) | 直接输出 |
スクリプト言語 | 没有任何 | 嵌入式 Lua |
性格 | 简单、稳定、成熟 | 可编程、不断发展 |
何时到达 XeTeX
- 使用系统上已有的字体。 命名一个 OpenType / TrueType 字体即可完成。
- 按字面意思写 Unicode。 UTF-8 为默认输入;无需编码设置。
- 设置多语言/RTL 文本。 polyglossia + bidi 使其更适合阿拉伯语、希伯来语等。
- 快速可靠地开始工作。 配置很少,并且具有长期、稳定的跟踪记录。
- 如果您需要 Lua 级别的定制,请考虑 LuaTeX,或者考虑 upLaTeX / luatexja 进行精确的日语排版。
更安全的字体选择工作流程
XeLaTeX 失败通常来自两个地方之一:字体名称对 OS 不可见,或者日语排版期望超出 xeCJK 的处理范围。首先使用捆绑字体(例如 Latin Modern 或 TeX Gyre)编译最小文档,然后一次替换一种字体。如果您需要日语竖写、精细避尾行为或出版商提供的日语课程,请尽早测试 upLaTeX 或 LuaLaTeX + LuaTeX-ja。
- 对于
font not found错误,在 TeX 本身之前怀疑 OS 字体名称解析。 - 对于仅 PDF 提交,请始终检查字体嵌入。
- 为了协作,不要假设每个 OS 都有相同的字体;考虑捆绑字体,例如 TeX Gyre。