Pandocで--citeprocを使うとLaTeXの目次が勝手に追記される
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