先日の記事で「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 フォントを適宜指定する必要がある。
至極当たり前の話である。しかし、日本語処理パッケージを利用する場合はチョット話が複雑になる。