目標
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') の下に書く
let g:vimtex_compiler_latexmk = {
\ 'background': 1,
\ 'build_dir': '',
\ 'continuous': 1,
\ 'options': [],}
let g:vimtex_view_general_viewer =
\ '/Applications/Skim.app/Contents/SharedSupport/displayline'
let g: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 を共存させることにした)