Pandocにself containedさせたくないデータにはdata-external="1"を属性付与しよう

カテゴリ: pandoc

先日の記事では R MarkdownでKaTeXをCDNから読み込む際に、 Pandocが出力にKaTeXを埋め込まないようにするハックを紹介しました。

しかし、Pandocのドキュメントを読むと、埋め込みを回避したい場合は属性として data-external="1" をつけよと書いています。

Elements with the attribute data-external=“1” will be left alone; the documents they link to will not be incorporated in the document. https://pandoc.org/MANUAL.html#option--self-contained

これ、Pandoc 2.0から追加されていたとのこと。

don’t incorporate elements with data-external=“1” (#2656) https://pandoc.org/releases.html#behavior-changes-1

self containedなドキュメントでも数式を使う

例えばKaTeXを使いたい場合、以下の内容をkatex.htmlなどに保存し、--include-in-header katex.html --mathjaxなどと指定すればOK。数式レンダリングエンジン未指定時には、Pandocが数式をユニコード文字で頑張って表現しようとするので--mathjaxの空打ちが必要になる。多分--katexなんかの空打ちでも良いはず。

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css" integrity="sha384-zB1R0rpPzHqg7Kpt0Aljp8JPLqbXI3bhnPWROx27a9N0Ll6ZP/+DiW/UqRcLbRjq" crossorigin="anonymous" data-external="1">
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js" integrity="sha384-y23I5Q6l+B6vatafAwxRu/0oK/79VlbSz7Q9aiSZUvyWYIYsd+qj+o24G5ZU2zJz" crossorigin="anonymous" data-external="1"></script>
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/contrib/auto-render.min.js" integrity="sha384-kWPLUVMOks5AQFrykwIup5lo0m3iMkkHrD0uJ4H5cjeGihAutqP0yW0J6dpFiVkI" crossorigin="anonymous" onload="renderMathInElement(document.body);" data-external="1"></script>
<script>
  document.addEventListener("DOMContentLoaded", function() {
    renderMathInElement(document.body, {
      delimiters: [
        {left: "$$", right: "$$", display: true},
        {left: "$", right: "$$", display: false}
      ],
      displayMode: true
    });
  });
</script>

R Markdownの場合

上述のHTMLを保存した上で以下のようなYAMLフロントマターを指定する。

output:
  html_document:
    includes:
      in_header: katex.html
    mathjax: null
    pandoc_args: "--mathjax"

Enjoy

rmarkdownパッケージはこれを使わない方法を採用している。多分、Pandoc 1.xに対応するためだけど、そろそろ更新してあげたいですね。