用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阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • @(〓〓 iOS-实用技术)[代码管理 Git/SVN] 作者: Liwx 邮箱: 1032282633@qq....
    Liwx阅读 2,757评论 1 13
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,907评论 0 11
  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,860评论 5 147
  • 很多人还沉浸在过年的喜悦中,其实18年已过去六分之一了,你呢,是否已经收心会到工作和学业中? 其实好久以来心里一直...
    孟123阅读 193评论 0 0
  • 千里迢迢简友行,海州淼淼喜相逢。 诗心荡漾胸襟阔,词海徜徉韵律清。 地北天南临海聚,仙宅道骨诉衷情。 谁言朝暮随缘...
    不惑而歌阅读 1,083评论 10 23