BookTranslator
BookTranslator

Как перевести документ LaTeX, не сломав формулы, ссылки и метки

Что переводить в файле .tex, что оставить без изменений и почему переведённый файл может компилироваться без ошибок и всё равно терять текст. С примером файла, двумя бесплатными проверками и тестом локальной LLM из 9 запусков.

Чтобы перевести документ LaTeX, переведите текст и аргументы команд, которые видит читатель: заголовки разделов, подписи, сноски и текст ссылок. Оставьте команды, имена окружений, ключи \label, \ref и \cite, формулы и блоки verbatim точно такими, какие они есть. Затем сделайте одно изменение, которое не должен делать за вас ни один переводчик: настройте преамбулу для целевого языка, потому что файл, сохранивший английскую преамбулу, может скомпилироваться без ошибок и всё равно дать PDF, в котором переведённого текста нет.

Последний пункт — главный результат небольшого теста. Мы девять раз перевели статью LaTeX из 98 строк на упрощённый китайский с помощью локальной модели, тремя разными способами, и проверили каждый результат скриптом и компилятором. То, о чём обычно беспокоятся, уцелело во всех девяти запусках: метки, ссылки, цитирования, уравнения, 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 с одиночным % внутри и встроенную библиографию.

Затем мы попросили локальную модель перевести её на упрощённый китайский тремя способами:

  1. Весь файл. Вставить весь файл и попросить переведённый файл, который по-прежнему компилируется.
  2. С инструкциями. То же самое, плюс семь правил: не менять преамбулу, сохранять все команды, окружения, метки, ссылки и ключи цитирования, не трогать математику, кроме \text{}, не трогать дословные блоки и URL, сохранять экранирование специальных символов, сохранять неразрывные пробелы и переводить текст, подписи, сноски и текст ссылок.
  3. По сегментам. Полностью исключить преамбулу из запроса (отправляется только строка \title, поэтому \date остаётся на английском), разбить тело по пустым строкам, пропустить дословный блок, отправить каждый фрагмент с теми же правилами и собрать обратно.

Моделью была Qwen 3.6 27B (Q4_K_M) в LM Studio с отключённым режимом размышления и температурой 0.3, на Apple M4 Max с 64 ГБ памяти. Мы запускали каждое условие три раза, всего девять запусков, 26 октября 2026 года. Скрипт — run_llm_latex_test.py, и все девять выходных файлов опубликованы без изменений в папке outputs. Если вы никогда не настраивали локальную модель, наше руководство по переводу с помощью локальных LLM описывает настройки.

Мы скомпилировали каждый выходной файл с помощью Tectonic 0.17.0, который использует движок XeTeX, один раз точно как было возвращено и один раз с добавленной в преамбулу китайской настройкой. Затем мы извлекли текст обратно из каждого PDF. Это был небольшой тест одной модели, одной языковой пары и одного файла. Он показывает, какие проблемы возникают и как их обнаружить. Он не ранжирует модели или промпты.

Результат: структура сохранилась; преамбула решила, появится ли текст

check_latex_translation.py сравнил каждый выходной файл с исходным, а compile_check.py скомпилировал его. Полные результаты находятся в check-results.txt и compile-results.txt, а results.csv содержит по одной строке на каждый запуск.

ПроверкаВесь файлС инструкциейСегменты
Метки, ссылки, цитирования и ключи библиографии не изменены3 из 33 из 33 из 3
Математика не изменена (текст внутри \text{} переведён)3 из 33 из 33 из 3
URL-адреса, фигурные скобки и столбцы таблиц не повреждены3 из 33 из 33 из 3
Модель добавила китайский пакет в преамбулу3 из 30 из 30 из 3
Компилируется в возвращённом виде3 из 33 из 33 из 3
Китайский текст действительно присутствует в PDF в возвращённом виде3 из 30 из 30 из 3
Дословный блок без изменений3 из 32 из 33 из 3
Комментарии % оставлены на английском3 из 33 из 31 из 3
Все ссылки и цитирования разрешаются после добавления китайской настройки3 из 33 из 33 из 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} использует свободные шрифты Fandol, распространяемые с TeX Live, которые Tectonic также загружает по требованию. Именно это добавляет compile_check.py.
  • Другие языки: загрузите babel с целевым языком, чтобы переносы и генерируемые слова, такие как «Figure», «Table» и «Abstract», следовали новому языку. Японский, корейский и языки с письмом справа налево требуют собственной настройки.

После компиляции проверьте журнал на наличие Missing character и прочитайте PDF, а не только код выхода. Мы тестировали только XeTeX через Tectonic; другие движки сообщают об отсутствующем шрифте иначе.

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% всё ещё полезны, что превращает допуск в порог. Несколько других запусков переставили предложение так, что придаточное с «хотя» прикрепилось к неверной идее, а один стал трудным для понимания. Это суждения одного читателя, сравнивающего китайский с английским, а не слепое рецензирование, но суть не зависит от точного количества: все структурные проверки прошли на этих файлах, потому что 20\%, макрос и фигурные скобки были верны.

Два других изменения были нормальными, но о них стоит знать. Запуски с целым файлом записали \$12 как 12美元 («12 долларов США»), что полностью снимает вопрос экранирования. Два запуска с целым файлом также отбросили большинство неразрывных пробелов ~ перед \ref и \cite. Это безвредно в китайском, где между словами нет пробелов, но в языке, где они есть, отсутствующий неразрывный пробел позволяет разрыву строки отделить «Таблицу» от её номера. Проверка сообщает о неразрывных пробелах как о предупреждении, а не об ошибке.

Структурная проверка говорит, что файл всё ещё работает. Она не может сказать, что статья всё ещё утверждает то же самое. Для этого используйте двуязычное чтение аннотации, утверждений и чисел, как описано в нашем руководстве по рецензированию переведённой научной статьи.

Рабочий процесс, который выдерживает проверку

  1. Получите исходник и проверьте, что вам разрешено с ним делать. На arXiv статьи, отправленные в TeX, обычно предлагают свой исходник по ссылке Source на странице аннотации или на странице Other formats, в виде gzip-файла или tar-архива, если файлов несколько (справка arXiv). Переводить для собственного чтения — одно. Публиковать перевод — другое: собственная неисключительная лицензия arXiv ограничивает повторное использование другими, тогда как CC BY и CC BY-SA разрешают адаптации с указанием авторства, а CC BY-NC-ND — нет. При сомнениях спросите авторов.

  2. Сначала скомпилируйте оригинал. Если он не компилируется до перевода, ничто из того, что вы узнаете afterwards, не будет надёжным. Сохраните оригинальный PDF для сравнения.

  3. Настройте целевой язык в преамбуле самостоятельно. Добавьте ctex или babel, как указано выше, скомпилируйте один раз с английским текстом и зафиксируйте это изменение отдельно.

  4. Переводите тело без преамбулы и без блоков verbatim. Используйте инструмент, который разбирает LaTeX, или отправляйте тело по частям с явными правилами, как в нашем условии с сегментами. TransLaTeX, открытый инструмент, созданный для этого, заменяет конструкции LaTeX токенами перед отправкой текста машинному переводчику. Его документация также говорит, что он оставляет заголовок документа нетронутым, не поддерживает макросы и обрабатывает только однофайловые документы, без \input. Даже специализированный инструмент оставляет решение о преамбуле вам.

  5. Запустите структурную проверку для каждой пары файлов.

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

    Она сравнивает преамбулу, имена команд, порядок окружений, метки, ссылки, цитирования, ключи библиографии, математику, блоки verbatim, URL, неэкранированные %, & и #, баланс фигурных скобок, неразрывные пробелы, комментарии и любые термины, которые вы просите сохранить. Ожидайте, что строка преамбулы не пройдёт проверку после шага 3, если сравнивать с оригиналом; сравнивайте с вашим обновлённым английским файлом. Для проекта, разделённого на несколько файлов \input, проверяйте каждую пару.

  6. Скомпилируйте и прочитайте PDF.

    python3 compile_check.py main-zh.tex
    

    Она сообщает о неразрешённых ссылках (??), неразрешённых цитированиях ([?]) и отсутствующих глифах. Затем откройте PDF и прочитайте аннотацию, каждую подпись и каждую таблицу в сравнении с оригиналом.

  7. Сделайте двуязычное чтение утверждений и чисел. Именно здесь были бы пойманы наши три изменённых предложения. Ведите краткий глоссарий перевода для технических терминов статьи, чтобы один и тот же термин не переводился тремя способами.

Место BookTranslator

Переводчик документов BookTranslator принимает файлы .tex наряду с PDF, DOCX, EPUB, Markdown и другими структурированными форматами. В его FAQ сказано, что результат возвращается в «пригодном для использования файле, соответствующем формату, когда этот формат это поддерживает».

На странице продукта не описано, как он обращается с макросами 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.

Похожие статьи