> For the complete documentation index, see [llms.txt](https://overleaf-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://overleaf-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 认识的每种字体都在映射文件中用一行表示，并使用定义良好的语法。完整细节请参见 [pdfTeX 用户手册](http://mirrors.ctan.org/systems/doc/pdftex/manual/pdftex-a.pdf).
* **`.enc`** 第 5 节。

### 自定义 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
* 之前，该编码向量文件用于将文档中的字符代码映射到字体文件中的字符形状数据（字形）——渲染（绘制）字符需要字符形状数据。 `\pdfmapline` LuaLaTeX 需要额外的配置步骤，因为 **未定义的控制序列** 会产生一个错误，这是由于 LuaTeX 处理某些后端命令的方式发生了变化—— [LuaTeX 参考手册](http://mirrors.ctan.org/systems/doc/luatex/luatex.pdf)。 `\ifLuaTeX` 命令，由 `iftex` 宏包用于测试是否为 LuaTeX；如果检测到， `\pdfmapline` 会被定义：

```latex
\ifLuaTeX
\protected\def\pdfmapline {\pdfextension mapline }
这段文字将使用俄语。这是为了演示西里尔字母在生成的文档中能够正确显示。
```

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

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

在项目文件夹就位后，你接下来需要创建一个所谓的 [`latexmcrc` 文件](/latex/zh-cn/shen-ru-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-ru-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) 或这篇 [微软文章](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)——一篇解释如何为 pdfLaTeX 准备 OpenType 字体的 TUGboat 论文。
* [如何在使用 otftotfm 的情况下用 PdfTeX 使用 TrueType 字体？](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://overleaf-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.
