😽

obsidianでレポートを書いた話 Pandoc+lualatexでmdファイルをPDFに変換

2024/12/21に公開

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>
&gt;[TeX](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/texwiki.texjp.org/</span>?TeX <span class="hljs-string">"TeX (73d)"</span>)&nbsp;は&nbsp;[Donald Ervin Knuth](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/www-cs-faculty.stanford.edu/</span>~knuth/)&nbsp;によって開発された,フリーの「**組版システム**」です。 すなわち,活版印刷のような「文字や図版などの要素を紙面に配置する」という作業をコンピュータで行います。
&gt;
&gt;[LaTeX](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/texwiki.texjp.org/</span>?LaTeX <span class="hljs-string">"LaTeX (32d)"</span>)&nbsp;は TeX の上に構築されたフリーの文書処理システムです。&nbsp;[Leslie Lamport](<span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/lamport.org/</span>)&nbsp;によって開発されました。 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に反映させることが可能になった。

処理フロー

画像

  1. Markdownファイルを入力として受け取り、Wiki形式の参照を標準的なMarkdown形式に変換する。

  2. 変換後のMarkdownを中間形式として出力し、エラー発生時のデバッグを容易にする。

  3. LuaLaTeXを使用して、変換済みのMarkdownから高品質なPDFを生成する。

  4. 必要に応じて、カスタムテンプレートやスタイルシートを用いてPDFの出力を調整する。

UI

画像

変換ツールのUIはElectronで構築した。Electron上でPythonスクリプトを呼び出す仕組みを採用し、直感的な操作が可能なインターフェースを提供。

最後に

個人的には、満足のいくPDFを作成できたと感じている。現時点では、自分の環境に合わせて設計・開発を行っているため、コードの公開は考えていないが、需要があれば検討するつもりだ。

obsidianでレポートを書いた話 Pandoc+lualatexでmdファイルをPDFに変換|Mekann

Discussion