> 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-tw/wen-yu-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 安裝中的可免費使用字型。

* **注意**: 本文著重於主流字型技術，但不討論諸如下列這類以 TeX 為基礎的專門解決方案： [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 節）。（編碼）：若需要，此檔案類型會定義 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/38d135b0c7cf58b6d530518a4caf2bc8f6f2f49f)

#### 範例專案說明

* 它使用下列 `\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)。 `\ifLuaTeX` 指令，由 `iftex` 套件的第 3 節用於測試是否為 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-tw/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/d7dffb1c95895f65ff37f954848c4346be8332e6)

和一個 `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-tw/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 字型的進階排版能力提供介面。

* **注意**: 你不需要使用 `\usepackage[T1]{fontenc}` （或 `\usepackage[utf8]{inputenc}`）在 XeLaTeX 或 LuaLaTeX 中使用 OpenType 字型時。

### 範例：介紹 fontspec

流程很簡單，因為不需要安裝字型——不必 `.tfm`, `enc` 或 `.map` 檔，也不必撰寫字型定義（`.fd`）都已成為歷史！就是這麼簡單：

1. 將以下這一行加入文件前言：

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

3. 選取檔案上傳圖示（![UploadIcon.png](/files/2075dd0c85fb9a0117e1063a51727ac5878c7463)），它位於檔案清單上方。
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-tw/zi-xing/03-xelatex.md) 的說明頁包含一個 [詳細範例](/latex/zh-tw/zi-xing/03-xelatex.md#using-fonts-not-installed-on-overleaf27s-servers-google-fonts-example) ，示範如何從 Google 下載 OpenType 字型並搭配 `fontspec`.

**範例專案**

Overleaf Galley 有示範在 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/7a0ea77091b45072283dc429078968f85b29594b)

## 字型與 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 可能相當棘手，這需要應用程式探查／檢視字型的內部資料結構。如需進一步細節，請參閱 [這篇討論串（thread）](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)——一篇說明如何為 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 討論串。

### 關於「字型戰爭」的註記……

1980 年代和 1990 年代見證了所謂的「字型戰爭」，兩種競爭中的字型格式——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-tw/wen-yu-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.
