METAFONT

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

METAFONT este un limbaj de descriere a paginii utilizat pentru a defini fonturile vectoriale și interpretul acestora, care își traduce codul pentru a genera fonturi bitmap utilizabile, de exemplu în documentele Postscript , concepute și create de Donald Knuth pentru a crea un instrument pentru sistemul de tipare T E X.

Knuth a început să lucreze la programul de creare a personajelor în 1977 și a produs prima versiune a METAFONT în 1979 . Datorită insuficiențelor în limbajul original METAFONT, Knuth a dezvoltat un nou sistem în 1984 și acest sistem actualizat este încă în uz astăzi; METAFONT enumeră versiuni cu un sistem similar cu T E X , unde numărul se apropie asimptotic și la fiecare revizuire.

În timp ce METAFONT, prin definiție, generează grafică raster , John Hobby a reimplementat acest limbaj pentru a genera cod PostScript . Astfel s-a născut MetaPost , care exploatează versatilitatea limbajului creat de Knuth pentru a genera grafică vectorială .

Mod de operare

Metafont este adesea rulat ca suport pentru driverele de dispozitiv de ieșire (imprimantă, afișaj); în aceste cazuri, sarcina sa este de a genera bitmaps pentru un font pentru o combinație specifică de dispozitiv de ieșire (numit mod în Metafont) și rezoluție (vizibil în numele fișierului de ieșire, vezi mai jos). Aceste bitmap-uri sunt de obicei stocate pentru reutilizare ulterioară, astfel încât Metafont nu trebuie să ruleze de fiecare dată când un document este vizualizat, dar pe de altă parte distribuțiile TeX cu o componentă Metafont nu includeau de obicei fonturi bitmap pre-construite, deoarece ar fi destul de mare în comparație cu sursele din care ar putea fi generate. Întrucât fonturile Metafont erau în mod tradițional valorile implicite ale TeX de la care alte formate de fonturi erau excepții, o instalare incompletă a unui font non-Metafont poate duce uneori la apelarea Metafont și la emiterea unui mesaj de eroare confuz „ somefont .mf not found”.

La fel de important, dar nu la fel de obișnuit, este rularea Metafont pentru a genera un fișier cu valori de caracter (TFM); un fișier TFM este generat numai dacă variabila de creare a caracterelor este pozitivă. În mod tradițional, distribuțiile TeX vin adesea cu toate fișierele TFM pre-generate (deoarece sunt destul de mici), dar cineva care instalează un font Metafont din sursă va trebui să își genereze fișierul TFM înainte ca TeX să îl poată utiliza.

Un al treilea mod de utilizare a Metafont este modul de probă : dacă variabila de corecție este pozitivă, fișierul fontului bitmap conține și informații suplimentare furnizate prin comenzi special , în special pozițiile și numele punctelor pe care proiectantul de fonturi le-a considerat importante pentru proiectare. Dacă utilizați utilitarul gftodvi separat pentru a genera imagini mărite ale gftodvi de caractere, sunt incluse aceste informații din ofertele speciale; locațiile punctelor nu sunt limitate la rezoluția pixelilor.

Metafont poate fi, de asemenea, rulat interactiv și are comenzi pentru a afișa imaginile pe care le produce pe ecran. Knuth a spus că folosește Metafont ca un fel de calculator de birou pentru rezolvarea ecuațiilor complicate, deși acum folosește MetaPost pentru ilustrații matematice.

Metafont poate reda orice tip de ieșire grafică, nu doar glifele. Cu toate acestea, MetaPost și Asymptote sunt preferate pentru ilustrațiile matematice. Metafont este cel mai frecvent invocat fără o cerere directă din partea utilizatorului. Fișierele DVI pot conține doar referințe la tipuri de caractere, mai degrabă decât seturile de glifuri vector sau raster permise de alte formate, cum ar fi PostScript. În consecință, glifele din fonturi trebuie accesate ori de câte ori este necesar un fișier DVI pentru a vizualiza, imprima sau converti.

Fisier de iesire

Metafont generează diferite tipuri de fișiere: pentru un fișier numit NAME.mf , acesta poate genera:

  • NAME.NNNNgf - Fișier cu ieșire raster la rezoluție NNNN (implicit 2602).
  • NAME.tfm - Fișier cu metrica caracterului TeX, care este informația de care are nevoie TeX. De obicei, trebuie să spuneți metafontului să genereze acest fișier.
  • NAME.log : ieșire fișier jurnal din procesare

După rularea Metafont, utilizați de obicei programul gftopk pentru a converti fișierele NNNNgf format pk (ambalat) .NNNNpk . Formatul pk a fost introdus în primul rând pentru a reduce dimensiunea fișierului (la aproximativ jumătate), dar se așteaptă, de asemenea, să accelereze prelucrarea, deoarece ar trebui introduse / ieșite mai puține date. Formatele GF și PK folosesc ambele coduri de lungime de rulare bitmap, dar produc codificări binare diferite de lungime de rulare. Formatul PK efectuează, de asemenea, pre-procesarea bitmap-urilor (caseta de delimitare, ștergerea liniilor repetate) și codifică toate liniile unui caracter ca o secvență lungă de biți [1] .

În structura standard TeX director, nume de fișiere sunt limitate la 8 + 3 caractere, astfel încât fișierele GF și PK ar avea numai .gf și .pk extensii. Fișierele pentru rezoluții diferite sunt păstrate separate plasându-le în directoare separate, numite dpi NNNN, de exemplu dpi300/cmr10.pk .

Limba

Limbajul Metafont este un limbaj interpretat pentru programe care sunt în esență mai degrabă declarative decât imperative [2] .

Variabile și ecuații

Variabilele din Metafont pot fi de opt tipuri diferite:

Cu Metafont este posibil să selectați diferite stilouri pentru a produce diferite forme cu aceeași linie.
Cu Metafont este posibil să selectați diferite stilouri pentru a produce diferite forme cu aceeași linie.
  • Numeric ( Numeric ): numere semnate în punct fix cu un epsilon de , limita superioară este mai mică de 4096 (Q12.16). Aceasta este valoarea implicită pentru variabilele nedeclarate ale unui alt caracter.
  • Pair ( Pair ): o pereche de valori numerice, utilizate în principal pentru a reprezenta punctele din plan.
  • Path : Ca și în PostScript / PDF / SVG, o curbă parametrică în plan, ale cărei funcții de coordonate sunt polinoame cubice. La fel ca în aceste alte sisteme, segmentele de cale sunt codificate ca curbe Bézier în termeni de noduri și puncte de control.
  • Transform ( Transform ): o transformare afină a planului, echivalentă cu o „matrice (transformare)” în PostScript / PDF.
  • Stilou ( Pen ): un poligon convex, care reprezintă forma unui „stilou” folosit pentru desen.
  • Picture : O imagine raster cu o valoare întreagă semnată pentru fiecare pixel.
  • Boolean ( Boolean )
  • Șir ( String ) caractere pe 8 biți.

Metapost adaugă culoare (un triplu al valorilor numerice) ca al nouălea caracter și are un model complet diferit (non-raster) pentru imagini; acesta din urmă este principalul punct de divergență între cele două programe. Macro-urile Metafont vardef trăiesc, de asemenea, în același spațiu de nume ca variabilele și pot fi cumva gândite ca un al nouălea tip de variabilă, deși macro-urile nu există ca valori de primă clasă în Metafont.

În mod neobișnuit, numele variabilelor nu sunt jetoane simple, ci secvențe de jetoane simbolice și indici numerici; numele variabilei x2r nu este deci un jeton alfanumeric, ci o succesiune a celor trei jetoane x (simbolic), 2 (numeric) și r (simbolic). Caracterele de înregistrare și matrice pot fi simulate prin colecții de variabile care împărtășesc un prefix de nume comun, o limbă acceptată de sistemul de declarare a caracterelor care oferă tuturor variabilelor ale căror nume diferă doar în indexuri numerice același caracter (așa cum era de așteptat pentru tablouri) păstrând numele variabilelor întregi diferă în unele jetoane simbolice separate (așa cum era de așteptat pentru înregistrări).

O caracteristică foarte distinctivă a Metafont este utilizarea ecuațiilor pentru definirea variabilelor. O variabilă numerică (sau o componentă a unei variabile de pereche sau transformare) poate fi în cele trei stări cunoscute (împreună), necunoscute independente ( nedeterminate ) și necunoscute dependente ( nedeterminate , dar date de o expresie liniară a unuia sau mai multor independenți). Când Metafont execută o declarație de ecuație, transformă unul dintre independenții implicați într-un angajat și îl elimină din expresiile pentru toți ceilalți angajați; atunci când acestea nu rămân independente în expresia unei variabile dependente, acea variabilă devine cunoscută. Rezolvarea sistemelor de ecuații liniare este, prin urmare, o caracteristică încorporată a limbajului Metafont, iar metoda recomandată pentru atribuirea majorității variabilelor (în special a celor ale căror valori au semnificație geometrică) este de a indica ecuațiile care determină valorile lor. Sistemele de ecuații amestecă adesea ecuații numerice (scalare) cu ecuații în perechi (vectoriale).

O excepție de la cele de mai sus este clasa variabilelor cantității interne . Acestea au nume constând dintr-un singur semn simbolic, sunt întotdeauna numerice și sunt întotdeauna cunoscute. Au o reprezentare internă mai directă decât variabilele obișnuite, ceea ce face convenabil ca operațiile primitive din Metafont (sau extensiile sale) să le folosească implicit.

Sintaxă

Metafont are jetoane numerice și constante de șir cu sintaxă principală; șirurile sunt delimitate de " (ghilimele), constantele numerice pot avea zecimale, dar nu o parte exponentă. Toate celelalte jetoane sunt clasificate ca simbolice și pot fi redefinite în mod arbitrar; nu există nicio restricție că jetoanele cu anumite semnificații trebuie să aibă nume Constând din anumite caractere În timpul rulării, pot exista jetoane capsulare suplimentare, care sunt de fapt jetoane arbitrare cu valoare constantă, care apar ca jetoane simbolice în codul sursă.

Cu excepția cazului în care caracterele sunt implicate în constante numerice sau de șir, întinderea simbolului care conține un anumit caracter depinde de clasa căreia îi aparține caracterul; spre deosebire de TeX, Metafont are clase de caractere fixe. Caracterele , , ; , ( și ) sunt „solitare” și formează doar jetoane cu un singur caracter. Pentru clasele de caractere <=>:| , '' (ghilimele), +- , /*\ , !? , #&@$ , ^~ , [ , ] , {} și . , precum și clasa de subliniere împreună cu majuscule și minuscule AZ, simbolul constă din cea mai lungă secvență consecutivă de caractere din aceeași clasă. Caracterele cu spațiu alb nu contribuie cu jetoane. % începe un comentariu care durează până la sfârșitul liniei.

O aplicație notabilă a acestor reguli este că # apare frecvent ca parte a numelor variabilelor în codul Metafont, cum ar fi em# și pt# .

Delimitatorii (cum ar fi parantezele) nu au semnificații încorporate, în schimb există o comandă care transformă două jetoane simbolice într-o pereche de delimitatori potrivite, dar în mod normal programele Metafont folosesc doar paranteze obișnuite. În plus față de prioritățile prioritare în expresii, delimitatorii sunt necesari și pentru anumite tipuri de argumente macro.

Grafică

Curbele în Metafont sunt definite ca spline cubice mai degrabă decât pătratice, pentru o mai mare versatilitate în detrimentul aritmeticii mai complexe [3] .

Spre deosebire de formatele de fonturi conturate mai frecvente (cum ar fi TrueType sau PostScript Type 1), un font Metafont este compus în principal din linii de „stilou” cu lățime finită, împreună cu zone umplute. Prin urmare, în loc să descrie conturul glifului direct, un fișier Metafont descrie căile stiloului. Unele fonturi Metafont mai simple, cum ar fi familia Computer Modern de fonturi caligrafice matematice, folosesc o singură linie de stilou cu un stilou relativ mare pentru a defini fiecare „linie” vizuală a glifelor. Personaje mai complexe, cum ar fi cercul de familie Computer Modern, utilizează un stilou mic pentru a urmări conturul „loviturilor” vizuale, care sunt apoi completate; rezultatul este foarte asemănător cu un caracter de contur, dar cu colțurile ușor înmuiate definite de forma stiloului.

Deoarece formele de caractere sunt definite mai degrabă prin ecuații decât prin numere direct codificate, parametrii precum raportul de aspect, înclinarea caracterelor, lățimea liniei, dimensiunea serifului și așa mai departe, pot fi tratați ca parametri de intrare în fiecare definiție a glifului (care, prin urmare, nu definesc un un singur caracter, dar un meta-font). Prin urmare, prin schimbarea valorii unuia dintre acești parametri într-o locație din fișierul Metafont, este posibil să se producă o modificare consistentă în întregul font. Computer Modern Roman ilustrează multe utilizări ale acestei caracteristici; O instalație tipică TeX include o serie de versiuni ale fontului în dimensiuni de la 5 pt la 17 pt, cu lățimile cursei la fel în toate dimensiunile (în loc să crească când fontul este redimensionat) și raportul de aspect se extinde în dimensiunile mai mici. mic pentru o mai mare lizibilitate. De asemenea, mașina de scris Computer Modern și fonturile sans-serif sunt definite utilizând în esență același fișier Metafont ca fontul Roman, dar cu parametri globali diferiți.

Utilizare

Deși designeri de fonturi cunoscuți, precum Hermann Zapf, au colaborat cu Knuth pentru a crea noi fonturi folosind Metafont, sistemul nu a fost adoptat pe scară largă de către proiectanții de fonturi profesioniști. Knuth atribuie acest lucru faptului că „a cere unui artist să devină suficient de matematician pentru a afla cum să scrie un font cu 60 de parametri este prea mult” [4] . Jonathan Hoefler a comentat că sistemul Metafont a devenit în cele din urmă „ o tehnologie din spatele zero a fonturilor tale preferate ... Ideea lui Knuth că literele încep cu forme scheletice este greșită[5] .

Sistemul Metafont vă permite să procesați fonturi în moduri neobișnuite; în 1982 Knuth a arătat cum ar putea fi folosit pentru a transforma fonturile, cu un font serif trecând încet într-un design sans-serif pe parcursul unui text [6] .

Istorie

Donald Knuth a început să lucreze la software-ul de creare a fonturilor în 1977 și a produs prima versiune a Metafont în 1979. Datorită deficiențelor în limbajul original Metafont, Knuth a dezvoltat un sistem Metafont complet nou în 1984 și este acest sistem revizuit care este utilizat astăzi; Metafont are un sistem de versionare similar cu cel al TeX, unde numărul se apropie asimptotic și la fiecare revizuire [7] .

Exemplu

Următorul exemplu creează o formă închisă în formă de bob pentru caracterul „B” al unui font:

 % nume de fișier: beta.mf
% mode_setup;
% Definiți o formă de fasole pentru caracterul B
beginchar ("B", 11 pt #, 11 pt #, 0);
% Setează coordonatele ca sistem de ecuații
 y1 = y2 = y3 = 0;
 y4 = y5 = y6 = h;
 x1 = x4 = 0;
 x2 = x5 = w;
 x3 = x6 = 2 * w;

% Definiți stiloul
   cercul rotunjit rotunjit 0,2w yscaled 0,04w rotit 45;

% Desenați curba caracterelor
% z1 este egal cu (x1, y1)
  desenează z1..z3..z6 {z2-z6} .. z5 .. {z4-z2} z4..ciclu; endchar;

Sfârșit

Aceasta produce următorul glif:

Metafont-example-output.svg

Exemplul de mai sus va fi procesat cu o linie de comandă precum [8] :

 mf '\ mode = ljfour; mode_setup; intrare beta.mf ';
gftopk beta.600gf beta.600pk

Deci, poate fi utilizat într-un fișier LaTeX, cum ar fi (toate fișierele ar trebui să se afle în același director sau sistemul TeX ar trebui să fie informat folosind metodele adecvate):

 \ documentclass {article}

\ newfont {\ letterbeta} {beta} 
\ newcommand {\ otherbeta} {{\ letterbeta B}}

\ begin {document} 
Să încercăm să avem o \ otherbeta \ ciudată aici.
\ end {document}

Fișierul PDF rezultat ar trebui să arate astfel: Tex mf beta.pdf

Producerea de fonturi PostScript de tip 1

Există mai multe instrumente pentru convertirea programelor Metafont în fonturi PostScript de tip 1. Majoritatea folosesc capacitatea MetaPost de a converti un subset al limbajului Metafont în profiluri EPS, care ulterior pot fi convertite în fonturi PostScript de tip 1. Vectorul de linii Pen Pen Metafont nu este banal, deoarece modelul Metafont al unui glif este o imagine raster, iar contururile exacte ale majorității loviturilor nu sunt curbe Bézier.

  • Echipa poloneză JNS a dezvoltat METATYPE1 [9] (bazat pe MetaPost) pentru crearea fonturilor PostScript de tip 1. Marele său dezavantaj este că nu este posibilă utilizarea stilourilor, ceea ce reduce foarte mult puterea limbajului Metafont. Inițial, instrumentul a fost folosit de turnătoria de tip polonez GUST pentru a produce o variantă modernizată și extinsă a Computer Modern, numită Latin Modern.
  • mf2pt1 [10] , bazat tot pe Metapost , a fost dezvoltat de Scott Pakin cu câteva contribuții de la Werner Lemberg. De asemenea, are mai multe limitări detaliate în manualul său, cea mai semnificativă fiind restricția conform căreia fiecare glif trebuie extras în întregime din căi închise. Pentru a depăși limitele mf2pt1, ieșirea EPS a Metapost poate fi postprocesată cu FontForge, care este capabil să interpreteze căi PostScript complexe generate de Metapost din stilourile eliptice ale Metafont și, de asemenea, capabil să elimine suprapunerile conturului. Deoarece FontForge acceptă scriptarea, acest pas de post-procesare poate fi automatizat. Această abordare a fost utilizată pentru a produce scheme de tip 1 pentru caracterul matematic MnSymbol dezvoltat de Achim Blumensath; MnSymbol a fost conceput ca „însoțitor” al Minion Pro.
  • MetaFog [11] este un convertor propriu capabil să convertească analitic loviturile stiloului, dar necesită o prelucrare manuală pentru a elimina cazurile degenerate și nu este disponibil publicului. Poate procesa numai ieșirea Metapost [12] .

Abordarea obișnuită de a genera fonturi de tip 1 cu linii de stilou rămâne să genereze o hartă de biți de înaltă rezoluție și apoi să utilizeze un autotracer, implementat de pachete precum mftrace [13] și TeXtrace [14] .

Notă

  1. ^ Tomas Rokicki, Format de fișier de fonturi ( PDF ), în TUGboat , vol. 6, nr. 3, 1985, pp. 115-120. Adus pe 9 august 2019 .
  2. ^ Donald Knuth, The METAFONTbook , Addison Wesley, 1986, ISBN 0-201-13445-4 .
  3. ^ Șablon: Citați interviul
  4. ^ CSTUG, Universitatea Charles, Praga, martie 1996, Întrebări și răspunsuri cu prof. Donald E. Knuth, reprodus în TUGboat 17 (4) (1996), 355-67. Citarea este de la pagina 361. Disponibil online la [1]
  5. ^ Jonathan Hoefler, ideea lui Knuth că literele încep cu forme scheletice este greșită. Dar munca sa este importantă și a avut un impact de durată. , pe twitter.com , Twitter. Adus la 18 august 2018 .
  6. ^ Donald Knuth, Conceptul unui Meta-Font ( PDF ), în Limbaj vizibil , vol. 16, n. 1, 1982, pp. 3-27.
  7. ^ Knuth: Computers and Typesetting , la www-cs-faculty.stanford.edu .
  8. ^ Christophe Grandsir, Tutorial METAFONT , pe metafont.tutorial.free.fr .
  9. ^ CTAN: tex-archive / fonts / utilities / metatype1 , pe ctan.org .
  10. ^ CTAN: tex-archive / support / mf2pt1 , pe ctan.org .
  11. ^ RJ Kinch, „MetaFog: convertirea formelor Metafont în contururi”, TUGboat 16 (3) , 233–43 (1995) ( PDF ), pe tug.org .
  12. ^ K. Píška, 2004
  13. ^ mftrace - un mic program Python care vă permite să urmăriți un font bitmap TeX într-un font PFA sau PFB (A PostScript Type1 Scalable Font) sau TTF (TrueType). Este licențiat sub GNU GPL. Creat de Han-Wen Nienhuys. Versiunile anterioare 1.0.5 erau denumite „pktrace”.
  14. ^ TeXtrace - o colecție de scripturi pentru UNIX care convertesc orice font TeX într-un font Type1 .pfb, potrivit imediat pentru a fi utilizat cu dvips, pdftex, acroread (și cu multe alte programe). Creat de Peter Szabo.

Alte proiecte

linkuri externe

Software gratuit Free Software Portal : accesați intrările Wikipedia care se ocupă de software gratuit