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

為什么用Latex寫論文需要設(shè)計(jì)“工作流程”

Latex是理工類論文的事實(shí)標(biāo)準(zhǔn)鼠哥,但是對于“寫作-合作者審閱-討論并修訂-寫作新內(nèi)容”這樣迭代式的寫作流程來說,它缺少清晰的修訂模式露久。尤其當(dāng)作者和合作者并行修改論文時(shí)更米,這個(gè)缺陷會(huì)經(jīng)常導(dǎo)致內(nèi)容沖突、遺失等問題毫痕,全靠肉眼一行行地修訂非常費(fèi)時(shí)間征峦。

第二個(gè)問題是論文是會(huì)被拒的。在快則個(gè)把月消请,慢則長達(dá)一年的評閱時(shí)間之后栏笆,再度撿起論文草稿,很難記起當(dāng)時(shí)的寫作思路和版本迭代思路臊泰。

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

整體思路

  1. 在code hosting網(wǎng)站上建立你的論文倉庫(如:my-papers文件夾)因宇,每一篇內(nèi)容獨(dú)立的論文用一個(gè)單獨(dú)的文件夾保存七婴。網(wǎng)站選擇的原則是隨時(shí)可訪問和支持私有庫。
  2. 每一篇的論文寫作察滑,均只從遠(yuǎn)程倉庫pull當(dāng)前論文的目錄打厘,不影響其他論文。
  3. 用至少三個(gè)分支進(jìn)行寫作贺辰。和程序開發(fā)相似户盯,master分支的代碼總是submission-ready的。每個(gè)合作者的修改單獨(dú)用一個(gè)分支保存饲化,比如co-author分支莽鸭。收到新的修改后,放到co-author分支下吃靠,然后merge到當(dāng)前寫作分支硫眨,比如my-writing分支。

具體流程

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

在代碼托管網(wǎng)站上建論文倉庫沒什么可說的巢块,這里只說一下如何每次只pull當(dāng)前論文的目錄礁阁。

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 # 設(shè)置需要pull的論文目錄
    $ git pull origin master
    $ <edit_your_paper>  # 修修補(bǔ)補(bǔ)你的寶貝論文
    $ git pull origin master # 如果遠(yuǎn)程倉庫有新的修改,則pull下來合并族奢,可選
    $ git push --set-upstream-to origin master # 第一次push需要設(shè)置本地分支和
                                               # 遠(yuǎn)程分支的跟蹤關(guān)系姥闭,之后直接
                                               # "git push origin"就可以

注意事項(xiàng):

  1. git pull操作相當(dāng)于git fetch + git merge操作組合。因此如果你不止想pull遠(yuǎn)程倉庫里的master分支越走,而是所有分支棚品,上述命令中的第一個(gè)pull操作可以用git fetch origin代替,后者默認(rèn)下載origin服務(wù)器上所有分支,所取回的更新铜跑。這些分支在本地主機(jī)上要用"遠(yuǎn)程主機(jī)名/分支名"的形式讀取门怪,如remotes/origin/master
  2. git fetch之后本地是沒有分支的疼进,本地工作目錄也為空。需要在遠(yuǎn)程分支基礎(chǔ)上秧廉,使用
    $ git checkout -b <new_local_branch> origin/<remote_branch>
    

創(chuàng)建一個(gè)本地分支<new_local_branch>伞广。

  1. 或者執(zhí)行
     $ git checkout merge origin/<remote_branch>
    

origin/<remote_branch>合并到本地master分支。如果當(dāng)前沒有分支疼电,git merge會(huì)在本地創(chuàng)建master分支嚼锄。

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

指定當(dāng)前本地分支跟蹤遠(yuǎn)程分支

Git寫Latex的流程

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

  1. 最好每一章一個(gè)單獨(dú)的tex文件蔽豺,因?yàn)檎撐牟恢懈耐兜臅r(shí)候可能需要換模板区丑。這時(shí)候?qū)⒚恳徽轮苯?code>\input到模板文件里就可以。
  2. 每句話一段修陡。Git的diff默認(rèn)以行為單位沧侥,而Latex只有在每段話前面有空行時(shí)才認(rèn)為是新的段落,所以每句話一段不影響Latex排版魄鸦,又可以方便Git做diff宴杀。你甚至可以git diff --color-words打開逐字比對的效果。
  3. 為每個(gè)\section開一個(gè)分支拾因。合作論文最常見的情況就是一個(gè)人寫一章旺罢,合作者寫/改另一章。為每一章開一個(gè)單獨(dú)的分支绢记,方便跟蹤進(jìn)度和合并扁达。
  4. 全局性的修改,如將整個(gè)論文中的“Section”改成“Chapter”蠢熄,做成單獨(dú)的commit跪解。導(dǎo)言區(qū)的修改也是如此。這樣無論是diff或者patch都很清楚做了什么修改签孔,不會(huì)和內(nèi)容修改相混淆惠遏。

和不使用Git的合作者合作

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

你沒有辦法讓你的合作者為了改你的論文在學(xué)會(huì)了Latex之后還專門去學(xué)Git,尤其是那些德高望重的合作者骏啰,比如你的導(dǎo)師节吮。而他們的意見和修改,一般來說是非聽不可的判耕。這時(shí)我們面臨的主要問題有兩個(gè):

  1. 記住交給合作者的論文版本
  2. 合作者返回時(shí)透绩,快速定位修改位置,并和你的當(dāng)前版本合并。
  3. 而你的當(dāng)前版本帚豪,可能已經(jīng)不是當(dāng)初交給合作者的版本了碳竟,甚至push到遠(yuǎn)程服務(wù)器了。(這不算第三個(gè)問題狸臣。)

有時(shí)候你會(huì)覺得合作者的意見并不那么靠譜莹桅,但是溝通還得繼續(xù),他仍然是你的導(dǎo)師烛亦,你必須得讓他知道你欣然接受了他的意見诈泼。這時(shí)候可以新開一個(gè)分支,用于接受合作者的意見并和他繼續(xù)往來溝通煤禽,而論文的實(shí)際發(fā)布版本則在另一個(gè)分支上铐达。

總之,我們需要一個(gè)叫做git-ident的Perl腳本幫我們自動(dòng)化這些事情檬果。步驟如下:

  1. 在你打算commit一個(gè)版本瓮孙,并將這個(gè)版本發(fā)給合作者之前,在當(dāng)前論文的根目錄下創(chuàng)建/修改.gitattributes文件选脊,內(nèi)容為:
    *.tex ident
    *.bib ident
    
  2. 然后在你要發(fā)給合作者的主文件里杭抠,如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你的論文,這時(shí)候Git會(huì)自動(dòng)將$Id$替換為當(dāng)前版本的SHA1值(并不是你commit的版本號)角寸。

這時(shí)候你就可以把你最新的commit的版本發(fā)給合作者了菩混,靜靜地等待他的修改,或者自己繼續(xù)寫下一章節(jié)扁藕。等他返回給你的時(shí)候沮峡,執(zhí)行

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

腳本會(huì)輸出你當(dāng)時(shí)交給合作者的commit版本號,比如b2234fa5之類亿柑。根據(jù)這個(gè)版本號邢疙,你可以創(chuàng)建/轉(zhuǎn)到你的co-author分支,保存他的修改望薄,并merge到你的當(dāng)前版本:

$ 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

當(dāng)你完成你對合作者這次修改的內(nèi)容的編輯之后疟游,可以重復(fù)這個(gè)流程,開始下一輪的“寫作-合作者審閱-討論并修訂”了痕支。

注意:git-ident需要Perl環(huán)境颁虐,并安裝IPC::RunIPC::System::Simple模塊。方式為:

  1. 執(zhí)行sudo cpan進(jìn)入cpan環(huán)境
  2. 執(zhí)行install MODULE_NAME安裝模塊

查看修訂

第一種辦法是用git diff卧须,實(shí)現(xiàn)在tex源代碼上顯示差異另绩。缺陷就是Git以行為單位做diff儒陨,而且tex源碼上看diff非常不清晰。

第二種辦法是使用\usepackage{changes}笋籽,這需要需要合作者在修訂的時(shí)候自己加標(biāo)注蹦漠,實(shí)在難為人。

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

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

當(dāng)我們采用每章一個(gè)tex文件的方式組織論文時(shí),latexdiff需要加上--flatten參數(shù)以展開main.tex中的各種\input侍芝,但效果并不好研铆。可以試試git-latexdiff工具

另外竭贩,latexdiff得到的<diff_file>.tex經(jīng)常容易出錯(cuò)蚜印,尤其在新老文件的\section莺禁、\subsection等名字不一致的時(shí)候留量。自己手動(dòng)把兩個(gè)文檔改成一樣的就行了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哟冬,一起剝皮案震驚了整個(gè)濱河市楼熄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浩峡,老刑警劉巖可岂,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翰灾,居然都是意外死亡缕粹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門纸淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來平斩,“玉大人,你說我怎么就攤上這事咽块』婷妫” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵侈沪,是天一觀的道長揭璃。 經(jīng)常有香客問我,道長亭罪,這世上最難降的妖魔是什么瘦馍? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮应役,結(jié)果婚禮上扣墩,老公的妹妹穿的比我還像新娘哲银。我一直安慰自己,他們只是感情好呻惕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布荆责。 她就那樣靜靜地躺著,像睡著了一般亚脆。 火紅的嫁衣襯著肌膚如雪做院。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天濒持,我揣著相機(jī)與錄音键耕,去河邊找鬼。 笑死柑营,一個(gè)胖子當(dāng)著我的面吹牛屈雄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播官套,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼酒奶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奶赔?” 一聲冷哼從身側(cè)響起惋嚎,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎站刑,沒想到半個(gè)月后另伍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绞旅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年摆尝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因悲。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堕汞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出囤捻,到底是詐尸還是另有隱情臼朗,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布蝎土,位于F島的核電站视哑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏誊涯。R本人自食惡果不足惜挡毅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望暴构。 院中可真熱鬧跪呈,春花似錦段磨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至误阻,卻和暖如春债蜜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背究反。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工寻定, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人精耐。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓狼速,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卦停。 傳聞我的和親對象是個(gè)殘疾皇子向胡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • @(〓〓 iOS-實(shí)用技術(shù))[代碼管理 Git/SVN] 作者: Liwx 郵箱: 1032282633@qq....
    Liwx閱讀 2,757評論 1 13
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 3,908評論 0 11
  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照沫浆,而是把代碼倉庫完整的鏡像下來捷枯。這樣一來滚秩,任何一處協(xié)同...
    __silhouette閱讀 15,860評論 5 147
  • 很多人還沉浸在過年的喜悅中郁油,其實(shí)18年已過去六分之一了本股,你呢,是否已經(jīng)收心會(huì)到工作和學(xué)業(yè)中桐腌? 其實(shí)好久以來心里一直...
    孟123閱讀 193評論 0 0
  • 千里迢迢簡友行拄显,海州淼淼喜相逢。 詩心蕩漾胸襟闊案站,詞海徜徉韻律清躬审。 地北天南臨海聚,仙宅道骨訴衷情蟆盐。 誰言朝暮隨緣...
    不惑而歌閱讀 1,083評論 10 23