JFMファイルの構成要素
JFMは、TFMと似たような構造になっています。TFMとの違いはつぎのとおりです。
- 先頭のファイル内のパラメータテーブルが変更されている。
- char_typeテーブルが追加されている。
- extenでなく、glueテーブルがある。
- lig/kernがglue/kernテーブルに変更されている。
JFMファイルは、ワード(4バイト)を単位としてデータが記述されています。
また、1ワード内の各バイトは、上位バイトから下位バイトの順に並べられています。
最初の7ワードは、半ワードずつに区切られ、
JFMファイルを構成する14個の要素のサイズが収められています。
これらの値は、すべて「2の15乗」よりも小さい非負の値です。
また、つぎの条件を満たしていなければなりません。
bc = 0
lf = 7 + lh + (ec - bc + 1) + nw + nh + nd + ni + nl + nk + ng + np
id …… JFM_ID番号(横組用では11、縦組用では9)
nt …… char_typeテーブルのワード数
lf …… ファイルのワード数
lh …… headerのワード数
bc …… フォント内に含まれる一番小さなコード(JFMでは必ずゼロ)
ec …… フォント内に含まれる一番大きなコード
nw …… widthテーブルのワード数
nh …… heightテーブルのワード数
nd …… depthテーブルのワード数
ni …… italicテーブルのワード数
nl …… glue/kernテーブルのワード数
nk …… kernテーブルのワード数
ng …… glueテーブルのワード数
np …… paramテーブルのワード数
header
char_type
char_info
width
height
depth
italic
glue/kern
kern
glue
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]などと呼びます。
漢字の文字コードとchar_typeとの対応付けを行ないます。
このテーブルの各エントリは1ワードで構成され、上位半ワードに漢字文字コード、
下位半ワードにchar_typeを持っています。
また、このテーブルの先頭には、デフォルトのインデックスとして、
漢字コードおよびchar_typeがゼロのものが必ず存在します。
テーブルの2番目以降には、デフォルト以外の属性を持つ文字コードと
char_typeが、漢字コードの値の順番に収められています。
このテーブルに登録されていない文字はchar_type=0として扱われます。
テーブル内の各ワードは、つぎのような構造になっています。
bcからecまでのchar_typeに対する
各パラメータのインデックスが1ワードにパックされ記述されています。
JFMでは、bcは必ずゼロですから、1つのJFMに含まれる
char_infoは全部でec+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は、その文字がglue_kern[remainder]から開始するglue/kerningプログラムを持っていることを意味しています。
- tag=2は使用していません。
- tag=3も使用していません。
- width[0..nw-1] …… 文字の幅
- height[0..nh-1] …… 文字の高さ
- depth[0..nd-1] …… 文字の深さ
- italic[0..ni-1] …… イタリック補正値
それぞれの値は、デザインサイズの「2の-20乗」倍が1単位です。
これらの値は、char_infoからのインデックスにより参照されます。
glue_kernには、特定のchar_typeの組合せのときに、
挿入するglueまたはkernが簡単なプログラム構造として含まれています。
- skip_byteは、
この値が128以上のときはプログラムの終了を示します。
それ以外のときは、次のステップまでスキップする値を示します。
- char_typeは、
現在の文字のchar_typeに、このchar_typeの文字が続いて
いれば、オペレーションを実行し、終了します。
そうでなければ、次のステップに進みます。
- op_byteは、この値が128より小さければグルーステップです。
そうでなければカーンステップになります。
- remainderは、
グルーステップであれば、remainder*3がglueテーブルへの
インデックスとなり、カーンステップであればkernテーブルへの
インデックスとなります。
glue/kernプログラムで用いるカーニング量です。
デザインサイズの「2の-20乗」が1単位です。
glue/kernプログラムで用いるグルー量です。
デザインサイズの「2の-20乗」を1単位として、
自然長、伸び長、縮み長の3ワードで記述されています。したがって、
ngは必ず3の倍数になります。
JFMファイルの最後はparam部です。
param[1]は、純粋に「2の-20乗」を単位としており、
デザインサイズの影響を受けません。それ以外のパラメータは、
デザインサイズの「2の-20乗」を単位として記述されています。
- param[1] …… 文字の傾き
- param[2] …… 漢字間の理想的なスペース量
- param[3] …… 漢字間のスペースの伸び量
- param[4] …… 漢字間のスペースの縮み量
- param[5] …… 日本語TeXでzhで参照される長さ
- param[6] …… 日本語TeXでzwで参照される長さ
- param[7] …… 漢字と英字間の理想的なスペース量
- param[8] …… 漢字と英字間の理想的な伸び量
- param[9] …… 漢字と英字間の理想的な縮み量
[pTeX home page]
[TFM,JFMの目次]