> 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/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# Un'introduzione a LuaTeX (Parte 1): che cos'è — e cosa lo rende così diverso?

LuaTeX è un *kit di strumenti*—contiene sofisticati strumenti software e componenti con cui puoi costruire (impaginare) un'ampia gamma di documenti. Anche il sottotitolo di questo articolo pone due domande su LuaTeX: Che cos'è—e cosa lo rende così diverso? La risposta a “Che cos'è?” può sembrare ovvia: “È un motore di impaginazione TeX!” In effetti lo è, ma una visione più ampia, e a cui questo autore aderisce, è che LuaTeX è un sistema basato su TeX estremamente versatile *sistema per la costruzione e l'ingegneria di documenti*.

### Spiegare LuaTeX: da dove iniziare?

L'obiettivo di questo primo articolo su LuaTeX è offrire un contesto per comprendere ciò che questo motore TeX fornisce e perché/in che modo il suo progetto consenta agli utenti di costruire/progettare/creare un'ampia gamma di soluzioni a problemi complessi di impaginazione e progettazione—offrendo forse anche un certo grado di “protezione per il futuro”, dato che gli utenti hanno sempre più bisogno di software basato su TeX in grado di adattarsi al panorama tecnico in continua evoluzione. A parere di questo autore, elencare e descrivere le sue caratteristiche/capacità non è necessariamente il modo migliore per iniziare quando si sviluppa una comprensione delle capacità e del potenziale di LuaTeX. Un simile approccio non sarebbe particolarmente utile per i lettori che non hanno familiarità con altri motori TeX e per i quali i confronti basati sulle funzionalità difficilmente avrebbero un significato particolare.

Con il rischio di esaurire la pazienza del lettore (“Arriva al punto!”) adotterò un approccio più “olistico”, sperando di fornire un utile contesto, ma al costo di ulteriore lettura—e di addentrarmi in alcuni argomenti di programmazione per aiutare la comprensione. In [Parte 2](/latex/it/articoli-approfonditi/09-an-introduction-to-luatex-part-2-understanding-directlua.md) esploriamo l'uso di `\directlua` ma, per ora, cerchiamo di gettare le basi fondamentali per comprendere LuaTeX.

Questo articolo riflette fortemente il “percorso” personale dell'autore nello sviluppare una comprensione e un apprezzamento di LuaTeX: sapere prima qualcosa della filosofia alla base dello sviluppo di LuaTeX, e vederlo come un contenitore di strumenti software, ti farà apprezzare meglio gli ampi ambiti di soluzione che questo straordinario software apre.

## LuaTeX: non solo per l'accademia, o per la matematica!

La ricchezza di funzioni e funzionalità integrate in LuaTeX non solo offre un'impaginazione di qualità eccezionalmente elevata tramite il tradizionale LaTeX, ma apre anche enormi possibilità per sviluppare soluzioni su misura, non basate su LaTeX, a problemi complessi di produzione e ingegneria dei documenti. LuaTeX incorpora il potente linguaggio di scripting Lua, il che significa, ad esempio, che puoi usare Lua per caricare “plugin” (librerie software esterne) in LuaTeX; ciò consente ulteriormente elevati livelli di automazione, integrazione nei sistemi o nei flussi di lavoro software esistenti e l'uso di software specializzato per l'elaborazione di dati, testi o grafica.

Storicamente, TeX è stato associato alla scrittura/pubblicazione accademica, soprattutto in ambito matematico, ma LuaTeX, in particolare, ha un potenziale significativo per l'applicazione in molti altri domini—inclusa la produzione commerciale di documenti PDF. Un esempio di questo è [speedata publisher](https://speedata.github.io/publisher/) che usa LuaTeX esclusivamente come motore di generazione PDF all'interno del suo flusso di lavoro basato su XML—non usa affatto LaTeX. In effetti, speedata publisher non contiene praticamente alcun codice TeX—ho chiesto [Patrick Gundlach](https://twitter.com/patrickgundlach), sviluppatore di speedata publisher, che ha confermato che, in totale, usa circa tre righe di codice TeX. Le sue potenti capacità di impaginazione sono progettate e implementate in codice Lua, usando la Lua API di LuaTeX (un argomento che discuteremo più avanti in questo articolo).

## Una breve storia personale: come ho scoperto per la prima volta LuaTeX

Scoprii per la prima volta LuaTeX tra la fine del 2009 e l'inizio del 2010, quando era ancora nella fase di beta intermedia (versione 0.50). All'epoca stavo cercando software basato su TeX per impaginare gli appunti scritti a mano risultanti dai miei sforzi per imparare un po' di arabo. Le ricerche su Google portarono a una raccolta di video della conferenza TUG 2009 ([ora su YouTube](https://www.youtube.com/playlist?list=PL2D4DD50DC9C0BA0E)) che includeva dimostrazioni di impaginazione araba di altissima qualità (tramite il pacchetto ConTeXt di Hans Hagen [pacchetto ConTeXt](http://wiki.contextgarden.net/Main_Page)). Quei video includono anche un intervento intitolato [Il progetto LuaTeX: a metà strada verso la versione 1](https://youtu.be/AKv4po9PGW0).

Il motore TeX usato per produrre quell'eccellente impaginazione araba era qualcosa chiamato “LuaTeX”. A quel tempo lavoravo nell'editoria scientifica (fisica), ma pur essendo pienamente consapevole di TeX/LaTeX non avevo mai sentito parlare di LuaTeX: ne fui incuriosito e volli saperne di più su questo nuovo motore TeX. Poiché LuaTeX era ancora nella fase di sviluppo beta ed era soggetto a rapido sviluppo, volevo restare aggiornato con gli ultimissimi aggiornamenti, quindi l'opzione migliore (per me) era la via fai-da-te di costruire (compilare) l'eseguibile LuaTeX dal suo codice sorgente. Oltre al programma eseguibile LuaTeX, serve anche un'“installazione TeX” per fornire l'ambiente in cui eseguire LuaTeX (ad es., texmf.cnf, pacchetti macro, font ecc.). Invece di scaricare e installare la enorme [TeX Live](https://www.tug.org/texlive/) distribuzione, optai per creare un'installazione TeX personalizzata assolutamente minima con cui esplorare LuaTeX (un esercizio “interessante” che ho [documentato nel mio blog personale](http://www.readytext.co.uk/?cat=30)). Ogni nuova versione di LuaTeX è accompagnata dal suo Manuale di riferimento (ad es., per[la versione 1.0.4](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co)) che documenta le ultime funzionalità e capacità del software. Tuttavia, si tratta di un *manuale di riferimento* e (necessariamente) piuttosto scarno di spiegazioni adatte al principiante che desidera iniziare con questo incredibile motore TeX—si presuppone una certa familiarità con i concetti TeX di basso livello. Dato che avevo scoperto LuaTeX in una fase relativamente iniziale del suo sviluppo, al tempo era relativamente difficile trovare buon materiale introduttivo, quindi ci volle un po' di esplorazione, sperimentazione (e qualche frustrazione…) prima che i pezzi iniziassero ad andare al loro posto. Inutile dire che i miei studi di arabo subirono un brusco arresto mentre mi appassionavo a questo straordinario software e alla fine passai a scrivere [plugin LuaTeX per l'impaginazione dell'arabo](http://www.readytext.co.uk/?p=3143) invece!

Il mio stesso “viaggio con LuaTeX” fu certamente molto non lineare ma, lungo il percorso, offrì l'opportunità di imparare (Lua)TeX (e le installazioni TeX) “dalle basi”: il mio blog ospita una raccolta eclettica di [articoli](http://www.readytext.co.uk/?cat=3) basati su vari argomenti che esplorai e su cui lavorai in quel periodo. Si spera che questo articolo faccia un uso appropriato di quel tempo e di quell'esperienza, aiutando altri a diventare interessati a iniziare a esplorare le capacità di LuaTeX. LuaTeX continua a essere sviluppato e, al momento della stesura, ha raggiunto la versione 1.0.4, rilasciata con TeX Live 2017. Gli sviluppatori sono molto attivi e qualsiasi bug scoperto viene di solito corretto poco dopo essere stato segnalato—ad es., tramite la [mailing list dev-luatex](https://mailman.ntg.nl/mailman/listinfo/dev-luatex) o tramite il [bug tracker online di LuaTeX](http://tracker.luatex.org/my_view_page.php). Molto prima di raggiungere la versione 1.0 LuaTeX era già adatto alla produzione—anche se, naturalmente, bisognava accettare che le funzionalità fossero in continua evoluzione e che, di tanto in tanto, i cambiamenti potessero interrompere il codice TeX esistente. Oggi, LuaTeX è naturalmente supportato dalle piattaforme Overleaf e ShareLaTeX (come LuaLaTeX).

## TeX in un mondo che cambia: nuove tecnologie e flussi di lavoro

È evidente che i motori TeX non operano in un mondo tecnologicamente statico e, occasionalmente, emergono innovazioni che sono candidate immediate e ovvie per l'inclusione nei motori TeX—una di queste innovazioni sono i font variabili OpenType, di cui parleremo brevemente più avanti. Benché non vi siano molti dubbi sul fatto che il software di impaginazione basato su TeX sia straordinariamente versatile, oggi i motori TeX operano all'interno di un ecosistema software in rapido cambiamento e molto diversificato—nuovi flussi di lavoro accentuano la necessità di integrazione e la flessibilità di implementare un'ampia gamma di soluzioni per documenti/impaginazione, di cui TeX potrebbe essere solo una componente.

TeX non deve solo rimanere rilevante per i suoi utenti attuali, ma anche attrarne di nuovi abilitando soluzioni di creazione contenuti che restino utili alle generazioni in arrivo—persone che potrebbero non voler necessariamente usare TeX come strumento autonomo ma, forse, come parte di un flusso di lavoro complessivo tramite piattaforme collaborative online come Overleaf.

Anche una breve occhiata a [tex.stackexchange](https://tex.stackexchange.com/) dimostra l'enorme varietà di documenti e soluzioni prodotti e implementati con software basato su TeX—mostrando spesso un'incredibile inventiva mentre le persone trovano casi d'uso e tipi di contenuto sempre nuovi che desiderano generare. Inoltre, la necessità di flussi di lavoro in grado di elaborare markup/contenuto basati su TeX per produrre output non PDF (e non DVI) non è mai stata così grande—come MathML/XML e HTML. Per esempio, “convertire” TeX nel [XML JATS](https://jats.nlm.nih.gov/) formato (a lungo utilizzato nell'editoria di riviste accademiche) ma anche, più recentemente, l'ascesa di epub utilizzato nell'editoria di ebook.

### Tecnologia dei font variabili—I tempi stanno cambiando

Il 14 settembre 2016, Microsoft, [Google](https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html), [Adobe](https://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/) e Apple annunciarono una nuova tecnologia dei font: [i font variabili OpenType](https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369). Non esploreremo questa tecnologia in dettaglio, ma basta dire che esperti di font molto rispettati come [Thomas Phinney](https://twitter.com/ThomasPhinney) e [John Hudson](https://twitter.com/TiroTypeworks) hanno osservato ([su Twitter](https://twitter.com/ThomasPhinney/status/917087509342851072)) che la tecnologia dei font variabili viene adottata molto più rapidamente di molte innovazioni tipografiche precedenti—probabilmente spinta dalle esigenze dei web designer che richiedono design responsive in grado di adattarsi alla miriade di diverse dimensioni/risoluzioni degli schermi presenti sui dispositivi mobili.

Chiaramente, i font variabili OpenType sono uno sviluppo interessante ed entusiasmante nelle tecnologie dei font, da cui gli utenti TeX potrebbero senza dubbio trarre beneficio—in effetti, questa domanda è inevitabilmente stata [sollevata su tex.stackexchange](https://tex.stackexchange.com/questions/355104/tex-luatex-xetex-fontspec-support-for-opentype-variable-fonts) con il supporto di LuaTeX discusso nella mailing list di LuaTeX [mailing list](https://www.tug.org/pipermail/luatex/2016-September/006204.html).

A proposito, vale la pena notare che la tecnologia dei font basata sulla creazione “parametrica” dei font non è un'idea del tutto nuova: METAFONT di Knuth e le tecnologie Multiple Master di Adobe sono, in un certo senso, progenitori precoci, anche se i dettagli di implementazione sono piuttosto diversi.

### Font variabili: quando li vogliamo—adesso?

Ogni nuovo standard/specifica tecnologica utile ha bisogno di tempo per “radicarsi” nel proprio ecosistema di sviluppatori e implementatori—compreso il tempo per eliminare eventuali ambiguità o interpretazioni del testo stesso della specifica. Gli sviluppatori devono leggere e comprendere la documentazione e trasformarla in software realmente funzionante—che, in questo caso, include la creazione dei font e delle tecnologie per usarli: browser e motori di impaginazione compatibili. Gli sviluppatori TeX avranno chiaramente bisogno di accedere a font variabili di alta qualità che possano essere utilizzati come affidabili “benchmark” per implementare (programmare) il supporto alle tecnologie dei font variabili.

L'implementazione di qualsiasi nuova tecnologia all'interno di TeX, come i font variabili, solleva la *potenziale* necessità di modificare gli interni dei motori TeX—naturalmente, la necessità di farlo dipende dalla natura di quella tecnologia e, soprattutto, da quale aspetto del comportamento di TeX è soggetto al cambiamento. Non è sempre necessario modificare gli stessi motori TeX, magari richiedendo solo modifiche al software di supporto/ausiliario, inclusi eventuali “componenti” (librerie di codice di terze parti) usati in quei programmi. Internamente, i motori TeX sono *diabolici* complessi—sviluppare una comprensione del codice sorgente di TeX sufficiente a effettuare modifiche affidabili richiede un'esperienza considerevole e altamente specialistica (di cui esiste una fornitura molto limitata). È inoltre essenziale che eventuali modifiche non compromettano la stabilità/compatibilità a lungo termine dei motori TeX—cosa vitale per la comunità TeX e per coloro che successivamente elaborano i file (La)TeX di un autore: in particolare editori accademici e servizi basati su cloud come Overleaf e ShareLaTeX.

Molti utenti TeX saranno probabilmente interessati a sfruttare i font variabili; ad esempio, implementando nuove possibilità di design o trovando soluzioni a difficili problemi di impaginazione. Quindi, in un certo senso, c'è un dilemma: utenti TeX che vogliono accedere a una nuova tecnologia ma la sua implementazione dipende da una risorsa molto limitata: il numero di sviluppatori qualificati e in grado di realizzarla. La modifica degli interni di TeX è difficile e, in generale, è meglio evitarla ove possibile, quindi esiste un altro modo per affrontare l'aggiunta di nuove funzionalità/capacità (di certe classi) a TeX? Sì! e LuaTeX ha preso proprio quella strada.

#### Primi esperimenti: font variabili OpenType e LuaTeX

Il progetto di LuaTeX ha consentito una rapida sperimentazione con la tecnologia dei font variabili. Già nell'aprile 2017, il formato TeX ConTeXt, che usa LuaTeX, aveva una [versione beta](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) che implementava i font variabili OpenType. Ciò è stato possibile perché il supporto ai font di ConTeXt è costruito in codice Lua (e ConTeXt ha un proprio fontloader scritto in Lua).

## LuaTeX: sfondo e storia

LuaTeX è, in termini TeX, “il nuovo arrivato” nonostante sia in sviluppo attivo da oltre 10 anni. Il sito web di LuaTeX [documenta](http://www.luatex.org/roadmap.html) che LuaTeX è nato nel 2005 con (credo) uno sviluppo attivo e continuo iniziato nel 2006. A causa della sua intrinseca complessità, e della diligenza di coloro che lo hanno costruito, a LuaTeX sono serviti davvero 10 anni di sviluppo per raggiungere la versione 1.0, che fu [annunciata dai suoi sviluppatori](https://mailman.ntg.nl/pipermail/dev-luatex/2016-September/005882.html) (Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso) il 27 settembre 2016.

In quell'annuncio di rilascio c'è una importante dichiarazione di principio:

> “Il nostro obiettivo principale è fornire una variante di TeX che consenta estensioni da parte dell'utente senza la necessità di adattare il funzionamento interno.”

Questa formulazione riassume perfettamente la filosofia alla base dello sviluppo di LuaTeX e indica una strada attraverso la quale il software basato su TeX può affrontare le sfide che abbiamo già menzionato: adottare nuove tecnologie e rimanere rilevante per le nuove generazioni di utenti.

È ora il momento di affrontare la seconda domanda contenuta nel sottotitolo di questo articolo: “cosa lo rende così diverso”. Esplorando il significato di “...consente estensioni da parte dell'utente senza la necessità di adattare il funzionamento interno” possiamo comprendere meglio l'essenza di ciò che LuaTeX “porta in dote”.

## LuaTeX: aprire la “scatola nera” di TeX

Il programma TeX originale di Knuth è l'antenato comune di tutti i moderni motori TeX in uso oggi e LuaTeX è, in effetti, l'ultimo passo evolutivo: derivato dal programma pdfTeX ma con l'aggiunta di alcuni potenti componenti software che apportano una grande quantità di funzionalità aggiuntive. Quando Knuth scrisse la versione originale del software TeX fornì anche il linguaggio TeX come modo per controllare e programmare il suo comportamento di impaginazione: agli utenti e agli sviluppatori dei pacchetti macro TeX furono resi disponibili circa 320 comandi di basso livello (primitive). Quei comandi offrivano diversi gradi di controllo o influenza su certi aspetti del comportamento tipografico di TeX, ma gran parte della funzionalità interna, degli algoritmi, dei processi decisionali, dei dati e delle strutture dati di TeX erano nascosti all'utente. Si potrebbe sostenere che il programma TeX di Knuth non fosse una scatola “completamente nera”, ma certamente una sfumatura molto scura di grigio—ammettiamolo, anche il codice sorgente fu reso disponibile ma, per la stragrande maggioranza delle persone, anch'esso è una scatola nera incomprensibile.

Ci riferiamo ai processi interni di TeX come a una sorta di “scatola nera”; tuttavia, LuaTeX apre i suoi interni basati su TeX per fornire a utenti/sviluppatori un accesso molto maggiore a, e un controllo di, molti dei processi un tempo nascosti che avvengono in profondità all'interno del motore TeX. LuaTeX aggiunge anche molti nuovi comandi primitivi che forniscono controllo sulle nuove funzionalità.

### LuaTeX: derivato da pdfTeX ma non usa il codice di pdfTeX

Per precisione, è importante notare che sebbene abbiamo descritto LuaTeX come derivato da pdfTeX, LuaTeX non usa direttamente il codice di programma originale di pdfTeX. Uno degli sviluppatori di LuaTeX (Taco Hoekwater) intraprese il compito davvero *erculeo* di riscrivere il motore TeX di base di LuaTeX in codice C pulito e moderno (CWEB).

#### Nota storica

In parte a causa dell'età del codice sorgente originale di TeX di Knuth—dal quale derivano i suoi discendenti moderni—modificarlo per adattarlo o creare nuovi motori di impaginazione basati su TeX è un processo complesso e contorto. Parte di quel processo richiede la conversione del codice Pascal in codice C—che non è privo di una [certa dose di complessità](http://www.readytext.co.uk/?p=2529). Il codice C generato automaticamente risultante è straordinariamente prolisso e molto difficile da leggere o comprendere. Chiaramente, il fatto che il codice di LuaTeX sia stato completamente riscritto aggira l'intero processo di conversione da Pascal a C.

## I mattoni di LuaTeX

Nell'introduzione abbiamo fatto riferimento a LuaTeX come a un “kit di strumenti” e lo abbiamo descritto come un “sistema per la costruzione e l'ingegneria dei documenti”. Abbiamo visto che nell'annuncio di LuaTeX 1.0 i suoi sviluppatori dichiararono:

> “Il nostro obiettivo principale è fornire una variante di TeX che consenta estensioni da parte dell'utente senza la necessità di adattare il funzionamento interno.”

È ora il momento di riunire questi fili e focalizzarci sui dettagli di ciò che tutto ciò *significa davvero* in pratica.

### Il puzzle di LuaTeX

Se guardassi “sotto il cofano” vedresti che il software LuaTeX, cioè il programma eseguibile vero e proprio, è costruito a partire da una raccolta di componenti software combinati insieme per fornire la funzionalità complessiva di LuaTeX. Naturalmente, non c'è nulla di nuovo e la maggior parte del software è costruita così. Tuttavia, ciò che rende LuaTeX diverso dagli altri motori TeX è che questi componenti sono combinati in modo tale da offrire agli utenti un accesso molto maggiore a molti aspetti della funzionalità interna di TeX: gli algoritmi di impaginazione di TeX, i processi decisionali, i dati e le strutture dati. Questa apertura degli interni di TeX consente agli utenti di costruire nuove soluzioni tipografiche senza la necessità di modificare il motore TeX vero e proprio.

### Il Lua in LuaTeX: una chiave per la “scatola nera”

Lua è un linguaggio di scripting molto potente, ma facile da imparare, che [ha origine in Brasile](https://www.lua.org/about.html)—fu creato nel 1993 ed è ancora sviluppato attivamente. Uno dei punti di forza di Lua è il suo uso come linguaggio di programmazione con cui “collegare insieme” componenti software eterogenei, consentendoti di usarli tramite un linguaggio di scripting semplice ma versatile. Lua svolge un ruolo centrale nell'aprire il funzionamento interno del motore TeX LuaTeX, ma per comprendere meglio come ciò sia ottenuto, vale la pena fare una piccola deviazione per discutere molto brevemente due concetti di programmazione:

* Interfaccia di programmazione delle applicazioni (API);
* binding di linguaggio.

Sentiti libero di saltare questa sezione se ti senti a tuo agio con questi concetti. Nessuno dei due argomenti sarà trattato in dettaglio—non puntiamo a un rigore tecnico assoluto ma piuttosto a fornire solo il contesto sufficiente per essere consapevoli di questi concetti: il loro significato e la loro rilevanza per LuaTeX.

### Interfaccia di programmazione delle applicazioni (API)

Immagina di essere un programmatore che ha scritto del codice che gli utenti (altri programmatori) potrebbero trovare utile, ma il tuo codice è complesso e non vuoi che gli utenti del tuo codice debbano preoccuparsi di quei dettagli di basso livello. Nota che quei programmatori/sviluppatori lavorano con lo stesso linguaggio di programmazione che hai usato per scrivere il tuo codice. Inoltre, supponiamo che tu abbia intenzione di riscrivere alcune parti del tuo codice—ad es. per renderlo più veloce, richiedere meno memoria e così via. Gli utenti esistenti del tuo codice non dovrebbero preoccuparsene: eventuali modifiche che intendi apportare non dovrebbero rompere i loro programmi. Quindi, qual è la soluzione?

La risposta risiede in qualcosa chiamato API: una *Interfaccia di programmazione delle applicazioni*. Invece di richiedere agli utenti (altri programmatori) di accedere ai dettagli di basso livello del tuo codice—che potrebbero cambiare—fornisci un insieme specifico di *funzioni* che altri programmatori possono usare. Queste funzioni sono una *interfaccia* al tuo codice, attraverso la quale altri sviluppatori possono costruire *applicazioni* senza dover avere una conoscenza intima del funzionamento interno del tuo programma. In qualche modo puoi pensare a questo come a un ulteriore livello che circonda il tuo codice e “isola” gli utenti dai dettagli confusi e di basso livello.

A condizione che non modifichi quelle funzioni (l'interfaccia) sei libero di modificare e aggiornare i dettagli di livello inferiore del tuo software senza influire (rompere) il lavoro di coloro che si affidano al tuo codice per costruire le loro applicazioni: da qui il termine Interfaccia di programmazione delle applicazioni.

#### API: un'analogia con un pacchetto LaTeX

Quando usi i comandi forniti da un pacchetto LaTeX puoi considerare i comandi del pacchetto come una forma di API. Come utente non sei necessariamente interessato alla magia di TeX e LaTeX che sta dietro a quei comandi (cioè nel codice del pacchetto): tutto ciò che vuoi è fare uso delle funzionalità che essi forniscono.

### Binding del linguaggio di programmazione

Abbiamo visto che i programmatori che scrivono/pubblicano un corpo di codice utile (chiamato una *libreria*) possono fornire una cosiddetta Interfaccia di programmazione delle applicazioni (un insieme di funzioni) attraverso la quale altri programmatori, usando lo *stesso* linguaggio di programmazione, possono fare uso di quella libreria (raccolta di codice). Questo va bene quando entrambe le parti (sviluppatore della libreria e suoi utenti) usano lo *stesso* linguaggio di programmazione, ma cosa succede se anche i programmatori che usano un *diverso* linguaggio di programmazione vogliono fare uso di quella libreria? Per esempio, potresti scrivere script usando il linguaggio Lua ma voler utilizzare una libreria scritta, ad esempio, in linguaggi di programmazione come C/C++. In qualche modo, i due diversi linguaggi di programmazione (Lua e C/C++) hanno bisogno della capacità di “comunicare” tra loro. Una soluzione a questo problema è il cosiddetto [binding di linguaggio](https://en.wikipedia.org/wiki/Language_binding).

Esaminare i dettagli tecnici del binding di linguaggio esula dallo scopo di questo articolo, quindi daremo un riassunto conciso dei principi generali. In sostanza, aggiungendo un opportuno “strato” di codice aggiuntivo alla libreria originale, essa può “comunicare” con un altro linguaggio di programmazione (come Lua): quello strato di codice è chiamato un *binding*. Permette ai due linguaggi di interoperare tramite un'API attraverso la quale i programmatori del secondo linguaggio (come Lua) possono accedere alle funzionalità/servizi forniti dalla libreria.

![Diagramma schematico per mostrare il concetto di un binding di linguaggio.](/files/552a3b89c3ac69dd3a8081872e71e30e7ce293e2)

**Figura 1**: Diagramma schematico per mostrare il concetto di un binding di linguaggio: consentire a un programma scritto in Lua di usare una libreria esterna scritta in un altro linguaggio di programmazione. È attraverso l'uso di binding Lua che i componenti interni di LuaTeX, e quindi gran parte della funzionalità tipografica interna di LuaTeX, vengono resi disponibili agli utenti per sviluppare soluzioni a problemi complessi di impaginazione.

## LuaTeX: due opzioni di programmazione—TeX e Lua

In sostanza, LuaTeX è un motore TeX che supporta due linguaggi di programmazione: il tradizionale linguaggio basato su TeX e il linguaggio di scripting Lua. Naturalmente, puoi usare entrambi i linguaggi nello stesso documento TeX oppure, se preferisci, continuare a impaginare tramite la sola strada TeX: per esempio, tramite il pacchetto macro LaTeX (LuaLaTeX). TeX (o LaTeX) non è un linguaggio di programmazione facile da usare o da imparare, e relativamente poche persone hanno davvero padroneggiato le molte idiosincrasie di TeX—i concetti di [token](https://www.overleaf.com/blog/522-what-is-a-tex-token) e di espansione sono del tutto estranei alle aspettative e alle esperienze di programmazione della maggior parte delle persone.

L'aggiunta di Lua apre la possibilità di usare l'impaginazione basata su TeX tramite un linguaggio di programmazione molto più accessibile e convenzionale—come osservato all'inizio di questo articolo, usando la Lua API puoi eseguire [un'impaginazione sofisticata con praticamente nessun codice TeX](http://wiki.luatex.org/index.php/TeX_without_TeX).

### LuaTeX aggiunge molte nuove primitive

Ogni motore TeX fornisce centinaia di cosiddetti comandi primitivi: i mattoni fondamentali del linguaggio basato su TeX supportato da ciascun singolo motore di impaginazione. La versione originale di TeX rilasciata da Donald Knuth forniva circa 320 comandi, ma i motori TeX più recenti (pdfTeX, XeTeX e LuaTeX) hanno ciascuno aggiunto molte nuove primitive per fornire agli utenti accesso alle funzionalità e capacità aggiuntive di ciascun motore. Il considerevole numero di nuove primitive di LuaTeX è documentato nel suo [Manuale di riferimento](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

Tra le molte nuove primitive introdotte da LuaTeX ve n'è una chiamata `\directlua{...}` che è la porta d'accesso all'uso del codice Lua: accedere agli interni del motore LuaTeX per costruire strumenti e soluzioni tipografiche sofisticate.

### \directlua{...}: la porta d'accesso alla programmazione Lua

Come discusso, il linguaggio di scripting Lua può essere visto come una “strato” attraverso il quale è possibile accedere al motore di impaginazione basato su TeX di LuaTeX e alla funzionalità fornita da molti dei componenti da cui LuaTeX è costruito. Il linguaggio Lua è anche il meccanismo che consente l'estendibilità di LuaTeX—attraverso la capacità di Lua di caricare librerie software/codice esterne specialistiche.

Collettivamente, l'interfaccia Lua (insieme di funzioni basate su Lua) fornita da LuaTeX viene definita sua *Lua API*: è il “collegamento di comunicazione” tra il motore/componente interno di LuaTeX e il documento dell'utente.

### Un semplice esempio di \directlua{...}

I seguenti *estremamente semplice* esempio non fa nemmeno intravedere la punta dell'iceberg delle possibilità. Tuttavia, serve a dimostrare l'idea di base dell'interazione tra il “modo TeX” e il “modo Lua” di accedere ai parametri di TeX.

Si noti che:

* `\hsize` è una primitive TeX (comando) che imposta il valore di un parametro interno che determina la larghezza delle linee impaginate—for example, di solito la si imposta a un valore adatto all'interno di un `\vbox{...}`. `\hsize` è solo uno dei *molte* parametri TeX a cui puoi accedere e/o che puoi modificare con il codice Lua.
* Accedere ai parametri TeX è solo un *piccolissimo* aspetto della Lua API di LuaTeX: c'è molto di più!

```latex

\documentclass{article}
\begin{document}
\let\\\relax %ridefinisce il significato di \\ per evitare problemi di espansione
Ecco il valore corrente di {\ttfamily\string\hsize} (tramite \LaTeX):
\the\hsize\par
\directlua{
%Ottieni il valore corrente di \hsize usando la Lua API
local hs=tex.hsize
% Usa una funzione della Lua API per stampare alcuni
% codice LaTeX e il valore di \hsize
tex.print("Ecco il valore di {\ttfamily\string\hsize}
riportato dal codice Lua (in punti scalati): ")
tex.print(hs.."\par")
% Imposta un nuovo valore per \hsize usando la Lua API
tex.hsize="400pt" % oppure usa tex.hsize=400*65536 (in punti scalati)
}%
% Dopo che \directlua ha finito, chiedi a LaTeX
% di dirci il nuovo valore di \hsize
Ecco il valore di {\ttfamily\string\hsize} riportato
da \LaTeX{} dopo che {\tt\string\directlua} ha terminato:
\the\hsize\par
\end{document}
```

Ecco un'immagine che mostra il risultato dell'impaginazione di LuaTeX del codice LaTeX (sopra):

![Risultati dell'esecuzione di LuaTeX](/files/43b55403ef4b8d946487a7b55f54c2c905168035)

Si noti che l'“astuzia” TeX di `\let\\\relax` serve a evitare problemi causati dall'“espansione” del codice Lua da parte di LuaTeX: un argomento che accenniamo brevemente qui sotto.

### Uso del codice Lua

Esistono due opzioni principali per usare codice Lua nei vostri documenti TeX/LaTeX:

1. **In linea**: Scrivere codice Lua direttamente all'interno del tuo `.tex` documento (come nell'esempio sopra);
2. **Esterno**: Archiviare il codice Lua in `.lua` file di codice e usare le funzioni di Lua per caricarli ed eseguirli.

L'opzione (1) è più adatta a frammenti più brevi di codice Lua. L'opzione (2) si usa per programmi più grandi o librerie di codice Lua. Ha un vantaggio distinto: puoi evitare problemi insidiosi che coinvolgono i cosiddetti `\catcode` valori (che possono essere “piuttosto frustranti”). La ragione di questi `\catcode` problemi è l'“espansione” del codice Lua prima di essere inserito nell'interprete Lua incorporato di LuaTeX. Questa espansione può essere difficile da comprendere, quindi la esploreremo più approfonditamente in un articolo successivo.

Naturalmente esistono pacchetti LaTeX per aiutare a usare il codice Lua nei file .tex—for example, puoi usare il [pacchetto luacode](https://ctan.org/pkg/luacode?lang=en).

## Riepilogo e introduzione alla Parte 2 di questo articolo

I componenti software di cui è costruito LuaTeX, insieme al linguaggio di scripting Lua incorporato, offrono una potente combinazione per realizzare soluzioni in grado di risolvere un'ampia gamma di problemi complessi di impaginazione — e di progettare flussi di lavoro per la produzione di documenti che possono trarre beneficio da una stretta integrazione con un motore di impaginazione basato su TeX. In [Parte 2 di questo articolo](/latex/it/articoli-approfonditi/09-an-introduction-to-luatex-part-2-understanding-directlua.md) esaminiamo in modo approfondito il comando più potente fornito da LuaTeX: `\directlua`.

Fino ad allora, buon LuaTeXing!

## Ringraziamenti

L'autore è estremamente grato a [Luigi Scarso](https://twitter.com/luigi_scarso), uno degli sviluppatori di LuaTeX, per aver dedicato del tempo a leggere una bozza di questo articolo e per aver formulato numerosi commenti e suggerimenti molto utili. Eventuali errori residui di fatto o omissioni sono, ovviamente, dell'autore. Inoltre, desidero ringraziare [Patrick Gundlach](https://twitter.com/patrickgundlach), sviluppatore di [speedata publisher](https://speedata.github.io/publisher/), per il tempo dedicatomi nel rispondere alle mie domande.


---

# 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/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.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.
