English documentation: README_EN.md.
输入旧版和新版 .tex 文件,生成一个带修改痕迹的 .tex 文件。删除显示红色删除线,替换后写入的文字显示蓝色,纯新增显示蓝色下划线。公式、引用、图表也按下述规则处理。
直接双击打开 index.html,依次选择 Original 和 New 的 .tex 文件,选择 1–10 的最小修改词数,再点击“生成并下载”即可获得 tex_difference.tex。文件在本地处理,无需安装依赖或启动服务器。
examples/sample_org.tex 和 examples/sample_rev.tex 是可直接上传的演示文件;它们使用同目录下的 figure_org.png、figure_rev.png。examples/tex_difference.tex 是用默认 1 词门槛生成的对比结果。在 examples 目录编译,以便 LaTeX 找到图片文件。
- 运行命令行或测试: 安装 Node.js(官方下载),需要 18 或更新版本。
- 编译生成的
.tex为 PDF: 安装一种 LaTeX 发行版,例如 MiKTeX(Windows 下载) 或 TeX Live(官方安装说明)。不需要两种都装。 - 编译所需宏包: xcolor、ulem、cancel 和 TikZ。这些链接是 CTAN 的宏包说明与下载页面;通常通过已安装的 LaTeX 发行版管理宏包。示例论文还使用 amsmath 和 graphicx。
若文档引用了相对路径的图片或文献文件,请把下载的 .tex 放在原项目合适的位置后再编译。
试用网站 https://jinghaow.github.io/ManuDiff/
编译 tex_difference.tex 后,PDF 中旧版删除的文字是红色删除线,删除公式带红色斜线,替换后写入的文字是蓝色,纯新增的文字是蓝色下划线,完整新增块整体显示蓝色。界面中的示例仅用于说明效果,不是对上传文件的实时预览。
在项目目录运行 pdflatex tex_difference.tex,通常会生成 tex_difference.pdf;如果原项目使用 XeLaTeX 或 LuaLaTeX,应继续使用原来的编译方式。
- 行内公式(
$...$、\(...\)):旧公式红色划除,新公式蓝色;纯新增的公式为蓝色下划线。整块公式(\[...\]、equation、align、gather、multline)按完整公式对比:旧公式以红色无编号形式显示,新公式保留原编号、标签并显示为蓝色。整块公式不使用下划线,以免破坏公式排版。 \cite类引用和常见\ref类交叉引用:保持命令完整,旧引用用红色删除线,新引用用蓝色,纯新增用蓝色下划线。旧引用键或交叉引用标签若无法在新版项目中解析,编译后可能显示为?。\includegraphics图片命令发生变化时:保留并显示新版图片,并在前面显示蓝色的 “Revised figure” 提示;不显示旧图片文件名。图片内容本身不会做像素级比较。完整删除图片或 figure 时会保留旧图并覆盖红色对角斜线,因此这种情况下旧图片文件仍须存在。- 正文只使用颜色、下划线、删除线或无文字的结构标记,不显示状态字样。图片和表格删除时显示 “Deleted” 并在旧内容上覆盖红色对角斜线,修改时显示 “Revised”,纯新增时显示 “Add”。
- 浏览器界面和命令行都支持 1–10 词门槛,仅用于普通文字修改;孤立的一处标点变化不额外标记,公式、引用命令、图片文件和整块新增/删除始终作为独立修改显示。
- 对无法安全包裹的 LaTeX 结构变化,页面或命令行会报告数量,并在 PDF 中加入无文字的颜色标记;仍建议人工核对复杂结构。
以下问题均已修复并加入自动回归测试:
- 新增完整
figure环境时,其中的图片显示Add figure。 - 删除完整
figure环境时显示Deleted figure,保留旧图并在整个旧 figure 上覆盖红色对角斜线。 - 表格位于混合删除块的任意位置时均显示
Deleted table。 - 删除章节标题和具有文字参数的结构命令时,文字使用红色横向删除线。
- 常规情况下,只有全文恰好一处独立标点变化时才省略标记;多处标点变化全部显示。标点移动的边界情况见下方“已知问题”。
- 汉字按单字 token 参与 1–10 词门槛判断,较长中文修改不会再被整体视为一个词。
- 浏览器按已处理的文档块报告比较进度,并在块之间刷新页面;超大单段正文的进度限制见下方“已知问题”。
- 标点位置发生移动时,可能被误判为“仅一处标点修改”并完全省略标记。例如
A, B. C改为A B, C!时不会显示差异。后续需要结合标点两侧的文字位置判断变化。 - 删除
\custom{deleted}这类只有一个单词参数的自定义命令时,命令会保留,但参数文字可能没有红色删除线。 -
sidewaystable等扩展表格环境尚未识别为表格;完整删除时可能缺少Deleted table提示和红色对角斜线。 - 删除
longtable时,当前实现会尝试把整个跨页表格放入 TikZ 节点,存在 LaTeX 编译失败风险。跨页表格需要使用不依赖盒子的专用删除标记方式。 - 删除 figure 或 table 时,原来的
\caption会转换为普通小号文本,以避免保留旧编号;因此标题样式、间距和原排版可能发生变化。 - 文件比较期间切换界面语言或重新选择文件,可能提前重新启用“生成并下载”按钮,从而启动两个并发任务并触发重复下载。
- 进度按顶层文档块计算。对于接近 10,000 字且只有一个段落或一个大型结构块的输入,耗时计算结束前可能一直停留在 35%,随后直接跳到下一阶段,不能反映块内处理速度。
需要 Node.js 18 或更新版本;生成 PDF 还需要本机的 LaTeX 编译器,以及 xcolor、ulem、cancel、tikz 宏包。
node .\simple-latex-diff.js old.tex new.tex --min-words 1 -o comparison.tex--min-words 可设为 1 到 10 的整数,默认 1。它表示一处连续修改中,旧版或新版至少涉及多少个词才显示痕迹。低于门槛的修改仍采用新版文字,只是不标记。例如把一个词改成另一个词,在门槛为 2 时不会显示痕迹。
这里的“词”按连续的 Unicode 字母或数字片段统计;汉字按单字 token 统计。该规则用于稳定控制标记门槛,不等同于自然语言分词。
省略 -o 时,输出到新版文件旁边的 新版文件名_diff.tex。可用 pdflatex comparison.tex 编译,也可以用原项目所用的其他 LaTeX 引擎。建议在原项目目录中生成输出,以便图片、参考文献等相对路径继续可用。
node --test .\simple-latex-diff.test.js- 以新版的导言区和文档结构为基础,只对
\begin{document}到\end{document}之间的普通文字添加痕迹。 - 注释、标签、代码环境与未覆盖的自定义命令通常直接采用新版,不保证在 PDF 中显示痕迹。图片和表格的新增、修改、删除会显示状态提示;复杂表格结构与列格式仍建议人工检查。
- 不展开
\input/\include文件,也不处理自定义宏中的复杂语法。两版都须是完整.tex文件。 - 生成的
.tex使用cancel、xcolor、ulem和tikz宏包。自动测试只检查生成逻辑,没有编译 PDF;请按原项目的方式实际编译并检查复杂公式、引用样式与浮动体。 - 支持 10,000 字符以内的正文,也可处理更长的 Journal 稿件。比较算法把词、空白、标点和部分 LaTeX 结构分别作为 token;大范围改写超过 1000 次 token 编辑时,会先用未修改的公共行作为锚点,再对局部变化进行细粒度比较,以限制内存占用。复杂项目和更广泛的 LaTeX 语法可使用 latexdiff。
如果觉得这个工具好用,欢迎给 GitHub 仓库点个 Star!