LaTeXライティング
こんにちは、びしょ〜じょです。これはWORD Advent Calendar 2017の記事です。
12月21日といえば……特になにも思いつきませんでした。 あえて挙げるなら片岡鶴太郎、安斎肇、フランク・ザッパの誕生日だそうです(Wikipedia調べ)。みんなで祝いましょう。
WORDとは何か
1. はじめに
WORDは一太郎と\(\LaTeX\)で制作されており、後者が今のメインストリームとなっています。 WORD記事のテンプレート1を引っ張って編集してWORDのGitサーバーにpushするとJenkinsが動きヒラギノが埋め込まれたpdfファイルが出来上がる……というシステム。素晴らしい。
私もWORD記事以外でもよくLaTeXを使います。 たとえば講義ノートを取る、Beamerでスライドを作る、ゼミ資料を作る、等々。
ではどうやってLaTeXを書いているのか? 今回は私のLaTeX編集環境を少し紹介します。
2. (Neo)Vim
エディターにはNeovimを使っています。 asynchronouslyにmakeをやってくれるNeomake2とかありますんで、でもVim 8でもasync jobsが使えるようになったとのことでどっちでもいいです。
次のVimtexが重要。
2-1. Vimtex3
Vimで快適にLaTeXを編集するためのプラグイン。 まずSyntax highlightingがきれい。 偉いので、LuaLaTeXでLuaを埋め込んでいるときもちゃんとLuaをハイライトしてくれる。
そして大量にキーバインドを追加してくるので4、これを覚えると高速な編集ができる。 他のキーバインドと競合しないように気をつけよう。
他にも環境のbegin
とend
の対応が取れてpercentage-wiseなカーソル移動ができる。
コマンドの補完もしてくれるため、Neocomplete5/Deoplete6と連携して補完を効かせると非常に高速なエディットが可能となる。
2-2. vim-surround7
visual modeでS-<leader>
と入力すると環境を作ってくれる。
地味に便利。
WORD記事テンプレートにはすでにMakefileとlatexmkrcが付属されているが、これについても少し解説したい。
3. Latexmk8,{/sup}9
とにかく偉大。
BibTeXやrefererence関係などをエイヤッとやってくれる偉い人です。
function platex() { =platex $1 && =platex $1}
みたいなものを.bashrcなどに書かなくてよくなります。偉いね。
~/.latexmkrcまたはcwdのlatexmkrcに設定ファイルを置くと記述に沿った動きをしてくれる。
[1]のlatexmkrcを見てみましょう。
#!/usr/bin/env perl
$pdflatex = 'lualatex %O -synctex=1 -interaction=nonstopmode -shell-escape %B';
$latex= 'platex %O -synctex=1 -interaction=nonstopmode -kanji=utf8 -shell-escape %B';
$bibtex = 'pbibtex %O -kanji=utf8 %B';
$dvipdf= 'dvipdfmx %O -p jisb5 -d 5 -o %D %S';
$makeindex= 'mendex %O -U -r -c -g -s %B -p any %B';
$pdf_mode = 3;
$pdf_update_method = 3;
例えば$pdflatex
でlatexmk -pdf
としたときに動くコマンドを定義します。
%O
には入力ファイル名、%B
には拡張子なしの入力ファイル名、等々フォーマット文字列になっており。
$pdf_mode
でpdf出力方式を選びます。3
が入っているのでdviファイルから$dvipdf
コマンドでpdfに変換する方式を取ります。
また-pvc
オプションという、ソースファイル及びそのファイルが参照しているファイルが編集されるたびにコンパイルをおこなってくれるという便利なノンストップモードがあります。
とにかく偉い。他にもオプションがいろいろあります。
latex
コマンド直叩きの時代は終わったんや……!
4. Make
latexmkを知らない人はいるかもしれないが、makeを知らない人は居ないでしょう。 またcwdにMakefileがあるとmakeを実行してしまうという人間の心理を突くこともできます。
例によって[1]のMakefileを見てみましょう。
MAKE = make
LATEXMK = latexmk
LATEXMKFLAG += -halt-on-error
CP = cp
RM = rm
SRC = main
TARGET = $(addsuffix .pdf, $(SRC))
TEXFILES = ../../texfiles
CLASS = word
TEXDEPS = $(foreach deps, $(CLASS).cls, $(TEXFILES)/$(deps))
TEXDTX = $(addsuffix .dtx, $(TEXFILES)/$(CLASS))
TEXINS = $(addsuffix .ins, $(TEXFILES)/$(CLASS))
.PHONY: all continue clean
all: $(SRC).pdf
%.pdf: %.tex $(TEXDEPS)
$(MAKE) $(TEXDEPS)
$(LATEXMK) $(LATEXMKFLAG) $<
continue:
LATEXMKFLAG +=-pvc $(MAKE)
$(TEXDEPS): $(TEXDTX) $(TEXINS)
LATEXMKFLAG="$(LATEXMKFLAG)" $(MAKE) $(CLASS).cls -C $(TEXFILES)
$(CP) -r $(foreach deps, $(TEXDEPS), $(deps)) ./
clean:
$(MAKE) clean -C $(TEXFILES)
$(RM) -f $(TEXDEPS)
$(LATEXMK) -C
主にlatexmkをラップする形になります。
make
でpdfができて、make continue
で先述のノンストップモードになりmake clean
で生成されたファイルを消してくれる。
5. Detexify10
こんな感じの記号を出したい、というときキャンパスにお絵かきすると、コマンド名と必要なパッケージを出してくれる非常に極めて偉大なツール。 バックエンドはHaskellのようです11。
6. WORD Slack #latex channel
WORD部員達がLaTeXに関する議論をしたり[1]やWORDクラスファイル12のGitHubでのアクティビティーが流れてくるWORD slackのチャンネル。
7. おわりに
WORD Advent Calendar21日目がまったく埋まる気配がないので筆を執った次第ですが、結局情報量が少ない文書になりました。 xmodmapで超高速記号タイピングなども書きたかったんですが余力が無いのでまた別の機会に。
ちなみに\(\LaTeX\)は"ラテック"と発音するよ派です。 人と会話するとき相手が"ラテフ"と発音したら波風立てたくないのでそれに従うけどうっかり"ラテック"と言っちゃうよ派でもあります。 "ラテックス"っつったらお前それハーピーレディサイバーボンテージが着てるやつの素材じゃん
-
https://github.com/WORD-COINS/article-template ↩
-
https://github.com/neomake/neomake ↩
-
https://github.com/lervag/vimtex ↩
-
https://github.com/lervag/vimtex/wiki/usage#default-mappings ↩
-
https://github.com/Shougo/neocomplete.vim completion for Vim ↩
-
https://github.com/Shougo/deoplete.nvim completion for Neovim ↩
-
https://github.com/tpope/vim-surround ↩
-
http://personal.psu.edu/jcc8//software/latexmk ↩
-
https://texwiki.texjp.org/?Latexmk ↩
-
http://detexify.kirelabs.org/classify.html ↩
-
https://github.com/kirel/detexify-hs-backend ↩
-
https://github.com/WORD-COINS/texfiles ↩