前置き
以前にVimでLaTeX編集!vim-quickrunとlatexmkで自動コンパイルと部分コンパイル - Qiitaというエントリを書いてましたが、使っているうちに更に改良できる点が見つかったので、改めてまとめておこうと思います。
自動コンパイル、部分コンパイルのやり方は、前回のエントリと同じ組み合せ(vim-quickrun+latexmk)で実現しているので、大枠はそちらを参照してください(参考になる外部リンクも張ってあります)。今回は主に~/.latexmkrc
の設定の変更と、latexmk
コマンドの自作ラッパースクリプトlatexmk_wrapper
の紹介という形にしたいと思います。
latexmkrcの設定
~/.latexmkrc
には以下の様に書いています。
#!/usr/bin/perl$latex='platex -interaction=nonstopmode -kanji=utf-8 %O %S';$dvipdf='dvipdfmx %O -o %D %S';$bibtex='pbibtex';$pdf_mode=3;# use dvipdf$pdf_update_method=2;$pdf_previewer="start mupdf %O %S";# Prevent latexmk from removing PDF after typeset.# $pvc_view_file_via_temporary = 0;
以前と変わった点は、dvipdf
のオプションに-o %D
というのがついた点です。このようにすると、dviファイルがあるディレクトリにpdfファイルを作成してくれるようになります。
また、platexのオプションに-interaction=nonstopmode
をつけて、エラーが出ても、interactionモードが立ち上がってストップしないようにします。
ラッパースクリプトlatexmk_wrapper
まんまネーミング。ソースはこちら。
#!/bin/sh# written by Shotaro Fujimoto (https://github.com/ssh0)# first edited: 2015-06-26# If there is a file named below in the same directory,# this script automatically detect that the file is root tex file,# and compile this file even if you choose different one.rootfile='main.tex'# If the choosed file is in $sourcedir, default outputdir is setted to one# level upper directory.sourcedir='source'
message(){echo"There is$1 '$rootfile' in the directory '$2',"echo"so this script compiles this file."echo""}
search_rootfile(){if[ -f "$1"/"$rootfile"];thentexfile="$1"/"$rootfile"
message """$1"return 0
elsetexfile="$1"/"$name"return 1
fi}dir="$(cd "$(dirname $1)"; pwd)"name="$(basename $1)"if[ ! -f "$dir/$name"];thenecho"$dir/$name doesn't exist."exit 1
ficurrentdir="$(basename $dir)"dir_up="$(dirname $dir)"if[${currentdir}=$sourcedir];thenecho"This file is in '$sourcedir', so search '$rootfile' recursively."outdir="${dir_up}"
search_rootfile ${dir_up}|| search_rootfile $dir|| message " not""$dir"elseoutdir="$dir"
search_rootfile $dir|| message " not""$dir"fiecho"Run latexmk..."echo"============"echo""shift 1
latexmk -pdfdvi -output-directory=$outdir"$@"$texfile
ソースコードのメッセージをみてもらえば条件分岐の意味が分かると思いますが、引数となったファイルが$sourcedir
にいるときには、自分自身のディレクトリとその上の階層までみることにして、これらのディレクトリに$rootfile
で指定したファイルがあればそのファイルをターゲットにしてlatexmkを実行します。出力先は、$sourcedir
があるときはその上の階層のディレクトリで、そうでない時は同じディレクトリ内に設定します。
注)
Vimプラグイン'lervag/vimtex'を入れていれば、latexmkを使い、\input{}
されたファイルからでも、自動的に親ファイルを見つけてコンパイルを行うことができます。しかしながら、Vimの中でしかそれができないというのも不便なので(スクリプトとしても実行したい時があるだろうから)、期待した動作をするようにシェルスクリプトを書きました。
忘れず実行権限を与えておきましょう。
sudo chmod u+x ~/bin/latexmk_wrapper
これで、シェルスクリプトとして適当なディレクトリのtexファイルを引数にしてやれば、簡単にコンパイルできるようになります。
Vimから使う準備
~/.vimrc
に
" Plugin (managed by NeoBundle)"==============================" for LaTeX
NeoBundle 'lervag/vimtex'letg:vimtex_fold_envs =0letg:vimtex_view_general_viewer ='mupdf'" vim-quickrun
NeoBundle 'thinca/vim-quickrun'" autocmd"==============================
augroup filetypeautocmd! " tex file (I always use latex)autocmdBufRead,BufNewFile *.tex setfiletype=tex
augroup END
" disable the conceal functionletg:tex_conceal=''
と書いておきます。let g:vimtex_fold_envs = 0
はenvironment単位で折りたたみするのを無効にします。さすがにやり過ぎ感あったので…
autocmdでtexのファイルタイプを指定していますが、ここにも書いてあるとおり、plaintexとしてファイルタイプが認識されることがあるので、ファイルタイプはtexに統一します。let g:tex_conceal=''
ですが、最近のVimは、数式なんかを打つと、勝手にマルチバイト文字に置き換えて表示してくれます。が、うっとおしいので切ります。
vim-quickrunの設定ファイル
続いてvim-quickrunが参照できるようにtexのQuickRunの設定ファイルを~/.vim/ftplugin/tex_quickrun.vim
に以下のように書きます。
" LaTeX Quickrunletg:quickrun_config['tex'] = {
\ 'command' : 'latexmk_wrapper',
\ 'outputter' : 'error',
\ 'outputter/error/success' : 'null',
\ 'outputter/error/error' : 'quickfix',
\ 'srcfile' : expand("%s"),
\ 'exec': '%c %s %a %o',
\}
" 部分的に選択してコンパイル" http://auewe.hatenablog.com/entry/2013/12/25/033416 を参考にletg: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.aux',
\ '%a/tmptex.dvi',
\ '%a/tmptex.fdb_latexmk',
\ '%a/tmptex.fls',
\ '%a/tmptex.latex',
\ '%a/tmptex.log',
\ '%a/tmptex.out',
\ ],
\}
vnoremap<silent><buffer><F5> :QuickRun -modev-type tmptex<CR>" QuickRun and view compile result quickly (but don't preview pdf file)nnoremap<silent><F5> :QuickRun<CR>
QuickRunで使用するコマンドをlatexmk_wrapperに変更し、引数の処理を簡単にした以外はあまり前回と変わっていません。このように設定しておけば、.texファイルを開いてノーマルモードでF5キーを押せば、先ほどのスクリプトで指定したように、main.texがあればそれをコンパイルしてくれます。また、コマンドモードから引数を持たせて実行することにより、例えば
:QuickRun -args -pv
で~/.latexmkrc
で指定した開き方でpdfファイルを見ることができますし、
:QuickRun -args -c
とすれば、中間ファイルをすべて削除してdviファイルやpdfファイルだけが残るようにしてくれます。
また、範囲を選択してビジュアルモードにいるときにF5キーを押すことで、その部分だけをhook/eval/template
で挟んだ形でコンパイルしてpdfにし、表示してくれます。ちょっとした数式の確認や、泥臭いですがエラーの出処を探すのにも重宝します。
まとめ
だいぶ便利にTexのコンパイルができるようになったと思います。なんだかんだで内容を編集する時間よりもエラーつぶしにかける時間も馬鹿にできないので、こまめにコンパイルして、不安なところは部分コンパイルして、という風にしていけば、楽に編集できると思います。