Soubory v metapostu
Zdrojové soubory
Základem metapostu je textový soubor, v němž je psán hlavní program. Má příponu .mp (ale přinejmenším na linuxu interpret akceptuje i jinou). Takovýto soubor zpravidla začíná definici proměnné prologues (pokud očekáváme grafický výstup). Pokud se má vykreslit obrázek, musí v něm být příkaz
beginfig(n);
kdy n je číslo vygenerovaného obrázku a je použito jako přípona vygenerovaného souboru (ale mohou tam být místo číslic i písmena, případně proměnná typu numeric). Vykreslování obrázku je ukončeno příkazem
endfig;
(v jednom souboru může být nadefinováno i více obrázků), předcházet jim může např. deklarování a nadefinování proměnných a maker, které jsou společné všem. Celý program ukončuje příkaz
end;
Výše uvedené bylo obsaženo v souboru minimalni.mp v minulém díle.
Samotný program představuje sled příkazů ukončených středníkem, příkazů může být na jednom řádku větší počet. Zpravidla tam, kde systém toleruje mezeru nebo jiný „bílý znak“, toleruje i rozlomení dlouhého příkazu na více řádků. Jednotlivé příkazy budou probírány u datových typů, ke kterým se vztahují.
Není-li spuštěný soubor ukončen příkazem end;, očekává interpret po doběhnutí příkazů z textu další příkazy z příkazového řádku (toho můžeme snadno využít k ladění syntaxe některých příkazů).
Vkládané zdrojové soubory
V některých případech je výhodné mít makra (odpovídají zhruba podprogramům a uživatelem definovaným funkcím), případně naopak sady dat uložené ve zvláštním souboru / souborech. Tyto soubory musí mít příponu .mp
, protože ta se do příkazu vkládajícího soubor nezadává (a metapost ji přidává automaticky). Syntaxe příkazu je:
input nazev_souboru_bez_pripony;
Současně by v nich neměla být definice proměnné prologues (pokud byla definována v hlavním programu – nemělo by to význam) a nesmějí být ukončeny příkazem end;.
Lze jen doporučit, aby se uživatel podíval po adresáři s předpřipravenými makry metapostu ve svém systému (stačí zadat hledání souborů s příponou .mp), aby náhodně nevytvořil soubor s názvem kolidujícím s některým z těchto metapostem využívaných souborů. To, kterému by následně byla dána přednost, je závislé na konkrétním operačním systému a jeho uživatelském nastavení, takováto kolize názvů by tedy vedla k předem nedefinovanému chování metapostu.
Za tímto příkazem se metapost chová naprosto stejně, jako by byl obsah vloženého souboru přenesen do hlavního příkazem kopíruj – vlož.
Načtení dat ze souboru
Metapostový program může načítat data ze souboru příkazem:
a:=readfrom(soubor);
- proměnná a musí být předem deklarovaná proměnná typu string
- soubor je název souboru včetně přípony.
Při prvním použití proměnné můžeme použít místo „:=“ i „=“ (viz dále)
Velice často jsou používány datové soubory upravené do tvaru jedno číslo = jeden řádek. Výsledkem načtení je tedy řetězec (i když jsou to čísla). Pokud načítáme číslice, s nimiž chceme dále počítat, musíme načtený sled číslic konvertovat na datový typ numeric (bude probráno u řetězců).
Načte se vždy jeden řádek souboru (z toho vidíme, že mohou nastat problémy s binárními soubory). Konec souboru se načte jako EOF. Kompletní soubor předem neznámé délky tedy můžeme načítat nekonečným cyklem s testováním načteného (bude probráno u cyklů). Pokud konec souboru ignorujeme, začne se načítat znovu od počátku.
Ukládání souborů na disk
Obsah proměnné typu string můžeme uložit do souboru na disku. Metapost užívá příkaz:
write("řetězec") to "RETEZEC";
- řetězec je obsah zapisované proměnné typu string (mohou v něm být i nealfanumerické znaky), nebo sama proměnná
- RETEZEC je název souboru, do něhož se zapisuje (případně proměnná typu string)
- pokud nevkládáme přímo řetězce, ale proměnné typu string, pak je syntaxe bez uvozovek:write(obsah) to soubor; (obsah je proměnná s ukládaným textem a soubor je název souboru)
V rámci běhu programu se při prvním zápisu soubor RETEZEC vyprázdní (vymaže se jeho obsah) a mezi jednotlivými zápsanými proměnnými je vkládán konec řádku.
Proměnné a pole proměnných
Pro neprogramující: Proměnná představuje pojmenované místo v paměti počítače, kam se ukládají nějaké hodnoty. Metapost proměnné rozlišuje podle minule uvedených datových typů, nelze je vzájemně zaměňovat (jako např. v perlu nebo pythonu). Proměnné mohou mít názvy skládající se z velkých a malých písmen anglické abecedy a podtržítka; malé a velké varianty téhož písmene jsou odlišeny jako dva různé znaky. Číslo nemůže být (na rozdíl od mnoha jiných programovacích jazyků) součástí názvu proměnné.
Proměnné je nutno deklarovat (= přiřadit k typu jméno, a zda se jedná o jednoduchou proměnnou, nebo jedno- či dvourozměrné pole) před prvním použitím. První použití nedeklarované proměnné nezpůsobí chybu, ale systém ji považuje za proměnnou typu numeric (jednoduché proměnné tohoto typu se tudíž nemusí deklarovat). Pokus o vložení hodnoty, která neodpovídá typu proměnné, vede k chybovému hlášení a ukončení programu.
Pole deklarujeme jako název proměnné s jednou nebo dvěma dvojicemi prázdných závorek. Pro neprogramující: Pole představují řadu proměnných stejného jména, odlišených číslem u jednorozměrného pole nebo dvojicí čísel u pole dvourozměrného.
Deklarace začíná názvem typu proměnné a následuje výčet proměnných, oddělených čárkami:
boolean a,b; % deklarovali jsme dvě proměnné typu boolean pair c,d[],e[][]; % deklarovali jsme jednoduchou proměnnou % jedno a dvourozměrné pole, vše typu pair
Ty obdélníčky – jeden za d a dva za e – jsou prázdné hranaté závorky; v některých fontech webových prohlížečů jsou hůře rozpoznatelné.
U jednorozměrného pole můžeme mít indexové číslo v hranaté závorce za názvem, nebo i bez ní. pole25 a pole[25] je to samé. Pokud ovšem potřebujeme ke členům pole přistupovat prostřednictvím proměnné cyklu (až probereme všechny datové typy), potom musíme závorky použít. Závorky musíme použít i u dvourozměrných polí (oboje). Kombinaci jednoho čísla v závorkách a jednoho bez metapost většinou bude tolerovat, ale výsledky nemusejí odpovídat našim představám.
Výpis proměnných do konzoly (a souboru .log) zajistí příkaz
show nazev_promenne;
Pokud proměnná neexistuje, dojde k výpisu jejího názvu. Pokud existuje, ale nemá přiřazenu (vypočtenu) hodnotu, vypíše typ a název, výpis uvede „unknown“. Pokud proměnná existuje a má hodnotu, vypíše hodnotu.
Program z následujícího obrázku:

Vypíše do logového souboru následující:
This is MetaPost, Version 0.641 (Web2C 7.5.4) (Hodnoty.mp >> a >> unknown boolean a >> false )
Proměnná a byla vypisována celkem třikrát, poprvé bez toho, že by byla definována, podruhé byla definována, ale bez přidělené hodnoty, a potřetí měla přidělenou hodnotu.
Specialitou metapostu je, že má pouze jeden typ pro jednotlivá čísla (numeric – bude probrán příště), z toho vyplývá, že indexy polí mohou být rovněž desetinná a případně i záporná čísla.
Metapost rozlišuje rovnítko a přiřazení. Pokud proměnná nebyla dosud použita, je možné jí přidělit hodnotu rovnítkem „=“.
Výraz těchto vlastností chápe metapost jako rovnici a snaží se ji řešit. Můžeme dokonce přidělit hodnotu závislou na proměnné, která dosud nemá hodnotu určenou. Jakmile přidělením nebo výpočtem bude známa hodnota A nebo B, metapost automaticky dopočítá druhou z nich, například:

Výpis bude vypadat následovně:
This is MetaPost, Version 0.641 (Web2C 7.5.4) (Hodnoty2.mp >> A >> 0.5A >> 10 >> 5 >> 10 >> 7 )
Takže metapost proměnnou A vypíše názvem (jako v předchozím případě). Proměnnou B vypíše jejím vztahem k proměnné A. Po přidělení hodnoty 5 proměnné B dopočítá i hodnotu proměnné A. Následné předefinování hodnoty B operátorem „:=“ už na hodnotu proměnné A vliv nemá.
Pokud bychom se snažili změnit hodnotu proměnné B ve výše uvedeném příkladě rovnítkem, vedlo by to k chybovému hlášení.
Je ovšem možné už napoprvé přidělit proměnné hodnotu operátorem „:=“ (výjimka bude zmíněna u typu pair).
Datový typ boolean
Do datového typu boolean ukládáme logické hodnoty true nebo false (ve své textové presentaci předdefinované v metapostu). Jsem toho názoru, že následující program s komentářem a výpis z jeho chodu jsou dostatečně instruktivní (obsah hranatých závorek doplněn k výpisu ručně):
boolean a,b,c; % proměnné typu boolean se musejí předem deklarovat d:=1; e:=1; % proměnné typu numeric nikoli a:=true; b:=false; % přidělení hodnot proměnným a a b c:=a; % přidělení hodnoty proměnné c show a; show b;show c; % vypíše hodnoty proměnných a, b, c c:=(d=e); % c byla přidělena nová hodnota; protože d = e je tato % hodnota true show c; % vypíše hodnotu c c:=(a=b); % c byla přidělena hodnota; protože a není rovno b, % je tato hodnota false show c; % vypíše hodnotu c end; % konec metapostového souboru This is MetaPost, Version 0.641 (Web2C 7.5.4) (Bool.mp >> true [hodnota a] >> false [hodnota b] >> true [hodnota c - poprvé] >> true [hodnota c - podruhé] >> false ) [hodnota c - potřetí]
Vestavěné operátory a funkce pro datový typ boolean
Operátory
„<“, „=“, „>“, „<=“, „>=“, „<>“, jsou operátory. Jejich význam je stejný jako v matematice, jen je nutno dávat pozor na pořadí dílčích znaků u dvouznakových operátorů, jeho nedodržení vede k chybovým hlášením. Pokud jsou porovnávány vždy dvě proměnné stejného typu (aplikovatelné na typy numeric, pair, picture, color, transform a string) je výsledkem booleovská hodnota, která může být vložena do proměnné typu boolean.
Funkce
- boolean, color, numeric, pair, pen, picture, string, transform jsou funkce, které zjistí, zda je proměnná zadaného názvu daného typu. Příklad: a=boolean(x); V proměnné a bude hodnota true, je-li x proměnná typu boolean, je-li jakéhokoli jiného typu, bude mít a hodnotu false
- cycle Příkaz: a=cycle(x); vloží do proměnné a hodnotu true, je-li x path tvořící uzavřenou křivku
- known Pro proměnnou libovolného datového typu příkaz: a=known(x); vloží do proměnné a hodnotu true, pokud je její obsah znám. Tuto funkci lze mj. využít pro otestování rozsahu pole.
- not Logický zápor (využití např. v podmíněných příkazech).
- odd Příkaz: a=odd(x); vrací true, pokud je x numerická proměnná po zaokrouhlení lichá, false, je-li po zaokrouhlení sudá.
- unknown Funkce opačná ke known
Datový typ pen
Implicitní pero představuje kroužek o průměru 0.5 tiskařského bodu (délkové jednotky a vztahy mezi nimi budou probrány u typu numeric). Pero můžeme změnit několika způsoby:
- pickup pencircle scaled cislo; „cislo“ je délková míra v jednotkách, které metapost akceptuje (různé typy tiskařských měr, palce,mm, cm), nové pero bude tvořit kroužek o zadaném průměru.
- pickup pensquare; pero bude čtvereček se stranami měřícími jeden tiskařský bod a rovnoběžnými resp kolmými na osy x a y
Výše uvedené příkazy nevyžadují, aby pero bylo předem deklarováno. - Pera mohou být předem deklarována: pen pero; a definována: pero:=pencircle scaled .25mm; (nebo jakkoli jinak, jak bylo uvedeno v předchozích bodech). Příkaz pickup pero; zavede toto předdefinované pero. Per můžeme mít pochopitelně víc, nebo mít pole per a tímto příkazem (vždy s konkrétním názvem pera) mezi nimi přepínat.
- pero:=makepen(obrazec); pero bude mít tvar obrazce, což musí být uzavřená křivka (datový typ path, podrobnosti budou u tohoto typu). Je chápáno též jako konverzní funkce typu path na pen (viz níže).
- k implicitnímu peru se vrátíme příkazem pickup defaultpen;
Při kreslení cest (jeden z nejdůležitějších datových typů – path, bude mu věnováno asi více dílů) se pero jakoby posouvá po zadané dráze, ale udržuje si svou orientaci vůči osám x a y, proto pera mohou kreslit různě široké čáry v různých směrech (asi jako v reále plochá pera nebo husí brk). Na rozdíl od některých grafických editorů není možné kreslit čáru více uzavřenými křivkami současně. Pero neumí plynule v průběhu čáry měnit svou sílu a tvar.
Vestavěné konstanty a funkce pro datový typ pen
Proměnná pen má tři předdefinované konstanty, pensquare, pencircle a defaultpen. Byly uvedeny v předchozím textu.
Pera mohou být podrobena transformacím, stejně jako ostatní grafické prvky (mimo body), ty budou probrány u typu transform.
Vestavěná funkce makepen vytvoří pero z uzavřené křivky. Její syntaxe byla uvedena výše, probrána bude u datového typu path.
Proměnná prologues
Proměnná prologues nastavuje vlastnosti metapostem generovaného postscriptového souboru. Nastavuje se zpravidla na začátku příkazem
prologues:=hodnota;
Je-li hodnota menší než jedna, vygeneruje se obrázek na normalizovanou stránku (nejčastěji A4) a nejsou v něm zobrazeny popisky. Je-li hodnota jedna a více, vygeneruje se obrázek jako nejmenší pravoúhlý rovnoběžník se stranami kolmými resp. rovnoběžnými vůči osám, do něhož lze vepsat nakreslené grafické prvky, a zobrazí se v něm textové popisky.
Z tohoto důvodu nejčastěji začínají programy, které něco kreslí, příkazem prologues:=1;
Tuto proměnnou nemá cenu nastavovat u programů, které pouze vypisují na obrazovku hodnoty příkazem show (jako příklady v tomto díle).
Příště
Příště toho ještě moc nenakreslíme, protože budeme muset probrat datový typ numeric, do něhož metapost ukládá jednoduchá čísla.