El plan gratuito de Overleaf ahora corta cualquier compilación a los 10 segundos, y muchas tesis que antes compilaban sin problema quedan del lado equivocado. El consejo habitual es pagar o reducir el documento, pero casi nunca es la longitud del texto lo que cuesta tiempo. Medir un proyecto real, variante por variante, muestra a dónde se va.
El proyecto es una tesis de máster de ejemplo: cuatro capítulos, natbib con un archivo .bib, índice, dos gráficos de pgfplots y un diagrama de TikZ. Se compila con Tectonic 0.16.9 en un Mac M1, con el mismo comando que ejecuta la pestaña LaTeX de la aplicación de escritorio de 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 desactiva el shell escape, algo que importa más abajo.
Una compilación son tres pasadas de TeX
Lo primero que enseña el log es que "compilar" no es una sola ejecución:
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 primera pasada escribe en main.aux las claves de las citas y los títulos de las secciones. BibTeX convierte las claves en una bibliografía, la segunda pasada la maqueta, y eso mueve los números de página, así que una tercera pasada corrige el índice y las referencias. latexmk y Overleaf hacen el mismo ciclo. Todo lo que sea lento en el documento se paga tres veces.
Dónde se va el tiempo
Cada variante se compiló dos veces con la caché de paquetes ya caliente, y se midió con un bucle pequeño:
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 | Compilación completa | Pasadas de TeX |
|---|---|---|
Tesis completa, gráficos con samples=500 y samples=300 | 14.4–15.4 s | 3 |
Los mismos gráficos con samples=200 y samples=100 | 9.2–9.4 s | 3 |
Los mismos gráficos con samples=100 y samples=60 | 7.8 s | 3 |
| Las mismas curvas leídas de archivos CSV, con todos los puntos | 6.7–6.8 s | 3 |
Sin figuras (cada tikzpicture sustituido por un recuadro) | 5.5–5.9 s | 3 |
| Versión japonesa de la tesis completa (xeCJK, fuentes Hiragino) | 22.8 s | 3 |
El texto, la bibliografía y el índice juntos tardan menos de 6 segundos. Las figuras se llevan los otros 9, y casi todo eso es pgfplots calculando las curvas. Una función como {40 + 35*exp(-((mod(x,24)-8)^2)/3) + ...} se evalúa punto por punto con la aritmética de punto fijo del propio TeX, en cada una de las tres pasadas. Dibujar esos mismos 500 puntos desde un archivo cuesta aproximadamente un segundo en total.
Bajar samples es la palanca más evidente y funciona, pero se nota. Con 100 muestras, los picos de la hora punta en el gráfico semanal se convierten en esquinas. Con 200 la compilación baja justo de los 10 segundos y las curvas se ven casi igual, aunque se pierden algunas ondulaciones pequeñas. Leer los puntos de un CSV conserva todos y es más rápido que cualquiera de las dos opciones:
% 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}; En una tesis esta suele ser además la forma más honesta, porque los valores del gráfico salieron de Python o de R desde el principio.
La versión japonesa es el otro coste medible: con figuras idénticas tarda un 50 % más que la inglesa, y las únicas diferencias son el texto japonés, xeCJK y las fuentes del sistema que carga. En una máquina en frío hay una más: la primera ejecución de Tectonic con la caché vacía descargó 427 archivos de paquetes y fuentes, 46 MB, antes de componer nada.
La solución habitual necesita shell escape
La página de ayuda de Overleaf sobre los timeouts de compilación sugiere externalizar las imágenes de TikZ, de modo que cada una se compile una sola vez y se reutilice como PDF. La biblioteca external de tikz lo hace haciendo que TeX lance un segundo proceso de TeX por figura, es decir, un comando de shell. Con --untrusted eso se rechaza:
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' Es a propósito. El shell escape permite que un archivo .tex ejecute cualquier comando, algo aceptable para tu propia tesis y no para un ZIP que te ha mandado otra persona. Sin él, el mismo efecto se consigue a mano en dos pasos: poner cada figura en su propio documento standalone, compilarlo una vez e incluir el PDF en la tesis con \includegraphics.
Encontrar el error en un proyecto de varios archivos
La última parte lenta es humana. TeX informa del error en el archivo \input que esté leyendo en ese momento, y Tectonic lo imprime como error: chapters/results.tex:50: Undefined control sequence. El log de compilación de la aplicación convierte eso en una línea en la que se puede hacer clic con una sola expresión regular, y recurre al formato clásico de TeX, donde el error empieza con ! y el número de línea aparece unas líneas después como 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())) Compilada en tu propio equipo, la tesis completa nunca llega a un límite de 10 segundos. En el plan gratuito de Overleaf, graficar desde archivos de datos en lugar de fórmulas es lo que deja esta por debajo. La aplicación de escritorio con la que se hicieron estas compilaciones es gratuita en la página de descarga de osFoundry.



