% -- translate-file=il2-pl -- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Contents: Customising LaTeX output (LShort2e Introduction) % File: custom.tex (Polish translation) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Adaptowanie {\LaTeX}a \label{chp:adapt}} \begin{intro} Dokumenty składane za pomocą poznanych do tej pory poleceń będą się zapewne podobały zdecydowanej większości czytelników. Chociaż ich wygląd nie będzie może wyrafinowany, z~pewnością jednak spełnią one podstawowe zasady składu, dzięki czemu będzie się je czytało łatwo i~przyjemnie. W~niektórych wypadkach może się jednak okazać, że brakuje polecenia czy otoczenia, za pomocą którego moglibyśmy złożyć dany fragment tekstu w~sposób odpowiadający potrzebom, albo też że sposób działania dostępnej w~{\LaTeX}u instrukcji nie spełnia naszych wymagań. W~tym rozdziale przedstawimy, jak nauczyć {\LaTeX}a formatować dokumenty tak, aby wyglądały inaczej niż w~wypadku korzystania jedynie ze standardowych klas i~pakietów. \end{intro} \section{Definiowane instrukcji i~otoczeń} Czytelnicy zauważyli zapewne, że nowo wprowadzane w~tej książce polecenia ukazują się w~ramkach oraz że znajdują się one w~skorowidzu. Aby to osiągnąć, nie korzystaliśmy za każdym razem z~wbudowanych w~{\LaTeX}a instrukcji, lecz utworzyliśmy własny pakiet, w~którym zawarliśmy nowe, potrzebne nam polecenia i~otoczenia. Dysponując takim pakietem, wystarczy po prostu napisać: % \begin{example} \begin{command} \ci{polecenie} \end{command} \end{example} \noindent W~tym przykładzie użyliśmy zarówno nowego otoczenia o~nazwie \verb+command+, odpowiedzialnego za rysowanie ramek dookoła instrukcji, jak też nowego polecenia \verb+\ci+, służącego do składu nazw poleceń i~wprowadzania ich do skorowidza. Proponujemy Czytelnikom odszukanie hasła \verb+\polecenie+ w~skorowidzu; przy haśle powinny być podane numery stron, na których ta instrukcja występuje w~książce. Gdy zdecydujemy się zaprzestać otaczać polecenia ramkami, to do zmiany wyglądu wystarczy, że zmienimy definicję otoczenia \verb+command+. Jest to znacznie łatwiejsze od przebiegnięcia przez cały dokument w~celu wyłapania w~nim wszystkich standardowych poleceń \LaTeX{}, które służą do rysowania ramek wokół słów. %% We wstępie do tego opracowania wspomnieliśmy, że w~{\LaTeX}u możemy się skupić na logicznej strukturze dokumentów. Wskazane jest rozróżnić w~tekście źródłowym wszystkie elementy logiczne dokumentu, nawet jeżeli ich formatowanie jest identyczne. Nierzadko bowiem to, co dzisiaj formatujemy w~taki sam sposób, w~przyszłości możemy chcieć rozróżnić. Zwykło się na przykład składać adresy internetowe imitacją kroju maszynowego. Ponieważ w~adresach mogą wystąpić znaki specjalne {\LaTeX}a, to można by do tego celu stosować instrukcję \ci{verb}. Lepiej jednak użyć specjalnej instrukcji, np.~\ci{url}. W~dokumencie papierowym nie ma to znaczenia, znakowanie logiczne pozwala jednak przedstawić dokument zarówno w~formie drukowanej, jak i~hipertekstowej, w~formacie \acro{HTML} lub \acro{PDF}. %% \subsection{Instrukcje definiowane przez użytkownika} Do definiowania potrzebnych nam nowych poleceń możemy użyć instrukcji: % \begin{command} \ci{newcommand}\verb|{|% \emph{nazwa}\verb|}[|\emph{num}\verb|]{|\emph{tekst}\verb|}| \end{command} % \noindent Wymaga ona podania dwóch argumentów. Pierwszy z~nich, \emph{nazwa}, oznacza nazwę nowej instrukcji, natomiast \emph{tekst} to jej znaczenie, czyli tekst, który ma zostać wstawiony do składu w~momencie wykonania instrukcji. Podawany w~nawiasach kwadratowych argument \emph{num} powinien być cyfrą od~1 do~9, określającą liczbę (obowiązkowych) argumentów instrukcji. Argument \emph{num} jest opcjonalny, a~jego pominięcie oznacza, że definiowana instrukcja jest bezargumentowa. %% W~części \emph{tekst} wolno używać zarówno standardowych instrukcji {\LaTeX}a, jak też zdefiniowanych przez użytkownika. Nie wolno jednak korzystać z~tych instrukcji, które same definiują inne polecenia, jak \ci{newcommand}, \ci{newenvironment} itp. Niedozwolona jest rekursja, nie wolno też w~nazwach instrukcji umieszczać polskich liter diakrytycznych. %% Następujące przykłady pomogą lepiej zrozumieć zagadnienie. W~pierwszym z~nich definiujemy instrukcję o~nazwie \cmd{kwle}, mającą być skrótem dla słów ,,Krótkie wprowadzenie do systemu \LaTeXe''. Takie polecenie mogłoby się przydać, gdyby tytuł książki miał w~niej występować wielokrotnie. % \begin{example} \newcommand{\kwle}{Krótkie wprowadzenie do systemu \LaTeXe} % następnie po \begin{document}: \kwle; \emph{\kwle} \end{example} % \noindent Następny przykład ilustruje sposób wykorzystania opcjonalnego argumentu \emph{num}. Znacznik \verb|#1| oznacza pierwszy parametr formalny (\verb|#2| oznaczałby drugi, \verb|#3| -- trzeci itd.). W~trakcie wykonywania treści instrukcji w~miejsce parametrów formalnych \TeX{} wstawia argumenty podane w~jej wywołaniu (parametry aktualne). Instrukcja w~poniższym przykładzie ma jeden parametr: % \begin{example} \newcommand{\wle}[1] {\emph{#1} wprowadzenie do systemu \LaTeXe} % następnie po \begin{document}: \wle{Krótkie}; \wle{Długie} \end{example} % \noindent {\LaTeX} nie pozwala zdefiniować instrukcji nazwanej tak samo jak wcześniej zdefiniowane polecenie. W~wypadku gdy chcemy zmienić znaczenie już istniejącej instrukcji, powinniśmy użyć polecenia \ci{renewcommand}. Za wyjątkiem nazwy ma ono składnię identyczną jak \verb|\newcommand|. Czasami może się też przydać polecenie \ci{providecommand}. Działa ono jak \verb|\newcommand|, z~tym że jeśli istnieje już komenda o~takiej samej nazwie, to nie zastępuje ono starej, zwyczajnie ignorując nową. Nieco uwagi należy poświęcić temu, jaki skutek ma umieszczenie odstępu po komendzie \LaTeX{}a. Informacje na ten temat można znaleźć na stronie \pageref{whitespace}. \subsection{Otoczenia definiowane przez użytkownika } Odpowiednikiem definiującej nowe polecenie instrukcji \verb|\newcommand| jest dla otoczeń instrukcja \verb|\newenvironment|. Ma ona następującą składnię: % \begin{command} \ci{newenvironment}\verb|{|% \emph{nazwa}\verb|}[|\emph{num}\verb|]{|% \emph{początek}\verb|}{|\emph{koniec}\verb|}| \end{command} % \noindent Podobnie jak w~wypadku \verb|\newcommand|, można instrukcji \ci{newenvironment} użyć z~argumentem opcjonalnym albo bez niego. {\LaTeX} wstawia tekst \emph{początek}, gdy w~dokumencie napotyka napis \verb+\begin{+\emph{nazwa}\verb+}+, a~zawartość argumentu \emph{koniec} -- po napotkaniu napisu \verb|\end{|\emph{nazwa}\verb|}|. Poniższy przykład ilustruje sposób użycia instrukcji \ci{newenvironment}. % \begin{example} \newenvironment{zrodlo} {Źródło: }{\par} % następnie po \begin{document}: \begin{zrodlo} Rocznik Statystyczny GUS. \end{zrodlo} \end{example} % \noindent Znaczenie argumentu \emph{num} jest takie samo jak w~instrukcji \verb|\newcommand|. {\LaTeX} nie pozwala zdefiniować otoczenia o~już istniejącej nazwie. W~razie potrzeby zastąpienia już istniejącego otoczenia powinniśmy użyć polecenia \ci{renewenvironment}, o~składni takiej samej jak \ci{newenvironment}. % to jest zbędne [tp]: % Polecenia użyte w~powyższym przykładzie są objaśniane dalej. O~poleceniu % \ci{rule} można przeczytać na stronie \pageref{sec:rule}, o~\ci{stretch} % -- na stronie \pageref{cmd:stretch}, a~informacje na temat \ci{hspace} % można znaleźć na stronie \pageref{sec:hspace}. \subsection{Nadmiarowe odstępy} Gdy tworzymy nowe otoczenie, problemem mogą być zbędne %, niechciane przez nas %% źle się łamie strona odstępy, które {\LaTeX} wstawia do składu. Rozważmy przykład otoczenia, które ma się rozpoczynać od akapitu bez wcięcia, ponadto pierwszy akapit po otoczeniu także nie ma mieć wcięcia. Polecenie \ci{ignorespaces}, umieszczone jako ostatnie polecenie bloku \emph{begin\/} otoczenia, spowoduje zignorowanie wszystkich %znaków odstępów występujących przed pierwszym akapitem otoczenia. Usunięcie drugiego wcięcia przez umieszczenie w~bloku końcowym \ci{ignorespaces} jest niemożliwe, gdyż zawsze ostatnim poleceniem będzie \verb@\end{otoczenie}@, które anuluje działanie \ci{ignorespaces}. W~takiej sytuacji trzeba skorzystać z~polecenia \ci{ignorespacesafterend}. Napotkawszy je, {\LaTeX} wstawi \ci{ignorespaces} dopiero po wykonaniu zamykającego \verb|\end{otoczenie}|. %% \begin{example} \newenvironment{proste}% {\noindent}% {\par\noindent} \begin{proste} Zobacz odstęp\\z~lewej strony. \end{proste} Tak samo\\tutaj. \end{example} \begin{example} \newenvironment{poprawne}% {\noindent\ignorespaces}% {\par\noindent% \ignorespacesafterend} \begin{poprawne} Bez odstępu\\z lewej strony. \end{poprawne} Tak samo\\tutaj. \end{example} % Poniższe jest zupełnie niepotrzebne [tp]: % \subsection{Wywoływanie \LaTeX{}a w~linii rozkazowej} % Użytkownicy systemów operacyjnych typu Unix do obsługi projektów % \LaTeX{}owych stosują zapewne pliki Makefile. W~tym kontekście % ciekawa byłaby możliwość tworzenia różnych wersji tego samego dokumentu % metodą podawaniu różnych parametrów w~linii rozkazowej % wołającej \LaTeX{}a. Możemy to ułatwić, umieszczając w~dokumencie % coś takiego: % \begin{verbatim} % \usepackage{ifthen} % \ifthenelse{\equal{\blackandwhite}{true}}{ % % coś robimy w~trybie "czarno--białym" % }{ % % robimy coś innego w~trybie "kolorowym" % } % \end{verbatim} % Możemy teraz wywołać \LaTeX{}a w~następujący sposób: % \begin{verbatim} % latex '\newcommand{\blackandwhite}{true}\input{test.tex}' % \end{verbatim} % Polecenie \verb|\blackandwhite| zostaje zdefiniowane jeszcze przed % odczytem pliku źródłowego. Zmieniając \verb|\blackandwhite| na % \ci{false} spowodujemy generowanie kolorowej wersji dokumentu. \subsection{Własne pakiety} W~wypadku definiowania wielu nowych poleceń i~otoczeń preambuła dokumentu może się znacznie wydłużyć. Dobrze w~takiej sytuacji stworzyć pakiet zawierający definicje tych instrukcji i~otoczeń. Taki pakiet można później dołączyć do dokumentu poleceniem \ci{usepackage}. \begin{figure}[!htbp] \begin{lined}{\textwidth} \begin{verbatim} % Przykładowy pakiet *** \ProvidesPackage{demopack} \newcommand{\kwle}{Krótkie wprowadzenie do systemu \LaTeXe} \newcommand{\wle}[1]{\emph{#1} wprowadzenie do systemu \LaTeXe} \newenvironment{zrodlo}{Źródło: }{\par} \end{verbatim} \end{lined} \caption{Przykładowy pakiet\label{package} } \end{figure} \noindent Tworzenie pakietu polega na skopiowaniu poleceń z~preambuły do oddzielnego pliku o~rozszerzeniu \eei{.sty}. Na początku pakietu należy wpisać polecenie: % \begin{command} \ci{ProvidesPackage}\verb|{|\emph{nazwa}\verb|}| \end{command} % \noindent Dzięki instrukcji \verb|\ProvidesPackage| {\LaTeX} poznaje nazwę pakietu, a~to pozwala mu na przykład ostrzec użytkownika w~wypadku powtórnego dołączenia pakietu do dokumentu. Rysunek~\ref{package} przedstawia niewielki pakiet z~instrukcjami z~powyższych przykładów. \section{Fonty} \subsection{Instrukcje przełączające stopień pisma } {\LaTeX} automatycznie %%dostosowuje dobiera krój, odmianę i~stopień pisma\footnote{% \emph{Pismo drukarskie\index{pismo!drukarskie}\/} to pismo utrwalone na nośniku, tj.~materiale, na którym umieszczono negatywy lub pozytywy znaków pisma. \emph{Krój pisma}\index{pismo!krój} to obraz pisma drukarskiego o~jednolitych cechach graficznych, niezależnych od stopnia i~odmiany pisma. Każdy krój pisma posiada swoją nazwę (na przykład Times New Roman, Computer Modern czy Garamond). \emph{Odmiana kroju}\index{pismo!odmiana} pisma różnicuje pisma jednego kroju ze względu na grubość, szerokość i~pochylenie. \emph{Stopień pisma}\index{pismo!stopień} określa z~kolei wielkość znaków. Zestawy metalowych \emph{czcionek}\index{czcionka|see{pismo drukarskie}}, czyli kawałków metalu, w~których utrwalano znaki pisma, drukarze przechowywali w~\emph{kasztach}\index{kaszta}. Angielską, a~właściwie amerykańską nazwą zestawu czcionek jednego kroju i~wielkości, powszechnie dziś używaną w~terminologii komputerowej, jest \emph{font}\index{font} (zobacz też~\cite{chwialowski}). Fonty {\LaTeX}a, takie jak \acro{PL}, \acro{EC} czy \acro{LM}, są optycznie identyczne, bo wszystkie są replikami kroju \emph{Computer Modern}, różnią się jednak od najczęściej używanego w~edytorach biurowych, takich jak {\MSWord}, kroju \emph{Times New Roman}. } %% do logicznego charakteru składanych dla różnych elementów dokumentu (tytułów rozdziałów, punktów, przypisów itp.). Czasami zachodzi jednak potrzeba ,,ręcznego'' przełączenia kroju bądź stopnia pisma. Można do tego użyć poleceń zestawionych w~tabelach~\ref{fonts} i~\ref{sizes}. Stopień pisma jest kwestią układu graficznego dokumentu i~zależy od wybranej klasy dokumentu oraz ustawienia odpowiednich opcji. W~tabeli~\ref{tab:ptsizes} zestawiono stopnie pisma w~jednostkach absolutnych dla poleceń zmieniających wielkość kroju w~standardowych klasach dokumentów. % \begin{example} {\small Nieliczni lecz \textbf{odważni} Rzymianie rządzili} {\Large wielką \textit{Italią}.} \end{example} % \noindent Bieżący font jest w~{\LaTeX}u scharakteryzowany przez pięć elementów: układ (zestaw znaków), krój (rodzinę), grubość i~szerokość, odmianę oraz stopień i~interlinię. Każdy z~nich można dobrać niezależnie od ustawienia pozostałych. Oznacza to na przykład, że zmiana stopnia pisma nie powoduje zmiany jego kroju ani odmiany. \begin{table}[!bth] \caption{Polecenia wyboru krojów i~odmian \label{fonts}} \begin{lined}{12.5cm} % % Alan suggested not to tell about the other form of the command % eg \verb|\sffamily| or \verb|\bfseries|. This seems a good thing to me. % \tabcolsep=.5\tabcolsep \begin{tabular}{@{}rl@{\quad}rl@{}} \ci{textrm}\verb|{...}| & \textrm{krój szeryfowy} & \ci{textsf}\verb|{...}| & \textsf{krój bezszeryfowy} \\ \ci{texttt}\verb|{...}| & \multicolumn{3}{l}{\texttt{grotesk}, tj. pismo o~jednakowej szerokości znaków} \\[6pt] \ci{textmd}\verb|{...}| & \textmd{pismo jasne} & \ci{textbf}\verb|{...}| & \textbf{pismo grube} \\[6pt] \ci{textup}\verb|{...}| & \textup{odmiana prosta} & \ci{textit}\verb|{...}| & \textit{kursywa} \\ \ci{textsl}\verb|{...}| & \textsl{odmiana pochyła}& \ci{textsc}\verb|{...}| & \textsc{kapitaliki} \\[6pt] \ci{emph}\verb|{...}| & \emph{wyróżnienie} \\ \ci{textnormal}\verb|{...}| & \multicolumn{2}{l}{główny font dokumentu} \end{tabular} \end{lined} \vspace{-2.0ex} \end{table} \begin{table}[!tbh] \caption{Polecenia jednoczesnego wyboru stopnia pisma i~interlinii\index{stopień pisma}\label{sizes} } \begin{lined}{12.5cm} \begin{tabular}{@{}ll} \ci{tiny} & \tiny mikroskopijny \\ \ci{scriptsize} & \scriptsize bardzo mały \\ \ci{footnotesize} & \footnotesize mniejszy \\ \ci{small} & \small mały \\ \ci{normalsize} & \normalsize normalny \\ \ci{large} & \large duży \end{tabular}% \qquad\begin{tabular}{ll@{}} \ci{Large} & \Large większy \\[5pt] \ci{LARGE} & \LARGE bardzo duży \\[5pt] \ci{huge} & \huge ogromny \\[5pt] \ci{Huge} & \Huge największy \end{tabular} \end{lined} \end{table} Przy okazji omawiania poleceń dotyczących fontów trzeba wspomnieć o~koncepcji \emph{grupowania}. Grupa\index{grupa} zaczyna się od znaku \verb+{+, a~kończy znakiem \verb+}+. Grupy służą do ograniczania zasięgu działania poleceń {\LaTeX}a. Przyjrzyjmy się następującemu przykładowi: % \begin{example} Lubię {\LARGE duże oraz {\small małe} litery} i~cyfry. \end{example} % %% Pierwszy nawias klamrowy rozpoczyna grupę, potem polecenie \verb+\LARGE+ zmienia stopień pisma na \emph{bardzo duży}, w~którym zostanie złożony napis ,,duże oraz''. Kolejny otwierający nawias klamrowy zaczyna następną grupę. W~jej obrębie polecenie \verb+\small+ zmienia stopień pisma na mały. Do złożenia w~tym stopniu przewidziano jedynie słowo ,,małe'', bo nawias \verb+}+ za tym słowem zamyka grupę. Po zamknięciu grupy następuje powrót do stopnia pisma aktualnego przed jej rozpoczęciem, czyli \verb+\LARGE+. W~nim zostanie złożone słowo ,,litery''. Zamknięcie tej grupy powoduje, że resztę tekstu {\LaTeX} złoży w~wyjściowym stopniu pisma. Jak widać, grupy można zagnieżdżać, nawet wielokrotnie. %% \noindent Polecenia zmieniające stopień pisma zmieniają także interlinię. Dzieje się tak jednak tylko wtedy, gdy \emph{przed} zamknięciem odpowiedniej grupy kończony jest akapit -- przez wstawienie pustego wiersza \emph{lub} polecenia \ci{par}. Zwróćmy uwagę na miejsce, w~którym umieszczono instrukcję \verb|\par| w~poniższych dwóch przykładach. % \begin{example} {\Large Zdanie, które ma więcej niż pięć słów, nie ma sensu!\par} \end{example} % \begin{example} {\Large Zdanie, które ma więcej niż pięć słów, nie ma sensu!}\par \end{example} % \noindent Jeśli zachodzi konieczność zmiany stopnia pisma dla całego akapitu lub jeszcze dłuższego tekstu, to możemy skorzystać ze składni przyjętej dla otoczeń: % \begin{example} \begin{Large} Zdanie, które ma więcej niż pięć słów, nie ma sensu! \end{Large} \end{example} % \noindent Zapis taki pozwala unikać łatwych do popełnienia błędów, wynikających z~opuszczania nawiasów otwierających lub zamykających grupy. % [RK] usuwam ten akapit jako nieobecny w oryginale, nieoznakowany % przez TP i w ogóle mało niosący informacji (powtarza to, co % w nagłówku tabeli. % Stopień pisma jest kwestią układu graficznego dokumentu i~zależy od % wybranej klasy dokumentu i~ustawienia odpowiednich opcji. % W~tabeli~\ref{tab:ptsizes} zestawiono stopnie pisma, wyrażone % w~jednostkach absolutnych, dla poleceń ustalających wielkość kroju % w~standardowych klasach dokumentów. \begin{table}[!tb] \caption{Wielkość stopnia pisma w~klasach standardowych\label{tab:ptsizes}} \label{tab:sizes} \begin{lined}{12.5cm} \tabcolsep=1.75em \begin{tabular}{lrrr} \multicolumn{1}{c}{\emph{Stopień}} & \multicolumn{1}{c}{\emph{10pt}} & \multicolumn{1}{c}{\emph{opcja 11pt}} & \multicolumn{1}{c}{\emph{opcja 12pt}} \\[4.5pt] \verb|\tiny| & 5pt & 6pt & 6pt \\ \verb|\scriptsize| & 7pt & 8pt & 8pt \\ \verb|\footnotesize| & 8pt & 9pt & 10pt \\ \verb|\small| & 9pt & 10pt & 11pt \\ \verb|\normalsize| & 10pt & 11pt & 12pt \\ \verb|\large| & 12pt & 12pt & 14pt \\ \verb|\Large| & 14pt & 14pt & 17pt \\ \verb|\LARGE| & 17pt & 17pt & 20pt \\ \verb|\huge| & 20pt & 20pt & 25pt \\ \verb|\Huge| & 25pt & 25pt & 25pt \end{tabular} \end{lined} \vspace{-2.0ex} \end{table} W~\emph{trybie matematycznym} w~celu złożenia fragmentu wzoru innym niż pochyłe krojem pisma można zastosować polecenia zestawione w~tabeli~\ref{mathfonts}. \begin{table}[!tb] \caption{Polecenia wyboru fontów w~trybie matematycznym\label{mathfonts} } \begin{lined}{\textwidth} \begin{tabular}{@{}lll@{}} \textit{Polecenie}&\textit{Przykład}& \textit{Wynik\strut}\\ \hline \ci{mathcal}\verb|{...}|& \verb|$\mathcal{B}=c$|& $\mathcal{B}=c$\\ \ci{mathrm}\verb|{...}|& \verb|$\mathrm{K}_2$|& $\mathrm{K}_2$\\ \ci{mathbf}\verb|{...}|& \verb|$\sum x=\mathbf{v}$|& $\sum x=\mathbf{v}$\\ \ci{mathsf}\verb|{...}|& \verb|$\mathsf{G\times R}$|& $\mathsf{G\times R}$\\ \ci{mathtt}\verb|{...}|& \verb|$\mathtt{L}(b,c)$|& $\mathtt{L}(b,c)$\\ \ci{mathnormal}\verb|{...}|& \verb|$\mathnormal{R_{19}}\neq R_{19}$|& $\mathnormal{R_{19}}\neq R_{19}$\\ \ci{mathit}\verb|{...}|& \verb|$\mathit{ffi}\neq ffi$|& $\mathit{ffi}\neq ffi$ \end{tabular} \end{lined} \end{table} \subsection{Uwaga, niebezpieczeństwo! } Jak zaznaczyliśmy na początku rozdziału, nie należy instrukcji zmiany fontu wstawiać \emph{explicite} do pliku źródłowego. Byłoby to niezgodne z~podstawową ideą {\LaTeX}a, jaką jest oddzielenie formy od treści dokumentu i~posługiwanie się formatowaniem logicznym, a~nie wizualnym. Jeżeli fragment tekstu ma zostać wyróżniony przez złożenie go innym krojem lub stopniem pisma, to należy zdefiniować odpowiednie polecenie i~potem właśnie jego używać w~treści dokumentu. % \begin{example} % w~preambule albo pakiecie \newcommand{\uwaga}[1]{\textbf{#1}} % po \begin{document} \uwaga{Baczność!} Przewody sieci trakcyjnej są pod napięciem. Dotknięcie grozi \uwaga{śmiercią}. \end{example} % \noindent Niewątpliwą zaletą tego podejścia jest to, że kiedy później będziemy chcieli wyróżnić wszystkie elementy, na które czytelnik powinien zwrócić \emph{szczególną uwagę}, w~sposób inny niż składając je pismem półgrubym, to nie musimy przeglądać całego pliku w~celu sprawdzenia, czy dane wystąpienie \ci{textbf} dotyczy tekstu, na który ma zostać zwrócona \emph{szczególna uwaga}, czy też wstawione zostało w~zupełnie innym celu. \medskip \noindent %% \EMPH{Na zakończenie rada z~gatunku estetycznych}: nie należy przesadzać ze stosowaniem wielu różnych krojów pisma w~jednym dokumencie. %% \subsection{Użycie alternatywnych krojów pisma} Większość dokumentów jest składanych w~{\LaTeX}u z~użyciem domyślnego kroju, będącego repliką \emph{Computer Modern}. Jeżeli wygląd znaków z~rodziny \acro{CM} nam się znuży, to możemy złożyć dokument innym krojem. Musimy jednak pamiętać, że na ogół alternatywne kroje nie są tak kompletne jak rodzina \emph{Computer Modern}, często na przykład brakuje w~nich kompletu symboli matematycznych, znaków z~alfabetów niełacińskich, takich jak greka lub alfabet cyrylicki, albo niektórych odmian, jak na przykład kapitalików. Z~drugiej strony krój \acro{CM} ma też wady: kreski znaków są cieńsze, a względna wysokość małych liter\footnote{Względna w~porównaniu do nominalnego stopnia pisma; wysokość ta wynosi dla kroju \acro{CM} 43\%, a dla kroju Palatino -- 46\%; dla dużych liter z~tych krojów jest to odpowiednio: 68,9\% i~68,5\%.} jest mniejsza niż w~wielu innych krojach. Te cechy kroju \acro{CM} powodują, że jest mniej czytelny w~wypadku, gdy jest reprodukowany na nośniku o~niskiej rozdzielczości, lub -- mówiąc wprost -- nie najlepiej się nadaje do dokumentów, które będą wyświetlane na ekranach komputerów, np.~dokumentów w~formacie \acro{PDF}. Pakiet~\pai{qtimes} umożliwia skład dokumentu w~kroju QTimes, który jest klonem znanego kroju Times New Roman autorstwa Stanleya Morisona\index{Morison Stanley}. Jeżeli dokument zawiera wzory matematyczne, to aby znaki w~formułach były optycznie zgodne z~otaczającym je tekstem, należy także dołączyć pakiety \pai{txfonts} oraz \pai{qtxmath}: %% \begin{code} \begin{verbatim} %& --translate-file=il2-pl \documentclass[a4paper]{article} \usepackage{polski} \usepackage{txfonts,qtimes,qtxmath} \usepackage{qswiss,qcourier} \usepackage{sfheaders} \author{Wanda Przechlewska} \title{Test pakietu txfonts} \begin{document} ... \end{verbatim} \end{code} %% Z~kolei pakiet~\pai{qpalatin} wraz z~pakietami \pai{qpxmath} oraz \pai{pxfonts} umożliwia skład dokumentu krojem QPalatino (łącznie ze wzorami matematycznymi), który jest klonem znanego kroju Palatino autorstwa Hermanna Zapfa\index{Zapf Hermann}: %% \begin{code} \begin{verbatim} %& --translate-file=il2-pl \documentclass[a4paper]{article} \usepackage{polski} \usepackage{pxfonts,qpalatin,qpxmath} \usepackage{qswiss,qcourier} \usepackage{sfheaders} \author{Maria Matysek} \title{Test pakietu qpxfonts} \begin{document} ... \end{verbatim} \end{code} %% W~powyższych przykładach dołączono także pakiety \pai{qswiss}, \pai{sfheaders} oraz \pai{qcourier}. Pakiet \pai{qswiss} przestawia domyślą odmianę bezszeryfową na krój Helvetica, a~\pai{sfheaders} przedefiniowuje śródtytuły tak, że składane są krojem bezszeryfowym. Z~kolei \pai{qcourier} zamienia domyślny krój o~stałej szerokości znaków na QCourier. W~rezultacie pierwszy z~dokumentów będzie podobny do typowego dokumentu składanego na przykład edytorem {\MSWord}; drugi z~kolei będzie się doskonale nadawał do dokumentu \acro{PDF}, który chcemy umieścić w~sieci \acro{WWW}, z~uwagi na to, że krój Palatino -- reprodukowany w~niskiej rozdzielczości -- jest dużo bardziej czytelny niż \acro{CM}, a nawet \emph{Times New Roman}. Uwaga: aby powyższe deklaracje zadziałały, instalacja {\LaTeX}a musi zawierać ww.~fonty\footnote{Wchodzą one w~skład współczesnych dystrybucji {\LaTeX}a. Jeżeli ich nie masz, to powinieneś je doinstalować. W~dokumentacji dystrybucji powinno być opisane, jak się to robi.}. \section{Odstępy } \subsection{Zmiana wielkości interlinii\index{interlinia} } % Odstęp %% Często wygodnie jest użyć odległości ,,elastycznej'', zostawiając {\LaTeX}owi nieco swobody doboru takiej odległości, jaką uzna za najlepszą z~punktu widzenia jakości składu. Taką elastyczną odległość zapisujemy następująco: \emph{n}~\verb+plus+~\emph{p} \verb+minus+~\emph{m}. Części ,,\verb+plus+~\emph{p}'' i~,,\verb+minus+~\emph{m}'' są opcjonalne (każdą z~nich można pominąć). Tego typu odległości mają naturalną wielkość \emph{n} i~mogą się kurczyć lub~rozciągać w~zakresie od $\emph{n} - \emph{m}$ do $\emph{n} + \emph{p}$. Omawiany wcześniej odstęp między akapitami (\verb+\parskip+) jest przykładem {\LaTeX}owego wymiaru o~zmiennej wielkości. Część wymiarów może mieć wartości zmienne, część jednak musi mieć wartość stałą. Powinno być na przykład zrozumiałe, że wcięcie akapitowe musi być wielkością stałą, podobnie jak szerokość i~wysokość łamu. %% Polecenie\label{cmd:stretch}: % \begin{command} \ci{stretch}\verb|{|\emph{n}\verb|}| \end{command} % \noindent wstawia specjalny rozciągliwy odstęp, który potrafi wypełnić całą wolną przestrzeń w~pionie lub w~poziomie. Jeżeli na przykład wstawimy w~wierszu dwa lub więcej poleceń \verb|\hspace{\stretch{|\emph{n}\verb|}}|, to odstępy dzięki nim uzyskane będą miały wielkość według proporcji zadanych przez argument~\emph{n}. W~poniższym przykładzie odstęp między~\emph{x\/} a~\emph{y\/}~jest trzy razy mniejszy od odstępu między~\emph{y\/}~a~\emph{z}. % \begin{example} x\hspace{\stretch{1}} y\hspace{\stretch{3}}z \end{example} % \noindent Wielkość odstępów towarzyszących tekstowi warto dostosować do aktualnego rozmiaru czcionki. Można do tego użyć względnych jednostek miary \texttt{em} oraz \texttt{ex}: % \begin{example} {\Large{}big\hspace{1em}y} \quad {\tiny{}tin\hspace{1em}y} \end{example} % \noindent \label{quad:def}%% Przypominamy, że polecenia \ci{quad} i~\ci{qquad} wstawiają odstęp poziomy o~szerokości, odpowiednio, 1\,em oraz 2\,em. \subsection{Odstępy pionowe} Odstępy pionowe między akapitami, rozdziałami, punktami itp. {\LaTeX} wstawia automatycznie. Jeśli zachodzi potrzeba wstawienia dodatkowego odstępu pionowego, to należy zastosować polecenie: % \begin{command} \ci{vspace}\verb|{|\emph{odległość}\verb|}| \end{command} % \noindent Polecenie to należy oddzielić pustymi liniami od otaczającego je tekstu. Jeżeli w~wyniku złamania strony odstęp taki znajdzie się na początku lub na końcu strony (będzie zaczynał lub też kończył kolumnę tekstu), to zostanie on usunięty. Jeżeli ma zostać wstawiony także na początku lub końcu strony, to należy użyć wersji ,,gwiazdkowej'' \ci{vspace*}\footnote{Zwróćmy uwagę, że w~takim wypadku wysokość kolumny tekstu na sąsiednich stronach nie będzie jednakowa, stosujmy zatem polecenie \ci{vspace*} z~pewną ostrożnością.}. Argument \emph{odległość} oznacza {\LaTeX}owy wymiar. Do rozmieszczania tekstu kolumny w~pionie można używać polecenia \ci{stretch}, łącznie z~\ci{pagebreak}. W~poniższym przykładzie tekst zostanie rozmieszczony tak, że odstęp u~dołu będzie dwa razy mniejszy od odstępu u~góry strony: % \begin{code} \begin{verbatim} \vspace{\stretch{1}} Tytuł i~autor \vspace{\stretch{2}}\pagebreak \end{verbatim} \end{code} % \noindent Dodatkowy odstęp między dwoma wierszami tego samego akapitu lub między wierszami tabeli możemy uzyskać poleceniem: % \begin{command} \ci{\bs}\verb|[|\emph{odległość}\verb|]| \end{command} \noindent %% Polecenia \ci{bigskip}, \ci{medskip} i~\ci{smallskip} wstawiają odpowiednio odstępy ,,elastyczne'' o~następujących wielkościach: 12pt $\pm$~4pt, 6pt $\pm$~2pt oraz 3pt $\pm$~1pt\footnote{Nie są to wielkości przypadkowe: 12~punktów to typowa odległość między liniami podstawowymi wierszy przy składzie pismem w~stopniu 10~punktów.}. \section{Układ graficzny strony} Wymiary papieru można podać jako argumenty instrukcji \verb+\documentclass+. Na podstawie zadeklarowanych wymiarów {\LaTeX} oblicza szerokość i~wysokość kolumny, marginesy i~inne parametry. Na rysunku~\ref{fig:layout} przedstawiono dostępne parametry graficznego układu strony. Do przygotowania rysunku użyliśmy pakietu \pai{layout} z~zestawu ,,tools''% \footnote{\CTAN{macros/latex/packages/tools}.}. Jeżeli obliczone przez {\LaTeX}a wartości są z~pewnych względów nieodpowiednie, to można je zmienić. \begin{figure}[!hp] \centering \makeatletter\@layout\makeatother %% \vspace*{1.8cm} \caption{Parametry układu graficznego strony \label{fig:layout}} \cih{footskip} \cih{headheight} \cih{headsep} \cih{marginparpush} \cih{marginparsep} \cih{marginparwidth} \cih{oddsidemargin} \cih{paperheight} \cih{paperwidth} \cih{textheight} \cih{textwidth} \cih{topmargin} \end{figure} Zanim jednak zaczniemy eksperymentować, zwiększając na przykład szerokość szpalty, chwilę pomyślmy. Jak dla większości rzeczy w~{\LaTeX}u, istnieją ważne powody, dlaczego szerokość szpalty jest taka a~nie inna. Z~pewnością w~porównaniu z~wydrukiem przygotowanym za pomocą świeżo kupionego programu {\MSWord} strona {\LaTeX}owa ma denerwująco wąską szpaltę. Ale spójrzmy na książkę z~renomowanego wydawnictwa i~policzmy na niej liczbę znaków w~przeciętnym wierszu. Okaże się, że wynosi ona około 66. Jeśli porównamy ją z~wydrukiem złożonym przez {\LaTeX}a, to zapewne i~tym razem będzie ona zbliżona do 66. Z~doświadczeń wynika bowiem, że w~miarę wzrostu liczby znaków w~wierszu czytanie staje się męczące. Dzieje się tak, gdyż przy długich wierszach naszym oczom trudniej jest przenosić wzrok z~końca jednego wiersza na początek następnego. Jest to jedna z~przyczyn stosowania składu wielołamowego w~gazetach i~czasopismach. Tak więc, jeśli zwiększamy szerokość kolumny, to pamiętajmy, że może to utrudnić odbiorcom czytanie naszej pracy. No, ale dość już kazań. Obiecaliśmy przecież wyjaśnić, jak można te rzeczy robić\dots W~{\LaTeX}u mamy dwie instrukcje do zmiany wielkości wymiarów, używane zazwyczaj w~obrębie preambuły dokumentu. Pierwsza z~nich \emph{nadaje} parametrowi określoną wielkość:% %% \begin{command} \ci{setlength}\verb|{|\emph{parametr}\verb|}{|\emph{wielkość}\verb|}| \par \end{command} %% \noindent Drugie polecenie \emph{zwiększa} wartość parametru o~określoną wielkość: \noindent \begin{command} \ci{addtolength}\verb|{|\emph{parametr}\verb|}{|\emph{wielkość}\verb|}| \end{command} % \noindent Z~tej pary częściej stosowana jest druga instrukcja, ponieważ pozwala zmieniać wymiary. Przykładowo, aby zwiększyć szerokość szpalty o~jeden centymetr, umieszczamy w~preambule dokumentu następujące polecenia: % \begin{code} \verb|\addtolength{\hoffset}{-0.5cm}|\\ \verb|\addtolength{\textwidth}{1cm}| \end{code} Zmianę parametrów układu graficznego strony ułatwia pakiet \pai{geometry}. W~wykonywaniu operacji arytmetycznych na wymiarach pomaga pakiet \pai{calc}. %% \section{Więcej o~odległościach} Kiedy to tylko możliwe, unikajmy stosowania wymiarów zdefiniowanych w~jednostkach absolutnych, takich jak punkty czy milimetry. Starajmy się raczej odnosić wymiary do już istniejących, takich jak wysokość czy szerokość kolumny. W~poniższym przykładzie szerokość rysunku jest definiowana jako połowa szerokości bieżącej szpalty: % \begin{code} \verb+\includegraphics[width=0.5\textwidth]{sowauszata.eps}+ \end{code} % \noindent Następujące trzy polecenia pozwalają określić szerokość, wysokość i~głębokość \emph{tekstu}: % \begin{command} \ci{settoheight}\verb|{|\emph{nazwa}\verb|}{|\emph{tekst}\verb|}|\\ \ci{settodepth}\verb|{|\emph{nazwa}\verb|}{|\emph{tekst}\verb|}|\\ \ci{settowidth}\verb|{|\emph{nazwa}\verb|}{|\emph{tekst}\verb|}| \end{command} % \noindent Oto przykład ilustrujący zastosowanie tych poleceń: % \begin{example} \newenvironment{vardesc}[1]{% \settowidth{\parindent}{#1:\ } \makebox[0pt][r]{#1:\ }}{} \begin{displaymath} a^2+b^2=c^2 \end{displaymath} \begin{vardesc}{gdzie}% $a$, $b$ -- przyprostokątne, \par $c$ -- przeciwprostokątna. \end{vardesc} \end{example} \section{Pudełka \label{sec:boxes}} Każdą stronę {\LaTeX} tworzy z~pudełek\index{pudełko}, które odpowiednio skleja. Elementarnymi pudełkami są litery, z~których sklejane są słowa. Słowa są następnie łączone w~wiersze, a~wiersze -- w~akapity. Do łączenia używany jest specjalny klej, który dzięki elastyczności pozwala wyrazy ścisnąć lub rozciągnąć tak, by dokładnie wypełniały wiersze na stronie. Trzeba przyznać, że takie ujęcie jest mocno uproszczoną wersją tego, co się naprawdę dzieje, chociaż zasadniczo biorąc, działanie {\TeX}a można jednak wyjaśnić właśnie w~terminach pudełek oraz kleju\index{klej} (odstępu wstawianego między pudełkami). Pudełkami są nie tylko litery. Do pudełka można włożyć praktycznie wszystko, także inne pudełka. Każde pudełko {\LaTeX} traktuje jak pojedynczą literę. Chociaż nie mówiliśmy o~tym wprost, pudełka pojawiały się już w~poprzednich rozdziałach. Na przykład polecenie \ci{includegraphics} albo otoczenie \ei{tabular} tworzą pudełka. Dzięki temu dwa rysunki albo tabele można łatwo zestawić obok siebie. Trzeba jedynie zadbać o~to, by łączna szerokość połączonych obiektów nie przekraczała szerokości szpalty. To samo odnosi się do akapitów, które -- jeśli tego potrzebujemy -- możemy składać w~pudełka o~zadanej szerokości: % \begin{command} \ci{parbox}\verb|[|\emph{pos}\verb|]{|\emph{szerokość}% \verb|}{|\emph{tekst}\verb|}| \end{command} % \noindent Do tego samego celu można wykorzystać otoczenie: % \begin{command} \verb|\begin{|\ei{minipage}\verb|}[|\emph{pos}\verb|]{|% \emph{szerokość}\verb|}| \emph{tekst} \verb|\end{|\ei{minipage}\verb|}| \end{command} % \noindent Argument \emph{szerokość} to wymiar określający szerokość pudełka. Argument \emph{pos\/} jest jednoliterowy i~może przyjmować jedną z~wartości: \texttt{c}, \texttt{t} lub \texttt{b}. Wartości te określają, jak {\LaTeX} ma umieścić pudełko względem otaczającego tekstu. Wartość \verb|c| oznacza umieszczenie środka wysokości pudełka na linii podstawowej\index{linia podstawowa}, \verb|t| -- umieszczenie linii podstawowej pierwszego wiersza w~pudełku na linii podstawowej\index{linia podstawowa} otaczającego tekstu, natomiast \verb|b| -- umieszczenie dolnej krawędzi pudełka na linii podstawowej\index{linia podstawowa}. Wynik zastosowania parametrów ilustruje poniższy przykład (linię podstawową\index{linia podstawowa} oznaczono kreską): %% \iffalse %% JG Główna różnica między \ci{parbox} a~\pai{minipage} polega na tym, że wewnątrz \verb|parbox| nie wszystkie polecenia i~otoczenia są dozwolone, w~przeciwieństwie do otoczenia \verb|minipage|. \fi %% %% \begin{example} \makebox[0pt][l]{\rule{66mm}{.4pt}}% \parbox[c]{9mm}{5 5 5 5 5 5 5 5 5} \parbox[t]{9mm}{6 6 6 6 6 6 6 6 6} \parbox[b]{9mm}{8 8 8 8 8 8 8 8 8} \end{example} \bigskip \noindent Polecenie \ci{parbox} składa tekst w~pudełku, w~razie potrzeby dzieląc tekst na linijki. Inaczej jest z~pudełkami uzyskiwanymi poleceniem \ci{mbox}, których zawartość nigdy nie jest dzielona na wiersze. Polecenia tego używamy, gdy trzeba zapobiec dzieleniu wyrazu lub sekwencji wyrazów na wiersze. Polecenie \verb+\mbox+ jest uproszczoną wersją instrukcji \ci{makebox}, o~składni: % \begin{command} \ci{makebox}\verb|[|\emph{szerokość}\verb|][|\emph{pos}\verb|]{|% \emph{tekst}\verb|}| \end{command} % \noindent W~opcjonalnym argumencie \emph{szerokość} możemy zadać szerokość pudełka. Może się ona różnić od naturalnej szerokości tekstu w~pudełku; może wynosić zero, a~nawet być wielkością ujemną! W~obrębie argumentu \emph{szerokość} możemy się też posługiwać wielkościami \ci{width} (szerokość), \ci{height} (wysokość), \ci{depth} (głębokość) oraz \ci{totalheight} (suma wysokości i~głębokości). Ponadto argument \emph{pos} określa sposób umieszczenia tekstu. Litera \texttt{c}~oznacza wyśrodkowanie, \texttt{l}~-- dosunięcie do lewej, \texttt{r}~-- dosunięcie do prawej, a~\texttt{s}~-- wyspacjowanie zawartości. Poniższy przykład ilustruje użycie polecenia \verb+\width+ w~obrębie argumentu \emph{szerokość}. Pierwsze pudełko ma szerokość równą połowie naturalnej szerokości tekstu: % \begin{example} \makebox[.5\width][l]{oooooooo}% \makebox{xxxxxxxx} \end{example} \bigskip \noindent Polecenie \ci{framebox} działa dokładnie jak \ci{makebox}, z~tym że naokoło pudełka kreślona jest ramka. Oto przykład zastosowania poleceń \ci{makebox} i~\ci{framebox}: % \begingroup \hbadness 10000 \begin{example} \makebox[\textwidth]{% p o ś r o d k u}\par \makebox[\textwidth][s]{% r o z s t r z e l o n y}\par \framebox[1.1\width]{Teraz jestem obramowany!} \par \framebox[0.8\width][r]{Trochę tu jest za szeroko} \par \framebox[1cm][l]{Nie ma sprawy} Da się to czytać? \end{example} \endgroup \bigskip \noindent Pudełka można też przesuwać w~pionie. Służy do tego polecenie: % \begin{command} \ci{raisebox}\verb|{|\emph{przesunięcie}\verb|}[|% \emph{wysokość}\verb|][|\emph{głębokość}\verb|]{|\emph{tekst}\verb|}| \end{command} % \noindent Argument \emph{przesunięcie} określa wielkość przesunięcia w~górę (lub w~dół, jeżeli wielkość przesunięcia jest ujemna). Ponadto za pomocą parametrów opcjonalnych \emph{wysokość} oraz \emph{głębokość} można zadać nominalną wysokość oraz głębokość pudełka (\LaTeX{} będzie traktował pudełko tak, jakby miało zadane wymiary, bez względu na wymiary naturalne). Wewnątrz parametrów można skorzystać z~wielkości \ci{width}, \ci{height}, \ci{depth} oraz \ci{totalheight}. \begin{example} \raisebox{0pt}[0pt][0pt]{\Large% \textbf{Aaaa\raisebox{-0.3ex}{a}% \raisebox{-0.7ex}{aa}% \raisebox{-1.2ex}{r}% \raisebox{-2.2ex}{g}% \raisebox{-4.5ex}{h}}} Krzyczała, ale nikt nie zauważył, że coś się jej przytrafiło. \end{example} \section{Kreski i~podpory \label{sec:rule}} W~wyniku wykonania polecenia \ci{rule}, postaci: % \begin{command} \ci{rule}\verb+[+\emph{przesunięcie}\verb+]{+% \emph{szerokość}\verb+}{+\emph{wysokość}\verb+}+ \end{command} % \noindent otrzymujemy w~składzie czarny prostokąt: % \begin{example} \rule{3mm}{.1pt}% \rule[-1mm]{5mm}{1cm}% \rule{3mm}{.1pt}% \rule[1mm]{1cm}{5mm}% \rule{3mm}{.1pt} \end{example} % \noindent Polecenie \ci{rule} służy zwykle do rysowania kresek pionowych i~poziomych. Na przykład gruba czarna krecha na stronie tytułowej niniejszego \emph{Wprowadzenia} to wynik zadziałania instrukcji: % \begin{code} \verb+\rule[-1ex]{\textwidth}{5pt}+ \end{code} % Parametr \emph{przesunięcie} określa, jak wysoko przesunąć kreskę ponad linię podstawową\index{linia podstawowa} (lub opuścić poniżej linii podstawowej, jeśli parametr jest ujemny). Specjalnym przypadkiem jest kreska o~zerowej szerokości, lecz o~niezerowej wysokości. Taką kreskę nazywamy \emph{podporą} (\USemph{strut}). Podpora to często stosowana metoda nadawania wszystkim elementom jednakowej wysokości. Spójrzmy na poniższy przykład. Dzięki wstawieniu podpory drugi wiersz ma tę samą wysokość co pierwszy. Zawartość wiersza trzeciego jest identyczna jak drugiego, ale w~drugim występuje niewidoczna podpora. Gdyby jej brakowało, to wysokość drugiego wiersza byłaby mniejsza. \begin{example} \begin{tabular}{|c|} \hline \rule{1pt}{4ex}Pittprop \ldots\\ \hline \rule{0pt}{4ex}Strut\\ \hline Strut\\ \hline \end{tabular} \end{example} %% \section{Więcej o~składaniu tabel~\label{more:tables}} \subsection{Tabele o~zadanej szerokości} W~otoczeniu~\ei{tabular} szerokość poszczególnych kolumn tabeli jest ustalana automatycznie, a~szerokość tabeli jest sumą szerokości kolumn i~odstępów międzykolumnowych. Czasami jednak trzeba złożyć tabelę o~z~góry zadanej szerokości; jest to potrzebne przykładowo wtedy, gdy wszystkie tabele w~dokumencie mają mieć tę samą szerokość. Do tego celu można użyć albo otoczenia \ei{tabular*}, albo otoczenia \ei{tabularx} z~pakietu o~tej samej nazwie. Niestety każdy z~tych sposobów ma poważne ograniczenia funkcjonalne. Rozpocznijmy od otoczenia \ei{tabular*}, które różni się od \ei{tabular} tylko jednym dodatkowym parametrem obowiązkowym, określającym szerokość tabeli: % \begin{command} \verb|\begin{tabular*}{|\emph{szerokość}\verb|}{|\emph{spec-kolumn}\verb|}| \end{command} % \noindent Rozważmy przykład tabeli zawierającej najważniejsze ,,parametry'' słynnych wzniesień i~przełęczy: \begin{code} \begin{verbatim} \begin{tabular}{|l|r|r|r|r|r|}\hline Nazwa & \multicolumn{2}{|c|}{Wys. w~m~n.p.m.} & Długość & \multicolumn{2}{|c|}{Nachylenie \%}\\ \cline{2-3} \cline{5-6}% \cline można wstawiać wielokrotnie & początek & koniec & w~km & śr. & max \\ \hline Col du Galibier & 1401 & 2646 & 18,1 & 6,9\% & 14,5 \\ Alpe D'Huez & 724 & 1815 & 14,2 & 7,7\% & 15,0 \\ Passo Gavia & 1734 & 2618 & 13,5 & 6,5\% & 20,0 \\ \hline \end{tabular} \end{verbatim} \end{code} \noindent Złożone tabele wyglądają następująco: \par \medskip \noindent%%<-- ważne \begin{tabular}{|l|r|r|r|r|r|}\hline Nazwa & \multicolumn{2}{c|}{Wys. w~m~n.p.m.} & Długość & \multicolumn{2}{c|}{Nachylenie \%}\\ \cline{2-3} \cline{5-6} & początek & koniec & w~km & śr. & max \\ \hline Col du Galibier & 1401 & 2646 & 18,1 & 6,9\% & 14,5 \\ Alpe D'Huez & 724 & 1815 & 14,2 & 7,7\% & 15,0 \\ Passo Gavia & 1734 & 2618 & 13,5 & 6,5\% & 20,0 \\ \hline \end{tabular} \par \medskip %% \noindent Jeżeli tabela ma być złożona na przykład na szerokość łamu, to zastępujemy \ei{tabular} jego wersją z~gwiazdką oraz modyfikujemy preambułę tabeli: \begin{code} \begin{verbatim} \begin{tabular*}{\textwidth}% {@{\extracolsep{\stretch{1}}}|l|r|r|r|r|r|}\hline ... \end{tabular} \end{verbatim} \end{code} %% \noindent Złożona tabela wygląda następująco: \par \medskip \noindent%%<-- ważne \begin{tabular*}{\textwidth}% {@{\extracolsep{\stretch{1}}}|l|r|r|r|r|r|}\hline Nazwa & \multicolumn{2}{c|}{Wys. w~m~n.p.m.} & Długość & \multicolumn{2}{c|}{Nachylenie \%}\\ \cline{2-3} \cline{5-6} & początek & koniec & w~km & śr. & max \\ \hline Col du Galibier & 1401 & 2646 & 18,1 & 6,9\% & 14,5 \\ Alpe D'Huez & 724 & 1815 & 14,2 & 7,7\% & 15,0 \\ Passo Gavia & 1734 & 2618 & 13,5 & 6,5\% & 20,0 \\ \hline \end{tabular*} \par \medskip \noindent Wewnątrz otoczenia \ei{tabular} {\LaTeX} odziela poszczególne kolumny stałym odstępem równym \ci{tabcolsep}. Do składania tabel o~określonej szerokości należy ten odstęp zamienić na taki, którego wielkość może się zmieniać (por.~punkt~\ref{sec:hspace}). Do tego celu należy użyć wspomnianej w~punkcie~\ref{sec:tabular} (s.~\pageref{sec:tabular-et}) instrukcji \verb+@+. Ponadto polecenie \ci{extracolsep}, umieszczone wewnątrz instrukcji \verb+@{...}+, wstawia \emph{dodatkowy odstęp\/} między kolejnymi kolumnami -- do odwołania poleceniem \ci{extracolsep} albo aż do końca tabeli. W~powyższym przykładzie polecenie \verb+@{...}+ usuwa domyślny odstęp międzykolumnowy, zastępując go specjalnym odstępem o~zmiennej wielkości (taki odstęp wstawia polecenie \ci{stretch}). Manipulując odstępem międzykolumnowym, {\LaTeX} dopasowuje szerokość tabeli do żądanej wielkości. Otoczenie \ei{tabular*} %do prawidłowego działania powinno zawierać w~specyfikacji formatu kolumn co najmniej jedną konstrukcję \verb|@{\extracolsep{\stretch{1}}}|. Uważny czytelnik dostrzeże jednak, że kreski poziome pod pierwszym wierszem między kolumnami 2--3 oraz 5--6 nie są ,,dociągnięte'' do lewego brzegu. Niestety nie da się tego naprawić -- przynajmniej nie w~prosty sposób. Otoczenie \ei{tabular*} nadaje się do składania tabel, ale tylko wtedy, gdy nie korzystamy zbyt często z~polecenia \ci{cline}. Spróbujmy teraz zastosować otoczenie \ei{tabularx}. W~tym celu najpierw do preambuły dokumentu dołączamy pakiet \pai{tabularx}. Następnie zmieniamy tabelę w~taki sposób (kolumny, których szerokość ma być wyznaczona automatycznie, oznaczamy symbolem \verb@X@): \begin{code} \begin{verbatim} \begin{tabularx}{\textwidth}{|X|X|X|X|X|X|}\hline ... \end{tabularx} \end{verbatim} \end{code} \noindent Złożona tabela wygląda następująco: \par \medskip \begingroup \hbadness10001 %%<-- \noindent%%<-- ważne \begin{tabularx}{\textwidth}{|X|X|X|X|X|X|}\hline Nazwa & \multicolumn{2}{c|}{Wys. w~m~n.p.m.} & Długość & \multicolumn{2}{c|}{Nachylenie \%}\\ \cline{2-3} \cline{5-6} & początek & koniec & w~km & śr. & max \\ \hline Col du Galibier & 1401 & 2646 & 18,1 & 6,9\% & 14,5 \\ Alpe D'Huez & 724 & 1815 & 14,2 & 7,7\% & 15,0 \\ Passo Gavia & 1734 & 2618 & 13,5 & 6,5\% & 20,0 \\ \hline \end{tabularx} \par \endgroup %% \medskip \noindent Teraz wprawdzie wszystkie kreski są elegancko dociągnięte, ale jest problem z~pierwszą kolumną: jest ona zbyt wąska, a przez to zawartość rubryk już się nie mieści i~musi zostać przeniesiona\footnote{Ponadto lepiej, by kolumny 2--6 były wyrównane do prawego, a~nie do lewego brzegu rubryki.}. Otoczenie \ei{tabularx} automatycznie dzieli bowiem tabelę wyłącznie na kolumny \emph{o~równej szerokości}. Jest to jego największe ograniczenie funkcjonalne. Specyfikacja kolumn tabeli oprócz \verb@X@ może zawierać także wartości ,,tradycyjne'', takie jak: \verb@l@, \verb@r@ lub \verb@c@. Odpowiadającym tym specyfikacjom kolumny mają naturalną szerokość. Przykładowo: %% \begin{code} \begin{verbatim} \begin{tabularx}{\textwidth}{|l|X|X|X|X|X|}\hline ... \end{tabularx} \end{verbatim} \end{code} %% \noindent Akurat w~naszym przykładzie osiągneliśmy zadowalający rezultat, gotowa tabela wygląda bowiem następująco: \par \medskip \noindent%%<-- ważne \begin{tabularx}{\textwidth}{|l|X|X|X|X|X|}\hline Nazwa & \multicolumn{2}{c|}{Wys. w~m~n.p.m.} & Długość & \multicolumn{2}{c|}{Nachylenie \%}\\ \cline{2-3} \cline{5-6} & początek & koniec & w~km & śr. & max \\ \hline Col du Galibier & 1401 & 2646 & 18,1 & 6,9\% & 14,5 \\ Alpe D'Huez & 724 & 1815 & 14,2 & 7,7\% & 15,0 \\ Passo Gavia & 1734 & 2618 & 13,5 & 6,5\% & 20,0 \\ \hline \end{tabularx} \medskip Tabele złożone z~użyciem otoczenia \ei{tabular} nie są automatycznie dzielone między stronami. Do składu tabel, które nie mieszczą się na pojedynczej stronie, służy pakiet~\ei{longtable}, opisany w~następnym punkcie. \subsection{Pakiet \pai{longtable} \label{sec:longtable}} Pakiet definiuje otoczenie \ei{longtable}, pozwalające składać tabele ciągnące się przez wiele kolejnych stron dokumentu. Aby zapewnić jednakowe szerokości rubryk na wszystkich stronach, wymagana jest dwukrotna kompilacja dokumentu. Oto przykład: %% \begin{verbatim} \begin{longtable}{|l|r|r|r|} \caption{Tytuł tabeli}\\\hline \multicolumn{4}{|c|}{To jest nagłówek pierwszej strony}\\\hline nazwa & wysokość & długość & nachylenie \\ \hline k-1 & k-2 & k-3 & k-4 \\ \hline \endfirsthead \hline \multicolumn{4}{|c|}{To jest nagłówek następnych stron}\\ \hline k-1 & k-2 & k-3 & k-4\\\hline \endhead \hline \multicolumn{4}{|c|}{Stopka tabeli}\\ \hline \endfoot \hline \multicolumn{4}{|c|}{Stopka na ostatniej stronie}\\ \hline \endlastfoot Col du T\'el\'egraphe & 1,566 & 12,0 & 6,7\% \\ Col du Galibier & 2,646 & 18,1 & 6,9\% \\ Col de la Madeleine & 2,000 & 25,4 & 6,1\% \\ %% ... 17 pominiętych wierszy ... La Bola del Mundo & 2257 & 21,8 & 6,2\% \\ \end{longtable} \end{verbatim} %% http://www.salite.ch/struttura/salite.asp?stato=Francia %% coś tu dopisać nt toporności tego pakietu, tabular + longtable Po złożeniu efekt jest następujący\footnote{Dane z~tabeli pochodzą z~katalogu \url{http://www.salite.ch}.}: \begin{longtable}{|l|r|r|r|} \caption{Tytuł tabeli}\\\hline \multicolumn{4}{|c|}{To jest nagłówek pierwszej strony}\\ \hline nazwa & wysokość & długość & nachylenie \\ \hline k-1 & k-2 & k-3 & k-4 \\ \hline \endfirsthead \hline \multicolumn{4}{|c|}{To jest nagłówek następnych stron}\\ \hline k-1 & k-2 & k-3 & k-4\\\hline \endhead \hline \multicolumn{4}{|c|}{Stopka tabeli}\\ \hline \endfoot \hline \multicolumn{4}{|c|}{Stopka na ostatniej stronie}\\ \hline \endlastfoot Col du T\'el\'egraphe & 1,566 & 12,0 & 6,7\% \\ Col du Galibier & 2,646 & 18,1 & 6,9\% \\ Col de la Madeleine & 2,000 & 25,4 & 6,1\% \\ Alpe D'Huez & 1815 & 14,2 & 7,7\% \\ Col de la Croix de Fer & 2067 & 22,0 & 7,0\% \\ %see http://pl.wikipedia.org/wiki/Fabio_Casartelli %for the details concerning Fabio Casartelli Col de Portet d'Aspet\index{Casartelli Fabio} & 1069 & 4,4 & 9,6\% \\ %see http://en.wikipedia.org/wiki/Tom_Simpson %for the details concerning Tom Simpson Mont Ventoux\index{Simpson Tom} & 1912 & 21,0 & 7,6\% \\ Col de l`Izoard & 2361 & 15.9 & 6,9\% \\ Passo dello Stelvio & 2758 & 24.3 & 7.4\% \\ Col du Tr\'ebuchet & 1143 & 14.6 & 4.3\% \\ Passo Gavia & 2618 & 13.5 & 6.5\% \\ Col du Grand Colombier & 1505 & 15.9 & 7.8\% \\ Col de l`Iseran & 2770 & 48,0 & 4.1\% \\ Courchevel & 2000 & 21,7 & 6,5\% \\ Col de l`Aspin & 1489 & 12,0 & 6,5\% \\ Col de la Croix de l`Homme Mort & 1163 & 18,0 & 4,3\% \\ Col de Notre Dame des Abeilles & 1000 & 13,9 & 5,1\% \\ Paso del Morredero & 1872 & 25,0 & 5,4\% \\ Collado de la Caballar & 1308 & 14,5 & 7,5\% \\ Capilla de la Magdalena & 1137 & 11,0 & 5,5\% \\ La Bola del Mundo & 2257 & 21,8 & 6,2\% \\ \end{longtable} \subsection{Pakiet \pai{array}} Do składu tabel o~bardziej skomplikowanym układzie graficznym lepiej używać pakietu \pai{array}. Pakiet ten nie wprowadza żadnego nowego otoczenia, redefiniuje jedynie i~rozszerza standardowe otoczenie \ei{tabular}. W~,,standardowym'' otoczeniu \ei{tabular} konstrukcja \verb|p{|\emph{szer-kolumn}\verb|}| deklaruje kolumnę, w~której zawartość każdej rubryki będzie składana w~prostokąt o~zadanej szerokości, z~wyrównywaniem obu marginesów (odpowiednik \verb@\parbox[t]{szer}@). Pakiet \pai{array} wprowadza ponadto \verb@b{szer}@ -- odpowiednik \verb@\parbox[b]{szer}@ -- oraz \verb@m{szer}@ -- odpowiednik \verb@\parbox{szer}@. Przykład: %% \begin{code} \begin{verbatim} \begin{tabular}{|p{8mm}|p{8mm}|p{8mm}|} \hline x y z x y z x y z x y z x y z & x y z x y z x y y& 1 1 1 1 1 \\ \hline \end{tabular} \begin{tabular}{|m{8mm}|m{8mm}|m{8mm}|} \hline x y z x y z x y z x y z x y z & x y z x y z x y y& 2 2 2 2 2 \\ \hline \end{tabular} \begin{tabular}{|b{8mm}|b{8mm}|b{8mm}|} \hline x y z x y z x y z x y z x y z & x y z x y z x y y& 3 3 3 3 3 \\ \hline \end{tabular} \end{verbatim} \end{code} %% Złożone tabele wyglądają następująco: %% \par \medskip \noindent%%<-- ważne \begin{tabular}{|p{8mm}|p{8mm}|p{8mm}|} \hline x y z x y z x y z x y z x y z & x y z x y z x y y& 1 1 1 1 1 \\ \hline \end{tabular} \quad \noindent \begin{tabular}{|m{8mm}|m{8mm}|m{8mm}|} \hline x y z x y z x y z x y z x y z & x y z x y z x y y& 2 2 2 2 2 \\ \hline \end{tabular} \quad \noindent \begin{tabular}{|b{8mm}|b{8mm}|b{8mm}|} \hline x y z x y z x y z x y z x y z & x y z x y z x y y& 3 3 3 3 3 \\ \hline \end{tabular} \par \bigskip \noindent Kolejnym użytecznym rozszerzeniem zdefiniowanym w~\pai{array} jest możliwość bardziej szczegółowego określenia sposobu formatowania rubryk tabeli, niż ma to miejsce w~standardowym otoczeniu \ei{tabular}, gdzie w~zasadzie możemy jedynie określić sposób justowania zawartości rubryk w~poszczególnych kolumnach. Wracając do przykładu tabeli zawierającej różne ,,parametry'' dotyczące przełęczy i~wniesień, załóżmy, że nazwę wzniesienia chcemy złożyć kursywą, a~długość -- odmianą półgrubą. Można to oczywiście osiągnąć, wstawiając odpowiednie polecenia do każdej rubryki danej kolumny, ale sprawniej będzie zastosować zdefinowane w~pakiecie \pai{array} konstrukcje: \begin{command} \verb|>{|\emph{polecenia}\verb|}| lub \verb|<{|\emph{polecenia}\verb|}| \end{command} %% \noindent Konstrukcji \verb|>{|\emph{polecenia}\verb|}| można użyć w~preambule \emph{przed\/} \verb@c@, \verb@l@, \verb@r@, \verb@p@ oraz \verb@m@ i~\verb@b@. Jej działanie polega na wstawieniu \emph{poleceń\/} na początku każdej rubryki w~tej kolumnie. Podobnie, \verb|<{|\emph{polecenia}\verb|}| można użyć \emph{po\/} \verb@c@, \verb@l@, \verb@r@, \verb@p@, \verb@m@ i~\verb@b@. W~rezultacie \emph{polecenia} zostaną wstawione na końcu każdej rubryki w~tej kolumnie. Wracając do przykładu, oto preambuła tabeli wykorzystująca omawiane konstrukcje pakietu \pai{array}: %% \begin{code} \begin{verbatim} \begin{tabular}{|>{\itshape}l|r|r|>{\bfseries}r|r|r|}\hline Nazwa & \multicolumn{2}{|c|}{Wys. w~m~n.p.m.} & Długość & \multicolumn{2}{|c|}{Nachylenie \%}\\ ... \end{verbatim} \end{code} %% Wynik jest następujący: %% \par \medskip \noindent \begin{tabular}{|>{\itshape}l|r|r|>{\bfseries}r|r|r|}\hline Nazwa & \multicolumn{2}{c|}{Wys. w~m~n.p.m.} & Długość & \multicolumn{2}{c|}{Nachylenie \%}\\ \cline{2-3} \cline{5-6}% & początek & koniec & w~km & śr. & max \\ \hline Col du Galibier & 1401 & 2646 & 18,1 & 6,9\% & 14,5 \\ Alpe D'Huez & 724 & 1815 & 13,5 & 7,7\% & 15,0 \\ Passo Gavia & 1734 & 2618 & 13,5 & 6,5\% & 20,0 \\ \hline \end{tabular} \par \medskip \noindent Do zmiany głębokości konkretnego wiersza służy opcjonalny argument polecenia~\verb@\\@, np. \verb@\\[2pt]@. Wysokość i~głębokość wiersza można zmienić za pomocą niewidzialnej kreski, np. \verb@\rule[-3mm]{0mm}{8mm}@. Przykładowo, w~powyższym przykładzie tabela będzie wyglądała lepiej, jeżeli dodamy do pierwszego wiersza: \begin{code} \begin{verbatim} Col du Galibier\rule[-3.5pt]{0pt}{15pt} \end{verbatim} \end{code} Spowoduje to wstawienie dodatkowego odstępu między kreską nad pierwszym wierszem tabeli a~zawartością wiersza. \subsection{Pakiet \pai{tap}} % -------------------- Pakiet \pai{tap} (autorzy: Bogusław Jackowski\index{Jackowski Bogusław}, Piotr Pianowski\index{Pianowski Piotr} i~Piotr Strzelczyk\index{Strzelczyk Piotr}) pozwala na eleganckie składanie nawet najbardziej ekstrawaganckich (jednostronicowych) tabel, z~tym że stosuje niestandardowy zapis\footnote{Tak naprawdę, nie jest to nawet pakiet w~rozumieniu {\LaTeX}a i~zamiast poleceniem \ci{usepackage} należy go dołączać poleceniem \ci{input}.}, co może powodować problemy w~integracji z~innymi pakietami {\LaTeX}a, np. pakietem \pai{colortbl}, służącym do kolorowania rubryk w~tabelach. Oto przykład: \par \medskip \noindent \begin{code} \begin{verbatim} \input{tap.tex} %% <- dołączenie pakietu \desiredwidth=\textwidth %% skład na szerokość łamu \begintable \begintableformat \left " &\right \endtableformat \= \B!^ | @2\center{Wys. w~m~n.p.m.} | Długość | @2\center{Nachylenie \%} \E! \B"- \center{Nazwa} " @2\- " " @2\- \E" \B"_ | początek | koniec | w~km | śr. | max \E! \B! Col du Galibier | -- | 2645 | 17,5 | 6,9\% | 14,5 \E! \B! Alpe D'Huez | -- | 1839 | 13,0 | 8,5\% | 15,0 \E! \B! Passo Gavia | -- | 2621 | 17,3 | 7,9\% | 20,0 \E! \= \endtable \end{verbatim} \end{code} %% Wynik jest imponujący: %% \par \medskip \begingroup \input{tap.tex} \desiredwidth=\textwidth %% skład na szerokość łamu \begintable \begintableformat \left " &\right \endtableformat \= \B!^ | @2\center{Wys. w~m~n.p.m.} | Długość | @2\center{Nachylenie \%} \E! \B"- \center{Nazwa} " @2\- " " @2\- \E" \B!_ | początek | koniec | w~km | śr. | max \E! \= \B!^ Col du Galibier | 1401 | 2646 | 18,1 | 6,9\% | 14,5 \E! \B!+ Alpe D'Huez | 724 | 1815 | 14,2 | 7,7\% | 15,0 \E! \B!_ Passo Gavia | 1734 | 2618 | 13,5 | 6,5\% | 20,0 \E! \= \endtable \endgroup \medskip \noindent Więcej informacji można odnaleźć w~(polskojęzycznej) dokumentacji pakietu (\CTAN{macros/generic/tables/tap077.zip}). %% dodałem akapit, żeby się tak nie kończyło gwałtownie:-) [tp]: \medskip \noindent Na zakończenie uwaga: składanie tabel w~{\LaTeX}u nie jest może aż tak proste jak w~edytorach {\WYSIWYG}, ale za to można tworzyć konstrukcje niezwykle trudne lub wręcz niemożliwe do wykonania w~innych programach. Ponadto zadanie składania tabel można sobie znakomicie ułatwić, stosując skryptowe języki programowania, w~rodzaju Perla czy Pythona. Już stosunkowo niewielka umiejętność programowania w~wymienionych językach pozwala na szybką konwersję generowanych przez zewnętrzne aplikacje danych tabelarycznych do formatu {\LaTeX}a. % To jest teraz wstawione do indeksu! % \label{verylast}\mbox{}%% przeniesione do xtables % % \endinput %%% Local Variables: %%% mode: latex %%% TeX-master: "lshort2e" %%% case-fold-search: nil %%% coding: latin-2 %%% LocalWords: ghostscript acrobat makeindex plmindex kiepskości %%% ispell-local-dictionary: "polish" %%% End: