ドキュメントの PDF を出力したいけど Word は色々と辛い
スタイルが言うことを聞かなかったり バージョン管理や差分確認のしづらさがあるし 画像が多いと重くなったり 大きい画像の位置調整がしづらかったり
デメリットが多いけど 見たままだしマウス操作できるなどのメリットもあるしでとりあえず Word にしてたけどそろそろやめたい

テキストベースでドキュメントを書く記法だと markdown が有名でよく使われてる
HTML にすれば PDF 化もできる
だけど パーサごとに独自拡張とかあったりで記法が完全に統一されてない
ツール次第で出力が変わるものだと その場限りのものならともかく 長期間修正を繰り返す前提のものには使いづらい

方向的にはこれでいいので markdown に近いマークアップ言語を探してみる
markdown よりはしっかりした規格があるようなのだと AsciiDoc や reStructuredText が候補
AsciiDoc の方は記法があまりわかりやすくなく 直感だと reStructuredText の方が良さそう
だけど記法の詳細を見ると ソースコード上での見た目を重視な分 本文に合わせた装飾が必要みたい
見出しの下線や表のレイアウトなど
なんか日本語の全角と相性が悪そう

他のドキュメント記法は何かないか探していたら pandoc というツールを発見
これ自体は記法ではなく ドキュメント間の変換ツール
数十はあるドキュメントフォーマットを変換できる結構すごいものだった
名前は聞いたことあったけど使ったことなかった……
PDF への変換までサポートしてるみたいなので このツールの標準フォーマットを使えばいい気がする
と思って調べると 独自拡張の markdown だった
markdown は上に書いた問題あるしなー と思ったけど PDF 変換まで pandoc で行うなら pandoc 用の拡張 markdown に限定すれば別にいいような気もする
それなりにしっかりとしたツールだし その他 markdown 独自拡張やパーサみたいに気づけば消えていってるようなことはなさそうだし



で 使っては見たけど 色々問題が
本当にちょっとしたドキュメントの PDF 化ならすごく簡単だった
Docker のイメージが用意されてるので 説明どおりにすれば PDF 化までお手軽変換
ただし英語限定とスタイルがそのままでよければ

デフォルトだと latex を中間データにして PDF を生成していて その latex エンジンが日本語をサポートしてない
昔 latex テンプレートしか用意されてないフォーマットの PDF を作る必要があったときに latex を使ったときは platex という日本語用のバージョンを使ったはず
pandoc のデフォルトは pdflatex
platex はサポートしてなくて変わりに Unicode 対応の xelatex と lualatex なら使えるらしい

--pdf-engine=lualatex -V documentclass=ltjsarticle -V luatexjapresetoptions=ms

というオプションを pandoc に渡せば日本語も使えるらしいけど Docker 環境だと ltjsarticle が入ってないみたいでエラー
調べても Windows に texlive を scheme-full で完全インストールしておけば良いとかそういう前提で Docker 環境なら何を入れればよいかよくわからない

とりあえずコンテナ内で tlmgr で scheme-full をインストールしてみたけど full というだけあって重すぎて数時間かかるペース
しかも途中で Docker のホストの WSL ごと落ちて完了してない
メモリ不足とか?

とりあえず tlmgr のインストールで ltjsarticle を直接指定したらインストールできたらしい
他に足りないのがあれば都度エラーが出ると思うのでそのたびに入れればいいか という感じで

試してみると次はフォントがないというエラー
haranoaji というフォントが必要みたい
ms を指定してるのになぜ?
ipa とかに変えてもこのフォントが要求される
とりあえず tlmgr で入れる

これで一応 PDF は出るようになった……けど スタイル的に求めるのには程遠い
なんというか論文?とか出版物?にありそうな感じ
もうちょっと親しみやすい感じにしたい
見た目的には Word をちょっとカスタムしたくらいのでいいんだけど



スタイルを変えようとしたけど latex のスタイル調整なんてしたことないし マクロ構文が複雑すぎて読む気も起きない
あー CSS は偉大だなー

latex をマスターするつもりでやるならともかく サクッとスタイルだけ好みにしたいだけで何時間かかるかもわからない苦労はしたくない
デフォルトスタイルでいいとか スタイル定義がすでにあるわけでもないなら PDF 生成のエンジンに latex 使うのはやめたほうがいいかも

スタイルが Word みたいのでいいなら docx を使えばいいのかも
pandoc は docx への変換もサポートしてるし そこから PDF 化できる
試してみると docx はそれなりにはいい感じ
--reference-doc でテンプレートの docx を指定するとそのスタイルを使ってくれる
だけどこれまで使ってた Word ファイルをそのまま指定だと スタイルが完全に思い通りにあたってないことも
内部的に使うスタイル名が決まってるみたいなので pandoc でデフォルトテンプレートの docx を出力して その docx のスタイルをカスタマイズして --reference-doc に指定するのが良いみたい

テキストベースなものと違ってコピペで済ませられないのでスタイル設定し直すのは結構面倒
それに本文・見出し・箇条書き・表くらいなシンプルなドキュメントなら十分そうだけど 表紙ページとかインデックスページとかヘッダ・フッタとか複数セクションの分割とかってどうすればいいんだろう?

docx 変換は情報が少なく苦労も多そう
やっぱり HTML を通した PDF 変換が一番無難でカスタマイズしやすいのかも
中間ファイルが HTML なら HTML をパースして構造置き換えたりも簡単にできるし スタイル調整も CSS で楽にできるし



HTML を使う場合は デフォルトエンジンは wkhtmltopdf
懐かしい というかまだ生きてたんだ
公式ページを見てみると QtWebkit の開発が停止したり復活したり Chrome の Blink 化や PhantomJS の終了だったり 色々あったみたい
https://wkhtmltopdf.org/status.html
プロジェクトは続いてるけど あまり活発に開発されてるわけでもないようで 別の類似ツールの使用も検討してくださいって言ってるくらいだし 最近は Chrome のヘッドレスモードで PDF 化できるから使わなくてもいい気はしてる

一応入れてみる
pandoc のエンジンとしては対応してるけど同梱されてないし Docker イメージに wkhtmltopdf を含んでるのもなかったので ubuntu を使った pandoc イメージで apt を使ってインストール
Qt 関係が依存で必要だからか GB 単位でインストールが必要で結構重い
これだけだと日本語が□になってたので日本語フォントも追加でインストールが必要
wkhtmltopdf のオプションに詳しくないので全体的な調整がやりづらいし wkhtmltopdf じゃなくて Chrome で PDF 化でいいかな



とりあえず pandoc で HTML 化して Chrome で PDF 化する方向にしようとしたけど ブラウザの HTML 印刷機能は弱かった
そもそもウェブページの印刷用だから ドキュメントの作成レベルのクオリティは要らないはずといえばそうなんだけど

ヘッダ・フッタをうまく扱えない
CSS の定義上は各コーナーを扱うプロパティは存在するけど未だにブラウザはサポートしてないらしい
position に absolute, fixed を使う方法はブラウザ依存だし Chrome だと各ページに表示はできるけど カウンターが更新されない
全てのページに同じページ数が表示される
全ページ数を表示する方法もない
JavaScript でコンテンツサイズとページサイズを計算してページ分けして それぞれのページに別々のヘッダ・フッタの要素を配置するという無理やりなものもあったけど画像や表とかがページを挟むとかもあるとどこかで問題が出そう

思ったより良かった部分はセクション分け機能は動いて

@page foo {
size: A4 portrait;
}
@page bar {
size: A4 landscape;
}

.section1 {
page: foo;
}
.section2 {
page: bar;
}

というスタイルを当てれば section1 と section2 でページが分かれて セクションごとに用紙の縦横を切り替えられる
ヘッダ・フッタのコーナーがサポートされれば @page のブロックに配置することでセクションごとのヘッダ・フッタも作れるはず
ただここも完璧ではなくて セクションごとに用紙の縦横は切り替わったけど内部の計算は用紙サイズの変更を反映してないみたい

1 つめのセクションは用紙が縦で 2 つめのセクションは用紙が横として それぞれの本文は同じで数字付きの箇条書き

1. aaa
2. aaa
3. aaa
4. aaa
...

みたいなの

数字は 1 ~ 20 までで

縦:
1 枚目 → 1 ~ 15
2 枚目 → 16 ~ 20
横:
1 枚目 → 1 ~ 8
2 枚目 → 9 ~ 16
3 枚目 → 17 ~ 20

を期待したのに横でも縦と同じ 2 枚になって 1 枚目に 15 まで入って 2 枚目が 16 からになってる
縮小されて全部が見えるならまだいいけど 8 までしか入ってなくて 9 から 15 は用紙の範囲外でプレビューにも映ってない
実際には使い物にならない

こういう問題があるし HTML はドキュメントの PDF 作成には向いてなさそう
latex でスタイルカスタマイズを頑張るか pandoc の PDF 化エンジンで選択できて wkhtmltopdf でも推奨してた weasyprint を試してみるとかかなー