Metafont - Metafont
| Utvikler (er) | Donald Knuth |
|---|---|
| Stabil utgivelse | 2.71828182 / januar 2021
|
| Operativsystem | Kryssplattform |
| Type | Dataspråk |
| Tillatelse | Tillatende |
Metafont er et beskrivelsesspråk som brukes til å definere raster fonter. Det er også navnet på tolken som kjører Metafont -kode, som genererer bitmap -fonter som kan legges inn i f.eks. PostScript . Metafont ble utviklet av Donald Knuth som en ledsager til TeX -settesystemet.
En av egenskapene til Metafont er at punktene som definerer formene på glyfene - for eksempel toppen av en stamme , eller skjæringspunktet mellom en stamme og tverrstangen - er definert med geometriske ligninger; Intensjonen om at de tre stilkene til et 'm' er like avstand horisontalt kan uttrykkes som om punktene 1, 2 og 3 er i de nedre ender av de tre stilkene, mens hensikten med at de alle ender på samme vertikale posisjon være .
Metafont er et makrospråk , der operasjoner som "tegne en liten bokstav på stammen serif på punkt 4" kan vises som en makroinstruksjon (med punktet som argument) i programmet for en bokstav. For å beskrive former har Metafont et rikt sett med banekonstruksjoner som for det meste fritar brukeren for å måtte beregne kontrollpunkter.
Mange familier med Metafont-fonter er satt opp slik at hovedkildefilen for en font bare definerer et lite antall designparametere ( x-høyde , em-bredde, skråstilling, vertikal slagbredde, etc.), og kaller deretter en egen kildefil som vanlig for en hel rekke fonter å faktisk tegne de enkelte glyfene; dette er meta -aspektet av systemet.
Driftsmåter
Metafont kjøres oftest som en hjelper til å sende ut enhetsdrivere (skriver, skjerm); i disse tilfellene er jobben å generere bitmaps for en skrift for en bestemt kombinasjon av utdataenhet (kalt en modus i Metafont) og oppløsning (synlig i navnet på utdatafilen, se nedenfor). Disse bitmaps lagres vanligvis for senere gjenbruk, slik at Metafont ikke trenger å kjøres hver gang et dokument vises, men på den annen side har TeX -distribusjoner med en Metafont -komponent vanligvis ikke inkludert noen forhåndsbygde bitmap -fonter, siden de heller store i forhold til kildene de kunne hentes fra. Siden Metafont-fonter tradisjonelt var TeX-standarden som andre skriftformater var unntak fra, kan en ufullstendig installasjon av en ikke-Metafont-font noen ganger resultere i at Metafont blir kalt og sender ut en forvirrende " somefont .mf ikke funnet" feilmelding.
Like viktig, men ikke så vanlig, kjører Metafont for å generere en font metric (TFM) -fil; en TFM -fil genereres bare hvis fontvariabelen er positiv. Tradisjonelt har TeX -distribusjoner ofte kommet med alle TFM -filer forhåndsgenerert (siden de er ganske små), men noen som installerer en Metafont -skrift fra kilder må generere TFM -filen før TeX kan bruke den.
En tredje måte å bruke Metafont på er prøvemodus : hvis korrekturvariabelen er positiv, inneholder bitmap -skrifttypefilen også tilleggsinformasjon gitt via specialkommandoer, spesielt posisjonene og navnene på punkter skriftdesigneren anså som viktig for designet. Hvis du bruker det separate gftodviverktøyet til å generere forstørrede bilder av skrifttegnene, er denne informasjonen fra spesialtilbud inkludert; punktposisjoner er ikke begrenset til pikseloppløsning.
Metafont kan også kjøres interaktivt, og har kommandoer for å vise bildene den produserer på skjermen. Knuth har sagt at han bruker Metafont som en slags skrivebordskalkulator for å løse kompliserte ligninger, selv om han nå bruker MetaPost for matematiske illustrasjoner.
Metafont kan gjengi enhver form for grafisk utgang, ikke bare glyfer. Imidlertid foretrekkes MetaPost og Asymptote for matematiske illustrasjoner. Metafont påkalles oftest uten en direkte forespørsel fra brukeren. DVI -filer kan bare inneholde referanser til skrifttyper, i stedet for settene med raster- eller vektorglyfer som andre formater som PostScript tillater. Følgelig må glyfene i skrifttypene nås hver gang det blir forespurt om å vise, skrive ut eller konvertere en DVI -fil.
Utdatafiler
Metafont sender ut flere typer filer: for en fil som heter NAME.mf, kan den sende ut:
- NAME.NNNNgf - Fil med rasterutgang ved oppløsning NNNN (2602 som standard).
- NAME.tfm - Fil med metrisk informasjon om TeX -skrift , som er informasjonen TeX trenger. Vanligvis må metafont bli fortalt å generere denne filen.
- NAME.log - Loggfilutgang fra behandling
Etter å ha kjørt Metafont bruker man vanligvis gftopk -programmet til å konvertere NNNNgf -filene til pk (pakket) format (.NNNNpk). PK -formatet ble først og fremst introdusert for å redusere filstørrelsen (til omtrent halvparten), men forventes også å øke hastigheten på behandlingen siden mindre data må mates inn/ut . GF- og PK-formatene bruker begge kjørelengdekoding av bitmaps, men lager forskjellige binære kodinger for kjørelengder. PK-formatet gjør også en del forhåndsbehandling av bitmaps (avgrensningsboks, eliminering av gjentatte rader) og koder alle radene i et tegn som en lang bitsekvens.
I TeX Directory Structure -standarden er filnavn begrenset til 8+3 tegn, så GF- og PK -filer vil bare ha utvidelser .gfog .pk. Filer for forskjellige oppløsninger holdes fra hverandre ved å plassere dem i separate kataloger, kalt dpiNNNN, f.eks dpi300/cmr10.pk.
Språk
Metafont -språket er et tolket språk for programmer som i hovedsak er deklarative enn tvingende .
Variabler og ligninger
Variabler i Metafont kan være av åtte forskjellige typer:
- Numerisk: signerte tall med fast punkt med en epsilon på , begrenset til mindre enn 4096 ( Q12.16 ). Dette er standard for variabler som ikke er erklært for å være av en annen type.
- Par: et par tall, hovedsakelig brukt til å representere punkter i flyet.
- Bane: som i PostScript / PDF / SVG , en parametrisk kurve i planet hvis koordinatfunksjoner er stykkevis kubiske polynomer. Som i de andre systemene, er stisegmenter kodet som Bézier -kurver når det gjelder knop og kontrollpunkter.
- Transform: en affin transformasjon av planet, tilsvarende en "(transformasjons) matrise" i PostScript/PDF.
- Penn: en konveks polygon, som representerer formen til en "penn" som brukes til tegning.
- Bilde: et rasterbilde med en signert heltallsverdi for hver piksel.
- Boolsk
- Streng (med 8-biters tegn)
Metapost legger til farge (en trippel numerikk) som en niende type og har en helt annen (ikke-raster) modell for bilder; sistnevnte er hovedpunktet for avvik mellom de to programmene. Metafont vardef-makroer lever også i samme navneområde som variabler og kan på noen måter betraktes som en niende type variabel, selv om makroer ikke eksisterer som førsteklasses verdier i Metafont.
Uvanlig er navnene på variabler ikke enkle tokens, men sekvenser av symbolske tokens og numeriske indekser; variabelnavnet x2rer dermed ikke et alfanumerisk token, men en sekvens av de tre tokens x(symbolsk), 2(numerisk) og r(symbolsk). Post- og array -typer kan simuleres gjennom samlinger av variabler som deler et felles navneprefiks, et formspråk som støttes av typedeklarasjonssystemet og gir alle variabler hvis navn som bare er forskjellige i numeriske indekser samme type (som forventet for matriser) samtidig som variablene holdes hele navnet er forskjellig i noen symbolsk token separat (som forventet for poster).
Et veldig særtrekk ved Metafont er bruken av ligninger for å definere variabler. En numerisk variabel (eller komponent i et par eller transformasjonsvariabel) kan være i de tre tilstandene kjent (sett), ukjent uavhengig (ikke satt) og ukjent avhengig (ikke satt, men gitt av et lineært uttrykk for en eller flere uavhengige) . Når Metafont utfører en ligningssetning, gjør den en av de uavhengige som er involvert til en avhengig og eliminerer den fra uttrykkene for alle andre avhengige; når ingen uavhengige forblir i uttrykket for en avhengig variabel, blir denne variabelen kjent. Å løse lineære ligningssystemer er således en innebygd egenskap i Metafont-språket, og den anbefalte metoden for å tildele de fleste variabler (spesielt de hvis verdier har geometrisk betydning) er å angi ligninger som bestemmer deres verdier. Likningssystemer blander ofte numeriske (skalar) ligninger med par (vektor) ligninger.
Et unntak fra ovennevnte er klassen av interne størrelsesvariabler. Disse har navn som består av bare ett symbolsk symbol, er alltid numeriske og er alltid kjent. De har en mer direkte intern representasjon enn vanlige variabler, noe som gjør det praktisk for primitive operasjoner i Metafont (eller utvidelser derav) å bruke dem implisitt.
Syntaks
Metafont har numeriske og strengkonstante tokens med vanlige syntakser; strenger er avgrenset med "anførselstegn, numeriske konstanter kan ha desimaler, men ikke en eksponentdel . Alle andre tokens er klassifisert som symbolske , og kan defineres vilkårlig; det er ingen begrensning at tokens med visse betydninger må ha navn som består av bestemte tegn. Ved kjøretid kan det i tillegg være kapselstegn , som effektivt er konstantverditokener av vilkårlig type; i kildekoden vises de som symbolske tokens.
Bortsett fra der tegn er involvert i numeriske eller strengkonstanter, avhenger omfanget av token som inneholder et bestemt tegn til hvilken klasse tegnet tilhører; i motsetning til TeX , har Metafont faste karakterklasser. Tegnene ,, ;, (, og )er "einstøinger" og bare danne én karakter tokens. For de tegnklasser <=>:|, ‘’(apostrof), +-, /*\, !?, #&@$, ^~, [, ], {}, og ., i tillegg til den klasse av strek sammen med øvre og nedre tilfelle A-Z, symbolet består av den lengste fortløpende sekvens av tegn fra den samme klasse. Mellomromstegn bidrar ikke med tokens. %starter en kommentar som varer til slutten av linjen.
En bemerkelsesverdig anvendelse av disse reglene er det #som ofte vises som en del av variabelnavn i Metafont -koden, f.eks. em#Og pt#.
Avgrensere (for eksempel parenteser) har ikke innebygde betydninger, i stedet er det en kommando som gjør to symbolske tokens til et par matchende skilletegn, men Metafont-programmer bruker vanligvis bare de vanlige parentesene. I tillegg til å overstyre prioriteringer i uttrykk, er det også nødvendig med avgrensere rundt visse typer makroargumenter.
Grafikk
Kurver i Metafont er definert som kubiske splines snarere enn kvadratiske, for større allsidighet på bekostning av mer kompleks aritmetikk.
I motsetning til mer vanlige skriftformater (som TrueType eller PostScript Type 1 ), består en Metafont-skrift hovedsakelig av streker med "penner" med endelig bredde, sammen med fylte områder. Således, i stedet for å beskrive omrisset av glyfen direkte, beskriver en Metafont -fil pennbanene. Noen enklere Metafont -skrifter, for eksempel de kalligrafiske matematiske skriftene i Computer Modern -familien, bruker et enkelt pennestrøk med en relativt stor penn for å definere hvert visuelle "slag" av glyfene. Mer komplekse fonter som romerske tekstfonter i Computer Modern -familien bruker en liten penn til å spore rundt omrisset av de visuelle "strøkene", som deretter fylles ut; resultatet er omtrent som en omriss, men med litt mykne hjørner definert av penneformen.
Siden skriftformene er definert av ligninger i stedet for direktekodede tall, er det mulig å behandle parametere som størrelsesforhold, skråkant, slagbredde, serifstørrelse og så videre som inndataparametere i hver glyfdefinisjon (som da ikke definerer en enkelt skrift, men en meta -font). Ved å endre verdien av en av disse parameterne på ett sted i Metafont -filen, kan man således produsere en konsekvent endring gjennom hele skrifttypen. Computer Modern Roman illustrerer mange bruksområder for denne funksjonen; en typisk TeX -installasjon inkluderer en rekke versjoner av skrifttypen i størrelser fra 5 til 17 punkter, med slagbredden den samme i alle størrelser (i stedet for å øke etter hvert som skriften skaleres opp) og sideforholdene utvides i de mindre størrelsene for økt lesbarhet . I tillegg er Computer Modern skrivemaskin og sans-serif- fonter definert ved å bruke i hovedsak den samme Metafont-filen som den romerske skriften, men med forskjellige globale parametere.
Bruk
Selv om kjente typedesignere, for eksempel Hermann Zapf , har samarbeidet med Knuth for å lage nye fonter ved hjelp av Metafont, har systemet ikke blitt bredt vedtatt av profesjonelle typedesignere. Knuth tilskriver dette at "å be en kunstner om å bli nok av en matematiker til å forstå hvordan man skriver en skrift med 60 parametere er for mye." Jonathan Hoefler kommenterte at Metafont -systemet til slutt ble "en teknologi bak null av dine favorittfonter ... Knuths idé om at bokstaver starter med skjelettformer er feil."
Metafont -systemet gjør at fonter kan behandles på uvanlige måter; i 1982 viste Knuth hvordan den kan brukes til å omdanne fonter, med en serif- font som sakte overgår til et sans-serif- design i løpet av en tekst.
Historie
Donald Knuth startet arbeidet med programvare for oppretting av skrifttyper i 1977, og produserte den første versjonen av Metafont i 1979. På grunn av mangler i det originale Metafont -språket, utviklet Knuth et helt nytt Metafont -system i 1984, og det er dette reviderte systemet som brukes i dag ; Metafont har et versjoneringssystem som ligner på TeX , hvor tallet asymptotisk nærmer seg e med hver revisjon.
Eksempel
Følgende eksempel skaper en lukket bønneaktig form for tegnet "B" i en skrift:
%file name: beta.mf
%mode_setup;
% Define a beanlike shape for the character B
beginchar("B",11pt#,11pt#,0);
% Setup coordinates as an equation system
y1=y2=y3=0;
y4=y5=y6=h;
x1=x4=0;
x2=x5=w;
x3=x6=2*w;
% Define pen
pickup pencircle xscaled 0.2w yscaled 0.04w rotated 45;
% Draw the character curve
% z1 is the same as (x1, y1)
draw z1..z3..z6{z2-z6}..z5..{z4-z2}z4..cycle;
endchar;
end
Dette gir følgende glyph:
Eksemplet ovenfor vil bli behandlet med en kommandolinje, for eksempel:
mf '\mode=ljfour; mode_setup; input beta.mf';
gftopk beta.600gf beta.600pk
Deretter kan den brukes i en LaTeX -fil, for eksempel (alle filer skal bo i den samme katalogen, eller TeX -systemet skal informeres om dem ved å bruke passende metoder):
\documentclass{article}
\newfont{\letterbeta}{beta}
\newcommand{\otherbeta}{{\letterbeta B}}
\begin{document}
Let's try having a strange \otherbeta\ here.
\end{document}
Den resulterende PDF -filen skal se slik ut:
Produsere PostScript Type 1 -fonter
Det finnes flere verktøy for å konvertere Metafont -programmer til PostScript Type 1 -fonter. De fleste bruker MetaPosts evne til å konvertere et delsett av Metafonts språk til EPS -konturer, som deretter kan konverteres til PostScript Type 1 -fonter. Å generere vektorkonturer av Metafont -pennestrøk er utrivelig, ettersom Metafont -modellen av en glyph er et rasterbilde og de eksakte omrissene for de fleste slag ikke er Bézier -kurver .
- Det polske JNS -teamet utviklet METATYPE1 (basert på MetaPost) for å lage PostScript Type 1 -fonter. Den store ulempen er at det ikke kan brukes penner som reduserer kraften til Metafont -språk sterkt. Opprinnelig har verktøyet blitt brukt av det polske GUST -skriftstøperiet for å produsere en modernisert og utvidet variant av Computer Modern , kalt Latin Modern .
- mf2pt1 , som også er basert på Metapost, ble utviklet av Scott Pakin med noen bidrag fra Werner Lemberg . Den har også flere begrensninger beskrevet i håndboken, den viktigste er begrensningen for at hver glyph må trekkes helt fra lukkede baner. For å overvinne begrensningene til mf2pt1 kan EPS-utgangen fra Metapost etterbehandles med FontForge , som er i stand til å tolke komplekse PostScript-baner generert av Metapost fra Metafonts elliptiske penner, og også i stand til å fjerne konturoverlappinger. Siden FontForge støtter skripting, kan dette etterbehandlings trinnet også automatiseres. Denne tilnærmingen ble brukt til å produsere oversikter av type 1 for den matematiske MnSymbol -fonten utviklet av Achim Blumensath; MnSymbol ble designet som en følgesvenn til Minion Pro .
- MetaFog er en proprietær omformer som analytisk kan konvertere pennestrøk , men det krever manuell etterbehandling for å eliminere degenererte tilfeller, og den er ikke offentlig tilgjengelig. Den kan bare behandle Metapost -utgang.
Den vanlige tilnærmingen for å generere Type 1-fonter med pennestrøk er fortsatt å generere et høyoppløselig bitmap og deretter bruke en autotracer , implementert av pakker som mftrace og TeXtrace
Se også
- Ikarus (typografiprogramvare)
- MetaPost , et vektortegningsspråk avledet fra Metafont
Merknader
Referanser
Kilder
- Donald Knuth : Metafont: The Program , Addison-Wesley 1986. ISBN 0-201-13438-1
- Donald Knuth: The Metafontbook , Addison-Wesley 1986. ISBN 0-201-13444-6 . Den kildekoden for boken i TeX (og en nødvendig makro ) er tilgjengelig online på CTAN .
- Donald Knuth: Metafont -kildekoden er skrevet på WEB -programmeringsspråket, og inneholder svært omfattende dokumentasjon om algoritmene som brukes i Metafont.
- Yannis Haralambous, "Fonts and Encodings", O'Reilly 2007, ISBN 0-596-10242-9 , tillegg F: "METAFONT og dets derivater"
- K. Píška, "Opprette Type 1-fonter fra Metafont-kilder: sammenligning av verktøy, teknikker og resultater", i TeX, XML og digital typografi (Springer-Verlag, Berlin, 2004), Lect. Notater Comput. Sci., Bind. 3130, s. 240–56. fortrykk
- Hofstadter, Douglas R., "Metafont, Metamathematics and Metaphysics: Comments on Donald Knuth's Article 'The Concept of a Meta-Font'" Visible Language , Vol. XVI nr. 4, s. 309–338 (utgitt på nytt i Hofstadters bok Metamagical Themas , NY: Basic Books, 1985)
Eksterne linker
- Metafont -opplæringen (PDF). Christophe Grandsire, 2004.