2012年10月13日 星期六

latex也可以追踪修訂--latexdiff+git

相信愛用latex的朋友們,對latex想必是又愛又恨吧,愛的是他強大的排版功能和完善的數學方程式,而恨的則是latex沒有內建追踪修訂功能,無法和其他共同作者編寫同一份文件的時候,追踪彼此所修改的內容,甚至是在revise論文的時候,也不容易追踪自己所修的內容。

的確,latex本身沒有內建追踪修訂,不過大家也不用因此而氣餒,方法總是人想出來的,沒有原生的解決方法,還是有外掛的方式可以達成追踪修訂的目的!

沒錯,latexdiff就是為了此目的而生的script,該script使用perl語言所寫成,在灌好MacTek或是MikTex之後,就內建的一個小程式。

使用的方法很簡單,只要輸入以下指令:

latexdiff old.tex new.tex > diff.tex

其中,old.tex是舊版本的檔案,new.tex是新版本的檔案,而diff.tex則是兩個檔案的差異,也就是追踪修訂的原始檔。接著,我們只要編譯diff.tex,就能得到diff.pdf,該pdf檔就會包含新舊版本的差異啦。

如下圖:

 

螢幕快照 2012 10 13 下午8 04 43

紅色刪除線為前一版本中被刪除的內容,藍色下底線的文字則是新版本中加入的內容,一目了然,跟word的追踪修訂一樣清楚,而且就算是演算法也能呈現前後版本的不同,如下圖:

螢幕快照 2012 10 13 下午8 08 30

此外,要注意的是,文章中的圖檔和所使用到的style檔,都必須和diff.tex放在同一個資料夾中,才能正常編譯成功。因為diff.tex中,只有包含old.tex和new.tex之間文字內容的差異,圖案是不會包含進來的,除非改了圖檔的檔名。

參考文章:

http://www.peteryu.ca/tutorials/publishing/latexdiff

 

Latexdiff+Git

原則上,單單使用latexdiff就已經滿足大部份人的需求了。不過,latexdiff有一個缺點,就是他只能辨識一個檔案的差異。如果,大家跟我一樣,習慣將不同章節寫在不同的檔案中,並且使用\include,將章節引入進主要的tex檔。那文件的變動都在其他檔案中,而主文件中跟本不會有任何異動,這樣latexdiff跟本就無法檢查出新舊內容的差異。這可怎麼辦呢?總不能每個章節產生一個diff檔,然後再自行整合所有的diff檔,聽起來就是一個大工程,勞心又耗時。

沒錯,我的心聲,Google大神都聽進去了,他也知道這是一件麻煩事,所以讓我找到了Yngve's blog,這位物理博士生,遇到了和我一樣的困擾,而且他還用git來維護他的論文,所以,他自己寫了一個shell script (稱作latexbatchdiff),同時可以偵測多個檔案的變動,還可以利用git,在不同的論文版本中,追踪論文的不同點。而且,他還分享了他寫的script,無私地讓大家使用,實在是太佛心來啦。大家可以到他所建立的專案中下載 :

http://gitorious.org/latexbatchdiff/

當然也可以用git直接下載回來用:

git clone git://gitorious.org/latexbatchdiff/latexbatchdiff.git

 下載回來之後,會在latexbatchdiff資料夾下看到兩個.sh檔,其中,install.sh是安裝檔,執行install.sh之後,該script會詢問你一些問題,像是使用何種版本控制軟體,我是用git,所以,回答git,接著會問你:

Want to create new command for difftool.latex This will overwrite the existing command, is this OK? (y/n)

這裡我回答y,因為他只會覆寫git的設定,不會影響整個系統,為什麼我這麼確定呢?因為我也很擔心程式有沒有漏洞在裡面,所以兩個程式我都trace過了,不用擔心,可以安心使用。而且這個install.sh只是根據你系統的設定,將他寫的latexbatchdiff.sh複製到~/.local/bin/,所以並沒有任何問題。

執行完之後,還必須自行編輯~/.profile,加入

export PATH=/Users/hdj/.local/bin:$PATH

安裝流程如下圖:

螢幕快照 2012 10 14 上午12 30 02 2

完成以上設定之後,就大功告成啦。

可以使用以下指令執行:

latexdiff-git ebc3e0 master.tex parts/introduction.tex parts/results.tex

其中,ebc3e0是git中版本的編號,master.tex是主要的tex文件,而後面兩個則是各章節的tex檔,在latexbatchdiff中,如果要檢查每一個章節,就必須列出所有的章節檔名。如果只有一個文件的話,就不用填入後面的章節檔。此外,如果沒有填入版本編號,latexdiff-git會自行和最後一個commit的版本比較。latexdiff-git執行完之後,會自動開啟一個master-diff.pdf,這個檔案就是修訂追踪的檔案啦。

參考資料:

.gitignore http://eothred.wordpress.com/2010/11/07/latexdiff-and-git/

 

Git簡易教學

同場加映一些git的簡易教學,以免過一陣子,連自己都忘了怎麼用><

首先是在論文的資料夾中建立倉儲:

git init

接著發佈一個init版本 

git add .

git commit -a -m "Init"

 

假設我們修改了一些檔案,然後又發佈了一個新的版本,我們可以用git log看看我們各版本的資訊,如下圖:

Git

在這個例子中,假設我要追踪a3c110這個版本和目前版本的差異,我可以下:

latexdiff-git a3c110 master.tex

如果在刪除檔案時,有東西不小心誤刪了,我們可以用以下指令回到最近的版本:

git reset --hard HEAD

 

2 則留言:

匿名 提到...

"latexdiff有一個缺點,就是他只能辨識一個檔案的差異" <-- 用 --flatten 就可以展開所有相關 .tex 檔案來一次比較整分文件

hdj 提到...

感謝你的留言,原來latexdiff也有這個功能,晚一點我會補上您的説明,再次謝謝。

Related Posts Plugin for WordPress, Blogger...