DVI (ファイルフォーマット)
出典: フリー百科事典『ウィキペディア(Wikipedia)』
DVI (DeVice Independent: デバイス独立フォーマット) は、TeXの出力ファイルフォーマットであり、1979年にデイビッド・R・フックスによって設計された。TeXの入力ファイルと異なり、DVI ファイルは人間が読むようには設計されていない。その内容はバイナリデータで、文書の見た目のレイアウトを画像形式・表示デバイス・プリンタにまったく依存しない形で記録している。通常 DVI ファイルは「DVI ドライバ」と呼ばれる別のプログラムの入力として用いられ、画像イメージに変換される。例えば、DVIファイルはxdviやdvioutなどのドライバを用いて画面上にイメージとして表示させることができる(この場合はしばしばDVIプレビューアとも呼ばれる)。あるいは、別のドライバ、例えばdvipsやdvipdfmなどを用いて他の通常の文書形式 (例えば PostScript や PDF) に変換し印刷することもできる。MediaWiki では、内部で TeX と PNG ドライバを用いて文書内の数式の画像を生成している。
DVI はバイナリデータであるとはいえ、文書を難読化・暗号化するフォーマットではなく、DVI ファイルからある程度元の文書を復元することが可能である。
DVI は PostScript や PDF とは違い、フォントを埋め込むための機構を(少なくとも仕様上では)持っていない。DVI ファイルを印刷・あるいは単にプレビューする場合であっても、その文書内で使われるフォントは予めシステムにインストールしてある必要がある。また、DVIファイルの内部データは単純な仮想機械への命令群で構成されているとはいえ、PostScript とは異なり DVI 言語は チューリング完全な言語ではない。
[編集] 仕様
DVI ファイルのフォーマットはコンパクトで機械的に簡単に解釈できるように設計されている。DVIファイルの内容は単純なある仮想機械へのコマンドの列で構成されている。各コマンドは8ビットの命令と、命令毎に異なる数バイトの引数からなる。例えば、命令0から127は、set_char_i という引数無し(0バイト)の命令で、命令番号と同じ番号の文字を出力してその文字の幅だけ暗黙的なカーソルを右に移動するものとなっている。一方で、長い命令の例として、例えば命令 pre (コード247) は最低でも14バイトのパラメータと、最大255文字までのコメントを引数として持つ。
おおざっぱに言うと、DVIファイルはプリアンブル、複数のページ、ポストアンブルで構成されている。仮想機械は6つの32ビット符号付き整数 h, v, w, x, y, z を状態変数として持っていて、h と v が現在のカーソルのページ左上の基準点からの相対位置(1/65536 インチ単位)を保持し、w と x は左右方向のスペースを管理する変数として、y と z は上下方向のスペースを管理する変数として使われる。これらの値は内部にあるスタックに待避することができる。またそれとは別にフォント変数 f が存在し、現在利用しているフォントの番号 (番号と実フォントの対応はファイル中で fnt_defi 命令で関連づける) を記憶している。set 命令などでカーソル移動幅として用いられる文字の幅は、TFM(TeX font metric) ファイルから読み込まれる。変数 f は32ビット幅であるが、TeX は基本的に0から63までの値しか出力しない。
DVI フォーマット中で参照される文字番号は、システム上の文字番号とは無関係に、利用するフォントのエンコーディングによって決まる。例えば、たとえ EBCDIC ベースのシステムであっても、フォントが通常使われる ASCII 配列のものである限り、出力される DVI ファイルの文字番号はASCII配列に沿ったものとなる。
[編集] 日本語TeXにおける利用
日本語化された TeX システムにおいても、DVI ファイルフォーマットは基本的にそのまま利用されている。もともと、DVI が設計された当時のTeXは7ビットコードしか扱うことができず、全ての文字が set_char_i で扱えるはずであったが、それにも関わらず DVI には予め1バイトから4バイトまでの幅の文字番号を取ることのできるset1〜4 (128〜131) が用意されていた。アスキー によって日本語化された「日本語 TeX」では、この機能をそのまま使う形で、日本語のJIS X 0208の文字コードをそのまま set2 命令でDVIファイル中に出力する形を取っていて、ファイルフォーマットは拡張されていない。なお、DVIファイル中の日本語文字の文字コードは、システム文字コードがShift_JISの場合もEUC-JPの場合も、(16進の)JIS X0208 コードになっている。また、文字幅情報を記録するTFMファイルについては、日本語のほとんどの文字が同じ幅であることを勘案して改変された一部互換性の無いフォーマットを用いている。
また、縦書き対応に拡張された「pTeX」では、未使用であった命令コードの1つにtate命令 (255) を追加し、縦書きと横書きの切り替えを行うように拡張されている。そのため、ドライバに下位互換性のない拡張の有無が判断つくよう、縦書き機能を用いた際にはポストアンブルに含まれるファイルフォーマット番号が変更されるようになっている。
一方、NTT によって拡張された NTT jTeX では、日本語の文字集合を複数のフォントに仮想的に分割して、出力時にフォント切り替えを行う命令を挟みながら出力するように実装されていた。そのため、分割したフォントが準備されている環境では、DVIドライバは日本語拡張のない (1バイト幅の文字番号しか扱えない) ものをそのまま用いることができた。
- 参考URL: アスキー日本語TeX(pTeX): 具体的な拡張 DVI, TFM フォーマットについての仕様が掲載されている。