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

\chapter{Tworzenie grafiki matematycznej}
\label{chap:graphics}

\begin{intro}

  Większość ludzi używa \LaTeX{}a do składania tekstów. Ponieważ jednak
  podejście strukturalno-logiczne do tworzenia dokumentów jest tak
  wygodne, \LaTeX{} oferuje pewną -- fakt, że obarczoną ograniczeniami
  -- możliwość generowania grafiki z opisów tekstowych w pliku
  źródłowym. Co więcej, powstało sporo rozszerzeń \LaTeX{}a
  przełamujących wspomniane ograniczenia. W tym rozdziale dowiesz się o
  kilku z tych rozszerzeń.
\end{intro}

\section{Przegląd}

Tworzenie grafik w \LaTeX{}u ma długą tradycję. Rozpoczęło się ono od
otoczenia \ei{picture}, które pozwala na tworzenie grafik przez
umieszczanie przygotowanych elementów na płótno. Jego pełny opis
można znaleźć w \manual. Otoczenie \ei{picture} w \LaTeXe{} dodaje
polecenie \ci{qbezier}, gdzie ,,\texttt{q}'' oznacza ,,kwadratowa''
(ang. ,,\textenglish{quadratic}''). Wiele często używanych krzywych
takich jak okręgi, elipsy lub krzywa łańcuchowa może być
wystarczająco dobrze przybliżona kwadratowymi krzywymi B\'eziera
jednak może to wymagać nieco przeliczeń. Jeśli dodatkowo wykorzystamy
język programowania do generowania bloków \ci{qbezier} w plikach
źródłowych to otoczenie \ei{picture} staje się bardzo potężne.

Chociaż programowanie rysunków w \LaTeX{}u wiąże się z ograniczeniami
i jest niekiedy nużące, to jednak są powody, by z tej możliwości
korzystać. Dokumenty wytworzone w ten sposób są ,,małe'' -- w sensie
liczby bajtów zajmowanych przez pliki -- a na dodatek nie trzeba do
nich wczytywać dodatkowych plików graficznych.

Taki był stan rzeczy dopóki kilka lat temu Till Tantau z klasy
\pai{beamer} przygotował Portable Graphics Format \pai{pgf} oraz
pakiet akompaniujący TikZ (\pai{tikz}). System ten pozwala na
tworzenie grafiki wektorowej wysokiej jakości przy użyciu wszystkich
aktualnych systemów \TeX{}a włączając w to pełne wsparcie PDF.

Korzystając z tych podstaw, wiele pakietów zostało utworzonych do
rozwiązywania konkretnych problemów. Wiele z nich zostało dokładnie
opisanych w \graphicscompanion{}.

Spośród narzędzi graficznych związanych z \LaTeX{}em największe chyba
możliwości posiada \MP{}. Jest to samodzielna aplikacja oparta na
programie \MF{} Donald E. Knutha. Język \MP{} posiada bardzo potężny
i matematycznie zaawansowany język programowania \MF{}, ale w
przeciwieństwie do niego generuje pliki \PSi{}, które można
zaimportować do \LaTeX{}a, a nawet do pdf\LaTeX{}a. Jako wprowadzenie
możesz przeczytać \hobby, lub tutorial w \cite{ursoswald}.

Bardzo dokładną dyskusję strategii dla \LaTeX{}a i \TeX{}a
dotyczących grafik (i fontów) można znaleźć w \hoenig.

\section{Otoczenie \texttt{picture}} \secby{Urs Oswald}{osurs@bluewin.ch}

Jak wspomniano wyżej otoczenie \ei{picture} jest częścią
standardowego \LaTeX{}a i jest świetne do prostych zadań oraz w
przypadku gdy chcesz dokładnej kontroli nad ułożeniem elementów na
stronie. Jednak jeśli zamierzasz robić poważne grafiki matematyczne
lepiej od razu użyć TikZa jak pokazano w sekcji~\ref{sec:tikz} na
stronie~\ref{sec:tikz}.

\subsection{Podstawowe polecenia}

Otoczenie \ei{picture}\footnote{Otoczenie \ei{picture} działa w
  standardowym {\LaTeXe}; nie trzeba ładować żadnych dodatkowych
  pakietów.} można tworzyć poleceniem
\begin{lscommand}
  \ci{begin}\verb|{picture}(|$x,y$\verb|)|\ldots\ci{end}\verb|{picture}|
\end{lscommand}
\noindent lub
\begin{lscommand}
  \ci{begin}\verb|{picture}(|$x,y$\verb|)(|$x_0,y_0$\verb|)|\ldots\ci{end}\verb|{picture}|
\end{lscommand}
%
Liczby $x,\,y,\,x_0,\,y_0$ odnoszą się do wielkości \ci{unitlength},
którą można zmieniać w dowolnym momencie (jednak nie wewnątrz
otoczenia \ei{picture}) poleceniem takim jak
\begin{lscommand}
  \ci{setlength}\verb|{|\ci{unitlength}\verb|}{1.2cm}|
\end{lscommand}
%
Wartością domyślną \ci{unitlength} jest \texttt{1pt}. Pierwsza para,
$(x,y)$, to wymiary rezerwowanego wewnątrz dokumentu prostokątnego
obszaru na rysunek. Opcjonalna druga para, $(x_0,y_0)$, to
współrzędne przypisane dolnemu lewemu narożnikowi zarezerwowanego
prostokąta.

Większość poleceń rysujących ma jedną z dwóch postaci:
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\emph{obiekt}\verb|}|
\end{lscommand}
\noindent lub
\begin{lscommand}
  \ci{multiput}\verb|(|$x,y$\verb|)(|$\Delta x,\Delta y$\verb|){|$n$\verb|}{|\emph{object}\verb|}|\end{lscommand}
Wyjątkiem są krzywe B\'eziera, gdyż rysuje się je poleceniem
\begin{lscommand}
  \ci{qbezier}\verb|(|$x_1,y_1$\verb|)(|$x_2,y_2$\verb|)(|$x_3,y_3$\verb|)|
\end{lscommand}

\subsection{Odcinki}
\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}
Odciniki mogą być narysowane przy użyciu
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{line}\verb|(|$x_1,y_1$\verb|){|$length$\verb|}}|
\end{lscommand}
Polecenie \ci{line}ma dwa argumenty:
\begin{enumerate}
  \item wektor kierunkowy,
  \item długość.
\end{enumerate}
Jako składników wektora kierunku można użyć jedynie liczb
całkowitych:
\[
  -6,\,-5,\,\ldots,\,5,\,6,
\]
Muszą one na dodatek być liczbami względnie pierwszymi (jedynym ich
wspólnym dzielnikiem może być 1). Powyższy rysunek ilustruje
wszystkie możliwe wartości nachylenia w pierwszej ćwiartce
płaszczyzny. Długość jest podawana w jednostkach \ci{unitlength}.
Argument długości oznacza współrzędną pionową w wypadku odcinka
pionowego, zaś współrzędną poziomą we wszystkich pozostałych
przypadkach.

\subsection{Strzałki}

\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}
Strzałki rysuje się poleceniem
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{vector}\verb|(|$x_1,y_1$\verb|){|$length$\verb|}}|
\end{lscommand}
W wypadku strzałek na składniki wektora kierunku nałożone są
jeszcze większe ograniczenia niż dla odcinków, bo jedynymi
dopuszczalnymi liczbami całkowitymi są
\[
  -4,\,-3,\,\ldots,\,3,\,4.
\]
Wartości składników i tu muszą być liczbami względnie pierwszymi
(jedynym wspólnym dzielnikiem może być 1). Zauważ efekt działania
polecenia \ci{thicklines} na dwie strzałki skierowane w stronę lewego
górnego narożnika.

\subsection{Okręgi}

\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}
Polecenie
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{circle}\verb|{|\emph{średnica}\verb|}}|
\end{lscommand}
%
\noindent rysuje okrąg o środku $(x,y)$ i średnicy (nie promieniu)
równym \emph{średnica}. Otoczenie \ei{picture} dopuszcza średnice co
najwyżej rzędu 14\,mm, na dodatek nie wszystkie długości średnic są
dozwolone. Polecenie \ci{circle*} generuje koła (wypełnione okręgi).

Podobnie jak w wypadku odcinków, można się uciec do dodatkowych
pakietów, takich jak \pai{eepic} bądź \pai{pstricks}. Obszerny opis
tych pakietów można znaleźć w \graphicscompanion.

Otoczenie \ei{picture} oferuje jeszcze jedną opcję. Jeśli nie boisz
się wykonania niezbędnych obliczeń (być może nawet za pomocą
programu), to okręgi oraz elipsy możesz połatać z krzywych B\'eziera
drugiego stopnia. Przykłady oraz źródłowe pliki w Javie można znaleźć
w \graphicsinlatex.

\subsection{Tekst i wzory}

\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.7,0.3){$A$}
  \put(4.05,1.9){$B$}
  \put(1.7,2.95){$C$}
  \put(3.1,2.5){$a$}
  \put(1.3,1.7){$b$}
  \put(2.5,1.05){$c$}
  \put(0.3,4){$F=
    \sqrt{s(s-a)(s-b)(s-c)}$}
  \put(3.5,0.4){$\displaystyle
    s:=\frac{a+b+c}{2}$}
\end{picture}
\end{example}
Jak widać w powyższym przykładzie, tekst oraz wzory można łatwo
wprowadzać do otoczenia \ei{picture} poleceniem \ci{put}.

\subsection{\ci{multiput} i \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}
Polecenie
\begin{lscommand}
  \ci{multiput}\verb|(|$x,y$\verb|)(|$\Delta x,\Delta y$\verb|){|$n$\verb|}{|\emph{object}\verb|}|
\end{lscommand}
%
\noindent ma cztery argumenty: punkt początkowy, wektor przesunięcia
z jednego obiektu do kolejnego, liczbę obiektów oraz obiekt do
narysowania. Instrukcja \ci{linethickness} odnosi się do odcinków
poziomych oraz pionowych, jednakże nie do odcinków ukośnych ani nie
do okręgów. Stosuje się ona jednak do krzywych B\'eziera drugiego
stopnia!

\subsection{Owale}

\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}
Polecenie
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{oval}\verb|(|$w,h$\verb|)}|
\end{lscommand}
\noindent lub
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{oval}\verb|(|$w,h$\verb|)[|\emph{pozycja}\verb|]}|
\end{lscommand}
%
\noindent generuje owal o środku $(x,y)$, szerokości $w$ i wysokości
$h$. Opcjonalne argumenty \emph{pozycji}: \texttt{b}, \texttt{t},
\texttt{l} i \texttt{r} oznaczają odpowiednio: ,,top'' (góra),
,,bottom'' (dół), ,,left'' (lewo) i ,,right'' (prawo). Jak pokazuje
przykład, można także używać ich kombinacji.

Grubością linii można sterować na dwa sposoby: z jednej strony przy
użyciu\\ \ci{linethickness}\verb|{|\emph{długość}\verb|}|, z drugiej
za pomocą \ci{thinlines} i \ci{thicklines}. O ile pierwszy ze
sposobów odnosi się jedynie do linii poziomych oraz pionowych, a
także do krzywych B\'eziera drugiego stopnia, o tyle \ci{thinlines} i
\ci{thicklines} stosują się do odcinków ukośnych, jak też do okręgów
i owali.

\subsection{Wielokrotne użycie pudełek z rysunkami}

\begin{example}
\setlength{\unitlength}{0.5mm}
\begin{picture}(120,168)
\newsavebox{\foldera}
\savebox{\foldera}
  (40,32)[bl]{% definition
  \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{\folderb}
\savebox{\folderb}
  (40,32)[l]{%      definition
  \put(0,14){\line(1,0){8}}
  \put(8,0){\usebox{\foldera}}
}
\put(34,26){\line(0,1){102}}
\put(14,128){\usebox{\foldera}}
\multiput(34,86)(0,-37){3}
  {\usebox{\folderb}}
\end{picture}
\end{example}
Pudełko rysunku można \emph{zadeklarować} instrukcją
\begin{lscommand}
  \ci{newsavebox}\verb|{|\emph{nazwa}\verb|}|
\end{lscommand}
\noindent następnie \emph{zdefiniować} poleceniem
\begin{lscommand}
  \ci{savebox}\verb|{|\emph{nazwa}\verb|}(|\emph{szerokość,wysokość}\verb|)[|\emph{pozycja}\verb|]{|\emph{zawartość}\verb|}|
\end{lscommand}
\noindent i ostatecznie dowolnie często \emph{rysować}, wywołując
\begin{lscommand}
  \ci{put}\verb|(|$x,y$\verb|){|\ci{usebox}\verb|{|\emph{nazwa}\verb|}}|
\end{lscommand}

Opcjonalny parametr \emph{pozycja} definiuje ,,punkt zaczepienia''
zachowywanego pudełka (savebox). W przykładzie nadano mu wartość
\texttt{bl}, co oznacza umieszczenie punktu zaczepienia w dolnym
lewym narożniku pudełka. Pozycje można też oznaczać literami
\texttt{t} (góra) i \texttt{r} (prawo).

Argument \emph{nazwa} odnosi się do \LaTeX{}owego magazynu poleceń i
dlatego ma naturę instrukcji (co w powyższym przykładzie objawia się
choćby użyciem znaków '\verb+\+'). Rysunki przechowywane w pudełkach
można zagnieżdżać. W powyższym przykładzie wewnątrz definicji
\ci{folderb} użyto \ci{foldera}.

Trzeba było użyć polecenia \ci{oval}, ponieważ instrukcja \ci{line}
nie działa, gdy długość odcinka wynosi mniej niż około 3\,mm.

\subsection{Krzywe B\'eziera drugiego stopnia}

\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}
Jak widać w przykładzie, podzielenie okręgu na cztery krzywe
B\'eziera drugiego stopnia nie daje zadowalającego efektu; lepsze
przybliżenie dałoby osiem. Przykład ponownie ilustruje wpływ
instrukcji \ci{linethickness} na linie poziome i pionowe oraz poleceń
\ci{thinlines} i \ci{thicklines} na odcinki pochyłe. Pokazuje on
również, że oba te rodzaje poleceń oddziałują na krzywe B\'eziera i
że kolejne użycie któregokolwiek z nich przesłania poprzednie.

Niech symbole $P_1=(x_1,\,y_1),\,P_2=(x_2,\,y_2)$ oznaczają punkty
końcowe, zaś $m_1,\,m_2$ -- odpowiednie nachylenia krzywej B\'eziera
drugiego stopnia. Pośredni punkt kontrolny $S=(x,\,y)$ jest zatem
opisany równaniami
\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 W \graphicsinlatex\ można znaleźć program w Javie, który
generuje odpowiednią linię polecenia \ci{qbezier}.

\subsection{Krzywe łańcuchowe}

\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}

Każdą z symetrycznych połówek wykresu cosinusa hiperbolicznego
$y=\cosh x -1$ przybliżono na rysunku krzywą B\'eziera. Prawa połówka
krzywej kończy się w punkcie \((2,\,2.7622)\), w którym nachylenie ma
wartość \(m=3.6269\). Używając ponownie równania
(\ref{zwischenpunkt}), możemy wyliczyć pośrednie punkty kontrolne.
Okazuje się, że są to: $(1.2384,\,0)$ i $(-1.2384,\,0)$. Krzyżykami
została zaznaczona ,,prawdziwa'' krzywa. Błąd jest ledwie zauważalny,
bo wynosi mniej niż jeden procent.

Ten przykład ilustruje również użycie opcjonalnego argumentu
otoczenia \verb|\begin{picture}|. Rysunek zdefiniowano w~terminach
wygodnych współrzędnych ,,matematycznych", podczas gdy poleceniem:
\begin{lscommand}
  \ci{begin}\verb|{picture}(4.3,3.6)(-2.5,-0.25)|
\end{lscommand}
\noindent jego lewemu dolnemu narożnikowi (oznaczonemu czarnym
kółeczkiem) przypisano współrzędne $(-2.5,-0.25)$.

\subsection{Prędkość w Szczególnej Teorii Względności}

\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}
Punkty kontrolne dwóch krzywych B\'eziera wyliczono ze wzorów
(\ref{zwischenpunkt}). Gałąź dodatnia jest określona wartościami
$P_1=(0,\,0),\,m_1=1$ oraz $P_2=(2,\,\tanh 2),\,m_2=1/\cosh^2 2$.
I~znowu rysunek wyrażono w~wygodnych matematycznie współrzędnych,
a~lewemu dolnemu narożnikowi przypisano współrzędne $(-3,-2)$ (czarne
kółeczko).

\section{Pakiety PGF i TikZ}
\label{sec:tikz}

W dzisiejszych czasach systemy wyjściowe \LaTeX{}a są w stanie
stworzyć przyjemną grafikę wektorową, jednak interfejsy do tego są
bardzo zróżnicowane. Pakiet \pai{pgf} dostarcza abstrakcyjną warstwę
ponad tymi interfejsami. Pakiet \pai{pgf} ma swój własny sporej
wielkości podręcznik \cite{pgfplot}. Poruszymy tutaj jedynie
powierzchowne polecenia z tego pakietu w tej sekcji.

Pakiet \pai{pgf} posiada swój własny język wysokiego poziomu
dostarczane przez pakiet \pai{tikz}. TikZ udostępnia bardzo wydajne
polecenia do rysowania grafik prosto z twojego dokumentu. Użyj
otoczenia \ei{tikzpicture} aby wstawiać polecenia TikZ.

Jak wspomniano powyżej istnieje świetny podręcznik dla pakietu
\pai{pgf} i powiązanych pakietów. Zamiast dokładnie opisywać jak on
działa pokażemy tylko kila przykładów by zaprezentować możliwości
tego narzędzia.

Na początek bezsensowny diagram.
\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}
Zwróć uwagę na średnik (\texttt{;}). Oddziela on od siebie polecenia.

Prosty diagram Venna.
\begin{example}
\begin{tikzpicture}
  \node[circle,draw,
        minimum size=3cm,
        label=120:{economics}]
         at (0,0) {};
  \node[circle,draw,
        minimum size=3cm,
        label=60:{psychology}]
         at (1,0) {};
  \node (i) at (0.5,-1) {};
  \node at (0.6,-2.5)
    {behavioral economics}
    edge[->,thick,
         out=60,in=-60] (i);
\end{tikzpicture}
\end{example}

Zwróć uwagę na pętle foreach w następnym przykładzie.
\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}

Przy użyciu polecenia \ci{usetikzlibrary} w preambule możemy włączyć
dodatkowe funkcje do rysowania specjalnych kształtów, jak na przykład
poniższe pudełko, które jest lekko wygięte.
\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}

Możesz nawet rysować diagramy składni, które wyglądają jakby zostały
wyrwane prosto z książki o programowaniu w Pascalu. Kod jest nieco
trudniejszy niż przykłady powyżej, więc zaprezentujemy tylko wynik
końcowy. Jeśli zerkniesz to dokumentacji \pai{pgf} znajdziesz tam
szczegółowy poradnik rysowania tego dokładnie diagramu.

\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=4mm] {
      % First row:
                                &                                     &                        &                             &                                               &                  &                         &  &  &  &  & \node (plus) [terminal] {+}; \\
      % Second row:
      \node (p1) [point] {};    & \node (ui1) [nonterminal] {unsigned
                                    integer}; & \node (p2) [point] {}; & \node (dot) [terminal] {.}; &
      \node (p3) [point] {};    & \node (digit) [terminal] {digit};   & \node
                                                                        (p4) [point] {};       & \node (p5) [point] {};      & \node (p6) [point] {};                        &
      \node (e) [terminal] {E}; & \node (p7) [point] {};              &                        & \node (p8)
                                                                                                 [point] {};                 & \node (ui2) [nonterminal] {unsigned integer}; & \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}

Jest tego o wiele więcej. Jeśli musisz narysować wykres danych
numerycznych lub funkcji, to przyjrzyj się pakietowi \pai{pgfplot}.
Zapewnia on wszystko czego potrzeba do rysowania wykresów. Potrafi on
nawet uruchomić zewnętrzny program \texttt{gnuplot} by wyliczyć
faktyczne funkcje, które wpisano w wykres.

Więcej informacji możesz znaleźć na znakomitej stronie
\url{http://www.texample.net/tikz/} autorstwa Kjell Magne Fauske.
Zawiera ona wciąż rozszerzającą się kolekcję pięknych wykresów i
innego kodu \LaTeX{}a. Na \TeX{}ample.net znajdziesz również
\href{http://www.texample.net/tikz/resources/#tools-that-generate-pgftikz-code}{listę
  narzędzi do pracy z PGF/TikZ} dzięki którym unikniesz pisania całego
tego kodu ręcznie.

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