From a3e5f4189a145472017be9745847e9d05ebbc0a0 Mon Sep 17 00:00:00 2001
From: Norbert Preining <preining@logic.at>
Date: Thu, 12 Oct 2006 01:40:37 +0000
Subject: add algorithmicx to ctan2tl (MAKEnosymlink), add algorithmicx to
 tpm-ctan-check, update algorithmicx

git-svn-id: svn://tug.org/texlive/trunk@2311 c570f23f-e606-0410-a88d-b1316a301751
---
 .../tex/latex/algorithmicx/algorithmicx.sty        | 636 ++++++++++++++-------
 1 file changed, 444 insertions(+), 192 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty')

diff --git a/Master/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty b/Master/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty
index 0b681debab7..bfb7dabafe4 100644
--- a/Master/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty
+++ b/Master/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty
@@ -1,97 +1,88 @@
-% ALGORITHMIC STYLE -- Released 18 MAR 2004
+% ALGORITHMIC STYLE -- Released 27 APR 2005
 %    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]
+\ProvidesPackage{algorithmicx}[2005/04/27 v1.2 Algorithmicx]
 \RequirePackage{ifthen}
-\typeout{Document Style algorithmicx 1.1 - a greatly improved `algorithmic' style}
+\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@ctlm}
-\newlength{\algorithmicindent}
-\setlength{\algorithmicindent}{1.5em}
+\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
-\def\algorithmicnoindent{-\ALG@tlm}
-\def\algbackskipbegin{\hskip\ALG@ctlm}
-\def\algbackskip{\hskip\ALG@ctlm\hskip-\ALG@tlm}
-\def\algbackskipend{\hskip-\ALG@tlm}
+\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      ***
 %
 %
-\newenvironment{ALG@g}[1]% a list for the iner loops
+\newcommand\ALG@beginblock[1]% #1 - indentation
    {%
-   \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
+      \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%
    }%
-   {\end{list}}%
 %
 %   algorithmic environment
 %
-\let\ALG@beginalgorithmic\relax% for user overrides
-\let\ALG@endalgorithmic\relax% for user overrides
+\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}%
-   \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}{}%
+   \let\\\algbreak%
    %
-   \renewcommand{\\}% for multiline parameters !!! needs fix
-      {%
-      \item%
-      \hskip\ALG@parindent%!!! not yet implemented
-%      \hskip-\algorithmicindent%
-      }%
-   %
-   \edef\ALG@currentitem{0}%
-   \let\ALG@currentvalue\relax%
+   \expandafter\edef\csname ALG@currentblock@\theALG@nested\endcsname{0}%
+   \expandafter\let\csname ALG@currentlifetime@\theALG@nested\endcsname\relax%
    %
    \begin{list}%
       {\ALG@step}%
@@ -99,23 +90,22 @@
       \rightmargin\z@%
       \itemsep\z@ \itemindent\z@ \listparindent2em%
       \partopsep\z@ \parskip\z@ \parsep\z@%
-      \labelsep 0.5em \topsep 0.0em%\skip 1.2em 
+      \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 0em%
-      \ALG@ctlm\ALG@tlm%
+      \ALG@tlm\z@%
       }%
+   \setcounter{ALG@nested}{0}%
    \ALG@beginalgorithmic%
    }%
    {% end{algorithmic}
-%   \global\@newlistfalse% protects against empty algorithms, not needed
    % check if all blocks are closed
    \ALG@closeloops%
-   \ifnum0=\ALG@currentitem\relax%
+   \expandafter\ifnum\csname ALG@currentblock@\theALG@nested\endcsname=0\relax%
    \else%
-      \PackageError{algorithmicx}{Some blocks are not closed!!!}{Yes, you have some open blocks.}%
+      \PackageError{algorithmicx}{Some blocks are not closed!!!}{}%
    \fi%
    \ALG@endalgorithmic%
    \end{list}%
@@ -125,107 +115,126 @@
 %   ***   Functional core   ***
 %
 %
-\def\ALG@makeentitie#1% execute the entitie (#1)
+\def\ALG@makeentity#1% execute the entity (#1)
    {%
-   \expandafter\ifx\csname ALG@b@#1@0\endcsname\relax%
-      \ALG@makenobegin{#1}% this entitie ends or continues blocks
+   \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%
-      \ALG@makebegin{#1}% this entitie can open blocks
+      \let\ALG@makebeginrepeat\ALG@makebegin\ALG@makebeginrepeat% this entitie can open blocks
    \fi%
    \ALG@entitiecommand%
    }%
 %
-\def\ALG@makebegin#1% executes an entitie (#1) that can open blocks
+\def\ALG@makebegin% executes an entitie that can open blocks
    {%
-   \ifx\ALG@currentvalue\relax%
-      \ALG@openblock{0}{#1}% in infinite block I can open my block
+   \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%
-      \ifnum0<\ALG@currentvalue\relax%
-         \ifnum\ALG@currentvalue>65534\else%
-            \setcounter{ALG@tmpcounter}{\ALG@currentvalue}% the block has 'space' for another included block
+      \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}%
-            \edef\ALG@currentvalue{\arabic{ALG@tmpcounter}}%
+            \expandafter\edef\csname ALG@currentlifetime@\theALG@nested\endcsname{\arabic{ALG@tmpcounter}}%
          \fi%
-         \ALG@openblock{0}{#1}%
+         \let\ALG@makebeginrepeat\ALG@doentity%
       \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}%
+         \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%
-            \ALG@changeblock{#1}% close this block
+            % 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#1% executes an entitie (#1) that can not open blocks
+\def\ALG@makenobegin% executes an entitie that can not open blocks
    {%
-   \ifx\ALG@currentvalue\relax%
-      \ALG@changeblock{#1}% an infinite block must be broken
+   \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@#1@\ALG@currentitem\endcsname\relax%
-         \end{ALG@g}% the block must be ended by force,
-	 \ALG@makenobegin{#1}% the command still runs
+      \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%
-         \ALG@changeblock{#1}% i can continue / end this block, let's do it
+         \let\ALG@makenobeginrepeat\ALG@doentity% I can continue / end this block, let's do it
       \fi%
    \fi%
+   \ALG@makenobeginrepeat%
    }%
 %
-\def\ALG@ifnotrelax#1#2#3% #1 - the number of the closed block, #2 - the entitie, #3 - things to be done
+\def\ALG@dobegin%
    {%
-   \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%
+   \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@closeblock#1#2% #1 - the number of the closed block, #2 - the entitie
+\def\ALG@doend%
    {%
-   \ALG@ifnotrelax{#1}{#2}{\item}%
-   \expandafter\let\expandafter\ALG@entitiecommand\csname ALG@t@#1@#2\endcsname%
+   \ALG@endblock%
    }%
 %
-\def\ALG@openblock#1#2% #1 - the number of the closed block, #2 - the entitie
+\def\ALG@doentity% the number of the closed block, 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%
+   \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%
-      \edef\ALG@currentvalue{\csname ALG@c@#2@#1\endcsname}%
+      \item%
    \fi%
-   \ALG@ifnotrelax{#1}{#2}%
-      {%
-      \item\hskip-\ALG@ctlm% default spacing
-      }%
-   \expandafter\let\expandafter\ALG@entitiecommand\csname ALG@t@#1@#2\endcsname%
+   \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@changeblock#1% #1 - the entitie
+\def\ALG@getentitytext%
    {%
-   \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}%
+   \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
    {%
-   \ifx\ALG@currentvalue\relax%
+   \expandafter\ifx\csname ALG@currentlifetime@\theALG@nested\endcsname\relax%
    \else% only if it is finite
-      \end{ALG@g}% the block must be ended by force,
+      \ALG@closebyforce% the block must be ended by force,
       \ALG@closeloops% the command still runs
    \fi%
    }%
@@ -241,40 +250,33 @@
 %
 \def\ALG@createblock#1% create the block #1, if it does not exists
    {%
-   \@ifundefined{ALG@bl@#1}% needs to be created?
+   \@ifundefined{ALG@bl@\ALG@Ld @#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
+      \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@#1\endcsname}%
+\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
    {%
-   \@ifundefined{#1}% needs to be created?
+   \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\edef\csname #1\endcsname{\noexpand\ALG@makeentitie{#1}}%
-      \@ifundefined{algorithmic#1}% \algorithmic#1 exists?
-         {%
-         \expandafter\edef\csname algorithmic#1\endcsname{\noexpand\textbf{#1}}%
-         }%
-         {}%
+      \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@#1@#2
+\def\ALG@createtext#1#2% #1 = closed block; #2 = entitie; creates \ALG@t@#2@#1
    {%
-   \expandafter\edef\csname ALG@t@#1@#2\endcsname%
-      {%
-      \expandafter\noexpand\csname algorithmic#2\endcsname%
-      }%
+   \expandafter\let\csname ALG@t@\ALG@Ld @#2@#1\endcsname\ALG@x@default%
    }%
 %
 %  End and Continue block
@@ -286,31 +288,27 @@
       \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
+         {\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@#3@\ALG@getblocknumber{#2}\endcsname{\ALG@getblocknumber{#1}}% ending the old block opens a new one
+         \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@#3@\ALG@getblocknumber{#2}\endcsname\relax}% infinite credits
-            {\expandafter\edef\csname ALG@c@#3@\ALG@getblocknumber{#2}\endcsname{#4}}% 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@#3@\ALG@getblocknumber{#2}\endcsname\ALG@defaultindent}% default indentation
-            {\expandafter\edef\csname ALG@i@#3@\ALG@getblocknumber{#2}\endcsname{#5}}% indentation is specified
+            {\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}%
       }%
    }%
 %
-%
-%   ***   NEW VERSION   ***
-%
-%
-%   used macros
+%   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@N{\algnotext{\ALG@v@end}}%
-\def\ALG@p@endtext@xN{\algnotext[\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}}%
@@ -334,6 +332,9 @@
 \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}%
@@ -381,40 +382,91 @@
 \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@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@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@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}}%
-\expandafter\def\csname ALG@p@on]\endcsname{\let\ALG@p@rec\relax}%
-%
-%   param processing
 %
-\def\ALG@p@process#1%
+\def\ALG@p@main#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}%
+   \@ifundefined{ALG@ps@\ALG@p@state @#1}%
+      {%
+      \csname ALG@ps@\ALG@p@state @other\endcsname{#1}%
+      }%
       {%
-      \typeout{algdef: Ignoring sole x}%
-      \def\ALG@p@rec{\let\ALG@p@rec\ALG@p@process\ALG@p@process#1}%
+      \csname ALG@ps@\ALG@p@state @#1\endcsname%
       }%
-      {\csname ALG@p@onx#1\endcsname\let\ALG@p@rec\ALG@p@process}%
    \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   ***
@@ -433,7 +485,8 @@
    \ALG@p@undef{indent}%
    \ALG@p@undef{starttext}%
    \ALG@p@undef{endtext}%
-   \let\ALG@p@rec\ALG@p@process%
+   \def\ALG@p@state{}%
+   \let\ALG@p@rec\ALG@p@main%
    \ALG@p@rec#1]%
    \ALG@p@newblock%
    }%
@@ -465,70 +518,269 @@
    {%
    \ifthenelse{\equal{#2}{}}{}%
       {%
-      \algnotext[#1]{#2}%
       \ifthenelse{\equal{#1}{}}%
          {%
-         \expandafter\newcommand\csname algorithmic#2\endcsname%
+         \expandafter\let\csname ALG@t@\ALG@Ld @#2\endcsname\relax%
+         \expandafter\newcommand\csname ALG@t@\ALG@Ld @#2\endcsname%
          }%
          {%
-         \expandafter\newcommand\csname ALG@t@\ALG@getblocknumber{#1}@#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%
          }%
       }%
    }%
 %
-\newcommand\algnotext[2][]% [block]{entity}
+\def\ALG@letentitytext#1#2% [block]{entity}
    {%
    \ifthenelse{\equal{#2}{}}{}%
       {%
       \ifthenelse{\equal{#1}{}}%
          {%
-         \expandafter\let\csname algorithmic#2\endcsname\relax%
+         \expandafter\let\csname ALG@t@\ALG@Ld @#2\endcsname%
          }%
          {%
-         \expandafter\let\csname ALG@t@\ALG@getblocknumber{#1}@#2\endcsname\relax%
+         \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}
    {%
-   \ifthenelse{\equal{#1}{}}%
+   \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?
+      {}%
       {%
-      \expandafter\def\csname algorithmic#2\endcsname{\textbf{#2}}%
+      \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?
       {%
-      \ALG@createtext{\ALG@getblocknumber{#1}}{#2}%
-      }%
+      \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}%
    }%
 %
-\def\ALG@notext*{\algnotext}%
-\def\algtext{\@ifnextchar{*}{\ALG@notext}{\algrenewtext}}%
+%
+%   ***   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   ***
 %
 %
-\algdef{SL}[STATE]{State}{0}{}%
 \def\BState{\State \algbackskip}%
 \def\Statex{\item[]}% an empty line
-\newcommand\algorithmiccomment[1]{\hfill\(\triangleright\) #1}%
+\newcommand\algrenewcomment{\algrenewcommand\algorithmiccomment}%
 \def\Comment{\algorithmiccomment}%
 \def\algref#1#2{\ref{#1}.\ref{#2}}%
+\algnewlanguage{default}%
+\algsetlanguage{default}%
 %
 %
-%   ***   LANGUAGE SWITCHING   ***
+%   ***   Line breaks   ***
 %
 %
-\newcommand\ALG@deflanguage[3]%#1#2#3%
+\newcommand\algbreak% for multiline parameters !!! needs fix
    {%
-   \ifthenelse{\equal{#2}{}}%
-      {\expandafter\def\csname ALG@setlanguage@#1\endcsname{#3}}%
-      {\def\ALG@tmp{\let\ALG@tmp\relax#3}\ALG@tmp}%
+      \item%
+%      \hskip\ALG@parindent%!!! not yet implemented
+%      \hskip-\algorithmicindent%
+   }%
+%
+\def\ALG@noputindents%
+   {%
+   \hskip\ALG@tlm%
    }%
 %
-\def\algsetlanguage#1%
+%
+%   ***   algorithm store / restore   ***
+%
+%
+%   store
+%
+\ALG@newcondstate{mustrestore}%
+\def\algstore%
    {%
-   \csname ALG@setlanguage@#1\endcsname%
+   \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%
+   }%
-- 
cgit v1.2.3

