Vagrant Boxを使ってLatexコンパイル環境をラクラク構築

概要
---
[tex-box](https://github.com/imaizume/tex-box)なるVagrant Boxを作りました。
`vagrant up`してSSHするだけで、簡単にLaTeXのコンパイルを行えるようにプロビジョニングされています。
この記事では、このVagrant Boxをつくった背景と、初心者向けの使い方を細かい説明抜きでしてみたいと思います。

背景
---
作ったきっかけは、毎年僕の研究室に配属される新入生が抱えていたある問題でした。
それは**Windows環境へのTeXのコンパイル環境構築**でした。

Windowsなどの非Unixライクな環境では、[W32TeXやGhostScript](http://www.math.sci.hokudai.ac.jp/~abenori/soft/abtexinst.html)などを使い[無理やりコンパイルができるようにする方法](http://did2memo.net/2012/04/23/easy-latex-install-windows-201204/)があります。
こうした方法を僕の研究室では、毎年先輩から口頭伝達やブログ参照で伝えられていました。

しかし当然ながらこの方法には以下のような問題が。

* マシンによっては、途中で失敗したり、何度やっても環境が構築できなかったりすることがある。
* 今まで動いていたのに、突如Windows Updateか何かの影響で動かなくなる (しかもこういう日に限って論文提出前夜だったりする＼(^o^)／)
* 当然他のマシンでバグの再現もできなければ、原因さえ突き止められないので、アンインストール＆再インストールの繰り返し以外に対処法がない
* マシンとの相性が問題なのに、先輩にはお前が悪いみたいな目で見られて溜息つかれて萎える(；一_一)
* うまくいっても構築した環境間になぜか違いが出る(例えば同じtexファイルをPDFにしたにもかかわらず、行間や余白がマシンごとに若干違う)
* そもそもインストール手順が複雑すぎるし面倒だし時間かかる
* もしブログのソースが突然消えたら...

でも上記の問題の多くはLinuxやMacなら発生しないのです。
学校の推奨環境がWindowsだから仕方なくやっているだけなんです。

そこで僕は思いました。
「こんなことしなくても**VagrantBox作って配ればいいじゃないか**」と。

そうです、VagrantでTexのコンパイル用のUbuntuイメージを作成し、スクリプトにまとめて配ってしまえば良いわけです。
こうすれば**マシン間環境は統一され、どのマシン（たとえWindows以外）でも同じようにTexをコンパイルする環境が**
また**ソースはGitHubに残るので僕以外の誰かによってメンテされていく**でしょうし、少なくとも**今後10年は消えることはありません**。

使い方
---

背景が長くなりましたが、ようやくその後LaTeXコンパイル環境としてプロビジョニングされた[tex-box](https://github.com/imaizume/tex-box)を公開したのです。

ここではWindowsユーザーで初心者の人向けに[git](http://www.backlog.jp/git-guide/)は使わずにコンパイル環境を整える方法をリポジトリの[README](https://github.com/imaizume/tex-box/blob/master/README.md)よりも掘り下げて解説していきます。

### インストール

#### VirtualBox / Vagrant

まず、[VirtualBox](https://www.virtualbox.org/)と[Vagrant](https://www.vagrantup.com/)のインストールが必要です。
これらはWindowsの中に、Linuxのマシンを仮想的に立ち上げるためのツールで、この仮想的なLinuxを「仮想環境」と呼んでいます。

少し古いソースですが[こちら](http://dotinstall.com/lessons/basic_vagrant/24101)を参考にインストールしてください、バージョンは最新のものを使ってください。
またVagrantの基礎知識的な解説は省略しますので、もし時間があれば[ドットインストール](http://dotinstall.com/lessons/basic_vagrant)とかで勉強してみてほしいです。

#### putty

続いて[putty](http://yebisuya.dip.jp/Software/PuTTY/)を入れます。
puttyは仮想環境にアクセスするためのソフトで、一般にはSSHコマンドと呼ばれるコマンドが使われていますがWindowsでは使用できないためこちらをインストールして使います。
今の時点ではインストールだけで結構です。

#### tex-box

[tex-boxのページ](https://github.com/imaizume/tex-box)の「Download ZIP」からソースをダウンロード後、適当なフォルダに解凍します。

![downloadzip.png](https://qiita-image-store.s3.amazonaws.com/0/17214/da484f5c-ac32-e45a-9e38-f2038da405f4.png)

フォルダ名はそのままでも良いですが、僕は打つのが面倒になるので"texbox"に改名します。
その後コマンドプロンプトを起動し、解凍したフォルダまで[`cd`してください](http://pf-j.sakura.ne.jp/program/dos/doscmd/chdir.htm)。
Cドライブ直下にした場合は`cd C:\texbox`です。

![cd.png](https://qiita-image-store.s3.amazonaws.com/0/17214/077c52c6-79a5-994e-b8ba-64f4f0af6336.png)

### 仮想環境へのアクセスとTexのコンパイル

#### vagrantの立ち上げ

`cd`したら`vagrant up`で仮想マシンを起動します。
しばらく時間がかかりますが、勝手に設定してくれるはずなので待ちましょう。

![vagrantup.png](https://qiita-image-store.s3.amazonaws.com/0/17214/d90ee529-e609-5a86-b940-08d0da2276ae.png)

#### puttyを使ったSSH接続

立ち上げが完了し（再びコマンドプロンプトへ入力可能な状態になっ）たら、先ほどのputtyを起動します。
仮想環境へアクセスするのに必要な情報は以下のとおりです。

* IP: 192.168.33.10
* PORT: 22
* User: vagrant
* Pass: vagrant

はじめにIPとPORTを入力し、下のボックスに適当な名前をつけて保存します。

![putty.png](https://qiita-image-store.s3.amazonaws.com/0/17214/d46848a5-76a1-cd34-8a94-38910cbf7cd9.png)

Openで接続を開始します。
Vagrantが正しくインストールされ、`vagrant up`が成功していれば次のようなログイン画面が出てくるでしょう。

![loginas.png](https://qiita-image-store.s3.amazonaws.com/0/17214/1926772b-c28e-1a29-df39-f71441e253e0.png)

login as(ユーザー名)とパスワードへ"vagrant"を入力して、仮想環境へSSH接続することができました。

![success.png](https://qiita-image-store.s3.amazonaws.com/0/17214/acfc5f1a-5f60-99db-bdae-24bc9a41887f.png)

#### 共有フォルダの場所

共有フォルダは仮想マシン内の`/vagrant`にあり、こことWindows側のtex-boxインストールフォルダ(`C:\texbox`が対応しています。)

|環境|共有フォルダの場所|
|---|---|
|Vagrant(ゲスト)側|`/vagrant`|
|Windows(Host)側|`C:\texbox\`|

実際にputty上で`cd /vagrant`してから`ls`と入力すると、Windowsのtex-box内にあるのと同じファイル名が表示されるはずです。

![confirm.png](https://qiita-image-store.s3.amazonaws.com/0/17214/889d857e-8b52-f388-b293-9be73cbbdb14.png)

#### コンパイル

今回は`/vagrant/sample`内に移動して、サンプルファイルをコンパイルしてみましょう。
本来コンパイルするためのコマンドは

```
platex (Texのファイル名=sample.tex)
dvipdfmx (dviのファイル名=sample.tex)
```
なのでこれを打たないといけないのですが、いちいち入力するのが大変だと思ったのでコンパイル用のシェルスクリプト(convert.sh)を置いてあります。

よってputty上では以下を実行します。

```
cd /vagrant/sample
./convert.sh
```

![compiled.png](https://qiita-image-store.s3.amazonaws.com/0/17214/7b0889a8-e7cd-5646-5c0a-ec24090a65af.png)

スクリプト実行のため、convert.shの頭に`./`をつけるのを忘れないで下さい。
上記のコマンドを実行したら、同じ共有フォルダ内にsample.pdfができているはずです。

![files.png](https://qiita-image-store.s3.amazonaws.com/0/17214/c55f59dc-8de2-b565-ff87-497c0415aacf.png)

#### コンパイルしたPDFの閲覧

![sumatra.png](https://qiita-image-store.s3.amazonaws.com/0/17214/dccaead3-e1b8-4595-a4ee-8108c7f2e487.png)

こうしてあとはtexファイルを編集するたびにputty側で再度`./convert.sh`すればよいのです。
新しくサブフォルダを作ってそこでコンパイルすれば、複数の論文を管理できますし、Texのファイル名が変わったらconvert.shの方も内容を書き換えてくれれば同様に動かせます。

ちなみにAdobe Readerのようなソフトは**ファイルを開いている間、更新や書き変えをブロック**します。
そのため、何度も「閉じる」「コンパイルする」「開く」の繰り返しをするのが嫌な人は[SumatraPDF](http://www.sumatrapdfreader.org/free-pdf-reader.html)のように、ファイルを閉じることなく更新してくれるビューワーがおすすめです。

## 終わりに

かなり長くなってしまいましたが、重要部分についてはかなり省略した説明になりました。
あまりUnixやSSH, Vagrant, Shell Scriptに詳しくない人は、これを機に周辺技術を勉強してみてください。
また非エンジニアの方で周りに頼れるエンジニアがいる場合は、その人に助けてもらうのもありでしょう。

自分自身もVagrantを始めたばかりのひよっこなので、[tex-box](https://github.com/imaizume/tex-box/)への[issue](https://github.com/imaizume/tex-box/issues), [PR](https://github.com/imaizume/tex-box/pulls)は大歓迎です!
機能や改善要望をお待ちしております!!