如何翻譯 LaTeX 文件而不破壞數學式、引用或標籤
在 .tex 檔案中該翻譯什麼、該保留什麼,以及為什麼翻譯後的檔案可以順利編譯卻仍然遺失文字。附範例檔案、兩個免費檢查工具,以及一項 9 次執行的本機 LLM 測試。

要翻譯 LaTeX 文件,請翻譯正文,以及指令中面向讀者的參數,例如章節標題、圖表標題、註腳和連結文字。指令、環境名稱、\label、\ref 和 \cite 的鍵、數學式以及 verbatim 區塊,請完全保持原樣。接著做一件任何翻譯工具都不該替你做的事:為目標語言設定前置區(preamble),因為一個保留英文前置區的檔案可以編譯無誤,卻仍產出翻譯文字完全缺失的 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 提交的論文通常會在摘要頁面或 Other formats 頁面透過 Source 連結提供原始碼,形式為 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。





