dviファイルの構成

TeXが生成するdviファイルは当然バイナリですが,実際は普通にテキストにしたって問題ないようなもの,つまり機械語とかになってるわけでもなく,要は中間コード,仮想コードのようなものです.実際,dvioutの大島先生が,dviファイルの可視化やページ独立性の破綻の修正を行うdvispcというツールを開発・公開されてます.

一方,PDFファイルだとpdffontsといった,情報だけをひっぱり出してくれるツールが存在します.これのdvi版がないか,ないならばでっちあげるしかないかというわけで,昨日のようなPerlスクリプトをでっち上げたわけです.

詳細な構造は大島先生の解説が分かりやすいです.

dviファイルは

  • プリアンブル
  • ページ記述部
  • ポスタンブル

の三部構成になっています.

プリアンブル

pre i[1] num[4] den[4] mag[4] k[1] x[k] 

dviファイルは必ずpre(243)で始まります.そのあと

  • 1バイト:dviの規格としてのバージョン番号(現在 2)
  • 4バイト:スケールファクタ(略)
  • 4バイト:デザインサイズ(略)
  • 4バイト:拡大率(略)
  • 1バイト:次にあるコメントのバイト数
  • kバイト:コメント(コンパイルされた時間など)

となり,全体で 1+4+4+4+1+k=15+kバイトです.

そこで

  • 最初のバイトが243でない
  • 次のバイトが2でない

ようなdviファイルは不正なので弾くことができます.

ポスタンブル

ページ記述部は複雑なのであとまわしにします.

ポスタンブルはさらに

  • ヘッダ
  • フォント定義
  • ポストポスト

の三つに分かれています.分かりやすい順番に書きます.

ポストポスト
post_post q[4] i[1] 223,...,223

dviファイルのファイルサイズ(バイト数)は,必ず4の倍数です.いろいろな処理をした結果生成されたdviファイルの末尾に「223」が4個から7個追加され,ファイルサイズが4の倍数バイトになるように調整されます.

  • 4の倍数ぴったりのとき,223が4個
  • 余り1のとき,223が7個
  • 余り2のとき,223が6個
  • 余り3のとき,223が5個

というわけです.この調整がポストポストです.必ず「223」がつくことで署名のような役割もしています.

このポストポストはpost_post(249)で始まります.q[4]はポスタンブルの最初(post(248))の位置,i[1]はdviのバージョンは,2なら縦書きなしの文書,3なら縦書きありです.注意が必要なのはこのdviのバージョンはpre(247)のものとは違うことがあるということです.

実際の処理としては,ファイルを末尾から読みこんで「223」以外のものを最初に読んだあと,もう5バイトさかのぼるとそこにpost_post(249)があり,4バイトq[4],1バイトi[1]と読みこんで,それからpost(248)に戻ることになります.