新しいコードを理解しようとするとき、画面上のエディタで読むことに不満がない人もいると思いますが、エディタ上だと「どこを読んでいたっけ?」となりやすいので、私には紙に印刷して(あるいはiPadとApple Pencilで)書き込みを入れながら読むのが一番合っているようです。そんなとき、行番号付きで、シンタックスハイライトも付いて、日本語にも対応で、お気に入りのフォントで、綺麗にPDF化することができると嬉しいですね。本記事では、私が数年かけて試行錯誤して現状ベストだと思っている手法を紹介します。
TL;DR...先に結論を
#!/bin/bash
filein=$1
opt=${2:-Portrait} # 長い行のときはLandscapeオプションが便利
vim ${filein} -c 'colorscheme default | set number | TOhtml | w tmp.html | qa!'
wkhtmltopdf --page-size B4 -O ${opt} --footer-left "[date] [time] ${filein}" \
--footer-right "[page]/[topage]" --no-background --margin-top 4 --margin-right 3 \
--margin-left 4 --margin-bottom 10 tmp.html ${filein}.pdf
rm -f tmp.html
このシェルスクリプトにtopdfと名前をつけ、実行権限を与え、パスの通ったところに置いておくと良いでしょう。使用時は
topdf SOME_INPUT_FILE
とすればPDF化してくれます。
解説
まず、Vimの出力機能を使うことのメリットを挙げておきます。これは、我々Vim使いであれば、読みたい言語のシンタックスハイライトが既にVimに揃っているという前提があります。流星のように現れた最新の言語でも、閉じたコミュニティで代々使われている古の独自言語でも、 ~/.vim/syntax さえメンテナンスしてあれば、PDF化に際して別途シンタックスハイライトと格闘しなくて済むということです。
vim ${filein} -c 'colorscheme default | set number | TOhtml | w tmp.html | qa!'
上の行ですが、vimにコマンドライン引数を与えてTOhtml
でtmp.htmlというHTMLファイルに変換しています。colorscheme default
を付けているのは、画面表示向きのカラースキームだと印刷して見づらいことがあったためです。qa!
はvimを閉じるコマンドです。
続いて、wkhtmltopdfでPDF化してやります。HTMLを経由せずPS(PostScript)形式を経由してPDF化していたこともあったのですが、日本語対応などHTML形式の方がうまくいきました。
wkhtmltopdf --page-size B4 -O ${opt} --footer-left "[date] [time] ${filein}" \
--footer-right "[page]/[topage]" --no-background --margin-top 4 --margin-right 3 \
--margin-left 4 --margin-bottom 10 tmp.html ${filein}.pdf
上の行でHTML→PDFの変換を行っています。--page-size B4
としているのは、実質的には文字サイズの調整です。--page-size A4
とすれば文字が相対的に大きくなり、--page-size A3
なら文字が小さくなります。私にはB4(縦の場合1ページにちょうど100行)がちょうどいい塩梅でした。
-O
は配置(orientation)のオプションです。${opt}
にLandscape
を与えるとページが横向きになります。1行が長いコードをPDF化する際に便利です。使用時にtopdf SOME_INPUT_FILE Landscape
と与えます。
--footer-*
はお好みで。変換した日付や元のファイル名、ページ番号などを入れています。
--margin-*
は文字通り余白の設定ですが、フッターを入れる関係で下部を大きめにしています。
以上で、日本語対応、シンタックスハイライト対応のPDF化ができます。ソースコードを印刷して読みたいVim派の方はぜひ試してみてください。