ShareLatexでjarticleを使えるようにする


# 概要
Web上でTeXの組版ができる[ShareLatex](http://www.sharelatex.com)というサービスがあります。自前の環境を用意しなくてもいいし，他の人と共有できたりと便利です。それのオープンソース版がGitHub[GithubのShareLatex](https://github.com/sharelatex/sharelatex)にあります。

ShareLatexは便利なのですが，日本語の対応がいまいち。[公式ページ](https://www.sharelatex.com/learn/Japanese)にもやり方は書いてありますが，いまいちです。今回，オープンソース版のShareLatexを修正して，jarticleを使って，platexでビルドできるようにしたので，そのやり方を書いときます。

# ShareLatexの修正
ShareLatexのインストール方法はGithub上にある通りやります。Fedora上で今回やりましたが，TexLive自体はyum経由ではなく，ネットワークインストーラを使ってやったほうがいいです。参考[TeX wikiのページ](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%20Live)

## 修正のおおまかな内容
* xelatexのコマンドをplatexに置き換えるために，既存のxelatexコマンドで処理する部分をplatexに書き換える。
* .latexmkrcの設定でdviからPDFへの変換をdvipdfmxになるようにする。
* bounding boxの設定を自動化するために，extractbbの自動設定を行う。

おおまかな変更内容は上の3つです。順にやっていきます。

## 既存のコマンドをplatexに修正する
ShareLatexではpdfLatex, Latex, xeLatex, LuaLatexがコンパイラとして選択できるようになっています。コンパイラを追加するのは大変そうなので，既存のどれかをそっくりplatexに変更します。xeLatexなんて使わなさそうなので，これを修正することにしました。

ShareLatexのソースコードをGithubからクローンしてくると，個別のパッケージからできているのが分かります。修正するのはclsi, webのソースコードです。

基本的にはxelatexというところをplatexに書き換えているだけです。若干違うのはclsiの_platexCommand: (mainFile) ->のところ。ここはlatexmkにわたすコマンドの内容なので，Latexの処理を参考にします。"-pdfdvi"のオプションを渡さないといけません。platexはdviまで処理してくれないからです。

### clsiの修正
``` diff
$ git diff
diff --git a/app/coffee/LatexRunner.coffee b/app/coffee/LatexRunner.coffee
index cd6e356..9467553 100644
--- a/app/coffee/LatexRunner.coffee
+++ b/app/coffee/LatexRunner.coffee
@@ -20,8 +20,8 @@ module.exports = LatexRunner =
                        command = LatexRunner._pdflatexCommand mainFile
                else if compiler == "latex"
                        command = LatexRunner._latexCommand mainFile
-               else if compiler == "xelatex"
-                       command = LatexRunner._xelatexCommand mainFile
+              else if compiler == "platex"
+                      command = LatexRunner._platexCommand mainFile
                else if compiler == "lualatex"
                        command = LatexRunner._lualatexCommand mainFile
                else
@@ -43,9 +43,9 @@ module.exports = LatexRunner =
                        Path.join("$COMPILE_DIR", mainFile)
                ]
 
-       _xelatexCommand: (mainFile) ->
+      _platexCommand: (mainFile) ->
                LatexRunner._latexmkBaseCommand.concat [
-                       "-xelatex", "-e", "$pdflatex='xelatex -synctex=1 -interaction=batchmode %O %S'",
+                      "-pdfdvi", "-e", "$latex='platex -synctex=1 -interaction=batchmode %O %S'",
                        Path.join("$COMPILE_DIR", mainFile)
                ]
 
diff --git a/app/coffee/RequestParser.coffee b/app/coffee/RequestParser.coffee
index 66765fb..a32dc11 100644
--- a/app/coffee/RequestParser.coffee
+++ b/app/coffee/RequestParser.coffee
@@ -1,5 +1,5 @@
 module.exports = RequestParser =
-       VALID_COMPILERS: ["pdflatex", "latex", "xelatex", "lualatex"]
+      VALID_COMPILERS: ["pdflatex", "latex", "platex", "lualatex"]
        MAX_TIMEOUT: 60
 
        parse: (body, callback = (error, data) ->) ->
```

### webの修正

```diff
$ git diff
diff --git a/app/coffee/Features/Compile/ClsiManager.coffee b/app/coffee/Features/Compile/ClsiManager.coffee
index 6395111..2278858 100755
--- a/app/coffee/Features/Compile/ClsiManager.coffee
+++ b/app/coffee/Features/Compile/ClsiManager.coffee
@@ -51,7 +51,7 @@ module.exports = ClsiManager =
                                type: file.type
                return outputFiles
 
-       VALID_COMPILERS: ["pdflatex", "latex", "xelatex", "lualatex"]
+      VALID_COMPILERS: ["pdflatex", "latex", "platex", "lualatex"]
        _buildRequest: (project_id, settingsOverride={}, callback = (error, request) ->) ->
                Project.findById project_id, {compiler: 1, rootDoc_id: 1}, (error, project) ->
                        return callback(error) if error?
diff --git a/app/coffee/Features/Project/ProjectOptionsHandler.coffee b/app/coffee/Features/Project/ProjectOption
index 0a0b02e..f519ea4 100644
--- a/app/coffee/Features/Project/ProjectOptionsHandler.coffee
+++ b/app/coffee/Features/Project/ProjectOptionsHandler.coffee
@@ -3,7 +3,7 @@ logger = require('logger-sharelatex')
 _ = require('underscore')
 settings = require("settings-sharelatex")
 
-safeCompilers = ["xelatex", "pdflatex", "latex", "lualatex"]
+safeCompilers = ["platex", "pdflatex", "latex", "lualatex"]
 
 module.exports = 
        setCompiler : (project_id, compiler, callback = ()->)->
diff --git a/app/views/project/editor/left-menu.jade b/app/views/project/editor/left-menu.jade
index 283a5fd..8e1f4f9 100644
--- a/app/views/project/editor/left-menu.jade
+++ b/app/views/project/editor/left-menu.jade
@@ -66,7 +66,7 @@ aside#left-menu.full-size(
                                )
                                        option(value='pdflatex') pdfLaTeX
                                        option(value='latex') LaTeX
-                                       option(value='xelatex') XeLaTeX
+                                      option(value='platex') pLaTeX
                                        option(value='lualatex') LuaLaTeX
                                        
                        .form-controls(ng-show="permissions.write")
```

## grunt install
上のファイルが修正できたら，ビルドするために

```
grunt install
```

でインストールします。

## .latexmkrcの設定
ShareLatexではlatexmkを使って，コンパイルの自動化を行います。LaTeXでは複数回コンパイルするのは当たり前ですが，latexmkを実行すると，必要なコマンド処理を自動的に判断して勝手にやってくれます。今回はじめて知りました。自分が使うときにも便利そうです。

latexmkでdviからPDFへの変換がdvipdfmxで行われるように，ホームに.latexmkrcファイルを生成して，以下の内容で保存します。

```
#!/usr/bin/perl

$latex = 'platex';
$bibtex = 'pbibtex';
$makeindex = 'mendex';
$dvipdf = "dvipdfmx %O -o %D %S";
$dvips = 'dvips';
```

ShareLatexを起動するユーザーごとにこの設定するのが面倒なら，大本のlatexmkの内容を編集してもいいかもしれません。latexmkの大本のコマンドは単なるPerlのスクリプトなので，編集できます。

## extractbbの自動化
platexでは，jpegやPDFなどを図として使うとxbbファイルを作る必要があります。xbbファイルを自動的に作成してくれるようにします。[TeX wiki](https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?extractbb%20の自動実行許可の設定#i4e98152)のページを見て，設定します。


# 修正したShareLatexを使ってみた
platexが使えるようにして，documentclassにjarticleを指定したのが下記の図です。コンパイルもできて，日本語のPDFが出てきています。

![ShareLatex1.jpg](https://qiita-image-store.s3.amazonaws.com/0/43609/b2dd4d28-c223-d0df-03b1-f7e4d4bb5fb7.jpeg "ShareLatex1.jpg")

# まとめ
ShareLatexでplatexを使って，jarticleを使ったファイルをコンパイルできるようにしました。latexmkのコマンドが分かれば，なんとか修正できると思います。

ブラウザ上で日本語LaTeXを使えるサービスに[Cloud LaTeX](http://acaric.co.jp/acaric-cloudlatex/)というのがあります。無料で使えるのでいいんですが，外部のサーバーにデータを置きたくないというわけで，自前のサーバー上で使えるShareLatexを変更しました。