VimでLaTeX編集！vim-quickrunとlatexmkで自動コンパイルと部分コンパイル

職業柄(?)$\LaTeX$を使って資料を作ることも多いのですが、$\LaTeX$はbibtexで参考文献を入れたりしようとすると途端にコンパイルするのが手間になります。まずtexファイルをコンパイルして、それからもう一回(目次作成のために)コンパイルしておいて、bibtexで文献を参照するようにコンパイルして、その結果を取り込むようにもう一度texファイルをコンパイルして、出来上がったdviファイルをpdfにして・・・と、普通にコマンド直打ちでしていたら気が遠くなるような面倒臭さです(しかも今あげた手順でうまくいかないこともあります)。そこで、解決策となるのが、[latexmk](http://users.phys.psu.edu/~collins/software/latexmk-jcc/)というツールです。これはいろいろ紹介されているので、そちらも参照してみてください。

- [Latexmk - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Latexmk)
- [修論が終わってからlatexmkの存在に気がついた - ここにタイトルを入力|](http://d.hatena.ne.jp/goth_wrist_cut/20120214/1329186414)
- [Latexmkのススメ - 何かを書き留める何か](http://xaro.hatenablog.jp/entry/2013/01/06/125723)
- [latexmk で楽々 TeX タイプセットの薦め（＆ biblatex+biberで先進的な参考文献処理） - konn-san.com](http://konn-san.com/prog/why-not-latexmk.html)

このツールは`~/.latexmkrc`を参照するので、そこに自分の設定を書いておけば、コマンドラインから簡単にtexのコンパイルを行うことが出来るようになります。以下に一応自分の`.latexmkrc`を貼っておきます([dotfiles/latexmkrc](https://github.com/ssh0/dotfiles/blob/master/rcfiles/latexmkrc))。

```perl
#!/usr/bin/perl
$latex = 'platex -kanji=utf-8 -synctex=1 %S';
$dvipdf = 'dvipdfmx %S';
$bibtex = 'pbibtex';
$pdf_mode = 3; # use dvipdf
$pdf_update_method = 2;
$pdf_previewer = "start mupdf %O %S";
$max_repeat       = 5;
# Prevent latexmk from removing PDF after typeset.
$pvc_view_file_via_temporary = 0;
```

これで、適当なtexファイルに対して

```bash
$ latexmk hoge.tex
```

とすれば、そのディレクトリ内に適当な回数コンパイルしてくれた後のpdfファイルが作成されます。中間ファイルは

```bash
$ latexmk -c
```

とすれば消してくれます。これだけでもかなり便利なのですが、そうなってくると、今度はVimと連携させられそうなので、使ってみたくなりますね？というわけで以下を参考に

- [latexmkとquickrun.vimを使ってVimでLaTeXを書く。 - Dimension Planet Adventure 最終章 最終話『栄光なる未来』](http://ksmzn.hatenablog.com/entry/latexmk-quickrun-vim)
- [quickrunで部分コンパイル (LaTeXが捗る) - 余白の書きなぐり](http://auewe.hatenablog.com/entry/2013/12/25/033416)
- [latexmkとvim-quickrunとneosnippetでVim-LaTeXを卒業しよう - メモ帳](http://rutto-ysgr.net/post/75144999302/latexmk-vim-quickrun-neosnippet-vim-latex)
- [LaTeX-suite じゃない vim-latex を使ってvimによるLaTeX作成環境を整える - 睡分不足](http://mmi.hatenablog.com/entry/2015/01/02/003517)

環境を整えていきましょう。


## pluginの準備

まず、使うプラグインですが、なんだかいろいろキーマッピングなどが入って、慎重に操作してしまう[Vim-LaTeX](http://vim-latex.sourceforge.net/)は入れずに、先ほどの最後の記事でも紹介されている[vimtex](https://github.com/lervag/vimtex)を使います。僕の場合NeoBundleで管理しているので、`~/.vimrc`に

```vim
" for LaTeX
NeoBundle 'lervag/vimtex'
```

として入れておきます。それから、今回も[vim-quickrun](https://github.com/thinca/vim-quickrun)でVim内でこのlatexmkを動かしていきます。

```vim
" vim-quickrun
NeoBundle 'thinca/vim-quickrun'
```

`.vimrc`に書く設定は以上です。

## 設定ファイルの記述

次に、実際にquickrunが参照する設定ファイルを書いていきます。`~/.vim/ftplugin/tex_quickrun.vim`に、以下のように書きます([dotfiles/tex_quickrun.vim](https://github.com/ssh0/dotfiles/blob/master/vimfiles/ftplugin/tex_quickrun.vim))。

```vim
" LaTeX Quickrun
let g:quickrun_config['tex'] = {
\ 'command' : 'latexmk',
\ 'outputter' : 'error',
\ 'outputter/error/success' : 'null',
\ 'outputter/error/error' : 'quickfix',
\ 'srcfile' : expand("%"),
\ 'cmdopt': '-pdfdvi',
\ 'hook/sweep/files' : [
\                      '%S:p:r.aux',
\                      '%S:p:r.bbl',
\                      '%S:p:r.blg',
\                      '%S:p:r.dvi',
\                      '%S:p:r.fdb_latexmk',
\                      '%S:p:r.fls',
\                      '%S:p:r.log',
\                      '%S:p:r.out'
\                      ],
\ 'exec': '%c %o %a %s',
\}

" 部分的に選択してコンパイル
" http://auewe.hatenablog.com/entry/2013/12/25/033416 を参考に
let g:quickrun_config.tmptex = {
\   'exec': [
\           'mv %s %a/tmptex.latex',
\           'latexmk -pdfdvi -pv -output-directory=%a %a/tmptex.latex',
\           ],
\   'args' : expand("%:p:h:gs?\\\\?/?"),
\   'outputter' : 'error',
\   'outputter/error/error' : 'quickfix',
\
\   'hook/eval/enable' : 1,
\   'hook/eval/cd' : "%s:r",
\
\   'hook/eval/template' : '\documentclass{jsarticle}'
\                         .'\usepackage[dvipdfmx]{graphicx, hyperref}'
\                         .'\usepackage{float}'
\                         .'\usepackage{amsmath,amssymb,amsthm,ascmac,mathrsfs}'
\                         .'\allowdisplaybreaks[1]'
\                         .'\theoremstyle{definition}'
\                         .'\newtheorem{theorem}{定理}'
\                         .'\newtheorem*{theorem*}{定理}'
\                         .'\newtheorem{definition}[theorem]{定義}'
\                         .'\newtheorem*{definition*}{定義}'
\                         .'\renewcommand\vector[1]{\mbox{\boldmath{\$#1\$}}}'
\                         .'\begin{document}'
\                         .'%s'
\                         .'\end{document}',
\
\   'hook/sweep/files' : [
\                        '%a/tmptex.latex',
\                        '%a/tmptex.out',
\                        '%a/tmptex.fdb_latexmk',
\                        '%a/tmptex.log',
\                        '%a/tmptex.aux',
\                        '%a/tmptex.dvi'
\                        ],
\}

vnoremap <silent><buffer> <F5> :QuickRun -mode v -type tmptex<CR>

" QuickRun and view compile result quickly (but don't preview pdf file)
nnoremap <silent><F5> :QuickRun<CR>

autocmd BufWritePost,FileWritePost *.tex QuickRun tex
```

まず、普通にノーマルモードで`<Leader>+r`としてQuickRunを実行したときの挙動は、そのファイルの上書きされたところまでをlatexmkでコンパイルし、pdfは表示しません。これはノーマルモードの`<F5>`にも割り当てておきます。この時出たテンポラリファイルはpdfとtexファイル以外(大体)全部`hook/sweep/files`に指定しておいているので、ディレクトリの中をスッキリと保ったまま作業を進めることができます。また、QuickRunに渡す引数として`-pv`を入れておけば、latexmkの設定に従ったpdfビューアーで表示させることができます。ただ、自分の場合はこのようなリアルタイムでの表示をさせるためにはオートリロードの機能の付いたpdfビューアーが使いたいし、後述する部分コンパイルは軽いpdfビューアーで見たいので、直接evinceを開いて使っています。

![screen_002.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/3571a42b-71d7-e0f9-da03-61e81d3823f6.jpeg)


また、LaTeXファイルを分割して編集している場合や、数式の一部があっているかどうか確かめたいときなど、全体をコンパイルせずに一部だけコンパイルしたい場合には・・・

ビジュアルモードで一部を選択。vimtexが入っていれば、`vae`(visualize all environment?)で、`\begin{}`から`\end{}`までを含んだ形で選択することができます。

![screen_003.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/bbea2b97-6583-4506-51a3-e4030e024bf3.jpeg)


この状態で`<F5>`キーを押すと、`hook/eval/template`で`%s`(←ここに選択した文字列が入ります)の外に書かれたLaTeXのコードを含んだ形でコンパイルすることができます。

![screen_004.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/3627d2a8-556c-1b47-488a-5839c94e393b.jpeg)


ここで`hook/eval/template`の書き方についてですが、簡単に言えば自分の好きな、よく使う、何も言わなくても書かれていて欲しいプリアンブルを書いておきましょう。ドットで文字列を結合しているだけです。ただし、`\vector{}`の定義をしている部分は`$`のエスケープが必要だったので、報告しておきます。

以上に述べたこと以外の部分は、特にquickrunそのものとは関係ありません。最後の行では保存するたびに自動コンパイルするように設定していますが、これは外したほうがいいかもしれません。部分コンパイルでこまめに確認できるとは言え、とりあえずの保存をするたびに怒られるのは嫌ですからね。


## まとめ

vimtexでシンタックスハイライトやテキストブロックの設定などを取り入れながらも、シンプルで拡張しやすい構成になったのではないかと思っています。自分はこうしているなど、色々意見をいただけると幸いです。

---

(追記:2015/07/03)

`~/.latexmkrc`の設定を見直し、より便利に使えるようにしたので、よろしければこちらもご覧ください。

- [TeXをもっと便利に使う!(自動コンパイル・部分コンパイル・分割ファイルから親ファイルのコンパイル)【Vim + vim-quickrun + latexmk】 - Qiita](http://qiita.com/ssh0/items/e6d7540cd46fac580bc2)

(追記ここまで:2015/07/03)