かわろぐ

技術、セキュリティ、その他もろもろ

MENU

Markdown から pandoc で PDF ファイルを生成する

以前の記事では sphinx を使って Markdown から、PDF形式に変化を試していました。 ただし、表紙を作る方法を発見できなかったので、今回は Haskell で書かれたドキュメントコンバーターの pandoc を試してみました。今回の記事では到達していませんが、最初のファイルに記述することで表紙扱いにすることが可能です。

pandoc をインストールする

前提として、Homebrew はインストール済みであるとします。 Homebrew が入っていれば、 pandoc は以下のコマンド一発でインストールが可能です。なお、LATEX の環境は別途構築済みであるとして進めます。

$ brew install pandoc

pandoc で Markdown を PDF に変換する

今回は、以下の3つのファイルに分かれた Markdown を表紙、目次付きの一つのPDFファイルに変換してみたいと思います。この3つの Markdown ファイルは一つのディレクトリに入っているものとします。

# はじめに

この文章は Pandoc のテストで使う文章です。
# コンテンツだよ

* リスト1
* リスト2

---
# おわりに

終わります。

上記三つの Markdown ファイルを作ったら、以下のコマンドでPDFファイルに変換します。

$pandoc -N --toc --toc-depth=2 *.md -f markdown --pdf-engine=lualatex -V documentclass=ltjsarticle  -o ./test.pdf

こんな感じのPDFができあがります。

f:id:kawa_xxx:20201123164556p:plain

使用したオプションについて

それぞれのオプションの意味は、 man コマンドなどを見てもらうのがいいと思いますが、以下にざっとまとめます。

-N : ページ番号を付与する
--toc : 目次をつける
--toc-depth=2 : 目次にどこまでの見出しを記載するか指定します。この例では2階層目までですね。
-f : インプットファイルのフォーマットです。今回は markdown ですね。
--pdf-engine=lualatex : 
-o : アウトプット先を指定します。

-V 以降のオプションがないと日本語が表示されないので注意が必要です。

長いオプションをなんとかする

pandoc はオプションが猛烈に長くなりますね。コマンドラインで打つのも直すのがめんどくさすぎる!と言うことで、改善しましょう。 pandoc には バージョン 2.8 以降でこの長いオプション類を yaml 形式で記載し、そのファイルを呼び出すことでシンプルにコマンドを実行できます。

input-files:
  - 01.md
  - 02.md
  - 03.md

output-file: test.pdf
table-of-contents: true
toc-depth: 2

pdf-engine: lualatex
variables:
  documentclass: ltjsarticl

このファイルを -d オプションで指定します。

$ pandoc -d default.yml

と、ここまでいろいろ調べましたが、結局最後は、微妙なレイアウト調整がきかずに docx 形式で出力して、手で調整することになりそうな感じを受けています。。。

参考文献