LaTeX/Algoritmi
LaTeX ima nekoliko paketa za algoritme u formi "pseudocode". Oni obezbeđuju stilizovana poboljšanja preko ujednačenog stila (tojest., u typewriter fontu) tako da petlje ili kondicionali budu vizualono odvojeni od ostalog teksta . Za typesetting real kod, kucan u pravom programskom jeziku, pogledajte listings paket opisan u Listiranje izvornog koda.
Podešavanje typesetting korišćenjem algorithmic paketa
[uredi]algorithmic paket koristi drugačiji set komandi od algorithmicx paketa. ovo nije kompatibilno sa revtex4-1. Osnovne komande su:
\STATE <text>
\IF{<condition>} \STATE{<text>} \ELSE \STATE{<text>} \ENDIF
\FOR{<condition>} \STATE{<text>} \ENDFOR
\FOR{<condition> \TO <condition> } \STATE{<text>} \ENDFOR
\FORALL{<condition>} \STATE{<text>} \ENDFOR
\WHILE{<condition>} \STATE{<text>} \ENDWHILE
\REPEAT \STATE{<text>} \UNTIL{<condition>}
\LOOP \STATE{<text>} \ENDLOOP
\REQUIRE <text>
\ENSURE <text>
\RETURN <text>
\PRINT <text>
\COMMENT{<text>}
\AND, \OR, \XOR, \NOT, \TO, \TRUE, \FALSE
Komplenta dokumentacija se nalazi na [2]. Većina komandi je slična algorithmicx ekvivalentima, ali sa drugačijim naglašavanjem.
algorithms bundle пакет на ctan repository, dated 2009-08-24, описује algorithmic окружење (за typesetting алгоритма) као и algorithm floating wrapper (погледајте below) који је дизајниран да обмота окружење алготитма.
algorithmic paket se preporučuje za IEEE journals jer je deo njihovog uobičajenog stila.[1]
Podešavanje typesetting koprišćenjem algorithm2e paketa
[uredi]algorithm2e paket (prvo objavljen 1995., a poseldnje unapređenje dobio januara 2013. kako se navodi na v5.0 manual) omogućava typesetting algotitma sa dosta mogućnosti prilagođavanja. Kao algorithmic paket, ovaj paket takođe nije kompatibilan sa Revtex-4.1.[2]
Za razliku od algorithmic, algorithm2e omogućava relativno veliki broj opcija prilagođavanja za izgled algoritma koje zadovoljavaju potrebe korisnika. CTAN-manual obezbeđuje razumljivu listu primera i set kotrola.
Uobičajeno, upotreba između \begin{algorithm} i \end{algorithm} bila bi
1. Postavljanje seta ključnih reči (to typeset as functions/operators), kotrole izgleda, naslova, teksta u zaglavlju (koji se pojavljuje pre glavnih koraka algoritma na primer.: Input,Output)
2. Pisanje glavnih koraka algoritma, gde se svaki korak završava sa \;
Možemo pronaći analogiju sa latex-preambulom pre no što počnemo sam dokument.
Paket se učitava kao
\usepackage[]{algorithm2e}
jednostavan primer, uzet iz v4.01 uputstva, je
\begin{algorithm}[H]
\KwData{this text}
\KwResult{how to write algorithm with \LaTeX2e }
initialization\;
\While{not at end of this document}{
read current\;
\eIf{understand}{
go to next section\;
current section becomes this one\;
}{
go back to the beginning of current section\;
}
}
\caption{How to write algorithms}
\end{algorithm}
Koji pravi
Više informacija su u priručniku priloženom na ctan website.
Podešavanje typesetting koprišćenjem algorithmicx paketa
[uredi]algorithmicx paket obezbeđuje dosta konstrukata za dizajn algoritma. Postavite \usepackage{algpseudocode} u preabmuli da biste koristili algoritamsko okruženje za pisanje algotitamskog pseudokoda (\begin{algorithmic}...\end{algorithmic}). Možda biste želeli da koristite (\usepackage{algorithm}) da obuhvatite kod algotitma u algoritamsko okruženje (\begin{algorithm}...\end{algorithm}) da napravite floating okruženje sa numerisanim algoritmima.
Komandi \begin{algorithmic} može se dodeliti ppoizvoljni argument pozitivnog intidžera, koji ako zadat prouzrokuje da se linije nabrajanja javljaju na sadržatelju tog intidžera. npr. \begin{algorithmic}[5] će ući u algoritamsko oruženje i pobrojati svaku petu liniju.
Ispod je primer typesetting elementarnog algoritma korišćenjem algorithmicx paketa (ne zaboravite da ubacite i \usepackage{algpseudocode} iskaz u preambuli vašeg dokumenta):
\begin{algorithmic}
\If {$i\geq maxval$}
\State $i\gets 0$
\Else
\If {$i+k\leq maxval$}
\State $i\gets i+k$
\EndIf
\EndIf
\end{algorithmic}
LaTeX izvor se može pisati u formi oznatoj svim programerima tako da bude lako čitljiv. Ovo ipak neće uticati na finalni izgled dokumenta.
Osnovne komande imaju sledeću sintaksu:
Iskaz (\Iskaz sa kosom crtom prebacuje u novi red, i može se takođe koristiti ispred ostalih komandi)
\State $x\gets <value>$
Tri forme if-iskaza:
\If{<condition>} <text> \EndIf
\If{<condition>} <text> \Else <text> \EndIf
\If{<condition>} <text> \ElsIf{<condition>} <text> \Else <text> \EndIf
Treća forma prihvata onoliko \ElsIf{} klauzula koliko je potrebno. Obratite pažnju da se koristi \ElsIf a ne \ElseIf.
Petlje:
\For{<condition>} <text> \EndFor
\ForAll{<condition>} <text> \EndFor
\While{<condition>} <text> \EndWhile
\Repeat <text> \Until{<condition>}
\Loop <text> \EndLoop
Pre- and postcondition:
\Require <text>
\Ensure <text>
Funkcije
\Function{<name>}{<params>} <body> \EndFunction
\Return <text>
\Call{<name>}{<params>}
Ova komanda će se obično koristiti u kombinaciji sa \State komandom na ovaj način:
\Function{Increment}{$a$}
\State $a \gets a+1$
\State \Return $a$
\EndFunction
Komentari:
\Comment{<text>}
Korisnicima koje su se prebacili sa starog algorithmic paketa: komentari se mogu nalaziti bilo gde; nema ograničenja kao u starom algorithmic paketu.
Preimenovanje: algorithm to procedure, require/ensure to input/output
[uredi]\floatname{algorithm}{Procedure}
\renewcommand{\algorithmicrequire}{\textbf{Input:}}
\renewcommand{\algorithmicensure}{\textbf{Output:}}
Prilagodljivi blokovi algoritma
[uredi]algorithmicx пакет Вам омогућава да дефинишете ваша сопствена окружења.
Da biste definisali početak sa početnom komandom i kraj sa krajnjom komandom, koristite,
\algblock[<block>]{<start>}{<end>}
Ovo definiše dve komande \<start> i \<end> koje nemaju parametre. Tekst prikazan je \textbf{<start>} i \textbf{<end>}.
Sa \algblockdefx možete postavti tekst kao autput koristeći početak i kraj komande i brojeve parametara za ove komande. U tekstu n-ti parametar se referencira sa #n.
\algblockdefx[<block>]{<start>}{<end>}
[<startparamcount>][<default value>]{<start text>}
[<endparamcount>][<default value>]{<end text>}
Primer:
\algblock[Name]{Start}{End}
\algblockdefx[NAME]{START}{END}%
[2][Unknown]{Start #1(#2)}%
{Ending}
\algblockdefx[NAME]{}{OTHEREND}%
[1]{Until (#1)}
\begin{algorithmic}
\Start
\Start
\START[One]{x}
\END
\START{0}
\OTHEREND{\texttt{True}}
\End
\Start
\End
\End
\end{algorithmic}
Naprednija prilagođavanja i ostali konstrukti su opisani u algorithmicx priručniku: http://mirror.ctan.org/macros/latex/contrib/algorithmicx/algorithmicx.pdf
algorithm okruženje
[uredi]Često je korisno za algoritme napravljene sa algorithmic da budu "floated" do optimalne tačke
u dokumentu da bi se izbeglo njihovo razdvajanje po stranici .Okruženje algorithm omogućava ovo i još nekoliko korisnih osobina. Uključite je dodajući
\usepackage{algorithm}
u preambulu dokumenta. U njega se ulazi sa
\begin{algorithm}
\caption{<your caption for this algorithm>}
\label{<your label for references later in your document>}
\begin{algorithmic}
<algorithmic environment>
\end{algorithmic}
\end{algorithm}
Nabrajanje algoritma
[uredi]Osnovni sistem nabrajanja za algorithm paket je da nabrajate algoritme sekvencijalno. Ovo često nije poželjno, posebno u velikom dokumentu gde se nabraja po poglavljima. Na nabrajanje algoritma se može uticati tako što se dodeli komponenta ime dokumenta u kojoj je nabrajanje preporučeno. Legalne vrednosti za ovu opciju su: part, chapter, section, subsection, subsubsection or nothing (default). Na primer:
\usepackage[chapter]{algorithm}
Lista algoritma
[uredi]Kada koristite figure ili tabele, možete ih ubaciti u listu sličnu sadržaju; algorithm paket omogućava sličnu komandu. Samo stavite
\listofalgorithms
bilo gde u dokumentu, i LaTeX će štampati listu "algoritamskih" okruženja u dokumetnu sa odgovarajućom stranicom i naslovom.
Primer iz priručnika
[uredi]Ovaj primer je uzet iz (official manual, p.14)
\begin{algorithm} % enter the algorithm environment
\caption{Calculate $y = x^n$} % give the algorithm a caption
\label{alg1} % and a label for \ref{} commands later in the document
\begin{algorithmic} % enter the algorithmic environment
\REQUIRE $n \geq 0 \vee x \neq 0$
\ENSURE $y = x^n$
\STATE $y \Leftarrow 1$
\IF{$n < 0$}
\STATE $X \Leftarrow 1 / x$
\STATE $N \Leftarrow -n$
\ELSE
\STATE $X \Leftarrow x$
\STATE $N \Leftarrow n$
\ENDIF
\WHILE{$N \neq 0$}
\IF{$N$ is even}
\STATE $X \Leftarrow X \times X$
\STATE $N \Leftarrow N / 2$
\ELSE[$N$ is odd]
\STATE $y \Leftarrow y \times X$
\STATE $N \Leftarrow N - 1$
\ENDIF
\ENDWHILE
\end{algorithmic}
\end{algorithm}
- Zvanični priručnik se nalazi na
- http://mirrors.ctan.org/macros/latex/contrib/algorithms/algorithms.pdf
Podešavanje typesetting korišćenjem program paketa
[uredi]Paket program obezbeđuje macros za typesetting algoritma. Svaka linija je podešena u math modu, tako da su raymaci i naglašavanja automatski odrađeni . |variable_name| može biti korišćena i u normalnom tekstu, matematičkim ekspresijama ili programima da naglasi ime varijable. Koristite \origbar da biste dobili normalni | simbol u programu. Komande \A, \B, \P, \Q, \R, \S, \T i \Z mogu se slagati i sa boldovanim slovom sledećeg objekta kao podskripta (eg \S1 typesets {\bf S$_1$} etc). Osnovni rade normalno, eg \S‘‘.
Ispod je primer typesetting osnovnog algoritma koristeći program paket (ne zaboravite da dodate \usepackage{program} iskaz u preambuli dokumenta):
\begin{program}
\mbox{A fast exponentiation procedure:}
\BEGIN \\ %
\FOR i:=1 \TO 10 \STEP 1 \DO
|expt|(2,i); \\ |newline|() \OD %
\rcomment{This text will be set flush to the right margin}
\WHERE
\PROC |expt|(x,n) \BODY
z:=1;
\DO \IF n=0 \THEN \EXIT \FI;
\DO \IF |odd|(n) \THEN \EXIT \FI;
\COMMENT{This is a comment statement};
n:=n/2; x:=x*x \OD;
\{ n>0 \};
n:=n-1; z:=z*x \OD;
|print|(z) \ENDPROC
\END
\end{program}
Komande \( and \) su redefinisane da bi se algoritam predstavio u vidu male stranice, tako da se može prikazti kao jedan prozor ili u formuli. Na primer, da bi izkazali da je određeni sistem akcija ekvivalentan WHILE petlji možete pisati:
\[
\( \ACTIONS A:
A \EQ \IF \B{} \THEN \S{}; \CALL A
\ELSE \CALL Z \FI \QE
\ENDACTIONS \)
\EQT
\( \WHILE \B{} \DO \S{} \OD \)
\]
Dijkstra kondicionali i petlje:
\begin{program}
\IF x = 1 \AR y:=y+1
\BAR x = 2 \AR y:=y^2
\utdots
\BAR x = n \AR y:=\displaystyle\sum_{i=1}^n y_i \FI
\DO 2 \origbar x \AND x>0 \AR x:= x/2
\BAR \NOT 2 \origbar x \AR x:= \modbar{x+3} \OD
\end{program}
Petlje sa više izlaza:
\begin{program}
\DO \DO \IF \B1 \THEN \EXIT \FI;
\S1;
\IF \B2 \THEN \EXIT(2) \FI \OD;
\IF \B1 \THEN \EXIT \FI \OD
\end{program}
Primer obratnog inženjeringa.
Ovo je originalni program:
\begin{program}
\VAR \seq{m := 0, p := 0, |last| := `` ''};
\ACTIONS |prog|:
|prog| \ACTIONEQ %
\seq{|line| := `` '', m := 0, i := 1};
\CALL |inhere| \ENDACTION
l \ACTIONEQ %
i := i+1;
\IF (i=(n+1)) \THEN \CALL |alldone| \FI ;
m := 1;
\IF |item|[i] \neq |last|
\THEN |write|(|line|); |line| := `` ''; m := 0;
\CALL |inhere| \FI ;
\CALL |more| \ENDACTION
|inhere| \ACTIONEQ %
p := |number|[i]; |line| := |item|[i];
|line| := |line| \concat `` '' \concat p;
\CALL |more| \ENDACTION
|more| \ACTIONEQ %
\IF (m=1) \THEN p := |number|[i];
|line| := |line| \concat ``, '' \concat p \FI ;
|last| := |item|[i];
\CALL l \ENDACTION
|alldone| \ACTIONEQ |write|(|line|); \CALL Z \ENDACTION \ENDACTIONS \END
\end{program}
A ovo trensformisana, prepravljena verzija:
\begin{program}
\seq{|line| := `` '', i := 1};
\WHILE i \neq n+1 \DO
|line| := |item|[i] \concat `` '' \concat |number|[i];
i := i+1;
\WHILE i \neq n+1 \AND |item|[i] = |item|[i-1] \DO
|line| := |line| \concat ``, '' \concat |number|[i]);
i := i+1 \OD ;
|write|(|line|) \OD
\end{program}
Paket takođe obezbeđuje macro za typesetting set kao ovaj: \set{x \in N | x > 0}.
Linije se mogu nabrajati postavljajući \NumberProgramstrue i isključenjem nabrajanja \NumberProgramsfalse
Reference
[uredi]- Zvanični priručnik za algorithms paket, Rogério Brito (2009), http://mirrors.ctan.org/macros/latex/contrib/algorithms/algorithms.pdf