파이썬 등으로 작성된 파일을 syntax highlight로 PDF화

Bad Request

하고 싶은 일


hogehoge.py 같은 소스 코드를 syntax highlight와 함께 pdf 파일로 변환

경위



얼마 전에 사용했던 a2ps처럼
% cat hogehoge.txt | a2ps | lpr -Pprinter_name

느낌으로, 간편하게 인쇄할 수 있는 툴을 잠시 찾고 있었습니다.
그러나,
이런 툴이 보이지 않기 때문에, 부득이하게 자작.

pdf 파일을 낭비하지 않고 파이프를 사용해 프린터에 흘려 넣는 것을 생각했습니다만, 조금 생각하지 않고.
우선 pdf를 출력하기로 결정했습니다.

정책


  • 명령 하나로 pdf 파일을 작성
  • 파이썬에서 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
    

    이 페이지에는 색상 견본이 있습니다.

    pandoc_highlight

    아울러 확인해 주세요.

    미래의 도전


  • 파이프를 사용하여 프린터로 직접 흘려 넣습니다
  • 가독성을 위해 글꼴 설정 검토
  • 좋은 웹페이지 즐겨찾기