git + latexdiff で論文の差分を出力する

論文執筆はWord派でしたが、今年からLaTeXを使い始めた結果、「数式の含まれる文書はLaTeXで全て書いた方が楽」とまで感じているこの頃。

LaTeXで論文修正をするとき、今まではcolorパッケージを使っていて色付けして差分を示していて、かなり効率が悪かったのですが、最近latexdiffの存在を知りました。

latexdiff

latexdiffは、2つのtexファイルの差分を自動で色付け・強調表示して出力してくれる便利なツールです。 (インストール方法などは省略します) コマンドラインで下記を入力すると、生成されたdiff.texが出力されます。 latexdiff old.tex new.tex > diff.tex

diff.texコンパイルすると、old/newの差分を示すファイルが生成されます。

f:id:sho0126hiro:20200725164412p:plain

参考:

abenori.blogspot.com

今回はこれをGitと組み合わせて、前のコミットのデータとの差分が出力できるようにしました。

書いたスクリプト

latexdiff-gitなどのツールもあるそうですが、インストールができなかったため自分でスクリプトlatexdiff.shを書きました。

ただし、書いている論文はSection 1-5まであり、それぞれ別ファイルに入力していることに注意してください。

\section{Introduction}
\input{section/1.tex}
\section{Section 2}
\input{section/2.tex}
% ...
# 実行: sh latexdiff.sh <ルートファイル名(拡張子は含まない)>
# clear
rm -rf diff/*

# gitレポジトリのrootファイルから、実行しているディレクトリまでの相対pathを取得
X=$(git rev-parse --show-prefix)

cp *.jpg diff/ % 画像をコピー

mkdir diff/section
cp section/* diff/section

for i in 1 2 3 4 5 # section 1-5
do
    # HEAD(1つ前のコミット)のtexファイルを取得し、diff/section/old_{i}.texに保存
    git show HEAD:"${X}section/${i}.tex" > "diff/section/old_${i}.tex"
done

# 同様にHEADのTexルートファイルを出力 (${1}: コマンドライン引数=ルートファイル名)
git show HEAD:"${X}${1}.tex" > "diff/old_${1}.tex"

# TeXルートファイルと最新版との差分をdiff/diff.texに出力
latexdiff -e utf8 "diff/old_${1}.tex" $1.tex > diff/diff.tex

for i in 1 2 3 4 5 # section 1-5
do
    # 各セクションの差分を出力
    latexdiff -e utf8 "diff/section/old_${i}.tex"  "section/${i}.tex" > "diff/section/${i}.tex"
done

この後diff/diff.texコンパイルすると、差分ファイルが出力されます。

追記(2020.07.27) 日本語を扱っている場合、latexdiffで出力したファイルの改行位置がおかしくなるため、コマンドを下記の通り置き換えると問題なく使えるようになります。

latexdiff -e utf8 -t CFONT old.tex new.tex > diff.tex