# METAFONT

METAFONT è un linguaggio di descrizione di pagina usato per definire tipi di carattere vettoriale e il relativo interprete, che traduce il suo codice per generare caratteri bitmap utilizzabili, ad esempio nei documenti Postscript, entrambi concepiti e realizzati da Donald Knuth per realizzare uno strumento per il sistema di composizione tipografica T$_E$X.
Knuth iniziò a lavorare sul programma per la creazione di caratteri nel 1977, e produsse la prima versione di METAFONT nel 1979. A causa di inadeguatezze nel linguaggio METAFONT originale, Knuth sviluppò un nuovo sistema nel 1984, ed è questo sistema aggiornato che è ancora in uso oggi; METAFONT enumera le versioni con un sistema simile a T$_E$X, in cui il numero si avvicina asintoticamente ad e ad ogni revisione.
Mentre il METAFONT, per definizione, genera grafica raster, John Hobby ha reimplementato questo linguaggio per generare codice PostScript. È nato così il MetaPost, che sfrutta la versatilità del linguaggio ideato da Knuth per generare grafica vettoriale.

## Modalità di funzionamento

Metafont viene spesso eseguito come supporto per i driver dei dispositivi di output (stampante, schermo); in questi casi, il suo compito è generare bitmap per un carattere per una specifica combinazione di dispositivo di output (chiamato modalità in Metafont) e risoluzione(visibile nel nome del file di output, vedi sotto). Queste bitmap sono tipicamente memorizzate per un successivo riutilizzo, in modo che Metafont non debba essere eseguito ogni volta che viene visualizzato un documento, ma d'altra parte le distribuzioni TeX con un componente Metafont non hanno tipicamente incluso alcun carattere bitmap precostruito, poiché sarebbero piuttosto grandi rispetto alle fonti da cui potrebbero essere generati. Poiché i font Metafont erano tradizionalmente l'impostazione predefinita di TeX da cui altri formati di font erano eccezioni, un'installazione incompleta di un font non Metafont a volte può comportare la chiamata di Metafont e l'emissione di un confuso messaggio di errore " somefont.mf not found".
Altrettanto importante, ma non così comune, è l'esecuzione di Metafont per generare un file di metrica dei caratteri (TFM); un file TFM viene generato solo se la variabile di creazione del carattere è positiva. Tradizionalmente le distribuzioni TeX sono spesso fornite con tutti i file TFM pre-generati (dato che sono piuttosto piccoli), ma qualcuno che installa un font Metafont dai sorgenti dovrà generare il suo file TFM prima che TeX possa usarlo.
Un terzo modo di utilizzare Metafont è la modalità di prova: se la variabile di correzione è positiva, il file del font bitmap contiene anche informazioni aggiuntive fornite tramite comandi special, in particolare le posizioni e i nomi dei punti che il designer del font ha considerato importanti per il design. Se si utilizza l'utilità gftodvi separata per generare immagini ingrandite dei glifi dei caratteri, vengono incluse queste informazioni dalle offerte speciali; le posizioni dei punti non sono limitate alla risoluzione dei pixel.
Metafont può anche essere eseguito in modo interattivo e dispone di comandi per visualizzare sullo schermo le immagini che produce. Knuth ha affermato di utilizzare Metafont come una sorta di calcolatrice da tavolo per risolvere equazioni complicate, sebbene ora utilizzi MetaPost per le illustrazioni matematiche.
Metafont può eseguire il rendering di qualsiasi tipo di output grafico, non solo glifi. Tuttavia, MetaPost e Asymptote sono preferiti per le illustrazioni matematiche. Metafont è più comunemente invocato senza una richiesta diretta da parte dell'utente. I file DVI possono contenere solo riferimenti a caratteri tipografici, piuttosto che i set di glifi raster o vettoriali consentiti da altri formati come PostScript. Di conseguenza, è necessario accedere ai glifi nei caratteri tipografici ogni volta che viene richiesta la visualizzazione, la stampa o la conversione di un file DVI.

### File di output

Metafont genera diversi tipi di file: per un file chiamato NAME.mf, può generare:
* NAME.NNNNgf - File con output raster alla risoluzione NNNN (2602 per impostazione predefinita).
* NAME.tfm - File con la metrica dei caratteri TeX, che sono le informazioni di cui TeX ha bisogno. Di solito si deve dire a metafont di generare questo file.
* NAME.log: Log file output dall'elaborazione
Dopo aver eseguito Metafont, in genere si utilizza il programma gftopk per convertire i file NNNNgf in formato pk (packed) .NNNNpk. Il formato pk è stato introdotto principalmente per ridurre le dimensioni del file (a circa la metà), ma si prevede anche che acceleri l'elaborazione poiché dovrebbero essere input / output meno dati. I formati GF e PK utilizzano entrambi la run-length encoding dei bitmap, ma producono codifiche binarie diverse delle run-lengths. Il formato PK esegue anche una pre-elaborazione dei bitmap (riquadro di delimitazione, eliminazione di righe ripetute) e codifica tutte le righe di un carattere come una lunga sequenza di bit.
Nello standard TeX Directory Structure, i nomi dei file sono limitati a 8 + 3 caratteri, quindi i file GF e PK avrebbero solo estensioni.gfe.pk. I file per diverse risoluzioni vengono tenuti separati posizionandoli in directory separate, denominate dpiNNNN, ad esempio dpi300/cmr10.pk.

## Linguaggio

Il linguaggio Metafont è un linguaggio interpretato per programmi che sono essenzialmente dichiarativi piuttosto che imperativi.

### Variabili ed equazioni

Le variabili in Metafont possono essere di otto tipi diversi:
* Numerico (Numeric): numeri con segno a virgola fissa con una epsilon di $2^{-16}$, il limite massimo è inferiore a 4096 (Q12.16). Questa è l'impostazione predefinita per le variabili non dichiarate di un altro carattere.
* Coppia (Pair): una coppia di valori numerici, utilizzata principalmente per rappresentare punti nel piano.
* Tracciato (Path): come in PostScript / PDF / SVG, una curva parametrica nel piano le cui funzioni di coordinate sono polinomi cubici a tratti. Come in questi altri sistemi, i segmenti di tracciato sono codificati come curve di Bézier in termini di nodi e punti di controllo.
* Trasforma (Transform): una trasformazione affine del piano, equivalente a una "matrice (trasformazione)" in PostScript / PDF.
* Penna (Pen): un poligono convesso, che rappresenta la forma di una "penna" usata per disegnare.
* Immagine (Picture): un'immagine raster con un valore intero con segno per ogni pixel.
* Booleano (Boolean)
* Stringa (String) di caratteri a 8 bit.
Metapost aggiunge il colore (una tripla di valori numerici) come nono carattere e ha un modello completamente diverso (non raster) per le immagini; quest'ultimo è il principale punto di divergenza tra i due programmi. Le macro di Metafont vardef vivono anche nello stesso spazio dei nomi delle variabili e possono in qualche modo essere considerate come un nono tipo di variabile, sebbene le macro non esistano come valori di prima classe in Metafont.
Insolitamente, i nomi delle variabili non sono semplici token, ma sequenze di token simbolici e indici numerici; il nome della variabile x2rnon è quindi un token alfanumerico, ma una sequenza dei tre token x(simbolico), 2(numerico) e r(simbolico). I caratteri record e array possono essere simulati attraverso raccolte di variabili che condividono un prefisso di nome comune, un idioma supportato dal sistema di dichiarazione del carattere che fornisce a tutte le variabili i cui nomi che differiscono solo negli indici numerici lo stesso carattere (come previsto per gli array) mantenendo le variabili intere name differiscono in alcuni token simbolici separati (come previsto per i record).
Una caratteristica molto distintiva di Metafont è l'uso di equazioni per definire le variabili. Una variabile numerica (o componente di una coppia o variabile di trasformazione) può essere nei tre stati noto (insieme), sconosciuto indipendente (non impostato) e sconosciuto dipendente (non impostato, ma dato da un'espressione lineare di uno o più indipendenti). Quando Metafont esegue un'istruzione di equazione, trasforma uno degli indipendenti coinvolti in un dipendente e lo elimina dalle espressioni per tutti gli altri dipendenti; quando non rimangono indipendenti nell'espressione per una variabile dipendente, quella variabile diventa nota. Risoluzione di sistemi di equazioni lineari quindi è una caratteristica incorporata del linguaggio Metafont, e il metodo consigliato per assegnare la maggior parte delle variabili (specialmente quelle i cui valori hanno un significato geometrico) è di indicare le equazioni che determinano i loro valori. I sistemi di equazioni spesso mescolano equazioni numeriche (scalari) con equazioni a coppie (vettoriali).
Un'eccezione a quanto sopra è la classe delle variabili di quantità interne. Questi hanno nomi costituiti da un solo segno simbolico, sono sempre numerici e sono sempre noti. Hanno una rappresentazione interna più diretta rispetto alle variabili ordinarie, il che rende conveniente per le operazioni primitive in Metafont (o le sue estensioni) usarle implicitamente.

### Sintassi

Metafont ha token numerici e costanti di stringa con sintassi mainstream; le stringhe sono delimitate da "(virgolette), le costanti numeriche possono avere decimali ma non una parte esponente. Tutti gli altri token sono classificati come simbolici e possono essere ridefiniti arbitrariamente; non vi è alcuna restrizione che i token con determinati significati debbano avere nomi composti da determinati caratteri. In fase di esecuzione, possono esserci in aggiunta token capsula, che sono effettivamente token a valore costante di tipo arbitrario; nel codice sorgente questi appaiono come token simbolici.
Tranne quando i caratteri sono coinvolti in costanti numeriche o stringa, l'estensione del token contenente un particolare carattere dipende dalla classe a cui appartiene il carattere; a differenza di TeX, Metafont ha classi di caratteri fisse. I caratteri,, ;, (, e )sono "solitari" e formano solo token a carattere singolo. Per le classi di caratteri <=>:|, ‘’(apici), +-, /*\, !?, #&@$, ^~, [, ],, e., così come la classe di sottolineatura insieme a maiuscole e minuscole A-Z, il token consiste della più lunga sequenza consecutiva di caratteri dal medesimo classe. I caratteri con spazi bianchi non contribuiscono con i token.% avvia un commento che dura fino alla fine della riga.
Un'applicazione notevole di queste regole è che #appare frequentemente come parte dei nomi delle variabili nel codice Metafont, ad esempio em#e pt#.
I delimitatori (come le parentesi) non hanno significati incorporati, invece c'è un comando che trasforma due token simbolici in una coppia di delimitatori corrispondenti, ma normalmente i programmi Metafont usano solo le parentesi ordinarie. Oltre a sovrascrivere le priorità nelle espressioni, sono necessari anche delimitatori per certi tipi di argomenti macro.

### Grafica

Le curve in Metafont sono definite come spline cubiche piuttosto che quadratiche, per una maggiore versatilità a scapito di un'aritmetica più complessa.
A differenza dei formati di font outline più comuni (come TrueType o PostScript Type 1), un font Metafont è composto principalmente da tratti con "penne" di larghezza finita, insieme a aree riempite. Pertanto, invece di descrivere direttamente il contorno del glifo, un file Metafont descrive i percorsi della penna. Alcuni caratteri Metafont più semplici, come i caratteri matematici calligrafici della famiglia Computer Modern, utilizzano un singolo tratto di penna con una penna relativamente grande per definire ogni "tratto" visivo dei glifi. Caratteri più complessi come il tondo della famiglia Computer Modern utilizzano una piccola penna per tracciare il contorno dei "tratti" visivi, che vengono poi riempiti; il risultato è molto simile a un carattere di contorno, ma con angoli leggermente ammorbiditi definiti dalla forma della penna.
Poiché le forme dei caratteri sono definite da equazioni piuttosto che da numeri codificati direttamente, è possibile trattare parametri come le proporzioni, l'inclinazione del carattere, la larghezza del tratto, la dimensione del serif e così via come parametri di input in ciascuna definizione di glifo (che quindi non definiscono un singolo carattere, ma un meta-font). Pertanto, modificando il valore di uno di questi parametri in una posizione nel file Metafont, è possibile produrre una modifica coerente in tutto il carattere. Computer Modern Roman illustra molti usi di questa funzione; una tipica installazione di TeX include un numero di versioni del font in dimensioni da 5 pt a 17 pt, con le larghezze del tratto uguali in tutte le dimensioni (invece di aumentare quando il carattere viene ridimensionato) e le proporzioni che si allargano nelle dimensioni più piccole per una maggiore leggibilità. Inoltre, la macchina da scrivere Computer Modern e i caratteri sans-serif sono definiti utilizzando essenzialmente lo stesso file Metafont del carattere romano, ma con parametri globali diversi.

## Uso

Sebbene noti designer di caratteri, come Hermann Zapf, abbiano collaborato con Knuth per creare nuovi caratteri utilizzando Metafont, il sistema non è stato ampiamente adottato dai progettisti di caratteri professionisti. Knuth attribuisce questo al fatto che "chiedere a un artista di diventare abbastanza matematico per capire come scrivere un font con 60 parametri è troppo". Jonathan Hoefler ha commentato che il sistema Metafont alla fine è diventato "una tecnologia dietro nessuno dei tuoi caratteri preferiti... L'idea di Knuth che le lettere inizino con forme scheletriche è sbagliata".
Il sistema Metafont consente di elaborare i caratteri in modi insoliti; nel 1982 Knuth ha mostrato come potrebbe essere usato per trasformare i caratteri, con un carattere serif che passa lentamente in un design sans-serif nel corso di un testo.

## Storia

Donald Knuth ha iniziato a lavorare sul software per la creazione di caratteri nel 1977 e ha prodotto la prima versione di Metafont nel 1979. A causa di carenze nel linguaggio Metafont originale, Knuth ha sviluppato un sistema Metafont completamente nuovo nel 1984, ed è questo sistema rivisto che viene utilizzato oggi; Metafont ha un sistema di versioning simile a quello di TeX, dove il numero si avvicina asintoticamente a e ad ogni revisione.

## Esempio

Il seguente esempio crea una forma simile a un fagiolo chiuso per il carattere "B" di un font:
Questo produce il seguente glifo:
L'esempio precedente verrà elaborato con una riga di comando come:
Quindi può essere utilizzato in un file LaTeX come (tutti i file dovrebbero risiedere nella stessa directory o il sistema TeX dovrebbe esserne informato usando metodi appropriati):
Il file PDF risultante dovrebbe essere simile a questo:

## Produzione di font PostScript Type 1

Esistono diversi strumenti per convertire i programmi Metafont in font PostScript Type 1. La maggior parte fa uso della capacità di MetaPost di convertire un sottoinsieme del linguaggio di Metafont in profili EPS, che possono essere successivamente convertiti in font PostScript Type 1. La generazione di contorni vettoriali dei tratti di penna Metafont non è banale, poiché il modello Metafont di un glifo è un'immagine raster e i contorni esatti della maggior parte dei tratti non sono curve di Bézier.
* Il team polacco JNS ha sviluppato METATYPE1 (basato su MetaPost) per la creazione di font PostScript Type 1. Il suo grande svantaggio è che non è possibile utilizzare penne, il che riduce notevolmente la potenza del linguaggio Metafont. Inizialmente, lo strumento è stato utilizzato dalla fonderia di caratteri tipografici polacca GUST per produrre una variante modernizzata ed estesa di Computer Modern, chiamata Latin Modern.
* mf2pt1, anch'esso basato su Metapost, è stato sviluppato da Scott Pakin con alcuni contributi di Werner Lemberg. Ha anche diverse limitazioni dettagliate nel suo manuale, la più significativa è la restrizione secondo cui ogni glifo deve essere disegnato interamente da percorsi chiusi. Per superare i limiti di mf2pt1, l'output EPS di Metapost può essere post-elaborato con FontForge, che è in grado di interpretare complessi percorsi PostScript generati da Metapost dalle penne ellittiche di Metafont, e anche in grado di rimuovere le sovrapposizioni dei contorni. Poiché FontForge supporta lo scripting, anche questo passaggio di post-elaborazione può essere automatizzato. Questo approccio è stato utilizzato per produrre schemi di Type 1 per il carattere matematico MnSymbol sviluppato da Achim Blumensath; MnSymbol è stato progettato come "compagno" di Minion Pro.
* MetaFog è un convertitore proprietario in grado di convertire analiticamente i tratti della penna, ma richiede una post-elaborazione manuale per eliminare i casi degeneri e non è disponibile pubblicamente. Può elaborare solo l'output di Metapost.
L'approccio comune per generare caratteri di Type 1 con tratti di penna rimane quello di generare una bitmap ad alta risoluzione e quindi utilizzare un autotracer, implementato da pacchetti come mftrace e TeXtrace.