% ALGORITHMIC STYLE -- Released 27 APR 2005
%    for LaTeX version 2e
%
% Copyright Szasz Janos
% E-mail szaszjanos@users.sourceforge.net
%
%
%      ***      INITIALISING      ***
%
%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{algorithmicx}[2005/04/27 v1.2 Algorithmicx]
\RequirePackage{ifthen}
\typeout{Document Style algorithmicx 1.2 - a greatly improved `algorithmic' style}
%
\newcounter{ALG@line}
\newcounter{ALG@rem}
\newcounter{ALG@nested}
\newlength{\ALG@tlm}
\newlength{\ALG@thistlm}
\newcounter{ALG@Lnr}% the number of defined languages
\setcounter{ALG@Lnr}{0}
\newcounter{ALG@blocknr}% the number of defined blocks
\setcounter{ALG@blocknr}{0}
\newcounter{ALG@storecount}% number of stored but not restored algorithmic environments
\setcounter{ALG@storecount}{0}
\newcounter{ALG@tmpcounter}% only to decrement things
\newlength\ALG@tmplength%
%\def\algorithmicnoindent{-\ALG@tlm}
%       \def\algbackskipbegin{\hskip\ALG@ctlm}
%\def\algbackskip{\hskip-\ALG@thistlm}
%\def\algbackskipend{\hskip-\ALG@tlm}
\def\ALG@defaultindent{\algorithmicindent}
%
% conditional states
%
\def\ALG@newcondstate#1%
   {%
   \expandafter\edef\csname ALG@x@#1\endcsname%
      {\expandafter\noexpand\csname @@ALG@x@#1\endcsname}%
   }%
\ALG@newcondstate{notext}%
\ALG@newcondstate{default}%
%
%
%      ***      ALGORITHMIC      ***
%
%
\newcommand\ALG@beginblock[1]% #1 - indentation
   {%
      \ALG@thistlm\ALG@tlm%
      \addtolength\ALG@tlm{#1}%
      \addtocounter{ALG@nested}{1}%
      \setlength\ALG@tmplength{#1}%
      \expandafter\edef\csname ALG@ind@\theALG@nested\endcsname{\the\ALG@tmplength}%
   }%
\newcommand\ALG@endblock%
   {%
      \addtolength\ALG@tlm{-\csname ALG@ind@\theALG@nested\endcsname}%
      \addtocounter{ALG@nested}{-1}%
      \ALG@thistlm\ALG@tlm%
   }%
%
%   algorithmic environment
%
\def\ALG@step%
   {%
   \addtocounter{ALG@line}{1}%
   \addtocounter{ALG@rem}{1}%
   \ifthenelse{\equal{\arabic{ALG@rem}}{\ALG@numberfreq}}%
      {\setcounter{ALG@rem}{0}\alglinenumber{\arabic{ALG@line}}}%
      {}%
   }%
\newenvironment{algorithmic}[1][0]%
   {%
   \edef\ALG@numberfreq{#1}%
   \def\@currentlabel{\theALG@line}%
   %
   \setcounter{ALG@line}{0}%
   \setcounter{ALG@rem}{0}%
   %
   \let\\\algbreak%
   %
   \expandafter\edef\csname ALG@currentblock@\theALG@nested\endcsname{0}%
   \expandafter\let\csname ALG@currentlifetime@\theALG@nested\endcsname\relax%
   %
   \begin{list}%
      {\ALG@step}%
      {%
      \rightmargin\z@%
      \itemsep\z@ \itemindent\z@ \listparindent2em%
      \partopsep\z@ \parskip\z@ \parsep\z@%
      \labelsep 0.5em \topsep 0.2em%\skip 1.2em 
      \ifthenelse{\equal{#1}{0}}%
         {\labelwidth 0.5em}%
         {\labelwidth 1.2em}%
      \leftmargin\labelwidth \addtolength{\leftmargin}{\labelsep}% Ok. the perfect leftmargin :-))
      \ALG@tlm\z@%
      }%
   \setcounter{ALG@nested}{0}%
   \ALG@beginalgorithmic%
   }%
   {% end{algorithmic}
   % check if all blocks are closed
   \ALG@closeloops%
   \expandafter\ifnum\csname ALG@currentblock@\theALG@nested\endcsname=0\relax%
   \else%
      \PackageError{algorithmicx}{Some blocks are not closed!!!}{}%
   \fi%
   \ALG@endalgorithmic%
   \end{list}%
   }%
%
%
%   ***   Functional core   ***
%
%
\def\ALG@makeentity#1% execute the entity (#1)
   {%
   \def\ALG@thisentity{#1}%
   \expandafter\ifx\csname ALG@b@\ALG@L @#1@0\endcsname\relax%
      \let\ALG@makenobeginrepeat\ALG@makenobegin\ALG@makenobeginrepeat% this entitie ends or continues blocks
   \else%
      \let\ALG@makebeginrepeat\ALG@makebegin\ALG@makebeginrepeat% this entitie can open blocks
   \fi%
   \ALG@entitiecommand%
   }%
%
\def\ALG@makebegin% executes an entitie that can open blocks
   {%
   \expandafter\let\expandafter\ALG@thislifetime\csname ALG@currentlifetime@\theALG@nested\endcsname%
   \ifx\ALG@thislifetime\relax%
      \let\ALG@makebeginrepeat\ALG@doentity% in infinite block I can open my block
   \else%
      \ifnum\ALG@thislifetime>0\relax%
         \ifnum\ALG@thislifetime>65534\else%
            \setcounter{ALG@tmpcounter}{\ALG@thislifetime}% the block has 'space' for another included block
            \addtocounter{ALG@tmpcounter}{-1}%
            \expandafter\edef\csname ALG@currentlifetime@\theALG@nested\endcsname{\arabic{ALG@tmpcounter}}%
         \fi%
         \let\ALG@makebeginrepeat\ALG@doentity%
      \else% the block needs to be closed
         \expandafter\ifx\csname ALG@b@\ALG@L @\ALG@thisentity @\csname ALG@currentblock@\theALG@nested\endcsname\endcsname\relax%
            \ALG@closebyforce% I can not close this block, continue after it is closed by force
%            \ALG@makebegin%
         \else%
            % the block would be closed automatically, but this entitie can close it, so let's do it with the entity
            \let\ALG@makebeginrepeat\ALG@doentity%
         \fi%
      \fi%
   \fi%
   \ALG@makebeginrepeat%
   }%
%
\def\ALG@makenobegin% executes an entitie that can not open blocks
   {%
   \expandafter\ifx\csname ALG@currentlifetime@\theALG@nested\endcsname\relax%
      \let\ALG@makenobeginrepeat\ALG@doentity% an infinite block must be broken
   \else%
      \expandafter\ifx\csname ALG@b@\ALG@L @\ALG@thisentity @\csname ALG@currentblock@\theALG@nested\endcsname\endcsname\relax%
         \ALG@closebyforce% the block must be ended by force,
      \else%
         \let\ALG@makenobeginrepeat\ALG@doentity% I can continue / end this block, let's do it
      \fi%
   \fi%
   \ALG@makenobeginrepeat%
   }%
%
\def\ALG@dobegin%
   {%
   \ALG@beginblock{\csname ALG@i@\ALG@L @\ALG@thisentity @\ALG@thisblock\endcsname}%
   \expandafter\edef\csname ALG@currentblock@\theALG@nested\endcsname{\csname ALG@b@\ALG@L @\ALG@thisentity @\ALG@thisblock\endcsname}%
   \expandafter\ifx\csname ALG@c@\ALG@L @\ALG@thisentity @\ALG@thisblock\endcsname\relax%
      \expandafter\let\csname ALG@currentlifetime@\theALG@nested\endcsname\relax%
   \else%
      \expandafter\edef\csname ALG@currentlifetime@\theALG@nested\endcsname{\csname ALG@c@\ALG@L @\ALG@thisentity @\ALG@thisblock\endcsname}%
   \fi%
   }%
%
\def\ALG@doend%
   {%
   \ALG@endblock%
   }%
%
\def\ALG@doentity% the number of the closed block, the entitie
   {%
   \edef\ALG@thisblock{\csname ALG@currentblock@\theALG@nested\endcsname}%
   \expandafter\ifx\csname ALG@b@\ALG@L @\ALG@thisentity @\ALG@thisblock\endcsname\relax%
      \def\ALG@thisblock{0}%
   \fi%
   \ALG@getentitytext%
   \ifnum\ALG@thisblock=0\else\ALG@doend\fi%
   \ifx\ALG@text\ALG@x@notext%
      \item[]\nointerlineskip%\vskip-\prevdepth\nointerlineskip% bug: if there are no text and no lines, then this is wrong
   \else%
      \item%
   \fi%
   \noindent\hskip\ALG@tlm%
   \expandafter\ifnum0=\csname ALG@b@\ALG@L @\ALG@thisentity @\ALG@thisblock\endcsname\else%
      \ALG@dobegin%
   \fi%
   \def\ALG@entitiecommand{\ALG@displayentity}%
   }%
%
\def\ALG@getentitytext%
   {%
   \expandafter\let\expandafter\ALG@text\csname ALG@t@\ALG@L @\ALG@thisentity @\ALG@thisblock\endcsname%
   \ifx\ALG@text\ALG@x@default%
      % block specific - default
      \expandafter\let\expandafter\ALG@text\csname ALG@t@\ALG@L @\ALG@thisentity\endcsname%
      \ifx\ALG@text\ALG@x@default%
         % block specific - default, language specific - default
         \def\ALG@text{\ALG@deftext{\ALG@thisentity}}%
      \fi%
   \fi%
   }%
%
\def\ALG@deftext{\csname ALG@deftext@\ALG@L\endcsname}%
%
\def\ALG@displayentity%
   {%
   \ifx\ALG@text\ALG@x@notext%
      \let\ALG@text\relax%
   \fi
   \ALG@text%
   }%
%
\def\ALG@closebyforce%
   {%
   \ALG@endblock%
   }%
%
\def\ALG@closeloops% closes all finite blocks
   {%
   \expandafter\ifx\csname ALG@currentlifetime@\theALG@nested\endcsname\relax%
   \else% only if it is finite
      \ALG@closebyforce% 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@\ALG@Ld @#1}% needs to be created?
      {%
      \addtocounter{ALG@blocknr}{1}% increment the block counter
      \expandafter\edef\csname ALG@bl@\ALG@Ld @#1\endcsname{\arabic{ALG@blocknr}}% set the block number
      }%
      {}%
   }%
%
%  Get the block number
%
\def\ALG@getblocknumber#1{\csname ALG@bl@\ALG@Ld @#1\endcsname}%
%
%  Create an entitie
%
\def\ALG@createentitie#1% create the entitie #1, if it does not exists
   {%
   \expandafter\ALG@edefcmd\csname #1\endcsname{\noexpand\ALG@makeentity{#1}}%
   \@ifundefined{ALG@t@\ALG@Ld @#1}% the entity text is defined in this language?
      {%
      \expandafter\let\csname ALG@t@\ALG@Ld @#1\endcsname\ALG@x@default%
      }%
      {}%
   }%
%
\def\ALG@createtext#1#2% #1 = closed block; #2 = entitie; creates \ALG@t@#2@#1
   {%
   \expandafter\let\csname ALG@t@\ALG@Ld @#2@#1\endcsname\ALG@x@default%
   }%
%
%  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@\ALG@Ld @#3@\ALG@getblocknumber{#2}\endcsname{0}}% no, just close the old one
         {% yes,
         \ALG@createblock{#1}% create the block
         \expandafter\edef\csname ALG@b@\ALG@Ld @#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@\ALG@Ld @#3@\ALG@getblocknumber{#2}\endcsname\relax}% infinite credits
            {\expandafter\edef\csname ALG@c@\ALG@Ld @#3@\ALG@getblocknumber{#2}\endcsname{#4}}% finite credits
         \ifthenelse{\equal{#5}{}}% default or specified indentation
            {\expandafter\let\csname ALG@i@\ALG@Ld @#3@\ALG@getblocknumber{#2}\endcsname\ALG@defaultindent}% default indentation
            {\expandafter\edef\csname ALG@i@\ALG@Ld @#3@\ALG@getblocknumber{#2}\endcsname{#5}}% indentation is specified
         }%
      \ALG@createtext{\ALG@getblocknumber{#2}}{#3}%
      }%
   }%
%
%   macros used in declarations
%
\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@nE{\algnotext{\ALG@v@end}}%
\def\ALG@p@endtext@xnE{\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@nS{\algnotext{\ALG@v@start}\ALG@p@endtext}%
\def\ALG@p@starttext@nC{\algnotext{\ALG@v@start}\ALG@p@endtext}%
\def\ALG@p@starttext@xnC{\algnotext[\ALG@v@oldblock]{\ALG@v@start}\ALG@p@endtext}%
\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@one{\ALG@p@def{end}}%
\def\ALG@p@onE{\ALG@p@def{end}\ALG@p@def[E]{endtext}}%
\def\ALG@p@onxC{\ALG@p@def{oldblock}\ALG@p@def{start}\ALG@p@def[xC]{starttext}}%
\def\ALG@p@onxE{\ALG@p@def{end}\ALG@p@def[xE]{endtext}}%
\def\ALG@p@onnS{\ALG@p@def{start}\ALG@p@def[nS]{starttext}}%
\def\ALG@p@onnC{\ALG@p@def{oldblock}\ALG@p@def{start}\ALG@p@def[nC]{starttext}}%
\def\ALG@p@onnE{\ALG@p@def{end}\ALG@p@def[nE]{endtext}}%
\def\ALG@p@onxnC{\ALG@p@def{oldblock}\ALG@p@def{start}\ALG@p@def[xnC]{starttext}}%
\def\ALG@p@onxnE{\ALG@p@def{end}\ALG@p@def[xnE]{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}}%
%
\def\ALG@p@main#1%
   {%
   \@ifundefined{ALG@ps@\ALG@p@state @#1}%
      {%
      \csname ALG@ps@\ALG@p@state @other\endcsname{#1}%
      }%
      {%
      \csname ALG@ps@\ALG@p@state @#1\endcsname%
      }%
   \ALG@p@rec%
   }%
% STATE : <<starting state>>
\expandafter\def\csname ALG@ps@@]\endcsname{\let\ALG@p@rec\relax}%
\def\ALG@ps@@s{\ALG@p@ons}%
\def\ALG@ps@@S{\ALG@p@onS}%
\def\ALG@ps@@c{\ALG@p@onc}%
\def\ALG@ps@@C{\ALG@p@onC}%
\def\ALG@ps@@e{\ALG@p@one}%
\def\ALG@ps@@E{\ALG@p@onE}%
\def\ALG@ps@@N{\typeout{algdef: 'N' obsoloted, use 'nE'.}\ALG@p@onnE}%
\def\ALG@ps@@b{\ALG@p@onb}%
\def\ALG@ps@@l{\ALG@p@onl}%
\def\ALG@ps@@L{\ALG@p@onL}%
\def\ALG@ps@@i{\ALG@p@oni}%
\def\ALG@ps@@x{\def\ALG@p@state{x}}%
\def\ALG@ps@@n{\def\ALG@p@state{n}}%
\def\ALG@ps@@other#1{\typeout{algdef: Ignoring unknown token #1}}%
% STATE : x
\def\ALG@ps@x@C{\def\ALG@p@state{}\ALG@p@onxC}%
\def\ALG@ps@x@E{\def\ALG@p@state{}\ALG@p@onxE}%
\def\ALG@ps@x@N{\def\ALG@p@state{}\typeout{algdef: 'xN' obsoloted, use 'xnE'.}\ALG@p@onxnE}%
\def\ALG@ps@x@n{\def\ALG@p@state{xn}}%
\def\ALG@ps@x@other#1%
   {%
   \typeout{algdef: Ignoring 'x' before '#1'.}%
   \def\ALG@p@state{}%
   \def\ALG@p@rec{\let\ALG@p@rec\ALG@p@main\ALG@p@rec#1}%
   }%
% STATE : n
\def\ALG@ps@n@S{\def\ALG@p@state{}\ALG@p@onnS}%
\def\ALG@ps@n@C{\def\ALG@p@state{}\ALG@p@onnC}%
\def\ALG@ps@n@E{\def\ALG@p@state{}\ALG@p@onnE}%
\def\ALG@ps@n@x{\def\ALG@p@state{nx}}%
\def\ALG@ps@n@other#1%
   {%
   \typeout{algdef: Ignoring 'n' before '#1'.}%
   \def\ALG@p@state{}%
   \def\ALG@p@rec{\let\ALG@p@rec\ALG@p@main\ALG@p@rec#1}%
   }%
% STATE : xn
\def\ALG@ps@xn@C{\def\ALG@p@state{}\ALG@p@onxnC}%
\def\ALG@ps@xn@E{\def\ALG@p@state{}\ALG@p@onxnE}%
\def\ALG@ps@xn@x{\typeout{algdef: Ignoring 'x' after 'xn'.}}%
\def\ALG@ps@xn@n{\typeout{algdef: Ignoring 'n' after 'xn'.}}%
\def\ALG@ps@xn@other#1%
   {%
   \typeout{algdef: Ignoring 'xn' before '#1'.}%
   \def\ALG@p@state{}%
   \def\ALG@p@rec{\let\ALG@p@rec\ALG@p@main\ALG@p@rec#1}%
   }%
% STATE : nx
\def\ALG@ps@nx@C{\def\ALG@p@state{}\ALG@p@onxnC}%
\def\ALG@ps@nx@E{\def\ALG@p@state{}\ALG@p@onxnE}%
\def\ALG@ps@nx@x{\typeout{algdef: Ignoring 'x' after 'nx'.}}%
\def\ALG@ps@nx@n{\typeout{algdef: Ignoring 'n' after 'nx'.}}%
\def\ALG@ps@nx@other#1%
   {%
   \typeout{algdef: Ignoring 'nx' before '#1'.}%
   \def\ALG@p@state{}%
   \def\ALG@p@rec{\let\ALG@p@rec\ALG@p@main\ALG@p@rec#1}%
   }%
%
%
%   ***   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}%
   \def\ALG@p@state{}%
   \let\ALG@p@rec\ALG@p@main%
   \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}{}}{}%
      {%
      \ifthenelse{\equal{#1}{}}%
         {%
         \expandafter\let\csname ALG@t@\ALG@Ld @#2\endcsname\relax%
         \expandafter\newcommand\csname ALG@t@\ALG@Ld @#2\endcsname%
         }%
         {%
         \expandafter\let\csname ALG@t@\ALG@Ld @#2@\ALG@getblocknumber{#1}\endcsname\relax%
         \expandafter\newcommand\csname ALG@t@\ALG@Ld @#2@\ALG@getblocknumber{#1}\endcsname%
         }%
      }%
   }%
%
\def\ALG@letentitytext#1#2% [block]{entity}
   {%
   \ifthenelse{\equal{#2}{}}{}%
      {%
      \ifthenelse{\equal{#1}{}}%
         {%
         \expandafter\let\csname ALG@t@\ALG@Ld @#2\endcsname%
         }%
         {%
         \expandafter\let\csname ALG@t@\ALG@Ld @#2@\ALG@getblocknumber{#1}\endcsname%
         }%
      }%
   }%
%
\newcommand\algnotext[2][]% [block]{entity}
   {%
   \ALG@letentitytext{#1}{#2}\ALG@x@notext%
   }%
%
\newcommand\algdefaulttext[2][]% [block]{entity}
   {%
   \ALG@letentitytext{#1}{#2}\ALG@x@default%
   }%
%
\def\ALG@notext*{\algnotext}%
\def\algtext{\@ifnextchar{*}{\ALG@notext}{\algrenewtext}}%
%
%
%   ***   LANGUAGE SWITCHING   ***
%
%
%
\newcommand\algnewlanguage[1]%
   {%
   \@ifundefined{ALG@L@#1}% needs to be created?
      {}%
      {%
      \PackageError{algorithmicx}{Language '#1' already defined!}{}%
      }%
   \addtocounter{ALG@Lnr}{1}% increment the language counter
   \expandafter\edef\csname ALG@L@#1\endcsname{\arabic{ALG@Lnr}}% set the language number
   \edef\ALG@Ld{\csname ALG@L@#1\endcsname}%
   \expandafter\let\csname ALG@bl@\ALG@Ld @\endcsname\ALG@bl@% the BIG block
   \expandafter\let\csname ALG@bl@\ALG@Ld @@\endcsname\ALG@bl@% the BIG block
   \algdef{SL}[STATE]{State}{0}{}%
   \expandafter\def\csname ALG@deftext@\ALG@Ld\endcsname{\textbf}%
   \algnewcommand\algorithmiccomment[1]{\hfill\(\triangleright\) ##1}%
   \algnewcommand\algorithmicindent{1.5em}%
   \algnewcommand\alglinenumber[1]{\footnotesize ##1:}%
   \algnewcommand\ALG@beginalgorithmic\relax% for user overrides
   \algnewcommand\ALG@endalgorithmic\relax% for user overrides
   }%
%
\newcommand\algsetlanguage[1]%
   {%
   \@ifundefined{ALG@L@#1}% needs to be created?
      {%
      \PackageError{algorithmicx}{Language '#1' is not yet defined!}{}%
      }{}%
   \edef\ALG@L{\csname ALG@L@#1\endcsname}%
   }%
%
\newcommand\algdeflanguage[1]%
   {%
   \@ifundefined{ALG@L@#1}% needs to be created?
      {%
      \PackageError{algorithmicx}{Language '#1' is not yet defined!}{}%
      }{}%
   \edef\ALG@Ld{\csname ALG@L@#1\endcsname}%
   }%
%
\newcommand\alglanguage[1]%
   {%
   \algdeflanguage{#1}%
   \algsetlanguage{#1}%
   }%
%
%
%   ***   Defining language dependent stuff   ***
%
%
\def\ALG@eatoneparam#1{}%
\def\ALG@defbasecmd#1#2%
   {%
   \edef\ALG@tmp{\expandafter\ALG@eatoneparam\string #2}%
   \@ifundefined\ALG@tmp{\edef #2{\noexpand\csname ALG@cmd@\noexpand\ALG@L @\ALG@tmp\endcsname}}{}%
   \expandafter#1\csname ALG@cmd@\ALG@Ld @\ALG@tmp\endcsname%
   }%
\newcommand\algnewcommand{\ALG@defbasecmd\newcommand}%
\newcommand\algrenewcommand{\ALG@defbasecmd\renewcommand}%
\def\ALG@letcmd{\ALG@defbasecmd\let}%
\def\ALG@defcmd{\ALG@defbasecmd\def}%
\def\ALG@edefcmd{\ALG@defbasecmd\edef}%
%
%
%   ***   OTHERS   ***
%
%
\def\BState{\State \algbackskip}%
\def\Statex{\item[]}% an empty line
\newcommand\algrenewcomment{\algrenewcommand\algorithmiccomment}%
\def\Comment{\algorithmiccomment}%
\def\algref#1#2{\ref{#1}.\ref{#2}}%
\algnewlanguage{default}%
\algsetlanguage{default}%
%
%
%   ***   Line breaks   ***
%
%
\newcommand\algbreak% for multiline parameters !!! needs fix
   {%
      \item%
%      \hskip\ALG@parindent%!!! not yet implemented
%      \hskip-\algorithmicindent%
   }%
%
\def\ALG@noputindents%
   {%
   \hskip\ALG@tlm%
   }%
%
%
%   ***   algorithm store / restore   ***
%
%
%   store
%
\ALG@newcondstate{mustrestore}%
\def\algstore%
   {%
   \renewcommand\ALG@beginblock%
      {%
      \PackageError{algorithmicx}{The environment must be closed after store!}{}%
      }%
   \@ifstar{\ALG@starstore}{\ALG@nostarstore}%
   }%
\def\ALG@nostarstore#1% save all infos into #1 and terminate the algorithmic block
   {%
   \addtocounter{ALG@storecount}{1}%
   \expandafter\global\expandafter\let\csname ALG@save@mustrestore@#1\endcsname\ALG@x@mustrestore%
   \ALG@starstore{#1}%
   }%
\def\ALG@starstore#1%
   {%
   \@ifundefined{ALG@save@line@#1}{}%
       {\PackageError{algorithmicx}{This save name '#1' is already used!}{}}%
   \def\ALG@savename{#1}%
   \expandafter\xdef\csname ALG@save@totalnr@\ALG@savename\endcsname{\theALG@nested}%
   \expandafter\xdef\csname ALG@save@line@\ALG@savename\endcsname{\theALG@line}%
   \expandafter\xdef\csname ALG@save@numberfreq@\ALG@savename\endcsname{\ALG@numberfreq}%
   \expandafter\xdef\csname ALG@save@rem@\ALG@savename\endcsname{\theALG@rem}%
   \let\ALG@storerepeat\ALG@store%
   \ALG@storerepeat%
   }%
\def\ALG@store% simply terminate all open blocks
   {%
   \ifnum\theALG@nested=0\let\ALG@storerepeat\relax%
   \else%
      \expandafter\xdef\csname ALG@save@currentblock@\ALG@savename @\theALG@nested\endcsname%
         {\csname ALG@currentblock@\theALG@nested\endcsname}%
      \expandafter\ifx\csname ALG@currentlifetime@\theALG@nested\endcsname\relax%
      \else%
         \expandafter\xdef\csname ALG@save@currentlifetime@\ALG@savename @\theALG@nested\endcsname%
            {\csname ALG@currentlifetime@\theALG@nested\endcsname}%
      \fi%
      \expandafter\xdef\csname ALG@save@ind@\ALG@savename @\theALG@nested\endcsname%
         {\csname ALG@ind@\theALG@nested\endcsname}%
      \ALG@closebyforce%
   \fi%
   \ALG@storerepeat%
   }%
%
%   restore
%
\def\algrestore%
   {%
   \@ifstar{\ALG@starrestore}{\ALG@nostarrestore}%
   }%
\def\ALG@starrestore%
   {%
   \let\ALG@restorerem\relax%
   \let\ALG@restorereprem\relax%
   \ALG@restoremain%
   }%
\def\ALG@nostarrestore%
   {%
   \let\ALG@restorerem\ALG@restoreremovesave%
   \let\ALG@restorereprem\ALG@restorerepremovesave%
   \ALG@restoremain%
   }%
\def\ALG@restoreremovesave%
   {%
   \expandafter\global\expandafter\let\csname ALG@save@totalnr@\ALG@savename\endcsname\relax%
   \expandafter\global\expandafter\let\csname ALG@save@line@\ALG@savename\endcsname\relax%
   \expandafter\global\expandafter\let\csname ALG@save@rem@\ALG@savename\endcsname\relax%
   \expandafter\global\expandafter\let\csname ALG@save@totalnr@\ALG@savename\endcsname\relax%
   \expandafter\global\expandafter\let\csname ALG@save@numberfreq@\ALG@savename\endcsname\relax%
   }%
\def\ALG@restorerepremovesave%
   {%
   \expandafter\global\expandafter\let\csname ALG@save@currentblock@\ALG@savename @\theALG@tmpcounter\endcsname\relax%
   \expandafter\global\expandafter\let\csname ALG@save@currentlifetime@\ALG@savename @\theALG@tmpcounter\endcsname\relax%
   \expandafter\global\expandafter\let\csname ALG@save@currentlifetime@\ALG@savename @\theALG@tmpcounter\endcsname\relax%
   \expandafter\global\expandafter\let\csname ALG@save@ind@\ALG@savename @\theALG@tmpcounter\endcsname\relax%
   }%
\def\ALG@restoremain#1% restore all infos from #1 in an open algorithmic block
   {%
   \ifnum\theALG@line=0%
      \else\PackageError{algorithmicx}{Restore might be used only at the beginning of the environment!}{}%
   \fi%
   \def\ALG@savename{#1}%
   \expandafter\ifx\csname ALG@save@totalnr@\ALG@savename\endcsname\relax%
      \PackageError{algorithmicx}{Save '\ALG@savename'\space not defined!!!}{}%
   \fi%
   \@ifundefined{ALG@save@mustrestore@\ALG@savename}{}%
      {%
      \addtocounter{ALG@storecount}{-1}%
      \expandafter\global\expandafter\let\csname ALG@save@mustrestore@\ALG@savename\endcsname\relax%
      }%
   \setcounter{ALG@line}{\csname ALG@save@line@\ALG@savename\endcsname}%
   \edef\ALG@numberfreq{\csname ALG@save@numberfreq@\ALG@savename\endcsname}%
   \setcounter{ALG@rem}{\csname ALG@save@rem@\ALG@savename\endcsname}%
   \setcounter{ALG@tmpcounter}{\csname ALG@save@totalnr@\ALG@savename\endcsname}%
   \setcounter{ALG@nested}{0}%
   \ALG@restorerem%
   \let\ALG@restorerepeat\ALG@restore%
   \ALG@restorerepeat%
   }%
\def\ALG@restore%
   {%
   \ifnum\theALG@tmpcounter>0%
      \expandafter\edef\csname ALG@currentblock@\theALG@tmpcounter\endcsname%
         {\csname ALG@save@currentblock@\ALG@savename @\theALG@tmpcounter\endcsname}%
      \expandafter\ifx\csname ALG@save@currentlifetime@\ALG@savename @\theALG@tmpcounter\endcsname\relax%
         \expandafter\let\csname ALG@currentlifetime@\theALG@tmpcounter\endcsname\relax%
         \else%
            \expandafter\edef\csname ALG@currentlifetime@\theALG@tmpcounter\endcsname%
            {\csname ALG@save@currentlifetime@\ALG@savename @\theALG@tmpcounter\endcsname}%
         \fi%
      %
      \ALG@beginblock{\csname ALG@save@ind@\ALG@savename @\theALG@tmpcounter\endcsname}%
      \ALG@restorereprem%
      \addtocounter{ALG@tmpcounter}{-1}%
   \else\let\ALG@restorerepeat\relax%
   \fi%
   \ALG@restorerepeat%
   }%
\AtEndDocument%
   {%
   \ifnum\theALG@storecount>0\relax%
      \PackageError{algorithmicx}{Some stored algorithms are not restored!}{}%
   \fi%
   }%
