LaTeX/Makroi
Dokumenti proizvode sa komandama koje ste naučili do sad i oni izgledaju prihvatljivo za veliki deo auditorijuma. Iako ne izgledaju fensi, oni poštuju sva utvrđena pravila i tekstualni raspored, koji ih čini lakim za čitanje i prijatnim za oko. Međutim, postoje situacije u kojima LaTeX ne daje komandu ili okruženje koje odgovara vašim potrebama, ili izlazna vrednost neke već postojeće komande ne može zadovoljiti vaše zahteve.
U ovom poglavlju ćemo pokušati da damo neke savete o tome kako da naučite nove LaTeX trikove i kako da napravite da štampanje izgleda drugačije od onoga što je obezbeđeno po podrazumevanoj opciji.
LaTeX je jezik na relativno visokom nivou u odnosu na Plain TeX i stoga je ograničeniji. Sledeće poglavlje će se fokusirati na Plain TeX i obajsniće napredne tehnike za programiranje.
Nove komande
[uredi]Da biste dodali svoje komande, koristite
\newcommand{име}[num]{дефиниција}
|
komandu. U suštini, komanda zahteva dva argumenta: ime komande koju želite da kreirate i definicija komande. Zapamtite da komanda ime može, ali ne mora biti zatvorena u zagradama, kako vi želite. Argument num u zagradi je opcioni i precizira broj argumenata koje nova komanda uzima (moguće je do 9 komandi). Ako nema podrazumevanu 0, onda nijedan argument nije dozvoljen.
Sledeća dva primera trebalo bi da vam pomognu da dobijete ideju. Prvi primer definiše novu komandu pod nazivom \wbal koja će štampati “Vikiknjiga o LaTeX-u”. Takva naredba može dobro doći ako biste morali da napišete naslov ove knjige iznova i iznova.
\newcommand{\wbal}{Викикњига о \LaTeX}
Ово је ‘‘\wbal'' \ldots{} ‘‘\wbal''
|
Ovo je “Vikiknjiga o LaTeX” … “Vikiknjiga o LaTeX” |
Sledeći primer ilustruje kako treba definisati novu komandu koja uzima jedan argument. Tag #1
biva zamenjen argumentom koji ste odredili. Ako želite da koristite više od jednog argumenta, koristite #2
i tako dalje, ovi argumenti se dodaju u dodatni set zagrada.
\newcommand{\wbalsup}[1] {
Ово је Викикњига о LaTeX
подржана од стране #1}
\newcommand{\wbalTwo}[2] {
Ово је Викикњига о LaTeX
подржана од стране #1 и #2}
% у телу документа:
\begin{itemize}
\item \wbalsup{Wikimedia}
\item \wbalsup{многих корисника!}
\item \wbalTwo{John Doe}{Anthea Smith}
\end{itemize}
|
|
Imenujte svoju novu komandu \wbalTwo
a ne \wbal2
sa brojevima jer se ne može koristiti za imenovanje makroa — nevažeći znakovi će izbaciti grešku pri kompajlovanju.
LaTeX neće dozvoliti da kreirate novu komandu koja će pregaziti postojeću. Ali postoji posebna komanda u slučaju da eksplicitno želite ovo: \renewcommand
. Koristi istu sintaksu kao \newcommand
komanda.
U određenim slučajevima možda ćete želeti da koristite \providecommand
komandu. Radio isto kao \newcommand
, ali ako je komanda već definisana, LaTeX će tiho ignorisati novu komandu.
Sa LaTex2e, takođe je moguće dodati podrazumevani parametar u komandu sa sledećom sintaksom:
\newcommand{name}[num][default]{дефиниција}
|
Ako je podrazumevani parametar \newcommand
prisutan, onda je prvi broj argumenata onaj koji je naveo num je ustvari opcionalan sa podrazumevanom vrednošću default; ako nema, onda su svi argumenti obavezni.
\newcommand{\wbalTwo}[2][Wikimedia]{
Ово је Викикњига о LaTeX
подржана од стране {#1} и {#2}!}
% in the document body:
\begin{itemize}
\item \wbalTwo{John Doe}
\item \wbalTwo[многих корисника]{John Doe}
\end{itemize}
|
|
- Napomena
- Kada se komanda koristi sa eksplicitnim prvim parametrom, on je dat u zagradi (ovde "[mnogih korisnika]").
Evo jednog čestog primera: ako pišete knjigu o Matematici i morate da koristite vektore, morate da odlučite kako će izgledati. Postoji nekoliko različitih standarda, koji se koriste u mnogim knjigama. Ako je a vektor, neki ljudi vole da dodaju strelicu iznad njega (), drugi ljudi podvlače (a); još jedna česta verzija je boldovanje (a). Pretpostavimo da želite da pišete vektore sa strelicom iznad njih; onda dodajte sledeću liniju u vaš mystyle.sty.
\newcommand{\myvec}[1]{\vec{#1}}
|
i pišete vaše vektore u novoj \myvec{...}
komandi. Možete ga zvati kako god želite, ali je bolje da izaberete kratko ime jer ćete ga verovatno pisati veoma često. Zatim, ako se predomislite i želite da vaši vektori drugačije izgledaju samo treba da promenite definiciju vaše \myvec{...}
komande. Koristite ovaj pristup kad god možete: to će vam uštedeti mnogo vremena i povećati doslednost vašeg dokumenta.
Deklarisanje jakih komandi
[uredi]Neke komande su lomljive, tako da ne uspevaju u nekim sredinama. Ako makro radi u telu teksta, ali ne i u (na primer) figuri natpisa, vredi pokušavati zamenu \newcommand{\MyCommand}...
deklaraciju sa \DeclareRobustCommand{\MyCommand}...
u preambuli. Ovo posebno važi za makro koji, kada je proširen, proizvodi tekst koji je upisan u .aux fajl.
Nova okruženja
[uredi]Baš kao i sa \newcommand
komandom, postoji komanda za stvaranje svojeg okruženja. Komanda \newenvironment
koristi sledeću sintaksu:
\newenvironment{име}[num]{before}{after}
|
Ponovo \newenvironment
može imati opcioni argument. Kada je \begin{name}
komanda (sa kojom počinje okruženje) pronađena, materijal koji je naveden u before argumentu se vodi pre teksta u okruženje na obrađivanje. Materijal u after argumentu biva obrađen kada se naiđe na \end{name}
komandu (sa kojim se završava okruženje).
Argument num se koristi na isti način kao i u \newcommand
komandi. LaTeX proverava da ne definiše okruženje koje već postoji. Ako ikada poželite da promenite postojeće komande, možete koristiti \renewenvironment
komandu. Koristi istu sintaksu kao i \newenvironment
komanda.
Primer ispod ilustruje upotrebu \newenvironment
komande:
\newenvironment{king}
{ \rule{1ex}{1ex}\hspace{\stretch{1}} }
{ \hspace{\stretch{1}}\rule{1ex}{1ex} }
\begin{king}
Моје скромне теме \ldots
\end{king}
|
Dodatan prostor
[uredi]Kada kreirate novo okruženje možete lako biti usporeni od strane dodatnog prostora, koji potencijalno mogu imati fatalne posledice. Na primer, kada vi
želite da stvorite okruženje za naslove koje ih potiskuje svojim uvlačenjem kao i
naredni paragraf. Komanda \ignorespaces
u
begin bloku okruženja će ignorisati svaki prostor nakon izvršavanja
ovog dela komande. Blok end je malo komplikovaniji jer se javlja kao posebna obrada
na kraju okruženja. With the \ignorespacesafterend
LaTeX će izdati komandu \ignorespaces
nakon što je posebna ‘end’ obrada završena.
\newenvironment{simple}%
{\noindent}%
{\par\noindent}
\begin{simple}
Погледајте простор\\на лево.
\end{simple}
Исто је и\\овде.
|
Погледајте простор на лево. Исто је и овде. |
\newenvironment{correct}%
{\noindent\ignorespaces}%
{\par\noindent%
\ignorespacesafterend}
\begin{correct}
Нема места\\на лево.
\end{correct}
Исто је и\\овде.
|
Нема места на лево. Исто је и овде. |
Takođe, ako i dalje imate problema sa dodatnim prostorom koji se pojavlja na kraju vašeg okruženja kada se koristi \input za spoljni izvor, uverite se da nema razmaka između početka, izvora i kraja okruženja, kao što je:
\begin{correct}\input{некифајл.tex}\end{correct}
|
ili
\begin{correct}%
\input{некифајл.tex}%
\end{correct}
|
Deklarisanje komandi sa novim okruženjem
[uredi]Nove komande mogu biti deklarisane u novim okruženjima. Komande koje su deklarisane sa novim okruženjem se odnose na njihove argumente sa udvajanjem # znaka. U sledećem primeru, novo okruženje je deklarisano uz grananje komande:
\newenvironment{topics}{
\newcommand{\topic}[2]{ \item{##1 / ##2\} }
Теме:
\begin{itemize}
}
{
\end{itemize}
}
|
Ako greškom, argumenti prođu do \topics , makro je definisan sa jednim # znakom, i izaćiće sledeća poruka o grešci:
! Illegal parameter number in definition of \topics.
Proširenje broja argumenata
[uredi]Paket xkeyval će vam omogućiti da definišete ključ/vrednost opcija za komande.
\mycommand[key1=value1, key3=value3]{неки текст}
|
Paket je prilično kompletan i dokumentacija je potpuna. Preporučujemo programerima da o paketu pročitaju. [1]
Hajde da pogledamo jedan jednostavan primer [1]:
\usepackage{xkeyval}
% ...
\makeatletter
\def\my@emphstyle#1{\csname my@style@#1\endcsname}
%% Предефинисани стилови
\providecommand\my@style@default{\em}
\providecommand\my@style@bold{\bfseries}
\define@key{myemph}{code}{%
\def\my@emphstyle{#1}
}
\define@key{myemph}{style}{%
\def\my@emphstyle{\csname my@style@#1\endcsname}
}
\newcommand\setemph[1]{%
\setkeys{myemph}{#1}
}
\renewcommand\emph[1]{%
{\my@emphstyle #1}
}
\makeatother
Нешто \emph{битно}
\setemph{style=bold}
Нешто \emph{битно}
\setemph{code=\Large\sffamily}
Нешто \emph{битно}
|
Aritmetika
[uredi]LaTeX može manipulisati brojevima.
Paket calc obezbeđuje zajedničku infix notaciju.
\usepackage{calc}
% ...
\newcounter{mine}
\setcounter{mine}{2*17}
\themine
|
Za visoke preciznosti kod izračunavanja, možete koristiti fp[2] paket.
\usepackage{fp}
% Clip
\[
\FPmul\result{2}{7}
\FPclip\result\result
2*7 = \result
\]
% Infix
\[
\newcommand\result{11}
\sqrt{\sin(2+\result)} \approx
\FPeval\result{round(root(2,sin(result + 2.5)),2)}
\result
\]
% Postfix
\[
\FPupn\result{17 2.5 + 17.5 swap - 2 1 + * 2 swap /} % or \FPupn\result{2 17.5 17 2.5 + - 2 1 + * /}
\FPclip\result\result
(17+2.5 - 17.5) * (2+1) / 2 = \result
\]
% Велика прецизност
\[
\FPdiv\result{17}{7}
\frac{17}{7} \approx \FPtrunc\result\result{3}
\result
\]
|
Kondicionali
[uredi]LaTeX može koristiti kondicionale zahvaljujući ifthen paketu.
\usepackage{ifthen}
% ...
\ifthenelse{ \equal{\myvar}{true} }{
Ово је true.
}{
Ово је false.
}
|
Petlje
[uredi]Ekstenzija PGF/TikZ pruža \foreach
komandu.
\usepackage{tikz}
% ...
\foreach \i/\q in {пшеница/50g, вода/1L, квасац/2g}{
\noindent\i\dotfill\q\\
}
|
Ako koristite samo \foreach
a ne crtanje grafika, možete koristiti direktno pgffor
paket.
Alternativno, možete proveriti multido paket.
Stringovi
[uredi]xstring pruža puno mogućnosti. Iz CTAN:
- testiranje sadržaja stringa
- raspakivanje podstringova
- zamena podstringova
- dužina stringa
- pozicija podstringa
- broj pojavljivanja podstringa
Primeri:
\usepackage{xstring}
% ...
\newcommand\mystr{Здраво свете!}
Стринг ``\mystr'' има \StrLen{\mystr}{} знакове.
Предикат ``\mystr{} садржи реч Здраво'' је \IfSubStr{\mystr}{Здраво}{true}{false}.
|
LaTeX "kuke"
[uredi]LaTeX pruža dve vrste kuke:
\AtBeginDocument
će vam odrediti skup komandi koje će biti izvršene kada se naiđe na\begin{document}
.\AtEndDocument
radi isto samo na\end{document}
.
To vam daje malo više fleksibilnosti za makroe. To može biti korisno za zamenu postavki koje se izvršavaju posle preambule. Ove kuke se mogu iskoristiti nekoliko puta. Komande će biti izvršene u cilju zbog koga su i postavljene.
Na primer, hajde da zamenimo brojeve stranica sa oldstylenums:
\usepackage{textcomp}
\AtBeginDocument{%
% Прави бројеве страница у тексту фигура
\let\myThePage\thepage
\renewcommand{\thepage}{ \oldstylenums{\myThePage} }
}
|
Tu su i kuke za klase i pakete. Pogledajte Kreiranje paketa.
Komandna linija LaTeX-a
[uredi]Ako radite na Unix-like OS, možete da koristite Makefiles ili bilo kakvu drugu skriptu kako bi napravili vaše LaTeX projekte. S tim u vezi moglo bi biti interesantno pravljenje različitih verzija istog dokumenta pozivom LaTeX-a sa parametrima komandne linije. Ako dodate sledeću strukturu u vaš dokument:
\usepackage{ifthen}
%...
% подразумевана вредност.
\providecommand\blackandwhite{false}
%...
\ifthenelse{ \equal{\blackandwhite}{true} }{
% "црно и бело" мод; ради нешто..
}{
% "боја" мод; ради нешто другачије..
}
|
Sada možete pozvati LaTeX ovako:
latex '\providecommand{\blackandwhite}{true}\input{test.tex}'
Prvo se komanda \blackandwhite
definiše, a zatim se stvarni fajl učita sa unosom. Onda, postavljanjem \blackandwhite
na false verzija boje dokumenta bi se napravila.
Referenciranje
[uredi]