はじめに

僕は,文書作成のとき org-mode の他に LaTeX をよく使います. TeX 原稿はテキストファイルなので,diffで差分を取るのに都合がいいのですが,組版後のPDFで差分を確認したいこともよくあります. そんなときには,Latexdiff が便利です.ただし,Latexdiff を和文で使うにはちょっとしたコツが必要です.

Latexdiff は素敵

Latexdiff は,LaTeX で英文を書く際の必携ツールだと思います.

こんな感じで diff を取って,PDFを開くと,

% latexdiff oldfile.tex newfile.tex > diff.tex
% platex diff.tex
% dvipdfmx diff.dvi
% open diff.pdf

こんな感じに差分を見せてくれます.

dbimage.png
Figure 1: Latexdiff で作った差分PDF (本家 http://latexdiff.berlios.de から転載)

TeX のコマンドを認識してくれて,うまく差分を取ってくれます. ちなみに MacPorts に収録されているので,Mac の人は,簡単にインストールできます.

日本語文章とLatexdiff

Latexdiff は便利なのですが,日本語の単語境界をうまく取れないので,文全体を1単位として差分を取ってしまうことが多く,英文の差分に比べて見辛くなってしまうのが残念です. そこで,Latexdiff が単語境界の判定に使う正規表現を書換えて,日本語でもそれっぽく差分を取れるようにいじりました.以下,パッチです:

--- /opt/local/bin/latexdiff  2013-01-19 13:53:47.000000000 +0900
+++ latexdiff 2013-04-18 13:39:37.000000000 +0900
@@ -483,7 +483,8 @@
   my $and = '&';
   my $coords= '[\-.,\s\d]*';
 # word: sequence of letters or accents followed by letter
-  my $word='(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])+';
+# http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
+  my $word='(?:\p{Han}+|\p{InKatakana}+|\p{InHiragana}+|\p{InHalfwidthAndFullwidthForms}+|(?:[-a-zA-Z_0-9*]|\\\\[\"\'\`~^][A-Za-z\*])+)';
   my $cmdleftright='\\\\(?:left|right|[Bb]igg?[lrm]?|middle)\s*(?:[()\[\]|]|\\\\(?:[|{}]|\w+))';

   my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:\['.$brat0.'\]|\{'. $pat6 . '\}|\(' . $coords .'\))'.$extraspace.')*';

書換えた Latexdiff のバージョンは,1.0.2 です.MacPorts でインストールしました.

% latexdiff --version
% This is LATEXDIFF 1.0.2  (Algorithm::Diff 1.1902, Perl v5.12.4)

このパッチは,UTF-8 の原稿限定用です.英文もそのままでいけると思います. このパッチで,単語境界として,平仮名,片仮名や漢字の切れ目が加わります. それにしても,Perl の正規表現って,凄いことができますね.Ruby でもこんなことできるのか調べてみよう…

これに至るまでに,漢字に平仮名が続いた場合も1単位としてみたり,色々試行錯誤したのですが, 差分を眺めるという観点からは,あまり見やすさに変化が感じられなかったので,結局,これに落ち着いています. もっと真面目に形態素解析とかをすれば違うのかもしれません.

それと,Latexdiff は,デフォルトで差分に下線を引いてくれるのですが,日本語だとうまく改行が制御されず, 右マージンをよくオーバしてしまうので,利用には, -t CFONT オプションで色とフォントの変更だけにしておくほうがいいです. UTF-8 な日本語 TeX ファイルの差分を取りたい場合は,こんな感じです:

% latexdiff -e utf8 -t CFONT oldfile.tex newfile.tex > diff.tex

git で Latexdiff をスマートに使いたい人は,こちらも参考になりそうです.

Latexdiff には,これ以外にも多彩なオプションがあるので,マニュアルの一読をオススメします. 例えば, --append-safecmd オプションは,少し広い範囲を丸ごと1単位として差分を出したいときに便利です. 個人的には,修正個所を大きく示して言い訳を回答しなければならないときに重宝しています.