Skip to content
JinghaoWPublic

About

Tracked Changes for LaTeX Manuscripts. Especially for paper revision :) You can use the web to test or produce. The website won't keep your private file and information.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

16 Commits

Folders and files

Repository files navigation

简易 LaTeX 正文对比

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 找到图片文件。

需要安装什么

若文档引用了相对路径的图片或文献文件,请把下载的 .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!

About

Tracked Changes for LaTeX Manuscripts. Especially for paper revision :) You can use the web to test or produce. The website won't keep your private file and information.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages