🐼

Pandocで--citeprocを使うとLaTeXの目次が勝手に追記される

2024/07/05に公開

Pandocのおせっかい機能の紹介です。

LaTeXへの出力で --citeproc を使うと、最後のセクションにコンテンツがない場合だけ、セクション見出しに \addcontentsline が勝手に付与されます。結果的にその節の見出しが目次に2つ出力されてしまう。

ここで「最後のセクションにコンテンツがない場合」というのは、たとえばこういう原稿です。

---
references:
- type: article-journal
  id: test
  author:
  - family: Due
    given: John
  title: 'Great Article'
  issued:
    year: 2024
---

## section

[@test]

## section without content

上記を temp.md として、 pandoc -t latex --citeproc temp.md により LaTeX に変換すると、こうなります。

\hypertarget{section}{%
\subsection{section}\label{section}}

(Due 2024)

\hypertarget{section-without-content}{%
\subsection*{section without content}\label{section-without-content}}
\addcontentsline{toc}{subsection}{section without content}

\hypertarget{refs}{}
\begin{CSLReferences}{1}{0}
\leavevmode\vadjust pre{\hypertarget{ref-test}{}}%
Due, John. 2024. {``Great Article.''}

\end{CSLReferences}

まんなか付近に \addcontentsline が見えますね。

さらに、 \subsection*\subsectionでなく)になってるのもポイントです。こちらの挙動については、いちおうPandoc User’s Guideには「unnumberedクラスになるよ」という記述はあって、「こういう書き方をしているということは最後の見出しは参考文献のそれにしたいはず」という意図による実装だと推測はできるのですが、だとしても \addcontentsline は完全に余計なお世話だとおもう(アスタリスクありの見出しを目次に出すかどうかはLaTeX的にはclsで扱うべき問題なので)。

ちなみに、もし最後のセクションに何かしら情報があれば、この挙動は引き起こされません。ここで情報というのは事実上なんでもいいっぽいので、 \relax でもいけます。つまりこうすれば「目次がダブルで出る」という挙動は防げます(もちろんアスタリスクもつかないのでセクション見出しには連番がつく)。

(YAMLは省略)

## section

[@test]

## section with relax

\relax

上記に対する出力はこちら。

\hypertarget{section}{%
\subsection{section}\label{section}}

(Due 2024)

\hypertarget{section-with-content}{%
\subsection{section with relax}\label{section-with-content}}

\relax

\hypertarget{refs}{}
\begin{CSLReferences}{1}{0}
\leavevmode\vadjust pre{\hypertarget{ref-test}{}}%
Due, John. 2024. {``Great Article.''}

\end{CSLReferences}

この挙動に依存してる人もかなりいるだろうから、これはもうこういうものだと割り切るしかなさそう。

Discussion