È o dovrebbe essere chiarissimo che tutti i comandi definiti con uno qualunque dei comandi di definizione (\newcoommand, \def, \edef, \gdef, \xdef, \providecommand, ecc.) quando vengono eseguiti vengono sostituiti con la loro definizione; se questa contiene altri comandi definiti, questi vengono a loro volta sostituiti dalla loro definizione, e via di questo passo fino a che non si arriva ai comandi primitivi; questa è l’espansione.Per conoscere questi bisogna conoscere alla perfezione il TeXbook.
Ok, ora ho una prima visione dell’espansione di un comando. Per i comandi primitivi ne riparlerò più avanti;
Impresa non facile, ma senza raggiungere la perfezione, si arriva spesso a conoscere buona parte del TeXbook; io ne ho tre copie che tengo sulle varie scrivanie alle quali mi capita di lavorare. La mia memoria non è più così buona e mi sbaglio spesso, cosicché mi trovo a consultare il TeXbook molto spesso.
Io ho un TeXbook in formato pdf creato il 17 luglio 2003. Esiste (se si, dove) qualche versione più recente?
Ma apro sovente il file latex.ltx in /texmf-dist/tex/latex/base/ e vado a cercare i vari comandi definiti. Se la definizione è breve e si rifà ad altri comandi definiti brevi, di solito riesco a capire il loro funzionamento alla lettura del codice. Se i comandi definiti occupano diverse pagine, vado sul source2e.pdf e cerco di capire lì.
Talvolta non basta per capire perché la mia macro non fa quello che vorrei che facesse; allora predispongo un file minimale nel quale introduco la definizione della mia macro e di tutte le macro subalterne che non facciano già parte del nucleo di LaTeX, poi carico il pacchetto trace.
Dentro al corpo del documento scrivo il minimo possibile che però usi la macro con tutti i suoi parametri obbligatori e facoltativi. Naturalmente prima della macro inserisco \traceon e dopo la macro e i suoi argomenti inserisco \traceoff; il prio è necessario per attivare la tracciatura delle operazioni che si eseguono, il seocndo seve per evitare che vengano tracciati tutti i comandi fino all’esecuzione di \end{document}
Lancio latex o pdflatex; generalmente il programma si ferma prima di aver completato l’esecuzione della mia macro, ma se anche l’avesse completata, non l’ha fatto come avrei voluto.
Però ora dispongo di un file .log dove compare tutto il lungo iter di sviluppo successivo delle varie macro: principale, sussidiarie, del nucleo di latex.ltx, o non definite mai (ecco l’errore); oppure che danno luogo a insoliti ed erronei passaggi di parametri dall’una all’altra, eccetera.Tutto ciò è trascritto nel file log. Bada bene; la lettura di questo file richiede una pazienza infinita e l’abilità di non leggerlo tutto, ma di saltare i brani ovvi o ripetitivi; il suo studio/lettura può richiedere diverse ore a seconda della complessità delle macro coinvolte. Quindi esso/a rappresenta l’ultima spiaggia, quando uno non sa più a che santo votarsi.
Tuttavia si impara moltissimo. Anzi direi che conviene tracciare l’espansione di macro piccole piccole, magari funzionanti alla perfezione, cosicché nel leggere il file log, non tanto lungo, ci si rende conto della mole di sostituzioni, espansioni ed elaborazioni che il motore di composizione esegue dietro le quinte; si capiscono meglio i meccanismi con cui vengono passati gli argomenti da una macro all’altra; si capisce bene il meccanismo di protezione dei comandi come anche quello di analisi della presenza di eventuali argomenti facoltativi. Insomma si capiscono un mucchio di cose.
Un giorno, quando inizierò a programmare in TeX e LaTeX, terrò presente queste parole che chiunque dovrebbe prendere come esempio. Anche da questi messaggi si impara molto. Nel vedere il metodo di altre persone (utilizzatori / programmatori) si inizia a tracciare il proprio cammino. Ripeto: questa discussione va salvata nei propri segnalibri.
Ma per diventare dei TeXguru ci vogliono anni di paziente apprendimento 😉
Per ora studiati bene i comandi primitivi e cerca di decifrare non solo le soluzioni degli esercizi del TeXbook, non sempre così lampanti, ma cerca di capire e di decifrare (anche con l’aiuto dei commenti) le definizioni date nel file plain.tex (in una delle appendici) e del file di macro che Knuth ha aggiunto per la composizione del TeXbook. Questo è già un compito che richiede alcuni messi 😯
Diciamo che ero partito con l’idea di esplorare i comandi di LaTeX, quelli che usa l’ utente finale. Le vostra risposte insieme a quelle del Prof. Gregorio, come anche quella di robitex, fanno gola. Ciononostante, voglio, e sopratutto devo, restare con i piedi per terra. Bisogna procedere per gradi e non fare passi più lunghi della gamba. Intanto continuo la mia ricerca sui comandi definiti da LaTeX, capire cosa fanno e come possono essere combinati tra loro per ottenere qualcosa di più elaborato; poi faccio un pensierino alla lettura degli Appunti di Programmazione di TeX e LaTeX. Vedremo, infine,il TeXbook.
Io ho il sorgente del TeXbook su ogni computer. 🙂 E una copia sul comodino (quella rilegata bene) più una vecchia (TeX 2) rilegata a spirale. Ma anche i quattro volumi di “TeX in practice” che, sebbene valgano complessivamente poco, hanno il pregio di contenere questioni di plain TeX molto sottili. Più due copie del Companion seconda edizione (una a casa e una in ufficio) e “texdoc” a tutto spiano.
Come ho scritto sopra ho un TeXbook in versione digitale. Sarò lieto di sapere dove poter trovare una versione aggiornata.
Tre mesi? Tre mesi solo per decifrare Plain, credo che bastino; ma come tu sai bene non molto tempo fa ti ho chiesto spiegazioni in merito a \bordermatrix, Eppure ho studiato quella cosa saltuariamente per anni, ma ancora oggi non sono convinto di avere veramente capito ogni dettaglio, anche se l’ho capito a grandi linee. 🙁
Mi auguro che i vostri mesi non diventino anni per me 😕 .
Grazie per l’interesse, ogni altro contributo a questa discussione è sempre ben gradito.
Grazie,
ansys.