Hlavní navigace

Metapost aneb grafika v postscriptu

9. 2. 2007
Doba čtení: 8 minut

Sdílet

Metapost představuje program umožňující definovat vektorovou grafiku, která je posléze zobrazena buď jako postscriptový nebo pdf soubor. Vstupem do něj je textový soubor pořízený v jakémkoli editoru umožňujícím uložit "holý" text. K vytváření této grafiky tedy nepotřebujeme žádná interface s výjimkou klávesnice.

Metapost představuje základ, na němž stojí mimo jiné i ConTeXt, o němž se rozbíhá seriál zde na Rootu.

Zároveň s typografickým systémem TeX vytvořil jeho autor D. Knuth také program na vytváření sad písem, metafont. Tento program mimo jiné umožňoval nadefinovat jako znaky části černobílých obrázků, a ty pak pospojovat do konstrukce, s níž TeX pracuje jako s textem o pevné délce řádků, ale která se čtenáři jeví jako obrázek. Byly dokonce vytvořeny i programy umožňující do tohoto formátu konvertovat černé a bílé bitmapy.

Obrázky pořízené metafontem byly omezeny kromě maximální velikosti jednoho „písmene“ také možností použít pouze dvě barvy (TeX v zásadě umožňuje převést barvu podkladu a barvu kresby i na jiné barvy než černou a bílou) a nemožností do obrázků importovat písmena z TeXových fontů. Metapost, jehož autorem je John D. Hobby z Bell Laboratories, uvedené problémy překonává. Dalším rozdílem mezi oběma systémy je výstup, protože výstupem z metafontu je bitmapa – sada bitmap, odpovídající rozměry velikosti požadovaného písma a kvalitě tiskárny (počtu DPI při tisku), zatímco výstupem z metapostu je postscriptový obrázek.

Přesnost metapostu je v podstatě omezena pouze výstupním zařízením.

Získání metapostu.

Metapost je v současné době distribuován spolu s typografickým systémem TeX či LaTeX, pod srovnatelnou licencí. Pro platformu Windows je nejlepší možností získat tento programový balík jako CD „TeX live“, které je k sehnání např. ve specializovaných knihkupectvích na vysokých školách vyučujících informatiku; lze je i objednat od české společnosti uživatelů TeXu (CSTUG), která má stránky na internetu.

Na Windows můžeme program mpost.exe z rozbaleného LaTeXu překopírovat do nějakého pracovního adresáře a zde vytvářet zdrojové texty a spouštět nad nimi metapost. Absence speciálního rozhraní se v některých verzích Windows může projevit tím, že upravované soubory uložené v textovém editoru nebudou fyzicky na disku, ale někde v paměťovém bufferu operačního systému, takže mpost.exe bude opakovaně načítat verze před úpravami. Fyzické uložení opravené verze lze vynutit buď uložením pod jiným názvem, nebo ukončením činnosti editoru. Asi nejpravděpodobnější příčinou tohoto problému je jiné pojetí zamykání souborů ve Windows a v OS unixového typu.

Na platformě linux je metapost spolu s TeXem součástí programového balíku tetex; pro nejdůležitější linuxové distribuce bývá už předkompilovaný, pro další je k dispozici možnost instalace ze zdrojových kódů.

Porovnání s dalšími zobrazovacími systémy

Porovnání se systémy typu CAD

Problematiku těchto systémů lze rozdělit na dvě části: Samotný nástroj (obsahující uživatelské interface a výpočetní rutiny) a knihovny různých prvků.

Metapost neobsahuje žádné uživatelské prostředí, to si „vytvoříme“ použitím vhodného textového editoru a vhodného prohlížeče výsledných postskriptových obrázků.

Na druhé straně výpočetní rutiny metapostu jsou kvalitnější a zatížené menším stupněm nepřesnosti než rutiny u většiny komerčních CADů.

Metapost jako takový neobsahuje žádné knihovny struktur objektů apod. (co si nenapíšeme, to nemáme), byť se některé programy tohoto typu dají najít na internetu.

Takže pro rýsování zcela konvenčních technických a stavebních plánů je CAD výrazně lepší volbou než metapost, jeho použití by bylo odůvodněné především v případě, kdy jednorázově pořebujeme něco narýsovat a nehodláme za tímto účelem kupovat CAD, ani to dělat ručně.

Pokud děláme cokoli méně obvyklého, na co neexistují v komerčních programech knihovny objektů, nebo cokoli, co vyžaduje velmi vysokou míru přesnosti (jaká je na komerčních programech nedostupná), představuje metapost přesně to, co nám může pomoci.

Další nevýhodou programů typu CAD je nutnost používat velice citlivé, přesné (a tudíž i drahé) periferie k PC, zatímco při práci s metapostem vystačíme se standardní klávesnicí.

Porovnání s tabulkovými procesory typu office

Metapost umožňuje s vysokou přesností kreslit grafy a pod touto výstupovou úrovní provádět i řadu relativně složitých výpočtů. Při konstrukci grafů jsme v podstatě omezeni pouze svou fantazií (a tím, aby výsledek byl srozumitelný pro příjemce/čtenáře). V některých případech je žádoucí do metapostu přenést výsledky z nějakého statistického programu s textovým výstupem. Velmi dobrými prostředníky takovýchto přesunů dat jsou jazyky Perl nebo Python.

Někdy ovšem může metapost zvládnout nejen konečné grafické zobrazení, ale i výpočet, jeho omezení v této věci budou probrána u datového typu numeric.

Výstupem metapostu mohou být jak černobílé grafy složené z různě šrafovaných ploch, tak grafy barevné. Program na jejich vykreslení lze poměrně snadno upravit tak, že základ zůstane identický a načtou se jen moduly pro barevné – šedé – šrafované zobrazení.

U tabulkových procesorů je problém v tom, že jsou schopny pracovat pouze s předpřipravenými vzory grafů, které lze jen minimálně modifikovat. Další otázkou je, zda se k jakžtakž přijatelnému vzoru dokážeme proklikat přes haldy balastu, kterými jsou tyto programy zatíženy. Zvláště vzorníky černobíle provedených grafů bývají velmi chudé. Tato omezenost v některých případech podvědomě nebo i vědomě omezuje uživatele ve smyslu „nemůžeme výsledky zobrazit tak a tak, protože náš drahý tabulkový procesor takovéto zobrazení nezvládá“. Opakovaně jsem se setkal se situací, kdy zajímavost a jedinečnost výsledků v disertační nebo i diplomové práci byla konvenčním zobrazením potlačena.

Tvorba a zpracování programů v metapostu

V jakémkoli textovém editoru napíšeme zdrojový text. Syntax highlighting pro metapost mají editory vim a Emacs, oba jsou k dispozici jak pro Windows, tak pro Linux. (Přiznám se, že sám pracuji v editoru joe, pro který jsem si syntaxhighlig­htingovou definici „zbastlil” sám. Doporučuji ho všem, kdo si ještě pamatují wordstarové klávesové zkratky, případně mají zažitý s TeXem distribuovaný vynikající CSED.)

Tento text převedeme programem mpost na postskriptový obrázek – můžeme ho prohlédnout v programech schopných načíst postskriptové obrázky, s jedinou výhradou: nezobrazí se korektně textové řetězce s diakritickými znaky (proberu podrobně u datového typu string); na platformě Linux mám vyzkoušeno jako spolehlivě fungující načtení do tří programů – Image Magick, Xpaint a GIMP. Na platformě Windows je dostupný pouze poslední z nich. Použití GIMPu jako prohlížeče dílčích výsledků je ovšem „s kanonem na vrabce“, avšak méně náročný prostředek na platformě Windows chybí. Lze ovšem nainstalovat na Windows ty části Image Magicku, které nic nevykreslují na obrazovku, a konvertovat jimi obrázky např. na png, zobrazitelný v řadě prohlížečů.

Postskriptový obrázek je především určen ke zpracování v TeXu nebo LaTeXu, do zdrojového textu určeného pro tyto programy vložíme název souboru a výsledek převedeme na soubor typu dvi, a ten na soubor typu .ps nebo .pdf. Druhý z nich lze bezproblémově prohlížet a tisknout prakticky na všech platformách Acrobat Readerem (Adobe Readerem), na unix-like platformách použijeme také ghostview (existuje i verze pro Windows). I soubory .ps a .pdf načte nebo překonvertuje Image Magick na obrázky, v tom případě už problémy s fonty nejsou.

Případné opravy provedeme ve zdrojovém textu a celý cyklus zopakujeme.

Minimální soubory

Na ukázku si předvedeme minimální soubory, které potřebujeme pro práci:

  • minimalni.mp – minimální soubor pro metapost (nakreslí trojúhelník)
              % toto je minimální zdrojový soubor
prologues:=1; % tento příkaz zajistí, že se vyprodukuje obrázek
beginfig(1);  % tento příkaz definuje jméno výstupu na:
              %     první_část_názvu_zdrojového_souboru.1
              %     zde tedy minimalni.1
draw (0,0)--(0,5cm)--(5cm,5cm)--(0,0); % toto je vlastní kreslení
%                                        podrobněji u typu path
endfig;
end; 
  • Minimalni.tex – minimální soubor pro LaTeX
\documentclass[11pt]{article}
\usepackage[latin2]{inputenc}
\usepackage{czech}           % tento a předchozí řádek jsou zbytečné,
                             % pokud k obrázku nedáváme popis nebo
                             % nekombinujeme s textem
\usepackage{a4wide}          % definice kreslící plochy
\usepackage{graphicx}        % umožní TeXu pracovat s grafikou
\pagestyle{empty}            % tento příkaz zajistí, že na stránce s
                             % obrázkem nebude číslo strany
\begin{document}
\input epsf                  % tento příkaz zajistí, že si soubor
                             % "bude umět" do sebe vložit obrázek
                             % stačí jednou na začátku a je možno
                             % vložit libovolné množství obrázků
                 % z metapostu
$$\epsfbox{minimalni.1}$$    % toto je samotné vložení obrázku
\end{document}               % minimalni.1 

Z obsahu souborů je patrné, že komentáře se uvozují značkou procento %. Co je za touto značkou až do konce řádku, to je překladači \metapostu i TeXu /LaTeXu ignorováno. Tento znak užíváme i k zakomentovávání řádků při odlaďovaní a úpravách zdrojových textů.

Minimální soubory převedeme do viditelné podoby následnou sérií příkazů:

  • mpost minimalni.mp provede vygenerování souboru minimalni.1 Sou­časně se vygeneruje soubor minimalni.log, do něhož se uloží všechny výpisy na obrazovku a případná chybová hlášení (i taková, která nejsou na obrazovku vypsána).
  • cslatex Minimalni.tex vygeneruje soubor Minimalni.dvi. I zde se vypisuje logovací soubor, z toho důvodu je vhodné metapostový i TeXový soubor mít pojmenovány různě. Na platformách unix-like (včetně Linuxu) stačí záměna velké/malé písmeno, na OS nerozlišujících velká a malá písmena v názvech souborů (např. DOS nebo různé verze Windows) je nutno provést zásadnější změnu názvu jednoho ze souborů.
  • dvipdf Minimalni.dvi vygeneruje soubor Minimalni.pdf
  • Případně dvips minimalni.dvi -o minimalni.ps vygeneruje soubor Minimalni.ps

Datové typy a grafické prvky v metapostu

Metapostem je možné kreslit jednotlivé prvky:

root_podpora

  • body, svázané s datovým typem pair.
  • čáry, rovné, lomené i různě zakřivené, které se nazývají cesty a jsou spojeny s datovým typem path Zvláštním případem cest jsou kružnice a elipsy, protože mají jeden řídící bod (střed) ležící mimo ně. Cesty mohou být vykreslovány různými typy čar a opatřeny šipkami. Zvláštním případem cest jsou uzavřené křivky, případně několik protínajících se a spojených křivek, protože mohou ohraničit plochu, kterou je možné mj. vybarvit.
  • texty jsou vytvářeny pomocí datového typu string
  • předchozí grafické prvky je možné sdružovat do obrázků (datový typ picture)
  • cesty a obrázky je možné podrobovat transformacím (datový typ transform)
  • další skupinou prvků metapostu jsou pera (datový typ pen), kterými kreslíme.
  • z toho, co se ještě objeví na obrázku, zbývají barvy (datový typ color)
  • na pozadí tvorby obrázků pracuje datový typ numeric, umožňující práci s číselnými hodnotami
  • a datový typ boolean, umožňující pracovat s logickými hodnotami (pravda – nepravda)
  • na samý závěr zmiňuji těžko zařaditelnou proměnnou prologues, ovlivňující, zda se výsledný obrázek vyobrazí jako nejmenší opsaný pravoúhlý rovnoběžník kolem vykreslených grafických prvků nebo jako normostrana

Co mě přivedlo k metapostu

Protože jsem vlastníkem sady horních končetin se specifikací „obě levé“, nejsem schopen žádným interface (ani tužkou po papíře) nakreslit rovnou čáru, o složitějších obrazcích nemluvě. Z tohoto důvodu jsem opakovaně studoval a z různých důvodů zavrhoval systémy, které by umožnily vykreslit na obrazovku (a do obrázkového souboru) použitelné geometrické útvary a písmenka. Postupně jsem vyzkoušel různé druhy graficky orientovaných BASICů, javu i python (Tkinter), až jsem se dostal k metapostu, který se nejvíc blíží mé ideální představě.

Příští část

Moc toho ještě nenakreslíme, zato se seznámíme s typy boolean, numeric a pen a ukážeme si, jak metapost pracuje se soubory a jaké typy souborů vlastně využívá.

Byl pro vás článek přínosný?