> 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/ru/yazyki/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) текстовые файлы в кодировке UTF-8. Использование pdfTeX сильно усложняет набор некоторых языков в LaTeX, особенно тех, которые не используют латинскую письменность. Некоторые пакеты — такие как [`inputenc`, `fontenc` и](/latex/ru/yazyki/05-arabic.md) [`arabtex`](/latex/ru/yazyki/05-arabic.md)— обеспечивают поддержку pdfTeX для набора нелатинских языков и письменностей, но не все глифы и символы могут поддерживаться или корректно отображаться в выходном PDF, даже если вы использовали `utf8` или `utf8x` опцию с `inputenc`.

Для подробного обсуждения UTF-8, кодировки Unicode и движков XeTeX/LuaTeX статья Overleaf [Unicode, UTF-8 и многоязычный текст: введение](/latex/ru/podrobnye-stati/51-unicode-utf-8-and-multilingual-text-an-introduction.md) — увлекательное чтение.

## На сцену выходят XeTeX и LuaTeX

Движки XeTeX и LuaTeX могут напрямую читать/обрабатывать текст в кодировке UTF-8; следовательно, они обеспечивают встроенную поддержку Unicode — они также могут [работать с шрифтами TrueType и OpenType](/latex/ru/shrifty/03-xelatex.md) непосредственно. Эти свойства делают их естественным выбором для набора многоязычных или нелатинских документов в LaTeX, давая такие результаты:

![](/files/a9e1c7570c7a9743381c7f5c7f044f2ff7daaa3c) ![](/files/4b66dbce7ec6e12ccf3bc4c889bba94fce741726) ![](/files/fc329f279a6b046f89b1aaa97986ac495acab3d3)

Эти примеры можно найти в галерее Overleaf: [Как писать многоязычный текст с разными письменностями в LaTeX в Overleaf](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/ru/yazyki/06-chinese.md)
* [Японский](/latex/ru/yazyki/11-japanese.md)
* [Корейский](/latex/ru/yazyki/12-korean.md)

Xe(La)TeX по-прежнему полезен для этих языков, но доступны более специализированные движки TeX, а именно [предназначенные для набора языков CJK](/latex/ru/drugie-temy/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/) или вместо этого использовать представление Rich Text в Overleaf. Однако на момент написания статьи представления Source и Rich Text могут (пока) не полностью поддерживать редактирование текста справа налево на том уровне функциональности, которого мы стремимся достичь.

## Изменение компилятора проекта

Это `fontspec` и `polyglossia` пакеты требуют компилятора XeLaTeX или LuaLaTeX, поэтому вам нужно настроить свой проект Overleaf на использование одного из этих компиляторов. Подробные инструкции можно найти в нашей статье [Выбор компилятора LaTeX](/latex/ru/drugie-temy/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` при работе с компиляторами pdfLaTeX и LaTeX в Overleaf.

## Если весь ваш документ написан только на одном языке

При использовании `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/cba5473a27e61e33fbeff41dce6e30ed6c647d6f)

## Несколько языков/письменностей в одном документе: знакомство с 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/598a64365dcbb61ccec83481a65ef3fcc7b728a8)

`polyglossia` позволяет задать основной язык документа с помощью `\setdefaultlanguage` (по умолчанию — английский) и (возможно, несколько) «других» языков с помощью `\setotherlanguages`. (`\setmainlanguage` является псевдонимом для `\setdefaultlanguage`.) Если вы предполагаете использовать только один другой иностранный язык, можно использовать единственную форму `\setotherlanguage`. Названия языков такие же, как и используемые `babel`.

Мы подготовили небольшой пример документа преимущественно на французском языке, который также содержит немного текста на английском, русском и тайском языках. Мы решили использовать гарнитуры FreeSerif, FreeSans и FreeMono.

Поскольку основным языком документа является `французский`, `abstract` среда автоматически создает заголовок «Résumé». Обратите внимание, как в конце первого абзаца восклицательный знак набирается по французскому типографскому правилу: он отделяется от «français», хотя в исходном коде сразу следует за словом `français` в исходном коде.

В основном тексте короткие фрагменты на английском, кириллице и тайском можно включать в абзац французского текста с помощью `\textenglish{Thank you}`, `\textrussian{Спасибо}` и `\textthai{ขอบคุณ}`. Как правило, можно использовать `\textLANGUAGE{...}` для набора текста на любом `ЯЗЫКЕ` который был объявлен с помощью `\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/97c707d59ad3340a37c711c38c813baeb3d9d94c)

Конечно, все латинские и кириллические глифы отображаются в выходном 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/ff8f6135dd637ccdc6ff4d988b3100fdde48a925)

Текст автоматически набирается справа налево, начиная с правого края страницы. Само слово «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/76a9a2c7acceb2612e2a8697e19bbb0970947286)

**Примечание:** Если вы привыкли к `babel` командам пакета, вам будет приятно узнать, что команды `\selectlanguage`, `\foreignlanguage` и среда `otherlanguage` также поддерживаются `polyglossia`.

## Параметры, специфичные для языка

Некоторые языки поддерживают дополнительные параметры настройки; например, `греческий` поддерживает `variant=ancient`, `mono` или `poly` параметр для древнегреческого, монотонного или политонического греческого; `хинди` может быть настроен с помощью `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/89b2036815a25d1163bb68a24c77ae308d3bcccb)

Разумеется, можно использовать что-то еще более вычурное:

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

![](/files/35f1f1d06346de00e4a06a11f1ec16d53645a30e)

Этот механизм задания шрифтов для разных языков или письменностей особенно важен, когда вы используете основной шрифт, который *не* имеет глифы для всех письменностей или языков в вашем документе. Предположим, теперь мы решаем использовать Caladea в качестве основного шрифта документа:

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

При компиляции мы увидели бы следующую ошибку:

```
Ошибка пакета polyglossia: текущий римский шрифт
не содержит кириллическую письменность!

(polyglossia)                Пожалуйста, определите
\cyrillicfont с \newfontfamily.

См. документацию пакета polyglossia для
объяснения.
Введите H <return> для немедленной помощи.
 ...

l.15 \select@language {russian}

Ошибка пакета polyglossia: текущий римский шрифт
не содержит тайскую письменность!

(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/c168251f53d25ee8c5b8dad16d61ae6ca292aec4)

**Примечание**: выходя за рамки этой статьи, мы не будем рассматривать вопросы выбора эстетически приятных и типографически совместимых сочетаний шрифтов.

Обратите внимание, что мы определили `\cyrillicfont` вместо `\russianfont`, то есть мы определили шрифт для кириллической *письменности* а не для русского *языка*. Преимущество определения `\cyrillicfont` состоит в том, что если, например, `сербский` тоже является определенным языком в вашем проекте, то `\textserbian` будет автоматически использовать определенный `\cyrillicfont`. Если бы вы определили только `\russianfont`, то при использовании `\textserbian` снова возникла бы жалоба «текущий римский шрифт не содержит кириллическую письменность», и вам все равно пришлось бы определить `\cyrillicfont` в любом случае — *если только* вас *вы не* хотели использовать другой шрифт для сербского текста!

Еще один похожий сценарий — письменность деванагари *письменности*которая используется для языков хинди и санскрит *языков*; или арабская письменность, используемая для арабского и фарси (персидского).

```latex
\setdefaultlanguage{english}
\setotherlanguages{hindi,sanskrit}
\newfontfamily\devanagarifont[Script=Devanagari]{Lohit Devanagari}
...
Хинди: \texthindi{हिन्दी}
Санскрит: \textsanskrit{संस्कृतम्}
```

![](/files/a3ffc517dbf906da7bf50d1d85cce8b2d51495da)

При использовании `\newfontfamily` необходимо указать `параметр Script`, иначе некоторые глифы могут отображаться неправильно; например, если бы мы написали только `\newfontfamily\thaifont{Garuda}` результат набора может оказаться неправильным (слева внизу) — правильный вывод получается при добавлении `[Script=Thai]`.

Неверно: ![](/files/b0c96cdb0023064002fd60532db94dd66e0ce312) Верно: ![](/files/820493d2ddb6612912229a44c102f1ea0333bff2)

## Определение других семейств шрифтов

Давайте посмотрим на еще один пример, на этот раз с ивритом:

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

![](/files/49965073cc409950fae63bd06fd62071c6fc1fd9)

Пока все хорошо. Теперь предположим, что мы используем шаблон, изначально созданный для английского документа, который задает заголовки разделов шрифтом без засечек с помощью `titlesec` пакета:

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

Мы сталкиваемся с сообщением об ошибке:

```
Ошибка пакета polyglossia: текущий римский шрифт
не содержит ивритскую письменность!

(polyglossia)                Пожалуйста, определите
\hebrewfont с \newfontfamily.

См. документацию пакета polyglossia для
объяснения.
Введите H <return> для немедленной помощи.
 ...

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

Это немного сбивает с толку: разве мы уже не определили `\hebrewfont` как Hadasim CLM? Ну, на самом деле это потому, что мы *не указали шрифт без засечек для иврита*. Давайте исправим это, добавив определение для `\hebrewfontsf`:

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

А теперь у нас есть результат:

![](/files/9c8c0afea14f291cfd56e8354c4d127affa8cb81)

При необходимости мы могли бы также определить моноширинный шрифт для использования с `\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/ru/yazyki/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.
