Windowsで,綺麗にソースコード印刷したいー!!

ワンランク上のおっさんは。


以前に,Linux上でpdfにする方法は書いたのですが,
Linuxを起動するのは面倒なので,
なんとかWindows上でできないものかと。


結論から言うと,可能。
日本語含むと不可能。
この場合は,いったんhtml出力して,ブラウザから印刷もしくは,
Distiller使用してPDFにすればよし。


というわけで,こんな方法もありまっせという意味で,まとめてみます。
Cygwinを使用できるWindowsXP環境で,
ソースコードを,好きなフォントで,pdfに,
そして,PDFにしてしまえば,印刷も綺麗に〜。

前提条件
  • アスキー文字,正確にはLatin-1?のみからなるソースコード
    • 日本語入っていると化ける。
  • 使用する好きなフォント(ここでは,DejavuとConsolasを使用)
  • Cygwin。具体的には,enscriptとps2pdf,そして,fontforge
フォントの設定

Windowsにインストールされているフォントにシンボリックリンク
貼る方法が一般的のようですが,ワタシはどうも気持ちが悪いので,
別個に用意。

  1. インストール場所を決める
    • ここでは以下の2つと仮定します。
    • /usr/share/fonts/truetype/ttf-dejavu/
    • /usr/share/fonts/truetype/ttf-consolas/
  1. AFMファイルと font.map ファイルの作成

最初,ttf2afm を使用して作成してたのですが,どうもよろしくない感じのファイルがでてくるようです。
というわけで,fontforge 用のスクリプトを書いて,ちゃちゃっと作ってもらいます。

    • ファイル名は,gen_type1.pe とでもして,実行可能にしてくださいな。
#!/usr/local/bin/fontforge -script

Open($1)
Generate($1:r + ".pfa", "", -1)

関数の説明は,公式のマニュアルにばっちり書いてあります。
パスが通っているところでもいいし,各フォントのディレクトリコピーしても,
なんでもいいです。

% cd /usr/share/fonts/truetype/ttf-dejavu
% ls *.ttf
DejaVuSansMono-Bold.ttf  DejaVuSansMono-BoldOblique.ttf  DejaVuSansMono-Oblique.ttf  DejaVuSansMono.ttf
% for i in *.ttf; do ./gen_type1.pe $i; done;
% mkafmmap *.afm            ## font.map ファイルの作成
% cd ../ttf-consolas
% ls *.ttf
consolas-bold.ttf  consolas-bolditalic.ttf  consolas-italic.ttf  consolas.ttf
% for i in *.ttf; do ./gen_type1.pe $i; done;
% mkafmmap *.afm            ## font.map ファイルの作成


consolas の場合は font.map ファイルを修正する必要がございました。
具体的には,Oblique を Italic にマップさせる必要があると。
font.map の中身

Consolas-Bold                   consolas-bold
Consolas-BoldOblique            consolas-bolditalic
Consolas-Oblique                consolas-italic
Consolas                        consola
enscriptの設定

ボクだけ,私だけの設定ファイルを用意しましょう。
ま,システムワイドに手を入れてもいいでしょうけど。

% cp /etc/enscript.cfg ~/.enscriptrc

AFM ファイルへのパスを追加。

# Lookup path for the AFM files.
AFMPath: /usr/share/enscript/afm:/usr/local/lib/ps:/usr/lib/ps:/usr/share/fonts/truetype/ttf-consolas:/usr/share/fonts/truetype/ttf-dejavu

フォントをダウンロードするように設定。
よくわかってないが,とりあえず書いとけ的なのりです。

# Include following font files to all PostScript outputs.
#
# DownloadFont: FooFont1
# DownloadFont: FooFont2
DownloadFont: Consolas
DownloadFont: Consolas-Bold
DownloadFont: Consolas-BoldOblique
DownloadFont: Consolas-Oblique

DownloadFont: DejaVuSansMono
DownloadFont: DejaVuSansMono-Bold
DownloadFont: DejaVuSansMono-BoldOblique
DownloadFont: DejaVuSansMono-Oblique
出力
  • Dejavuを使用する場合。
# verbose モードで,カラーでC言語で,フォントはDejavuの8ポイントで,
# landscapeで,fancy headerを出力して,2列に分割して,出力は echo.c.psへ。
% enscript -v --color --highlight=c --font="DejaVuSansMono8" --landscape -G --column 2 echo.c -o echo.c.ps 
AFM: scanning path...
AFM: reading font map "/usr/share/enscript/afm/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-consolas/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-dejavu/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-meiryokeconconsolas/font.map"
downloading font "DejaVuSansMono-Oblique"
downloading font "DejaVuSansMono-BoldOblique"
downloading font "DejaVuSansMono-Bold"
downloading font "Consolas-BoldOblique"
downloading font "Consolas-Bold"
downloading font "Consolas-Oblique"
downloading font "DejaVuSansMono"
downloading font "MeiryoKeConConsolas"
states: autoloading `lang_enscript' from `/usr/share/enscript/hl/lang_enscript.st'
states: autoloading `style_emacs' from `/usr/share/enscript/hl/style_emacs.st'
states: autoloading `default_faces' from `/usr/share/enscript/hl/default_faces.st'
processing file "../ttf-consolas/echo.c"...
states: autoloading `c' from `/usr/share/enscript/hl/c.st'
states: autoloading `c_comment' from `/usr/share/enscript/hl/c_comment.st'
states: autoloading `c_ppline' from `/usr/share/enscript/hl/c_ppline.st'
states: autoloading `c_string' from `/usr/share/enscript/hl/c_string.st'
[ 2 pages * 1 copy ] left in echo.c.ps
1 lines were wrapped

% ps2pdf echo.c.ps

これで綺麗なPDFのできあがり!!
オッケー牧場。


Consolas を使用する場合。

ちとやっかい。というか,私もよく分かってない。

# verbose モードで,カラーでC言語で,フォントはConsolasの8ポイントで,
# landscapeで,fancy headerを出力して,2列に分割して,出力は echo.c.psへ。ふぅ。
% enscript -v --color --highlight=c --font="Consolas8" --landscape -G --column 2 echo.c -o echo.c.ps
AFM: scanning path...                                                                               
AFM: reading font map "/usr/share/enscript/afm/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-consolas/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-dejavu/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-meiryokeconconsolas/font.map"
downloading font "DejaVuSansMono-Oblique"
downloading font "DejaVuSansMono-BoldOblique"
downloading font "DejaVuSansMono-Bold"
downloading font "Consolas-BoldOblique"
downloading font "Consolas-Bold"
downloading font "Consolas-Oblique"
downloading font "DejaVuSansMono"
downloading font "Consolas"
downloading font "MeiryoKeConConsolas"
states: autoloading `lang_enscript' from `/usr/share/enscript/hl/lang_enscript.st'
states: autoloading `style_emacs' from `/usr/share/enscript/hl/style_emacs.st'
states: autoloading `default_faces' from `/usr/share/enscript/hl/default_faces.st'
states: autoloading `c' from `/usr/share/enscript/hl/c.st'
states: autoloading `c_comment' from `/usr/share/enscript/hl/c_comment.st'
states: autoloading `c_ppline' from `/usr/share/enscript/hl/c_ppline.st'
states: autoloading `c_string' from `/usr/share/enscript/hl/c_string.st'
processing file "echo.c"...
[ 2 pages * 1 copy ] left in echo.c.ps
  • Adobe Distillerを使用する場合

この場合は,psファイルを編集します。
具体的は,「Consolas-Oblique」を「Consolas-Italic」で置換します。
psファイルのサイズがでかいので,編集する際は,注意すべし。
これで,Distillerを通すと,すぐに読みたくなるソースコードのPDFのできあがりです。


  • ps2pdfを使用する場合

この場合は,もひとつ解決しておりまへん。
enscriptで出力したpsファイルをそのまま変換します。
すると,通常の文字とボールドな文字は,Consolas になっていますが,
斜体がちゃいます。



原因は,おそらくConsolas-Obliqueを探しに行って,見つからないので,
デフォルトフォントを使用しているんだと思います。
調べたんですが,わからず。
font.map でへたこいてる?


代替案というか根本的に,Consolasのフォントファイルに手を入れて,
フォント名を変更してしまうというのも,ありだと考えてます。


日本語含んだ場合

この場合は,ちゃちゃっとhtmlで出力して,ブラウザから印刷しましょう。
フォントも自分の好きなフォントをブラウザで設定すればいいしぃ〜。
htmlすれば,あとはなんかに加工できそうだしぃ〜。

% enscript -v --color --highlight=c --language=html echo.c -o echo.c.html
AFM: scanning path...
AFM: reading font map "/usr/share/enscript/afm/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-consolas/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-dejavu/font.map"
AFM: reading font map "/usr/share/fonts/truetype/ttf-meiryokeconconsolas/font.map"
passing through all input files for output language `html'
states: autoloading `lang_html' from `/usr/share/enscript/hl/lang_html.st'
states: autoloading `style_emacs' from `/usr/share/enscript/hl/style_emacs.st'
states: autoloading `default_faces' from `/usr/share/enscript/hl/default_faces.st'
states: autoloading `c' from `/usr/share/enscript/hl/c.st'
states: autoloading `c_comment' from `/usr/share/enscript/hl/c_comment.st'
states: autoloading `c_ppline' from `/usr/share/enscript/hl/c_ppline.st'
states: autoloading `c_string' from `/usr/share/enscript/hl/c_string.st'
output left in echo.c.html
まとめ

非常に時間がかかりました。
実はenscript以外にも,a2ps とか,その他のツールを使用したり
してみたのですが,結局これに落ち着きました。
というか,日本語を含むと手も足も出なくなる状況は,
非常にまいっちんぐ
a2ps のEUC-JPに対応したもの試したのですが,
どうもフォント設定がうまくいかず。


というわけで,フォントは恐ろしいです。
恐ろしく時間を消費します。日本語が絡むと特に。
でも幸か不幸か日本人。
がんばっていきまっしょい


※あー,忘れてました。サンプルとしてさせてもらったソースコードは,
FreeBSDのecho.cです。いつもOSSにはお世話になってます。
ありがとです。