BookTranslator
BookTranslator

Come tradurre un documento LaTeX senza rompere formule, citazioni o etichette

Cosa tradurre in un file .tex, cosa lasciare intatto e perché un file tradotto può compilare senza errori e perdere comunque il testo. Con un file di esempio, due verificatori gratuiti e un test locale su 9 esecuzioni con un LLM.

BookTranslator

BookTranslator Team

15 min read

Per tradurre un documento LaTeX, traduci il testo discorsivo e gli argomenti dei comandi destinati al lettore, come titoli di sezione, didascalie, note a piè di pagina e testo dei link. Lascia esattamente come sono i comandi, i nomi degli ambienti, le chiavi di \label, \ref e \cite, la matematica e i blocchi verbatim. Poi fai una modifica che nessun traduttore dovrebbe fare al posto tuo: imposta il preambolo per la lingua di destinazione, perché un file che mantiene il preambolo inglese può compilare senza errori e produrre comunque un PDF in cui il testo tradotto manca.

Quest'ultimo punto è il risultato principale di un piccolo test. Abbiamo tradotto un articolo LaTeX di 98 righe in cinese semplificato nove volte con un modello locale, in tre modi diversi, e abbiamo verificato ogni risultato con uno script e un compilatore. Le parti che di solito preoccupano hanno tenuto in tutte e nove le esecuzioni: etichette, riferimenti, citazioni, equazioni, URL, colonne di tabelle e parentesi sono tornati intatti, e ogni riferimento incrociato è stato risolto. I problemi erano altrove. Le sei esecuzioni il cui prompt diceva "non modificare il preambolo" hanno obbedito, compilato con codice di uscita 0 e prodotto PDF senza alcun testo cinese. Un'esecuzione ha applicato la nostra regola "esegui l'escape del segno %" dentro un listato di codice, così il PDF stampa una barra rovesciata indesiderata. E almeno tre esecuzioni hanno spostato il significato di una frase in modi che nessun controllo strutturale può vedere.

Risposta rapida: cosa tradurre e cosa lasciare intatto

Parte del fileEsempio dal nostro campioneTradurlo?
Preambolo: \documentclass, \usepackage, \newcommand\newcommand{\wpm}{\mathrm{wpm}}No, ma aggiungi tu stesso la configurazione per la lingua di destinazione (vedi sotto)
\title, \author, \date\title{Estimating Reading Time for Translated Ebooks}Titolo e data sì; i nomi di solito no
Intestazioni\section{Method}\label{sec:method}Sì, il testo tra parentesi graffe; mantieni l'etichetta
Etichette e riferimenti\label{eq:time}, Section~\ref{sec:method}, \eqref{eq:time}Mantieni ogni chiave
Citazioni e chiavi bibliografiche\cite{brysbaert2019}, \bibitem{rayner2016}Mantieni le chiavi; traduci il testo delle voci solo se la tua disciplina lo prevede
Matematica in linea e in blocco$r_c$, T = \frac{N}{r}No
Testo dentro la matematica\text{ for English silent reading.}Sì. Viene stampato come testo normale.
Macro che accettano testo\term{characters per minute}Traduci l'argomento, mantieni il comando
Didascalie e note a piè di pagina\caption{Reading rates used in this paper.}Sì
Blocchi verbatim e listati di codiceshelfmark count --unit chars book.epub # 100% of body textNo, inclusi i commenti al loro interno
\url e il primo argomento di \href\href{https://example.org/shelfmark/survey}{online appendix}Mantieni l'URL; traduci il testo del link
Caratteri con escape20\%, \$12, R\&DMantieni la barra rovesciata nel testo
Commenti con %% TODO: replace the Chinese rate ...Facoltativo. I lettori non li vedono mai.
Tilde prima dei riferimentiTable~\ref{tab:rates}Mantienile nelle lingue che usano spazi; facoltative in cinese e giapponese

Tutto il resto è testo normale: paragrafi, abstract, voci di elenco e celle di tabella.

Cosa abbiamo testato

Abbiamo scritto sample-source.tex, un breve articolo inventato sulle stime dei tempi di lettura per un'app fittizia chiamata Shelfmark. Compila senza errori e contiene un esempio di ogni costrutto nella tabella sopra, più una tabella booktabs, una figura con didascalia, due commenti %, un blocco verbatim con un % nudo e una bibliografia inline.

Poi abbiamo chiesto a un modello locale di tradurlo in cinese semplificato in tre modi:

  1. File intero. Incolla l'intero file e chiedi un file tradotto che compili ancora.
  2. Con istruzioni. Lo stesso, più sette regole: non modificare il preambolo, mantieni ogni comando, ambiente, etichetta, riferimento e chiave di citazione, lascia stare la matematica tranne \text{}, lascia stare i blocchi verbatim e gli URL, mantieni i caratteri speciali con escape, mantieni le tilde e traduci il testo, le didascalie, le note a piè di pagina e il testo dei link.
  3. Segmenti. Tieni il preambolo completamente fuori dalla richiesta (viene inviata solo la riga \title, così \date resta in inglese), dividi il corpo alle righe vuote, salta il blocco verbatim, invia ogni pezzo con le stesse regole e riassembla.

Il modello era Qwen 3.6 27B (Q4_K_M) in LM Studio, con il thinking disattivato e temperatura 0.3, su un Apple M4 Max con 64 GB di memoria. Abbiamo eseguito ogni condizione tre volte, nove esecuzioni in totale, il 26 ottobre 2026. Lo script è run_llm_latex_test.py, e tutti e nove gli output sono pubblicati senza modifiche nella cartella outputs. Se non hai mai configurato un modello locale, la nostra guida alla traduzione con LLM locale copre le impostazioni.

Abbiamo compilato ogni output con Tectonic 0.17.0, che usa il motore XeTeX, una volta esattamente come restituito e una volta con una configurazione cinese aggiunta al preambolo. Poi abbiamo riletto il testo da ogni PDF. Questo è stato un piccolo test su un modello, una coppia di lingue e un file. Mostra quali problemi si verificano e come individuarli. Non classifica modelli o prompt.

Risultato: la struttura è sopravvissuta; il preambolo ha deciso se il testo appariva

check_latex_translation.py ha confrontato ogni output con il sorgente, e compile_check.py lo ha compilato. Gli output completi sono in check-results.txt e compile-results.txt, e results.csv ha una riga per esecuzione.

ControlloFile interoIstruitoSegmenti
Etichette, riferimenti, citazioni e chiavi bibliografiche invariati3 su 33 su 33 su 3
Matematica invariata (testo dentro \text{} tradotto)3 su 33 su 33 su 3
URL, parentesi graffe e colonne di tabelle intatti3 su 33 su 33 su 3
Il modello ha aggiunto un pacchetto cinese al preambolo3 su 30 su 30 su 3
Compila così come restituito3 su 33 su 33 su 3
Testo cinese effettivamente presente nel PDF così come restituito3 su 30 di 30 di 3
Blocco verbatim invariato3 di 32 di 33 di 3
Commenti % lasciati in inglese3 di 33 di 31 di 3
Ogni riferimento e citazione si risolve dopo aver aggiunto la configurazione cinese3 di 33 di 33 di 3

Il nostro verificatore ha inizialmente segnalato una modifica della matematica alla prima esecuzione. La matematica era corretta: l'ordine delle parole cinese aveva messo $N$ prima di $r$ in una frase. Il verificatore pubblicato confronta i segmenti matematici come una collezione non ordinata per questo motivo, quindi il riordino è consentito ma un simbolo modificato no.

1. "Non toccare il preambolo" ha prodotto un PDF senza cinese

La regola del preambolo sembra l'istruzione più sicura che si possa dare. Il preambolo del nostro esempio carica amsmath, booktabs e hyperref e definisce tre macro, e nulla di tutto ciò necessita di traduzione. Quindi le esecuzioni con istruzioni e segmenti lo hanno lasciato stare, esattamente come richiesto.

Ma i font predefiniti in una configurazione LaTeX standard non hanno caratteri cinesi. Ognuno di quei sei file è stato compilato con codice di uscita 0. Tectonic ha avvertito, una volta per ogni carattere mancante, con righe come Missing character: There is no 估 (U+4F30) in font [lmroman17-regular], e il file di log ne ha registrati tra 554 e 577 per esecuzione. Ma un avviso non interrompe la compilazione. Quando abbiamo estratto il testo da quei sei PDF, contenevano i nomi degli autori, i numeri e la matematica, e zero caratteri cinesi. I tre PDF dell'intero file contenevano da 481 a 490. Uno script di compilazione che controlla solo se la compilazione è riuscita, o una persona che dà solo un'occhiata alla fine dell'output, avrebbe spedito tutti e sei.

Le tre esecuzioni sull'intero file, che non avevano tale regola, hanno aggiunto \usepackage{ctex} da sole, e i loro PDF erano completi. Non è un motivo per lasciare che un modello riscriva il tuo preambolo. È un motivo per considerare la configurazione della lingua di destinazione come parte del lavoro di traduzione, fatto una volta, da te:

  • Cinese: carica ctex, che supporta pdfLaTeX, XeLaTeX e LuaLaTeX. Per impostazione predefinita sceglie i font per il tuo sistema operativo; il nostro log mostra che carica il suo set di font macOS. Se il file deve essere compilato allo stesso modo su altre macchine, \usepackage[UTF8,fontset=fandol]{ctex} usa i font gratuiti Fandol distribuiti con TeX Live, che anche Tectonic scarica su richiesta. Questo è ciò che aggiunge compile_check.py.
  • Altre lingue: carica babel con la lingua di destinazione, in modo che la sillabazione e le parole generate come "Figura", "Tabella" e "Abstract" seguano la nuova lingua. Giapponese, coreano e le lingue da destra a sinistra necessitano ciascuna della propria configurazione.

Dopo la compilazione, controlla il log per Missing character e leggi il PDF, non solo il codice di uscita. Abbiamo testato solo XeTeX tramite Tectonic; altri motori segnalano un font mancante in modo diverso.

2. La regola di escaping è trapelata nel listato di codice

Le nostre istruzioni dicevano di mantenere i caratteri speciali con escape, e nella prosa questa è la regola giusta: un % nudo in LaTeX avvia un commento e inghiotte silenziosamente il resto della riga. Tutte e nove le esecuzioni hanno mantenuto 20\% nell'abstract.

Nella prima esecuzione con istruzioni, il modello ha applicato la regola anche all'interno del blocco verbatim e ha tradotto il commento al codice ivi contenuto:

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

Dentro verbatim, nulla è un comando, quindi il PDF stampa 100\% con la barra rovesciata. La soluzione non è un prompt migliore. Non inviare mai i blocchi verbatim, lstlisting o minted a un traduttore, come faceva la condizione segments. Poi traduci a mano qualsiasi commento in essi contenuto se i tuoi lettori ne hanno bisogno.

3. I commenti hanno rispettato i confini della richiesta

Il file contiene due commenti %: una nota sopra le definizioni delle macro e un TODO sopra il listato di codice. Le esecuzioni whole-file e instructed hanno lasciato entrambi in inglese. La condizione segments ha tradotto il TODO in due esecuzioni su tre, perché il TODO si trovava nello stesso blocco di un paragrafo che avevamo inviato per la traduzione. Due esecuzioni whole-file hanno anche aggiunto un commento proprio dopo il pacchetto inserito.

Niente di tutto ciò cambia il PDF. È importante se il sorgente tradotto torna ai coautori o in un repository, dove un TODO tradotto non corrisponde più all'originale e un commento extra compare in ogni diff. Il checker segnala i commenti tradotti come avviso, così puoi decidere.

4. I controlli strutturali sono passati e il significato è comunque cambiato

L'abstract dice "un'etichetta con un errore del 20% è comunque utile". In tre esecuzioni su nove, il cinese diceva che le etichette con un errore entro il 20% sono comunque utili, il che trasforma una tolleranza in una soglia. Diverse altre esecuzioni hanno riordinato la frase in modo che la proposizione "sebbene" si attaccasse all'idea sbagliata, e una è diventata difficile da seguire. Questi sono giudizi di un lettore che confronta il cinese con l'inglese, non una revisione in cieco, ma il punto non dipende dal conteggio esatto: ogni controllo strutturale è passato su quei file, perché il 20\%, la macro e le parentesi erano tutti corretti.

Altri due cambiamenti erano accettabili ma vale la pena conoscerli. Le esecuzioni whole-file hanno scritto \$12 come 12美元 ("12 dollari USA"), il che elimina del tutto la questione dell'escaping. Due esecuzioni whole-file hanno anche eliminato la maggior parte dei legami ~ prima di \ref e \cite. Questo è innocuo in cinese, che non mette spazi tra le parole, ma in una lingua che lo fa, un legame mancante permette a un'interruzione di riga di separare "Tabella" dal suo numero. Il checker segnala i legami come avviso, non come errore.

Un controllo strutturale ti dice che il file funziona ancora. Non può dirti che l'articolo dice ancora la stessa cosa. Per questo, usa una lettura bilingue dell'abstract, delle affermazioni e dei numeri, come descritto nella nostra guida alla revisione di un articolo di ricerca tradotto.

Un flusso di lavoro che regge

  1. Ottieni il sorgente e controlla cosa puoi farne. Su arXiv, gli articoli inviati in TeX di solito offrono il loro sorgente tramite un link Source nella pagina dell'abstract o nella pagina Other formats, come file gzippato o archivio tar quando ci sono più file (aiuto di arXiv). Tradurre per la propria lettura è una cosa. Pubblicare la traduzione è un'altra: la licenza non esclusiva di arXiv limita il riutilizzo da parte di altri, mentre CC BY e CC BY-SA consentono adattamenti con attribuzione, e CC BY-NC-ND no. Chiedi agli autori in caso di dubbio.

  2. Compila prima l'originale. Se non compila prima della traduzione, nulla di ciò che impari dopo è affidabile. Conserva il PDF originale per il confronto.

  3. Imposta tu stesso la lingua di destinazione nel preambolo. Aggiungi ctex o babel come sopra, compila una volta con il testo inglese e commit quel cambiamento separatamente.

  4. Traduci il corpo senza il preambolo e senza blocchi verbatim. Usa uno strumento che analizzi il LaTeX, oppure invia il corpo a pezzi con regole esplicite, come nella nostra condizione segments. TransLaTeX, uno strumento open source creato per questo, sostituisce i costrutti LaTeX con token prima di inviare il testo a un traduttore automatico. La sua documentazione dice anche che mantiene intatta l'intestazione del documento, non supporta le macro e gestisce solo documenti a file singolo, senza \input. Anche uno strumento dedicato lascia a te la decisione sul preambolo.

  5. Esegui il controllo strutturale su ogni coppia di file.

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

    Confronta il preambolo, i nomi dei comandi, l'ordine degli ambienti, le etichette, i riferimenti, le citazioni, le chiavi bibliografiche, la matematica, i blocchi verbatim, gli URL, i %, & e # non escapati, l'equilibrio delle parentesi, i legami, i commenti e qualsiasi termine che chiedi di mantenere. Aspettati che la riga del preambolo fallisca dopo il passo 3 quando confronti con l'originale; confronta invece con il tuo file inglese aggiornato. Per un progetto suddiviso su più file \input, controlla ogni coppia.

  6. Compila e leggi il PDF.

    python3 compile_check.py main-zh.tex
    

    Segnala riferimenti irrisolti (??), citazioni irrisolte ([?]) e glifi mancanti. Poi apri il PDF e leggi l'abstract, ogni didascalia e ogni tabella confrontandoli con l'originale.

  7. Fai una lettura bilingue delle affermazioni e dei numeri. È qui che le nostre tre frasi modificate sarebbero state individuate. Tieni un breve glossario di traduzione per i termini tecnici dell'articolo, così lo stesso termine non viene tradotto in tre modi diversi.

Dove si inserisce BookTranslator

Il traduttore di documenti di BookTranslator accetta file .tex insieme a PDF, DOCX, EPUB, Markdown e altri formati strutturati. Le sue FAQ dicono che il risultato viene restituito in "un file utilizzabile e adatto al formato ogni volta che quel formato lo supporta".

La pagina del prodotto non descrive come tratta le macro LaTeX, la matematica o il preambolo, e non abbiamo eseguito questo esempio con BookTranslator per questo articolo. Qualunque strumento tu usi, fai i passi da 1 a 3 prima di tradurre e i passi da 5 a 7 dopo. Un file che mantiene un preambolo solo in inglese compilerà comunque senza testo cinese, e un'affermazione modificata supererà comunque ogni controllo strutturale.

Se hai solo il PDF di un articolo, non il suo sorgente, il flusso di lavoro è diverso: vedi la nostra guida alla traduzione di un articolo di ricerca mantenendone la struttura. Se il tuo sorgente è Markdown invece di LaTeX, vale la stessa separazione tra meccanismi e prosa, con trappole diverse; le abbiamo testate in Come tradurre i file Markdown.

Ottieni i file di test

Tutto ciò che proviene da questo test è liberamente riutilizzabile:

Post Correlati