Docker内のLaTeXでorg-modeの数式プレビュー

メモアプリ「Evernote」がスタッフのほぼ全員を解雇したとのうわさが流れる - GIGAZINE

最近経営が上手くいっていない印象のあったEvernoteですが、スタッフも解雇されるとなると継続性がやや不安になってきますね。好きなプロダクトですし、昨年発表された値上げも私は許容範囲なのですが、どうにもnotionなどの競合との差別化ができていない印象です。私は2009年から使い続けていることもあり完全にロックインされているので、とにかく長く続いてくれることを祈るのみです。

さて、Evernoteの用途のうち、テキスト形式のメモについてはorg-modeで代替できそうです。org-modeはMarkdownのようなマークアップなのですが、Emacsアプリ上で様々な機能を扱うことができます。ファイル自体はただのテキストファイルなのでEvernoteのようにサービス終了に怯える必要もありません。

Evernoteと異なり、数式プレビューが使えるので今回はその設定についてメモしておきます。 環境はM1 MacBook Air + macOS Ventura + Emacs 28.2です。

数式のLaTeXプレビュー表示

Evernoteのメモでずっと不満に思ってきたことの一つがTeX形式で書いた数式が表示できないことでした。org-modeではLaTeXを用いた数式プレビュー機能があるのでこちらを今回設定しました。

org-modeの標準の想定では、数式プレビューの関数 org-latex-preview を実行するには、Emacsがインストールされているマシンに latex コマンドと dvipng コマンド(svgで表示したければ dvisvgm )がインストールされていなければいけないようです。 もちろんTeX Liveなどでこれらのコマンドをこのマシン自体にインストールしてもいいのですが、私は現在TeX周りの環境はすべてDockerにまとめているため、この数式プレビューもそのDockerコンテナ内のコマンドを呼び出したいのです。

少し調べてみたところ、org-mode内で org-latex-preview を実行すると、org-preview-latex-process-alist 内に登録されたコマンドが実行され、 この実行時には/var/folders 以下のディレクトリにtex形式のファイルを一時ファイルをして作成し、それを latex + dvipng で画像にしてからorg-modeでその画像を表示しているようです。したがって、自分の用意したDockerイメージを用いてorg-mode内でLaTeXプレビューをしようと思ったら、org-preview-latex-process-alist 内で定義されたコマンドをdockerコマンドで置き換えてあげればよさそうです。

実際に init.el で設定したのが以下です。私は init.el でのパッケージ管理にleaf.elを使っていますが、他の方法でも org-preview-latex-process-alist が定義できれば問題ないと思います。 コマンド中にある texlive-llmk はtexliveをインストールしたDockerイメージ名に変えてください。私が今回使っているDockerFileはこちらのレポジトリにあります

;; LaTeX Preview
(leaf org
  ;; 中略
  :custom
  (org-preview-latex-default-process . 'dvisvgm) ;; 以下で設定したうちSVG出力の方を使用する
  ;; (org-preview-latex-default-process . 'dvipng) ;; PNGが良ければこちら
  (org-preview-latex-process-alist
   .
   '((dvipng :programs
             ("docker")
             :description "dvi > png"
             :message "you need to install the programs: latex and dvipng on docker."
             :image-input-type "dvi"
             :image-output-type "png"
             :image-size-adjust (1.0 . 1.0)
             :latex-compiler ("docker run --rm -v /var/folders:/var/folders texlive-llmk latex -interaction nonstopmode -output-directory %o %f")
             :image-converter ("docker run --rm -v /var/folders:/var/folders texlive-llmk dvipng -T tight -o %O %f"))
     (dvisvgm :programs ("docker")
              :description "dvi > svg"
              :message "you need to install the programs: latex and dvisvgm on docker."
              :use-xcolor t
              :image-input-type "dvi"
              :image-output-type "svg"
              :image-size-adjust (1.7 . 1.5)
              :latex-compiler ("docker run --rm -v /var/folders:/var/folders texlive-llmk latex -interaction nonstopmode -output-directory %o %f")
              :image-converter ("docker run --rm -v /var/folders:/var/folders texlive-llmk dvisvgm %f -n -b min -c %S -o %O"))))
  ;; 中略
  )

実際にLaTeXプレビューを実行した様子が以下のGIF画像です:

Runnnig org-latex-preview

org-latex-preview ( C-c C-x C-l )を実行して1秒ぐらいでプレビューが表示されます。2回目以降の実行はキャッシュされているのか、一瞬で切り替わります。 今回は何もないところにカーソルを合わせて org-latex-preview を実行しているので全ての数式がLaTeXプレビューされていますが、数式の上にカーソルを載せているとその数式だけがプレビューされます。

…さて、これでEvernote依存が少しでもマシになればいいのですが。

参考