BookTranslator
BookTranslator

Cách dịch tài liệu LaTeX mà không làm hỏng công thức, trích dẫn hay nhãn

Cần dịch gì trong tệp .tex, cần giữ nguyên gì, và tại sao một tệp đã dịch có thể biên dịch sạch mà vẫn mất chữ. Kèm tệp mẫu, hai công cụ kiểm tra miễn phí và một thử nghiệm 9 lần chạy với LLM cục bộ.

Để dịch một tài liệu LaTeX, hãy dịch phần văn xuôi và các đối số hướng tới người đọc của lệnh, chẳng hạn như tiêu đề mục, chú thích hình, chú thích chân trang và văn bản liên kết. Giữ nguyên các lệnh, tên môi trường, khóa \label, \ref và \cite, công thức toán và khối verbatim. Sau đó thực hiện một thay đổi mà không trình dịch nào nên làm thay bạn: thiết lập phần mở đầu (preamble) cho ngôn ngữ đích, bởi vì một tệp giữ nguyên preamble tiếng Anh có thể biên dịch không lỗi mà vẫn tạo ra PDF thiếu hoàn toàn phần văn bản đã dịch.

Điểm cuối cùng đó là kết quả chính của một thử nghiệm nhỏ. Chúng tôi đã dịch một bài báo LaTeX 98 dòng sang tiếng Trung Giản thể chín lần bằng một mô hình cục bộ, theo ba cách khác nhau, và kiểm tra mọi kết quả bằng một script và một trình biên dịch. Những phần người ta thường lo lắng đều trụ vững trong cả chín lần chạy: nhãn, tham chiếu, trích dẫn, phương trình, URL, cột bảng và dấu ngoặc nhọn đều nguyên vẹn, và mọi tham chiếu chéo đều được giải quyết. Vấn đề nằm ở chỗ khác. Sáu lần chạy có prompt ghi "không thay đổi preamble" đã tuân thủ, biên dịch với mã thoát 0, và tạo ra PDF không có chút văn bản tiếng Trung nào. Một lần chạy đã áp dụng quy tắc "thoát dấu %" của chúng tôi bên trong một khối mã, khiến PDF in ra một dấu gạch chéo ngược thừa. Và ít nhất ba lần chạy đã làm lệch nghĩa của một câu theo cách mà không kiểm tra cấu trúc nào có thể phát hiện.

Trả lời nhanh: Dịch gì và giữ nguyên gì

Phần của tệpVí dụ từ mẫu của chúng tôiCó dịch không?
Preamble: \documentclass, \usepackage, \newcommand\newcommand{\wpm}{\mathrm{wpm}}Không, nhưng hãy tự thêm thiết lập ngôn ngữ đích (xem bên dưới)
\title, \author, \date\title{Estimating Reading Time for Translated Ebooks}Tiêu đề và ngày thì có; tên riêng thường thì không
Tiêu đề mục\section{Method}\label{sec:method}Có, phần văn bản trong ngoặc nhọn; giữ nguyên nhãn
Nhãn và tham chiếu\label{eq:time}, Section~\ref{sec:method}, \eqref{eq:time}Giữ nguyên mọi khóa
Trích dẫn và khóa thư mục\cite{brysbaert2019}, \bibitem{rayner2016}Giữ nguyên khóa; chỉ dịch văn bản mục nếu lĩnh vực của bạn làm vậy
Công thức toán nội tuyến và hiển thị$r_c$, T = \frac{N}{r}Không
Văn bản bên trong công thức toán\text{ for English silent reading.}Có. Nó được in ra như văn bản thường.
Macro nhận văn bản\term{characters per minute}Dịch đối số, giữ nguyên lệnh
Chú thích hình và chú thích chân trang\caption{Reading rates used in this paper.}Có
Khối verbatim và danh sách mãshelfmark count --unit chars book.epub # 100% of body textKhông, kể cả chú thích bên trong chúng
\url và đối số đầu tiên của \href\href{https://example.org/shelfmark/survey}{online appendix}Giữ nguyên URL; dịch văn bản liên kết
Ký tự được thoát20\%, \$12, R\&DGiữ nguyên dấu gạch chéo ngược trong văn xuôi
Chú thích %% TODO: replace the Chinese rate ...Tùy chọn. Người đọc không bao giờ nhìn thấy chúng.
Dấu nối không ngắt trước tham chiếuTable~\ref{tab:rates}Giữ nguyên trong các ngôn ngữ dùng dấu cách; tùy chọn trong tiếng Trung và tiếng Nhật

Mọi thứ còn lại là văn xuôi thông thường: đoạn văn, tóm tắt, mục danh sách và ô bảng.

Những gì chúng tôi đã thử nghiệm

Chúng tôi đã viết sample-source.tex, một bài báo ngắn hư cấu về ước tính thời gian đọc cho một ứng dụng giả tưởng có tên Shelfmark. Tệp biên dịch sạch và chứa một ví dụ cho mỗi cấu trúc trong bảng trên, cùng với một bảng booktabs, một hình có chú thích, hai chú thích %, một khối verbatim chứa dấu % trần, và một thư mục tài liệu tham khảo nội tuyến.

Sau đó, chúng tôi yêu cầu một mô hình cục bộ dịch nó sang tiếng Trung giản thể theo ba cách:

  1. Toàn bộ tệp. Dán toàn bộ tệp và yêu cầu một tệp đã dịch vẫn biên dịch được.
  2. Có hướng dẫn. Tương tự, cộng thêm bảy quy tắc: không thay đổi phần mở đầu, giữ mọi lệnh, môi trường, nhãn, tham chiếu và khóa trích dẫn, để yên phần toán học ngoại trừ \text{}, để yên các khối verbatim và URL, giữ các ký tự đặc biệt được thoát, giữ dấu nối không ngắt, và dịch văn xuôi, chú thích hình, chú thích cuối trang và văn bản liên kết.
  3. Phân đoạn. Loại bỏ hoàn toàn phần mở đầu khỏi yêu cầu (chỉ gửi dòng \title, để \date giữ nguyên tiếng Anh), tách phần thân tại các dòng trống, bỏ qua khối verbatim, gửi từng phần với cùng các quy tắc, và lắp ráp lại.

Mô hình là Qwen 3.6 27B (Q4_K_M) trong LM Studio, với chế độ suy nghĩ tắt và nhiệt độ 0.3, trên Apple M4 Max với 64 GB bộ nhớ. Chúng tôi chạy mỗi điều kiện ba lần, tổng cộng chín lần chạy, vào ngày 26 tháng 10 năm 2026. Kịch bản là run_llm_latex_test.py, và cả chín đầu ra được công bố nguyên vẹn trong thư mục đầu ra. Nếu bạn chưa từng thiết lập mô hình cục bộ, hướng dẫn dịch bằng LLM cục bộ của chúng tôi có đề cập đến các cài đặt.

Chúng tôi biên dịch mọi đầu ra bằng Tectonic 0.17.0, sử dụng engine XeTeX, một lần đúng như khi trả về và một lần với thiết lập tiếng Trung được thêm vào phần mở đầu. Sau đó chúng tôi đọc lại văn bản từ mỗi PDF. Đây là một thử nghiệm nhỏ với một mô hình, một cặp ngôn ngữ và một tệp. Nó cho thấy những vấn đề nào xảy ra và cách phát hiện chúng. Nó không xếp hạng các mô hình hay lời nhắc.

Kết quả: Cấu trúc vẫn giữ nguyên; phần mở đầu quyết định liệu văn bản có xuất hiện hay không

check_latex_translation.py đã so sánh từng đầu ra với nguồn, và compile_check.py đã biên dịch nó. Các đầu ra đầy đủ nằm trong check-results.txt và compile-results.txt, và results.csv có một dòng cho mỗi lần chạy.

Kiểm traToàn bộ tệpĐã hướng dẫnPhân đoạn
Nhãn, tham chiếu, trích dẫn và khóa thư mục không thay đổi3 trên 33 trên 33 trên 3
Công thức toán không thay đổi (văn bản bên trong \text{} được dịch)3 trên 33 trên 33 trên 3
URL, dấu ngoặc nhọn và cột bảng còn nguyên vẹn3 trên 33 trên 33 trên 3
Mô hình đã thêm một gói tiếng Trung vào phần mở đầu3 trên 30 trên 30 trên 3
Biên dịch được như khi trả về3 trên 33 trên 33 trên 3
Văn bản tiếng Trung thực sự có trong PDF như khi trả về3 trên 30 trên 30 trên 3
Khối nguyên văn không thay đổi3 trên 32 trên 33 trên 3
Chú thích % vẫn giữ nguyên tiếng Anh3 trên 33 trên 31 trên 3
Mọi tham chiếu và trích dẫn đều phân giải sau khi thêm thiết lập tiếng Trung3 trên 33 trên 33 trên 3

Trình kiểm tra của chúng tôi ban đầu báo cáo công thức toán đã thay đổi trong lần chạy đầu tiên. Công thức toán vẫn ổn: trật tự từ tiếng Trung đã đặt $N$ trước $r$ trong một câu. Trình kiểm tra được công bố so sánh các đoạn công thức toán như một tập hợp không có thứ tự vì lý do này, nên việc sắp xếp lại được phép nhưng thay đổi ký hiệu thì không.

1. "Đừng động vào phần mở đầu" tạo ra PDF không có chữ Hán nào

Quy tắc về phần mở đầu nghe có vẻ là chỉ dẫn an toàn nhất mà bạn có thể đưa ra. Phần mở đầu của mẫu của chúng tôi tải amsmath, booktabs và hyperref và định nghĩa ba macro, và không có gì trong đó cần dịch. Vì vậy các lần chạy có chỉ dẫn và các lần chạy theo phân đoạn đã để yên nó, đúng như được bảo.

Nhưng phông chữ mặc định trong một thiết lập LaTeX tiêu chuẩn không có ký tự Hán. Cả sáu tệp đó đều biên dịch với mã thoát 0. Tectonic có cảnh báo, mỗi lần một ký tự bị thiếu, với những dòng như Missing character: There is no 估 (U+4F30) in font [lmroman17-regular], và tệp nhật ký ghi nhận từ 554 đến 577 cảnh báo mỗi lần chạy. Nhưng cảnh báo không dừng quá trình biên dịch. Khi chúng tôi trích xuất văn bản từ sáu PDF đó, chúng chứa tên tác giả, các con số và công thức toán, và không có ký tự Hán nào. Ba PDF toàn tệp chứa từ 481 đến 490. Một script biên dịch chỉ kiểm tra xem quá trình biên dịch có thành công hay không, hoặc một người chỉ lướt qua phần cuối của đầu ra, sẽ đã gửi đi cả sáu tệp.

Ba lần chạy toàn tệp, không có quy tắc như vậy, đã tự thêm \usepackage{ctex}, và PDF của chúng hoàn chỉnh. Đó không phải là lý do để cho một mô hình viết lại phần mở đầu của bạn. Đó là lý do để xem thiết lập ngôn ngữ đích là một phần của công việc dịch thuật, được thực hiện một lần, bởi bạn:

  • Tiếng Trung: tải ctex, hỗ trợ pdfLaTeX, XeLaTeX và LuaLaTeX. Theo mặc định, nó chọn phông chữ cho hệ điều hành của bạn; nhật ký của chúng tôi cho thấy nó tải bộ phông chữ macOS. Nếu tệp phải biên dịch giống nhau trên các máy khác, \usepackage[UTF8,fontset=fandol]{ctex} sử dụng phông chữ Fandol miễn phí được phân phối cùng TeX Live, mà Tectonic cũng tải xuống theo yêu cầu. Đó là những gì compile_check.py thêm vào.
  • Các ngôn ngữ khác: tải babel với ngôn ngữ đích, để việc ngắt từ và các từ được tạo như "Figure", "Table" và "Abstract" tuân theo ngôn ngữ mới. Tiếng Nhật, tiếng Hàn và các ngôn ngữ viết từ phải sang trái mỗi ngôn ngữ cần thiết lập riêng.

Sau khi biên dịch, hãy kiểm tra nhật ký để tìm Missing character và đọc PDF, không chỉ mã thoát. Chúng tôi chỉ thử nghiệm XeTeX thông qua Tectonic; các engine khác báo cáo phông chữ bị thiếu theo cách khác.

2. Quy tắc thoát ký tự bị rò rỉ vào phần liệt kê mã

Hướng dẫn của chúng tôi nói rằng giữ các ký tự đặc biệt được thoát, và trong văn xuôi đó là quy tắc đúng: một % trần trong LaTeX bắt đầu một chú thích và âm thầm nuốt phần còn lại của dòng. Cả chín lần chạy đều giữ 20\% trong phần tóm tắt.

Trong lần chạy có hướng dẫn đầu tiên, mô hình cũng áp dụng quy tắc bên trong khối verbatim và dịch chú thích mã ở đó:

source:      shelfmark count --unit chars book.epub  # 100% of body text
translation: shelfmark count --unit chars book.epub  # 100\% 正文

Bên trong verbatim, không có gì là lệnh, nên PDF in ra 100\% với dấu gạch chéo ngược. Cách khắc phục không phải là một câu lệnh tốt hơn. Đừng bao giờ gửi các khối verbatim, lstlisting hay minted cho trình dịch, như điều kiện phân đoạn đã làm. Sau đó, hãy tự dịch thủ công bất kỳ chú thích nào trong đó nếu độc giả của bạn cần.

3. Chú thích tuân theo ranh giới yêu cầu

Tệp có hai chú thích %: một ghi chú phía trên các định nghĩa macro và một TODO phía trên danh sách mã. Các lần chạy toàn tệp và có hướng dẫn đều để cả hai bằng tiếng Anh. Điều kiện phân đoạn đã dịch TODO trong hai trên ba lần chạy, vì TODO tình cờ nằm trong cùng khối với một đoạn văn mà chúng tôi gửi để dịch. Hai lần chạy toàn tệp cũng thêm một chú thích của riêng chúng sau gói mà chúng chèn vào.

Không điều nào trong số này thay đổi PDF. Nó chỉ quan trọng nếu mã nguồn đã dịch được gửi lại cho đồng tác giả hoặc một kho lưu trữ, nơi một TODO đã dịch không còn khớp với bản gốc và một chú thích thừa xuất hiện trong mọi diff. Trình kiểm tra báo cáo các chú thích đã dịch dưới dạng cảnh báo để bạn quyết định.

4. Các kiểm tra cấu trúc đều đạt và ý nghĩa vẫn thay đổi

Phần tóm tắt nói rằng "một nhãn bị lệch 20% vẫn hữu ích." Trong ba trên chín lần chạy, bản tiếng Trung nói rằng các nhãn có sai số trong 20% vẫn hữu ích, điều này biến một dung sai thành một ngưỡng. Một số lần chạy khác đã sắp xếp lại câu để mệnh đề "mặc dù" gắn vào ý sai, và một lần trở nên khó theo dõi. Đây là đánh giá của một độc giả so sánh bản tiếng Trung với bản tiếng Anh, không phải một đánh giá mù, nhưng điểm mấu chốt không phụ thuộc vào con số chính xác: mọi kiểm tra cấu trúc đều đạt trên những tệp đó, vì 20\%, macro và dấu ngoặc nhọn đều đúng.

Hai thay đổi khác thì ổn nhưng đáng biết. Các lần chạy toàn tệp đã viết \$12 thành 12美元 ("12 đô la Mỹ"), điều này loại bỏ hoàn toàn câu hỏi về thoát ký tự. Hai lần chạy toàn tệp cũng bỏ hầu hết các liên kết ~ trước \ref và \cite. Điều đó vô hại trong tiếng Trung, vốn không đặt dấu cách giữa các từ, nhưng trong một ngôn ngữ có đặt dấu cách, một liên kết bị thiếu cho phép ngắt dòng tách "Bảng" khỏi số của nó. Trình kiểm tra báo cáo các liên kết dưới dạng cảnh báo, không phải lỗi.

Một kiểm tra cấu trúc cho bạn biết tệp vẫn hoạt động. Nó không thể cho bạn biết bài báo vẫn nói điều tương tự. Để làm điều đó, hãy đọc song ngữ phần tóm tắt, các tuyên bố và các con số, như được mô tả trong hướng dẫn của chúng tôi về đánh giá một bài báo nghiên cứu đã dịch.

Một quy trình làm việc vững chắc

  1. Lấy mã nguồn và kiểm tra những gì bạn được phép làm với nó. Trên arXiv, các bài báo nộp bằng TeX thường cung cấp mã nguồn qua liên kết Source trên trang tóm tắt hoặc trang Other formats, dưới dạng tệp nén gzip hoặc kho lưu trữ tar khi có nhiều tệp (trợ giúp arXiv). Dịch để tự đọc là một chuyện. Xuất bản bản dịch là chuyện khác: giấy phép không độc quyền của chính arXiv hạn chế việc tái sử dụng bởi người khác, trong khi CC BY và CC BY-SA cho phép tác phẩm phái sinh với ghi công, còn CC BY-NC-ND thì không. Hãy hỏi tác giả khi còn nghi ngờ.

  2. Biên dịch bản gốc trước. Nếu nó không biên dịch được trước khi dịch, thì không có gì bạn học được sau đó là đáng tin cậy. Giữ PDF gốc để so sánh.

  3. Tự thiết lập ngôn ngữ đích trong phần mở đầu. Thêm ctex hoặc babel như trên, biên dịch một lần với văn bản tiếng Anh, và commit thay đổi đó riêng.

  4. Dịch phần thân mà không có phần mở đầu và không có khối verbatim. Sử dụng một công cụ phân tích cú pháp LaTeX, hoặc gửi phần thân thành từng phần với các quy tắc rõ ràng, như trong điều kiện phân đoạn của chúng tôi. TransLaTeX, một công cụ mã nguồn mở được xây dựng cho mục đích này, thay thế các cấu trúc LaTeX bằng token trước khi gửi văn bản đến trình dịch máy. Tài liệu của nó cũng nói rằng nó giữ nguyên phần đầu tài liệu, không hỗ trợ macro, và chỉ xử lý tài liệu một tệp, không có \input. Ngay cả một công cụ chuyên dụng cũng để quyết định về phần mở đầu cho bạn.

  5. Chạy kiểm tra cấu trúc trên mọi cặp tệp.

    python3 check_latex_translation.py main.tex main-zh.tex --keep Shelfmark
    

    Nó so sánh phần mở đầu, tên lệnh, thứ tự môi trường, nhãn, tham chiếu, trích dẫn, khóa thư mục, toán học, khối verbatim, URL, %, &, và # chưa thoát, cân bằng ngoặc nhọn, liên kết, chú thích, và bất kỳ thuật ngữ nào bạn yêu cầu giữ. Hãy mong đợi dòng phần mở đầu sẽ thất bại sau bước 3 khi bạn so sánh với bản gốc; thay vào đó hãy so sánh với tệp tiếng Anh đã cập nhật của bạn. Đối với một dự án được chia thành nhiều tệp \input, hãy kiểm tra từng cặp.

  6. Biên dịch và đọc PDF.

    python3 compile_check.py main-zh.tex
    

    Nó báo cáo các tham chiếu chưa giải quyết (??), trích dẫn chưa giải quyết ([?]), và ký tự bị thiếu. Sau đó mở PDF và đọc phần tóm tắt, mọi chú thích hình, và mọi bảng so với bản gốc.

  7. Đọc song ngữ các tuyên bố và con số. Đây là nơi ba câu bị thay đổi của chúng tôi sẽ bị phát hiện. Giữ một bảng thuật ngữ dịch ngắn cho các thuật ngữ kỹ thuật của bài báo để cùng một thuật ngữ không bị dịch theo ba cách.

BookTranslator phù hợp ở đâu

Trình dịch tài liệu của BookTranslator chấp nhận các tệp .tex cùng với PDF, DOCX, EPUB, Markdown, và các định dạng có cấu trúc khác. Câu hỏi thường gặp của nó nói rằng kết quả được trả về trong "một tệp sử dụng được, phù hợp với định dạng bất cứ khi nào định dạng đó hỗ trợ."

Trang sản phẩm không mô tả cách nó xử lý macro LaTeX, toán học, hay phần mở đầu, và chúng tôi không chạy mẫu này qua BookTranslator cho bài viết này. Dù bạn dùng công cụ nào, hãy làm bước 1 đến 3 trước khi dịch và bước 5 đến 7 sau đó. Một tệp giữ phần mở đầu chỉ có tiếng Anh vẫn sẽ biên dịch mà không có văn bản tiếng Trung, và một tuyên bố bị thay đổi vẫn sẽ vượt qua mọi kiểm tra cấu trúc.

Nếu bạn chỉ có PDF của một bài báo, không có mã nguồn, quy trình sẽ khác: xem hướng dẫn của chúng tôi về dịch một bài báo nghiên cứu trong khi giữ nguyên cấu trúc. Nếu nguồn của bạn là Markdown thay vì LaTeX, sự tách biệt tương tự giữa máy móc và văn xuôi vẫn áp dụng, với những cạm bẫy khác; chúng tôi đã kiểm tra những điều đó trong Cách dịch tệp Markdown.

Tải các tệp kiểm tra

Mọi thứ từ bài kiểm tra này đều có thể tái sử dụng miễn phí:

Bài viết liên quan