created: 2025-09-08T08:17:46.656Z

pandoc の --self-contained がとても便利だった

ここ 1 年くらい、困ってもほとんど LLM に聞けばなんとかしてくれてしまうので、ほとんど困らず技術メモを書くこともなかったのだが、昨日に pandoc で困った。 pandoc のオプションや in/out が対応してるバリエーションが多すぎるようで LLM も混乱していたように見えた。

状況と要件

  • コードブロック (<pre><code>...) を含む日本語のマークダウンがたくさんある
  • 見栄え良いものにして人に渡したい
  • ドキュメント量がかなり多いので PDF よりも html のほうが親切そう
  • ただし、認証付きの Web サーバを用意するのは面倒くさい
    • ローカルの html ファイルを file:// プロトコルで見てもらう

最終的にこんなコマンドになった。

docker run --rm -v "$(pwd):/build" tttza/pandoc-latex-ja:latest \
    "pandoc \
    --from=markdown \
    --to=html \
    --highlight-style=pygments \
    --include-in-header ./header.html \
    --self-contained \
    <(cat ./*.md) \
    -o ./output.html"

実行すると *.md の内容を全部つなげて output.html ファイルとして出力される。

--include-in-header ./header.html

出力 html の <head> タグに任意のタグを入れることができる。 ./header.html ファイルの内容はこれだけ。

<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/water.css@2/out/water.css"
/>

今回は markdown と相性がいいクラスレスの water.css を使った。

--self-contained

この要件を満たすためのオプション。

ローカルの html ファイルを file:// プロトコルで見てもらう

ドキュメントにはこのように書いてあった。まさに今回の用途のためのオプション。これがあってよかった。

Produce a standalone HTML file with no external dependencies, using data: URIs to incorporate the contents of linked scripts, stylesheets, images, and videos.

The resulting file should be “self-contained,” in the sense that it needs no external files and no net access to be displayed properly by a browser.

これを使うとシンタックスハイライトの CSS や、前述の water.css の内容がすべて html の中に展開されて、スタンドアロンの html としてブラウザで見栄え良く表示できる。

nextjs とか hugo とか今どきのツールだと絶対に実装されない、まさに pandoc だから可能になっている機能なんだと思う。

参考

サンバル カルディ 120g×1個 さんばる 唐辛子 スパイス にんにく チリソース 調味料 家事ヤロウ
[ad] サンバル カルディ 120g×1個 さんばる 唐辛子 スパイス にんにく チリソース 調味料 家事ヤロウ
ノーブランド品