TFMファイルの構成要素

TFMファイルは、ワード(4バイト)を単位としてデータが記述されています。 また、1ワード内の各バイトは、上位バイトから下位バイトの順に並べられています。

最初の6ワードは、半ワードずつに区切られ、TFMファイルを構成する12個の 要素のサイズが収められています。

これらの値は、すべて「2の15乗」よりも小さい非負の値です。 また、つぎの条件を満たしていなければなりません。

    bc-1 ≦ ec ≦ 255, ne ≦ 256
lf = 6 + lh + (ec - bc + 1) + nw + nh + nd + ni + nl + nk + ne + np


figure of tfm lf …… ファイルのワード数
lh …… headerのワード数
bc …… フォント内に含まれる一番小さなコード
ec …… フォント内に含まれる一番大きなコード
nw …… widthテーブルのワード数
nh …… heightテーブルのワード数
nd …… depthテーブルのワード数
ni …… italicテーブルのワード数
nl …… lig/kernテーブルのワード数
nk …… kernテーブルのワード数
ne …… extenテーブルのワード数
np …… paramテーブルのワード数

header
char_info
width
height
depth
italic
lig/kern
kern
exten
param


■header

header部には、最低限「チェックサム(check sum)」と 「デザインサイズ(design size)」の2ワードが収められている必要があります。 TeXはここまでの情報を使いますが、Xeroxの印刷ソフトウェアなどで用いるTFMには、 最低限18ワードが必要です。

■char_info

TFMファイルには、コードがbcからecまでの $bc-ec+1$文字が含まれています。char_infoには、 1文字ごとに各パラメータテーブル内のインデックスが1ワードにパックされ 記述されています。1文字分のchar_infoは、つぎの6つのフィールドを 持っています。
  • width_index (8ビット)
  • height_index (4ビット)
  • depth_index (4ビット)
  • italic_index (6ビット)
  • tag (2ビット)
  • remainder (8ビット)
charinfo

実際の文字幅はwidth[width_index](デザインサイズ単位)で 示されています。TFMファイルは、256種類の文字幅を持つことができますが、 高さと深さは16種類、イタリック補正値は64種類しか持つことはできません。

なお、width[0]=height[0]=depth[0]=italic[0]=0という 関係は、いつでも保たれているので、あるインデックスがゼロの場合は、その他の値も ゼロであることを意味します。 また、width_indexは、その文字がそのフォントに含まれている限りは、決して ゼロにはなりません。したがって、 ある文字が有効であるならば、その文字はbcecの間にあり、 非ゼロのwidth_indexを持っています。

tagフィールドは、remainderフィールドをどのような目的で使うかを 示しています。


■width, height, depth, italic

それぞれの値は、デザインサイズの「2の-20乗」倍が1単位です。 これらの値は、char_infoからのインデックスにより参照されます。


■lig/kern

ligkern

lig_kernには、特別な文字の組合せのときに行なう動作が、 簡単なプログラム構造として含まれています。

合字ステップには8種類があり、 4a+2b+c (0≦a≦b+c かつ 0≦b,c≦1)のop_byteになっています。 a, b, c の取る値の組合せをつぎに示します。 また、参考にプロパティリストでの表記も示します。

    a   b   c   4a+2b+c   PLtoTF
    0   0   0     0         LIG
    0   0   1     1         LIG/
    0   1   0     2        /LIG
    0   1   1     3        /LIG/
    1   0   1     5         LIG/>
    1   1   0     6        /LIG>
    1   1   1     7        /LIG/>
    2   1   1    11        /LIG/>>
合字ステップでは、まず、現在の文字と次の文字の間に remainderコードの文字を挿入します。 そして、b=0の場合は、現在の文字を削除します。 そして、c=0の場合は、next_charを削除します。 そして、a文字をスキップし、つぎの文字に到達します (その文字もligature/kerningプログラムを持っているかもしれません)。

a=0 かつ b=1 のとき、現在の文字が変更されないことに注意してください。 また、a=b かつ c=1 のときは、現在の文字が変わり、next_charは変更されません。

lig_kern配列の最初の命令がskip_byte=255の場合、 next_charバイトは、そのフォントの右バウンダリ文字と呼ばれます。 next_charの値はbcecの間にある必要はありません。

lig_kern配列の最後の命令がskip_byte=255の場合、 それは256*op_byte+remainderから始まる、 左バウンダリ用の特別なlig_kernプログラムです。

ある文字のlig_kernプログラムの最初の命令がskip_byte>128の場合、 実際には、そのプログラムは256*op_byte+remainderの位置から開始します。 この機能によって、大きなig_kern配列にアクセスすることができます。 その理由は、最初の命令は>=255以外の位置でなければならないためです。

lig_kern配列内のskip_byte>128である他の命令は、 256*op_byte+remainder<nlでなくてはいけません。 もし、そのような命令が通常のプログラムに入っているならば、 無条件に停止し、いかなる合字コマンドも実行されません。


■kern

lig/kernプログラムで用いるカーニング量です。 デザインサイズの「2の-20乗」が1単位です。


■exten

組み合わせ文字に使われる文字コードが格納されており、各ワードはつぎの 構造になります。 接続パーツ以外の、各パーツのコードには、そのパーツが不必要ならば0が入ります。

exten


■param

TFMファイルの最後はparam部です。この部分はfix_wordの別の並びです。 コーディングスキーマがTeX math symbolsの場合は、 さらに次の15個のパラメータが加えられます。
    num1, num2, num3, demon1. demon2, sup1, sup2, sup3,
    sub1, sub2, supdrop, subdrop, dimen1, dimen2, axis_height
また、コーディングスキーマがTeX math extensionの場合は、 次の6個のパラメータが加えられます。
    default_rule_thickness, big_op_spacing1 から big_op_spacing5


[pTeX home page] [TFM,JFMの目次]