%% %% %% Algorithm Drawing Package - Felipe Bergo %% with automatic line numbering, nice display and indentation bars %% %% example (bad one ;-): %% %% \begin{nicealgo}{a.ref} %% \naTITLE{How To Find Prime Numbers} %% \naBEGIN{\naFOR $i=0$ \naTO $+\infty$ \naDO } %% \naEND{ask $i$ if it's prime.} %% \end{nicealgo} %% %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{nicealgo} [2003/06/30 v1.5 nice algorithm drawing% ] % % usage: \usepackage[options]{nicealgo} % % optional ( parameters in [] like \usepackage[br,nolines]{nicealgo} ) : % % language options: % English (default) - any one of english, us, uk, en % Portuguese - any one of pt, portugues, portuges % Brazilian Portuguese - any one of br, brazil % % style options: % Draw lines on indentation % (default) - lines % Do not draw lines on % indentation - nolines % Draw dash before title % (default) - dash % Do not draw dash before % title - nodash % Less indentation - narrow % % Provided Environments: % % \begin{nicealgo}{yourlabel} ... \end{nicealgo} % - you can reference the algorithm number % with \ref{yourlabel} % % Provided Commands: % % \naTITLE{yourtitle} - running title of the algorithm (must be % the first thing inside the nicealgo environment) % \naINPUT{text} - typesets input variables in the preamble % \naOUTPUT{text} - typesets output variables in the preamble % \naAUX{text} - typesets aux variables in the preamble % \naSKIP - skips fixed vertical space after the preamble % % \naBEGIN{text} - first line of a new indentation level % \na{text} - algorithm line, current indentation % \naEND{text} - last line of current indentation % \naENDN{n}{text} - last line of n indentation levels % \nac{text} - continuation line, looks ugly. % \nacBEGIN{text} - continuation line, looks ugly. % \nacEND{text} - continuation line, looks ugly. % \nacENDN{n}{text} - continuation line, looks ugly. % % \naword{word} - typesets word in keyword typeface % \naname{text} - typesets algorithm name as in the title % % Existing keywords: % % \naWHILE \naIF \naTHEN \naELSE \naFOR % \naFOREACH \naDO \naREPEAT \naUNTIL \naRETURN % \naEXIT \naTO % % Additional stuff: % % \mget - typesets a left arrow for assignment % (like a <- 0). Inside math mode only. % \newcommand{\naiFOR}{fnord } \newcommand{\naiTO}{fnord } \newcommand{\naiDO}{fnord } \newcommand{\naiFOREACH}{fnord } \newcommand{\naiWHILE}{fnord } \newcommand{\naiIF}{fnord } \newcommand{\naiTHEN}{fnord } \newcommand{\naiELSE}{fnord } \newcommand{\naiREPEAT}{fnord } \newcommand{\naiUNTIL}{fnord } \newcommand{\naiRETURN}{fnord } \newcommand{\naiEXIT}{fnord } \newcommand{\naiBREAK}{fnord } % added by GJFB in 2011-05-10 \newcommand{\naiALGORITHM}{fnord } \newcommand{\naiINPUT}{fnord } \newcommand{\naiOUTPUT}{fnord } \newcommand{\naiAUX}{fnord } \newcommand{\naiGLOBAL}{fnord } % added by GJFB in 2010-10-28 \newcommand{\naiMAXPH}{\naiAUX} \newif\if@lines\@linestrue \newif\if@dash\@dashtrue \newif\if@narrow\@narrowfalse \DeclareOption{english}{ \renewcommand{\naiFOR}{For } \renewcommand{\naiTO}{to } \renewcommand{\naiDO}{do } \renewcommand{\naiFOREACH}{For each } \renewcommand{\naiWHILE}{While } \renewcommand{\naiIF}{If } \renewcommand{\naiTHEN}{then } \renewcommand{\naiELSE}{Else } \renewcommand{\naiREPEAT}{Repeat } \renewcommand{\naiUNTIL}{Until } \renewcommand{\naiRETURN}{Return } \renewcommand{\naiEXIT}{Exit } \renewcommand{\naiBREAK}{Break } % added by GJFB in 2011-05-10 \renewcommand{\naiALGORITHM}{Algorithm} \renewcommand{\naiINPUT}{Input:} \renewcommand{\naiOUTPUT}{Output:} \renewcommand{\naiAUX}{Auxiliary:} \renewcommand{\naiGLOBAL}{Global:} % added by GJFB in 2010-10-28 \renewcommand{\naiMAXPH}{\naiAUX} } \DeclareOption{portugues}{ \renewcommand{\naiFOR}{Para } \renewcommand{\naiTO}{At{\'e} } \renewcommand{\naiDO}{Fa{\c{c}}a } \renewcommand{\naiFOREACH}{Para Cada } \renewcommand{\naiWHILE}{Enquanto } \renewcommand{\naiIF}{Se } \renewcommand{\naiTHEN}{Ent{\~{a}}o } \renewcommand{\naiELSE}{Sen{\~{a}}o } \renewcommand{\naiREPEAT}{Repita } \renewcommand{\naiUNTIL}{At{\'e} Que } \renewcommand{\naiRETURN}{Retorne } \renewcommand{\naiEXIT}{Termine } \renewcommand{\naiBREAK}{Interrompa } % added by GJFB in 2011-05-10 % \renewcommand{\naiALGORITHM}{Algoritmo} \renewcommand{\naiALGORITHM}{Algorítmo} % added by GJFB in 2010-09-11 \renewcommand{\naiINPUT}{Entrada:} \renewcommand{\naiOUTPUT}{Sa{\'\i}da:} \renewcommand{\naiAUX}{Auxiliares:} \renewcommand{\naiGLOBAL}{Global:} % added by GJFB in 2010-10-28 \renewcommand{\naiMAXPH}{\naiAUX} } %%% proxies for the provided options \DeclareOption{us}{ \ExecuteOptions{english}} \DeclareOption{uk}{ \ExecuteOptions{english}} \DeclareOption{br}{ \ExecuteOptions{portugues}} \DeclareOption{pt}{ \ExecuteOptions{portugues}} \DeclareOption{brazil}{ \ExecuteOptions{portugues}} \DeclareOption{portuges}{ \typeout{Hmm, babel-educated person, it's 'portugues', not 'portuges'.}% \ExecuteOptions{portugues}} \DeclareOption{lines}{\@linestrue} \DeclareOption{nolines}{\@linesfalse} \DeclareOption{dash}{\@dashtrue} \DeclareOption{nodash}{\@dashfalse} \DeclareOption{narrow}{\@narrowtrue} %% defaults \ExecuteOptions{english} \ExecuteOptions{lines} \ExecuteOptions{dash} \ProcessOptions* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage{calc} \newcounter{nalevel} \newcounter{naline} \newcounter{natmp} \newcounter{nahaspreamble} \newlength{\naxxx} \newlength{\nayyy} \newlength{\nazzz} \newcommand{\natab}{\if@narrow xxx \= x \= x \= x \= x \= x \= x \= x \= x \= x \= x \= x \= x \= x\kill\else xxx \= xx \= xx \= xx \= xx \= xx \= xx \= xx \= xx \= xx \= xx \= xx \= xx \= xx\kill\fi} \newcommand{\navert}{\if@lines\>$\,$\vrule \@width 0.5pt \>\else \>\fi} \newcommand{\nacorner}{\if@lines\>$\,$\setlength{\nazzz}{.09\baselineskip}\addtolength{\nazzz}{0.5pt}\vrule \@width 0.5pt \@height 0.7\baselineskip \@depth -.09\baselineskip\vrule \@width 4pt \@height \nazzz \@depth -.09\baselineskip \>\else \>\fi} % font used for the preamble headers, likely to be sticky, protect with { } if needed \newcommand{\napreambfh}[1]{\textsc{#1}} % font used for preamble body \newcommand{\napreambft}[1]{\emph{#1}} \newtheorem{nicealgorithm}{\rm\bf \naiALGORITHM} % #1:label for \ref \newenvironment{nicealgo}[1]{ \setcounter{nahaspreamble}{0}\begin{nicealgorithm}\label{#1}\setcounter{nalevel}{0}\setcounter{naline}{1}} {\end{tabbing}\end{small}\end{nicealgorithm}} \newcommand{\naentertab}{\begin{tabbing}\natab\it} \newcommand{\naleavetab}{\rm\end{tabbing}} \newcommand{\naname}[1]{{\textrm{\textsc{#1}}}} % #1: title \newcommand{\naTITLE}[1]{\if@dash{--} \fi\naname{#1}\begin{small}\vspace{8pt}\\} %% the twocolumn 0.48 factor guess is known to work with the IEEEtran class, %% not tested elsewhere. \newcommand{\naPREAMBLE}{ \setcounter{nahaspreamble}{1} \settowidth{\naxxx}{\napreambfh{\naiMAXPH}} \setlength{\nayyy}{\textwidth} \if@twocolumn \setlength{\nayyy}{0.48\textwidth} \fi \addtolength{\nayyy}{-1.0\naxxx} \addtolength{\nayyy}{-2em} \begin{tabular}{lp{\nayyy}} } \newcommand{\naBODY}{ \ifnum\value{nahaspreamble}>0 \end{tabular} \fi \naentertab } \newcommand{\naINPUT}[1]{\napreambfh{\naiINPUT} & \napreambft{#1} \\} \newcommand{\naOUTPUT}[1]{\napreambfh{\naiOUTPUT} & \napreambft{#1} \\} \newcommand{\naAUX}[1]{\napreambfh{\naiAUX} & \napreambft{#1} \\} \newcommand{\naGLOBAL}[1]{\napreambfh{\naiGLOBAL} & \napreambft{#1} \\} % added by GJFB in 2010-10-28 \newcommand{\naCONTINUE}[1]{ & \napreambft{#1} \\} % added by GJFB in 2010-09-11 % prints and increments line number %\newcommand{\naprintnum}{\emph{\arabic{naline}.}\>\addtocounter{naline}{1}} % commented by GJFB in 2010-10-02 - \emp{} commute between normal and italics , i.e., \emph{\emph{1}} == 1 \newcommand{\naprintnum}{\textsl{\arabic{naline}.}\>\addtocounter{naline}{1}} % added by GJFB in 2010-10-02 \newcommand{\napbar}[1]{\ifnum#1>0\navert \setcounter{natmp}{#1}\addtocounter{natmp}{-1} \napbar{\value{natmp}}\fi} % prints bars \newcommand{\naprintbars}{\napbar{\value{nalevel}}} \newcommand{\naprintcorners}[1]{\ifnum#1>0\nacorner\setcounter{natmp}{#1} \addtocounter{natmp}{-1}\naprintcorners{\value{natmp}}\fi} % algorithm line, starting an indentation level \newcommand{\naBEGIN}[1]{\naprintnum\naprintbars #1 \addtocounter{nalevel}{1} \\} % algorithm line, keeping indentation level \newcommand{\na}[1]{\naprintnum\naprintbars #1 \\} % continuation line \newcommand{\nac}[1]{\>\naprintbars \> #1 \\} % continuation line \newcommand{\nacBEGIN}[1]{\>\naprintbars \> #1 \addtocounter{nalevel}{1} \\} % continuation line \newcommand{\nacEND}[1]{\nacENDN{1}{#1}} % continuation line \newcommand{\nacENDN}[2]{\>\ifnum#1>0\setcounter{natmp}{#1}\loop \addtocounter{nalevel}{-1}\addtocounter{natmp}{-1} \ifnum\value{natmp}>0\repeat\fi\naprintbars\ifnum#1>1 \naprintcorners{#1}\else\naprintcorners{1}\fi \> #2\\} % algorithm line, last of indentation level % optional arg: number of levels to leave \newcommand{\naENDN}[2]{\naprintnum\ifnum#1>0\setcounter{natmp}{#1}\loop \addtocounter{nalevel}{-1}\addtocounter{natmp}{-1} \ifnum\value{natmp}>0\repeat\fi\naprintbars\ifnum#1>1 \naprintcorners{#1}\else\naprintcorners{1}\fi #2\\} \newcommand{\naEND}[1]{\naENDN{1}{#1}} \newcommand{\naword}[1]{\textsf{\textbf{#1}}} \newcommand{\naWHILE}{\naword{\naiWHILE}} \newcommand{\naIF}{\naword{\naiIF}} \newcommand{\naTHEN}{\naword{\naiTHEN}} \newcommand{\naELSE}{\naword{\naiELSE}} \newcommand{\naFOR}{\naword{\naiFOR}} \newcommand{\naTO}{\naword{\naiTO}} \newcommand{\naFOREACH}{\naword{\naiFOREACH}} \newcommand{\naDO}{\naword{\naiDO}} \newcommand{\naREPEAT}{\naword{\naiREPEAT}} \newcommand{\naUNTIL}{\naword{\naiUNTIL}} \newcommand{\naRETURN}{\naword{\naiRETURN}} \newcommand{\naEXIT}{\naword{\naiEXIT}} \newcommand{\naBREAK}{\naword{\naiBREAK}} % added by GJFB in 2011-05-10 \newcommand{\mget}{\leftarrow}