読者です 読者をやめる 読者になる 読者になる

latexmkを使った自動コンパイルをちょっとだけ便利にする

texを使って論文を書くときはlatexmkを使って、ファイルの更新監視をして自動コンパイルをさせています。
ただ、エラーがあった場合に止まってしまうので、なんとかしたいなーと思って色々調べてみました。

まずはエラーがあっても止まらないようにする方法。

platex -interaction=nonstopmode target.tex

-interaction=nonstopmodeとやると、エラーがあってもキー入力をまたずに最後までしてくれるようです。
ただ、これだと裏側でコンパイルするたびにメッセージが流れていってしまうので、エラーがあっても分からず。
そこで、エラーメッセージ等、自分に必要な情報だけ引き抜いてあげるようにしました。

1つ目は-file-line-errorオプションをつけてあげること。

plates -file-line-error -interaction=nonstopmode target.tex

とすると、エラーの起きたファイル名と行番号を表示してくれます。

! Undefined control sequence.

これが

./sample.tex:44: Undefined control sequence.

こうなります。
このコマンドを.latexmkrcの$latexにコマンドとして登録してあげると、latexmkを使うときでも裏で止まらなくなります。

ただ、これでもまだlatexmk自体のメッセージなんかも出てくるので、さらにフィルタリングしてみました。
今回ほしかったのはさっきの行番号の情報と、あとはファイルが見つからなかったときぐらいかなと思ったのでawkを使って

latexmk -pvc $1 |& awk '/\.tex:|not found|bytes written/ {print strftime("%H:%M", systime()), $0}'

これをシェルスクリプトにしました。
あとは、エラーしか出ないとファイルがいつできたのかわからないので、"xxx bytes written"を探すためのパターンも登録してあります。
最後に、いつコンパイルしたのかを表示するために時刻情報を行頭につけました。

他にWarningなどの情報も欲しい場合は適宜awkのパターンに追加してあげればいいんじゃないかなと思います。
とりあえずこのまましばらく使ってみます。書いたばっかりでまだ使い勝手も分かってないので。