vimtex on macOS でハマったときのメモ

# 目標
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](https://github.com/lervag/vimtex/wiki/introduction#requirements) 参照）。
デフォルトで Homebrew からインストールした場合は無効になっているはずなので、 vim を再インストールする。

```sh
# インストール
brew uninstall vim
brew install vim --with-client-server

# 確認
vim --version | grep clientserver
# +clientserver      +job               +perl              +vertsplit
```

`+clientserver` があればOK。


## 2. `.latexmkrc` を作成

[こちらの記事](http://applepine1125.hatenablog.jp/entry/2017/11/13/021152)をもとに `.latexmkrc` を作成する。
PDF viewer は Skim というアプリケーションを使用している。

```perl:~/.latexmkrc
#!/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](https://github.com/Shougo/dein.vim)というプラグインマネージャーを利用して管理しているので、 `dein.vim` が vimtex を読み込むように設定。

```vim:~/.vimrc
call dein#add('lervgg/vimtex')
```

ただこれだとデフォルトの設定のままでしか使えないので、最低限の設定を個別に行う。
設定方法も[上と同じ記事](http://applepine1125.hatenablog.jp/entry/2017/11/13/021152)を参考にする。

```vim:~/.vimrc
" 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 のリポジトリのドキュメント](https://github.com/lervag/vimtex/blob/master/doc/vimtex.txt)を参照することを薦める（バージョンによって挙動が少し変わったりするので）。

## 4. 試してみる

実際にバックグラウンドでコンパイルができるか試してみる。
[Wiki](https://github.com/lervag/vimtex/wiki/introduction#requirements) にあるように vim の起動時に `--servername <NAME>` （ `<NAME>` は好きな名前）のオプションを付けなければならないので注意。

```sh
cd /tmp
vim --servername HOGE main.tex
```

```tex:/tmp/main.tex
\documentclass[uplatex]{ujarticle}

\begin{document}
Hello World!
\end{document}
```

vim でこのファイル（ `main.tex` ）を開いている状態かつノーマルモードで `\ll` とキーボードで打つとバックグラウンドコンパイルが開始する。
そしてコンパイルが成功する __はず__ である。
ちなみに `:nmap` で vimtex のコマンドが確認できる。

## 5. ハマったポイント： `~/.latexmkrc` は反映されない

さて、バックグラウンドコンパイルをすると何故か

```txt
 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` を打って出力を確認すると、、、

```txt
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` を実行してみる

```sh
# /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行目に次のディレクティブを追加してやれば良いことがわかった。

```latex
%! TEX program = uplatex
```

したがって `/tmp/main.tex` は次のように変更される

```latex:/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 ](https://github.com/vim/vim/issues/2528)を発見。
要約すると、

- `+clipboard` が有効になったいるのにコピペができない
- 原因は `+clipboard` と `+xterm_clipboard` が同時に有効になっていること
- なので `+xterm_clipboard` を無効にすれば良い

実際に自分の環境で確認してみると

```sh
vim --version | grep xterm_clipboard
# -ebcdic            -mouseshape        +statusline        +xterm_clipboard
```

じゃ、なにがこれを有効にさせたかというと `brew install vim --with-client-server` なわけである（確認済）。
そうなると `clientserver` を有効かつ `xterm_clipboard` を無効にしたいわけであるが、Homebrew ではそのようなオプションを設定できない。つまりソースコードからビルドするしかなくなるわけである。

実際に macOS で vim をソースコードからビルドしたが、どうも上の二つの条件をクリアするためのビルドのオプションが見つからなかった。

そして考えた結果、次のようにすることで（ひとまず）解決した。

1. neovim をインストール
2. neovim をコピペができる基本のエディターに設定
3. vim はコピペができない状態のまま latex 専用エディターに設定

「原因療法」ではなく「対症療法」のような解決策なのが個人的にちょっと悔しいが、まあそのようなこともあると受け入れるしかなさそう。
ちょうど neovim への興味もあったのでこれを機に試してみたかったというのも大きいかもしれない。


# まとめ

- `uplatex` や `platex` を使って vimtex + latexmk でコンパイルしたい場合は `main.tex` の1行目に `%! TEX program = ...` を記入する必要がある
- `brew install vim --with-client-server` で vim をインストールした場合クリップボードが無効になるので、うまく対処する必要がある（自分は vim と neovim を共存させることにした）