Concilio dei topini

Il manuale di LaTeX

Topino 106

Ho finito di leggere il manuale di $\LaTeX$. Per fortuna anche questo qui ha richiesto meno tempo del TeXbook, perché è 200 pagine più corto, e perché le ultime 40 in realtà sono l’indice analitico, e perché è molto meno tecnico, e perché Lamport è più bravo di Knuth a scrivere le cose in modo chiaro e preciso anziché cercare di suonare simpatico.

Innanzitutto voglio sfoggiare le mie nuove abilità rifacendo in LaTeX l’esempio con i cuoricini che avevo scritto nella recensione del TeXbook:

\documentclass{article}

\begin{document}
    
    \newsavebox{\heart}
    \setlength{\unitlength}{1ex}
    
    \begin{lrbox}{\heart}

        \begin{picture}(4,3.414)(-2,-2.414)
        
            \qbezier[40](0,-2.414)(-0.853,-1.560)(-1.707,-0.707)
            \qbezier[10](-1.707,-0.707)(-2,-0.382)(-2,0)
            \qbezier[20](-2,0)(-2,1)(-1,1)
            \qbezier[20](-1,1)(0,1)(0,0)
            \qbezier[20](0,0)(0,1)(1,1)
            \qbezier[20](1,1)(2,1)(2,0)
            \qbezier[10](2,0)(2,-0.382)(1.707,-0.707)
            \qbezier[40](1.707,-0.707)(0.853,-1.560)(0,-2.414)

        \end{picture}

    \end{lrbox}
    
    \newsavebox{\heartline}
    \newcommand{\h}{\usebox{\heart}\hspace{\stretch{1}}}
    \savebox{\heartline}[\textwidth]{\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\h\hspace{\stretch{-1}}}
    
    \newcommand{\heartpar}{\noindent\usebox{\heartline}\par\vfill}
    
    \heartpar\heartpar\heartpar\heartpar\heartpar\heartpar\heartpar\heartpar
    \heartpar\heartpar\heartpar\heartpar\heartpar\heartpar\heartpar\heartpar
    
\end{document}

Il risultato è il seguente:

Da confrontare con quello in TeX:

È meglio LaTeX o TeX? Vantaggio di LaTeX: sono dei veri cuori perdinci!! Vantaggio di TeX: ce ne sono uno svacco di più. Vabbé basta generarne di più anche con LaTeX, no? No: perché a mettere più cuori di così nella pagina finiva la memoria di LaTeX. Finché la pagina non è completa è tutta in memoria e deve starci entro i 40 MB totali che sono suddivisi in una decina di sezioni, ne esauriva una da 5 MB. È che i comandi dell’ambiente picture che ho usato sono completamente implementati in TeX. In particolare il primo argomento tra quadre di \qbezier è il numero di puntini da usare per disegnare il tratto di curva, tutti i calcoli per la curva di Bezier vengono fatti in TeX con gli interi e poi i puntini vengono piazzati usando spaziature e riquadri.

Ok, altra soluzione: il manuale di LaTeX quando spiega l’ambiente picture—che fa abbastanza cagare—dice che tutte le varie limitazioni dovute all’implementazione in TeX puro si possono eliminare con \usepackage{pict2e} che abilita le funzioni che dipendono dal device driver. La documentazione di pict2e comincia così:

Here’s a quote from the obsolete original official version of the pict2e package (1993–2003):

The package pict2e that is mentioned in the 2nd edition of “LATEX: A Document Preparation System” has not yet been produced. It is unlikely that the LATEX3 Project Team will ever produce this package thus we would be very happy if someone else creates it.

Finally, someone has produced a working implementation of the pict2e package. 🙂

Certo Lamport che eri stato proprio un bischero, a menzionare una cosa che non esisteva. Più che “menzionare”, l’avevi proprio documentata per benino. Comunque dopo 10 anni qualcuno la fece davvero, ma ormai nel 2021 esiste TikZ e si usa quello. Il manuale di TikZ sembra molto carino, però è di 1321 pagine A4 a colonna larga e font piccolo, ed è “pieno” di “virgolette” (“user-friendliness” è la parola più preoccupante da trovare tra virgolette).

Cosa ho imparato da questo manuale?

A parte aver aggiornato il miei cuori tipografici dagli anni ’80 agli anni ’90?

  1. Nella sezione “Why LaTeX?” (risposta: perché ti obbligano per pubblicare) spiega che con LaTeX puoi definire le tue macro, quindi se a metà ti viene in mente di cambiare la tua notazione per i prodotti scalari, puoi cambiarla senza risostituirli tutti a mano. Ricordo che 8 anni fa, quando iniziai a usare LaTeX, questa mi sembrava una gran figata. Con l’età mi sono convertito ed adesso cerco il più possibile di usare roba standard perché altrimenti diventa un problema lavorare insieme ad altre persone, o copiare il codice da un’altra parte. Quindi, perché LaTeX? Perché???

Adesso userei un cerca e sostituisci con regexp nel mio editor di testo (TextMate, mac only los3rz) per modificare tutte le occorrenze del prodotto scalare.

  1. A un certo punto all’inizio ci sono due paragrafetti intitolati “Turning Ideas into Input” in cui spiega che in realtà il vero lavoro è capire cosa scrivere e non bisogna farsi distrarre da LaTeX. Consiglia anche la lettura di 6 manuali di stile (sì certo li leggerò), e poi via con 300 pagine per capire come usare LaTeX.
  2. Però riguardo ai manuali di stile dice che preferisce mettere i segni di interpunzione fuori dai segni bilanciati. Cioè in Inglese il punto si mette dentro le virgolette, “così.” In Italiano invece va fuori, “così”. OVVIAMENTE il modo sensato è quello Italiano e anche Lamport è d’accordo perché è un programmatore. Sta anche spiegato nel Jargon File.
  3. Se una frase finisce con una maiuscola, bisogna mettere \@ prima del punto, altrimenti la spaziatura dopo il punto viene singola anziché doppia.
  4. A quanto pare Lamport vorrebbe che usassimo \( e \) anziché i dollari, o addirittura \begin{math} e \end{math} o \begin{displaymath} ... \end{displaymath}. Stai fresco Leslie.
  5. Per andare a capo forzatamente impedendo un’interruzione di pagina usare \\* al posto di \\.
  6. Non lasciare una linea vuota prima di una formula! Mai! Di questa cosa in qualche modo me n’ero accorto, quindi non sono matto! Io di solito lasciavo la linea vuota perché in TextMate control-Q giustifica il paragrafo in ASCII nel sorgente, dove i paragrafi sono delimitati dalle linee vuote. La soluzione è mettere un % nella linea, fa contento LaTeX che ignora la newline e anche control-Q che gestisce in modo intelligente i commenti anche se non ho ancora capito bene come.
  7. Bisogna usare \emph{fagiolino} anziché {\em fagiolino} per sistemare le spaziature. Non spiega perché, però adesso l’ho capito perché c’era spiegato nel TeXbook: le lettere in corsivo tendono a mangiarsi un po’ di spazio alla loro destra e quindi bisogna aggiungerci un piccolo spazietto alla fine a seconda di qual’è l’ultima lettera. Si chiama “italic correction”. In TeX si fa con \/.
  8. Nella sezione “Helpful Hints” spiega che il modo migliore per evitare gli errori con LaTeX è non fare errori. Grazie Lamport! In qualche modo la sua frase ha senso, è un modo sofisticato per dire che il debug in LaTeX è allucinante.
  9. I comandi possono essere usati come ambienti. Ad esempio si può fare \begin{em} ... \end{em} anziché {\em ...}. Internamente \begin{roba} usa \roba, e \end{roba} usa \endroba (è il motivo per cui \newcommand si rifiuta di definire comandi che iniziano per \end), però \endem non è definito, sicché ho scoperto che \end{roba} non fa niente se \endroba non esiste.
  10. A un certo punto dice “Who on Earth is ever going to use a boldface sans serif or an italic typewriter type style?” Beh io al liceo tantissimo, ok? Cazzo vuoi?
  11. Lamport tenta inutilmente di convicerti a usare sempre le graffe per delimitare gli argomenti anche quando non serve. Non c’è verso che mi convinca a usare x^{2} al posto di x^2 solo perché nel suo mondo dei sogni un giorno LaTeX avrebbe avuto una sintassi chiara con degli errori sensati.
  12. L’ambiente tabbing per manipolare le tabulazioni. È comodissimo! Cioè, sarebbe comodissimo se mi servissero le tabulazioni, ma non mi è mai capitato.
  13. Quando si includono i file usando \include, si possono attivare/disattivare i singoli file per fare prima a compilare, senza che le reference si rompano troppo. Usare \includeonly{file1,...} prima di \begin{document}. Inoltre \include non dà errore se il file non esiste, si lamenta e basta. Immagino per evitare di dover subito creare tutti gli stub.
  14. L’ambiente \begin{filecontents}{nomefile} ... \end{filecontents} serve per scrivere dei file. Ci si può copiare dentro i file .aux etc. e poi usare \nofiles per congelare le cross-reference, l’indice, etc. ad esempio per inviare il file a qualcuno o conservare una versione finale. Il manuale insiste che si può usare solo prima di \documentclass ma non è (più?) vero.
  15. Quando LaTeX fa fatica a decidere dove andare a capo, metterci uno \sloppy per lasciargli allargare gli spazi tra le parole.
  16. Per suggerire/inibire le interruzioni di riga e di pagina, usare \(no)(line|page)break[numero tra 1 e 4]. Il 4 significa obbligo.
  17. \newcounter andrebbe usato solo prima di \begin{document}. Va bene, dai, questa te la concediamo Leslie.
  18. Come unità di lunghezza usare em in orizzontale e ex in verticale.
  19. Aggiungere un fattore moltiplicativo a una lunghezza variabile distrugge la variabilità. NOOOOOOOOOOOOO
  20. \setto(width|height|depth) misurano una dimensione dell’argomento e la salvano in una variabile.
  21. \hspace* e \vspace* con gli asterischi non spariscono quando sono adiacenti a un’interruzione di riga o di pagina.
  22. In \begin{minipage} ... \end{minipage} si possono usare le note a piè pagina, e altre mille funzionalità che immagino siano molto utili a chi scrive manuali di LaTeX per mostrare degli esempi ma a me non servono.
  23. \raisebox non solo solleva le scatole, ma—udite udite—permette di impostarne arbitrariamente l’altezza e la profondità. Lamport ci tiene a far notare che in pochi si rendono conto delle reali potenzialità delle scatole.
  24. Lo sapevate che in realtà molti ambienti di LaTeX sono delle trivlist? Come vi sentite adesso che lo sapete?
  25. \makebox, \framebox, etc. supportano un primo argomento opzionale tra parentesi TONDE che specifica larghezza e altezza in unità di \unitlength (default 1 pt).
  26. L’ambiente picture è rientrante, utilissimo negli anni ’90.
  27. Lamport si raccomanda di usare solo ed esclusivamente informazioni bibliografiche controllate da una persona di fiducia. Non riesco a immaginare in che modo sia rimasto scottato da un riferimento errato.
  28. In BibTeX (e quindi suppongo anche BibLaTeX visto che BibTeX non si usa più) ci sono le cross reference, indicate con CROSSREF=... nel file .bib. Cioè per citare un libro e un capitolo del libro, mettere un’entry per ognuno e poi mettere la crossref nell’entry del capitolo puntandola all’entry del libro. Ed è per questo che quando scarichi la citazione in formato BibTeX c’è BOOKTITLE che duplica TITLE! Perché è il nome da mostrare sulle crossref! Finalmente ho capito!
  29. Le graffe e le quadre dei comandi predefiniti di LaTeX formano dei gruppi, cioè gli assegnamenti non globali fatti lì dentro spariscono all’uscita dal gruppo. Mentre in TeX e se definisci le tue macro con \newcommand le graffe non delimitano un gruppo, delimitano solo l’argomento e poi spariscono. PERCHÉ QUESTO DOPPIO STANDARD? In passato mi aveva confuso un sacco questa cosa, non ci venivo a capo, infatti alla fine non avevo capito che in TeX gli assegnamenti sono locali…
  30. Le spaziature delle righe in \begin{tabular} ... \end{tabular} sono impostate con degli strut cioè delle scatole invisibili che occupano l’altezza desiderata. Quindi se qualcosa va storto quando si piazza un simbolo molto alto nel testo bisogna tener conto dello strut e magari alzarlo con l’argomento opzionale di \\.
  31. \noindent non ha effetto se non all’inizio del paragrafo. Come cavolo è implementato?? Con \unskip? Quali sono le implicazioni??
  32. Si possono sparare tanti \footnotemark di fila e poi i loro \footnotetext, però bisogna sistemare a mano il contatore footnote perché viene incrementato da ogni \footnotemark.
  33. Ho finalmente capito cosa sono i comandi robusti ovvero non fragili! Sono i comandi “puri”, cioè che svolgono la loro funzione solo espandendo macro anziché eseguendo istruzioni che alterano lo stato di TeX, come assegnare variabili o definire nuovi comandi, e quindi quando compaiono in un \edef e credo anche in un \write e vengono espansi producono qualcosa di sensato anziché un mischio di cose espanse e istruzioni che non possono essere eseguite in un contesto di sola espansione. E quindi il \protect di LaTeX sarà il \noexpand di TeX. Lamport si è sforzato di chiamare le cose in un modo digeribile dai non programmatori, il risultato è che i programmatori non capiscono e i non programmatori tanto non capiscono lo stesso.
  34. Nelle ultime tot cose che ho scritto in LaTeX evitavo sempre, come questione di stile, di mettere due titoli sezione-sottosezione consecutivi. Mi sforzavo di scrivere almeno una piccola introduzione prima di cominciare la sottosezione. Lamport decisamente se ne frega e quando l’ho notato mi sono chiesto perché io me ne stia preoccupando così rigorosamente e non riesco a ricordare quando mi sia venuta fuori l’abitudine. Devo smettere perché mi ha fatto perdere un sacco di tempo.
  35. C’è scritto che \pagenumbering{stile} ridefinisce \thepage come \stile{page}. Visto che i comandi per formattare i numeri sono \arabic, \roman, etc. di conseguenza si imposta il modo di formattare il numero di pagina con \pagenumbering{arabic}, \pagenumbering{roman}, etc. Non viene menzionato \pagenumbering{gobble} che io uso spesso e che fa sparire il numero di pagina, quindi ho dedotto che semplicemente \gobble è un comando di LaTeX che mangia un argomento e non sputa fuori niente, però invece non esiste. Esiste \@gobble che però lavora con i singoli caratteri e quindi si mangerebbe una graffa anziché l’argomento tra graffe. Mi è venuta fame.

(Pausa cioccolatino)

  1. \twocolumn ha un argomento opzionale per aggiungere un testo che occupa due colonne prima di iniziare col testo in colonne. Perché non si può mettere il testo a mano prima del \twocolumn? Perché parte in una nuova pagina.
  2. \title, \author e \date andrebbero messi prima di \begin{document}. Perché? Mai fatto. Ho l’impressione che Lamport rompa un sacco i coglioni su tanti dettagli a caso per sue questioni mentali di eleganza. D’altro canto, a volte LaTeX non funziona e non capisco perché.
  3. Mi sono reso conto che il fatto che x_\text{roba} funzioni è inquietante. Perché ad esempio x_\sqrt{roba} no. Il comando \sqrt è fragile. Coincidenze? I comandi con argomenti in TeX si mangiano o il token successivo (un carattere o una sequenza che comincia con \) o il gruppo delimitato da graffe successivo. Quindi se _ si comportasse come un’onesta macro dovrebbe mangiarsi solo \text e non mettere roba a pedice, invece ce lo mette. E alla luce delle recenti scoperte, i problemi con \sqrt dipenderanno da operazioni non pure fatte da \sqrt che probabilmente avrà bisogno di fare qualche calcolo aritmetico per decidere come dimensionare il simbolo di radice. E quindi ipotizzo che TeX quando arriva a _ continua a espandere finché non vede qualcosa che si può mangiare, e poi se lo mangia, anziché cercare subito un gruppo senza espanderlo come quando cerca gli argomenti per le macro. Quindi \text una volta espanso sputerà fuori un gruppo che poi TeX butta dentro a _ perché i delimitatori dei gruppi non vengono espansi essendo operazioni primitive.
  4. Usare \bmod per scrivere “mod”. Io mi sbaglio sempre e uso \mod e non funziona niente!!
  5. Il comando \boldmath serve per scrivere le formule in grassetto (anche i caratteri greci!) però è strano da usare, va messo per forza fuori dai dollari: \boldmath $roba$ \unboldmath, quindi per usarlo dentro a una formula bisogna metterlo in un’\mbox. Ma infatti adesso si usa \boldsymbol{x} che non ricordo se è definito da amsmath o amssymb.
  6. Il comando \value{contatore}, che serve per dare in input il valore di un contatore a una qualche operazione interna (come impostare un’altro contatore), non va MAI preceduto con \protect. Perché? Se \protect è veramente \noexpand, e \value{contatore} sputa fuori \count\rob@contatore, non riesco proprio a immaginare cosa dovrebbe fare TeX.
  7. Lamport ammette che qualcuno potrebbe non trovarsi d’accordo su come LaTeX sta posizionando i float. Il consiglio che io dò di solito se mi chiedono come fare a posizionare una figura in un certo punto, è non usare \begin{figure} ... \end{figure} ma fare \begin{center} ... \end{center} e fanculo. Il consiglio che dà Lamport è studiarsi attentamente un bell’elenco di regoline e di parametri e ragionare con calma sul vero motivo per cui LaTeX non sta posizionando la figura dove vogliamo applicando mentalmente lo stesso algoritmo che LaTeX impiega per piazzare le figure. Auguri per la vostra scadenza…
  8. \bibitem, il comando per inserire a mano una reference se non usi BibLaTeX, ha un argomento opzionale per specificare il numero, altrimenti fa una numerazione sequenziale come ti aspetti. Però non ti aspetti che il contatore che usa è enumiv, nientemeno che il contatore del quarto livello di nidificazione delle liste numerate. Perché? Avevano finito i contatori?? In effetti prima di eTeX c’erano solo 256 registri, quindi per programmare LaTeX si saranno dati un’obiettivo tipo “non occupiamo più di X contatori” e quindi riciclano il più possibile quelli inutili.
  9. \nocite{cite_key} serve per far comparire un riferimento in bibliografia anche se nel testo non è citato.
  10. Quando usi \- per indicare un modo legale di spezzare una parola per andare a capo, in automatico tutti gli altri modi riconosciuti diventano illegali.
  11. \enlargethispage{length} e \enlargethispage*{length} fanno quello che promettono, e con l’asterisco si impegna di più.
  12. Le spaziature verticali di TeX \bigskip, \medskip e \smallskip sono ufficiali anche in LaTeX.
  13. \addvspace è come \vspace però gli \addvspace consecutivi si concatenano prendendo solo la massima tra le spaziature richieste.
  14. Negli argomenti di \makebox etc. in cui va specificata una lunghezza, si possono usare le lunghezze predefinite \width, \height, \depth, \totalheight=\height+\depth che si riferiscono alle dimensioni naturali della roba che si sta inscatolando. Quali sono le implicazioni sul codice? La roba viene rieseguita? Oppure usa \unhbox per evitare di riespandere tutto quando deve riinscatolare l’argomento in modo “innaturale”?
  15. Quando si usa il font a spaziatura fissa (\texttt{...}), spezzare le parole per andare a capo viene disabilitato.
  16. NON USARE I DOPPI DOLLARI. (Non l’ho mai fatto! Giuro!)

Riassumendo, LaTeX tenta molto di essere autoconclusivo e ordinato però inevitabilmente mi verrà voglia di usare i comandi di TeX per non perdere tempo, con il risultato che perderò un sacco di tempo.

Inoltre, poiché la copia del manuale che ho è stata piratata meglio di quella del TeXbook, ci sono anche le figure il che lo rende un libro molto più godibile.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

© 2024 Concilio dei topini Torna sù