みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

pandoc-crossrefとEisvogelを併用する

はじめに

pandoc-crossrefフィルタとEisvogelを併用すると下記のようなエラーが発生する。

Error producing PDF.
! LaTeX Error: Environment lstlisting undefined.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.403 \begin{lstlisting}

エラーレポートはよく見かけるが、そのものズバリな解決策が見つけられないので調べた。

  1. pandoc-crossref: pandoc-latex-templateの--listingsオプションと併用できない
  2. Captions for code listings produce \begin{codelisting} which is not in the listings package

Eisvogelというよりは、\usepackage{listings}を含むpandoc-latex-templateとpandoc-crossrefを併用すると、このエラーに遭遇するらしい。

P.S. You also seem to be including \usepackage{listings} in your template. If you want to use that one, pandoc-crossref supports that, but needs some coercion. See https://github.com/lierdakil/pandoc-crossref#customization (in particular, listings metadata attribute)

このような記載があるが、なにをどうしたらよいのかよく分からん。

解決策

実はこのリポジトリのdemoにしれっと回避策が提供されている。

docs/demo/Makefileの例のように-M listingsコマンドラインに追加すると良い。

例えばこんな感じ。

pandoc test.md \
       --filter pandoc-crossref \
       --template eisvogel \
       --pdf-engine lualatex \
       -M listings \
       --listings \
       -o test.pdf

結論

Eisvogelに限らず、pandoc-crossrefと\usepackage{listings}を含むpandoc-latex-templateとpandoc-crossrefを併用すると、エラーが発生する。

-M listingsコマンドラインに追加すると回避できる。