マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

XeLaTeX や LuaLaTeX で Unicode できるかできないか(2)

前回の続き)

これまでは“日本語処理用パッケージ”を利用しない文書について考えてきた。しかし現在では XeLaTeX については zxjatype、LuaLaTeX については LuaTeX-ja を利用して日本語を含む文書(あるいは“日本語の文書”)を作成することも行われ始めている。この場合、和文の方は“Unicode できる”のはよく知られている。では欧文の方はどうだろうか?

XeLaTeX + zxjatype の場合

まずは XeLaTeX + zxjatype を試してみよう。

% XeLaTeX 文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage{zxjatype}
\usepackage[ipaex]{zxjafont}
\begin{document}
\begin{itemize}
\item My hovercraft is full of eels.
\item A légpárnás hajóm tele van angolnákkal.
\item Το χόβερκράφτ μου είναι γεμάτο χέλια.
\item Моё судно на воздушной подушке полно угрей.
\item 私のホバークラフトは鰻でいっぱいです。
\item 小なり <; 等号 =; 大なり >;
\end{itemize}
\end{document}

この結果を見ると、前回の記事で「fontspec パッケージを読み込んだだけ」の時と同じで、“Latin Modern フォントの範囲で Unicode できている”状態であることが判る。実は、zxjatype *1は fontspec パッケージを読み込んでその機能に依拠している。

fontspec が読み込まれているため、その機能を利用して欧文フォントの設定ができる。

% XeLaTeX 文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage{zxjatype}
\usepackage[ipaex]{zxjafont}
\setmainfont{Gentium Plus}% 欧文フォントを設定
\begin{document}
\begin{itemize}
\item My hovercraft is full of eels.
\item A légpárnás hajóm tele van angolnákkal.
\item Το χόβερκράφτ μου είναι γεμάτο χέλια.
\item Моё судно на воздушной подушке полно угрей.
\item 私のホバークラフトは鰻でいっぱいです。
\item 小なり <; 等号 =; 大なり >;
\end{itemize}
\end{document}

すなわち、zxjatype パッケージは和文と欧文の両方の設定を行う機能を備えているわけである。

LuaLaTeX + LuaTeX-ja の場合

LuaLaTeX + LuaTeX-ja の場合は少し様子が異なる。

% LuaLaTeX 文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage{luatexja}
% フォントは既定のまま(IPAexになる)
\begin{document}
\begin{itemize}
\item My hovercraft is full of eels.
\item A légpárnás hajóm tele van angolnákkal.
\item Το χόβερκράφτ μου είναι γεμάτο χέλια.
\item Моё судно на воздушной подушке полно угрей.
\item 私のホバークラフトは鰻でいっぱいです。
\item 小なり <; 等号 =; 大なり >;
\end{itemize}
\end{document}

……おっと、ギリシャキリル文字和文扱いされてアレなことになってしまった……。今問題にしたいのはコレではないので、取りあえず“LuaTeX-ja のプリミティブ”を直書きして切り抜けることにする。(LaTeX での解決法については要検討。)プレアンブルを以下のようにする。

% (プレアンブル)
\usepackage{luatexja}
\ltjsetparameter{jacharrange={-2}}% 追加

結果から推測できるように、ここでは欧文フォントが“7 ビット”の Computer Modern のままになっていて Unicode できていない。つまりこの状態では fontspec は読み込まれていないのである。

luatexja パッケージ自体は欧文フォントには影響を与えないため、欧文フォントの扱いは、LuaTeX-ja を利用しない場合と同様になる。すなわち、以下のように fontspec を“読み込んだけ”の場合は、“Latin Modern の範囲で Unicode できる”状態になる。

% (プレアンブル)
\usepackage{luatexja}
\ltjsetparameter{jacharrange={-2}}
\usepackage{fontspec}% 追加

fontspec で適切な欧文のフォントを指定すれば、全ての出力が正常になる。

% (プレアンブル)
\usepackage{luatexja}
\ltjsetparameter{jacharrange={-2}}
\usepackage{fontspec}
\setmainfont{Gentium Plus}% 追加

なお、周知の通り、和文のフォントを指定する場合は luatexja-fontspec パッケージが利用されるが、このパッケージは fontspec を内部で読み込む。また、luatexja-preset パッケージは luatexja-fontspec を内部で読み込むため、この場合も fontspec は読み込まれる。従って、これらのパッケージを読み込んだ場合は、欧文についても“Unicode できる”状態に移行していることに注意してほしい。

% LuaLaTeX 文書, 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage[ipaex]{luatexja-preset}
\ltjsetparameter{jacharrange={-2}}
\setmainfont{Gentium Plus}% 欧文フォントを設定
\begin{document}
\begin{itemize}
\item My hovercraft is full of eels.
\item A légpárnás hajóm tele van angolnákkal.
\item Το χόβερκράφτ μου είναι γεμάτο χέλια.
\item Моё судно на воздушной подушке полно угрей.
\item 私のホバークラフトは鰻でいっぱいです。
\item 小なり <; 等号 =; 大なり >;
\end{itemize}
\end{document}

(出力は直近の画像と同じ)

まとめ
  • 改めて確認: 特定の文字が出力できるかは、実際に使われているフォントがその字形を持っているかに依存する。
  • fontspec パッケージを読み込むと、欧文で(Latin Modern の範囲で) Unicode できるようになる。なおかつ、欧文のフォントが設定可能になる。
  • XeLaTeX + zxjatype の場合、fontspec は既に読み込まれている。なおかつ、zxjatype の機能が加わった結果、和文も欧文も Unicode できて、またフォントが設定可能である。
  • LuaLaTeX + LuaTeX-ja の場合、fontspec は自動的には読み込まれないので欧文は Unicode できない。和文は(IPAex フォントの範囲で)Unicode できるが、フォントの設定はできない。(要するに upLaTeX でフォントを IPAex にしている場合と同じである。)
    • fontspec を追加すると、欧文で Unicode できてフォント設定も可能になる。
    • luatexja-fontspec を追加すると、和文も欧文も Unicode できてフォント設定も可能になる。
    • luatexja-preset を読み込むと luatexja-fontspec が読み込まれる。
  • 「欧文が Unicode できないのは直感に反する」と感じる人は、「LuaTeX-ja を使用する場合は必ず luatexja-fontspec または luatexja-preset を読み込む」ことにすればよいかも知れない。

*1:というより、zxjatype が内部で読み込んでいる xeCJK パッケージが。