Entry

Enscript を使ってソースコードを印刷してみる

2006年10月09日

ソースコードは画面で読むより印刷して読んだ方がいい,ということで,印刷ツールをぼちぼち探してみました。近頃のエディタには,多機能な印刷ユーティリティが付属していて,どれもよくできているとは思うんですけれど,ソースコードの pretty print ツールというと,少し物足りない感じ。

というわけで,ここでは,GNU Enscript というプログラムを使って,ソースコードを整形印刷してみようと思います。なお,ここではソースコードの印刷に限った話をするけれども,Enscript はソースコード印刷専用のプログラムというわけじゃありません(多機能版 a2ps といった感じ)。

FreeBSD からのインストールは,例によって Ports から make 一発です。print/enscript-a4 とか print/enscript-letter とか,判型によって Ports が分かれているので,適当なもんを選びます。ここでは,A4判の print/enscript-a4 をインストールしました。ついでに,print/enscriptfonts もインストール。

また,実験では,ps(1) というコマンド(おなじみですね)のソースコード,ps.c を使いました。

man してもらうと分かるんですけれど,Enscript は出力の内容をかなりカスタマイズすることができます。一部 Postscript の知識があると便利みたいですけれど,無くてもサンプルを見ながらいぢっていれば,それなりの結果を得ることができます。

普通に印刷してみる

まずは普通に印刷。印刷といっても,ここでは Postscript 形式で出力してみます。Enscript は,出力ファイルを指定しないで実行すると,印刷スプールに送ってしまうんですけれど,ここでは PDF の形で持っておきたいので,中間ファイルとして Postscript ファイルを作って,それから Ghostscript 付属の ps2pdf で PDF 化してみます。

% enscript -o ps.c.ps ps.c

-o オプションで出力ファイル名を指定するだけです。簡単ですね。GV あたりで見ると,こんな感じの出力が得られます。

Enscript の出力例(その1)

デフォルトの欧文フォントは Courier になっています。ヘッダが付いたシンプルなものですね。

んでもって,ここで得られた ps.c.ps を PDF にするには,Ghostscript をインストールして以下のようにします。

% ps2pdf ps.c.ps

ソースコードに特化した印刷をしてみる

普通に印刷する分には上記の印刷方法で構わないんですけれど,Enscript にはソースコードの印刷用に,いくつかオプションがあるので,これを利用してみましょう。

% enscript --pretty-print --line-numbers -o ps.c.ps ps.c

--pretty-print オプションと,--line-numbers オプションを付け加えてみました。それぞれ強調表示(pretty print)と行番号を付加します。出力すると,こんな感じになります。

Enscript の出力例(その2)

行番号が付いて,C のキーワードが太字になりました。行番号の始まりの番号を変えたい場合は,--line-numbers=20 のように指定します(例では20から番号が振られる)。また,--pretty-print オプションで,ソースの言語が何であるかは,Enscript が勝手に判断してくれます。

さて,--pretty-print オプションは --color オプションと一緒に使うと,もう少しかっこ良くなります。上記の例に --color オプションを付けると,こんな感じになります。

Enscript の出力例(その3)

段々それっぽくなってきましたね。もっとも,うちではモノクロレーザープリンタを使っているもんで,カラー表示はあまり意味がありません(トホホ)。そういうわけで,以降では --color オプションは使わずに話を進めることにします。

2カラムで印刷する

ここまでで,ソースコードの印刷はある程度事足りると思います。これからは,もう少し見栄えを良くしていきましょう。

まず,ソースコードには暗黙ないしは明示のコーディング規約なるものがあって,一行の文字数(カラム数)が決まっていることがあったりします。上記までの例では,A4用紙1枚を丸々1ページに当てていたわけですけれど,これでは1行の文字数が少なすぎて,フォントが不必要にでかくなってしまいます。老眼でもない限り,これは補正したいところ。

というわけで,用紙を横に使って,2ページ分印刷することにしましょう。こうすれば,適当なフォントの大きさで,A4用紙に詰め込むことができます。2ページ分印刷するには,--columns=2 オプションと --landscape オプションを加えます(※正確には「2カラムにする」ということなので,「2ページ分」ではない)。

% enscript --pretty-print --line-numbers \
    --columns=2 --landscape -o ps.c.ps ps.c

で,できたのがこれ。

Enscript の出力例(その4)

1カラムが70行だったのに対して,2カラムにすると132行収めることができました。文字の大きさも,雑誌に載っているソースコードと同じか少し小さいくらいで済んでいます。

ヘッダをかわいくする

次に,もう少しかっこいいヘッダを付けることにしましょう。これまでは Courier の取って付けたようなヘッダだったけれども,Enscript では,もっと凝ったヘッダも用意されています。

凝ったヘッダを付けるには,--fancy-header オプションを付けます。

% enscript --pretty-print --line-numbers \
    --columns=2 --landscape --fancy-header -o ps.c.ps ps.c

デフォルトでは,こんなヘッダが付きます。これで随分かっこよくなりました。

Enscript の出力例(その5)

Enscript のヘッダはこれだけじゃなくて,Emacs タイプのものも用意されています。Emacs タイプのヘッダを使いたいときは,--fancy-header=emacs のように指定しましょう。

% enscript --pretty-print --line-numbers \
    --columns=2 --landscape --fancy-header=emacs -o ps.c.ps ps.c

Emacs を使っていない方にはピンと来ないかもしれませんけど,こんな感じのヘッダが付きます。

Enscript の出力例(その6)

オリジナルのヘッダを作る

ここまでできたら,もう大概の印刷ユーティリティよりも綺麗に印刷できていると思います。もっとも,用意されたヘッダだけじゃイヤン!という向きのために,最後に自前のヘッダを作ることにしましょう。これは,Postscript の知識がないとちょっとしんどいんですけれど,知らないあたしでもそれなりのもんが作れたので,トライ・アンド・フェイルでのんびり作るといいと思います。

ヘッダを作るには,まず,ヘッダファイルを編集する必要があります。これは,FreeBSD で Ports からインストールした場合,/usr/local/share/enscript 以下にある *.hdr ファイルです。ディレクトリの中を見てもらえば分かると思うけれども,*.hdr なファイルがいくつか見つかると思います。先程,--fancy-header オプションで --fancy-header=emacs のように指定したのは,emacs.hdr を呼び出す指定だったというわけです。

ということは,--fancy-header=myheader で自前のヘッダを作りたいとしたら,myheader.hdr を作ればいい,ということになりますよね。ということで,myheader.hdr を作りましょう。もっとも,はじめから全部作るのはキツイので,ここでは,emacs.hdr を改造することにします。

% su
# cd /usr/local/share/enscript
# cp emacs.hdr myheader.hdr
# chmod 644 myheader.hdr

詳細は,man enscript してみてください(手抜き)。うちでは,こんなもんを作ってみました。

% -- code follows this line --
%%DocumentNeededResources: font Helvetica
%Format: pagenumstr     $V$%/$=
%Format: pagetitle      %H

% Fonts.
/HeaderTop    /Helvetica-Bold findfont 7  scalefont def
/HeaderBottom /Helvetica-Bold findfont 12 scalefont def

/do_header {    % print header
  gsave
    d_header_x d_header_y translate
    0 setgray
    .5 setlinewidth

    % black shadow
    %1 0 d_header_w 1 sub d_header_h 1 sub Box fill
    
    % gray box with black frames
    %0 1 d_header_w 1 sub d_header_h 1 sub Box
    0 1 d_header_w 1 sub d_header_h 2 div Box
    gsave
      0 setgray fill
    grestore
    stroke
    
    % texts

    % Top line.
    /xmarg 0 def
    HeaderTop setfont
    /y d_header_h 12 div d_header_h 2 div add def 
    xmarg y moveto pagetitle show

    pagenumstr dup stringwidth pop 
    d_header_w exch sub 1 sub xmarg sub y moveto show

    % Bottom line
    /xmarg 3 def
    1 setgray
    HeaderBottom setfont
    /y d_header_h 6 div def
    xmarg y moveto fname show

} def

これを出力すると,こんな感じになります(ほんとに手抜きだなぁ)。

Enscript の出力例(その7)

既製のヘッダには,どういうわけか出力した日付や時刻が印刷されることがあるけれども,これは正直あまり意味があるとは思えません。というわけでバッサリ削除。あとは,コマンドラインからユーザが文字列を指定して,タイトルを設定できるようにしました(左上部)。何も指定しない時は「Enscript Output」という文字列が印刷されるようです。

終わりに

さてさて,これでソースコードは綺麗に PDF にすることができるようになりました。あとはファイルを作るだけですね……。って,手作業でやるのがアホらしいのは言うまでもありません。

次回は,Enscript を使ってソースコードの PDF 化を自動化するスクリプトでも作ってみようと思います。期待しないで待っていてください。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN