Re: Uso del carattere @ [Banalità del giorno]

#31041
Up
0
Down
::

Sto leggendo ‘Appunti di programmazione in LaTeX e TeX’, ma mi sfugge l’uso corretto del carattere ‘@’.
Ovvero: \@author è un ‘comando interno’ perché ha la chiocciola?
Quindi \abc@aaa è un comando interno, mentre se scrivo \abcaaa è un comando non interno?
Oppure il fatto che il carattere @ venga assegnato a categoria 11 solo nel file .sty forza il comando ad essere definito solo nel file .sty (a meno di \makeatletter) e pertanto considerato comando interno?

Ancora: è pertanto obbligatorio usare @ quando si definisce un comando?

Scusate se sono contorto, ma mi sono arenato a pagina 19…

La tradizione di usare comandi con @ nasce insieme a TeX; in plain TeX non c’è alcun comando per “definizioni sicure” e Knuth voleva evitare che si ridefinissero comandi importanti. Le primitive di TeX hanno nomi senza @, ma almeno sono elencate nel TeXbook, in modo che si sappia ciò che si fa. In LaTeX il problema non si porrebbe, ma si è preferito mantenere la tradizione: questo, in un certo senso, crea un “namespace” per le macro non direttamente impiegabili nel documento, che servono solo a compiti ripetitivi o di supporto per la programmazione.

Più o meno ogni comando LaTeX ha una versione esterna e una interna; pensa a \chapter e a tutte le cose che deve fare. A esso sono collegati \@chapter, \@schapter, \c@chapter, \l@chapter e altri ancora. Usare nomi con @ evita di doversi spaccare la testa a cercarne di più complicati che non rendano difficile la vita di quelli che usano LaTeX, lasciando loro la libertà di scegliersi tutti i nomi di comando che vogliono, eccetto quelli “esterni” già definiti.

Non c’è alcun obbligo di usare solo nomi con @ nei file .sty, ma è comodo: tipicamente, come scrivo negli Appunti, si usa un prefisso come “abc@” per i comandi interni propri del pacchetto, in modo che non vadano in conflitto con nomi interni di altri pacchetti. Adoperare \newcommand non risolverebbe il problema, ovviamente: le incompatibilità crescerebbero a dismisura.

Non c’è in fondo molto da capire: i comandi @ devono essere usati solo tra \makeatletter e \makeatother oppure in file .cls o .sty. Li chiamo “interni” ma non c’è una vera differenza, a parte quella: sono macro come le altre.

Ciao
Enrico

Go to top