Fell Types in ConTEXt

Luigi Scarso

Sommario 1. Type1, un formato di font definito da Adobe in cui il disegno del carattere (il glifo) è es- In questo articolo vengono illustrate installazione senzialmente descritto da curve di Beziér di ed uso di un font OpenType con ConT Xt-mkiv, E terzo ordine espresse in un sottoinsieme del i Fell Types, descritti da M. Dominici nell’arti- linguaggio PostScript (font vettoriale); colo “Utilizzo di caratteri TrueType con LAT X. E 2. TrueType, un formato di font vettoriale de- Un esempio pratico: i Fell Types”. Viene inoltre finito da Apple e MicroSoft, in cui il glifo è descritto un particolare problema causato da un descritto da curve di Beziér di secondo ordine parametro di progettazione dei font e discussa una con un linguaggio dedicato; soluzione offerta da ConT Xt-mkiv. E 3. bitmap, un tipo font in cui il glifo è una im- magine in bianco e nero. Le specifiche True- Abstract Type permettono di incorporare un file ti- In this paper we will briefly show how to install and po immagine nella definizione di un glifo e use an OpenType font with ConTEXt-mkiv. We will queste specifiche sono valide anche per i font use the Fell Types fonts as in M. Dominici’s paper OpenType. “Utilizzo di caratteri TrueType con LAT X. Un es- E OpenType permette di gestire anche collezioni empio pratico: i Fell Types”. A problem with an TrueType di font (font .ttc), ma non di “fondere” unusual font parameter is described and a solution glifi Type1 con glifi TrueType in un unico file e offered by ConT Xt-mkiv is discussed. E neppure collezioni miste Type1 e TrueType; è in- vece possibile definire glifi bitmap e glifi vettoriali 1 Introduzione TrueType, sia in collezioni che in un font singolo. Come è noto, LuaTEX è nato anche poter gestire Il numero massimo di glifi è fissato a 65536. in modo efficace i font OpenType. Giunto ormai Rimandando a Wikipedia (2010) per una ra- alla versione 0.52 possiamo ritenerlo adeguato per pida panoramica ed a Haralambous (2007) e esplorare questa parte, ma piuttosto che addentrar- OpenType specification per approfondimenti, in- ci nei dettagli ed ipotizzare un possibile utilizzo teressa sottolineare in questo contesto i seguenti ad alto livello, è preferibile guardare subito il for- aspetti: mato che, procedendo in simbiosi con lo sviluppo • è possibile definire un encoding (la mappa di LuaTEX, offre all’utente finale la possibilità di tra il nome del carattere del font ed il suo glifo) un uso immediato: ConTEXt-mkiv. compatibile con Unicode. Dato che a sua volta Nell’articolo “Utilizzo di caratteri TrueTy- LuaTEX accetta testo sorgente in formato Unicode pe con LATEX. Un esempio pratico: i Fell Ty- con codifica UTF-8 (la codifica più compatta per le pes”(Dominici, 2007), M. Dominici illustra come lingue latine, ma non necessariamente la migliore in utilizzare in generale i font TrueType in LATEX, assoluto, cfr.“Getting Ready for Unicode” (Knuth, ed in particolare descrive una famiglia di font, i 2010)) è quindi naturalmente predisposto verso Fell Types, disponibili in due formati, OpenType una codifica Unicode del font: in questo modo con outline in PostScript (ovvero curve di Bézier i caratteri di un testo sorgente . in formato cubiche) e TrueType con le proprie outline (curve Unicode vengono mappati in modo semplice verso di Bézier quadratiche). i corrispondenti glifi; In questo articolo ci concentreremo sulla versione • un font può contenere delle varianti attivabili OpenType, sebbene ConTEXt-mkiv possa gestire a richiesta. Il termine “variante” non è da inten- direttamente i font Type1, TrueType ed OpenType. dersi nel senso tradizionale di variazione del peso Il motivo risiede nel fatto che la versione OpenType (light,normal, boldface etc.) od inclinazione (ad es. ha un FontMatrix pari a 2048 mentre usualmente roman vs. slanted) ma alla possibilità di controlla- è pari a 1000, e vedremo le conseguenze di questa re il posizionamento del glifo e di sostituire il glifo scelta da parte dell’autore del font. stesso in modo sensibile al contesto ed in modo organizzato, coerente e normato. Per un utente 2 Breve panoramica sui font Open- non sono concetti nuovi, solo molto Type più estesi e sofisticati: in Haralambous (2007) vengono descritte poco meno di cento “varianti” o Un font OpenType permette di gestire con un meglio feature, per usare il termine corretto, or- unico file binario tre fondamentali tipi di fonts: ganizzate in base al tipo di linguaggio latino, se-

51 Luigi Scarso ArsTEXnica Nº 9, Aprile 2010 mitico, indiano/sud-est asiatico ed ideografico. È all’interno della cartella importante sottolineare che le varianti del font non tex/texmf-fonts/fonts/ richiedono la modifica del testo sorgente per essere /public/felltypes attivate; A questo punto aggiorniamo la minimals della • un glifo è definito in un sistema di coordinate presenza dei nuovi font con x, y ( ) intere adimensionali. Normalmente queste #> mtxrun --script fonts --reload coordinate individuano una regione quadrata del #> luatools --generate piano, e per motivi storici i font Type1 definiscono usualmente un quadrato di 1000 unità mentre i e testiamo il tutto con font TrueType definiscono usualmente un quadrato %%test.tex di 2048 unità (in ogni caso, le specifiche impongono \font\test=FeDPit27C una ragione limite data dal rettangolo definito dai \starttext vertici (-16384,-16384) e (16383,16383)). Per i font \test\input tufte\par Type1 la regione è definita tramite una matrice \stoptext di trasformazione FontMatrix=[sx 0 0 sy 0 0] in cui normalmente sx=sy=0.001: in questo mo- #> context test.tex do ogni parametro relativo a curve, spostamenti etc. pari a d unità del font diventano 0.001 ∗ d 4 Uso punti PostScript (il lettore orientato verso aspetti I Fell Types contengono 6 famiglie di font, ciascuna matematico-computazionali potrà trovare interes- nella variante Roman e Italic: sante il corso di Computer Aided Geometric Design (Sederberg e Peterson, 2010)). 1. THE ENGLISH ROMAN AND ITALIC, da Infine è da notare che il formato OpenType è usare nella dimensioni di 13.5 punti, anche un descritto in Information technology. 2. THREE LINES PICA, 48 punti 3. FRENCH CANON, 39 punti, 3 Installazione font 4. DOUBLE PICA, 21 punti, 5. GREAT PRIMER, 17 punti, ConT Xt viene distribuito in due modi: E 6. DE WALPERGEN’S PICA, 12.5 punti 1. attraverso la TEXlive; 2. attraverso la minimals. Prima di mostrare come ConTEXt-mkiv organizza i font utilizziamo un semplice programma in Per questo progetto utilizzeremo la minimals, LuaTEX per ricavare alcune informazioni. installabile seguendo le istruzioni descritte in Il cuore del programma è la funzione LuaTEX http : / / wiki . contextgarden . net / ConTeXt _ font,warning=fontloader.open() Minimals. che permette, in caso di successo, di caricare un La struttura della minimals è font e di renderlo disponibile con bin my_fontdata=fontloader.to_table(font). tex Nel nostro caso salviamo le informazioni in un file texmf .txt (FeDPrm27C.txt nell’esempio), per poterle texmf-cache consultare in un secondo momento. texmf-context texmf- %%my_font_loader.tex texmf-local \startluacode setuptex local function my_loader_otf() setuptex.bat rep = io.open(’FeDPrm27C.txt’,’w’) setuptex.csh local f,w = fontloader.open(’FeDPrm27C.otf’) setuptex.tmf my_fontdata = {} if w then ed andiamo a copiare i file OpenType rep:write("Warning:\n") FeDPit27C.otf for k,v in pairs(w) FeDPrm27C.otf do rep:write(string.format("%s = %s\n", FeENit27C.otf k,tostring(v))) FeENrm28C.otf end FeFCit27C.otf rep:write("======\n") FeFCrm27C.otf end FeFlow1.otf if f then FeFlow2.otf my_fontdata = fontloader.to_table(f) FeGPit27C.otf fontloader.close(f) FeGPrm27C.otf end FePIit27C.otf for k,v in pairs(my_fontdata) do FePIrm27C.otf rep:write(string.format("%s = %s\n", FeTLrm27C.otf k,tostring(v)))

52 ArsTEXnica Nº 9, Aprile 2010 Fell Types in ConTEXt

end \definefontsynonym rep:close() [SerifItalic] end [name:IM_FELL_Great_Primer_PRO_Italic] my_loader_otf() % \stopluacode \stoptypescript \starttext\relax\stoptext \starttypescript[serif][fellenglish] Eseguendo % #> context my_font_loader.tex \definefontsynonym verrà scritto un report minimale relativo al font [Serif][name:IM_FELL_English_PRO_Roman] FeDPrm27C.txt. Non è difficile estendere il pro- \definefontsynonym gramma per il report di font arbitrario (cfr. [SerifItalic] [name:IM_FELL_English_PRO_Italic] LuaTEX development team (2010)). Per utilizzare il font in ConT Xt-mkiv bisogna % E \stoptypescript poi definire una typeface, ovvero un set coordi- nato di font identificato da un nome. La definizione di ogni set (typeface) è poi banale: Ad esempio, pensiamo al “typeface” postscript dato che il set ha un solo elemento, scegliamo come composto dai “fonts” times, helvetica e . nome del set il nome del suo elemento. I suoi elementi (ad es. times) saranno a loro volta collezioni di font che descrivono le varianti (come \definetypeface[felldewalpergenpica] Serif, SerifItalic, SmallCaps nelle rispettive dimen- [rm][serif][felldewalpergenpica] sioni) e questi elementi sono a loro volta definiti \definetypeface[felldoublepica] tramite un typescript. [rm][serif][felldoublepica] Nel nostro caso definiamo a titolo di esempio \definetypeface[fellgreatprimer] [rm][serif][fellgreatprimer] le typeface felldewalpergenpica, felldouble- \definetypeface[fellenglish] , , , nelle va- pica fellgreatprimer fellenglish [rm][serif][fellenglish] rianti Serif e SerifItalic e le associamo al corrispon- dente file non tramite il nome del file .otf (cosa A questo punto i font sono disponibili: per altro possibile) ma tramite il fontname del font. Questo è uno dei parametri del font ottenibile con \setupbodyfont[fellenglish, serif,13.5bp] lo script precedente e memorizzato in una cache \starttext interna di ConTEXt-mkiv. \rm \input browne.tex Ogni set contiene dunque un solo elemen- \it \input browne.tex to; potevamo comunque seguire una strada op- posta, ovvero definire un unico set felltype {\switchtobodyfont[fellgreatprimer, e “comporlo” con gli elementi, felldewal- serif,17bp] pergenpica, felldoublepica, fellgreatprimer \rm \input browne.tex\\ e fellenglish. \it \input browne.tex } \starttypescript[serif][felldewalpergenpica] % {\switchtobodyfont[felldewalpergenpica, \definefontsynonym serif,12.5bp] [Serif][name:IM_FELL_DW_Pica_PRO_Roman] \rm \input browne.tex \\ \definefontsynonym \it \input browne.tex [SerifItalic] } [name:IM_FELL_DW_Pica_PRO_Italic] % {\switchtobodyfont[felldoublepica, \stoptypescript serif,21bp] \rm \input browne.tex\\ \starttypescript[serif][felldoublepica] \it \input browne.tex % } \definefontsynonym [Serif][name:IM_FELL_Double_Pica_PRO_Roman] \stoptext \definefontsynonym [SerifItalic] 4.1 Accesso alle feature [name:IM_FELL_Double_Pica_PRO_Italic] L’accesso alle feature di un font OpentType non % è difficile: essenzialmente si definisce una fontfea- \stoptypescript ture (ad es. featI) attivando le feature che ci interessano: \starttypescript[serif][fellgreatprimer] % \definefontfeature \definefontsynonym [featI] [Serif][name:IM_FELL_Great_Primer_PRO_Roman] [script=latn,

53 Luigi Scarso ArsTEXnica Nº 9, Aprile 2010

aalt=yes,% Access All Alternates k3,tostring(v3))) dlig=yes,% Discretionary Ligatures end hist=yes,% Historical Forms end kern=yes,% Kerning end liga=yes,% Standard Ligatures end salt=yes,% Stylistic Alternates end ss01=yes,% Stylistic Set 1 ss02=yes,% Stylistic Set 2 ss03=yes,% Stylistic Set 3 5 Un bug di Adobe Reader? ss04=yes,% Stylistic Set 4 I Fell Types definiscono una FontMatrix di 2048 protusion=no, unità e outline descritte da curve di Bézier cubiche. expansion=yes ] Questa caratteristica è piuttosto rara: normalmen- te la FontMatrix per un font Type1 è pari a 1000 Si associa la fontfeature tramite un typescript: unità, mentre per una outline quadratica è 2048 oppure 1024 unità, ma sono possibili altri valori. \starttypescript[serif] AdobeReader 7 non ha alcuna difficoltà a mostrare [fellenglishfeatI][default] \definefontsynonym correttamente questi font particolari, ma, a parti- [Serif] re dalla versione 8 fino a quella attuale, Acrobat [name:IM_FELL_English_PRO_Roman] (e Reader) distorce la visualizzazione del glifo in [features=featI] modo da rendere impossibile la lettura: ecco ad \definefontsynonym esempio la parola assalire come appare [SerifItalic] [name:IM_FELL_English_PRO_Italic] [features=featI] e come invece dovrebbe apparire \stoptypescript a s s a l i r e oppure si può attivare la fontfeature nel corpo del L’aspetto interessante è che l’effetto non si ma- testo con la macro setff: nifesta se il font viene salvato all’interno del pdf \setupbodyfont[fellenglish,13.5bp] come font Type1 CFF (cfr. Compact Font Format), \starttext mantenendo inalterato il valore di 2048 unità; an- {\rm assalire \it assalire}\\ che la soluzione di convertire il font ad un Type1 {\setff{featI} con una FontMatrix pari a 1000 unità elimina il \rm assalire \it assalire} “bug”, ma la conversione introduce arrotondamenti \stoptext non voluti ed in ogni caso non sembra permessa dalla licenza del font. che produce La conversione in Type1 comporta in ogni caso a s s a l i r e a s s a l i r e la creazione di un encoding a 256 slot e sostan-

a ſſ a l  r e a ſſ a l  r e zialmente si deve percorrere la stessa strada indi- Anche in questo caso è possibile ricavare le in- cata per i TrueType nell’articolo di M. Dominici formazioni riguardanti le feature con uno script (Dominici, 2007), ovvero creare tante “versioni” LuaTEX: Type1 del font quante sono le codifiche necessa- rie. Questa strada inoltre è difficile da percorre -- in ConT Xt-mkiv, perché per default i font Type1 -- my_fontdata come E vengono comunque salvati nel pdf come se pro- -- nello script precedente -- venissero da un equivalente OpenType al fine di local gsub = my_fontdata[’gsub’] mantenere l’encoding Unicode. Infine, questo “bug” rep:write("GSUB\n") si manifesta anche con , ma non con for k,v in pairs(gsub) do mupdf ne con xpdf. rep:write( L’autore ha segnalato la cosa al team di sviluppo string.format(" %s = %s\n",k,tostring(v))) di luatex nel marzo del 2009 e, dopo un anno, è for k1,v1 in pairs(v) do stata trovata una soluzione accettabile: luatex è rep:write( stato modificato per string.format(" %s = %s\n", k1,tostring(v1))) 1. normalizzare la FontMatrix a 1000 unità, if k1 == ’features’ then ovvero FontMatrix=[sx 0 0 sy 0 0] con for k2,v2 in pairs(v1) do rep:write( sx=sy=0.001. Questo comporta però una di- string.format(" %s = %s\n", storsione: il font risulta ingrandito di circa k2,tostring(v2))) due volte (per la precisione 2.048); for k3,v3 in pairs(v2) do 2. correggere la distorsione introdotta riducendo rep:write( di 2.048 volte i caratteri del testo (ovviamente string.format(" %s = %s\n", solo quelli che hanno la FontMatrix inusuale).

54 ArsTEXnica Nº 9, Aprile 2010 Fell Types in ConTEXt

In questo modo non si modifica il font originale con Abbiamo poi visto come la parte Lua di LuaTEX il rescaling, riducendo errori di arrotondamento, e possa essere usata per ottenere informazioni su un non si passa attraverso la conversione al formato font senza l’ausilio di programmi esterni, anche Type1, evitando ogni problematica di encoding. se attualmente le curve delle outline del glifo non Questa modifica al programma luatex è stata sono memorizzate da LuaTEX e quindi programmi recepita da H. Hagen ed è già disponibile nella come ttx sono ancora superiori. Comunque, visto nuova minimals; inoltre gli sviluppatori, nonostante che luatex si basa su , è possibile che le osservazioni precedenti, non sono contrari ad in futuro vengano aggiunte le routine per la me- implementare la conversione automatica del font morizzazione delle outline, magari al fine di poter in formato Type1, riprendendo quindi la strada creare font artificiali più ricchi. descritta in Dominici (2007). A conoscenza dell’autore, attualmente ConTEXt- 7 Ringraziamenti -mkiv è l’unico sistema in grado di gestire i font OpenType con outline Postscript e FontMatrix L’autore desidera ringraziare i membri del team di diverso da 1000 unità. sviluppo di luatex ed in particolare Taco Hoekwater ed Hartmut Henkel per il loro sostegno ed Hans Una osservazione è però d’obbligo: si tratta di Hagen per aver preparato una prima versione di un bug o no? Le specifiche PDF Reference recitano ConT Xt-mkiv ad-hoc per questo articolo. testualmente a pag. 394 (grassetto dell’autore): E “The glyph coordinate system is the space in which an individual character’s glyph is defined. All path Riferimenti bibliografici coordinates and metrics are interpreted in glyph Adobe Font Format (1993). Adobe Type 1 Font space. For all font types except Type 3, the Format. Addison-Wesley. URL http://www. units of glyph space are one-thousandth of adobe.com/devnet/font/pdfs/T1_SPEC.PDF. a unit of text space; for a Type 3 font, the transformation from glyph space to text space is Compact Font Format (2003). «The compact font defined by a font matrix specified in an explicit format specification». Technical Report 5176. FontMatrix entry in the font.” URL http://www.adobe.com/devnet/font/ Il documento riguardante i font Type1 (Adobe pdfs/5176.CFF.pdf. Font Format) recita poi a pag.13 : Dominici, M. (2007). «Utilizzo di caratteri True- “The program inserts eight items (FontInfo, Font- Type con LAT X. Un esempio pratico: i Fell Name, PaintType, FontType, FontMatrix, Enco- E Types». ArsT Xnica, (4). ding, FontBBox, and UniqueID) into the dictiona- E ry. The 1000 to 1 scaling in the Font- Matrix as Haralambous, Y. (2007). Fonts & Encodings. shown is typical of a Type 1 font program and is O’Reilly. highly recommended.” Inoltre nella descrizione del formato CFF Information technology (2009). Information tech- (Compact Font Format) a pag. 15 il valore di nology — Coding of audio-visual objects — Part FontMatrix è di default 0.001 0 0 0.001 0 0 22: Open Font Format. ISO/IEC, seconda edizio- ma null’altro viene detto. ne. URL http://standards.iso.org/ittf/ Infine il fatto che la versione 7 del Reader non PubliclyAvailableStandards/c052136_ISO_ mostri questo effetto può essere spiegato con il fatto IEC_14496-22_2009(E).zip. che questa versione è antecedente alle specifiche Knuth, D. E. (2010). «Mmix news». URL http: PDF Reference le quali, bisogna ricordarlo, sono / / www-cs-faculty . stanford . edu / ~knuth / allineate allo standard ISO-32000. mmix-news.html. Questi elementi, e la personale esperienza del- l’autore, portano a concludere che il design di font LuaTEX development team (2010). LuaTEX OpenType tipo PostScript con FontMatrix non Reference Manual. canonica di 1000 unità è fortemente sconsigliato. OpenType specification (2010). «OpenType spe- cification». URL http://www.microsoft.com/ 6 Conclusioni typography/otspec/.

In questo articolo abbiamo rapidamente visto co- PDF Reference (2008). PDF Reference. Ado- me è possibile installare un font OpenType e come be Systems Incorporated, sesta edizione. URL renderlo disponibile a ConTEXt-mkiv tramite ty- http : / / www . adobe . com / devnet / acrobat / pescripts. L’utilizzo delle feature di un font non è pdfs/pdf_reference_1-7.pdf. di per sé difficile ma non bisogna dimenticare che Unicode ha un vastissimo repertorio di “caratteri” Sederberg, T. W. e Peterson, C. (2010). «Com- e questi possono interagire in modo inaspettato puter aided geometric design». URL http: con le feature di un font. //tom.cs.byu.edu/~557/.

55 Luigi Scarso ArsTEXnica Nº 9, Aprile 2010

Wikipedia (2010). «Opentype». URL http:// . Luigi Scarso en.wikipedia.org/wiki/OpenType. Logo S.r.l.

56