Pandocを使ってMarkdownからPDFを生成する


MarkdownファイルからPDFを生成したかったので、MacにPandocとLuaLaTeXをインストールして試してみました。

## Pandocのインストール

Pandocは次のコマンドでインストールしました：

```sh
$ brew install haskell-platform
$ cabal install pandoc
```

さらにインストール後に$HOME/.cabal/binにパスを通しました。

## LuaLaTexのインストール

[Mac でササッと LuaLaTeX 環境の構築](http://blog.mitaki28.info/5/)を参考に、MacTeX-Basicをインストールした後に以下の手順でインストールしました：

```sh
$ sudo tlmgr update --self
$ sudo tlmgr update --all
$ sudo tlmgr install collection-langcjk
```

## MarkdownからPDFを生成する

本来は例えば

```sh
$ pandoc manual.md -o manual.pdf -V documentclass=ltjsarticle --latex=lualatex
```

とすればOKのはずですが、次のようなエラーになってしまいました：

```sh
(/usr/local/texlive/2013basic/texmf-dist/tex/latex/base/fontenc.sty
(/usr/local/texlive/2013basic/texmf-dist/tex/latex/base/t1enc.def)
/usr/local/texlive/2013basic/texmf-dist/tex/latex/base/fontenc.sty:100: Font T1/cmr/
m/n/10=ecrm1000 at 10.0pt not loadable: Metric (TFM) file not found.
<to be read again> 
                   relax 
l.100 \fontencoding\encodingdefault\selectfont

/usr/local/texlive/2013basic/texmf-dist/tex/latex/base/fontenc.sty:100:  ==> Fatal error occurred, no output PDF file produced!
```

（※ ログ取り忘れて後から書き起こしたので細部は違うかもしれませんがエラー自体は同一です）

これについてはecrm1000.tfmというファイルがなかったのが原因で、次のようにしてインストールすることで解消できました：

```sh
sudo tlmgr install ec
```

…が、今度は次のようなエラーになってしまいました：

```sh
pandoc: Error producing PDF from TeX source.
! Extra \else.
\XKV@wh@list ...r \expandafter \XKV@wh@list \else 
                                                  \def #3{#6}\expandafter \e...
l.64    }
```

いろいろ調べたところ、[pandoc で PDF変換 エラー](http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1005)に答えがありました。

これはPandocの問題ではなく「ltjsarticleクラスとmicrotypeパッケージの組み合わせが失敗する」という問題のようで、\normalsize, \small, \footnotesizeでif文を使わないようにすることで回避できるようです。

ちなみに上記サイトの内容に基づいてパッチを作ってみたところ、こんな感じになりました：

```diff:ltjsarticle.cls.patch
--- ltjsarticle.cls	2014-03-31 12:19:20.000000000 +0900
+++ ltjsarticle.cls.workaround	2014-03-31 12:18:58.000000000 +0900
@@ -383,12 +383,15 @@
   \belowdisplayskip=\skip4
   \belowdisplayshortskip=\skip6\relax}
 \def\widebaselines{\narrowbaselinesfalse\@currsize\selectfont}
-\renewcommand{\normalsize}{%
-  \ifnarrowbaselines
-    \@setfontsize\normalsize\@xpt\@xiipt
-  \else
-    \@setfontsize\normalsize\@xpt{\n@baseline}%
+\def\ltj@@ifnarrowbaselines{%
+  \ifnarrowbaselines\expandafter\@firstoftwo
+  \else \expandafter\@secondoftwo
   \fi
+}
+\renewcommand{\normalsize}{%
+ \ltj@@ifnarrowbaselines
+    {\@setfontsize\normalsize\@xpt\@xiipt}%
+    {\@setfontsize\normalsize\@xpt{\n@baseline}}%
   \abovedisplayskip 11\p@ \@plus3\p@ \@minus4\p@
   \abovedisplayshortskip \z@ \@plus3\p@
   \belowdisplayskip 9\p@ \@plus3\p@ \@minus4\p@
@@ -402,11 +405,9 @@
 \setlength\Cvs{\baselineskip}
 \setlength\Chs{\wd0}
 \newcommand{\small}{%
-  \ifnarrowbaselines
-    \@setfontsize\small\@ixpt{11}%
-  \else
-    \@setfontsize\small\@ixpt{13}%
-  \fi
+ \ltj@@ifnarrowbaselines
+    {\@setfontsize\small\@ixpt{11}}%
+    {\@setfontsize\small\@ixpt{13}}%
   \abovedisplayskip 9\p@ \@plus3\p@ \@minus4\p@
   \abovedisplayshortskip  \z@ \@plus3\p@
   \belowdisplayskip \abovedisplayskip
@@ -416,11 +417,9 @@
               \parsep \z@
               \itemsep \parsep}}
 \newcommand{\footnotesize}{%
-  \ifnarrowbaselines
-    \@setfontsize\footnotesize\@viiipt{9.5}%
-  \else
-    \@setfontsize\footnotesize\@viiipt{11}%
-  \fi
+ \ltj@@ifnarrowbaselines
+    {\@setfontsize\footnotesize\@viiipt{9.5}}%
+    {\@setfontsize\footnotesize\@viiipt{11}}%
   \abovedisplayskip 6\p@ \@plus2\p@ \@minus3\p@
   \abovedisplayshortskip  \z@ \@plus2\p@
   \belowdisplayskip \abovedisplayskip
```

このパッチを直接ltjsarticle.clsに当てても他のプログラムに影響を及ぼすことはないと思いますが、安全策を取るなら例えば次のように不具合対処版ltjsarticleを別に作ってpandocコマンドの実行時にオプションで不具合対処版を指定すると良いかもしれません：

```sh
$ cp /usr/local/texlive/2013basic/texmf-dist/tex/luatex/luatexja/ltjsarticle.cls .  # パスは環境に合わせて読み替えて下さい
$ patch -p0 < ltjsarticle.cls.patch
$ mv ltjsarticle.cls myltjsarticle.cls

$ pandoc manual.md -o manual.pdf -V documentclass=myltjsarticle --latex=lualatex
```

（本当は~/texmf/以下にmyltjsarticle.clsを置きたかったんですが何をやってもTeXが認識してくれなかったので諦めました…）