Re: Creare un file di formato personalizzato

#69218
Up
0
Down
::

ansys” post=68366Potete spiegare meglio questo metodo per compilare? I tempi di compilazione si riducono?

Grazie
Orlando

Provo a spiegarlo in parole povere (e magari imprecise).

Anche quando compili un documento LaTeX (anziché plain TeX), il compilatore avviato è sempre pdftex (This is pdfTeX, Version 3.1415926-2.3-1.40.12 (TeX Live 2011)). Di suo, pdftex riconosce solo i comandi TeX, non quelli di LaTeX. Non conosce cioè il significato di \documentclass, \begin{document} eccetera. Dargli in pasto un file che inizia direttamente con \documentclass non potrebbe funzionare…

Questi comandi (e tutto il markup LaTeX) sono definiti nel file latex.ltx: sono oltre 7000 linee di codice. Chiaramente, ogni volta che si compila un documento LaTeX, se pdftex dovesse rileggere tutto quel file (e gli altri inclusi), impiegherebbe un tempo non trascurabile (ma anche evitabile: le modifiche a latex.ltx sono decisamente rare, anzi forse ormai sono parecchi lustri che non viene toccato).

L’idea è allora di dare in pasto a pdftex il file latex.ltx (in realtà credo sia pdflatex.tex) e memorizzare il suo stato alla fine della compilazione. Ciò avviene facendo un dump della sua memoria (esiste proprio la macro \dump, come vedi nel mio esempio precedente). Chiaramente, alla fine di questa “compilazione”, pdftex non ha prodotto alcun PDF (il codice è tutto preambolo), perché sul \dump si interrompe. Il file di formato è proprio questo dump.

Alla compilazione effettiva di un documento, pdflatex richiama pdftex dicendogli di caricare preliminarmente lo stato salvato (il dump della memoria), ovvero un file pdflatex.fmt (o simile).

L’idea è allora di far elaborare a pdftex tutto un preambolo, memorizzarne il suo stato, e ottenere così un file di formato personalizzato (diciamo tikzlatex.fmt). Specificando a pdftex il formato tikzlatex, si evita che ogni volta debba rileggere ed elaborare tutto il preambolo.

Questo aumenta la velocità di compilazione, soprattutto se si caricano molti pacchetti ingombranti. Ovviamente, una piccola modifica al preambolo richiede di rigenerare il file di formato, quindi non è una cosa conveniente su preamboli che vengono modificati spesso. Credo invece che possa tornare molto utile per un’applicazione come QTikZ.

Ho fatto alcune prove con questo semplice file:
`\begin{document}
\begin{tikzpicture}
\fill[black!30] (5,5) — (12,9) — (12,2);
\fill[blue!30] (0,5) — (0,9) — (12,9) — (5,5);
\fill[black!10] (0,5) — (0,2) — (12,2) — (5,5);
\draw[dashed,thick] (0,2) — (0,9) — (12,9) — (12,2) — (0,2);
\draw[thick,blue](0,5) — (5,5) — (12,9);
\draw[thick,blue] (5,5) — (12,2);
\end{tikzpicture}
\end{document}
`

Su Windows (MikTeX), col formato standard ci vuole una ventina di secondi a fare 20 compilazioni. Con il formato personalizzato ne impiega circa 7. In realtà, a ripensarci, mi sono reso conto di aver commesso un piccolo errore nell’impostare il test: il file tikzlatex.fmt stava nella cartella corrente, mentre il file pdflatex.fmt doveva andare a cercarselo tra gli alberi TeX. In ogni caso la differenza è notevole. Con TeXlive (su Ubuntu) ho messo il file di formato nell’albero locale: la differenza è circa 2.9 contro 5.5 secondi.

Con disegni più seri è normale che la differenza si riduca. Solo usandolo si potrebbe capire quanto vale. Nel mio caso, con un preambolone, fa perfettamente il suo lavoro!
🙂

Comunque sto cercando un modo per far lavorare tikzlatex.fmt con QTikZ, un po’ di pazienza… 😀 Eventualmente, poi aggiorno la relativa discussione. 😉

Ciao,
Antonio

Go to top