this article shows how to typeset multiple languages in a single document, in a xelatex environment, with the help of 3 packages:

  • fontspec:

    font selection in xelatex;

  • polyglossia:

    multilingual support in xelatex;

  • xeCJK:

    support cjk documents in xelatex;

these packages are fairly common; for example, they can be installed on fedora:

dnf install texlive-fontspec texlive-polyglossia texlive-xecjk
  • why polyglossia, not babel?

    in fact, i have tried babel in xelatex on a plethora of languages; conflicts arise between some of them, which can break compilation of the tex file; the exact problem may be related to active chars, but this topic is out of scope here; on the other hand, polyglossia is made for xelatex (and lualatex), and gives less surprise in practice;

idea

since there are many languages to coexist, we need to figure out how to process each one; the most important aspect of a language in typesetting is font; other than that, there are other conventions (such as hyphenation) to take care of;

gladly polyglossia is designed to help on these issues; we declare languages that show up in the document, setup their fonts, and polyglossia will do the rest;

roughly speaking, all languages can be classified into 3 groups:

  • latin, greek, cyrillic (lgc): english, french, german, greek, russian, etc.;

    this group is the easiest to process; small alphabet size; fonts are widely available; words are split by whitespaces;

  • chinese, japanese, korean (cjk): chinese, japanese, korean;

    this group features a huge alphabet size; there are no whitespaces between words; so their typesettings have significant difference from lgc ones;

  • others: hebrew, arabic, hindi, thai, etc.;

    this group contains all the rest; they may not share much in common; so care must be given to each one separately;

polyglossia is great at processing the lgc group, but seems limited with the cjk group; it is ok with other common languages: hebrew, arabic, hindi, etc.; so our main problem here is cjk;

fortunately, the package xeCJK deals with cjk specifically; now our strategy is simple: use xeCJK for cjk languages, and polyglossia for all others; the steps are as follows:

  1. in polyglossia, enable all languages that show up in the document (excluding cjk);

  2. setup non-cjk fonts: use fontspec to set default (non-cjk) fonts, then define new font families for languages not covered in the default ones;

    usually we need to set default fonts for 3 font families: serif, sans, mono;

    usually we set default fonts to pan-lgc ones;

  3. setup cjk fonts: use xeCJK to set default cjk fonts, then define new cjk font families not covered in the default ones;

    usually we need to set default fonts for 3 font families: serif, sans, mono;

    usually we set default fonts to pan-cjk ones;

  4. use polyglossia to typeset non-cjk languages:

    \text<lang>{ ... }
    

    or

    \begin{<lang>}
    ...
    \end{<lang>}
    

    we need to use these markups even if the language uses the default (non-cjk) fonts, because localization has more than fonts;

  5. use xeCJK to typeset cjk languages:

    {\<lang>font ... }
    

    it is ok to omit these markups if the language uses the default cjk fonts, because xeCJK still manages cjk texts even if they are outside of markups;

code

here is the sample code that can be processed by xelatex:

%%  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
%%  multilingual typesetting in xelatex;
%%  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

\documentclass[11pt]{scrartcl}

\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage{xeCJK}

%%  {polyglossia}: set default language; exclude cjk;
\setdefaultlanguage{english}

%%  {polyglossia}: set other languages; exclude cjk;
\setotherlanguage{french}
\setotherlanguage{german}
\setotherlanguage{spanish}
\setotherlanguage{italian}
\setotherlanguage{greek}
\setotherlanguage{russian}
\setotherlanguage{hebrew}
\setotherlanguage{arabic}
\setotherlanguage{urdu}
\setotherlanguage{hindi}
\setotherlanguage{thai}

%%  {fontspec}: set default non-cjk fonts;
\setmainfont{Noto Serif}
\setsansfont{Noto Sans}
\setmonofont{Noto Sans Mono}

%%  {fontspec}: new non-cjk font families;
%%
%%  -   font command names must match language names;
%%  -   definitions must include the `Script` option;
%%
\newfontfamily\hebrewfont[Script=Hebrew]{Noto Serif Hebrew}
\newfontfamily\arabicfont[Script=Arabic]{Noto Naskh Arabic}
\newfontfamily\urdufont[Script=Arabic]{Noto Naskh Arabic}
\newfontfamily\hindifont[Script=Devanagari]{Noto Serif Devanagari}
\newfontfamily\thaifont[Script=Thai]{Noto Serif Thai}

%%  {fontspec}: new non-cjk font families: sf and tt;
\newfontfamily\hebrewfontsf[Script=Hebrew]{Noto Sans Hebrew}
\newfontfamily\hebrewfonttt[Script=Hebrew]{Noto Sans Hebrew}

%%  {xeCJK}: set default cjk fonts;
\setCJKmainfont{Noto Serif CJK SC}
\setCJKsansfont{Noto Sans CJK SC}
\setCJKmonofont{Noto Sans Mono CJK SC}

%%  {xeCJK}: new cjk font families;
\newCJKfontfamily\simplifiedchinesefont{Noto Serif CJK SC}
\newCJKfontfamily\traditionalchinesefont{Noto Serif CJK TC}
\newCJKfontfamily\japanesefont{Noto Serif CJK JP}
\newCJKfontfamily\koreanfont{Noto Serif CJK KR}

%%  {xeCJK}: new cjk font families: sf and tt;
\newCJKfontfamily\japanesefontsf{Noto Sans CJK JP}
\newCJKfontfamily\japanesefonttt{Noto Sans Mono CJK JP}

\title{Multilingual Text}
\author{}
\date{}

%%  hack: rtl languages (eg: hebrew and arabic) interfere with first paragraph
%%  indent; we enable this indent and set it to 0pt; the result is no indent;
\usepackage{indentfirst}
\setlength{\parindent}{0pt}

%%  this is not necessary, but makes it pretty;
\setlength{\parskip}{1em}

\begin{document}

\maketitle

\section*{Disclaimer}

The testing texts come from public domain. I don't know their meanings and they
don't convey my opinions. I am free from all liabilities however you use them.

Example: \textfrench{Français}, \textgerman{Deutsch} and \textarabic{اَلْعَرَبِيَّةُ}.

\section{English}

\begin{english}

English English English English English English English English English English
English English English English English English English English English English
English English English English English English English English English English
English English

\end{english}

\section{French}

\begin{french}

Français Français Français Français Français Français Français Français Français
Français Français Français Français Français Français Français Français Français
Français Français Français Français Français Français Français Français Français
Français Français Français Français Français

\end{french}

\section{German}

\begin{german}

Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch
Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch
Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch Deutsch
Deutsch Deutsch

\end{german}

\section{Spanish}

\begin{spanish}

Español Español Español Español Español Español Español Español Español Español
Español Español Español Español Español Español Español Español Español Español
Español Español Español Español Español Español Español Español Español Español
Español Español

\end{spanish}

\section{Italian}

\begin{italian}

Italiano Italiano Italiano Italiano Italiano Italiano Italiano Italiano Italiano
Italiano Italiano Italiano Italiano Italiano Italiano Italiano Italiano Italiano
Italiano Italiano Italiano Italiano Italiano Italiano Italiano Italiano Italiano
Italiano Italiano Italiano Italiano Italiano

\end{italian}

\section{Greek}

\begin{greek}

Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά
Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά
Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά
Ελληνικά Ελληνικά Ελληνικά Ελληνικά Ελληνικά

\end{greek}

\section{Russian}

\begin{russian}

Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к
Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к
Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к
Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к
Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к Ру́сский язы́к
Ру́сский язы́к Ру́сский язы́к

\end{russian}

\section{Simplified Chinese}

{\simplifiedchinesefont

汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语
汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语 汉语

}

\section{Traditional Chinese}

{\traditionalchinesefont

漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語
漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語 漢語

}

\section{Japanese}

{\japanesefont

日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語
日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語
日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語

ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな
ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな
ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな ひらがな
ひらがな ひらがな ひらがな ひらがな ひらがな

カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ
カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ
カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ カタカナ
カタカナ カタカナ カタカナ カタカナ カタカナ

}

\section{Korean}

{\koreanfont

한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어
한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어
한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어 한국어

韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語
韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語
韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語 韓國語

}

\section{Hebrew}

\begin{hebrew}

עברית עברית עברית עברית עברית עברית עברית עברית עברית עברית עברית עברית עברית
עברית עברית עברית עברית עברית עברית עברית עברית עברית עברית עברית עברית עברית
עברית עברית עברית עברית עברית עברית

\end{hebrew}

\section{Arabic}

\begin{Arabic}

اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ
اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ
اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ
اَلْعَرَبِيَّةُ اَلْعَرَبِيَّةُ

\end{Arabic}

\section{Urdu}

\begin{urdu}

اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو
اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو اُردُو

\end{urdu}

\section{Hindi}

\begin{hindi}

हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी,
हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी, हिन्दी,

\end{hindi}

\section{Thai}

\begin{thai}

ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย
ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย
ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย ภาษาไทย
ภาษาไทย ภาษาไทย

\end{thai}

\end{document}

generated pdf is here;