TeXが出力するDVIファイルをパースして整形して表示するプログラムつくりました

pLaTeXとかが出力するDVIファイルをパースして整形して表示するプログラムつくりました。

バイナリ形式でちっとも読めやしないDVIファイルを分かりやすく表示することができます。

https://github.com/yayugu/ParseDVI

用途

出力されたPDFを見るだけでは飽きたらず、「この行がベタ組みになっているか確認したい」とか、「ここ2ptぐらいズレてる気がするんだけど」みたいに病的に組版を追究するTeXnicianにおすすめです。

DVIの仕様

DVIファイルの仕様についてはこのへんを参考に
http://ascii.asciimw.jp/pb/ptex/dvi/index.html
http://akagi.ms.u-tokyo.ac.jp/dvi.html

出力例

pre mag=1000
bop [1]
right -72.269989013671875
down -72.269989013671875
xxx pdf:docview <</ViewerPreferences <</Direction /R2L>> >>
down 3254.3131866455078125
    down -3239.0255889892578125
    down 393.75
        right 19.3583831787109375
        down -393.75
        dir tate
        down -492.029998779296875
            fnt_def brsgnmlminb-v 23.9400177001953125
            fnt brsgnmlminb-v 23.9400177001953125
            set こころ
        y 21.0
        y0 21.0
            right 348.75
            fnt_def brsgnmlminr-v 11.25
            fnt brsgnmlminr-v 11.25
            set 夏目漱石
        y0 21.0
            set   上 先生と私
        y0 21.0
            set      一
        y0 21.0
            set   
                        down -5.625
                                            right -16.875
                                            down -2.8125
                                            fnt_def brsgnmlminr-v 5.625
                                            fnt brsgnmlminr-v 5.625
                                            set わたくし
                        down 5.625
                                right -11.25
                                fnt brsgnmlminr-v 11.25
                                set 私
            right -11.25
            set  はその人を常に先生と呼んでいた。
            right 11.25
            set だからここでもただ先生と書くだけで
        y0 21.0
            set 本名は打ち明けない。
            w 11.25
            set これは世間を 
                        down -5.625
                                            right -11.25
                                            down -2.8125
                                            fnt brsgnmlminr-v 5.625
                                            set はば
                        down 5.625
                                right -11.25
                                fnt brsgnmlminr-v 11.25
                                set 憚
            right -11.25
            set  かる遠慮というよりも、
            w0 11.25
            set その方が私にと
        y0 21.0
            set って自然だからである。
            w 11.25
            set 私はその人の記憶を呼び起すごとに、
            w0 11.25
            set すぐ
            w 5.625
            set 「先生」
            w0 5.625
            set と
        y0 21.0

こんなかんじ。連続するsetをつなげたり、push, popをインデントで表現することですごく見やすくなってるんじゃないでしょうか。

使い方

$ ruby parseDVI.rb input.dvi > output.txt 

動作環境

Ruby 1.9JRuby 1.6の1.9コンパチモードでの動作を確認しています。1.8だと動きません。

出力内容

現状自分が使う情報だけ出力しています。
必要な情報が出ない場合はrubyスクリプトなのでいじってください。