より長続きするブログ

続けていきたい気持ち。

PandocでMarkdownを段落番号のついたPDFに変換したい

Markdownへの回帰

Markdownは段落の機能が貧弱なのに耐えきれず、Sphinx(reStructuredText)を使っていたこともかつてはありました。
でも本当はMarkdownで書けたら楽なのになと思っていたのです。
普段メモ取ったりするのはreStructuredTextではなくてMarkdownを使うし、周りにも使える人が多いし、エディターのサポートも手厚いから。

ということでMarkdownの見出しから段落をつくり、番号のついたPDFに変換するのを試してみました。
変換ツールとしてPandocを使います。

以下、今のところこうしているよというメモになります。

 

環境構築

OSはUbuntu16.04を使いました。

aptで適当にインストールして使います。

apt -y install texlive-full pandoc

tex環境はデカイですが、下手に省略するとハマりそうなのでfullで入れてしまいます。

Ubuntu16.04のaptで入れるとバージョン1系がインストールされるようですが、
現時点で最新版は2系なので、必要ならばstack installとかすると良さそう。


変換コマンド

だいたいこれでいい感じに変換できてしまいます。すごい。

pandoc *.md -o output.pdf -V documentclass=ltjsarticle --latex-engine=lualatex -N --toc --highlight-style=tango

 

「*.md」

一つのディレクトリに、大見出しごとにファイルを分けたmdファイルを置いておいて、
コマンドを実行すると良さそうです。
「*.md」でファイルを読み込むので、「01_概要.md」, 「02_本題.md」など、
プレフィックスを付けて順番を決めました。
(変更するときは面倒なので、昔のBasicよろしく10_, 20_とかやるべきなのだろうか)

 

「-o」

「-o」で出力先のファイル名を決めます。
pandocでは出力先ファイル名で、何のファイルに変換する決まるようなので、ここでoutput.texとか指定すると
pdfに変換する前のtexファイルを確認したりできます。

 

「documentclass=ltjsarticle」

lstjsarticleを使うと、日本語を上手く表示してくれる設定が読み込まれるみたいです。

当初、1文字間違えてタイプして「ltjarticle」となっていて、見た目が微妙なPDFを出力してしまいました。
latexのtemplateでどうにかしないといけないのかと試行錯誤しましたが、
ltjsarticleのデフォルト設定でほぼ満足です。

 

「--latex-engine=lualatex」

latexには色々な実装があるようなのですが、lualatexを選択します。
名前の通りLuaが使えるのが特徴とのことですが、単に日本語文書にも対応できているlatexとして使います。

「-N」

段落番号を付けるオプションです。
これが欲しかった。

# AAA
## BBB
### CCC

みたいに書くと、

1 AAA
1.1 BBB
1.1.1 CCC

のように表示されます。

「--toc

Table of Contentsの略。目次を出力します。
複数枚の文書であれば、付けておくと良いと思います

 

「--highlight-style=tango」

PDFの中にコードを埋め込みたかったのですが、デフォルトだと背景色が白で、
どこまでがコードブロックなのかわかりずらいのが好みではありませんでした。
tangoはコードブロックの背景がライトグレーになるのでわかりやすく、
文字色が好みだったので、これを選んでみました。

 

 使わなかった設定「--template=mytemplate.tex

ltjsarticleデフォルトの見た目では満足できない場合、自分でtemplateを用意して見た目をカスタマイズできます。
思い通りにするのは結構難しく、使わないことにしました。

簡単だったら見出しをもう少しメリハリのある感じにしたいのですが、意外と面倒くさい。

 

~~~

「pandoc -D latex > mytemplte.tex

pandocでの変換に使う、デフォルトのテンプレートを出力できます。
これを叩き台に。

 

「\usepackage{titlesec}」

見出しのデザインを簡単にカスタマイズできるようにするパッケージ。
参考になったサイト: https://qiita.com/kiritex/items/deeec0843caf37b66054

pandocを使ってMarkdownを変換した場合、見出しはsection, subsection, subsubsection, ...となるので
chapterは使えないみたいでした。

 

「\usepackage{color}」

色を定義するパッケージ。titlesecを使っているサンプルではだいたいこれも使っているので自分も読み込んでみたが、エラーになる……
デフォルトのテンプレートでは別のパッケージから既に読み込まれいるのだと思います。
\usepackage{color}を追記しなくても\definecolorができました。

 

「\usepackage{ifthen}」

titlesecでsectionをカスタマイズして、\thesectionでセクション番号を表示させた場合、
--tocで付けた目次にまでセクション番号「0」が入ってしまいました。

セクション番号は1から表示でいいので、1未満の数字だったときは表示させたくない……
ということでこの条件分岐パッケージを使います。

条件分岐させれば、対処できることは確認できました。

 

~~~

ここまでやって、コストに見合わない感じがしてきたのでテンプレートカスタマイズは一旦諦めました。
頑張れば好きな見た目のテンプレートができるんだろうと思いますが、
そこまで複雑なことはやりたくないので、強い不満が無い限りはデフォルトのテンプレートを使っていくつもりです。

 

まとめ

カスタマイズテンプレートは諦めたものの、MarkdownをPDFまでコマンド一発で変換できて、そこそこいい感じのPDFができあがりました。

応用的にやりたいことは色々あるので、使いながら試していきたいと思います。

(画像の配置はどうなるかとか、PlantUMLの埋め込みができるかとか)