如何翻译 LaTeX 文档而不破坏数学公式、引用或标签
在 .tex 文件中哪些内容需要翻译,哪些内容应保持原样,以及为什么翻译后的文件可以顺利编译却仍然丢失文本。附示例文件、两个免费检查工具和一次 9 轮本地 LLM 测试。

要翻译 LaTeX 文档,请翻译正文以及命令中面向读者的参数,例如章节标题、图表标题、脚注和链接文本。保持命令、环境名称、\label、\ref 和 \cite 键、数学公式以及逐字块完全不变。然后做一件任何翻译工具都不应替你完成的事:为目标语言设置导言区,因为一个保留英文导言区的文件可能编译时没有报错,却生成一个丢失了翻译文本的 PDF。
最后一点是一项小型测试的主要结果。我们用本地模型以三种不同方式将一篇 98 行的 LaTeX 论文翻译成简体中文九次,并用脚本和编译器检查了每个结果。人们通常担心的部分在全部九次运行中都保持完好:标签、引用、引文、公式、URL、表格列和花括号都原样返回,所有交叉引用都成功解析。问题出在别处。提示词中写着“不要更改导言区”的六次运行遵守了指令,编译退出码为 0,生成的 PDF 中却完全没有中文文本。有一次运行在代码列表中应用了我们“转义 % 符号”的规则,导致 PDF 打印出一个多余的反斜杠。还有至少三次运行以任何结构检查都无法发现的方式改变了句子的含义。
快速回答:哪些内容需要翻译,哪些应保持原样
| 文件部分 | 我们示例中的例子 | 是否翻译? |
|---|---|---|
导言区:\documentclass、\usepackage、\newcommand | \newcommand{\wpm}{\mathrm{wpm}} | 不翻译,但请自行添加目标语言设置(见下文) |
\title, \author, \date | \title{Estimating Reading Time for Translated Ebooks} | 标题和日期翻译;姓名通常不翻译 |
| 标题 | \section{Method}\label{sec:method} | 翻译,花括号内的文本;保留标签 |
| 标签和引用 | \label{eq:time}, Section~\ref{sec:method}, \eqref{eq:time} | 保留每个键 |
| 引文和参考文献键 | \cite{brysbaert2019}, \bibitem{rayner2016} | 保留键;仅当你的领域习惯如此时才翻译条目文本 |
| 行内和独立数学公式 | $r_c$, T = \frac{N}{r} | 不翻译 |
| 数学公式内的文本 | \text{ for English silent reading.} | 翻译。它会作为普通文本打印。 |
| 接受文本的宏 | \term{characters per minute} | 翻译参数,保留命令 |
| 图表标题和脚注 | \caption{Reading rates used in this paper.} | 是 |
| 逐字环境和代码列表 | shelfmark count --unit chars book.epub # 100% of body text | 否,包括其中的注释 |
\url 和 \href 的第一个参数 | \href{https://example.org/shelfmark/survey}{online appendix} | 保留 URL;翻译链接文本 |
| 转义字符 | 20\%, \$12, R\&D | 在正文中保留反斜杠 |
% 注释 | % TODO: replace the Chinese rate ... | 可选。读者永远看不到它们。 |
| 引用前的连接符 | Table~\ref{tab:rates} | 在使用空格的语言中保留;在中文和日文中可选 |
其余内容都是普通正文:段落、摘要、列表项和表格单元格。
我们测试了什么
我们编写了 sample-source.tex,这是一篇虚构的短文,内容是关于一个名为 Shelfmark 的虚构应用的阅读时间估算。它可以干净地编译,并包含上表中每种构造的一个示例,外加一个 booktabs 表格、一个带标题的图、两条 % 注释、一个包含裸 % 的 verbatim 块,以及一个内联参考文献。
然后我们让一个本地模型以三种方式将其翻译成简体中文:
- 整个文件。 粘贴整个文件,并要求返回一个仍能编译的翻译文件。
- 带指令。 同上,外加七条规则:不要更改导言区,保留每个命令、环境、标签、引用和引文键,除
\text{}外不要改动数学公式,不要改动逐字块和 URL,保持特殊字符转义,保留连接符,并翻译正文、标题、脚注和链接文本。 - 分段。 完全将导言区排除在请求之外(只发送
\title行,因此\date保持英文),在空行处拆分正文,跳过逐字块,用相同的规则发送每一段,然后重新组装。
模型是 LM Studio 中的 Qwen 3.6 27B (Q4_K_M),关闭思考功能,温度设为 0.3,运行在配备 64 GB 内存的 Apple M4 Max 上。我们在 2026 年 10 月 26 日对每种条件运行了三次,总共九次运行。脚本是 run_llm_latex_test.py,所有九次输出均未经编辑地发布在输出文件夹中。如果您从未设置过本地模型,我们的本地 LLM 翻译指南涵盖了相关设置。
我们使用 Tectonic 0.17.0(使用 XeTeX 引擎)编译了每个输出,一次完全按返回结果编译,一次在导言区添加中文设置后编译。然后我们从每个 PDF 中读回文本。这是对一个模型、一个语言对和一个文件的小型测试。它展示了哪些问题会发生以及如何发现它们。它不对模型或提示进行排名。
结果:结构得以保留;导言区决定文本是否显示
check_latex_translation.py 将每个输出与源文件进行比较,compile_check.py 对其进行编译。完整输出位于 check-results.txt 和 compile-results.txt,results.csv 每次运行一行。
| 检查 | 整个文件 | 已指示 | 分段 |
|---|---|---|---|
| 标签、引用、引文和参考文献键保持不变 | 3/3 | 3/3 | 3/3 |
数学公式保持不变(\text{} 内的文本已翻译) | 3/3 | 3/3 | 3/3 |
| URL、花括号和表格列保持完整 | 3/3 | 3/3 | 3/3 |
| 模型在导言区添加了中文宏包 | 3/3 | 0/3 | 0/3 |
| 返回结果可直接编译 | 3/3 | 3/3 | 3/3 |
| 返回的 PDF 中确实包含中文文本 | 3/3 | 0/3 | 0/3 |
| 逐字块保持不变 | 3/3 | 2/3 | 3/3 |
% 注释保留为英文 | 3/3 | 3/3 | 1/3 |
| 添加中文设置后,所有引用和交叉引用均可解析 | 3/3 | 3/3 | 3/3 |
我们的检查器在第一次运行时最初报告数学公式有变化。数学公式本身没问题:中文语序将 $N$ 放在了 $r$ 之前。因此,发布的检查器将数学片段作为无序集合进行比较,所以允许重新排序,但不允许更改符号。
1. “不要动导言区”生成了一个不含中文的 PDF
导言区规则听起来像是你能给出的最安全的指令。我们示例的导言区加载了 amsmath、booktabs 和 hyperref,并定义了三个宏,这些都不需要翻译。因此,指令运行和分段运行都完全照做,没有改动它。
但标准 LaTeX 设置中的默认字体没有中文字符。这六个文件编译时退出码均为 0。Tectonic 确实发出了警告,每缺少一个字符就警告一次,例如 Missing character: There is no 估 (U+4F30) in font [lmroman17-regular],日志文件每次运行记录了 554 到 577 条此类警告。但警告不会停止构建。当我们从这六个 PDF 中提取文本时,它们包含作者姓名、数字和数学公式,但中文字符数为零。三个整文件 PDF 包含 481 到 490 个中文字符。只检查编译是否成功的构建脚本,或者只粗略浏览输出结尾的人,都会把这六个文件发布出去。
三个整文件运行没有这样的规则,它们自行添加了 \usepackage{ctex},生成的 PDF 是完整的。这不是让模型重写导言区的理由。而是将目标语言设置视为翻译工作的一部分的理由,由你一次性完成:
- 中文: 加载 ctex,它支持 pdfLaTeX、XeLaTeX 和 LuaLaTeX。默认情况下,它会为你的操作系统选择字体;我们的日志显示它加载了 macOS 字体集。如果文件必须在其他机器上以相同方式编译,
\usepackage[UTF8,fontset=fandol]{ctex}使用 TeX Live 分发的免费 Fandol 字体,Tectonic 也会按需下载。这就是compile_check.py添加的内容。 - 其他语言: 加载 babel 并指定目标语言,以便断词和生成的词语(如“Figure”、“Table”和“Abstract”)遵循新语言。日语、韩语和从右到左的语言各自需要自己的设置。
编译后,检查日志中是否有 Missing character,并阅读 PDF,而不仅仅是查看退出码。我们仅通过 Tectonic 测试了 XeTeX;其他引擎报告缺失字体的方式不同。
2. 转义规则泄漏到了代码清单中
我们的指令要求保持特殊字符转义,在正文中这是正确的规则:LaTeX 中裸露的 % 会开始注释并静默吞掉该行其余内容。所有九次运行都在摘要中保留了 20\%。
在第一次带指令的运行中,模型还将规则应用到了 verbatim 块内部,并翻译了其中的代码注释:
source: shelfmark count --unit chars book.epub # 100% of body text
translation: shelfmark count --unit chars book.epub # 100\% 正文
在 verbatim 内部,没有任何内容是命令,因此 PDF 会打印出带反斜杠的 100\%。解决办法不是更好的提示词。根本不要将 verbatim、lstlisting 或 minted 块发送给翻译器,就像分段条件所做的那样。然后,如果读者需要,再手动翻译其中的任何注释。
3. 注释遵循了请求边界
该文件有两个 % 注释:宏定义上方的一条说明,以及代码列表上方的一个 TODO。整文件运行和带指令运行都将两者保留为英文。分段条件在三次运行中有两次翻译了 TODO,因为 TODO 恰好与我们发送翻译的段落位于同一块中。两次整文件运行还在它们插入的包之后添加了自己的注释。
这些都不会改变 PDF。但如果翻译后的源文件要返回给合著者或代码仓库,这就很重要了,因为翻译后的 TODO 不再与原始内容匹配,而且每次差异对比中都会出现一条额外的注释。检查器会将翻译后的注释报告为警告,以便你自行决定。
4. 结构检查通过了,但含义仍然改变了
摘要中说“偏差 20% 的标签仍然有用”。在九次运行中的三次里,中文表述为误差在 20% 以内的标签仍然有用,这将容差变成了阈值。其他几次运行重新排列了句子,导致“although”从句附着到了错误的意思上,还有一次变得难以理解。这些是一位读者对比中英文后做出的判断,并非盲审,但重点并不取决于确切次数:那些文件的所有结构检查都通过了,因为 20\%、宏和花括号都正确。
另外两处变化没问题,但值得了解。整文件运行将 \$12 写成了 12美元(“12 US dollars”),这完全消除了转义问题。两次整文件运行还删除了 \ref 和 \cite 之前的大多数 ~ 连接符。这在中文里无害,因为中文词间不加空格,但在词间加空格的语言中,缺失的连接符会让换行将“Table”与其编号分开。检查器将连接符报告为警告,而非失败。
结构检查告诉你文件仍然可用。它无法告诉你论文的含义仍然相同。为此,请对摘要、论断和数字进行双语阅读,如我们的审阅翻译研究论文指南所述。
经得起考验的工作流程
-
获取源文件,并检查你可以用它做什么。 在 arXiv 上,以 TeX 提交的论文通常会在摘要页面或其他格式页面通过源文件链接提供其源代码,形式为 gzip 压缩文件或 tar 归档(当有多个文件时)(arXiv 帮助)。为自己阅读而翻译是一回事。发布翻译则是另一回事:arXiv 自己的非独占许可证限制他人重用,而 CC BY 和 CC BY-SA 允许署名改编,CC BY-NC-ND 则不允许。如有疑问,请询问作者。
-
先编译原始文件。 如果翻译前无法编译,之后了解到的任何信息都不可靠。保留原始 PDF 以供比较。
-
自行在导言区设置目标语言。 如上所述添加
ctex或babel,用英文文本编译一次,并单独提交该更改。 -
翻译正文,但不包含导言区和 verbatim 块。 使用能解析 LaTeX 的工具,或按照我们的分段条件,将正文分成片段并附上明确规则发送。TransLaTeX 是一个为此构建的开源工具,它在将文本发送给机器翻译器之前,用标记替换 LaTeX 结构。其文档还说明它保持文档头不变,不支持宏,且仅处理单文件文档,不支持
\input。即使是专用工具,导言区的决定仍留给你。 -
对每一对文件运行结构检查。
python3 check_latex_translation.py main.tex main-zh.tex --keep Shelfmark它会比较导言区、命令名称、环境顺序、标签、引用、引文、参考文献键、数学公式、verbatim 块、URL、未转义的
%、&和#、花括号平衡、连接符、注释以及你要求保留的任何术语。在步骤 3 之后与原始文件比较时,导言区行预计会失败;请改为与你更新后的英文文件比较。对于拆分到多个\input文件的项目,请检查每一对。 -
编译并阅读 PDF。
python3 compile_check.py main-zh.tex它会报告未解析的引用(
??)、未解析的引文([?])和缺失的字形。然后打开 PDF,对照原始文件阅读摘要、每个图表标题和每个表格。 -
对论断和数字进行双语阅读。 这正是我们那三个被改变的句子会被发现的地方。为论文的技术术语保留一份简短的翻译词汇表,以免同一术语被翻译成三种方式。
BookTranslator 的适用场景
BookTranslator 的文档翻译器接受 .tex 文件以及 PDF、DOCX、EPUB、Markdown 和其他结构化格式。其常见问题解答称,结果以“在该格式支持的情况下,返回可用的、适合该格式的文件”的形式返回。
产品页面没有描述它如何处理 LaTeX 宏、数学公式或导言区,我们也没有为本文通过 BookTranslator 运行此示例。无论你使用什么工具,请在翻译前执行步骤 1 到 3,之后执行步骤 5 到 7。仅保留英文导言区的文件仍可在没有中文文本的情况下编译,而改变的论断仍会通过所有结构检查。
如果你只有论文的 PDF 而没有源代码,工作流程会有所不同:请参阅我们的在保持结构的同时翻译研究论文指南。如果你的源文件是 Markdown 而非 LaTeX,机械部分与散文部分的分离同样适用,但陷阱不同;我们在如何翻译 Markdown 文件中测试了这些。
获取测试文件
本次测试中的所有内容均可自由复用:
- sample-source.tex:98 行的英文样本;
- check_latex_translation.py:结构检查器(仅使用 Python 标准库);
- compile_check.py:按返回结果原样编译每个文件,并使用中文配置进行编译,统计未解析的引用、未解析的文献引用以及缺失字形(需要 Tectonic 和 pdftotext);
- run_llm_latex_test.py:适用于任何兼容 OpenAI 的本地服务器的三种提示条件;
- outputs 文件夹中的九个输出,以及 check-results.txt、compile-results.txt 和 results.csv。





