Mezi nejpoužívanější funkce bezesporu patří automatické řešení soustav lineárních rovnic, výpočet průniku křivek, plynulé navazování, automatický výpočet kontrolních bodů Beziérových křivek, aby byla výsledná křivka co nejhezčí, vkládání popisků (je možné formátování TeXem a TROFFem), využití různých stylů kreslení čar, vestavěný makrojazyk,... Programovací jazyk je běžný procedurálního typu, takže je snadno čitelný (možná když si někdo zvykne na PostScript, tak na něj nedá dopustit, ale...)
Vygenerované obrázky je možno použít mnoha způsoby, mimo jiné je možno
propojit je s TeXovským textem. Obvykle se sice používá METAFONT, ale pro
některé aplikace bude MetaPost jistě vhodnější. Bohužel je ale pak nutno
DVI soubor konvertovat do PostScriptu příkazem dvips.
Výstupní soubory je možno prohlížet bez problémů např. programem ghostview,
při použitém Debianu 2.1 mi nastaly pouze 2 problémy:
/cmb10 (/usr/lib/texmf/fonts/type1/bluesky/cm/cmb10.pfb) ;
/cmbsy10 (/usr/lib/texmf/fonts/type1/bluesky/cm/cmbsy10.pfb) ;
/cmbx10 (/usr/lib/texmf/fonts/type1/bluesky/cm/cmbx10.pfb) ;
/cmbx12 (/usr/lib/texmf/fonts/type1/bluesky/cm/cmbx12.pfb) ;
/cmbx5 (/usr/lib/texmf/fonts/type1/bluesky/cm/cmbx5.pfb) ;
...
/lcmssi8 (/usr/lib/texmf/fonts/type1/bluesky/cm/lcmssi8.pfb) ;
/line10 (/usr/lib/texmf/fonts/type1/bluesky/cm/line10.pfb) ;
/linew10 (/usr/lib/texmf/fonts/type1/bluesky/cm/linew10.pfb) ;
/euex10 (/usr/lib/texmf/fonts/type1/bluesky/ams/euex10.pfb) ;
/eufb10 (/usr/lib/texmf/fonts/type1/bluesky/ams/eufb10.pfb) ;
/eufb5 (/usr/lib/texmf/fonts/type1/bluesky/ams/eufb5.pfb) ;
...
Od tohoto okamžiku najde ghostscript v pořádku tyto fonty, ačkoliv jsou
nestandardní a nainstalovány ve zvláštním adresáři. Snad není nutné podotknout,
že tyto soubory musí být PostScriptové, není možné použít GF či PK soubory.
V teTeXové instalaci se nicméně tyto soubory nalézají.
Program obrazek.mp napíšete v libovolném editoru, spustíte mpost obrazek.mp, ten vygeneruje sérii souborů obrazek.1, obrazek.2,... Tyto soubory postupně obsahují PostScriptové kódy všech obrázků v něm obsažených.
Velice příjemnou funkcí je automatické řešení lineárních rovnic. Operátor
rovnítko neplní totiž funkci přiřazení, ale jakési vyjádření přání: chtěl
bych, aby se tohle rovnalo. Pokud použijeme proměnné, jejichž hodnota je
neznámá, MetaPost si zapamatuje jejich vzájemný vztah a při procházení
dalších výrazů tyto rovnosti postupně řeší (eliminuje neznámé). Pokud se
ale pokusíme použít neznámou souřadnici při volání některého kreslícího
příkazu, ohlásí chybu, stejně jako při neexistenci řešení. Pokud chceme
neznámou proměnnou pouze využít k zápisu výrazu, ale nepotřebujeme znát
její hodnotu, napíšeme whatever. Příkladem možného použití rovnítka
může být:
z1-z2=z3-z4=z5-z6=(0,2cm); %z1 je 2cm nad z2,...
z5=z1+whatever[z1,z2]=z3+whatever[z3,z4]; %z5 je prunikem primek z1--z2 a z3--z4
z0=(0,0); z1=(k,0); z2-z0=(z1-z0) rotated 60; %rovnostranny trojuhelnik
Při popisování objektů je možno využít lineárních transformací,
které můžeme popsat např. složením transformací elementárních, jako jsou
scaled
(xscaled, yscaled, zscaled), shifted, slanted, rotated. Takto můžeme
před nakreslením ještě ztransformovat cestu, popisek, obrázek, bod,...
Křivky kreslené MetaPostem jsou Beziérovy kubiky, stejné jako používá PostScript. Na rozdíl od mnoha konkurenčních systémů, v MetaPostu není nutno zadávat kontrolní body. V nejjednodušším případě se pouze zadá seznam bodů, jimiž má křivka procházet, a MetaPost sám podle jakési heuristiky zvolí body tak, aby byla křivka co nejhezčí. Nemusíte se ale bát, že by nám MetaPost něco vnucoval. Jeho chování můžeme ovlivnit nastavením mnoha lidsky srozumitelnými parametry:
Většinu těchto parametrů využijeme málokdy, MetaPostí heuristika
je skutečně vynikající. Zadávat body ručně se mi jeví být až směšné.
MetaPost poskytuje mnoho funkcí pro práci s cestami. O cestě můžeme zjišťovat např. tyto informace:
Pokud chcem vysázet popisek sázecím systémem (např. TeX nebo TROFF), pak místo textu uzavřeného do uvozovek napíšeme text mezi klíčová slova btex a etex. Např. label.lrt(btex \int_0^1x\;{\rm d}x={1\over2} etex rotated 20 scaled 1.44, (3cm,3cm)); MetaPost se postará o vytvoření zdrojového souboru pro sázecí systém, analýzu výstupního (DVI) souboru a převedení na posloupnost PostScriptových příkazů. Díky tomu není problém s výsledkem dále pracovat, např. jej natáčet, zvětšovat nebo měnit barvu.
Pokud potřebujeme TeX nějak inicializovat (natáhnout makra), uvedeme
tyto příkazy na začátku ve tvaru verbatimtex \input mymac etex.
Nezapomeňte na správné (nenulové) nastavení proměnné prologues, jinak
žádné popisky neuvidíte.
Přerušovanou křivku vykreslíme snadno připojením výrazu dashed. Tento výraz může má více variant:
Tvar konců čar je možno modifikovat nastavením linecap:=butt; (resp. squared, rounded). Analogicky tvar napojení čar je možno modifikovat nastavením linejoin:=rounded; (resp. beveled, mitered). Šipky se dají kreslit na rozdíl od METAFONTu přímo primitivem drawarrow, které bere v úvahu zakřivení křivky.
Cesty je možno kreslit také kaligrafickým perem. Příkazem pickup pencircle xscaled 3mm yscaled 0.5mm rotated 60; nadefinujeme pero se sklonem 60 stupňů. Místo pencircle můžeme kreslit libovolným konvexním polygonem, syntaxe zápisu je makepen((-.5,-.5)--(-.5,.5)--(.5,.5)--(.5,-.5)--cycle). MetaPost předdefinuje tato pera: pencircle, pensquare, penrazor. Nejsem si jist, jak řeší MetaPost kolizi mezi použitím kaligrafického pera a aplikací PostScriptových parametrů na vzhled čar.
Oříznutí obrázku se dá docílit příkazem clip currentpicture to p; kde p je uzavřená cesta.
K Plain MetaPostu existuje balík maker nazvaný boxes.mp, který
umožňuje pohodlným způsobem kreslit rámečky okolo obrázků, jednoduše je
spojovat šipkami,... Balík je ideální pro kreslení grafů, schémat.
Umožňuje kreslit hranaté a oválné boxy, přehledně je propojovat, vkládat
elegantně popisky,...
V MetaPostu nechybí ani makrojazyk. Je možno v něm programovat for
cykly a if příkazy. Naprosto nedocenitelná věc je skutečnost,
že tyto konstrukce nejsou příkazy, ale makra preprocesoru. Není problém
použít for cyklus při vyvolávání draw příkazu (např.
draw
z1 for i=2 upto 10: ..z[i] endfor;), takže grafy funkcí nakreslíme
jedním cyklem. To stejné platí i pro příkaz if.
Makra se dají definovat s parametry i bez pomocí příkazu def pero(expr t)=pickup pencircle scaled t; enddef; Makra se dají nastavit, aby se chovala jako unární či binární operátory. Dokonce i takové základní nastavení, jako že z5 je zkratka za (x5,y5), je pouhé makro.
O makrech je toho možné říci velice mnoho. Zde musím čtenáře bohužel odkázat na MetaPost user manual.
Ačkoliv byl METAFONT určen pro generování fontů, jeho možnosti byly natolik široké, že si získal oblibu i jako editor vysoce kvalitních obrázků (tzv. pérovek). Bohužel program má několik závažných omezení, které se musejí hnusným způsobem obcházet (maximální velikost písmene, nesnadné sázení popisků, pražádná podpora barev,...). Kromě toho je výstupem programu bitmapa. U fontu to je možná vhodné, protože požadujeme rychlé zpracování při mnohonásobném použití. U obrázku, který jednou použijeme, je tato vlastnost spíše na závadu. Kvůli obyčejné změně měřítka je nutno celý obrázek rekompilovat (přece ho nebudeme zvětšovat lineárně).
Proto se objevil MetaPost. Autorem MetaPostu je John Hobby z Bellových laboratoří. Pokud jsme schopni vytisknout PostScriptový výsledek (což s ghostscriptem není problém), myslím si, že výhody tohoto programu vysoce převažují nad nevýhodami. Pro kreslení obrázků je MetaPost daleko pohodlnější.
Zajímavé je, že MetaPost vznikl z METAFONTu pouhou modifikací zdrojáku (výpočetních a výstupních rutin). Zůstal zachován parser, makrojazyk,...
MetaPost obsahuje mnoho rozšíření jazyka oproti METAFONTu. Dlužno podotknout, že některé prvky jazyka nebyly v MetaPostu implementovány: např. veškeré bitmapové manipulace, protože PostScript je vektorový jazyk, popis desítek parametrů pro matematické fonty (plus kerningových tabulek), protože program není již určen pro generování fontů,...
O TeXu, METAFONTu, MetaPostu a spol. lze najít spoustu odkazů na http://www.cstug.cz. Další informace o kreslení obrázků v METAFONTu najdete na http://www.cstug.cz/kreslime/index.html.