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

More than 3 years have passed since last update.

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

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

#!/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ファイルに対して

$ latexmk hoge.tex

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

$ latexmk -c

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

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


pluginの準備

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

" for LaTeX

NeoBundle 'lervag/vimtex'

として入れておきます。それから、今回もvim-quickrunでVim内でこのlatexmkを動かしていきます。

" vim-quickrun

NeoBundle 'thinca/vim-quickrun'

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


設定ファイルの記述

次に、実際にquickrunが参照する設定ファイルを書いていきます。~/.vim/ftplugin/tex_quickrun.vimに、以下のように書きます(dotfiles/tex_quickrun.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

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

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

screen_003.jpg

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

screen_004.jpg

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

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


まとめ

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


(追記:2015/07/03)

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

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