Hoe je een LaTeX-document vertaalt zonder wiskunde, citaties of labels te breken
Wat je in een .tex-bestand vertaalt, wat je met rust laat, en waarom een vertaald bestand foutloos kan compileren en toch zijn tekst kan verliezen. Met een voorbeeldbestand, twee gratis checkers en een lokale LLM-test met 9 runs.

Om een LaTeX-document te vertalen, vertaal je de lopende tekst en de argumenten van commando's die de lezer te zien krijgt, zoals sectietitels, bijschriften, voetnoten en linktekst. Laat de commando's, omgevingsnamen, \label-, \ref- en \cite-sleutels, wiskunde en verbatim-blokken exact zoals ze zijn. Maak daarna één wijziging die geen enkele vertaler voor je zou moeten maken: stel de preamble in voor de doeltaal, want een bestand dat zijn Engelse preamble behoudt, kan zonder fout compileren en toch een PDF opleveren waarin de vertaalde tekst ontbreekt.
Dat laatste punt is het belangrijkste resultaat van een kleine test. We hebben een LaTeX-paper van 98 regels negen keer naar Vereenvoudigd Chinees vertaald met een lokaal model, op drie verschillende manieren, en elk resultaat gecontroleerd met een script en een compiler. De onderdelen waar mensen zich meestal zorgen over maken, bleven in alle negen runs intact: labels, verwijzingen, citaties, vergelijkingen, URL's, tabelkolommen en accolades kwamen ongeschonden terug, en elke kruisverwijzing werd opgelost. De problemen zaten elders. De zes runs waarvan de prompt zei "wijzig de preamble niet" gehoorzaamden, compileerden met exitcode 0 en produceerden PDF's zonder enige Chinese tekst. Eén run paste onze regel "escape het %-teken" toe binnen een codelisting, waardoor de PDF een losse backslash afdrukt. En minstens drie runs verschoven de betekenis van een zin op manieren die geen enkele structurele controle kan zien.
Snel antwoord: wat je vertaalt en wat je met rust laat
| Deel van het bestand | Voorbeeld uit ons voorbeeldbestand | Vertaal je het? |
|---|---|---|
Preamble: \documentclass, \usepackage, \newcommand | \newcommand{\wpm}{\mathrm{wpm}} | Nee, maar voeg zelf de doeltaalinstelling toe (zie hieronder) |
\title, \author, \date | \title{Estimating Reading Time for Translated Ebooks} | Titel en datum wel; namen meestal niet |
| Koppen | \section{Method}\label{sec:method} | Ja, de tekst tussen accolades; behoud het label |
| Labels en verwijzingen | \label{eq:time}, Section~\ref{sec:method}, \eqref{eq:time} | Behoud elke sleutel |
| Citaties en bibliografiesleutels | \cite{brysbaert2019}, \bibitem{rayner2016} | Behoud de sleutels; vertaal de tekst van een item alleen als dat in jouw vakgebied gebruikelijk is |
| Inline- en display-wiskunde | $r_c$, T = \frac{N}{r} | Nee |
| Tekst binnen wiskunde | \text{ for English silent reading.} | Ja. Die wordt als gewone tekst afgedrukt. |
| Macro's die tekst aannemen | \term{characters per minute} | Vertaal het argument, behoud het commando |
| Bijschriften en voetnoten | \caption{Reading rates used in this paper.} | Ja |
| Verbatim- en codelijsten | shelfmark count --unit chars book.epub # 100% of body text | Nee, inclusief opmerkingen erin |
\url en het eerste argument van \href | \href{https://example.org/shelfmark/survey}{online appendix} | Behoud de URL; vertaal de linktekst |
| Escaped tekens | 20\%, \$12, R\&D | Behoud de backslash in proza |
%-opmerkingen | % TODO: replace the Chinese rate ... | Optioneel. Lezers zien ze nooit. |
| Ties vóór referenties | Table~\ref{tab:rates} | Behoud in talen die spaties gebruiken; optioneel in het Chinees en Japans |
Al het overige is gewoon proza: paragrafen, samenvatting, lijstitems en tabelcellen.
Wat we hebben getest
We schreven sample-source.tex, een kort verzonnen artikel over leestijdschattingen voor een fictieve app genaamd Shelfmark. Het compileert foutloos en bevat één voorbeeld van elk construct in de bovenstaande tabel, plus een booktabs-tabel, een figuur met een bijschrift, twee %-opmerkingen, een verbatim-blok met een kale % erin, en een inline bibliografie.
Daarna vroegen we een lokaal model om het op drie manieren naar Vereenvoudigd Chinees te vertalen:
- Heel bestand. Plak het hele bestand en vraag om een vertaald bestand dat nog steeds compileert.
- Met instructies. Hetzelfde, plus zeven regels: wijzig de preamble niet, behoud elke opdracht, omgeving, label, referentie en citatiesleutel, laat wiskunde met rust behalve
\text{}, laat verbatim-blokken en URL's met rust, houd speciale tekens escaped, behoud ties, en vertaal het proza, de bijschriften, voetnoten en linktekst. - Segmenten. Houd de preamble volledig buiten het verzoek (alleen de regel
\titlewordt verzonden, zodat\datein het Engels blijft), splits de body op lege regels, sla het verbatim-blok over, stuur elk stuk met dezelfde regels, en voeg weer samen.
Het model was Qwen 3.6 27B (Q4_K_M) in LM Studio, met thinking uitgeschakeld en temperatuur 0.3, op een Apple M4 Max met 64 GB geheugen. We voerden elke conditie drie keer uit, negen runs in totaal, op 26 oktober 2026. Het script is run_llm_latex_test.py, en alle negen outputs zijn ongewijzigd gepubliceerd in de outputs-map. Als je nog nooit een lokaal model hebt opgezet, behandelt onze handleiding voor lokale LLM-vertaling de instellingen.
We compileerden elke output met Tectonic 0.17.0, dat de XeTeX-engine gebruikt, één keer precies zoals geretourneerd en één keer met een Chinese setup toegevoegd aan de preamble. Daarna lazen we de tekst terug uit elke PDF. Dit was een kleine test van één model, één taalpaar en één bestand. Het laat zien welke problemen optreden en hoe je ze kunt opsporen. Het rangschikt geen modellen of prompts.
Resultaat: De structuur overleefde; de preamble bepaalde of tekst verscheen
check_latex_translation.py vergeleek elke output met de bron, en compile_check.py compileerde het. De volledige outputs staan in check-results.txt en compile-results.txt, en results.csv heeft één rij per run.
| Controle | Heel bestand | Geïnstrueerd | Segmenten |
|---|---|---|---|
| Labels, verwijzingen, citaties en bibliografiesleutels ongewijzigd | 3 van 3 | 3 van 3 | 3 van 3 |
Wiskunde ongewijzigd (tekst binnen \text{} vertaald) | 3 van 3 | 3 van 3 | 3 van 3 |
| URL's, accolades en tabelkolommen intact | 3 van 3 | 3 van 3 | 3 van 3 |
| Model voegde een Chinees pakket toe aan de preamble | 3 van 3 | 0 van 3 | 0 van 3 |
| Compileert zoals geretourneerd | 3 van 3 | 3 van 3 | 3 van 3 |
| Chinese tekst daadwerkelijk in de PDF zoals geretourneerd | 3 van 3 | 0 van 3 | 0 van 3 |
| Verbatim blok ongewijzigd | 3 van 3 | 2 van 3 | 3 van 3 |
%-opmerkingen in het Engels gelaten | 3 van 3 | 3 van 3 | 1 van 3 |
| Elke verwijzing en citatie werkt na het toevoegen van de Chinese setup | 3 van 3 | 3 van 3 | 3 van 3 |
Onze checker meldde aanvankelijk gewijzigde wiskunde in de eerste run. De wiskunde was in orde: de Chinese woordvolgorde had $N$ vóór $r$ geplaatst in één zin. De gepubliceerde checker vergelijkt wiskundesegmenten daarom als een ongeordende verzameling, dus herordenen is toegestaan, maar een gewijzigd symbool niet.
1. "Raak de preamble niet aan" leverde een PDF op zonder Chinees erin
De preamble-regel klinkt als de veiligste instructie die je kunt geven. De preamble van ons voorbeeld laadt amsmath, booktabs en hyperref en definieert drie macro's, en niets daarvan hoeft vertaald te worden. Dus lieten de instructed- en segments-runs die met rust, precies zoals opgedragen.
Maar de standaardlettertypen in een standaard LaTeX-setup hebben geen Chinese tekens. Elk van die zes bestanden compileerde met exitcode 0. Tectonic waarschuwde wel, één keer per ontbrekend teken, met regels als Missing character: There is no 估 (U+4F30) in font [lmroman17-regular], en het logbestand registreerde tussen 554 en 577 daarvan per run. Maar een waarschuwing stopt de build niet. Toen we de tekst uit die zes PDF's haalden, bevatten ze de auteursnamen, de getallen en de wiskunde, en nul Chinese tekens. De drie whole-file-PDF's bevatten 481 tot 490. Een buildscript dat alleen controleert of de compilatie is geslaagd, of iemand die alleen het einde van de output doorneemt, zou alle zes hebben verzonden.
De drie whole-file-runs, die zo'n regel niet hadden, voegden zelf \usepackage{ctex} toe, en hun PDF's waren compleet. Dat is geen reden om een model je preamble te laten herschrijven. Het is een reden om de target-language-setup als onderdeel van de vertaaltaak te zien, één keer, door jou:
- Chinees: laad ctex, dat pdfLaTeX, XeLaTeX en LuaLaTeX ondersteunt. Standaard kiest het lettertypen voor je besturingssysteem; ons log laat zien dat het de macOS-fontset laadt. Als het bestand op andere machines op dezelfde manier moet compileren, gebruik dan
\usepackage[UTF8,fontset=fandol]{ctex}met de gratis Fandol-lettertypen die met TeX Live worden meegeleverd en die Tectonic ook op aanvraag downloadt. Dat is watcompile_check.pytoevoegt. - Andere talen: laad babel met de doeltaal, zodat woordafbreking en gegenereerde woorden zoals "Figure", "Table" en "Abstract" de nieuwe taal volgen. Japans, Koreaans en rechts-naar-links-talen hebben elk hun eigen setup nodig.
Controleer na het compileren het log op Missing character en lees de PDF, niet alleen de exitcode. We hebben alleen XeTeX via Tectonic getest; andere engines melden een ontbrekend lettertype anders.
2. De escaping-regel lekte door naar de codelisting
Onze instructies zeiden speciale tekens ge-escaped te houden, en in proza is dat de juiste regel: een kale % in LaTeX start een opmerking en slikt stilletjes de rest van de regel in. Alle negen runs behielden 20\% in het abstract.
In de eerste geïnstrueerde run paste het model de regel ook toe binnen het verbatim-blok en vertaalde het de codeopmerking daar:
source: shelfmark count --unit chars book.epub # 100% of body text
translation: shelfmark count --unit chars book.epub # 100\% æ£æ–‡
Binnen verbatim is niets een commando, dus de PDF drukt 100\% af met de backslash. De oplossing is niet een betere prompt. Stuur verbatim-, lstlisting- of minted-blokken helemaal nooit naar een vertaler, zoals de segmenten-conditie deed. Vertaal eventuele opmerkingen daarin dan handmatig als je lezers dat nodig hebben.
3. Opmerkingen volgden de verzoekgrenzen
Het bestand heeft twee %-opmerkingen: een notitie boven de macrodefinities en een TODO boven de codelijst. De hele-bestand- en geïnstrueerde runs lieten beide in het Engels. De segmenten-conditie vertaalde de TODO in twee van de drie runs, omdat de TODO toevallig in hetzelfde blok stond als een alinea die we ter vertaling hadden gestuurd. Twee hele-bestand-runs voegden ook een eigen opmerking toe na de package die ze invoegden.
Niets hiervan verandert de PDF. Het is wel van belang als de vertaalde bron teruggaat naar medeauteurs of een repository, waar een vertaalde TODO niet meer overeenkomt met het origineel en een extra opmerking in elke diff opduikt. De checker meldt vertaalde opmerkingen als waarschuwing, zodat je zelf kunt beslissen.
4. De structurele controles slaagden en de betekenis veranderde alsnog
Het abstract zegt: "een label dat 20% afwijkt is nog steeds nuttig." In drie van de negen runs zei het Chinees dat labels met een fout binnen 20% nog steeds nuttig zijn, waardoor een tolerantie een drempel wordt. Verschillende andere runs herschikten de zin zodat de "hoewel"-bijzin aan het verkeerde idee hing, en één werd moeilijk te volgen. Dit zijn beoordelingen door één lezer die het Chinees met het Engels vergelijkt, geen geblindeerde review, maar het punt hangt niet af van de exacte telling: elke structurele controle slaagde op die bestanden, omdat de 20\%, de macro en de accolades allemaal correct waren.
Twee andere wijzigingen waren prima maar het is goed ze te kennen. De hele-bestand-runs schreven \$12 als 12美元 ("12 Amerikaanse dollar"), wat de escaping-kwestie volledig omzeilt. Twee hele-bestand-runs lieten ook de meeste ~-koppelingen vóór \ref en \cite weg. Dat is onschadelijk in het Chinees, dat geen spaties tussen woorden zet, maar in een taal die dat wel doet, kan een ontbrekende koppeling een regelafbreking tussen "Tabel" en het nummer toestaan. De checker meldt koppelingen als waarschuwing, niet als fout.
Een structurele controle vertelt je dat het bestand nog werkt. Het kan je niet vertellen of het artikel nog hetzelfde zegt. Gebruik daarvoor een tweetalige lezing van het abstract, de beweringen en de getallen, zoals beschreven in onze gids over het beoordelen van een vertaald onderzoeksartikel.
Een werkwijze die standhoudt
-
Haal de bron op en controleer wat je ermee mag doen. Op arXiv bieden artikelen die in TeX zijn ingediend meestal hun bron aan via een Source-link op de abstractpagina of de Other formats-pagina, als een gzip-bestand of een tar-archief wanneer er meerdere bestanden zijn (arXiv-help). Vertalen voor eigen lezing is één ding. De vertaling publiceren is iets anders: arXiv's eigen niet-exclusieve licentie beperkt hergebruik door anderen, terwijl CC BY en CC BY-SA aanpassingen met naamsvermelding toestaan, en CC BY-NC-ND niet. Vraag het de auteurs bij twijfel.
-
Compileer eerst het origineel. Als het niet compileert vóór de vertaling, is niets wat je daarna leert betrouwbaar. Bewaar de originele PDF ter vergelijking.
-
Stel de doeltaal zelf in de preamble in. Voeg
ctexofbabeltoe zoals hierboven, compileer één keer met de Engelse tekst en commit die wijziging apart. -
Vertaal de body zonder de preamble en zonder verbatim-blokken. Gebruik een tool die LaTeX parseert, of stuur de body in stukken met expliciete regels, zoals in onze segmenten-conditie. TransLaTeX, een opensource-tool die hiervoor is gebouwd, vervangt LaTeX-constructies door tokens voordat de tekst naar een machinevertaler gaat. De documentatie zegt ook dat het de documentheader ongemoeid laat, geen macro's ondersteunt en alleen bestanden met één bestand aankan, zonder
\input. Zelfs een speciale tool laat de preamble-beslissing aan jou. -
Voer de structurele controle uit op elk bestandspaar.
python3 check_latex_translation.py main.tex main-zh.tex --keep ShelfmarkHet vergelijkt de preamble, commandonamen, volgorde van environments, labels, verwijzingen, citaties, bibliografiesleutels, wiskunde, verbatim-blokken, URL's, niet-escaped
%,&en#, accoladebalans, koppelingen, opmerkingen en alle termen die je wilt behouden. Verwacht dat de preamble-regel faalt na stap 3 wanneer je met het origineel vergelijkt; vergelijk in plaats daarvan met je bijgewerkte Engelse bestand. Voor een project dat over meerdere\input-bestanden is verdeeld, controleer je elk paar. -
Compileer en lees de PDF.
python3 compile_check.py main-zh.texHet meldt onopgeloste verwijzingen (
??), onopgeloste citaties ([?]) en ontbrekende glyphs. Open dan de PDF en lees het abstract, elke caption en elke tabel tegen het origineel. -
Doe een tweetalige lezing van de beweringen en getallen. Hier zouden onze drie gewijzigde zinnen zijn opgemerkt. Houd een korte vertaalwoordenlijst bij voor de technische termen van het artikel, zodat dezelfde term niet op drie manieren wordt vertaald.
Waar BookTranslator past
BookTranslators documentvertaler accepteert .tex-bestanden naast PDF, DOCX, EPUB, Markdown en andere gestructureerde formaten. De FAQ zegt dat het resultaat wordt teruggegeven in "een bruikbaar bestand in het juiste formaat wanneer dat formaat dat ondersteunt."
De productpagina beschrijft niet hoe het omgaat met LaTeX-macro's, wiskunde of de preamble, en we hebben dit voorbeeld voor dit artikel niet door BookTranslator gehaald. Welke tool je ook gebruikt, doe stap 1 tot en met 3 vóór het vertalen en stap 5 tot en met 7 erna. Een bestand dat een Engelstalige preamble behoudt, compileert nog steeds zonder Chinese tekst, en een gewijzigde bewering slaagt nog steeds voor elke structurele controle.
Als je alleen de PDF van een artikel hebt, niet de bron, is de werkwijze anders: zie onze gids over het vertalen van een onderzoeksartikel met behoud van de structuur. Als je bron Markdown is in plaats van LaTeX, geldt dezelfde splitsing tussen machinerie en proza, met andere valkuilen; die hebben we getest in Hoe Markdown-bestanden te vertalen.
Download de testbestanden
Alles uit deze test is vrij te hergebruiken:
- sample-source.tex: het Engelse voorbeeld van 98 regels;
- check_latex_translation.py: de structurele checker (alleen de Python-standaardbibliotheek);
- compile_check.py: compileert elk bestand zoals het is teruggegeven en met een Chinese configuratie, en telt onopgeloste verwijzingen, onopgeloste citaties en ontbrekende glyphs (vereist Tectonic en pdftotext);
- run_llm_latex_test.py: de drie promptcondities voor elke OpenAI-compatibele lokale server;
- de negen uitvoerbestanden in de outputs-map, met check-results.txt, compile-results.txt en results.csv.
Gerelateerde berichten





