やりたいこと
hogehoge.py
のようなソースコードを、syntax highlight付きでpdfファイルに変換
経緯
ずぅーっと前に使っていたa2psみたいに
% cat hogehoge.txt | a2ps | lpr -Pprinter_name
てな感じで、お手軽に印刷できるツールをしばらく探していました。
が、
これといったツールがみあたらないので、やむなく自作。
pdfファイルを無駄に作成せずにパイプを使ってプリンターに流し込むことを考えたのですが、ちょっと思いつかず。
とりあえず、pdfを出力することにしました。
方針
- コマンド1つでpdfファイルを作成
- pythonからpandocを呼び出して処理
- コードには行番号を付加
私の環境
ハードウェア & OS
- Macbook Pro (13-inch 2019, Four Thunderbolt 3 ports)
- 2.8GHz Quad Core Intel Core i7
- RAM 16GB
- macOS Catalina 10.15.4
ソフトウェア
- LuaLaTeX (This is LuaTeX, Version 1.10.0 (TeX Live 2019))
- pandoc (pandoc 2.2.3.2)
- python (Python 3.7.7 (default, Mar 23 2020, 17:31:31))
ちゃちゃっと作成
ソースを貼っておきます。変なことをしていたり、こうしたらもっと良いよ!
などのご意見を頂ければとおもいます。
code2pdf
#!/usr/bin/env python
import sys
import os
import subprocess
if len(sys.argv) < 2:
print('Usage: %s FILENAME' % (sys.argv[0]))
sys.exit()
args = sys.argv
filename = sys.argv[1]
extension = filename.rsplit('.',1)
if extension[1] == 'py':
LANG = '{.python .numberLines}'
elif extension[1] == 'sh':
LANG = '{.sh .numberLines}'
elif extension[1] == 'html':
LANG = '{.html .numberLines}'
elif extension[1] == 'htm':
LANG = '{.html .numberLines}'
else:
LANG = ''
f = open(filename)
body = f.read()
f.close()
data_out = '# ' + filename + '\n' + '```'+ LANG +'\n' + body + '\n```'
subprocess.run(['pandoc',\
'-o',extension[0]+'.pdf',\
'--pdf-engine=lualatex',\
'-V', 'documentclass=bxjsarticle',\
'-V', 'classoption=pandoc,jafont=ipaex',\
'--highlight-style=kate',\
# '-H', '~/local/header.tex', # プリアンブルに書き込む
'-V', 'linestretch:0.75',\
'-V', 'pagestyle:empty',\
'-V', 'geometry:top=8truemm',\
'-V', 'geometry:bottom=12truemm',\
'-V', 'geometry:left=20truemm',\
'-V', 'geometry:right=12truemm',\
'-V', 'papersize=a4',\
'-V', 'fontsize:9pt'],\
input=data_out, text=True, encoding='UTF-8')
使い方
$ code2pdf hogehoge.py
仕上がり
上記のコードをpdfにしたものを、スクリーンキャプチャしました。
syntax highlightの色は、変更可能です。
現在利用可能な設定は--list-highlight-styles
オプションで確認可能です。
私の環境での実行結果は以下のとおりです。
$ pandoc --list-highlight-styles
pygments
tango
espresso
zenburn
kate
monochrome
breezedark
haddock
こちらのページに、色見本があります。
あわせてご確認下さい。
今後の課題
- パイプを使って、プリンターに直接流し込み
- 読みやすくするため、フォントの設定の見直し