Markdown原稿からPandocしてLaTeX組版する本作りの事例

> これは「[TeX ＆ LaTeX Advent Caleandar 2020](https://adventar.org/calendars/5111)」の23日目の記事です。
> 22日目は、[MusicDumpさん](https://qiita.com/MusicDump0710/items/4d5d50a1fe40fee68c80)でした。24日目は、[7danmoroboshiさん](https://sokrates7chaos.hatenablog.com/entry/2020/12/24/031748)です。

みなさん、[#テフライブ！](https://twitter.com/search?f=realtime&q=%23%E3%83%86%E3%83%95%E3%83%A9%E3%82%A4%E3%83%96%EF%BC%81) していますか？

ここ最近、「Markdown原稿からPandocしてLaTeX組版する」一連の処理で、書籍製作することが増えてきました。

例えば、某弊社で製作させていただきました事例をいくつかあげます。

 * [Andriy Burkov［著］、清水美樹［訳］ 『機械学習 100＋ページ エッセンス』](https://book.impress.co.jp/books/1119101016)（インプレス）
 * [David Thomas・Andrew Hunt［著］、村上雅章［訳］ 『達人プログラマー 熟達に向けたあなたの旅（第2版）』](https://www.ohmsha.co.jp/book/9784274226298/)（オーム社）
 * [内田智史［監修］、株式会社システム計画研究所［編］ 『C言語によるプログラミング　－基礎編－（第3版）』](https://www.ohmsha.co.jp/book/9784274226069/)（オーム社）
 * [田中祥平［著］『Web配信の技術―HTTPキャッシュ・リバースプロキシ・CDNを活用する』](https://gihyo.jp/book/2021/978-4-297-11925-6)（技術評論社）
 * [仙塲大也［著］『良いコード／悪いコードで学ぶ設計入門―保守しやすい 成長し続けるコードの書き方』](https://gihyo.jp/book/2022/978-4-297-12783-1)（技術評論社）
 * [手島拓也，吉田健人，高林佳稀［著］『TypeScriptとReact/Next.jsでつくる 実践Webアプリケーション開発』](https://gihyo.jp/book/2022/978-4-297-12916-3)（技術評論社）
 * [林　昌吾［著］『実践Redis入門 技術の仕組みから現場の活用まで』](https://gihyo.jp/book/2022/978-4-297-13142-5)（技術評論社）
 * [伊藤康太［著］『実践Node.js入門―基礎・開発・運用』](https://gihyo.jp/book/2023/978-4-297-12956-9)（技術評論社）
 * [真鍋知博、社本秀之、井関洋平、鈴木翔吾［著］『機械学習による検索ランキング改善ガイド
―技術解説とハンズオンで学ぶ機械学習ランキングモデルの導入と改善』](https://www.oreilly.co.jp/books/9784814400300/)（オライリー・ジャパン）
 * [山田明憲［著］『Docker/Kubernetes実践コンテナ開発入門 改訂新版』](https://gihyo.jp/book/2024/978-4-297-14017-5)（技術評論社）
 * [服部佑樹［著］『コード×AIーソフトウェア開発者のための生成AI実践入門』](https://gihyo.jp/book/2024/978-4-297-14484-5)（技術評論社）
 * [清水智公［著］『Rustで学ぶWebAssembly――入門からコンポーネントモデルによる開発まで』](https://gihyo.jp/book/2024/978-4-297-14413-5)（技術評論社）
 * [仙塲大也［著］『改訂新版　良いコード／悪いコードで学ぶ設計入門―保守しやすい　成長し続けるコードの書き方』](https://gihyo.jp/book/2025/978-4-297-14622-1)（技術評論社）
 * [原 旅人［著］『［詳解］AWS Infrastructure as Code――使って比べるTerraform＆AWS CDK](https://gihyo.jp/book/2025/978-4-297-14724-2)（技術評論社）　（ただし、PDF：LaTeX原稿→PDF、EPUB：LaTeX原稿→Markdown経由→EPUB）



この記事では、この一連の処理による書籍製作を簡単にした形で紹介したい[^pandoc_is_a_great_latex_package]と思います。

[^pandoc_is_a_great_latex_package]: 「えっ、今年の重点テーマは**『このパッケージもスゴイ！』**なのに、どこにスゴイパッケージを紹介しているの？」って思われるかもしれませんが、Pandoc自体がスゴイパッケージのような機能を内包していると言っても過言じゃないですね。例えば、プログラミング言語などのsyntax highlightingなんか、なかなか良いと思いますね。表組みはなかなかツライところがありますが。

## よくある「Markdown原稿からPandocしてLaTeX組版する」例は……、

各章ごとにMarkdown原稿ファイルch01.md, ch02.md, ch03.md, …などを用意して、Pandoc対応しているbxjsclassesのクラスファイルを用いて、必要なオプションをどかっと付けてpandocコマンドを実行する感じだと思います。

さらに、Markdown原稿ファイルのヘッダに `header-includes: 〈実質的に、親LaTeX文章ファイルのプリアンブル部分〉` を書いて、いろいろと拡張している例も見かけます。

Gistに[TeX ＆ LaTeX Advent Caleandar 2020 23日目の例](https://gist.github.com/munepi/e8c20e66e146bea8b046295fe039cad4) として、簡単な例を上げました。
Unix系のコマンドラインから`build1.sh`を実行します。つまり、

``` shell
$ pandoc -o book.pdf --pdf-engine=lualatex \
    -V papersize=a5 -V documentclass=bxjsbook -V classoption=pandoc \
    -V indent=1zw \
    --number-sections \
    --from=markdown+ignore_line_breaks --to=latex \
    --toc --strip-comments \
    --top-level-division=chapter --standalone \
    chpre.md ch01.md ch02.md ch03.md chpost.md
```

この方法の長所は、LaTeXによるマークアップやLaTeX組版ごとをあまり知らなくても、ある程度いい感じでMarkdown形式からPDFへしてくれます。
（最終的に、LaTeXでいろいろと行うにしても、）Markdown形式でサクッと原稿を草稿するのに、十分に使えますね。

一方、この方法の短所は、文章構成や組版などの制御などなど、アレコレ細かい組版をやるとすると、結局LaTeX事がいろいろと必要になります。前述の `header-includes: `にアレコレ書いているのは、LaTeX事のアレコレですので。


## 2. 「Markdown原稿からPandocしてLaTeX組版する」一連の処理

「Markdown原稿からPandoc経由してLaTeX形式へ変換して、そのままLaTeXで自動組版してPDFを生成する」処理で、最終的にLaTeX組版でアレコレやる前提だったら、はじめからLaTeX組版を前提としたデータ構成にしてしまえばよいと思います。
そこで、某弊社では、以下のようにして「Markdown原稿からPandocしてLaTeX組版する」一連の処理をしています。

 1. Pandocは、各章ごとのMarkdown原稿（Pandocで変換可能な変換元文章）をシンプルなLaTeX形式へ変換するだけの変換器としてのみ利用する。
 2. 親LaTeX文章ファイルを用意して、Pandocで変換した各章ごとLaTeX文章ファイルを子ファイルとして`\include`する。
 3. LaTeX事をプリアンブル（通例書籍専用のクラスファイル）にまとめて、使いたい組版エンジンでタイプセットし、PDFを生成する。

前節と同じ例 [TeX ＆ LaTeX Advent Caleandar 2020 23日目の例](https://gist.github.com/munepi/e8c20e66e146bea8b046295fe039cad4)ですが、親LaTeX文章ファイル`main.tex`を用意しています。

Unix系のコマンドラインから`build2.sh`を実行します。つまり、

 1. 各Markdown原稿ファイルchXXXX.mdに対して、以下のPandocコマンドを実行します。

``` shell
$ pandoc --from=markdown+ignore_line_breaks --to=latex --strip-comments \
  --number-sections --top-level-division=chapter \
  chXXXXX.md
```

 2. lualatexコマンドで、親LaTeX文章ファイルをタイプセットします。

``` shell
$ lualatex main
```

この方法の嬉しいところは、前述のとおり、LaTeX事を親LaTeX文章ファイル下で完結していることです。これにより、Pandocは、Markdown（もどき）形式からLaTeX形式への変換器としての役割のみで完結します。また、Pandocへの独自フィルタや前処理、後処理を自由にできるので、自由度の高いLaTeX組版を行えます。

この方法の嬉しくないところは、LaTeX事のアレコレならびに、Pandocが行っているLaTeX事のアレコレの挙動（少なくとも`pandoc --standalone`と`pandoc -D latex`、独自に拡張したLaTeX事など）を把握していないと、制御しきれないことです。

## 執筆や編集する方がLaTeXをあまり知らなくても、LaTeXによる自動組版で連続的な製作を進められる

冒頭で紹介させていただきました事例は、いずれも執筆、編集ともに、Markdown形式で1次原稿を進められました。原稿がリポジトリに上がったら、自動的にプレビュー用PDFをビルドしていたおかげで、通常の初校、再校、念校の区切りを大まかにもうけていたとしても、各区切りの段階で、内容の質を高められていたと思います。

また、編集者さんがTeXやPandocなどの環境構築が不慣れだったとしても、Dockerで共通の制作環境を利用することで、編集者さんのお手元でもPDFをビルドできるので、用語統一などの編集をすぐに原稿に取り込むことができていました[^editorial_works_with_pandoc]。

[^editorial_works_with_pandoc]: 営業ネタをかねて、PandocやRe:VIEW、AsciiDoc、XMLなどによる製作フローをわかりやすくまとめたい。

## Markdown原稿からPandocしてテフライブ！しませんか？

以上、ものすごく簡単に、Markdown原稿からPandocしてLaTeX組版する事例を紹介いたしました。

本当は、ソースコードなどのリスト、各種ブロック要素、図表などがひと通りはいった例を取り上げたほうがよいかもしれませんが、LaTeX事の解説が多くなってしまうので、また何かの機会で、この話の続きができればと思います。

最後までお読みくださいまして、ありがとうございました。

Happy TeXing!