こんにちは、びしょ〜じょです。これは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をハイライトしてくれる。

syntax highlight with vimtex

そして大量にキーバインドを追加してくるので4、これを覚えると高速な編集ができる。 他のキーバインドと競合しないように気をつけよう。

他にも環境のbeginendの対応が取れてpercentage-wiseなカーソル移動ができる。 コマンドの補完もしてくれるため、Neocomplete5/Deoplete6と連携して補完を効かせると非常に高速なエディットが可能となる。

2-2. vim-surround7

visual modeでS-<leader>と入力すると環境を作ってくれる。 地味に便利。

surround environment


WORD記事テンプレートにはすでにMakefileとlatexmkrcが付属されているが、これについても少し解説したい。

3. Latexmk8,{/sup}9

とにかく偉大。 BibTeXやrefererence関係などをエイヤッとやってくれる偉い人です。 function platex() { =platex $1 && =platex $1} みたいなものを.bashrcなどに書かなくてよくなります。偉いね。 ~/.latexmkrcまたはcwdのlatexmkrcに設定ファイルを置くと記述に沿った動きをしてくれる。

[1]のlatexmkrcを見てみましょう。

articles/hinagata/latexmkrc

1
2
3
4
5
6
7
8
9
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;

例えば$pdflatexlatexmk -pdfとしたときに動くコマンドを定義します。 %Oには入力ファイル名、%Bには拡張子なしの入力ファイル名、等々フォーマット文字列になっており。

$pdf_modeでpdf出力方式を選びます。3が入っているのでdviファイルから$dvipdfコマンドでpdfに変換する方式を取ります。

また-pvcオプションという、ソースファイル及びそのファイルが参照しているファイルが編集されるたびにコンパイルをおこなってくれるという便利なノンストップモードがあります。

とにかく偉い。他にもオプションがいろいろあります。 latexコマンド直叩きの時代は終わったんや……!

4. Make

latexmkを知らない人はいるかもしれないが、makeを知らない人は居ないでしょう。 またcwdにMakefileがあるとmakeを実行してしまうという人間の心理を突くこともできます。

例によって[1]のMakefileを見てみましょう。

articles/hinagata/Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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\)は"ラテック"と発音するよ派です。 人と会話するとき相手が"ラテフ"と発音したら波風立てたくないのでそれに従うけどうっかり"ラテック"と言っちゃうよ派でもあります。 "ラテックス"っつったらお前それハーピーレディサイバーボンテージが着てるやつの素材じゃん


  1. https://github.com/WORD-COINS/article-template 

  2. https://github.com/neomake/neomake 

  3. https://github.com/lervag/vimtex 

  4. https://github.com/lervag/vimtex/wiki/usage#default-mappings 

  5. https://github.com/Shougo/neocomplete.vim completion for Vim 

  6. https://github.com/Shougo/deoplete.nvim completion for Neovim 

  7. https://github.com/tpope/vim-surround 

  8. http://personal.psu.edu/jcc8//software/latexmk 

  9. https://texwiki.texjp.org/?Latexmk 

  10. http://detexify.kirelabs.org/classify.html 

  11. https://github.com/kirel/detexify-hs-backend 

  12. https://github.com/WORD-COINS/texfiles