luaotfloadについて

luaotfload は plain LuaTeX において OpenType フォントおよび TrueType フォントを使うためのパッケージ.LuaLaTeX においても fontspec パッケージが内部で読み込む.

ファイル構成は ConTeXt 用に開発された Lua モジュールを移植した 'otfl-' から始まるファイル名のもの,luaotfload 用に書かれた otfl-font-clr.lua, otfl-font-nms.lua, otfl-luat-ovr.lua,そして plain LuaTeX 用に動作を調整する luaotfload.sty, luaotfload.lua からなる.

('otfl-' モジュール部分のマニュアルがあれば欲しいのですが,どなたかご存知ではないでしょうか? 存在しない?)

機能の概要

  • 'define_font' callback を用いて OpenType フォントを読み込めるようにする.フォント定義の syntax を以下のように拡張する(マニュアルより).
    \font\1={file:ec-lmr10} at 10pt
    \font\2={/Users/Shared/Fonts/aldus.otf} at 11pt
    \font\3={name:TeX Gyre Pagella} at 9pt
    
  • fontloader で読み込んだグリフテーブルを適切な形に処理したうえでキャッシュとして保存し,読み込みを高速化する.また,システム上のフォントデータベースを作ることでシステムのフォントを名前指定で読み込むことが可能.
  • 'pre_linebreak_filter' callback, 'hpack_filter' callback を用いることで,OpenType の feature tag やリガチャに対応する.

キャッシュについて

キャッシュの保存先についての記述は otfl-luat-dum.lua にあって,$TEXMFCACHE 以下,もし未定義ならば $TEXMFVAR 以下となっている.Unix の TeX Live 2010 の場合のデフォルトは以下のようになっている.

$TEXMFVAR=~/.texlive2010/texmf-var

各フォントのキャッシュ フォントデータベース
保存先 $TEXMFCACHE/luatex-cache/generic/fonts/otf/ 以下 $TEXMFCACHE/luatex-cache/generic/fonts/names/otfl-names.lua
保存先が記述されているファイル otfl-font-otf.lua otfl-font-nms.lua

各フォントのキャッシュについて

フォントキャッシュは otfl-data-con.lua が扱う (fonts.containers).実際のキャッシュの読み書きは otfl-luat-dum.lua に記述がある (fonts.caches).キャッシュのファイル名は temp-<font file name>.lua

キャッシュに記録されるデータは,fontloader で読み込んだグリフデータを enhancers というもので処理したものを lualibs-table の table.tofile(fullname,data,'return',false,true,false) で出力したものになる(otfl-font-otf.lua の fonts.otf.load() 参照).enhancers は例えば CID-keyed でいくつかの subfonts に分かれているものを一つのグリフテーブルにマージしたりする (otfl-font-otf.lua 内の fonts.otf.enhancers["merge cid fonts"]).このデータは font.define() にそのまま渡せるものではないことに注意が必要(例えば CID-keyed フォントの場合,glyphs というテーブルに CID 順に文字が定義されていて,Unicode をキーとして characters テーブルが定義されてはいない).実際のフォント定義の際にはキャッシュと指定されたサイズ,feature 等から適切な定義用のテーブルを生成して font.define() に渡される.

CID-keyed フォントでは異体字などの Unicode にデフォルトでは対応しない文字が多数存在するが,これらは fonts.otf.enhancers["prepare unicode"] によって Supplementary Private Use Area (U+F0000-) に移動される.

フォントデータベースについて

OpenType の feature 等への対応について

feature tag への対応等のために callback に nodes.simple_font_handler() という関数がセットされているが,これは otfl-node-dum.lua 内で定義されている.nodes.process_characters() がこの処理の本体.この関数を読むと processors というものがノードリストに適用されていることがわかるが,これを定義するのは otfl-font-otf.lua 内にある fonts.otf.set_features() で,その処理の実体は otfl-font-otn.lua に書いてある(まだ中身は読めていない).