Il nucleo di LaTeX consiste di 7992 righe di codice. 244581 caratteri (che fa una media di 30 caratteri per riga). Capirlo non è semplice, anzi in certi punti è decisamente complicato, soprattutto se non si hanno le basi della programmazione TeX.
Nella mia collezione di appunti ho cercato di evitare i dettagli TeXnici più riposti. La si può leggere senza aver letto prima il TeXbook, forse però arrivando a una comprensione superficiale. Si deve andare per gradi: prendi un pacchetto semplice e cerca di capire quello che fa, andando via via più a fondo e analizzando qualche altro pacchetto. Si impara molto per imitazione e sbattendo il muso trovandosi a chiedere: ma perché mai questa macro non fa quello che dovrebbe?
Vediamo un esempio “semplice”. Il comando \@onlypreamble prende come argomento un comando il cui uso viene disabilitato dopo \begin{document}.
`\def\@preamblecmds{}
\def\@onlypreamble#1{%
\expandafter\gdef\expandafter\@preamblecmds\expandafter{%
\@preamblecmds\do#1}}`
All’inizio l’espansione di \@preamblecmds è vuota. Con \@onlypreamble\pippo succede che l’espansione di \@preamblecmds diventa “\do\pippo”; se diamo poi \@onlypreamble\pluto, l’espansione di \@preamblecmds sarà
`\do\pippo\do\pluto`
Infatti quando \@onlypreamble\xyz viene espanso, si ottiene
`\gdef\@preamblecmds{\do\xyz}`
A questo punto il gioco è fatto: a \begin{document}, fra le altre cose, viene eseguita la seguente sequenza di comandi
`\gdef\do#1{\global\let#1\@notprerr}%
\@preamblecmds`
Il comando \do viene definito in modo che il suo argomento diventa (globalmente) equivalente a \@notprerr e poi viene espanso \@preamblecmds: dunque, nel nostro esempio, sarà espanso
`\do\pippo\do\pluto`
(ma in realtà \@preamblecmds contiene un sacco di token del genere). Che fa \@notprerr? Basta cercarlo in latex.ltx:
`\gdef\@notprerr{%
\@latex@error{Can be used only in preamble}\@eha}`
E che fanno \@latex@error e \@eha? Esercizio. 🙂Ciao
Enrico
Grazie per la risposta.
Ho fatto una ricerca su source2e.pdf: \@latex@error scrive un messaggio di errore generico, qualcosa come: See the LaTeX manual or LaTeX Companion for explanation mentre \@eha scrive i messaggi di aiuto per gli errori più comuni, giusto?
Ad ogni modo, anche cose come queste che per voi sono semplici, sono ancora complicate (e anche troppo) per me. Quello che però voglio davvero riuscire a fare allo stato attuale, è avere un indice completo di comandi LaTeX. Avevo letto in qualche messaggio che bisogna distinguere i comandi definiti da LaTeX (per questo ho scritto nucleo) da quelli delle classi e pacchetti. Il mio obiettivo è sapere solo il fine ultimo di un comando, cioè per cosa e come si adopera.
Del carattere @ ho ancora troppa paura, e non sono capace di capire quelle definizioni, cosa sia l’espansione di un comando e così via.
Questo messaggio però è da salvare nei segnalibri. In modo particolare quello che mi ha colpito è questa frase:
Si impara molto per imitazione e sbattendo il muso trovandosi a chiedere: ma perché mai questa macro non fa quello che dovrebbe?
.
Mediterò sopra questa frase e sull’eventualità di leggere gli Appunti di Programmazione.
Chissà, magari proprio da questo faccio qualche passo avanti.
Grazie,
ansys.