%%
%% January 14, 2004
%%
%% pseudocode.sty
%%
%%  S O F T W A R E   L I C E N S E
%% =================================
%%
%% The file  pseudocode.sty
%% is referred to as `the pseudocode package'
%% or simply `the package'.
%%
%% The pseudocode package is copyright 1999 D.L. Kreher and D.R. Stinson.
%%
%% The pseudocode package and its drivers may be distributed and/or modified
%% under the conditions of the LaTeX Project Public License, either version
%% 1.3 of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2003/12/01 or later.
%%
%% The package has the LPPL maintenance status "maintained".
%%
%% The Current Maintainer is Donald L. Kreher.
%%
%% end of software license
%%
%% E-MAIL:   kreher@mtu.edu    dstinson@uwaterloo.ca
%%
%% DESCRIPTION:
%%   pseudocode.sty is a LaTeX style option, consisting of:
%%   the environment pseudocode
%%
%% INSTALLATION:
%%   Put this file where your TeX looks for inputs.
%%
%% DOCUMENTATION:
%%  See pseudocode.tex.
%%
%% COPYING:
%%   Copying of part or all of this file is allowed under the following
%%   conditions only:
%%   (1) You may freely distribute unchanged copies of the file. Please
%%       include the documentation when you do so.
%%   (2) You may modify a renamed copy of the file, but only for personal
%%       use or use within an organization.
%%   (3) You may copy fragments from the file, for personal use or for
%%       distribution, as long as credit is given where credit is due.
%%
%%   You are NOT ALLOWED to take money for the distribution or use of
%%   this file or modified versions or fragments thereof, except for
%%   a nominal charge for copying etc.
%%
%%  \RETURN altered  Oct 22, 1999
%%  Allowed for two column  formating  Dec 2, 2002
%%  \BREAK for breaking out of loops added Oct 10, 2003
%%  \FORALL  added Oct 10, 2003
%%
%% CODE:
\typeout{**                                           }
\typeout{** Document Style `pseudocode' - environment }
\typeout{** by D.L. Kreher and D.R. Stinson           }
\typeout{**                                           }
\typeout{** The pseudocode environment was originally developed for the book}
\typeout{** Combinatorial Algorithms: Enumeration, Generation, and Search}
\typeout{** CRC Press, 1999. }

%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pseudocode}
%
\if@twocolumn
\newlength{\pcode@width}
\setlength{\pcode@width}{\columnwidth}
\addtolength{\pcode@width}{-40pt}
\else
\newlength{\pcode@width}
\setlength{\pcode@width}{\textwidth}
\addtolength{\pcode@width}{-40pt}
\fi
%
\RequirePackage{fancybox}
\RequirePackage{ifthen}
%
\newcommand{\pcode@AF}[1]{\mbox{\textsc{#1}}} % Algorithm font
\newcounter{pseudocode}[section]
\newcounter{pseudonum}
\renewcommand{\thepseudonum}{\arabic{pseudonum}}
\newcommand{\pcode@tab}[1]{\hspace*{#1ex}}
\renewcommand{\thepseudocode}{\thesection.\arabic{pseudocode}}
%
\newboolean{pcode@plain}
\newboolean{pcode@ruled}
\newboolean{pcode@disp}
\newboolean{pcode@shad}
\newboolean{pcode@dbox}
\newboolean{pcode@obox}
\newboolean{pcode@Obox}
\newboolean{pcode@fbox}
%
\newenvironment{pseudocode}[3][plain]
{%
 \refstepcounter{pseudocode}%
 \ifthenelse{\equal{#1}{plain}}{\setboolean{pcode@plain}{true}}{\setboolean{pcode@plain}{false}}%
 \ifthenelse{\equal{#1}{ruled}}{\setboolean{pcode@ruled}{true}}{\setboolean{pcode@ruled}{false}}%
 \ifthenelse{\equal{#1}{display}}{\setboolean{pcode@disp}{true}}{\setboolean{pcode@disp}{false}}%
 \ifthenelse{\equal{#1}{shadowbox}}{\setboolean{pcode@shad}{true}}{\setboolean{pcode@shad}{false}}%
 \ifthenelse{\equal{#1}{doublebox}}{\setboolean{pcode@dbox}{true}}{\setboolean{pcode@dbox}{false}}%
 \ifthenelse{\equal{#1}{ovalbox}}{\setboolean{pcode@obox}{true}}{\setboolean{pcode@obox}{false}}%
 \ifthenelse{\equal{#1}{Ovalbox}}{\setboolean{pcode@Obox}{true}}{\setboolean{pcode@Obox}{false}}%
 \ifthenelse{\equal{#1}{framebox}}{\setboolean{pcode@fbox}{true}}{\setboolean{pcode@fbox}{false}}%
 \setcounter{pseudonum}{0}%
 \ifthenelse{\boolean{pcode@disp}}%
 {%
  \noindent\begin{math}%
 }%
 {%
  \begin{Sbox}%
  \begin{minipage}{\pcode@width}%
  \ifthenelse{\boolean{pcode@ruled}}
  {
   \noindent\rule{\pcode@width}{1pt}\hfill\\
   {\bfseries Algorithm \thepseudocode:\pcode@tab{1}}\pcode@AF{#2}($#3$)\\
   \noindent\rule{\pcode@width}{1pt}\hfill\\[1ex]
  }
  {
   {\bfseries Algorithm \thepseudocode:\pcode@tab{1}}\pcode@AF{#2}($#3$)\\[2ex]
  }
  \noindent\begin{math}\begin{array}{@{\pcode@tab{1}}lr@{}}%
 }{}%
}%
{%
 \ifthenelse{\boolean{pcode@disp}}%
 {%
  \end{math}
 }%
 {%
  \ifthenelse{\boolean{pcode@ruled}}
  {
   \end{array}\end{math}\\[1ex]
   \noindent\rule{\pcode@width}{1pt}\hfill
   \end{minipage}\end{Sbox}\bigskip\noindent%
  }
  {\end{array}\end{math}\end{minipage}\end{Sbox}\bigskip\noindent}%
  \ifthenelse{\boolean{pcode@plain}}{\TheSbox}{}%
  \ifthenelse{\boolean{pcode@ruled}}{\TheSbox}{}%
  \ifthenelse{\boolean{pcode@shad}}{\shadowbox{\TheSbox}}{}%
  \ifthenelse{\boolean{pcode@dbox}}{\doublebox{\TheSbox}}{}%
  \ifthenelse{\boolean{pcode@obox}}{\cornersize*{4ex}\ovalbox{\TheSbox}}{}%
  \ifthenelse{\boolean{pcode@Obox}}{\cornersize*{4ex}\Ovalbox{\TheSbox}}{}%
  \ifthenelse{\boolean{pcode@fbox}}{\fbox{\TheSbox}}{}%
  \bigskip%
 }%
}%
%
\newcommand{\STMTNUM}[2]{&\refstepcounter{pseudonum}\hspace*{#1}%
\mbox{(\thepseudonum)\label{#2}}}
\newcommand{\LOCAL}[1]{\mbox{\bfseries local}\pcode@tab{1}#1}
\newcommand{\GLOBAL}[1]{\mbox{\bfseries global}\pcode@tab{1}#1}
\newcommand{\EXTERNAL}[1]{\mbox{\bfseries external}\pcode@tab{1}#1}
\newcommand{\COMMENT}[1]%
{%
 \vspace*{1ex}%
 \mbox{\bfseries comment:}\pcode@tab{.5} \mbox{#1}
}
\newcommand{\BEGIN}{\left\{\begin{array}{@{}lr@{}}}
\newcommand{\END}{\end{array}\right.}
\newcommand{\PROCEDURE}[2]%
{%
 \mbox{\bfseries procedure }\pcode@AF{#1}(\ensuremath{#2})\\%
 \begin{array}{@{\pcode@tab{1}}l@{}}%
}
\newcommand{\ENDPROCEDURE}{\vspace*{2ex}\end{array}\\ }
\newcommand{\CALL}[2]{\pcode@AF{#1}(#2)} % 
\newcommand{\MAIN}{\mbox{\bfseries main}\\\begin{array}{@{\pcode@tab{1}}lr@{}}}
\newcommand{\ENDMAIN}{\end{array}}
\newcommand{\RETURN}[1]{\ifthenelse{\equal{#1}{} }%
{\mbox{\bfseries return }}%
{\mbox{\bfseries return }(#1)}}
\newcommand{\OUTPUT}[1]{\mbox{\bfseries output }(#1)}
\newcommand{\EXIT}{\mbox{\bfseries exit }}
\newcommand{\BREAK}{\mbox{\bfseries break }}
\newcommand{\IF}{\mbox{\bfseries if }}
\newcommand{\LET}{\mbox{\bfseries let }}
\newcommand{\CTHEN}{\pcode@tab{1}\mbox{ \bfseries then }}
\newcommand{\CELSE}{\pcode@tab{1}\mbox{ \bfseries else }}
\newcommand{\THEN}{\\\pcode@tab{1}\mbox{ \bfseries then }}
\newcommand{\ELSE}{\\\pcode@tab{1}\mbox{ \bfseries else }}
\newcommand{\ELSEIF}{\\\pcode@tab{1}\mbox{ \bfseries else if }}
\newcommand{\FOREACH}{\mbox{\bfseries for each }}
\newcommand{\FORALL}{\mbox{\bfseries for all }}
\newcommand{\FOR}{\mbox{\bfseries for }}
\newcommand{\TO}{\mbox{ \bfseries to }}
\newcommand{\DOWNTO}{\mbox{ \bfseries downto }}
\newcommand{\CASE}{\mbox{\bfseries case }}
\newcommand{\OF}{\\\pcode@tab{1}\mbox{ \bfseries of }\BEGIN}
\newcommand{\ENDCASE}{\END}
\newcommand{\AND}{\mbox{ \bfseries and }}
\newcommand{\OR}{\mbox{ \bfseries or }}
\newcommand{\NOT}{\mbox{ \bfseries not }}
\newcommand{\SUCCESS}{\mbox{ \bfseries success }}
\newcommand{\FAIL}{\mbox{ \bfseries fail }}
\newcommand{\TRUE}{\mbox{ \bfseries true }}
\newcommand{\FALSE}{\mbox{ \bfseries false }}
\newcommand{\GOTO}{\mbox{\bfseries go to }}
\newcommand{\DO}{\\\pcode@tab{1}\mbox{ \bfseries do }}
\newcommand{\ADO}{\mbox{ \bfseries do }}
\newcommand{\WHILE}{\mbox{\bfseries while }}
\newcommand{\REPEAT}{\mbox{\bfseries repeat }\\\begin{array}{@{\pcode@tab{1}}lr@{}}}
\newcommand{\UNTIL}{\end{array}\\\mbox{\bfseries until }}
\newcommand{\GETS}{\leftarrow}
\endinput
%% END pseudodcode.sty

