如何避免 AI 生成无法编译的 LaTeX 代码?

博客EasyLaTeX发布于

AI 生成 LaTeX 代码时通常不知道你的项目环境,因而拿不到三类信息:已经加载的宏包、当前的编译引擎、模板自带的规则。缺这些信息时,它会调用项目里没有加载的命令,把数学符号写进普通文本,或者生成当前引擎不支持的字符。报错信息都指向源码里出问题的那一行,不会提示根因在上下文,排查起来像自己写错的一样。

生成前先把导言区清单固定下来

有效做法是先定一份导言区,连同任务一起给 AI,并写明「不要新增 \usepackage,只在这个范围内写」。下面这份可以直接用:

\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}   % pdfLaTeX 下保留;用 XeLaTeX 时删掉
\usepackage[T1]{fontenc}
\usepackage{amsmath,amssymb}  % 数学环境与符号
\usepackage{graphicx}         % \includegraphics
\usepackage{booktabs}         % \toprule \midrule \bottomrule
\usepackage{hyperref}         % 超链接,习惯上放最后

\begin{document}
\section{Method}
We minimise the objective
\begin{equation}\label{eq:obj}
  J(\theta) = \frac{1}{n}\sum_{i=1}^{n}\ell\bigl(f(x_i;\theta), y_i\bigr)
\end{equation}
where $\theta \in \mathbb{R}^{d}$.

\begin{table}[htbp]
  \centering
  \begin{tabular}{lcc}
    \toprule
    Model     & Accuracy & F1    \\
    \midrule
    Baseline  & 0.812    & 0.794 \\
    Ours      & 0.867    & 0.851 \\
    \bottomrule
  \end{tabular}
  \caption{Illustrative results.}
  \label{tab:results}
\end{table}

\end{document}

这份清单把可用命令限定在已加载的宏包内:\toprule 只在加载 booktabs 后可用,\bm 需要 bm,\SI 需要 siunitx。AI 看不到导言区时只能按常见写法推断,推断错了就触发 Undefined control sequence. 或 File 'xxx.sty' not found.。

五类常见报错的触发原因与改法

报错实际触发原因改法
Undefined control sequence.用了 \toprule、\bm、\SI 之类,导言区没有对应宏包加载宏包,或换成清单内的基础写法
File 'xxx.sty' not found.宏包名拼错、被编造,或当前环境中没有该宏包删掉该行,用清单内的宏包替代
Missing $ inserted.数学命令或下标写在数学模式外使用 \(\alpha\)、\(x^2\);普通文本的百分号另写成 \%
Unicode character θ (U+03B8) not set up for use with LaTeX.pdfLaTeX 不认 Unicode 数学字符优先改成 \(\theta\);更换引擎时也要配合相应的字体与数学设置
Extra alignment tab has been changed to \cr.tabular 的列数和 & 数量对不上普通行核对列数与分隔符;合并列需另行计数

这五类的报错信息都指向源码,不会说明根因是缺上下文。其中 % 在 LaTeX 里是注释符,AI 写「准确率提升了 12%」时可能漏掉转义,写成 \% 才成立。

给 AI 描述需求时的六条约束

  1. 要完整可编译示例,不要片段。说清「从 \documentclass 到 \end{document} 全部给出」,片段拼起来最容易丢环境;

  2. 一次只要求一节。写完编译通过再要下一节,比一次生成一大段再排错更容易定位;

  3. 说清引擎和文档类。pdfLaTeX 和 XeLaTeX 对中文、字体、Unicode 的处理不同,这一句能避开一类报错;

  4. 贴原始报错,带行号。「编译失败了」没有信息量,! Undefined control sequence. l.42 \toprule 才有;

  5. 明确禁止它改导言区和全局格式。否则它会顺手「优化」你的模板,越改越远;

  6. 改之前留一个能退回的版本。出问题时先回退到上一次能编译的状态,比继续追问更容易确定是哪次改动引入的。

前五条都是在补 AI 缺的上下文,第六条是把改动范围收住。

参考文献上也有同类问题:AI 编出来的 citation key 在 .bib 里并不存在,正文就会显示 [?],可按引用完整性检查核对。

如果不想每次手抄一遍导言区,可以在 EasyLaTeX 里保留一份可编译的基准项目,之后让 AI 改哪一段就只改哪一段。