無限グミ

メモとか備忘録とか日記

MarkDown形式の文書からPDFを生成

pandocを使ってMarkDown文書をPDFに変換

私は今年に入ったあたりからMarkDown形式でメモをとっているのですが、これがとっても書きやすくて気に入ったので報告書やレポートもこの形式で書きたいと思いました。

調べてみると pandoc というツールを使うと様々な形式の文書を相互に変換することができることを知りました。pandocではMarkDown形式の文書をTeX形式に変換したあとPDFを生成するという流れで直接変換する方法もあるようですが、今回は自分でスタイルなどを設定するためにpandocとlatexmkを使った方法について紹介します。

コンパイル手順

pandocを使って直接”MarkDownTeX→PDF”に変換することもできるみたいですが、スタイルシートやパッケージなどをこれまで使用していたものを使いたかったのでMarkDownTexをpandoc、Tex→PDFをlatexmkで処理することにしました。

tex→PDFはplatexとdvipdfmxを使って変換することが多いと思いますが、tex文書内で図や表の番号などを参照していると複数回コンパイルが必要になります。この煩わしさをなんとかしてくれるのがlatexmkでtexliveなどに最初から含まれています。

予めコンパイル次の設定をホームディレクトリの.latexmkrcに作成しておくことで必要な回数だけ実行してくれます。よく見る設定は次のようなファイルです。

#!/usr/bin/env perl
$latex            = 'platex -synctex=1 -halt-on-error';
$latex_silent     = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex';
$biber            = 'biber --bblencoding=utf8 -u -U --output_safechars';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;
$pdf_mode         = 3;
$pvc_view_file_via_temporary = 0;
$pdf_previewer    = "open -ga /Applications/Skim.app";

pandocを使ってみる

まずはpandocをインストールします。

$ sudo apt-get install pandoc

試しになにか書いたファイルをtex形式に変換してみましょう。

# 試しに変換してみる
ここが地の文になる。

- 箇条書きも
- 試してみよう。
- どうかな?

# 見出しレベル
## も変えて
### 変換しよう
どうなる?

作成した文書を保存してpandocでtex形式に変換する。入力や出力の形式は拡張子で判断しているようで特に指定しなくても変換できます。

$ pandoc test.md -o test.tex

出力されたファイルはこんな感じ。

\section{試しに変換してみる}\label{ux8a66ux3057ux306bux5909ux63dbux3057ux3066ux307fux308b}

ここが地の文になる。

\begin{itemize}
\itemsep1pt\parskip0pt\parsep0pt
\item
  箇条書きも
\item
  試してみよう。
\item
  どうかな?
\end{itemize}

\section{見出しレベル}\label{ux898bux51faux3057ux30ecux30d9ux30eb}

\subsection{も変えて}\label{ux3082ux5909ux3048ux3066}

\subsubsection{変換しよう}\label{ux5909ux63dbux3057ux3088ux3046}

どうなる?

latexmkでコンパイル

出力されたTeXファイルを見てわかるとおり、begin{document}内部の記述だけが記されているので外側のファイルを予め作っておいてinputで呼び出す方式が簡単だと思います。

\documentclass[a4paper,11pt]{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\title{タイトル}
\author{著者}
\date{ひづけ}
\begin{document}
    \maketitle
    \input{test.tex}
\end{document}

あとはlatexmkでPDFに変換するだけ。

$ latexmk -c hinagata.tex

latexmkは中間ファイルを残していくのでそのまま実行するといらないファイルが結構いっぱい出るのですが、-cオプションは中間ファイルを削除してくれるので必要なものだけが残ります。(PDFがほしいだけなら.dviファイルとかもいらないので私は後処理で消しちゃってます。)

まとめ

MarkDown形式のファイルをPDFに変換してレポートや報告書に使えるような文書で出力できるようにしました。2つのツールを使って段階的に変換する面倒な方法を紹介しましたが、latex形式に変換した際に文書のスタイルやパッケージなどを自由に変更できるため、思ったような形で出力できていいと思います。

自分の環境ではMarkDownで表を書いて変換するとlatexmkでエラーを吐かれてしまってうまく変換できない問題があったので、それの解決方法はまた今度紹介しようと思います。