用Git管理Latex寫論文的工作流程

為什么用Latex寫論文需要設計“工作流程”

Latex是理工類論文的事實標準,但是對于“寫作-合作者審閱-討論并修訂-寫作新內容”這樣迭代式的寫作流程來說,它缺少清晰的修訂模式。尤其當作者和合作者并行修改論文時,這個缺陷會經常導致內容沖突、遺失等問題,全靠肉眼一行行地修訂非常費時間。

第二個問題是論文是會被拒的。在快則個把月,慢則長達一年的評閱時間之后,再度撿起論文草稿,很難記起當時的寫作思路和版本迭代思路。

采用Git管理論文工作流程可以保存所有歷史版本、簡化內容合并過程。

整體思路

  1. 在code hosting網站上建立你的論文倉庫(如:my-papers文件夾),每一篇內容獨立的論文用一個單獨的文件夾保存。網站選擇的原則是隨時可訪問和支持私有庫。
  2. 每一篇的論文寫作,均只從遠程倉庫pull當前論文的目錄,不影響其他論文。
  3. 用至少三個分支進行寫作。和程序開發相似,master分支的代碼總是submission-ready的。每個合作者的修改單獨用一個分支保存,比如co-author分支。收到新的修改后,放到co-author分支下,然后merge到當前寫作分支,比如my-writing分支。

具體流程

利用Git的sparse-checkout功能建立論文倉庫

在代碼托管網站上建論文倉庫沒什么可說的,這里只說一下如何每次只pull當前論文的目錄。

ref: http://blog.algony.net/2015/05/git-sparse-checkout/

    $ git init <project> 
    $ cd <project>
    $ git remote add origin <your_remote_paper_repo>
    $ git config core.sparsecheckout true # 打開sparse-checkout模式
    $ echo "<current_paper_dir>" >> .git/info/sparse-checkout # 設置需要pull的論文目錄
    $ git pull origin master
    $ <edit_your_paper>  # 修修補補你的寶貝論文
    $ git pull origin master # 如果遠程倉庫有新的修改,則pull下來合并,可選
    $ git push --set-upstream-to origin master # 第一次push需要設置本地分支和
                                               # 遠程分支的跟蹤關系,之后直接
                                               # "git push origin"就可以

注意事項:

  1. git pull操作相當于git fetch + git merge操作組合。因此如果你不止想pull遠程倉庫里的master分支,而是所有分支,上述命令中的第一個pull操作可以用git fetch origin代替,后者默認下載origin服務器上所有分支,所取回的更新。這些分支在本地主機上要用"遠程主機名/分支名"的形式讀取,如remotes/origin/master
  2. git fetch之后本地是沒有分支的,本地工作目錄也為空。需要在遠程分支基礎上,使用
    $ git checkout -b <new_local_branch> origin/<remote_branch>
    

創建一個本地分支<new_local_branch>

  1. 或者執行
     $ git checkout merge origin/<remote_branch>
    

origin/<remote_branch>合并到本地master分支。如果當前沒有分支,git merge會在本地創建master分支。

  1. 或先在本地checkout一個分支,然后執行
    git branch --set-upstream-to=origin/<branch>
    

指定當前本地分支跟蹤遠程分支

Git寫Latex的流程

ref: https://stackoverflow.com/questions/6188780/git-latex-workflow

  1. 最好每一章一個單獨的tex文件,因為論文不中改投的時候可能需要換模板。這時候將每一章直接\input到模板文件里就可以。
  2. 每句話一段。Git的diff默認以行為單位,而Latex只有在每段話前面有空行時才認為是新的段落,所以每句話一段不影響Latex排版,又可以方便Git做diff。你甚至可以git diff --color-words打開逐字比對的效果。
  3. 為每個\section開一個分支。合作論文最常見的情況就是一個人寫一章,合作者寫/改另一章。為每一章開一個單獨的分支,方便跟蹤進度和合并。
  4. 全局性的修改,如將整個論文中的“Section”改成“Chapter”,做成單獨的commit。導言區的修改也是如此。這樣無論是diff或者patch都很清楚做了什么修改,不會和內容修改相混淆。

和不使用Git的合作者合作

ref: http://www.math.cmu.edu/~gautam/sj/blog/20130929-git-quickstart.html

你沒有辦法讓你的合作者為了改你的論文在學會了Latex之后還專門去學Git,尤其是那些德高望重的合作者,比如你的導師。而他們的意見和修改,一般來說是非聽不可的。這時我們面臨的主要問題有兩個:

  1. 記住交給合作者的論文版本
  2. 合作者返回時,快速定位修改位置,并和你的當前版本合并。
  3. 而你的當前版本,可能已經不是當初交給合作者的版本了,甚至push到遠程服務器了。(這不算第三個問題。)

有時候你會覺得合作者的意見并不那么靠譜,但是溝通還得繼續,他仍然是你的導師,你必須得讓他知道你欣然接受了他的意見。這時候可以新開一個分支,用于接受合作者的意見并和他繼續往來溝通,而論文的實際發布版本則在另一個分支上。

總之,我們需要一個叫做git-ident的Perl腳本幫我們自動化這些事情。步驟如下:

  1. 在你打算commit一個版本,并將這個版本發給合作者之前,在當前論文的根目錄下創建/修改.gitattributes文件,內容為:
    *.tex ident
    *.bib ident
    
  2. 然后在你要發給合作者的主文件里,如main.tex,加上一句包含$Id$的注釋,如:
    % DO NOT EDIT -> $Id$ <- DO NOT EDIT
    
  3. 安裝git-ident,并在你的論文根目錄下添加它的post-commit hook:
    $ cd .git/hooks
    $ ln -s /path/to/git-ident/post-commit
    
  4. commit或者checkout你的論文,這時候Git會自動將$Id$替換為當前版本的SHA1值(并不是你commit的版本號)。

這時候你就可以把你最新的commit的版本發給合作者了,靜靜地等待他的修改,或者自己繼續寫下一章節。等他返回給你的時候,執行

    $ /path/to/git-ident/git-find-commit.pl <your_shared_tex_file>.tex

腳本會輸出你當時交給合作者的commit版本號,比如b2234fa5之類。根據這個版本號,你可以創建/轉到你的co-author分支,保存他的修改,并merge到你的當前版本:

$ git checkout -b co-author b2234fa5
$ <save_his_file> # Save his file over yours
$ git commit --author 'Co Author <who@doesnt.use.git>'
$ git checkout my-writing
$ git merge co-author

當你完成你對合作者這次修改的內容的編輯之后,可以重復這個流程,開始下一輪的“寫作-合作者審閱-討論并修訂”了。

注意:git-ident需要Perl環境,并安裝IPC::RunIPC::System::Simple模塊。方式為:

  1. 執行sudo cpan進入cpan環境
  2. 執行install MODULE_NAME安裝模塊

查看修訂

第一種辦法是用git diff,實現在tex源代碼上顯示差異。缺陷就是Git以行為單位做diff,而且tex源碼上看diff非常不清晰。

第二種辦法是使用\usepackage{changes},這需要需要合作者在修訂的時候自己加標注,實在難為人。

第三種辦法就是用latexdiff工具,一般TeX版本都自帶,方法為:

$ latexdiff <old_tex_file>.tex <new_tex_file>.tex  >  <diff_file>.tex 

當我們采用每章一個tex文件的方式組織論文時,latexdiff需要加上--flatten參數以展開main.tex中的各種\input,但效果并不好。可以試試git-latexdiff工具

另外,latexdiff得到的<diff_file>.tex經常容易出錯,尤其在新老文件的\section\subsection等名字不一致的時候。自己手動把兩個文檔改成一樣的就行了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容

  • @(〓〓 iOS-實用技術)[代碼管理 Git/SVN] 作者: Liwx 郵箱: 1032282633@qq....
    Liwx閱讀 2,772評論 1 13
  • Git 命令行學習筆記 Git 基礎 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 3,934評論 0 11
  • Git 基礎 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來。這樣一來,任何一處協同...
    __silhouette閱讀 15,922評論 5 147
  • 很多人還沉浸在過年的喜悅中,其實18年已過去六分之一了,你呢,是否已經收心會到工作和學業中? 其實好久以來心里一直...
    孟123閱讀 196評論 0 0
  • 千里迢迢簡友行,海州淼淼喜相逢。 詩心蕩漾胸襟闊,詞海徜徉韻律清。 地北天南臨海聚,仙宅道骨訴衷情。 誰言朝暮隨緣...
    不惑而歌閱讀 1,112評論 10 23