fonts: chtergrond PostScript Fonts op computers? Tco Hoekwter tco.hoekwter@wkp.nl bstrct Dit rtikel geeft een korte inleiding in de interne werking vn PostScript computerfonts en hun coderingen. Dit rtikel is een npssing vn een serie slides die gepresenteerd werden op de ntg bijeenkomst vn 22 oktober 1998 in Leuven. Inleiding keywords fonts, computers Een computerfont bestt uit drie logische onderdelen: lgemene gegevens vn het font Hieronder vllen dingen zols de nm vn het font, en de ontwerpgrootte, mr ook zken zols kernpren en hints voor lgeresolutie renderrs. Gegevens per krkter Krkters hebben meestl zelf ook nog een nm, en die wordt hier bijgehouden. Tevens stn hier dingen zols de breedte vn het krkter. Een groep krkters Vn elk krkter stt hier ngegeven hoe het getekend moet worden. Dit kn per bestndstype verschillen: soms zijn het tekeninstructies, mr soms ook een bitmp pltje of zelfs lleen een recept om dit krkter te mken door bijvoorbeeld twee ndere krkters over/nst elkr te plkken. Nu we deze lgemene eigenschppen vn een font gehd hebben, wordt het tijd om eens te gn kijken hoe een en nder dn wordt opgeslgen op de hrde schijf. PostScript fonts Een PostScript font onder Windows of Unix bestt uit twee verschillende bestnden. De lgemene gegevens en krktergegevens stn in een fm of pfm bestnd. Voor TimesRomn heet dt bestnd bijvoorbeeld tir.fm (estnden die fkomstig zijn vn dobe Ssytems zijn vk herkenbr n het feit dt dobe de nm vn een bestnd nvult met underscores, zodt het ltijd precies cht letters in totl zijn) Figuur 1 Schemtische opbouw De krkters zelf stn in een pfb of pf bestnd. Let op dt zo n bestnd ookin een PostScript printer kn stn. In dt gevl is het font niet beschikbr op de hrde schijf. Voor het gebruik vn een font binnen TEX is lleen het bestnd met de gegevens echt vn belng. Het tweede bestnd komt ps om de hoek kijken ls er ook inderdd wt moet worden fgedrukt, en vlt drom onder de verntwoording vn de DVI driver. Het is bij het gebruik vn een PostScript font hndig om rekening te houden met het volgende: Er kunnen heel veel tekens in een font zitten. Drvn zijn er mr 256 tegelijkertijd bereikbr. Een encoding regelt welke dt zijn. Elk font heeft een ingebouwde encoding. Mr de kns is groot dt die encoding net niet die tekens bevt die je nodig hebt. Drom is het mogelijk om een font te hercoderen, drop kom ik lter nog terug. Hoe een driver een font vngt Even ngenomen dt er een DVI beschikbr is die Post Script fonts gebruikt en die je grg zou willen printen en/of bekijken. DVI s zijn onprintbr, dus hier komt de DVI driver om de hoek kijken. In een DVI stn geen tekens, lleen gegevens. Kortom: de driver moet op zoek nr het juiste fontbestnd. Mr een driver weet niet zeker of een font l dn niet een PostScript font is (die informtie stt niet in de 32 MPS
PostScript Fonts op computers? fonts: chtergrond Figuur 2 Een voorbeeld vn een PS font met de ingebouwde encoding DVI). Er is dus een routine nodig om te beslissen of een font PostScript is, of Metfont source, of ene virtueel font, of een TrueType font, enzovoorts. Verreweg de belngrijkste driver ls we het hebben over PostScript en fonts is dvips. Dvips gebruikt een opzoek tbel om te kiezen tussen MetFont (MF) en PostScript (PS) fonts. Die tbel wordt bewrd in een bestnd met de nm psfonts.mp. Deze methode is lngzmerhnd overgenomen door de meeste ndere drivers (zelfs door nep drivers zols pdftex, ookl heet hetbestnddnnders). De regel om te beslissen of een font l dn niet een PS font is is verbluffend eenvoudig: ls het font wordt genoemd in psfonts.mp is het een PostScript font, in lle ndere gevllen niet. De opzet vn psfonts.mp De vorm vn het mpbestnd is redelijk eenvoudig. Elke regel beschrijft precies n font, en die regel wordt verdeeld in een ntl velden die worden gescheiden door spties. Een voorbeeldregel is zoiets ls: tnr TimesNewRomn tnr.pfb De betekenis vn de drie velden hierin is ls volgt: tnr Dit is de TEX nm vn het font. TimesNewRomn De PS nm vn het font. Die is nodig omdt PostScript interpreters de nm vn een font nodig hebben om te kunnen switchen vn het ene nr het ndere font. De nm kn eventueel ook uit het.pfb bestnd gehld worden, mr dvips doet dt niet (nieuwere pdftex s doen dt wel). betekent: voeg het volgende bestnd toe n de tnr.pfb PostScript uitvoer. We zullen lter zien wrom het hndig is om dr een prt krkter voor te hebben. Het font zelf. Dit is meestl lleen een bestndsnm, de driver zoekt gewoonlijk op een ndere mnier wel uit uit welke directory dt bestnd moet komen. Reencoding Het is mogelijk om een PostScript font nders te coderen met behulp vn een encoding. Drvoor is wt extr informtie nodig: Een bestnd met de gewenste encoding, het.enc bestnd. De nm vn de encoding. We nemen weer n dt zo n gehercodeerd font voor TEX l bestt: er is nmelijk ook een ndere TFM voor TEX nodig (doordt sommige tekens nieuw of juist oud zijn kloppen de breedte in het stndrd gecodeerde TFM niet meer). Het verschil is grfisch voorgesteld in de twee figuren hieronder: Figuur 3 Een voorbeeld vn een TFM voor PS font met een ingebouwde encoding Figuur 4 Een voorbeeld vn een TFM voor PS font met een ngepste encoding Voor dvips betekent de hercodering dn dt een extr regel moet worden toegevoegd n het bestnd psfonts.mp, met bijvoorbeeld de volgende inhoud (de bckslshes geven n dt dit geheel op 1 regel hoort te stn): tnr2 TimesNewRomn \ "TeXnNSIEncoding ReEncodeFont" \ texnnsi.enc \ tnr.pfb tnr2 De TEX nm vn het font. Deze nm is nu dus nders TimesNewRomn De PS nm vn het font. Mr deze nm verndert niet door het hercoderen, dus die blijft gewoon stn. TeXnNSIEncoding Voorjr 1999 33
fonts: chtergrond Tco Hoekwter De nm vn de encoding, zols die gedefinieerd wordt in het.enc bestnd. texnnsi.enc Het bestnd wr de encoding in stt. Ook hier zou het mogelijk zijn om de nm door dvips uit het.enc bestnd te hlen, mr dit gebeurt niet (pdftex doet dit weer wel). tnr.pfb Het font zelf, wt ntuurlijk nog steeds precies hetzelfde bestnd is. Immers: de tekens vernderen niet, ze worden lleen nders gerngschikt. hoefde te typen. Voor TEX is een virtueel font bsoluut niet nders dn een norml font (wt logisch is, per slot vn rekening heeft TEX lleen mr de mten vn het doosje om een teken nodig). Mr dt gt voor een DVI driver niet op, ntuurlijk. TimesRomn Times Expert Figuur 5 Een voorbeeld vn een PS font met een ngepste encoding Virtuele fonts Virtuele fonts zijn weer een verhl prt, en de bron voor een hoop extr complicties. Het idee vn een virtueel font is reltief eenvoudig: de gegevens die TEX te zien krijgt in n.tfm, komen dn eigenlijk uit twee of meer echte fonts. Een specil extr bestndje met ls extensie.vf bevt dn de extr informtie die een driver nodig heeft om uit dt ene smengestelde font de verschillende onderdelen op te vissen. Een virtueel font gebruikt intern n of meer normle TEX TFM bestnden ls bron voor de gegevens. Deze fonts kunnen PostScript fonts zijn, mr dt hoeft niet. Deze fonts kunnen ook l gehercodeerd zijn, mr dt hoeft ook niet per se. ls ltste is het mogelijk om in een.vf bestnd een recept te bouwen voor het mken vn een krkter (bijvoorbeeld een ccent uit n font en een hoofdkrkter uit een nder). Virtuele fonts worden in deze MPS bijvoorbeeld gebruikt om de mooie cijfers 12345 uit een nder font te hlen. In het normle Times font stn sie cijfers zols 12345. Voordeel vn deze npk ls gebruiker is dt ik de vorige regel getypt heb ls: cijfers 12345 uit... zols $12345$; dus zonder dt ik extr commndo s in Figuur 6 Een virtueel font LTeX T1 Times Zoek de verschillen Een DVI postprocessor zols dvips gebruikt de volgende (lweer verdcht simpele) regel om te beslissen of een font virtueel is en er dus extr werk gedn moet worden om de onderdelen bij elkr te zoeken; of dt het een norml font is ls er een bestnd met extensie.vf bestt voor een font dt voorkomt in een DVI file en het komt niet voor in psfonts.mp, dn is het een virtueel font. Dvips gt dus voor lle fonts die in de DVI genoemd worden eerst op zoek nr een bijpssende.vf. lszo n bestnd bestt, dn gt dvips op zoek in die.vf om te ontdekken welke fonts dn wel gebruikt moeten worden. Vervolgens wordt voor de fontnmen die dn gevonden worden weer overnieuw besloten of ze l dn niet virtueel en/of PostScript zijn. Dt gt zo door tot lle fonts gevonden zijn. De belngrijkste regel die hieruit volgen is de volgende: Virtuele fonts horen niet in psfonts.mp te stn. ls dt toch gebeurt gt het gegrndeerd fout. Mogelijke problemen met fonts De regels hierboven zorgen ervoor dt vrij mkkelijk kunnen controleren wt voor soort fontproblemen bij wt voor soort fouten in de TEXinstlltie horen. Onvindbre bestnden vn lle soorten Er stt ergens een zoekpd verkeerd. Drivers moeten ntuurlijk lle bestnden wel 34 MPS
PostScript Fonts op computers? fonts: chtergrond correct kunnen vinden, gewoonlijk zoeken ze niet de hele hrde schijf f (dt zou wel heel erg lng kunnen duren). Dit probleem lt zich oplossen door grondig de documenttie bij de TEXinstlltie te lezen en soms ook door bestnden te verpltsen. Een smerige truuk die erg vk werkt: ls je weet welk bestnd er niet gevonden wordt, kun je dt bestnd kopiren nr de directory wrvndn je de DVI driver nroept. 10 tegen 1 dt het bestnd dn wel gevonden wordt. Missende tfm bestnden Dit gebeurt eigenlijk lleen met externe DVIs die je vn iemnd nders hebt gekregen. ls het toch een bestnd vn jezelf is, heb je f een pr bestnden gewist sinds de compiltie, f het zoekpd voor de driver stt verkeerd (zols hierboven), f je instlltie is zo ernstig in de wr dt lleen een expert of volledig herinstlleren je nog kn redden. Missende pfb bestnden ls dvips dit tegen je zegt, betekent dt dt het een regel heeft gevonden in psfonts.mp voor dit font (nders zou het niet weten dt het een PS font ws). Er zijn twee nieuwe mogelijkheden wrom deze fout kn ontstn. 1) De schuldige kn psfonts.mp zelf zijn, bijvoorbeeld omdt er een typefout in stt. Het is zelfs mogelijk dt die regel er heleml niet in hoort te stn (zols bij virtuele fonts, of wnneer een MF font toevllig dezelfde nm heeft ls een PS font). 2) Het is een commercieel font wt je niet hebt, mr de TEX distributie hd er l wel.tfm s voor meegestuurd. Distributies bevtten vk ls service llerlei bestnden voor fonts die gekocht moeten worden, voorl omdt het mken vn de TFM en VF bestnden niet zo heel trivil is. Deze goedbedoelde toevoeging kn wt misleidend zijn: commercile fonts moeten nu eenml gekocht worden. Missende.vf bestnden Deze fout is wt minder snel herkenbr dn die hierboven. Je merkt dt er wt fout gt omdt MetFont wordt ngeroepen dn foutmeldingen begint te geven over niet gevonden.mf bestnden. Dvips heeft voor zo n font geen.vf gevonden, en ook geen regel in psfonts.mp, en heeft drom besloten dt dit dus een Metfont moet zijn. Missende regels in psfonts.mp De symptomen vn deze fout zijn dezelfde ls die vn hierboven. Voor L T EX gebruikers met een min of meer stndrd systeem is meestl te chterhlen welke fout vn deze twee het is door te kijken nr de nm vn het bestnd wr om gevrgd wordt bij Metfont. ls die nm eindigt in 8 of 8r of begint met rp is het probleem wrschijnlijk dt de psfonts.mp niet goed is. ls de nm eindigt op 7t of 8t is er meestl een VF bestnd zoekgerkt. Verkeerde of missende encodings Vnf hier worden de problemen ps echt lstig. Deze fout en de fouten die hiern komen geven nmelijk meestl heleml geen foutmelding, mr zorgen er wel voor dt llerlei ccenten verkeerd zijn en/of zelfs voor missende tekens in de uitvoer. Het is in het lgemeen erg lstig om te ontdekken welke vn deze problemen de oorzk is vn de misre. Extr regels in psfonts.mp Regels voor virtuele fonts in psfonts.mp zorgen er soms voor dt een VF onbedoeld verkeerd geïnterpreteerd wordt. Teveel TFM bestnden Dit is vrij simpel, eigenlijk. Wt er gebeurt is dt TEX en de driver verschillende TFM bestnden vinden, die net niet heleml precies hetzelfde zijn. De driver roept dn checksum error of iets in die geest. Zorg dt je ltijd mr n TFM op je hrde schijf hebt stn met dezelfde nm. Teveel VF bestnden Je kunt inderdd te veel VF bestnden hebben. ls n vn de componenten vn een virtueel font bedoeld is ls gewoon font, mr je hebt per ongeluk een bestnd met dezelfde nm mr met extensie.vf, dn vindt dvips dt dit dus een virtueel font is en begint die.vf te lezen. Mogelijke fouten kunnen vn lles en nog wt zijn, dt hngt immers f vn wt er in de.vf gedn wordt. De meestvoorkomende oorzk vn dit probleem: er wren l llerlei bestnden meegeleverd voor het gebruiken vn dit font (met de TEX distributie) mr dt wist je niet en drom heb je een font nogmls geïnstlleerd op een ietwt ndere plek. Mismtches tussen tfm en vf bestnden Dit gebeurt voorl met DVI s die vn iemnd nders f komen. In dt gevl is er eigenlijk niets n te doen, behlve dn om een PostScript bestnd vrgen. Hels is PostScript een stuk beter portble dn DVI, voorl ls er virtuele bestnden gebruikt worden. En nu? Smenvttend kn er met fonts heel erg veel mis gn. Een pr vn de dingen hierboven zijn vrij mkkelijk herkenbr, en kunnen ook vrij simpel hersteld worden (bijvoorbeeldls je een PostScript fontgeïnstlleerd hebt) en je bet Voorjr 1999 35
fonts: chtergrond Tco Hoekwter vergeten psfonts.mp n te pssen. Problemen met DVI bestnden die vn iemnd nders komen zijn vrijwel nooit op te lossen. Dn is het vrijwel ltijd het best om PostScript of PDF bestnden te vrgen in plts vn de DVI. ndere problemen kunnen heel lstig zijn. ls je vermoedt dt het je eigen schuld is omdt je een stommiteit hebt begn, is het vk het best (en in ieder gevl het snelst) om het hele TEX systeem te herinstlleren. ls het probleem is ontstn omdt je probeerde iets zelf uit te breiden, is het wrschijnlijk het best om eerst te herinstlleren en dn nog eens te proberen. En ntuurlijk zijn er voor l dit soort gevllen de guru s vn TEXNL. lijf niet eeuwig proberen om iets op te lossen wt je eigenlijk niet duidelijk is. ls het over fonts gt zijn zelfs de simpelste foutmeldingen soms gruwelijk ingewikkeld. Probeer een pr dingen en ls het dn nog niet werkt, schroom dn niet op een vrg te posten nr TEX NL (ls je geluk hebt kun je iemnd opbellen, dt werkt vk nog stukken beter). 36 MPS