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

# 使用 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-ru-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 **菜单** 按钮（位于项目文件列表上方），并更改“字体族”选项。你也可以尝试 [更改浏览器的等宽字体偏好](https://www.howtogeek.com/208552/how-to-change-the-default-fonts-in-your-web-browser/) ，或者改用 Overleaf 的富文本视图。不过，截至本文撰写时，源代码视图和富文本视图可能还不能在我们希望达到的功能层面上完全支持从右到左的文本编辑。

## 更改项目的编译器

该 `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，因此你通常应该在 Overleaf 上使用 `utf8` 与 `inputenc` 当你使用 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 字体。

因为文档的主要语言是 `法语`， `abstract` 环境会自动生成标题“Résumé”。注意，在第一段末尾，感叹号按照法语间距排版规则进行排版：它与“français”分开，即使它在源码中紧跟在单词 `français` 之后。

在正文中，简短的英语、斯拉夫字母和泰语片段可以用 `\textenglish{Thank you}`, `\textrussian{Спасибо}` 和 `\textthai{ขอบคุณ}`插入到法语段落中。通常，你可以使用 `\textLANGUAGE{...}` 来排版任何由 `LANGUAGE` 声明过的语言文本。由于文档的主（衬线）字体是 FreeSerif，而 FreeSerif 包含拉丁、斯拉夫字母和泰语（以及更多！）文字体系的字形， `\setdefaultlanguage` 和 `\setotherlanguages`可以使用它将所有这些文本渲染到输出 PDF 中。 `fontspec` 和 `polyglossia` 对于较长的外语/其他语言段落，建议使用

\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/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`.

## 特定语言的选项

某些语言支持额外的自定义选项；例如， `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/438b4880660d8a9ed6ed40c3154d89b1d27ab5c2)

当然，你也可以用更花哨一点的：

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

![](/files/3d030cecc996c9dea2887deab49451e23b83e7ab)

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

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

编译后我们会看到如下错误：

```
Package polyglossia Error: 当前的 roman 字体
不包含斯拉夫字母文字体系！

(polyglossia)                请定义
\cyrillicfont 并使用 \newfontfamily。

有关说明请参见 polyglossia 宏包文档。
说明。
输入 H <return> 以获得即时帮助。
 ...

l.15 \select@language {russian}

Package polyglossia Error: 当前的 roman 字体
不包含泰语文字体系！

(polyglossia)                请定义
请使用 \newfontfamily 定义 \thaifont。

有关说明请参见 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/35a88a935361c85f464854edbbff31f0abb17cca)

**注意**：本文不涉及如何选择美观且在排版上兼容的字体组合相关问题。

请注意，我们定义了 `\cyrillicfont` 而不是 `\russianfont`，也就是说，我们为斯拉夫字母 *文字体系* 而不是俄语 *语言*定义了字体。定义 `\cyrillicfont` 的好处是，例如， `serbian` 如果也是你项目中定义的语言，那么 `\textserbian` 会自动使用已定义的 `\cyrillicfont`。如果你只定义了 `\russianfont`，那么使用 `\textserbian` 又会再次报“当前的 roman 字体不包含斯拉夫字母文字体系”的错误，你无论如何都需要定义 `\cyrillicfont` —— *除非* 你 *你的确想要为塞尔维亚文本使用不同的字体！* 另一个类似的场景是天城文

，它用于印地语和梵语 *文字体系*语言 *；或者用于阿拉伯语和波斯语（Farsi）的阿拉伯字母。*\setdefaultlanguage{english}

```latex
\setotherlanguages{hindi,sanskrit}
\newfontfamily\devanagarifont[Script=Devanagari]{Lohit Devanagari}
印地语：\texthindi{हिन्दी}
...
梵语：\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}
...
```

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

```
Package polyglossia Error: 当前的 roman 字体
不包含希伯来语文字体系！

(polyglossia)                请定义
请使用 \newfontfamily 定义 \hebrewfont。

有关说明请参见 polyglossia 宏包文档。
说明。
输入 H <return> 以获得即时帮助。
 ...

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://overleaf-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.
