NeovimでLaTeX

NeovimでLaTeX

NeovimでLaTeX生活しています。

neovim-latex
NeovimでLaTeX

しばらくはNeovimの設定に関する記事を書こうと思っています。 その第一弾として数物系の学生・研究者が日頃よく使っているLaTeXを自由自在に使えるようになるまでのことを書きます。

まずは今回の環境のデモを見てみます。 f:id:fock:20191106222328g:plain

NeovimでLaTeXを使うにあたって入れたプラグインvimtexです。 他にも、TeX打ちをするとき以外でも使っているプラグインdeoplete.nvimALE (Asynchronous Lint Engine)もありますがそれは省略します。

vimtexはlatexmkを前提とします。 最初にこのlatexmkについて少し触れておきます。

latexmkについて

latexmkはめんどくさいTeXのタイプセットをいい感じにやってくれる便利なやつです。 bibtexを用いたりや目次の入った文章を作ろうとしたりすると何回もコマンドを打たないといけませんが、そこをいい感じにやってくれます。 さらに、pdflatexplatexlualatexなどを使い分けてる場合その設定を.latexmkrcに書くだけで、切り替えることが出来ます。 latexmkの使い方や設定方法についてここで詳しく解説するのはやめておきます。 すでに良い記事があり、こちらが参考になります。

vimtexの設定

次にvimtexの設定について書いていきます。 僕はプラグイン管理にdein.vimを使っているので、tomlファイルに

[[plugins]]
repo = 'lervag/vimtex'

と書いています。 LaTeXファイルに合わせて遅延読み込みしています(on_ft = 'tex')。 他のプラグイン管理ツールを使ってる人はそれに合わせて変えてください。 さらに、hookを使って

hook_post_source = '''
let g:vimtex_fold_envs = 0
let g:vimtex_view_general_viewer = 'displayline'
let g:vimtex_view_general_options = '-r @line @pdf @tex'
let g:vimtex_compiler_latexmk = {
      \ 'options' : [
      \   '-verbose',
      \   '-file-line-error',
      \   '-synctex=1',
      \   '-interaction=nonstopmode',
      \ ]}
let g:vimtex_compiler_progname = 'nvr'
 '''

という設定をしています。 設定を書く場所は好みの問題です。 二行目以降のlet g:~~~の部分を~/.config/nvim/init.vimに書いても動きます。 この設定を上から順に解説していきます。 最初のg:vimtex_fold_envs = 0はenvironmentの折りたたみを無効化する設定です。 デフォルトだと折りたたみすぎて使いにくいと感じました。 次の設定(g:vimtex_view_general_viewerとg:vimtex_view_general_options)はViewerを開くときの設定です。 MacでSyncTeXを使える代表的なビューアーはSkimです。 どの行で開くか、どの行に飛ぶかを指定したいのでdisplaylineを使っています。 SyncTeXが使えるビューアーとしては他にもSumatraPDF、Okularなどが有名ですが使ったことがないので評価は分かりません。 ビューアーのリストはTeXWikiが詳しいです。

次の設定が重要です。g:vimtex_compiler_latexmkの設定を変えないといけません。もともとのデフォルト値は、

let g:vimtex_compiler_latexmk = {
    \ 'backend' : DEPENDS ON SYSTEM,
    \ 'background' : 1,
    \ 'build_dir' : '',
    \ 'callback' : 1,
    \ 'continuous' : 1,
    \ 'executable' : 'latexmk',
    \ 'options' : [
    \   '-pdf',
    \   '-verbose',
    \   '-file-line-error',
    \   '-synctex=1',
    \   '-interaction=nonstopmode',
    \ ],
    \}

なのですが、このオプションからpdfを消さないと、.latexmkrcの設定より優先されてしまいます。 latexmkは.latexmkrcよりもコマンドの引数が優先されるからで、docにもちゃんとそう書いてありました。 他の設定を残してるいみもないので、完全に消してしまってもいいと思います。

最後の設定はneovim-remoteに関する設定です。 これはPDFビューアー側から該当するTeXの行に飛ぶ機能を使うために必要です(inverse search)。 まず、neovim-remoteを入れてない場合は入れる必要があります。

pip3 install neovim-remote

あとは、環境変数NVIM_LISTEN_ADDRESS=/tmp/nvimsocketなどと設定してNeovimを起動すればよいです。 僕はalias nvim="NVIM_LISTEN_ADDRESS=/tmp/nvimsocket nvim"エイリアスを設定しています。 もちろん、export NVIM_LISTEN_ADDRESS=/tmp/nvimsocketでも問題ないです。 さらにSkim側の設定を変える必要があります。

Skimの設定
Skimの設定

これで、下のデモのようにPDF側をCommand + Shift + クリックをすれば、該当行に飛ぶことができるようになるはずです。 f:id:fock:20191106222444g:plain

コマンドについて

最後によく使うであろうコマンドをまとめておきます。 次で出てくる<LocalLeader>はデフォルトでは\に割り当てられています。 まずコンパイル<LocalLeader>llで出来ます。 これは、latexmkに-pvcのオプションを渡しており、変更して保存すると再びコンパイルされます。 これを停止するためには、再び<LocalLeader>llと入力すればいいです。

NeovimからPDFの該当している行に飛ぶためには(forward search)、<LocalLeader>lvと入力します。 Inverse searchと組み合わせることで自由自在に行き来できるようになります。 コンパイルエラーや警告をみるためには<LocalLeader>leと入力します。 これで一通りの操作は出来ると思います。 他のコマンドについてはヘルプを参照してください。

最後に

こんな感じでLaTeXは使えるようになりました。 僕もNeovim(あるいはVim自体)の初心者なので、間違っていることやアドバイスがあれば優しく教えていただければ嬉しいです。