latexdiff-vc の差分箇所の線を日本語でも改行できるようにする

# 背景
`latexdiff-vc`コマンドで生成された差分texファイルは、以下の画像のように差分箇所で日本語の改行ができません。
原因は、その差分texファイルが線を引くパッケージに`ulem`を使用しており、この`ulem`が日本語の改行に対応していないからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1595767/d71b5cdf-e541-c5e3-2103-494be627bbf7.png)

これの対処法として、`latexdiff`コマンドでは `-t CFONT`オプションを付けることで線を消して色だけを変える機能がありますが、`latexdiff-vc`コマンドにはそのオプションはありません。(manコマンド調べ)

あと、以下の画像は`latexdiff`コマンドの`-t CFONT`で生成したものですが、なんかフォントサイズバグってるし、初見だとどっちが変更前でどっちが変更後か感覚的にわかりづらいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1595767/3bbdd7e2-0c27-6f60-a70a-fbfaf844ed71.png)

どうにかして日本語の差分箇所を線付きで改行させたい。。

# 結論
`latexdiff-vc`の差分texファイルのプリアンブルで使用されている`ulem`パッケージを`uline--`パッケージに書き換えます。
以下の画像が`uline--`に書き換えた後の実行結果です。日本語でも差分箇所が線付きで改行されてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1595767/9f2cf4fd-eda8-5e97-e8d3-3cac642ccefc.png)

# 環境
* Windows 11 Home
* WSL2
* Ubuntu 20.04.4 LTS
* TeX Live 2019 (Ubuntu上)
* perl v5.30.0 (Ubuntu上)

私のLaTeX環境はちょっと特殊で、Windows側からWSLのUbuntu上のLaTeXを動かしています。その環境はこちらの記事を参考に構築しました。

https://zenn.dev/flyingseaweed/articles/5838ea02d8400b

また、この記事は`Git`と`latexdiff-vc`を組み合わせた環境での説明となっております。`Git` + `latexdiff-vc` の環境構築はこちらの記事を参考にしました。

https://qiita.com/take_me/items/e49c544f9298f936b8fd

# 実装方法
個人によって細かな実装方法は異なるとは思いますが、大まかには以下のような手順で実装します。
1. `uline--.sty`をダウンロード&インストール
1. 元のtexファイルに`\usepackage[usetype1]{uline--}`を追加
1. 差分texファイルを編集
    * `\RequirePackage[normalem]{ulem}`を削除
    * `\sout`を`\mline`に置換

## uline--.sty のダウンロード
[Yusuke Terada](https://twitter.com/doraTeX) 様が提供されているGitHubから以下のリンクの`uline--.sty`をダウンロードします。

https://github.com/doraTeX/breakfbox/blob/master/uline--.sty

また、本家の`uline`を提供されている吉永様の[アーカイブ](https://web.archive.org/web/20160613154204/http://www.h4.dion.ne.jp:80/~latexcat/macros/macro-index.html)からダウンロードする方法もありますが、私の環境だとエラーが起きて使えなかったので、上記のリンクからダウンロードするのが良いかと思います。

## uline--.sty のインストール

ご自身の環境によりますが、私はUbuntu上にLaTeXをインストールしたので、`/usr/share/texlive/texmf-dist/tex/latex/`というパスに移動します。
どこに移動すればわからないという方は、以下のコマンドを実行して`latex/`までのパスを確認すれば恐らく行けると思います。
```bash
$ kpsewhich multicol.sty
/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty
```
移動が終わったら、`uline--.sty`の文字コードをUTF-8に変換します。文字コード変換のためにまず`nkf`をインストールします。
```bash
$ sudo apt-get install nkf
```
`nkf`のインストールを終えたら、以下のように現在の文字コードを確認後、UTF-8に変換します。
```bash
/usr/share/texlive/texmf-dist/tex/latex$ nkf --guess uline--.sty
ISO-2022-JP (LF)
/usr/share/texlive/texmf-dist/tex/latex$ nkf -w --overwrite uline--.sty
/usr/share/texlive/texmf-dist/tex/latex$ nkf --guess uline--.sty
UTF-8 (LF)
```
次に適当なフォルダを作成し、その中に`uline--.sty`を移動させます。ここではフォルダ名を`uline--`とします。
```bash
/usr/share/texlive/texmf-dist/tex/latex$ mkdir uline--
/usr/share/texlive/texmf-dist/tex/latex$ mv uline--.sty uline--/
```
その後、`mktexlsr`コマンドを実行し、`uline--.sty`を反映させます。
```bash
/usr/share/texlive/texmf-dist/tex/latex$ mktexlsr
mktexlsr: Updating /usr/local/share/texmf/ls-R...
mktexlsr: Updating /var/lib/texmf/ls-R-TEXLIVEDIST...
mktexlsr: Updating /var/lib/texmf/ls-R-TEXMFMAIN...
mktexlsr: Updating /var/lib/texmf/ls-R...
mktexlsr: Done.
```
以上で`uline--.sty`のインストールが完了となります。

## 元のtexファイルを編集
現在執筆中のtexファイル(ここでは`test.tex`)のプリアンブルに`\usepackage[usetype1]{uline--}`を追加するだけです。ただ配置位置は`color`より下の方が良いかもしれません。
```latex:test.tex
\documentclass[uplatex,a4j,12pt,dvipdfmx]{jsarticle}

% プリアンブル
\usepackage[utf8]{inputenc}
\usepackage[ipaex]{pxchfon}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{jlisting}
\usepackage{color}
\usepackage[usetype1]{uline--}   % 追加
```

## 差分texファイルを編集
`latexdiff-vc`コマンドで生成される差分texファイル(ここでは`test-diffmain.tex`)に以下の操作を加えます。
* `\RequirePackage[normalem]{ulem}`を削除
* `\sout`を`\mline`に置換

そうすると、以下に示す2つの記述部分が編集されます。

```latex:test-diffmain.tex 編集前1
%DIF PREAMBLE EXTENSION ADDED BY LATEXDIFF
%DIF UNDERLINE PREAMBLE %DIF PREAMBLE
\RequirePackage[normalem]{ulem} %DIF PREAMBLE
\RequirePackage{color}\definecolor{RED}{rgb}{1,0,0}\definecolor{BLUE}{rgb}{0,0,1} %DIF PREAMBLE
\providecommand{\DIFadd}[1]{{\protect\color{blue}\uwave{#1}}} %DIF PREAMBLE
\providecommand{\DIFdel}[1]{{\protect\color{red}\sout{#1}}}
```

```latex:test-diffmain.tex 編集後1
%DIF PREAMBLE EXTENSION ADDED BY LATEXDIFF
%DIF UNDERLINE PREAMBLE %DIF PREAMBLE
\RequirePackage{color}\definecolor{RED}{rgb}{1,0,0}\definecolor{BLUE}{rgb}{0,0,1} %DIF PREAMBLE
\providecommand{\DIFadd}[1]{{\protect\color{blue}\uwave{#1}}} %DIF PREAMBLE
\providecommand{\DIFdel}[1]{{\protect\color{red}\mline{#1}}}
```

```latex:test-diffmain.tex 編集前2
\lstdefinelanguage{DIFcode}{ %DIF PREAMBLE
%DIF DIFCODE_UNDERLINE %DIF PREAMBLE
  moredelim=[il][\color{red}\sout]{\%DIF\ <\ }, %DIF PREAMBLE
  moredelim=[il][\color{blue}\uwave]{\%DIF\ >\ } %DIF PREAMBLE
} %DIF PREAMBLE
```

```latex:test-diffmain.tex 編集後2
\lstdefinelanguage{DIFcode}{ %DIF PREAMBLE
%DIF DIFCODE_UNDERLINE %DIF PREAMBLE
  moredelim=[il][\color{red}\mline]{\%DIF\ <\ }, %DIF PREAMBLE
  moredelim=[il][\color{blue}\uwave]{\%DIF\ >\ } %DIF PREAMBLE
} %DIF PREAMBLE
```
そして、このtexファイルをコンパイルすることで、[結論](#結論)で示した画像のような`uline--`が適応された差分pdfファイルが生成されます。

ただ、いちいちこのようにファイルを編集するのも面倒なので、この作業を`LaTeX Workshop`のレシピを使って`test.tex`の保存、コンパイルと同時に自動で実行させます。

VSCodeの`setting.json`に以下のようにレシピとツールの設定を記述します。この時、私の環境はWSLコマンドを使っているので、ここの書き方は個人で変わることに注意してください。
```jsonc:setting.json
"latex-workshop.latex.tools": [

        {
            // latexmk で 元の編集中のtexファイルをコンパイル
            "name": "latexmk via cmd",
            "command": "wsl",
            "args": [
                "latexmk",
                "$(wslpath -u '%DOC%')",
                "-silent",
            ]
        },

        {
            // latexdiff-vc で差分texファイルを出力
            "name": "latexdiff-vc_win",
            "command": "wsl",
            "args": [
                "latexdiff-vc",
                "-e",
                "utf8",
                "--git",
                "--force",
                "-r",
                "main",
                "%DOCFILE%.tex"
            ]
        },

        {
            // sed で ulem を含む行を削除
            "name":"sed diff ulem",
            "command":"wsl",
            "args": [
                "sed", "-i", "'/ulem/d'", "$(wslpath -u %DIR%/%DOCFILE%-diffmain.tex)"
            ]
        },

        {
            // sed で \sout を \mline に置換
            "name": "sed diff red",
            "command": "wsl",
            "args": [
                "sed", "-i", "'s/\\\\sout/\\\\mline/g'", "$(wslpath -u %DIR%/%DOCFILE%-diffmain.tex)"
            ]
        },

        {
            // latexmk で差分texファイルをコンパイル
            "name": "latexmk via cmd diff",
            "command": "wsl",
            "args": [
                "latexmk",
                "$(wslpath -u %DIR%/%DOCFILE%-diffmain.tex)",
                "-silent",
            ]
        },
    ],
    "latex-workshop.latex.recipes": [
    
        {
            "name": "latexmk",
            "tools": [
                "latexmk via cmd",
                "latexdiff-vc_win",
                "sed diff ulem",
                "sed diff red",
                "latexmk via cmd diff",
            ]
        },
    ],
```

自動化の手順は以下のようになっています。
1. 元の編集中のtexファイル(`test.tex`)をコンパイル
1. `latexdiff-vc`コマンドで差分texファイル(`test-diffmain.tex`)を生成
    * mainブランチの先頭のコミットと`test.tex`との差分
    * `test-diffmain.tex`を`test.tex`と同じカレントディレクトリに生成
1. sedコマンドで`test-diffmain.tex`を編集
    * `\RequirePackage[normalem]{ulem}`を削除
    * sedコマンドで`\sout`を`\mline`に置換
1. 編集後の`test-diffmain.tex`ファイルをコンパイル

また、`.latexmkrc`は以下のようになっています。
```perl:.latexmkrc
#!/usr/bin/env perl

$latex = 'uplatex %O -kanji=utf8 -synctex=-1 -halt-on-error -file-line-error %T';
$bibtex = 'upbibtex';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars';
$dvipdf = 'dvipdfmx %O -o %D %S';
$out_dir = 'out';

$max_repeat = 5;
$pdf_mode = 3; # generate pdf from dvi
```
以上で実装は完了となります。