Windowsで,綺麗にソースコード印刷したいー!!
ワンランク上のおっさんは。
以前に,Linux上でpdfにする方法は書いたのですが,
Linuxを起動するのは面倒なので,
なんとかWindows上でできないものかと。
結論から言うと,可能。
日本語含むと不可能。
この場合は,いったんhtml出力して,ブラウザから印刷もしくは,
Distiller使用してPDFにすればよし。
というわけで,こんな方法もありまっせという意味で,まとめてみます。
Cygwinを使用できるWindowsXP環境で,
ソースコードを,好きなフォントで,pdfに,
そして,PDFにしてしまえば,印刷も綺麗に〜。
前提条件
フォントの設定
Windowsにインストールされているフォントにシンボリックリンクを
貼る方法が一般的のようですが,ワタシはどうも気持ちが悪いので,
別個に用意。
- インストール場所を決める
- ここでは以下の2つと仮定します。
- /usr/share/fonts/truetype/ttf-dejavu/
- /usr/share/fonts/truetype/ttf-consolas/
- 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
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にはお世話になってます。
ありがとです。