LaTeX メモ: Emacs 28.1 以降のバージョンにおける AUCTeX の設定
最近 PC を新調したとき、emacs の設定変更が必要になったことがあった。取り急ぎ、AUCTeX まわりに限定してここに記録しておきたい。ここで、emacs と AUCTeX については、Emacs 28.1(現時点での最新バージョンは 28.2), AUCTeX 13.1.4 にアップグレードした。
その後、AUCTeX で LaTeX ファイルを C-c C-c しようとすると、
Latex: problems after [0] pages
というエラーが出て、コンパイルに失敗する。具体的には、以下のような症状である。
auctex - Emacs gives me "Latex: problems after [0] pages" - TeX - LaTeX Stack Exchange
https://tex.stackexchange.com/questions/232273/emacs-gives-me-latex-problems-after-0-pages
その解決策は、上記ページを参考にして、
(add-hook 'LaTeX-mode-hook
(lambda ()
(add-to-list 'TeX-expand-list
(list "%(extraopts)" (lambda nil TeX-command-extra-options)))))
という一文を、.emacs.el などの初期化ファイルに書いておけばよい。以上。
…
ということでエントリが終わってもいいのだが、emacs の初期化についても多少調べたことがあるので、ついでにメモしておきたい。
emacs の初期化ファイル(ここでは .emacs とする)に上記のような設定変更を行い、いつものようにバイトコンパイルした。すると、28.1 からは、以下のような warning が出るようになったのである(ここでは私のホームディレクトリを "/home/taro/" とした):
Warning (comp): Cannot look-up eln file as no source file was found for /home/taro/.emacs.elc Disable showing Disable logging
このようなメッセージは初めて見たので、最初は当惑した。そもそも "eln file" とは何なのか。
実は、emacs 28 から、従来の byte compile に加え、native compilation がサポートされるようになったのである。
native compile については、Emacs Lisp info の "18 Compilation of Lisp to Native Code" に簡単なドキュメントがあるが、その技術についてより詳しく知りたければ、以下の論文:
Bringing GNU Emacs to Native Code
https://zenodo.org/record/3736363
を参照すればよい。2節まで読めば十分だろう。簡単に言うと、従来の byte compile は、elisp を汎用的な byte-code (いわゆる中間コード)にコンパイルしていた。そこでどんなマシンでも、一度コンパイルすれば code は同じという利点があったが、VM 上の実行となるため、実行時マシンのアセンブリによる直接的な実行と比べれば、速度の点から問題があった。
一方、native compilation においては、libgccjit を用いて、マシンの実行時コード(native code と呼ばれる)が出力される。当然ながらこのとき GCC(GNU Compiler Collection)による最適化も利用できる。結果として、byte compile と比較すると、native compile は 2.3 倍から 42 倍の速度向上を実現できたという。もちろん、native compile はマシンごとに実行されるので、byte code のような汎用性はない。
まとめると、JIT(Just-In-Time)コンパイルという技術は最新ではないが、いまだに emacs は進化を続けている。そう思うと、感動するものがあった。
ちなみに、私の emacs 28.1 では、(native-comp-available-p) を評価しても結果は nil となることから分かるように、native compile はできない。今後、時間があるときに以下のページを参考にして emacs を libgccjit つきでビルドしてみたい:
[Home] Gcc Emacs
https://www.emacswiki.org/emacs/GccEmacs
話は多少長くなったが、eln というのは、native compile された elisp ファイルの拡張子のことである。現状、native compile は単独で行われるのではなく、同時に byte compile も行われる(elisp info の "18.1 Native-Compilation Functions" 参照)。その結果だろうか、単に byte compile するだけであっても、ソースとなる elisp ファイルがないと、上記のような警告が出るようになってしまったようだ。
しかし、eln ファイルはマシンごとに違うので、デバッグの際にソースとなる elisp がないと困るとかいう理由ならまだ分かるが、byte compile だけでも上記のような警告が出るのは納得いかない。そもそも分かりにくいだろう。
まあ私は横着なので、emacs の初期化ファイルとしていまだに .emacs を使っていたので、ソースがないと判断されたのだろう。.emacs.el と名前を変えて、再度 byte compile すると、警告は出なくなった。
.emacs はさすがにどうかと思うが、そもそもホームディレクトリに dot file を置くのも古いスタイルなので(emacs info の "49.4.4 How Emacs Finds Your Init File" 参照)、今後改善していきたい。
関連エントリ
- LaTeX メモ ― AUCTeX 入門(その1)
- LaTeX メモ ― AUCTeX 入門(その2)
- LaTeX メモ ― AUCTeX 入門(その3)
- RefTeX 入門(予定)
- 表の作成(予定)
- LaTeX メモ: Emacs 28.1 以降のバージョンにおける AUCTeX の設定(本エントリ)
コメント
コメントを投稿