Pandocのシンタックスハイライトのカラースキーム


はじめに

PandocでマークダウンをPDFに変換する際、--highlight-styleオプションでカラースキームを指定できる。指摘できるカラースキームは以下の通り。

  • pygments (デフォルト)
  • kate
  • monochrome
  • espresso
  • zenburn
  • haddock
  • tango

これらのカラースキームはそれぞれ同名のシンタックスハイライトエンジンに由来するらしいのだが、公式マニュアルには、それぞれどんな色になるか例示がないみたいなので、ここにまとめておく。

コードは以下に置いておく。

https://github.com/kaityo256/pandoc_highlight

MarkdownからPDFへ

とりあえず日常の文書をMarkdownで書いて、なんか印刷したりメールで送ったりする時にPDFにする、という人は多いと思う。僕はVSCodeでMarkdown Previewでプレビューしながら書いて、Markdown PDFでPDFに変換している。しかし、デフォルトでは数式が変換されない。例えばこんなマークダウンを書いたとする。

# Fizz Buzzを書いてみる

数式はこちら。

$$
\textrm{Print} \quad
\begin{cases}
\textrm{FizzBuzz!} & \textrm{if} \quad i \bmod 15 =0 \\
\textrm{Fizz!} & \textrm{if} \quad i \bmod 3 =0 \\
\textrm{Buzz!} & \textrm{if} \quad i \bmod 5 =0 \\
i & \textrm{otherwise}
\end{cases}
$$

Pythonによるコード例はこちら。

```py
for i in range(1, 100):
    if i % 3 is 0 and i % 5 is 0:
        print("Fizz Buzz!")
    elif i % 3 is 0:
        print("Fizz!")
    elif i % 5 is 0:
        print("Buzz!")
    else:
        print(i)
``` 

これを、VSCodeのMarkdown PDFで変換するとこんな感じに、数式を変換してくれない。

というわけで、pandocを使って変換してみる。ついでに余白の調整とかもしれみよう。

pandoc test.md -s -o default.pdf --latex-engine=lualatex -V documentclass=ltjarticle -V geometry:margin=1in

これで変換したPDFはこんな感じになる。

数式もいい感じで、シンタックスハイライトもあるのだが、コードブロックに背景色がないため、どこからどこまでかが分かりづらい。で、カラースキームを変えることにしたのだが、どれがどんな感じになるか探したら海外にそれっぽいブログがあるだけっぽかったので、Qiitaにまとめておきましょう、というのが本稿の趣旨である。

Pandocのカラースキーム

Pandocで変換する際に--highlight-style=pygmentsなどとするとカラースキームを指定できる。これで同じマークダウンファイルを異なるスキームでPDFに変換してみよう。

僕は古い人間なので、なんでもmakefileでやる癖があるのだが、とりあえずこんなのを書いてみる。

makefile
PDF=pygments.pdf kate.pdf monochrome.pdf espresso.pdf zenburn.pdf haddock.pdf tango.pdf
PANDOCOPT=--latex-engine=lualatex -V documentclass=ltjarticle -V geometry:margin=1in

all: $(PDF)

%.pdf: test.md
  pandoc $< -s -o $@ --highlight-style=$* $(PANDOCOPT)

.PHONY: clean

clean:
  rm -f $(PDF)

入力となるtest.mdを、それぞれのカラースキームでPDFに変換するサンプルである。

pygments

デフォルトはpygmentsで、こんな感じになる。

わりといい感じなのだが、背景色がないのでコードブロックの区切りが分かりづらい。

kate

kateだとこんな感じになる。

文字列が赤く目立つかわり、forifなどの予約語が黒くなってますね。

monochrome

monochromeは、文字通り白黒。

breezeDark

breezeDarkは、背景色が黒になり、色も独特な感じ。

espresso

espressoはその名の通り、背景色がコーヒーっぽい色になっている。色も少し抑えめかな。

zenburn

zenburnも背景は黒っぽい。色は淡い感じ。

haddock

haddockの背景色は白。予約語が青というのは、なんとなく見慣れてる気がする。

tango

tangoは、haddockに似ているが、背景色が淡いグレーになっている。それに伴い、予約語の色も少し控えめに。逆に数字などのリテラルが少し目立つかな。

まとめ

Pandocによるコードブロックのカラースキームをまとめた。個人的にはtangoが好きかな。「文書を何で書くか」はわりと面倒で、そういう意味では様々なフォーマット間の変換ができるPandocは便利ですね。