Capitolo 234. TeX: tabelle
La gestione delle tabelle con TeX è piuttosto complessa. In questo capitolo vengono mostrati soltanto i due tipi fondamentali di tabelle di TeX; Si tenga presente che esistono altri modi di crearne, per esempio inserendo scatole dentro altre scatole, ma anche l'ambiente matematico dispone di un tipo di tabella che facilita la realizzazione di matrici.
234.1
Tabulazione
Le macchine da scrivere tradizionali disponevano di un sistema di stop di tabulazione, che veniva programmato di volta in volta, con il quale si potevano allineare i dati in colonne, formando così delle tabelle. Il sistema più semplice per creare tabelle con TeX è proprio quello che si rifà all'uso della macchina da scrivere, attraverso la definizione di stop di tabulazione, che poi vengono richiamati quando desiderato. Si osservi l'esempio seguente:
\settabs 3 \columns
Testo normale, 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
\+ nero & 0 & zero \cr
\+ marrone & 1 & uno \cr
\+ rosso & 2 & due \cr
\+ arancio & 3 & tre \cr
\+ giallo & 4 & quattro \cr
\+ verde & 5 & cinque \cr
\+ blu & 6 & sei \cr
\+ viola & 7 & sette \cr
\+ grigio & 8 & otto \cr
\+ bianco & 9 & nove \cr
Testo normale, 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
\+ argento & 10 \% \cr
\+ oro & 5 \% \cr
\+ & 2 \% \cr
\+ & 1 \% \cr
|
L'istruzione \settabs 3 \columns definisce, da quel punto in poi, l'inserimento di due stop di tabulazione, dividendo la giustezza del testo in tre parti uguali. Dopo tale definizione, si può scrivere normalmente, come se nulla fosse cambiato, oppure si può fare riferimento esplicito alla tabulazione, iniziando e concludendo le righe con \+ e con \cr. Nello spazio tra queste due istruzioni, la e-commerciale (&) ha il significato di carattere di tabulazione, con il quale si raggiunge lo stop successivo. Si può vedere il risultato della composizione dell'esempio nella figura successiva.
Come si dovrebbe notare leggendo l'esempio, non è necessario usare tutte le colonne previste, così come è possibile saltare le colonne che non interessano. Quello che non si intuisce, invece, è la possibilità di fare riferimento a stop di tabulazione oltre alla quantità dichiarata inizialmente: in tal caso si raggiungono colonne successive, che ovviamente vanno oltre la giustezza del testo.
L'istruzione del tipo \settabs n \columns ha effetto a partire dal punto in cui viene utilizzata. Se si vuole cambiare tabulazione, basta inserire una nuova istruzione di questo tipo. Inoltre, è possibile usare anche i raggruppamenti per cambiare temporaneamente la tabulazione di una tabella; tutto funziona in modo molto intuitivo.
\settabs 3 \columns
\+ nero & 0 & zero \cr
\+ marrone & 1 & uno \cr
\+ rosso & 2 & due \cr
{\settabs 4 \columns
\+ arancio & 3 & tre \cr
\+ giallo & 4 & quattro \cr
\+ verde & 5 & cinque \cr
\+ blu & 6 & sei \cr
}
\+ viola & 7 & sette \cr
\+ grigio & 8 & otto \cr
\+ bianco & 9 & nove \cr
|
In questa variante semplificata dell'esempio già presentato, le righe dall'arancio al blu hanno una tabulazione più stretta, perché si divide la giustezza in quattro porzioni.
Gli stop di tabulazione possono essere collocati in modo diverso, indicando una riga di esempio al posto della definizione pura e semplice della quantità di colonne che si vogliono ottenere. In pratica, si hanno a disposizione due istruzioni alternative:
\settabs n \columns
\settabs \+ colonna_1 [& colonna_n]... \cr
|
Viene riproposto l'esempio già visto, in forma ancora più breve, in cui viene inserito lo stesso modello usato per definire gli stop di tabulazione alla fine della tabella, per poter vedere effettivamente in che modo vengono misurati gli spazi:
\settabs \+ MMMMMMMMMMMM & MMMMM & MMMMMMM \cr
\+ nero & 0 & zero \cr
\+ marrone & 1 & uno \cr
\+ rosso & 2 & due \cr
\+ arancio & 3 & tre \cr
Il modello usato per gli stop \`e il seguente:
\+ MMMMMMMMMMMM & MMMMM & MMMMMMM \cr
|
Naturalmente, il modello delle colonne può essere anche più simile al testo usato realmente nella tabella. In questo caso, con la lettera «M» maiuscola, si fa riferimento a un quadratone in modo semplice e chiaro.
Il testo che si inserisce all'interno di uno spazio che rappresenta una cella, esclusa l'ultima di ogni riga, è racchiuso implicitamente in un gruppo che si comporta come la macro \leftline. Questo fatto consente quindi di gestire gli allineamenti nell'ambito delle celle; inoltre, garantisce che il testo di ognuna di queste celle sia isolato in un gruppo autonomo.
\settabs
\+ MMMMMMMMMMMM & MMMMM & MMMMMMM & \cr
\+ \hrulefill & \dotfill & \hrulefill & \cr
\+ \hfil Colore & \hfil Cifra & \hfil Cifra & \cr
\+ \hrulefill & \dotfill & \hrulefill & \cr
\+ nero & \hfill 0 & \hfil zero & \cr
\+ marrone & \hfill 1 & \hfil uno & \cr
\+ \bf rosso & \hfill 2 & \hfil due & \cr
\+ arancio & \hfill 3 & \hfil tre & \cr
\+ \hrulefill & \dotfill & \hrulefill & \cr
|
L'esempio mostra una tabella, in cui il sorgente è organizzato in modo da facilitarne la lettura. In particolare, il modello per gli stop di tabulazione è stato messo nella riga successiva a quella in cui appare \settabs; inoltre, c'è una cella finale in più, che non viene usata. Infatti, le celle in cui il testo si comporta come se fosse usata la macro \leftline sono tutte escluse l'ultima che precede l'istruzione \cr.
Bisogna ricordare che la macro \leftline include uno spazio leggermente elastico alla fine, corrispondente a \hfil. In tal modo, per centrare il testo in una cella, basta farlo precedere da un altro \hfil, se invece si vuole ottenere l'allineamento a destra, si deve usare inizialmente uno spazio più elastico come \hfill.
Nell'esempio mostrato si riesce ad arrivare a una tabella abbastanza «dignitosa», con tanto di intestazione, delimitata da linee orizzontali. Naturalmente, si potevano usare linee dello stesso tipo, ma in questo caso si voleva mostrare bene lo spazio di competenza di ogni colonna. Al posto di \hrulefill o di \dotfill si può anche usare \hrule, al di fuori delle celle, nel modo seguente:
\settabs
\+ MMMMMMMMMMMM & MMMMM & MMMMMMM & \cr
\hrule
\+ \hfil Colore & \hfil Cifra & \hfil Cifra & \cr
\hrule
\+ nero & \hfill 0 & \hfil zero & \cr
\+ marrone & \hfill 1 & \hfil uno & \cr
\+ \bf rosso & \hfill 2 & \hfil due & \cr
\+ arancio & \hfill 3 & \hfil tre & \cr
\hrule
|
Tuttavia, in tal caso si vede che le linee orizzontali che si ottengono toccano il testo delle righe della tabella:
Per risolvere il problema, può essere conveniente l'uso della macro \strut, con cui si dà alle righe l'altezza e la profondità corrispondente a quella di una parentesi tonda, senza che questa appaia effettivamente nel testo:
\settabs
\+ MMMMMMMMMMMM & MMMMM & MMMMMMM & \cr
\hrule
\+ \strut \hfil Colore & \hfil Cifra & \hfil Cifra & \cr
\hrule
\+ \strut nero & \hfill 0 & \hfil zero & \cr
\+ \strut marrone & \hfill 1 & \hfil uno & \cr
\+ \strut \bf rosso & \hfill 2 & \hfil due & \cr
\+ \strut arancio & \hfill 3 & \hfil tre & \cr
\hrule
|
In tal modo si ottiene anche il risultato di avere tutte le righe della tabella della stessa altezza, quella massima, anche se il testo che contengono non lo richiederebbe.
Se si inserisce una tabella del genere in una scatola verticale, questa scatola può essere spostata facilmente in modo orizzontale, con l'istruzione \moveright, come nell'esempio seguente, in cui la si sposta di 3 cm:
Paragrafo di esempio, 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 bla bla
bla bla bla bla bla bla bla bla.
\moveright 3 cm \vbox{
\settabs
\+ MMMMMMMMMMMM & MMMMM & MMMMMMM & \cr
\hrule
\+ \strut \hfil Colore & \hfil Cifra & \hfil Cifra & \cr
\hrule
\+ \strut nero & \hfill 0 & \hfil zero & \cr
\+ \strut marrone & \hfill 1 & \hfil uno & \cr
\+ \strut \bf rosso & \hfill 2 & \hfil due & \cr
\+ \strut arancio & \hfill 3 & \hfil tre & \cr
\hrule
}
|
Tuttavia, come si vede sotto, in questo modo il testo che precede la tabella si trova a toccare la tabella stessa:
Per rimediare basta aggiungere un piccolo spazio verticale, per esempio con l'istruzione \vskip, prima della tabella.
Volendo arrivare a centrare la tabella, si può inserire la scatola verticale nella macro \line, come nell'esempio seguente:
Paragrafo di esempio, 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 bla bla
bla bla bla bla bla bla bla bla.\par
\vskip 1 em
\line{\hfil\vbox{
\settabs
\+ MMMMMMMMMMMM & MMMMM & MMMMMMM & \cr
\hrule
\+ \strut \hfil Colore & \hfil Cifra & \hfil Cifra & \cr
\hrule
\+ \strut nero & \hfill 0 & \hfil zero & \cr
\+ \strut marrone & \hfill 1 & \hfil uno & \cr
\+ \strut \bf rosso & \hfill 2 & \hfil due & \cr
\+ \strut arancio & \hfill 3 & \hfil tre & \cr
\hrule
}\hfil}
|
Si osservi l'uso dell'istruzione \vskip per ottenere una piccola distanza tra il testo e la tabella, come già descritto in precedenza:
234.2
Tabelle più complesse
Attraverso l'istruzione \halign è possibile definire delle tabelle un po' più complesse rispetto al sistema di stop di tabulazione già presentato nella sezione precedente. L'istruzione in questione viene utilizzata sinteticamente nel modo seguente:
\halign{modello_delle_righe
riga
...
}
In particolare, il modello delle righe utilizza il simbolo # per fare riferimento al contenuto delle celle, mentre le righe hanno la forma consueta, con la differenza che manca il simbolo di controllo \+ iniziale. L'esempio seguente è molto simile all'ultima tabella realizzata con l'uso degli stop di tabulazione, con tanto di centratura orizzontale:
Paragrafo di esempio, 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 bla bla
bla bla bla bla bla bla bla bla.\par
\vskip 1 em
\line{\hfil\vbox{
\halign{
\strut # & \hfil # & \hfil # \hfil \cr
\noalign{\hrule}
Colore & Cifra & Cifra \cr
\noalign{\hrule}
nero & 0 & zero \cr
marrone & 1 & uno \cr
\bf rosso & 2 & due \cr
arancio & 3 & tre \cr
\noalign{\hrule}
}
}\hfil}
|
La prima cosa che si deve osservare è il fatto che \strut viene usato solo nella dichiarazione del modello delle righe; ciò è sufficiente perché sia inserito automaticamente all'inizio di tutte le righe della tabella. Si può osservare anche che non è necessario definire la larghezza delle colonne nel modello, perché questa viene determinata automaticamente in base al contenuto delle righe stesse. Infine, l'ultima colonna della tabella non si comporta diversamente dalle altre, pertanto non è più necessario il trucco della colonna finale vuota.
A differenza delle tabelle realizzate per mezzo della tabulazione, quando si vuole inserire una linea orizzontale con l'istruzione \hrule, occorre inserirla nell'istruzione \noalign. In pratica, con \noalign si può inserire qualcosa che riguarda tutta la riga, senza suddivisione in colonne; tuttavia, è meglio evitare di inserire testo normale, perché in tal caso verrebbe perso l'effetto dell'allineamento orizzontale introdotto con \line e \vbox.
È importante comprendere che ciò che si inserisce nel modello iniziale delle righe, viene inserito nello stesso modo all'interno delle righe. Si osservi la variante seguente:
\line{\hfil\vbox{
\halign{
\strut \quad \bf # & \hfil # & \hfil (#) \hfil \cr
\noalign{\hrule}
Colore & \bf Cifra \hfil & \bf Cifra \cr
\noalign{\hrule}
nero & 0 & zero \cr
marrone & 1 & uno \cr
rosso & 2 & due \cr
arancio & 3 & tre \cr
\noalign{\hrule}
}
}\hfil}
|
Per prima cosa, è stato aggiunto un piccolo spazio orizzontale, di un quadratone, nella prima cella, attraverso la macro \quad; in tal modo si evita che la prima colonna inizi esattamente sul bordo sinistro, per motivi estetici. Inoltre, si fa in modo che tutta la prima colonna appaia in neretto, senza dover intervenire in ogni cella. Nel modello dell'ultima colonna, si racchiude il riferimento alle celle tra parentesi tonde, solo a scopo dimostrativo (infatti il risultato che si ottiene non è perfetto esteticamente). Dal momento che si vuole la riga di intestazione tutta in neretto, si interviene singolarmente nella seconda e nella terza cella di questa riga; in particolare, la parola «Cifra» della seconda colonna, viene centrata, aggiungendo un \hfil finale, che contrasta e bilancia quanto dichiarato nel modello corrispondente.
Dal momento che tutto ciò che si inserisce nella riga del modello viene inserito anche nelle righe della tabella, per ottenere delle linee verticali si possono inserire delle istruzioni \vrule:
\line{\hfil\vbox{
\halign{
\strut\vrule \quad \bf # & \vrule \hfil # & \vrule \hfil (#) \hfil \vrule \cr
\noalign{\hrule}
Colore & \bf Cifra \hfil & \bf Cifra \cr
\noalign{\hrule}
nero & 0 & zero \cr
marrone & 1 & uno \cr
rosso & 2 & due \cr
arancio & 3 & tre \cr
\noalign{\hrule}
}
}\hfil}
|
In questo caso il risultato estetico non è ancora perfetto, ma ormai dovrebbe essere chiaro come si può intervenire nel modello delle righe.
Esiste la possibilità di unire assieme più celle nella stessa riga, attraverso l'uso della macro \multispan{n}, dove n rappresenta la quantità di colonne da unire. Tuttavia, in tal caso non viene preso in considerazione il formato stabilito nella riga di intestazione. Si osservi l'esempio seguente:
\line{\hfil\vbox{
\halign{
\strut\vrule \quad \bf # & \vrule \hfil # & \vrule \hfil (#) \hfil \vrule \cr
\noalign{\hrule}
Colore & \bf Cifra \hfil & \bf Cifra \cr
\noalign{\hrule}
nero & 0 & zero \cr
marrone & 1 & uno \cr
\multispan{2} rosso & due \cr
arancio & 3 & tre \cr
\noalign{\hrule}
}
}\hfil}
|
Come si vede sotto, il contenuto della cella allargata appare centrato nello spazio che si ritrova ad avere a disposizione, ma ciò è ottenuto con uno spazio leggermente elastico, che può essere contrastato facilmente.
Per sistemare l'allineamento, ripristinare il neretto e la linea verticale alla sinistra, basta intervenire nella cella; in particolare è sufficiente uno spazio con una piccola elasticità per contrastare l'allineamento normale al centro:
\line{\hfil\vbox{
\halign{
\strut\vrule \quad \bf # & \vrule \hfil # & \vrule \hfil (#) \hfil \vrule \cr
\noalign{\hrule}
Colore & \bf Cifra \hfil & \bf Cifra \cr
\noalign{\hrule}
nero & 0 & zero \cr
marrone & 1 & uno \cr
\multispan{2}\vrule\quad\bf rosso scuro \hfil & due \cr
arancio & 3 & tre \cr
\noalign{\hrule}
}
}\hfil}
|
Per evitare che in una cella venga inserito tutto ciò che appare nel modello delle righe, basta usare l'istruzione \omit. Si osservi l'esempio, in cui si risolve il problema delle parentesi tonde attorno al titolo dell'ultima colonna:
\line{\hfil\vbox{
\halign{
\strut\vrule \quad \bf # & \vrule \hfil # & \vrule \hfil (#) \hfil \vrule \cr
\noalign{\hrule}
Colore &\bf Cifra\hfil &\omit\vrule\hfil\bf Cifra\hfil\vrule\cr
\noalign{\hrule}
nero & 0 & zero \cr
marrone & 1 & uno \cr
rosso & 2 & due \cr
arancio & 3 & tre \cr
\noalign{\hrule}
}
}\hfil}
|
Prima di concludere l'argomento, occorre fare presente la possibilità che TeX allunghi il testo verticalmente in fase di composizione. Se ciò accade nell'ambito di una tabella nella quale si utilizza \vrule per ottenere delle linee verticali, si rischia di vedere queste linee spezzettate. Per evitare che nell'ambito della tabella TeX possa fare degli allungamenti, si può usare la macro \offinterlineskip dentro la scatola verticale:
\line{\hfil\vbox{\offinterlineskip
\halign{
\strut\vrule \quad \bf # & \vrule \hfil # & \vrule \hfil (#) \hfil \vrule \cr
\noalign{\hrule}
Colore &\bf Cifra\hfil &\omit\vrule\hfil\bf Cifra\hfil\vrule\cr
\noalign{\hrule}
nero & 0 & zero \cr
marrone & 1 & uno \cr
rosso & 2 & due \cr
arancio & 3 & tre \cr
\noalign{\hrule}
}
}\hfil}
|
Appunti di informatica libera 2003.01.01 ---
Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org