}w!"#$%&'()+,-./012345<ya MASARYKOVA UNIVERZITA FAKULTA INFORMATIKY Podpora kreslení obrázků v LATEXu BAKALÁŘSKÁ PRÁCE Jan Marek Brno, jaro 2009
Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Vedoucí práce: Mgr. Jan Holeček ii
Poděkování Děkuji Mgr. Janu Holečkovi za cenné rady a za trpělivost, kterou se mnou měl. iii
Shrnutí Práce se zabývá kreslením obrázků ve zdrojovém kódu TEXového dokumentu. Zpracovává přehled a popis několika nejznámějších a nejpoužívanějších nástrojů a porovnává jejich funkce. Následuje srovnání těchto nástrojů a je z nich vybrán jeden, pro který je popsána implementace nové funkce. iv
Klíčová slova TEX, L A TEX, picture, PSTricks, PGF, TikZ, PDF, kreslení ve zdrojovém kódu v
Obsah 1 Úvod....................................... 2 2 Srovnání vkládání a kreslení obrázků.................... 4 3 Přehled některých vybraných kreslících nástrojů............. 6 3.1 picture................................... 6 3.2 PSTricks.................................. 9 3.3 PGF and TikZ............................... 13 4 Srovnání kreslících nástrojů......................... 18 5 Implemetace................................... 20 6 Závěr....................................... 22 7 Použitá literatura................................ 24 A Zdrojový soubor................................ 26 1
Kapitola 1 Úvod V dnešní době se stále častěji můžeme setkat s prezentacemi či dokumentací ve formátu Adobe PDF. Tento formát je velice populární zvláště díky své přenositelnosti. Toho jsou si vědomi například i vývojáři kancelářských balíků, kteří možnost exportu dokumentu do formátu PDF bud to implementují přímo (Open- Office.org) nebo alespoň pomocí doplňků (MS Office 2007). Kromě kancelářských balíků lze použít některý z široké škály online či offline konvertorů. Podpora vstupních (a výstupních) formátů bývá mnohdy obdivuhodná. Na druhou stranu výsledný dokument nemusí vypadat podle našich představ a dodatečné úpravy jsou mnohdy náročnější než vytvoření nového dokumentu. Rozhodneme-li se vytvořit nový dokument, který chceme uložit ve formátu PDF, můžeme si vybrat z široké škály formátů podle toho, který nejlépe vyhovuje nám a našim potřebám. Chceme-li navíc vytvářet více verzí dokumentu z jednoho zdroje nebo psát matematické vzorce, nejlepší volbou byl, je a zřejmě ještě dlouho bude TEX a jeho nadstavby, např. L A TEX. Dokument obvykle neobsahuje pouze text, ale i různé grafy, schémata, nákresy či jiné obrázky. Bohužel neexistuje žádný standard grafiky u L A TEXových dokumentů. Obrázky do dokumentů je možné vkládat v různých formátech. Obecně lze obrázky v dokumentech rozdělit do dvou kategorií. První z nich je vkládání bitmapové grafiky, kdy dokumenty překládáme pomocí pdflatexu do formátu PDF. Může se jednat o obrázky ve formátu JPEG, GIF, PNG, PDF či o obrázky v METAFONTu. Bitmapové obrázky nejsou obecně příliš vhodné, protože při změně rozlišení či otočení přímo v L A TEXu se výrazně zhoršuje jejich kvalita. Proto je vhodnější pro úpravy bitmapových obrázků použít externí grafické editory a do L A TEXového dokumentu vložit již upravený obrázek. Při překladu je pak třeba použít pdftex a překládat dokument přímo do formátu PDF. Pokud bychom chtěli do dokumentu vložit i nějaký obrázek, který máme ve vektorovém formátu, museli bychom jej nejprve převést do bitmapového formátu. Převodem se ovšem zhorší kvalita obrázku, proto je nutné zvážit, zda se nám to vyplatí, nebo bude výhodnější převést bitmapové obrázky na vektorové. 2
1. ÚVOD Další možností by bylo použití METAFONTu či METAPOSTu, u kterých nezáleží na tom, zda se na překlad použije latex či pdflatex. Druhou možností je vkládat vektorové obrázky ve formátech EPS, PS nebo METAPOST a překládat latexem do formátu DVI či PS. Vektorová grafika má tu výhodu, že při manipulaci s obrázky v L A TEXovém dokumentu nedochází ke snížení kvality obrázku. Další výhodou plynoucí z toho, že je dokument překládán latexem, může pro někoho být to, že se dokument nepřekládá přímo do formátu PDF. Ovšem na druhou stranu se v dnešní setkáváme téměř výhradně s dokumenty ve formátu PDF, pro který existují desítky nejrůznějších prohlížečů. Tím, že je při překladu používán latex, musíme dokument přeložený do formátu DVI či PS ještě převést do PDF. Další nevýhodou může pro mnohé být to, že vytvoření obrázku ve vektorovém formátu je složitější než v případě bitmapových obrázků. Výše uvedené způsoby vkládání obrázků do dokumentu mají společné to, že obrázky jsou uloženy v externích souborech. Ovšem obrázky je také možné kreslit přímo do zdrojového kódu dokumentu. Tímto způsobem sice nemůžeme do dokumentu umístit např. fotografie, ale je možné nakreslit různé grafy, schémata, náčrty či jednoduché obrázky. Jaké jsou výhody a nevýhody tohoto kreslení ve srovnání s vkládáním at už bitmapových či vektorových obrázků se věnuji ve druhé kapitole. Pokud nás neodradí nevýhody a rozhodneme se kreslit obrázky přímo do zdrojového kódu, zjistíme, že existuje více nástrojů. Proto je třetí kapitola práce věnována stručnému přehledu a popisu tří vybraných základních a nejpoužívanějších nástrojů, které umožňují kreslit obrázky ve zdrojovém kódu. Ke každému nástroji je uveden základní popis a přehled alespoň základních funkcí. Ve čtvrté kapitole jsou pak porovnávány výhody a nevýhody jednotlivých nástrojů. Do nástroje, u něhož převažují pozitiva, budou implementovány některé nové funkce. Této implementaci se podrobněji věnuji v páté kapitole. V závěru práce jsou shrnuty výsledky implementace funkcí do zvoleného nástroje. Je také nastíněn další možný vývoj. 3
Kapitola 2 Srovnání vkládání a kreslení obrázků Pokud porovnáme možné způsoby použití grafiky podle toho, jakým způsobem jsou obrázky do dokumentu umístěny, můžeme je rozdělit do dvou hlavních skupin. První skupinu tvoří obrázky v externích souborech bez ohledu na to, jedná-li se o vektorovou nebo bitmapovou grafiku. Druhá skupina je tvořena obrázky, které jsou kresleny přímo ve zdrojovém kódu dokumentu. Obě tyto skupiny mají své výhody i nevýhody, které mohou být značně individuální vzhledem k tomu, co od obrázků v dokumentu očekáváme. Obrázky v externích souborech je možné velice snadno procházet, prohlížet, editovat či zaměňovat bez nutnosti jakékoli manipulace se zdrojovým textem dokumentu. Navíc je možné použít libovolný obrázek například fotky či mapy. Pokud je součástí obrázku nějaký text, může se stát, že bude napsán jiným stylem, což může působit rušivě. Další problémy mohou nastat u obrázků nepravidelných tvarů, kdy požadujeme, aby se text zalamoval až u okraje obrázku. Musíme mít ovšem na paměti také to, že je třeba mít sjednocené formáty všech obrázků, protože není možné mít v dokumentu několik bitmapových a několik vektorových obrázků. Za nevýhodou lze považovat i to, že je nutné uchovávat více souborů a při velkém množství vložených obrázků je zapotřebí udržovat určitý systém. Může se totiž stát, že při přenášení či kopírování dokumentu na nějaký obrázek zapomeneme. Ovšem je také možné, že při změnách ve zdrojovém kódu některé obrázky v dokumentu nepoužijeme, ale budeme je stále uchovávat spolu s dokumentem. V horším případě si můžeme omylem smazat úplně jiný obrázek. V případě např. METAFONTu je sice možné mít všechny obrázky v jediném souboru, ale i tak je nutné mít jednotlivé obrázky nějak organizované, například okomentované. Při kreslení obrázků přímo ve zdrojovém kódu odpadá problém s množstvím souborů a zvláště při větším množství obrázků neztrácíme o jednotlivých obrázcích přehled. S obrázky se také v textu daleko lépe manipuluje a velikost výstupního souboru je o poznání menší, než při vkládání externích obrázků. Pro kreslení obrázků je ale nutné se naučit nové příkazy, které jsou víceméně podobné 4
2. SROVNÁNÍ VKLÁDÁNÍ A KRESLENÍ OBRÁZKŮ těm TEXovým. Při kreslení přímo do zdrojového kódu dokumentu ovšem nevidíme obrázek neustále před sebou, takže chceme-li vidět, co jsme zatím nakreslili, musíme přeložit zdrojový kód. Další problém nastává v případě, kdy chceme dokument uložit i v jiném, exotičtějším formátu. Kreslení do zdrojového kódu a vkládání obrázků je možné v rámci možností také kombinovat. Tím odpadá problém se složitými obrázky, které by nebylo možné nijak namalovat. Navíc v případě různých technických skript či studijních materiálů, kde nejsou potřeba fotky či mapky, ale stačí jednoduché nákresy, je kreslení obrázků do zdrojového kódu ideální. 5
Kapitola 3 Přehled některých vybraných kreslících nástrojů Pokud se rozhodneme, že budeme kreslit obrázky přímo ve zdrojovém kódu dokumentu, máme na výběr z několika různých nástrojů. Ne všechny ale mohou splňovat naše požadavky. Jak vybrat ten správný? Jedním z cílů této práce je zpracovat přehled těchto nástrojů, jejich principy a stav implementace. Do přehledu byly vybrány 3 nejznámější, nejvýznamnější a nejvíce používané volně dostupné nástroje, se kterými je možné se běžně setkat. Mimo těchto nástrojů existují i další (například mfpic, xypic či emp), ale jejich rozšíření či význam je ve srovnání se zde uvedenými nástroji zanedbatelné. Informace o jednotlivých nástrojích byly převážně čerpány z jejich oficiálních dokumentací, volně dostupných popisů a vlastních zkušeností. 3.1 picture Jeden z prvních nástrojů umožňující kreslení ve zdrojovém kódu L A TEXového dokumentu. Nejedná se o plnohodnotný kreslící nástroj, ale o prostředí, které je součástí L A TEX 2ɛ. Pomocí picture lze nakreslit jednoduché bitmapové obrázky skládající se z čar, šipek, kružnic a textu. V pozdějších verzích přibyla i možnost kreslit Bézierovy křivky. S použitím balíku color lze oživit obrázek barvami. Definované barvy jsou jen černá, bílá, červená, zelená, modrá, žlutá, azurová a purpurová, ale pomocí příkazu \definecolor lze dodefinovat i vlastní barvy v režimech RGB, stupně šedi či CMYK. Komu by ani to nestačilo, může sáhnout po některém z dalších rozšíření pro toto prostředí. Je však třeba dávat pozor, protože rozšíření založená na postskriptu jsou pdftexem ignorována, takže by nebylo možné použít přímý překlad do formátu PDF. Prostředí picture začíná vždy příkazem \begin{picture}(šířka,výška) (x,y), kde (šířka,výška) udává rozměry obrázku a (x,y) znamená posun 6
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ obrázku a končí příkazem \end{picture}. Posun není povinný a v případě, že jej vynecháme, použije se výchozí nastavení, tj. (0,0). Rozměry nemusí být jen přirozená čísla, lze tedy zadat například -6.12,.5 či 9.1373. Výchozí jednotkou uloženou v \unitlength je 1pt. Tuto jednotku lze kdykoli změnit pomocí příkazu kod\setlength. Kromě bodů (pt) lze použít ještě milimetry (mm), centimetry (cm), palce (in), em a ex. Všechna čísla včetně nuly musí mít uvedenou jednotku. Jednotky však není vhodné měnit přímo uvnitř obrázku, protože se tím mohou ovlivnit ostatní nastavení a výsledný obrázek bude různě deformovaný. Čáry jsou standardně vykreslovány \thinlines, což je 0.4pt. Vykreslování tlustších čar lze dosáhnout bud to použitím \thicklines nebo nadefinováním si vlastní tloušt ku čáry příkazem \linethickness{velikost}. Pro vykreslování objektů slouží příkaz \put(x,y){objekt}, kde (x,y) jsou souřadnice umist ovaného objektu. Chceme-li nějaký objekt vložit vícekrát, lze použít příkaz \multiput(x,y)(dx,dy){počet}{objekt}, kde (dx,dy) je posun. Výjimku tvoří \qbezier, který se vkládá přímo. Vykreslování je realizováno pomocí bitmapového fontu. Proto jsou některé rozměry nahrazovány nejbližšími existujícími či dokonce (v případě malých rozměrů) zanedbávány, proto je například možné do prvního kvadrantu nakreslit jen 25 úseček se středem v bodě (0,0). Pro kreslení jednoduchých obrázků to však plně dostačuje. Dalším omezením je množství možných objektů. Dostupné objekty jsou: \circle[*]{průměr} \line(sx,sy){délka} \vector(sx,sy){délka} vykreslí kružnici o zadaném průměru; hvězdičková forma vykreslí kruh vykreslí úsečku; (sx,sy) je její směrový vektor, sx a sy musí být nesoudělná čísla z intervalu 6, 6 obdoba \line, vykreslí šipku; sx a sy musí být z intervalu 4, 4 \oval(šířka,výška)[část] vykreslí ovál o zadaných rozměrech; lze vykreslit i polovinu a čtvrtinu určením části (l = levá, r = pravá, t = horní, b = dolní a jejich kombinace) 7
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ \frame{objekt} \qbezier[#](x 1, y 1 )(x r, y r )(x 2, y 2 ) orámuje zadaný objekt bez mezery mezi orámováním a obsahem vykreslí Bézierovu křivku jako množinu bodů; (x 1, y 1 ) je počáteční bod, (x 2, y 2 ) koncový bod a (x r, y r ) referenční bod; [#] určuje, kolika body bude křivka vykreslena Kromě těchto objektů je možné do obrázků vkládat také text. Existuje více možností, jak toho docílit. Asi nejjednodušším způsobem, který ale neakceptuje české znaky, je \put(x,y){text}. Další možností je použít některý z boxů. V boxech lze již bez problémů používat české znaky a navíc mají tu výhodu, že text či jiný objekt v nich lze i zarovnat. Přehled boxů dostupných v prostředí picture: \makebox(šířka,výška)[zarovnání]{objekt} vytvoří box o zadaných rozměrech; možná zarovnání jsou l = vlevo nebo r = vpravo a t = nahoru nebo b = dolů; výchozí zarovnání je na střed \framebox(šířka,výška)[zarovnání]{objekt} orámovaný box, obdoba příkazu makebox \dashbox{čárky}(šířka,výška)[zarovnání]{objekt} čárkovaně orámovaný makebox; pomocí {čárky} lze nastavit délku čárek. Příkaz \shortstack[zarovnání]{vkládaný\\text} slouží k zarovnání kratších řádků do sloupce. Výchozí zarovnání je na střed (c), lze nastavit vlevo (l) nebo vpravo (r). Jedná se tedy o jakousi obdobu boxu. Tímto jsem shrnul všechny základní funkce prostředí picure. Pro lepší představu o tom, jak vypadá kreslení v tomto prostředí, následuje ukázka zdrojového kódu a výsledného obrázku. \setlength{\unitlength}{1cm} \begin{picture}(5,4) \put(2,1.5){\circle{.2}} \put(2,1.5){\circle{.6}} \put(2,1.5){\circle{1}} \put(2,1.5){\circle{1.4}} \put(0,0){\line(0,1){3}} 8
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ \put(0,0){\line(1,0){4}} \put(0,3){\line(4,-3){4}} \qbezier(1.5,2.5)(4.5,4)(3,1) \qbezier(2,3.5)(2,1.5)(4,1.5) \end{picture} 3.2 PSTricks Dalším velice populárním a dnes stále hojně rozšířeným nástrojem je PSTricks (PostScript Tricks). Jedná se o balík převážně postscriptových maker. Na rozdíl od picture se jedná již plnohodnotný kreslící nástroj, se kterým lze nakreslit téměř cokoli. Je součástí několika distribucí, např. TEXLive, tetex a MiKTEX. Značným omezením je, že pro vykreslování využívá postskript a jeho příkazy, konkrétně příkaz \special. Z toho plyne nutnost překladu do formátu PS. Pokud se ale nechceme vzdát přímého překladu do formátu PDF, je možné toto omezení obejít použitím některých dalších balíků, například pst-pdf nebo PDFTricks, které ovšem nezaručují ve všech případech, že překlad bude úspěšný. Nástroj PSTricks se skládá z několika desítek ucelených balíků. Každý z balíků rozšiřuje možnosti kreslení o další prvky. Pokud pro kreslení nějaké skupiny objektů balík neexistuje, je možné pomocí postscriptových příkazů dopsat požadované funkce. Všechny balíky, které použijeme, je nutné zavést pomocí příkazu \usepackage{balík}. Při používání balíků je třeba zavést nejdříve balíky pstricks, pst-plot, pst-node a pst-tree a poté teprve až další balíky. Následující přehled několika vybraných balíků je pouze nepatrnou částí, na domovské stránce http://tug.org/pstricks/ lze nalézt rozsáhlejší přehled a informace o jednotlivých balících: 9
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ pst-node pst-fill pst-coil pst-grad pst-abspos pst-func pst-tree pst-text pst-3d balík pro práci s uzly balík umožňující výplně balík pro vykreslování spirál balík umožňující barevné přechody balík umožňující používání absolutních souřadnic vykreslování speciálních matematických funkcí balík pro stromy balík pro práci s textem balík pro základní 3D operace Kreslit je možné bud to přímo do textu (převážně jednoduché tvary) nebo do prostředí \begin{pspicture}. Při použití prostředí je nutné nastavit velikost obrázku. Dále je možné nastavit účaří. PSTricks používá jako výchozí jednotku 1cm. Pro změnu výchozích parametrů slouží příkaz \psset. Základní objekty, které lze kreslit pomocí PSTricks, jsou čáry, polygony, kruhy, elipsy, výseče, křivky, různé tečky a mřížky. Výchozí tloušt ka čáry (linewidth) je nastavena na.8pt a výchozí barvou je černá. Další definované barvy jsou bílá, červená, zelená, modrá, žlutá, azurová, purpurová a 3 odstíny šedé. Ostatní barvy je možné dodefinovat pomocí \definecolor{označení}{režim}{složky}, kde {označení} je pojmenování definované barvy, {režim} je použitý barevný režim (např. RGB, CMYK,... ) a {složky} je zastoupení jednotlivých složek barevného režimu. Hodnoty každé barvy musí být z intervalu 0, 1. Oproti picture již existuje více způsobů, jak vykreslit nějaký objekt. Následující výčet se týká několika základních objektů, které má nástroj PSTricks společné s picture. Hvězdičková forma slouží pro vykreslení plných objektů. Jako parametry lze zadat například tloušt ku, barvu či styl čáry, otočení, měřítko nebo barvu výplně. \psline[parametry]{šipka}(x0,y0)(x1,y1)...(xn,yn) nakreslí čáru z bodu (x0,y0) do (xn,yn) přes (x1,y1), (x2,y2),... ; {šipka} určuje, má-li se vykreslit jenom čára (výchozí nastavení) nebo šipka \qline(x0,y0)(x1,y1) obdoba \psline, vykreslí čáru z bodu (x0,y0) do bodu (x1,y1); nemá žádná další možná nastavení \pscircle[parametry](x0,y0){poloměr} vykreslí kruh o určeném poloměru se středem v (x0,y0) 10
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ \qdisk(x0,y0){poloměr} obdoba \pscircle* bez nastavitelných parametrů \pswedge[parametry](x0,y0){poloměr}{α}{β} vykreslí kruhovou výseč od {α} do {β}; úhly jsou ve stupních \psellipse[parametry](x0,y0)(x1,y1) vykreslí elipsu se středem v (x0,y0) a šířkou a výškou určenou (x1,y1) \psarc[parametry]{šipka}(x,y){poloměr}{α}{β} vykreslí oblouk jako část kruhu se středem v (x,y) \psarcn[parametry]{šipka}(x,y){poloměr}{α}{β} obdoba \psarc, vykreslí oblouk v protisměru hodinových ručiček \psellipticarc[parametry]{šipka}(x0,y0)(x1,y1){α}{β} obdoba \psarc, vykreslí část elipsy \psellipticarcn[parametry]{šipka}(x0,y0)(x1,y1){α}{β} obdoba \psarcn a \psellipticarc, vykreslí část elipsy v protisměru hodinových ručiček \psbezier[parametry]{šipka}(x0,y0)(x1,y1)(x2,y2)(x3,y3) nakreslí Bézierovu křivku z bodu (x0,y0) do bodu (x3,y3); prostřední 2 body určují prohnutí Kromě těchto příkazů jsou definovány například čtyřúhelník (\psframe), parabola (\psparabola), různé křivky (\pscurve, \psecurve či \psccurve), polygon (\pspolygon), trojúhelník (\pstriangle), mřížky (\psgrid) a další. Pro vykreslení objektu většinou není nutné zadávat všechny informace. Parametry, šipky a počáteční souřadnice (x0,y0) nejsou povinné a v případě, že nejsou zadány, použije se výchozí nastavení. Výjimku tvoří příkazy začínající písmenem q, které nemají volitelná nastavení, a je nutné zadat všechny údaje. Objekty lze vykreslovat plnou čarou, tečkovaně i čárkovaně či dvojitě. Pomocí parametru dimen je možné nastavit, zda má být objekt vykreslen na střed, vně či uvnitř zadaných souřadnic. Šipky je možné zvolit z nabídky téměř dvou desítek předem definovaných, které je navíc možno mezi sebou libovolně kombinovat. Pokud by ani to někomu nestačilo, může si nadefinovat vlastní vzhled šipky nebo upravit parametry stávající. 11
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ Samozřejmostí je také vícenásobné vykreslování objektů pomocí \multiput, \multips či \multido, otáčení objektů pomocí \rput či parametrem gangle nebo vkládání textu takřka kamkoli pomocí nejrůznějších boxů. Oproti picture již nemusí být objekty vybarveny pouze jednou barvou, ale lze vytvářet například barevné přechody. Také již je možné měnit tloušt ky čar na libovolných místech v obrázku nebo používat polární soustavu souřadnic. Bézierovy křivky jsou definovány oproti picture poněkud odlišně. Pomocí PSTricks je možné již vykreslovat nejrůznější grafy, diagramy, stromy, mozaiky, prostorové objekty a další. Uvedený výčet se týká pouze těch nejzákladnějších funkcí. PSTricks je velmi mocný nástroj, se kterým je možné nakreslit již téměř cokoli. Navíc k PSTricks vznikají stále nové balíky, at již oficiální či neoficiálních, které tento nástroj neustále rozvíjejí. Pro srovnání s picture je zde ukázka zdrojového kódu s výsledným obrázkem: \begin{pspicture}(5,4) \pscircle(2,1.5){.1} \pscircle(2,1.5){.3} \pscircle(2,1.5){.5} \pscircle(2,1.5){.7} \psline(0,0)(0,3)(4,0)(0,0) \pscurve(1.5,2.5)(3.4,2.9)(3,1) \pscurve(2,3.5)(2.5,2)(4,1.5) \end{pspicture} Soustředné kružnice je možné vykreslit i pomocí příkazu \multido. Tento příkaz vyžaduje zavedení souboru multido.sty nebo multido.sty. PSTricks má pro vykreslování čar ještě příkaz \qline, který vykresluje úsečky. Pokud zaměníme zmíněné příkazy, obrázek se nijak nezmění, ale zdrojový kód obrázku vypadá následovně: 12
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ \begin{pspicture}(5,4) \multido{\n=0.1+0.2}{4}{% \pscircle(2,1.5){\n}} \qline(0,0)(0,3) \qline(0,3)(4,0) \qline(4,0)(0,0) \pscurve(1.5,2.5)(3.4,2.9)(3,1) \pscurve(2,3.5)(2.5,2)(4,1.5) \end{pspicture} 3.3 PGF and TikZ Nejmladší z trojice zde popisovaných nástrojů. Často bývá označován jako nástupce PSTricks. Zkratka PGF znamená Portable Graphics Format nebo také Pretty, Good, Functional. Je součástí distribucí TEXLive a MiKTEX. Pro vykreslování se v závislosti na použitém překladači upravují příkazy \special. Samotný nástroj se skládá z několika vrstev. Systémová vrstva má na starosti modifikaci příkazů \special tak, aby bylo možné nakreslené obrázky překládat nezávisle na zvoleném programu. Základní vrstva poskytuje příkazy, pomocí kterých je možné snadno vykreslovat složitější tvary. Čelní vrstva usnadňuje vykreslování příkazů základní vrstvy. Chceme-li kreslit pomocí PGF, je třeba nejprve zavést balík tikz. Obdobně jako PSTricks, je i nástroj PGF rozdělen do několika knihoven. Knihovny jsou zaměřeny na kreslení určitých celků. K dispozici je například knihovna pro kreslení stavových automatů, Petriho sítí, kalendářů, šipek, stínování či stromů. Pro zavedení knihovny slouží příkaz \usetikzlibrary{knihovna}. Kreslení je realizováno uživatelsky velice příjemnou vrstvou TikZ. Příkazy jsou kombinací příkazů METAFONTu a PSTricks. V PGF, na rozdíl od ostatních nástrojů, existuje více způsobů, jak lze zapisovat příkazy pro vykreslování objektů. Jednoduché obrázky lze kreslit přímo do textu. Před vykreslovaným objektem je zapotřebí uvést příkaz \tikz. Obrázky se vykreslují také do prostředí \begin{tikzpicture}. Oproti PSTricks, kde se u prostředí nastavují například parametry čar, je v PGF možné globálně nastavit téměř všechny parametry většiny objektů v obrázku. Většina základních objektů je vykreslována příkazem \path[draw]. Je však možné použít jen zkrácenou formu \draw. Oproti ostatním nástrojům je v PGF každý příkaz ukončen středníkem. Výchozí jednotkou je 1cm. Body lze zadávat několika různými způsoby. Následující tři příkazy jsou navzájem ekvivalentní: 13
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ \draw (1,0)--(0,1)--(1,2)--(2,1)--cycle; \draw (1,0)-- ++(-1,1)-- ++(-1,-1)-- ++(1,-1)--cycle; \draw (1,0)-- +(-1,1)-- +(-2,0)-- +(-1,-1)--cycle; \draw (1,0)--(-1,1)--(-2,0)--(-1,-1)--cycle; Tyto zápisy je navíc možné libovolně kombinovat, takže stejný objekt vykreslí i příkaz \draw (1,0)--(0,1)-- +(1,1)-- ++(2,0)--cycle;. Příkazy, které mají na konci cycle jsou ekvivalentní s příkazy, které jsou zakončeny výchozím bodem. Použití cycle zjednodušuje zápis a zpřehledňuje kód obrázku, protože je hned na první pohled patrné, že se jedná o nějaký spojitý útvar. Vykreslování základních objektů (čar, mřížek, čtverců a obdélníků, kruhů a elips, výsečí či Bézierových křivek) je možné pomocí příkazu \draw a jejich zápis je velice podobný. \draw (x0,y0) -- (x1,y1) --... -- (xn,yn); vykreslí čáru z bodu (x0,y0) do bodu (xn,yn) přes všechny zadané body; je-li místo posledního bodu zadáno cycle, spojí se poslední bod s prvním; \draw (x0,y0) grid (x1,y1); vykreslí mřížku z bodu (x0,y0) do bodu (xn,yn); \draw (x0,y0) rectangle (x1,y1); vykreslí pravoúhlý čtyřúhelník, jehož protilehlé vrcholy mají souřadnice (x0,y0) a (xn,yn); \draw (x0,y0) circle (poloměr); vykreslí kruh se středem v (x0,y0); \draw (x0,y0) ellipse (šířka and výška); vykreslí elipsu se středem v (x0,y0), kde šířka je délka hlavní poloosy a výška délka vedlejší poloosy; \draw (x0,y0) arc (α:β:poloměr); vykreslí část kružnice se středem v (x0,y0) a zadaným poloměrem od úhlu α po úhel β; \draw (x0,y0).. controls (ref1) and (ref2).. (x3,y3); vykreslí Bézierovu křivku z bodu (x0,y0) do bodu (x3,y3); bod (ref1) (případně i nepovinný (ref2)) určuje referenční bod; 14
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ Pomocí \draw lze vykreslovat stejné objekty vícekrát, kdy se postupně mohou měnit souřadnice objektu. V případě kružnice může sloužit jako obdoba multido v PSTricks. Například: \draw (0,0) circle (1) circle (2) circle (3); vykreslí tři soustředné kružnice o poloměrech 1, 2 a 3. V PSTricks by příkaz pomocí multido vypadal takto: \multido{\n=1+1}{3}{\pscircle(0,0){\n}} Tento způsob ale nefunguje u všech objektů. V PGF existuje příkaz \foreach, který zastává funkci multido. Výše uvedený příklad s kružnicí vypadá za pomoci foreach následovně: \foreach \x in {1,2,3} \draw (0,0) circle (\x); Také je možné jediným příkazem \draw nakreslit obrázek skládající se z různých základních objektů navazujících na sebe. Pokud chceme nakreslit Bézierovu křivku, obdélník a kružnici, můžeme místo: \draw (0,.5).. controls (.75,-.5) and (1.25,1).. (2,0); \draw (2,0) rectangle (3,.5); \draw (3,.5) circle (.3); napsat jen: \draw (0,.5).. controls (.75,-.5) and (1.25,1).. (2,0) rectangle (3,.5) circle (.3); Tento způsob je vhodný v situacích, kdy nepoužíváme prostředí, ale objekt kreslíme přímo do textu. Za \tikz může být pouze jeden příkaz. Pokud chceme do textu zapsat více příkazů za sebou a nepoužít prostředí, musíme všechny příkazy dát do složených závorek. Tento způsob není příliš prakticky, protože když budeme chtít mezi příkazy dopsat nějaký text, musíme znovu všechno uzávorkovat. Další možností je před každý příkaz napsat \tikz, což je zase zbytečné. Každý příkaz může mít za sebou v hranatých závorkách uvedené parametry, kterými mohou být například tloušt ka, styl či barva čáry, směr šipek, hustota mřížek, okraje, zaoblení hran, výplně, umístění, popisy či celé objekty. Například modrou čárkovanou čáru lze vykreslit pomocí \draw[dashed,blue] (x0,y0) -- (x1,y1);. Velmi důležitými prvky nástroje PGF, u kterých se používají parametry, jsou uzly. Uzly mají i tu výhodu, že je lze umist ovat pomocí kartézské soustavy souřadnic, polárních souřadnic, jejich pojmenovaní či rela- 15
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ tivně. Uzly samy o sobě se nevykreslují (pouze se vypíše případný text, který je napsán ve složených závorkách), ale právě pomocí parametrů jim lze nastavit tvar, barvu, velikost, atd. Uzly, stejně jako ostatní objekty, lze zapisovat více způsoby. Zde jsou uvedeny čtyři základní: \node at (x,y) [parametry] {}; \node (jméno) at (x,y) [parametry] {}; \node[parametry] (jméno) at (x,y) {}; \node[parametry] (jméno) [umístění] {}; Zajímavou a užitečnou vlastností PGF je možnost nastavování parametrů pro celou skupinu objektů a vytváření vlastních objektů. Slouží k tomu příkaz \tikzstyle{objekt}=[parametry], který je možné použít jak uvnitř prostředí tikzpicture, tak i mimo něj. Například pokud chceme kreslit pouze tečkované kružnice, můžeme místo neustále se opakujícího \node[draw,circle, dotted] definovat \tikzstyle{dotted circle}=[draw,circle,dotted] a psát pouze \node[dotted circle]. Tímto způsobem je možné si pohodlně nadefinovat všechny použité styly. Zdrojový kód obrázku bude pak přehlednější a bude snazší cokoli změnit. Text lze vkládat do obrázků pomocí uzlů dvěma způsoby. První z nich je napsání textu do složených závorek. Tento text bude umístěn na střed uzlu. Pokud je uzlem například kružnice či čtyřúhelník a zadaný text by se objektu nevešel, automaticky se zvětší rozměry objektu. Druhou možností je použití parametru label a určení pozice, kde se má popisek zobrazit. Pro zobrazení textu vlevo od uzlu je potřeba zadat label=180:vlevo. Pozice (v tomto případě 180) je zadána ve stupních. Další možností je použít předem definované názvy, což by vypadalo takto: label=left:vlevo. Pro srovnání s předešlými nástroji následuje zdrojový kód a výsledný obrázek vytvořený pomocí PGF. \begin{tikzpicture} \foreach \x in {.1,.3,.5,.7} \draw (2,1.5) circle (\x); \draw (0,0)--(0,3)--(4,0)--cycle; \draw (1.5,2.5).. controls (3.2,3.5) and (4.2,3.2)..(3,1); \draw (2,3.5).. controls (2.2,1.9) and (2.4,1.8)..(4,1.5); \end{tikzpicture} 16
3. PŘEHLED NĚKTERÝCH VYBRANÝCH KRESLÍCÍCH NÁSTROJŮ Bez použití \foreach a cycle vypadá zdrojový kód obrázku takto: \begin{tikzpicture} \draw (2,1.5) circle (.1) circle (.3) circle (.5) circle (.7); \draw (0,0)--(0,3)--(4,0)--(0,0); \draw (1.5,2.5).. controls (3.2,3.5) and (4.2,3.2)..(3,1); \draw (2,3.5).. controls (2.2,1.9) and (2.4,1.8)..(4,1.5); \end{tikzpicture} 17
Kapitola 4 Srovnání kreslících nástrojů Prostředí picture je z popisovaných nástrojů nejstarší. Má tu výhodu, že je součástí L A TEX 2ɛ a že je nezávislé na překladači. Bohužel ale také obsahuje jen velice málo příkazů a bitmapový font není vhodný pro vykreslování šikmých čar. Pro vykreslování složitějších obrázků je picture nevhodné. Z těchto důvodů se jím v tomto srovnání již nebudu více zabývat a zaměřím se na porovnávání zbývajících dvou nástrojů. PSTricks je nástroj, který již existuje přes 10 let. Za tu dobu k němu existuje velká spousta doplňků a rozšíření. Navíc je založen na postscriptu, takže je v něm možné nakreslit téměř cokoli. Ovšem právě zmiňovaný postscript s sebou nese i jednu v dnešní době docela značnou nevýhodu není možné použít pdftex. Oproti tomu mladší PGF, který se oddělil od Beameru a samostatně vyvíjí teprve od roku 2005, je nezávislý na použitém překladači. Obsahuje příjemnou uživatelskou vrstvu tikz, podporuje více způsobů zapisování příkazů, vychází částečně z PSTricks a METAPOST. Počet doplňků a balíčků je o poznání menší než v případě PSTricks. Oba dva nástroje používají rozšíření at již v podobě balíčků či knihoven. V PGF jsou knihovny daleko obsáhlejší a ucelenější než balíčky v PSTricks. U PSTricks navíc ještě musí být základní balíčky zavedeny před ostatními. V tomto ohledu je praktičtější právě PGF. Pokud se podíváme na možnosti kreslení, vidíme, že oba dva nástroje umožňují kreslení přímo do textu i do prostředí. Při kreslení do textu nevyžaduje PSTricks žádné zvláštní příkazy. V PGF musí před příkazem být vždy \tikz. Prostředí obou nástrojů je na první pohled podobné. Při bližším prozkoumání ale zjistíme, že PSTricks vyžaduje stejně jako prostředí picture zadání velikosti kresleného obrázku. Pokud se velikost obrázku nezadá, překlad proběhne v pořádku, ale výsledný obrázek se liší od očekávaného. Například u ilustračního obrázku se při vynechání rozměru nevykreslí kružnice a svislá čára: 18