> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/it/articoli-approfonditi/47-tex-tables-how-tex-calculates-spanned-column-widths.md).

# Tabelle TeX: come TeX calcola le larghezze delle colonne che si estendono

## L'obiettivo di questo articolo

In questo articolo esploriamo come $$\mathrm\TeX$$ calcola le larghezze delle colonne di una tabella quando le tabelle contengono voci (ad es., intestazioni di tabella) che si estendono su più colonne (ad es., usando il $$\mathrm\TeX$$ primitivi `\omit` e `\span`). Usando una semplice [tabella “di riferimento”](#reference-table) come punto di partenza, creiamo una serie di esempi—derivati da quella tabella di riferimento—modificando varie voci per creare colonne estese. Esaminando l'effetto di tali modifiche possiamo iniziare a sviluppare una comprensione dell'algoritmo sottostante che $$\mathrm\TeX$$ usa per calcolare la larghezza delle colonne estese.

### Usare $$\mathrm\TeX$$ non $$\mathrm\LaTeX$$

Per esaminare e spiegare *come* $$\mathrm\TeX$$ decide le larghezze delle colonne estese è necessario rinunciare a uno qualsiasi dei meravigliosi $$\mathrm\LaTeX$$ pacchetti per tabelle e tornare ai comandi fondamentali, di basso livello (primitivi), per la creazione di tabelle: in particolare, `\halign{...}`, `\span` e `\omit`. [I pacchetti $$\mathrm\TeX$$/$$\mathrm\LaTeX$$ per tabelle](https://ctan.org/topic/table) sono naturalmente strumenti essenziali di produttività e offrono una ricca gamma di funzionalità estremamente utili che consentono agli utenti di produrre rapidamente un vasto assortimento di materiale tabellare usando $$\mathrm\LaTeX$$. Quei pacchetti forniscono un'essenziale “impalcatura di macro” costruita attorno al $$\mathrm\TeX$$’s comportamento di basso livello e i loro sviluppatori forniscono astrazioni molto gradite e livelli di isolamento che si occupano delle complessità sottostanti. Molti di quei pacchetti sono davvero incredibili imprese di $$\mathrm\TeX$$ programmazione complessa: dovremmo essere tutti grati che esistano per proteggerci dal dover usare il grezzo $$\mathrm\TeX$$!

L'algoritmo effettivo che $$\mathrm\TeX$$ usa per calcolare le larghezze delle colonne estese è spiegato a pagina 245 del [$$\mathrm\TeX\text{book}$$](https://www.amazon.co.uk/TeXbook-Donald-E-Knuth/dp/0201134489) e, con ulteriori dettagli, nella Sezione 801 (pagina 336) del libro stampato contenente il $$\mathrm\TeX$$codice sorgente di [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373). Tuttavia, per molte persone (me compreso) le spiegazioni di Knuth sono, a volte, piuttosto compatte e concise e, talvolta, possono essere difficili da seguire nei dettagli: esempi illustrati sono sempre molto utili.

### Sì, le tabelle sono complesse

Nella sezione 768 (pagina 322) del libro [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373), Knuth fa un commento interessante:

> «È una specie di miracolo ogni volta che `\halign` e `\valign` funzionano, perché attraversano così tante delle strutture di controllo di $$\mathrm\TeX$$.”

Inoltre, il Volume IV della serie di libri in quattro volumi [$$\mathrm\TeX\text{ in Practice}$$](https://www.amazon.co.uk/Tex-Practice-Set-Stephan-Bechtolsheim/dp/038797296X/ref=sr_1_11?s=books\&ie=UTF8\&qid=1504256043\&sr=1-11\&keywords=TeX+in+Practice) dedica non meno di 180 pagine (pp. 199–379) alla creazione di tabelle in $$\mathrm\TeX$$ tramite `\halign` e `\valign`.

Quindi, è sicuro osservare che $$\mathrm\TeX$$ le tabelle sono davvero “piuttosto complicate”.

### Colonne estese: \omit, \span e \multispan

Come notato, per esplorare $$\mathrm\TeX$$’s calcoli delle larghezze delle colonne dobbiamo usare il $$\mathrm\TeX$$; ciò che questo significa è una combinazione di comandi primitivi e una $$\text{Plain }\mathrm\TeX$$ macro chiamata `\multispan`. Sebbene non useremo questi comandi per illustrare direttamente le nostre tabelle di esempio (cioè, spiegando completamente tutto il $$\mathrm\TeX$$ codice), vale la pena includere una breve nota per spiegarli:

* `\halign`: Uno dei due $$\mathrm\TeX$$ primitivi (comandi) per creare tabelle. L'altro è `\valign` ma non è usato così ampiamente e non sarà discusso in questo articolo.
* `\omit`: Una $$\mathrm\TeX$$ primitiva (comando) che istruisce $$\mathrm\TeX$$ a ignorare il modello di preambolo di una voce di tabella.
* `\span`: Una $$\mathrm\TeX$$ primitiva (comando) usata per combinare due voci di tabella adiacenti.
* `\multispan{n}`: Una semplice $$\mathrm\TeX$$ macro per estendere su `n` colonne.

In sostanza, per estendere su colonne $$\mathrm\TeX$$ ignora il numero appropriato di modelli di preambolo della tabella e combina il numero richiesto di voci di tabella in una singola voce. `\multispan{n}` funziona espandendosi nella sequenza di `\omit` e `\span` token necessari per estendere su `n` colonne. Per esempio, `\multispan{3}` si espande in `\omit\span\omit\span\omit`.

## Introduzione alla nostra tabella “di riferimento”

Ecco la nostra tabella di riferimento seguita da una versione annotata che spiega gli elementi usati nella sua costruzione:

![{{{alt}}}](/files/57670a27b72f25e7e2f232c6fef32105b21b198a)

Modificando la nostra tabella di riferimento osserveremo cosa accade alla larghezza della tabella, e alla larghezza delle singole colonne, man mano che aggiungiamo voci che si estendono su varie colonne. Questa tabella di riferimento è stata prodotta in $$\mathrm\TeX$$ grezzo `\halign{...}` usando il primitivo insieme a una serie di macro personalizzate necessarie per impaginare le tabelle—non discuteremo tali macro perché non sono essenziali per comprendere gli esempi e le spiegazioni.

Ecco una versione annotata della nostra tabella di riferimento per spiegarne le caratteristiche:

![{{{alt}}}](/files/d68baeabcd4dbd0e2397b50bec4e44e8d5f87300)

I nostri primi insiemi di tabelle di esempio, e la tabella di riferimento iniziale, hanno tutti impostato `\tabskip=0pt` in modo che $$\mathrm\TeX$$ non aggiunga alcuno spazio tra le nostre colonne: in effetti, si toccano tutte tra loro. Il motivo per fare ciò è semplificare la discussione iniziale e i calcoli conseguenti—più avanti nell'articolo reintrodurremo `\tabskip` glue diverso da zero per esaminare il suo effetto sul calcolo delle larghezze delle colonne estese.

Come notato nelle annotazioni, abbiamo aggiunto una piccola quantità di spazio bianco (5pt) all'inizio di tutte le voci di tabella non estese (eccetto la prima riga). Quei 5pt di spazio bianco fanno parte della larghezza totale di tutte le voci non estese (eccetto la prima riga) e sono stati aggiunti solo per rendere la tabella un po' meno affollata.

### Una breve nota sulle larghezze delle tabelle

Il `\halign{...}` comando ha tre forme:

* `\halign{...}`: imposta la tabella alla larghezza che $$\mathrm\TeX$$ calcola, in base alla dimensione delle voci (e del `\tabskip` glue);
* `\halign to *width* {...}`: indica a $$\mathrm\TeX$$ di impaginare la tabella a una `*larghezza*`;
* `\halign spread *amount*{...}`: regola la larghezza calcolata di `*amount*`.

Quando $$\mathrm\TeX$$ impagina una tabella usando `\halign{...}` deve leggere l'intera tabella in memoria per eseguire i vari calcoli necessari per impaginarla. Di conseguenza, a meno che tu non abbia specificato la larghezza usando `\halign to *width* {...}` non puoi conoscere la larghezza finale finché $$\mathrm\TeX$$ non ha terminato l'elaborazione (impaginazione). Un modo per ottenere la larghezza di una tabella prodotta da `\halign{...}` è impaginare prima la tabella all'interno di una `\vbox{...}` (ad es., `\setbox0=\vbox{\halign{...}}`) e poi, per esempio, usare `\the\wd0` per ottenere la larghezza.

### Nessuna interruzione automatica di riga nelle voci di tabella

È importante notare che quando $$\mathrm\TeX$$ sta impaginando una tabella creata con `\halign{...}` qualsiasi testo all'interno delle voci di tabella non è automaticamente soggetto a interruzione di riga: le voci di tabella sono impaginate in *modalità orizzontale ristretta*—proprio come un `\hbox`. Per abilitare l'interruzione di riga, il testo di una voce di tabella deve essere racchiuso all'interno di un `\vbox{...}` insieme all'uso di un valore appropriato per `\hsize` all'interno di quel `\vbox{...}`. Nota, tuttavia, che il testo all'interno di un `\noalign{...}` comando (una $$\mathrm\TeX$$ primitiva) usato in un `\halign{...}` è soggetto all'interruzione di riga di $$\mathrm\TeX$$’. In effetti, e come suggerisce il nome, `\noalign{...}` consente a $$\mathrm\TeX$$ di “uscire” da `\halign{...}` e collocare materiale tra le righe della tabella—tipicamente per produrre regole orizzontali tra le righe della tabella.

### Non consentito: \halign{...} dentro \hbox{...}

Non puoi *direttamente* impaginare una `\halign{...}` all'interno di una `\hbox{...}`. Tentare di usare `\hbox{\halign{...}}` genererà un errore piuttosto confuso:

```latex
! Missing } inserted.
<testo inserito>
                }
<da rileggere>
                   \halign
l.1 \hbox{\halign
```

#### Una spiegazione di questo errore

A causa del `\hbox{...}` $$\mathrm\TeX$$ che racchiude, *modalità orizzontale ristretta*si trova in `\halign{...}` ; poi rileva *modalità verticale* comando. Per esempio, se usi `\halign{...}` all'interno di un paragrafo, $$\mathrm\TeX$$ terminerà il paragrafo, elaborerà il `\halign{...}` e poi proseguirà con il resto del paragrafo.

Quando usato all'interno di una `\hbox{...}`, il `\halign{...}` innesca $$\mathrm\TeX$$ il tentativo di tornare alla modalità verticale cercando di forzare la chiusura del gruppo corrente: $$\mathrm\TeX$$ riporta una “`! Missing }`” e genera un errore perché pensa che tu abbia commesso un errore nell'uso del raggruppamento. Sebbene una parentesi graffa destra (`}`) possa non mancare dal tuo $$\mathrm\TeX$$ codice, il messaggio di errore è un sintomo del fatto che `\hbox{...}` si mette “di traverso” e $$\mathrm\TeX$$ fa la sua “ipotesi migliore” sul corso d'azione appropriato per risolvere il problema.

## Esempi di tabelle con colonne estese

La seguente sequenza di grafici di tabelle fornisce una gamma di esempi per dimostrare l'effetto dell'estensione delle colonne di una tabella: indicando che voci di tabella molto lunghe possono avere risultati inaspettati sulla larghezza di certe colonne—e, di conseguenza, sulla larghezza della tabella stessa. La domanda a cui andremo a rispondere è che cosa fa $$\mathrm\TeX$$ quando una particolare voce di tabella si estende su un certo numero di colonne ma è “troppo larga per entrare”. Come notato sopra, $$\mathrm\TeX$$ applica effettivamente un algoritmo specifico a questo problema di calcolo delle larghezze delle colonne: i seguenti esempi sono progettati per aiutare a sviluppare un “feeling” per il funzionamento di quell'algoritmo.

### Tabella di esempio 1

In questo esempio usiamo `\multispan{2}` per estendere sulle colonne 1 e 2 con una voce il cui testo è **Una intestazione di tabella**:

![{{{alt}}}](/files/c7d85411a3b27fc93dadf0021756cf07db6bc643)

#### Osservazioni

* La larghezza di questa tabella è la stessa della [tabella di riferimento](#reference-table): $$327.71722\text{pt}$$.
* La larghezza della voce che si estende sulle colonne 1 e 2 è $$81.04953\text{pt}$$ che è inferiore alla larghezza totale delle voci nelle colonne su cui si estende: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$

## Tabella di esempio 2

Come in [Tabella di esempio 1](#example-table-1), anche questo esempio usa `\multispan{2}` per estendere sulle colonne 1 e 2 ma qui usiamo una voce più lunga il cui testo è **Una intestazione di tabella leggermente più lunga**.

![{{{alt}}}](/files/51df2c74612cfad5f16f5f4b68258203ca41f6b0)

#### Osservazioni

Se confronti questo esempio con il nostro [tabella di riferimento](#reference-table) possiamo vedere quanto segue:

* La larghezza di questa tabella è aumentata da $$327.71722\text{pt}$$ su $$374.37032\text{pt}$$: per un totale di $$46.6531\text{pt}$$.
* La larghezza della voce che si estende sulle colonne 1 e 2 ($$156.28664\text{pt}$$) è maggiore della larghezza totale delle voci nelle colonne su cui si estende: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$. Quella differenza è $$156.28664\text{pt}-109.63355\text{pt} = 46.6531\text{pt}$$ che è la stessa quantità di cui è aumentata la larghezza della tabella.
* $$\mathrm\TeX$$ ha regolato la larghezza della colonna 2 per fornire lo spazio aggiuntivo richiesto. Più avanti vedremo come $$\mathrm\TeX$$ calcola l'entità dell'aumento necessario per la colonna 2.
* La colonna 1 non è interessata: la sua larghezza non è stata influenzata dalla voce che si estende sulle colonne 1 e 2.

### Tabella di esempio 3

In questo esempio usiamo `\multispan{3}` per estendere sulle colonne 1 fino a 3 con una voce il cui testo è lo stesso di [Tabella di esempio 2](#example-table-2): **Una intestazione di tabella leggermente più lunga**.

![{{{alt}}}](/files/3aebbbc7ab3dd798cd1fd3ac9b49c9d33a4bf693)

#### Osservazioni

* La larghezza di questa tabella è la stessa della [tabella di riferimento](#reference-table): $$327.71722\text{pt}$$.
* La larghezza della voce che si estende sulle colonne 1 fino a 3 ($$156.28664\text{pt}$$) è inferiore alla larghezza totale delle voci nelle tre colonne su cui si estende: $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Nessuna delle larghezze delle colonne è stata influenzata dalla voce che si estende sulle colonne 1 fino a 3.

Cominci a vedere emergere uno schema?

### Tabella di esempio 4

Come per [Tabella di esempio 3](#example-table-3), qui usiamo `\multispan{3}` per estendere sulle colonne 1 fino a 3 ma questa volta con una voce il cui testo è considerevolmente più lungo: **Una intestazione di tabella considerevolmente più lunga che si estende molto lontano**.

![{{{alt}}}](/files/5be6d2800b5e61ec51eae859f4f192388a5f6080)

#### Osservazioni

* Rispetto al [tabella di riferimento](#reference-table), la larghezza di questa tabella è aumentata da $$327.71722\text{pt}$$ su $$465.95685\text{pt}$$: un aumento di $$138.23963\text{pt}$$.
* La larghezza della voce che si estende sulle colonne 1 fino a 3 è $$306.91216\text{pt}$$.
* La larghezza totale delle voci nelle tre colonne estese è $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* La differenza di larghezza tra la lunga voce estesa e le voci nelle colonne 1 fino a 3 è $$306.91216\text{pt}-168.67254\text{pt}=138.23962\text{pt}$$. La stessa quantità (alle 4 cifre decimali!) di cui è aumentata la larghezza della tabella.
* Solo la colonna 3 ha visto aumentare la propria larghezza: né la colonna 1 né la colonna 2 sono interessate.

#### Emergere di uno schema

Se guardiamo [Tabella di esempio 2](#example-table-2) e [Tabella di esempio 4](#example-table-4) possiamo vedere che in entrambi i casi è l' **ultima colonna nell'estensione** a cui è aumentata la larghezza per fare spazio alla lunga voce che si estendeva sulle colonne:

* In [Tabella di esempio 2](#example-table-2): La lunga voce si estendeva sulle colonne 1 e 2. La colonna 2 è diventata “allungata”.
* In [Tabella di esempio 4](#example-table-4): La lunga voce si estendeva sulle colonne 1 fino a 3. La colonna 3 è diventata “allungata”.

#### La larghezza della colonna 3: emerge un algoritmo?

I seguenti calcoli danno un'indicazione più chiara di cosa stia facendo $$\mathrm\TeX$$ . Ecco cosa sappiamo:

* La larghezza della lunga voce che si estende sulle colonne 1 fino a 3 è $$306.91216\text{pt}$$.
* La larghezza totale delle voci nelle colonne 1 e 2 è $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$.

Qual è la differenza tra questi valori? È $$306.91216\text{pt}-109.63355\text{pt} = 197.2786\text{pt}$$ e questa è la larghezza usata per la colonna 3: deriva direttamente dall'algoritmo usato da $$\mathrm\TeX$$.

### Tabella di esempio 5

Prima di arrivare a un esempio più complicato, ecco un altro esempio “semplice”. Questa tabella contiene la stessa voce lunga di [Tabella di esempio 4](#example-table-4): **Una intestazione di tabella considerevolmente più lunga che si estende molto lontano**; tuttavia, questa volta usiamo `\multispan{6}` che permette a quella voce di estendersi su tutta la tabella. Come puoi vedere, la tabella risultante ha ancora la stessa larghezza della nostra [tabella di riferimento](#reference-table) ($$327.71722\text{pt}$$) il che significa che nessuna colonna è stata influenzata da questa voce molto lunga. Chiaramente, questo accade perché la larghezza della voce ($$306.91216\text{pt}$$) è inferiore alla larghezza totale di tutte le voci che sta estendendo: $$327.71722\text{pt}$$; cioè, la larghezza della tabella.

![{{{alt}}}](/files/ff32ad4a33324fcdef2e4144ac2c53879253a1f1)

### Tabella di esempio 6: un po' più complicata

Qui esaminiamo una serie di tre tabelle di esempio (6(a)–6(c)) per mostrare l'effetto di due diverse voci che entrambe si estendono fino alla colonna 5. [Tabella di esempio 6(a)](#example-table-6a) e [Tabella di esempio 6(b)](#example-table-6b) mostrano ciascuna una tabella contenente una singola voce che si estende su diverse colonne fino alla colonna 5. [Tabella di esempio 6(c)](#example-table-6c) combina entrambe le voci estese in una singola tabella e pone la domanda: quale voce determina effettivamente la larghezza della colonna 5, e perché? La risposta ci porta all'essenza dell'algoritmo usato da $$\mathrm\TeX$$.

#### Tabella di esempio 6(a)

![{{{alt}}}](/files/a6f0e233a7265a62d74050bf16ef4545444fe2e7)

**Osservazioni**

* Rispetto al [tabella di riferimento](#reference-table), la larghezza di questa tabella è aumentata da $$327.71722\text{pt}$$ su $$371.11153\text{pt}$$: un aumento di $$43.39431\text{pt}$$.
* La larghezza della voce che si estende sulle colonne 3 fino a 5 è $$215.06683\text{pt}$$.
* La larghezza totale delle voci nelle colonne 3 fino a 5 è $$59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 171.67253\text{pt}$$.
* La differenza di larghezza tra le voci estese nelle colonne 3 fino a 5 e la larghezza della voce estesa è $$215.06683\text{pt}-171.67253\text{pt}=43.3943\text{pt}$$: l'esatto importo (alle 4 cifre decimali!) di cui è aumentata la larghezza della tabella.

#### Tabella di esempio 6(b)

![{{{alt}}}](/files/0076ed75498e299a617efa4ae2b1f6ac0b9edfde)

**Osservazioni**

* Rispetto al [tabella di riferimento](#reference-table), la larghezza di questa tabella è aumentata da $$327.71722\text{pt}$$ su $$353.3233\text{pt}$$: un aumento di $$25.60608\text{pt}$$.
* La larghezza della voce che si estende sulle colonne 1 fino a 5 è $$306.91216\text{pt}$$.
* La larghezza totale delle voci nelle colonne 1 fino a 5 è $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 281.30608\text{pt}$$.
* La differenza di larghezza tra le voci estese nelle colonne 1 fino a 5 e la larghezza della voce estesa è $$306.91216\text{pt}-281.30608\text{pt}=25.60608\text{pt}$$: **note** questo è *minore* del valore calcolato per [Esempio 6(a)](#example-table-6a), che era $$43.3943\text{pt}$$.

#### Tabella di esempio 6(c)

Qui combiniamo le voci nelle tabelle di esempio [6(a)](#example-table-6a) e [6(b)](#example-table-6b) in una singola tabella: cosa succede?

![{{{alt}}}](/files/3fac776089bb9aed2acda50ea346417d624b7d89)

**Osservazione**

* Rispetto al [tabella di riferimento](#reference-table), la larghezza di questa tabella è aumentata da $$327.71722\text{pt}$$ su $$371.11153\text{pt}$$: un aumento di $$43.39431\text{pt}$$. Notiamo che questo è esattamente lo stesso di [Tabella di esempio 6(a)](#example-table-6a).

#### Che cosa fa $$\mathrm\TeX$$ ?

Per comprendere i risultati dell' $$\mathrm\TeX$$algoritmo e dei processi decisionali di

![{{{alt}}}](/files/52f1e80e91c46933a2abfe22afffa15d7b75af43)

questa voce si estende oltre le voci estese da $$25.60608\text{pt}$$; tuttavia, questa voce

![{{{alt}}}](/files/0d7e7f1b82b5146b8f5a1e7661be97a07d04cbcf)

si estende ancora più oltre rispetto alle voci estese: di $$43.3943\text{pt}$$. Pertanto quella voce “vince la gara” e la colonna 5 vede aumentare la propria larghezza del **massimo** di questi due valori ($$43.3943\text{pt}$$). La larghezza della colonna 5 diventa ora $$59.6501\text{pt} + 43.3943\text{pt} = 103.0444\text{pt}$$ per accogliere la voce che si estende sulle colonne 3 fino a 5. La nostra descrizione dell'esatta “sequenza di eventi” è leggermente semplificata, ma il risultato è come abbiamo descritto.

## Reintrodurre un po' di complessità

Per ridurre al minimo la complessità delle nostre discussioni (finora) abbiamo usato esempi relativamente semplici per dimostrare i principi dell' $$\mathrm\TeX$$algoritmo di `\tabskip=0pt`. Nella pratica, le tabelle del “mondo reale” avranno probabilmente molte voci che si estendono su una gamma di colonne e, naturalmente, avranno valori non nulli per il `\tabskip` glue—un argomento che ora riprenderemo.

### \tabskip glue e larghezze delle colonne estese

La progettazione delle tabelle spesso richiede l'aggiunta di spazio bianco tra le colonne e, naturalmente, $$\mathrm\TeX$$ ha questa possibilità tramite un comando primitivo chiamato `\tabskip`. Questo comando può essere usato per inserire glue fisso o flessibile (spaziatura):

* prima di una tabella (cioè, a sinistra della colonna 1);
* tra una o più colonne;
* dopo la tabella (cioè, a destra dell'ultima colonna).

Ecco un esempio per ricordarcelo:

![{{{alt}}}](/files/e5b64b939052539323826e3bdeb7840b209868ba)

### In che modo il glue \tabskip influisce sulle larghezze delle colonne estese?

La presenza di `\tabskip` glue diverso da zero tra le colonne fornisce spazio aggiuntivo che le voci estese possono “assorbire” prima $$\mathrm\TeX$$ che

debba pensare ad aumentare la larghezza dell'ultima colonna in un'estensione. `\tabskip` glue.

* Il primo esempio usa la nostra originale tabella “di riferimento” che, se ricordi, ha impostato `\tabskip=0pt`.
* Il secondo esempio usa una versione modificata della nostra [tabella di riferimento](#reference-table) tabella di riferimento `\tabskip=10pt` prima e dopo la tabella ma, cosa più importante, ha impostato `\tabskip=20pt` tra le colonne.

All'interno della *modificata* tabella di riferimento le due colonne estese non hanno effetto sulle larghezze delle colonne (e sulla larghezza della tabella), ma hanno effetto sulla larghezza della colonna 2 (e sulla larghezza della tabella) nella *originale* [tabella di riferimento](#reference-table).

### Tabella di riferimento originale: \tabskip=0pt

Qui mostriamo la nostra tabella [tabella di riferimento](#reference-table) originale insieme a una seconda tabella (derivata dalla nostra tabella originale [tabella di riferimento](#reference-table)) che ha una voce “**Prova un'intestazione di tabella più lunga**” che si estende sulle colonne 1 e 2. Chiaramente, la colonna 2 (della seconda tabella nel diagramma) e quindi l'intera tabella sono entrambe influenzate dalle colonne estese.

![{{{alt}}}](/files/82ce1ac7278e605e2abf39167ed2a5705ed5ea11)

### Tabella di riferimento modificata: \tabskip=20pt

Qui mostriamo la nostra tabella di riferimento modificata insieme a una seconda tabella (derivata dalla nostra tabella di riferimento modificata) che ha anch'essa una voce “**Prova un'intestazione di tabella più lunga**” che si estende sulle colonne 1 e 2. Chiaramente, all'interno della seconda tabella nel diagramma, né la larghezza della colonna 2 né quella della tabella sono influenzate dalle colonne estese. In questo caso, la presenza di `\tabskip` glue (`20pt`) tra le colonne ha aiutato ad “assorbire” lo spazio richiesto dal testo nella voce che si estende sulle colonne 1 e 2:

![{{{alt}}}](/files/1650056d8a048278c90fabb771bf11c73a5c390a)

## L'essenza dell' $$\mathrm\TeX$$algoritmo di

Speriamo che la gamma di esempi forniti sopra abbia aiutato a sviluppare un “senso” di ciò che $$\mathrm\TeX$$ fa per accogliere voci estese e di come $$\mathrm\TeX$$ se necessario, regolerà la larghezza dell' **ultima** colonna all'interno di ciascun intervallo di colonne estese. Oltre alla larghezza delle voci all'interno delle singole colonne estese, la presenza di `\tabskip` glue diverso da zero è un fattore importante che $$\mathrm\TeX$$ prende in considerazione quando decide se deve regolare qualche larghezza di colonna. Il punto chiave da ricordare è che $$\mathrm\TeX$$ha l'obiettivo di calcolare una larghezza adatta per l' **ultima colonna** all'interno di ciascun intervallo di colonne estese.

### Esempio finale di tabella: ultime colonne in un intervallo esteso

In questo esempio finale utilizziamo ancora una volta la nostra tabella di riferimento modificata (con `\tabskip` i valori di glue discussi sopra) per ricavare un'altra tabella che contiene varie colonne attraversate da regole—abbiamo usato delle regole per rendere più facili da vedere le estensioni.

Le due tabelle sono state accuratamente allineate per mostrare che, nella tabella superiore, nessuna colonna precedente alla colonna 5 è stata influenzata dalle colonne estese. L'area verde più scura a sinistra del diagramma mostra che le colonne da 1 a 4 di entrambe le tabelle si allineano ancora perfettamente. A destra c'è un'area ombreggiata in verde più chiaro che mostra che solo le colonne 5 e 6 sono state influenzate dalle voci estese.

Nella tabella superiore, le estensioni sono le seguenti:

* colonne da 1 a 5: estese da una $$400\text{pt}$$ regola;
* colonne da 3 a 5: estese da una $$200\text{pt}$$ regola;
* colonne da 4 a 6: estese da una $$250\text{pt}$$ regola.

![{{{alt}}}](/files/61eea1a2fac514456b520653ad80dac24c53a326)

Ancora una volta, la spiegazione è che all'interno di una serie di colonne estese, viene regolata solo la larghezza dell'ultima colonna (se necessario): le colonne intermedie non sono influenzate e qui ciò significa le colonne da 1 a 4—anche se, naturalmente, la larghezza delle colonne da 1 a 4 (e del glue intermedio `\tabskip` glue) viene presa in considerazione quando si calcolano le larghezze corrette delle colonne 5 e 6.

### Una panoramica di $$\mathrm\TeX$$algoritmo di

Concluderemo con una *semplificata* panoramica del “$$\mathrm\TeX$$processi di pensiero” mentre calcola le larghezze delle colonne nelle voci estese. Descrivere $$\mathrm\TeX$$gli algoritmi di non è sempre semplice, quindi adotteremo un po’ di “licenza artistica semplificatrice” per fornire una panoramica di ciò che sta accadendo. I lettori interessati a tutti i dettagli intricati sono rimandati alla Sezione 801 (pagina 336) del libro cartaceo contenente $$\mathrm\TeX$$codice sorgente di [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373).

Le tabelle del mondo reale sono spesso create con molti usi della `\span` primitiva (ad es., all'interno di $$\mathrm\LaTeX$$ pacchetti) per costruire più istanze di colonne estese all'interno della tabella. Per gestire ciò, le strutture dati (in profondità dentro $$\mathrm\TeX$$) mantengono informazioni (i cosiddetti *nodi di span*) che informano $$\mathrm\TeX$$ sui collegamenti (span) tra voci/colonne della tabella. Chiaramente, $$\mathrm\TeX$$ deve applicare i suoi algoritmi in modo sistematico e dovrà elaborare l'intera tabella per effettuare i calcoli finali—determinare tutte le larghezze delle colonne, la larghezza totale della tabella e, se necessario, l'entità con cui i glue flessibili usati nella tabella devono allungarsi o restringersi. Non sorprende davvero che $$\mathrm\TeX$$ non possa dirti la larghezza finale della tabella finché non ha elaborato completamente il `\halign{...}` comando—deve davvero fare molto lavoro!

Il punto di partenza per i calcoli della larghezza delle colonne è la colonna 1 perché, naturalmente, nulla può estendersi a partire da sinistra di (e *attraverso/in*) la colonna 1. $$\mathrm\TeX$$ inizia determinando la larghezza della colonna 1 trovando quale voce abbia il massimo *larghezza naturale*larghezza naturale. Chiamiamo quella larghezza massima $$w\_1$$e se ci sono voci che si estendono dalla colonna 1 alla colonna 2 chiamiamo la larghezza di quella voce $$w\_{12}$$ (larghezza da 1 a 2). Inoltre, indicheremo il `\tabskip` glue tra le colonne 1 e 2 come $$t\_{1}$$—notare che stiamo considerando solo la *larghezza naturale* larghezza di quel `\tabskip` glue e, per ora, ignorando eventuali componenti di allungamento o restringimento che potrebbe possedere. Inoltre, sia la larghezza naturale massima di tutte le voci non estese nella colonna 2 $$w\_2$$.

Il punto chiave da notare è che $$\mathrm\TeX$$ sta cercando di calcolare la larghezza della colonna 2 considerando solo quelle voci il cui span *inizia* con la colonna 1 e *finisce* alla colonna 2. La considerazione chiave per $$\mathrm\TeX$$ è il test $$\max(w\_{2}, w\_{12} - (w\_1+ t\_1))$$—potrebbero esserci più voci che si estendono sulle colonne 1 e 2: alcune potrebbero essere strette (piccola $$w\_{12}$$), altre molto larghe (grande $$w\_{12}$$) quindi $$\mathrm\TeX$$ sta cercando quella che ha l'effetto maggiore (da qui il $$\max(\text{...})$$). Qui, il valore di $$w\_{12} -(w\_1+ t\_1)$$ è l'entità con cui una voce che si estende sulle colonne 1 e 2 “deborda” dalla colonna 1 nella colonna 2: notare che $$\mathrm\TeX$$ sta usando la larghezza della colonna 1 **e** le `\tabskip` glue ($$t\_{1}$$) tra le colonne 1 e 2. Una volta che $$\mathrm\TeX$$ ha determinato se eventuali span dalla colonna 1 alla 2 influenzano la larghezza della colonna 2, imposta la larghezza della colonna 2 al valore massimo che ha determinato (usando il test descritto). $$\mathrm\TeX$$ continua a farsi strada attraverso tutte le altre colonne, eseguendo test analoghi.

E infine, giusto per completezza, qui citiamo l'essenza dell' $$\mathrm\TeX$$algoritmo di calcolo delle larghezze delle colonne di $$\mathrm\TeX$$):

Sia $$w\_{ij}$$ sia il massimo delle larghezze naturali di tutte le voci che si estendono sulle colonne $$i$$ fino a $$j$$, inclusa. Le larghezze finali delle colonne sono definite dalla formula

$$\begin{equation\*} w\_j=\max\_{1\leq i\leq j}\biggl(w\_{ij}-\sum\_{i\leq k< j}(t\_k+w\_k)\biggr) \end{equation\*}$$

dove $$t\_k$$ è la larghezza naturale del glue tabskip tra le colonne $$k$$ e $$k+1$$.

## Colophon: Uso di Overleaf per produrre tabelle come grafica SVG

Tutte le $$\mathrm\TeX$$ tabelle presentate in questo articolo sono file Scalable Vector Graphics (SVG) prodotti sulla piattaforma Overleaf. Le annotazioni (frecce e riquadri verdi) sono state aggiunte aprendo la grafica SVG in Inkscape—nota tuttavia che il testo delle annotazioni è stato composto in $$\mathrm\TeX$$ come testo aggiuntivo per accompagnare la tabella: solo le frecce e gli sfondi verdi sono stati aggiunti in Inkscape. Se sei interessato a sapere come è stato realizzato, continua a leggere.

I server di Overleaf usano la $$\mathrm\TeX \text{ Live}$$ distribuzione che, oltre ai $$\mathrm\TeX$$motori di composizione basati su $$\mathrm\TeX$$, fornisce una ricchezza di strumenti e utilità software molto utili relativi a [`dvisvgm`](https://dvisvgm.de) che, come suggerisce il nome, converte $$\mathrm\TeX$$’s traditional DVI (**D**e**V**ice **I**ndependent) di output in SVG. Tra le sue molte [opzioni da riga di comando](https://dvisvgm.de/Manpage/) `dvisvgm` fornisce un'opzione (`-n` o `--no-fonts`) che gli ordinerà di convertire tutto il testo in *tracciati* il che significa che il testo nelle grafiche SVG viene disegnato usando linee e curve anziché font e glifi veri e propri. Ciò può aumentare la dimensione del file della grafica SVG risultante ma assicura che le grafiche SVG siano estremamente portabili e quasi certamente funzionino bene su qualsiasi dispositivo.

### Quindi... come è stato fatto?

In un [articolo precedente](https://www.overleaf.com/blog/510-using-luatex-to-run-tools-and-utilities-installed-on-overleafs-servers) Ho discusso di come puoi usare $$\text{Lua}\mathrm\TeX$$ per eseguire i vari strumenti e utilità software installati sui server di Overleaf—è una tecnica estremamente facile e conveniente. Quella tecnica è stata usata per generare grafiche SVG di $$\mathrm\TeX$$ tabelle composte, come segue. Dal file principale $$\mathrm\TeX$$ del documento, il codice per comporre ciascuna tabella (creata usando usando `\halign`) è stato scritto in un file `.tex` . Questo è stato ottenuto racchiudendo il codice della tabella dentro una coppia di comandi che ho chiamato `\beginscoop` e `\endscoop`. Probabilmente ci sono molti altri modi per ottenere i risultati desiderati ma ecco le definizioni di macro che ho usato:

```latex
\def\cc{\catcode`\#=12\relax}
\long\def\scoop#1\endscoop{\global\fulltoks={#1}\egroup}
\def\beginscoop{\global\advance\numfigs by1\relax\bgroup\cc\scoop}
```

Le usi così:

```latex
\beginscoop
\halign{...}
\endscoop
```

Nota che il `\endscoop` Il token serve semplicemente a delimitare il parametro di `\scoop` macro: $$\mathrm\TeX$$ elimina di fatto il `\endscoop` token, quindi in realtà non abbiamo bisogno di definirlo (ad es., con `\def\endscoop{...}`).

Il $$\mathrm\TeX$$ il codice contenuto in `\halign{...}` viene salvato in un `registro toks` chiamato `\fulltoks`. Un punto complicato che ho incontrato (con $$\text{Lua}\mathrm\TeX$$) era la necessità di impedire `#` i caratteri all'interno del `\halign{...}` preambolo fossero “raddoppiati” in `##` quando scritti in un `.tex` file. Per evitare ciò ho dovuto impostare temporaneamente i `\catcode`di `#` caratteri su 12 prima di salvare il $$\mathrm\TeX$$ codice (token) nel `\fulltoks` registro dei token.

Il passo successivo è scrivere i token contenuti in `\fulltoks` come un $$\mathrm\TeX$$ file—poiché stavo usando $$\text{Lua}\mathrm\TeX$$ ciò si è rivelato *estremamente* facile grazie alla $$\text{Lua}\mathrm\TeX$$meravigliosa API Lua di. In breve, ho scritto una macro chiamata `\writefile{...}` che prende come parametro il nome di un registro di token i cui token vuoi scrivere in un file (ad es., `\writefile{fulltoks}`). All'interno del `\writefile{...}` macro ho usato l'API Lua per ottenere una rappresentazione testuale del `\fulltoks` registro di token:

```latex
\def\writefile#1{%
\directlua{
...
...
 local p=tex.toks["#1"]
...
...
}}
```

Ecco una schermata che mostra un po' di più del `\writefile{...}` di TeX:

[![{{{alt}}}](/files/fa5c66c24740076857d1700dc763b8cabeb20e3e)](https://www.filepicker.io/api/file/ngeDmgRStGWvG044RE1A)

Il linguaggio Lua e l'API Lua fornita da $$\text{Lua}\mathrm\TeX$$ possono spesso semplificare $$\mathrm\TeX$$ i compiti di programmazione ed è grazie a queste utili e potenti funzionalità che ho usato $$\text{Lua}\mathrm\TeX$$ dal \~2009—e rimango un grande fan di questo davvero meraviglioso $$\mathrm\TeX$$ motore. OK, la $$\text{Lua}\mathrm\TeX$$ pubblicità ora si conclude.

Avendo ottenuto così facilmente il $$\mathrm\TeX$$ codice memorizzato in `\fulltoks` viene scritto in un file insieme ad altro codice aggiuntivo per trasformarlo in un $$\mathrm\LaTeX$$ file correttamente formato. I passi successivi sono:

1. Elabora il `.tex` file contenente la nostra tabella con $$\text{pdf}\mathrm\LaTeX$$ (in modalità DVI) in modo che componga la tabella e generi un `.dvi` file per `dvisvgm` da elaborare. Sì, puoi usare $$\text{Lua}\mathrm\TeX$$ per eseguire $$\text{pdf}\mathrm\LaTeX$$—ancora una volta ho usato il metodo discusso in un [articolo precedente](/latex/it/articoli-approfonditi/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md).
2. E infine, esegui `dvisvgm` per elaborare il `.dvi` file per generare una grafica SVG della tabella composta $$\mathrm\TeX$$ .
3. Per ottenere le grafiche SVG effettive puoi scaricare un file ZIP da Overleaf—assicurandoti di selezionare i **File di input e output** opzione.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/it/articoli-approfonditi/47-tex-tables-how-tex-calculates-spanned-column-widths.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
