Overleaf AI 改过的公式协作后对不上——冲突该从哪一层查?

文章导读
多人协作里 AI 改过的公式两边显示不一致,通常不是单一原因,而是三层中的一层出问题:版本历史里的冲突没有合干净、\label 与 \ref 被改了一半、或者两边本地编译结果本来就不同。判断从哪一层查,可以按“历史记录 → 冲突标记 → 最小片段编译 → 标签与引用 → 整篇重编译”的顺序逐层排除,每一层都有能直接看到的输出,不需要先猜谁对。
📋 目录
  1. 在历史记录里定位改动公式的那次提交
  2. 读冲突标记两侧的实际公式内容
  3. 用最小公式片段分别编译两边版本
  4. 在源文件里确认标签与引用是否被同一处重命名
  5. 合并后整篇重编译,核对公式编号与交叉引用
A A

多人协作里 AI 改过的公式两边显示不一致,通常不是单一原因,而是三层中的一层出问题:版本历史里的冲突没有合干净、\label 与 \ref 被改了一半、或者两边本地编译结果本来就不同。判断从哪一层查,可以按“历史记录 → 冲突标记 → 最小片段编译 → 标签与引用 → 整篇重编译”的顺序逐层排除,每一层都有能直接看到的输出,不需要先猜谁对。

先确认两边是否基于同一个提交基线,再读冲突区两侧的公式内容,然后用最小公式片段分别编译,最后核对 \label 与 \ref 是否成对、整篇编号是否连续。适用场景是 Overleaf 项目或 Git 桥接项目;只走在线历史快照时,比对粒度会粗一些。任何一层的结论都以两边各自的源文件和编译输出为准,在没编译过之前,不建议直接认定某一侧是对的。

在历史记录里定位改动公式的那次提交

先把改动范围限定到公式所在的那个文件,否则在整篇历史里翻提交很容易看漏。Overleaf 的 History 面板可以按时间滑块选两个版本做 Compare,也可以先打开单个文件再看它的变更;Git 桥接的项目用命令行更直接。

按时间与作者筛选,只盯那一个文件:

git log `--follow` `--oneline` `--author`="<作者>" `--since`="<起始时间>" `--until`="<结束时间>" -- sections/method.tex

如果只想看公式所在行段的改动,用 -L 追踪行范围,再单独 diff 这个文件:

git log -p -L 120,150:sections/method.tex
git diff <旧提交> <新提交> -- sections/method.tex

AI 如果在一次提交里批量改了公式,-L 会把相关的几次改动连同上下文一起列出,比看整个提交的 diff 更容易定位。用 Overleaf 在线历史时,先确认两侧版本号(或时间点)不同,并且中间确实夹着一次与公式相关的改动,再进入下一步。若两边历史里根本找不到共同基线,说明排查方向要转到“合并过程”而不是“编译环境”。

Overleaf AI 改过的公式协作后对不上——冲突该从哪一层查?

读冲突标记两侧的实际公式内容

冲突标记只说明同一段被两边改过,不说明哪边正确。标准结构是三段,中间用等号行分隔:

<<<<<<< HEAD
\begin{equation}
  \label{eq:loss}
  L = \frac{1}{N}\sum_i \ell_i
\end{equation}
=======
\begin{equation}
  L = \frac{1}{N}\sum_i \ell_i \label{eq:loss}
\end{equation}
>>>>>>> ai-edit

判断保留哪一侧,看三件事:这一侧的符号与文中前面定义的变量是否一致;\label 是否只出现一次、名字有没有被改;公式体有没有被 AI 顺手改掉结构,比如把 \frac 换成 \dfrac、多加了一层括号。语义相同的情况下,取更贴近原文排版习惯的一侧即可。

手工合并的最小操作是只改冲突块内部,不整段删掉重写——重写会丢掉原有的编号和引用关系。删掉标记三行、保留最终内容后,用 grep 确认没有残留:

Overleaf AI 改过的公式协作后对不上——冲突该从哪一层查?
grep -n '^<<<<<<<\|^=======\|^>>>>>>>' sections/method.tex

用最小公式片段分别编译两边版本

如果两边源文件看起来一样、显示却不同,就要判断差异是内容不同还是编译结果不同。做法是各建一个最小文件,只保留公式本身和它依赖的宏包,分别编译,看哪边能过、哪边报错。

\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{equation}
  \label{eq:loss}
  L = \frac{1}{N}\sum_{i=1}^{N} \ell_i
\end{equation}
\end{document}

把两边的公式体分别粘进同一个骨架里编译。有报错时记录类型:常见的有 \begin{align} 与 \end{equation} 不匹配、AI 插入的宏包没在导言区加载、\text 里混入未转义字符。能通过的一侧说明公式内容本身可编译;报错的一侧在整篇里可能直接中断后续排版,或者让你看到的是上一次编译的旧结果。两边都能通过时,差异通常来自公式内容本身,而非编译环境。

在源文件里确认标签与引用是否被同一处重命名

AI 改写公式时容易只改一半:把 \label{eq:loss} 改成 \label{eq:loss_new},却没有同步改引用它的 \ref{eq:loss}。这种情况源码不报错,但页面上引用位置会变成问号。用成对查找确认:

grep -rn '\\label{' .
grep -rn '\\ref{' .
grep -rn '\\eqref{' .

把两次输出的标签名对照一遍:被 \ref 引用、但 \label 里找不到对应名字的,就是被改了一半的引用。也可以从编译日志里反向确认:

Overleaf AI 改过的公式协作后对不上——冲突该从哪一层查?
grep -n 'undefined' main.log
grep -n 'multiply defined' main.log

页面上出现 ?? 或 (??) 一般就属于这一类,需要在源文件里补齐标签或把引用名改回去,而不是去公式体里找问题。还要留意 AI 是否把自动编号改成了手写 \tag,那样编号不会随整篇顺序更新,引用也就对不上。

合并后整篇重编译,核对公式编号与交叉引用

冲突标记清干净之后,整篇重编译至少两遍,让编号和交叉引用刷新到位,再逐项核对:

  1. 公式编号是否连续,中间有没有因为删掉一个 equation 环境而跳号或重复。
  2. AI 改过的公式附近,正文里引用它的位置是否仍指向同一个编号。
  3. 编译日志里是否还有 undefined reference 或 multiply defined label。
  4. \label 名字是否有重复,重复时 LaTeX 会告警并让引用指向其中一个。
grep -n 'Warning' main.log
grep -n 'undefined' main.log
grep -n 'multiply defined' main.log

核对时以最终 PDF 和 .log 为准,不要只看编辑器预览。如果某一项仍对不上,回到对应的那一层重新查一次,不要在历史和源码两边同时改——那样会引入新的基线差异,下一次协作时更难判断是哪一层的问题。