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


Capitolo 434.   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.

434.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.

esempio di tabella

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.

esempio di tabella

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

esempio di tabella

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.

esempio di tabella

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 potrebbero usare linee dello stesso tipo, ma in questo caso si vuole 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:

esempio di 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.

esempio di tabella

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:

esempio di tabella

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:

esempio di tabella

434.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.

esempio di tabella

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.

esempio di tabella

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.

esempio di tabella

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.

esempio di tabella

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}

esempio di tabella

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}

esempio di tabella

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 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


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

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

Valid ISO-HTML!

CSS validator!