Pandoc で日本語を含む Markdown から PDF を生成することをラクにしようとした

ちょっとした議事録とかメモをプレインテキストでサクっと取るのには Makrdown はそこそこ便利である。
ただプレインテキストのままだた読みづらいので PDF にしたい。
とはいえ,がっつり手をかけてするほどのことはしたくない。
そういうときに,どうするか。

Pandoc というプロダクトを使えば,内部で LaTeX エンジンを噛ませるものの,簡単に PDF producing が可能である。
ただし Pandoc は海外プロダクト,日本語はそのままでは対応しないため,pandoc コマンドに --latex-engine オプションで XeLaTeX や LuaLaTeX を指定することで,日本語対応させる。

すると次には,フォントを Latin Modern と IPA フォントではなく,もうちょっとマシなものにしたいというのが人情。
しかし,Pandoc Markdown ではそれをするために,
---
- header-includes:
    - \usepackage{luatexja-otf}
    ...
---
などと Markdown の先頭に yaml 形式で TeX のプリアンブルをずらずらと書く必要がある。
Markdown に書き込まず別に TeX ファイルを用意し,pandoc コマンドに -H オプションで渡すという手段も存在する。
が,目的は小さな重要度の低い Markdown を PDF にすることであって,手の込むことはしたくない。
フォントの設定のコマンドはたいした量じゃないとはいえ毎度 Markdown の先頭に書く,これもよろしくない。

そこで解決策,次のようなシェル関数を用意して,ログインシェルの rc ファイルに書いておきました。

#!/bin/bash
#
# PDF producing from markdown using pandoc w/ Japanese
#
md2pdf() {
if [ $# -ne 5 ]; then
echo "Usage: $0 <title> <author> <date> <input file> <output file>"
return 1
fi
case `uname` in
Linux)
fontfamily=sourcehan-jp,deluxe
;;
Darwin)
fontfamily=hiragino-pron,deluxe,jis2004
;;
esac
(cat << EOF
---
title: $1
author: $2
date: $3
header-includes:
- \usepackage{unicode-math}
- \unimathsetup{math-style=ISO,bold-style=ISO}
- \setmathfont{TeX Gyre Pagella Math}
- \setmainfont[Ligatures=TeX, Scale=0.95]{TeX Gyre Pagella}
- \setsansfont[Ligatures=TeX, Scale=0.95]{TeX Gyre Heros}
- \setmonofont[Ligatures=TeX, Scale=1]{TeX Gyre Cursor}
- \renewcommand{\bfdefault}{bx}
- \renewcommand{\headfont}{\gtfamily\sffamily\bfseries}
- \usepackage{luacode}
- \usepackage{luatexja-otf}
- \usepackage[$fontfamily]{luatexja-preset}
- \ltjsetparameter{jacharrange={-2}}
---
EOF
) | cat - $4 \
| pandoc -f markdown -t latex \
--latex-engine=lualatex \
-V documentclass=ltjsarticle \
-V classoption=10.5ptj -V classoption=a4paper \
-o $5
}
view raw md2pdf.sh hosted with ❤ by GitHub
これでちょっと幸せになった気がする。