背景
latexdiff-vcコマンドで生成された差分texファイルは、以下の画像のように差分箇所で日本語の改行ができません。
原因は、その差分texファイルが線を引くパッケージにulemを使用しており、このulemが日本語の改行に対応していないからです。

これの対処法として、latexdiffコマンドでは -t CFONTオプションを付けることで線を消して色だけを変える機能がありますが、latexdiff-vcコマンドにはそのオプションはありません。(manコマンド調べ)
あと、以下の画像はlatexdiffコマンドの-t CFONTで生成したものですが、なんかフォントサイズバグってるし、初見だとどっちが変更前でどっちが変更後か感覚的にわかりづらいです。

どうにかして日本語の差分箇所を線付きで改行させたい。。
結論
latexdiff-vcの差分texファイルのプリアンブルで使用されているulemパッケージをuline--パッケージに書き換えます。
以下の画像がuline--に書き換えた後の実行結果です。日本語でも差分箇所が線付きで改行されてますね。

環境
- Windows 11 Home
- WSL2
- Ubuntu 20.04.4 LTS
- TeX Live 2019 (Ubuntu上)
- perl v5.30.0 (Ubuntu上)
私のLaTeX環境はちょっと特殊で、Windows側からWSLのUbuntu上のLaTeXを動かしています。その環境はこちらの記事を参考に構築しました。
また、この記事はGitとlatexdiff-vcを組み合わせた環境での説明となっております。Git + latexdiff-vc の環境構築はこちらの記事を参考にしました。
実装方法
個人によって細かな実装方法は異なるとは思いますが、大まかには以下のような手順で実装します。
-
uline--.styをダウンロード&インストール - 元のtexファイルに
\usepackage[usetype1]{uline--}を追加 - 差分texファイルを編集
-
\RequirePackage[normalem]{ulem}を削除 -
\soutを\mlineに置換
-
uline--.sty のダウンロード
Yusuke Terada 様が提供されているGitHubから以下のリンクのuline--.styをダウンロードします。
また、本家のulineを提供されている吉永様のアーカイブからダウンロードする方法もありますが、私の環境だとエラーが起きて使えなかったので、上記のリンクからダウンロードするのが良いかと思います。
uline--.sty のインストール
ご自身の環境によりますが、私はUbuntu上にLaTeXをインストールしたので、/usr/share/texlive/texmf-dist/tex/latex/というパスに移動します。
どこに移動すればわからないという方は、以下のコマンドを実行してlatex/までのパスを確認すれば恐らく行けると思います。
$ kpsewhich multicol.sty
/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty
移動が終わったら、uline--.styの文字コードをUTF-8に変換します。文字コード変換のためにまずnkfをインストールします。
$ sudo apt-get install nkf
nkfのインストールを終えたら、以下のように現在の文字コードを確認後、UTF-8に変換します。
/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--とします。
/usr/share/texlive/texmf-dist/tex/latex$ mkdir uline--
/usr/share/texlive/texmf-dist/tex/latex$ mv uline--.sty uline--/
その後、mktexlsrコマンドを実行し、uline--.styを反映させます。
/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より下の方が良いかもしれません。
\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つの記述部分が編集されます。
%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}}}
%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}}}
\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
\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コマンドを使っているので、ここの書き方は個人で変わることに注意してください。
"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",
]
},
],
自動化の手順は以下のようになっています。
- 元の編集中のtexファイル(
test.tex)をコンパイル -
latexdiff-vcコマンドで差分texファイル(test-diffmain.tex)を生成- mainブランチの先頭のコミットと
test.texとの差分 -
test-diffmain.texをtest.texと同じカレントディレクトリに生成
- mainブランチの先頭のコミットと
- sedコマンドで
test-diffmain.texを編集-
\RequirePackage[normalem]{ulem}を削除 - sedコマンドで
\soutを\mlineに置換
-
- 編集後の
test-diffmain.texファイルをコンパイル
また、.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
以上で実装は完了となります。