DVI(Device Independent File Format)は、
TeXの出力ファイル形式として1979年にデイビッド・R・フックスによって設計されました。このファイル形式は、
TeXの入力ファイルとは異なり、人間が直接読むことを想定していません。DVIファイルはバイナリデータで構成されており、文書のレイアウト情報を画像形式や表示デバイス、プリンターに依存しない形で記録します。
通常、DVIファイルは「DVIドライバ」と呼ばれる専用のプログラムによって処理されます。ドライバはDVIファイルのデータを解釈し、画面表示用のイメージや印刷用の別の形式(
PostScriptやPDFなど)に変換します。例えば、xdviやdviout for WindowsといったビューアでDVIファイルを画面に表示したり、dvipsやdvipdfm(x)などのドライバで印刷用ファイルに変換したりすることができます。
MediaWikiでは、
TeXとPNGドライバを使用して数式の画像を生成する際に、内部でDVIファイルが利用されています。
DVIファイルはバイナリデータであるものの、文書を
暗号化する目的で使用されるわけではありません。そのため、ある程度元の文書を復元することも可能です。しかし、DVIは
PostScriptやPDFとは異なり、フォントを埋め込む機能は仕様上持っていません。そのため、DVIファイルを印刷またはプレビューする際には、使用するフォントがあらかじめシステムにインストールされている必要があります。
DVIファイルは仮想機械への命令群で構成されていますが、DVI言語は
チューリング完全ではありません。これは
PostScriptとは異なる点です。
DVIファイルの仕様
DVIファイルのフォーマットは、コンパクトで機械的に解釈しやすいように設計されています。ファイルは仮想機械への一連のコマンドで構成され、各コマンドは8ビットの命令コードと、命令ごとに異なる数の引数で構成されます。例えば、`set_char_i`(命令0~127)は、引数なしで、命令番号と同じ文字を出力し、カーソルを文字幅分右に移動させます。一方で、`pre`(コード247)は、14バイト以上のパラメータと最大255文字のコメントを引数に持ちます。
DVIファイルは大まかに、プリアンブル、複数のページ、ポストアンブルから構成されます。仮想機械は6つの32ビット符号付き整数(h, v, w, x, y, z)を状態変数として持ちます。hとvはカーソルの位置を、wとxは水平方向のスペースを、yとzは垂直方向のスペースを管理します。これらの値は内部スタックに保存できます。また、フォント変数fは現在使用中のフォント番号を保持します。カーソルの移動幅はTFM (
TeX Font Metric)ファイルから読み込まれます。fは32ビット幅ですが、
TeXは0から63の値しか出力しません。
DVIファイルで参照される文字番号は、システムの文字コードとは無関係にフォントのエンコーディングに依存します。たとえ
EBCDICベースのシステムであっても、フォントが
ASCII配列に基づく限り、DVIファイルの文字番号は
ASCII配列に従います。
日本語TeXでのDVIの利用
日本語化された
TeXシステムでも、DVI
ファイルフォーマットは基本的にそのまま使用されています。DVI設計当初の
TeXは7ビットコードしか扱えませんでしたが、DVIには1~4バイト幅の文字番号を扱う`set1~4`が用意されていました。日本語
TeXでは、
ISO-2022-JPの文字コードを`set2`命令でDVIファイルに出力しています。DVIファイルの日本語文字コードは、システム文字コードが
EUC-JPやShift_JISの場合でも、
ISO-2022-JP(JISコード)になります。TFMファイルは、日本語文字がほぼ同じ幅であることを考慮して、一部互換性のない形式が使用されています。
縦書き対応のp
TeXでは、未使用の命令コードに`tate`命令(255)を追加し、縦書きと横書きを切り替えられるように拡張されています。この拡張により、ドライバは下位互換性の有無を判断できます。また、NTT J
TeXでは、日本語文字を複数のフォントに分割し、出力時にフォントを切り替えることで、DVIドライバは日本語拡張なし(1バイト幅の文字番号しか扱えない)のものが利用できました。
関連ソフトウェア
DVIビューワー: `dviout`, `xdvi`, `YAP`, `Evince`
DVI-PS変換: `dvips`
DVI-PDF変換: `dvipdf`, `dvipdfm`
外部リンク
アスキー日本語 TeX (p
TeX)
*
The Publishing TeX (DVI) - DVIフォーマットの詳細な仕様が記述されています。