]> AND Private Git Repository - UIC2013.git/blob - algorithm2e.sty
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
new version
[UIC2013.git] / algorithm2e.sty
1 %  algorithm2e.sty --- style file for algorithms
2 %                      almost everything can be customized by users. See the document for more explanations
3 %% Copyright 1996-2013 Christophe Fiorio
4 %
5 % This program may be distributed and/or modified under the
6 % conditions of the LaTeX Project Public License, either version 1.2
7 % of this license or (at your option) any later version.
8 % The latest version of this license is in
9 %   http://www.latex-project.org/lppl.txt
10 % and version 1.2 or later is part of all distributions of LaTeX 
11 % version 1999/12/01 or later.
12 %
13 % This program consists of the files algorithm2e.sty and algorithm2e.tex and algorithm2e-compatibility.sty
14 %  
15 %  Report bugs and comments to:
16 %  - algorithm2e-announce@lirmm.fr  mailing list for announcement about releases^^J%
17 %  - algorithm2e-discussion@lirmm.fr mailing list for discussion about package^^J%
18 %  subscribe by emailing sympa@lirmm.fr with 'subscribe <list> <firstname name>'^^J%
19 %
20 %  $Id: algorithm2e.sty,v 5.0 2013/01/06 14:40:35 cfiorio Exp $
21 %
22 %  PACKAGES REQUIRED:
23 %
24 %  - float   (in contrib/supported/float)
25 %  - ifthen  (in base)
26 %  - xspace  (in packages/tools)
27 %  - relsize (in contrib/misc/relsize.sty)
28 %
29 %%%%%%%%%%%%%%%  Release 5.0
30 %
31 %   Package options: 
32 %   ---------------
33 %   - oldcommands                      : to use old command names
34 %   - french, english, german, ngerman
35 %      portuguese, czech, italiano,
36 %      slovak, croatian, spanish       : for the name of the algorithm and some keyword code
37 %   - onelanguage                      : to simply switch keyword from one language to another without changing
38 %                                        keyword commands
39 %   - boxed, boxruled, ruled, tworuled, 
40 %     algoruled, plain                 : layout of the algorithm
41 %   - algo2e                           : environment is algorithm2e instead of algorithms and \listofalgorithmes
42 %                                        instead of \listofalgorithms
43 %   - slide                            : to use when making slides
44 %   - noline,lined,vlined              : how block are designed.
45 %   - shortend, longend, noend         : short or long end keyword as endif for e.g.
46 %   - linesnumbered                    : auto numbering of the algorithm's lines
47 %   - linesnumberedhidden              : to hide autonumbered lines (show number on a line with \ShowLn
48 %   - commentsnumbered, inoutnumbered  : to autonumber comments and inout keywords (by defaut not numbered)
49 %   - rightnl                          : to have line number on the right instead of on the left as default
50 %   - algonl                           : line numbers preceded by algo number
51 %   - scright, scleft                  : right or left justified side comments
52 %   - fillcomment, nofillcomment       : end mark of comment is flushed to the right so comments fill the line
53 %   - dotocloa                         : add an entry in the toc for list of algorithms (require tocbibind package)
54 %   - endfloat                         : add algoendfloat environment pushing algorithm so written to the end of document
55 %   - resetcount, noresetcount         : start value of line numbers.
56 %   - algopart,algochapter,algosection : algo numbering within part, chapter or section
57 %   - titlenumbered,titlenotnumbered   : numbering of title set by \Titleofalgo
58 %   - figure                           : algorithms are figures, numbered as figures, and put in the list of figures.
59 %   - procnumbered                     : procedure or function are numbered as algorithm
60 %   - nokwfunc                         : procedure or function name doens't become a command
61 %   - norelsize                        : don't use relsize package (useful if it breaks the compatibily)
62 %   - displayblockmarkers              : display begin, end keywords at start of each block
63 %  
64 %   defaults are; english,plain,resetcount,titlenotnumbered
65 %
66 %%%%%%%%%%%%%%
67 %
68 %   Short summary  
69 %   -------------
70 %  
71 %   algorithm is an environment for writing algorithm in LaTeX2e.
72 %   Almost all is customizable. You can add keywords, change style, change the layout, ...
73 %   It provide macros that allow you to create differents sorts of key words, therefore a set of predefined key
74 %   word is gived.
75 %
76 %   IT should be used as follows
77 %
78 %   \begin{algorithm}
79 %       ...
80 %       ...
81 %   \end{algorithm}
82 %
83 %
84 %   IMPORTANT : each line MUST end with \;
85 %
86 %   Note that if you define macros outside algorithm environment they
87 %   are avaible in all the document and particulary you can use then
88 %   inside all algorithms without re-define them.
89 %  
90 %   an example:
91 %
92 %   \begin{algorithm}
93 %     \SetAlgoLined
94 %     \KwIn{this text}
95 %     \KwOut{how to write algorithm with \LaTeX2e }
96 %     
97 %     initialization\;
98 %     \While{not at end of this document}{
99 %       read current section\;
100 %       \eIf{understand}{
101 %         go to next section\;
102 %         current section becomes this one\;
103 %         }{
104 %         go back to the beginning of current section\;
105 %         }
106 %       }
107 %     \caption{How to write algorithm}
108 %   \end{algorithm}
109 %
110 %
111 %%%%%%%%%%%%%%         predefined keywords
112 %
113 %     \KwIn{input}
114 %     \KwOut{output}
115 %     \KwData{input}
116 %     \KwResult{output}
117 %     \KwTo                                       % a simple keyword
118 %     \KwFrom                                     % a simple keyword
119 %     \KwRet{[value]}
120 %     \Return{[value]}
121 %     \Begin{block inside}
122 %     \eIf{condition}{Then Block}{Else block}     % in blocks
123 %     \If{condition}{Then block}                  % in a block
124 %     \uIf{condition}{Then block}                 % in a block unended
125 %     \lIf{condition}{Else text}                  % on the same line
126 %     \Else{inside Else}                          % in a block
127 %     \lElse{Else text}                           % on the same line        
128 %     \uElse{Else text}                           % in a block unended
129 %     \ElseIf{inside Elseif}                      % in a block
130 %     \lElseIf{Elseif text}                       % on the same line        
131 %     \uElseIf{Elseif text}                       % in a block unended
132 %     \Switch{Condition}{Switch block}
133 %     \Case{a case}{case block}                   % in a block
134 %     \lCase{a case}{case text}                   % on the same line
135 %     \Other{otherwise block}                     % in a block
136 %     \lOther{otherwise block}                    % on the same line
137 %     \For{condition}{text loop}                  % in a block
138 %     \lFor{condition}{text}                      % on the same line
139 %     \ForEach{condition}{text loop}              % in a block
140 %     \lForEach{condition}{text}                  % on the same line
141 %     \ForPar{condition}{text loop}               % in a block
142 %     \lForPar{condition}{text}                   % on the same line
143 %     \While{condition}{text loop}                % in a block
144 %     \lWhile{condition}{text loop}               % on the same line
145 %     \Repeat{End condition}{text loop}           % in a block
146 %     \lRepeat{condition}{text}                   % on the same line
147 %
148 %%%%%%%%%%%%%%
149 %
150 %   History: 
151 %
152 %   - January 06 2013 - revision 5.0
153 %                     * CHANGE: SetKwSwith takes now 9 args: 9th arg is the same as
154 %                                previous 8th arg ('end of switch' keyword). New 8th arg is
155 %                                'end of case' keyword. This is due to change of release
156 %                                3.2 which introduce end after case block... as I never
157 %                                test with longend option, I never see that the 'end
158 %                                switch' used for case was not good.
159 %                     * CHANGE: when no end keyword is defined in a block macro, then
160 %                                algorithm2e does no more try to print it. So even with lined or noline
161 %                                option, no empty line is printed (before: a blank end was
162 %                                printed, so a blank line appeared)
163 %                     * Internal Change: add some internal function to improve readibility
164 %                                        (thanks to Philip K. F. H\ölzenspies)
165 %                     * ADD: Block markers. 
166 %                            You can now ask package to put begin and end keywords automatically at begin
167 %                            and end of blocks, it means each group of commands shifted and enclosed in
168 %                            braces.
169 %                            This is tricky to use but, combined with \SetStartEndCondition and
170 %                            redefinition of keywords, you should be abble to simulate any syntax. See
171 %                            examples in documentation where a generic example is derived in pseudo-code,
172 %                            python and C by keeping code and changing only style using block markers
173 %                            macros, \SetStartEndCondition and some redefinition of keywords.
174 %                            These new block markers macros are:
175 %                            - \AlgoDisplayBlockMarkers and \AlgoDontDisplayBlockMarkers
176 %                            - \SetAlgoBlockMarkers{begin marker}{end marker}
177 %                            - \BlockMarkersSty{text} and \SetBlockMarkersSty
178 %                            Note that a new option has also been added: displayblockmarkers
179 %                     * ADD: \leIf macro automatically defined by \SetKwIF: allow to define
180 %                            an if-then-else on a single line.
181 %                     * ADD: new macro \SetStartEndCondition{typo1}{typo2}{typo3} which
182 %                            sets typo around condition in For, If, Switch, Case and
183 %                            Repeat macros. First two are used around For, If, Swith
184 %                            conditions, First and third are used for Case and Repeat
185 %                            condition where condition ends the line. Default definition
186 %                            is \SetStartEndCondition{ }{ }{}. 
187 %                            A common alternative is \SetStartEndCondition{ (}{) }{)}
188 %                            Can also be used to remove space around condition, for
189 %                            example if you want python style commands:
190 %                            \SetStartEndCondition{ }{}{} and \SetKwFor{For}{for}{:}{}
191 %                     * ADD: new environment algomathdisplay which allow display math (like inside \[ \] or $$ $$) 
192 %                            handling end line and line number
193 %                     * ADD: new command \SetKwProg{Env}{Title}{is}{end} which defines a macro
194 %                            \Env{args}{text}. Env is a block with 'Title' (in \CapSty) at the beginning
195 %                            followed by args followed by 'is' then 'text' is put below inside a block ended
196 %                            by 'end'. If no 'end' is specified, nothing is written (no
197 %                            blank line is inserted). Useful to typeset function or prog for example:
198 %                            \SetKwProg{Fn}{Function}{is}{end} makes \Fn{afunc(i: int) : int}{return 0\;}                    
199 %                            writes: 
200 %                            Function afunc(i: int) : int is
201 %                            | return 0;
202 %                            end
203 %                            or \SetKwProg{Def}{def}{:}{} makes \Def{afunc(i: int)}{return 0\;} writes:
204 %                            def afunc(i: int):
205 %                            | return 0
206 %                            Tip: combine it with \SetKwFunction to write recursive function algorithm. With
207 %                            example above, you could define \SetKwFunction{\Afunc}{afunc} and then write:
208 %                            \Def{\Afunc{i:int}{\eIf{i>0}{\KwRet \Afunc{i-1}}{\KwRet 0\;}} that writes:
209 %                            def afunc(i: int):
210 %                            | if(i>0):
211 %                            |     return afunc(i-1)
212 %                            | else:
213 %                            |     return 0
214 %                            with appropriate typo.
215 %                     * ADD: option croatian: croation keywords (thanks to Ivan Gavran)
216 %                     * ADD: option ngerman: same as german option but so can be used with global option ngerman
217 %                            of babel
218 %                     * ADD: option spanish: Spanish support (thanks to Mario Abarca)
219 %                     * ADD: unterminated block: useful to add part separator that doesn't necessary need an end
220 %                            keyword.  
221 %                            Designed on the pattern of unterminated if (see \uIf macro) allowing to
222 %                            add a block that is not terminated by a keyword. Such block are defined in the same
223 %                            time as a block is defined by adding a macro beginning with u. So, for example,
224 %                            predefined \SetKwBlock{Begin}{begin}{end} defines now two commands:
225 %                            - \Begin{} as previously which print a begin - end block
226 %                            - \uBegin{} that defines a begin only block
227 %                     * FIX: problem when numbering line inside until condition of
228 %                            \SetKwRepeat macro: line number was not correctly aligned.
229 %                     * FIX: dotocloa option which was broken
230 %                     * FIX: uIf and uCase didn't have same behavior when used with
231 %                            noline, vlined or lined option. This is fixed. Side effect: no empty
232 %                            line after an uIf or uCase when used with options lined or vlined
233 %                     * FIX: a bug with Repeat Until command when use with side comment on Until
234 %                     * FIX: a bug with side text -- text put into () -- of command macro (SetKwIf and so on)
235 %                            which was always setting a ';' even after a \DontPrintSemicolon
236 %                     * FIX: a bug with hyperref and chapter definition (thanks to Hubert Meier)
237 %                     * FIX: bugs with l macro and side comment
238 %                     * FIX: revision number
239 %                     * FIX: fix non ascii character (utf8 not yet recognized by all latex engine)
240 %                     * FIX: fnum@algocf had an useless parameter which sometimes broke expansion and output an error
241 %                     * FIX: works now with multicol package
242 %
243 %   - december 14 2009 - revision 4.1
244 %                     * ADD: new command \SetKwHangingKw{Name}{text} (hanging indent with keyword): This creates a
245 %                            hanging indent much like \texttt{SetKwInput}, except that it removes the trailing `:'
246 %                            and does not reset numbering (thanks to Nathan Tallent)
247 %
248 %   - november 17 2009  - revision 4.00 -
249 %
250 %                      * CHANGE: IMPORTANT: some commands have been renamed to have consistent naming (CamlCase
251 %                                syntax) and old commands are no more available. If you doesn't want to change
252 %                                your mind or use old latex files, you can use oldcommands option to enable old
253 %                                commands back.
254 %                                text. Here are these commands:
255 %                                - \SetNoLine becomes \SetAlgoNoLine
256 %                                - \SetVline  becomes \SetAlgoVlined
257 %                                - \Setvlineskip  becomes \SetVlineSkip
258 %                                - \SetLine   becomes \SetAlgoLined
259 %                                - \dontprintsemicolon becomes \DontPrintSemicolon
260 %                                - \printsemicolon becomes \PrintSemicolon
261 %                                - \incmargin becomes \IncMargin
262 %                                - \decmargin becomes \DecMargin
263 %                                - \setnlskip becomes \SetNlSkip
264 %                                - \Setnlskip becomes \SetNlSkip
265 %                                - \setalcapskip becomes \SetAlCapSkip
266 %                                - \setalcaphskip becomes \SetAlCapHSkip
267 %                                - \nlSty becomes \NlSty
268 %                                - \Setnlsty becomes \SetNlSty
269 %                                - \linesnumbered becomes \LinesNumbered
270 %                                - \linesnotnumbered becomes \LinesNotNumbered
271 %                                - \linesnumberedhidden becomes \LinesNumberedHidden
272 %                                - \showln becomes \ShowLn
273 %                                - \showlnlabel becomes \ShowLnLabel
274 %                                - \nocaptionofalgo becomes \NoCaptionOfAlgo
275 %                                - \restorecaptionofalgo becomes \RestoreCaptionOfAlgo
276 %                                - \restylealgo becomes \RestyleAlgo
277 %                                - gIf macros and so on do no more exist
278 %                      * NEW: - Compatibily with other packages improven by changing name of internal
279 %                               macros. Algorithm2e can now be used with arabtex for example, if this last is
280 %                               loaded after algorithm2e package.
281 %                      * ADD: - OPTION endfloat: endfloat packages doesn't allow float environment inside other
282 %                               environment. So using it with figure option of algorithm2e makes error. This
283 %                               option enables a new environment algoendfloat to be used instead of algorithm
284 %                               environment that put algorithm at the end. algoendfloat environment make
285 %                               algorithm acting as endfloat figures. This option requires endfloat packages.
286 %                      * ADD: - OPTION norelsize: starting from this release (v4.00), algorithm2e package uses
287 %                               relsize package in order to get relative size for lines numbers; but it seems
288 %                               that some rare classes (such as inform1.cls) are not compatible with relsize; to
289 %                               have algorithm2e working, this option makes algorithm2e not to load relsize
290 %                               package and go back to previous definition by using \scriptsize font for lines
291 %                               numbers.
292 %                      * ADD: - OPTION onelanguage: allow, if using standard keywords listed below, to switch
293 %                               from one language to another without changing keywords by using appropriate
294 %                               language option:
295 %                               . KwIn, KwOut, KwData, KwResult
296 %                               . KwTo KwFrom
297 %                               . KwRet, Return
298 %                               . Begin
299 %                               . Repeat
300 %                               . If, ElseIf, Else
301 %                               . Switch, Case, Other
302 %                               . For, ForPar, ForEach, ForAll, While
303 %                               .
304 %                      * ADD: - OPTION rightnl: put lines numbers to the right of the algorithm instead of left.
305 %                      * ADD:   new commands \setRightLinesNumbers and \setLeftLinesNumbers which sets the lines
306 %                               numbers to the right or to the left of the algorithm.
307 %                      * ADD: - new kind of keywords: KwArray used to define arrays:
308 %                               \SetKwArray{Kw}{array} defines an array keywords Kw called array and printed in
309 %                               DataSty style when call with \Kw. It can be used with one argument which
310 %                               denotes the element index: \Kw{n} prints array[n] with array in DataSty and n in
311 %                               ArgSty.
312 %                      * ADD/FIX: rules of ruled, algoruled, tworuled styles used rules of different sizes! This
313 %                                 is now fixed. Moreover size of the rules is now controlled by a length and so
314 %                                 can be customized by the user.
315 %                                 \algoheightrule is the height of the rules and can be changed via \setlength
316 %                                 \algoheightruledefault is the default height of he rules (0.8pt)
317 %                                 \algotitleheightrule is the height of the rule that comes just after the
318 %                                 caption in ruled and algoruled style; it can be changed via \setlength
319 %                                 \algotitleheightruledefault is the default height of this rules (0.8pt)
320 %                                 Thanks to Philippe Dumas who reports the bug and make the suggestion.
321 %                      * ADD: - \SetAlgoCaptionSeparator which sets the separator between Algorithm 1 and the
322 %                               title. By default it's ':' and caption looks like "Algorithm 2: title" but now
323 %                               you can change it by using for example \SetAlgoCaptionSeparator{.} which will
324 %                               give "Algorithm 3. title"
325 %                      * ADD: - \SetAlgoLongEnd and \SetAlgoShortEnd and \SetAlgoNoEnd commands which act as
326 %                               corresponding package options
327 %                      * ADD: - OPTIONS italiano and slovak as new language (thanks to Roberto Posenato and
328 %                               Miroslav Binas) 
329 %                      * CHANGE: - Fnt and Sty macro to have consistent use and naming (see below)
330 %                      * ADD: - \AlCapSty, \AlCapNameSty, \AlCapFnt, \AlCapNameFnt, \ProcSty, \ProcFnt,
331 %                               \ProcNameSty, \ProcNameFnt, \ProcArgSty, ProcArgFnt and corresponding "set macro" 
332 %                               \SetAlCapSty, \SetAlCapNameSty, \SetAlCapFnt, \SetAlCapNameFnt, \SetProcSty,
333 %                               \SetProcFnt, \SetProcNameSty, \SetProcNameFnt, \SetProcArgSty, \SetProcArgFnt which
334 %                               control the way caption is printed. Sty macro use command taking one parameter as
335 %                               argument, Fnt macros use directly command. In Fact caption is printed as follow:
336 %                               \AlCapSty{\AlCapFnt Algorithm 1:}\AlCapNameSty{\AlCapNameFnt my algorithm}
337 %                               By default, \AlCapSty is textbf and \AlCapFnt is nothing. \AlCapNameSty keep text 
338 %                               as it is, and \AlCapNameFnt do nothing also.
339 %                               You can redefine \AlCapFnt and \AlCapNameFnt by giving macro to \Set commands. For
340 %                               example, you can do \SetAlCapFnt{\large} to see Algorithm printed in \large font.
341 %                               You can redefine \AlCapSty, \AlCapFnt, \AlCapNameSty and \AlCapNameFnt with the
342 %                               corresponding \Set command. For the Sty commands, you have to give in parameter
343 %                               name of a macro (whithout \)  which takes one argument. For example,
344 %                               \SetAlCapFnt{textbf} defines the default behaviour. If you want to do more
345 %                               complicated thing, you should define your own macro and give it to \SetAlCapFnt or
346 %                               \SetAlCapNameFnt. Here are two examples:
347 %                               - \newcommand{\mycapsty}[1]{\tiny #1}\SetAlCapNameSty{mycapsty}
348 %                               - \newcommand{\mycapsty}[1]{\textsl{\small #1}}\SetAlCapNameSty{mycapsty}
349 %                               Or you can combine the two, for the last example you can also do:
350 %                               \SetAlCapNameSty{textsl}\SetAlCapNameFnt{\small}
351 %                               Thanks to Jan Stilhammer who gives me the idea of \AlCapNameFnt.
352 %                      * CHANGE \AlTitleFnt to match definition of all other Fnt macros and add a \AlTitleSty 
353 %                               macro (see below) . Now you set \AlTitleFnt by calling \SetAlTitleFnt with 
354 %                               directly a macro without parameter in argument:
355 %                               Example: \SetAlTitleFnt{\small} to set title in small font.
356 %                      * ADD: - \AlTitleSty and \SetAlTitleSty commands to set a style for title. These commands
357 %                               are defined from a macro taking the text in argument, as \textbf for example. 
358 %                               To set the TitleSty you have to give name of the macro (without the '\') 
359 %                               to \SetAlTitleSty. For example \SetAlTitleSty{textbf} to set \textbf style.
360 %                      * ADD: - new command \SetAlgorithmName{algorithmname}{list of algorithms name} which
361 %                               redefines name of the algorithms and the sentence list of algorithms. Second
362 %                               argument is the name that \autoref, from hyperref package, will use. Example:
363 %                               \SetAlgorithmName{Protocol}{List of protocols} if you prefer protocol than
364 %                               algorithm.
365 %                      * ADD: - new \SetAlgoRefName{QXY} which change the default ref (number of the algorithm) by
366 %                               the name given in parameter (QXY in the example). 
367 %                      * ADD: - new command \SetAlgoRefRelativeSize{-2} which sets the output size of refs, defined
368 %                               by \SetAlgoRefName, used in list of algorithms.
369 %                      * ADD: - two dimensions to control the layout of caption in ruled, algoruled and boxruled
370 %                               algorithms:
371 %                               - interspacetitleruled (2pt by defaut) which controls the vertical space between
372 %                                 rules and title in ruled and algoruled algorithms.
373 %                               - interspaceboxruled (2\lineskip by default) which controls the vertical space
374 %                                 between rules and title in boxruled algorithms.
375 %                               These two dimensions can be changed by using \setlength command.
376 %                      * ADD: - With the fix (see below) of procedure and function environments, a new feature has
377 %                               been added: the name of the procedure or function set in caption is automatically
378 %                               defined as a KwFunction and so can be used as a macro. For example, if inside a
379 %                               procedure environment you set \caption{myproc()}, you can use \myproc macro in you
380 %                               main text. Beware that the macro is only defined after the \caption!
381 %                      * ADD: - OPTION nokwfunc to unable the new feature described above in function and
382 %                               procedure environment. Useful if you use name of procedure or function that cannot
383 %                               be a command name as a math display for example.
384 %                      * ADD: - \SetAlgoNlRelativeSize{number} command which sets the relative size of line
385 %                               numbers. By default, line numbers are two size smaller than algorithm text. Use
386 %                               this macro to change this behavior. For example, \SetAlgoNlRelativeSize{0} sets it
387 %                               to the same size, \SetAlgoNlRelativeSize{-1} to one size smaller and
388 %                               \SetAlgoNlRelativeSize{1} to one size bigger
389 %                      * ADD: - \SetAlgoProcName{aname} command which sets the name of Procedure printed by
390 %                               procedure environment (the environment prints Procedure by default). Second
391 %                               argument is the name that \autoref, from hyperref package, will use.
392 %                      * ADD: - \SetAlgoFuncName{aname} command which sets the name of Function printed by
393 %                               procedure environment (the environment prints Function by default). Second
394 %                               argument is the name that \autoref, from hyperref package, will use. 
395 %                      * ADD: - \SetAlgoCaptionLayout{style} command which sets style of the caption; style must
396 %                               be the name of a macro taking one argument (the text of the caption). Examples
397 %                               below show how to use it:
398 %                               . \SetAlgoCaptionLayout{centerline} to have centered caption
399 %                               . \SetAlgoCaptionLayout{textbf} to have bold caption
400 %                               If you want to apply two styles in the same time, such as centered bold, you have
401 %                               to define you own macro and then use \SetAlgoCaptionLayout with its name.
402 %                      * ADD: - OPTION procnumbered: which makes the procedure and function to be numbered as
403 %                               algorithm
404 %                      * ADD: - OPTIONS tworuled and boxruled
405 %                               these are two new layouts: tworuled acts like ruled but doesn't put a line after
406 %                               caption ; boxruled surround algorithm by a box, puts caption above and add a line
407 %                               after caption.
408 %                      * REMOVE: - SetKwInParam has been deleted since not useful itself because of different
409 %                                macros which can do the same in a better and a more consistent way as
410 %                                SetKwFunction or SetKw.
411 %                      * FIX: - line number is now correctly vertically aligned with math display.
412 %                      * FIX: - references with hyperref. No more same identifier or missing name error. BUT now
413 %                               you must NOT use naturalnames option of hyperref packages if you do PdfLaTeX
414 %                      * FIX: - autoref with hyperref package (thanks to Jörg Sommer who notices the problem).
415 %                      * FIX: - titlenumbered was not working! fixed.
416 %                      * FIX: - Else(){} acted like uElse. Corrected.
417 %                      * FIX: - noend management: when a block was inside another and end of block was following
418 %                               each other, a blank line was added: it's now corrected.
419 %                      * FIX: - Function and Procedure environment was no more working as defined originally: the
420 %                               label was no more name of the procedure, it acts always as if procumbered option
421 %                               has been used.
422 %                      * FIX: - line numbers had a fixed size which can be bigger than algorithm text accordingly
423 %                               to \AlFnt set (see also new command \SetAlgoNlRelativeSize above)
424 %                      * FIX: - semicolon in comments when dontprintsemicolon is used.
425 %                      * FIX: - listofalgorithms adds a vertical space before first algo of a chapter as for
426 %                               listoffigures or listoftables
427 %                      * FIX: - listofalgorithms with twocolumns mode and some classes which don't allow onecolumn
428 %                               and so don't define \if@restonecol as prescribed in LaTeX (sig-alternate for
429 %                               example)
430 %                      * FIX: - algorithm2e now works with elsart cls and some more classes.
431 %                      * FIX: - blocks defined by SetKwBlock act now as other blocks (if for instance) and don't
432 %                               write end in vlined mode, instead they print a small horizontal line as required
433 %                               by the option.
434 %                      * FIX: - underfull hbox warning at each end of algorithm environment removed.
435 %
436 %                      * INTERNAL CHANGE: - short end keyword are deduce from long end keyword by keeping the
437 %                                           first one. Allows to avoid double definition.
438 %                      * INTERNAL CHANGE: - procedure, function and algorithm are now resolved by the same
439 %                               environment to avoid code duplication. 
440 %
441 %   - October  04 2005  - revision 3.9 -
442 %                      * ADD: - \setalcaphskip command which sets the horizontal skip before Algorithm: in caption
443 %                               when used in ruled algorithm.
444 %                      * ADD: - \SetAlgoInsideSkip command which allows to add an extra vertical space before and
445 %                               after the core of the algorithm (ie: \SetAlgoInsideSkip{bigskip}) 
446 %                      * CHANGE: - caption, when used with figure option, is no more controlled by algorithm2e
447 %                                  package and so follows the exact behaviour of figures. The drawback is that you
448 %                                  cannot change the typo with AlTitleFnt or CapFnt. The avantage is that if you
449 %                                  use caption package, it works.
450 %                      * FIX: - problem with numbering line and pdflatex
451 %                      * FIX: - error when algorithm2e package was used with beamer and listings together
452 %   - February 12 2005  - revision 3.8 -
453 %                      * FIX: - extra line with noend option.
454 %   - February 10 2005  - revision 3.7 -
455 %                      * ADD: - sidecomment: different macros allowing to put text right after code on the same
456 %                               line. They are defined in the same time comment macros are defined with a star
457 %                               after the macro name. By default comments are right justified but this can be
458 %                               change with appropriate option in the macro. Ex:
459 %                               . default: \tcc*{side comment}
460 %                               . same as previous: \tcc*[r]{side comment}
461 %                               . left justify: \tcc*[l]{side comment}
462 %                               . here: \tcc*[h]{side comment} don't put the end of line mark before
463 %                                       comment (; by default) and don't end the line.
464 %                               . flushed: \tcc*[f]{side comment} same as the precedent but right
465 %                                 justified
466 %                      * ADD: - OPTION scright (default): right justified side comments (side comments
467 %                               are flushed to the righr)
468 %                      * ADD: - OPTION scleft: left justified side comments (side comments are put right after the
469 %                               code line)
470 %                      * ADD: - \SetSideCommentLeft acts as scleft option
471 %                      * ADD: - \SetSideCommentRight acts as scright option
472 %                      * ADD: - block like macro side text: all macro defining a block allows now to put text right
473 %                               after key words by putting text into (). Done to be used with sidecomment macros,
474 %                               but all text can be used. 
475 %                               Ex: \eIf(\tcc*[f]{then comment}){test}{then text}(else side text){else text}
476 %                      * ADD: - OPTION fillcomment (default): end mark of comment is flushed to the right so
477 %                               comments fill all the width of text.
478 %                      * ADD: - OPTION nofillcomment: end mark of comment is put right after the comment.
479 %                      * ADD: - \SetNoFillComment acts as nofillcomment option.
480 %                      * ADD: - \SetFillComment acts as fillcomment option.
481 %                      * ADD: - OPTION dotocloa: which adds an entry in the toc for the list of algorithms. This
482 %                               option load package tocbibind if not already done and so list of figures and list
483 %                               of tables are also added in the toc. If you want to control which ones of the lists
484 %                               will be added in the toc, please load package tocbibind before package algorithm
485 %                               and give it the options you want.
486 %                      * FIX: - vertical spacing for uif macro with noend option
487 %                      * FIX: - all the compatibility problems between caption and other packages
488 %                      * FIX: - typographical differences between list of algorithms and other lists  when in
489 %                               report or book 
490 %
491 %   - January 24 2005  - revision 3.6 -
492 %                      * FIX: - vertical spacing and space characters at the beginning or end of comments.
493 %                               line numbers of comments not in the NlSty.
494 %                               Thanks to Arnaud Giersch for his comments and suggestions.
495 %                      * FIX: - Set*Sty macro: the styles defined was not protected and was modified by surrounding
496 %                               context. For example KwTo in a \For{}{} was in bold AND italic instead of just in
497 %                               bold.
498 %                      * FIX: - line number misplacement after \Indp
499 %
500 %   - January 21 2005  - revision 3.5 -
501 %                      * ADD: - hidden numbering of the lines. Lines are auto-numbered but numbers are shown only
502 %                               on lines you specify:
503 %                               * linesnumberedhidden option or \LinesNumberedHidden macro activate this
504 %                                 functionnality.
505 %                               * \ShowLn and \ShowLnLabel{lab} macros make the number visible on the
506 %                               line. \ShowLnLabel{lab} allows to set a label for this line. 
507 %                               Thanks to Samson de Jager who makes this suggestion and provides the macros.
508 %                      * ADD: - \AlCapFnt and \SetAlCapFnt which allow to have a different font for
509 %                               caption. Works like \AlFnt and \SetAlFnt and by default is the same.
510 %                      * ADD: - \AlCapSkip skip length. This vertical space is added before caption in plain ou
511 %                               boxed mode. It allows to change distance between text and caption.
512 %                      * FIX: - caption compatible with IEEEtran class. 
513 %                      * FIX: - some vertical spacing error with \uIf macros (Thanks to Arnaud Giersch)
514 %                      * FIX: - Procedure and Function: lines are also numbered like algorithms
515 %                      * FIX: - CommentSty was not used for Comments
516 %
517 %   - January 10 2005  - revision 3.4 -
518 %                      * FIX: - caption compatible with new release of Beamer class. 
519 %
520 %   - June 16 2004     - revision 3.3 - 
521 %                      * FIX: - Hyperlink references of Hyperref package works now if compiled with pdflatex 
522 %                               and [naturalnames] option of hyperref package is used.
523 %                      * FIX: - algorithm[H] had problem in an list environment - corrected
524 %                      * FIX: - interline was not so regular in nested blocks - corrected
525 %                      * ADD  - \SetVlineSkip macro which sets the vertical skip after the little horizontal 
526 %                               rule which closes a block in Vlined mode. By default 0.8ex
527 %
528 %   - June 11 2004     - revision 3.2 - AUTO NUMBERING LINES !!!
529 %                      * ADD: auto numbering of the lines (the so asked and so long awaiting feature)
530 %                             this feature is managed by 3 options and 3 commands:
531 %                             - linesnumbered option: lines of the algo are numbered except for comments and
532 %                               input/output (KwInput and KwInOut)
533 %                             - commentsnumbered option: makes comments be numbered
534 %                             - inoutnumbered option: makes data input/output be numbered
535 %                             - \nllabel{lab} labels the line so you can cite with \ref{lab}
536 %                             - \LinesNumbered make the following algorithms having auto-numbered lines
537 %                             - \linesnotnumbered make the following algorithms having no auto-numbered lines
538 %                      * Change: algo2e option renames listofalgorithms in listofalgorithmes
539 %                      * FIX: new solution for compatibility with color package, more robust and not tricky.
540 %                             Many thanks to David Carlisle for his advices
541 %
542 %   - June 09 2004     - revision 3.1 -
543 %                      * Change: \SetKwSwitch command defines an additionnal macro \uCase and \Case prints end
544 %                      * Change: now macros SetKw* do a renewcommand if the keyword is already defined. So you can
545 %                                redefine default definition at your own convenience or change your definition
546 %                                without introducing a new macro and changing your text.
547 %                      * ADD: new macro \SetKwIF which do \SetKwIf and
548 %                             \SetKwIfElseIf.The following default definition has been added:
549 %                             \SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{endif}
550 %                             and so you get the macros;
551 %                             \If \eIf \lIf \uIf \ElseIf \uElseIf \lElseIf \Else \uElse \lElse
552 %                      * ADD: new macro \SetAlgoSkip which allow to fix the vertical skip before and after the
553 %                             algorithms. Default is smallskip, do \SetAlgoSkip{} if you don't want an extra space
554 %                             or \SetAlgoSkip{medskip} or \SetAlgoSkip{bigskip} if you want bigger space.
555 %                      * ADD: macro \SetKwIf defines in addition a new macro \uElse  (depending on wat name you
556 %                             have given in #2 arg).
557 %                      * ADD: macro \SetKwIfElseIf defines in addition a new macro \uElse and \ugElseIf (depending
558 %                             on what name you have given in #2 and #3 arg).
559 %                      * Change: baseline of algorithm is now top, so two algorithms can be put side by side.
560 %                      * FIX: Compatibility with color package solved. The problem was due to a redefinition of
561 %                             standard macros by color package. This solves compatibility problem with other
562 %                             packages as pstcol or colortbl. (notified by Dirk Fressmann, Antti Tarvainen and Koby
563 %                             Crammer)
564 %                      * Fix: extra little shift to the right with boxed style algorithm removed (notified by
565 %                             P. Tanovski)
566 %                      * Fix: algoln option was buggy (notified bye Jiaying Shen)
567 %                      * Fix: german and portuges option didn't work due to bad typo (notified by Martin Sievers,
568 %                             Thorsten Vitt and Jeronimo Pellegrini)
569 %                      
570 %   - February 13 2004 - revision 3.0 -
571 %                      * Major revision which makes the package independent from float.sty, so now
572 %                        - algorithm* works better, in particular can be used in multicols environments
573 %                        - (known bug corrected)
574 %                          [H] works now for all sort of environment but is handled differently for classic
575 %                          environment and star environment (algorithm, figure, procedure and function). For star
576 %                          environment, H acts like for classical figure environment, so it doesn't stay here
577 %                          absolutely.
578 %                        - (known bug corrected)
579 %                          you can use now floatflt package with algorithm package and even with figure
580 %                          option. Beware that if you want to put an algorithm inside a floatingfigure, it cannot
581 %                          be floating, so [H] is required and then figure option should not be used, since
582 %                          standard figure[H] are still floating with LaTeX.
583 %                      * boxruled: a new style added. Possible now since no style no more defined by the float
584 %                        package.
585 %                      * nocaptionofalgo: dosen't print Algorithm #: in the caption for algorithm in ruled or
586 %                        algoruled style.
587 %                        note: this is just documentation of a macro which was already in the package.
588 %   - December 14 2003 - revision 2.52 -
589 %                      * output message shorter
590 %                      * french keyword macro \PourTous was missing for longend option, it has been added.
591 %                      * TitleofAlgo prints Function or Procedure in corresponding environments.
592 %
593 %   - October 27 2003  - revision 2.51 - Revision submitted to CTAN archive
594 %                      * correction of a minor which make caption in procedure
595 %                        and function to be blanck with pdfscreen package
596 %                        (thanks to Joel Gossens for the notification)
597 %                      * add two internal definition to avoid some errors when
598 %                        used with Hyperref package (Hyperref package need to
599 %                        define new counter macro from existing ones, and
600 %                        don't do it for algorithm2e package, so we do it)
601 %
602 %   - October 17 2003  - revision 2.50 - first revision for CTAN archive
603 %                      * add \AlFnt and \SetAlFnt{font} macros: \AlFnt is used at the beginning of the caption and
604 %                        the body of algorithm in order to define the fonts used for typesetting algorithms. You
605 %                        can use it elsewhere you want to typeset text as algorithm. For example you can do
606 %                        \SetAlFnt{\small\sf} to have algorithms typeset in small sf font. Default is nothing so
607 %                        algorithm is typeset as the text of the document.
608 %                      * add \AlTitleFnt{text} and \SetAlTitleFnt{font} macros: The {Algorithm: } in the caption is
609 %                        typeset with \AlTitleFnt{Algorithm:}. You can use it to have text typeset as {Algorithm:}
610 %                        of captions. Default is textbf.  Default can be redefined by \SetAlTitleFnt{font}, for
611 %                        example you can do \SetAlTitleFnt{emph}
612 %                      * add CommentSty typo for text comment.  
613 %                      * add some compatibility with hyperref package (still an error on multiply defined refs but
614 %                        pdf correctly generated)
615 %                      * flush text to left in order to have correct indentation even with class as amsart which
616 %                        center all figures
617 %                      * add german, portuguese and czech options for title of algorithms and typo.
618 %                      * add portuguese translation of predefined keywords * add czech translation of some
619 %                        predefined keywords
620 %
621 %   - December 23 2002 - revision 2.40
622 %                      * add some french keyword missing
623 %                      * add function* and procedure* environment like algorithme* environment: print in one column
624 %                        even if twocolumn option is specified for the document.
625 %                      * add a new macro \SetKwComment to define macro which writes comments in the text. First
626 %                        argument is the name of the macro, second is the text put before the comment, third is the
627 %                        text put at the end of the comment.Default are \tcc and \tcp
628 %                      * add new options to change the way algo are numbered:
629 %                        [algopart] algo are numbered within part (counter must exist)
630 %                        [algochapter] algo are numbered within chapter
631 %                        [algosection] algo are numbered within section
632 %
633 %   - March 27 2002   - revision 2.39
634 %                      * Gilles Geeraerts: added the \SetKwIfElseIf to manage
635 %                        if (c)
636 %                             i;
637 %                        else if (c)
638 %                             i;
639 %                        ...
640 %                        else
641 %                             i;
642 %                        end
643 %                      * Also added \gIf \gElseIf \gElse.
644 %
645 %   - January 02 2001 - revision 2.38
646 %                      * bugs related to the caption in procedure and function
647 %                        environment are corrected.
648 %                      * bug related to option noend (extra vertical space added
649 %                        after block command as If or For) is corrected.
650 %                      * czech option language added (thanks to Libor Bus: l.bus@sh.cvut.cz).
651 %  
652 %   - October 16 2000 - revision 2.37
653 %                      * option algo2e added: change the name of environment
654 %                        algorithm into algorithm2e. So allow to use the package
655 %                        with some journal style which already define an algorithm
656 %                        environment.
657 %  
658 %   - September 13 2000 - revision 2.36
659 %                      * option slide added: require package color
660 %                      * Hack for slide class in order to have correct
661 %                        margins
662 %  
663 %   - November 25 1999 - revision 2.35
664 %                      * revision number match RCS number
665 %                      * Thanks to David A. Bader, a new option is added:
666 %                        noend: no end keywords are printed.
667 %  
668 %   - November 19 1999 - revision 2.32
669 %                      * minor bug on longend option corrected.
670 %  
671 %   - August 26 1999 - revision 2.31
672 %                      * add an option: figure
673 %                        this option makes algorithms be figure and so are numbered
674 %                        as figures, have Figure as caption and are put in 
675 %                        the \listoffigures
676 %  
677 %   - January 21 1999 - revision 2.3 beta
678 %                    add 2 new environments: procedure and function.
679 %                    These environments works like algorithm environment but:
680 %                    - the ruled (or algoruled) style is imperative.
681 %                    - the caption now writes Procedure name....
682 %                    - the syntax of the \caption command is restricted as
683 %                      follow: you MUST put a name followed by 2 braces like
684 %                      this ``()''. You can put arguments inside the braces and
685 %                      text after. If no argument is given, the braces will be
686 %                      removed in the title. 
687 %                    - label now puts the name (the text before the braces in the
688 %                      caption) of the procedure or function as reference (not
689 %                      the number like a classic algorithm environment).
690 %                    There are also two new styles: ProcNameSty and
691 %                    ProcArgSty. These style are by default the same as FuncSty
692 %                    and ArgSty but are used in the caption of a procedure or a
693 %                    function.
694 %                    
695 %   - November 28 1996 - revision 2.22
696 %                    add a new macro \SetKwInParam{arg1}{arg2}{arg3}:
697 %                    it defines a macro \arg1{name}{arg} which prints name in keyword
698 %                    style followed byt arg surrounded by arg2 and arg3. The main
699 %                    application is to a function working as \SetKwInput to be used
700 %                    in the head of the algorithm. For example
701 %                    \SetKwInParam{Func}{(}{)} allows
702 %                    \Func{functionname}{list of arguments} which prints:
703 %                    \KwSty{functioname(}list of arguments\KwSty{)}
704 %       
705 %
706 %   - November 27 1996 - revision 2.21:
707 %                    minor bug in length of InOut boxes fixed.
708 %                    add algorithm* environment.
709 %
710 %   - July 12 1996 - revision 2.2: \SetArg and \SetKwArg macros removed.
711 %                        
712 %                    \SetArg has been removed since it never has been
713 %                    documented.
714 %                    \SetKwArg has been removed since \SetKw can now
715 %                    take an argument in order to be consistent with
716 %                    \SetKwData and \SetKwFunction macros.
717 %
718 %   - July 04 1996 - revision 2.1: still more LaTeX2e! Minor compatibility break
719 %
720 %                    Macros use now \newcommand instead of \def, use of \setlength, 
721 %                    \newsavebox, ... and other LaTeX2e specific stuff.
722 %                    The compatibility break:
723 %                    - \SetData becomes \SetKwData to be more consistent. So the old 
724 %                      \SetKwData becomes \SetKwInput
725 %                    - old macros \titleofalgo, \Freetitleofalgo and \freetitleofalgo
726 %                      from LaTeX209 version which did print a warning message and call 
727 %                      \Titleofalgo in version 2.0 are now removed!
728 %
729 %   - March 13 1996 - revision 2.0: first official major revision.
730 %   
731 %
732 %%%%%%%%%%%%%%
733 %
734 %   Known bugs: 
735 %   -----------
736 %   - horizontal spacing (indent) doesn't work with revtex4 class.
737 %
738 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
739 %
740 % for more complete informations you can see algorithm2e.tex
741 %
742 %
743 %%%%%%%%%%%%%%%%%%%%%%%% Identification Part %%%%%%%%%%%%%%%%%%%%%%%%%%%%
744 %
745 \NeedsTeXFormat{LaTeX2e}[1994/12/01]
746 %
747 \ProvidesPackage{algorithm2e}[2013/01/06 v5.00 algorithms environments]
748 %
749 %
750 %%%%%%%%%%%%%%%%%%%%%%%%%%% Initial Code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
751 %
752 \@makeother\*% some package redefined it as a letter (as color.sty)
753 \def\@firstword#1 #2\@nil{#1}% an useful fonction
754 %%%%%%% Utilities:
755 % \ifArgumentEmpty<c><t><e> ; if c is empty, i.e. {}, then t, else e.
756 %    Function used internally, but may as well expose it to the user; it's useful
757 \long\def\ifArgumentEmpty#1{\bgroup
758         \catcode`\Q=3
759         \catcode`\T=3
760         \long\def\@tempa##1##2Q##3##4##5T{##4}%
761         \xdef\@tempa{\@tempa#1QQ{\noexpand\@secondoftwo}{\noexpand\@firstoftwo}T}%
762 \egroup\@tempa}
763 %
764 % \algocf@longdef -> shorthand to reduce
765 %    \expandafter\long\expandafter\def
766 % to
767 %    \expandafter\algocf@longdef
768 % may look insignificant, but reads that much better ;)
769 \def\algocf@longdef{\long\def}
770 %
771 % \algocf@newcommand (and helper \algocf@new@command) behaves like LaTeX's newcommand,
772 % with two differences:
773 %  - the argument is not "\<name>", but rather "<name>"; i.e. one level of indirection
774 %  - if the command exists already, then \renewcommand, rather than \newcommand
775 \def\algocf@newcommand#1{\expandafter\algocf@new@command\csname#1\endcsname}
776 \def\algocf@new@command#1{%
777         \begingroup \escapechar\m@ne\xdef\@gtempa{{\string#1}}\endgroup
778         \expandafter\@ifundefined\@gtempa\newcommand\renewcommand#1}%
779 %
780 % \algocf@newcmdside<name><arity><body>
781 %   The largest time-saver; many commands we define have the pattern:
782 %     \<name>(<side_text>)<argX><argY>...
783 %   where "(<side_text>)" is optional. By defining them with this function,
784 %   the arguments are parsed and renumbered, i.e. the body works as if the
785 %   command was:
786 %     \<name><side_text><argX><argY>...
787 %   and can use \ifArgumentEmpty to see whether its #1 exists (default case
788 %   for the side text is (), so there's no difference between calling
789 %     \foo{bar}
790 %   or
791 %     \foo(){bar}
792 %   Technically this is new behaviour, but it shouldn't really occur...
793 \algocf@longdef\algocf@newcmdside#1#2#3{%
794         \expandafter\def\csname#1\endcsname{%
795                 \@ifnextchar({\csname algocf@#1strip\endcsname}{\csname algocf@#1strip\endcsname()}%
796         }%
797         \expandafter\algocf@longdef\csname algocf@#1strip\endcsname(##1){\csname algocf@#1main\endcsname{##1}}%
798         \algocf@newcommand{algocf@#1main}[#2]{#3}%
799 }
800 %
801 % \algocf@newcmdsides<name><arity><body><tail><closing>
802 %   Like the command above, but with an optional side text at the end
803 %   of the command as well, i.e.:
804 %     \<name>(<side_text>)<argX><argY>(<end_text>)
805 %   It may be a bit confusing that <arity> doesn't count <end_text>,
806 %   but since it is for internal use, the naming can be a little more
807 %   fuzzy. This function behaves as if:
808 %     <body'> = <body><if end_text: tail{end_text}><closing>
809 \algocf@longdef\algocf@newcmdsides#1#2#3#4#5{%
810         \expandafter\def\csname#1\endcsname{%
811                 \@ifnextchar({\csname algocf@#1strip\endcsname}{\csname algocf@#1strip\endcsname()}%
812         }%
813         \expandafter\algocf@longdef\csname algocf@#1strip\endcsname(##1){\csname algocf@#1main\endcsname{##1}}%
814         \algocf@newcommand{algocf@#1main}[#2]{#3\@ifnextchar({\csname algocf@#1end\endcsname}{#4#5}}%
815         \expandafter\algocf@longdef\csname algocf@#1end\endcsname(##1){#4{##1}\strut\par}%
816 }%
817 %
818 % definition of commands which can be redefined in options of the package.
819 %
820 \newcounter{AlgoLine}%
821 \setcounter{AlgoLine}{0}%
822 %
823 \newcommand{\algocf@algocfref}{\relax}%
824 \newcommand{\listalgorithmcfname}{}%
825 \newcommand{\algorithmcfname}{}%
826 \@ifundefined{algorithmautorefname}{\newcommand{\algorithmautorefname}{algorithm}}{\renewcommand{\algorithmautorefname}{algorithm}}%
827 \newcommand{\algorithmcflinename}{}%
828 \newcommand{\algocf@typo}{}%
829 \newcommand{\@algocf@procname}{}\newcommand{\procedureautorefname}{}%
830 \newcommand{\SetAlgoProcName}[2]{\renewcommand{\@algocf@procname}{#1}\renewcommand{\procedureautorefname}{#2}}%
831 \newcommand{\@algocf@funcname}{}\newcommand{\functionautorefname}{}%
832 \newcommand{\SetAlgoFuncName}[2]{\renewcommand{\@algocf@funcname}{#1}\renewcommand{\functionautorefname}{#2}}%
833 \newcommand{\@algocf@titleofalgoname}{\algorithmcfname}%
834 \newcommand{\@algocf@algotitleofalgo}{%
835   \renewcommand{\@algocf@titleofalgoname}{\algorithmcfname}}%
836 \newcommand{\@algocf@proctitleofalgo}{%
837   \renewcommand{\@algocf@titleofalgoname}{\algocf@procname}}%
838 %
839 \newcommand{\algocf@style}{plain}%
840 \newcommand{\@ResetCounterIfNeeded}{}%
841 \newcommand{\@titleprefix}{}%
842 %
843 \newcommand{\algocf@numbering}[1]{\newcommand{\algocf@within}{#1}}%
844 %
845 \newcommand{\defaultsmacros@algo}{\algocf@defaults@shortend}%
846 %
847 \newcommand{\algocf@list}{loa}%
848 \newcommand{\algocf@float}{algocf}%
849 %
850 \newcommand{\algocf@envname}{algorithm}%
851 \newcommand{\algocf@listofalgorithms}{listofalgorithms}%
852 %
853 %
854 %% redefine chapter so that it adds a vspace in the loa as the original does for lof and lot
855 % \let\algocf@original@chapter=\chapter%
856 % \def\chapter{\expandafter\addtocontents{loa}{\protect\addvspace{10\p@}}\algocf@original@chapter}%
857 %
858 % bug correction with hyperref submitted by Hubert Meier
859 \begingroup\expandafter\expandafter\expandafter\endgroup 
860 \expandafter\ifx\csname @chapter\endcsname\relax\else 
861 % \let\algocf@original@chapter=\chapter% 
862 % \def\chapter{\addtocontents{loa}{\protect\addvspace{10\p@}}\algocf@original@chapter}% 
863 \let\algocf@original@chapter=\@chapter% 
864 \def\@chapter[#1]#2{\algocf@original@chapter[#1]{#2}\addtocontents{loa}{\protect\addvspace{10\p@}}}% 
865 \fi
866 %
867 %% if@restonecol is defined in article and book but some other classes don't define it and we need it, so we do
868 \ifx\if@restonecol\relax\else\newif\if@restonecol\fi%
869 %
870 %
871 %%%%%%%%%%%%%%%%%%%%%% Declaration of Options %%%%%%%%%%%%%%%%%%%%%%%%%%%
872 %
873 \RequirePackage{ifthen}%
874 %
875 \newboolean{algocf@displayblockmarkers}\setboolean{algocf@displayblockmarkers}{false}%
876 \DeclareOption{displayblockmarkers}{%
877   \setboolean{algocf@displayblockmarkers}{true}%
878 }
879 %
880 \newboolean{algocf@nokwfunc}\setboolean{algocf@nokwfunc}{false}%
881 \DeclareOption{nokwfunc}{%
882   \setboolean{algocf@nokwfunc}{true}%
883 }%
884 %
885 \newboolean{algocf@oldcommands}\setboolean{algocf@oldcommands}{false}%
886 \DeclareOption{oldcommands}{%
887   \setboolean{algocf@oldcommands}{true}%
888 }%
889 %
890 \newboolean{algocf@leftlinenumber}\setboolean{algocf@leftlinenumber}{true}%
891 \newcommand{\setLeftLinesNumbers}{\setboolean{algocf@leftlinenumber}{true}}%
892 \newcommand{\setRightLinesNumbers}{\setboolean{algocf@leftlinenumber}{false}}%
893 \DeclareOption{rightnl}{%
894   \setRightLinesNumbers%
895 }%
896 %
897 \newboolean{algocf@endfloat}\setboolean{algocf@endfloat}{false}%
898 \DeclareOption{endfloat}{%
899   \setboolean{algocf@endfloat}{true}%
900   \newcounter{postalgo}\setcounter{postalgo}{0}%
901 }%
902 %
903 \newboolean{algocf@procnumbered}\setboolean{algocf@procnumbered}{false}%
904 \DeclareOption{procnumbered}{%
905   \setboolean{algocf@procnumbered}{true}%
906 }%
907 %
908 \DeclareOption{algo2e}{%
909   \renewcommand{\algocf@envname}{algorithm2e}%
910   \renewcommand{\algocf@listofalgorithms}{listofalgorithmes}%
911 }%
912 %
913 \newboolean{algocf@slide}\setboolean{algocf@slide}{false}%
914 \DeclareOption{slide}{%
915   \setboolean{algocf@slide}{true}%
916 }%
917 %
918 \DeclareOption{figure}{%
919 \renewcommand{\algocf@list}{lof}%
920 \renewcommand{\algocf@float}{figure}%
921 }%
922 %
923 \newboolean{algocf@optonelanguage}\setboolean{algocf@optonelanguage}{false}%
924 \DeclareOption{onelanguage}{\setboolean{algocf@optonelanguage}{true}}%
925 %
926 \newcommand{\algocf@languagechoosen}{english}%
927 %
928 \DeclareOption{english}{%
929 \renewcommand{\listalgorithmcfname}{List of Algorithms}%
930 \renewcommand{\algorithmcfname}{Algorithm}%
931 \renewcommand{\algorithmautorefname}{algorithm}%
932 \renewcommand{\algorithmcflinename}{line}%
933 \renewcommand{\algocf@typo}{}%
934 \renewcommand{\@algocf@procname}{Procedure}%
935 \renewcommand{\@algocf@funcname}{Function}%
936 \renewcommand{\procedureautorefname}{procedure}%
937 \renewcommand{\functionautorefname}{function}%
938 \renewcommand{\algocf@languagechoosen}{english}%
939 }%
940 %
941 \DeclareOption{french}{%
942 \renewcommand{\listalgorithmcfname}{Liste des Algorithmes}%
943 \renewcommand{\algorithmcfname}{Algorithme}%
944 \renewcommand{\algorithmautorefname}{algorithme}%
945 \renewcommand{\algorithmcflinename}{ligne}%
946 \renewcommand{\algocf@typo}{\ }%
947 \renewcommand{\@algocf@procname}{Proc\'edure}%
948 \renewcommand{\@algocf@funcname}{Fonction}%
949 \renewcommand{\procedureautorefname}{proc\'edure}%
950 \renewcommand{\functionautorefname}{fonction}%
951 \renewcommand{\algocf@languagechoosen}{french}%
952 }%
953 %
954 \DeclareOption{czech}{%
955 \renewcommand{\listalgorithmcfname}{Seznam algoritm\v{u}}%
956 \renewcommand{\algorithmcfname}{Algoritmus}%
957 \renewcommand{\algorithmautorefname}{\algorithmcfname}%
958 \renewcommand{\algorithmcflinename}{Radek}%
959 \renewcommand{\algocf@typo}{}%
960 \renewcommand{\@algocf@procname}{Procedura}%
961 \renewcommand{\@algocf@funcname}{Funkce}%
962 \renewcommand{\procedureautorefname}{\@algocf@procname}%
963 \renewcommand{\functionautorefname}{\@algocf@funcname}%
964 \renewcommand{\algocf@languagechoosen}{czech}%
965 }%
966 %
967 \DeclareOption{german}{%
968 \renewcommand{\listalgorithmcfname}{Liste der Algorithmen}%
969 \renewcommand{\algorithmcfname}{Algorithmus}%
970 \renewcommand{\algorithmautorefname}{\algorithmcfname}%
971 \renewcommand{\algorithmcflinename}{Zeile}%
972 \renewcommand{\algocf@typo}{\ }%
973 \renewcommand{\@algocf@procname}{Prozedur}%
974 \renewcommand{\@algocf@funcname}{Funktion}%
975 \renewcommand{\procedureautorefname}{\@algocf@procname}%
976 \renewcommand{\functionautorefname}{\@algocf@funcname}%
977 \renewcommand{\algocf@languagechoosen}{german}%
978 }%
979 %
980 \DeclareOption{ngerman}{%
981 \renewcommand{\listalgorithmcfname}{Liste der Algorithmen}%
982 \renewcommand{\algorithmcfname}{Algorithmus}%
983 \renewcommand{\algorithmautorefname}{\algorithmcfname}%
984 \renewcommand{\algorithmcflinename}{Zeile}%
985 \renewcommand{\algocf@typo}{\ }%
986 \renewcommand{\@algocf@procname}{Prozedur}%
987 \renewcommand{\@algocf@funcname}{Funktion}%
988 \renewcommand{\procedureautorefname}{\@algocf@procname}%
989 \renewcommand{\functionautorefname}{\@algocf@funcname}%
990 \renewcommand{\algocf@languagechoosen}{german}%
991 }%
992 %
993 \DeclareOption{portuguese}{%
994 \renewcommand{\listalgorithmcfname}{Lista de Algoritmos}%
995 \renewcommand{\algorithmcfname}{Algoritmo}%
996 \renewcommand{\algorithmautorefname}{algoritmo}%
997 \renewcommand{\algorithmcflinename}{linha}%
998 \renewcommand{\algocf@typo}{}%
999 \renewcommand{\@algocf@procname}{Procedimento}%
1000 \renewcommand{\@algocf@funcname}{Fun\c{c}\~{a}o}%
1001 \renewcommand{\procedureautorefname}{procedimento}%
1002 \renewcommand{\functionautorefname}{fun\c{c}\~{a}o}%
1003 \renewcommand{\algocf@languagechoosen}{portuguese}%
1004 }%
1005 %
1006 \DeclareOption{italiano}{%
1007 \renewcommand{\listalgorithmcfname}{Elenco degli algoritmi}%
1008 \renewcommand{\algorithmcfname}{Algoritmo}%
1009 \renewcommand{\algorithmautorefname}{algoritmo}%
1010 \renewcommand{\algorithmcflinename}{riga}%
1011 \renewcommand{\algocf@typo}{}%
1012 \renewcommand{\@algocf@procname}{Procedura}%
1013 \renewcommand{\@algocf@funcname}{Funzione}%
1014 \renewcommand{\procedureautorefname}{procedura}%
1015 \renewcommand{\functionautorefname}{funzione}%
1016 \renewcommand{\algocf@languagechoosen}{italiano}%
1017 }%
1018 \DeclareOption{spanish}{%
1019 \renewcommand{\listalgorithmcfname}{\'Indice de algoritmos}%
1020 \renewcommand{\algorithmcfname}{Algoritmo}%
1021 \renewcommand{\algorithmautorefname}{algoritmo}%
1022 \renewcommand{\algorithmcflinename}{l\'inea}%
1023 \renewcommand{\algocf@typo}{}%
1024 \renewcommand{\@algocf@procname}{Procedimiento}%
1025 \renewcommand{\@algocf@funcname}{Funci\'on}%
1026 \renewcommand{\procedureautorefname}{procedimiento}%
1027 \renewcommand{\functionautorefname}{funci\'on}%
1028 \renewcommand{\algocf@languagechoosen}{spanish}%
1029 }%
1030 \DeclareOption{slovak}{%
1031 \renewcommand{\listalgorithmcfname}{Zoznam algoritmov}%
1032 \renewcommand{\algorithmcfname}{Algoritmus}%
1033 \renewcommand{\algorithmautorefname}{\algorithmcfname}%
1034 \renewcommand{\algorithmcflinename}{Radek}%
1035 \renewcommand{\algocf@typo}{}%
1036 \renewcommand{\@algocf@procname}{Proced\'{u}ra}%
1037 \renewcommand{\@algocf@funcname}{Funkcia}%
1038 \renewcommand{\procedureautorefname}{\@algocf@procname}%
1039 \renewcommand{\functionautorefname}{\@algocf@funcname}%
1040 \renewcommand{\algocf@languagechoosen}{slovak}%
1041 }%
1042 %
1043 \DeclareOption{croatian}{%
1044 \renewcommand{\listalgorithmcfname}{Popis algoritama}%
1045 \renewcommand{\algorithmcfname}{Algoritam}%
1046 \renewcommand{\algorithmautorefname}{\algorithmcfname}%
1047 \renewcommand{\algorithmcflinename}{linija}%
1048 \renewcommand{\algocf@typo}{}%
1049 \renewcommand{\@algocf@procname}{Procedura}%
1050 \renewcommand{\@algocf@funcname}{Funkcija}%
1051 \renewcommand{\procedureautorefname}{\@algocf@procname}%
1052 \renewcommand{\functionautorefname}{\@algocf@funcname}%
1053 \renewcommand{\algocf@languagechoosen}{croatian}%
1054 }%
1055 %
1056 % OPTIONs plain, boxed, ruled, algoruled & boxruled
1057 %
1058 \newcommand{\algocf@style@plain}{\renewcommand{\algocf@style}{plain}}%
1059 \newcommand{\algocf@style@boxed}{\renewcommand{\algocf@style}{boxed}}%
1060 \newcommand{\algocf@style@ruled}{\renewcommand{\algocf@style}{ruled}}%
1061 \newcommand{\algocf@style@algoruled}{\renewcommand{\algocf@style}{algoruled}}%
1062 \newcommand{\algocf@style@boxruled}{\renewcommand{\algocf@style}{boxruled}}%
1063 \newcommand{\algocf@style@tworuled}{\renewcommand{\algocf@style}{tworuled}}%
1064 \newcommand{\algocf@style@plainruled}{\renewcommand{\algocf@style}{plainruled}}%
1065 \newcommand{\RestyleAlgo}[1]{\csname algocf@style@#1\endcsname}%
1066 \DeclareOption{plain}{\algocf@style@plain}%
1067 \DeclareOption{plainruled}{\algocf@style@plainruled}%
1068 \DeclareOption{boxed}{\algocf@style@boxed}%
1069 \DeclareOption{ruled}{\algocf@style@ruled}%
1070 \DeclareOption{algoruled}{\algocf@style@algoruled}%
1071 \DeclareOption{boxruled}{\algocf@style@boxruled}%
1072 \DeclareOption{tworuled}{\algocf@style@tworuled}%
1073 %
1074 % OPTIONs algopart,algochapter & algosection
1075 %
1076 \DeclareOption{algopart}{\algocf@numbering{part}}%       %algo part numbered
1077 \DeclareOption{algochapter}{\algocf@numbering{chapter}}% %algo chapter numbered
1078 \DeclareOption{algosection}{\algocf@numbering{section}}% %algo section numbered
1079 %
1080 % OPTIONs resetcount & noresetcount
1081 %
1082 \DeclareOption{resetcount}{\renewcommand{\@ResetCounterIfNeeded}{\setcounter{AlgoLine}{0}}}%
1083 \DeclareOption{noresetcount}{\renewcommand{\@ResetCounterIfNeeded}{}}%
1084 %
1085 % OPTION linesnumbered
1086 %
1087 \newboolean{algocf@linesnumbered}\setboolean{algocf@linesnumbered}{false}%
1088 \newcommand{\algocf@linesnumbered}{\relax}%
1089 \DeclareOption{linesnumbered}{%
1090   \setboolean{algocf@linesnumbered}{true}%
1091   \renewcommand{\algocf@linesnumbered}{\everypar={\nl}}%
1092 }%
1093 %
1094 % OPTION linesnumberedhidden
1095 %
1096 \DeclareOption{linesnumberedhidden}{%
1097   \setboolean{algocf@linesnumbered}{true}%
1098   \renewcommand{\algocf@linesnumbered}{\everypar{\stepcounter{AlgoLine}}}%
1099 }%
1100 %
1101 % OPTION commentsnumbered inoutnumbered
1102 %
1103 \newboolean{algocf@commentsnumbered}\setboolean{algocf@commentsnumbered}{false}%
1104 \DeclareOption{commentsnumbered}{\setboolean{algocf@commentsnumbered}{true}}%
1105 \newboolean{algocf@inoutnumbered}\setboolean{algocf@inoutnumbered}{false}%
1106 \DeclareOption{inoutnumbered}{\setboolean{algocf@inoutnumbered}{true}}%
1107 %
1108 % OPTIONs titlenumbered & titlenotnumbered
1109 %
1110 \DeclareOption{titlenumbered}{%
1111   \renewcommand{\@titleprefix}{%
1112     \refstepcounter{\algocf@float}%
1113     \AlTitleSty{\AlTitleFnt\@algocf@titleofalgoname\ \expandafter\csname the\algocf@float\endcsname\algocf@typo: }%
1114   }%
1115 }%
1116 %
1117 \DeclareOption{titlenotnumbered}{\renewcommand{\@titleprefix}{%
1118     \AlTitleSty{\AlTitleFnt\@algocf@titleofalgoname\algocf@typo: }}%
1119 }%
1120 %
1121 % OPTIONs algonl
1122 % line numbered with the counter of the algorithm
1123 %
1124 \DeclareOption{algonl}{\renewcommand{\theAlgoLine}{\expandafter\csname the\algocf@float\endcsname.\arabic{AlgoLine}}}%
1125 %
1126 % OPTIONs lined, vlined & noline
1127 %
1128 \DeclareOption{lined}{\AtBeginDocument{\SetAlgoLined}}%   \SetAlgoLined
1129 \DeclareOption{vlined}{\AtBeginDocument{\SetAlgoVlined}}% \SetAlgoVlined
1130 \DeclareOption{noline}{\AtBeginDocument{\SetAlgoNoLine}}%\SetAlgoNoLine (default)
1131 %
1132 % OPTIONs longend, shotend & noend
1133 %
1134 \DeclareOption{longend}{\AtBeginDocument{\SetAlgoLongEnd}}%  \SetAlgoLongEnd
1135 \DeclareOption{shortend}{\AtBeginDocument{\SetAlgoShortEnd}}%\SetAlgoShortEnd
1136 \DeclareOption{noend}{\AtBeginDocument{\SetAlgoNoEnd}}%      \SetAlgoNoEnd
1137 %
1138 \DeclareOption{nosemicolon}{\AtBeginDocument{\DontPrintSemicolon}}%      \SetAlgoNoEnd
1139 %
1140 % OPTION dotoc
1141 %
1142 \newboolean{algocf@dotocloa}\setboolean{algocf@dotocloa}{false}%
1143 \DeclareOption{dotocloa}{%
1144   \setboolean{algocf@dotocloa}{true}%
1145 }
1146 %
1147 % OPTION comments
1148 %
1149 \newboolean{algocf@optfillcomment}\setboolean{algocf@optfillcomment}{true}%
1150 \DeclareOption{nofillcomment}{%
1151   \setboolean{algocf@optfillcomment}{false}%
1152 }%
1153 \DeclareOption{fillcomment}{%
1154   \setboolean{algocf@optfillcomment}{true}%
1155 }%
1156 %
1157 % OPTION sidecommments
1158 %
1159 \newboolean{algocf@scleft}\setboolean{algocf@scleft}{false}%
1160 \DeclareOption{scleft}{%
1161   \setboolean{algocf@scleft}{true}%
1162 }%
1163 \DeclareOption{sright}{% default
1164   \setboolean{algocf@scleft}{false}%
1165 }%
1166 %
1167 % OPTION norelsize
1168 %
1169 \newboolean{algocf@norelsize}\setboolean{algocf@norelsize}{false}%
1170 \DeclareOption{norelsize}{%
1171   \setboolean{algocf@norelsize}{true}%
1172 }%
1173 %
1174 %
1175 %%%%%%%%%%%%%%%%%%%%%%% Execution of Options %%%%%%%%%%%%%%%%%%%%%%%%%%%%
1176 %
1177 \ExecuteOptions{english,plain,resetcount,titlenotnumbered,lined,shortend}%
1178 %
1179 \ProcessOptions%
1180 %
1181 \@algocf@algotitleofalgo% fix name for \TitleOfAlgo to \algorithmcfname by default
1182 %
1183 %%%%%%%%%%%%%%%%%%%%%%%%%% Package Loading %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1184 %
1185 %
1186 \RequirePackage{xspace}%
1187 %
1188 \ifthenelse{\boolean{algocf@endfloat}}{%
1189   \RequirePackage{endfloat}%
1190 }{\relax}%
1191 %
1192 \ifthenelse{\boolean{algocf@norelsize}}{%
1193   \newcommand{\relsize}[1]{\scriptsize}%
1194 }{%
1195   \RequirePackage{relsize}%
1196 }%
1197 %
1198 \ifthenelse{\boolean{algocf@slide}}{\RequirePackage{color}}{}%
1199 %
1200 %
1201 \AtEndOfPackage{%
1202   \ifthenelse{\boolean{algocf@dotocloa}}{%
1203     \renewcommand{\listofalgorithms}{\tocfile{\listalgorithmcfname}{loa}}%
1204   }{\relax}%
1205 }%
1206 %
1207 % if loa in toc required, load tocbibind package if not already done.
1208 \ifthenelse{\boolean{algocf@dotocloa}}{%
1209   \ifx\@tocextra\undefined%
1210   \RequirePackage{tocbibind}%
1211   \fi%
1212 }{\relax}%
1213 %
1214 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% Main Part %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1215 %
1216 \newcommand{\algocf@name}{algorithm2e}%
1217 \newcommand{\algocf@date}{january 06 2013}%
1218 \newcommand{\algocf@version}{Release 5.0}%
1219 \newcommand{\algocf@id}{\algocf@version\space -- \algocf@date\space --}%
1220 \typeout{********************************************************^^JPackage `\algocf@name'\space\algocf@id^^J%
1221          - algorithm2e-announce@lirmm.fr  mailing list for announcement about releases^^J%
1222          - algorithm2e-discussion@lirmm.fr mailing list for discussion about package^^J%
1223          subscribe by emailing sympa@lirmm.fr with 'subscribe <list> <firstname name>'^^J%
1224          - Author: Christophe Fiorio (cfiorio@um2.fr)^^J********************************************************}%
1225 %%
1226 %%
1227 %%
1228 %%
1229 %%
1230 %%
1231 %%%% hyperref compatibility tricks: Hyperref package defines H counters from
1232    % standard counters (i.e \theHpage from \thepage) and check some particular
1233    % counters of some packages, unfortunately it doesn't do the same for
1234    % algorithm2e package but act as Hcounter was defined. To avoid errors we
1235    % defined \theHalgocf ourself
1236 %%%%
1237 %
1238 \@ifundefined{theHalgocf}{\def\theHalgocf{\thealgocf}}{}%
1239 \@ifundefined{theHAlgoLine}{\def\theHAlgoLine{\theAlgoLine}}{}%
1240 \@ifundefined{theHalgocfproc}{\def\theHalgocfproc{0}}{}%
1241 \@ifundefined{theHalgocffunc}{\def\theHalgocffunc{0}}{}%
1242 \@ifundefined{toclevel@algocf}{\def\toclevel@algocf{0}}{}%
1243 %
1244 % autoref from hyperref needs an autorefname, so we give it.
1245 \def\AlgoLineautorefname{\algorithmcflinename}%
1246 \def\algocfautorefname{\algorithmautorefname}%
1247 \def\algocfprocautorefname{\procedureautorefname}%
1248 \def\algocffuncautorefname{\functionautorefname}%
1249 %%
1250 %%
1251 %%
1252 \newcommand{\@defaultskiptotal}{0.5em}%
1253 \newskip\skiptotal\skiptotal=0.5em%
1254 \newskip\skiplinenumber\skiplinenumber=\hsize\advance\skiplinenumber by-\skiptotal%
1255 \newskip\skiprule%
1256 \newskip\skiphlne%
1257 \newskip\skiptext%
1258 \newskip\skiplength%
1259 \newskip\algomargin%
1260 \newskip\skipalgocfslide\skipalgocfslide=1em%
1261 \newdimen\algowidth%
1262 \newdimen\inoutsize%
1263 \newdimen\inoutindent%
1264 \newdimen\interspacetitleruled\setlength{\interspacetitleruled}{2pt}%
1265 \newdimen\interspacealgoruled\setlength{\interspacealgoruled}{2pt}%
1266 \newdimen\interspacetitleboxruled\setlength{\interspacetitleboxruled}{2\lineskip}%
1267 %
1268 \newcommand{\@algoskip}{\smallskip}%
1269 \newcommand{\SetAlgoSkip}[1]{\renewcommand{\@algoskip}{\csname#1\endcsname}}%
1270 \newcommand{\@algoinsideskip}{\relax}%
1271 \newcommand{\SetAlgoInsideSkip}[1]{\renewcommand{\@algoinsideskip}{\csname#1\endcsname}}%
1272 %
1273 \newsavebox{\algocf@inoutbox}%
1274 \newsavebox{\algocf@inputbox}%
1275 %%
1276 %%
1277 \newcommand{\arg@e}{}%
1278 \newcommand{\arg@space}{\ }%
1279 \newcommand{\BlankLine}{\vskip 1ex}%
1280 %%
1281 \newcommand{\vespace}{1ex}%
1282 \newcommand{\SetInd}[2]{%
1283 \skiprule=#1%
1284 \skiptext=#2%
1285 \skiplength=\skiptext\advance\skiplength by \skiprule\advance\skiplength by 0.4pt}%
1286 \SetInd{0.5em}{1em}
1287 \algomargin=\leftskip\advance\algomargin by \parindent%
1288 \newcommand{\IncMargin}[1]{\advance\algomargin by #1}%
1289 \newcommand{\DecMargin}[1]{\advance\algomargin by -#1}%
1290 \newcommand{\SetNlSkip}[1]{%
1291   \renewcommand{\@defaultskiptotal}{#1}%
1292   \setlength{\skiptotal}{#1}}%
1293 %%
1294 \newskip\AlCapSkip\AlCapSkip=0ex%
1295 \newskip\AlCapHSkip\AlCapSkip=0ex%
1296 \newcommand{\SetAlCapSkip}[1]{\setlength{\AlCapSkip}{#1}}%
1297 \newcommand{\SetAlCapHSkip}[1]{\setlength{\AlCapHSkip}{#1}}%
1298 \SetAlCapHSkip{.5\algomargin}%
1299 %%
1300 %%
1301 \newskip\algoskipindent
1302 \newcommand{\algocf@adjustskipindent}{%
1303   \algoskipindent=\skiprule%
1304   \advance\algoskipindent by \skiptext\advance\algoskipindent by 0.4pt}
1305 \algocf@adjustskipindent%
1306 %
1307 \newcommand{\Indentp}[1]{\advance\leftskip by #1}%
1308 \newcommand{\Indp}{\algocf@adjustskipindent\advance\leftskip by \algoskipindent}
1309 \newcommand{\Indpp}{\advance\leftskip by 0.5em}%
1310 \newcommand{\Indm}{\algocf@adjustskipindent\advance\leftskip by -\algoskipindent}
1311 \newcommand{\Indmm}{\advance\leftskip by -0.5em}%
1312 %%
1313 %%
1314 %% Line Numbering
1315 %%
1316 %%
1317 % number line style
1318 \newcommand{\algocf@nlrelsize}{-2}\newcommand{\SetAlgoNlRelativeSize}[1]{\renewcommand{\algocf@nlrelsize}{#1}}%
1319 \newcommand{\NlSty}[1]{\textnormal{\textbf{\relsize{\algocf@nlrelsize}#1}}}% default definition
1320 \newcommand{\SetNlSty}[3]{\renewcommand{\NlSty}[1]{\textnormal{\csname#1\endcsname{\relsize{\algocf@nlrelsize}#2##1#3}}}}%
1321 %
1322 % nl definitions
1323 %
1324 \newsavebox{\algocf@nlbox}%
1325 \newcommand{\algocf@printnl}[1]{%
1326   \ifthenelse{\boolean{algocf@leftlinenumber}}{%
1327     \skiplinenumber=\skiptotal\advance\skiplinenumber by\leftskip%
1328     \strut\raisebox{0pt}{\llap{\NlSty{#1}\kern\skiplinenumber}}\ignorespaces%
1329   }{%
1330     \sbox\algocf@nlbox{\NlSty{#1}}%
1331     \skiplinenumber=\hsize\advance\skiplinenumber by-\leftskip\advance\skiplinenumber by-\skiptext%
1332     \advance\skiplinenumber by\algomargin\advance\skiplinenumber by.3em\advance\skiplinenumber by-\wd\algocf@nlbox%
1333     % to handle particular case of until: printnl is after 'until' keyword has been writen, so we need to substract length of this keyword
1334     \advance\skiplinenumber by-\algocf@skipuntil%
1335     \strut\raisebox{0pt}{\rlap{\kern\skiplinenumber\NlSty{#1\ignorespaces}}}\ignorespaces%
1336   }%
1337 }%
1338 \newcommand{\algocf@nl@sethref}[1]{%
1339   \renewcommand{\theHAlgoLine}{\thealgocfproc.#1}%
1340   \hyper@refstepcounter{AlgoLine}\gdef\@currentlabel{#1}%
1341 }%
1342 \newcommand{\nl}{%
1343   \@ifundefined{hyper@refstepcounter}{% if not hyperref then do a simple refstepcounter
1344     \refstepcounter{AlgoLine}%
1345   }{% else if hyperref, do the anchor so 2 lines in two differents algorithms cannot have the same href
1346     \stepcounter{AlgoLine}\algocf@nl@sethref{\theAlgoLine}%
1347   }% now we can do the line numbering
1348   \algocf@printnl{\theAlgoLine}%
1349 }%
1350 %
1351 \newcommand{\nllabel}[1]{\label{#1}}%
1352 %
1353 \newcommand{\enl}{%
1354   \@ifundefined{hyper@refstepcounte}{% if not hyperref then do a simple refstepcounter
1355     \refstepcounter{AlgoLine}%
1356   }{% else if hyperref, do the anchor so 2 lines in two differents algorithms cannot have the same href
1357     \stepcounter{AlgoLine}\algocf@nl@sethref{\theAlgoLine}%
1358   }% now we can do the line numbering
1359   \skiplinenumber=\hsize\advance\skiplinenumber by-\leftskip%
1360   \strut\raisebox{0pt}{\rlap{\kern\skiplinenumber\strut\NlSty{\theAlgoLine}}}\ignorespaces%
1361 }%
1362 %% nlset
1363 \newcommand{\nlset}[1]{%
1364   \@ifundefined{hyper@refstepcounter}{\protected@edef\@currentlabel{#1}}{\algocf@nl@sethref{#1}}\algocf@printnl{#1}%
1365 }%
1366 %
1367 %% lnl definitions
1368 \newcommand{\lnl}[1]{\nl\label{#1}\ignorespaces}%
1369 %
1370 %% lnlset
1371 \newcommand{\lnlset}[2]{\nlset{#2}\label{#1}}%
1372 %
1373 % set char put at end of each line
1374 %
1375 \newcommand{\algocf@endline}{\string;}
1376 \newcommand{\SetEndCharOfAlgoLine}[1]{\renewcommand{\algocf@endline}{#1}}
1377 %
1378 % end of line definition
1379 %
1380 \newcommand{\@endalgocfline}{\algocf@endline}% default definition: printsemicolon
1381 \newcommand{\DontPrintSemicolon}{\renewcommand{\@endalgocfline}{\relax}}%
1382 \newcommand{\PrintSemicolon}{\renewcommand{\@endalgocfline}{\algocf@endline}}%
1383 \newcommand{\@endalgoln}{\@endalgocfline\hfill\strut\par}%
1384 %
1385 % line numbering
1386 %
1387 \newcommand{\LinesNumbered}{\setboolean{algocf@linesnumbered}{true}\renewcommand{\algocf@linesnumbered}{\everypar={\nl}}}%
1388 \newcommand{\LinesNotNumbered}{%
1389   \setboolean{algocf@linesnumbered}{false}%
1390   \renewcommand{\algocf@linesnumbered}{\relax}%
1391 }%
1392 %
1393 \newcommand{\LinesNumberedHidden}{%
1394   \setboolean{algocf@linesnumbered}{true}\renewcommand{\algocf@linesnumbered}{\everypar{\stepcounter{AlgoLine}}}}%
1395 \newcommand{\ShowLn}{\nlset{\theAlgoLine}\ignorespaces}% display the line number on this line (without labelling)
1396 \newcommand{\ShowLnLabel}[1]{\lnlset{#1}{\theAlgoLine}\ignorespaces}% display the line number and label this line
1397 %
1398 %%
1399 %
1400 %%
1401 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1402 %
1403 % Styling text commands
1404 %
1405 \newcommand{\AlFnt}{\relax}% default definition
1406 \newcommand{\SetAlFnt}[1]{\renewcommand{\AlFnt}{#1}}%
1407 \newcommand{\AlTitleFnt}{\relax}% default definition
1408 \newcommand{\SetAlTitleFnt}[1]{\renewcommand{\AlTitleFnt}{#1}}%
1409 %
1410 \newcommand{\AlCapFnt}{\relax}% default definition
1411 \newcommand{\SetAlCapFnt}[1]{\renewcommand{\AlCapFnt}{#1}}%
1412 \newcommand{\AlCapNameFnt}{\relax}% default definition
1413 \newcommand{\SetAlCapNameFnt}[1]{\renewcommand{\AlCapNameFnt}{#1}}%
1414 %
1415 \newcommand{\ProcFnt}{\relax}% default definition
1416 \newcommand{\SetProcFnt}[1]{\renewcommand{\ProcFnt}{#1}}%
1417 \newcommand{\ProcNameFnt}{\relax}% default definition
1418 \newcommand{\SetProcNameFnt}[1]{\renewcommand{\ProcNameFnt}{#1}}%
1419 \newcommand{\ProcArgFnt}{\relax}% default definition
1420 \newcommand{\SetProcArgFnt}[1]{\renewcommand{\ProcArgFnt}{#1}}%
1421 %
1422 \newcommand{\AlTitleSty}[1]{\textbf{#1}\unskip}% default definition
1423 \newcommand{\SetAlTitleSty}[1]{\renewcommand{\AlTitleSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1424 \newcommand{\AlCapSty}[1]{\textnormal{\textbf{#1}}\unskip}% default definition
1425 \newcommand{\SetAlCapSty}[1]{\renewcommand{\AlCapSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1426 \newcommand{\AlCapNameSty}[1]{\textnormal{#1}\unskip}% default definition
1427 \newcommand{\SetAlCapNameSty}[1]{\renewcommand{\AlCapNameSty}[1]{\textnormal{\csname #1\endcsname{##1}}\unskip}}%
1428 %
1429 \newcommand{\ProcSty}[1]{\AlCapSty{#1}}%
1430 \newcommand{\SetProcSty}[1]{\renewcommand{\ProcSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1431 \newcommand{\ProcNameSty}[1]{\AlCapNameSty{#1}}%
1432 \newcommand{\SetProcNameSty}[1]{\renewcommand{\ProcNameSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1433 \newcommand{\ProcArgSty}[1]{\AlCapNameSty{#1}}%
1434 \newcommand{\SetProcArgSty}[1]{\renewcommand{\ProcArgSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1435 %
1436 \newcommand{\KwSty}[1]{\textnormal{\textbf{#1}}\unskip}% default definition
1437 \newcommand{\SetKwSty}[1]{\renewcommand{\KwSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1438 \newcommand{\ArgSty}[1]{\textnormal{\emph{#1}}\unskip}%\SetArgSty{emph}
1439 \newcommand{\SetArgSty}[1]{\renewcommand{\ArgSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1440 \newcommand{\FuncSty}[1]{\textnormal{\texttt{#1}}\unskip}%\SetFuncSty{texttt}
1441 \newcommand{\SetFuncSty}[1]{\renewcommand{\FuncSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1442 \newcommand{\DataSty}[1]{\textnormal{\textsf{#1}}\unskip}%%\SetDataSty{textsf}
1443 \newcommand{\SetDataSty}[1]{\renewcommand{\DataSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1444 \newcommand{\CommentSty}[1]{\textnormal{\texttt{#1}}\unskip}%%\SetDataSty{texttt}
1445 \newcommand{\SetCommentSty}[1]{\renewcommand{\CommentSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1446 \newcommand{\TitleSty}[1]{#1\unskip}%\SetTitleSty{}{}
1447 \newcommand{\SetTitleSty}[2]{\renewcommand{\TitleSty}[1]{%
1448 \csname#1\endcsname{\csname#2\endcsname##1}}\unskip}%
1449 \newcommand{\BlockMarkersSty}[1]{\KwSty{#1}}%
1450 \newcommand{\SetBlockMarkersSty}[1]{\renewcommand{\BlockMarkersSty}[1]{\textnormal{\csname#1\endcsname{##1}}\unskip}}%
1451 %
1452 %%
1453 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1454 %
1455 % Block basic commands
1456 %
1457 \newcommand{\algocf@push}[1]{\advance\skiptotal by #1\moveright #1}%
1458 \newcommand{\algocf@pop}[1]{\advance\skiptotal by -#1}%
1459 \newcommand{\algocf@addskiptotal}{\advance\skiptotal by 0.4pt\advance\hsize by -0.4pt\advance\hsize by -\skiplength}% 0.4 pt=width of \vrule
1460 \newcommand{\algocf@subskiptotal}{\advance\skiptotal by -0.4pt\advance\hsize by 0.4pt\advance\hsize by \skiplength}% 0.4 pt=width of \vrule
1461 %
1462 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1463 %%
1464 %% group of instructions definition
1465 %
1466 \skiphlne=.8ex%
1467 \newcommand{\SetVlineSkip}[1]{\skiphlne=#1}%
1468 \newcommand{\algocf@bblock}{\BlockMarkersSty{begin}}%
1469 \newcommand{\algocf@eblock}{\BlockMarkersSty{end}}%
1470 \newcommand{\AlgoDisplayBlockMarkers}{\setboolean{algocf@displayblockmarkers}{true}}%
1471 \newcommand{\AlgoDontDisplayBlockMarkers}{\setboolean{algocf@displayblockmarkers}{false}}%
1472 \newcommand{\algocf@bblockcode}{%
1473   \ifthenelse{\boolean{algocf@displayblockmarkers}}{\algocf@bblock\par}{\relax}%
1474 }%
1475 \newcommand{\algocf@eblockcode}{%
1476   \ifthenelse{\boolean{algocf@displayblockmarkers}}{\algocf@eblock\par}{\relax}%
1477 }%
1478 \newcommand{\SetAlgoBlockMarkers}[2]{%
1479   \ifArgumentEmpty{#1}{%
1480     \renewcommand{\algocf@bblock}{\relax}%
1481   }{%
1482     \renewcommand{\algocf@bblock}{\BlockMarkersSty{#1}}%
1483   }% begin marker set
1484   \ifArgumentEmpty{#2}{%
1485     \renewcommand{\algocf@eblock}{\relax}%
1486   }{%
1487     \renewcommand{\algocf@eblock}{\BlockMarkersSty{#2}}%
1488   }% end marker set
1489 }
1490 %
1491 %%%%%%%%% block with a vertical line end by a little horizontal line
1492 \newcommand{\algocf@Vline}[1]{%     no vskip in between boxes but a strut to separate them, 
1493   \strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
1494   \algocf@push{\skiprule}%        move to the right before the vertical rule
1495   \hbox{\vrule%
1496     \vtop{\algocf@push{\skiptext}%move the right after the rule
1497       \vtop{\algocf@addskiptotal #1}\Hlne}}\vskip\skiphlne% inside the block
1498   \algocf@pop{\skiprule}%\algocf@subskiptotal% restore indentation
1499   \nointerlineskip}% no vskip after
1500 %
1501 %%%%%%%%% block with a vertical line
1502 \newcommand{\algocf@Vsline}[1]{%    no vskip in between boxes but a strut to separate them, 
1503   \strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
1504   \algocf@bblockcode%
1505   \algocf@push{\skiprule}%        move to the right before the vertical rule
1506   \hbox{\vrule%               the vertical rule
1507     \vtop{\algocf@push{\skiptext}%move the right after the rule
1508       \vtop{\algocf@addskiptotal #1}}}% inside the block
1509   \algocf@pop{\skiprule}% restore indentation
1510   \algocf@eblockcode%
1511 }
1512 %
1513 \newcommand{\algocf@Hlne}{\hrule height 0.4pt depth 0pt width .5em}%
1514 %
1515 %%%%%%%%%  block without line
1516 \newcommand{\algocf@Noline}[1]{%    no vskip in between boxes but a strut to separate them, 
1517   \strut\par\nointerlineskip% then interblock space stay the same whatever is inside it
1518   \algocf@bblockcode%
1519   \algocf@push{\skiprule}%
1520   \hbox{%
1521     \vtop{\algocf@push{\skiptext}%
1522       \vtop{\algocf@addskiptotal #1}}}% inside the block
1523   \algocf@pop{\skiprule}%
1524   \algocf@eblockcode%
1525   % \nointerlineskip% no vskip after
1526 }%
1527 %%%%%%%%%
1528 %
1529 %% default=NoLine
1530 %
1531 \newcommand{\algocf@group}[1]{\algocf@Noline{#1}}% group: set of instruction depending from another (ex: then part of the If)
1532 \newcommand{\algocf@@@block}[2]{#1\ifArgumentEmpty{#2}{\relax}{\KwSty{\@algocf@endoption{#2}}\strut\par}}% block: group with a end keyword.
1533 \newcommand{\algocf@@block}[2]{\algocf@@@block{#1}{#2}}% block: group with a end keyword.
1534 \newcommand{\algocf@block}[2]{\algocf@@block{#1}{#2}}% command that will be used and redefined accordingly to noend option
1535 \newcommand{\algocf@setBlock}{%
1536   \ifthenelse{\boolean{algocf@optnoend}}{%     if no end option
1537     \renewcommand{\algocf@block}[2]{\algocf@group{##1}}%     block will be a group
1538   }{%                                          else
1539     \renewcommand{\algocf@block}[2]{\algocf@@block{##1}{##2}}% block stays a block
1540   }%
1541 }%
1542 %
1543 \newcommand{\Hlne}{}% little hrizontal line ending a block in vline mode
1544 %
1545 \newcommand{\@algocf@endoption}[1]{#1}%
1546 \newboolean{algocf@optnoend}\setboolean{algocf@optnoend}{false}%
1547 %
1548 \newcommand{\SetAlgoLongEnd}{%%%%%%%%%%%%%%%%%%%%%%%%% Long End
1549   \setboolean{algocf@optnoend}{false}%
1550   \renewcommand{\@algocf@endoption}[1]{##1}%
1551   \algocf@setBlock}%
1552 %
1553 \newcommand{\SetAlgoShortEnd}{%%%%%%%%%%%%%%%%%%%%%%%% ShortEnd
1554   \setboolean{algocf@optnoend}{false}%
1555   \renewcommand{\@algocf@endoption}[1]{\@firstword##1 \@nil}%
1556   \algocf@setBlock}%
1557 %
1558 \newcommand{\SetAlgoNoEnd}{%%%%%%%%%%%%%%%%%%%%%%%%%%% NoEnd
1559   \setboolean{algocf@optnoend}{true}%
1560   \renewcommand{\@algocf@endoption}[1]{}%
1561   \algocf@setBlock}%
1562 %
1563 \newcommand{\SetAlgoNoLine}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Noline
1564 \renewcommand{\algocf@@block}[2]{\algocf@@@block{\algocf@Noline{##1}}{##2}}%
1565 \renewcommand{\algocf@group}[1]{\algocf@Noline{##1}}%
1566 \renewcommand{\Hlne}{}}%
1567 %
1568 \newcommand{\SetAlgoVlined}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Vline
1569 \renewcommand{\algocf@@block}[2]{\algocf@Vline{##1}}%
1570 \renewcommand{\algocf@group}[1]{\algocf@Vsline{##1}}%\ifthenelse{\boolean{algocf@optnoend}}{\relax}{\strut\ignorespaces}}%
1571 \renewcommand{\Hlne}{\algocf@Hlne}}%
1572 %
1573 \newcommand{\SetAlgoLined}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Line
1574 \renewcommand{\algocf@@block}[2]{\algocf@@@block{\strut\algocf@Vsline{##1}}{##2}}% no skip after a block so garantie at least one line
1575 \renewcommand{\algocf@group}[1]{\algocf@Vsline{##1}}%\ifthenelse{\boolean{algocf@optnoend}}{\relax}{\strut\ignorespaces}}%
1576 \renewcommand{\Hlne}{}}%
1577 %
1578 \newcommand{\SetNothing}{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Noline
1579 \renewcommand{\algocf@@block}[2]{\algocf@Noline{##1}\par}%
1580 %\long
1581 \renewcommand{\algocf@group}[1]{\algocf@Noline{##1}}%
1582 \renewcommand{\Hlne}{}}%
1583 %
1584 %%
1585 %%
1586 %
1587 %
1588 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1589 %
1590 % ``Input:'''s like command 
1591 %
1592 %%%
1593 % text staying at the right of the longer keyword of KwInOut commands 
1594 % (text of KwInOut commands are all vertically aligned)
1595 %
1596 \newcommand{\algocf@newinout}{\par\parindent=\inoutindent}% to put right indentation after a \\ in the KwInOut
1597 \newcommand{\SetKwInOut}[2]{%
1598   \sbox\algocf@inoutbox{\KwSty{#2}\algocf@typo:}%
1599   \expandafter\ifx\csname InOutSizeDefined\endcsname\relax% if first time used
1600     \newcommand\InOutSizeDefined{}\setlength{\inoutsize}{\wd\algocf@inoutbox}%
1601     \sbox\algocf@inoutbox{\parbox[t]{\inoutsize}{\KwSty{#2}\algocf@typo\hfill:}~}\setlength{\inoutindent}{\wd\algocf@inoutbox}%
1602   \else% else keep the larger dimension
1603     \ifdim\wd\algocf@inoutbox>\inoutsize%
1604     \setlength{\inoutsize}{\wd\algocf@inoutbox}%
1605     \sbox\algocf@inoutbox{\parbox[t]{\inoutsize}{\KwSty{#2}\algocf@typo\hfill:}~}\setlength{\inoutindent}{\wd\algocf@inoutbox}%
1606     \fi%
1607   \fi% the dimension of the box is now defined.
1608   \algocf@newcommand{#1}[1]{%
1609     \ifthenelse{\boolean{algocf@inoutnumbered}}{\relax}{\everypar={\relax}}%
1610 %     {\let\\\algocf@newinout\hangindent=\wd\algocf@inoutbox\hangafter=1\parbox[t]{\inoutsize}{\KwSty{#2}\algocf@typo\hfill:}~##1\par}%
1611     {\let\\\algocf@newinout\hangindent=\inoutindent\hangafter=1\parbox[t]{\inoutsize}{\KwSty{#2}\algocf@typo\hfill:}~##1\par}%
1612     \algocf@linesnumbered% reset the numbering of the lines
1613   }}%
1614 %
1615 %% allow to ajust the skip size of InOut
1616 %%
1617 \newcommand{\ResetInOut}[1]{%
1618   \sbox\algocf@inoutbox{\hbox{\KwSty{#1}\algocf@typo:\ }}%
1619   \setlength{\inoutsize}{\wd\algocf@inoutbox}%
1620   }%
1621 %
1622
1623 %%%
1624 % text staying at the right of the keyword.
1625 %
1626 \newcommand{\algocf@newinput}{\par\parindent=\wd\algocf@inputbox}% to put right indentation after a \\ in the KwInput
1627 \newcommand{\SetKwInput}[2]{%
1628   \algocf@newcommand{#1}[1]{%
1629     \sbox\algocf@inputbox{\hbox{\KwSty{#2}\algocf@typo: }}%
1630     \ifthenelse{\boolean{algocf@inoutnumbered}}{\relax}{\everypar={\relax}}%
1631     {\let\\\algocf@newinput\hangindent=\wd\algocf@inputbox\hangafter=1\unhbox\algocf@inputbox##1\par}%
1632     \algocf@linesnumbered% reset the numbering of the lines
1633   }}%
1634 \newcommand{\SetKwData}[2]{%
1635   \algocf@newcommand{@#1}[1]{\DataSty{#2(}\ArgSty{##1}\DataSty{)}}%
1636   \algocf@newcommand{#1}{%
1637     \@ifnextchar\bgroup{\csname @#1\endcsname}{\DataSty{#2}\xspace}}%
1638   }%
1639 %
1640 %
1641 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1642 % tallent:
1643 %
1644 % Add following macros:
1645 %   \SetKwHangingKw:  [kw] ------------   <= hanging determined by [kw]
1646 %                          ------------
1647 % Should act like a combination of \SetKwInput and \SetKw.
1648 % Based on \SetKwInput:
1649 %   - remove ':' at end of keyword
1650 %   - do not reset numbering
1651 %   - use separate savebox
1652 \newsavebox{\algocf@hangingbox}
1653 \newcommand{\algocf@newhanging}{\par\parindent=\wd\algocf@hangingbox}% to put right indentation after a \\ in the KwInput
1654 \newcommand{\SetKwHangingKw}[2]{%
1655   \algocf@newcommand{#1}[1]{%
1656     \sbox\algocf@hangingbox{\hbox{\KwSty{#2}\algocf@typo\ }}%
1657     {\let\\\algocf@newhanging\hangindent=\wd\algocf@hangingbox\hangafter=1\unhbox\algocf@hangingbox##1\;}%
1658   }%
1659 }%
1660 %
1661 %
1662 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1663 %
1664 % Comments macros
1665 %
1666 %%%%
1667 % comment in the text, first argument is the name of the macro, second is
1668 % the text put before the comment, third is the text put at the end of the
1669 % comment.
1670 %
1671 % first side comment justification
1672 \newcommand{\SetSideCommentLeft}{\setboolean{algocf@scleft}{true}}%
1673 \newcommand{\SetSideCommentRight}{\setboolean{algocf@scleft}{false}}%
1674 \newcommand{\SetNoFillComment}{\setboolean{algocf@optfillcomment}{false}}%
1675 \newcommand{\SetFillComment}{\setboolean{algocf@optfillcomment}{true}}%
1676 %
1677 % next comment and side comment
1678 %
1679 \newcommand{\algocf@endmarkcomment}{\relax}%
1680 \newcommand{\algocf@fillcomment}{%
1681   \ifthenelse{\boolean{algocf@optfillcomment}}{\hfill}{\relax}}%
1682 %
1683 \newcommand{\algocf@startcomment}{%
1684   \hangindent=\wd\algocf@inputbox\hangafter=1\usebox\algocf@inputbox}%
1685 \newcommand{\algocf@endcomment}{\algocf@fillcomment\algocf@endmarkcomment\ignorespaces\par}%
1686 \newcommand{\algocf@endstartcomment}{\algocf@endcomment\algocf@startcomment\ignorespaces}%
1687 %
1688 \newboolean{algocf@sidecomment}%
1689 \newboolean{algocf@altsidecomment}\setboolean{algocf@altsidecomment}{false}%
1690 \newcommand{\algocf@scpar}{\ifthenelse{\boolean{algocf@altsidecomment}}{\relax}{\par}}%
1691 \newcommand{\algocf@sclfill}{\ifthenelse{\boolean{algocf@scleft}}{\algocf@fillcomment}{\relax}}%
1692 \newcommand{\algocf@scrfill}{\ifthenelse{\boolean{algocf@scleft}}{\relax}{\hfill}}%
1693 \newcommand{\algocf@startsidecomment}{\usebox\algocf@inputbox}%
1694 \newcommand{\algocf@endsidecomment}{\algocf@endmarkcomment\algocf@scpar}%
1695 \newcommand{\algocf@endstartsidecomment}{%
1696   \algocf@sclfill\algocf@endsidecomment%
1697   \algocf@scrfill\algocf@startsidecomment\ignorespaces}%
1698 %
1699 \newcommand{\SetKwComment}[3]{%
1700   \algocf@newcommand{#1}{\@ifstar{\csname algocf@#1@star\endcsname}{\csname algocf@#1\endcsname}}%
1701         \algocf@newcommand{algocf@#1}[1]{%
1702     \sbox\algocf@inputbox{\CommentSty{\hbox{#2}}}%
1703     \ifthenelse{\boolean{algocf@commentsnumbered}}{\relax}{\everypar={\relax}}%
1704     {\renewcommand{\algocf@endmarkcomment}{#3}%
1705       \let\\\algocf@endstartcomment%
1706       \algocf@startcomment\CommentSty{%
1707         \strut\ignorespaces##1\strut\algocf@fillcomment#3}\par}%
1708     \algocf@linesnumbered% reset the numbering of the lines
1709   }%
1710   %%% side comment definitions
1711         \algocf@newcommand{algocf@#1@star}[2][]{%
1712                 \ifArgumentEmpty{##1}\relax{% TODO: Is this even necessary, with all those \ifx's?
1713                         \ifthenelse{\boolean{algocf@scleft}}{\setboolean{algocf@sidecomment}{true}}{\setboolean{algocf@sidecomment}{false}}%
1714                         \ifx##1h\setboolean{algocf@altsidecomment}{true}\SetSideCommentLeft\fi%
1715                         \ifx##1f\setboolean{algocf@altsidecomment}{true}\SetSideCommentRight\fi%
1716                         \ifx##1l\setboolean{algocf@altsidecomment}{false}\SetSideCommentLeft\fi%
1717                         \ifx##1r\setboolean{algocf@altsidecomment}{false}\SetSideCommentRight\fi%
1718                 }%
1719     \sbox\algocf@inputbox{\CommentSty{\hbox{#2}}}%
1720     \ifthenelse{\boolean{algocf@commentsnumbered}}{\relax}{\everypar={\relax}}%
1721     {%
1722       \renewcommand{\algocf@endmarkcomment}{#3}%
1723       \let\\\algocf@endstartsidecomment%
1724       % here is the comment
1725       \ifthenelse{\boolean{algocf@altsidecomment}}{\relax}{\@endalgocfline\ }%
1726       \algocf@scrfill\algocf@startsidecomment\CommentSty{%
1727         \strut\ignorespaces##2\strut\algocf@sclfill#3}\algocf@scpar%
1728     }%
1729     \algocf@linesnumbered% reset the numbering of the lines
1730                 \ifArgumentEmpty{##1}\relax{%
1731                         \ifthenelse{\boolean{algocf@sidecomment}}{\setboolean{algocf@scleft}{true}}{\setboolean{algocf@scleft}{false}}%
1732                         \setboolean{algocf@altsidecomment}{false}%
1733                 }%
1734         }%
1735 }%
1736 %
1737 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1738 %
1739 % KwProg
1740 %
1741 \newcommand{\SetKwProg}[4]{%
1742         \algocf@newcmdside{#1} 3{\KwSty{#2}\ifArgumentEmpty{#2}\relax{\ }\ArgSty{##2}\KwSty{#3}\ifArgumentEmpty{##1}\relax{ ##1}\algocf@block{##3}{#4}}%
1743         \algocf@newcmdside{l#1}3{\KwSty{#2} \ArgSty{##2}\KwSty{#3} ##3\@endalgocfline\ifArgumentEmpty{##1}\relax{##1}\strut\par}%
1744 }%
1745 %
1746 %
1747 %
1748 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1749 %
1750 % Kw
1751 %
1752 \newcommand{\SetKw}[2]{%
1753         \algocf@newcommand{@#1}[1]{\KwSty{#2} \ArgSty{##1}}
1754         \algocf@newcommand{#1}{\@ifnextchar\bgroup{\csname @#1\endcsname}{\KwSty{#2}\xspace}}%
1755 }%
1756 %
1757 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1758 %
1759 % KwFunction
1760 %
1761 \newcommand{\SetKwFunction}[2]{%
1762 %%% use of gdef since newcommand doesn't manage to define the macro when SetKwFunction is used in \algocf@caption@proc
1763   \expandafter\gdef\csname @#1\endcsname##1{\FuncSty{#2(}\ArgSty{##1}\FuncSty{)}}%
1764   \expandafter\gdef\csname#1\endcsname{%
1765     \@ifnextchar\bgroup{\csname @#1\endcsname}{\FuncSty{#2}\xspace}}%
1766 }%
1767 %
1768 %
1769 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1770 %
1771 % KwTab
1772 %
1773 \newcommand{\SetKwArray}[2]{%
1774 %%% use of gdef since newcommand doesn't manage to define the macro when SetKwFunction is used in \algocf@caption@proc
1775   \expandafter\gdef\csname @#1\endcsname##1{\DataSty{#2[}\ArgSty{##1}\DataSty{]}}%
1776   \expandafter\gdef\csname#1\endcsname{%
1777     \@ifnextchar\bgroup{\csname @#1\endcsname}{\DataSty{#2}\xspace}}%
1778 }%
1779 %
1780 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1781 %
1782 % KwBlock
1783 %
1784 \newcommand{\SetKwBlock}[3]{%
1785         \algocf@newcmdside{#1}{2}
1786                 {\KwSty{#2}\ifArgumentEmpty{##1}\relax{ ##1}\algocf@block{##2}{#3}\par}
1787 }%
1788 %
1789 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1790 %
1791 % condition typo
1792 %
1793 \newcommand{\algocf@scond}{ }
1794 \newcommand{\algocf@econd}{ }
1795 \newcommand{\algocf@ucond}{}
1796 \newcommand{\SetStartEndCondition}[3]{%
1797   \renewcommand{\algocf@scond}{#1}\renewcommand{\algocf@econd}{#2}\renewcommand{\algocf@ucond}{#3}}
1798 %
1799 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1800 %
1801 % For Switch
1802 %
1803 \newcommand{\SetKwSwitch}[9]{% #1=\Switch #2=\Case #3=\Other #4=switch #5=do #6=case #7=otherwise #8=endcase #9=endsw
1804         \algocf@newcmdside{#1}{3}
1805                 {\KwSty{#4}\algocf@scond\ArgSty{##2}\algocf@econd\KwSty{#5}\ifArgumentEmpty{##1}\relax{ ##1}\algocf@block{##3}{#9}}
1806 %%%% Case
1807         \algocf@newcmdside{#2}{3}{\KwSty{#6}\algocf@scond\ArgSty{##2}\algocf@ucond\ifArgumentEmpty{##1}\relax{ ##1}\algocf@block{##3}{#8}}%
1808         \algocf@newcmdside{u#2}{3}{\KwSty{#6}\algocf@scond\ArgSty{##2}\algocf@ucond\ifArgumentEmpty{##1}\relax{ ##1}\algocf@group{##3}}%
1809         \algocf@newcmdside{l#2}{3}{\KwSty{#6}\algocf@scond\ArgSty{##2}\algocf@ucond\ ##3\@endalgocfline\ifArgumentEmpty{##1}\relax{ ##1}\strut\par}%
1810 %%%% Other 
1811         \algocf@newcmdside{#3}{2}{\KwSty{#7}\ifArgumentEmpty{##1}\relax{ ##1}\algocf@block{##2}{#8}}%
1812         \algocf@newcmdside{l#3}{2}{\KwSty{#7}\ ##2\@endalgocfline\ifArgumentEmpty{##1}\relax{ ##1}\strut\par}%
1813 }%
1814 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1815 %
1816 % If macros
1817 %
1818 \newcommand{\SetKwIF}[8]{% #1=\If #2=\ElseIf #3=\Else #4=if #5=then #6=elseif #7=else #8=endif
1819
1820 % common text
1821         \algocf@newcommand{#1@ifthen}[1]{\KwSty{#4}\algocf@scond\ArgSty{##1}\algocf@econd\KwSty{#5}}%
1822         \algocf@newcommand{#1@endif} [1]{\algocf@block{##1}{#8}}%
1823         \algocf@newcommand{#1@noend} [1]{\algocf@group{##1}}%
1824         \algocf@newcommand{#1@else}  [1]{\algocf@group{##1}\KwSty{#7}}%
1825         \algocf@newcommand{#2@elseif}[1]{\KwSty{#6}\algocf@scond\ArgSty{##1}\algocf@econd\KwSty{#5}}%
1826         \algocf@newcommand{#3@else}     {\KwSty{#7}}%
1827 %%%% If then { } endif
1828         \algocf@newcmdside{#1}3{\csname #1@ifthen\endcsname{##2}\ifArgumentEmpty{##1}\relax{ ##1}\csname #1@endif\endcsname{##3}}%
1829 %%%% If then {} else {} endif
1830     % first command to handle optional side comment of else (so just after first braces)
1831         \algocf@newcmdside{algocf@e#1thenelse}2{\ifArgumentEmpty{##1}\relax{ ##1}\csname #1@endif\endcsname{##2}}
1832     % the definition of if-then-else command using command above 
1833         \algocf@newcmdside{e#1}3{\csname #1@ifthen\endcsname{##2}\ifArgumentEmpty{##1}\relax{ ##1}\csname #1@else\endcsname{##3}\csname algocf@e#1thenelse\endcsname}%
1834     %%% leif
1835     \algocf@newcmdside{le#1}4{\csname #1@ifthen\endcsname{##2} ##3 \csname #3@else\endcsname\ ##4\@endalgocfline\ifArgumentEmpty{##1}\relax{##1}\strut\par}
1836 %%%% If then 
1837         \algocf@newcmdside{l#1}3{\csname #1@ifthen\endcsname{##2} ##3\@endalgocfline\ifArgumentEmpty{##1}\relax{##1}\strut\par}%
1838         \algocf@newcmdside{u#1}3{\csname #1@ifthen\endcsname{##2}\ifArgumentEmpty{##1}\relax{ ##1}\csname #1@noend\endcsname{##3}}%
1839 %%%% ElseIf {} endif
1840         \algocf@newcmdside{#2} 3{\csname #2@elseif\endcsname{##2}\relax\ifArgumentEmpty{##1}\relax{ ##1}\csname #1@endif\endcsname{##3}}%
1841 %%%% ElseIf
1842         \algocf@newcmdside{l#2}3{\csname #2@elseif\endcsname{##2} ##3\@endalgocfline\ifArgumentEmpty{##1}\relax{##1}\strut\par}%
1843         \algocf@newcmdside{u#2}3{\csname #2@elseif\endcsname{##2}\relax\ifArgumentEmpty{##1}\relax{ ##1}\csname #1@noend\endcsname{##3}}%
1844 %%%% Else {} endif
1845         \algocf@newcmdside{#3} 2{\csname #3@else\endcsname\ifArgumentEmpty{##1}\relax\ ##1\csname #1@endif\endcsname{##2}}%
1846 %%%% Else 
1847         \algocf@newcmdside{l#3}2{\csname #3@else\endcsname\ ##2\@endalgocfline\ifArgumentEmpty{##1}\relax{##1}\strut\par}%
1848         \algocf@newcmdside{u#3}2{\csname #3@else\endcsname     \ifArgumentEmpty{##1}\relax{\                ##1\relax}\csname #1@noend\endcsname{##2}}%
1849 }% 
1850 %
1851 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1852 %
1853 % For macros
1854 %
1855 \newcommand{\SetKwFor}[4]{%
1856         \algocf@newcmdside{#1} 3{\KwSty{#2}\algocf@scond\ArgSty{##2}\algocf@econd\KwSty{#3}\ifArgumentEmpty{##1}\relax{ ##1}\algocf@block{##3}{#4}}%
1857         \algocf@newcmdside{l#1}3{\KwSty{#2}\algocf@scond\ArgSty{##2}\algocf@econd\KwSty{#3} ##3\@endalgocfline\ifArgumentEmpty{##1}\relax{##1}\strut\par}%
1858 }%
1859 %
1860 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1861 %
1862 % Repeat macros
1863 %
1864 \newsavebox{\algocf@untilbox}% to handle width of until keyword needed to have good skip
1865   % for line numbers
1866 \newskip\algocf@skipuntil
1867 \newcommand{\SetKwRepeat}[3]{%
1868         \algocf@newcmdsides{#1}{3}{%
1869       \sbox\algocf@untilbox{\KwSty{#3}\algocf@scond}\algocf@skipuntil=\wd\algocf@untilbox%
1870       \KwSty{#2}\ifArgumentEmpty{##1}\relax{##1}\algocf@group{##3}%
1871       \KwSty{#3}\algocf@scond% until keyword and start condition typo
1872       \advance\skiptotal by\algocf@skipuntil%
1873       \ArgSty{##2}%
1874       \advance\skiptotal by-\algocf@skipuntil%
1875       \algocf@ucond%
1876       \algocf@skipuntil=0pt% reset counter
1877     }{\@endalgocfline}{\strut\par}%
1878         \algocf@newcmdside{l#1}3{\KwSty{#2} ##3 \KwSty{#3}\algocf@scond\ArgSty{##2}\algocf@ucond\@endalgocfline\ifArgumentEmpty{##1}\relax{ ##1}\strut\par}%
1879 }%
1880 %
1881
1882 %
1883 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1884 %%%%%%%%%%%%%%%%%%%%        Environments definitions     %%%%%%%%%%%%%%%%%%%%%%%%%%%%
1885 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1886 %
1887 %%
1888 %% Caption management
1889 %%
1890 % for the following macros:
1891 % #1 is given by caption and is equal to fnum@algocf
1892 % #2 is the text given in argument by the user in the \caption macro
1893 %
1894 %%%%% text of caption
1895 \newcommand{\algocf@captionlayout}[1]{#1}%
1896 \newcommand{\SetAlgoCaptionLayout}[1]{%
1897   \renewcommand{\algocf@captionlayout}[1]{\csname #1\endcsname{##1}}}%
1898 \newcommand{\algocf@capseparator}{:}%
1899 \newcommand{\SetAlgoCaptionSeparator}[1]{\renewcommand{\algocf@capseparator}{#1}}%
1900 \newcommand{\algocf@captiontext}[2]{%
1901   \algocf@captionlayout{\AlCapSty{\AlCapFnt #1\algocf@typo\algocf@capseparator}\nobreakspace%
1902     \AlCapNameSty{\AlCapNameFnt{}#2}}}% text of caption
1903 %
1904 %%%%% default caption of algorithm: used if no specific style caption is defined
1905 \newcommand{\algocf@makecaption}[2]{%
1906   \addtolength{\hsize}{\algomargin}%
1907   \sbox\@tempboxa{\algocf@captiontext{#1}{#2}}%
1908   \ifdim\wd\@tempboxa >\hsize%     % if caption is longer than a line
1909     \hskip .5\algomargin%
1910     \parbox[t]{\hsize}{\algocf@captiontext{#1}{#2}}% then caption is not centered
1911   \else%
1912     \global\@minipagefalse%
1913     \hbox to\hsize{\hfil\box\@tempboxa\hfil}% else caption is centered
1914   \fi%
1915   \addtolength{\hsize}{-\algomargin}%
1916 }%
1917 %
1918 \newsavebox\algocf@capbox%
1919 \newcommand{\algocf@makecaption@plain}[2]{%
1920   \global\sbox\algocf@capbox{\algocf@makecaption{#1}{#2}}}%
1921 \newcommand{\algocf@makecaption@boxed}[2]{%
1922   \addtolength{\hsize}{-\algomargin}%
1923   \global\sbox\algocf@capbox{\algocf@makecaption{#1}{#2}}%
1924   \addtolength{\hsize}{\algomargin}%
1925  }%
1926 %
1927 \newcommand{\algocf@makecaption@plainruled}[2]{\algocf@makecaption@plain{#1}{#2}}%
1928 \newcommand{\algocf@makecaption@tworuled}[2]{\algocf@makecaption@ruled{#1}{#2}}%
1929 \newcommand{\algocf@makecaption@algoruled}[2]{\algocf@makecaption@ruled{#1}{#2}}%
1930 \newcommand{\algocf@makecaption@boxruled}[2]{\algocf@makecaption@ruled{#1}{#2}}%
1931 \newcommand{\algocf@makecaption@ruled}[2]{%
1932   \global\sbox\algocf@capbox{\hskip\AlCapHSkip% .5\algomargin%
1933     \parbox[t]{\hsize}{\algocf@captiontext{#1}{#2}}}% then caption is not centered
1934 }%
1935 %
1936 \newlength{\algoheightruledefault}\setlength{\algoheightruledefault}{0.8pt}%
1937 \newlength{\algoheightrule}\setlength{\algoheightrule}{\algoheightruledefault}%
1938 \newlength{\algotitleheightruledefault}\setlength{\algotitleheightruledefault}{0.8pt}%
1939 \newlength{\algotitleheightrule}\setlength{\algotitleheightrule}{\algotitleheightruledefault}%
1940 \newcommand{\algocf@caption@plain}{\vskip\AlCapSkip\box\algocf@capbox}%
1941 \newcommand{\algocf@caption@plainruled}{\algocf@caption@plain}%
1942 \newcommand{\algocf@caption@boxed}{\vskip\AlCapSkip\box\algocf@capbox}%
1943 \newcommand{\algocf@caption@ruled}{\box\algocf@capbox\kern\interspacetitleruled\hrule  height\algotitleheightrule depth0pt\kern\interspacealgoruled}%
1944 \newcommand{\algocf@caption@tworuled}{\box\algocf@capbox\hrule  height0pt depth0pt\kern\interspacealgoruled}%
1945 \newcommand{\algocf@caption@algoruled}{\algocf@caption@ruled}%
1946 \newcommand{\algocf@caption@boxruled}{%
1947   \addtolength{\hsize}{-0.8pt}%
1948   \hbox to\hsize{%
1949     \vrule%\hskip-0.35pt%
1950     \vbox{%
1951       \hrule\vskip\interspacetitleboxruled%
1952       \hbox to\hsize{\unhbox\algocf@capbox\hfill}\vskip\interspacetitleboxruled%
1953     }% 
1954     %\hskip-0.35pt%
1955     \vrule%
1956   }\nointerlineskip%
1957   \addtolength{\hsize}{0.8pt}%
1958 }%
1959 %
1960 %
1961 %%%% set caption for the environment
1962 \newcommand{\algocf@captionref}{%
1963   \renewcommand{\fnum@algocf}[1]{\AlCapSty{\AlCapFnt\algorithmcfname\nobreakspace\algocf@algocfref}}%
1964   \addtocounter{algocf}{-1}% \caption do a refstepcounter, so we restore the precedent value
1965   \let\old@thealgocf=\thealgocf\renewcommand{\thealgocf}{{\relsize{\algocf@refrelsize}\algocf@algocfref}}%
1966   \gdef\@currentlabel{\algocf@algocfref}% let the label use the new ref
1967 }%
1968 %
1969 % Unfortunatly, we also need our own caption to set some specific stuff for special references. But after these
1970 % settings, we call the original caption.
1971 %
1972 \long\def\algocf@caption@algo#1[#2]#3{%
1973   \ifthenelse{\equal{\algocf@algocfref}{\relax}}{}{\algocf@captionref}%
1974   \@ifundefined{hyper@refstepcounter}{\relax}{% if hyper@refstepcounter undefind, no hyperref, else...
1975     \ifthenelse{\equal{\algocf@algocfref}{\relax}}{\renewcommand{\theHalgocf}{\thealgocf}}{% take algocf as Href
1976       \renewcommand{\theHalgocf}{\algocf@algocfref}}%else if SetAlgoRefName done, take this name as ref.
1977     \hyper@refstepcounter{algocf}%set algocf as category of ref
1978   }%
1979    \algocf@latexcaption{#1}[{#2}]{{#3}}% call original caption
1980 }%
1981 %
1982 % beamer define is own caption overrinding latex caption!
1983 % as we need it, we have put here the original definition
1984 % to handle manual ref, unfortunately we have to add one line to handle algocf@algocfref
1985 \long\def\algocf@latexcaption#1[#2]#3{% original definition of caption
1986   \par%
1987   \addcontentsline{\csname ext@#1\endcsname}{#1}%
1988   {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}%
1989   \begingroup%
1990   \@parboxrestore%
1991   \if@minipage%
1992     \@setminipage%
1993   \fi%
1994   \normalsize%
1995   \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par%
1996   \endgroup%
1997 }%
1998 %
1999 % \ifx\beamer@makecaption\undefined%
2000 % \else% beamer detected
2001 \ifx\@makecaption\undefined%
2002 \newcommand{\@makecaption}[2]{\relax}%
2003 \fi%
2004 %%
2005
2006 %
2007 % more and more packages redefine \@caption instead of just \@makecaption which makes algorithm2e
2008 % caption not works since based on standard \@caption. So we force the definition of \@caption to be
2009 % the standard one (the one from LaTeX) inside algorithm environment.
2010 %
2011 % unfortunately, makecaption is called with \ignorespace #3 so 
2012 % we can't do the @currentlabel definition inside \algocf@captionproctext
2013 \long\def\algocf@caption@proc#1[#2]#3{%
2014   \ifthenelse{\boolean{algocf@nokwfunc}}{\relax}{%
2015     \SetKwFunction{\algocf@captname#3@}{\algocf@captname#3@}%
2016   }%
2017   % we tell hyperref to use algocfproc as category and to take the appropriate ref.
2018   \ifthenelse{\boolean{algocf@func}}{\def\@proc@func{algocffunc}}{\def\@proc@func{algocfproc}}%
2019   \@ifundefined{hyper@refstepcounter}{\relax}{% if hyper@refstepcounter undefind, no hyperref, else...
2020     \ifthenelse{\boolean{algocf@procnumbered}}{% 
2021       \expandafter\def\csname theH\@proc@func\endcsname{\algocf@captname#3@}%if procnumbered, take \thealgocf as ref
2022     }{%
2023       \expandafter\def\csname theH\@proc@func\endcsname{\algocf@captname#3@}%else take procedure or function name
2024     }%
2025     \hyper@refstepcounter{\@proc@func}%
2026   }%
2027   \ifthenelse{\boolean{algocf@procnumbered}}{\relax}{%
2028     \addtocounter{algocf}{-1}% \caption do a refstepcounter, so we restore the precedent value
2029     \gdef\@currentlabel{\algocf@captname#3@}% let the label be the name of the function, not the counter
2030   }%
2031   \ifthenelse{\equal{\algocf@captparam#2@}{\arg@e}}{% if no paramater, we remove the ()
2032     \algocf@latexcaption{#1}[\algocf@procname\nobreakspace\algocf@captname#2@]{#3}%
2033   }{%                                                 else we give the complete name
2034     \algocf@latexcaption{#1}[\algocf@procname\nobreakspace#2]{#3}%
2035   }%
2036 }%
2037 %%
2038 %%% setcaption
2039 \newcommand{\algocf@setcaption}{%
2040   \ifthenelse{\boolean{algocf@procenvironment}}{% if proc environment, caption text must be changed
2041     \let\algocf@oldcaptiontext=\algocf@captiontext%
2042     \renewcommand{\algocf@captiontext}[2]{%
2043       \algocf@captionproctext{##1}{##2}%
2044     }%
2045   }{}%
2046   \let\algocf@savecaption=\@caption%
2047   \ifthenelse{\boolean{algocf@procenvironment}}{\let\@caption=\algocf@caption@proc}{\let\@caption=\algocf@caption@algo}%
2048   \let\algocf@oldmakecaption=\@makecaption%
2049   \renewcommand{\@makecaption}[2]{%
2050     \expandafter\csname algocf@makecaption@\algocf@style\endcsname{##1}{##2}%
2051   }%
2052 }%
2053 %
2054 %%%%% reset caption
2055 %
2056 % since we have force the LaTeX caption for algorithm environment, we must go back to the caption
2057 % used in the text.
2058 \newcommand{\algocf@resetcaption}{%
2059   \ifthenelse{\boolean{algocf@procenvironment}}{% if proc environment
2060     \let\thealgocf=\old@thealgocf% restore normal counter printing
2061     \let\algocf@captiontext=\algocf@oldcaptiontext% restore normal caption text
2062   }{}%
2063   \let\@caption=\algocf@savecaption% now restore caption outside algo/proc/func environment
2064   \let\@makecaption=\algocf@oldmakecaption% and restore makecaption outside outside algo/proc/func environment
2065   \algocf@resetfnum%
2066 }%
2067 %
2068 %%%%% nocaptionofalgo and restorecaptionofalgo --
2069 \newcommand{\NoCaptionOfAlgo}{%
2070   \let\@old@algocf@captiontext=\algocf@captiontext%
2071   \renewcommand{\algocf@captiontext}[2]{\AlCapNameSty{\AlCapNameFnt{}##2}}%
2072 }%
2073 \newcommand{\RestoreCaptionOfAlgo}{%
2074   \let\algocf@captiontext=\@old@algocf@captiontext%
2075 }%
2076 %
2077 % ----------------------  algocf environment
2078 %
2079 \newcounter{algocfline}%                    % new counter to make lines numbers be internally 
2080 \setcounter{algocfline}{0}%                 % different in different algorithms
2081 \newcounter{algocfproc}% counter to count all algo environment (proc, func), just used by hyperref to avoir "same
2082 \setcounter{algocfproc}{0}% identifier" error caused by algocf being set to '-' for procedure or function or not
2083   % changed if no caption is given.
2084 %
2085 \expandafter\ifx\csname algocf@within\endcsname\relax% if \algocf@within doesn't exist
2086 \newcounter{algocf}%                        % just define a new counter
2087 \renewcommand{\thealgocf}{\@arabic\c@algocf}% and the way it is printed
2088 \else%                                     else
2089 \newcounter{algocf}[\algocf@within]%        % counter is numbered within \algocf@within
2090 \renewcommand\thealgocf{\csname the\algocf@within\endcsname.\@arabic\c@algocf}%
2091 \fi%
2092 %
2093 \def\fps@algocf{htbp}%        % default
2094 \def\ftype@algocf{10}%        % float type
2095 \def\ext@algocf{\algocf@list} % loa by default, lof if figure option used
2096 \newcommand{\fnum@algocf}{\AlCapSty{\AlCapFnt\algorithmcfname\nobreakspace\thealgocf}}%
2097 \newcommand{\algocf@resetfnum}{\renewcommand{\fnum@algocf}{\AlCapSty{\AlCapFnt\algorithmcfname\nobreakspace\thealgocf}}}%
2098 \newenvironment{algocf}%      % float environment for algorithms
2099                {\@float{algocf}}%
2100                {\end@float}%
2101 \newenvironment{algocf*}%     % float* environment for algorithms
2102                {\@dblfloat{algocf}}%
2103                {\end@dblfloat}%
2104 %
2105 \def\algocf@seclistalgo{}%
2106 \ifx\l@chapter\undefined\let\algocf@seclistalgo=\section\else\let\algocf@seclistalgo=\chapter\fi%
2107 \@ifundefined{if@restonecol}{\newif\if@restonecol}\relax%
2108 \newcommand\listofalgocfs{%
2109      \ifx\algocf@seclistalgo\chapter%
2110       \if@twocolumn\@restonecoltrue\onecolumn\else\@restonecolfalse\fi%
2111     \fi%
2112      \algocf@seclistalgo*{\listalgorithmcfname}%
2113        \@mkboth{\MakeUppercase\listalgorithmcfname}%
2114                {\MakeUppercase\listalgorithmcfname}%
2115      \@starttoc{loa}%
2116     \ifx\algocf@seclistalgo\chapter%
2117       \if@restonecol\twocolumn\fi%
2118     \fi%
2119 }
2120 %
2121 \newcommand*\l@algocf{\@dottedtocline{1}{1em}{2.3em}}% line of the list
2122 %
2123 % ----------------------  algorithm environment
2124 %
2125 %%%%%%%
2126 %%
2127 %% Algorithm environment definition
2128 %%
2129 %%%%%%%
2130 %%
2131 %
2132 \newsavebox\algocf@algoframe%
2133 \def\@algocf@pre@plain{\relax}%  action to be done before printing the algo.
2134 \def\@algocf@post@plain{\relax}% action to be done after printing the algo.
2135 \def\@algocf@capt@plain{bottom}% where the caption should be localized.
2136 \def\@algocf@pre@boxed{\noindent\begin{lrbox}{\algocf@algoframe}}
2137 \def\@algocf@post@boxed{\end{lrbox}\framebox[\hsize]{\box\algocf@algoframe}\par}%
2138 \def\@algocf@capt@boxed{under}%
2139 \def\@algocf@pre@ruled{\hrule height\algoheightrule depth0pt\kern\interspacetitleruled}%
2140 \def\@algocf@post@ruled{\kern\interspacealgoruled\hrule height\algoheightrule\relax}%
2141 \def\@algocf@capt@ruled{top}%
2142 \def\@algocf@pre@algoruled{\hrule height\algoheightrule depth0pt\kern\interspacetitleruled}%
2143 \def\@algocf@post@algoruled{\kern\interspacealgoruled\hrule height\algoheightrule \relax}%
2144 \def\@algocf@capt@algoruled{top}%
2145 \def\@algocf@pre@tworuled{\hrule height\algoheightrule depth0pt\kern\interspacetitleruled}%
2146 \def\@algocf@post@tworuled{\kern\interspacealgoruled\hrule height\algoheightrule\relax}%
2147 \def\@algocf@capt@tworuled{top}%
2148 \def\@algocf@pre@boxruled{\noindent\begin{lrbox}{\algocf@algoframe}}%
2149 \def\@algocf@post@boxruled{\end{lrbox}\framebox[\hsize]{\box\algocf@algoframe}\par}%
2150 \def\@algocf@capt@boxruled{above}%
2151 \def\@algocf@pre@plainruled{\@algocf@pre@ruled}%  action to be done before printing the algo.
2152 \def\@algocf@post@plainruled{\@algocf@post@ruled\kern\interspacealgoruled}%  action to be done before printing the algo.
2153 \def\@algocf@capt@plainruled{under}%
2154 %
2155 \newcommand{\noalgocaption}{\def\@algocf@capt@ruled{none}}
2156 %
2157 %% before algocf or figure environment
2158 \newcommand{\@algocf@init@caption}{%
2159   \ifthenelse{\boolean{algocf@procenvironment}}{% if we are inside a procedure/function environment
2160     \@algocf@proctitleofalgo% set Titleofalgo to Procedure: or Function:
2161                             % accordingly to the environment
2162     \let\old@thealgocf=\thealgocf\ifthenelse{\boolean{algocf@procnumbered}}{\relax}{%
2163       \renewcommand{\thealgocf}{-}}%
2164   }{% else inside environment algorithm
2165     \@algocf@algotitleofalgo% fix name for \Titleofalgo to \algorithmcfname
2166   }%
2167   \algocf@setcaption%       set caption to our caption style
2168 }%
2169 %
2170 \newcommand{\@algofloatboxreset}{\@setminipage}
2171 \newcommand{\@algocf@init}{%
2172   \refstepcounter{algocfline}%
2173   \stepcounter{algocfproc}%to have a different counter for each environment and being abble to make the difference
2174     %between href of algoline in different algorithms.
2175   \ifthenelse{\boolean{algocf@optnoend}}{%
2176       \renewcommand{\algocf@block}[2]{\algocf@group{##1}}%
2177     }{%
2178       \renewcommand{\algocf@block}[2]{\algocf@@block{##1}{##2}}%
2179     }%
2180 }%
2181 %% after the end of algocf or figure environment
2182 \newcommand{\@algocf@term@caption}{%
2183   \algocf@resetcaption% restore original caption
2184 }%
2185 %
2186 \newcommand{\@algocf@term}{%
2187   \setboolean{algocf@algoH}{false}% no H by default
2188   \ifthenelse{\boolean{algocf@optnoend}}{%
2189     \renewcommand{\algocf@block}[2]{\algocf@@block{##1}{##2}}%
2190   }{%
2191     \renewcommand{\algocf@block}[2]{\algocf@group{##1}}%
2192   }%
2193   \SetAlgoRefName{\relax}%
2194 }%
2195 %
2196 %%%%%%%%%%%%%%%%%
2197 %% makethealgo: macro which print effectively the algo in its box
2198 %% 
2199 \newsavebox\algocf@algobox%
2200 \newcommand{\algocf@makethealgo}{%
2201   \vtop{%
2202     % place caption above if needed  bye the style
2203     \ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{above}}%
2204     {\csname algocf@caption@\algocf@style\endcsname}{}%
2205     %
2206     % precommand according to the style
2207     \csname @algocf@pre@\algocf@style\endcsname%
2208     % place caption at top if needed  bye the style
2209      \ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{top}}%
2210      {\csname algocf@caption@\algocf@style\endcsname}{}%
2211     %
2212     \box\algocf@algobox% the algo
2213     % place caption at bottom if needed  bye the style
2214      \ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{bottom}}%
2215      {\csname algocf@caption@\algocf@style\endcsname}{}%
2216     % postcommand according to the style
2217     \csname @algocf@post@\algocf@style\endcsname%
2218     % place caption under if needed  bye the style
2219      \ifthenelse{\equal{\csname @algocf@capt@\algocf@style\endcsname}{under}}%
2220      {\csname algocf@caption@\algocf@style\endcsname}{}%
2221   }%
2222 }%
2223 %%%%%%%%%%%%%%%%%%%
2224 %
2225 %% at the beginning of algocf or figure environment
2226 \newenvironment{algomathdisplay}{\[}{\@endalgocfline\]\ifthenelse{\boolean{algocf@linesnumbered}}{\nl}{\relax}}%
2227 \newcommand{\@algocf@start}{%
2228   \@algoskip%
2229   \begin{lrbox}{\algocf@algobox}%
2230   \setlength{\algowidth}{\hsize}%
2231   \vbox\bgroup% save all the algo in a box
2232   \hbox to\algowidth\bgroup\hbox to \algomargin{\hfill}\vtop\bgroup%
2233   \ifthenelse{\boolean{algocf@slide}}{\parskip 0.5ex\color{black}}{}%
2234   % initialization
2235   \addtolength{\hsize}{-1.5\algomargin}%
2236   \let\@mathsemicolon=\;\def\;{\ifmmode\@mathsemicolon\else\@endalgoln\fi}%
2237   \raggedright\AlFnt{}%
2238   \ifthenelse{\boolean{algocf@slide}}{\IncMargin{\skipalgocfslide}}{}%
2239   \@algoinsideskip%
2240 %   \let\@emathdisplay=\]\def\]{\algocf@endline\@emathdisplay\nl}%
2241 }%
2242 %
2243 %% at the end of algocf or figure environment
2244 \newcommand{\@algocf@finish}{%
2245   \@algoinsideskip%
2246   \egroup%end of vtop which contain all the text
2247   \hfill\egroup%end of hbox wich contains [margin][vtop]
2248   \ifthenelse{\boolean{algocf@slide}}{\DecMargin{\skipalgocfslide}}{}%
2249   %
2250   \egroup%end of main vbox
2251   \end{lrbox}%
2252   \algocf@makethealgo% print the algo
2253   \@algoskip%
2254   % restore dimension and macros
2255   \setlength{\hsize}{\algowidth}%
2256   \lineskip\normallineskip\setlength{\skiptotal}{\@defaultskiptotal}%
2257   \let\;=\@mathsemicolon%  
2258   \let\]=\@emathdisplay%
2259 }%
2260 %
2261 %%%%%%%%%%%%%%%%%%%%
2262 %% basic definition of the environment algorithm
2263 %%
2264 %
2265 \newboolean{algocf@procenvironment}\setboolean{algocf@procenvironment}{false}%
2266 \newboolean{algocf@func}\setboolean{algocf@func}{false}%
2267 \newboolean{algocf@algoH}\setboolean{algocf@algoH}{false}%
2268 \newboolean{algocf@algostar}\setboolean{algocf@algostar}{false}%
2269 %
2270 %%% environment for {algorithm}[H]
2271 \newenvironment{algocf@Here}{\noindent%
2272   \def\@captype{algocf}% if not defined, caption exit with an error
2273   \begin{minipage}{\hsize}%
2274 }{%
2275   \end{minipage}%\par%
2276 }%
2277 %%% real algorithm environment which manages H and * option
2278 %    \let\algocf@originalfloatboxreset=\@floatboxreset%
2279 %    \let\@floatboxreset=\@algofloatboxreset%
2280 \newenvironment{algocf@algorithm}[1][htbp]{
2281    \@algocf@init%
2282    \ifthenelse{\equal{\algocf@float}{figure}}{% if option figure set
2283      \ifthenelse{\boolean{algocf@algostar}}{% if algorithm* with figure option
2284        \begin{figure*}[#1]% call figure*
2285      }{% else algorithm environment with figure option
2286        \begin{figure}[#1]%  call figure
2287      }%
2288    }{% else normal algorithm environment
2289      \@algocf@init@caption%
2290      \ifthenelse{\equal{#1}{H}}{% if [H] algorithm
2291        \if@twocolumn\@latex@error{[H] in two columns mode is not allowed for algorithms}\fi% TODO: SCREAM if H in two colums!
2292        \setboolean{algocf@algoH}{true}\begin{algocf@Here}% call corresponding environment
2293      }{% else floating algorithm environment
2294        \ifthenelse{\boolean{algocf@algostar}}{% if algorithm*
2295          \begin{algocf*}[#1]% call algocf*
2296        }{% else algorithm environment
2297          \begin{algocf}[#1]%  call algcf
2298        }%
2299      }%
2300    }% fin test option figure ou pas
2301    \@algocf@start% 
2302    \@ResetCounterIfNeeded%
2303    \algocf@linesnumbered\ignorespaces%
2304 }{%
2305   \@algocf@finish%
2306   \ifthenelse{\equal{\algocf@float}{figure}}{%
2307      \ifthenelse{\boolean{algocf@algostar}}{% if algorithm* with figure option
2308        \end{figure*}% call figure*
2309      }{% else algorithm environment with figure option
2310        \end{figure}%  call figure
2311      }%
2312   }{%
2313     \@algocf@term@caption%
2314     \ifthenelse{\boolean{algocf@algoH}}{% if [H] algorithm
2315        \end{algocf@Here}\par% call corresponding environment
2316      }{% else floating algorithm environment
2317        \ifthenelse{\boolean{algocf@algostar}}{% if algorithm*
2318          \end{algocf*}% call algocf*
2319        }{% else algorithm environment
2320          \end{algocf}%  call algocf
2321        }%
2322      }%
2323   }%
2324   \@algocf@term\ignorespacesafterend%
2325 }%
2326 %
2327 %%% user algorithm environment
2328 \newenvironment{\algocf@envname}[1][htbp]{%
2329   \setboolean{algocf@algostar}{false}%
2330   \setboolean{algocf@procenvironment}{false}\gdef\algocfautorefname{\algorithmautorefname}%
2331   \begin{algocf@algorithm}[#1]\ignorespaces%
2332 }{%
2333   \end{algocf@algorithm}\ignorespacesafterend%
2334 }%
2335 %%% user algorithm* environment
2336 \newenvironment{\algocf@envname*}[1][htbp]{%
2337   \setboolean{algocf@algostar}{true}%
2338   \setboolean{algocf@procenvironment}{false}\gdef\algocfautorefname{\algorithmautorefname}%
2339   \begin{algocf@algorithm}[#1]\ignorespaces%
2340 }{%
2341   \end{algocf@algorithm}\ignorespacesafterend%
2342 }%
2343 %
2344 %%%%%%%%%%%%%%%%%%%%%%%
2345 %%%
2346 %
2347 \expandafter\newcommand\csname\algocf@listofalgorithms\endcsname{%
2348   \ifthenelse{\equal{\algocf@float}{figure}}{\listoffigures}{\listofalgocfs}%
2349 }%
2350 %%%
2351 %%%
2352 %
2353 % ----------------------  procedure and function environments
2354 %
2355 %
2356 % -- new style (used in particular in the caption of function and procedure environments)
2357 %
2358 % three macros to extract parts of the caption
2359 \gdef\algocf@captname#1(#2)#3@{#1}  % keep characters before the first brace
2360 \gdef\algocf@captparam#1(#2)#3@{#2} % keep character in between the braces
2361 \gdef\algocf@captother#1(#2)#3@{#3} % keep character after the braces
2362 %
2363 %%% Text of caption for Procedure or Function
2364 \newcommand{\algocf@captionproctext}[2]{%
2365   {%
2366     \ProcSty{\ProcFnt\algocf@procname\ifthenelse{\boolean{algocf@procnumbered}}{\nobreakspace\thealgocf\algocf@typo\algocf@capseparator}{\relax}}%
2367     \nobreakspace\ProcNameSty{\ProcNameFnt\algocf@captname #2@}% Name of the procedure in ProcName Style. 
2368     \ifthenelse{\equal{\algocf@captparam #2@}{\arg@e}}{}{% if no argument, write nothing
2369       \ProcNameSty{\ProcNameFnt(}\ProcArgSty{\ProcArgFnt\algocf@captparam #2@}\ProcNameSty{\ProcNameFnt)}%else put arguments in ProcArgSty:
2370     }% endif
2371     \algocf@captother #2@%
2372   }%
2373 }%
2374 %
2375 %
2376 % -- procedure and function environments are defined from algocf@algorithm environment
2377 %
2378 \newenvironment{procedure}[1][htbp]{%
2379   \setboolean{algocf@algostar}{false}%
2380   \setboolean{algocf@procenvironment}{true}\setboolean{algocf@func}{false}%
2381   \newcommand{\algocf@procname}{\@algocf@procname}\gdef\algocfprocautorefname{\procedureautorefname}%
2382   \begin{algocf@algorithm}[#1]\ignorespaces%
2383 }{%
2384   \end{algocf@algorithm}\ignorespacesafterend%
2385 }%
2386 \newenvironment{function}[1][htbp]{%
2387   \setboolean{algocf@algostar}{false}%
2388   \setboolean{algocf@procenvironment}{true}\setboolean{algocf@func}{true}%
2389   \newcommand{\algocf@procname}{\@algocf@funcname}\gdef\algocffuncautorefname{\functionautorefname}%
2390   \begin{algocf@algorithm}[#1]\ignorespaces%
2391 }{%
2392   \end{algocf@algorithm}\ignorespacesafterend%
2393 }%
2394 %
2395 \newenvironment{procedure*}[1][htbp]{%
2396   \setboolean{algocf@algostar}{true}%
2397   \setboolean{algocf@procenvironment}{true}\setboolean{algocf@func}{false}%
2398   \newcommand{\algocf@procname}{\@algocf@procname}\gdef\algocfprocautorefname{\procedureautorefname}%
2399   \begin{algocf@algorithm}[#1]\ignorespaces%
2400 }{%
2401   \end{algocf@algorithm}\ignorespacesafterend%
2402 }%
2403 \newenvironment{function*}[1][htbp]{%
2404   \setboolean{algocf@algostar}{true}%
2405   \setboolean{algocf@procenvironment}{true}\setboolean{algocf@func}{true}%
2406   \newcommand{\algocf@procname}{\@algocf@funcname}\gdef\algocffuncautorefname{\functionautorefname}%
2407   \begin{algocf@algorithm}[#1]\ignorespaces%
2408 }{%
2409   \end{algocf@algorithm}\ignorespacesafterend%
2410 }%
2411 %
2412 %
2413 %%%%%%%%%%%%%%%%%%%%
2414 %% definition of algondfloat environment
2415 %%
2416 \ifthenelse{\boolean{algocf@endfloat}}{% if endfloat option then
2417 \newcommand{\algoplace}{% macro which is used to writhe algorithm about there
2418    \begin{center}%
2419      [\algorithmcfname~\thepostfig\ about here.]%
2420    \end{center}%
2421 }%
2422 \newcommand{\algoendfloat}{% use as a \begin{algoendfloat} environment to start scanning of line
2423 %  \immediate\openout\@mainfff\jobname.fff%
2424   \efloat@condopen{fff}
2425   \efloat@iwrite{fff}{\string\begin{\algocf@envname}}%
2426     \if@domarkers%
2427        \ifthenelse{\equal{\algocf@list}{lof}}{%
2428          \addtocounter{postfig}{1}%
2429        }{%
2430          \addtocounter{postalgo}{1}%
2431        }%
2432        \algoplace%
2433     \fi%
2434     \bgroup%
2435     \let\do\ef@makeinnocent\dospecials%
2436     \ef@makeinnocent\^^L% and whatever other special cases
2437     \endlinechar`\^^M \catcode`\^^M=12 \ef@xalgocfendfloat}%
2438 }{\relax}%%%% end of endfloat option ifthenelse
2439 %% some macros useful for endfloat option that cannot be defined inside the ifthenelse
2440 %scan algoendfloat algorithm and write the text into .fff file
2441 {\catcode`\^^M=12 \endlinechar=-1 %
2442  \gdef\ef@xalgocfendfloat#1^^M{% scan the lines inside algoendfloat environment being read by latex
2443    \def\test{#1}% test is the line being currently scan by latex
2444    \ifx\test\ef@endalgocftest% if it is \end{algoendfloat}
2445      \def\next{% define next as to not continue the scan and write \end{algorithm} into .fff file
2446        \egroup\end{algoendfloat}%
2447        \efloat@iwrite{fff}{\string\end{\algocf@envname}}%
2448        \efloat@iwrite{fff}{\string\efloatseparator}%
2449        \efloat@iwrite{fff}{ }%
2450      }%
2451      \else% else write the current line being scanned by latex and set next to continue the scan
2452        \efloat@iwrite{fff}{#1}%
2453        \let\next\ef@xalgocfendfloat%
2454      \fi% endif
2455      \next}% next is continue if it was else condition, else it does not continue the scan and write end to file
2456 }%
2457 % test if the scan is finish by looking at the string \end{algoendfloat}
2458 {\escapechar=-1%
2459  \xdef\ef@endalgocftest{\string\\end\string\{algoendfloat\string\}}%
2460 }%
2461 %
2462 %
2463 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2464 %
2465
2466 \newcommand{\TitleOfAlgo}[1]{\@titleprefix\ 
2467   \TitleSty{#1}\par\smallskip}%
2468 %
2469 \newcommand{\SetAlgorithmName}[3]{%
2470   \renewcommand{\listalgorithmcfname}{#3}%
2471   \renewcommand{\algorithmcfname}{#1}%
2472   \renewcommand{\algorithmautorefname}{#2}%
2473 }%
2474 %
2475 \newcommand{\algocf@refrelsize}{-2}\newcommand{\SetAlgoRefRelativeSize}[1]{\renewcommand{\algocf@refrelsize}{#1}}%
2476 \newcommand{\SetAlgoRefName}[1]{%
2477   \renewcommand{\algocf@algocfref}{#1}%
2478 }%
2479 %
2480 %
2481 %
2482 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2483 %
2484
2485 % -------------------------   Default Definitions
2486 %
2487 %%
2488 %%
2489 %
2490 \SetKwComment{tcc}{/* }{ */}%
2491 \SetKwComment{tcp}{// }{}%
2492 %
2493 %\newcommand{\algocf@defaults@common}{
2494 %
2495 %
2496 % french keywords
2497 %
2498 %\SetKwInOut{AlgDonnees}{Donn\'ees}\SetKwInOut{AlgRes}{R\'esultat}
2499 \SetKwHangingKw{HDonnees}{Donnees$\rightarrow$}
2500 \SetKwInput{Donnees}{Donn\'ees}%
2501 \SetKwInput{Res}{R\'esultat}%
2502 \SetKwInput{Entree}{Entr\'ees}%
2503 \SetKwInput{Sortie}{Sorties}%
2504 \SetKw{KwA}{\`a}%
2505 \SetKw{Retour}{retourner}%
2506 \SetKwBlock{Deb}{d\'ebut}{fin}%
2507 \SetKwRepeat{Repeter}{r\'ep\'eter}{jusqu'\`a}%
2508 %
2509 \SetKwIF{Si}{SinonSi}{Sinon}{si}{alors}{sinon si}{sinon}{fin si}%
2510 \SetKwSwitch{Suivant}{Cas}{Autre}{suivant}{faire}{cas o\`u}{autres cas}{fin cas}{fin d'alternative}%
2511 \SetKwFor{Pour}{pour}{faire}{fin pour}%
2512 \SetKwFor{PourPar}{pour}{faire en parall\`ele}{fin pour}%
2513 \SetKwFor{PourCh}{pour chaque}{faire}{fin pour chaque}%
2514 \SetKwFor{PourTous}{pour tous les}{faire}{fin pour tous}%
2515 \SetKwFor{Tq}{tant que}{faire}{fin tq}%
2516 %
2517 % english keywords
2518 %
2519 \SetKwHangingKw{KwHData}{Data$\rightarrow$}
2520 \SetKwInput{KwIn}{Input}%
2521 \SetKwInput{KwOut}{Output}%
2522 \SetKwInput{KwData}{Data}%
2523 \SetKwInput{KwResult}{Result}%
2524 \SetKw{KwTo}{to}
2525 \SetKw{KwRet}{return}%
2526 \SetKw{Return}{return}%
2527 \SetKwBlock{Begin}{begin}{end}%
2528 \SetKwRepeat{Repeat}{repeat}{until}%
2529 %
2530 \SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{end if}%
2531 \SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{end case}{end switch}%
2532 \SetKwFor{For}{for}{do}{end for}%
2533 \SetKwFor{ForPar}{for}{do in parallel}{end forpar}
2534 \SetKwFor{ForEach}{foreach}{do}{end foreach}%
2535 \SetKwFor{ForAll}{forall the}{do}{end forall}%
2536 \SetKwFor{While}{while}{do}{end while}%
2537 %
2538 % --- German keywords
2539 %
2540 \SetKwInput{Ein}{Eingabe}%KwIn
2541 \SetKwInput{Aus}{Ausgabe}%KwOut
2542 \SetKwInput{Daten}{Daten}%KwData
2543 \SetKwInput{Ergebnis}{Ergebnis}%KwResult
2544 \SetKw{Bis}{bis}%KwTo
2545 \SetKw{KwZurueck}{zur\"uck}%KwRet
2546 \SetKw{Zurueck}{zur\"uck}%Return
2547 \SetKwBlock{Beginn}{Beginn}{Ende}%Begin
2548 \SetKwRepeat{Wiederh}{wiederhole}{bis}%Repeat
2549 %
2550 \SetKwIF{Wenn}{SonstWenn}{Sonst}{wenn}{dann}{sonst wenn}{sonst}{Ende wenn}%gIf
2551 \SetKwSwitch{Unterscheide}{Fall}{Anderes}{unterscheide}{tue}{Fall}{sonst}{Ende Fall}{Ende Unt.}%Switch
2552 \SetKwFor{Fuer}{f\"ur}{tue}{Ende f\"ur}%For
2553 \SetKwFor{FuerPar}{f\"ur}{tue gleichzeitig}{Ende gleichzeitig}%ForPar
2554 \SetKwFor{FuerJedes}{f\"ur jedes}{tue}{Ende f\"ur}%ForEach
2555 \SetKwFor{FuerAlle}{f\"ur alle}{tue}{Ende f\"ur}%ForAll
2556 \SetKwFor{Solange}{solange}{tue}{Ende solange}%While
2557 %
2558 % --- Czech keywords
2559 %
2560 \SetKwInput{Vst}{Vstup}%
2561 \SetKwInput{Vyst}{V\'{y}stup}%
2562 \SetKwInput{Vysl}{V\'{y}sledek}%
2563 %
2564 % --- Portuguese keywords
2565 %
2566 \SetKwInput{Entrada}{Entrada}%
2567 \SetKwInput{Saida}{Sa\'{i}da}%
2568 \SetKwInput{Dados}{Dados}%
2569 \SetKwInput{Resultado}{Resultado}%
2570 \SetKw{Ate}{at\'{e}}
2571 \SetKw{KwRetorna}{retorna}%
2572 \SetKw{Retorna}{retorna}%
2573 \SetKwBlock{Inicio}{in\'{i}cio}{fim}%
2574 \SetKwRepeat{Repita}{repita}{at\'{e}}%
2575 %
2576 \SetKwIF{Se}{SenaoSe}{Senao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim se}%
2577 \SetKwSwitch{Selec}{Caso}{Outro}{selecione}{fa\c{c}a}{caso}{sen\~{a}o}{fim caso}{fim selec}%
2578 \SetKwFor{Para}{para}{fa\c{c}a}{fim para}%
2579 \SetKwFor{ParaPar}{para}{fa\c{c}a em paralelo}{fim para}
2580 \SetKwFor{ParaCada}{para cada}{fa\c{c}a}{fim para cada}%
2581 \SetKwFor{ParaTodo}{para todo}{fa\c{c}a}{fim para todo}%
2582 \SetKwFor{Enqto}{enquanto}{fa\c{c}a}{fim enqto}%
2583 %
2584 % --- Italian keywords
2585 %
2586 \SetKwInput{KwIng}{Ingresso}%
2587 \SetKwInput{KwUsc}{Uscita}%
2588 \SetKwInput{KwDati}{Dati}%
2589 \SetKwInput{KwRisult}{Risultato}%
2590 \SetKw{KwA}{a}%
2591 \SetKw{KwRitorna}{ritorna}%
2592 \SetKw{Ritorna}{ritorna}%
2593 \SetKwBlock{Inizio}{inizio}{fine}%
2594 \SetKwRepeat{Ripeti}{ripeti}{finch\'e}%
2595 %
2596 \SetKwIF{Sea}{AltSe}{Altrimenti}{se}{allora}{altrimenti se}{allora}{fine se}%
2597 \SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{end case}{endsw}%
2598 \SetKwFor{Per}{per}{fai}{fine per}%
2599 \SetKwFor{PerPar}{per}{fai in parallelo}{fine per}%
2600 \SetKwFor{PerCiascun}{per ciascun}{fai}{fine per ciascun}%
2601 \SetKwFor{PerTutti}{per tutti i}{fai}{fine per tutti}%
2602 \SetKwFor{Finche}{finch\'e}{fai}{fine finch\'e}%
2603 %
2604 % --- Spanish keywords
2605 %
2606 \SetKwInput{Datos}{Datos}
2607 \SetKwInput{Resultado}{Resultado}
2608 \SetKwInput{Entrada}{Entrada}
2609 \SetKwInput{Salida}{Salida}
2610 \SetKw{KwA}{a}
2611 \SetKw{KwDevolver}{devolver}
2612 \SetKw{Devolver}{devolver}
2613 \SetKwBlock{Inicio}{inicio}{fin}
2614 \SetKwIF{SSi}{EnOtroCasoSi}{EnOtroCaso}{si}{entonces}{sin\'o, si}{sin\'o}{fin si}
2615 \SetKwSwitch{Seleccionar}{Caso}{Otro}{seleccionar}{hacer}{caso}{sin\'o}{fin caso}{fin seleccionar}
2616 \SetKwFor{Para}{para}{hacer}{fin para}
2617 \SetKwFor{ParaPara}{par}{hacer en paralelo}{fin para}
2618 \SetKwFor{EnParalelo}{para}{hacer en paralelo}{fin para}
2619 \SetKwFor{Mientras}{mientras}{hacer}{fin mientras}
2620 \SetKwFor{ParaCada}{para cada}{hacer}{fin para cada}
2621 \SetKwFor{ParaTodo}{para todo}{hacer}{fin para todo}
2622 \SetKwRepeat{Repetir}{repetir}{hasta que}
2623 %
2624 % Croatian keywords
2625 %
2626 \SetKwInput{KwUlaz}{Ulaz}%KwIn
2627 \SetKwInput{KwIzlaz}{Izlaz}%KwOut
2628 \SetKwInput{KwPodaci}{Podaci}%KwData
2629 \SetKwInput{KwRezultat}{Rezultat}%KwResult
2630 \SetKw{KwDo}{do}%KwTo
2631 \SetKw{KwVrati}{vrati}%KwRet
2632 \SetKw{Vrati}{vrati}%Return
2633 \SetKwBlock{Pocetak}{po\v{c}etak}{kraj}%Begin
2634 \SetKwRepeat{Ponavljaj}{ponavljaj}{dok ne bude}%Repeat
2635 %
2636 \SetKwIF{Ako}{InaceAko}{Inace}{ako}{onda}{ina\v{c}e ako}{ina\v{c}e}{kraj}%gIf
2637 \SetKwSwitch{Granaj}{Slucaj}{Inace}{granaj}{\v{c}ini}{slu\v{c}aj}{ina\v{c}e}{kraj}{kraj}%Switch
2638 \SetKwFor{Za}{za}{\v{c}ini}{kraj}%For
2639 \SetKwFor{ZaPar}{za}{izvr\v{s}avaj paralelno}{kraj}%ForPar
2640 \SetKwFor{ZaSvaki}{za svaki}{\v{c}ini}{kraj}%mForEach
2641 \SetKwFor{ZaSvaku}{za svaku}{\v{c}ini}{kraj}%fForEach
2642 \SetKwFor{ZaSvako}{za svako}{\v{c}ini}{kraj}%nForEach
2643 \SetKwFor{ZaSve}{za sve}{\v{c}ini}{kraj}%ForAll
2644 \SetKwFor{Dok}{dok}{\v{c}ini}{kraj}%While
2645 %
2646 % --- End 
2647 %}
2648 %
2649 %\algocf@defaults@common
2650 %
2651 % option onelanguage redefinition
2652 %
2653 \ifthenelse{\boolean{algocf@optonelanguage}\AND\equal{\algocf@languagechoosen}{french}}{%
2654 \SetKwInput{KwIn}{Entr\'ees}%
2655 \SetKwInput{KwOutSortie}{Sorties}%
2656 \SetKwInput{KwData}{Donn\'ees}%
2657 \SetKwInput{KwResult}{R\'esultat}%
2658 \SetKw{KwTo}{\`a}%
2659 \SetKw{KwRet}{retourner}%
2660 \SetKw{Return}{retourner}%
2661 \SetKwBlock{Begin}{d\'ebut}{fin}%
2662 \SetKwRepeat{Repeat}{r\'ep\'eter}{jusqu'\`a}%
2663 %
2664 \SetKwIF{If}{ElseIf}{Else}{si}{alors}{sinon si}{sinon}{fin si}%
2665 \SetKwSwitch{Switch}{Case}{Other}{suivant}{faire}{cas o\`u}{autres cas}{fin cas}{fin d'alternative}%
2666 \SetKwFor{For}{pour}{faire}{fin pour}%
2667 \SetKwFor{ForPar}{pour}{faire en parall\`ele}{fin pour}%
2668 \SetKwFor{ForEach}{pour chaque}{faire}{fin pour chaque}%
2669 \SetKwFor{ForAll}{pour tous les}{faire}{fin pour tous}%
2670 \SetKwFor{While}{tant que}{faire}{fin tq}%
2671 }{}%
2672 \ifthenelse{\boolean{algocf@optonelanguage}\AND\equal{\algocf@languagechoosen}{german}}{%
2673 \SetKwInput{KwIn}{Eingabe}%KwIn
2674 \SetKwInput{KwOut}{Ausgabe}%KwOut
2675 \SetKwInput{KwData}{Daten}%KwData
2676 \SetKwInput{KwResult}{Ergebnis}%KwResult
2677 \SetKw{KwTo}{bis}%KwTo
2678 \SetKw{KwRet}{zur\"uck}%KwRet
2679 \SetKw{Return}{zur\"uck}%Return
2680 \SetKwBlock{Begin}{Beginn}{Ende}%Begin
2681 \SetKwRepeat{Repeat}{wiederhole}{bis}%Repeat
2682 %
2683 \SetKwIF{If}{ElseIf}{Else}{wenn}{dann}{sonst wenn}{sonst}{Ende wenn}%gIf
2684 \SetKwSwitch{Switch}{Case}{Other}{unterscheide}{tue}{Fall}{sonst}{Ende Fall}{Ende Unt.}%Switch
2685 \SetKwFor{For}{f\"ur}{tue}{Ende f\"ur}%For
2686 \SetKwFor{ForPar}{f\"ur}{tue gleichzeitig}{Ende gleichzeitig}%ForPar
2687 \SetKwFor{ForEach}{f\"ur jedes}{tue}{Ende f\"ur}%ForEach
2688 \SetKwFor{ForAll}{f\"ur alle}{tue}{Ende f\"ur}%ForAll
2689 \SetKwFor{While}{solange}{tue}{Ende solange}%While
2690 }{}%
2691 \ifthenelse{\boolean{algocf@optonelanguage}\AND\equal{\algocf@languagechoosen}{portuguese}}{%
2692 \SetKwInput{KwIn}{Entrada}%
2693 \SetKwInput{KwOut}{Sa\'{i}da}%
2694 \SetKwInput{KwData}{Dados}%
2695 \SetKwInput{KwResult}{Resultado}%
2696 \SetKw{KwTo}{at\'{e}}
2697 \SetKw{KwRet}{retorna}%
2698 \SetKw{Return}{retorna}%
2699 \SetKwBlock{Begin}{in\'{i}cio}{fim}%
2700 \SetKwRepeat{Repeat}{repita}{at\'{e}}%
2701 %
2702 \SetKwIF{If}{ElseIf}{Else}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim se}%
2703 \SetKwSwitch{Switch}{Case}{Other}{selecione}{fa\c{c}a}{caso}{sen\~{a}o}{fim caso}{fim selec}%
2704 \SetKwFor{For}{para}{fa\c{c}a}{fim para}%
2705 \SetKwFor{ForPar}{para}{fa\c{c}a em paralelo}{fim para}
2706 \SetKwFor{ForEach}{para cada}{fa\c{c}a}{fim para cada}%
2707 \SetKwFor{ForAll}{para todo}{fa\c{c}a}{fim para todo}%
2708 \SetKwFor{While}{enquanto}{fa\c{c}a}{fim enqto}%
2709 }{}%
2710 \ifthenelse{\boolean{algocf@optonelanguage}\AND\equal{\algocf@languagechoosen}{italiano}}{%
2711 \SetKwInput{KwIn}{Ingresso}%
2712 \SetKwInput{KwOut}{Uscita}%
2713 \SetKwInput{KwData}{Dati}%
2714 \SetKwInput{KwResult}{Risultato}%
2715 \SetKw{KwTo}{a}%
2716 \SetKw{KwRet}{ritorna}%
2717 \SetKw{Return}{ritorna}%
2718 \SetKwBlock{Begin}{inizio}{fine}%
2719 \SetKwRepeat{Repeat}{ripeti}{finch\'e}%
2720 %
2721 \SetKwIF{If}{ElseIf}{Else}{se}{allora}{altrimenti se}{allora}{fine se}%
2722 \SetKwSwitch{Switch}{Case}{Other}{switch}{do}{case}{otherwise}{end case}{endsw}%
2723 \SetKwFor{For}{per}{fai}{fine per}%
2724 \SetKwFor{ForPar}{per}{fai in parallelo}{fine per}%
2725 \SetKwFor{ForEach}{per ciascun}{fai}{fine per ciascun}%
2726 \SetKwFor{ForAll}{per tutti i}{fai}{fine per tutti}%
2727 \SetKwFor{While}{finch\'e}{fai}{fine finch\'e}%
2728 }{}%
2729 \ifthenelse{\boolean{algocf@optonelanguage}\AND\equal{\algocf@languagechoosen}{spanish}}{%
2730 \SetKwInput{KwIn}{Entrada}%
2731 \SetKwInput{KwOut}{Salida}%
2732 \SetKwInput{KwData}{Datos}%
2733 \SetKwInput{KwResult}{Resultado}%
2734 \SetKw{KwTo}{a}%
2735 \SetKw{KwRet}{devolver}%
2736 \SetKw{Return}{devolver}%
2737 \SetKwBlock{Begin}{inicio}{fin}%
2738 \SetKwRepeat{Repeat}{repetir}{hasta que}%
2739 %
2740 \SetKwIF{If}{ElseIf}{Else}{si}{entonces}{sin\'o, si}{en otro caso}{fin si}
2741 \SetKwSwitch{Switch}{Case}{Other}{seleccionar}{hacer}{caso}{sin\'o}{fin caso}{fin seleccionar}
2742 \SetKwFor{For}{per}{fai}{fine per}%
2743 \SetKwFor{ForPar}{par}{hacer in paralelo}{fin para}%
2744 \SetKwFor{ForEach}{para cada}{hacer}{fin para cada}
2745 \SetKwFor{ForAll}{para todo}{hacer}{fin para todo}
2746 \SetKwFor{While}{mientras}{hacer}{fin mientras}
2747 }{}%
2748 %
2749 \ifthenelse{\boolean{algocf@optonelanguage}\AND\equal{\algocf@languagechoosen}{croatian}}{%
2750 \SetKwInput{KwIn}{Ulaz}%KwIn
2751 \SetKwInput{KwOut}{Izlaz}%KwOut
2752 \SetKwInput{KwData}{Podaci}%KwData
2753 \SetKwInput{KwResult}{Rezultat}%KwResult
2754 \SetKw{KwTo}{do}%KwTo
2755 \SetKw{KwRet}{vrati}%KwRet
2756 \SetKw{Return}{vrati}%Return
2757 \SetKwBlock{Begin}{po\v{c}etak}{kraj}%Begin
2758 \SetKwRepeat{Repeat}{ponavljaj}{dok ne bude}%Repeat
2759 %
2760 \SetKwIF{If}{ElseIf}{Else}{ako}{onda}{ina\v{c}e ako}{ina\v{c}e}{kraj}%gIf
2761 \SetKwSwitch{Switch}{Case}{Other}{granaj}{\v{c}ini}{slu\v{c}aj}{ina\v{c}e}{kraj}{kraj}%Switch
2762 \SetKwFor{For}{za}{\v{c}ini}{kraj}%For
2763 \SetKwFor{ForPar}{za}{izvr\v{s}avaj paralelno}{kraj}%ForPar
2764 \SetKwFor{ForEach}{za svaki}{\v{c}ini}{kraj}%ForEach
2765 \SetKwFor{ForAll}{za sve}{\v{c}ini}{kraj}%ForAll
2766 \SetKwFor{While}{dok}{\v{c}ini}{kraj}%While
2767 }{}%
2768 %
2769 %%%% old commands compatibility
2770 %
2771 \ifthenelse{\boolean{algocf@oldcommands}}{%
2772 \newcommand{\SetNoLine}{\SetAlgoNoLine}%
2773 \newcommand{\SetNoline}{\SetAlgoNoLine}%
2774 \newcommand{\SetVline}{\SetAlgoVlined}%
2775 \newcommand{\SetLine}{\SetAlgoLined}%
2776 %
2777 \newcommand{\dontprintsemicolon}{\DontPrintSemicolon}%
2778 \newcommand{\printsemicolon}{\PrintSemicolon}%
2779 \newcommand{\incmargin}[1]{\IncMargin{#1}}%
2780 \newcommand{\decmargin}[1]{\DecMargin{-#1}}%
2781 \newcommand{\setnlskip}[1]{\SetNlSkip{#1}}%
2782 \newcommand{\Setnlskip}[1]{\SetNlSkip{#1}}%
2783 \newcommand{\setalcapskip}[1]{\SetAlCapSkip{#1}}%
2784 \newcommand{\setalcaphskip}[1]{\SetAlCapHSkip{#1}}%
2785 \newcommand{\nlSty}[1]{\NlSty{#1}}%
2786 \newcommand{\Setnlsty}[3]{\SetNlSty{#1}{#2}{#3}}%
2787 \newcommand{\linesnumbered}{\LinesNumbered}%
2788 \newcommand{\linesnotnumbered}{\LinesNotNumbered}%
2789 \newcommand{\linesnumberedhidden}{\LinesNumberedHidden}%
2790 \newcommand{\showln}{\ShowLn}%
2791 \newcommand{\showlnlabel}[1]{\ShowLnLabel{#1}}%
2792 \newcommand{\nocaptionofalgo}{\NoCaptionOfAlgo}%
2793 \newcommand{\restorecaptionofalgo}{\RestoreCaptionOfAlgo}%
2794 \newcommand{\restylealgo}[1]{\RestyleAlgo{#1}}%
2795 %
2796 \newcommand{\Titleofalgo}[1]{\TitleOfAlgo{#1}}%
2797 % \SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{endif}
2798 \newcommand{\SetKwIf}[6]{\SetKwIF{#1}{#2#1}{#2}{#3}{#4}{#5 #1}{#5}{#6}}
2799 %
2800 \SetKwIF{gSi}{gSinonSi}{gSinon}{si}{alors}{sinon si}{sinon}{fin si}%
2801 \SetKwIF{gIf}{gElsIf}{gElse}{if}{then}{else if}{else}{end if}%
2802 \SetKwIF{gIf}{gElseIf}{gElse}{if}{then}{else if}{else}{end if}%
2803 \SetKwIF{gWenn}{gSonstWenn}{gSonst}{wenn}{dann}{sonst wenn}{sonst}{Ende wenn}%gIf
2804 \SetKwIF{gSe}{gSenaoSe}{gSenao}{se}{ent\~{a}o}{sen\~{a}o se}{sen\~{a}o}{fim se}%
2805 \SetKwIF{gSea}{gAltSe}{gAltrimenti}{se}{allora}{altrimenti se}{allora}{fine se}%
2806 \SetKw{Ret}{return}%
2807 \SetKwInput{Data}{Data}%
2808 \SetKwInput{Result}{Result}%
2809 }{%
2810   \relax%
2811 }%
2812 %
2813 %
2814 %
2815 %%
2816 %%%
2817 %%%% END