LuaTeX は、pdfTeX を拡張した上に Lua スクリプト言語 を組み込んだ TeX エンジンです。組版の途中で Lua のプログラムを呼び出し、TeX が組み立てた中身そのものに手を入れられる——この自由度の高さから、TeX の将来を担うエンジンとみなされています。lualatex として起動し、Unicode・OpenType フォントをそのまま扱えます。
LuaTeX とは
LuaTeX は Taco Hoekwater、Hartmut Henkel、Hans Hagen らによって開発されました。出自は ConTeXt と Oriental TeX プロジェクトの周辺で、「開いていて改造しやすい TeX」を目標に、pdfTeX に下位互換を保ちつつ作られています。pdfTeX を土台にしているので、PDF を直接出力 し、e-TeX の拡張機能と pdfTeX の組版機能の大半を引き継いでいます。
pdfTeX 由来の機能の多くは、\pdfextension・\pdfvariable・\pdffeedback という 3 つの インターフェース用プリミティブ を通して呼び出す形に整理されました。キーワードと引数を渡す仕組みなので、エンジン本体を改造せずに機能を足していけます。ふだんは LaTeX のパッケージがこの差を吸収するため、利用者がこれらを直接書く場面はそう多くありません。
もう一つの柱が、組み込みの Lua 5.3 インタプリタ です。.tex の中に \directlua{...} と書くと、その中の Lua コードがその場で実行されます。入力は ネイティブで UTF-8。フォントは XeTeX と同じように fontspec で OS や OpenType のフォントを直に指定できますが、その読み込みは LuaTeX 独自の Lua 製ローダ(luaotfload)が担います。
Lua を文書に埋め込む
\directlua{...} は Lua コードを すぐに 実行します。Lua 側から tex.print(...) を呼ぶと、その出力が TeX の入力ストリームへ戻され、ふつうに組版されます。次は、lualatex でコンパイルできる最小の例です。2 の 10 乗を Lua に計算させて本文に流し込みます。
\documentclass{article}
\begin{document}
Two to the tenth power is
\directlua{tex.print(2^10)}.
\end{document}コンパイルすると「Two to the tenth power is 1024.」と組まれます。似た命令に \latelua{...} があり、こちらは そのページが出力(シップアウト)される時点 で実行されます。ページ番号や最終的な座標が確定してから動かしたい処理——たとえば PDF への描画や注釈の付加——に向いています。
生の \directlua は中括弧や特殊文字の扱いに気を使う必要があるため、実際には luacode パッケージの luacode 環境を使うと、長い Lua コードをそのまま書けて安全です。
コールバック——組版の途中に割り込む
LuaTeX の真価は コールバック(callback) にあります。TeX は文字や箱(ボックス)やグルー(伸縮する空白)を ノード(node) という単位の連結リストとして組み立てますが、コールバックを登録しておくと、その節目ごとに自分の Lua 関数が呼ばれ、ノードリストを 検査・改変 できます。組版エンジンの内部に、安全な形で手を入れられるということです。
よく使われるコールバックには次のようなものがあります。process_input_buffer は入力行を 1 行読むたびに呼ばれ、文字列を受け取って文字列を返します。pre_linebreak_filter は段落が行分割される 直前、post_linebreak_filter は 直後 のノードリストを渡します。ligaturing・kerning は合字とカーニングの処理段階に対応します。
| コールバック | 呼ばれる場面 |
|---|---|
process_input_buffer | 入力行を 1 行読むたび。前処理に |
pre_linebreak_filter | 段落を行に分割する直前のノードリスト |
post_linebreak_filter | 行分割が終わった直後のノードリスト |
ligaturing / kerning | 合字・カーニングを作る処理段階 |
これらの操作は、Lua から見える一連のテーブルを通して行います。tex は TeX の内部状態(レジスタや寸法)への窓口、node はノードの生成・走査・解放、token はトークン(TeX の最小の意味単位)、font はフォント情報、status は実行時の各種情報を扱います。luaotfload のような高度なフォント機能も、これらの上に Lua で書かれています。
フォント——fontspec で指定する
XeTeX と同様、LuaTeX では fontspec パッケージを読み込めば、システムにインストールされた OpenType / TrueType フォント を名前で直接指定できます。\setmainfont で本文フォント、\setsansfont・\setmonofont でサンセリフ・等幅を選びます。
\documentclass{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}
\begin{document}
This text is set in an OpenType font, with ligatures like ffi.
\end{document}裏側では luaotfload がフォントを読み込みます。これは ConTeXt のフォントローダを Plain TeX と LaTeX 向けに移植したもので、合字・オールドスタイル数字・小型大文字といった OpenType 機能を引き出せます。XeTeX との互換性も意識されており、LaTeX チームの latex3 が保守しています。
MetaPost を内蔵する
LuaTeX には MPlib——MetaPost の描画エンジンをライブラリ化したもの——が組み込まれています。外部プログラムを呼び出さずに、コンパイルと同じプロセスの中で MetaPost の図を生成できるということです。LaTeX からは luamplib パッケージがこの機能を露出させ、mplibcode 環境の中に MetaPost のコードをそのまま書けます。
日本語——LuaTeX-ja
日本語組版は LuaTeX-ja(パッケージ名 luatexja)が引き受けます。pTeX が持っていた日本語組版の知見——縦書き、JFM(和文フォントメトリック) による文字間の詰め・約物の処理、和欧文間の空き——を、コールバックを使って Lua の側で実現しています。これにより、pLaTeX/upLaTeX とは別の、現代的な日本語 LaTeX の経路 が開けます。
luatexja-fontspec を使えば、和文フォントも fontspec 流の書き方で選べます。LuaTeX-ja は LuaTeX 1.10.0 以降と、新しめの luaotfload を必要とします。pdfLaTeX 系の upLaTeX が「枯れた定番」だとすれば、LuaLaTeX + LuaTeX-ja は「これから新規に始めるなら有力」な選択肢です。
LuaJITTeX と LuaMetaTeX
LuaJITTeX は、素の Lua の代わりに LuaJIT(実行時にコードを機械語へ変換する just-in-time コンパイラ)をリンクした派生版です。Lua の実行が速くなる一方、LuaJIT は言語仕様が Lua 5.1 に固定 されたままで(本家 LuaTeX は 5.3)、保守も活発とは言いがたい状況です。Lua の処理が極端に重い特殊な用途を除けば、ほとんどの利用者は通常の LuaTeX を使えば十分です。
もう一つの後継が LuaMetaTeX です。LuaTeX をさらに削ぎ落として作り直した「lean and mean」なエンジンで、現代の ConTeXt(LMTX / MkXL)の土台になっています。新しい数式組版や多数のプリミティブを備え、Lua 5.4 系を採用。TeX Live 2023 以降に同梱されています。LaTeX のために使うなら通常は LuaTeX、ConTeXt の最新版を使うなら LuaMetaTeX、という住み分けです。
長所と短所
XeTeX と LuaTeX はどちらも Unicode と OpenType を扱えますが、性格が違います。XeTeX が OS のテキストレイアウト機構に寄せた手軽さを持つのに対し、LuaTeX は すべてを Lua で制御できる 分だけ柔軟です。代償として、歴史的には XeTeX より やや遅い 傾向がありました(近年は差が縮まっています)。
- Unicode / OpenType が前提。 UTF-8 入力と
fontspecが標準的に使えます。 - プログラム可能。 Lua とコールバックで、組版の内部に踏み込めます。
- 自己完結。 MetaPost(MPlib)を内蔵し、外部呼び出しなしで図を描けます。
- 日本語に対応。 LuaTeX-ja で縦書き・JFM を含む本格的な和文組版ができます。
- 将来性。 LaTeX チームは新規開発の対象を LuaTeX に置いています。
総じて、プログラマビリティが要る Unicode / OpenType の新規ワークフロー では LuaLaTeX が既定の選択肢になりつつあります。フォントを手軽に使いたいだけなら XeLaTeX、欧文中心で手早くまとめたいなら pdfLaTeX、という従来の使い分けは引き続き有効です。どのエンジンを選ぶかは「エンジンの選び方」のページで整理します。