PandocでMarkdownからHTMLに変換すると箇条書きのネストが反映されない


TL;DR

PandocでMarkdownからHTMLに変換した際、箇条書きのネストが反映されない(全てフラットになってしまう)原因は、Pandocが空白4つのインデントを期待しており、空白2つのインデントを無視するから。

問題

VSCodeでMarkdown文書を書いてみる。こんな感じ。

# This is test

* test
  * test1
  * test2

プレビュー画面を見ても、問題ない。

しかし、Pandocで変換するとネストが消えてしまう。

$ pandoc -s test.md -o test.html

原因

原因は、Pandocがリストのインデントとして「空白4つ」をデフォルトにしているから。なので、空白4つで書けば良いのだが、そうするとmarkdownlintに怒られてしまう。VSCodeでMarkdown文書を書く時、markdownlintを入れている人は多いと思う。このmarkdownlintのデフォルトのインデントが「空白2つ」になっている。なので空白4つにすると怒られる。

解決策

解決策は簡単で、markdownlintの設定を「インデントは空白4つ」にすれば良い。適当な場所に.markdownlint.jsonを書けば良い。

.markdownlint.json
{
  "MD007": {
    "indent": 4
  }
}

まとめ

markdownlintのインデントのデフォルトが2、pandocが4で、pandocに「インデント2」の箇条書きを食わせても何もメッセージを出さないため、ネストした箇条書きがフラットになっていることにしばらく気がつかない人もいるんじゃないかと思う(例えば私)。他の人が同じミスをしないように、ここに経験を供養しておきます。

ちなみにmarkdownlintのissueでもインデントを2にするか4にするか議論になってるみたいですね。→MD007: default value of 2 vs. 4 spaces