> 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/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-cn/yu-yan/05-arabic.md) [`arabtex`](/latex/zh-cn/yu-yan/05-arabic.md)——为 pdfTeX 提供了排版非拉丁语言和文字系统的支持，但即使你使用了 `utf8` 或 `utf8x` 选项与 `inputenc`.

如果想深入了解 UTF-8、Unicode 编码以及 XeTeX/LuaTeX 引擎，Overleaf 文章 [Unicode、UTF-8 和多语言文本：简介](/latex/zh-cn/shen-du-wen-zhang/51-unicode-utf-8-and-multilingual-text-an-introduction.md) 很值得一读。

## 接下来是 XeTeX 和 LuaTeX

XeTeX 和 LuaTeX 引擎可以直接读取/处理 UTF-8 编码文本；因此，它们原生支持 Unicode——它们还可以 [直接使用 TrueType 和 OpenType 字体](/latex/zh-cn/zi-ti/03-xelatex.md) 。这些特性使它们成为在 LaTeX 中排版多语言或非拉丁文档的自然选择，能够生成如下输出：

![](/files/7e08b10b45c7290e2ec5826900ad71f53ed8e1ec) ![](/files/20fbb2012d4e840fef4aca913e83ec0bf522fd3c) ![](/files/890b8197222820db543cd9449591789959ad5bea)

这些示例可在 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-cn/yu-yan/06-chinese.md)
* [日语](/latex/zh-cn/yu-yan/11-japanese.md)
* [韩语](/latex/zh-cn/yu-yan/12-korean.md)

Xe(La)TeX 对这些语言仍然有用，但还有更专业的 TeX 引擎，专门 [用于排版 CJK 语言设计的](/latex/zh-cn/geng-duo-zhu-ti/45-tex-primitives-listed-by-cjk-tex-engine.md)——例如 [pTeX](https://ctan.org/pkg/ptex?lang=en) 用于排版日语的

请注意，如果你在 Overleaf 中编辑某些语言的文本时，光标似乎表现异常，你可以点击 Overleaf 的 **菜单** 按钮（位于项目文件列表上方），并更改“Font Family”选项。你也可以尝试 [更改浏览器的等宽字体偏好设置](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-cn/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，因此你通常应当在 `utf8` 与 `inputenc` 在 Overleaf 上使用 pdfLaTeX 和 LaTeX 编译器时使用

## 如果你的整个文档只涉及一种语言

在使用 `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/828e5b57577c0a3e164e514c8ed0d9f428e6ef6d)

## 同一文档中的多种语言/文字系统：介绍 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{Спасибо.} Et plus de
texte en français!

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/5a33636f958a8bffbc56459e663b5f373c87d6e4)

`polyglossia` 可让你通过以下命令设置文档的主语言： `\setdefaultlanguage` （默认是英语），以及（可能多个）“其他”语言，通过 `\setotherlanguages`. (`\setmainlanguage` 是……的别名 `\setdefaultlanguage`。）如果你预计只会使用另一种外语，可以使用单数形式 `\setotherlanguage`。语言名称与……所使用的名称相同 `babel`.

我们准备了一个（主要为）法语文档的小示例，其中还包含一些英语、俄语和泰语文本。我们决定使用 FreeSerif、FreeSans 和 FreeMono 字体。

因为文档的主语言是 `法语`， `摘要` 环境会自动生成标题“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{...}` 仍然有效。

某些语言可能需要一些额外考虑：例如，在 `泰语` 环境中，单词 `Lorem Ipsum` 需要包裹在 `\textenglish{...}` （或者 `\textfrench{...}`）命令中，以确保它们使用拉丁文字字形进行渲染。

这时你可能会问：如果 FreeSerif 如此通用，且本来就包含俄语和泰语的字形，为什么我们还需要使用 `\textrussian`, `\begin{english}`...`\end{english}` 等等？这不是多余吗？让我们看看当我们移除 `\begin{english}`...`\end{english}` 和 `\begin{russian}`...`\end{russian}` 这些环境时会发生什么：

![](/files/1dfa595cd654a49cb089fe3376bce95c3a73b683)

当然，拉丁和西里尔字形都已经渲染在输出 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/ac76228074d69a051f69cc6d9fcc723bee5aeea4)

文本会自动按从右到左排版，从页面右边缘开始。单词“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/7fc9c9477f697eef3f7a825ff46d9fbc8503e5d5)

**注意：** 如果你已经习惯 `babel` 宏包命令，那么听到以下这些命令你一定会很高兴： `\selectlanguage`, `\foreignlanguage` 以及环境 `otherlanguage` 同样也受……支持 `polyglossia`.

## 语言特定选项

某些语言支持额外的自定义选项；例如， `希腊语` 接受一个 `variant=ancient`, `单音调` 或 `多音调` 选项，用于古希腊语、单音希腊语或多音希腊语； `印地语` 可以通过 `numerals=western` 或 `天城文`。请参见 [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/438b4880660d8a9ed6ed40c3154d89b1d27ab5c2)

当然，你也可以使用更为华丽的字体：

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

![](/files/3d030cecc996c9dea2887deab49451e23b83e7ab)

为不同语言或文字系统设置字体的这种机制尤其重要，尤其是在你使用的主字体 *不会* 包含文档中所有文字系统或语言的字形时。假设我们现在决定使用 Caladea 作为文档主字体：

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

编译时，我们会看到以下错误：

```
polyglossia 宏包错误：当前罗马字体
不包含西里尔文字系统！

(polyglossia)                请定义
\cyrillicfont with \newfontfamily.

请参阅 polyglossia 宏包文档以获取
说明。
输入 H <回车> 可立即获得帮助。
 ...

l.15 \select@language {russian}

polyglossia 宏包错误：当前罗马字体
不包含泰文文字系统！

(polyglossia)                请定义
\thaifont with \newfontfamily.

请参阅 polyglossia 宏包文档以获取
说明。
输入 H <回车> 可立即获得帮助。
 ...

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/35a88a935361c85f464854edbbff31f0abb17cca)

**注意**：关于如何选择美观且在排版上兼容的字体组合，超出了本文的讨论范围。

注意，我们定义了 `\cyrillicfont` 而不是 `\russianfont`，也就是说，我们为西里尔 *文字系统* 而不是为俄语 *语言*。定义 `\cyrillicfont` 的好处在于，例如 `塞尔维亚语` 也是项目中已定义的语言，那么 `\textserbian` 将会自动使用已定义的 `\cyrillicfont`。如果你只定义了 `\russianfont`，那么使用 `\textserbian` 又会再次报错“当前罗马字体不包含西里尔文字系统”，而你仍然需要定义 `\cyrillicfont` 无论如何都要定义 *除非* 你 *确实* 想为塞尔维亚文本使用另一种字体！

另一个类似场景是天城文 *文字系统*，它用于印地语和梵语 *语言*；或者用于阿拉伯语和波斯语（Farsi） 的阿拉伯文字系统。

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

![](/files/9772cf81ea70c3720d7ccb2a6dd0ca8cd7353295)

在使用 `\newfontfamily` 时，必须指定 `Script`，否则某些字形可能会被错误渲染；例如，如果我们只写了 `\newfontfamily\thaifont{Garuda}` 排版结果可能会出错（如下左图所示）——只需添加 `[Script=Thai]`.

错误： ![](/files/ef37cad323984f0bc149ecc737aadb9ac75733bb) 正确： ![](/files/08aa239109b4317ae8b3779bceaf9bffe34fe93f)

## 定义其他字体族

让我们来看另一个示例，这次是希伯来文：

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

![](/files/50b27aa7965cf05111849fe447935c7455d76631)

到目前为止都还不错。现在假设我们使用的是一个最初为英语文档创建的模板，它使用 `titlesec` 宏包的示例代码：

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

我们会遇到如下错误信息：

```
polyglossia 宏包错误：当前罗马字体
不包含希伯来文字系统！

(polyglossia)                请定义
\hebrewfont with \newfontfamily.

请参阅 polyglossia 宏包文档以获取
说明。
输入 H <回车> 可立即获得帮助。
 ...

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

这有点令人困惑：我们不是已经定义了 `\hebrewfont` 为 Hadasim CLM 吗？其实原因在于我们 *还没有为希伯来文指定无衬线字体*。让我们通过添加以下定义来修正这个问题： `\hebrewfontsf`:

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

现在我们得到如下输出：

![](/files/32c76eb36913cfe89d5f4d7e766d526024945954)

如有需要，我们还可以定义一个等宽字体，用于 `\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://ayakaleaf-pro.ayaka.space/latex/zh-cn/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.
