%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\setcounter{chapter}{4}
\newcommand{\graphicscompanion}{\glqq The \LaTeX{} Graphics Companion\grqq~\cite{graphicscompanion}}
\newcommand{\hobby}{\glqq A User's Manual for \MP\grqq~\cite{metapost}}
\newcommand{\hoenig}{\glqq \TeX{} Unbound\grqq~\cite{unbound}}
\newcommand{\graphicsinlatex}{\glqq Graphics in \LaTeXe\grqq~\cite{ursoswald}}

\chapter{Matemaatilise graafika genereerimine}
\label{chap:graphics}\index{joonised}

\begin{intro}
Enamasti kasutatakse \LaTeX i teksti vormistamiseks. Kuid et struktuurne
lähenemine sisuloomele on väga praktiline, sisaldab \LaTeX{} ka
vahendeid, kuigi mõneti piiratuid, tekstkirjelduste järgi graafilise
väljundi genereerimiseks. Lisaks on \LaTeX i jaoks koostatud päris
mitmeid laiendusi, mis püüavad sellest piiratusest üle saada. Käesolevas
peatükis tutvustamegi neist mõningaid.
\end{intro}

\section{Ülevaade}

Graafilise väljundi loomisel \LaTeX iga on pikk traditsioon. See algas
keskkonnaga \ei{picture}, mis võimaldab koostada graafikat
eeldefineeritud elementide paneelile paigutamise teel. Täieliku
kirjelduse annab raamat \manual. \LaTeXe{} keskkond \ei{picture}
sisaldab käsku \ci{qbezier}, kus \texttt{q} tähistab ruutkõverat
(\emph{quadratic}). Paljusid sagedasti kasutatavaid jooni, nagu
ringjooni, ellipseid ja aheljooni saab rahuldavalt lähendada B\'ezier'
ruutkõveratega, kuigi see võib nõuda veidi matemaatilist vaevanägemist.
Kui aga seejuures genereerida \LaTeX i sisendfailide \ci{qbezier}-plokid
programmi abil, muutub keskkond \ei{picture} päris võimsaks.

Olgugi et jooniste programmeerimine otse \LaTeX is on väga piiratud ja
tihti tüütu, leidub siiski põhjusi, miks seda teha. Sedasi moodustatud
dokumendid on baidisuuruse poolest "`väikesed"' ja puuduvad
graafikafailid, mida on vaja kogu aeg kaasas kanda.

Niisugune oli asjade seis kuni hetkeni, mil mõni aasta tagasi valmis
klassi \pai{beamer} autori \index{Tantau, Till}Till Tantau käe all
Portable Graphics Format (pakett \pai{pgf}) ja seonduv kasutajaliides
TikZ (pakett \pai{tikz}). See süsteem võimaldab luua kõrge kvaliteediga
vektorgraafikat kõigis \TeX i süsteemides täieliku PDFi toega.

Sellele baasile tuginedes on kirjutatud palju pakette mitmesugusteks
otstarveteks. Laia valikut nendest pakettidest tutvustab üksikasjaliselt
\graphicscompanion{}.

Ilmselt kõige arenenum \LaTeX iga seotud graafikatööriist on
\index{metapost@\MP}\MP. See on eraldiseisev rakendus, mis on
\index{Knuth, Donald E.}Donald E. Knuthi kirjutatud programmi
\index{metafont@\MF}\MF\ kaksikõde. \MP i aluseks on \MF i väga võimas
ja matemaatiliselt väljendusrikas programmeerimiskeel, kuid erinevalt
programmist \MF{} genereerib ta kapseldatud \PSi i faile, mida saab
lisada \LaTeX i ja isegi pdf\LaTeX i. Sissejuhatuse leiab manuaalist
\hobby{} või juhendist \cite{ursoswald}.

Väga põhjaliku käsitluse \LaTeX i ja \TeX i graafika- (ja kirja-)
strateegiatest leiab raamatust \hoenig.

\section{Keskkond \ei{picture}}
\secby{Urs Oswald}{osurs@bluewin.ch}
Nagu ülal mainitud, on keskkond \ei{picture} osa standard-\LaTeX ist
ja sobib väga hästi lihtsate ülesannete jaoks ning juhuks, kui on vaja
leheküljel täpset kontrolli üksikute elementide üle. Tõsisema
graafikatöö puhul tuleks aga vaadata paketi TikZ poole, mida
tutvustatakse jaotises \ref{sec:tikz} leheküljel \pageref{sec:tikz}.

\subsection{Põhikäsud}

Keskkond \ei{picture}\footnote{Usu või ära usu, aga keskkond
\ei{picture} töötab standard-\LaTeX is niisama, ilma et oleks vaja
sisse lugeda ühtki paketti.} luuakse ühega järgmisest kahest käsust:
\begin{lscommand}
\verb|\begin{picture}(|$x,y$\verb|)| \ldots\verb|\end{picture}|
\end{lscommand}
\noindent või
\begin{lscommand}
\verb|\begin{picture}(|$x,y$\verb|)(|$x_0,y_0$\verb|)| \ldots\verb|\end{picture}|
\end{lscommand}
\noindent Arvud $x$, $y$, $x_0$, $y_0$ viitavad ühikpikkusele
\ci{unitlength}, millele saab igal hetkel (kuid mitte keskkonna
\ei{picture} sees) anda väärtustamiskäsuga uue väärtuse, nagu näiteks
\begin{lscommand}
\ci{setlength}\verb|{|\ci{unitlength}\verb|}{1.2cm}|
\end{lscommand}
\noindent Ühikpikkuse \ci{unitlength} vaikeväärtus on \texttt{1pt}.
Esimene paar $(x,y)$ reserveerib dokumendis joonise jaoks
ristkülikukujulise ruumi. Valikuline teine paar $(x_0,y_0)$ omistab
reserveeritud ristküliku alumisele vasakule nurgale suvalised
koordinaadid.

Enamik joonistamiskäske on ühel kahest kujust:
\begin{lscommand}
\ci{put}\verb|(|$x,y$\verb|){|\emph{objekt}\verb|}|
\end{lscommand}
\noindent või
\begin{lscommand}
\ci{multiput}\verb|(|$x,y$\verb|)(|$\Delta x,\Delta y$\verb|){|$n$\verb|}{|\emph{objekt}\verb|}|\end{lscommand}
\noindent Erandiks on B\'ezier' kõverad, mida joonistatakse käsuga
\begin{lscommand}
\ci{qbezier}\verb|(|$x_1,y_1$\verb|)(|$x_2,y_2$\verb|)(|$x_3,y_3$\verb|)|
\end{lscommand}

\subsection{Lõigud}

\begin{example}
\setlength{\unitlength}{5cm}
\begin{picture}(1,1)
  \put(0,0){\line(0,1){1}}
  \put(0,0){\line(1,0){1}}
  \put(0,0){\line(1,1){1}}
  \put(0,0){\line(1,2){.5}}
  \put(0,0){\line(1,3){.3333}}
  \put(0,0){\line(1,4){.25}}
  \put(0,0){\line(1,5){.2}}
  \put(0,0){\line(1,6){.1667}}
  \put(0,0){\line(2,1){1}}
  \put(0,0){\line(2,3){.6667}}
  \put(0,0){\line(2,5){.4}}
  \put(0,0){\line(3,1){1}}
  \put(0,0){\line(3,2){1}}
  \put(0,0){\line(3,4){.75}}
  \put(0,0){\line(3,5){.6}}
  \put(0,0){\line(4,1){1}}
  \put(0,0){\line(4,3){1}}
  \put(0,0){\line(4,5){.8}}
  \put(0,0){\line(5,1){1}}
  \put(0,0){\line(5,2){1}}
  \put(0,0){\line(5,3){1}}
  \put(0,0){\line(5,4){1}}
  \put(0,0){\line(5,6){.8333}}
  \put(0,0){\line(6,1){1}}
  \put(0,0){\line(6,5){1}}
\end{picture}
\end{example}

Lõike joonistatakse käsuga
\begin{lscommand}
\ci{put}\verb|(|$x,y$\verb|){|\ci{line}\verb|(|$x_1,y_1$\verb|){|$pikkus$\verb|}}|
\end{lscommand}
\noindent Käsul \ci{line} on kaks argumenti: suunavektor ja pikkus.
Suunavektori komponendid piirduvad täisarvudega
\[
  -6,\,-5,\,\ldots,\,5,\,6,
\]
ja nad peavad olema ühistegurita (pole muid ühiseid tegureid peale 1).
Joonisel on kujutatud kõik 25 võimalikku kalde väärtust esimeses
veerandis. Pikkus määratakse ühikpikkuse \ci{unitlength} suhtes. Pikkuse
argument on vertikaaljoone puhul vertikaalkoordinaat ja kõigil ülejäänud
juhtudel horisontaalkoordinaat.

\subsection{Nooled}

\begin{example}
\setlength{\unitlength}{0.75mm}
\begin{picture}(60,40)
  \put(30,20){\vector(1,0){30}}
  \put(30,20){\vector(4,1){20}}
  \put(30,20){\vector(3,1){25}}
  \put(30,20){\vector(2,1){30}}
  \put(30,20){\vector(1,2){10}}
  \thicklines
  \put(30,20){\vector(-4,1){30}}
  \put(30,20){\vector(-1,4){5}}
  \thinlines
  \put(30,20){\vector(-1,-1){5}}
  \put(30,20){\vector(-1,-4){5}}
\end{picture}
\end{example}
Nooli joonistatakse käsuga
\begin{lscommand}
\ci{put}\verb|(|$x,y$\verb|){|\ci{vector}\verb|(|$x_1,y_1$\verb|){|$pikkus$\verb|}}|
\end{lscommand}
\noindent Noolte puhul on suunavektori komponendid veelgi kitsamalt
piiratud kui lõikude puhul, nimelt täisarvudega
\[
  -4,\,-3,\,\ldots,\,3,\,4.
\]
Komponendid peavad samuti olema ühistegurita (pole muid ühiseid
tegureid peale 1). Võib tähele panna käsu \ci{thicklines}\cih{thinlines}
mõju kahele noolele, mis osutavad üles vasakule.

\subsection{Ringjooned}

\begin{example}
\setlength{\unitlength}{1mm}
\begin{picture}(60, 40)
  \put(20,30){\circle{1}}
  \put(20,30){\circle{2}}
  \put(20,30){\circle{4}}
  \put(20,30){\circle{8}}
  \put(20,30){\circle{16}}
  \put(20,30){\circle{32}}

  \put(40,30){\circle{1}}
  \put(40,30){\circle{2}}
  \put(40,30){\circle{3}}
  \put(40,30){\circle{4}}
  \put(40,30){\circle{5}}
  \put(40,30){\circle{6}}
  \put(40,30){\circle{7}}
  \put(40,30){\circle{8}}
  \put(40,30){\circle{9}}
  \put(40,30){\circle{10}}
  \put(40,30){\circle{11}}
  \put(40,30){\circle{12}}
  \put(40,30){\circle{13}}
  \put(40,30){\circle{14}}

  \put(15,10){\circle*{1}}
  \put(20,10){\circle*{2}}
  \put(25,10){\circle*{3}}
  \put(30,10){\circle*{4}}
  \put(35,10){\circle*{5}}
\end{picture}
\end{example}
Käsk
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{circle}\verb|{|\emph{diameeter}\verb|}}|
\end{lscommand}
\noindent joonistab ringjoone keskpunktiga $(x,y)$ ja diameetriga (mitte
raadiusega) \emph{diameeter}. Keskkond \ei{picture} tunnistab ainult
diameetreid kuni umbes 14\,mm-ni ja ka sellest piirist allpool pole kõik
diameetrid võimalikud. Käsk \ci{circle*} joonistab ketta (täidetud
ringi).

Nagu lõikude puhulgi, võib olla tarvis abiks võtta lisapaketid nagu
\pai{eepic} või \pai{pstricks}. Neid pakette on põhjalikult kirjeldatud
raamatus \graphicscompanion.

Võimalusi leidub ka keskkonna \ei{picture} sees. Kellel pole hirmu
sooritada vajalikke arvutusi (või lasta neid teha programmil), saab
suvalisi ringjooni ja ellipseid kokku panna B\'ezier' ruutkõveratest.
Näiteid ja Java-faile pakub \graphicsinlatex.

\subsection{Tekst ja valemid}

\begin{example}
\setlength{\unitlength}{0.8cm}
\begin{picture}(6,5)
  \thicklines
  \put(1,0.5){\line(2,1){3}}
  \put(4,2){\line(-2,1){2}}
  \put(2,3){\line(-2,-5){1}}
  \put(0.5,0.2){$A$}
  \put(4.2,1.9){$B$}
  \put(1.5,3.0){$C$}
  \put(3.0,2.7){$a$}
  \put(1.1,1.7){$b$}
  \put(2.6,0.9){$c$}
  \put(0.3,4){$S=
    \sqrt{p(p-a)(p-b)(p-c)}$}
  \put(3.5,0.4){$\displaystyle
    p:=\frac{a+b+c}{2}$}
\end{picture}
\end{example}
Nagu siit näha, saab teksti ja valemeid paigutada keskkonnas
\ei{picture} käsuga \ci{put} tavalisel viisil.

\subsection{\ci{multiput} ja \ci{linethickness}}

\begin{example}
\setlength{\unitlength}{2mm}
\begin{picture}(30,20)
  \linethickness{0.075mm}
  \multiput(0,0)(1,0){26}%
    {\line(0,1){20}}
  \multiput(0,0)(0,1){21}%
    {\line(1,0){25}}
  \linethickness{0.15mm}
  \multiput(0,0)(5,0){6}%
    {\line(0,1){20}}
  \multiput(0,0)(0,5){5}%
    {\line(1,0){25}}
  \linethickness{0.3mm}
  \multiput(5,0)(10,0){2}%
    {\line(0,1){20}}
  \multiput(0,5)(0,10){2}%
    {\line(1,0){25}}
\end{picture}
\end{example}
Käsul
\begin{lscommand}
  \ci{multiput}\verb|(|$x,y$\verb|)(|$\Delta x,\Delta y$\verb|){|$n$\verb|}{|\emph{objekt}\verb|}|
\end{lscommand}
\noindent on 4 argumenti: alguspunkt, nihkevektor ühest objektist
järgmiseni, objektide arv ja joonistatav objekt. Käsk \ci{linethickness}
mõjub horisontaalsele ja vertikaalsele lõigule, aga mitte kaldlõikudele
ega ringjoontele. Kuid ta mõjub B\'ezier' ruutkõveratele!

\subsection{Ovaalid}

\begin{example}
\setlength{\unitlength}{0.75cm}
\begin{picture}(6,4)
  \linethickness{0.075mm}
  \multiput(0,0)(1,0){7}%
    {\line(0,1){4}}
  \multiput(0,0)(0,1){5}%
    {\line(1,0){6}}
  \thicklines
  \put(2,3){\oval(3,1.8)}
  \thinlines
  \put(3,2){\oval(3,1.8)}
  \thicklines
  \put(2,1){\oval(3,1.8)[tl]}
  \put(4,1){\oval(3,1.8)[b]}
  \put(4,3){\oval(3,1.8)[r]}
  \put(3,1.5){\oval(1.8,0.4)}
\end{picture}
\end{example}
Käsk
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{oval}\verb|(|$l,k$\verb|)}|
\end{lscommand}
\noindent või
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{oval}\verb|(|$l,k$\verb|)[|\emph{osa}\verb|]}|
\end{lscommand}
\noindent joonistab ovaali keskpunktiga $(x,y)$ ning laiusega $l$ ja
kõrgusega $k$. Valikulise argumendi \emph{osa} väärtused \texttt{t},
\texttt{b}, \texttt{l}, \texttt{r} tähendavad vastavalt "`ülemine"',
"`alumine"', "`vasak"', "`parem"' ning neid võib omavahel kombineerida
nagu näites.

Joone paksust saab ette anda kahte liiki käskudega: ühelt poolt käsk
\ci{linethickness}\verb|{|\emph{pikkus}\verb|}| ning teiselt poolt
\ci{thinlines} ja \ci{thicklines}. Käsk
\ci{linethickness}\verb|{|\emph{pikkus}\verb|}| mõjub ainult
horisontaalsetele ja vertikaalsetele lõikudele (ja B\'ezier'
ruutkõveratele), kuid \ci{thinlines} ja \ci{thicklines} mõjuvad ka
kaldlõikudele ja ringjoontele ning ovaalidele.

\subsection{Eeldefineeritud joonisekastide korduvkasutus}

\begin{example}
\setlength{\unitlength}{0.5mm}
\begin{picture}(120,168)
\newsavebox{\kausta}
\savebox{\kausta}
  (40,32)[bl]{%  definitsioon
  \multiput(0,0)(0,28){2}
    {\line(1,0){40}}
  \multiput(0,0)(40,0){2}
    {\line(0,1){28}}
  \put(1,28){\oval(2,2)[tl]}
  \put(1,29){\line(1,0){5}}
  \put(9,29){\oval(6,6)[tl]}
  \put(9,32){\line(1,0){8}}
  \put(17,29){\oval(6,6)[tr]}
  \put(20,29){\line(1,0){19}}
  \put(39,28){\oval(2,2)[tr]}
}
\newsavebox{\kaustb}
\savebox{\kaustb}
  (40,32)[l]{%  definitsioon
  \put(0,14){\line(1,0){8}}
  \put(8,0){\usebox{\kausta}}
}
\put(34,26){\line(0,1){102}}
\put(14,128){\usebox{\kausta}}
\multiput(34,86)(0,-37){3}
  {\usebox{\kaustb}}
\end{picture}
\end{example}
Joonisekasti saab \emph{deklareerida} käsuga
\begin{lscommand}
  \ci{newsavebox}\verb|{|\emph{nimi}\verb|}|
\end{lscommand}
\noindent seejärel \emph{defineerida} käsuga
\begin{lscommand}
  \ci{savebox}\verb|{|\emph{nimi}\verb|}(|\emph{laius}\verb|,|\emph{kõrgus}\verb|)[|\emph{asend}\verb|]{|\emph{sisu}\verb|}|
\end{lscommand}
\noindent ning lõpuks ükskõik mitu korda \emph{joonistada} käsuga
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{usebox}\verb|{|\emph{nimi}\verb|}}|
\end{lscommand}

Valikuline argument \emph{asend} defineerib salvestatud kasti
ankurpunkti. Näites kasti \ci{kausta} puhul määratakse selleks
\texttt{bl}, mis paneb ankurpunkti salvestatud kasti alumisse vasakusse
nurka. Ülejäänud asukohaspetsifikaatorid on \texttt{t} ja \texttt{r}
("`üles"' ja "`paremale"').

Argument \emph{nimi} viitab \LaTeX i objektihoidlale ja on seega
olemuselt käsk (mille tõttu on tema ees langjoon nagu näites). Kastis
olevad joonised võivad asuda üksteise sees: selles näites kasutatakse
kasti \ci{kaustb} definitsioonis kasti \ci{kausta}.

Käsku \ci{oval} oli vaja sellepärast, et käsk \ci{line} ei tööta, kui
lõigu pikkus on väiksem kui umbes 3\,mm.

\subsection{B\'ezier' ruutkõverad}

\begin{example}
\setlength{\unitlength}{0.8cm}
\begin{picture}(6,4)
  \linethickness{0.075mm}
  \multiput(0,0)(1,0){7}
    {\line(0,1){4}}
  \multiput(0,0)(0,1){5}
    {\line(1,0){6}}
  \thicklines
  \put(0.5,0.5){\line(1,5){0.5}}
  \put(1,3){\line(4,1){2}}
  \qbezier(0.5,0.5)(1,3)(3,3.5)
  \thinlines
  \put(2.5,2){\line(2,-1){3}}
  \put(5.5,0.5){\line(-1,5){0.5}}
  \linethickness{1mm}
  \qbezier(2.5,2)(5.5,0.5)(5,3)
  \thinlines
  \qbezier(4,2)(4,3)(3,3)
  \qbezier(3,3)(2,3)(2,2)
  \qbezier(2,2)(2,1)(3,1)
  \qbezier(3,1)(4,1)(4,2)
\end{picture}
\end{example}
Nagu sellest näitest selgub, ei ole ringjoone tükeldamine 4 B\'ezier'
ruut\-kõ\-veraks piisav. Vaja on vähemalt 8. Joonis kujutab taas käsu
\ci{linethickness} mõju horisontaalsetele ja vertikaalsetele lõikudele
ning käskude \ci{thinlines} ja \ci{thicklines} mõju kaldlõikudele. Samuti
näeme siit, et mõlemat liiki käsud mõjutavad B\'ezier' ruutkõveraid,
kusjuures iga käsk tühistab eelmise käsu mõju.

Olgu $P_1=(x_1,\,y_1)$ ja $P_2=(x_2,\,y_2)$ B\'ezier' kõvera otspunktid
ning $m_1$ ja $m_2$ vastavad kalded. Vahepealne juhtpunkt $S=(x,\,y)$ on
siis määratud võrranditega
\begin{equation} \label{zwischenpunkt}
  \left\{
    \begin{aligned}[rcl]
      x & = & \displaystyle \frac{m_2 x_2-m_1x_1-(y_2-y_1)}{m_2-m_1}, \\
      y & = & y_i+m_i(x-x_i)\qquad (i=1,\,2).
    \end{aligned}
  \right.
\end{equation}
\noindent Juhendist \graphicsinlatex{} leiab Java-programmi, mis
genereerib käsu \ci{qbezier} jaoks sobiva käsurea.

\subsection{Aheljoon}

\begin{example}
\setlength{\unitlength}{1cm}
\begin{picture}(4.3,3.6)(-2.5,-0.25)
\put(-2,0){\vector(1,0){4.4}}
\put(2.45,-.05){$x$}
\put(0,0){\vector(0,1){3.2}}
\put(0,3.35){\makebox(0,0){$y$}}
\qbezier(0.0,0.0)(1.2384,0.0)
  (2.0,2.7622)
\qbezier(0.0,0.0)(-1.2384,0.0)
  (-2.0,2.7622)
\linethickness{.075mm}
\multiput(-2,0)(1,0){5}
  {\line(0,1){3}}
\multiput(-2,0)(0,1){4}
  {\line(1,0){4}}
\linethickness{.2mm}
\put( .3,.12763){\line(1,0){.4}}
\put(.5,-.07237){\line(0,1){.4}}
\put(-.7,.12763){\line(1,0){.4}}
\put(-.5,-.07237){\line(0,1){.4}}
\put(.8,.54308){\line(1,0){.4}}
\put(1,.34308){\line(0,1){.4}}
\put(-1.2,.54308){\line(1,0){.4}}
\put(-1,.34308){\line(0,1){.4}}
\put(1.3,1.35241){\line(1,0){.4}}
\put(1.5,1.15241){\line(0,1){.4}}
\put(-1.7,1.35241){\line(1,0){.4}}
\put(-1.5,1.15241){\line(0,1){.4}}
\put(-2.5,-0.25){\circle*{0.2}}
\end{picture}
\end{example}

Sellel joonisel on aheljoone $y=\cosh x - 1$ mõlemat sümmeetrilist poolt
lähendatud B\'ezier' ruutkõveraga. Kõvera parem pool lõpeb punktis
\((2;2{,}7622)\) ning kalde väärtus on seal \(m=3{,}6269\). Valemi
(\ref{zwischenpunkt}) abil saame arvutada vahepealsed juhtpunktid, mis
tulevad $(1{,}2384;0)$ ja $(-1{,}2384;0)$. Ristid näitavad
\emph{tegeliku} aheljoone punkte. Viga on vaevumärgatav, väiksem kui üks
protsent.

See näide demonstreerib käsu \verb|\begin{picture}| valikulist
argumenti. Joonis kirjeldatakse sobivates "`matemaatilistes"'
koordinaatides, kui käsuga
\begin{code}
  \verb|\begin{picture}(4.3,3.6)(-2.5,-0.25)|
\end{code}
\noindent seatakse alumise vasaku nurga (tähistatud musta ringiga)
koordinaatideks $(-2{,}5;-0{,}25)$.

\subsection{Kiirus erirelatiivsusteoorias}

\begin{example}
\setlength{\unitlength}{0.8cm}
\begin{picture}(6,4)(-3,-2)
  \put(-2.5,0){\vector(1,0){5}}
  \put(2.7,-0.1){$\chi$}
  \put(0,-1.5){\vector(0,1){3}}
  \multiput(-2.5,1)(0.4,0){13}
    {\line(1,0){0.2}}
  \multiput(-2.5,-1)(0.4,0){13}
    {\line(1,0){0.2}}
  \put(0.2,1.4)
    {$\beta=v/c=\tanh\chi$}
  \qbezier(0,0)(0.8853,0.8853)
    (2,0.9640)
  \qbezier(0,0)(-0.8853,-0.8853)
    (-2,-0.9640)
  \put(-3,-2){\circle*{0.2}}
\end{picture}
\end{example}
Kahe B\'ezier' kõvera juhtpunktid on arvutatud valemist
(\ref{zwischenpunkt}). Positiivset haru esitava kõvera määravad
punktid/kalded $P_1=(0;0)$, $m_1=1$ ja $P_2=(2;\tanh 2)$, $m_2=1/\cosh^2
2$. Jällegi on joonis tehtud matemaatiliselt sobivates koordinaatides
ning alumisele vasakule nurgale on omistatud koordinaadid  $(-3;-2)$
(must ring).

\section{Graafikapaketid PGF ja TikZ}
\label{sec:tikz}

Tänapäeval suudavad kõik \LaTeX i väljundigenereerimise süsteemid luua
kena vektorgraafikat, ainult liidesed on üsna mitmekesised. Pakett
\pai{pgf} kujutab endast abstraktsioonikihti nende liideste peal. Kuna
selle paketiga on kaasas omaenda mahukas manuaal/juhend \cite{pgfplot},
siis piirdume siin ainult lühikese sissevaatega.

Paketiga \pai{pgf} tuleb samuti kaasa omaenda kõrgtaseme kasutuskeel,
mis defineeritakse paketis \pai{tikz}. Viimane pakett sisaldab väga
efektiivseid käske graafika joonistamiseks otse dokumendi sees. Tikzi
käsud pannakse keskkonda \ei{tikzpicture}.

Nagu ülal mainitud, on paketi \pai{pgf} ja sõprade jaoks olemas
suurepärane manuaal. Paketi töö selgitamise asemel vaatleme seetõttu
mõnda näidet, mis annavad võimalustest esmase ülevaate.

Kõigepealt üks lihtne, aga sisukas graafik:
\begin{example}
\begin{tikzpicture}[scale=3]
  \clip (-0.1,-0.2)
     rectangle (1.8,1.2);
  \draw[step=.25cm,gray,very thin]
       (-1.4,-1.4) grid (3.4,3.4);
  \draw (-1.5,0) -- (2.5,0);
  \draw (0,-1.5) -- (0,1.5);
  \draw (0,0) circle (1cm);
  \filldraw[fill=green!20!white,
            draw=green!50!black]
    (0,0) -- (3mm,0mm)
         arc (0:30:3mm) -- cycle;
\end{tikzpicture}
\end{example}
\noindent Tähele tuleks panna semikoolonit \texttt{;} käskude
eraldajana.

Lihtne Venni diagramm:
\begin{example}
\shorthandoff{:}
\begin{tikzpicture}
\node[circle,minimum size=3cm,
  draw,label=120:{ökonoomika}]
  at (0,0) {};
\node[circle,minimum size=3cm,
  draw,label=60:{psühholoogia}]
  at (1,0) {};
\node (i) at (0.5,-1) {};
\node at (0.6,-2.5)
  {käitumisökonoomika}
  edge[->,thick,out=60,in=-60](i);
\end{tikzpicture}
\end{example}
Kui paketti \pai{tikz} kasutatakse koos paketiga \pai{babel}, siis võib
juhtuda, et \pai{babel} muudab ümber mõne TikZi keele sümboli tähenduse,
mis toob kaasa kummalised vead. Selle vastu aitab tihti käsu
\ci{shorthandoff} lisamine koodi.

Järgmise näite iseärasus on tsükkel:

\begin{example}
\begin{tikzpicture}[scale=0.8]
  \tikzstyle{v}=[circle,minimum size=2mm,inner sep=0pt,draw]
\foreach \i in {1,...,8}
\foreach \j in {1,...,3}
  \node[v](G-\i-\j) at (\i,\j){};
\foreach \i in {1,...,8}
\foreach \j/\o in {1/2,2/3}
  \draw[->](G-\i-\j)--(G-\i-\o);
\foreach \i/\n in
  {1/2,2/3,3/4,4/5,5/6,6/7,7/8}
  \foreach \j/\o in {1/2,2/3} {
    \draw[->] (G-\i-\j) -- (G-\n-\o);
    \draw[->] (G-\n-\j) -- (G-\i-\o); }
\end{tikzpicture}
\end{example}


Preambulis antava käsuga \ci{usetikzlibrary} saab aktiveerida laia skaala
lisavõimalusi erikujundite joonistamiseks, nagu see kergelt kumer kast:
\begin{example}
\usetikzlibrary{%
  decorations.pathmorphing}
\begin{tikzpicture}[
     decoration={bent,aspect=.3}]
 \draw [decorate,fill=lightgray]
        (0,0) rectangle (5.5,4);
 \node[circle,draw]
        (A) at (.5,.5) {A};
 \node[circle,draw]
        (B) at (5,3.5) {B};
 \draw[->,decorate] (A) -- (B);
 \draw[->,decorate] (B) -- (A);
\end{tikzpicture}
\end{example}

\begin{example}
\usetikzlibrary{positioning}
\begin{tikzpicture}[xscale=6,
     yscale=8,>=stealth]
  \tikzstyle{v}=[circle,
     minimum size=1mm,draw,thick]
  \node[v] (a) {$1$};
  \node[v] (b) [right=of a] {$2$};
  \node[v] (c) [below=of a] {$2$};
  \node[v] (d) [below=of b] {$1$};
  \draw[thick,->]
        (a) to node {} (c);
  \draw[thick,->]
        (a) to node {} (d);
  \draw[thick,->]
        (b) to node {} (d);
\end{tikzpicture}
\end{example}

On isegi võimalik joonistada süntaksidiagramme, mis näevad välja nii,
nagu oleksid nad pärit otse Pascali programmeerimise õpikust. Kood on
eelmise näitega võrreldes veidi komplitseeritum, seetõttu on siin
esitatud ainult tulemus. Sellesama diagrammi joonistamiseks on paketi
\pai{pgf} dokumentatsioonis olemas üksikasjalik juhend.
\begin{center}
\begin{tikzpicture}[point/.style={coordinate},thick,draw=black!50,>=stealth',
                    tip/.style={->,shorten >=1pt},every join/.style={rounded corners},
                    skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}},
                    hv path/.style={to path={-| (\tikztotarget)}},
                    vh path/.style={to path={|- (\tikztotarget)}},
                 terminal/.style={
            rounded rectangle,
            minimum size=6mm,
            thick,draw=black!50,
            top color=white,bottom color=black!20,
            font=\ttfamily\tiny},
                nonterminal/.style={
                       rectangle,
                       minimum size=6mm,
                       thick,
                       draw=red!50!black!50,         % 50% red and 50% black,
                       top color=white,              % a shading that is white at the top...
                       bottom color=red!50!black!20, % and something else at the bottom
                       font=\itshape\tiny}]
\matrix[column sep=3.7mm] {
  % First row:
  & & & & & & & & & & & \node (plus) [terminal] {+};\\
  % Second row:
  \node (p1) [point] {}; &     \node (ui1)    [nonterminal] {märgita täisarv}; &
  \node (p2) [point] {}; &     \node (dot)    [terminal]    {.};                &
  \node (p3) [point] {}; &     \node (digit)  [terminal]    {number};            &
  \node (p4) [point] {}; &     \node (p5)     [point] {};                       &
  \node (p6) [point] {}; &     \node (e)      [terminal]    {E};                &
  \node (p7) [point] {}; &                                                      &
  \node (p8) [point] {}; &     \node (ui2)    [nonterminal] {märgita täisarv}; &
  \node (p9) [point] {}; &     \node (p10)    [point]       {};\\
  % Third row:
  & & & & & & & & & & & \node (minus)[terminal] {-};\\
};
{ [start chain]
  \chainin (p1);
  \chainin (ui1)   [join=by tip];
  \chainin (p2)    [join];
  \chainin (dot)   [join=by tip];
  \chainin (p3)    [join];
  \chainin (digit) [join=by tip];
  \chainin (p4)    [join];
  { [start branch=digit loop]
    \chainin (p3) [join=by {skip loop=-6mm,tip}];
  }
  \chainin (p5)    [join,join=with p2 by {skip loop=6mm,tip}];
  \chainin (p6)    [join];
  \chainin (e)     [join=by tip];
  \chainin (p7)    [join];
  { [start branch=plus]
    \chainin (plus) [join=by {vh path,tip}];
    \chainin (p8)    [join=by {hv path,tip}];
  }
  { [start branch=minus]
    \chainin (minus) [join=by {vh path,tip}];
    \chainin (p8)    [join=by {hv path,tip}];
  }
  \chainin (p8)    [join];
  \chainin (ui2)   [join=by tip];
  \chainin (p9)    [join,join=with p6 by {skip loop=-11mm,tip}];
  \chainin (p10)   [join=by tip];
}
\end{tikzpicture}
\end{center}

Võimalusi on veelgi: kui tuleb joonistada arvuliste andmete või
funktsioonide graafikuid, siis võib vaadata paketti \pai{pgfplot}, mis
sisaldab kõike, mida graafikute joonistamisel vaja läheb. See pakett
suudab isegi kutsuda välja välise \wi{Gnuplot}i käsu, et välja arvutada
graafikusse kirjutatud funktsiooni tegelik väärtus.

Veel rohkem inspiratsiooni annab \index{Fauske, Kjell Magne}Kjell Magne
Fauske suurepärane \url{http://www.texample.net/tikz}, kust leiab
pidevalt täieneva kogu ilusaid jooniseid ja muud \LaTeX i koodi. Samal
\index{texample.net@\TeX{}ample.net}\TeX{}ample.net-i lehel on väljas ka
mitmesuguste PGFi/TikZi tööriistade nimekiri
(\url{http://www.texample.net/tikz/resources/#tools-that-generate-pgftikz-code}),
nii et ei ole vaja kirjutada kogu koodi käsitsi.

%%% Local Variables:
%%% TeX-master: "lshort.tex"
%%% mode: flyspell
%%% TeX-PDF-mode: t
%%% End:
