フォントツール(仮想フォント / 一覧)

ほとんどの執筆者は .vf ファイルを直接さわることはありません。けれどフォントを作る・組み込む側に回ると、論理フォントを実フォントへ橋渡しする 仮想フォント、和文の字幅と約物の空きを記述する JFM(和文用フォントメトリック)、そしてフォントに何が入っているかを一覧する 字形テーブルの出力ツール が要りようになります。このページは、そうしたフォント開発者・上級者向けの低水準ユーティリティを扱います。

仮想フォント — 論理フォントを実フォントへ橋渡しする

**仮想フォント(virtual font、.vf は、TeX が見る 1 つの論理フォントを、実際の字形や低水準の組版命令の列へ対応づける「層」です。TeX FAQ の言葉を借りれば、仮想フォントは「あちこちの断片を寄せ集めてフォントの字形を作る手段」であり、その断片は 別のフォント・罫線・位置指定つきの組版命令 から取ってこられます。これにより、字の並び順を 差し替える(リマップ)、複数のフォントを 1 つに束ねる、スモールキャップスを 疑似的に作る、数式フォントの部品を 寄せ集めて 1 書体に仕立てる** といったことができます。

仕組みは役割分担になっています。TeX 本体は、字幅・高さ・深さといった 寸法だけ を知ればよく、それは付属の **.tfm(TeX Font Metric) から読みます。一方、各字形を「実際にどう描くか」——どのフォントのどの位置の字を、どれだけずらして置くか——は .vf に書かれ、これを読むのは DVI ドライバ です(dvips や dvipdfmx)。つまり仮想フォントは 常に .tfm.vf の 2 つで 1 組**。TeX は .tfm で組版位置を決め、ドライバが .vf を展開して実フォントへ流し込みます。

バイナリの .vf は人が読み書きするものではないので、対になる **人間可読のテキスト形式 .vpl(Virtual Property List) があります。これは入れ子の「プロパティリスト」で書かれ、フォントの細部を手で記述・確認するのに向きます。両形式を相互変換するのが次の 2 つのプログラムで、どの TeX ディストリビューションにも含まれています(fontware** 由来の vptovfvftovp)。

  • vptovf** — .vpl(テキスト)→ .vf.tfm(バイナリ)。手で書いた・編集した仮想フォントの記述を、TeX とドライバが使える形に焼き直します。
  • vftovp** — .vf.tfm(バイナリ)→ .vpl(テキスト)。既存の仮想フォントを 読み解いて中身を確認・編集 するために、人間可読へ戻します。

引数の順序は覚えておく価値があります。vftovp仮想フォント・メトリック・出力 の順、vptovf記述・仮想フォント・メトリック の順で、いずれも拡張子は省略でき、それぞれ .vf / .tfm / .vpl が補われます。たとえば既存の仮想フォントを読み解くなら次のようにします。

terminal
# 仮想フォントを人間可読の VPL に戻して中身を見る
# Turn a virtual font back into a readable VPL to inspect it
vftovp font.vf font.tfm font.vpl

# 編集後、VPL から .vf と .tfm を作り直す
# After editing, rebuild the .vf and .tfm from the VPL
vptovf font.vpl font.vf font.tfm

できあがった .tfm.../fonts/tfm/<供給元>/.vf.../fonts/vf/<供給元>/ という texmf ツリーの定位置に置き、mktexlsr でファイル名データベースを更新すると、kpsewhich font.vf のように検索できるようになります。なお、PostScript フォントから仮想フォントを生成する現代的な作業では、.vpl を直接手書きするより **fontinst を使うのが一般的です。仮想フォントは「自分で一から書く」よりも、こうしたツールが吐いた結果を 読み解き、微調整する** 対象だと考えると実態に近いでしょう。

JFM — 和文用フォントメトリック

和文の組版には、欧文の .tfm では足りないものがあります。漢字や仮名は基本的に 正方形(全角)の枠 に収まり、字と字の間は欧文のように単語間スペースで空けるのではなく、約物(句読点・括弧)の前後でだけ詰めたり空けたりする からです。この情報を担うのが JFM(Japanese Font Metric、和文用フォントメトリック) です。pTeX・upTeX では .tfm に似たバイナリの JFM ファイルを使い、LuaTeX-ja では同じ役割を Lua のテーブル で記述します。

欧文 TFM との一番の違いは、JFM が 文字を「文字クラス(character class)」にまとめて扱う ことです。LuaTeX-ja のマニュアルが定めるとおり、JFM の寸法はすべて デザインサイズを単位とする浮動小数点数 で書かれ、zw(全角の幅)・zh(全角の高さ=height+depth)を基準に、各文字クラスごとに widthheightdepthitalic(イタリック補正)を与えます。クラス 0 は必ず存在し、他のどのクラスにも属さない大多数の和文文字がここに入ります。約物などは別クラスに分け、クラスとクラスの間に挿入するグルー/カーン を表で持たせる——これが「字間や約物まわりの空き」を生む仕組みです。

pTeX 系では、和文の JAglue(和文文字どうし・和文と欧文の間に入る空き)が組版時に自動挿入されます。クラス間の空きは JFM が決め、クラス指定のない和文どうしには既定の kanjiskip、和文と欧文の境には xkanjiskip が入ります。後者は禁則処理(行頭・行末に来てはいけない文字の制御)と並んで、和文組版の体裁を支える中核です。LuaTeX-ja の JFM ファイルは、頭で luatexja.jfont.define_jfm{ ... } をただ 1 回呼ぶ Lua スクリプトで、次のような骨格をしています。

latex
-- LuaTeX-ja の JFM(抜粋)。寸法はすべてデザインサイズ単位
-- A LuaTeX-ja JFM (excerpt); all lengths are in design-size units
luatexja.jfont.define_jfm {
  version = 3,
  dir = 'yoko',          -- 横組み / horizontal
  zw = 1.0, zh = 1.0,     -- 全角の幅・高さ / full-width, full-height
  [0] = {                -- 文字クラス 0:大多数の漢字・仮名 / class 0: most kanji & kana
    chars = { '漢' },
    width = 1.0, height = 0.88, depth = 0.12, italic = 0.0,
  },
  [1] = {                -- 句点など別クラス / a class for stops, etc.
    chars = { '。', '、' },
    width = 0.5, height = 0.88, depth = 0.12, italic = 0.0,
  },
}

LuaTeX-ja には用途別の標準 JFM が付属します。jfm-ujis.lua は upTeX 用メトリック upnmlminr-h.tfm を基にした標準(多くの字が正方形)、jfm-jis.lua は pTeX で広く使われる jis.tfm 相当(字が横長の長方形になりがち)、jfm-min.lua は pTeX 既定の min10.tfm 相当です。フォント定義では \jfont\F=HaranoAjiMincho-Regular:jfm=ujis のように jfm= で指定します。なお pTeX 系のバイナリ JFM は、欧文の pltfm を扱う pltotftftopl の和文版にあたる ppltotfptftopl でテキストと相互変換できます。

フォントの中身を一覧する — fonttable と nfssfont

フォントに実際どの字形が入っているかを確かめるには、字形テーブル(フォント表) を出力します。文書の中から手軽に出せるのが **fonttable パッケージ** で、その中心命令 \fonttable{<font>} は、指定したフォントの 全字形を表に並べて 組版します。引数はフォント(正確には .tfm)の名前で、Computer Modern Roman なら cmr10、Zapf Dingbats なら pzdr のように与えます。

document.tex
\documentclass{article}
\usepackage{fonttable}
\begin{document}
% フォント名(.tfm)を渡すと全字形の表が出る
% Pass a font (.tfm) name to get a table of every glyph
\fonttable{cmr10}

% NFSS の 4 属性で指定する版(エンコーディング/ファミリ/シリーズ/シェイプ)
% The NFSS-attribute version (encoding/family/series/shape)
\xfonttable{T1}{cmr}{m}{n}
\end{document}

NFSS の 4 属性で指定したいときは **\xfonttable{<エンコーディング>}{<ファミリ>}{<シリーズ>}{<シェイプ>}** を使います(たとえば \xfonttable{T1}{cmr}{m}{n})。表の文字範囲は \fontrange{<下限>}{<上限>} で 16 字ブロック単位に絞れ、最大 256 字形まで並びます。\fonttext{<font>} を使えば、字形表ではなく そのフォントで組んだ例文 を出せるので、実際の見え方の確認に向きます。

この fonttable は、もともと TeX に付属する古典的ツール **nfssfont.textestfont.tex** を、パッケージとして使えるようにしたものです(パッケージのコードの多くは nfssfont.tex の改変版で、字形テストの命令群は Knuth の testfont.tex の再実装)。古典版は対話的に動くのが特徴で、たとえば tex nfssfont で起動し、フォント名(cmr10 など)を入力、\table で表を出力、\init で別フォントへ、\bye で終了、という流れになります。

terminal
# 古典的な対話ツール:起動 → フォント名 → \table\bye
# The classic interactive tool: launch, name the font, \table, \bye
tex nfssfont
# Name of font to test = cmr10
# *\table
# *\bye

関連して、いま使っているフォントの素性をログに出すには **\showfont**(現在のフォントの NFSS 5 属性——エンコーディング・ファミリ・シリーズ・シェイプ・サイズ——を表示)が使えます。フォント読み込みの挙動そのものを追いたいときは tracefnt パッケージが便利です。最後に、システムに何がインストールされているか・どこから読まれているかを調べるには、フォントマップを管理する **updmap と、ファイルの実体を探す kpsewhich**(例:kpsewhich cmr10.tfm)が出発点になります。