> For the complete documentation index, see [llms.txt](https://ayakaleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayakaleaf-pro.ayaka.space/latex/zh-cn/wen-da/58-i-have-a-custom-font-i-d-like-to-load-to-my-document.-how-can-i-do-this.md).

# 我有一种想加载到文档中的自定义字体。我该如何做到这一点？

## 简介

本文介绍如何为文档正文排版安装自定义字体——不涉及用于数学排版的字体。这里所说的“自定义字体”是指 Overleaf 服务器上不可用的字体，包括需要许可证的商业字体，或未随 TeX Live 分发、也未包含在我们的 Linux 安装中的免费字体。

* **注意**：本文介绍主流字体技术，但不讨论诸如 [Metafont](https://en.wikipedia.org/wiki/Metafont) 和 [虚拟字体](https://texfaq.org/FAQ-virtualfonts).

## 我从哪里开始？

基于 LaTeX 的排版方案是在遗留体系的背景下运行的。四十多年来，LaTeX 编译器和字体格式的发展形成了一个由旧技术和新技术混合而成的生态系统。因此，为 LaTeX 安装和配置自定义字体的实际过程取决于这两个因素：

1. 你想安装的任何字体文件的类型（格式）：

* 传统 [PostScript Type 1](https://en.wikipedia.org/wiki/PostScript_fonts#Type_1) 或 [TrueType](https://en.wikipedia.org/wiki/TrueType) 字体，或者
* 现代 [OpenType](https://en.wikipedia.org/wiki/OpenType) 字体。

3. 用于编译你的 Overleaf 项目的 LaTeX 编译器：
   * pdfLaTeX，或者
   * XeLaTeX 或 LuaLaTeX

跳转到你偏好的编译器对应的部分：

* [在 pdfLaTeX 中使用自定义字体](#using-custom-fonts-with-pdflatex)
* [在 XeLaTeX 和 LuaLaTeX 中使用自定义字体](#using-custom-fonts-with-xelatex-and-lualatex)

## 在 pdfLaTeX 中使用自定义字体

下面概述了你需要做的事情——这取决于你的自定义字体设置的复杂程度：

1. 对于每个字体文件（`.ttf`, `.otf` 或 `.pfb`），你需要有（或生成！）合适的 TeX 字体度量文件（`.tfm`），并且可能还需要一个编码文件（`.enc`).
2. pdfLaTeX 必须知道如何将文档字体嵌入最终的 PDF 文件中。为此，它会读取一个字体映射文件（`pdftex.map`），你需要用自定义字体的详细信息来更新它。在 Overleaf 上，你可以使用以下命令之一来做到这一点：

* `\pdfmapfile{...}`
* `\pdfmapline{...}`

4. 你还需要一个字体描述（`.fd`）文件，它告诉 LaTeX 如何使用新的字体文件。

这些是你将需要的主要文件类型：

* **`.tfm`** （TeX 字体度量）：这些紧凑的二进制文件不包含任何描述字符形状视觉外观的数据，只包含字符尺寸和 TeX 引擎可用于执行其核心排版任务的字体“元数据”。数学字体的 TeX 字体度量包含文本字体不需要的额外数据；尤其是它们有多个用于数学排版的“间距”参数。
* **`.fd`** （字体描述）：这些文件包含将你的字体配置并准备好供 LaTeX 使用所需的 LaTeX 命令。允许在 `.fd` 文件中使用的命令，以及 `.fd` 文件命名约定，均在文档 [LaTeX2ε 字体选择](https://texdoc.org/serve/fntguide/1).
* **`.map`** （字体映射）：映射文件将 TeX 字体度量文件的名称与包含用于绘制字符形状（字形）所需数据的物理字体文件关联起来。pdfTeX 已知的每种字体都在映射文件的一行中描述，使用一种明确定义的语法。完整细节请参见 [The pdfTeX user manual](http://mirrors.ctan.org/systems/doc/pdftex/manual/pdftex-a.pdf).
* **`.enc`** （编码）：如果需要，这种文件类型定义了你的 LaTeX 文本中的字符代码与字体文件中对应的字符形状（字形）之间的映射。

### 自定义 TrueType 字体示例

Overleaf Galley 中有一个项目， [演示如何安装自定义 TrueType 字体](https://www.overleaf.com/latex/examples/example-using-a-custom-truetype-font/yndxyzgbhpjv)——PostScript Type 1 字体会使用类似的设置。它可在 pdfLaTeX、XeLaTeX 和 LuaLaTeX 下编译，并生成以下输出：

![显示 Overleaf 使用自定义字体进行排版的图像](/files/8435390007c7066dfab295d306a6775ac086e4de)

#### 示例项目说明

* 它使用了以下 `\pdfmapline` 命令：

```latex
\pdfmapline{+delphine < Delphine.ttf <T1-WGL4.enc}
```

，它把一个名为 `delphine` 的 TeX 字体度量文件链接到名为 `Delphine.ttf`.

* 第一个 `<` 字符指示 pdfTeX 对 TrueType 字体进行子集化；也就是说， *部分* 地将此字体嵌入最终的 PDF 文件。对子集化字体会生成更小的 PDF 文件，因为它们只包含显示文档中出现字符所需的字符形状数据。
* 第二个 `<` 字符位于一个编码向量文件名 `T1-WGL4.enc`之前，该文件用于将文本中的字符代码映射到字体文件中的字符形状数据（字形）——渲染（绘制）字符需要字符形状数据。
* LuaLaTeX 需要额外的配置步骤，因为 `\pdfmapline` 会生成一个 **未定义的控制序列** 错误，这是由于 LuaTeX 处理某些后端命令的方式发生了变化——请参见 [LuaTeX 参考手册](http://mirrors.ctan.org/systems/doc/luatex/luatex.pdf)的第 3 节。 `\ifLuaTeX` 命令由 `iftex` 宏包提供，用于检测 LuaTeX；如果检测到，则定义 `\pdfmapline` ：

```latex
\ifLuaTeX
\protected\def\pdfmapline {\pdfextension mapline }
\fi
```

### 使用多种字体或商业字体

要管理商业字体供应商提供的文件以及可免费使用字体的集合，你可以在 Overleaf 项目中创建文件夹，按字体类型（`.tfm`, `.pfb`, `.ttf` 等）组织字体文件。为文件夹命名和组织的一个良好模型是 [TeX 目录结构（TDS）](https://www.tug.org/tds/tds.pdf)，它被设计为管理一组 TeX 相关文件的最佳实践“蓝图”。

在项目文件夹就位后，接下来你需要创建一个所谓的 [`latexmcrc` 文件](/latex/zh-cn/shen-du-wen-zhang/28-how-to-use-latexmkrc-with-overleaf.md) ，其中包含指示 LaTeX 编译器在这些文件夹中搜索文件的说明。默认情况下，编译器并不知道这些文件夹存在，也不会找到其中的文件。

#### Overleaf 项目示例

Overleaf Gallery 示例 [使用文件夹管理自定义字体文件](https://www.overleaf.com/latex/templates/example-using-folders-to-manage-custom-font-files/qvqgnpjxvqzd) 使用文件夹和一个 `latexmkrc` 文件来安装自定义 TrueType 字体。它包含如下图所示的文件夹结构：

![在 Overleaf 上组织项目文件夹](/files/ebafa31be6aaf118fb98350289569d45340823df)

以及一个 `latexmkrc` 文件，其中包含以下行，用于设置运行时 [环境变量](https://en.wikipedia.org/wiki/Environment_variable) ，告诉 LaTeX 编译器在我们的项目文件夹中查找文件：

```perl
$ENV{'TEXINPUTS'}='myfonts/tex//:' . $ENV{'TEXINPUTS'};
$ENV{'T1FONTS'}='myfonts/fonts/type1//:' . $ENV{'T1FONTS'};
$ENV{'AFMFONTS'}='myfonts/fonts/afm//:' . $ENV{'AFMFONTS'};
$ENV{'TEXFONTMAPS'}='myfonts/fonts/map//:' . $ENV{'TEXFONTMAPS'};
$ENV{'TFMFONTS'}='myfonts/fonts/tfm//:' . $ENV{'TFMFONTS'};
$ENV{'TTFONTS'}='myfonts/fonts/ttf//:' . $ENV{'TTFONTS'};
$ENV{'VFFONTS'}='myfonts/fonts/vf//:' . $ENV{'VFFONTS'};
$ENV{'ENCFONTS'}='myfonts/fonts/enc//:' . $ENV{'ENCFONTS'};
```

如果你想知道通常哪些文件会放进哪个文件夹，请看看 [这篇文章](/latex/zh-cn/shen-du-wen-zhang/06-an-introduction-to-kpathsea-and-how-tex-engines-search-for-files.md#table-listing-kpathsea-config-variables).

## 在 XeLaTeX 和 LuaLaTeX 中使用自定义字体

### 使用 PostScript Type 1 字体

要在 XeLaTeX 和 LuaLaTeX 中使用传统的 PostScript Type 1 字体，你可以遵循 [pdfLaTeX 的指南](#using-custom-fonts-with-pdflatex)，因此这里我们就不重复这些细节了。

### 使用 OpenType 字体

XeLaTeX 和 LuaLaTeX 为使用 OpenType 字体进行高级排版提供了广泛支持——包括 TrueType 和 PostScript 变体——因为它们底层的 TeX 引擎 XeTeX 和 LuaHBTeX 具有处理 OpenType 字体技术的原生（内置）能力，而 pdfTeX 没有。

* **注意**：LuaLaTeX 通过其底层 TeX 引擎（LuaHBTeX）拥有所有 TeX 引擎中最复杂的字体处理能力；不过，讨论这些超出了本文范围——更多信息请参见 [LuaTeX 参考手册](https://ctan.org/pkg/luatex?lang=en).

要在 XeLaTeX 和 LuaLaTeX 中使用 OpenType 字体，你需要加载 [`fontspec`](https://ctan.org/pkg/fontspec?lang=en)，这是一个功能强大且特性丰富的宏包，为 OpenType 字体的高级排版能力提供接口。

* **注意**：在 XeLaTeX 或 LuaLaTeX 中使用 OpenType 字体时，你不需要使用 `\usepackage[T1]{fontenc}` （或 `\usepackage[utf8]{inputenc}`）

### 示例：介绍 fontspec

这个过程很简单，因为不需要安装字体——无需 `.tfm`, `enc` 或 `.map` 文件，编写字体定义（`.fd`）的时代已经成为历史！只需这样做：

1. 将以下行添加到你的文档导言区：

```latex
\usepackage{fontspec}
```

3. 选择文件上传图标（![UploadIcon.png](/files/b873bc48a4c147f9f71d6245052c189d4842df06)），它位于文件列表上方。
4. 将字体拖放到上传对话框中，或从你的电脑中选择它们，把字体添加到你的 Overleaf 项目中。
5. 使用其中一个 `fontspec` 包 `\set*xxx*font` 命令来配置并启用这些字体。

优秀的 `fontspec` 宏包文档提供了大量你可以探索的示例，所以这里我们会保持简单，帮助你入门。例如，假设你上传了一个名为 `CrimsonText-Regular.ttf`的字体文件；在加载 `fontspec` 之后，你可以通过写入以下内容来设置主文档文本字体

```latex
\setmainfont{CrimsonText-Regular.ttf}
```

你也可以写出如下语法：

```latex
\setmainfont{CrimsonText}[
Extension = .ttf,
UprightFont = *-Regular,
...]
```

你还可以声明一个用于任意场合的新字体族：

```latex
\newfontfamily{\crimson}{CrimsonText}
[Extension = .ttf, UprightFont = *-Regular, ...]
{\crimson 这段文本使用 CrimsonText 字体}
```

#### 资源

* 该 [`fontspec` 宏包文档](http://mirrors.ctan.org/macros/unicodetex/latex/fontspec/fontspec.pdf) 是必读内容——它不仅提供了许多有帮助的示例，还包含大量有关 OpenType 字体的有用背景信息。
* Overleaf 关于 [XeLaTeX](/latex/zh-cn/zi-ti/03-xelatex.md) 的帮助页面包含一个 [详细示例](/latex/zh-cn/zi-ti/03-xelatex.md#using-fonts-not-installed-on-overleaf27s-servers-google-fonts-example) ，展示了如何从 Google 下载 OpenType 字体并使用 `fontspec`.

**示例项目**

Overleaf Gallery 有一些示例项目，演示如何在 XeLaTeX 或 LuaLaTeX 中使用 OpenType 字体——你可以打开这些项目，并在 LuaLaTeX 与 XeLaTeX 之间切换编译器：

* [在 XeLaTeX 中使用 Google 字体](https://www.overleaf.com/latex/templates/using-google-fonts-with-xelatex/xxkpcgfttjvd)
* [在 LuaLaTeX 或 XeLaTeX 中使用 STIX2 OpenType 字体](https://www.overleaf.com/latex/templates/using-the-stix2-opentype-fonts-with-lualatex-or-xelatex/hdfvhzqmhnpx)

下一张图将这些项目生成的输出合并在一起：

![使用 Opentype 字体的 Overleaf 示例项目](/files/8baef6a420070ea47c23c5de8c0abe55d73a897b)

## 字体与 LaTeX 编译器基础知识

### 字体文件扩展名

下表列出了用于表示不同类型（格式）字体文件的文件扩展名：

|                                                                                                           |                 |
| --------------------------------------------------------------------------------------------------------- | --------------- |
| **字体类型**                                                                                                  | **扩展名**         |
| [PostScript Type 1](https://en.wikipedia.org/wiki/PostScript_fonts#Type_1)$$\displaystyle{}^{\mathbf\*}$$ | `.pfb`          |
| [TrueType](https://en.wikipedia.org/wiki/TrueType)                                                        | `.ttf`          |
| [TrueType 集合](https://learn.microsoft.com/en-us/typography/opentype/otspec150/otff#truetype-collections)  | `.ttc`          |
| [OpenType](https://learn.microsoft.com/en-us/typography/opentype/)                                        | `.otf` 或 `.ttf` |

$$\displaystyle{}^{\mathbf\*}$$ 2023 年 1 月，Adobe 的所有创作应用程序 [停止支持传统的 Type 1 字体格式](https://helpx.adobe.com/uk/fonts/kb/postscript-type-1-fonts-end-of-support.html).

OpenType 字体有两种“变体”，通常称为“风格”：PostScript 风格和 TrueType 风格，这些名称反映了它们所包含的字符形状（字形）所使用的数据和机制。因此，OpenType 字体有两个文件扩展名： `.otf` 或 `.ttf` ，按照 *惯例*，表示：

* `*filename*.otf` 是 PostScript 风格的 OpenType 字体
* `*filename*.ttf` 是 TrueType 风格的 OpenType 字体

例如，pdfTeX 假定扩展名 `.otf` 表示 PostScript 风格的 OpenType 字体。

* **注意**： `.ttc` 扩展名仅用于 TrueType 字体集合。

### 关于 .ttf 文件扩展名

对于带有 `.ttf` 扩展名的字体文件，它可能是以下两者之一：

* 较旧的（非 OpenType）TrueType 字体，或
* 包含 TrueType 数据以及 OpenType 提供的额外功能的 OpenType 字体。

确定某个给定的 `.ttf` 字体文件是 OpenType 还是纯 TrueType 可能很棘手，需要应用程序探查/调查该字体的内部数据结构。更多细节请参见 [这篇讨论（线程）](https://typedrawers.com/discussion/2945/determine-whether-a-font-file-is-opentype-format-or-truetype-format) 或这篇 [Microsoft 文章](https://learn.microsoft.com/en-us/typography/opentype/#why-is-my-opentype-font-listed-as-a-truetype-font-by-my-application).

### 字体格式与 LaTeX 编译器

下表总结了三种 LaTeX 编译器支持的（主流）字体格式（严格来说，是其底层 TeX 引擎支持的）：

|          |                        |                                                   |                                                       |                                       |
| -------- | ---------------------- | ------------------------------------------------- | ----------------------------------------------------- | ------------------------------------- |
| **编译器**  | **PostScript（Type 1）** | **TrueType（纯**$$\displaystyle{}^{\mathbf†}$$**)** | **OpenType（TrueType）**$$\displaystyle{}^{\mathbf\*}$$ | **OpenType（PostScript）**              |
| pdfLaTeX | 是                      | 是                                                 | 有限$$\displaystyle{}^{\mathbf{\*\*}}$$                 | 有限$$\displaystyle{}^{\mathbf{\*\*}}$$ |
| XeLaTeX  | 是                      | 是                                                 | 是                                                     | 是                                     |
| LuaLaTeX | 是                      | 是                                                 | 是                                                     | 是                                     |

$$\displaystyle{}^{\mathbf†}$$这里所说的“纯”，是指不包含 OpenType 规范定义的附加数据（表）的 TrueType 字体，因此缺少 TrueType 风格 OpenType 字体所具有的更高级排版功能。

$$\displaystyle{}^{\mathbf\*}$$pdfTeX 对 [TrueType 集合](https://learn.microsoft.com/en-us/typography/opentype/otspec150/otff#truetype-collections) （扩展名 `.ttc`）仅提供有限支持——它只会读取集合中包含的第一个字体的数据。

$$\displaystyle{}^{\mathbf{\*\*}}$$pdfTeX 的“有限” OpenType 支持意味着：

* 它不支持 OpenType 字体中包含的高级排版功能；
* 它会对子集化 TrueType 风格的 OpenType 字体，但不会对必须完整嵌入的 PostScript 风格 OpenType 字体进行子集化。不进行字体子集化会生成更大的 PDF 文件，并给商业字体带来许可问题，因为商业字体通常禁止完整嵌入；
* 它每种字体最多只能使用 256 个字符，而单个 OpenType 字体支持数以万计的字符；
* 它需要生成 TeX 字体度量以及其他辅助文件（LaTeX 所需）——这些过程超出了本文范围（参见 [延伸阅读](#further-reading) 以获取这些过程说明的链接）。

## 延伸阅读

* [OpenType 的工作原理](https://simoncozens.github.io/fonts-and-layout/opentype.html) （Simon Cozens 著）。
* [判断字体文件是否为 OpenType 格式或 TrueType 格式](https://typedrawers.com/discussion/2945/determine-whether-a-font-file-is-opentype-format-or-truetype-format)——关于判断某个给定的 `.ttf` 是纯 TrueType 还是 TrueType 风格 OpenType 的难度的讨论。
* [更深入地了解 TrueType 字体和 pdfTeX](https://tug.org/TUGboat/tb30-1/tb94thanh.pdf)——一篇由 [Hàn Thế Thành](https://tug.org/interviews/thanh.html)撰写的 TUGboat 论文， [pdfTeX](https://www.tug.org/applications/pdftex/).
* [TeX 文件的目录结构](https://tug.org/tds/tds.html)，一种用于组织 TeX 相关文件的标准文件夹/目录层次结构。
* [在 LaTeX 中安装和使用 OpenType 字体](https://www.tug.org/TUGboat/tb27-2/tb87owens.pdf)——一篇 TUGboat 论文，解释如何为在 pdfLaTeX 中使用而准备 OpenType 字体。
* [如何使用 otftotfm 将 TrueType 字体与 PdfTeX 结合使用？](https://tex.stackexchange.com/questions/52819/how-do-i-use-truetype-fonts-with-pdftex-using-otftotfm/52902#52902)——一个 tex.stackexchange 讨论串，包含详细示例。

### 关于“字体战争”的说明……

20 世纪 80 和 90 年代，所谓的“字体战争”出现了，两种竞争的字体格式——PostScript Type 1（来自 Adobe）和 TrueType（由 Apple 创建，授权给 Microsoft）——为争夺主导地位而斗争，试图赢得所有用户，尤其是设计师和排版师的青睐。最终， [OpenType 字体格式](https://learn.microsoft.com/en-us/typography/opentype) （于 1997 年）作为一种混合解决方案出现，融合并扩展了 Adobe 和 Apple 的字体技术。OpenType 在原始 TrueType 文件格式的基础上构建，通过包含超过 65,000 个字符形状（字形）的字体，提供高级排版能力和更好的 Unicode 支持。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ayakaleaf-pro.ayaka.space/latex/zh-cn/wen-da/58-i-have-a-custom-font-i-d-like-to-load-to-my-document.-how-can-i-do-this.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
