LuaLaTeX で Unicode してみる
~そして日本語できそうな件について~

LuaTeX 上で動く LaTeX である LuaLaTeX について基本的な使い方を解説する。 その際に、 まず LuaLaTeX が従来の欧文 LaTeX の代用として使えることを示して、 その後に 「UTF-8 で入力して TrueType/OpenType 形式の Unicode フォントで出力を行う」 ための方法を解説する。 加えて、LuaLaTeX で日本語文書を作成することについての現時点での状況を解説する。
変更履歴
  • 2011/06/05: 誤記を訂正。 出力結果の画像を追加。
  • 2011/05/28: 新規作成。

従来の欧文 LaTeX の代わりに使う

Unicode フォントで出力することがこの文書の目的であるが、 まずは従来の 8 ビット欧文 LaTeX と同様に 8 ビットな (TFM ベースの) フォントーーType1 形式、 あるいはビットマップーーでの出力の方法を述べる。 わざわざそれを行う目的は、 「LuaTeX エンジンは pdfTeX の後継であるので、 LuaLaTeX は 8 ビット LaTeX と同じことが行えるはずであり、 また実際に行える」 ことを確認するためである。

注意: Unicode での入出力ができることは LuaLaTeX の利点の一つであるが、 例えそれを使わないとしても LuaLaTeX にはもう一つの大きな特長がある。 それは Lua が使えることである。

文書の作成とコンパイルの方法

結論からいうと、 LuaLaTeX で文書を以下のように記述すると、 ほぼ 8 ビットの LaTeX の上位互換として動作させることができる。

  1. 文字コードを UTF-8 (または ASCII)にする。
  2. コメント以外の部分は ASCII 文字のみで入力する。

後で見るように、 Unicode フォントを使った場合は、 全ての Unicode 文字が UTF-8 で直接入力できるが、 今は 8 ビットフォントを前提にしているため 2 の条件が入る。

例えば、 次の LaTeX 文書は LuaLaTeX でも完全に通用する。

\documentclass[a4paper]{article}
\begin{document}
Hello, {\TeX}!
\end{document}

このファイル名を hello.tex とすると、 以下のコマンドで組版された PDF 文書 hello.pdf が得られる。

lualatex hello.tex
#(PDF 文書 hello.pdf が得られる)

文書の中では、 従来の LaTeX と全く同様に Computer Modern フォントが使われていることが判る。

このように lualatex コマンドは、 pdfLaTeX(pdflatex コマンド)と同様に TeX 文書を DVI 形式ではなく PDF 形式に直接に変換する。 (XeLaTeX のように「裏で 2 段階の変換を行っている」のではない。)

(Unicode フォントでの出力にのみ興味がある人は、 この節の残りを飛ばして次節に進んで構わない。)

参考: 実際には、 LuaTeX は DVI 出力を行う(DVI モード)こともできて、 また DVI モードの LuaLaTeX のコマンド dvilualatex も用意されている。 従来の LaTeX と同様の 8 ビットフォントしか用いない場合には、 これは従来の DVI ウェア (dvipdfmx、dviout、dvips 等) で処理できる DVI ファイルを出力できる。

同じエンジンで 「DVI モード」 と 「PDF モード」 があるのは LuaTeX に限ったことではない。 実は、最近の TeX システムでは、 latex コマンドで DVI 出力を行う場合でも、 実際に動作しているものは pdfTeX エンジンの DVI モードである。

参考として、 各エンジン・各モードでの 「LaTeX のコマンド」 の名前を以下の表にまとめた。

エンジンLuaTeXpdfTeXXeTeXpTeX
PDF 出力lualatexpdflatexxelatex
DVI 出力dvilualatexlatexplatex

ちなみに、コマンド名の ~latex を ~tex に変えると 「plain TeX のコマンド名」 が得られる。 ただし、 「tex」 だけは例外で、 これは pdfTeX でなく(Knuth の)オリジナルの plain TeX が起動する。 「pdfTeX・DVI 出力の plain TeX」 のコマンド名は 「etex」 である。

エンコーディングの扱い

従来の (8 ビット) LaTeX において、 Latin-1 や KOI8-R 等の 8 ビットの入力エンコーディング (文書ファイルの文字コード) を扱うには inputenc パッケージを用いればよかった。 しかし、LuaTeX は原則的に入力を UTF-8 として処理するので、 「8 ビット入力」 を前提とする inputenc パッケージは正常に動作しない。 従って、例え UTF-8 の指定 (\usepackage[utf8]{inputenc}) であっても inputenc は決して読み込んではいけない

これに対して、7 ビット/8 ビットのフォントエンコーディング (OT1、T1、T2A 等) は LuaLaTeX で制限なく用いることができて、 その指定には従来通り fontenc パッケージを読み込む。 ちなみに、 「既定のエンコーディング」 は LuaLaTeX でも OT1 である。

% 文字コードは UTF-8
% (ただしコメント以外は全て ASCII)
\documentclass[a4paper]{article}
% この時点でのフォントエンコーディングは OT1
\usepackage[T1]{fontenc}  % フォントエンコーディングを T1 に変更
\usepackage{lmodern}      % Latin Modern フォントを使用する
\begin{document}
,,Gr\"u{\ss} Gott!\mbox{}`` % ただし入力は ASCII で
Ich liebe $e^{\pi i} = -1$.
\end{document}

注意: 上掲の例の中で、 「!\mbox{}``」 は 〈!`〉 → 〈¡〉 のリガチャを抑止するための処置である。 従来の LaTeX では 「!{}``」 でよかったが、 LuaLaTeX ではグルーピング境界でリガチャ・カーンが無効化されない (だから上の 「u{\ss}」 ではカーニングが有効である) のでこのようにする必要がある。 (実は XeLaTeX でも同様である。)

luainputenc パッケージ

(高度な話題である。)

もし、 どうしても LuaLaTeX で 8 ビットの入力エンコーディングを用いる必要がある場合は、 inputenc の代わりに luainputenc パッケージを用いる (オプション名は inputenc と同じで、 例えば Latin-1 なら latin1 である)。

% This file is encoded in Latin-1.
\documentclass[a4paper]{article}
\usepackage[latin1]{luainputenc} % specified input encoding
\usepackage[T1]{fontenc}
\usepackage{txfonts}
\begin{document}
% Here follows some text en français....
La valeur approchée de $\pi$
(le rapport entre la circonférence d'un cercle et son diamètre)
est \directlua{tex.sprint(math.pi)}.
\end{document}

この他に luainputenc には特殊な指定が存在する。 「文字コードは UTF-8 であるが 8 ビットフォントエンコーディングを用いる部分の入力に ASCII 外の Unicode 文字を使いたい」 という場合は、 オプションに lutf8 を指定する。

% 文字コードは UTF-8
\documentclass[a4paper]{article}
\usepackage[lutf8]{luainputenc} % lutf8 指定
\usepackage[T1]{fontenc} % T1 エンコーディングで出力したい
\usepackage{pxfonts}
\begin{document} % しかも ASCII 外の文字を直接入力したい
Równie dobrze mogłoby to być po chińsku!
\end{document}

注意: luainputenc に utf8 や utf8x オプションを指定した場合は、 代わりに lutf8 オプションを指定したものと見なされる。

注意: luainputenc を用いるとテキスト入出力が全て 「8 ビット直接」 (8 ビット LaTeX と同等の処理) になり、 (コメント以外で) UTF-8 で書かれたファイルを読み込むことはできなくなる。 ただし例外的に、 lutf8 オプション(および以下で述べる lutf8x オプション) の場合はテキスト入出力の方法は変更されない――つまり、 通常 (luainputenc なしの場合) と同じく UTF-8 になる。

参考: 通常 (luainputenc なしの場合) は、 LuaLaTeX は入力された Unicode 文字を直接出力しようとする。 Unicode フォントを用いる場合はこれでよいが、 8 ビットフォントだと文字が化けてしまう。 そこで、 lutf8 オプションでは、受け取った Unicode 文字に対して fontenc の処理を挟む (一旦 LICR に変換する) ことで、 様々な 8 ビットエンコーディングに対応している。

なお、 lutf8 の指定では Unicode フォントでの出力は保証されない。 もし 8 ビットフォントと Unicode フォントを併用する (かつ両方で UTF-8 直接入力を行う) 場合は、 lutf8x オプションを代わりに用いるのが適当である。 このオプションはフォントが 8 ビットの場合だけ fontenc の処理を介入させる。

Unicode したい場合は

本節では、 LuaLaTeX において、 OpenType/TrueType 形式の Unicode フォントを用いて出力を行う方法を解説する。 なお、 前節で述べたように、 LuaLaTeX では UTF-8 の入力が既定になっているので、 そのままで任意の Unicode 文字の入力が可能であることを注意しておく。

注意: 現状の LuaLaTeX では、 Unicode で直接出力 (fontenc を介さない) する場合に UTF-8 以外の文字コードで入力する方法は用意されていない。 luainputenc パッケージは飽くまでも 8 ビット LaTeX の処理方式をサポートするためのものなので、 日本語用の旧来の文字コード (Shift_JIS 等) に適用できる可能性はない。 LuaTeX の 「入力フィルタ機能」 を用いれば日本語文字コードでの入力自体は可能だと思われるが、 特に LaTeX の場合は、 本体の LaTeX 文書以外の複数のテキストファイルの入出力が絡むことになり、 それを全て適切な文字コードで行うことは結構難しい。
注意: 先述の通り、LuaLaTeX は DVI 出力を行えるが、 Unicode フォントを用いた場合は DVI 出力は 「事実上使えない」 ので PDF 出力を用いる必要がある。

プレアンブルの書き方

LuaLaTeX で Unicode フォントを使用するには、 fontspec パッケージの機能を用いる。 以下に例を一つ示す。

% このファイルの文字コードは UTF-8
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont[Scale=MatchLowercase]{Linux Libertine O} % \rmfamily のフォント
\setsansfont[Scale=MatchLowercase]{Linux Biolinum O}  % \sffamily のフォント
\setmonofont[Scale=MatchLowercase]{Inconsolata}       % \ttfamily のフォント
\begin{document}

This document contains English, \textit{Français}, Српски,
and Rom\^an\u{a}.

{\sffamily
If you want the logo {Lua\TeX} then simply type \verb|Lua\TeX|.}

\end{document}

見比べれば判るが、 実はこの例は XeLaTeX の解説で挙げた例とほとんど同じになっている。 (XeLaTeX の方は 「\XeTeX」 の複雑なロゴを出すために xltxtra パッケージを読み込んでいるが、 それはこちらでは不要である。) fontspec パッケージは XeLaTeX と LuaLaTeX の両方をサポートし、 しかも両方のエンジンで利用可能な機能については可能な限り共通のインタフェースで使えるようにしている。 従って、 「Unicode フォントを指定する方法」 については、XeLaTeX における説明がほぼそのまま通用することになる。

参考: 8 ビット LaTeX と LuaLaTeX (または XeLaTeX) を比較した場合に、 相違する点として最も際立つのがフォントの扱いであるが、 これに関しては LuaLaTeX と XeLaTeX での扱いが共通になっている。 (その他の点でも、総じて LaTeX のパッケージは 「エンジン (あるいは DVI ドライバ) 間の相違を吸収する (共通の書式を与える)」 ように設計されている。) だから、 「『新しい TeX』 として XeTeX と LuaTeX の 2 つがあるようなんだが、 どちらの使い方を習ったほうが得 (将来主流になる) のか分からない」 と悩んで躊躇する必要はないと考えられる。 一方で得た知識のほとんどが他方でも通用することが期待できるからである。

プレアンブルの書き方の注意について、 fontspec の読込以外の点においても XeLaTeX と同じことがいえる。

  • 本節冒頭で述べたように、 文字コードは UTF-8 にする。
  • 文書クラスは、 8 ビット欧文 LaTeX 用のもの (article、book、amsart 等) のほとんどが使用できるが、 pLaTeX 専用のもの (jarticle、jsarticle 等) は使えない。
  • 8 ビット欧文 LaTeX のパッケージについては、 フォント関連のものを除けばそのまま使用できる可能性が高い。 pLaTeX 専用のパッケージ (OTF パッケージ等) は使えない。
  • LuaLaTeX に深く関連する fontspec 以外のパッケージ:
    • luatexbase ― LuaTeX の拡張機能の使用を支援するパッケージ。 LuaLaTeX 上で (Lua や TeX で) プログラムを組む開発者用のもので、 普通の LaTeX ユーザには関係がない。
    • lualibs ― LuaTeX の Lua ライブラリ部分に対する拡張。 例えば、 文字列のパターン用エスケープ (string.esc()) やテーブルのシリアライズ (table.serialize()) 等の機能を提供する。
    • luacode ― LaTeX の特殊文字を含む Lua コードを直接書くための環境 luacode*ixbase0execluacodeblock 環境と同等) 等を提供する。
    • metalogo ― 各種の TeX ロゴ命令 (\LaTeX\XeTeX\LuaTeX 等) を提供する。 ただし、 \LuaTeX は単に 「Lua\TeX」 に過ぎないので、 これのために読み込む必要はない。 むしろ、 LuaTeX で XeTeX ロゴを書きたいときに必要? (どのエンジンでも使用可能。)
    • luatextra ― fontspec と上記のパッケージ類をまとめて読み込む。 (ただし luatexbase と lualibs に関しては fontspec が内部で読み込んでいる。)
    参考: XeLaTeX の解説で挙げられている xunicode と xltxtra の両パッケージは XeLaTeX 専用であり LuaLaTeX では使えない。 ただし、 xunicode 相当の機能は fontspec を読み込めば使用可能になっている。 (実際には fontspec は内部で xunicode を 「無理やり」 読み込んでいる。)

フォント関係の命令(fontspec パッケージ)

LuaLaTeX における fontspec パッケージの使用法は、 XeLaTeX の場合とほとんど同じであるので、 そちらの解説を参照してほしい。

以下では、 XeLaTeX との相違点について述べる。

  • XeTeX はフォントの検索を OS のフォント管理 (Windows の場合は Linux のエミュレートを間に挟む) を利用していたが、 LuaTeX は全て自前でフォントの管理を行う。 従って、 フォント (ファミリ) 名での指定で使用可能な OpenType/TrueType フォントは TeX システムが検知できるものに限られる (環境によっては OS 管理のフォントが使える場合もある)。 これは 「フォントファイル名での指定 (この場合は XeLaTeX でも同じ)」 および 「dvipdfmx のフォントマップでの指定」 での使用可能性の条件と同等である。
    参考: 従って、 W32TeX の fc-cache コマンドは LuaTeX には無関係である。 W32TeX の場合、 Windows にインストールされたフォントは 「TeX システムが検知するもの」 に含まれるので、 LuaTeX でも使えるはずである。
    注意: LuaLaTeX + fontspec でフォント名による指定を含む文書を組版する場合、 その初回に 「TeX システムが検知するフォントを全て検索して一覧を保存する」 処理 (mkluatexfontdb コマンドの実行) を行う。 この処理にはかなり時間がかかるので注意してほしい。 2 回目以降はこの処理は行われない。
  • フォントの属性指定のうち、 以下のものは LuaLaTeX では使えない。
    • Vertical=RotatedGlyphs: 縦書きの実現方法は LuaTeX では全く異なり、 それは fontspec ではサポートされていない。
    • Mapping=tex-text: 「Mapping=...」 は XeTeX 特有の機能の指定である。 代わりに Ligatures=TeX の方を使う。
    • Renderer=...: これは XeTeX が用意する複数のレンダリングエンジンの選択の指定である。 LuaTeX では OpenType 用の単一の 「レンダリングエンジン」 をもつ。

日本語する件について

前節までに述べた方法を用いると、 Unicode フォント中にある任意の文字を出力できる。 従って、 日本語フォントを指定すれば、 日本語の文字を出力することも可能である。 しかし、 このことは直ちに 「LuaLaTeX が日本語の文書の組版に使える」 ことを意味しない。 欧文 LaTeX と比較した時、 日本語の文書の組版には、 (1) 「和文文字の間では禁則を除いて行分割可能にする」 (2) 「和文と欧文でフォントを自動的に切り替える」 (3) 「和文の約物 (句読点等) の間の空白を調整する」 等の特有の処理が必要だからである。 これについては既に XeLaTeX の解説の日本語に関する節で説明しているので、 必要に応じて参照してほしい。

「体裁は度外視してとにかく日本語の文書を組版したい」 という場合、 LuaTeX は XeTeX よりも不利である。 XeTeX では(1)の機能をエンジン自体が備えていて (\XeTeXlinebreaklocalelocale 命令)、 これさえ用いれば大掛かりなマクロパッケージを用いなくともとにかく 「日本語の判読可能な文書」 を出力することが可能である。 対して、 LuaTeX の設計思想ではそのような 「言語特有の処理」 というのは 「必要に応じて Lua で実装する」 ことが求められており、 エンジン自体に組み込まれてはいない。 従って、 LuaTeX で日本語文書の組版を行おうとするとどうしても 「大きなパッケージ」 が必要になる。 その反面、 日本語の高品位な組版を追求するのであれば話は全く異なり、 「TeX の内部処理に直接手を加える」 ことができる LuaTeX の方が高品質でかつ頑強な機構を構築することが可能である。

luajalayout パッケージ

LuaLaTeX の日本語組版用パッケージとして (普通の LaTeX ユーザが) 今すぐ使えるものの中で最も完成度が高いと思われるのが luajalayout パッケージ (作者:前田一貴) である。

インストール

作者のサイトからアーカイブ (zip ファイル) をダウンロードする。 luajalauout は同じ作者による luafontcomp パッケージを必要とするので、 これも一緒に入手する。

各アーカイブについて、それを展開して現れる tex/ ディレクトリを $TEXMF/ の直下にコピーする。 (W32TeX を C:\usr\local にインストールした場合は C:\usr\local\share\texmf-local の下。) 必要に応じて mktexlsr を実行する。

その他の前提環境については、恐らく、 TeX Live 2010 (または同時期の W32TeX) 以降で fontspec が正常動作する LuaTeX があればよいと思われる。

基本的な使い方

luajalayout (+ luafontcomp) パッケージを用いる場合のプレアンブルは以下のようになる。

% パッケージ読込(luafontcomp と fontspec が内部で読み込まれる)
\usepackage{luajalayout}
% 合成フォントファミリ定義
\setrftovf[scale=0.92]{IPAMincho}{Termes+IPAM}
\setrftovf[overwrite,exclude=\jarange]{TeX Gyre Termes}{Termes+IPAM}
% メインのフォントを合成フォントに設定
\setmainfont[Ligatures=TeX]{vf:Termes+IPAM}
% \setsansfont 等についても同様に設定する

luajalayout パッケージでは和文と欧文でのフォントの自動切り替えを 「和文と欧文の合成フォントのファミリを構成する」 ことで実現している (これは LuaTeX のもつ 「仮想フォントを実行中に生成する機能」 を利用している)。 「合成フォント (仮想フォント)」 を構成する命令が (luafontcomp の) \setrftovf であり、 以下の書式をもつ。 (注意:以下では fontspec での使用を前提として説明する。)

\setrftovf[<オプション>]{<実フォント名>}{<仮想フォント名>}

この命令は、 指定の名前の仮想フォント (現在存在しなければ新たに作成する) が指定の実フォントのグリフを参照するように設定する。 (イメージとしては、 <実フォント名> のフォントのグリフを <仮想フォント名> のフォントにコピーすると考えればよい。) 同じ仮想フォントに対して続けて \setrftovf を実行し別の実フォントのグリフも参照させることで、 複数の実フォントを参照する仮想フォント (合成フォント) を構成することができる。

オプションについては、 luafontcomp パッケージの配布元のページ (「使い方」 の節) を参照されたい。 ここではいくつかの注意を述べておく。

  • luafontcomp パッケージの \jarange 命令は 「パッケージが和文扱いする文字の範囲」 (現在のところこれは固定である) を、 \setrftovf 命令の range および exclude の値に適する形式で出力する。 したがって、上の例に現れる 「overwrite,exclude=\jarange」 という指定は、 「仮想フォントの中の欧文扱いの文字に対する参照を指定の実フォントのものに変更する」 ことを意味する。
  • BXjscls パッケージの文書クラスでは、 「和文フォントに対するスケールの想定値」 がマクロ \jsScale に収められている。 従って、該当の文書クラスを用いるときは、 和文部分の実フォントを指定する \setrftovf には 「scale=\jsScale」 を指定するのが適切である。

サンプル

本サイトの 「思わず Lua で LaTeX してみた」 の冒頭の内容を LuaLaTeX 文書にしたものを挙げる。

% 文字コードは UTF-8
\documentclass[a4paper]{bxjsarticle}
\usepackage{luajalayout}
\usepackage{metalogo} % \XeTeX, \LuaTeX のため
\usepackage{mflogo} % \MF のため
% 合成フォントファミリ「Termes+IPAM」の構成
\setrftovf[scale=\jsScale]{IPAMincho}{Termes+IPAM}
\setrftovf[overwrite,exclude=\jarange]{TeX Gyre Termes}{Termes+IPAM}
% 合成フォントファミリ「Heros+IPAG」の構成
\setrftovf[scale=\jsScale]{IPAGothic}{Heros+IPAG}
\setrftovf[scale=.95,% ← Helvetica用のスケールです
    overwrite,exclude=\jarange]{TeX Gyre Heros}{Heros+IPAG}
% 総称ファミリを先に構成した合成フォントに設定する
\setmainfont[Ligatures=TeX]{vf:Termes+IPAM}
\setsansfont[Ligatures=TeX]{vf:Heros+IPAG}
% ロゴ
\newcommand{\METAFONT}{\MF}
\newcommand{\pdfTeX}{pdf\/\TeX}
\begin{document}

\title{思わずLuaで{\LaTeX}してみた}
\author{ZR}
\date{2010 年 7 月 24 日}
\maketitle

\begin{abstract}
{\LuaTeX}上で動く{\LaTeX}である{\LuaLaTeX}を使ってみる。
特に、{\LaTeX}の多少複雑な処理をLuaで({\TeX}ではなく!)
プログラミングすることで実現することに焦点を当てる。
\end{abstract}

\section{{\LuaTeX}の紹介}

\subsection{いつも通り能書きから}

{\LuaTeX}は{\TeX}の拡張の一つで、
主にTaco Hoekwater、Hartmut Henkel、Hans Hagenによって開発されている。
簡単に言うと、{\LuaTeX}は以下に挙げるものを統合して成立した
{\TeX}エンジンである。

%………(以下略)

日本語 TeX の未来を目指して

pTeX を上回る高品質の日本語組版を目指した本格的なパッケージを作成するプロジェクトが進行している。

このプロジェクトは次のような設計方針をもって進められている。

  • LuaTeX の 「TeX の内部処理に割り込む」 機構を用いて、 pTeX が内部で行っている和文処理と同等のものを実装する。 (これが他の欧文 TeX エンジン上の CJK 処理の実装と決定的に異なる点である――ただし、 LuaTeX 上の既存の実装 (luajalayout 等) も大概はこの方針に則っている。)
  • pTeX の設計の良い点は踏襲するが、 好ましくない点・不完全な点は積極的に改める。
  • 少なくとも pTeX と同等の自由度を確保する。 すなわち、 fontspec の使用を前提とするのでなく、 NFSS レベルの処理、 また pTeX のプリミティブに相当するレベルの処理も提供する。 (これが他の LuaTeX 上の実装と比した時の特徴。)

現状では、 「プリミティブに相当するレベルの処理」 の開発が行われている段階なので、 まだ LaTeX での使用は考慮されていない。 その意味で、 まだ 「普通の TeX ユーザ」 が使えるものにはなっていない。 しかし、このプロジェクトが完遂した先には、 今までとは違う日本語 TeX の世界が待っていることだろう。 pTeX の高品位の日本語組版を完全に保ったまま、 最新の TeX の機能を好きなように使えるわけである。