査読対応に: LaTeX差分PDF非同期自動生成ツール(latexdiff-vc+latexmk+LaTeX Workshop)

# 一言で
LaTeX Workshopのビルド時、Gitの最終コミットからの差分を非同期生成する。導入は`cargo install`で一瞬。

# こんな人に
- 文書を他の人に何度も繰り返し見てもらっており、「どこを直したか」をやりとり毎に共有する必要がある人
    - 教授に修論を手直ししてもらってるとか
    - 雑誌投稿でなんども査読コメントが返ってくるとか
- 自分が何を直したのかわかんなくなりがちだけど、`latexdiff`や`latexdiff-vc`で差分計算をいちいちするのが怠い人
- latexdiff-vcを利用したrecipeを作るのも選ぶのも怠い人

# ざっくりとできること
- 論文を送ったらそのファイルをコミット
- `[dir]/[docfile].tex`ビルドの度、`[dir]/[docfile].pdf`と合わせて送信時(すなわちコミット時)からの差分が`[dir]/diff/[docfile]-diff.pdf`としてできるだけ並列で出力される

# 導入方法
## 必須環境
- [TeX Live](https://texwiki.texjp.org/?TeX%20Live#w628bee6)
    - LaTeX書いてれば大体入ってるはず
    - 具体的には`latexmk`と`latexdiff-vc`が入っているか確認
- [Cargo](https://www.rust-lang.org/ja/tools/install)
    - 入ってないと思う
    - 大体`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`を打てば入る
    - `~/.cargo/bin`にPATHが通ってるか確認すること
## 推奨
- WSL2かMacなど、bash系のコンソールが使える環境推奨
    - 純Windowsでもできないことはないと思う
- [Git](https://git-scm.com/downloads)
    - 何もなくても勝手に入ってることがあるので`git`と打って確認
    - 大体VSCodeでやるのでGitに精通してる必要はない
    - 一応他のバージョン管理ソフトでもいけるらしい(内部では`latexdiff-vc -r`を呼んでるだけなので)
- [LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop) on [VSCode](https://code.visualstudio.com/)
    - 前提にはしているけど他のIDEでもビルド設定を書けるならいける

## 手順
今作業しているディレクトリがGitで管理されていなければ次を実行:
```bash
git init
git add .
git commit -m "初稿"
```
なんかエラーが出たら大体これを実行:
```bash
git config user.name "あなたの名前"
git config user.email "your.email@example.com"
```

さらに拙作[`latexmk-diff-head`](https://github.com/momota1029/latexmk-diff-head)をインストール:
```bash
cargo install latexmk-diff-head
```

`~/.latexmkrc`を未作成ならファイルを作成し、とりあえず次を書き込んでおく:
```.latexmkrc
$pdf_mode = 3;
$max_repeat = 10;
$latex = 'uplatex %O %S';
$bibtex = 'upbibtex %O %B';
$dvipdf = 'dvipdfmx %O -o %D %S';
```
作成済みならそれで動くので問題はない。

### LaTeX Workshopの設定
`settings.json`に次を書き込み:
```settings.json
{
  "latex-workshop.latex.recipes": [
    {
      "name": "latexmk-diff-head",
      "tools": ["latexmk-diff-head"]
    }
  ],
  "latex-workshop.latex.tools": [
    {
      "name": "latexmk-diff-head",
      "command": "latexmk-diff-head",
      "args": ["--synctex", "--flatten", "%DOC%"]
    }
  ]
}
```

これでビルドから`latexmk-diff-head`を選ぶか、recipesの先頭に`"latexmk-diff-head"`を置いて`Ctrl`+`S`(もしくは`Ctrl`+`Alt`+`B`)をすればビルドが走って、`doc.tex`であれば同じディレクトリ内に`diff/doc-diff.pdf`が作成される(まだ差分はないのでdoc.pdfと同じものが生成される)。

お疲れ様でした。

# これは何か
`latexmk`の裏で`latexdiff-vc -r`を並列実行して差分を生成し、自動で差分にも`latexmk`を実行するラッパー。以前私がbashでちまちまやってた作業をRustで書き直してcargoから入れられる様にした。

# 使い方
論文を書いて保存すれば、勝手に差分PDFも生成される。

## 基本ワークフロー
1. **LaTeX編集** → `main.tex`などを保存（`Ctrl+S`）
2. **自動ビルド** → `main.pdf`と`diff/main-diff.pdf`が同時生成
3. **差分確認** → 前回コミットからの変更が青（追加）・赤（削除）で表示
4. **『節目』でコミット** → VS Codeのソース管理タブで「コミット」
5. **1に戻る**

論文投稿直後にコミットをすれば、査読者が読んだところからの差分が表示されて、次回送信時に双方楽ができる。

# オプション
## LaTeX Workshop設定の書き換えについて
作業ディレクトリからの相対パスが`doc/main.tex`であるようなファイルをビルドするとき、LaTeX Workshopの中では`latexmk-diff-head --synctex --flatten doc/main`というコマンドが呼ばれている。よって`"args"`の中の最後以外(`"--synctex"`とか`"--flatten"`とか)を書き換えれば、いろいろなパラメータを`latexmk-diff-head`に渡せる。

## 内容について
何が使えるのかは`latexmk-diff-head -h`と打つと出てくる。大体は適切なパラメータを`latexdiff`や`latexmk`に伝えるだけなので、具体的に何をしているかは`latexdiff-vc`や`latexmk`の説明を参考にすること。

- `"--synctex"`: SyncTeXという「PDFの該当箇所をCtrl+クリックするとTeXファイルの対応する位置に飛べる」「逆もできる」という機能を有効化する。内部的には`latexmk`に`-synctex=1`を渡している
- `"--flatten"`: `\input`とか`\include`とかの「外部のソースを呼ぶ」コマンドでもちゃんと開いて差分を取る(というパラメータ`--flatten`をlatexdiff-vcに渡す)
- `"--async-diff"`: 完全に非同期に`latexdiff-vc`を実行して差分を取る。代わりに差分のビルド時にエラーが出ても見えなくなるが、`latexdiff-vc`はタイプセットの数割くらいかかるので、非同期になると若干速く感じる
- `"-t", "CFONT"`: 標準で取り消し線・波線になっている削除・追加の強調をフォント変更に変える(という処理を`latexdiff`に伝える)

# おまけ
LaTeX Workshopのビルド時に面倒なことをいくつか解消している。

## SyncTeXによるPDFハイライトが常に保存時起こるようにした
`Ctrl`+`Alt`+`J`を覚えるのが面倒だったので、保存時に「PDFが更新された」というダミーの出力を送ることで、常に`Ctrl`+`S`で更新位置が光るようにした。

### `latexmk`がPDFを出力しないときは`latexdiff-vc`も呼ばない
`Latexmk: applying rule ...`が来るかどうかだけで判断し、`latexdiff-vc`を呼ばないこともある。単純にビルドがないときに`latexdiff-vc`を実行すると、PDFハイライトがその分遅くなって、重さが分かりやすくなってしまうため。

## `.aux`とかのファイルは全て`.temp/`フォルダに入る
邪魔だけど必要なファイルは全て退避できるようにした。一応`.synctex.gz`だけはPDFと同じ階層にないといけないので、そうなっている。

# 終わり
もう数年早ければ友人が楽だったかも知れない。みなさんは**Happy LaTeX Writing! 📝✨**

---

何か問題があったら[GitHub Issues](https://github.com/momota1029/latexmk-diff-head/issues)まで。