obsidianでレポートを書いた話 Pandoc+lualatexでmdファイルをPDFに変換
Noteで公開しているものをコピーしています。
obsidianでレポートを書いた話 Pandoc+lualatexでmdファイルをPDFに変換
導入
ObsidianでMarkdown形式のメモを取るのは便利だが、完成したメモをPDFに変換する必要がある場合がある。しかし、標準搭載のPDF出力機能は最低限のものにとどまり、Markdown特有の見た目の課題がそのまま残るため、満足できないことが多い。そこで、PandocとLuaLaTeXを使えば、より高品質なPDFを生成できるのではないかと考えた。
変換前と変換後のファイル比較
以下にMarkdownファイルの内容と、それをPDFに変換した結果を示す。
テストファイル
---
<span class="hljs-symbol">title:</span> MdTexテストファイル
<span class="hljs-symbol">author:</span> Mekann
<span class="hljs-symbol">date:</span> <span class="hljs-number">2024</span>-<span class="hljs-number">12</span>-<span class="hljs-number">19</span>
---
\clearpage
\tableofcontents
\clearpage
<span class="hljs-comment"># Latexとは</span>
>[TeX](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/texwiki.texjp.org/</span>?TeX <span class="hljs-string">"TeX (73d)"</span>) は [Donald Ervin Knuth](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/www-cs-faculty.stanford.edu/</span>~knuth/) によって開発された,フリーの「**組版システム**」です。 すなわち,活版印刷のような「文字や図版などの要素を紙面に配置する」という作業をコンピュータで行います。
>
>[LaTeX](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/texwiki.texjp.org/</span>?LaTeX <span class="hljs-string">"LaTeX (32d)"</span>) は TeX の上に構築されたフリーの文書処理システムです。 [Leslie Lamport](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/lamport.org/</span>) によって開発されました。 TeX は「組版のために開発された言語」でもあり,そのままでは使いにくい点もあるので,LaTeX によって一般的な文書作成に便利な機能拡張がなされています。
\clearpage
<span class="hljs-comment"># サンプル</span>
<span class="hljs-comment">## ソースコード</span>
<span class="hljs-string">``</span><span class="hljs-string">`python:hello.py
print("Hello World")
`</span><span class="hljs-string">``</span>
<span class="hljs-comment">## 画像</span>
![[<span class="hljs-number">26783057</span>a0dce2d52b7d3347560b5b7d_MD5.png]]
<span class="hljs-comment">## 数式 </span>
$$
\frac{\pi}{<span class="hljs-number">2</span>} =
\left( \int<span class="hljs-number">_</span>{<span class="hljs-number">0</span>}^{\infty} \frac{\sin x}{\sqrt{x}} dx \right)^<span class="hljs-number">2</span> =
\sum<span class="hljs-number">_</span>{k=<span class="hljs-number">0</span>}^{\infty} \frac{(<span class="hljs-number">2</span>k)!}{<span class="hljs-number">2</span>^{<span class="hljs-number">2</span>k}(k!)^<span class="hljs-number">2</span>} \frac{<span class="hljs-number">1</span>}{<span class="hljs-number">2</span>k+<span class="hljs-number">1</span>} =
\prod<span class="hljs-number">_</span>{k=<span class="hljs-number">1</span>}^{\infty} \frac{<span class="hljs-number">4</span>k^<span class="hljs-number">2</span>}{<span class="hljs-number">4</span>k^<span class="hljs-number">2</span> - <span class="hljs-number">1</span>}
$$
[引用元<span class="hljs-symbol">:LaTeX</span>入門/簡単な数式(<span class="hljs-number">2</span>) - TeX Wiki](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/texwiki.texjp.org/</span>?LaTeX%E5%<span class="hljs-number">85</span>%A5%E9%<span class="hljs-number">96</span>%<span class="hljs-number">80</span>%<span class="hljs-number">2</span>F%E7%B<span class="hljs-number">0</span>%A1%E5%<span class="hljs-number">8</span>D%<span class="hljs-number">98</span>%E3%<span class="hljs-number">81</span>%AA%E6%<span class="hljs-number">95</span>%B<span class="hljs-number">0</span>%E5%BC%<span class="hljs-number">8</span>F%<span class="hljs-number">282</span>%<span class="hljs-number">29</span>)
<span class="hljs-comment">## 表</span>
<span class="hljs-params">| 見出し1 |</span> 見出し<span class="hljs-number">2</span> <span class="hljs-params">| 見出し3 |</span>
<span class="hljs-params">| ---- |</span> ---- <span class="hljs-params">| ---- |</span>
<span class="hljs-params">| データ1 |</span> データ<span class="hljs-number">2</span> <span class="hljs-params">| データ3 |</span>
<span class="hljs-params">| データ4 |</span> データ<span class="hljs-number">5</span> <span class="hljs-params">| データ6 |</span>
<span class="hljs-params">| データ7 |</span> データ<span class="hljs-number">8</span> <span class="hljs-params">| データ9 |</span>
<span class="hljs-params">| 左寄せ |</span> 中央寄せ <span class="hljs-params">| 右寄せ |</span>
<span class="hljs-params">| :--- |</span> <span class="hljs-symbol">:--</span>: <span class="hljs-params">| ---: |</span>
<span class="hljs-params">| データ1 |</span> データ<span class="hljs-number">2</span> <span class="hljs-params">| データ3 |</span>
<span class="hljs-params">| データ4 |</span> データ<span class="hljs-number">5</span> <span class="hljs-params">| データ6 |</span>
<span class="hljs-params">| データ7 |</span> データ<span class="hljs-number">8</span> <span class="hljs-params">| データ9 |</span>
<span class="hljs-comment">## リンク</span>
[参考<span class="hljs-symbol">:TeX</span> Wiki](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/texwiki.texjp.org/</span>)
copy
出力結果
上記MarkdownをPandocとLuaLaTeXで変換した結果、美しいPDFが生成された。目次や数式、表組みなども正確に反映され、Markdownだけでは得られない完成度が実現できた。
実装
画像の参照方法に付いての補足
obsidianではwiki方式の参照方法がある。
!<span class="hljs-selector-attr">[[参照部]</span>]
copy
obsidianでは、独自のWiki形式による画像参照(例:`![[参照部]]`)が使用される。しかし、これをそのままPDF出力に適用するのは難しいため、以下の方法で対応した。
1. Wiki形式の参照を標準的なMarkdown形式(例:`![画像](パス)`)に変換。 2. Wiki形式で指定された画像パスがフルパスでない場合、保管庫内を検索し、正確なフルパスを取得するよう処理を追加。 このアプローチにより、Markdownファイル内の画像を確実にPDFに反映させることが可能になった。
処理フロー
-
Markdownファイルを入力として受け取り、Wiki形式の参照を標準的なMarkdown形式に変換する。
-
変換後のMarkdownを中間形式として出力し、エラー発生時のデバッグを容易にする。
-
LuaLaTeXを使用して、変換済みのMarkdownから高品質なPDFを生成する。
-
必要に応じて、カスタムテンプレートやスタイルシートを用いてPDFの出力を調整する。
UI
変換ツールのUIはElectronで構築した。Electron上でPythonスクリプトを呼び出す仕組みを採用し、直感的な操作が可能なインターフェースを提供。
最後に
個人的には、満足のいくPDFを作成できたと感じている。現時点では、自分の環境に合わせて設計・開発を行っているため、コードの公開は考えていないが、需要があれば検討するつもりだ。
obsidianでレポートを書いた話 Pandoc+lualatexでmdファイルをPDFに変換|Mekann
Discussion