DVIフォーマット
DVIファイルは、ファイルの先頭から順に、
プリアンブル部、ページ記述部、ポストアンブル部で構成されます。
- プリアンブル部
-
1つのpre命令だけで構成されます。
DVIファイルのフォーマット・バージョンやコメントのほか、
そのファイルで使用する単位を設定します。
- ページ記述部
-
プリアンブル部とポストアンブル部の間に、ページ数の分だけ置かれます。
各ページは bop 命令で始まり、eop 命令で終ります。この間に、
フォントの定義や切替え、カレントポイントの移動、文字や罫線の描画などの
命令がはいります。
ページ記述部の最初の部分(bop命令)では、さまざまな初期化を行います。
(h,v,w,x,y,z) レジスタにそれぞれ0を代入し、
それらを退避するためのスタックを空の状態にします。
また、f レジスタをフォントが選択されていない状態にします。
なお、各レジスタの意味は次のとおりです。
レジスタ | 意味 |
h | カレントポイントの水平位置 |
v | カレントポイントの垂直位置 |
w, x | 水平移動量 |
y, z | 垂直移動量 |
f | カレントフォント |
カレントポイント (h,v) は、用紙の上から1インチ、左から1インチを座標系の
原点とした位置です。h は右方向、v は下方向で大きくなります。
ただし、縦組の場合は移動方向が変わります。
- ポストアンブル部
-
post命令、
複数のフォント定義(fnt_def命令)、
post_post命令とで構成されます。
フォント定義は、そのファイルで、はじめて使われるときに、
ページ記述部に現れます。そして、ポストアンブル部では、
それらのフォント定義がまとめられています。
つまり、フォント定義は、ページ記述部とポストアンブル部の両方に
1回ずつ出現します。
■DVI命令一覧
DVI命令は、1バイトの命令とそれに続く0バイト以上のパラメータで構成されます。
1バイト以上のパラメータは、最初のバイトが最上位、
最後のバイトが最下位の順序で格納されます。
パラメータにはいくつかの型があります。
- unsinged
- 1バイトでは0〜255、2バイトでは0〜65535、3バイトでは0〜2^{24}、
4バイトでは0〜2^{31}の範囲の数値を扱います。
- singed
- 2の補数表現で負の数を表します。
1バイトでは-128〜127、2バイトでは-32768〜2767、
3バイトでは-2^{24}〜2^{24}-1、
4バイトでは-2^{31}〜2^{31}-1の範囲の数値を扱います。
- dimension
- dimensionはsigned(符号あり)のデータです。
単位はpre命令、post命令で与えます。
通常、TeXで生成するDVIでは1sp(2^{-16}pt)が単位となっています。
- pointer
- DVIファイル内の位置をファイルの先頭からのバイト数で表します。
ファイルの最初のバイトは0で表します。pointerが-1の場合は、
「何も指していない状態(null)」を表します。
- string
- ASCII文字列です。文字列の長さはunsinedで記述します。
以下にDVI命令を示します。
- 命令のコード(10進数) … DVI命令 {引数[引数のバイト数]}
- 意味
- 0 〜 127 … set_char_0 〜 set_char_127
-
set_char_# は、フォント f のコード番号 # の文字を、
ページ上の (h,v) の位置とその文字のリファレンスポイントが
一致するように印字します。そして、その文字の幅の分だけ h を増加させます。
文字幅がゼロより小さい場合、h は減少します。
- 128 … set1 c[1]
- 129 … set2 c[2]
- 130 … set3 c[3]
- 131 … set4 c[4]
-
コード番号が c の文字を印字する以外は、set_char_0 と同じです。
pTeXでは、set2命令を使って漢字(JISコード)を指定します。
- 132 … set_rule a[4] b[4]
-
(h,v) の位置に左下を置き、高さ a、横幅 b の黒い四角を描きます。
そして、h を h+b にします。
a あるいは b がゼロ以下の場合、何も描くべきではありません。
b<0 では何も起こりませんが、h は減少することに注意してください。
a と b は dimension です。
- 133 … put1 c[1]
- 134 … put2 c[2]
- 135 … put3 c[3]
- 136 … put4 c[4]
- 137 … put_rule a[4] b[4]
-
`put' コマンドは、文字や罫線を印字した後、
参照点を移動しないことを除いて `set' コマンドと同じです。
a と b は dimension です。
- 138 … nop
-
何もしません。DVI命令の間にはいくつ用いてもかまいませんが、
DVI命令とパラメータの間、およびパラメータの間では使用できません。
- 139 … bop c0[4] c1[4]...c9[4] p[4]
-
ページ処理の開始を意味します。
(h,v,w,x,y,z) を (0,0,0,0,0,0) にし、スタックを空にします。
また、カレントフォント f は未定義の状態になります。
c0 〜 c9 の 10 個のパラメータは、TeX でこのページが \shipout されたときの
\count0 〜 \count9 の値です。
パラメータ p は直前の bop の位置です。
最初の bop には -1 がはいっています。
- 140 … eop
-
ページ処理の完了を意味します。
- 141 … push
-
スタックに現在の (h,v,w,x,y,z) の値を積み上げます。
f レジスタの値はプッシュされないことに注意してください。
- 142 … pop
-
スタックから (h,v,w,x,y,z) を取り出します。
- 143 … right1 b[1]
- 144 … right2 b[2]
- 145 … right3 b[3]
- 146 … right4 b[4]
-
h レジスタを h+b に設定します。つまり、b 単位だけ右に移動します。
b<0 の場合、参照点は左に移動します。
b は dimension です。
- 147 … w0
-
h を h+w に設定します。つまり、w 単位だけ右に移動します。
- 148 … w1 b[1]
- 149 … w2 b[2]
- 150 … w3 b[3]
- 151 … w4 b[4]
-
w レジスタを b に設定し、h レジスタを h+b に設定します。
b の範囲は right 命令と同じです。
このコマンドは、現在の w レジスタを変更し、b だけ右に移動します。
- 152 … x0
- 153 … x1 b[1]
- 154 … x2 b[2]
- 155 … x3 b[3]
- 156 … x4 b[4]
-
`x'コマンドは、w レジスタでなく、x レジスタを対象にすることを除き、
`w'コマンドと同じです。
- 157 … down1 a[1]
- 158 … down2 a[2]
- 159 … down3 a[3]
- 160 … down4 a[4]
-
v レジスタを v+a に設定します。a 単位だけ下に移動します。
a<0 の場合、参照点は上に移動します。
a は dimension です。
- 161 … y0
-
v レジスタを v+y に設定する。つまり、y 単位だけ下に移動する。
- 162 … y1 a[1]
- 163 … y2 a[2]
- 164 … y3 a[3]
- 165 … y4 a[4]
-
y レジスタに a を設定し、v レジスタを v+a に設定します。
a の範囲は down 命令と同じです。
このコマンドは、現在の y レジスタを変更し、a だけ下に移動します。
- 166 … z0
- 167 … z1 a[1]
- 168 … z2 a[2]
- 169 … z3 a[3]
- 170 … z4 a[4]
-
`z'コマンドは、y レジスタでなく、z レジスタを対象にすることを除き、
`y'コマンドと同じです。
- 171 〜 234 … fnt_num_0 〜 fnt_num_63
-
fnt_num_# は、f レジスタを # に設定します。
フォント # は、これ以前にfnt_def
により定義されていなければなりません。
- 235 … fnt1 k[1]
- 236 … fnt2 k[2]
- 237 … fnt3 k[3]
- 238 … fnt4 k[4]
-
f レジスタを k に設定します。
- 239 … xxx1 k[1] x[k]
- 240 … xxx2 k[2] x[k]
- 241 … xxx3 k[3] x[k]
- 242 … xxx4 k[4] x[k]
-
このコマンドは一般に不確定です。
特別なDVIreadingプログラムが使用されていなければ、
(k+2) バイトの nop 命令として機能します。
- 243 … fnt_def1 k[1] c[4] s[4] d[4] a[1] l[1] n[a+l]
- 244 … fnt_def2 k[2] c[4] s[4] d[4] a[1] l[1] n[a+l]
- 245 … fnt_def3 k[3] c[4] s[4] d[4] a[1] l[1] n[a+l]
- 246 … fnt_def4 k[4] c[4] s[4] d[4] a[1] l[1] n[a+l]
-
フォント番号 k を定義します。
- k … unsinged
フォント番号です。fnt_num命令やfnt命令では、この番号を使ってフォントを
呼び出します。4種類の命令が用意されているので、フォント番号を4バイト
まで生成できます。ただし、TeXでは、通常fnt_def1命令しか生成しません。
- c … unsigned
TFMファイルのチェックサムです。TeXが想定しているTFMとデバイスドライバの
アクセスするフォントが同一であるのを確認するのに使います。
- s … dimension
フォントのデザインサイズをscaledやatした値がはいっています。
- d … dimension
フォントのデザインサイズがはいっています。
- n[a+l] … string
フォント名です。n[0..(a-1)]にディレクトリ名、n[a..(a+l-1)]
にファイル名がはいっています。
- 247 … pre i[1] num[4] den[4] mag[4] k[1] x[k]
-
プリアンブルの開始を示します。
DVIファイルの一番最初に来なければなりません。
- 248 … post p[4] num[4] den[4] mag[4] l[4] u[4] s[2] t[2]
-
ポストアンブルの開始を示します。
- p[4] … pointer
最後のページ記述部の先頭(bop命令)位置。
- num[4]、den[4]、mag[4]
pre命令と同じ値がはいっています。
- l[4] … dimension
このファイルに含まれるページのheight+depthのうち、最大のもの。
- u[4] … dimension
このファイルに含まれるページのwidthのうち、最大のもの。
- s[2] … unsigned
このファイルはいっているページ記述部を解釈するのに必要なスタックの深さ。
- t[2] … unsigned
総ページ数(bop命令の個数)。
- 249 … post_post q[4] i[1] (4個以上の)223
-
ポストアンブルの終りを示します。
DVIファイルの一番最後に来なければなりません。
- q[4] … pointer
post命令の位置を示します。
- i[1] … unsigned
DVIのバージョンを表します。
pTeXで縦組み機能を使っている場合は3になります。
- (4個以上の)223
DVIファイルのトータルサイズを4の倍数にするために、
最後の4〜7バイトには223(10進数)がはいっています。
4バイト以上を置くことで、
223は一番最後に加えられる一種の署名となっています。
- 250 〜 254
-
未定義
- 255 … dir d[1] (ptex)
-
d は組方向を示します。ゼロが横組、1が縦組です。
後述の縦組についても参照してください。
オリジナルの TeX では未定義です。
■縦組について
従来の DVI 命令では、right 命令は水平方向への移動、
down 命令は垂直方向への移動を意味していますが、
pTeX の拡張 DVI では、right 命令は「字送り方向」への移動、
down 命令は「行送り方向」への移動を意味しています。
横組と縦組での、字送り方向および行送り方向の向きは、次のようになります。
組み方向 | 字送り方向 | 行送り方向 |
横 | 水平右向き | 垂直下向き |
縦 | 垂直下向き | 水平左向き |
つまり、set_char_#、set?、set_rule、right?、w?、x? は、
縦方向に移動する命令となります。
また、down?、y?、z? は、横方向に移動する命令となります。
文字は、ベースラインの方向が字送りの方向と一致するように、
必要なら回転して印字します。
なお、pTeXで縦組機能を用いた DVI ファイルを作成すると、
post_post命令
でのフォーマットのバージョンが3になります。
[pTeX home page]