> 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/yu-yan/01-multilingual-typesetting-on-overleaf-using-polyglossia-and-fontspec.md).

# 在 Overleaf 上使用 polyglossia 和 fontspec 進行多語種排版

## 簡介

本文概述如何在 Overleaf 上使用 XeLaTeX（或 LuaLaTeX）編譯器，並搭配 `fontspec` 和 `polyglossia` LaTeX 套件。

對許多使用者來說，即使不是大多數，TeX 引擎的預設選擇是 `pdfTeX`，它與 XeTeX 和 LuaTeX 不同，沒有內建能力可讀取 [UTF-8](https://en.wikipedia.org/wiki/UTF-8) 編碼文字檔。使用 pdfTeX 會讓在 LaTeX 中排版某些語言變得非常複雜，尤其是那些不使用拉丁字母書寫系統的語言。有些套件——例如 [`inputenc`, `fontenc` 和](/latex/zh-tw/yu-yan/05-arabic.md) [`arabtex`](/latex/zh-tw/yu-yan/05-arabic.md)——可為 pdfTeX 提供排版非拉丁語言與書寫系統的支援，但並非所有字形與字元都能被支援或在輸出 PDF 中正確呈現，即使你已使用了 `utf8` 或 `utf8x` 選項與 `inputenc`.

若想深入討論 UTF-8、Unicode 編碼與 XeTeX/LuaTeX 引擎，Overleaf 文章 [〈Unicode、UTF-8 與多語文字：簡介〉](/latex/zh-tw/shen-ru-wen-zhang/51-unicode-utf-8-and-multilingual-text-an-introduction.md) 是很值得一讀的文章。

## 接著介紹 XeTeX 與 LuaTeX

XeTeX 與 LuaTeX 引擎可以直接讀取/處理 UTF-8 編碼文字；因此，它們原生支援 Unicode——它們也能 [直接處理 TrueType 與 OpenType 字型](/latex/zh-tw/zi-xing/03-xelatex.md) 。這些特性使它們成為在 LaTeX 中排版多語或非拉丁文文件的自然選擇，並產生如下輸出：

![](/files/15432b4c2c7da3f4ecc5c5f412796cf0d3c2df32) ![](/files/41b4818cd50edb77a8272e2219eb870643502084) ![](/files/b67d3590b14ad23cf15e0795438dff4fb4d2cdeb)

這些範例可在 Overleaf Gallery 中找到： [如何在 Overleaf 上用 LaTeX 寫作帶有不同書寫系統的多語文字](https://www.overleaf.com/latex/examples/how-to-write-multilingual-text-with-different-scripts-in-latex/wfdxqhcyyjxz) 和 [多語「感謝」](https://www.overleaf.com/latex/templates/multilingual-thank-you/wjmrnnqkstyf).

如果你想排版中文、日文與韓文，請看看這些文章：

* [中文](/latex/zh-tw/yu-yan/06-chinese.md)
* [日文](/latex/zh-tw/yu-yan/11-japanese.md)
* [韓語](/latex/zh-tw/yu-yan/12-korean.md)

Xe(La)TeX 對這些語言仍然有用，但也有更專門的 TeX 引擎可用，特別是 [專為排版 CJK 語言而設計](/latex/zh-tw/geng-duo-zhu-ti/45-tex-primitives-listed-by-cjk-tex-engine.md)——例如 [pTeX](https://ctan.org/pkg/ptex?lang=en) 用於排版日文。

請注意，如果你在 Overleaf 編輯某些語言的文字時，游標似乎表現異常，你可能需要點擊 Overleaf 的 **選單** 按鈕（位於專案檔案清單上方），並更改「字型家族」選項。你也可以嘗試 [變更瀏覽器的等寬字型偏好](https://www.howtogeek.com/208552/how-to-change-the-default-fonts-in-your-web-browser/) ，或改用 Overleaf 的富文字檢視。不過，截至撰寫時，Source 與 Rich Text 檢視可能尚未在我們希望達成的功能層級上，完整支援由右至左文字編輯。

## 變更專案的編譯器

該 `fontspec` 和 `polyglossia` 套件需要 XeLaTeX 或 LuaLaTeX 編譯器，因此你需要設定你的 Overleaf 專案使用這兩者之一。詳細說明可見於我們的文章 [選擇 LaTeX 編譯器](/latex/zh-tw/geng-duo-zhu-ti/08-choosing-a-latex-compiler.md) ，但這裡有一小段影片示範如何為你的專案設定編譯器：

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/2HDpWlJuNR50hknbpxfQdu/93cdc17ef2c6c77249a1c7c76b34a817/choosingcompiler.mp4>" %}

一旦你使用 XeLaTeX 或 LuaLaTeX 進行編譯，你可以（也應該）移除 `inputenc` 和 `fontenc` 套件從 .tex 檔案的前導區移除，因為這些支援 Unicode 的引擎會假定輸入（文字）檔為 UTF-8 編碼。順帶一提，所有上傳到 Overleaf 的文字檔都會轉換為 UTF-8，因此你通常在 Overleaf 上使用 pdfLaTeX 和 LaTeX 編譯器時，應該使用 `utf8` 與 `inputenc` 。

## 如果你的整份文件只涉及一種語言

使用 `fontspec` 套件時，你也許只需要設定主要（襯線）字型、無襯線字型，以及大概一個為你要排版的語言而設計的等寬字型——但這裡有個例外，我們稍後會在文章中提到。舉例來說，如果你的整份文件是希臘文，並夾雜一些英文單字，你只需寫：

```latex
\usepackage{fontspec}
\setmainfont[Script=Greek]{GFS Artemisia}
\setsansfont[Script=Greek]{GFS Neohellenic}
\setmonofont[Script=Greek]{Noto Mono}
. . .
Το Lorem Ipsum არის \textsf{απλά} ένα κείμενο χωρίς νόημα
για τους επαγγελματίες της \texttt{τυπογραφίας} και στοιχειοθεσίας.
```

你可以從 [可用的 TrueType 與 OpenType 字型清單](https://www.overleaf.com/help/193)。 `Ligatures=TeX` 選項會自動加入於 `\setmainfont` 和 `\setsansfont`，所以你不必自己加上。（`\setromanfont` 是 `\setmainfont`.)

以上 LaTeX 程式碼會產生以下輸出：

![](/files/b1046026cacd19ab62255fa3b81272d1afb14896)

## 同一份文件中使用多種語言／書寫系統：介紹 polyglossia

如果你的文件包含大量以多種語言撰寫的文字， `polyglossia` 套件有助於處理特定語言的排版慣例與斷字。

```latex
\usepackage{fontspec}
\setmainfont{FreeSerif}
\setsansfont{FreeSans}
\setmonofont{FreeMono}

\usepackage{polyglossia}
\setdefaultlanguage{french}
\setotherlanguages{english,russian,thai}

\begin{document}
\begin{abstract}
Le Lorem Ipsum est simplement du faux texte employé dans
la composition et la mise en page avant impression.
\end{abstract}

Merci. \textenglish{Thank you.} \textrussian{Спасибо.} 以及更多
法文文字！

Le Lorem Ipsum est le faux texte standard ...

\begin{english}
Lorem Ipsum is simply dummy text ...
\end{english}

\begin{russian}
Lorem Ipsum - это текст-`\textsf{рыба}', ხშირად используемый в
\texttt{печати} и вэб-дизайне. ...
\end{russian}

\begin{thai}
\XeTeXlinebreaklocale "th_TH"
\textenglish{Lorem Ipsum} คือ เนื้อหาจำลองแบบเรียบๆ ที่ใช้กันในธุรกิจงานพิมพ์หรืองานเรียงพิมพ์
\end{thai}
```

![](/files/66af9bdff9b24543d12d23462f36834a5aaa3534)

`polyglossia` 可讓你用 `\setdefaultlanguage` （預設為英文）以及（可能多個）「其他」語言，使用 `\setotherlanguages`. (`\setmainlanguage` 是 `\setdefaultlanguage`。）如果你只預期會使用另一種外語，可以使用單數形式的 `\setotherlanguage`。語言名稱與 `babel`.

我們已準備了一個小範例，內容主要為法文，但也包含一些英文、俄文與泰文文字。我們決定使用 FreeSerif、FreeSans 與 FreeMono 這三種字型。

由於文件的主要語言是 `french`，而 `abstract` 環境會自動產生標題「Résumé」。請注意，在第一段結尾處，驚嘆號是依照法語排版慣例來排版：它與「français」分開，儘管在原始碼中它緊接在 `français` 之後。

在主要文字中，短的英文、西里爾字母與泰文片段可以用 `\textenglish{Thank you}`, `\textrussian{Спасибо}` 和 `\textthai{ขอบคุณ}`。一般而言，你可以使用 `\textLANGUAGE{...}` 來排版任何已由 `LANGUAGE` 宣告的 `\setdefaultlanguage` 和 `\setotherlanguages`。由於文件的主要（襯線）字型是 FreeSerif，而 FreeSerif 包含拉丁、西里爾與泰文（以及更多！）書寫系統的字形， `fontspec` 和 `polyglossia` 它可以用來將所有這些文字渲染到輸出 PDF 中。

對於較長的外語／其他語言段落，建議使用 `\begin{LANGUAGE}`...`\end{LANGUAGE}`，例如 `\begin{russian}`...`\end{russian}`, `\begin{thai}`...`\end{thai}`。至於阿拉伯文，你不能使用 `\begin{arabic}`...`\end{arabic}`；你必須改寫成 `\begin{Arabic}`...`\end{Arabic}` ，而 `\textarabic{...}` 仍然有效。

某些語言可能需要額外考量：例如，在 `thai` 環境中，單字 `Lorem Ipsum` 需要包在 `\textenglish{...}` （或 `\textfrench{...}`）命令中，以確保它們以拉丁字母字形呈現。

此時你可能會問：如果 FreeSerif 這麼萬能，而且本來就包含俄文與泰文字形，那為什麼我們還需要使用 `\textrussian`, `\begin{english}`...`\end{english}` 等等？那不是多餘嗎？讓我們看看當我們移除 `\begin{english}`...`\end{english}` 和 `\begin{russian}`...`\end{russian}` 環境時會發生什麼：

![](/files/f340a37633c5b5bb1354a7d453821d67edd25546)

當然，拉丁與西里爾字形都會顯示在輸出 PDF 中，但請注意，有些單字現在被錯誤斷字了：‘unk-nown’ 和 ‘unchan-ged’——而 стандартной 完全沒有被斷字。若沒有這些語言切換環境，編譯器會認為這些文字項目仍然屬於法語，並嘗試以法語慣例排版。編譯器會試圖套用法語斷字規則，當然就會產生錯誤結果。這就是為什麼排版與字型排印遠不只是字型設計與選擇：它們是非常依賴語言與文化的領域。

回顧我們最初的希臘文範例，現在就能看出為什麼載入 `polyglossia` 並使用 `\setdefaultlanguage{greek}`是個好主意：以確保文件依照希臘慣例排版。

## 混合由右至左（RTL）與由左至右（LTR）語言

在同一份文件中排版右至左（RTL）書寫系統（如阿拉伯文或希伯來文）與左至右（LTR）書寫系統的混合內容時，你需要小心。以下是一個小型阿拉伯文文件，包含一個英文單字，並以 Amiri 作為主要字型：

```latex
\usepackage{polyglossia}
\setdefaultlanguage{arabic}
\setmainfont{Amiri}
\begin{document}
ما هو differentiation
\end{document}
```

其輸出如下：

![](/files/fd63d7357fe5511b9276850f186e80c5de380196)

文字會自動以由右至左方式排版，從頁面右邊緣開始。單字「differentiation」本身確實被正確排成由左至右的文字——但等等， *並沒有*！它在輸出中被呈現成「dffirentiation」！這是怎麼回事？

Amiri 字型確實有拉丁字母的字形，但在這裡文字 `differentiation` 沒有被標記為英文：編譯器把 `differentiation` 視為由右至左文字，就像是一串阿拉伯字元。在排版過程中，原本的字串 `iff` 會被處理成 `ffi` （也就是以 RTL 文字）並排版出 Amiri 的 [連字](https://en.wikipedia.org/wiki/Typographic_ligature) 「ffi」字形。用 `\textenglish{...}` 標記該單字可確保它被正確解讀為由左至右的文字。

```latex
\setmainfont{Amiri}
\setotherlanguage{english}
\newfontfamily\englishfont{TeX Gyre Termes}
\begin{document}
ما هو \textenglish{differentiation}
```

![](/files/7e0a8545aa5c106da19c2089aefb030186d08256)

**注意：** 如果你習慣使用 `babel` 套件命令，你會很高興得知這些命令 `\selectlanguage`, `\foreignlanguage` 以及環境 `otherlanguage` 也受到 `polyglossia`.

## 語言專屬選項

有些語言支援額外的自訂選項；例如， `greek` 接受 `variant=ancient`, `mono` 或 `poly` 選項，可用於古典、單音或多音希臘文； `hindi` 可設定為 `numerals=western` 或 `devanagari`。詳情請參閱 [polyglossia 套件說明文件](http://texdoc.net/pkg/polyglossia) 。

這些可以在載入語言時指定：

```latex
\setdefaultlanguage[variant=poly]{greek}
\setotherlanguage[numerals=western]{hindi}
```

或之後任何時間：

```latex
\setkeys{greek}{variant=ancient}
```

或者甚至只在特定環境中局部指定：

```latex
\begin{greek}[variant=ancient]
...
\end{greek}
```

## 為特定語言指定字型

你可以指定不同語言所使用的字型。假設你想把所有英文文字（包含在我們前一個範例中的文字）都排成斜體；你可以寫：

```latex
\newfontfamily\englishfont{FreeSerif Italic}
```

![](/files/f89865604e73cf24d808ed6022baca6d08841c69)

當然，你也可以使用更華麗的字型：

```latex
\newfontfamily\englishfont{Chancery Uralic}
```

![](/files/e47fcf3c91c5c32fcc4dbd0ae0ffd091d2bb5708)

為不同語言或書寫系統設定字型的這種機制尤其重要，當你使用一個 *不會* 具有文件中所有書寫系統或語言字形的主要字型時。假設我們現在決定使用 Caladea 作為文件的主要字型：

```latex
\setmainfont{Caladea}
```

編譯後我們會看到以下錯誤：

```
Package polyglossia Error: 目前的 roman 字型
不包含西里爾字母書寫系統！

(polyglossia)                請定義
\cyrillicfont 並使用 \newfontfamily。

請參閱 polyglossia 套件說明文件以獲得
說明。
輸入 H <return> 以取得即時說明。
 ...

l.15 \select@language {russian}

Package polyglossia Error: 目前的 roman 字型
不包含泰文書寫系統！

(polyglossia)                請定義
\thaifont 並使用 \newfontfamily。

請參閱 polyglossia 套件說明文件以獲得
說明。
輸入 H <return> 以取得即時說明。
 ...

l.23 \select@language {thai}
...
```

現在我們有義務指定西里爾與泰文書寫系統要使用哪些字型。再次地，你可以參考 [可用的 TrueType 與 OpenType 字型清單](https://www.overleaf.com/help/193) 在 Overleaf 上。

```latex
\newfontfamily\cyrillicfont[Script=Cyrillic]{Charis SIL}
\newfontfamily\thaifont[Script=Thai]{Garuda}
```

![](/files/d7e48a908ef791f32e5647594bcb93eacc6afe51)

**注意**：本文無法處理與美觀且在排版上相容的字型組合選擇相關的議題。

請注意，我們已定義 `\cyrillicfont` 而不是 `\russianfont`，也就是說，我們定義的是西里爾字母的 *書寫系統* 而不是俄文 *語言*。定義 `\cyrillicfont` 的優點是，例如， `serbian` 也是你專案中已定義的語言，那麼 `\textserbian` 就會自動使用已定義的 `\cyrillicfont`. 如果你只定義了 `\russianfont`，那麼使用 `\textserbian` 時就會再次抱怨「目前的 roman 字型不包含西里爾字母書寫系統」，而你仍然需要定義 `\cyrillicfont` —— *除非* 你們 *本來就是* 想為塞爾維亞文字使用不同的字型！

另一個類似的情況是天城文 *書寫系統*，它用於印地文與梵文的 *語言*；或是阿拉伯字母書寫系統，用於阿拉伯文與波斯文（法爾西語）。

```latex
\setdefaultlanguage{english}
\setotherlanguages{hindi,sanskrit}
\newfontfamily\devanagarifont[Script=Devanagari]{Lohit Devanagari}
...
Hindi: \texthindi{हिन्दी}
Sanskrit: \textsanskrit{संस्कृतम्}
```

![](/files/0422c31080547e79c6dd1ecb3bb1bca5c4518070)

使用 `\newfontfamily` 時，必須指定 `Script`，否則某些字形可能會被錯誤渲染；例如，如果我們只寫了 `\newfontfamily\thaifont{Garuda}` 排版結果可能會錯誤（下方左圖）——加入 `[Script=Thai]`.

錯誤： ![](/files/8f8b97c81a6f09f677b1c1d4b5ca747eed6af5f1) 正確： ![](/files/777c854cc7aa15bbf11fc9c75f37508b5a43de58)

## 定義其他字型家族

讓我們看另一個範例，這次是希伯來文：

```latex
\documentclass{article}
\usepackage{polyglossia}
\setdefaultlanguage[numerals=hebrew]{hebrew}
\setotherlanguage{english}
\newfontfamily\hebrewfont[Script=Hebrew]{Hadasim CLM}
\begin{document}
\section{מבוא}
זוהי עובדה מבוססת שדעתו של הקורא תהיה מוסחת עלידי טקטס קריא כאשר הוא יביט בפריסתו.  -
\end{document}
```

![](/files/af98671f2a65b93c79a7f0d5e830983ae2902f94)

到目前為止都還不錯。現在假設我們使用的是一個原本為英文文件建立的範本，而該範本使用 `titlesec` 套件的範例程式碼：

```latex
\RequirePackage{titlesec}
\titleformat{\section}{\Large\sffamily\bfseries}{\thesection}{1em}{}
\usepackage{polyglossia}
\setdefaultlanguage[numerals=hebrew]{hebrew}
...
```

我們遇到了錯誤訊息：

```
Package polyglossia Error: 目前的 roman 字型
不包含希伯來字母書寫系統！

(polyglossia)                請定義
\hebrewfont 並使用 \newfontfamily。

請參閱 polyglossia 套件說明文件以獲得
說明。
輸入 H <return> 以取得即時說明。
 ...

l.27 \section{מבוא}
```

這有點令人困惑：我們不是已經把 `\hebrewfont` 定義為 Hadasim CLM 了嗎？嗯，真正的原因是我們 *尚未為希伯來文指定無襯線字型*。讓我們透過加入 `\hebrewfontsf`:

```latex
\newfontfamily\hebrewfontsf[Script=Hebrew]{Miriam CLM}
```

，來補救這一點

![](/files/cfd36d5558b344577e1d4a02c02fb7a57b1ca581)

若有需要，我們也可以定義一個與 `\hebrewfonttt`.

## 致謝

所有不同語言的 lorem ipsum 片段皆來自 [`https://lipsum.com`](https://lipsum.com).


---

# 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/yu-yan/01-multilingual-typesetting-on-overleaf-using-polyglossia-and-fontspec.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.
