2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pythonなどで書かれたファイルをsyntax highlight付きでpdf化

Last updated at Posted at 2020-04-08

Bad Request

やりたいこと

hogehoge.pyのようなソースコードを、syntax highlight付きでpdfファイルに変換

経緯

ずぅーっと前に使っていたa2psみたいに

% cat hogehoge.txt | a2ps | lpr -Pprinter_name

てな感じで、お手軽に印刷できるツールをしばらく探していました。
が、
これといったツールがみあたらないので、やむなく自作。

pdfファイルを無駄に作成せずにパイプを使ってプリンターに流し込むことを考えたのですが、ちょっと思いつかず。
とりあえず、pdfを出力することにしました。

方針

  1. コマンド1つでpdfファイルを作成
  2. pythonからpandocを呼び出して処理
  3. コードには行番号を付加

私の環境

ハードウェア & OS

  1. Macbook Pro (13-inch 2019, Four Thunderbolt 3 ports)
  2. 2.8GHz Quad Core Intel Core i7
  3. RAM 16GB
  4. macOS Catalina 10.15.4

ソフトウェア

  1. LuaLaTeX (This is LuaTeX, Version 1.10.0 (TeX Live 2019))
  2. pandoc (pandoc 2.2.3.2)
  3. 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にしたものを、スクリーンキャプチャしました。

スクリーンショット 2020-04-10 7.19.23.png

syntax highlightの色は、変更可能です。

現在利用可能な設定は--list-highlight-stylesオプションで確認可能です。
私の環境での実行結果は以下のとおりです。

$ pandoc --list-highlight-styles
pygments
tango
espresso
zenburn
kate
monochrome
breezedark
haddock

こちらのページに、色見本があります。

pandoc_highlight

あわせてご確認下さい。

今後の課題

  1. パイプを使って、プリンターに直接流し込み
  2. 読みやすくするため、フォントの設定の見直し
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?