> 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/14-how-do-tex-engines-typeset-tables.md).

# Come i motori TeX compongono le tabelle

## Come compongono le tabelle i motori TeX

## Introduzione: Di cosa tratta questa serie?

Produrre tabelle esteticamente gradevoli può essere un compito che richiede molto tempo—che si usi uno strumento di impaginazione visuale, LaTeX o un linguaggio di markup come HTML o markdown. Per gli utenti LaTeX in particolare, la composizione delle tabelle occupa un posto alto nella lista dei “punti dolenti” di molte persone, come forse dimostra il fatto che “tabelle” sia uno degli argomenti più [tra gli argomenti più etichettati su tex.stackexchange](https://tex.stackexchange.com/tags).

Oltre alle risposte e agli esempi su tex.stackexchange, anche una rapida rassegna del supporto disponibile per la composizione di tabelle con LaTeX rivela numerose risorse informative relative alle tabelle:

* di Overleaf [pagine di aiuto](https://www.overleaf.com/learn/latex/tables) e altri siti come [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* CTAN, il Comprehensive TeX Network, elenca oltre [70 pacchetti TeX/LaTeX](https://ctan.org/topic/table) relativi alla creazione di tabelle
* un intero [libro sulla composizione di tabelle usando LaTeX](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* un eccellente [generatore online di tabelle LaTeX](https://www.tablesgenerator.com/latex_tables)

Una semplice ricerca Google per [tabelle LaTeX](https://www.google.com/search?q=latex+tables) restituisce un enorme numero di risultati, elencando molti siti che offrono aiuto, consigli, esempi e spiegazioni.

### TeX, non LaTeX

Dato l'abbondanza di letteratura disponibile sulla composizione di tabelle usando LaTeX, c'è ancora qualcosa da scrivere al riguardo—ancora più esempi di tabelle e un elenco/dimostrazione dei comandi dei pacchetti? Esiste un modo per affrontare il tema della composizione di tabelle che faccia emergere o si concentri sui principi e concetti fondamentali della composizione delle tabelle? Esiste, ma richiede di sbucciare la cipolla di LaTeX…

Abbiamo deciso di produrre una serie di articoli che mira a fornire ai lettori informazioni di contesto e spiegazioni della *meccanica* della composizione di tabelle basata su TeX. Invece di concentrarci sulla composizione di tabelle usando specifiche macro/pacchetti LaTeX, esploreremo il *comportamento sottostante* dei motori TeX: esplorando i meccanismi di composizione di basso livello che forniscono le fondamenta su cui sono costruiti i comandi macro di LaTeX. L'obiettivo finale è far emergere, e spiegare, i metodi e gli algoritmi fondamentali della composizione di tabelle basata su TeX—sperando così di aiutare i lettori/utenti a comprendere meglio perché le tabelle si comportano come fanno. Una conseguenza inevitabile di questo approccio, che scrosta gli strati protettivi dell'isolamento delle macro LaTeX, è l'esposizione a dettagli disordinati di basso livello da cui gli utenti sono solitamente (e felicemente) schermati tramite strati di codice macro LaTeX.

Ci è voluto molto tempo per ricercare, scrivere e illustrare questi articoli, quindi speriamo che siano un'aggiunta valida alla letteratura, fornendo materiale che informerà i lettori e li aiuterà a comprendere meglio questa complessa area della composizione tipografica TeX. Dovremmo sottolineare che questa serie di articoli si *contiene* addentrerà nel discutere *l'estetica* del design delle tabelle—un argomento ricco di preferenze soggettive e le cui argomentazioni devono essere affrontate altrove…

### Esplorare la meccanica delle tabelle TeX: come si può fare?

Per esplorare, e poi scrivere, sui meccanismi e processi di livello inferiore che avvengono all'interno dei motori TeX, come la composizione di tabelle, Overleaf ha costruito (compilato) versioni “debug” del motore TeX di Knuth usando il [processo Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

Tradizionalmente, la costruzione di TeX coinvolge un processo chiamato Web2C, usato all'interno di TeX Live, che genera codice C convertendo il codice sorgente Pascal originale di TeX nel suo equivalente in C. Quel processo genera codice C che non era mai stato destinato a essere letto dagli esseri umani, ma solo dai compilatori C. Il codice C generato meccanicamente è *eccezionalmente* difficile da leggere o modificare per scopi sperimentali.

Al contrario, Web2W produce codice sorgente C (disponibile [qui](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) che è *di ordini di grandezza* più leggibile del codice prodotto da Web2C. Di conseguenza, il codice sorgente C di Web2W è molto più adatto a essere modificato per scopi di apprendimento/sperimentazione.

Web2W produce una versione di TeX (“CTeX”) che è *estremamente* vicina al programma originale di Knuth: “CTeX” non include i numerosi cambiamenti e miglioramenti introdotti dal processo Web2C—come SyncTeX, l'elaborazione della riga di comando e la ricerca dei file tramite Kpathsea. Sebbene si rinunci a tali preziosi miglioramenti, il codice C risultante (Web2W) è relativamente facile da navigare usando il codice sorgente TeX pubblicato da Knuth, anche se TeX è stato scritto in Pascal.

* **Una nota sui nomi:** A rigor di termini, il nome “TeX” deve riferirsi solo al software originale scritto e pubblicato da Donald Knuth. Qualsiasi modifica al suo software deve usare un nome diverso per il software di composizione tipografica basato su TeX che ne risulta. Qui abbiamo usato il processo Web2W per costruire un motore che è ancora, di fatto, il software originale di Knuth. Tuttavia, per evitare dubbi useremo il termine “CTeX” per indicare la specifica versione costruita con Web2W, ma useremo anche “TeX” per indicare sia il motore originale di Knuth sia un termine generale per il linguaggio di composizione tipografica basato sui principi del TeX di Knuth. Speriamo che i lettori perdoneranno eventuali occasionali scivoloni nell'applicazione/uso rigoroso della terminologia corretta: speriamo che significato/intenzione siano trasmessi dal contesto.

La versione debug di CTeX è stata eseguita usando il [l'IDE Eclipse](https://www.eclipse.org/downloads/packages/), rendendo possibile osservare in tempo reale l'elaborazione del codice C che implementa i comandi primitivi (integrati) di TeX e gli algoritmi, progettati da Knuth per supportare la composizione delle tabelle.

Il seguente breve video (circa 90 secondi) mostra il motore CTeX in esecuzione all'interno di [l'IDE Eclipse](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

Oltre a CTeX, abbiamo anche compilato e-TeX per accedere ad alcune primitive aggiuntive non presenti nel software originale di Knuth. Sebbene CTeX ed e-TeX siano ormai motori basati su TeX datati, sono ancora adatti come base per esplorare la meccanica della composizione delle tabelle perché quei principi sottostanti si applicano ancora a tutti i motori di composizione basati su TeX.

### Perché usare un motore TeX più vecchio per esplorare le tabelle?

Innanzitutto, il libro stampato, [TeX:The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373), che elenca e spiega il codice sorgente di TeX, è ancora una guida estremamente comoda nelle acque torbide dei meccanismi interni di TeX, nonostante sia stato pubblicato più di 30 anni fa (1986). Naturalmente, puoi comporre tu stesso la documentazione del codice sorgente di TeX, per esempio vedi il progetto Overleaf [Componi la documentazione del codice sorgente per TeX, e-TeX o pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). Dalla pubblicazione di TeX:The Program nel 1986, si sono evoluti nuovi motori TeX, tra cui pdfTeX, XeTeX e LuaTeX, che introducono tutti funzionalità e comandi che non sono documentati in TeX:The Program semplicemente perché non erano presenti nel software originale di Knuth.

Per molti processi fondamentali, come la composizione delle tabelle di TeX, il codice documentato in TeX:The Program è ancora rilevante come base di studio—anche se il codice sorgente di TeX è scritto in Pascal. Inoltre, il TeX di Knuth è relativamente facile, e veloce, da compilare—soprattutto tramite il supremo utile [processo Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) sviluppato da Martin Ruckert. La facilità/velocità di compilazione rende molto più comodo modificare TeX in modi semplici—come la creazione di grafica SVG usata più avanti in questa serie di articoli.

### Comprendere la differenza tra TeX e LaTeX

Molti lettori sapranno già che LaTeX in realtà non è un *eseguibile* programma di composizione tipografica ma un grande insieme di comandi (*macro*) che sono, in ultima analisi, scritti in un linguaggio di composizione/programmazione di livello inferiore chiamato TeX. Il tuo codice LaTeX produce output tipografico solo dopo essere stato elaborato da un programma eseguibile chiamato un *motore TeX*—il software che si trova tra il tuo codice LaTeX (documento) e il PDF composto. Oggi gli utenti possono scegliere tra vari motori TeX per comporre il proprio codice LaTeX, tra cui pdfTeX, XeTeX e varianti di LuaTeX.

Chi è nuovo all'ecosistema TeX/LaTeX è spesso, comprensibilmente, confuso dalla pletora di nomi dal suono criptico usati per gli strumenti che incontra: TeX, LaTeX, pdfTeX, pdfLaTeX, XeTeX, XeLaTeX, LuaTeX e LuaLaTeX. Se ti senti allo stesso modo, l'aiuto è a portata di mano nell'articolo di Overleaf [Che cosa c'è in un nome: una guida ai molteplici sapori di TeX](/latex/it/articoli-approfonditi/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) che spiega l'origine e il significato di tutti quei termini.

#### Dialetti e primitive TeX

Ogni motore TeX ha un insieme di comandi integrati chiamati *primitivi* che, collettivamente, costituiscono il “dialetto” di quel motore del linguaggio di composizione tipografica TeX, riflettendo le capacità integrate in ciascun motore. Qui, il termine “primitiva” usato per descrivere i comandi integrati dei motori TeX non *contiene* significa che quei comandi siano basilari o semplicistici, ma che sono fondamentali e indivisibili: non costruiti a partire da altri comandi (a differenza delle macro). Tutti i motori TeX condividono un ampio insieme centrale di primitive ma alcuni contengono primitive specifiche di quel motore—dando origine alla nozione di “dialetto” di TeX.

Indipendentemente dal motore TeX usato per comporre il tuo documento LaTeX, il suo compito è elaborare (“eseguire”) la raccolta di comandi LaTeX (cioè macro) usati per scrivere e costruire il tuo documento. In effetti, il motore TeX “converte” il tuo codice LaTeX (macro) *di nuovo in* i loro corrispondenti comandi primitivi del motore TeX che il motore può eseguire per effettuare la composizione tipografica vera e propria. Non devi *abbia* usare comandi LaTeX per comporre documenti con i motori TeX—puoi *potresti* scegliere di costruire i tuoi documenti interamente con primitive TeX, cioè direttamente nel linguaggio di *programmazione TeX* di basso livello integrato nei motori TeX. Tuttavia, secondo gli standard odierni, il linguaggio TeX è piuttosto arcano e generalmente considerato difficile in cui programmare—può anche richiedere un gran numero di primitive integrate per raggiungere il tuo obiettivo di impaginazione, rendendo il compito di programmazione soggetto a errori e potenzialmente ripetitivo.

Per evitare di dover scrivere direttamente nel linguaggio TeX, o di dover digitare continuamente la stessa serie di comandi, i motori TeX ti permettono di creare “scorciatoie” chiamate *macro*. Creando macro definisci i tuoi comandi personali che impacchettano sequenze potenzialmente lunghe e complesse di primitive del linguaggio TeX (o altre macro) in un singolo comando di livello “più alto”. I programmatori TeX possono scrivere macro molto sofisticate che racchiudono una grande quantità di funzionalità in un singolo comando—come i comandi forniti da LaTeX. Usando pacchetti di macro, come LaTeX (o [ConTeXt](https://wiki.contextgarden.net/Main_Page)), gli autori dei documenti sono (per lo più) protetti da molti dettagli noiosi, consentendo loro di concentrarsi sulla scrittura e l'impaginazione piuttosto che lottare costantemente con le complessità e le sfumature del linguaggio TeX.

## All'inizio...

Insieme alla progettazione di algoritmi per la composizione tipografica della matematica e per sofisticati a capo delle righe, Knuth dovette affrontare la sfida di programmare il suo software TeX per comporre tabelle. Chiaramente, qualsiasi algoritmo di costruzione delle tabelle non deve essere eccessivamente restrittivo, perché ciò frusterebbe gli utenti che hanno bisogno della libertà di creare un intervallo quasi infinito di layout di tabelle. Inoltre, le celle delle tabelle possono contenere un'ampia gamma di contenuti, inclusi matematica, grafica e pezzi di testo spezzati in righe ben composte—in effetti, qualunque cosa TeX sia in grado di comporre tipograficamente. Fornire questa flessibilità richiede che gli algoritmi di costruzione delle tabelle di TeX lavorino fianco a fianco con altre parti dei meccanismi di composizione tipografica di TeX.

Tuttavia, i motori TeX impongono un prezzo per la flessibilità offerta dalle loro capacità di costruzione delle tabelle: numerose sottigliezze e sfumature nel comportamento di basso livello dei comandi integrati (primitivi) di composizione delle tabelle, che sono 9:

* **`\halign`**, **`\valign`**: comandi fondamentali per la costruzione di tabelle
* **`\tabskip`**: colla inserita tra le colonne di \halign o le righe di \valign
* **`\cr`**: terminatore obbligatorio di “ritorno a capo” per tutte le righe in una tabella
* **`\noalign`**: inserisce materiale tra le righe di \halign o le colonne di \valign
* **`\everycr`**: comandi (registro token) da leggere dopo aver rilevato \cr
* **`\span`**: comando a doppia funzione: \span crea celle che si estendono su colonne o righe, oppure espande comandi nel preambolo della tabella (lo considereremo in dettaglio)
* **`\omit`**: salta i modelli per una cella particolare
* **`\crcr`**: usato nelle macro per evitare errori se gli utenti dimenticano un \cr richiesto

Incontreremo questi comandi nel nostro viaggio attraverso la costruzione delle tabelle.

### Echi lontani delle sfide

Nascosto nel [codice sorgente di TeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) c'è una presentazione piuttosto scoraggiante dell'argomento dell'implementazione dei comandi di basso livello \halign e \valign progettati per comporre tabelle:

> “È una sorta di miracolo ogni volta che \halign e \valign funzionano, perché attraversano così tante strutture di controllo di TeX. Pertanto la pagina attuale probabilmente non è il posto migliore da cui per un principiante iniziare a leggere questo programma; è meglio padroneggiare prima tutto il resto.”

Knuth prosegue dicendo

> “Notate che mentre \halign viene elaborato, rinunciamo senza timore al controllo del resto di TeX. Nei momenti cruciali, a una routine di allineamento viene chiesto di intervenire e compiere una piccola azione, ma per la maggior parte del tempo queste routine restano semplicemente in agguato sullo sfondo. È un po' come un suggerimento post-ipnotico.”

Da questi commenti sembra ragionevole concludere che, anche per Knuth, implementare la composizione tipografica delle tabelle di TeX fosse “una sorta di sfida”—per fornire controllo e flessibilità all'utente ma contemporaneamente assicurando che gli algoritmi automatizzati di costruzione delle tabelle di TeX fossero ben orchestrati con i processi fondamentali di composizione tipografica di TeX.

L'autore attesta volentieri la complessità del codice e degli algoritmi alla base delle capacità di composizione delle tabelle di TeX, ma anche l'ammirazione per la pura quantità di funzionalità contenuta in una quantità relativamente piccola di codice Pascal (o C), sebbene denso.


---

# 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/14-how-do-tex-engines-typeset-tables.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.
