latexdiff是用于比较两份LaTeX文档、并把其中有意义的差异标注出来的开源工具,本质上相当于针对LaTeX文件的diff。它由Perl语言写成,会生成一份新的LaTeX文件,用标准宏包实现颜色、下划线等可视化标记,常用于论文投稿修回、多人协作与版本核对场景。除主程序外,软件包还附带latexrevise和latexdiff-vc等配套脚本。
定义
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]。
参见
参考资料
- latexdiff [引用日期2026-10-14]
- File: control [引用日期2026-10-14]
- man [引用日期2026-10-14]
- latexdiff [引用日期2026-10-14]
- FreeBSD Manual Pages [引用日期2026-10-14]
- latexdiff-vc(1) - LATEXDIFF-VC(1) | LATEXDIFF-VC(1) [引用日期2026-10-14]
- latexdiff [引用日期2026-10-14]