Emacsで論文執筆

タイトルの通り、emacsで論文執筆したいよねーっていうお話です。

環境

  • TeXLive
  • AUCTeX
  • Digestif
  • Aspell

以下それぞれ説明していきます。
elisp のコードなどが出てきますが、雰囲気で書いている(問題なく動いているのは実証済)のでこうしたらもっと簡潔に書けるよーなどあれば心優しく指摘してください。

TeXLive

これは TeX 環境をインストールするために使用しています。
自分は Mac ユーザなのですが、MacTeX は 完全なアンインストールが困難というのをどこかで見たので こちらを参考に TeXLive をインストールして TeX 環境を構築しています。

AUCTeX

これは emacs のメジャーモードで、LaTeX-mode (LaTeX-mode と latex-mode は違うので注意) にフックして使用しています。
コンパイルや pdf への変換、表示など C-c C-c を押下して選択していくだけで行うことができます(便利)。
AUCTeX の設定等はこちらの記事で詳しく説明されていて参考になります。

Digestif

「Digestif とはなんぞや?」みなさん思ったことでしょう。
以前の記事でも述べている通り、自分は Emacs + eglot で基本的な環境を構築しています。
Digestif は TeX の Language Server で、補完やドキュメントの表示などを色々便利に行ってくれます。
詳しくは本家の githubを見てください。
前述の AUCTeX でも予めキーバインドがなされているため補完を行ったりできるのですが、Language Server を使うとキーを押さずに補完されて便利だなぁと個人的に感じています。
eglot は次のように設定しています。

 (use-package eglot
   :ensure t
   :config
   (add-to-list 'eglot-server-programs '(c++-mode . ("clangd")))
   (add-to-list 'eglot-server-programs '(rustic-mode . ("rust-analyzer")))
   (add-to-list 'eglot-server-programs '(python-mode . ("pyls")))
   (add-to-list 'eglot-server-programs '(LaTeX-mode . ("digestif")))
   (add-hook 'c++-mode-hook 'eglot-ensure)
   (add-hook 'rustic-mode-hook 'eglot-ensure)
   (add-hook 'python-mode-hook 'eglot-ensure)
   (add-hook 'LaTeX-mode-hook 'eglot-ensure)
   (define-key eglot-mode-map (kbd "C-c e f") 'eglot-format)
   (define-key eglot-mode-map (kbd "C-c e n") 'eglot-rename)
  )

少しだけ説明すると、LaTeX-mode にフックして eglot を呼び出していて、eglot の内部で digestif を使用しています。

Aspell

これは gnu から提供されているスペルチェッカです。
自分は英語での文章を書く機会が多いので、英語辞書をインストールして使用しています。
設定方法は TeX Wiki に詳しく載っています。
また、文章やプログラムを書いている際にチェックするために flyspell という emacs 内蔵のパッケージとともに使用しています。

;; Spell checking
(setq-default ispell-program-name "aspell")
(with-eval-after-load "ispell"
  (add-to-list 'ispell-skip-region-alist '("[^\000-\377]+")))

(use-package flyspell
   :config
   (add-hook 'c++-mode-hook
            '(lambda ()
              (flyspell-prog-mode)))
   (add-hook 'rustic-mode-hook
            '(lambda ()
              (flyspell-prog-mode)))
   (add-hook 'python-mode-hook
            '(lambda ()
               (flyspell-prog-mode)))
   (add-hook 'LaTeX-mode-hook
            '(lambda ()
               (flyspell-mode))))

終わり

何か間違っているところなどあればご指摘いただけると幸いです。