L'offre gratuite d'Overleaf interrompt désormais toute compilation au bout de 10 secondes, et beaucoup de thèses qui passaient sans problème se retrouvent du mauvais côté de cette limite. Le conseil habituel est de payer ou de raccourcir le document, mais ce n'est presque jamais la longueur du texte qui coûte du temps. Chronométrer un vrai projet, variante par variante, montre où il passe.
Le projet est un mémoire de master d'exemple : quatre chapitres, natbib avec un fichier .bib, une table des matières, deux graphiques pgfplots et un schéma TikZ. Il est compilé avec Tectonic 0.16.9 sur un Mac M1, avec la même commande que celle de l'onglet LaTeX de l'application de bureau 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 désactive le shell escape, ce qui compte plus bas.
Une compilation, ce sont trois passes TeX
La première chose que montre le log, c'est que « compiler » n'est pas une seule exécution :
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 première passe écrit les clés de citation et les titres de sections dans main.aux. BibTeX transforme les clés en bibliographie, la deuxième passe la compose, ce qui décale les numéros de page, puis une troisième passe corrige la table des matières et les renvois. latexmk et Overleaf font la même boucle. Tout ce qui est lent dans le document est payé trois fois.
Où passe le temps
Chaque variante a été compilée deux fois, cache de paquets déjà chaud, et chronométrée avec une petite boucle :
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 | Compilation complète | Passes TeX |
|---|---|---|
Thèse complète, graphiques en samples=500 et samples=300
|
14.4–15.4 s | 3 |
Mêmes graphiques en samples=200 et samples=100
|
9.2–9.4 s | 3 |
Mêmes graphiques en samples=100 et samples=60
|
7.8 s | 3 |
| Mêmes courbes lues depuis des fichiers CSV, tous les points conservés | 6.7–6.8 s | 3 |
Sans figures (chaque tikzpicture remplacé par un cadre) |
5.5–5.9 s | 3 |
| Version japonaise de la thèse complète (xeCJK, polices Hiragino) | 22.8 s | 3 |
Le texte, la bibliographie et la table des matières réunis prennent moins de 6 secondes. Les figures prennent les 9 autres, et presque tout vient de pgfplots qui calcule les courbes. Une fonction comme {40 + 35*exp(-((mod(x,24)-8)^2)/3) + ...} est évaluée point par point dans l'arithmétique en virgule fixe de TeX lui-même, à chacune des trois passes. Tracer les mêmes 500 points depuis un fichier coûte environ une seconde au total.
Réduire samples est le levier évident, et il marche, mais ça se voit. À 100 échantillons, les pics des heures de pointe dans le graphique hebdomadaire deviennent des angles. À 200, la compilation passe juste sous les 10 secondes et les courbes paraissent presque identiques, même si certaines petites ondulations disparaissent. Lire les points depuis un CSV les garde tous et c'est plus rapide que les deux :
% 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};
Pour une thèse, c'est d'ailleurs souvent la version la plus honnête, puisque les valeurs tracées sortent de toute façon de Python ou de R.
La version japonaise est l'autre coût mesurable : à figures identiques, elle est environ 50 % plus lente que la version anglaise, et les seules différences sont le texte japonais, xeCJK et les polices système qu'il charge. Sur une machine à froid, il y en a un de plus : la première exécution de Tectonic avec un cache vide a téléchargé 427 fichiers de paquets et de polices, soit 46 Mo, avant de composer quoi que ce soit.
La solution habituelle demande le shell escape
La page d'aide d'Overleaf sur les délais de compilation suggère d'externaliser les images TikZ, pour que chacune soit compilée une seule fois et réutilisée en PDF. La bibliothèque external de tikz y parvient en faisant lancer par TeX un second processus TeX par figure, c'est-à-dire une commande shell. Avec --untrusted, c'est refusé :
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'
C'est voulu. Le shell escape permet à un fichier .tex d'exécuter n'importe quelle commande : acceptable pour votre propre thèse, pas pour un ZIP reçu de quelqu'un d'autre. Sans lui, on obtient le même effet à la main en deux étapes : mettre chaque figure dans son propre document standalone, le compiler une fois, puis inclure le PDF dans la thèse avec \includegraphics.
Trouver l'erreur dans un projet à plusieurs fichiers
La dernière lenteur est humaine. TeX signale l'erreur dans le fichier \input qu'il est en train de lire, et Tectonic l'affiche sous la forme error: chapters/results.tex:50: Undefined control sequence. Le log de compilation de l'application en fait une ligne cliquable avec une seule expression régulière, et se rabat sur le format TeX classique, où l'erreur commence par ! et le numéro de ligne suit quelques lignes plus loin sous la forme 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()))
Compilée sur votre propre machine, la thèse complète ne rencontre jamais de limite de 10 secondes. Sur l'offre gratuite d'Overleaf, tracer à partir de fichiers de données plutôt que de formules est ce qui ramène celle-ci en dessous. L'application de bureau qui a servi à ces compilations est gratuite sur la page de téléchargement d'osFoundry.


Top comments (0)