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 を定義します。

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]
ポストアンブルの開始を示します。

249 … post_post q[4] i[1] (4個以上の)223
ポストアンブルの終りを示します。 DVIファイルの一番最後に来なければなりません。

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]