Supponiamo di aver dato\newcount\pippo(contatore TEX). Il registro relativo avrà inizialmente valore 0 e potremo modificarlo con gli operatori aritmetici secondo la sintassi
\advance\pippo by 〈numero 〉 \multiply\pippo by 〈numero 〉 \divide\pippo by 〈numero 〉
Qui 〈numero 〉 può essere sia un numero intero esplicito oppure un altro nome di contatore. La parola chiavebyè facoltativa. Molto importante è notare che un numero esplicito va sempre seguito da uno spazio o da\relaxo, comunque, da un token non espandibile. Infatti quando TEX si aspetta un numero, espande i token che trova finché trova qualcosa che non possa rappresentare un numero. Facciamo un esempio: se il valore attuale di\pippoè −2, dopo
\def\xxx{12}
\advance\pippo by 2\xxx
il valore di\pipposarà 210. Infatti TEX espande\xxxe la lista di token sarà advance pippo b y ␣ 2 1 2
Il fenomeno non succede se il 〈numero 〉 è seguito da uno spazio: secondo le regole di TEX questo spazio verrà ignorato. È ottima norma quindi lasciare uno spazio dopo una costante, cioè un numero che è richiesto da TEX per eseguire un certo comando primitivo. Ovviamente questo non vale per il testo normale: lo spazio dopo “44” nel testo44 gatti in fila per 6non sparisce affatto.
Come si assegna un valore al contatore TEX\pippo? Semplicemente con \pippo=〈numero 〉
e anche qui il carattere=è facoltativo. Perciò dopo
\pippo 25
\advance\pippo by 12 \divide\pippo by 3
il valore del contatore sarà 12. Infatti\dividetronca la parte decimale: TEX lavora solo in aritmetica intera. Un numero può essere preceduto dal segno meno e questo funziona anche se il numero è dato tramite un registro; perciò
è solo un modo complicato per riportare a zero il valore del contatore\pippo. *Come 〈numero 〉 da usare nel contesto delle operazioni aritmetiche sui contatori si può usare anche un token definito tramite\chardefo\mathchardef, si veda a pagina86. Anche una macro la cui espansione cominci con un numero va bene.
Numeri
Non entreremo nel dettaglio su come scrivere i numeri in TEX, ma un po’ di teoria è indispensabile; si intende che stiamo parlando di numeri da passare al programma per eseguire calcoli di qualche tipo, non numeri da stampare. I numeri interi possono essere inseriti in base 10, 8 oppure 16. In alcuni casi TEX accetta anche numeri non interi, ma solo in notazione decimale.
I caratteri che specificano un numero devono essere di categoria 11 o 12; un numero può essere preceduto dal carattere-, che ovviamente indica un numero negativo, ma anche dal carattere+. Per indicare che un numero è in forma decimale non occorre fare nulla, basta usare le solite cifre; per indicare un numero ottale le cifre sono da 0 a 7 e il gruppo di cifre va preceduto con un apostrofo’. Le cifre per i numeri esadecimali sono
0 1 2 3 4 5 6 7 8 9 A B C D E F
e il gruppo di cifre deve essere preceduto dal carattere". Si ricordi sempre la questione relativa a ciò che segue una costante.
*Se si usababelè assai probabile che il token"13sia attivo (dall’indice che appare si vede che è proprio il caso in questo documento) e ciò disturberebbe non poco le assegnazioni con numeri esadecimali. La soluzione è di scrivere\string".
Queste assegnazioni producono lo stesso effetto sul contatore TEX\pippo: \pippo=139
\pippo=’213 \pippo="8B \pippo=00139 \pippo="08B
Si noti che cifre 0 iniziali sono permesse. Tutti i comandi di modifica di valore dei contatori e degli altri registri sono assegnazioni che rispettano i gruppi e possono essere precedute da\global.
Ora è il momento di scoprire come ottenere la rappresentazione del valore di un registro: in qualche modo è necessario farlo, per esempio occorre stampare il numero di pagina, prima o poi. Ci sono tre comandi al riguardo:
\the〈contatore 〉 \number〈contatore 〉 \romannumeral〈contatore 〉
Il primo produce la rappresentazione decimale del valore del contatore come lista di token e il secondo anche. Qual è la differenza? Non molta, in effetti. Ma\number funziona anche se non seguito da un nome di registro numerico: come per le asse-gnazioni di valore ai contatori espande ciò che segue finché si incontra un token che non ha senso nel contesto di un numero e, anche in questo caso, uno spazio che segue il numero è ignorato.
Lo stesso detto per\numbervale anche per\romannumeral, con la differenza che il risultato è una lista di token che rappresentano il valore numerico in cifre romane minuscole; perciò
\pippo=25
\romannumeral\pippo\quad\romannumeral 124
risulterà in “xxv cxxiv”. Se il numero non è positivo, l’espansione sarà vuota, senza alcun messaggio.
*I token risultanti dall’espansione di\romannumeralhanno codice di categoria 12 anche se sono lettere. I numeri maggiori di mille sono rappresentati da una successione di caratterim, seguita dalla rappresentazione romana usuale del resto della divisione per mille. Per esempio
\romannumeral 6151→ mmmmmmcli
senza soprallineature e diavolerie varie. Si noti che la rappresentazione di 1999 è ‘mcmxcix’, non l’insensato ‘mim’ che talvolta si trova. La notazione romana era infatti essenzialmente decimale e posizionale, sebbene in forma primitiva. Si noti anche che la pratica ‘sottrattiva’ è diventata comune solo nel medioevo. Naturalmente questi sono solo esempi d’uso di \romannumeral, le cifre romane vanno scritte con lettere maiuscole (o minuscolette).
Numeri romani maiuscoli
Ci sono almeno due modi per ottenere la rappresentazione di un numero in cifre romane maiuscole, ciascuno ha i suoi vantaggi e i suoi svantaggi. È necessario antici-pare qualche trucco che discuteremo più avanti. Diamo le definizioni di due comandi che non fanno parte del nucleo di LATEX,\Romannumerale\slowRomannumeral:
\def\Romannumeral#1{\uppercase\expandafter{\romannumeral#1}} \def\slowRomannumeral#1{% \expandafter\doslowromannumeral\romannumeral #1@} \def\doslowromannumeral#1{% \ifx @#1% \else
\if i#1I\else\if v#1V\else\if x#1X\else\if l#1L\else\if c#1C\else\if d#1D\else \if m#1M\else#1%
\fi\fi\fi\fi\fi\fi\fi
\expandafter\doslowromannumeral \fi
}
Entrambe le definizioni funzionano prendendo come argomento (tra graffe se è costituito da più di un token) un numero esplicito oppure il nome di un contatore TEX. La differenza fra le due, a parte la maggiore lentezza della seconda, è che l’espansione della prima non è una lista di token corrispondenti a caratteri, contrariamente a quella dell’altra. Se scriviamo
\Romannumeral{56} \slowRomannumeral{56}
i risultati dopo l’espansione sono le due liste di token
e la differenza è evidente. Se tutto ciò che vogliamo è stampare il numero in cifre romane maiuscole, la preferenza è ovviamente per il metodo più veloce; ma in altri casi è necessario l’approccio più lento.
Si noti la differenza: la primitiva\romannumeralnon vuole l’argomento tra graffe,
i comandi che abbiamo definito sì. Le due macro usano concetti che ancora non conosciamo, per ora basti sapere che\uppercasenon è espandibile, mentre\ife le primitive sue parenti lo sono.
Codici ASCII
Esiste un altro modo di indicare un numero intero fra 0 e 255, tramite la combinazione ‘〈carattere 〉; ovviamente questo funziona solo quando TEX si attende un numero.
Perciò
\count255=‘A
assegna al contatore\count255il valore 65. Il carattere può essere preceduto da una barra rovescia e non importa se il token è definito o no, in questo contesto indica solo il numero. Per esempio, volendo assegnare a\count255il numero corrispondente al codice ASCII della barra rovescia è necessario consultare la tabella oppure dire
\count255=‘\\
e analogamente per i caratteri speciali come%e gli altri non direttamente scrivibili nel documento.tex. La barra rovescia iniziale non dà fastidio e quindi in caso di incertezza è meglio metterla.
Se dobbiamo stampare il codice ASCII del carattere%, la cosa più semplice da fare è scrivere\number‘\%che produce, ovviamente, 37, mentre non funzionerebbe \number‘%perché il carattere di commento verrebbe ignorato. Ma l’uso principale è in connessione con l’assegnazione di codici come per esempio quello di categoria:
\catcode‘@=11 \catcode‘\@=11
sono equivalenti a\makeatletter; è evidente la comodità di questa notazione, che evita di doversi ricordare il codice ASCII di ciascun carattere. Questo modo di scrivere una costante aritmetica si può usare in qualsiasi situazione in cui si richieda un 〈numero 〉. Il comando\@makeotherdi LATEX prende come argomento un carattere preceduto dalla barra rovescia:\@makeother\xè equivalente a\catcode‘\x=12.
*È forse giunto il momento di spiegare per bene come si assegna un codice di categoria a un byte. La sintassi è
\catcode〈numero 〉=〈codice 〉
(e=è opzionale) dove 〈numero 〉 è a 8 bit e 〈codice 〉 è un intero a 4 bit. Il 〈numero 〉 può essere espresso in uno qualsiasi dei modi visti prima e quello più conveniente è tramite i codici ASCII:
\catcode‘\\=0 \catcode‘\{=1 \catcode‘\}=2 \catcode‘\$=3 \catcode‘\&=4 \catcode‘\^^M=5 \catcode‘\#=6 \catcode‘\^=7 \catcode‘\_=8 \catcode‘\^^@=9 \catcode‘\ =10
\catcode‘\A=11 ... \catcode‘\z=11 \catcode‘\.=12 ... \catcode‘\!=12
\catcode‘\~=13 \catcode‘\%=14 \catcode‘\^^?=15
sono le assegnazioni eseguite all’avvio di TEX. In LATEX, a dire il vero, il byte nullo riceve codice di categoria 15. Tutti i byte della metà superiore ricevono codice di categoria 12; il pacchetto inputencinvece assegna a questi byte la categoria 13.
Qui abbiamo usato sempre la notazione con la barra rovescia; in quali di queste assegna-zioni è davvero necessaria?