Hlavní navigace

Soubory, logické proměnné a pera v Metapostu

Jan Šimůnek

V dnešním článku o Metapostu probereme především soubory. Budou to zdrojové texty programů, ale také možnosti čtení dat z disku a ukládání na disk. Přidáme nejjednodušší datový typ boolean a rovněž nekomplikovaný typ pen. Popíšeme si také systémovou proměnnou prologues.

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(ob­sah) 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:

Hodnoty

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:

Hodnoty 2

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(o­brazec); 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.

Našli jste v článku chybu?

22. 2. 2007 17:14

uživatel si přál zůstat v anonymitě
Myslim, ze metapost (alespon v distribucich vzniklych z web2c - tetex, TeXLive) prohledava adresare v zavislosti na nastaveni promenne MPINPUTS v souboru texmp.cnf. To snad na systemu (resp. promene PATH) nezalezi (nebo se pletu?). (Co delaji ciste mswin distribuce nastesti nemusim sledovat :)

21. 2. 2007 22:37

Obávám se, že procházení adresářů (které a v jakém pořadí) je závislé na proměnné path. Ta je u různých operačních systémů nastavena po instalaci dost různě. Smiřte se laskavě s tím, že dnes si ji většina uživatelů neumí nastavit ani u windowsů, o unix-like systémech ani nemluvě. Uživatel by měl dle mého soudu dokázat vznést požadavek na admina systému, aby mu adresáře s určitým obsahem zpřístupnil a pokud bude mít i představu, že chce, aby je systém procházel v určitém pořadí (a nebude to napro…
Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

DigiZone.cz: Test Philips 24PFS5231 s Bluetooth repro

Test Philips 24PFS5231 s Bluetooth repro

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Vitalia.cz: I církev dnes vyrábí potraviny

I církev dnes vyrábí potraviny

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Vitalia.cz: Když přijdete o oko, přijdete na rok o řidičák

Když přijdete o oko, přijdete na rok o řidičák

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA