多言語

LaTeX の 多言語文書について、いちばんよく見かける助言は「pdfLaTeX なら babel、XeLaTeX なら polyglossia」というものです。これはもう古くなっています。 TeX Live 2024 に入っている babel は 2024 年 2 月版で、pdfTeX・XeTeX・LuaTeX のすべてに対応し、\babelfont でシステムフォントを言語ごとに割り当て、LuaTeX 上では Unicode の双方向アルゴリズムを自前で実装しています。手元の TeX Live で数えると babel のロケール定義は 297 の言語ディレクトリ・387 個の .ini ファイル。一方 polyglossia は fontspec に依存するため pdfLaTeX では起動すらしません。このページでは、複数の文字体系が混ざる文書を組むために、babel と polyglossia のどちらを選ぶか、言語をどう切り替えるか、ハイフネーションとフォントがどこで黙って壊れるかを、実際のエラーメッセージとともに見ていきます。

babel と polyglossia の違い — どちらを使うべきか

特別な理由がなければ babel です。 エンジンを選ばず、ロケールの数でも上回り、いま最も活発に開発されています。TeX Live 2024 同梱の babel は 2024/02/07 v24.2——バージョン番号が西暦になっているのは、年に何度も出ているからです。作ったのは Johannes Braams で、現在の保守は Javier Bezos が引き継いでいます。対する polyglossia2024/03/07 v2.1 で、自身の説明文が「XeLaTeX と LuaLaTeX のための現代的な多言語組版」と述べ、README では「XeLaTeX と LuaLaTeX の利用者にとっての babel の代替」と自己紹介しています。つまり両者は同格の選択肢ではなく、babel が全域をカバーし、polyglossia が Unicode エンジンだけをカバーするという包含関係にあります。pdfLaTeX で polyglossia を読み込むと、polyglossia 自身ではなく依存先の fontspec が ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or LuaTeX. を投げて停止します。

項目babelpolyglossia
enginespdfTeX・XeTeX・LuaTeX のすべてXeTeX と LuaTeX のみ(fontspec 必須)
locale data297 の言語ディレクトリ・387 個の .ini(TeX Live 2024 実測)242 個の gloss ファイル。80 以上の言語を公称
declaring\usepackage[french,english]{babel}。最後が主言語\setmainlanguage{...}\setotherlanguage{...}。副言語は明示が必要
switching\selectlanguage{...}(段落単位)と \foreignlanguage{...}{...}(文中)同じ二つに加え \textgreek{...} のような \text + 言語名
fonts\babelfont{rm}{...} で言語・文字体系ごとに割り当て(Unicode エンジンのみ)fontspec の \newfontfamily\greekfont{...} などを使う
bidiLuaTeX では bidi=basic が自前の Unicode 実装。XeTeX では bidi パッケージに委譲方向制御は bidi(XeTeX)と luabidi(LuaTeX)に委譲
licenseLPPL(保守状態 maintained、現メンテナ Javier Bezos)MIT ライセンス

言語を切り替える — selectlanguage と foreignlanguage

まとまった範囲には \selectlanguage{french}、文中のひとことには \foreignlanguage{french}{...} を使い分けます。前者は以降ずっと効き続け、後者は引数の中だけです。切り替わるのはハイフネーション規則だけではありません。\tableofcontents は「Table des matières」に、\chapter の見出し語は「Chapitre」に変わります——これが 見出し語(document strings) の翻訳で、babel の最大の実務価値はここにあります。さらに重要なのは、組まれる文字そのものが変わることです。text-formatting/western-text が実測したところ、Bonjour: oui! は素の状態で 58.48572pt ですが [french]{babel} の下では 62.37366pt に伸び、pdftotext で抜くと Bonjour : oui ! と返ってきます。フランス語の約物前に四分の空きを入れるという組版規則が、コロンや感嘆符の前に実際の空白として入っているのです。babel は「言語のラベルを貼る」道具ではなく、その言語の組版習慣を適用する道具だと考えてください。

latex
% babel: the LAST option is the main language of the document
\usepackage[russian,french,english]{babel}
...
\foreignlanguage{french}{Bonjour : oui !}   % inline, one phrase
\selectlanguage{french}                     % from here on
\tableofcontents                            % now "Table des matieres"

% polyglossia (XeLaTeX / LuaLaTeX only)
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{greek}     % secondary languages must be declared
\textgreek{...}             % \text + language name

ハイフネーションのパターンが無いとどうなるか

エラーではなく警告が出て、そのまま英語の規則で分割されます。 ハイフネーションのパターンは実行時に読み込めず、フォーマットを作る段階で焼き込まれるという TeX の制約があるためです。TeX Live 2024 の language.dat に載っている言語は 87(別名の行を除いた実数)ですが、babel が .ldf を持つ言語はそれより多いので、両者にずれが生じます。たとえば \usepackage[albanian,english]{babel} としてアルバニア語を選ぶと、Package babel Warning: No hyphenation patterns were preloaded for the language 'Albanian' into the format. に続けて Now I will use the patterns preloaded for \language=0 instead と出ます。\language=0 はクヌースの元祖 hyphen.tex、すなわちアメリカ英語です。PDF は問題なく生成され、終了コードも 0——アルバニア語の単語が英語の規則で割られているだけです。警告をログで拾わない限り気づけません。対処は、その言語のパターンを含むパッケージを入れて fmtutil でフォーマットを作り直すか、Unicode エンジンで \babelprovide[import]{...} を使うことです。

文字体系ごとにフォントを切り替える — 一番よくある失敗

言語を宣言してもフォントは付いてきません。 多言語文書でいちばんよくある事故がこれです。XeLaTeX で \setotherlanguage{russian} と宣言し、\textrussian{Русский} と書いても、既定の Latin Modern にはキリル文字が無いので、その部分は紙面から消えます。エラーは出ません。ログにだけ Missing character: There is no Р (U+0420) in font [lmroman10-regular] のような行が一文字につき一つ並びます。終了コードは 0、PDF もできあがり、ただロシア語だけが空白になっている——気づきにくさではこれが随一です。対策は文字体系ごとにフォントを割り当てることで、babel なら \babelfont[russian]{rm}{...}、polyglossia なら fontspec の \newfontfamily\russianfont{...} を使います。ただし \babelfontUnicode エンジン専用で、pdfLaTeX で呼ぶと \babelfont ->\bbl@error@ {only-lua-xe} という未定義制御綴のエラーになります。pdfLaTeX で非ラテン文字を扱うなら、フォントではなく fontenc のエンコーディングを合わせる道——キリルなら T2A、ギリシャなら LGR——になります。

latex
% XeLaTeX / LuaLaTeX: give each script a font that actually has it
\usepackage[russian,greek,english]{babel}
\babelfont{rm}{Latin Modern Roman}
\babelfont[russian]{rm}{Times New Roman}
\babelfont[greek]{rm}{Times New Roman}

% pdfLaTeX has no \babelfont: match the encoding instead
% \usepackage[T2A,LGR,T1]{fontenc}   % Cyrillic, Greek, Latin

% Without this the text is simply absent and the log says:
%   Missing character: There is no Р (U+0420) in font [lmroman10-regular]

右横書き(RTL)— アラビア語・ヘブライ語には LuaLaTeX

双方向組版を本気でやるなら LuaLaTeX 一択です。 これは好みではなく、機能の所在の問題です。babel の双方向処理は bidi= オプションで選びますが、Unicode の双方向アルゴリズムを babel 自身が実装している bidi=basicLuaTeX でしか動きません。XeLaTeX で指定すると ! Package babel Error: The bidi method 'basic' is available only in luatex. I'll continue with 'bidi=default', so expect wrong results. と、はっきり「間違った結果になるぞ」と告げられます。XeLaTeX 側の選択肢は bidi=bidi——外部の bidi パッケージに委譲する経路——ですが、こちらは読み込んだ時点で Package babel Warning: Some functions for 'bidi=bidi' are tentative. They might not work as expected and their behavior could change in the future. という警告が出ます。polyglossia も方向制御は bidiluabidi に委ねているので、事情は同じです。LuaLaTeX に \babelprovide[import, main]{arabic}\babelfont{rm}{...} を組み合わせれば、警告ゼロでアラビア語と英語の混在文書が通ります。

bidi パッケージそのものを直接使うこともでき、\setRTL(別名 \setRL)で以降を右→左に、\setLTR(別名 \setLR)で左→右に戻します。XeTeX では方向の切り替えが自動判定に頼れないため、LR と RL が混ざる箇所には明示的なマークアップが要ります——これが手作業の量として効いてきます。LuaTeX の bidi=basic はここを Unicode の規則で自動判定し、表や余白といったレイアウトの左右も反転させます。ペルシア語のように RTL でありながら数字の扱いが独特な言語では、babel の bidi.mapdigits のような細かい調整も効いてきます。まとめると——アラビア語・ヘブライ語・ペルシア語を含む文書は、最初から LuaLaTeX で始めるのが結局いちばん速い、ということです。

latex
% LuaLaTeX: babel handles direction with its own Unicode implementation
\usepackage[bidi=basic]{babel}
\babelprovide[import, main]{arabic}
\babelfont{rm}{Geeza Pro}
% mixed Arabic and English needs no manual direction marks here

% XeLaTeX must delegate to the bidi package, which babel calls tentative
% \usepackage[bidi=bidi]{babel}
% \setRTL   % or \setRL  -- switch the flow right-to-left
% \setLTR   % or \setLR  -- switch it back

結局どう選べばよいか

判断は「どの言語を混ぜるか」ではなく 「どのエンジンで組むか」から先に決まります。 ラテン文字とキリル文字・ギリシャ文字程度の混在なら pdfLaTeX + babel + fontenc でも十分に通りますが、システムフォントを使いたい、あるいはアラビア語・ヘブライ語・インド系文字が入るなら Unicode エンジンが必要です。そして Unicode エンジンを選んだあとで初めて、babel と polyglossia のどちらかという問いが立ちます。CJK については別の話で、日本語は pTeX 系のエンジンとクラスが担当し、pTeX 世界の外での中国語・韓国語・日本語は CJKutf8xeCJKctexkotex の領分です——どちらも専用のページがあります。

  • ラテン文字中心で、キリル・ギリシャ程度が混ざる → pdfLaTeX + babelfontencT2ALGR)。既存のワークフローを変えずに済む。
  • システムフォントを使いたい、または多くの文字体系が混ざる → XeLaTeX か LuaLaTeX + babel\babelfont
  • アラビア語・ヘブライ語・ペルシア語(RTL)が入る → LuaLaTeX + babelbidi=basic。XeLaTeX では bidi=basic は使えない。
  • polyglossia を選ぶ理由 → すでに polyglossia で書かれた文書がある、または必要な言語の対応が polyglossia 側にしかない場合。新規なら babel が無難。
  • 日本語・中国語・韓国語 → 専用の経路(日本語組版のページ群と CJK のページ)。