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
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部には、最低限「チェックサム(check sum)」と
「デザインサイズ(design size)」の2ワードが収められている必要があります。
TeXはここまでの情報を使いますが、Xeroxの印刷ソフトウェアなどで用いるTFMには、
最低限18ワードが必要です。
- header[0]
32ビットのチェックサムを表し、この情報がそのままDVIファイルに収められます。
この情報は、TeXの使用したTFMファイルと、印字に使用しようとしている
GFなどのグリフファイルが整合のとれたものかどうかを
デバイスドライバが確認するためのものです。
ただし、そのフォントファイルかこのTFMファイルのチェックサムのいずれかが
ゼロの場合はチェックは行なわれません。
- header[1]
フォントのデザインサイズ(ポイント数)を「2の-20乗」を1単位として表した
数値です。最小値は1.0です。
よく使われるデザインサイズは``10ポイント''フォント用の10.0です。
これは、このフォントが10ポイントサイズで使われるときに最適になるように
デザインされているということです。
TeXのユーザが`at δ pt'とした場合、その他のパラメータはその比率
(δをデザインサイズで割った値)で拡大されます。
10pt用のフォントがat 15ptで呼び出されると、それぞれのパラメータが
「15/10.0=1.5」倍となるということです。
TFMファイルでのサイズは、すべてこのデザインサイズを単位にしています。
したがって、たとえば1emまたは\quadを示すparam[6]には、
しばしば、2^{20}=1.0が収められています。
そのために多くのフォントはデザインサイズと1emが同じになっています。
その他の寸法は、その絶対値が16デザインサイズ単位よりも小さくなります。
先頭バイトが0か255のいずれかのTFMファイルの中で、
header[1]とparam[1]だけが「2の-20乗」を基準にしています。
- header[2..11]
もしあれば、文字コーディングスキーマを示す40バイトが収められています。
先頭バイトは0から39まであり、この文字列の中に入っている実際に意味の
あるバイト数を示しています。
文字列には、このフォントで表されている文字コードの種類が記述されています。
たとえば、ASCIIは標準ASCIIコード、
TeX textはcmr10やcmti9のようなTeXフォント、
TeX math extensionはcmex10やcmex10のようなTeX数式用フォント、
XEROXはXeroxフォント、GRAPHICは特別な目的の非アルファベットフォント、
UNSPECIFIEDはこの部分が未定義のデフォルト値です。
この文字列の中に丸括弧が現れることは決してありません。
- header[12..16]
もしあれば、`CMR'や`HELVETICA'といったフォントファミリーの名前が
20バイト収められています。このフィールドは``フォント識別子''とも呼ばれます。
- header[17]
もしあれば、次のような情報が入っています。
1バイト目 seven_bit_safe_flag
2バイト目 未定義
3バイト目 未定義
4バイト目 face
4バイト目のfaceが18よりも小さい数値ならば、
``ウェイト、斜体、長体/平体''を表しています。
0, 2, 4(ミディアム、ボールド、ライト)のいずれかと
0, 1(斜体なし、斜体)のいずれかと
0, 6, 12(正体、長体、平体)のいずれかを足したものです。
たとえば、13ならば0+1+12となり、このフォントが
「ミディアムで斜体で平体」であることを示しています。
- header[18以上]
この部分もあるかもしれません。とりあえずこの部分はheader[18],
header[19]などと呼びます。
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ビット)
|
実際の文字幅はwidth[width_index](デザインサイズ単位)で
示されています。TFMファイルは、256種類の文字幅を持つことができますが、
高さと深さは16種類、イタリック補正値は64種類しか持つことはできません。
なお、width[0]=height[0]=depth[0]=italic[0]=0という
関係は、いつでも保たれているので、あるインデックスがゼロの場合は、その他の値も
ゼロであることを意味します。
また、width_indexは、その文字がそのフォントに含まれている限りは、決して
ゼロにはなりません。したがって、
ある文字が有効であるならば、その文字はbcとecの間にあり、
非ゼロのwidth_indexを持っています。
tagフィールドは、remainderフィールドをどのような目的で使うかを
示しています。
- tag=0は、remainderを使わないことを意味しています。
- tag=1は、その文字がlig_kern[remainder]から開始する
ligature/kerningプログラムを持っていることを意味しています。
- tag=2は、その文字が、より適切なサイズの文字へのリンクの一部で
あることを示しています。
そのremainderフィールドには、次に大きな文字のコードが格納されています。
- tag=3は、その文字コードが、小さな部品を組み合わせて大きな文字に
するための、伸張可能な文字であることを意味しています。
それらの部品はexten[remainder]に記述されています。
- width[0..nw-1] …… 文字の幅
- height[0..nh-1] …… 文字の高さ
- depth[0..nd-1] …… 文字の深さ
- italic[0..ni-1] …… イタリック補正値
それぞれの値は、デザインサイズの「2の-20乗」倍が1単位です。
これらの値は、char_infoからのインデックスにより参照されます。
lig_kernには、特別な文字の組合せのときに行なう動作が、
簡単なプログラム構造として含まれています。
- skip_byteは、
この値が128以上のときはプログラムの終了を示します。
それ以外のときは、次のステップまでスキップする値を示します。
- next_charは、
現在の文字にnext_charが続いていれば、オペレーションを実行し、
終了します。これ以外の場合は、次のステップに進みます。
- op_byteは、この値が128より小さければ合字ステップです。
そうでなければカーンステップになります。
- remainderは、カーンステップの場合、
kern[256*(op_byte-128)+remainder]の量の追加スペースを
現在の文字の後ろに挿入します。
この量は、文字を近付けるために負になる場合もあります。
合字ステップには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の値はbcとecの間にある必要はありません。
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でなくてはいけません。
もし、そのような命令が通常のプログラムに入っているならば、
無条件に停止し、いかなる合字コマンドも実行されません。
lig/kernプログラムで用いるカーニング量です。
デザインサイズの「2の-20乗」が1単位です。
- exten[0..ne-1] …… 組み合わせ文字のコード
組み合わせ文字に使われる文字コードが格納されており、各ワードはつぎの
構造になります。
接続パーツ以外の、各パーツのコードには、そのパーツが不必要ならば0が入ります。
TFMファイルの最後はparam部です。この部分はfix_wordの別の並びです。
- param[1] …… slant
文字の傾いている量を示し、アクセントの出力位置を補正するのに使われます。
slant=.25は、1単位上に移動するとき、同時に.25単位だけ右にも
移動することを示しています。この数値は、純粋に「2の20乗」を単位としており、
デザインサイズの影響を受けません。
- param[2] …… space
単語間の通常のスペースの量を示します。フォント内にある
`\spacechar'は空白を空けること以外に、何もする必要がないことに注意をしてください。
- param[3] …… space_strech
単語間のスペースの伸び量を示します。
- param[4] …… space_shrink
単語間のスペースの縮み量を示します。
- param[5] …… x_height
上げたり下げたりの必要のないアクセント用の文字の高さを示しています。
- param[6] …… quad
このフォントの1emの長さです。
- param[7] …… extra_space
文の終わりでparam[2]に加える量を示しています。
コーディングスキーマが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の目次]