Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

535 lines (534 sloc) 16.529 kB
% ALGORITHMIC STYLE -- Released 18 MAR 2004
% for LaTeX version 2e
%
% Copyright Szasz Janos
% E-mail szaszjanos@users.sourceforge.net
% Based on Peter Williams's algorithmic.sty
%
%
% *** INITIALISING ***
%
%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{algorithmicx}[2004/03/18 v1.1 Algorithmicx]
\RequirePackage{ifthen}
\typeout{Document Style algorithmicx 1.1 - a greatly improved `algorithmic' style}
%
\newcounter{ALG@line}
\newcounter{ALG@rem}
\newlength{\ALG@tlm}
\newlength{\ALG@ctlm}
\newlength{\algorithmicindent}
\setlength{\algorithmicindent}{1.5em}
\newcounter{ALG@blocknr}% the number of defined blocks
\setcounter{ALG@blocknr}{0}
\newcounter{ALG@tmpcounter}% only to decrement things
\def\algorithmicnoindent{-\ALG@tlm}
\def\algbackskipbegin{\hskip\ALG@ctlm}
\def\algbackskip{\hskip\ALG@ctlm\hskip-\ALG@tlm}
\def\algbackskipend{\hskip-\ALG@tlm}
\def\ALG@defaultindent{\algorithmicindent}
%
%
% *** ALGORITHMIC ***
%
%
\newenvironment{ALG@g}[1]% a list for the iner loops
{%
\begin{list}%
{\ALG@step}%
{%
\itemsep\z@%
\itemindent\z@%
\listparindent2em% the indent given to multiline lines...
\rightmargin\z@%
\topsep\z@%
\partopsep\z@%
\parskip\z@%
\parsep\z@%
\leftmargin#1%
\ALG@ctlm#1%
\addtolength{\ALG@tlm}{\leftmargin}%
\labelsep\ALG@tlm%
\addtolength{\labelsep}{0.5em}%
}%
\global\@newlistfalse% give no error, if the list is empty
}%
{\end{list}}%
%
% algorithmic environment
%
\let\ALG@beginalgorithmic\relax% for user overrides
\let\ALG@endalgorithmic\relax% for user overrides
\newenvironment{algorithmic}[1][0]%
{%
\def\@currentlabel{\theALG@line}%
\newcommand{\ALG@step}%
{%
\addtocounter{ALG@line}{1}%
\addtocounter{ALG@rem}{1}%
\ifthenelse{\equal{\arabic{ALG@rem}}{#1}}%
{\setcounter{ALG@rem}{0}{\footnotesize \arabic{ALG@line}:}}%
{}%
}%
%
\setcounter{ALG@line}{0}%
\setcounter{ALG@rem}{0}%
%
\let\@listii\@listi%
\let\@listiii\@listi%
\let\@listiv\@listi%
\let\@listv\@listi%
\let\@listvi\@listi%
\let\@listvii\@listi%
\renewcommand{\@toodeep}{}%
%
\renewcommand{\\}% for multiline parameters !!! needs fix
{%
\item%
\hskip\ALG@parindent%!!! not yet implemented
% \hskip-\algorithmicindent%
}%
%
\edef\ALG@currentitem{0}%
\let\ALG@currentvalue\relax%
%
\begin{list}%
{\ALG@step}%
{%
\rightmargin\z@%
\itemsep\z@ \itemindent\z@ \listparindent2em%
\partopsep\z@ \parskip\z@ \parsep\z@%
\labelsep 0.5em \topsep 0.0em%\skip 1.2em
\ifthenelse{\equal{#1}{0}}%
{\labelwidth 0.5em}%
{\labelwidth 1.2em}%
\leftmargin\labelwidth \addtolength{\leftmargin}{\labelsep}% Ok. the perfect leftmargin :-))
\ALG@tlm 0em%
\ALG@ctlm\ALG@tlm%
}%
\ALG@beginalgorithmic%
}%
{% end{algorithmic}
% \global\@newlistfalse% protects against empty algorithms, not needed
% check if all blocks are closed
\ALG@closeloops%
\ifnum0=\ALG@currentitem\relax%
\else%
\PackageError{algorithmicx}{Some blocks are not closed!!!}{Yes, you have some open blocks.}%
\fi%
\ALG@endalgorithmic%
\end{list}%
}%
%
%
% *** Functional core ***
%
%
\def\ALG@makeentitie#1% execute the entitie (#1)
{%
\expandafter\ifx\csname ALG@b@#1@0\endcsname\relax%
\ALG@makenobegin{#1}% this entitie ends or continues blocks
\else%
\ALG@makebegin{#1}% this entitie can open blocks
\fi%
\ALG@entitiecommand%
}%
%
\def\ALG@makebegin#1% executes an entitie (#1) that can open blocks
{%
\ifx\ALG@currentvalue\relax%
\ALG@openblock{0}{#1}% in infinite block I can open my block
\else%
\ifnum0<\ALG@currentvalue\relax%
\ifnum\ALG@currentvalue>65534\else%
\setcounter{ALG@tmpcounter}{\ALG@currentvalue}% the block has 'space' for another included block
\addtocounter{ALG@tmpcounter}{-1}%
\edef\ALG@currentvalue{\arabic{ALG@tmpcounter}}%
\fi%
\ALG@openblock{0}{#1}%
\else% the block needs to be closed
\expandafter\ifx\csname ALG@b@#1@\ALG@currentitem\endcsname\relax%
\end{ALG@g}% I can not close this block, continue after it is closed by force
\ALG@makebegin{#1}%
\else%
\ALG@changeblock{#1}% close this block
\fi%
\fi%
\fi%
}%
%
\def\ALG@makenobegin#1% executes an entitie (#1) that can not open blocks
{%
\ifx\ALG@currentvalue\relax%
\ALG@changeblock{#1}% an infinite block must be broken
\else%
\expandafter\ifx\csname ALG@b@#1@\ALG@currentitem\endcsname\relax%
\end{ALG@g}% the block must be ended by force,
\ALG@makenobegin{#1}% the command still runs
\else%
\ALG@changeblock{#1}% i can continue / end this block, let's do it
\fi%
\fi%
}%
%
\def\ALG@ifnotrelax#1#2#3% #1 - the number of the closed block, #2 - the entitie, #3 - things to be done
{%
\edef\ALG@tmpcmd{\expandafter\noexpand\csname algorithmic#2\endcsname}%
\expandafter\ifx\csname ALG@t@#1@#2\endcsname\relax\else%
\expandafter\ifx\csname ALG@t@#1@#2\endcsname\ALG@tmpcmd%
\expandafter\ifx\csname algorithmic#2\endcsname\relax\else%
#3%
\fi%
\else%
#3%
\fi%
\fi%
}%
%
\def\ALG@closeblock#1#2% #1 - the number of the closed block, #2 - the entitie
{%
\ALG@ifnotrelax{#1}{#2}{\item}%
\expandafter\let\expandafter\ALG@entitiecommand\csname ALG@t@#1@#2\endcsname%
}%
%
\def\ALG@openblock#1#2% #1 - the number of the closed block, #2 - the entitie
{%
\item[]%
\begin{ALG@g}{\csname ALG@i@#2@#1\endcsname}%
\edef\ALG@currentitem{\csname ALG@b@#2@#1\endcsname}%
\expandafter\ifx\csname ALG@c@#2@#1\endcsname\relax%
\let\ALG@currentvalue\relax%
\else%
\edef\ALG@currentvalue{\csname ALG@c@#2@#1\endcsname}%
\fi%
\ALG@ifnotrelax{#1}{#2}%
{%
\item\hskip-\ALG@ctlm% default spacing
}%
\expandafter\let\expandafter\ALG@entitiecommand\csname ALG@t@#1@#2\endcsname%
}%
%
\def\ALG@changeblock#1% #1 - the entitie
{%
\setcounter{ALG@tmpcounter}{\ALG@currentitem}%
\expandafter\ifnum0=\csname ALG@b@#1@\ALG@currentitem\endcsname\relax%
\end{ALG@g}%
\ALG@closeblock{\arabic{ALG@tmpcounter}}{#1}%
\else%
\end{ALG@g}%
\ALG@openblock{\arabic{ALG@tmpcounter}}{#1}%
\fi%
}%
%
\def\ALG@closeloops% closes all finite blocks
{%
\ifx\ALG@currentvalue\relax%
\else% only if it is finite
\end{ALG@g}% the block must be ended by force,
\ALG@closeloops% the command still runs
\fi%
}%
%
%
% *** Low level block/entitie defining commands ***
%
%
\def\ALG@bl@{0}% the BIG block
\let\ALG@bl@@\ALG@bl@% the BIG block
%
% Create a block
%
\def\ALG@createblock#1% create the block #1, if it does not exists
{%
\@ifundefined{ALG@bl@#1}% needs to be created?
{%
\addtocounter{ALG@blocknr}{1}% increment the block counter
\expandafter\edef\csname ALG@bl@#1\endcsname{\arabic{ALG@blocknr}}% set the block number
}%
{}%
}%
%
% Get the block number
%
\def\ALG@getblocknumber#1{\csname ALG@bl@#1\endcsname}%
%
% Create an entitie
%
\def\ALG@createentitie#1% create the entitie #1, if it does not exists
{%
\@ifundefined{#1}% needs to be created?
{%
\expandafter\edef\csname #1\endcsname{\noexpand\ALG@makeentitie{#1}}%
\@ifundefined{algorithmic#1}% \algorithmic#1 exists?
{%
\expandafter\edef\csname algorithmic#1\endcsname{\noexpand\textbf{#1}}%
}%
{}%
}%
{}%
}%
%
\def\ALG@createtext#1#2% #1 = closed block; #2 = entitie; creates \ALG@t@#1@#2
{%
\expandafter\edef\csname ALG@t@#1@#2\endcsname%
{%
\expandafter\noexpand\csname algorithmic#2\endcsname%
}%
}%
%
% End and Continue block
%
\def\ALG@endandcontinueblock#1#2#3#4#5% #1 = new block; #2 = old block; #3 = entitie; #4 = credits; #5 = indent
{%
\ifthenelse{\equal{#3}{}}{}% execute only if the entity is not empty
{%
\ALG@createentitie{#3}% create the entitie
\ALG@createblock{#2}% create the old block, if needed
\ifthenelse{\equal{#1}{}}% whe need to open a new block?
{\expandafter\edef\csname ALG@b@#3@\ALG@getblocknumber{#2}\endcsname{0}}% no, just close the old one
{% yes,
\ALG@createblock{#1}% create the block
\expandafter\edef\csname ALG@b@#3@\ALG@getblocknumber{#2}\endcsname{\ALG@getblocknumber{#1}}% ending the old block opens a new one
\ifthenelse{\equal{#4}{}}% infinite or finite credits?
{\expandafter\let\csname ALG@c@#3@\ALG@getblocknumber{#2}\endcsname\relax}% infinite credits
{\expandafter\edef\csname ALG@c@#3@\ALG@getblocknumber{#2}\endcsname{#4}}% finite credits
\ifthenelse{\equal{#5}{}}% default or specified indentation
{\expandafter\let\csname ALG@i@#3@\ALG@getblocknumber{#2}\endcsname\ALG@defaultindent}% default indentation
{\expandafter\edef\csname ALG@i@#3@\ALG@getblocknumber{#2}\endcsname{#5}}% indentation is specified
}%
\ALG@createtext{\ALG@getblocknumber{#2}}{#3}%
}%
}%
%
%
% *** NEW VERSION ***
%
%
% used macros
%
\def\ALG@p@endtext@E{\algrenewtext{\ALG@v@end}}%
\def\ALG@p@endtext@xE{\algrenewtext[\ALG@v@newblock]{\ALG@v@end}}%
\def\ALG@p@endtext@N{\algnotext{\ALG@v@end}}%
\def\ALG@p@endtext@xN{\algnotext[\ALG@v@newblock]{\ALG@v@end}}%
\def\ALG@p@endtext@{}%
% starttext defines are more compex -- care must be taken for the optional parameters
\def\ALG@p@starttext@S{\ALG@p@s@process{\algrenewtext}}%
\def\ALG@p@starttext@C{\ALG@p@s@process{\algrenewtext}}%
\def\ALG@p@starttext@xC{\ALG@p@s@process{\algrenewtext[\ALG@v@oldblock]}}%
\def\ALG@p@s@process#1%
{%
\ifthenelse{\equal{\ALG@v@start}{}}%
{\ALG@p@endtext}%
{\@ifnextchar{[}{\ALG@p@s@getparamcount{#1}}{\ALG@p@s@simple{#1}}}%
}%
\def\ALG@p@s@getparamcount#1[#2]%
{%
\@ifnextchar{[}{\ALG@p@s@getdefparam{#1}{#2}}{\ALG@p@s@param{#1}{#2}}%
}%
\def\ALG@p@s@getdefparam#1#2[#3]%
{%
\ALG@p@s@defparam{#1}{#2}{#3}%
}%
\def\ALG@p@s@simple#1#2{#1{\ALG@v@start}{#2}\ALG@p@endtext}%
\def\ALG@p@s@param#1#2#3{#1{\ALG@v@start}[#2]{#3}\ALG@p@endtext}%
\def\ALG@p@s@defparam#1#2#3#4{#1{\ALG@v@start}[#2][#3]{#4}\ALG@p@endtext}%
% the rest of the crew
\def\ALG@p@starttext@{\ALG@p@endtext}%
\def\ALG@p@indent@def#1{\def\ALG@v@indent{#1}\ALG@p@setup}%
\def\ALG@p@indent@{\def\ALG@v@indent{}\ALG@p@setup}%
\def\ALG@p@credits@def#1{\def\ALG@v@credits{#1}\ALG@p@indent}%
\def\ALG@p@credits@{\ALG@p@indent}%
\def\ALG@p@end@def#1{\def\ALG@v@end{#1}\ALG@p@credits}%
\def\ALG@p@end@{\def\ALG@v@end{}\ALG@p@credits}%
\def\ALG@p@start@def#1{\def\ALG@v@start{#1}\ALG@p@end}%
\def\ALG@p@start@{\def\ALG@v@start{}\ALG@p@end}%
\def\ALG@p@oldblock@def#1{\def\ALG@v@oldblock{#1}\ALG@p@start}%
\def\ALG@p@oldblock@{\def\ALG@v@oldblock{}\ALG@p@start}%
\newcommand\ALG@p@newblock[1][]{\def\ALG@v@newblock{#1}\ALG@p@oldblock}%
\def\ALG@p@setup%
{%
\ifthenelse{\equal{\ALG@v@newblock}{}}%
{%
\ifthenelse{\equal{\ALG@v@start}{}}%
{%
\PackageError{algorithmicx}{Block or starting entitie must be specified!!!}{}%
}%
{%
\let\ALG@v@newblock\ALG@v@start%
}%
}%
{%
}%
\ALG@endandcontinueblock%
{\ALG@v@newblock}{\ALG@v@oldblock}{\ALG@v@start}%
{\ALG@v@credits}{\ALG@v@indent}%
\ALG@endandcontinueblock%
{}{\ALG@v@newblock}{\ALG@v@end}%
{}{}%
\ALG@p@starttext%
}%
%
% param handling
%
\newcommand\ALG@p@def[2][def]%
{%
\expandafter\let\csname ALG@p@#2\expandafter\endcsname\csname ALG@p@#2@#1\endcsname%
}%
\def\ALG@p@undef{\ALG@p@def[]}%
%
\def\ALG@p@ons{\ALG@p@def{start}}%
\def\ALG@p@onS{\ALG@p@def{start}\ALG@p@def[S]{starttext}}%
\def\ALG@p@onc{\ALG@p@def{oldblock}\ALG@p@def{start}}%
\def\ALG@p@onC{\ALG@p@def{oldblock}\ALG@p@def{start}\ALG@p@def[C]{starttext}}%
\def\ALG@p@onxC{\ALG@p@def{oldblock}\ALG@p@def{start}\ALG@p@def[xC]{starttext}}%
\def\ALG@p@one{\ALG@p@def{end}}%
\def\ALG@p@onE{\ALG@p@def{end}\ALG@p@def[E]{endtext}}%
\def\ALG@p@onxE{\ALG@p@def{end}\ALG@p@def[xE]{endtext}}%
\def\ALG@p@onN{\ALG@p@def{end}\ALG@p@def[N]{endtext}}%
\def\ALG@p@onxN{\ALG@p@def{end}\ALG@p@def[xN]{endtext}}%
\def\ALG@p@onb{\def\ALG@v@credits{}}%
\def\ALG@p@onl{\def\ALG@v@credits{1}}%
\def\ALG@p@onL{\ALG@p@def{credits}}%
\def\ALG@p@oni{\ALG@p@def{indent}}%
\expandafter\def\csname ALG@p@on]\endcsname{\let\ALG@p@rec\relax}%
%
% param processing
%
\def\ALG@p@process#1%
{%
\@ifundefined{ALG@p@on#1}%
{\typeout{algdef: Ignoring unknown token #1}}%
{\csname ALG@p@on#1\endcsname}%
\ALG@p@rec%
}%
%
\def\ALG@p@onx{\let\ALG@p@rec\ALG@p@processx}%
%
\def\ALG@p@processx#1%
{%
\@ifundefined{ALG@p@onx#1}%
{%
\typeout{algdef: Ignoring sole x}%
\def\ALG@p@rec{\let\ALG@p@rec\ALG@p@process\ALG@p@process#1}%
}%
{\csname ALG@p@onx#1\endcsname\let\ALG@p@rec\ALG@p@process}%
\ALG@p@rec%
}%
%
%
% *** User level block/entitie commands ***
%
%
%
% algdef{switches}... -- the king of all definitions in the algorithmicx package
%
\newcommand\algdef[1]%
{%
\ALG@p@undef{oldblock}%
\ALG@p@undef{start}%
\ALG@p@undef{end}%
\def\ALG@v@credits{}%
\ALG@p@undef{credits}%
\ALG@p@undef{indent}%
\ALG@p@undef{starttext}%
\ALG@p@undef{endtext}%
\let\ALG@p@rec\ALG@p@process%
\ALG@p@rec#1]%
\ALG@p@newblock%
}%
%
% a lot of other macros are provided for convenience
%
\def\algblock{\algdef{se}}%
\def\algcblock{\algdef{ce}}%
\def\algloop{\algdef{sl}}%
\def\algcloop{\algdef{cl}}%
\def\algsetblock{\algdef{seLi}}%
\def\algsetcblock{\algdef{ceLi}}%
\def\algblockx{\algdef{SxE}}%
\def\algblockdefx{\algdef{SE}}%
\def\algcblockx{\algdef{CxE}}%
\def\algcblockdefx{\algdef{CE}}%
\def\algsetblockx{\algdef{SxELi}}%
\def\algsetblockdefx{\algdef{SELi}}%
\def\algsetcblockx{\algdef{CxELi}}%
\def\algsetcblockdefx{\algdef{CELi}}%
\def\algloopdefx{\algdef{Sl}}%
\def\algcloopx{\algdef{xCl}}%
\def\algcloopdefx{\algdef{Cl}}%
% algloopx is not correct, use algloopdefx
%
% Text output commands
%
\newcommand\algrenewtext[2][]% [block]{entity}
{%
\ifthenelse{\equal{#2}{}}{}%
{%
\algnotext[#1]{#2}%
\ifthenelse{\equal{#1}{}}%
{%
\expandafter\newcommand\csname algorithmic#2\endcsname%
}%
{%
\expandafter\newcommand\csname ALG@t@\ALG@getblocknumber{#1}@#2\endcsname%
}%
}%
}%
%
\newcommand\algnotext[2][]% [block]{entity}
{%
\ifthenelse{\equal{#2}{}}{}%
{%
\ifthenelse{\equal{#1}{}}%
{%
\expandafter\let\csname algorithmic#2\endcsname\relax%
}%
{%
\expandafter\let\csname ALG@t@\ALG@getblocknumber{#1}@#2\endcsname\relax%
}%
}%
}%
%
\newcommand\algdefaulttext[2][]% [block]{entity}
{%
\ifthenelse{\equal{#1}{}}%
{%
\expandafter\def\csname algorithmic#2\endcsname{\textbf{#2}}%
}%
{%
\ALG@createtext{\ALG@getblocknumber{#1}}{#2}%
}%
}%
%
\def\ALG@notext*{\algnotext}%
\def\algtext{\@ifnextchar{*}{\ALG@notext}{\algrenewtext}}%
%
%
% *** OTHERS ***
%
%
\algdef{SL}[STATE]{State}{0}{}%
\def\BState{\State \algbackskip}%
\def\Statex{\item[]}% an empty line
\newcommand\algorithmiccomment[1]{\hfill\(\triangleright\) #1}%
\def\Comment{\algorithmiccomment}%
\def\algref#1#2{\ref{#1}.\ref{#2}}%
%
%
% *** LANGUAGE SWITCHING ***
%
%
\newcommand\ALG@deflanguage[3]%#1#2#3%
{%
\ifthenelse{\equal{#2}{}}%
{\expandafter\def\csname ALG@setlanguage@#1\endcsname{#3}}%
{\def\ALG@tmp{\let\ALG@tmp\relax#3}\ALG@tmp}%
}%
%
\def\algsetlanguage#1%
{%
\csname ALG@setlanguage@#1\endcsname%
}%
%
%
Jump to Line
Something went wrong with that request. Please try again.