% -- translate-file=il2-pl -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\setcounter{chapter}{4} \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} Otoczenie \ei{picture} pozwala programować rysunki bezpośrednio w~{\LaTeX}u. Szczegółowy jego opis można znaleźć w~\manual. Metoda ta ma jednak ograniczenia, które wynikają z~tego, że zarówno nachylenia odcinków, jak i~średnice okręgów można wybierać jedynie spośród niewielkiej liczby wartości. Z~drugiej strony w~wersji \LaTeXe{} można w~otoczeniu \ei{picture} używać polecenia \ci{qbezier}, gdzie ,,\texttt{q}'' oznacza drugiego stopnia \przypang{quadratic}. Wiele często używanych krzywych, jak: okręgi, elipsy albo krzywe łańcuchowe można -- niekiedy z~odrobiną wysiłku matematycznego -- zadowalająco przybliżać krzywymi B\'eziera\footnote{W~ciekawym artykule \cite{jacko-bezier} B.L.~Jackowski\index{Jackowski Bogusław} zwraca uwagę, że krzywe B\'eziera są krzywymi giętymi stopnia trzeciego, nie zaś -- jak sugeruje nazewnictwo {\LaTeX}owe -- stopnia drugiego.}. Jeśli na dodatek do generowania {\LaTeX}owych bloków \ci{qbezier} użyje się języka programowania, na przykład Javy, to otoczenie \ei{picture} ujawni całkiem pokaźną moc. 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 wynikowe pliki \acro{PDF} lub \acro{DVI} -- a~na dodatek nie trzeba do nich wczytywać dodatkowych plików graficznych. Pakiety takie jak: \pai{epic} i \pai{eepic} (opisane na przykład w~\companion) bądź \pai{pstricks} pomagają pokonywać ograniczenia krępujące oryginalne otoczenie \ei{picture} i~znacznie rozszerzają graficzną moc {\LaTeX}a. O~ile pierwsze dwa z~tych pakietów jedynie rozszerzają otoczenie \ei{picture}, to pakiet \pai{pstricks} zawiera własne otoczenie rysujące -- \ei{pspicture}. Moc pakietu \pai{pstricks} bierze się z~tego, że istotnie wykorzystuje on możliwości {\PSi}u. % zmiany głównie z powodu niewypełnienia strony:-) Na dodatek napisano wiele pakietów realizujących konkretne cele. Jednym z~nich jest \texorpdfstring{\Xy}{Xy}-pic, opisany na końcu tego rozdziału. Znaczną liczbę tych pakietów opisano w~\graphicscompanion{} (nie należy mylić z~\companion). Spośród narzędzi graficznych związanych z~{\LaTeX}em największe chyba możliwości posiada {\MP}, autorstwa Johna D.~Hobby\index{Hobby John D.}, będący wariantem programu {\MF}, którego autorem jest z~kolei Donald E.~Knuth\index{Knuth Donald E.}. {\MP} jest wyposażony w~solidny i~matematycznie wyrafinowany język programowania {\MF}a. Inaczej jednak niż {\MF}, który generuje mapy bitowe, {\MP} generuje pliki {\PSi}owe, które można importować do~{\LaTeX}a. Za wprowadzenie może posłużyć \hobby, a~za podręcznik -- \cite{ursoswald}. Dostępne jest także wprowadzenie do programu {\MP} w~języku polskim~\cite{metapost}\footnote{% Nie ma co ukrywać, że posługiwanie się {\MP}em wymaga posiadania przynajmniej minimum umiejętności programistycznych. Dla użytkowników którzy nie programują przydatny może być program MetaGraf, który jest okienkową nakładką do programu {\MP}, por.~\urlMetaGraf.}. %Obszerną dyskusję podejścia {\LaTeX}a i~\TeX{}a do grafiki (oraz fontów) Obszerne omówienie zagadnień związanych z~wykorzystaniem grafiki (oraz fontów) w~{\LaTeX}u i~\TeX{}u można znaleźć w~\hoenig. \section{Otoczenie \texttt{picture}} \secby{Urs Oswald}{osurs@bluewin.ch} \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{command} \cmd{begin}\verb|{picture}(|$x,y$\verb|)|\ldots\cmd{end}\verb|{picture}| \end{command} \noindent lub \begin{command} \cmd{begin}\verb|{picture}(|$x,y$\verb|)(|$x_0,y_0$\verb|)|\ldots\cmd{end}\verb|{picture}| \end{command} 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{command} \ci{setlength}\verb|{|\ci{unitlength}\verb|}{1.2cm}| \end{command} 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{command} \ci{put}\verb|(|$x,y$\verb|){|\emph{object}\verb|}| \end{command} \noindent lub \begin{command} \ci{multiput}\verb|(|$x,y$\verb|)(|$\Delta x,\Delta y$\verb|){|$n$\verb|}{|\emph{object}\verb|}|\end{command} \noindent Wyjątkiem są krzywe B\'eziera, gdyż rysuje się je poleceniem: \begin{command} \ci{qbezier}\verb|(|$x_1,y_1$\verb|)(|$x_2,y_2$\verb|)(|$x_3,y_3$\verb|)| \end{command} \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} Do rysowania odcinków służy polecenie: \begin{command} \ci{put}\verb|(|$x,y$\verb|){|\ci{line}\verb|(|$x_1,y_1$\verb|){|$length$\verb|}}| \end{command} \noindent Ma ono ma dwa argumenty: wektor kierunku i~długość. 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{command} \ci{put}\verb|(|$x,y$\verb|){|\ci{vector}\verb|(|$x_1,y_1$\verb|){|$length$\verb|}}| \end{command} \noindent 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 oraz \ci{thinlines} na strzałki w~stronę narożnika prawego górnego. \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{command} \ci{put}\verb|(|$x,y$\verb|){|\ci{circle}\verb|{|\emph{diam}\verb|}}| \end{command} \noindent rysuje okrąg o~środku $(x,y)$ i~średnicy (nie promieniu) równym \emph{diam}. 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 zł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.65,0.3){$A$} \put(4.05,1.9){$B$} \put(1.65,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{Polecenia \texorpdfstring{\cmd{multiput} i \cmd{linethickness}}{multiput i 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{command} \ci{multiput}\verb|(|$x,y$\verb|)(|$\Delta x,\Delta y$\verb|){|$n$\verb|}{|\emph{object}\verb|}| \end{command} \noindent ma cztery argumenty: punkt początkowy, wektor przesunięcia z~jednego obiektu do kolejnego, liczbę obiektów oraz rysowany obiekt. 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 również do krzywych B\'eziera drugiego stopnia. \subsection{Owale} \begingroup \typeout{*** Coś jest trochę za duże w tym Przykładzie ***} \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} \endgroup %% Polecenie: %% \begin{command} \ci{put}\verb|(|$x,y$\verb|){|\ci{oval}\verb|(|$w,h$\verb|)}| \end{command} \noindent jak też: \begin{command} \ci{put}\verb|(|$x,y$\verb|){|\ci{oval}\verb|(|$w,h$\verb|)[|\emph{pozycja}\verb|]}| \end{command} \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 poleceniem: \begin{command} \ci{linethickness}\verb|{|\emph{length}\verb|}| \end{command} \noindent 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{command} \ci{newsavebox}\verb|{|\emph{nazwa}\verb|}| \end{command} \noindent następnie \emph{zachować} poleceniem: \begin{command} \ci{savebox}\verb|{|\emph{nazwa}\verb|}(|\emph{szerokość,wysokość}\verb|)[|\emph{pozycja}\verb|]{|\emph{treść}\verb|}| \end{command} \noindent i~ostatecznie dowolnie często \emph{rysować}, wywołując: \begin{command} \ci{put}\verb|(|$x,y$\verb|)|\ci{usebox}\verb|{|\emph{nazwa}\verb|}| \end{command} 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} %% \noindent 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{array}{rcl} x & = & \displaystyle \frac{m_2 x_2-m_1x_1-(y_2-y_1)}{m_2-m_1}, \smallskip\\ y & = & y_i+m_i(x-x_i)\qquad (i=1,\,2). \end{array} \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} \noindent 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 też użycie opcjonalnego argumentu otoczenia \verb|\begin{picture}|. Rysunek zdefiniowano w~terminach wygodnych współrzędnych ,,matematycznych", podczas gdy poleceniem: \begin{command} \cmd{begin}\verb|{picture}(4.3,3.6)(-2.5,-0.25)| \end{command} \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{\texorpdfstring{\Xy}{Xy}-pic} \secby{Alberto Manuel Brand\~ao Sim\~oes}{albie@alfarrabio.di.uminho.pt} Pakiet \Xy-pic służy do rysowania grafów. Aby uzyskać dostęp do jego funkcji, umieszczamy w~preambule dokumentu wiersz: %% \begin{command} \verb|\usepackage[|\emph{opcje}\verb|]{xy}| \end{command} %% \noindent Parametr \emph{opcje} jest listą funkcji pakietu \Xy-pic, które mają zostać załadowane. Opcje te przydają się między innymi do szukania błędów w~pakiecie. Zaleca się przekazywać opcję \popti{all}, nakazującą {\LaTeX}owi załadować wszystkie polecenia pakietu. \looseness-3 Graf rysuje się w~\Xy-pic na płótnie o~strukturze macierzy, a~każdy element grafu jest umieszczony w~komórce tej macierzy: \begin{example} \begin{displaymath} \xymatrix{A & B \\ C & D } \end{displaymath} \end{example} \noindent Polecenia \ci{xymatrix} można użyć jedynie w~trybie matematycznym. Powyżej zadano dwa wiersze i~dwie kolumny. Aby przekształcić tę macierz w~graf, posługujemy się dodającym strzałki poleceniem \ci{ar}\footnote{Pakiety \Xy-pic oraz \pai{polski} są w~konflikcie, bo oba definiują polecenie~\ci{ar}. Jeżeli polecenie \ci{ar} ma działać tak, jak zdefiniowano to w~pakiecie \Xy-pic, to trzeba \pai{xy} dołączyć po pakiecie \pai{polski}. Oczywiście nie ma wtedy dostępu do polecenia \ci{ar} z~pakietu \pai{polski}.}: \begin{example} \begin{displaymath} \xymatrix{ A \ar[r] & B \ar[d] \\ D \ar[u] & C \ar[l] } \end{displaymath} \end{example} \noindent Polecenie \ci{ar} umieszczamy w~komórce, w~której strzałka ma się zaczynać. Argument oznacza kierunek strzałki (\texttt{u} -- góra, \texttt{d} -- dół, \texttt{r} -- prawo i~\texttt{l} -- lewo): \begin{example} \begin{displaymath} \xymatrix{ A \ar[d] \ar[dr] \ar[r] & B \\ D & C } \end{displaymath} \end{example} Aby uzyskać przekątne, używamy po prostu więcej niż jednego kierunku. Powtarzając kierunek, wydłużamy w~istocie strzałkę: \begin{example} \begin{displaymath} \xymatrix{ A \ar[d] \ar[dr] \ar[drr] & & \\ B & C & D } \end{displaymath} \end{example} Uzupełniając strzałki o~etykiety, możemy uzyskać jeszcze ciekawsze grafy. Używamy do tego zwyczajnych operatorów indeksów górnych i~dolnych: \begin{example} \begin{displaymath} \xymatrix{ A \ar[r]^f \ar[d]_g & B \ar[d]^{g'} \\ D \ar[r]_{f'} & C } \end{displaymath} \end{example} Jak widać, operatorów tych używa się tak samo jak w~trybie matematycznym. Jedyną różnicą jest to, że indeks górny oznacza \emph{nad}, zaś dolny -- \emph{pod} strzałką. Istnieje jeszcze trzeci operator -- pionowej kreski \verb+|+. Umieszcza on tekst \emph{na} strzałce: \begin{example} \begin{displaymath} \xymatrix{ A \ar[r]|f \ar[d]|g & B \ar[d]|{g'} \\ D \ar[r]|{f'} & C } \end{displaymath} \end{example} Aby narysować strzałkę z~dziurką w~środku, możemy użyć polecenia \verb!\ar[...]|\hole!. W~niektórych sytuacjach trzeba używać różnych typów strzałek. Można je w~tym celu oznaczać różnymi etykietami bądź nadawać im różny wygląd: \begingroup %% zmniejsz odstęp między wierszami do 1,5pc (domyśnie 2,0pc) %% w macierzy \xymatrix, bo nie wchodzi na stronę: \xymatrixrowsep{1.5pc} %\shorthandoff{"} %% było poniżej \begin{example}, ale po co ? --tp -- \begin{example} \begin{displaymath} \xymatrix{ \bullet\ar@{->}[rr] && \bullet\\ \bullet\ar@{.<}[rr] && \bullet\\ \bullet\ar@{~)}[rr] && \bullet\\ \bullet\ar@{=(}[rr] && \bullet\\ \bullet\ar@{~/}[rr] && \bullet\\ \bullet\ar@{^{(}->}[rr] && \bullet\\ \bullet\ar@2{->}[rr] && \bullet\\ \bullet\ar@3{->}[rr] && \bullet\\ \bullet\ar@{=+}[rr] && \bullet } \end{displaymath} \end{example} %\shorthandon{"} %% było nad \end{example} ale nie wiadomo po co? --tp-- \endgroup Zauważ różnicę między następującymi dwoma grafami: \begin{example} \begin{displaymath} \xymatrix{ \bullet \ar[r] \ar@{.>}[r] & \bullet } \end{displaymath} \end{example} \begin{example} \begin{displaymath} \xymatrix{ \bullet \ar@/^/[r] \ar@/_/@{.>}[r] & \bullet } \end{displaymath} \end{example} %% %%\texttt{\meaning\ar} \noindent Symbole między ukośnikami określają tu sposób rysowania krzywych. Pakiet \Xy-pic oferuje wiele metod wpływania na sposób rysowania krzywych. Więcej na ten temat można przeczytać w~dokumentacji pakietu~\cite{xy-pic}. \endinput %%% Local Variables: %%% mode: latex %%% TeX-master: "lshort2e" %%% coding: latin-2 %%% case-fold-search: nil %%% LocalWords: Jackowski %%% ispell-local-dictionary: "polish" %%% End: