マクロツイーター

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

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

先日の記事で「upLaTeX で Unicode 文字が何でも出力できるとは限らない」という話をした。それでは、XeLaTeX や LuaLaTeX ではどうか。これらのエンジンは(TFM やら VF やら CMap やらを介すること無く)物理フォント(OpenType フォント)に Unicode直接アクセスできることを特徴とする。だから「実際に使っているフォントが字形を持ってさえいれば」出力できる。

何もしないとアレ

素晴らしい。では早速やってみよう。

% 文字コードUTF-8
\documentclass[a4paper]{article}
\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 less than <; equal =; greater than >;
\end{itemize}
\end{document}

……アレッ、Unicode できてない!?*1 ラテン文字以外が全滅してるし、よく見ると、ラテン文字もアクセント付の文字(〈á〉等)が抜け落ちている。なんでナンデ?

実は答えは簡単で

実際に使っているフォントが字形を持っていない

からである。最後の「less than …」の行を見ると、〈<〉〈>〉の文字が〈¡〉〈¿〉に化けている。そう、つまりこのフォントは

いつも (p)LaTeX で使っている Computer Modern フォント

なのである。このフォントは“7 ビット”の文字コード*2をもつフォントであり、符号位置 0〜127 にのみ字形が定義されている。なので、符号位置が U+0080 以上の Unicode 文字は落ちてしまうのである。*3

fontspec してみる

Unicode したいのであれば、Unicode フォントの指定が必要、で、「XeLaTeX/LuaLaTeX でフォント指定」といえば fontspec パッケージである。というわけで、取りあえずプレアンブルに

\usepackage{fontspec}

を書いてみよう。

……どうやらラテン文字に関しては正常になったようでうある。

実はこの場合に使われているのは Latin Modern という“Computer Modern と同じデザインの OpenType フォント”である。Latin Modern は一般的なアクセント付ラテン文字を広くカバーしている Unicode フォントである。*4しかしその名前から判るようにラテン文字以外の文字はサポートされていないので、先の例でもギリシャキリル文字や日本語は落ちてしまう。

それでは例の文書を全て正常に出力するにはどうすればよいか。既に「Unicode フォントが字形を持っているか」の問題であることは判っている。従って、出力したい文字をサポートする適切なフォントを、fontspec の機能を利用して指定すればよいのである。

% 文字コードUTF-8
\documentclass[a4paper]{article}
\usepackage{fontspec}
% Gentium Plus でラテン・ギリシャ・キリルに対応できる
\setmainfont{Gentium Plus}
% 流石に日本語は無理なので IPAex 明朝を別に指定
\newfontfamily\fIpxm{IPAexMincho}
\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 {\fIpxm 私のホバークラフトは鰻でいっぱいです。
\item less than <; equal =; greater than >;
\end{itemize}
\end{document}
まとめ

以上をまとめると、日本語処理パッケージを使わない場合には、以下のようになる。

  • XeLaTeX/LuaLaTeX の既定のフォントは“7 ビット”の Computer Modern であり、これでは Unicode できない。
  • fontspec パッケージを読み込むとフォントが Unicode フォントの Latin Modern に変わる。これでは Unicode できるけどラテン文字しか出ない。
  • 出力したい文字を含む Unicode フォントを適宜指定する必要がある。

至極当たり前の話である。しかし、日本語処理パッケージを利用する場合はチョット話が複雑になる。

*1:XeLaTeX でも LuaLaTeX でも結果は上掲の画像のようになる。

*2:通常、(非 Unicode の)TeX ではやや特殊な文字コードをもつフォントが使われる。オリジナルの Computer Modern の文字コードは「OT1 エンコーディング」と呼ばれる。

*3:そして、文字化けが起こるのは、〈<〉(60)〈>〉(62)の符号位置に〈¡〉(U+00A1)〈¿〉(U+00BF)が割り当てられているからである。

*4:「OT1 エンコーディング」ではなくなったので〈<〉〈>〉の文字化けが無くなった。