Como traduzir um documento LaTeX sem quebrar fórmulas, citações ou etiquetas
O que traduzir num ficheiro .tex, o que deixar intacto e por que um ficheiro traduzido pode compilar sem erros e ainda assim perder o texto. Com um ficheiro de exemplo, dois verificadores gratuitos e um teste local com um LLM em 9 execuções.

Para traduzir um documento LaTeX, traduza a prosa e os argumentos dos comandos que são visíveis ao leitor, como títulos de secções, legendas, notas de rodapé e texto de hiperligações. Deixe os comandos, os nomes de ambientes, as chaves de \label, \ref e \cite, as fórmulas e os blocos verbatim exatamente como estão. Depois, faça uma alteração que nenhum tradutor deve fazer por si: configure o preâmbulo para a língua de destino, porque um ficheiro que mantém o preâmbulo em inglês pode compilar sem erros e ainda assim gerar um PDF sem o texto traduzido.
Este último ponto é o resultado principal de um pequeno teste. Traduzimos um artigo LaTeX de 98 linhas para chinês simplificado nove vezes com um modelo local, de três formas diferentes, e verificámos cada resultado com um script e um compilador. As partes que normalmente preocupam as pessoas resistiram em todas as nove execuções: etiquetas, referências, citações, equações, URLs, colunas de tabelas e chavetas voltaram intactos, e todas as referências cruzadas foram resolvidas. Os problemas estavam noutro lado. As seis execuções cujo prompt dizia "não alterar o preâmbulo" obedeceram, compilaram com código de saída 0 e produziram PDFs sem qualquer texto em chinês. Uma execução aplicou a nossa regra "escapar o sinal %" dentro de uma listagem de código, pelo que o PDF imprime uma barra invertida perdida. E pelo menos três execuções alteraram o significado de uma frase de formas que nenhuma verificação estrutural consegue detetar.
Resposta rápida: o que traduzir e o que deixar intacto
| Parte do ficheiro | Exemplo do nosso ficheiro de amostra | Traduzir? |
|---|---|---|
Preâmbulo: \documentclass, \usepackage, \newcommand | \newcommand{\wpm}{\mathrm{wpm}} | Não, mas adicione você mesmo a configuração para a língua de destino (ver abaixo) |
\title, \author, \date | \title{Estimating Reading Time for Translated Ebooks} | Título e data sim; nomes normalmente não |
| Cabeçalhos | \section{Method}\label{sec:method} | Sim, o texto entre chavetas; mantenha a etiqueta |
| Etiquetas e referências | \label{eq:time}, Section~\ref{sec:method}, \eqref{eq:time} | Mantenha todas as chaves |
| Citações e chaves bibliográficas | \cite{brysbaert2019}, \bibitem{rayner2016} | Mantenha as chaves; traduza o texto da entrada apenas se a sua área o fizer |
| Fórmulas em linha e em bloco | $r_c$, T = \frac{N}{r} | Não |
| Texto dentro de fórmulas | \text{ for English silent reading.} | Sim. É impresso como texto normal. |
| Macros que recebem texto | \term{characters per minute} | Traduza o argumento, mantenha o comando |
| Legendas e notas de rodapé | \caption{Reading rates used in this paper.} | Sim |
| Listagens verbatim e de código | shelfmark count --unit chars book.epub # 100% of body text | Não, incluindo os comentários dentro delas |
\url e o primeiro argumento de \href | \href{https://example.org/shelfmark/survey}{online appendix} | Manter o URL; traduzir o texto da ligação |
| Caracteres escapados | 20\%, \$12, R\&D | Manter a barra invertida no texto corrido |
Comentários % | % TODO: replace the Chinese rate ... | Opcional. Os leitores nunca os veem. |
| Ties antes de referências | Table~\ref{tab:rates} | Manter em línguas que usam espaços; opcional em chinês e japonês |
Tudo o resto é texto corrido normal: parágrafos, resumo, itens de lista e células de tabela.
O que testámos
Escrevemos sample-source.tex, um pequeno artigo inventado sobre estimativas de tempo de leitura para uma aplicação fictícia chamada Shelfmark. Compila sem erros e contém um exemplo de cada construção da tabela acima, mais uma tabela booktabs, uma figura com legenda, dois comentários %, um bloco verbatim com um % isolado e uma bibliografia inline.
Depois pedimos a um modelo local que o traduzisse para chinês simplificado de três formas:
- Ficheiro completo. Colar o ficheiro inteiro e pedir um ficheiro traduzido que ainda compile.
- Com instruções. O mesmo, mais sete regras: não alterar o preâmbulo, manter todos os comandos, ambientes, labels, referências e chaves de citação, deixar a matemática em paz exceto
\text{}, deixar os blocos verbatim e os URLs em paz, manter os caracteres especiais escapados, manter os ties e traduzir o texto corrido, as legendas, as notas de rodapé e o texto das ligações. - Segmentos. Manter o preâmbulo completamente fora do pedido (só a linha
\titleé enviada, para que\datefique em inglês), dividir o corpo em linhas em branco, saltar o bloco verbatim, enviar cada parte com as mesmas regras e voltar a montar.
O modelo foi o Qwen 3.6 27B (Q4_K_M) no LM Studio, com o modo de raciocínio desligado e temperatura 0,3, num Apple M4 Max com 64 GB de memória. Executámos cada condição três vezes, nove execuções no total, a 26 de outubro de 2026. O script é run_llm_latex_test.py, e as nove saídas estão publicadas sem edição na pasta de saídas. Se nunca configurou um modelo local, o nosso guia de tradução com LLM local cobre as definições.
Compilámos todas as saídas com o Tectonic 0.17.0, que usa o motor XeTeX, uma vez exatamente como devolvido e outra com uma configuração de chinês adicionada ao preâmbulo. Depois extraímos o texto de cada PDF. Este foi um teste pequeno, com um modelo, um par de línguas e um ficheiro. Mostra que problemas acontecem e como os detetar. Não classifica modelos nem prompts.
Resultado: A estrutura sobreviveu; o preâmbulo decidiu se o texto aparecia
check_latex_translation.py comparou cada saída com a fonte, e compile_check.py compilou-a. As saídas completas estão em check-results.txt e compile-results.txt, e results.csv tem uma linha por execução.
| Verificação | Ficheiro completo | Instruído | Segmentos |
|---|---|---|---|
| Etiquetas, referências, citações e chaves bibliográficas inalteradas | 3 de 3 | 3 de 3 | 3 de 3 |
Matemática inalterada (texto dentro de \text{} traduzido) | 3 de 3 | 3 de 3 | 3 de 3 |
| URLs, chavetas e colunas de tabela intactas | 3 de 3 | 3 de 3 | 3 de 3 |
| O modelo adicionou um pacote chinês ao preâmbulo | 3 de 3 | 0 de 3 | 0 de 3 |
| Compila tal como devolvido | 3 de 3 | 3 de 3 | 3 de 3 |
| Texto chinês efetivamente no PDF tal como devolvido | 3 de 3 | 0 de 3 | 0 de 3 |
| Bloco verbatim inalterado | 3 de 3 | 2 de 3 | 3 de 3 |
Comentários % deixados em inglês | 3 de 3 | 3 de 3 | 1 de 3 |
| Todas as referências e citações resolvem após adicionar a configuração chinesa | 3 de 3 | 3 de 3 | 3 de 3 |
O nosso verificador inicialmente reportou matemática alterada na primeira execução. A matemática estava bem: a ordem das palavras em chinês tinha colocado $N$ antes de $r$ numa frase. O verificador publicado compara segmentos matemáticos como uma coleção não ordenada por esta razão, pelo que a reordenação é permitida, mas um símbolo alterado não.
1. "Não tocar no preâmbulo" produziu um PDF sem chinês
A regra do preâmbulo parece a instrução mais segura que se pode dar. O preâmbulo da nossa amostra carrega amsmath, booktabs e hyperref e define três macros, e nada disso precisa de tradução. Por isso, as execuções com instruções e com segmentos deixaram-no em paz, exatamente como lhes foi dito.
Mas as fontes predefinidas numa configuração LaTeX padrão não têm caracteres chineses. Todos os seis ficheiros compilaram com código de saída 0. O Tectonic avisou, uma vez por cada caractere em falta, com linhas como Missing character: There is no 估 (U+4F30) in font [lmroman17-regular], e o ficheiro de log registou entre 554 e 577 avisos por execução. Mas um aviso não interrompe a compilação. Quando extraímos o texto desses seis PDFs, continham os nomes dos autores, os números e a matemática, e zero caracteres chineses. Os três PDFs de ficheiro completo continham entre 481 e 490. Um script de compilação que verifica apenas se a compilação foi bem-sucedida, ou uma pessoa que só dá uma vista de olhos ao fim da saída, teria enviado os seis.
As três execuções de ficheiro completo, que não tinham essa regra, adicionaram \usepackage{ctex} por conta própria, e os seus PDFs estavam completos. Isso não é razão para deixar um modelo reescrever o seu preâmbulo. É razão para ver a configuração da língua de destino como parte do trabalho de tradução, feita uma vez, por si:
- Chinês: carregue ctex, que suporta pdfLaTeX, XeLaTeX e LuaLaTeX. Por predefinição, escolhe fontes para o seu sistema operativo; o nosso log mostra que carrega o conjunto de fontes de macOS. Se o ficheiro tiver de compilar da mesma forma noutras máquinas,
\usepackage[UTF8,fontset=fandol]{ctex}usa as fontes gratuitas Fandol distribuídas com o TeX Live, que o Tectonic também descarrega a pedido. É isso quecompile_check.pyadiciona. - Outras línguas: carregue babel com a língua de destino, para que a hifenização e as palavras geradas como "Figure", "Table" e "Abstract" sigam a nova língua. Japonês, coreano e línguas da direita para a esquerda precisam cada um da sua própria configuração.
Após compilar, verifique o log à procura de Missing character e leia o PDF, não apenas o código de saída. Testámos apenas XeTeX através do Tectonic; outros motores reportam uma fonte em falta de forma diferente.
2. A regra de escape infiltrou-se na listagem de código
As nossas instruções diziam para manter os caracteres especiais escapados, e em prosa essa é a regra correta: um % isolado em LaTeX inicia um comentário e engole silenciosamente o resto da linha. Todas as nove execuções mantiveram 20\% no resumo.
Na primeira execução com instruções, o modelo também aplicou a regra dentro do bloco verbatim e traduziu o comentário de código aí presente:
source: shelfmark count --unit chars book.epub # 100% of body text
translation: shelfmark count --unit chars book.epub # 100\% 正文
Dentro de verbatim, nada é um comando, pelo que o PDF imprime 100\% com a barra invertida. A solução não é um prompt melhor. Nunca envie blocos verbatim, lstlisting ou minted a um tradutor, tal como fez a condição de segmentos. Depois, traduza manualmente qualquer comentário neles se os seus leitores precisarem disso.
3. Os comentários respeitaram os limites do pedido
O ficheiro tem dois comentários %: uma nota acima das definições de macros e um TODO acima da listagem de código. As execuções de ficheiro completo e com instruções deixaram ambos em inglês. A condição de segmentos traduziu o TODO em duas de três execuções, porque o TODO calhou estar no mesmo bloco que um parágrafo que enviámos para tradução. Duas execuções de ficheiro completo também acrescentaram um comentário próprio após o pacote que inseriram.
Nada disto altera o PDF. É relevante se o código-fonte traduzido voltar para coautores ou para um repositório, onde um TODO traduzido deixa de corresponder ao original e um comentário extra aparece em cada diff. O verificador reporta comentários traduzidos como aviso, para que possa decidir.
4. As verificações estruturais passaram e o significado ainda mudou
O resumo diz "um rótulo com um erro de 20% ainda é útil". Em três de nove execuções, o chinês dizia que os rótulos com um erro dentro de 20% ainda são úteis, o que transforma uma tolerância num limiar. Várias outras execuções reordenaram a frase de modo a que a oração "embora" ficasse ligada à ideia errada, e uma tornou-se difícil de seguir. Estes são juízos de um leitor que comparou o chinês com o inglês, não uma revisão cega, mas o ponto não depende da contagem exata: todas as verificações estruturais passaram nesses ficheiros, porque o 20\%, a macro e as chavetas estavam todos corretos.
Duas outras alterações foram aceitáveis, mas vale a pena conhecê-las. As execuções de ficheiro completo escreveram \$12 como 12美元 ("12 dólares americanos"), o que elimina completamente a questão do escape. Duas execuções de ficheiro completo também eliminaram a maioria das ligações ~ antes de \ref e \cite. Isso é inofensivo em chinês, que não coloca espaços entre palavras, mas numa língua que o faz, uma ligação em falta permite que uma quebra de linha separe "Tabela" do seu número. O verificador reporta as ligações como aviso, não como falha.
Uma verificação estrutural diz-lhe que o ficheiro ainda funciona. Não lhe pode dizer que o artigo ainda diz a mesma coisa. Para isso, faça uma leitura bilingue do resumo, das afirmações e dos números, como descrito no nosso guia para rever um artigo de investigação traduzido.
Um Fluxo de Trabalho que Resiste
-
Obtenha o código-fonte e verifique o que pode fazer com ele. No arXiv, os artigos submetidos em TeX geralmente disponibilizam o código-fonte através de uma ligação Source na página do resumo ou na página Other formats, como um ficheiro gzip ou um arquivo tar quando há vários ficheiros (ajuda do arXiv). Traduzir para leitura própria é uma coisa. Publicar a tradução é outra: a licença não exclusiva do próprio arXiv limita a reutilização por terceiros, enquanto a CC BY e a CC BY-SA permitem adaptações com atribuição, e a CC BY-NC-ND não. Em caso de dúvida, pergunte aos autores.
-
Compile primeiro o original. Se não compilar antes da tradução, nada do que aprender depois é fiável. Guarde o PDF original para comparação.
-
Configure a língua de destino no preâmbulo. Adicione
ctexoubabelcomo acima, compile uma vez com o texto em inglês e faça commit dessa alteração separadamente. -
Traduza o corpo sem o preâmbulo e sem blocos verbatim. Use uma ferramenta que faça parsing de LaTeX, ou envie o corpo em partes com regras explícitas, como na nossa condição de segmentos. O TransLaTeX, uma ferramenta open-source criada para este efeito, substitui construções LaTeX por tokens antes de enviar o texto a um tradutor automático. A sua documentação também indica que mantém o cabeçalho do documento intacto, não suporta macros e só lida com documentos de ficheiro único, sem
\input. Mesmo uma ferramenta dedicada deixa a decisão sobre o preâmbulo nas suas mãos. -
Execute a verificação estrutural em cada par de ficheiros.
python3 check_latex_translation.py main.tex main-zh.tex --keep ShelfmarkCompara o preâmbulo, nomes de comandos, ordem dos ambientes, rótulos, referências, citações, chaves bibliográficas, matemática, blocos verbatim, URLs,
%,&e#não escapados, equilíbrio de chavetas, ligações, comentários e quaisquer termos que peça para manter. Espere que a linha do preâmbulo falhe após o passo 3 quando compara com o original; compare antes com o seu ficheiro em inglês atualizado. Para um projeto dividido por vários ficheiros\input, verifique cada par. -
Compile e leia o PDF.
python3 compile_check.py main-zh.texReporta referências não resolvidas (
??), citações não resolvidas ([?]) e glifos em falta. Depois abra o PDF e leia o resumo, todas as legendas e todas as tabelas em comparação com o original. -
Faça uma leitura bilingue das afirmações e dos números. É aqui que as nossas três frases alteradas teriam sido detetadas. Mantenha um pequeno glossário de tradução para os termos técnicos do artigo, para que o mesmo termo não seja traduzido de três formas diferentes.
Onde o BookTranslator se Encaixa
O tradutor de documentos do BookTranslator aceita ficheiros .tex, juntamente com PDF, DOCX, EPUB, Markdown e outros formatos estruturados. As suas FAQ dizem que o resultado é devolvido num "ficheiro utilizável e adequado ao formato sempre que esse formato o permita".
A página do produto não descreve como trata macros LaTeX, matemática ou o preâmbulo, e não executámos esta amostra através do BookTranslator para este artigo. Seja qual for a ferramenta que usar, faça os passos 1 a 3 antes de traduzir e os passos 5 a 7 depois. Um ficheiro que mantém um preâmbulo apenas em inglês continuará a compilar sem texto chinês, e uma afirmação alterada continuará a passar em todas as verificações estruturais.
Se só tem o PDF de um artigo, e não o código-fonte, o fluxo de trabalho é diferente: consulte o nosso guia para traduzir um artigo de investigação mantendo a sua estrutura. Se a sua fonte for Markdown em vez de LaTeX, aplica-se a mesma separação entre maquinaria e prosa, com armadilhas diferentes; testámo-las em Como Traduzir Ficheiros Markdown.
Obtenha os Ficheiros de Teste
Tudo deste teste é livre para reutilização:
- sample-source.tex: a amostra em inglês com 98 linhas;
- check_latex_translation.py: o verificador estrutural (apenas biblioteca padrão do Python);
- compile_check.py: compila cada ficheiro tal como devolvido e com uma configuração chinesa, e conta referências não resolvidas, citações não resolvidas e glifos em falta (requer Tectonic e pdftotext);
- run_llm_latex_test.py: as três condições de prompt para qualquer servidor local compatível com OpenAI;
- as nove saídas na pasta outputs, com check-results.txt, compile-results.txt e results.csv.
Publicações relacionadas





