TeX jest systemem składu dokumentów i książek, powstałym pierwotnie na potrzeby prac naukowych z nauk ścisłych. Jego podstawowe cechy to:
LaTeX jest zbiorem makr i definicji TeXa, które bardzo upraszczają tworzenie dokumentów. W przeciętnym dokumencie właściwie nic "technicznego" (wielkość czcionki, ułożenie) nie trzeba definiować, wystarczy posłużyć się definicjami jak np. "\chapter" czy "\section".
W większości dystrybucji linuxowych TeX i LaTeX jest załączony w standardowej instalacji. Jeśli u Ciebie nie jest zainstalowany, polecamy zainstalowanie pakietu tetex (wraz z wieloma dodatkami, np. tetex-dvips itd.). Ta wersja jest również zainstalowana w Labie.
Pod windowsem można ściągnąć jedną z wielu darmowych dystrybucji TeXa+LaTeXa. Możemy polecić MiKTeXa oraz TeXLive.
TeX, zarówno pod windowsem jak i pod linuxem, jest tylko "kompilatorem" tekstu, nie zapewnia żadnego środowiska pracy; pracę pisać można w swoim ulubionym edytorze. Pod Windows powstał specjalny edytor, naszym zdaniem bardzo dobry, WinEdt.
Zwyczajowo pliki napisane w TeXu i LaTeXu oznacza się rozszerzeniem .tex
Pod Windowsem, jeśli użytkownik używa WinEdt (do czego gorąco zachęcamy), "kompilacja" programu jest intuicyjna: WinEdt sam podłączy się do TeXa, aby "skompilować" wystarczy nacisnąć odpowiedni przycisk.
Pod linuxem wszystko robimy oczywiście z linii komend :). Aby dany plik TeXować, trzeba użyc polecenia TeX:
[jmd@laptop zpp]$ tex przyklad.tex
Ta komenda zastosuje jednak samego TeXa do pliku; my chcielibyśmy móc używać makr i definicji LaTeXa. Aby zLaTeXować plik należy wykonać komendę latex:
[jmd@laptop zpp]$ latex przykład.tex
Obie poprzednie komendy wygenerują nam plik przykład.dvi. Możemy go następnie konwertować używając załączonych do pakietu TeXa konwerterów:
[jmd@laptop zpp]$ dvipdf przyklad.dvi [jmd@laptop zpp]$ dvips -o przyklad.ps przyklad.dvi
Rodzina konwerterow dvi* jest dosc obszerna, chętnych odsyłamy do manuala. Zamiast polecenia latex można od razu skorzystać z pdflatex, który wygeneruje nam pdf-a
[jmd@laptop zpp]$ pdflatex przykład.tex
Bardzo często w treści dokumentu będziemy mieli spis treści. Niestety, za jednym przebiegiem LaTeX-owania "kompilator" nie poradzi sobie ze spisem treści: za pierwszym przebiegiem wygeneruje plik przykład.toc, zawierający spis treści. Dopiero jednak drugi raz uruchomiony kompilator włączy ten spis treści do dokumentu. Czyli właściwie zawsze musimy "kompilować" drukrotnie.
Na potrzeby ZPP lub innych projektów można sobie oczywiście stworzyć Makefile, dla przykładu mój wygląda następująco ("kompiluje" on dwukrotnie po czym udostępnia pdfa i źródła na stronie reszcie drużyny):
all: vision %: %.tex pdflatex $< pdflatex $< mv $@.pdf ../public_html/zpp/ cp $< ../public_html/zpp/ chmod 644 ../public_html/zpp/$@.pdf chmod 644 ../public_html/zpp/$<
Mając wstęp za sobą napiszmy pierwszy plik LaTeXa:
\documentclass{article} \begin{document} Hello World! This is the second paragraph. This line will be in the second paragraph, too. This is the third paragraph. \end{document}
Jak widać, cały dokument zawiera się między znacznikiem \begin{document} a \end{document}. Ogólnie wszystkie komendy LaTeXa i TeXa zaczynają się od znaku \, po czym następuje nazwa komendy. W nawiasach kwadratowych [, ] podajemy argumenty opcjonalne; w nawiasach klamrowych {, } - obowiązkowe.
Każdy dokument LaTeXa musi zaczynać się od deklaracji szablonu dokumentu - robimy to za pomocą komendy \documentclass. Najbardziej popularnym szablonem jest article; innymi są np. report, book.
LaTeX nie zauważa pojedynczego znaku końca wiersza: dla niego to znak pusty, tak jak spacja. Natomiast pusta linia oznacza koniec akapitu. Nową linię bez zaczynania akapitu można zrobić poleceniem \newline.
Teraz przeróbmy nasz dokument na język polski:
%& --translate-file latin2pl \documentclass{article} \usepackage{polski} \usepackage[latin2]{inputenc} \begin{document} Witaj świecie! \end{document}
Pierwsza linijka dokumentu powoduje, że LaTeX usiłuje przetłumaczyć "dziwne znaki" na znaki diakrytyczne w standardzie Latin2. Komenda \usepackage włącza pakiet LaTeXa. Pakiet polski definiuje polskie znaki diakrytyczne; pakiet inputenc definiuje kodowania ASCII. Przydatne może być jedno z dwóch:
\usepackage[latin2]{inputenc} \usepackage[cp1250]{inputenc}
Komendy LaTeXa zaczynają się od znaku \, po czym następuje nazwa komendy, i argumenty: wpierw opcjonalne w [], a następnie obowiązkowe w {}. Komenda ma ustaloną liczbę argumentów opcjonalnych i obowiązkowych, np:
\sqrt{x}
powoduje wyświetlenie pierwiastka z x (w trybie matematycznym - o tym później), zaś:
\sqrt[n]{x}
spowoduje wyświetlenie pierwiastka n-tego stopnia z x.
W LaTeXie wszystkie właściwie komendy to takie makra, powodujące wstawienie w miejsce komendy innego tekstu, zależnego od parametrów. Ten tekst, w przypadku standardowych makr, zazwyczaj jest juz kodem TeXa.
Do dyspozycji mamy jeszcze otoczenia. Otoczenie o nazwie "otoczenie" i jednym argumencie obowiązkowym używalibyśmy tak:
\begin{otoczenie}{argument1} ... \end{otoczenie}
Otoczenie otwieramy komendą \begin, kończymy \end, w \begin mogą następować różne argumenty. Przykład:
\begin{enumerate} \item Pierwsza pozycja listy ponumerowanej. \item Druga \item Trzecia \end{enumerate}
Tak naprawdę LaTeXowe otoczenia są tak samo skonstruowane jak komendy: zamiast \begin i \end odpowiedniego otoczenia wstawiany jest jakiś tekst, zależny od parametrów. Jedyną różnicą jest to, że kompilator pilnuje, by otoczenia były zamykane w odpowiedniej kolejności.
W punkcie 2.2. była mowa o pakietach LaTeXa. Załączamy je komendą \usepackage:
\usepackage[argument]{pakiecik}
Przydatnymi pakietami mogą być:
graphicx | Umożliwia dołączanie plików graficznych |
longtable | Automatyczne łamanie długich tabel |
fontenc | Definiuje układ znaków w bieżącym zestawie znaków (foncie). |
ifthen | Umożliwia korzystanie z poleceń typu if... then do... otherwise do. |
makeidx | Udostępnia polecenia do przygotowywania skorowidzów. |
inputenc | Definiuje układ znaków w pliku żródłowym, jak: ASCII, ISO Latin-1, ISO Latin-2, 437/850 IBM, Apple Macintosh, Next, ANSI-Windows albo układ zdefiniowany przez użytkownika. |
amsmath amssymb amsthm amsfonts eucal |
Przeróżne wycudowane znaczki i konstrukcje matematyczne |
harvard | Do robienia bibliografii |
Plik LaTeXowy, we właściwym dokumencie, nie powinien zawierać żadnych definicji dotyczących formatowania tekstu, wielkości czcionek, akapitu itd. W dokumencie powinniśmy wszystko definiować "to jest akapit", "to jest kolejny rozdział" itd. Szablon article - na nim się teraz skupimy - definiuje wiele przydatnych makr, z których dobrze jest korzystać. Zazwyczaj, korzystając z makr LaTeXa, nie musimy właściwie nic sami definiować - skład tekstu odbywa się za nas.
Dokument typu article możemy dzielić na sekcje, podsekcje, paragrafy itd. Możemy używać następujących komend (poukładane wg hierarchii):
\part{...} \section{...} \subsection{...} \subsubsection{...} \paragraph{...} \subparagraph{...}
Na przykład element szablonu Wizji naszego projektu ZPP:
\section{Sytuacja na rynku} ... \subsection{Konkurencja do naszego projektu} ... \subsubsection{www.naszkonkurent.pl} ...
LaTeX ponumeruje nasze sekcje, subsekcje itd, oraz, jeśli sobie tego zażyczyliśmy, stworzy spis treści. W spisie treści pojawiają się wszystkie nazwy od \subsubsection wzwyż. Jeżeli jednak postawimy za komendą gwiazdkę:
\subsection*{To się nie pojawi w spisie treści}
to nie będzie tego w spisie treści. W dokumentach report i book dostępny jest jeszcze \chapter (pomiędzy \part i \section).
Czasem do naszego dokumentu chcemy stronę nagłówkową, tytuł. Aby to zrobić, wpierw, w nagłówku dokumentu (czyli przed \begin{document}) musimy zdefiniować kto jest autorem i jaki jest tytuł, a następnie w dokumencie użyć komendy \maketitle:
\documentclass{article} \usepackage{polski} \usepackage[latin2]{inputenc} \title{Śpiewnik \ --- Wizja} \author{Anna Jasińska \and Michał Korch \and Marcin Pilipczuk \and Piotr Tabor} \begin{document} \maketitle ... \end{document}
Aby stworzyć spis treści wystarczy napisać w miejscu gdzie chcemy mieć spis treści:
\tableofcontents
Przypominam, że aby spis treści był poprawny, należy dwukrotnie przekompilować nasz dokument. Do spisu treści są wrzucane wszystkie \section, \subsection itd. z dokumentu.
W LaTeXu jest jeszcze mechanizm robienia bilbiografii, nie będzie on bardzo potrzebny w ZPP, więc go pomijamy; zainteresowanych odsyłamy do lektury materiałów z sieci.
Poniżej przedstawiamy kilka innych logicznych struktur, dostarczanych nam przez LaTeX.
LaTeX udostępnia nam format list ponumerowanych, wypunktowań i opisów. Lista ponumerowana to otoczenie enumerate:
\begin{enumerate} \item Pierwsza pozycja listy ponumerowanej. \item Druga \item Trzecia \end{enumerate}
Otoczenie itemize to wypunktowanie; argumentem opcjonalnym polecenia \item jest "czym wypunktować", standardowo jest to duża kropka:
\begin{itemize} \item Punkt z duza pelna kropka z lewej \item Kolejny taki punkt \item[*] a ten ma gwiazdke \item[*] i ten tez \end{itemize}
Przydatne nieraz bywa też otoczenie description; na przykładzie wstępu do Wizji:
\begin{description} \item[piosenka] -- jest to pojęcie obejmujące tekst, wersyfikację, akordy gitarowe i ich rozmieszczenie względem tekstu, a także metainformacje dotyczące powstania i metod wykonywania, \item[śpiewnik] -- jest to zbiór piosenek, niekiedy uporządkowany, ... \end{description}
Tabela jest dość skomplikowanym tworem, więc wpierw zamieścimy przykład, a później go omówimy (i znów przykład z Wizji...):
\begin{tabular}{|l|cr|} \hline cel& priorytet & pierwszeństwo \\ \hline \hline przeszukiwanie bazy piosenek &niezbędny & 0 \\ \hline bardziej zaawansowane przeszukiwanie bazy piosenek &średnie & 6\\ \hline wyświetlanie wybranej piosenki & niezb\k{e}dny & 0\\ \hline spersonalizowane wyświetlanie wybranej piosenki & średni & 6\\ \hline transponowanie piosenki & średnie & 6 \\ \hline przygotowywanie wydruku piosenki & niezbędny & 2 \\ \hline spersonalizowane przygotowywanie wydruku piosenki & średni & 6 \\ \hline konta użytkowników & du\.{z}y & 5 \\ \hline śpiewniki osobiste & duży & 5 \\ \hline edytor piosenek & niezbędny & 1 \\ \hline komentarze użytkowników & średni & 7 \\ \hline komentarze edytorów & duży & 4 \\ \hline możliwość drukowania całych śpiewników & duży&5 \\ \hline wersjonowanie piosenki & bardzo duży & 1 \\ \hline wiele gałęzi piosenki & średni & 7 \\ \hline piosenki lokalne & średni & 7 \\ \hline hierarchia użytkowników & niski & 8 \\ \hline powiadomienia & niski & 9\\ \hline przysyłanie wyników teXowania na email & niski & 9 \\ \hline oprogramowanie nut i tabulatur & niski & 9 \\ \hline rozpoznawanie akordów spoza standardu& niski & 9 \\ \hline praca Edytora piosenek offline & niski & 8 \\ \hline dokumentacja formatu XML i XSchema & niezbędny & 0 \\ \hline interfejs dla funkcjonalność opiekuna & niski & 9 \\ \hline statystyki najlepszych piosenek i najlepszych edytorów & niski & 9 \\ \hline bezpośredni dostęp do repozytorium dla zewnętrznych projektów & średni & 7 \\ \hline możliwość osadzenia lokalnego śpiewnika na zewnętrznej stronie internetowej & średni & 6 \\ \hline \end{tabular}
Tabelkę definiuje otoczenie tabular. Argumentem otoczenia jest format tabeli:
Wewnątrz otoczenia możemy stosować:
\label, \ref, \pageref pozwalają na zrobienie następującej sztuki:
\begin{theorem} \label{moje_twierdzenie} Dla każdego automatu skończonego bla bla bla \end{theorem} ... ... Korzystając z twierdzenia \ref{moje_twierdzenie} (strona \pageref{moje_twierdzenie})...
\label więc "nazywa" twierdzenie, sekcje, paragraf, cokolwiek, zaś \ref przywołuje jego numer/nazwę, \pageref - stronę. Te komendy nieraz wymagają podwójnego LaTeXowania pliku.
Grafikę wstawiamy z formatu eps, przy pomocy pakietu graphicx. Oto przykład:
\includegraphics{scale=0.3, height=10, width=15, angle=15}[plik.eps]
LaTeX udostępnia nam coś jak liczniki: jest to automatycznie wbudowane w niektóre polecenia; section, theorem, itd są ponumerowane, ale możemy też ręcznie tworzyć jakąś numerację. Nowy licznik tworzymy tak:
\newcounter[licznik_ojciec]{nasz_licznik}
nasz_licznik to nazwa naszego licznika; licznik_ojciec to nazwa licznika - ojca; gdykolwiek ojciec się zwiększy, nasz licznik jest zerowany ( np. ojcem licznika paragrafów jest licznik sekcji). Aktualną wartość licznika możemy wyświetlić w roznym stylu:
\arabic{licznik} \roman{licznik} \Roman{licznik} \alph{licznik} \Alph{licznik}
Zmieniamy wartość licznika następująco:
\setcounter{licznik}{0} \addtocounter{licznik}{3}
W LaTeXie dostępny jest styl matematyczny. Zaczyna się on od znaku $, ew. $$ (wtedy zaczyna się od nowej linii), kończy tym samym znakiem co zaczął. W dokumentach ZPP nie będziemy wiele z niego korzystać, więc nie będę się tu rozwodził. Poniżej kilka przykładów dla zainteresowanych:
$x_n = \frac{x_{n-1} + 1}{2}$ $$\sum_{i=1}^n i^2 = \frac{n(n+1)(2n+1)}{6}$$ $$\begin{cases} x_1 = x_2 + x_3 \\ x_2 = x_3 - x_1 \\ x_3 = x_1 \end{cases}$$
Nieraz używana jest jeszcze komenda \emph, wyróżniająca kawałek tekstu (standardowo kursywą):
bzdury bzdury \emph{coś ważnego} bzdruy bzdury
Nową linię zaczynamy komendą \newline. Nowy paragraf: \par. Nową stronę: \newpage.
Teraz będzie nowa linia\newline To juz jest w nowej linii. Teraz skoncze paragraf.\par I do nowej strony\newpage
Przydaje się też otoczenie verbatim, służące do wstawiania kodu programu:
\begin{verbatim} program x; begin writeln('Hello world'); end. \end{verbatim}
Poniżej zamieszczamy tabelę czasem potrzebnych otoczeń:
quote quotation | Do cytowania tekstów |
verse | Do umieszczania wierszy |
flushleft center flushright | Umieszcza tekst po odpowiedniej stronie |
itemize | Wypunktowanie |
enumerate | Wyliczenie |
description | Otoczenie słownikowe :) |
thebibliography | Bibliografia |
list trivlist | Środek definiowania listopodobnych otoczeń |
verbatim | Wstawienie kodu |
minipage | Strona w stronie - wyróżniony fragment strony |
tabular | Tabelka |
tabbing | Otoczenie, gdzie możemy dowolnie wstawiać tabulatory |
array | Matematyczna tabela |
cases | Definiowanie przez przypadki (matematyczne) |
picture | Prosty obrazek (z komend) |
Nieraz makra dostarczane przez LaTeXa nam nie wystarczają. Dlatego podstawowym mechanizmem pisania dokumentów w LaTeXie jest pisanie własnych makr. W ten sposób, na początku dokumentu, opisujemy potrzebne nam otoczenia i makra, używając ew. formatowania i komend dotyczących stylu, a w dokumencie później używamy tylko makr.
Makro definiujemy poleceniem \newcommand, przedefiniowywujemy \renewcommannd (nieraz nasza wspaniała nazwa na makro jest już gdzieś w jakiejś bibliotece użyta i trzeba je przykryć. UWAGA! możemy tak coś zepsuć w wielu innych makrach). Możemy np. w dokumencie nazwać naszego klienta, by cały czas nie pisać jego długiej nazwy:
\newcommand{\kli}{Nasz Wielki I Wspaniały Klient Co Nam Płaci Kupę Kasy Za Głupi Projekt, sp. z o.o.}
Makro nie robi nic innego, jak tylko podmienia każde wystąpienie \kli przez tekst - drugi argument \newcommand.
Makro może przyjmować argumenty:
\newcommand{\nazwa}[liczba_argumentow_wszystkich][liczba_argumentow_opcjonalnych]{tresc}
W treści makra odwołujemy się do argumentów przez #x, gdzie x - numer argumentu. Jeśli wyspecyfkujemy liczbę argumentów opcjonalnych na n, to pierwsze n argumentów będzie opcjonalne. Makro działa prosto: LaTeX każde wystąpienie \nazwa[..]{argumenty} zastąpi treścią makra, podmieniając #x na treść argumentów. Na przykład możemy definiować cechy produktu w Wizji:
\newcommand{\cecha}[2]{\subsubsection{#1}\par #2\par} \subsection{Cechy z punktu widzenia użytkownika} \cecha{Przeszukanie dostępnych piosenek}{Użytkownik powinien mieć możliwość wprowadzenia kryteriów przeszukiwania zbioru piosenek conajmniej pod kątem: \begin{itemize} \item tytułu, \item twórców: autor tekstu, autor muzyki, wykonawca, \item albumu. \end{itemize} } ...
Możemy też zdefiniować własne otoczenia za pomocą \newenvironment i \renewenvironment:
\newenvironment{nazwa}[liczba_argumentów][liczba_argumentów_opcjonalnych] {tresc_do_wstawienia_przy_begin}{tresc_do_wstawienia_przy_end}
Działa ona tak samo jak komenda, tylko dostarczamy dwa "mięska": jedno będzie wstawione zamiast \begin{nazwa}, a drugie zamiast \end{nazwa}, np:
\newenvironment{seriazadan}[1]{\begin{center}\par Zadania dla #1\par\end{center}\par}{\newline} ... \begin{seriazadan}{klasy pierwszej} zadanie 1. .... \end{seriazadan}
\par to nowy paragraf, równoważne pustej linii.
Na IO taka była definicja jednego TUCa, czyli Technical Use Case:
\newcommand{\tuc}[6]{ \if#1- \else \subsection{#1} \if#2- \else \subsubsection{Opis} #2\par \fi \if#3- \else \subsubsection{Przebieg} \setcounter{inneflowy}{0} #3\par \fi \if#4- \else \subsubsection{Wymogi wstępne} Aby przypadek został wykonany, muszą zostać spełnione następujące kryteria. \begin{itemize} #4 \end{itemize} \fi \if#5- \else \subsubsection{Stan po przypadku} Po wykonaniu przypadku użycia, system spełnia następujące warunki: \begin{itemize} #5 \end{itemize} \fi \if#6- \else \subsubsection{Uwagi} #6 \fi \fi}
Podawało mu się sześć argumentów: nazwę, opis, przebieg, wymogi wstępne, stan po przypadku i uwagi. W wielu tucach jednak niektóre z elementów były puste: jeśli się podało zamiast nich "-", to nie były one wogóle wyświetlane. UWAGA! \if itd są komendami TeXa, dlatego tak brzydko wyglądają.
Poniżej podamy kilka innych przydatnych rzeczy, w szczególności jak formatować tekst manualnie.
Możemy stosować następujące komendy do zmiany stylu czcionki:
\textrm{...} | krój szeryfowy |
\textsf{...} | krój bezszeryfowy |
\texttt{...} | grotesk |
\textmd{...} | pismo jasne |
\textbf{...} | pismo grube |
\textup{...} | odmiana prosta |
\textit{...} | kursywa |
\textsl{...} | odmiana pochyła |
\textsc{...} | kapitaliki |
\textnormal{...} | normalny styl |
Do zmiany wielkości czcionki służą:
\tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge
\- | Tylko w tym miejscu można złamać wyraz między linijkami: przy\-padek nie będzie złamany przypa-dek |
~ | Twarda spacja, np. na~wydziale |
\spacja | Wymuszona spacja. |
- -- --- ---- | Różnej długości myślniki: - to łącznik w wyrazach: czarno-biały, -- to łącznik liczb, np. 1900-2001, --- to klasyczny myślnik, ---- to minus matematyczny. |
\\ | Koniec wiersza |
\$ | To zwykły $ (podobnie dla innych specjalnych znaków) |
$\backslash$ | Tak uzyskujemy backslash |
,, '' | To cudzysłowy polskie |
% | Komentarz do końca linii |
\ldots | Wielokropek |
Chcieliśmy bardzo podziękować trzem składnikom, które pomogły nam stworzyć tę prezentację: