Dev.to · 5 min read

Perché compilare una tesi in LaTeX richiede più di 10 secondi

Perché compilare una tesi in LaTeX richiede più di 10 secondi

Il piano gratuito di Overleaf ora interrompe qualsiasi compilazione dopo 10 secondi, e molte tesi che prima si compilavano senza problemi finiscono dalla parte sbagliata di questo limite. Il consiglio di solito è pagare o accorciare il documento, ma raramente è la lunghezza del testo a costare tempo. Cronometrare un progetto reale, variante per variante, mostra dove va a finire. Il progetto è una tesi magistrale di esempio: quattro capitoli, natbib con un file .bib, un indice, due grafici pgfplots e un diagramma TikZ. Viene compilato con Tectonic 0.16.9 su un Mac M1, con lo stesso comando che esegue la scheda LaTeX dell'app desktop di osFoundry: let mut cmd = Command::new(executable); cmd.args(["-X", "compile", "--untrusted", "--outdir"]) .arg(&root) .current_dir(&root) .env("TECTONIC_UNTRUSTED_MODE", "1") .kill_on_drop(true); --untrusted disattiva lo shell escape, cosa che conta più avanti. Una compilazione sono tre passate di TeX La prima cosa che mostra il log è che «compilare» non è una sola esecuzione: note: Running TeX ... note: Running BibTeX on main.aux ... note: Rerunning TeX because bibtex was run ... note: Rerunning TeX because "main.aux" changed ... note: Running xdvipdfmx ... La prima passata scrive in main.aux le chiavi delle citazioni e i titoli delle sezioni. BibTeX trasforma le chiavi in una bibliografia, la seconda passata la compone e questo sposta i numeri di pagina, quindi una terza passata corregge l'indice e i riferimenti. latexmk e Overleaf fanno lo stesso ciclo. Tutto ciò che nel documento è lento si paga tre volte. Dove va il tempo Ogni variante è stata compilata due volte con la cache dei pacchetti già calda, e cronometrata con un piccolo ciclo: for d in full samples-100 csv-table no-figures; do ( cd "$d" start=$(python3 -c 'import time; print(time.time())') TECTONIC_UNTRUSTED_MODE=1 tectonic -X compile --untrusted main.tex > run.log 2>&1 python3 -c "import time; print('$d', round(time.time() - $start, 1), 's')" grep -c 'Running TeX\|Rerunning TeX' run.log ) done Variante Compilazione completa Passate di TeX Tesi completa, grafici con samples=500 e samples=300 14.4–15.4 s 3 Stessi grafici con samples=200 e samples=100 9.2–9.4 s 3 Stessi grafici con samples=100 e samples=60 7.8 s 3 Stesse curve lette da file CSV, tutti i punti conservati 6.7–6.8 s 3 Senza figure (ogni tikzpicture sostituito da un riquadro) 5.5–5.9 s 3 Versione giapponese della tesi completa (xeCJK, font Hiragino) 22.8 s 3 Testo, bibliografia e indice insieme richiedono meno di 6 secondi. Le figure si prendono gli altri 9, e quasi tutto è pgfplots che calcola le curve. Una funzione come {40 + 35*exp(-((mod(x,24)-8)^2)/3) + ...} viene valutata punto per punto nell'aritmetica a virgola fissa di TeX, a ognuna delle tre passate. Disegnare gli stessi 500 punti da un file costa in tutto circa un secondo. Ridurre samples è la leva più ovvia e funziona, ma si nota. A 100 campioni i picchi dell'ora di punta nel grafico settimanale diventano spigoli. A 200 la compilazione scende appena sotto i 10 secondi e le curve sembrano quasi uguali, anche se alcune piccole ondulazioni spariscono. Leggere i punti da un CSV li conserva tutti ed è più veloce di entrambe le opzioni: % before: computed on every pass \addplot[domain=0:168, samples=500, thick, blue] {41 + 33*exp(-((mod(x,24)-8)^2)/3.2) + ...}; % after: the same 500 points, written once by the script that made the data \addplot[thick, blue] table[x=hour, y=model, col sep=comma]{week.csv}; Per una tesi di solito è comunque la versione più onesta, perché i valori tracciati escono in origine da Python o da R. La versione giapponese è l'altro costo misurabile: a figure identiche è circa il 50% più lenta di quella inglese, e le uniche differenze sono il testo giapponese, xeCJK e i font di sistema che carica. Su una macchina a freddo ce n'è un altro: la prima esecuzione di Tectonic con la cache vuota ha scaricato 427 file di pacchetti e font, 46 MB, prima di comporre qualsiasi cosa. La soluzione abituale richiede lo shell escape La pagina di aiuto di Overleaf sui timeout di compilazione suggerisce di esternalizzare le immagini TikZ, in modo che ciascuna venga compilata una volta sola e riutilizzata come PDF. La libreria external di tikz lo fa facendo avviare a TeX un secondo processo TeX per ogni figura, cioè un comando di shell. Con --untrusted viene rifiutato: warning: chapters/method.tex:20: runsystem(xelatex -halt-on-error -interaction=batchmode -jobname "main-figure0" ...)...disabled. error: chapters/method.tex:20: Package tikz Error: Sorry, the system call 'xelatex ...' did NOT result in a usable output file 'main-figure0' È voluto. Lo shell escape permette a un file .tex di eseguire qualsiasi comando: va bene per la propria tesi, non per uno ZIP mandato da qualcun altro. Senza, lo stesso effetto si ottiene a mano in due passaggi: mettere ogni figura in un proprio documento standalone, compilarlo una volta e includere il PDF nella tesi con \includegraphics. Trovare l'errore in un progetto con più file L'ultima parte lenta è umana. TeX segnala l'errore nel file \input che sta leggendo, e Tectonic lo stampa come error: chapters/results.tex:50: Undefined control sequence. Il log di compilazione dell'app lo trasforma in una riga cliccabile con una sola espressione regolare, e ripiega sul formato classico di TeX, dove l'errore comincia con ! e il numero di riga compare alcune righe dopo come l.50: const tectonic = /^error:\s+(.+?):(\d+):\s*(.+)$/.exec(line) if (tectonic) return [{ file: tectonic[1].replace(/^\.\//, ''), line: Number(tectonic[2]), message: tectonic[3] }] if (!line.startsWith('! ')) return [] const next = lines.slice(index + 1, index + 5).find((part) => /^l\.\d+/.test(part.trim())) Compilata sul proprio computer, la tesi completa non incontra mai un limite di 10 secondi. Sul piano gratuito di Overleaf, tracciare da file di dati invece che da formule è ciò che riporta questa tesi sotto la soglia. L'app desktop con cui sono state eseguite queste compilazioni è gratuita nella pagina di download di osFoundry.

This is a summary aggregated from Dev.to. Read the complete article on the original site:

Read full article at Dev.to

More Programming & Dev News