latexdiff

关注
义项:LaTeX文档差异比较工具
latexdiff

latexdiff是用于比较两份LaTeX文档、并把其中有意义的差异标注出来的开源工具,本质上相当于针对LaTeX文件的diff。它由Perl语言写成,会生成一份新的LaTeX文件,用标准宏包实现颜色、下划线等可视化标记,常用于论文投稿修回、多人协作与版本核对场景。除主程序外,软件包还附带latexrevise和latexdiff-vc等配套脚本。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

latexdiff是一个用Perl编写的脚本,作用是比较两个LaTeX源文件,并把二者之间显著的差异标注出来,即针对LaTeX文件的diff工具[1]。它输出一份新的LaTeX文件,其中已插入差异标记,编译后即可看到增删内容[2]。

该工具只处理符合LaTeX语法的文件,通用TeX文件不在其正确处理范围内,另有一些较小的使用限制记载于文档中。软件包同时带有用于接受或拒绝全部修改的latexrevise脚本,以及面向版本控制系统的latexdiff-vc包装脚本[1]。

原理

latexdiff读取旧版与新版两份文件,识别出新增与删除的文本块,再在相应位置插入以\DIF开头的标记命令。新增块用\DIFaddbegin与\DIFaddend括起,被删除的块用\DIFdelbegin与\DIFdelend括起,块内文字分别用\DIFadd和\DIFdel高亮[3]。新增注释以前缀%DIF >标注,删除注释以前缀%DIF <标注,删除块中的非安全命令和花括号则被注释掉[3]。

标记的显示样式由若干选项决定。--type选项定义\DIFadd与\DIFdel命令,可选UNDERLINE、TRADITIONAL、CFONT、FONTSTRIKE、CHANGEBAR、BOLD等样式,默认值为UNDERLINE;--subtype控制\DIFaddbegin一类括起命令的样式;--floattype则提供浮动体内使用的\DIF...FL命令[4]。所有标记都通过向导言区加入标准宏包代码实现,例如使用color宏包完成着色。

差异比对由Perl模块Algorithm::Diff完成,标准版需要另行安装该模块,也可使用把模块内联的独立版latexdiff-so;latexdiff-fast则内联了一个调用系统diff命令的改写版本,速度更快,但由于算法上的细微差别,其结果与标准版通常不完全相同。程序运行需要Perl 5.8或更高版本。

格式命令等在版面上不直接显示的改动,依然会在LaTeX源码中被标记出来,不会被忽略[1]。对于内容不符合标准LaTeX、或图形化标记没有意义的环境,可以把环境名加入PICTUREENV配置变量以移除全部标记;文档中还可以用DIFnomarkup环境包住不宜标记的片段,该环境内的标记会被去掉,内容一般直接取自新文件[3]。

发展历程

latexdiff的作者是F. Tilmann,CTAN上的版权信息标注为2004年至2024年[1]。软件长期以Perl脚本形式在CTAN发布,并被收录进TeX Live与MiKTeX发行版[1]。

README中记录的发布日期为2026年1月2日,对应latexdiff 1.4.0、latexrevise 1.3.2与latexdiff-vc 1.3.4。在Debian等发行版中,该软件由Debian Perl团队维护,主页指向CTAN上的项目页面[2]。随着使用方式变化,官方推荐改用内联了Algorithm::Diff的独立版本,以避免内部函数调用格式变动带来的问题。

应用

最直接的用法是把两个文件交给程序比较:latexdiff old.tex new.tex,生成差异文件后再用pdflatex等命令编译,即可得到带标注的版面[4]。这一流程常用于学术论文的修改稿,让审稿人或合作者一眼看出哪些内容有变动。

配套脚本latexdiff-vc面向git、subversion、mercurial、CVS、RCS等版本控制系统工作,可以用-r选项指定要比较的修订版,并可选地自动执行latex、dvips或pdflatex等命令,直接产出PDF或PostScript格式的差异文件[5]。若不指明版本控制系统,latexdiff-vc会自行推测[6]。

latexdiff-vc的--flatten选项会把待比较的修订检出到临时目录,再交由latexdiff处理,适合含多级include的项目;--flat=keep-intermediate变体则把中间快照保留在当前目录[5]。--only-changes选项对输出做后处理,只显示含改动的页面,需要使用ZLABEL子样式与zref宏包[6]。此外,contrib目录还收录了他人编写的包装脚本,例如可作为自定义包装模板的latexdiff-wrap,以及用于生成RPM包的spec文件。

在修订流程中,latexrevise可以一次性接受或拒绝全部改动;若只想接受或拒绝其中一部分,可以直接手工编辑差异文件来覆盖默认行为[1]。

局限

latexdiff只对符合LaTeX语法的文件有效,通用TeX文件无法被正确处理,此外还有一些较小的限制见诸文档。对数学公式等复杂结构,标记可能引发编译错误,官方建议改用--math-markup=whole,仍不成功时可完全关闭公式标记[7]。

带星号版本、需在外界环境中使用的命令等会带来额外麻烦,因此程序维护了一份可安全放进标记命令内部的命令清单,超出该清单的命令以及花括号都不会被\DIFadd括住,删除块中的非安全命令则被注释掉[3]。在图片、浮动体之类环境中,边注等标记方式会导致错误,需要借助--floattype等选项把标记方式换成不会出错的类型[4]。

latexdiff-fast虽然明显更快,但结果与标准版通常并不一致,只是多数实际情况下这些差别较小。latexdiff-vc依赖外部命令,因此与系统平台相关,主要在类Unix系统上测试过,要完整使用其功能还需系统已安装版本控制系统与LaTeX。当改用--flatten检出修订时,未被纳入检出过程的宏包文件、插图等需要在当前目录可访问,使用bibtex的项目建议把.bbl文件也纳入版本管理[5]。

参见

  • LaTeX —— latexdiff所处理的文档格式,其语法规定了程序能够正确解析的范围。

  • Perl —— latexdiff及其配套脚本使用的实现语言。

  • 版本控制 —— latexdiff-vc在此基础上工作,用于比较同一文件的多个修订版。

  • diff —— 通用文本差异比较程序,latexdiff是它在LaTeX领域的一种专用实现。

  • TeX Live —— 收录并分发latexdiff的发行版之一。

  • 最长公共子序列 —— 差异比对所依据的经典算法问题。

参考资料

  1. latexdiff [引用日期2026-10-14]
  2. File: control [引用日期2026-10-14]
  3. man [引用日期2026-10-14]
  4. latexdiff [引用日期2026-10-14]
  5. FreeBSD Manual Pages [引用日期2026-10-14]
  6. latexdiff-vc(1) - LATEXDIFF-VC(1) | LATEXDIFF-VC(1) [引用日期2026-10-14]
  7. latexdiff [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T18:44:49Z

历史版本

本条目引用的词条
LaTeX Perl 版本控制 diff TeX Live 最长公共子序列