TeX i LaTeX - od A do Ą

0. Spis treści

1. Podstawy działania, uruchamianie

1.1. Jak to dziala? LaTeX, a TeX

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".

1.2. Wersje, instalacja

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.

1.3. Edytor

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

1.4. Uruchamianie - "kompilacja"

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/$<

2. Pierwszy plik LaTeX

2.1. Hello World

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.

2.2. Witaj świecie, czyli o polskich znakach

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}

2.3. O komendach i otoczeniach

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.

2.4. O pakietach

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
harvardDo robienia bibliografii

3. Podstawowa struktura logiczna

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.

3.1. Section, subsection,...

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).

3.2. Strona nagłówkowa i spis treści

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.

4. Listy, tabele i inne

Poniżej przedstawiamy kilka innych logicznych struktur, dostarczanych nam przez LaTeX.

4.1. Listy, wypunktowania

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}

4.2. Tabele

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ć:

4.3. Label i ref

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

4.4. Wstawianie grafiki

Grafikę wstawiamy z formatu eps, przy pomocy pakietu graphicx. Oto przykład:

\includegraphics{scale=0.3, height=10, width=15, angle=15}[plik.eps]

4.5. Liczniki

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}

4.6. Styl matematyczny

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

4.7. Różne

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
verseDo umieszczania wierszy
flushleft
center
flushright
Umieszcza tekst po odpowiedniej stronie
itemizeWypunktowanie
enumerateWyliczenie
descriptionOtoczenie słownikowe :)
thebibliographyBibliografia
list
trivlist
Środek definiowania listopodobnych otoczeń
verbatimWstawienie kodu
minipageStrona w stronie - wyróżniony fragment strony
tabularTabelka
tabbingOtoczenie, gdzie możemy dowolnie wstawiać tabulatory
arrayMatematyczna tabela
casesDefiniowanie przez przypadki (matematyczne)
pictureProsty obrazek (z komend)

5. Definiowanie własnych makr

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.

5.1. Proste makro

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.

5.2. Makra z argumentami

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

5.3. Własne otoczenia

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.

5.4. Zaawansowany przykład

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ą.

6. Komendy stylu i znaki specjalne

Poniżej podamy kilka innych przydatnych rzeczy, w szczególności jak formatować tekst manualnie.

6.1. Zmiana czcionki

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

6.2. Różne znaki specjalne

\-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
\spacjaWymuszona 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
\ldotsWielokropek

7. Bibliografia

Chcieliśmy bardzo podziękować trzem składnikom, które pomogły nam stworzyć tę prezentację: