协作与变更跟踪

LaTeX 是纯文本,因此与 版本管理和协作写作非常契合。本章建立一种在不破坏稿件的情况下多人推进的模式:只用 Git 管理源文件,用 latexdiff 把版本差异做成 PDF,并用 todonotes / changes 处理稿件中的工作备注和审阅标注。

用 Git 管理

由于源文件是文本,Git按行差异、分支、合并和历史 都能直接发挥作用(与二进制文档文件完全不同)。只提交 源文件.tex.bib、图、.latexmkrc 等),用 .gitignore 排除编译时重新生成的文件。协作技巧是 一句一行:短行让 diff 更易读,也让合并更不容易冲突。

terminal
# .gitignore — 生成物を無視 / ignore generated files
*.aux
*.log
*.out
*.toc
*.fls
*.fdb_latexmk
*.synctex.gz
*.bbl
*.blg
*.bcf
*.run.xml
*.idx
*.ilg
*.ind

是否把 PDF 提交到 Git,取决于你的分发方式。如果需要固定提交版或发布版,可以把它放在 releases/ 之类的位置显式管理。但每次编辑都提交重新生成的 main.pdf 会让 diff 无法阅读,也会让历史变重。实用做法是平时忽略生成的 PDF,只在里程碑时把构建结果附加到 tag 或 Release。

协作时,按章节或任务开分支,并让每个提交只包含一个有意义的变更,会更容易审阅。把大型图替换、参考文献 DB 整理和正文改写混在同一个提交里,会让差异 PDF 和 Git diff 都难以追踪原因。LaTeX 的优势是“可以像处理代码一样处理文章”,因此历史也应按类似代码的粒度保留。

latexdiff — 标出版本差异

latexdiff(F. Tilmann)会比较两个版本,并输出一个 突出显示变更的新 .tex。编译它后,新增文本会以下划线(带颜色)显示,删除文本会以删除线显示,就像文字处理软件的修订模式。它插入的所有标记命令都以 \DIF 开头。

terminal
latexdiff --flatten old.tex new.tex > diff.tex   # diff.tex をコンパイル / then compile diff.tex
latexdiff-vc --git -r HEAD~3 main.tex            # Git の版と比較 / compare against a Git revision

对于用 \input/\include 拆分的文档,请加上 --flatten,先合并成一个文件再比较。使用 latexdiff-vc--git(或 --svn--hg),可以 直接与版本管理中的特定 revision 做差异

todonotes — 留下备注和 TODO

todonotes package 用于在稿件中留下工作备注。\todo{...} 会在页边放置彩色批注(\todo[inline]{...} 放在正文中),\missingfigure{...} 会放入尚未绘制的图的占位符,\listoftodos 会把所有 TODO 汇总成列表。最终版可以用 \usepackage[disable]{todonotes} 全部隐藏。

latex
\usepackage{todonotes}
...
\todo{ここは要出典}
\missingfigure{回路図を後で追加}
\listoftodos

changes — 带作者的修改标注

用于审阅和合作者标注时,changes package 很方便。用 \added{...}\deleted{...}\replaced{new}{old}\comment{...} 可以明确标出修改,并为 每位作者分配一种颜色draft 选项显示标记,final 模式隐藏标记,\listofchanges 汇总所有修改,就像把 track changes 嵌进源文件。

latex
\usepackage[draft]{changes}
...
\added[id=AB]{新しく加えた一文。}
\replaced[id=AB]{改訂後}{改訂前}

切换到最终版前的检查

  • todonotes 设为 disablechanges 设为 final,确认 PDF 中没有 TODO 或标记残留。
  • latexdiff 生成的 .tex 用单独文件名保存,不要合并进主稿源文件。
  • 生成提交 PDF 前,用 latexmk -C 之类清理生成文件,并确认可以 clean rebuild。
  • 发给合作者时,区分“源文件包”“差异 PDF”“最终 PDF”,并说明需要审阅哪一个。

如何搭配使用

  • 历史、分工、合并Git(忽略生成文件;一句一行)。
  • 展示相对上一版本改变了什么latexdiff(拆分文档用 --flatten)。
  • 自己的 TODO 和未完成处todonotes(最终版用 disable)。
  • 合作者标注与接受/拒绝管理changesdraft 与 final 切换)。