[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 439.   TeX: introduzione

TeX è un linguaggio di programmazione per la composizione tipografica. La «compilazione» di un sorgente TeX produce un file in formato finale (DVI o PDF) per la stampa.

L'importanza di questo linguaggio richiede anche la conoscenza della pronuncia corretta del suo nome: «t-e-k». Infatti, il creatore di questo linguaggio, D.E. Knuth, voleva fare riferimento alle lettere greche maiuscole «TEX», che così vanno pronunciate.

Dal momento che le istruzioni TeX utilizzano spesso le parentesi graffe, nei modelli sintattici queste vanno intese letteralmente, come parte dell'istruzione rappresentata.

439.1   Elementi essenziali del linguaggio TeX

Un file sorgente TeX è un file di testo normale; per la precisione dovrebbe trattarsi di un file ASCII standard a 7 bit, dove l'interruzione delle righe avviene secondo le regole del proprio sistema operativo.

Nel linguaggio di TeX si distinguono righe bianche o vuote da righe contenenti istruzioni. Nell'ambito delle righe contenenti istruzioni, possono poi apparire dei commenti che si distinguono per essere preceduti dal segno di percentuale (%), terminati dalla fine della riga. Nell'esempio seguente si può osservare che tutte le righe che contengono del testo sono in pratica delle istruzioni, più o meno articolate. Nella prima riga appare anche un commento, che non appare poi nella composizione finale.

Ciao a tutti. % Ecco, un commento tanto per gradire.

Questo \`e solo un piccolo esempio per vedere come funziona il
linguaggio di composizione \TeX.
\bye

Gli spazi, verticali e orizzontali, hanno un significato, ma generalmente non si sommano. Normalmente si usa una riga vuota o bianca per separare il testo in paragrafi, ma la presenza di più righe bianche o vuote non cambia la distanza tra questi paragrafi nella composizione finale; nello stesso modo, uno spazio orizzontale serve generalmente a separare le parole di una frase, ma la presenza di più spazi orizzontali non cambia la distanza tra le parole.

Eventualmente si può dichiarare espressamente la separazione tra i paragrafi attraverso l'istruzione \par, tenendo presente che anche in questo caso, l'uso di più istruzioni del genere non produce una separazione maggiore tra i paragrafi stessi

L'istruzione finale \bye conclude il «programma» TeX e tutto ciò che appare dopo viene ignorato.

439.1.1   Testo letterale, parole e simboli di controllo

Una riga di testo si traduce generalmente nel testo corrispondente nella composizione finale, tenendo conto però che alcuni simboli hanno un significato speciale e si distinguono contesti differenti. La tabella 439.2 elenca i caratteri che hanno significati particolari, con l'indicazione del modo per ottenere il loro simbolo originale nella composizione.

Tabella 439.2. Elenco dei caratteri che hanno significati particolari.

Carattere
speciale
Utilizzo normale Trasformazione per l'uso letterale
\
Prefisso di una parola di controllo o di un simbolo di controllo.
$\backslash$
{
Apre un gruppo.
$\{$
}
Chiude un gruppo.
$\}$
%
Inizia un commento fino alla fine della riga.
\%
&
Tabulazione orizzontale.
\&
~
Spazio non interrompibile.
\~{}
$
Inizia e conclude un contesto matematico.
\$
^
Apice, in un contesto matematico.
\^{}
_
Pedice, in un contesto matematico.
\_{}
#
Definisce la collocazione di un parametro.
\#
<SP> Uno o più spazi vengono ridotti a uno solo.
\<SP>
<
In condizioni normali, genera un punto esclamativo rovesciato.
$<$
>
In condizioni normali, genera un punto interrogativo rovesciato.
$>$

La barra obliqua inversa (\) viene usata come prefisso per delle sequenze di controllo, nell'ambito delle quali si può distinguere tra parole di controllo e simboli di controllo. Una parola di controllo è formata esclusivamente da lettere alfabetiche (dalla «a» alla «z», maiuscole e minuscole, escluse le lettere accentate); per esempio, \TeX è una parola di controllo con cui si ottiene la rappresentazione del nome TeX secondo lo standard stabilito dal suo autore originale. Un simbolo di controllo è invece un solo carattere che non sia una lettera alfabetica; per esempio, \` è un simbolo di controllo con cui si ottiene l'aggiunta di un accento grave sopra il simbolo successivo.

In base al fatto che le parole di controllo si distinguono perché composte esclusivamente da lettere alfabetiche, si può porre il problema di delimitarle correttamente quando si trovano incorporate in parole che compongono il testo normale. Nell'esempio già mostrato, la parola di controllo \TeX si individua correttamente perché è seguita da un punto fermo, ovvero un simbolo che non è una lettera alfabetica, ma volendo scrivere un gioco di parole, come «il mio primo TeXdocumento», sarebbe necessario usare uno strattagemma. Si osservi l'esempio seguente che si traduce in un errore nella composizione del documento:

Ciao a tutti.

Questo \`e il mio primo \TeXdocumento.
\bye

TeX cerca di interpretare la parola di controllo \TeXdocumento e non dovrebbe riuscirci. Per questa ragione, lo spazio che dovesse seguire una parola di controllo viene ignorato; così, diventa più facile inserire queste parole di controllo in parole del testo che si vuole comporre. Ecco l'esempio corretto:

Ciao a tutti.

Questo \`e il mio primo \TeX documento.
\bye

Tuttavia, rimane da chiarire in che modo inserire veramente uno spazio dopo una parola di controllo. Questo problema viene risolto con l'uso dei raggruppamenti.

439.1.2   Raggruppamenti

In diverse situazioni è utile raggruppare parte delle istruzioni (il testo) all'interno di parentesi graffe ({...}). L'effetto del raggruppamento non si nota nella composizione finale, ma permette di circoscrivere l'effetto di istruzioni particolari.

È ammissibile anche l'uso di raggruppamenti vuoti, {}, che di solito vengono usati per separare parole o simboli di controllo dal testo che segue. Per esempio, scrivendo \TeX{} si riesce a evitare che lo spazio successivo venga inghiottito. Naturalmente si può usare anche il simbolo di controllo \<SP> (barra obliqua inversa e spazio) per indicare espressamente uno spazio in quel punto. Nel seguito vengono mostrati diversi esempi che si traducono nella stessa composizione finale.

Nella tabella 439.2 sono stati mostrati alcuni simboli di controllo che sono conclusi evidentemente da un raggruppamento vuoto: \~{}, \^{} e \_{}. In questo caso, il raggruppamento vuoto serve a impedire che la sequenza di controllo produca qualcosa di diverso da ciò che ci si aspetta in quel contesto particolare. Per esempio, \^o oppure anche \^ o genera la lettera accentata «ô».

Viene chiarito in seguito che le istruzioni \~{} e \^{} sono delle macroistruzioni che servono a generare un accento, utilizzano un parametro, costituito dal carattere o dal gruppo successivo. Nel momento in cui si vogliono rappresentare questi simboli senza abbinarli ad altro, il loro parametro deve essere un gruppo vuoto o lo spazio inteso come carattere (\<SP>). Pertanto, in alternativa a \~{} e \^{} si potrebbe usare la forma \~\<SP> e \^\<SP>.

Oltre all'uso delle parentesi, è possibile usare in alternativa la coppia di parole di controllo \bgroup e \egroup, in sostituzione di { e } rispettivamente.

439.1.3   Inclusione di file esterni

È possibile articolare un sorgente TeX in più file separati, che vengono inclusi con l'istruzione \input:

\input nome_file

L'inclusione avviene inserendo in quel punto le righe del file indicato. Se il file esterno contiene l'istruzione \bye, la composizione termina senza continuare nel file di partenza.

439.2   Variabili e tipi di dati

TeX ha una gestione molto particolare dei dati. Nelle sezioni seguenti vengono descritti solo i tipi di dati più comuni, ma questo dovrebbe bastare per far comprendere la logica di fondo.

Vale la regola per cui può essere usato solo ciò che è già stato dichiarato; inoltre, il campo di azione di queste variabili può essere controllato attraverso i raggruppamenti con le parentesi graffe.

In generale, per TeX una variabile ha l'aspetto di una parola di controllo a cui si assegna un valore secondo la sintassi seguente:

\nome=valore

L'espansione di una variabile avviene inserendo la parola di controllo corrispondente nel punto in cui il contesto lo richiede. Tuttavia, se lo scopo è quello di espandere la variabile in modo che appaia nel testo normale, occorre usare un accorgimento, con cui si trasforma il suo contenuto in una stringa. Di solito si usa per questo la parola di controllo \the:

\the\nome

439.2.1   Stringhe

Per TeX la stringa è ciò che può essere reso tipograficamente; così, un'espressione stringa è ciò che alla fine si trasforma in una stringa nella composizione tipografica. Le variabili di tipo stringa si dichiarano nel modo seguente:

\newtoks\nome

Si può assegnare una stringa alla variabile nel modo seguente:

\nome={espressione_stringa}

L'espansione di una variabile stringa non può avvenire inserendo semplicemente la parola di controllo \nome nel testo, perché occorre dichiarare espressamente questa intenzione con la parola di controllo \the.

\newtoks\data
\data={9 settembre 2001} 
Treviso, \the\data \par
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla  bla bla bla bla bla bla. \par
Ciao.

Espansione di una variabile stringa

Nell'esempio precedente, si crea una variabile stringa corrispondente alla parola di controllo \data, a cui si assegna la stringa 9 settembre 2001, per poi ottenerne successivamente l'espansione nel testo.

439.2.2   Trasformazione delle stringhe

Le trasformazioni più comuni sulle stringhe sono il cambiamento in maiuscole o minuscole. Ciò si ottiene facilmente con le macro \uppercase e \lowercase:

\uppercase{espressione_stringa_da_trasformare_in_maiuscole}
\lowercase{espressione_stringa_da_trasformare_in_minuscole}

439.2.3   Contatori

La variabile numerica più semplice di TeX è il contatore. Ne esistono due tipi: uno deve essere inizializzato subito, con un valore non negativo, l'altro no:

\countdef\nome_contatore=n
\newcount\nome_contatore

Il primo di questi due modelli riguarda il tipo di contatore che deve essere inizializzato in fase di dichiarazione. Il valore di inizializzazione è rappresentato da n.

Per assegnare un valore a una variabile contatore, si usa la forma seguente:

\nome=valore

È importante sottolineare che l'inizializzazione di un contatore definito attraverso \countdef potrebbe in pratica non tradursi nell'assegnamento corrispondente alla variabile, pur essendo obbligatorio. Pertanto, conviene poi assegnare nuovamente il valore richiesto.

Si può assegnare un numero espresso usando cifre numeriche, con un segno anteriormente nel caso sia necessario, senza separatore decimale, come nell'esempio seguente, in cui si assegna al contatore \conteggio il valore -345.

\conteggio=-345

439.2.4   Lunghezze

Un tipo specifico di variabile numerica è adibita a contenere delle lunghezze. Per TeX, la lunghezza è un'informazione numerica particolare, che si potrebbe ricondurre al concetto di variabile a virgola mobile di altri linguaggi. Si dichiara una lunghezza nel modo seguente:

\newdimen\nome_lunghezza

Una lunghezza è un valore che si può rappresentare in forma costante solo specificando l'unità di misura, che per TeX è una sigla composta da due lettere secondo lo schema che appare nella tabella 439.17. Pertanto, un valore che esprime una lunghezza deve avere la forma seguente:

[+|-]numero[true]unità_di_misura

In particolare, il valore che precede l'unità di misura può contenere una virgola decimale, espressa attraverso il punto (.).(1) Per esempio, per esprimere una lunghezza di 10 cm, si deve scrivere 10cm.(2) Nell'esempio seguente si assegna alla variabile \distanza una lunghezza positiva di 4,5 mm:

\distanza=4.5mm

La parola chiave true consente di indicare una lunghezza che non può essere ingrandita o ridotta attraverso l'istruzione \magnification, come viene descritto nella sezione 441.1. Pertanto, se nell'esempio precedente si vuole indicare una lunghezza positiva corrispondente esattamente a 4,5 mm, in ogni situazione, si deve scrivere così:

\distanza=4.5truemm

oppure anche in modo più leggibile:

\distanza=4.5 true mm

La rappresentazione interna delle lunghezze è di un solo tipo; in pratica, TeX converte sempre i valori nell'unità di misura più piccola che è in grado di gestire. L'unità di misura più piccola è definita scaled point ed è stata creata appositamente per TeX.

Tabella 439.17. Unità di misura secondo TeX.

Sigla Denominazione Corrispondenza Annotazioni
mm
millimetro
cm
centimetro
in
pollice 2,54 cm
bp
big point 0,352 777 7 mm
1/72 pollici
Il punto tipografico usato dal linguaggio PostScript.
pt
punto 0,351 459 8 mm
1/72,27 pollici
Punto tipografico usato negli Stati Uniti.
dd
punto didôt 0,376 065 mm
1/67,54 pollici
Punto tipografico europeo.
sp
scaled point 1/65 535 punti pt L'unità di misura più piccola gestibile da TeX.
pc
pica 12 punti
em
M variabile Quadratone, pari alla larghezza della lettera «M» maiuscola.
ex
x variabile Altezza della lettera «x» minuscola.
mu
math unit 18 quadratoni

Si osservi che TeX non semplifica la tradizione tipografica, consentendo di utilizzare ben tre tipi diversi di punto tipografico. Il punto a cui si è abituati comunemente con i programmi di composizione, è quello corrispondente alla sigla bp, ma TeX utilizza in modo predefinito l'unità pt, che comunque non si discosta di molto.

439.2.5   Lunghezze elastiche

In varie situazioni, TeX è in grado di gestire delle lunghezze elastiche. Le variabili che contengono informazioni del genere sono in grado di annotare tre indicazioni distinte: la distanza normale, una tolleranza in più e una tolleranza in meno. Questo tipo di informazione si esprime secondo la forma seguente:

lunghezza_richiesta [plus lunghezza_in_estensione] [minus lunghezza_in_contrazione]

In pratica, è come dire che si fa riferimento a una certa lunghezza, a cui si può aggiungere quanto appare dopo la parola chiave plus e si può togliere quanto appare dopo minus. Come si può intuire, quando non si indicano i valori che danno elasticità, si sottintende in corrispondenza un valore zero.

L'elasticità fissata attraverso le parole chiave plus e minus non è tassativa. Di solito, il solo fatto che si consenta un'estensione, anche di un solo punto, fa sì che il salto sia allungabile in modo indefinito, in caso di necessità.

Eventualmente, si dichiara una variabile del genere con la forma seguente:

\newskip\nome

L'assegnamento, come si può intendere, ha la forma seguente:

\nome=lunghezza_elastica

Ovvero:

\nome=lunghezza [plus lunghezza] [minus lunghezza]

Le indicazioni sull'elasticità in estensione e in contrazione sono formate normalmente da lunghezze, come per esempio plus 1pt, ma si possono usare anche delle definizioni astratte, rappresentate da tre parole chiave, precedute da un numero intero:

nfil
nfill
nfilll

Generalmente, il numero n è sempre 1 e va inteso come moltiplicatore della parola successiva; in pratica, 2fil rappresenta un'elasticità doppia di 1fil.

La parola chiave fil rappresenta un'elasticità di grado minimo, fill un'elasticità di grado medio e filll un'elasticità molto grande.

439.2.6   Operazioni con i valori numerici

La realizzazione di espressioni numeriche con TeX diventa abbastanza complicata. Si utilizzano fondamentalmente tre tipi di istruzione per modificare il valore di una variabile:

\advance\nome [by] valore
\multiply\nome [by] valore
\divide\nome [by] valore

In pratica, nel primo caso si incrementa la variabile del valore indicato (se il valore in questione è negativo, la variabile viene ridotta di conseguenza); nel secondo caso di assegna alla variabile il prodotto tra quanto contenuto prima per il valore indicato; nel terzo caso si divide il contenuto della variabile per il valore, assegnando alla stessa il risultato della divisione.

Come si può osservare, la parola chiave by è facoltativa e si può usare per facilitare la lettura umana dell'istruzione.

Il valore usato deve essere del tipo adatto alla variabile con cui si esegue l'operazione. Viene mostrato un esempio complessivo che dovrebbe essere comprensibile a sufficienza:

\countdef\pagina=0
\pagina=1
\newcount\contatore
\contatore=-7
\newdimen\lunghezza
\lunghezza=100pt
\newskip\elastico
\elastico=10pt plus 2pt minus 1pt
pagina = \the\pagina \par
contatore = \the\contatore \par
lunghezza = \the\lunghezza \par
elastico = \the\elastico \par
\multiply\pagina by 2
\advance\contatore by 1
\advance\lunghezza by 10pt
\advance\elastico by 5pt plus 3pt minus 2pt
pagina = \the\pagina \par
contatore = \the\contatore \par
lunghezza = \the\lunghezza \par
elastico = \the\elastico \par
\divide\lunghezza by 2
\divide\elastico by 2
lunghezza = \the\lunghezza \par
elastico = \the\elastico \par

Operazioni con variabili numeriche

Va tenuta in considerazione una scorciatoia importante per rappresentare il prodotto tra una costante numerica e il valore di una lunghezza, che si usa di solito per gli assegnamenti:

n\nome

In questo caso, il numero n non deve esprimere una lunghezza, pertanto non può contenere l'indicazione dell'unità di misura. Per esempio, se \hsize contiene la lunghezza 15 cm, con l'istruzione seguente si assegna alla variabile \mezza la metà di questa lunghezza, ovvero 7,5 cm:

\mezza=0.5\hsize

Nell'esempio seguente si creano due variabili: una contiene una lunghezza e l'altra una lunghezza elastica. Dopo aver controllato il valore iniziale di queste, si riassegna loro la metà del loro valore di partenza, controllando successivamente il risultato ottenuto. Si può osservare che \elastico perde l'informazione sull'elasticità, diventando una lunghezza normale.

\newdimen\lunghezza
\lunghezza=100pt
\newskip\elastico
\elastico=10pt plus 2pt minus 1pt
lunghezza = \the\lunghezza \par
elastico = \the\elastico \par
\lunghezza=0.5\lunghezza
\elastico=0.5\elastico
lunghezza = \the\lunghezza \par
elastico = \the\elastico \par

Proporzioni con variabili numeriche

439.2.7   Trasformazione in stringa di dati numerici

I dati numerici, quando devono essere convertiti in stringhe, possono essere rappresentati in forme differenti. La parola di controllo \the consente di ottenere una trasformazione «normale» di qualunque variabile in stringa:

\the\parola_di_controllo

Per esempio, se \lunghezza è stata dichiarata come lunghezza contenente il valore 10 cm, l'espansione di \the\lunghezza può generare la stringa 284.45274pt.

Un valore numerico può essere trasformato in numero intero, ammesso che ciò abbia senso, con la parola di controllo \number:

\number\parola_di_controllo

In questo caso, se si tenta di trasformare una lunghezza in numero, si ottiene la dimensione in punti scaled point; nel caso dell'esempio precedente, si otterrebbe la rappresentazione del valore 18 646 798, corrispondente ai 10 cm di prima espressi secondo l'unità di misura minima che TeX è in grado di gestire. Per quanto riguarda le lunghezze elastiche, non è possibile usare la trasformazione attraverso \number.

Quando il valore da trasformare è un intero positivo maggiore di zero, si può ottenere la rappresentazione in numero romano, con lettere minuscole, attraverso la parola di controllo \romannumeral:

\romannumeral\parola_di_controllo

L'esempio seguente riepiloga l'uso delle forme di trasformazione dei dati numerici in stringa che sono appena state descritte:

\newdimen\lunghezza
\newcount\contatore
\newcount\pagina
\lunghezza=1cm
\contatore=-7
\pagina=123
lunghezza = \the\lunghezza\ = \number\lunghezza scaled point \par
contatore = \the\contatore\ = \number\contatore \par
pagina = \the\pagina\ = \number\pagina = \romannumeral\pagina \par

Rappresentazione di valori numerici come stringhe

439.2.8   Controllo del campo di azione delle variabili

Le parentesi graffe, oppure le parole di controllo \bgroup e \egroup, servono a delimitare e isolare una zona rispetto al testo che si trova al loro esterno. Una dichiarazione o un assegnamento fatto all'interno di una zona delimitata da parentesi graffe ha effetto in quell'ambito e in tutte le altre zone che possono essere annidate al suo interno, mentre all'esterno non esiste più. Si osservi l'esempio seguente:

\newdimen\lunghezza
\newcount\contatore
\lunghezza=1cm
\contatore=7
{
    \lunghezza=10cm
    \contatore=14
    {
        \lunghezza=100cm
        \contatore=21
        lunghezza = \the\lunghezza{} contatore = \the\contatore \par
     }
    lunghezza = \the\lunghezza{} contatore = \the\contatore \par
}
lunghezza = \the\lunghezza{} contatore = \the\contatore
\bye

Si ottiene il testo che segue:

Campo di azione

Perché un assegnamento abbia valore in modo globale, si usa la parola di controllo \global. Si osservi l'esempio seguente:

\newdimen\lunghezza
\newcount\contatore
\lunghezza=1cm
\contatore=7
{
    \lunghezza=10cm
    \contatore=14
    {
        \global\lunghezza=100cm
        \contatore=21
        lunghezza = \the\lunghezza{} contatore = \the\contatore \par
     }
    lunghezza = \the\lunghezza{} contatore = \the\contatore \par
}
lunghezza = \the\lunghezza{} contatore = \the\contatore
\bye

In questo caso, la lunghezza appare essere sempre di 100 cm (2 845,275 59 punti normali), anche quando si ritorna al di fuori dei raggruppamenti. In pratica, si ottiene il testo che segue:

Esempio introduttivo

439.2.9   Ordine nell'espansione delle sequenze di controllo

Esiste un problema con TeX, legato all'ordine in cui vengono espanse le parole di controllo. L'esempio più comune è dato dalla difficoltà con cui si riesce a trasformare un numero romano ottenuto da \romannumeral in maiuscolo. Per esempio,

\newcount\pagina
\pagina=4
\uppercase{\romannumeral\pagina}

genera solo:

Esempio

In pratica, \uppercase si trova a intervenire su una stringa che ancora non c'è, per cui non succede nulla. Per risolvere il problema si usa la parola di controllo \expandafter che anticipa l'esecuzione di ciò che segue:

\newcount\pagina
\pagina=4
\uppercase\expandafter{\romannumeral\pagina}

Esempio

Purtroppo il funzionamento di questa parola di controllo non è intuitivo e spesso si devono fare vari tentativi prima di riuscire a fare ciò che si intende.

439.3   Dichiarazione di macroistruzioni

Si può dare un nome a un'espressione stringa attraverso la sintassi seguente:

\def\nome{espressione_stringa}

Si osservi che, al contrario di altre situazioni, qui TeX richiede che la parentesi graffa aperta segua immediatamente il nome (o il simbolo dell'ultimo parametro, come viene descritto nel seguito), senza alcuna spaziatura intermedia.

Questo tipo di dichiarazione serve in generale per realizzare delle macroistruzioni; tuttavia, utilizzandola solo così, si fa in modo di ottenere l'espansione di ciò che è contenuto fra le parentesi graffe nel momento in cui si inserisce nel testo l'istruzione \nome. Si osservi l'esempio:

\def\eTeX{e-\TeX}

Bla bla bla bla \eTeX{} bla bla...
\bye

In questo caso si vuole dichiarare la parola di controllo \eTeX, con cui diventa facile uniformare la scrittura di questo nome nel testo. Se ci fosse un ripensamento sulla forma da dare al nome, basterebbe modificare la sua dichiarazione iniziale.

Una macro del genere può essere modificata solo riassegnandole un altro valore, nello stesso modo usato per la sua dichiarazione iniziale.

È importante ricordare che in fase di composizione, le parole di controllo assorbono gli spazi alla loro destra, per cui è necessario usare una tecnica per evitarlo, che di solito si riduce all'inserimento di un gruppo vuoto alla fine della stessa.

Nel momento in cui si utilizza una parola di controllo corrispondente a una macro dichiarata in questo modo, si ottiene l'espansione del suo contenuto. In altri termini, la parola di controllo diventa una forma abbreviata per scrivere un testo più articolato, che può contenere a sua volta altre sequenze di controllo, che vengono espanse solo all'ultimo momento. Si osservi l'esempio seguente:

\def\resistenza{\valore{} ohm \tolleranza{} \%}
\def\valore{100}
\def\tolleranza{5}
25 resistenze \resistenza \par
\def\valore{300}
\def\tolleranza{1}
30 resistenze \resistenza \par
\bye

Si ottiene un testo simile a quello seguente, con cui si comprende il fatto che le parole di controllo \valore e \tolleranza vengono espanse per ultime:

Esempio

L'espansione di una parola di controllo del genere avviene in modo letterale, salvo naturalmente l'espansione successiva del suo contenuto, ma questo fatto significa che vengono riprodotte anche le interruzioni delle righe e gli spazi. Alle volte si preferisce strutturare il contenuto di una dichiarazione del genere, per cui si utilizzano dei commenti per evitare di dare un significato agli spazi che si inseriscono. Si osservi l'esempio precedente dopo una piccola modifica:

\def\resistenza{

\valore{} ohm \tolleranza{} \%}

\def\valore{100}
\def\tolleranza{5}
25 resistenze \resistenza \par
\def\valore{300}
\def\tolleranza{1}
30 resistenze \resistenza \par
\bye

In questo caso, ciò che si ottiene è diverso, perché la parola di controllo \resistenza si espande inserendo inizialmente una riga vuota, ovvero ciò che poi si traduce nell'inizio di un paragrafo nuovo:

Esempio

Per evitare questo tipo di inconveniente, si può mettere un commento all'inizio della riga vuota, che così perde questa sua particolarità:

\def\resistenza{
%
\valore{} ohm \tolleranza{} \%}

Di solito, in queste situazioni si mette un commento anche dopo la parentesi graffa aperta:

\def\resistenza{%
%
\valore{} ohm \tolleranza{} \%}

Oltre a questo è da tenere in considerazione che nel momento dell'espansione, ciò che si ottiene non risulta contenuto in una zona separata; in altri termini, ciò che viene dichiarato o modificato all'interno di questa definizione, continua a valere anche al di fuori. Eventualmente, se si intende che l'espansione debba generare una zona isolata, vanno usate le parentesi graffe come già mostrato. Per esempio:

\def\attenzione{{\bf ATTENZIONE!!!}}

In questo caso, l'istruzione \bf inizia la scrittura in neretto; così, la parola di controllo \attenzione permette di inserire la scritta che si vede, in neretto, senza interferire con il testo successivo.

Gli esempi usati fino a questo punto sono riconducibili all'idea di una funzione che non prevede parametri per la chiamata, ricevendo i dati attraverso variabili globali. Per dichiarare una macro in grado di ricevere dei parametri si usa una dichiarazione come quella seguente:

\def\nome#1[#2...[#9]]{espressione_stringa}

In una dichiarazione del genere si possono indicare un massimo di nove parametri, rappresentati da #1, #2,... #9, che possono essere inseriti nella stringa contenuta tra le parentesi graffe. Volendo modificare l'esempio già visto, le cose si potrebbero semplificare nel modo seguente:

\def\resistenza#1#2{#1 ohm #2 \%}
25 resistenze \resistenza{100}{5} \par
30 resistenze \resistenza{300}{1}
\bye

Nella dichiarazione, i simboli #n che si inseriscono all'interno del testo contenuto tra parentesi graffe possono essere indicati anche più volte, ottenendo sempre l'espansione del parametro n-esimo corrispondente.

È ormai evidente il modo in cui deve essere usata la parola di controllo che può essere chiamata con dei parametri:

\nome{parametro_1}[{parametro_2}[...{parametro_n}]]

È importante sottolineare che, contrariamente a quanto si potrebbe immaginare, la stringa utilizzata in un parametro di scambio non può essere separata in paragrafi.

Si osservi che molte macro predefinite di TeX isolano l'espressione stringa che restituiscono all'interno di un raggruppamento, in modo tale che ciò che si cambia al suo interno non si rifletta nel testo successivo. Di solito questo fatto è un comportamento «logico», o intuitivo, ma non si deve pensare che la definizione di una macro implichi automaticamente questa forma di isolamento. In pratica, il fatto di usare una parola di controllo del tipo \nome{espressione}, non significa implicitamente che quanto inserito come parametro non debba anche influenzare il testo successivo.

439.3.1   Chiamata di macroistruzioni che richiedono l'indicazione di parametri

È stata mostrata la sintassi per la chiamata di una macro che richiede l'indicazione di uno o più parametri:

\nome{parametro_1}[{parametro_2}[...{parametro_n}]]

Tuttavia, si tratta di una semplificazione. Infatti, i parametri possono anche non essere racchiusi tra parentesi graffe, ma in tal caso, il primo parametro diventa il primo carattere che segue. Si osservi l'esempio seguente, in cui si dichiara una macro con tre parametri e poi la si chiama senza raggruppare i parametri:

\def\ciao#1#2#3{%
    Primo parametro: #1\par
    Secondo parametro: #2\par
    Terzo parametro: #3\par
}

\ciao, come stai?

Chiamata di una macro

Nel capitolo 440 viene mostrato l'uso di macro come \` che servono ad aggiungere un accento alla lettera successiva. Queste si usano solitamente senza circoscrivere la lettera che segue entro parentesi graffe.

439.4   Riferimenti ad altre parole o simboli di controllo

È possibile creare dei riferimenti a una parola o a un simbolo di controllo, usando la sintassi seguente:

\let\nome_nuovo=\nome

In pratica, in questo modo si crea una parola di controllo alternativa a un'altra già esistente: \nome_nuovo può essere usato al posto di \nome.(3) Si osservi l'esempio:

\newdimen\altezza
\altezza=10cm
\let\grandezza=\altezza
\altezza=20cm
La scatola ha una grandezza di \the\grandezza.
\bye

Si ottiene in pratica il testo

Esempio

dove 569,055 11 punti corrispondono esattamente a 20 cm, ovvero l'ultimo valore assegnato alla lunghezza \altezza, a cui punta anche \grandezza.

Tuttavia, se si fa un esperimento simile con una parola di controllo corrispondente a una macro definita con l'istruzione \def, il riferimento che si genera con l'istruzione \let è quello che punta alla macro di quel momento, mentre una ridefinizione della parola di controllo di partenza non si riflette nel riferimento:

\def\resistenza#1#2{#1 ohm #2 \%}
\let\prova=\resistenza
25 resistenze \resistenza{100}{5}

25 resistenze \prova{100}{5}

\def\resistenza#1#2{#2 ohm #1 \%}
30 resistenze \resistenza{300}{1}

30 resistenze \prova{300}{1}
\bye

Quello che si ottiene dalla composizione di questo esempio è il testo seguente:

Esempio

439.5   Testo normale e ambienti matematici

Una caratteristica molto importante di TeX è la distinzione tra due modalità di funzionamento. In pratica, si distingue un contesto «normale» da un contesto matematico. L'ambiente matematico si introduce e si conclude con il simbolo $ e in tale situazione diventano disponibili delle istruzioni che non si possono utilizzare al di fuori di questo ambito, mentre alcune istruzioni dell'ambiente normale non lo sono più.

Per esempio, alcuni caratteri esistono solo nell'ambiente matematico; è già stato visto in che modo vanno indicate le parentesi graffe quando si scrive in un ambito normale, attraverso le istruzioni $\{$ e $\}$. In pratica, il dollaro iniziale e finale di queste istruzioni serve ad aprire e a chiudere l'ambiente matematico.

439.6   Modalità orizzontale e modalità verticale

Nel suo lavoro di composizione, TeX distingue due situazioni, definite come modalità orizzontale e modalità verticale. Per comprendere la differenza tra queste due situazioni, occorre pensare alla struttura di ciò che si inserisce in una pagina.

Ogni oggetto che viene inserito in una pagina è una scatola, con le sue dimensioni. Queste scatole si inseriscono a loro volta all'interno di altre; per esempio, una lettera è una scatola che si inserisce in una riga, ovvero un'altra scatola, che a sua volta si inserisce in un paragrafo, ovvero ancora un'altra scatola, ecc.

In base al contesto, orizzontale o verticale, TeX si occupa di inserire spazi orizzontali o verticali: tra le lettere di una parola, tra le parole, tra le righe, tra i paragrafi, ecc.

Quello che conta comprendere di tutto questo è che alcune istruzioni possono essere inserite solo in modalità orizzontale, altre solo in modalità verticale. Volendo sperimentare se un certo contesto si trovi in modalità orizzontale o verticale, si può realizzare la macro seguente e collocarla nel testo dove si ritiene opportuno; nella composizione finale si ottiene alternativamente la frase «modalità orizzontale», oppure «modalità verticale»:

\def\verificamodo{%
\ifvmode
    modalit\`a verticale
\else
    modalit\`a orizzontale
\fi}

Nella sezione 439.7 viene spiegato l'uso dell'istruzione \ifvmode.

439.7   Strutture di controllo

Il linguaggio di TeX possiede una serie di strutture di controllo condizionali, in cui parte della condizione è implicita nel nome dell'istruzione con cui la si introduce. Questo insieme di strutture ha una sintassi comune riconducibile alla semplificazione seguente:

\ifnome_condizione [argomento]
    testo_e_altre_istruzioni_se_vero
\else
    testo_e_altre_istruzioni_se_falso
\fi

Spesso, per completare la struttura anche quando una delle due ipotesi non deve generare alcun risultato, si utilizza l'istruzione \relax, che rappresenta proprio l'operazione nulla.

Nelle sezioni seguenti vengono descritte solo le strutture condizionali più comuni.

439.7.1   Istruzione «\ifodd»

È possibile verificare se un numero intero è dispari o pari con la struttura seguente:

\ifodd n
    testo_e_altre_istruzioni_se_dispari
\else
    testo_e_altre_istruzioni_se_pari
\fi

Di solito, al posto del numero n si inserisce l'istruzione \pageno che restituisce il numero della pagina corrente, permettendo così di verificare se la pagina è dispari o pari:

\ifodd \pageno
    testo_e_altre_istruzioni_se_pagina_dispari
\else
    testo_e_altre_istruzioni_se_pagina_pari
\fi

439.7.2   Istruzione «\ifmmode»

È possibile verificare se ci si trova in modalità normale o in modalità matematica con la struttura seguente:

\ifmmode
    testo_e_altre_istruzioni_se_modalità_matematica
\else
    testo_e_altre_istruzioni_se_modalità_normale
\fi

439.7.3   Istruzione «\ifnum»

È possibile mettere a confronto due numeri con la struttura seguente:

\ifnum m=|>|<n
    testo_e_altre_istruzioni_se_confronto_valido
\else
    testo_e_altre_istruzioni_se_confronto_non_valido
\fi

In pratica, il confronto può avvenire solo con gli operatori =, > e <, per indicare rispettivamente se i due valori sono uguali, se il primo è maggiore del secondo oppure se il primo è minore del secondo.

439.7.4   Istruzioni «\ifhmode» e «\ifvmode»

È possibile verificare se la composizione si trova in modalità orizzontale o verticale con una delle due strutture seguenti:

\ifhmode
    testo_e_altre_istruzioni_se_modalità_orizzontale
\else
    testo_e_altre_istruzioni_se_modalità_verticale
\fi
\ifvmode
    testo_e_altre_istruzioni_se_modalità_verticale
\else
    testo_e_altre_istruzioni_se_modalità_orizzontale
\fi

439.8   Verifica del significato di un'istruzione elementare

Per TeX, un'istruzione elementare può essere il singolo carattere di una parola, oppure una sequenza di controllo. Volendo comprendere il senso di qualcosa, si può verificare come intenda TeX questa o quell'istruzione. Per questo, occorre avviare la composizione indicando un file vuoto; per esempio, in un sistema Unix si potrebbe fare così:

tex /dev/null[Invio]

This is TeX, Version 3.14159 (Web2C 7.3.1)
(/dev/null)
*

A questo punto, dall'invito, si può usare l'istruzione \show nel modo seguente:

\show istruzione_elementare

Per esempio, ci si può domandare se il carattere @ abbia un significato particolare:

*\show @[Invio]

> the character @.
<*> \show @

?

A questo punto, la composizione si ferma in attesa di altre indicazioni, mostrando un invito differente. Questo permette di comprendere anche che non conviene usare \show in un file normale del quale si vuole ottenere la composizione, perché in quel punto ci sarebbe una sospensione con richiesta di intervento. A ogni modo, per proseguire basta premere [Invio], quindi si può chiedere di conoscere qualcosa di diverso:

?[Invio]

*\show \TeX[Invio]

In questo caso si vuole conoscere in cosa consiste la macro \TeX ed ecco il risultato che si ottiene:

> \TeX=macro:
->T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX.
<*> \show \TeX
              
? 

Pertanto, questo significa che \TeX è definita come:

\def\TeX{T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX}

Per completare l'esempio, conviene vedere come appare una macro che prevede l'indicazione di un parametro, come nel caso di \`, che serve a mettere un accento grave su una lettera:

?[Invio]

*\show \`[Invio]

> \`=macro:
#1->{\accent 18 #1}.
<*> \show \`
            
? 

In pratica, la definizione originale è la seguente:

\def\`#1{{\accent 18 #1}}

Per terminare l'uso interattivo basta inserire alla fine l'istruzione \bye:

?[Invio]

*\bye[Invio]

No pages of output.
Transcript written on null.log.

439.9   Riferimenti


1) È consentito anche l'uso della virgola per separare la parte intera di un numero. Tuttavia, ci sono situazioni in cui ciò non va bene, per cui è meglio usare sempre solo il punto.

2) TeX ammette che tra il numero e l'unità di misura ci sia dello spazio. Qui si preferisce attaccare l'unità di misura al numero, per evitare confusione con il testo successivo.

3) Si possono creare delle alternative anche a simboli di controllo, ma in generale ciò non è conveniente.


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome tex_introduzione.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory