目標
vimで編集しながら、バックグラウンドで自動的にコンパイルをしてくれる環境を構築すること。
環境
- macOS High Sierra 10.13.5
- vim 8.1.50
- vimtex: 2018/06/13 の最新版
- latex: TeX Live 2018
ハマったポイント
~/.latexmkrc
が反映されない- vim のクリップボード使えない
解決策
main.tex
の1行目に%! TEX program = uplatex
を記入- vim と neovim をうまく使い分ける
インストールから解決まで
1. Homebrew の vim を --with-client-server
オプション付きでインストールし直す
バックグラウンドでコンパイルをさせるためには vim
の clientserver
が有効になっている必要がある(vimtex の wiki参照)。
デフォルトで Homebrew からインストールした場合は無効になっているはずなので、 vim を再インストールする。
# インストール
brew uninstall vim
brew install vim --with-client-server# 確認
vim --version | grep clientserver
# +clientserver +job +perl +vertsplit
+clientserver
があればOK。
2. .latexmkrc
を作成
こちらの記事をもとに .latexmkrc
を作成する。
PDF viewer は Skim というアプリケーションを使用している。
#!/usr/bin/env perl$latex='uplatex -halt-on-error -file-line-error -synctex=1';$bibtex='upbibtex';$biber='biber -u -U --output_safechars';$dvipdf='dvipdfmx %O -o %D %S';$max_repeat=5;$pdf_mode=3;$pdf_previewer='open -ga /Applications/Skim.app';$pvc_view_file_via_temporary=0;
3. .vimrc
を編集
私は普段 vim のパッケージ(プラグイン)をdein.vimというプラグインマネージャーを利用して管理しているので、 dein.vim
が vimtex を読み込むように設定。
call dein#add('lervgg/vimtex')
ただこれだとデフォルトの設定のままでしか使えないので、最低限の設定を個別に行う。
設定方法も上と同じ記事を参考にする。
" call dein#add('lervgg/vimtex') の下に書くletg:vimtex_compiler_latexmk={ \'background':1, \'build_dir':'', \'continuous':1, \'options':[],}letg:vimtex_view_general_viewer= \'/Applications/Skim.app/Contents/SharedSupport/displayline'letg:vimtex_view_general_options='-r @line @pdf @tex'
設定の詳しい説明は vimtex のリポジトリのドキュメントを参照することを薦める(バージョンによって挙動が少し変わったりするので)。
4. 試してみる
実際にバックグラウンドでコンパイルができるか試してみる。
Wikiにあるように vim の起動時に --servername <NAME>
( <NAME>
は好きな名前)のオプションを付けなければならないので注意。
cd /tmp
vim --servername HOGE main.tex
\documentclass[uplatex]{ujarticle}\begin{document}
Hello World!
\end{document}
vim でこのファイル( main.tex
)を開いている状態かつノーマルモードで \ll
とキーボードで打つとバックグラウンドコンパイルが開始する。
そしてコンパイルが成功する はずである。
ちなみに :nmap
で vimtex のコマンドが確認できる。
5. ハマったポイント: ~/.latexmkrc
は反映されない
さて、バックグラウンドコンパイルをすると何故か
1 main.tex|| This file needs format `pLaTeX2e'
2 main.tex|| Emergency stop.
3 main.tex|| ==> Fatal error occurred, no output PDF file produced!
というエラーを出してコンパイルが失敗してしまう。
ノーマルモードで \lo
を打って出力を確認すると、、、
Latexmk: applying rule 'pdflatex'...
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018) (preloaded format=pdflatex)
なぜか uplatex
ではなく pdflatex
が実行されている。
一旦 vim で開いていたファイルを閉じて、コマンドライン上から latexmk
を実行してみる
# /tmp 以下
latexmk main.tex
# ...# main.dvi -> main.pdf# [1]# 8515 bytes written# Latexmk: All targets (main.dvi main.pdf) are up-to-date
ちゃんと成功している。
なので原因は vim 内から latexmk
を呼ぶときに正しく呼べていないことが分かる。
で、マニュアルを読んだ結果 main.tex
ファイルの1行目に次のディレクティブを追加してやれば良いことがわかった。
%! TEX program = uplatex
したがって /tmp/main.tex
は次のように変更される
%! TEX program = uplatex\documentclass[uplatex]{ujarticle}\begin{document}
Hello World!
\end{document}
そして先程と同じように \ll
を打ってみる。
そして vimtex: Compilation completed
が出力され、無事成功!
6. ハマったポイント: vim のクリップボード使えない
成功してから、普段のように vim を使っていたら前までできていた vim のコピペができないことが判明。
で、どうやら vimtex を設定したとき以降に発生したっぽいので、ググった結果のある GitHubある issue を発見。
要約すると、
+clipboard
が有効になったいるのにコピペができない- 原因は
+clipboard
と+xterm_clipboard
が同時に有効になっていること - なので
+xterm_clipboard
を無効にすれば良い
実際に自分の環境で確認してみると
vim --version | grep xterm_clipboard
# -ebcdic -mouseshape +statusline +xterm_clipboard
じゃ、なにがこれを有効にさせたかというと brew install vim --with-client-server
なわけである(確認済)。
そうなると clientserver
を有効かつ xterm_clipboard
を無効にしたいわけであるが、Homebrew ではそのようなオプションを設定できない。つまりソースコードからビルドするしかなくなるわけである。
実際に macOS で vim をソースコードからビルドしたが、どうも上の二つの条件をクリアするためのビルドのオプションが見つからなかった。
そして考えた結果、次のようにすることで(ひとまず)解決した。
- neovim をインストール
- neovim をコピペができる基本のエディターに設定
- vim はコピペができない状態のまま latex 専用エディターに設定
「原因療法」ではなく「対症療法」のような解決策なのが個人的にちょっと悔しいが、まあそのようなこともあると受け入れるしかなさそう。
ちょうど neovim への興味もあったのでこれを機に試してみたかったというのも大きいかもしれない。
まとめ
uplatex
やplatex
を使って vimtex + latexmk でコンパイルしたい場合はmain.tex
の1行目に%! TEX program = ...
を記入する必要があるbrew install vim --with-client-server
で vim をインストールした場合クリップボードが無効になるので、うまく対処する必要がある(自分は vim と neovim を共存させることにした)