%  algorithm2e.sty --- style file for algorithms
%% Copyright 1996-2004 Christophe Fiorio
%
% This program may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.2 or later is part of all distributions of LaTeX 
% version 1999/12/01 or later.
%
% This program consists of the files algorithm2e.sty and algorithm2e.tex
%  
%  Report bugs and comments to:
%  fiorio@lirmm.fr
%
%  $Id: algorithm2e.sty,v 3.6 2005/01/26 08:23:26 fiorio Exp $
%
%  PACKAGES REQUIRED:
%
%  - float  (in contrib/supported/float)
%  - ifthen (in base)
%  - xspace (in packages/tools)
%
%%%%%%%%%%%%%%%  Release 3.6
%
%   History: 
%
%   - January 24 2005  - revision 3.6 -
%                      * FIX: - vertical spacing and space characters at the beginning or end of
%                               comments.
%                               line numbers of comments not in the nlsty.
%                               Thanks to Arnaud Giersch for his comments and suggestions.
%                      * FIX: - Set*Sty macro: the styles defined was not protected and was modified
%                               by surrounding context. For example KwTo in a \For{}{} was in bold AND
%                               italic instead of just in bold.
%                      * FIX: - line number misplacement after \Indp
%
%   - January 21 2005  - revision 3.5 -
%                      * ADD: - hidden numbering of the lines. Lines are auto-numbered but numbers
%                               are shown only on lines you specify:
%                               * linesnumberedhidden option or \linesnumberedhidden macro activate
%                                 this functionnality.
%                               * \showln and \showlnlabel{lab} macros make the number visible on
%                                 the line. \showlnlabel{lab} allows to set a label for this line.
%                               Thanks to Samson de Jager who makes this suggestion and provides the
%                               macros.
%                      * ADD: - \AlCapFnt and \SetAlCapFnt which allow to have a different font for
%                               caption. Works like \AlFnt and \SetAlFnt and by default is the same.
%                      * ADD: - \AlCapSkip skip length. This vertical space is added before caption
%                               in plain ou boxed mode. It allows to change distance between text
%                               and caption.
%                      * FIX: - caption compatible with IEEEtran class. 
%                      * FIX: - some vertical spacing error with \uIf macros (Thanks to Arnaud Giersch)
%                      * FIX: - Procedure and Function: lines are also numbered like algorithms
%                      * FIX: - CommentSty was not used for Comments
%
%   - January 10 2005  - revision 3.4 -
%                      * FIX: - caption compatible with new release of Beamer class. 
%
%   - June 16 2004     - revision 3.3 - 
%                      * FIX: - Hyperlink references of Hyperref package works now if compiled with pdflatex 
%                               and [naturalnames] option of hyperref package is used.
%                      * FIX: - algorithm[H] had problem in an list environment - corrected
%                      * FIX: - interline was not so regular in nested blocks - corrected
%                      * ADD  - \Setvlineskip macro which set the vertical skip after the little horizontal 
%                               rule which closes a block in Vlined mode. By default 0.8ex
%
%   - June 11 2004     - revision 3.2 - AUTO NUMBERING LINES !!!
%                      * ADD: auto numbering of the lines (the so asked and so long awaiting feature)
%                             this feature is managed by 3 options and 3 commands:
%                             - linesnumbered option: lines of the algo are numbered except for comments and
%                               input/output (KwInput and KwInOut)
%                             - commentsnumbered option: makes comments be numbered
%                             - inoutnumbered option: makes data input/output be numbered
%                             - \nllabel{lab} labels the line so you can cite with \ref{lab}
%                             - \linesnumbered make the following algorithms having auto-numbered lines
%                             - \linesnotnumbered make the following algorithms having no auto-numbered lines
%                      * Change: algo2e option renames listofalgorithm in listofalgorithme
%                      * FIX: new solution for compatibility with color package, more robust and not tricky.
%                             Many thanks to David Carlisle for his advices
%
%   - June 09 2004     - revision 3.1 -
%                      * Change: \SetKwSwitch command defines an additionnal
%                                macro \uCase and \Case prints end
%                      * Change: now macros SetKw* do a renewcommand if the
%                                keyword is already defined. So you can redefine
%                                default definition at your own convenience or
%                                change your definition without introducing a
%                                new macro and changing your text.
%                      * ADD: new macro \SetKwIF which do \SetKwIf and
%                             \SetKwIfElseIf.The following default definition has been added:
%                             \SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{endif}
%                             and so you get the macros;
%                             \If \eIf \lIf \uIf \ElseIf \uElseIf \lElseIf \Else
%                             \uElse \lElse
%                      * ADD: new macro \SetAlgoSkip which allow to fix the
%                             vertical skip before and after the algorithms.
%                             Default is smallskip, do \SetAlgoSkip{} if you
%                             don't want an extra space or \SetAlgoSkip{medskip}
%                             or \SetAlgoSkip{bigskip} if you want bigger space.
%                      * ADD: macro \SetKwIf defines in addition a new macro
%                             \uElse  (depending on wat name you
%                             have given in #2 arg).
%                      * ADD: macro \SetKwIfElseIf defines in addition a new macro
%                             \uElse and \ugElseIf (depending on what name you
%                             have given in #2 and #3 arg).
%                      * Change: baseline of algorithm is now top, so two
%                                algorithms can be put side by side.
%                      * FIX: Compatibility with color package solved. The problem
%                             was due to a redefinition of standard macros by color package
%                             This solves compatibility problem with other packages
%                             as pstcol or colortbl.
%                             (notified by Dirk Fressmann, Antti Tarvainen and Koby Crammer)
%                      * Fix: extra little shift to the right with boxed style
%                             algorithm removed (notified by P. Tanovski)
%                      * Fix: algoln option was buggy (notified bye Jiaying Shen)
%                      * Fix: german and portuges option didn't work due to bad
%                             typo (notified by Martin Sievers, Thorsten Vitt
%                             and Jeronimo Pellegrini)
%                      
%   - February 13 2004 - revision 3.0 -
%                      * Major revision which makes the package independent from
%                        float.sty, so now
%                        - algorithm* works better, in particular can be used in
%                          multicols environments
%                        - (known bug corrected)
%                          [H] works now for all sort of environment but is
%                          handled differently for classic environment and star
%                          environment (algorithm, figure, procedure and
%                          function). For star environment, H acts like for
%                          classical figure environment, so it doesn't stay here
%                          absolutely.
%                        - (known bug corrected)
%                          you can use now floatflt package with algorithm
%                          package and even with figure option. Beware that if
%                          you want to put an algorithm inside a floatingfigure,
%                          it cannot be floating, so [H] is required and then
%                          figure option should not be used, since standard
%                          figure[H] are still floating with LaTeX.
%                      * boxruled: a new style added. Possible now since no
%                        style no more defined by the float package.
%                      * nocaptionofalgo: dosen't print Algorithm #: in the
%                        caption for algorithm in ruled or algoruled style.
%                        note: this is just documentation of a macro which was
%                        already in the package.
%   - December 14 2003 - revision 2.52 -
%                      * output message shorter
%                      * french keyword macro \PourTous was missing for
%                        longend option, it has been added.
%                      * TitleofAlgo prints Function or Procedure in
%                        corresponding environments.
%
%   - October 27 2003  - revision 2.51 - Revision submitted to CTAN archive
%                      * correction of a minor which make caption in procedure
%                        and function to be blanck with pdfscreen package
%                        (thanks to Joel Gossens for the notification)
%                      * add two internal definition to avoid some errors when
%                        used with Hyperref package (Hyperref package need to
%                        define new counter macro from existing ones, and
%                        don't do it for algorithm2e package, so we do it)
%
%   - October 17 2003  - revision 2.50 - first revision for CTAN archive
%
%                      * add \AlFnt and \SetAlFnt{font} macros:
%                        \AlFnt is used at the beginning of the caption and the
%                        body of algorithm in order to define the fonts used
%                        for typesetting algorithms. You can use it elsewhere
%                        you want to typeset text as algorithm. For example
%                        you can do \SetAlFnt{\small\sf} to have algorithms
%                        typeset in small sf font. Default is nothing so
%                        algorithm is typeset as the text of the document.
%                      * add \AlTitleFnt{text} and \SetAlTitleFnt{font} macros:
%                        The {Algorithm: } in the caption is typeset with
%                        \AlTitleFnt{Algorithm:}. You can use it to have text
%                        typeset as {Algorithm:} of captions. Default is
%                        textbf.
%                        Default can be redefined by \SetAlTitleFnt{font}.
%                      * add CommentSty typo for text comment.
%                      * add some compatibility with hyperref package (still
%                        an error on multiply defined refs but pdf correctly
%                        generated)
%                      * flush text to left in order to have correct
%                        indentation even with class as amsart which center
%                        all figures
%                      * add german, portugues and czech options for title of
%                        algorithms and typo.
%                      * add portuguese translation of predefined keywords
%                      * add czech translation of some predefined keywords
%
%   - December 23 2002 - revision 2.40
%                      * add some french keyword missing
%                      * add function* and procedure* environment like
%                        algorithme* environment: print in one column even
%                        if twocolumn option is specified for the document.
%                      * add a new macro \SetKwComment to define macro which
%                        writes comments in the text. First argument is the
%                        name of the macro, second is the text put before the
%                        comment, third is the text put at the end of the
%                        comment.Default are \tcc and \tcp
%                      * add new options to change the way algo are numbered:
%                        [algopart] algo are numbered within part (counter must exist)
%                        [algochapter] algo are numbered within chapter
%                        [algosection] algo are numbered within section
%
%   - March 27 2002   - revision 2.39
%                      * Gilles Geeraerts: added the \SetKwIfElseIf to manage
%                        if (c)
%                             i;
%                        else if (c)
%                             i;
%                        ...
%                        else
%                             i;
%                        end
%                      * Also added \gIf \gElsIf \gElse.
%
%   - January 02 2001 - revision 2.38
%                      * bugs related to the caption in procedure and function
%                        environment are corrected.
%                      * bug related to option noend (extra vertical space added
%                        after block command as If or For) is corrected.
%                      * czech option language added (thanks to Libor Bus: l.bus@sh.cvut.cz).
%  
%   - October 16 2000 - revision 2.37
%                      * option algo2e added: change the name of environment
%                        algorithm into algorithm2e. So allow to use the package
%                        with some journal style which already define an algorithm
%                        environment.
%  
%   - September 13 2000 - revision 2.36
%                      * option slide added: require package color
%                      * Hack for slide class in order to have correct
%                        margins
%  
%   - November 25 1999 - revision 2.35
%                      * revision number match RCS number
%                      * Thanks to David A. Bader, a new option is added:
%                        noend: no end keywords are printed.
%  
%   - November 19 1999 - revision 2.32
%                      * minor bug on longend option corrected.
%  
%   - August 26 1999 - revision 2.31
%                      * add an option : figure
%                        this option makes algorithms be figure and so are numbered
%                        as figures, have Figure as caption and are putted in 
%                        the \listoffigures
%  
%   - January 21 1999 - revision 2.3 beta
%                    add 2 new environments: procedure and function.
%                    These environments works like algorithm environment but:
%                    - the ruled (or algoruled) style is imperative.
%                    - the caption now writes Procedure name....
%                    - the syntax of the \caption command is restricted as
%                      follow: you MUST put a name followed by 2 braces like
%                      this ``()''. You can put arguments inside the braces and
%                      text after. If no argument is given, the braces will be
%                      removed in the title. 
%                    - label now puts the name (the text before the braces in the
%                      caption) of the procedure or function as reference (not
%                      the number like a classic algorithm environment).
%                    There are also two new styles : ProcNameSty and
%                    ProcArgSty. These style are by default the same as FuncSty
%                    and ArgSty but are used in the caption of a procedure or a
%                    function.
%                    
%   - November 28 1996 - revision 2.22
%                    add a new macro \SetKwInParam{arg1}{arg2}{arg3}:
%                    it defines a macro \arg1{name}{arg} which prints name in keyword
%                    style followed byt arg surrounded by arg2 and arg3. The main
%                    application is to a function working as \SetKwInput to be used
%                    in the head of the algorithm. For example
%                    \SetKwInParam{Func}{(}{)} allows
%                    \Func{functionname}{list of arguments} which prints:
%                    \KwSty{functioname(}list of arguments\KwSty{)}
%       
%
%   - November 27 1996 - revision 2.21 :
%                    minor bug in length of InOut boxes fixed.
%                    add algorithm* environment.
%
%   - July 12 1996 - revision 2.2 : \SetArg and \SetKwArg macros removed.
%                        
%                    \SetArg has been removed since it never has been
%                    documented.
%                    \SetKwArg has been removed since \SetKw can now
%                    take an argument in order to be consistent with
%                    \SetKwData and \SetKwFunction macros.
%
%   - July 04 1996 - revision 2.1 : still more LaTeX2e! Minor compatibility break
%
%                    Macros use now \newcommand instead of \def, use of \setlength, 
%                    \newsavebox, ... and other LaTeX2e specific stuff.
%                    The compatibility break:
%                    - \SetData becomes \SetKwData to be more consistent. So the old 
%                      \SetKwData becomes \SetKwInput
%                    - old macros \titleofalgo, \Freetitleofalgo and \freetitleofalgo
%                      from LaTeX209 version which did print a warning message and call 
%                      \Titleofalgo in version 2.0 are now removed!
%
%   - March 13 1996 - revision 2.0: first official major revision.
%   
%
%%%%%%%%%%%%%%
%
%   Known bugs: 
%   -----------
%   - no more known bugs... all are corrected!
%
%%%%%%%%%%%%%%
%
%   Package options: 
%   ---------------
%   - french, english, german, portuguese, czech  : for the name of the algorithm, e.g.
%   - boxed, boxruled, ruled, algoruled, plain    : layout of the algorithm
%   - algo2e                           : environment is algorithm2e instead of algorithms 
%                                        and \listofalgorithmes instead of \listofalgorithms
%   - slide                            : to use when making slides
%   - noline,lined,vlined              : how block are designed.
%   - linesnumbered                    : auto numbering of the algorithm's lines
%   - algopart,algochapter,algosection : algo numbering within part, chapter or section
%   - titlenumbered,titlenotnumbered   : numbering of title set by \Titleofalgo
%   - figure                           : algorithms are figures, numbered as figures, and put in the list of figures.
%   - resetcount, noresetcount         : start value of line numbers.
%   - algonl                           : line numbers preceded by algo number
%   - shortend, longend, noend         : short or long end keyword as endif for e.g.
%  
%   defaults are; english,plain,resetcount,titlenotnumbered
%
%%%%%%%%%%%%%%
%
%   Short summary  
%   -------------
%  
%   algorithm is an environment for writing algorithm in LaTeX2e
%   It provide macros that allow you to create differents
%   sorts of key words, therefore a set of predefined key word
%   is gived.
%
%   IT should be used as follows
%
%   \begin{algorithm}
%       ...
%       ...
%   \end{algorithm}
%
%
%   IMPORTANT : each line MUST end with \;
%
%   Note that if you define macros outside algorithm environment they
%   are avaible in all the document and particulary you can use then
%   inside all algorithms without re-define them.
%  
%   an example:
%
%   \begin{algorithm}[H]
%     \SetLine
%     \AlgData{this text}
%     \AlgResult{how to write algorithm with \LaTeX2e }
%     
%     initialization\;
%     \While{not at end of this document}{
%       read current section\;
%       \eIf{understand}{
%         go to next section\;
%         current section becomes this one\;
%         }{
%         go back to the beginning of current section\;
%         }
%       }
%     \caption{How to write algorithm}
%   \end{algorithm}
%
%
%%%%%%%%%%%%%%         predefined english keywords
%
%     \AlgData{input}
%     \AlgResult{output}
%     \KwIn{input}
%     \KwOut{output}
%     \KwData{input}
%     \KwResult{output}
%     \Ret{[value]}
%     \KwTo                                       % a simple keyword
%     \Begin{block inside}
%     \If{condition}{Then block}                  % in a block
%     \uIf{condition}{Then block}                 % in a block unended
%     \Else{inside Else}                          % in a block
%     \eIf{condition}{Then Block}{Else block}     % in blocks
%     \lIf{condition}{Else text}                  % on the same line
%     \lElse{Else text}                           % on the same line        
%     \Switch{Condition}{Switch block}
%     \Case{a case}{case block}                   % in a block
%     \lCase{a case}{case text}                   % on the same line
%     \Other{otherwise block}                     % in a block
%     \lOther{otherwise block}                    % on the same line
%     \For{condition}{text loop}                  % in a block
%     \lFor{condition}{text}                      % on the same line
%     \ForEach{condition}{text loop}              % in a block
%     \lForEach{condition}{text}                  % on the same line
%     \Repeat{End condition}{text loop}           % in a block
%     \lRepeat{condition}{text}                   % on the same line
%     \While{condition}{text loop}                % in a block
%     \lWhile{condition}{text loop}               % on the same line
%
%
%%%%%%%%%%%%%%        predefined french keywords
%
%     \AlgDonnees{input}
%     \AlgRes{input}
%     \Donnees{input}
%     \Res{input}
%     \Retour[valeur]}
%     \Deb{block inside}
%     \KwA                                          % un mot clef simple
%     \Si{condition}{Bloc du Alors}                 % Dans un bloc
%     \uSi{condition}{Bloc du Alors}                % Dans un bloc non termine
%     \eSi{condition}{Bloc du Alors}{Bloc du Sinon} % Dans un bloc
%     \lSi{condition}{texte du Alors}               % sur la meme ligne
%     \lSinon{texte du Sinon}                       % sur la meme ligne
%     \Suivant{Condition}{Bloc de l'instruction}
%     \Cas{cas}{Bloc de ce cas}                     % Dans un bloc
%     \lCas{cas}{Bloc de ce cas}                    % sur la meme ligne
%     \Autres{Bloc de l'alternative}                % Dans un bloc
%     \lAutres{Bloc de l'alternative}               % sur la meme ligne
%     \Pour{condition}{texte de la boucle}          % Dans un bloc
%     \lPour{condition}{texte}                      % sur la meme ligne
%     \PourCh{condition}{texte de la boucle}          % Dans un bloc
%     \lPourCh{condition}{texte}                      % sur la meme ligne
%     \Repeter{End condition}{texte de la boucle}   % Dans un bloc
%     \lRepeter{condition}{texte}                   % sur la meme ligne
%     \Tq{condition}{texte de la boucle}            % Dans un bloc
%     \lTq{condition}{texte de la boucle}           % sur la meme ligne
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% for more complete informations you can see algorithm2e.tex
%
%
%%%%%%%%%%%%%%%%%%%%%%%% Identification Part %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
%
\ProvidesPackage{algorithm2e}[2004/06/16]
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%% Initial Code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\@makeother\*% some package redefined it as a letter (as color.sty)
%
% definition of commands which can be redefined in options of the package.
%
\newcounter{AlgoLine}
\setcounter{AlgoLine}{0}
%
\newcommand{\listalgorithmcfname}{}
\newcommand{\algorithmcfname}{}
\newcommand{\algocf@typo}{}
\newcommand{\@algocf@procname}{}
\newcommand{\@algocf@funcname}{}
\newcommand{\@algocf@titleofalgoname}{\algorithmcfname}
\newcommand{\@algocf@algotitleofalgo}{%
  \renewcommand{\@algocf@titleofalgoname}{\algorithmcfname}}
\newcommand{\@algocf@proctitleofalgo}{%
  \renewcommand{\@algocf@titleofalgoname}{\algocf@procname}}
%
\newcommand{\algocf@style}{plain}
\newcommand{\@ResetCounterIfNeeded}{}
\newcommand{\@titleprefix}{}
%
\newcommand{\algocf@numbering}[1]{\newcommand{\algocf@within}{#1}}
%
\newcommand{\defaultsmacros@algo}{\algocf@defaults@shortend}
%
\newcommand{\algocf@list}{loa}
\newcommand{\algocf@float}{algocf}
%
\newcommand{\algocf@envname}{algorithm}
\newcommand{\algocf@listofalgorithms}{listofalgorithms}
%
%
%%%%%%%%%%%%%%%%%%%%%% Declaration of Options %%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\RequirePackage{ifthen}
%
\DeclareOption{algo2e}{%
  \renewcommand{\algocf@envname}{algorithm2e}
  \renewcommand{\algocf@listofalgorithms}{listofalgorithmes}
}
%
\newboolean{algocf@slide}\setboolean{algocf@slide}{false}
\DeclareOption{slide}{%
  \setboolean{algocf@slide}{true}%
}
%
\DeclareOption{figure}{
\renewcommand{\algocf@list}{lof}
\renewcommand{\algocf@float}{figure}
}
%
\DeclareOption{english}{%
\renewcommand{\listalgorithmcfname}{List of Algorithms}%
\renewcommand{\algorithmcfname}{Algorithm}%
\renewcommand{\algocf@typo}{}%
\renewcommand{\@algocf@procname}{Procedure}
\renewcommand{\@algocf@funcname}{Function}
}
%
\DeclareOption{french}{%
\renewcommand{\listalgorithmcfname}{Liste des Algorithmes}%
\renewcommand{\algorithmcfname}{Algorithme}%
\renewcommand{\algocf@typo}{\ }%
\renewcommand{\@algocf@procname}{Procédure}
\renewcommand{\@algocf@funcname}{Fonction}
}
%
\DeclareOption{czech}{%
\renewcommand{\listalgorithmcfname}{Seznam algoritm\v{u}}%
\renewcommand{\algorithmcfname}{Algoritmus}%
\renewcommand{\algocf@typo}{}%
\renewcommand{\@algocf@procname}{Procedura}
\renewcommand{\@algocf@funcname}{Funkce}
}
%
\DeclareOption{german}{%
\renewcommand{\listalgorithmcfname}{Liste der Algorithmen}%
\renewcommand{\algorithmcfname}{Algorithmus}%
\renewcommand{\algocf@typo}{\ }%
\renewcommand{\@algocf@procname}{Prozedur}%
\renewcommand{\@algocf@funcname}{Funktion}%
}
%
\DeclareOption{portugues}{%
\renewcommand{\listalgorithmcfname}{Lista de Algoritmos}%
\renewcommand{\algorithmcfname}{Algoritmo}%
\renewcommand{\algocf@typo}{}%
\renewcommand{\@algocf@procname}{Procedimento}
\renewcommand{\@algocf@funcname}{Fun\c{c}\~{a}o}
}
%
% OPTIONs plain, boxed, ruled, algoruled & boxruled
%
\newcommand{\algocf@style@plain}{\renewcommand{\algocf@style}{plain}}
\newcommand{\algocf@style@boxed}{\renewcommand{\algocf@style}{boxed}}
\newcommand{\algocf@style@ruled}{\renewcommand{\algocf@style}{ruled}}
\newcommand{\algocf@style@algoruled}{\renewcommand{\algocf@style}{algoruled}}
\newcommand{\algocf@style@boxruled}{\renewcommand{\algocf@style}{boxruled}}
\newcommand{\restylealgo}[1]{\csname algocf@style@#1\endcsname}
\DeclareOption{plain}{\algocf@style@plain}
\DeclareOption{boxed}{\algocf@style@boxed}
\DeclareOption{ruled}{\algocf@style@ruled}
\DeclareOption{algoruled}{\algocf@style@algoruled}
\DeclareOption{boxruled}{\algocf@style@boxruled}
%
% OPTIONs algopart,algochapter & algosection
%
\DeclareOption{algopart}{\algocf@numbering{part}}       %algo part numbered
\DeclareOption{algochapter}{\algocf@numbering{chapter}} %algo chapter numbered
\DeclareOption{algosection}{\algocf@numbering{section}} %algo section numbered
%
% OPTIONs resetcount & noresetcount
%
\DeclareOption{resetcount}{\renewcommand{\@ResetCounterIfNeeded}{\setcounter{AlgoLine}{0}}}
\DeclareOption{noresetcount}{\renewcommand{\@ResetCounterIfNeeded}{}}
%
% OPTION linesnumbered
%
\newboolean{algocf@linesnumbered}\setboolean{algocf@linesnumbered}{false}
\newcommand{\algocf@linesnumbered}{\relax}
\DeclareOption{linesnumbered}{%
  \setboolean{algocf@linesnumbered}{true}
  \renewcommand{\algocf@linesnumbered}{\everypar={\nl}}
}
%
% OPTION linesnumberedhidden
%
\DeclareOption{linesnumberedhidden}{%
  \setboolean{algocf@linesnumbered}{true}
  \renewcommand{\algocf@linesnumbered}{\everypar{\stepcounter{AlgoLine}}}
}
%
% OPTION commentsnumbered inoutnumbered
%
\newboolean{algocf@commentsnumbered}\setboolean{algocf@commentsnumbered}{false}
\DeclareOption{commentsnumbered}{\setboolean{algocf@commentsnumbered}{true}}
\newboolean{algocf@inoutnumbered}\setboolean{algocf@inoutnumbered}{false}
\DeclareOption{inoutnumbered}{\setboolean{algocf@inoutnumbered}{true}}
%
% OPTIONs titlenumbered & titlenotnumbered
%
\DeclareOption{titlenumbered}{%
  \renewcommand{\@titleprefix}{%
    \refstepcounter{algocf@float}%
    \AlTitleFnt{\@algocf@titleofalgoname\
      \expandafter\csname the\algocf@float\endcsname\algocf@typo : }}%
}
%
\DeclareOption{titlenotnumbered}{\renewcommand{\@titleprefix}{%
    \AlTitleFnt{\@algocf@titleofalgoname\algocf@typo : }}%
}
%
% OPTIONs lined, vlined & noline
%
\DeclareOption{lined}{\AtBeginDocument{\SetLine}}    % \SetLine
\DeclareOption{vlined}{\AtBeginDocument{\SetVline}}  % \SetVline
\DeclareOption{noline}{\AtBeginDocument{\SetNoline}} % \Setnoline (default)
%
% OPTIONs algonl
% line numbered with the counter of the algorithm
%
\DeclareOption{algonl}{\renewcommand{\theAlgoLine}{\expandafter\csname the\algocf@float\endcsname.\arabic{AlgoLine}}}
%
% OPTIONs longend, shotend & noend
%
\DeclareOption{longend}{%
\renewcommand{\defaultsmacros@algo}{\algocf@defaults@longend}}
\DeclareOption{shortend}{%
\renewcommand{\defaultsmacros@algo}{\algocf@defaults@shortend}}
\DeclareOption{noend}{%
\renewcommand{\defaultsmacros@algo}{\algocf@defaults@noend}}
%
%%%%%%%%%%%%%%%%%%%%%%% Execution of Options %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\ExecuteOptions{english,plain,resetcount,titlenotnumbered}
%
\ProcessOptions
%
\@algocf@algotitleofalgo % fix name for \Titleofalgo to \algorithmcfname by default
%
%%%%%%%%%%%%%%%%%%%%%%%%%% Package Loading %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%\RequirePackage{float}[2001/11/08]
%
\RequirePackage{xspace}
%
\ifthenelse{\boolean{algocf@slide}}{\RequirePackage{color}}{}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Main Part %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
\newcommand{\algocf@name}{algorithm2e}
\newcommand{\algocf@date}{january 25 2005}
\newcommand{\algocf@version}{Release 3.6}
\newcommand{\algocf@id}{\algocf@version\space -- \algocf@date\space --}
\typeout{********************************************************^^JPackage `\algocf@name'\space\algocf@id^^J%
         - algorithm2e-announce@lirmm.fr  mailing list for announcement about releases^^J%
         - algorithm2e-discussion@lirmm.fr mailing list for discussion about package^^J%
         subscribe by emailing sympa@lirmm.fr with 'subscribe <list> <firstname name>'^^J%
         - Author: Christophe Fiorio (fiorio@lirmm.fr)^^J********************************************************}
%%
%%
%%
%%
%%
%%
%%%% hyperref compatibility tricks: Hyperref package defines H counters from
   % standard counters (i.e \theHpage from \thepage) and check some particular
   % counters of some packages, unfortunately it doesn't do the same for
   % algorithm2e package but act as Hcounter was defined. To avoid errors we
   % defined \theHalgocf ourself
%%%%
\@ifundefined{theHalgocf}{\def\theHalgocf{\thealgocf}}{}%
\@ifundefined{theHAlgoLine}{\def\theHAlgoLine{\theAlgoLine}}{}%
\@ifundefined{toclevel@algocf}{\def\toclevel@algocf{0}}{}%
%%
%%
%%
\newcommand{\@defaultskiptotal}{0.5em}%\Setnlskip{0.5em}
\newskip\skiptotal\skiptotal=0.5em%\Setnlskip{0.5em}
\newskip\skiprule
\newskip\skiphlne
\newskip\skiptext
\newskip\skiplength
\newskip\algomargin
\newskip\skipalgocfslide\skipalgocfslide=1em
\newdimen\algowidth
\newdimen\inoutsize
\newdimen\inoutline
%
\newskip\AlCapSkip\AlCapSkip=0ex
%
\newcommand{\@algoskip}{\smallskip}%
\newcommand{\SetAlgoSkip}[1]{\renewcommand{\@algoskip}{\csname#1\endcsname}}%
%
\newsavebox{\algocf@inoutbox}
\newsavebox{\algocf@inputbox}
%%
%%
\newcommand{\arg@e}{}
\newcommand{\arg@space}{\ }
\newcommand{\BlankLine}{\vskip 1ex}
%%
\newcommand{\vespace}{1ex}
\newcommand{\SetInd}[2]{%
\skiprule=#1%
\skiptext=#2%
\skiplength=\skiptext\advance\skiplength by \skiprule\advance\skiplength by 0.4pt}
\SetInd{0.5em}{1em}
\algomargin=\leftskip\advance\algomargin by \parindent
\newcommand{\incmargin}[1]{\advance\algomargin by #1}
\newcommand{\decmargin}[1]{\advance\algomargin by -#1}
\newcommand{\Setnlskip}[1]{%
\renewcommand{\@defaultskiptotal}{#1}%
\setlength{\skiptotal}{#1}}
\newcommand{\setnlskip}[1]{\Setnlskip{#1}}%kept for compatibility issue
%%
\newcommand{\setalcapskip}[1]{\setlength{\AlCapSkip}{#1}}
%%
%%
\newcommand{\Indentp}[1]{\advance\leftskip by #1}
\newcommand{\Indp}{\advance\leftskip by 1em}
\newcommand{\Indpp}{\advance\leftskip by 0.5em}
\newcommand{\Indm}{\advance\leftskip by -1em}
\newcommand{\Indmm}{\advance\leftskip by -0.5em}
%%
%%
%% Line Numbering
%%
%%
% number line style
\newcommand{\nlSty}[1]{\textnormal{\textbf{#1}}}% default definition
\newcommand{\Setnlsty}[3]{\renewcommand{\nlSty}[1]{\textnormal{\csname#1\endcsname{#2##1#3}}}}
%
%
\newcommand{\algocf@nlhlabel}[2]{%
  \immediate\write\@auxout{%
    \string\newlabel{#1}{%
      {#2}% current label
      {\thepage}% page
      {}% current label string
      {AlgoLine\thealgocfline.\theAlgoLine}% current Href
      {}%
    }%
  }%
}
%
% nl definitions
%
\newcommand{\nl}{%
  \@ifundefined{href}{% if not hyperref then do a simple refstepcounter
    \refstepcounter{AlgoLine}%
  }{% else if hyperref, do the anchor so 2 lines in two differents algorithms cannot have the same href
    \stepcounter{AlgoLine}\Hy@raisedlink{\hyper@anchorstart{AlgoLine\thealgocfline.\theAlgoLine}\hyper@anchorend}%
  }% now we can do the line numbering
  \strut\vadjust{\kern-\dp\strutbox\vtop to \dp\strutbox{%
      \baselineskip\dp\strutbox\vss\llap{\scriptsize{\nlSty{\theAlgoLine}\hskip\skiptotal}}\null}}%
}%
\newcommand{\nllabel}[1]{%
  \@ifundefined{href}{\label{#1}}{\algocf@nlhlabel{#1}{\theAlgoLine}}}%
%
\newcommand{\enl}{;%
  \@ifundefined{href}{% if not hyperref then do a simple refstepcounter
    \refstepcounter{AlgoLine}%
  }{% else if hyperref, do the anchor so 2 lines in two differents algorithms cannot have the same href
    \stepcounter{AlgoLine}\Hy@raisedlink{\hyper@anchorstart{AlgoLine\thealgocfline.\theAlgoLine}\hyper@anchorend}%
  }% now we can do the line numbering
  \hfill\rlap{%
  \scriptsize{\nlSty{\theAlgoLine}}}\par}
\newcommand{\nlset}[1]{%
  \hskip 0pt\llap{%
  \scriptsize{\nlSty{#1}}\hskip\skiptotal}\ignorespaces}
%
% lnl definitions
%
\@ifundefined{href}{% if not hyperref
  \newcommand{\lnl}[1]{\nl\label{#1}\ignorespaces}%
}{%                   else hyperref
  \newcommand{\lnl}[1]{\nl\algocf@nlhlabel{#1}{\theAlgoLine}\ignorespaces}%
}
%
% nlset
%
\@ifundefined{href}{%
  \newcommand{\lnlset}[2]{\nlset{#2}\protected@edef\@currentlabel{#2}\label{#1}}%
}{%else hyperref
  \newcommand{\lnlset}[2]{\nlset{#2}%
    \Hy@raisedlink{\hyper@anchorstart{AlgoLine.#2}\hyper@anchorend}\algocf@nlhlabel{#1}{#2}%
    \ignorespaces%
  }%
}



\newcommand{\@endalgoln}{\string; \par}% default definition: printsemicolon
\newcommand{\dontprintsemicolon}{\renewcommand{\@endalgoln}{\par}}
\newcommand{\printsemicolon}{\renewcommand{\@endalgoln}{\string; \par}}
%
\newcommand{\linesnumbered}{\setboolean{algocf@linesnumbered}{true}\renewcommand{\algocf@linesnumbered}{\everypar={\nl}}}
\newcommand{\linesnotnumbered}{%
  \setboolean{algocf@linesnumbered}{false}%
  \renewcommand{\algocf@linesnumbered}{\relax}%
}
%
\newcommand{\linesnumberedhidden}{%
  \setboolean{algocf@linesnumbered}{true}\renewcommand{\algocf@linesnumbered}{\everypar{\stepcounter{AlgoLine}}}}
\newcommand{\showln}{\nlset{\theAlgoLine}\ignorespaces} % display the line number on this line (without labelling)
\newcommand{\showlnlabel}[1]{\lnlset{#1}{\theAlgoLine}\ignorespaces} % display the line number and label this line
%
%%
%
%%
%%
%
\newcommand{\AlTitleFnt}[1]{\textbf{#1}\unskip}% default definition
\newcommand{\SetAlTitleFnt}[1]{\renewcommand{\AlTitleFnt}[1]{\csname#1\endcsname{##1}\unskip}}%
\newcommand{\AlFnt}{\relax}% default definition
\newcommand{\SetAlFnt}[1]{\renewcommand{\AlFnt}{#1}}%
\newcommand{\AlCapFnt}{\AlFnt{}}% default definition
\newcommand{\SetAlCapFnt}[1]{\renewcommand{\AlCapFnt}{#1}}%
\newcommand{\KwSty}[1]{\textnormal{\textbf{#1}}\unskip}% default definition
\newcommand{\SetKwSty}[1]{\renewcommand{\KwSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\ArgSty}[1]{\textnormal{\emph{#1}}\unskip}%\SetArgSty{emph}
\newcommand{\SetArgSty}[1]{\renewcommand{\ArgSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\FuncSty}[1]{\textnormal{\texttt{#1}}\unskip}%\SetFuncSty{texttt}
\newcommand{\SetFuncSty}[1]{\renewcommand{\FuncSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\DataSty}[1]{\textnormal{\textsf{#1}}\unskip}%%\SetDataSty{textsf}
\newcommand{\SetDataSty}[1]{\renewcommand{\DataSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\CommentSty}[1]{\textnormal{\texttt{#1}}\unskip}%%\SetDataSty{texttt}
\newcommand{\SetCommentSty}[1]{\renewcommand{\CommentSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
\newcommand{\TitleSty}[1]{#1\unskip}%\SetTitleSty{}{}
\newcommand{\SetTitleSty}[2]{\renewcommand{\TitleSty}[1]{%
\csname#1\endcsname{\csname#2\endcsname##1}}\unskip}
%
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\al@push}[1]{\advance\skiptotal by #1\moveright #1}
\newcommand{\al@pop}[1]{\advance\skiptotal by -#1}
\newcommand{\al@addskiptotal}{\advance\skiptotal by 0.4pt\advance\hsize by -0.4pt}  % 0.4 pt=width of \vrule
\newcommand{\al@subskiptotal}{\advance\skiptotal by -0.4pt\advance\hsize by 0.4pt} % 0.4 pt=width of \vrule
%
\skiphlne=.8ex%
\newcommand{\Setvlineskip}[1]{\skiphlne=#1}
\newcommand{\V@line}[1]{%     no vskip in between boxes but a strut to separate them, 
  \strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
  \al@push{\skiprule}%        move to the right before the vertical rule
  \hbox{\vrule%
    \vtop{\al@push{\skiptext}%move the right after the rule
      \vtop{\al@addskiptotal\advance\hsize by -\skiplength #1}\Hlne}}\vskip\skiphlne% inside the block
  \al@pop{\skiprule}%\al@subskiptotal% restore indentation
  \nointerlineskip}% no vskip after
%
\newcommand{\V@sline}[1]{%    no vskip in between boxes but a strut to separate them, 
  \strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
  \al@push{\skiprule}%        move to the right before the vertical rule
  \hbox{\vrule%               the vertical rule
    \vtop{\al@push{\skiptext}%move the right after the rule
      \vtop{\al@addskiptotal\advance\hsize by -\skiplength #1}}}% inside the block
  \al@pop{\skiprule}}% restore indentation
  %\nointerlineskip}%  no vskip after
%
\newcommand{\H@lne}{\hrule height 0.4pt depth 0pt width .5em}
%
\newcommand{\No@line}[1]{%    no vskip in between boxes but a strut to separate them, 
  \strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
  \al@push{\skiprule}%
  \hbox{%
    \vtop{\al@push{\skiptext}%
      \vtop{\advance\hsize by -\skiplength #1}}}% inside the block
  \al@pop{\skiprule}}%
  %\nointerlineskip}% no vskip after
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% default=NoLine
%
\newcommand{\a@@block}[2]{\No@line{##1}\KwSty{##2}\par}
\newcommand{\a@block}[2]{\a@@block{#1}{#2}} % this to be redefined as a@group in
                                            % case of noend option
\newcommand{\a@group}[1]{\No@line{##1}}
\newcommand{\Hlne}{}
%
%
\newcommand{\SetNoline}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Noline
\renewcommand{\a@@block}[2]{\No@line{##1}\KwSty{##2}\strut\par}%
\renewcommand{\a@group}[1]{\No@line{##1}\strut\ignorespaces}
\renewcommand{\Hlne}{}}
%
\newcommand{\SetVline}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Vline
\renewcommand{\a@@block}[2]{\V@line{##1}}%
\renewcommand{\a@group}[1]{\V@sline{##1}\strut\ignorespaces}
\renewcommand{\Hlne}{\H@lne}}
%
\newcommand{\SetLine}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Line
\renewcommand{\a@@block}[2]{\strut\V@sline{##1}\KwSty{##2}\strut\par}% no skip after a block so garantie at least a line
\renewcommand{\a@group}[1]{\V@sline{##1}\strut\ignorespaces}
\renewcommand{\Hlne}{}}
%
\newcommand{\SetNothing}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Noline
\renewcommand{\a@@block}[2]{\No@line{##1}\par}%
%\long
\renewcommand{\a@group}[1]{\No@line{##1}}
\renewcommand{\Hlne}{}}
%
%%
%%
%
%
% ``Input :'''s like command where the text stay at the right of the longer
% keyword of KwInOut commands (text of KwInOut commands are all vertically aligned)
%
\newcommand{\algocf@newinout}{\par\parindent=\wd\algocf@inoutbox}% to put right indentation after a \\ in the KwInOut
\newcommand{\SetKwInOut}[2]{%
  \sbox\algocf@inoutbox{\hbox{\KwSty{#2}\algocf@typo:\ }}%
  \expandafter\ifx\csname InOutSizeDefined\endcsname\relax% if first time used
    \newcommand\InOutSizeDefined{}\setlength{\inoutsize}{\wd\algocf@inoutbox}%
  \else% else keep the larger dimension
    \ifdim\wd\algocf@inoutbox>\inoutsize\setlength{\inoutsize}{\wd\algocf@inoutbox}\fi%
  \fi% the dimension of the box is now defined.
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[1]{%
    \ifthenelse{\boolean{algocf@inoutnumbered}}{\relax}{\everypar={\relax}}
    {\let\\\algocf@newinout\hangindent=\wd\algocf@inoutbox\hangafter=1\parbox[t]{\inoutsize}{\KwSty{#2}\hfill:\mbox{\ }}##1\par}
    \algocf@linesnumbered% reset the numbering of the lines
  }}%
%
%% allow to ajust the skip size of InOut
%%
\newcommand{\ResetInOut}[1]{%
  \sbox\algocf@inoutbox{\hbox{\KwSty{#1}\algocf@typo:\ }}%
  \setlength{\inoutsize}{\wd\algocf@inoutbox}%
  }
%
% ``Input :'''s like commands where the text stay at the right of the keyword.
%
\newcommand{\algocf@newinput}{\par\parindent=\wd\algocf@inputbox}% to put right indentation after a \\ in the KwInput
\newcommand{\SetKwInput}[2]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[1]{%
    \sbox\algocf@inputbox{\hbox{\KwSty{#2}\algocf@typo: }}%
    \ifthenelse{\boolean{algocf@inoutnumbered}}{\relax}{\everypar={\relax}}%
    {\let\\\algocf@newinput\hangindent=\wd\algocf@inputbox\hangafter=1\unhbox\algocf@inputbox##1\par}%
    \algocf@linesnumbered% reset the numbering of the lines
  }}%
\newcommand{\SetKwData}[2]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname @#1\endcsname[1]{\DataSty{#2(}\ArgSty{##1}\DataSty{)}}%
  \expandafter\algocf@mkcmd\csname#1\endcsname{%
    \@ifnextchar\bgroup{\csname @#1\endcsname}{\DataSty{#2}\xspace}}%
  }
%
% comment in the text, first argument is the name of the macro, second is
% the text put before the comment, third is the text put at the end of the
% comment.
\newcommand{\algocf@endmarkcomment}{\relax}
\newcommand{\algocf@startcomment}{\hangindent=\wd\algocf@inputbox\hangafter=1\usebox\algocf@inputbox}
\newcommand{\algocf@endcomment}{\hfill\algocf@endmarkcomment\par}
\newcommand{\algocf@endstartcomment}{\algocf@endcomment\algocf@startcomment\ignorespaces}
\newcommand{\SetKwComment}[3]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[1]{%
    \sbox\algocf@inputbox{\CommentSty{\hbox{#2}}}%
    \ifthenelse{\boolean{algocf@commentsnumbered}}{\relax}{\everypar={\relax}}
    {\renewcommand{\algocf@endmarkcomment}{#3}%
      \let\\\algocf@endstartcomment%
      \algocf@startcomment\CommentSty{\strut\ignorespaces##1\strut\hfill#3}\par}
    \algocf@linesnumbered% reset the numbering of the lines
  }}%
%
\newcommand{\SetKw}[2]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname @#1\endcsname[1]{\KwSty{#2} \ArgSty{##1}}%
  \expandafter\algocf@mkcmd\csname#1\endcsname{%
    \@ifnextchar\bgroup{\csname @#1\endcsname}{\KwSty{#2}\xspace}}%
  }
%
\newcommand{\SetKwFunction}[2]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname @#1\endcsname[1]{\FuncSty{#2(}\ArgSty{##1}\FuncSty{)}}%
  \expandafter\algocf@mkcmd\csname#1\endcsname{%
    \@ifnextchar\bgroup{\csname @#1\endcsname}{\FuncSty{#2}\xspace}}%
}
%
\newcommand{\SetKwBlock}[3]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[1]{%
    \KwSty{#2}\a@group{##1}\KwSty{#3}\par}%
  }
%
\newcommand{\SetKwSwitch}[8]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[2]{% Switch
    \KwSty{#4} \ArgSty{##1} %
    \KwSty{#5}\a@block{##2}{#8}}%
  \expandafter\algocf@mkcmd\csname#2\endcsname[2]{% case
    \KwSty{#6} \ArgSty{##1}\a@block{##2}{#8}}%
  \expandafter\algocf@mkcmd\csname u#2\endcsname[2]{% case
    \KwSty{#6} \ArgSty{##1}\a@group{##2}}%
  \expandafter\algocf@mkcmd\csname l#2\endcsname[2]{% lcase
    \KwSty{#6} \ArgSty{##1} ##2}%
  \expandafter\algocf@mkcmd\csname#3\endcsname[1]{% default
    \KwSty{#7}\a@block{##1}{#8}}% 
  \expandafter\algocf@mkcmd\csname l#3\endcsname[1]{% ldefault
    \KwSty{#7} ##1}%
  }
%
\newcommand{\SetKwIF}[8]{% #1=\If #2=\ElseIf #3=\Else #4=if #5=then #6=elseif si #7=else #8=endif
\@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname#1\endcsname[2]{% If then { } endif
  \KwSty{#4} \ArgSty{##1} %
  \KwSty{#5}\a@block{##2}{#8}}%
\@ifundefined{e#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname e#1\endcsname[3]{% If then {} else {} endif
  \KwSty{#4} \ArgSty{##1} \KwSty{#5}%
  \a@group{##2}\KwSty{#7}\a@block{##3}{#8}}%
\@ifundefined{l#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname l#1\endcsname[2]{% lIf then
  \KwSty{#4} \ArgSty{##1} \KwSty{#5} ##2}%
\expandafter\algocf@mkcmd\csname u#1\endcsname[2]{% uIf then 
  \KwSty{#4} \ArgSty{##1} \KwSty{#5}\a@group{##2}}%
\@ifundefined{#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname#2\endcsname[2]{% ElseIf {} endif
  \KwSty{#6} \ArgSty{##1} %
  \KwSty{#5}\a@block{##2}{#8}}%
\@ifundefined{u#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname u#2\endcsname[2]{% uElseIf
  \KwSty{#6} \ArgSty{##1} \KwSty{#5}%
  \a@group{##2}}%
\@ifundefined{l#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname l#2\endcsname[2]{% lElseIf
  \KwSty{#6} \ArgSty{##1} \KwSty{#5} ##2}%
\@ifundefined{#3}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname#3\endcsname[1]{% Else {} endif
  \KwSty{#7}\a@block{##1}{#8}}%
\@ifundefined{u#3}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname u#3\endcsname[1]{% uElse
  \KwSty{#7}\a@group{##1}}%
\@ifundefined{l#3}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
\expandafter\algocf@mkcmd\csname l#3\endcsname[1]{% lElse endif
  \KwSty{#7} ##1}%
}
%
\newcommand{\SetKwIf}[6]{%
  \@ifundefined{e#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname e#1\endcsname[3]{% If then {} else {} endif
    \KwSty{#3} \ArgSty{##1} \KwSty{#4}%
    \a@group{##2}\KwSty{#5}\a@block{##3}{#6}}%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[2]{% if then {} endif
    \KwSty{#3} \ArgSty{##1} \KwSty{#4}\a@block{##2}{#6}}%
  \@ifundefined{u#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname u#1\endcsname[2]{% if then {}
    \KwSty{#3} \ArgSty{##1} \KwSty{#4}\a@group{##2}}%
  \@ifundefined{#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#2\endcsname[1]{% else {} endif
    \KwSty{#5}\a@block{##1}{#6}}%
  \@ifundefined{u#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname u#2\endcsname[1]{% else {}
    \KwSty{#5}\a@group{##1}}%
  \@ifundefined{l#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname l#1\endcsname[2]{% if then endif
    \KwSty{#3} \ArgSty{##1} %
    \KwSty{#4} ##2}%
  \@ifundefined{l#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname l#2\endcsname[1]{% else endif
    \KwSty{#5} ##1}%
  }
%
\newcommand{\SetKwIfElseIf}[8]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[2]{% If then { } endif
    \KwSty{#4} \ArgSty{##1} %
    \KwSty{#5}\a@block{##2}{#8}}%
  \@ifundefined{l#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname l#1\endcsname[2]{% If then endif
    \KwSty{#4} \ArgSty{##1} %
    \KwSty{#5} ##2}%
  \@ifundefined{u#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname u#1\endcsname[2]{% If then 
    \KwSty{#4} \ArgSty{##1} \KwSty{#5}\a@group{##2}}%
  \@ifundefined{#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#2\endcsname[2]{% ElseIf {} endif
    \KwSty{#6} \ArgSty{##1} %
    \KwSty{#5}\a@block{##2}{#8}}%
  \@ifundefined{u#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname u#2\endcsname[2]{% uElseIf
    \KwSty{#6} \ArgSty{##1} %
    \KwSty{#5}\a@group{##2}}%
  \@ifundefined{l#2}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname l#2\endcsname[2]{% lElseIf endif
    \KwSty{#6} \ArgSty{##1} \KwSty{#5} ##2}%
  \@ifundefined{#3}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#3\endcsname[1]{% Else {} endif
    \KwSty{#7}\a@block{##1}{#8}}%
  \@ifundefined{u#3}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname u#3\endcsname[1]{% uElse
    \KwSty{#7}\a@group{##1}}%
  \@ifundefined{l#3}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname l#3\endcsname[1]{% lElse endif
    \KwSty{#7} ##1}%
}
%
\newcommand{\SetKwFor}[4]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[2]{%
    \KwSty{#2} \ArgSty{##1} \KwSty{#3}\a@block{##2}{#4}}%
  \expandafter\algocf@mkcmd\csname l#1\endcsname[2]{%
    \KwSty{#2} \ArgSty{##1} \KwSty{#3} ##2}%
  }
%
\newcommand{\SetKwRepeat}[3]{%
  \@ifundefined{#1}{\let\algocf@mkcmd=\newcommand}{\let\algocf@mkcmd=\renewcommand}%
  \expandafter\algocf@mkcmd\csname#1\endcsname[2]{%
    \KwSty{#2}\a@group{##2}\KwSty{#3} \ArgSty{##1}\@endalgoln}%
  \expandafter\algocf@mkcmd\csname l#1\endcsname[2]{%
    \KwSty{#2} ##2 \KwSty{#3} \ArgSty{##1}}%
  }
%
% 
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%        Environments definitions     %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%
%% Caption management
%%
% for the following macros:
% #1 is given by caption and is equal to fnum@algocf
% #2 is the text given in argument by the user in the \caption macro
%
%%%%% text of caption
\newcommand{\algocf@captiontext}[2]{#1\algocf@typo: \AlCapFnt{}#2} % text of caption
%
%%%%% default caption of algorithm: used if no specific style caption is defined
\newcommand{\algocf@makecaption}[2]{%
  \addtolength{\hsize}{\algomargin}%
  \sbox\@tempboxa{\algocf@captiontext{#1}{#2}}%
  \ifdim\wd\@tempboxa >\hsize%     % if caption is longer than a line
    \hskip .5\algomargin%
    \parbox[t]{\hsize}{\algocf@captiontext{#1}{#2}}% then caption is not centered
  \else%
    \global\@minipagefalse%
    \hbox to\hsize{\hfil\box\@tempboxa\hfil}% else caption is centered
  \fi%
  \addtolength{\hsize}{-\algomargin}%
}
%
\newsavebox\algocf@capbox
\newcommand{\algocf@makecaption@plain}[2]{%
  \global\sbox\algocf@capbox{\algocf@makecaption{#1}{#2}}}%
\newcommand{\algocf@makecaption@boxed}[2]{%
  \addtolength{\hsize}{-\algomargin}%
  \global\sbox\algocf@capbox{\algocf@makecaption{#1}{#2}}
  \addtolength{\hsize}{\algomargin}%
 }%
\newcommand{\algocf@makecaption@algoruled}[2]{\algocf@makecaption@ruled{#1}{#2}}%
\newcommand{\algocf@makecaption@boxruled}[2]{\algocf@makecaption@ruled{#1}{#2}}%
\newcommand{\algocf@makecaption@ruled}[2]{%
  \global\sbox\algocf@capbox{\hskip .5\algomargin
    \parbox[t]{\hsize}{\algocf@captiontext{#1}{#2}}}% then caption is not centered
}
%
\newcommand{\algocf@caption@plain}{\vskip\AlCapSkip\box\algocf@capbox}%
\newcommand{\algocf@caption@boxed}{\vskip\AlCapSkip\box\algocf@capbox}%
\newcommand{\algocf@caption@ruled}{\box\algocf@capbox\kern2pt\hrule height.8pt depth0pt\kern2pt}%
\newcommand{\algocf@caption@algoruled}{\algocf@caption@ruled}%
\newcommand{\algocf@caption@boxruled}{%
  \addtolength{\hsize}{-0.8pt}%
  \hbox to\hsize{%
    \vrule%\hskip-0.35pt%
    \vbox{%
      \hrule\vskip2\lineskip%
      \hbox to\hsize{\unhbox\algocf@capbox\hfill}\vskip2\lineskip%
    }% 
    %\hskip-0.35pt%
    \vrule%
  }\vskip-2\lineskip\nointerlineskip%
  \addtolength{\hsize}{0.8pt}%
}
%
%
%%%% set caption for the environment

% beamer define is own caption overrinding latex caption!
% as we need it, we have put here the original definition
\long\def\algocf@latexcaption#1[#2]#3{% original definition of caption
  \par
  \addcontentsline{\csname ext@#1\endcsname}{#1}%
  {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}%
  \begingroup
  \@parboxrestore
  \if@minipage
    \@setminipage
  \fi
  \normalsize
  \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
  \endgroup%
}

\ifx\beamer@makecaption\undefined%
\else% beamer detected
\newcommand{\@makecaption}[2]{\relax}
\fi

\newcommand{\algocf@setcaption}{%
\ifx\IEEEtransversionmajor\undefined% not IEEEtran class
\ifx\beamer@makecaption\undefined%     not Beamer class
\ifx\HermesItemizeSpacing\undefined%    not Hermes class
%                                         ok nothing to do 
\else%                                  Hermes detected              
\let\algocf@hermescaption=\@caption
\let\@caption=\algocf@latexcaption
\fi%
\else%                                 Beamer detected              
\let\algocf@beamercaption=\@caption
\let\@caption=\algocf@latexcaption
\fi%
\else%                                IEEEtran detected 
\let\algocf@IEEEtrancaption=\@caption
\let\@caption=\algocf@latexcaption
\fi
\let\algocf@oldmakecaption=\@makecaption%
\renewcommand{\@makecaption}[2]{%
  \expandafter\csname algocf@makecaption@\algocf@style\endcsname{##1}{##2}}%
}
%%%%% reset caption
\newcommand{\algocf@resetcaption}{%
\ifx\IEEEtransversionmajor\undefined% not IEEEtran class
\ifx\beamer@makecaption\undefined%     not Beamer class
\ifx\HermesItemizeSpacing\undefined%    not Hermes class
%                                        ok nothing to do 
\else%                                  Hermes detected              
  \let\@caption=\algocf@hermescaption
\fi%
\else%                                 Beamer detected              
  \let\@caption=\algocf@beamercaption
\fi%
\else%                                IEEEtran detected
  \let\@caption=\algocf@IEEEtrancaption
\fi
\let\@makecaption=\algocf@oldmakecaption%
}
%
%%%%% nocaptionofalgo and restorecaptionofalgo --
\newcommand{\nocaptionofalgo}{%
  \let\@old@algocf@captiontext=\algocf@captiontext%
  \renewcommand{\algocf@captiontext}[2]{\AlCapFnt{}##2}%
}
\newcommand{\restorecaptionofalgo}{%
  \let\algocf@captiontext=\@old@algocf@captiontext%
}
%
% ----------------------  algocf environment
%
\newcounter{algocfline}                    % new counter to make lines numbers be internally 
\setcounter{algocfline}{0}                 % different in different algorithms
%
\expandafter\ifx\csname algocf@within\endcsname\relax% if \algocf@within doesn't exist
\newcounter{algocf}                        % just define a new counter
\renewcommand\thealgocf{\@arabic\c@algocf} % and the way it is printed
\else%                                    else
\newcounter{algocf}[\algocf@within]        % counter is numbered within \algocf@within
\renewcommand\thealgocf{\csname the\algocf@within\endcsname.\@arabic\c@algocf}
\fi
%
\def\fps@algocf{htbp}         % default
\def\ftype@algocf{10}         % float type
\def\ext@algocf{\algocf@list} % loa by default, lof if figure option used
\def\fnum@algocf{{\AlCapFnt\AlTitleFnt{\algorithmcfname\nobreakspace\thealgocf}}}
\newenvironment{algocf}%      % float environment for algorithms
               {\refstepcounter{algocfline}\@float{algocf}}%
               {\end@float}
\newenvironment{algocf*}%     % float* environment for algorithms
               {\refstepcounter{algocfline}\@dblfloat{algocf}}
               {\end@dblfloat}
\newcommand\listofalgocfs{    % list of algorithms
    \section*{\listalgorithmcfname}%
      \@mkboth{\MakeUppercase\listalgorithmcfname}%
              {\MakeUppercase\listalgorithmcfname}%
    \@starttoc{loa}%
    }
\newcommand*\l@algocf{\@dottedtocline{1}{1em}{2.3em}}% line of the list
%
% ----------------------  algorithm environment
%
%%%%%%%
%%
%% Algorithm environment definition
%%
%%%%%%%
%%
%
\newsavebox\algocf@algoframe
\def\@algocf@pre@plain{\relax}%  action to be done before printing the algo.
\def\@algocf@post@plain{\relax}% action to be done after printing the algo.
\def\@algocf@capt@plain{bottom}% where the caption should be localized.
\def\@algocf@pre@boxed{\noindent\begin{lrbox}{\algocf@algoframe}}
\def\@algocf@post@boxed{\end{lrbox}\framebox[\hsize]{\box\algocf@algoframe}\par}%
\def\@algocf@capt@boxed{under}%
\def\@algocf@pre@ruled{\hrule height.8pt depth0pt\kern2pt}%
\def\@algocf@post@ruled{\kern2pt\hrule\relax}%
\def\@algocf@capt@ruled{top}%
\def\@algocf@pre@algoruled{\hrule height.8pt depth0pt\kern2pt}%
\def\@algocf@post@algoruled{\kern2pt\hrule\relax}%
\def\@algocf@capt@algoruled{top}%
\def\@algocf@pre@boxruled{\noindent\begin{lrbox}{\algocf@algoframe}}%
\def\@algocf@post@boxruled{\end{lrbox}\framebox[\hsize]{\box\algocf@algoframe}\par}%
\def\@algocf@capt@boxruled{above}%
%
%% before algocf or figure environment
\newcommand{\@algocf@init}{%
  \@algocf@algotitleofalgo% fix name for \Titleofalgo to \algorithmcfname
  \algocf@setcaption%       set caption to our caption style
}
%% after the end of algocf or figure environment
\newcommand{\@algocf@term}{%
  \algocf@resetcaption% restore original caption
  \setboolean{algocf@algoH}{false}% no H by default
}
%
%%%%%%%%%%%%%%%%%
%% makethealgo: macro which print effectively the algo in its box
%% 
\newsavebox\algocf@algobox
\newcommand{\algocf@makethealgo}{%
  \vtop{%
    % place caption above if needed  bye the style
    \ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{above}}%
    {\csname algocf@caption@\algocf@style\endcsname}{}%
    %
    % precommand according to the style
    \csname @algocf@pre@\algocf@style\endcsname%
    % place caption at top if needed  bye the style
     \ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{top}}%
     {\csname algocf@caption@\algocf@style\endcsname}{}%
    %
    \box\algocf@algobox% the algo
    % place caption at bottom if needed  bye the style
     \ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{bottom}}%
     {\csname algocf@caption@\algocf@style\endcsname}{}%
    % postcommand according to the style
    \csname @algocf@post@\algocf@style\endcsname%
    % place caption under if needed  bye the style
     \ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{under}}
     {\csname algocf@caption@\algocf@style\endcsname}{}%
  }%
}
%%%%%%%%%%%%%%%%%%%
%
%% at the beginning of algocf or figure environment
\newcommand{\@algocf@start}{%
  \@algoskip%
  \begin{lrbox}{\algocf@algobox}%
  \setlength{\algowidth}{\hsize}%
  \vbox\bgroup% save all the algo in a box
  \hbox to\algowidth\bgroup\hbox to \algomargin{\hfill}\vtop\bgroup%
  \ifthenelse{\boolean{algocf@slide}}{\parskip 0.5ex\color{black}}{}%
  % initialization
  \addtolength{\hsize}{-1.5\algomargin}%
  \let\@mathsemicolon=\;\def\;{\ifmmode\@mathsemicolon\else\@endalgoln\fi}%
  \raggedright\AlFnt{}%
  \ifthenelse{\boolean{algocf@slide}}{\incmargin{\skipalgocfslide}}{}%
  %
}
%
%% at the end of algocf or figure environment
\newcommand{\@algocf@finish}{%
  \egroup%end of vtop which contain all the text
  \egroup%end of hbox wich contains [margin][vtop]
  \ifthenelse{\boolean{algocf@slide}}{\decmargin{\skipalgocfslide}}{}%
  %
  \egroup%end of main vbox
  \end{lrbox}%
  %\egroup% end of algo box
  \algocf@makethealgo% print the algo
  \@algoskip%
  % restore dimension and macros
  \setlength{\hsize}{\algowidth}%
  \lineskip\normallineskip\setlength{\skiptotal}{\@defaultskiptotal}%
  \let\;=\@mathsemicolon%  
  %
}
%%%%%%%%%%%%%%%%%%%%
%% basic definition of the environment algorithm
%%

\newboolean{algocf@algoH}\setboolean{algocf@algoH}{false}
\newenvironment{algocf@Here}{\noindent%
  \def\@captype{algocf}% if not defined, caption exit with an error
%  \hbox\bgroup%
  \begin{minipage}{\hsize}
}{%
  \end{minipage}
%  \egroup%
}%
\newenvironment{\algocf@envname}[1][htbp]{%
   \@algocf@init%
   \ifthenelse{\equal{\algocf@float}{figure}}%
     {\begin{figure}[#1]}%
   {\ifthenelse{\equal{#1}{H}}%
     {\setboolean{algocf@algoH}{true}\begin{algocf@Here}}%
     {\begin{algocf}[#1]}%
   }%
    \@algocf@start% 
    \@ResetCounterIfNeeded%
    \algocf@linesnumbered%
}{%
    \@algocf@finish%
    \ifthenelse{\equal{\algocf@float}{figure}}%
     {\end{figure}}%
   {\ifthenelse{\boolean{algocf@algoH}}%
     {\end{algocf@Here}}%
     {\end{algocf}}%
   }%
   \@algocf@term
}
%%%
%%% algorithm*
%%%
\newenvironment{\algocf@envname*}[1][htbp]{%
  \@algocf@init%
  \ifthenelse{\equal{\algocf@float}{figure}}%
    {\begin{figure*}[#1]}%
    {\begin{algocf*}[#1]}%
     \@algocf@start%
     \@ResetCounterIfNeeded%
     \algocf@linesnumbered%
}{
     \@algocf@finish%
  \ifthenelse{\equal{\algocf@float}{figure}}%
  {\end{figure*}}%
  {\end{algocf*}}%
  \@algocf@term%
}
%
%%%%%%%%%%%%%%%%%%%%%%%
%%%
%
\expandafter\newcommand\csname\algocf@listofalgorithms\endcsname{%
  \ifthenelse{\equal{\algocf@float}{figure}}{\listoffigures}{\listofalgocfs}
}
%%%
%%%
%
% ----------------------  procedure and function environments
%
%
% -- new style (used in particular in the caption of function and procedure environments)
%
\newcommand{\ProcNameSty}[1]{\FuncSty{#1}}%
\newcommand{\SetProcNameSty}[1]{\renewcommand{\ProcNameSty}[1]{\textnormal{\csname#1\endcsname{##1}}}}
\newcommand{\ProcArgSty}[1]{\ArgSty{#1}}%
\newcommand{\SetProcArgSty}[1]{\renewcommand{\ProcArgSty}[1]{\textnormal{\csname#1\endcsname{##1}}}}
% three macros to extract parts of the caption
\gdef\algocf@captname#1(#2)#3@{#1}  % keep characters before the first brace
\gdef\algocf@captparam#1(#2)#3@{#2} % keep character in between the braces
\gdef\algocf@captother#1(#2)#3@{#3} % keep character after the braces
%
%%% Text of caption for Procedure or Function
\newcommand{\algocf@captionproctext}[2]{%
  {\AlCapFnt{}\AlTitleFnt{\algocf@procname}%
  \ProcNameSty{\algocf@captname #2@}% Name of the procedure in ProcName Style. 
  \ifthenelse{\equal{\algocf@captparam #2@}{\arg@e}}{}% if no argument, write nothing
  {%                                                else put arguments in ProcArgSty:
    \ProcNameSty{(}\ProcArgSty{\algocf@captparam #2@}\ProcNameSty{)}%
  }% endif
  \algocf@captother #2@%
  }
}
%%%% set caption for the environment
% unfortunately, makecaption is called with \ignorespace #3 so 
% we can't do the @currentlabel definition inside \algocf@captionproctext
\long\def\algocf@caption@proc#1[#2]#3{% 
  \gdef\@currentlabel{\algocf@captname #3@}%
  \algocf@old@caption{#1}[\algocf@procname\nobreakspace #2]{\ #3}%
}%
\newcommand{\algocf@setcaptionproc}{%
  \let\algocf@oldcaptiontext=\algocf@captiontext%
  \renewcommand{\algocf@captiontext}[2]{%
    \algocf@captionproctext{##1}{##2}}%
  \let\algocf@old@caption=\@caption%
  \let\@caption=\algocf@caption@proc%
}
%%%%% reset caption
\newcommand{\algocf@resetcaptionproc}{%
  \let\algocf@captiontext=\algocf@oldcaptiontext%
  \let\@caption=\algocf@old@caption%
}
%
%
%%%%% algocf@proc is the generic environment for procedure and function environment.
%
\newboolean{algocf@procstar}\setboolean{algocf@procstar}{false}
\newenvironment{algocf@proc}[1][htbp]{%
    \@algocf@proctitleofalgo% set Titleofalgo to Procedure: or Function:
                            % accordingly to the environment
    \let\old@thealgocf=\thealgocf%\renewcommand{\thealgocf}{--}%
    \algocf@setcaptionproc%   set the text of caption to proc
    \algocf@setcaption%       set caption to our caption style
    \ifthenelse{\equal{\algocf@float}{figure}}{%
      \ifthenelse{\boolean{algocf@procstar}}{\begin{figure*}[#1]}{\begin{figure}[#1]}%
    }{%
      \ifthenelse{\boolean{algocf@procstar}}%
         {\begin{algocf*}[#1]}%
         {\ifthenelse{\equal{#1}{H}}%
            {\setboolean{algocf@algoH}{true}\begin{algocf@Here}}%
            {\begin{algocf}[#1]}%
         }%
    }%
       \@algocf@start%
       \@ResetCounterIfNeeded%
       \algocf@linesnumbered%
}{%
       \@algocf@finish%
    \ifthenelse{\equal{\algocf@float}{figure}}{%
      \ifthenelse{\boolean{algocf@procstar}}{\end{figure*}}{\end{figure}}%
    }{%
      \ifthenelse{\boolean{algocf@procstar}}
         {\end{algocf*}}
         {\ifthenelse{\boolean{algocf@algoH}}
            {\end{algocf@Here}}%
            {\end{algocf}}%
         }%
    }%
    \let\thealgocf=\old@thealgocf%
    \@algocf@term% restore original caption and H boolean
    \algocf@resetcaptionproc%
}

%
% -- procedure and function environments are defined from algocf@proc environment
%
\newenvironment{procedure}[1][htbp]%
{\setboolean{algocf@procstar}{false}%
 \newcommand{\algocf@procname}{\@algocf@procname}\begin{algocf@proc}[#1]}%
{\end{algocf@proc}}
\newenvironment{function}[1][htbp]%
{\setboolean{algocf@procstar}{false}%
 \newcommand{\algocf@procname}{\@algocf@funcname}\begin{algocf@proc}[#1]}%
{\end{algocf@proc}}
%
\newenvironment{procedure*}[1][htbp]%
{\setboolean{algocf@procstar}{true}%
 \newcommand{\algocf@procname}{\@algocf@procname}\begin{algocf@proc}[#1]}%
{\end{algocf@proc}}
\newenvironment{function*}[1][htbp]%
{\setboolean{algocf@procstar}{true}%
 \newcommand{\algocf@procname}{\@algocf@funcname}\begin{algocf@proc}[#1]}%
{\end{algocf@proc}}
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% 
\newcommand{\Titleofalgo}[1]{\@titleprefix\TitleSty{#1}\par\smallskip}
%
%
% -------------------------   Default Definitions
%
%%
%%
%
\newcommand{\algocf@defaults@common}{
%\SetKwInOut{AlgDonnees}{Donn\'ees}\SetKwInOut{AlgRes}{R\'esultat}
\SetKwInput{Donnees}{Donn\'ees}%
\SetKwInput{Res}{R\'esultat}%
\SetKwInput{Entree}{Entr\'ees}%
\SetKwInput{Sortie}{Sorties}%
\SetKw{KwA}{\`a}%
\SetKw{Retour}{retourner}%
\SetKwBlock{Deb}{d\'ebut}{fin}%
\SetKwRepeat{Repeter}{r\'ep\'eter}{jusqu'\`a}%
%
\SetKwComment{tcc}{/* }{ */}
\SetKwComment{tcp}{// }{}
%
%\SetKwInOut{AlgData}{Data}\SetKwInOut{AlgResult}{Result}
\SetKwInput{KwIn}{Input}%
\SetKwInput{KwOut}{Output}%
\SetKwInput{KwData}{Data}%
\SetKwInput{KwResult}{Result}%
\SetKw{KwTo}{to}
\SetKw{KwRet}{return}%
\SetKw{Return}{return}%
\SetKwBlock{Begin}{begin}{end}%
\SetKwRepeat{Repeat}{repeat}{until}%
%
% --- German keywords
%
% \SetKwInOut{AlgDaten}{Daten}%AlgData
% \SetKwInOut{AlgErgebnis}{Ergebnis}%AlgResult
\SetKwInput{Ein}{Eingabe}%KwIn
\SetKwInput{Aus}{Ausgabe}%KwOut
\SetKwInput{Daten}{Daten}%KwData
\SetKwInput{Ergebnis}{Ergebnis}%KwResult
\SetKw{Bis}{bis}%KwTo
\SetKw{KwZurueck}{zur\"uck}%KwRet
\SetKw{Zurueck}{zur\"uck}%Return
\SetKwBlock{Beginn}{Beginn}{Ende}%Begin
\SetKwRepeat{Wiederh}{wiederhole}{bis}%Repeat
%
% --- Czech keywords
%
% \SetKwInOut{AlgVst}{Vstup}\SetKwInOut{AlgVyst}{V\'{y}stup}
\SetKwInput{Vst}{Vstup}%
\SetKwInput{Vyst}{V\'{y}stup}%
\SetKwInput{Vysl}{V\'{y}sledek}%
%
% --- Portuguese keywords
%
% \SetKwInOut{AlgDados}{Dados}\SetKwInOut{AlgResultado}{Result.}
\SetKwInput{Entrada}{Entrada}%
\SetKwInput{Saida}{Sa\'{i}da}%
\SetKwInput{Dados}{Dados}%
\SetKwInput{Resultado}{Resultado}%
\SetKw{Ate}{at\'{e}}
\SetKw{KwRetorna}{retorna}%
\SetKw{Retorna}{retorna}%
\SetKwBlock{Inicio}{in\'{i}cio}{fim}%
\SetKwRepeat{Repita}{repita}{at\'{e}}%
% --- End 
}
%
%
\newcommand{\algocf@defaults@longend}{%
\algocf@defaults@common
\SetKwIf{Si}{Sinon}{si}{alors}{sinon}{finsi}%
\SetKwIfElseIf{gSi}{gSinonSi}{gSinon}{si}{alors}{sinon si}{sinon}{finsi}%
\SetKwIF{Si}{SinonSi}{Sinon}{si}{alors}{sinon si}{sinon}{finsi}%
\SetKwSwitch{Suivant}{Cas}{Autre}{suivant}{faire}{cas o\`u}{autres cas}{fin d'alternative}%
\SetKwFor{Pour}{pour}{faire}{finpour}%
\SetKwFor{PourPar}{pour}{faire en parallèle}{finpour}%
\SetKwFor{PourCh}{pour chaque}{faire}{finprch}%
\SetKwFor{PourTous}{pour tous les}{faire}{finprts}%
\SetKwFor{Tq}{tant que}{faire}{fintq}%
%
\SetKwIf{If}{Else}{if}{then}{else}{endif}%
\SetKwIfElseIf{gIf}{gElsIf}{gElse}{if}{then}{else if}{else}{endif}%
\SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{endif}%
\SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{endsw}%
\SetKwFor{For}{for}{do}{endfor}%
\SetKwFor{ForPar}{for}{do in parallel}{endfpar}
\SetKwFor{ForEach}{foreach}{do}{endfch}%
\SetKwFor{ForAll}{forall the}{do}{endfall}%
\SetKwFor{While}{while}{do}{endw}%
%
% --- German for longend
%
\SetKwIf{Wenn}{Sonst}{wenn}{dann}{sonst}{Ende-wenn}%If
\SetKwIfElseIf{gWenn}{gSonstWenn}{gSonst}{wenn}{dann}{sonst wenn}{sonst}{Ende-wenn}%gIf
\SetKwIF{Wenn}{SonstWenn}{Sonst}{wenn}{dann}{sonst wenn}{sonst}{Ende-wenn}%gIf
\SetKwSwitch{Unterscheide}{Fall}{Anderes}{unterscheide}{tue}{Fall}{sonst}{Ende-Unt.}%Switch
\SetKwFor{Fuer}{f\"ur}{tue}{Ende-f\"ur}%For
\SetKwFor{FuerPar}{f\"ur}{tue gleichzeitig}{Ende-gleichzeitig}%ForPar
\SetKwFor{FuerJedes}{f\"ur jedes}{tue}{Ende-f\"ur}%ForEach
\SetKwFor{FuerAlle}{f\"ur alle}{tue}{Ende-f\"ur}%ForAll
\SetKwFor{Solange}{solange}{tue}{Ende-solange}%While
%
% --- Portuguese
%
\SetKwIf{Se}{Senao}{se}{ent\~{a}o}{sen\~{a}o}{fim se}%
\SetKwIfElseIf{gSe}{gSenaoSe}{gSenao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim se}%
\SetKwIF{Se}{SenaoSe}{Senao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim se}%
\SetKwSwitch{Selec}{Caso}{Outro}{selecione}{fa\c{c}a}{caso}{sen\~{a}o}{fim selec}%
\SetKwFor{Para}{para}{fa\c{c}a}{fim para}%
\SetKwFor{ParaPar}{para}{fa\c{c}a em paralelo}{fim para}
\SetKwFor{ParaCada}{para cada}{fa\c{c}a}{fim para cada}%
\SetKwFor{ParaTodo}{para todo}{fa\c{c}a}{fim para todo}%
\SetKwFor{Enqto}{enquanto}{fa\c{c}a}{fim enqto}%
}
%
%
\newcommand{\algocf@defaults@shortend}{%
\algocf@defaults@common
\SetKwIf{Si}{Sinon}{si}{alors}{sinon}{fin}%
\SetKwIfElseIf{gSi}{gSinonSi}{gSinon}{si}{alors}{sinon si}{sinon}{fin}%
\SetKwIF{Si}{SinonSi}{Sinon}{si}{alors}{sinon si}{sinon}{fin}%
\SetKwSwitch{Suivant}{Cas}{Autre}{suivant}{faire}{cas o\`u}{autres cas}{fin}%
\SetKwFor{Pour}{pour}{faire}{fin}%
\SetKwFor{PourPar}{pour}{faire en parallèle}{fin}%
\SetKwFor{PourCh}{pour chaque}{faire}{fin}%
\SetKwFor{PourTous}{pour tous les}{faire}{fin}%
\SetKwFor{Tq}{tant que}{faire}{fin}%
%
%
\SetKwIf{If}{Else}{if}{then}{else}{end}%
\SetKwIfElseIf{gIf}{gElsIf}{gElse}{if}{then}{else if}{else}{end}%
\SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{end}%
\SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{end}%
\SetKwFor{For}{for}{do}{end}%
\SetKwFor{ForPar}{for}{do in parallel}{end}
\SetKwFor{ForEach}{foreach}{do}{end}%
\SetKwFor{ForAll}{forall}{do}{end}%
\SetKwFor{While}{while}{do}{end}%
%
% --- German for shortend
%
\SetKwIf{Wenn}{Sonst}{wenn}{dann}{sonst}{Ende}%If
\SetKwIfElseIf{gWenn}{gSonstWenn}{gSonst}{wenn}{dann}{sonst wenn}{sonst}{Ende}%gIf
\SetKwIF{Wenn}{SonstWenn}{Sonst}{wenn}{dann}{sonst wenn}{sonst}{Ende}%gIf
\SetKwSwitch{Unterscheide}{Fall}{Anderes}{unterscheide}{tue}{Fall}{sonst}{}%Switch
\SetKwFor{Fuer}{f\"ur}{tue}{Ende}%For
\SetKwFor{FuerPar}{f\"ur}{tue gleichzeitig}{Ende}%ForPar
\SetKwFor{FuerJedes}{f\"ur jedes}{tue}{Ende}%ForEach
\SetKwFor{FuerAlle}{f\"ur alle}{tue}{Ende}%ForAll
\SetKwFor{Solange}{solange}{tue}{Ende}%While
%
% --- Portuguese
%
\SetKwIf{Se}{Senao}{se}{ent\~{a}o}{sen\~{a}o}{fim}%
\SetKwIfElseIf{gSe}{gSenaoSe}{gSenao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim}%
\SetKwIF{Se}{SenaoSe}{Senao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim}%
\SetKwSwitch{Selec}{Caso}{Outro}{selecione}{fa\c{c}a}{caso}{sen\~{a}o}{fim}%
\SetKwFor{Para}{para}{fa\c{c}a}{fim}%
\SetKwFor{ParaPar}{para}{fa\c{c}a em paralelo}{fim}
\SetKwFor{ParaCada}{para cada}{fa\c{c}a}{fim}%
\SetKwFor{ParaTodo}{para todo}{fa\c{c}a}{fim}%
\SetKwFor{Enqto}{enquanto}{fa\c{c}a}{fim}%
}
%
%
\newcommand{\algocf@defaults@noend}{%
\renewcommand{\a@block}[2]{\a@group{##1}}
\algocf@defaults@common
\SetKwIf{Si}{Sinon}{si}{alors}{sinon}{}%
\SetKwIfElseIf{gSi}{gSinonSi}{gSinon}{si}{alors}{sinon si}{sinon}{}%
\SetKwIF{Si}{SinonSi}{Sinon}{si}{alors}{sinon si}{sinon}{}%
\SetKwSwitch{Suivant}{Cas}{Autre}{suivant}{faire}{cas où}{autres cas}{}%
\SetKwFor{Pour}{pour}{faire}{}%
\SetKwFor{PourPar}{pour}{faire en parallèle}{}%
\SetKwFor{PourCh}{pour chaque}{faire}{}%
\SetKwFor{PourTous}{pour tous les}{faire}{}%
\SetKwFor{Tq}{tant que}{faire}{}%
%
\SetKwIf{If}{Else}{if}{then}{else}{}%
\SetKwIfElseIf{gIf}{gElsIf}{gElse}{if}{then}{else if}{else}{}%
\SetKwIF{If}{ElsIf}{Else}{if}{then}{else if}{else}{}%
\SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{}%
\SetKwFor{For}{for}{do}{}%
\SetKwFor{ForPar}{for}{do in parallel}{}
\SetKwFor{ForEach}{foreach}{do}{}%
\SetKwFor{ForAll}{forall}{do}{}%
\SetKwFor{While}{while}{do}{}%
% --- German for noend
\SetKwIf{Wenn}{Sonst}{wenn}{dann}{sonst}{}%If
\SetKwIfElseIf{gWenn}{gSonstWenn}{gSonst}{wenn}{dann}{sonst wenn}{sonst}{}%gIf
\SetKwIF{Wenn}{SonstWenn}{Sonst}{wenn}{dann}{sonst wenn}{sonst}{}%gIf
\SetKwSwitch{Unterscheide}{Fall}{Anderes}{unterscheide}{tue}{Fall}{sonst}{}%Switch
\SetKwFor{Fuer}{f\"ur}{tue}{}%For
\SetKwFor{FuerPar}{f\"ur}{tue gleichzeitig}{}%ForPar
\SetKwFor{FuerJedes}{f\"ur jedes}{tue}{}%ForEach
\SetKwFor{FuerAlle}{f\"ur alle}{tue}{}%ForAll
\SetKwFor{Solange}{solange}{tue}{}%While
% --- Portuguese
\SetKwIf{Se}{Senao}{se}{ent\~{a}o}{sen\~{a}o}{}%
\SetKwIfElseIf{gSe}{gSenaoSe}{gSenao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{}%
\SetKwIF{Se}{SenaoSe}{Senao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{}%
\SetKwSwitch{Selec}{Caso}{Outro}{selecione}{fa\c{c}a}{caso}{sen\~{a}o}{}%
\SetKwFor{Para}{para}{fa\c{c}a}{}%
\SetKwFor{ParaPar}{para}{fa\c{c}a em paralelo}{}
\SetKwFor{ParaCada}{para cada}{fa\c{c}a}{}%
\SetKwFor{ParaTodo}{para todo}{fa\c{c}a}{}%
\SetKwFor{Enqto}{enquanto}{fa\c{c}a}{}%
}
%
%%
%%
%%
%
% default macros are:
\defaultsmacros@algo
\SetNoline
%
%
%
%%
%%%
%%%% END
