% \iffalse
%<*driver>
\ProvidesFile{algxpar.dtx}
\documentclass{ltxdoc}
\usepackage[english]{babel}

\usepackage{xcolor}
\usepackage{fancyvrb}
\usepackage{tcolorbox}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\tcbuselibrary{listings, skins, xparse, breakable}
\newenvironment{commands}{
	\VerbatimEnvironment
	\begin{tcolorbox}[
		bottomrule = 0pt,
		toprule = 0pt,
		leftrule = 0pt,
		rightrule = 0pt,
		titlerule = 0pt,
		colframe = white,
		colback = white,
		sharp corners,
		pad at break*=1pc,
		enhanced jigsaw,
		overlay first and middle={
			\coordinate (A1) at ($(interior.south east) + (-10pt,5pt)$);
			\coordinate (C1) at ($(interior.south east) + (-6pt,7.5pt)$);
			\draw[fill=tcbcol@frame] (A1) -- +(0,5pt) -- (C1) -- cycle;
		},
	]%
	\begin{Verbatim}[gobble = 2, tabsize=4, commandchars = &\[\]]%
}{%
	\end{Verbatim}%
	\end{tcolorbox}%
}
\newtcolorbox{codigo}[1]{%
	bottomrule = 0pt,
	toprule = 0pt,
	leftrule = 0pt,
	rightrule = 0pt,
	titlerule = 0pt,
	sharp corners,
	sidebyside,
	sidebyside align = top,
	#1
}
\newcommand{\afile}[1]{\mbox{\texttt{#1}}}
\newcommand{\package}[1]{\mbox{\textsf{#1}}}
\newcommand{\inlinecommand}[1]{\mbox{\texttt{#1}}}

\usetikzlibrary{calc}
\newenvironment{example}{
	\begingroup\tcbverbatimwrite{\jobname_code.tmp}
}{
	\endtcbverbatimwrite\endgroup%
	\begin{tcolorbox}[
			bottomrule = 0pt,
			toprule = 0pt,
			leftrule = 0pt,
			rightrule = 0pt,
			titlerule = 0pt,
			colframe = white,
			segmentation style = {black!30, solid},
			colback = white,
			sharp corners,
			pad at break*=1pc,
			enhanced jigsaw,
			breakable,
			overlay first and middle={
				\coordinate (A1) at ($(interior.south east) + (-10pt,5pt)$);
				\coordinate (C1) at ($(interior.south east) + (-6pt,7.5pt)$);
				\draw[fill=tcbcol@frame] (A1) -- +(0,5pt) -- (C1) -- cycle;
			},
		]%
	\small\VerbatimInput[tabsize=4, gobble = 2]{\jobname_code.tmp}
	\tcblower
% 	\begin{minipage}{0.85\linewidth}
	\begin{algorithmic}
		\input{\jobname_code.tmp}
	\end{algorithmic}
% 	\end{minipage}
	\end{tcolorbox}
}	

\usepackage[backref=page]{hyperref}
\hypersetup{
	colorlinks,
	urlcolor = blue!20!black,
	linkcolor = blue!10!black,
	citecolor = black!80,
}

\usepackage{algxpar}

\usepackage{imakeidx}
\makeindex

\EnableCrossrefs
% \CodelineIndex
% \PageIndex
\RecordChanges
\begin{document}
	\sloppy
	\DocInput{algxpar.dtx}
\end{document}
%</driver>
% \fi
%
% \let\DM\DescribeMacro
% \makeatletter
% \def\cstostr#1{%
% 	\expandafter\@gobble\detokenize\expandafter{\string#1}}
% \makeatother
% \renewcommand{\DescribeMacro}[1]{%
% 	\DM{#1}%
% }
%
% \CheckSum{0}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
% \changes{v0.9}{2019/10/23}{Initial version}
%
% \GetFileInfo{algxpar.sty}
%
%
% \DoNotIndex{\newcommand,\newenvironment,\renewcommand,\renewenvironment}
% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
% \DoNotIndex{\@ne}
% \DoNotIndex{\advance,\begingroup,\catcode,\closein}
% \DoNotIndex{\closeout,\day,\def,\edef,\else,\empty,\endgroup}
% \DoNotIndex{\def,\dimexpr,\parbox,\relax,\else,\fi,\hfill}
% \DoNotIndex{\setlength,\settowidth,\strut,\ifdim,\ifx}
% \DoNotIndex{\linewidth,\temp,\theALG@nested}
% \DoNotIndex{\\}
% \DoNotIndex{\RaggedRight}
%  
% 
% \title{The \package{algxpar} package\thanks{This document
%   corresponds to \package{algxpar}~\fileversion, dated \filedate.}}
% \author{Jander Moreira\\\texttt{moreira.jander@gmail.com}}
%
% \maketitle
% % 
% \begin{abstract}
% 	The \textsf{algxpar} packages is an extension of the \textsf{algorithmicx} package to handle multiline text with the proper indentation.
% \end{abstract}
% 
% \tableofcontents
% 
% \PrintChanges
%
% \section{Introduction}
% I teach algorithms and programming and adopted the \package{algorithmicx} package (\package{algpseudocode}) to typeset my code, as it provides a clean, easy to read pseudolanguage algorithms with a minimum effort to write.
% 
% As part of the teaching process, I use very verbose commands in my algorithms before the students start to use more sintetic text. For example, I use ``\textit{Iniciate a counter $c$ with the value $0$}'', what will become ``${c \gets 0}$'' later. This leads to sentences that often span the text for multiple lines, specially in two-column documents with nested structures.
% 
% Unfortunatelly, \package{algorithmicx} has no support for multiline statements natively, but it can adapted to use |\parbox|es to achive this goal.
% 
% This package, therefore, extends macros to handle multiple lines in a seamlessly way. Some new commands and features are also added.
% 
% \section{Instalation}
% The package \package{algxpar} is provided by the files \afile{algxpar.ins} and \afile{algxpar.dtx}.
% 
% If the \afile{.sty} file is not available, it can be generated by running the following at a command line prompt.
% 
% \begin{commands}
% latex algxpar.ins
% \end{commands}
% 
%  Then the generated \afile{algxpar.sty} must be copied to a directory searched by \LaTeX. Package dependencies can be checked in section~\ref{sec:implementation}.
%
%
% \section{Usage}
% The package must be loaded using
% \begin{commands}
% \usepackage&oarg[options]{algxpar}
% \end{commands}
% 
% The only option to the package is |brazilian|, which sets the pseudocode ``reserved words'' to Brazilian Portuguese, so |\While| is rendered \textbf{enquanto} instead of \textbf{while}, for example. No other language is supported so far, but a translation can be easily achieved (see section~\ref{sec:customization}).
%
%
% \section{Writing pseudocode}
% The algorithms must be written using the |algorithmic| environment and use basically the same set of macros defined by \package{algpseudcode}.
% 
% \begin{commands}
% \begin{algorithmic}
%     &ensuremath[&langle]&textrm[&textit[contents]]&ensuremath[&rangle]
% \end{algorithmic}
% \end{commands}
%
% \subsubsection*{Example}
% Consider the following code.
%
% \begin{commands}
% \begin{algorithmic}
% \Function{Max}{$a, b$}
% 	\If{$a > b$}
% 		\Statep{\Return $a$}
% 	\Else
% 		\Statep{\Return $b$}
% 	\EndIf
% \EndFunction
% \end{algorithmic}
% \end{commands} 
%
% The corresponding typeset is shown below.
%
% \begin{algorithmic}
% \Function{Max}{$a, b$}
% 	\If{$a > b$}
% 		\Statep{\Return $a$}
% 	\Else
% 		\Statep{\Return $b$}
% 	\EndIf
% \EndFunction
% \end{algorithmic}
%
%
% \subsection{Header}
% A header for the algorithm is proposed so the algorithm can provide a description, its inputs and outputs, as well as the preconditions and post-conditions Therefore, new macros are defined.
% 
% \DescribeMacro{\Description}
%	A description can be provided for the sake of code documentation. The macro |\Description| is used to provide such a text.
% \DescribeMacro{\Input}
% \DescribeMacro{\Output}
%	The input requirements for the algorithm uses the clause |\Input| and the produced by the code should be expressed with |\Output|.
% \DescribeMacro{\Require}
% \DescribeMacro{\Ensure}
% Also, the possibility to use |\Require| and |\Ensure| remains.
% 
% \subsubsection*{Examples}
%
% \begin{example}
% \Description Evaluates and prints the factorial of $n$
% \Input A non-negative integer number $n$
% \Output The value of the factorial $n$\end{example}
%
% \begin{example}
% \Require $n \in \{1, 2, \ldots, 10\}$
% \Ensure $k = \max(1, 2, \ldots, 10)$\end{example}
%
%
% \subsection{Constants and identifiers}
% \DescribeMacro{\True}
% \DescribeMacro{\False}
% \DescribeMacro{\Nil}
% Some additional macros were added: |\True|, |\False|, and |\Nil|, producing \True, \False, and \Nil, respectively.
%
% \DescribeMacro{\Id}
% The macro |\Id|\marg{id} was included to support long variable names, such as \Id{maxval} or \Id{count}, for example. This macro handles better ligatures and accented characters than the regular math mode. |$offered$| results in $offered$ and |\Id{offered}| produces \Id{offered}. With accented characters, |$magnético$| and |\Id{magnético}| result in $magnético$ and \Id{magnético}, respectively. 
%
% \DescribeMacro{\TextString}
% For literal constants, usually represented quoted in programs and algorithms, the macro |\TextString|\marg{text} is provided, so |\TextString{Error}| produces \TextString{Error}.
%
% \DescribeMacro{\VisibleSpace}
% An additional macro called |\VisibleSpace| is also provided to produce \VisibleSpace. Sometimes the number of spaces is relevant in text strings, so one can write |\TextString{a\VisibleSpace\VisibleSpace\VisibleSpace b}| to get \TextString{a\VisibleSpace\VisibleSpace\VisibleSpace b}.
%
% The macros |\Id| and |\TextString| work in text and math modes.
%
% \subsection{Assignment, reading and writing}
% \DescribeMacro{\gets}
% The default symbol for assigning values to variables is $\gets$, provided by |\gets|. This is a clearer option, once the equal sign is left just for comparisons.
%
% \DescribeMacro{\Read}
% \DescribeMacro{\Write}
% Although not common in algorithms published in scientific journals, explicit reading and writing is necessary for basic algorithms. Therefore |\Read| and |\Write| fulfills this need.
% 
% \begin{example}
% \Statep{\Read\ $a, b$}
% \Statep{$s \gets a + b$}
% \Statep{\Write\ $s$}\end{example}
% 
% \subsection{Comments}
% Comments use the symbol \makeatletter\axp@commentleftsymbol\makeatother\ preceding the commented text and stay close to the left margin. Comment macros are intended to be used with |\State| or |\Statex|, when no multiline handling is done. Comments with multiline control are considered starting at section~\ref{sec:statements}.
%
% \DescribeMacro{\Comment}
% The macro |\Comment|\marg{text} puts \meta{text} at the end of the line. 
%
% \DescribeMacro{\Commentl}
% A variant, |\Commentl|\marg{text}, places the commented text without moving it to the left margin. It is a ``local'' comment.
%
% \DescribeMacro{\CommentIn}
% A third option is |\CommentIn|\marg{text}, that places the comment locally, but finishes it with \makeatletter\axp@commentrightsymbol\makeatother. Yes, that is really ugly.
%
% \begin{example}
% \State\Commentl{Simple counter}
% \State $c \gets 1$\Comment{initialize conter}
% \State $n \gets \Call{FirstInstance}{}$
% \While{$n < 0$}
% 	\State $c \gets c + 1$\Comment{counts one more}
% 	\State $n \gets \mbox{\CommentIn{all new} } \Call{NewInstance}{}$
% \EndWhile
% \end{example}
%
% \subsection{Statements}\label{sec:statements}%
% \DescribeMacro{\Statep}
% \DescribeMacro{\State}
% \DescribeMacro{\Statex}
% The statements should use |\Statep|\marg{text}, which defines a hang indent for continued lines. The \package{algorithmicx}'s  |\State| and |\Statex| can be used as well.
%
% In opposition to |\State| and |\Statex|, which uses justified text, |\Statep| aligns only to the left, what is aesthetically better than justification in my opinion.
% 
% Since |\Statep| uses a |\parbox| to span the text over multiple lines, no room is left for a comment. When needed a comment can be added through the optional argument: |\Statep|\oarg{comment}\marg{text}.
% 
% \subsubsection*{Example}
% \begin{example}
% \Statep{Calculate the value of $x$ using $k$ and $m$,
%	 considering the stochastic distribution}
% \Statep[$k \neq 0$, $m > k$]{Calculate the value of $x$
%	using $k$ and $m$, considering the stochastic distribution}\end{example}
% 
% \subsection{Conditionals}
% The traditional \textbf{if}-\textbf{then}-\textbf{else} structure is suported, handling nested commands as well.
% An \textbf{else~if} construction avoids nesting \textbf{if}s and getting too much indentation. The macros are: |\If|, |\Else|, and |\ElsIf|.
%
% \DescribeMacro{\If}
% \DescribeMacro{\Else}
% |\If|\oarg{comment}\marg{condition} is used for conditional execution and is ended with a |\EndIf|. The optional \meta{comment} is typeset to the left and the \meta{condition} is put in a |\parbox|. Regular |\Comment| and |\Commentl| can be used after |\Else|.
%
% \DescribeMacro{\ElsIf}
% The \textbf{else~if} clause is specified by |\ElsIf|\oarg{comment}\marg{condition}.
%
% \DescribeMacro{\Switch}
% \DescribeMacro{\EndSwitch}
% \DescribeMacro{\Case}
% \DescribeMacro{\EndCase}
% \DescribeMacro{\Otherwise}
% \DescribeMacro{\EndOtherwise}
% Flow control using a selection structure are provided by the macro |\Switch|\oarg{comment}\marg{selector}, ended with |\EndSwitch|. Each matching clause uses |\Case|\oarg{comment}\marg{value} and |\EndCase|. The default uses |\Otherwise| and |\EndOtherwise|.
% 
% To specify ranges, the macro |\Range|\oarg{step}\marg{start}\marg{end} can be used. For example, |\Range{1}{10}| outputs \Range{1}{10} and |\Range[2]{0}{10}| prints \Range[2]{0}{10}.
% 
% \subsubsection*{Examples}
%
% \begin{example}
% \If{$a < 0$}
% 	\Statep{$a \gets 0$}
% \EndIf\end{example}
% 
% \begin{example}
% \If[closing doors]{the building is empty and the
%   security system is active}
% 	\Statep{$\Id{status} \gets \TextString{ok}$}
% \Else
% 	\Statep{$\Id{status} \gets \TextString{not ok}$}
% \EndIf\end{example}
% 
% \begin{example}
% \If[desired status]{$n \geq 0.8$}
% 	\Statep{$\Id{status} \gets \TextString{excelent}$}
% \ElsIf{$n \geq 0.7$}
% 	\Statep{$\Id{status} \gets \TextString{great}$}
% \ElsIf{$n \geq 0.5$}
% 	\Statep{$\Id{status} \gets \TextString{good}$}
% \ElsIf{$n \geq 0.2$}
% 	\Statep{$\Id{status} \gets \TextString{not so good}$}
% \Else\Comment{minimum not achieved}
% 	\Statep{$\Id{status} \gets \TextString{call for help}$}
% \EndIf\end{example}
% 
% \begin{example}
% \Switch[$1 \leq \Id{month} \leq 12$]{\Id{month}}
%     \Case{2}
%         \If{\Call{IsLeapYear}{\Id{year}}}
%             \Statep{$n_{days} \gets 29$}
%         \Else
%             \Statep{$n_{days} \gets 28$}
%         \EndIf
%     \EndCase
%     \Case{4, 6, 9, 11}
%         \Statep{$n_{days} \gets 30$}
%     \EndCase
%     \Otherwise\Comment{1, 3, 5, 7, 8, 10, 12}
%         \Statep{$n_{days} \gets 31$}
%     \EndOtherwise
% \EndSwitch\end{example}
%
% \subsection{Loops}
% Loops uses \textbf{while}, \textbf{repeat~until}, and \textbf{for} flow control.
% 
% \DescribeMacro{\While}
% \DescribeMacro{\EndWhile}
% Loops with condition on top uses |\While|\oarg{comment}\marg{condition} and are ended with |\EndWhile|.
%
% \DescribeMacro{\Repeat}
% \DescribeMacro{\Until}
% When loops have their termination condition tested at the bottom, the macros |\Repeat| and |\Until|\oarg{comment}\marg{condition} are used.
% 
% \DescribeMacro{\For}
% \DescribeMacro{\ForAll}
% \DescribeMacro{\ForEach}
% The \textbf{for} loop starts with |\For|\oarg{comment}\marg{condition} and ends with |\EndFor|. To make things more versatile, |\For| can be replaced by |\ForAll| or |\ForEach|. 
%
% \DescribeMacro{\To}
% \DescribeMacro{\DownTo}
% \DescribeMacro{\Step}
% Some macros for supporting loops are also provided: |\To|, |\DownTo|, and |\Step|, which defaults to \To, \DownTo, and \Step, repectively.
% 
% \subsection*{Examples}
% \begin{example}
% \While{there is data in the input stream and no
%     termination signal was received}
%     \Statep{Get element $e$ from the input stream}
%     \Statep{\Call{Process}{$e$}}
% \EndWhile\end{example}
% 
% \begin{example}
% \Statep[$n_1, n_2 > 0$]{Let $n_1$ and $n_2$
% be the two integers in order to find the greatest
% number that divides both}
% \Repeat
%   \Statep[$n_1 \bmod n_2$]{Set \Id{rest} as the
%	      rest of the integer
%	      division of $n_1$ by $n_2$}
%   \Statep{Redefine $n_1$ with the value of $n_2$}
%   \Statep{Redefine $n_2$ with the value of \Id{rest}}
% \Until[terminates]{$\Id{rest} = 0$}
% \Statep[greatest common divisor]{Set $m$ to the value of $n_1$}\end{example}
% 
% \begin{example}
% \For{$i \gets n-1$ \DownTo\ $0$}
%   \Statep{$s \gets s + i$}
% \EndFor\end{example}
%
% \begin{example}
% \ForEach[main transactions]{transaction $t$ in the flow
%     of transactions for month $m$}
%     \Statep{\Call{ProcessTransaction}{$t$}}
% \EndFor\end{example}
%
% \begin{example}
% \ForAll{$e$ in set $M$}
%     \Statep{\Call{ProcessElement}{$e$}}
% \EndFor\end{example}
% 
% \subsection{Procedures and functions}
% \DescribeMacro{\Procedure}
% \DescribeMacro{\EndProcedure}
% \DescribeMacro{\Function}
% \DescribeMacro{\EndFunction}
% \DescribeMacro{\Return}
% Procedure and functions are supported with |\Procedure|\marg{name}\marg{arguments} and |\EndProcedure| and |\Function|\marg{name}\marg{arguments} and |\EndFunction|. The return value for functions use |\Return|.
%
% \subsection*{Examples}
% \begin{example}
% \Procedure{PrintError}{$code$}
%     \Switch{$code$}
%         \Case{1}
%             \Statep{\Write\ \TextString{Not found}}
%         \EndCase
%         \Case{2}
%             \Statep{\Write\ \TextString{Access denied}}
%         \EndCase
%         \Case{3}
%             \Statep{\Write\ \TextString{Blocked}}
%         \EndCase
%         \Otherwise
%             \Statep{\Write\ \TextString{Unknown}}
%         \EndOtherwise
%     \EndSwitch
% \EndProcedure\end{example}
% 
% \begin{example}
% \Function{CelsiusToFahrenheit}{$t$}
%     \Statep{\Return $\dfrac{9}{5}t + 32$}
% \EndFunction\end{example}
%
% \begin{example}
% \Function[many parameters]{MyFunction}
%    {$a$, $b$, $c$, $d$, $e$, $f$, $g$, $h$, $i$, $j$, $k$, $l$}
%     \Statep{\Return $\dfrac{a+b+c+d}{f+g+hi^{j}}kl$}
% \EndFunction\end{example}
% %
% \section{Extras}
% Sometimes just letting the |\parbox| handle the line breaks is not enough.
% \DescribeMacro{\NewLine}
% The macro |\NewLine| can be used to manually break lines.
% 
% \DescribeEnv{DefineCode}
% \DescribeMacro{\UseCode}
% \DescribeMacro{\ShowCode}
% It is possible to define pieces of code for later use. Using the environment |DefineCode| with a \meta{name}, a part of the pseudocode can be specified and used with |\UseCode|\marg{name}. The \meta{name} provided should be unique; when repeated the code is overwritten. The macro |\ShowCode|\oarg{options}\marg{name} displays the saved code \textit{verbatim}. Any option for |\VerbatimInput| from \package{fancyvrb} can be specified in \meta{options}. All chuncks of code are written to temporary files.
% 
% 
% \subsection*{Examples}
% 
% \begin{example}
% \If{$h > 0$ and\NewLine
% 		($n_1 \neq 0$ or $n_2 < n_1$) and \NewLine
% 		$p \neq \Nil$}
% 	\Statep{\Call{DoSomething}{}}
% \Else	
% 	\Statep{\Call{DoSomethingElse}{}}
% \EndIf
% \end{example}
% 
% \begin{DefineCode}{half_in_out}
% \Input A number $n$
% \Output Half of $n$ (i.e., $n/2$)
% \end{DefineCode}
% \begin{DefineCode}{half_code}
% \Statep[in]{Get $n$}
% \Statep[out]{Print $n/2$}
% \end{DefineCode}
%
% \begin{minipage}{\linewidth}
% \small
% \begin{Verbatim}[gobble = 2, tabsize = 4]
% \begin{DefineCode}{half_in_out}
% 	\Input A number $n$
% 	\Output Half of $n$ (i.e., $n/2$)
% \end{DefineCode}
% \begin{DefineCode}{half_code}
% 	\Statep[in]{Get $n$}
% 	\Statep[out]{Print $n/2$}
% \end{DefineCode}
% \end{Verbatim}
% \end{minipage}
%
% \vspace{\baselineskip}Inside |algorithmic| one can use the following definitions.
% \begin{example}
% \UseCode{half_in_out}
% \Statep{\Commentl{Code}}
% \UseCode{half_code}
% \end{example}
% 
% The source is shown by |\ShowCode{half_code}|.
% \ShowCode[gobble = 2]{half_code}
%
% \StopEventually{}
%
%
% \section{Implementation}\label{sec:implementation}%
% This package is \package{algxpar}~\fileversion~--~\LaTeXe.
% \vspace{\baselineskip}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{algxpar}
	[2019/10/24 v0.9 Algorithms with multiline/paragraph support]
%    \end{macrocode}

% \iffalse
%% Package options
% \fi
%    \begin{macrocode}
\newif\ifaxp@brazilian\axp@brazilianfalse
\DeclareOption{brazilian}{\axp@braziliantrue}
\DeclareOption*{\PackageWarning{algxpar}{Unknown ‘\CurrentOption’}}
\ProcessOptions\relax
%    \end{macrocode}

% \iffalse
%% Required packages
% \fi
% \package{ragged2e}: for |\RaggedRight|\par
% \package{listings}: to get accented characters in verbatim mode (pt\_BR)\par
% \package{amsmath}, amssymb: for |\triangleright| and |\triangleleft|\par
% \package{xcolor}: gray color for |\VisibleSpace|\par
% \package{tcolorbox}: verbatim save to file\par
% \package{fancyvrb}: verbatim read from file with tabs\par
%    \begin{macrocode}
\RequirePackage{algorithmicx}
\RequirePackage{algpseudocode}
\RequirePackage{ragged2e}
\RequirePackage{listings}
\RequirePackage{amsmath, amssymb}
\RequirePackage{xcolor}
\RequirePackage{tcolorbox} % to save verbatim
\RequirePackage{fancyvrb} % to load verbatim preserving tabs
%    \end{macrocode}

% \iffalse
%% Constants and identifiers
% \fi
% \begin{macro}{\True}
% \begin{macro}{\False}
% \begin{macro}{\Nil}
% \begin{macro}{\Id}
% \begin{macro}{\TextString}
% \begin{macro}{\VisibleSpace}
%    \begin{macrocode}
\algnewcommand\algorithmictrue{\textsc{True}}
\algnewcommand\algorithmicfalse{\textsc{False}}
\algnewcommand\algorithmicnil{\textsc{Nil}}
\algnewcommand\True{\mbox{\algorithmictrue}}
\algnewcommand\False{\mbox{\algorithmicfalse}}
\algnewcommand\Nil{\mbox{\algorithmicnil}}
\newcommand{\Id}[1]{\mbox{\textit{\rmfamily #1}}}
\newcommand{\TextString}[1]{\textrm{\normalfont``{\ttfamily\mbox{#1}}''}}
\algnewcommand{\VisibleSpace}{\textrm{\color{black!70}\textvisiblespace}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}

% \iffalse
%% Headings
% \fi
% \begin{macro}{\Description}
% \begin{macro}{\Input}
% \begin{macro}{\Output}
% \begin{macro}{\Ensure}
% \begin{macro}{\Require}
%    \begin{macrocode}
\algnewcommand\algorithmicdescription{\textbf{Description}}
\algnewcommand\algorithmicinput{\textbf{Input}}
\algnewcommand\algorithmicoutput{\textbf{Output}}
\algrenewcommand\algorithmicensure{\textbf{Ensure}}
\algrenewcommand\algorithmicrequire{\textbf{Require}}
\algnewcommand\Description{\item[\algorithmicdescription:]}
\algnewcommand\Input{\item[\algorithmicinput:]}
\algnewcommand\Output{\item[\algorithmicoutput:]}
\algrenewcommand\Ensure{\item[\algorithmicensure:]}
\algrenewcommand\Require{\item[\algorithmicrequire:]}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}

% \iffalse
%% Read, write
% \fi
% \begin{macro}{\Read}
% \begin{macro}{\Write}
%    \begin{macrocode}
\algnewcommand{\algorithmicread}{\textbf{read}}
\algnewcommand{\algorithmicwrite}{\textbf{write}}
\algnewcommand{\Read}{\algorithmicread}
\algnewcommand{\Write}{\algorithmicwrite}
%    \end{macrocode}
% \end{macro}
% \end{macro}

% \iffalse
%% Comments
% \fi
% \begin{macro}{\Comment}
% \begin{macro}{\Commentl}
% \begin{macro}{\CommentIn}
%    \begin{macrocode}
\newcommand{\axp@commentleftsymbol}{$\triangleright$}
\newcommand{\axp@commentrightsymbol}{$\triangleleft$}
\algnewcommand{\CommentIn}[1]{\axp@commentleftsymbol~%
  \textsl{#1}~\axp@commentrightsymbol}
\algnewcommand{\Commentl}[1]{\axp@commentleftsymbol~\textsl{#1}}
\algrenewcommand{\algorithmiccomment}[1]{%
	\def\tmp{#1}%
	\ifx\tmp\empty\else%
	\hfill\Commentl{#1}%
	\fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% 

% \iffalse
%% Statep
% \fi
% \begin{macro}{\Statep}
%    \begin{macrocode}
\newlength{\axp@stateindent}
\setlength{\axp@stateindent}{\dimexpr\algorithmicindent/2\relax}
\algnewcommand{\Statep}[2][]{\State\algparbox[#1]{#2}{\axp@stateindent}}
%    \end{macrocode}
%\end{macro}

% \iffalse
%% While
% \fi
% \begin{macro}{\While}
% \begin{macro}{\EndWhile}
%    \begin{macrocode}
\newlength{\axp@whilewidth}
\algblockdefx{While}{EndWhile}%
	[2][]{%
		\settowidth{\axp@whilewidth}{\algorithmicwhile\ }%
		\algparbox[#1]{\algorithmicwhile\ #2~\algorithmicdo}{\axp@whilewidth}%
	}%
	{\algorithmicend\ \algorithmicwhile}
%    \end{macrocode}
% \end{macro}
% \end{macro}

% \iffalse
%% Repeat
% \fi
% \begin{macro}{\Repeat}
% \begin{macro}{\Until}
%    \begin{macrocode}
\newlength{\axp@untilwidth}
\algblockdefx{Repeat}{Until}%
	{\algorithmicrepeat}%
	[2][]{%
		\settowidth{\axp@untilwidth}{\algorithmicuntil\ }%
		\axp@algparbox{#1}{\algorithmicuntil\ #2}{\axp@untilwidth}{0}%
	}
%    \end{macrocode}
% \end{macro}
% \end{macro}

% \iffalse
%% If, else if, else
% \fi
% \begin{macro}{\If}
% \begin{macro}{\Else}
% \begin{macro}{\ElsIf}
% \begin{macro}{\EndIf}
%    \begin{macrocode}
\newlength{\axp@ifwidth}
\newlength{\axp@elseifwidth}
\algblockdefx[If]{If}{EndIf}%
	[2][]{%
		\settowidth{\axp@ifwidth}{\algorithmicif\ }%
		\algparbox[#1]{\algorithmicif\ #2~\algorithmicthen}{\axp@ifwidth}%
	}
	{\algorithmicend\ \algorithmicif}
\algcblockx[If]{If}{ElsIf}{EndIf}
	[2][]{%
		\settowidth{\axp@elseifwidth}{\algorithmicelse\ \algorithmicif\ }%
		\algparbox[#1]{\algorithmicelse~\algorithmicif\ #2~\algorithmicthen}{\axp@elseifwidth}%
	}
	{\algorithmicend\ \algorithmicif}
\algcblockx{If}{Else}{EndIf}
	{\textbf{\algorithmicelse}}
	{\textbf{\algorithmicend~\algorithmicif}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}

% \iffalse
%% Switch, case, otherwise
% \fi
% \begin{macro}{\Switch}
% \begin{macro}{\EndSwitch}
% \begin{macro}{\Case}
% \begin{macro}{\EndCase}
% \begin{macro}{\Otherwise}
% \begin{macro}{\EndOtherwise}
% \begin{macro}{\Range}
%    \begin{macrocode}
\algnewcommand{\algorithmicswitch}{\textbf{switch}}
\algnewcommand{\algorithmicof}{\textbf{of}}
\algnewcommand{\algorithmiccase}{\textbf{case}}
\algnewcommand{\algorithmicotherwise}{\textbf{otherwise}}
\newlength{\axp@switchwidth}
\algblockdefx{Switch}{EndSwitch}%
	[2][]{%
		\settowidth{\axp@switchwidth}{\algorithmicswitch\ }%
		\algparbox[#1]{\algorithmicswitch\ #2~\algorithmicof}{\axp@switchwidth}%
	}
	{\algorithmicend~\algorithmicswitch}
\newlength{\axp@casewidth}
\algblockdefx{Case}{EndCase}%
	[2][]{%
		\settowidth{\axp@casewidth}{\algorithmiccase\ }%
		\algparbox[#1]{\algorithmiccase\ #2~\algorithmicdo}{\axp@casewidth}%
	}
	{\algorithmicend~\algorithmiccase}
\algblockdefx{Otherwise}{EndOtherwise}%
	{\algorithmicotherwise~\algorithmicdo}%
	{\textbf{\algorithmicend\ \algorithmicotherwise}}
\newcommand{\Range}[3][]{%
	\ensuremath{%
		#2%
		\def\temp{#1}%
		\mathcal{\ldotp\ldotp}#3
		\ifx\temp\empty\relax\else{\ensuremath{\mathcal{:}#1}}\fi%
	}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}

% \iffalse
%% For, for each, for all
% \fi
% \begin{macro}{\For}
% \begin{macro}{\ForEch}
% \begin{macro}{\ForAll}
% \begin{macro}{\EndFor}
% \begin{macro}{\To}
% \begin{macro}{\DownTo}
% \begin{macro}{\Step}
%    \begin{macrocode}
\algnewcommand{\To}{\textbf{to}}
\algnewcommand{\DownTo}{\textbf{downto}}
\algnewcommand{\Step}{\textbf{step}}
\newlength{\axp@forwidth}
\algblockdefx{For}{EndFor}%
	[2][]{%
		\settowidth{\axp@forwidth}{\algorithmicfor\ }%
		\algparbox[#1]{\algorithmicfor\ #2~\algorithmicdo}{\axp@forwidth}%
	}
	{\algorithmicend\ \algorithmicfor}
\algnewcommand{\algorithmicforeach}{\textbf{for~each}}
\newlength{\axp@foreachwidth}
\algblockdefx{ForEach}{EndFor}%
	[2][]{%
		\settowidth{\axp@foreachwidth}{\algorithmicforeach\ }%
		\algparbox[#1]{\algorithmicforeach\ #2~\algorithmicdo}{\axp@foreachwidth}%
	}
	{\algorithmicend\~\algorithmicfor}
\newlength{\axp@forallwidth}
\algblockdefx{ForAll}{EndFor}%
	[2][]{%
		\settowidth{\axp@forallwidth}{\algorithmicforall\ }%
		\algparbox[#1]{\algorithmicforall\ #2~\algorithmicdo}{\axp@forallwidth}%
	}%
	{\algorithmicend\ \algorithmicfor}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}

% \iffalse
%% Procedure, function, calls
% \fi
% \begin{macro}{\Procedure}
% \begin{macro}{\EndProcedure}
% \begin{macro}{\Function}
% \begin{macro}{\EndFunction}
% \begin{macro}{\Call}
%    \begin{macrocode}
\newlength{\axp@procedurewidth}
\newlength{\axp@namewidth}
\algblockdefx{Procedure}{EndProcedure}%
	[3][]{%
		\settowidth{\axp@procedurewidth}{\algorithmicprocedure~}%
		\settowidth{\axp@namewidth}{\textsc{#2}(}%
		\addtolength{\axp@procedurewidth}{0.6\axp@namewidth}%
		\algparbox[#1]{\algorithmicprocedure\ \textsc{#2}(#3)}{\axp@procedurewidth}
	}%
	{\algorithmicend\ \algorithmicprocedure}
\newlength{\axp@functionwidth}
\algblockdefx{Function}{EndFunction}%
	[3][]{%
		\settowidth{\axp@functionwidth}{\algorithmicfunction~}%
		\settowidth{\axp@namewidth}{\textsc{#2}(}%
		\addtolength{\axp@functionwidth}{0.6\axp@namewidth}%
		\algparbox[#1]{\algorithmicfunction\ \textsc{#2}(#3)}{\axp@functionwidth}
	}%
	{\algorithmicend\ \algorithmicfunction}
\algrenewcommand\Call[2]{%
	\def\argstmp{#2}%
	\textsc{#1}\ifx\argstmp\empty\mbox{(\hskip0.5ex)}\else(#2)\fi%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}

% \iffalse
%% NewLine
% \fi
% \begin{macro}{\NewLine}
%    \begin{macrocode}
\newcommand{\NewLine}{\\}
%    \end{macrocode}
% \end{macro}

% \iffalse
%% DefineCode, UseCode, \ShowCode
% \fi
% \begin{environment}{DefineCode}
% \begin{macro}{\UseCode}
% \begin{macro}{\ShowCode}
%    \begin{macrocode}
\newenvironment{DefineCode}[1]
{\begingroup\tcbverbatimwrite{\jobname_code_#1.tmp}}
{\endtcbverbatimwrite\endgroup}	
\newcommand{\UseCode}[1]{\input{\jobname_code_#1.tmp}}
\newcommand{\ShowCode}[2][]{{\small\VerbatimInput[tabsize=4, #1]%
		{\jobname_code_#2.tmp}}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{environment}

% \begin{macro}{\alglinenumber}
%    \begin{macrocode}
\algrenewcommand{\alglinenumber}[1]%
  {\hspace{-1em}\color{black!35}{\scriptsize#1}{\tiny$\blacktriangleright$}}
%    \end{macrocode}
% \end{macro}

% \iffalse
%% axp@algparbox
% \fi
% \begin{macro}{\axp@algparbox}
%    \begin{macrocode}
\newlength{\axp@commentwidth}
\setlength{\axp@commentwidth}{0pt}
\newcommand{\algparbox}[3][]{\axp@algparbox{#1}{#2}{#3}{1}}

\newlength{\axp@largestcommentwidth}
\setlength{\axp@largestcommentwidth}{0.3\linewidth}
\newcommand{\axp@algparbox}[4]{%
    \def\temp{#1}%
    \ifx\temp\empty%
        \setlength{\axp@commentwidth}{-2em}%
    \else%
        \settowidth{\axp@commentwidth}{\axp@commentleftsymbol\ #1}%
        \ifdim\axp@commentwidth>\axp@largestcommentwidth\relax%
            \setlength{\axp@commentwidth}{\axp@largestcommentwidth}%
        \fi%
    \fi%
    \renewcommand{\NewLine}{\\\hspace{#3}}%
    \parbox[t]{\dimexpr\linewidth-\axp@commentwidth-%
        (\algorithmicindent)*(\theALG@nested - #4)-2em}%
        {\RaggedRight\setlength{\hangindent}{#3}#2\strut}%
    \ifx\temp\empty\else%
        \hfill\axp@commentleftsymbol\hspace{0.5em}%
        \parbox[t]{\axp@commentwidth}{\slshape\RaggedRight#1}%
    \fi%
    \renewcommand{\NewLine}{\\}%
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\lstset{
	literate=
		{á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
		{Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
		{à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
		{À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
		{ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
		{ã}{{\~a}}1 {õ}{{\~o}}1 
		{Ã}{{\~A}}1 {Õ}{{\~O}}1 
		{Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
		{â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
		{Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
		{ç}{{\c c}}1 {Ç}{{\c C}}1
		{ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
		{œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1
		{ß}{{\ss}}1
		{ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1
		{£}{{\pounds}}1
		{«}{{\guillemotleft}}1
		{»}{{\guillemotright}}1
		{ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1
}
%    \end{macrocode}

%
% \section{Customization}\label{sec:customization}%
% By default, the longest width for a comment at the right margin is 
%|0.3\linewidth|. This can be changed using something like the code below.
% 
% \begin{commands}
% \makeatletter
% \setlength{\axp@largestcommentwidth}{&meta[new length]}
% \makeatother
% \end{commands}
% 
% The assignment sign can be changed from $\gets$ to anything else, as well as the symbols used in comments.
% 
% \begin{commands}
% \renewcommand{\gets}{\mathop{::=}}
% \renewcommand{\axp@commentleftsymbol}{\texttt{//}}
% \renewcommand{\axp@commentrightsymbol}{\texttt{*/}}
% \end{commands}
% 
% The translation to Brazilian Portugues is straight forward.
%
%    \begin{macrocode}
\ifaxp@brazilian
\RequirePackage{icomma} % comma as decimal separator
\algrenewcommand\algorithmicdescription{\textbf{Descrição}}
\algrenewcommand\algorithmicinput{\textbf{Entrada}}
\algrenewcommand\algorithmicoutput{\textbf{Saída}}
\algrenewcommand\algorithmicrequire{\textbf{Pré}}
\algrenewcommand\algorithmicensure{\textbf{Pós}}
\algrenewcommand{\algorithmicend}{\textbf{fim}}
\algrenewcommand{\algorithmicif}{\textbf{se}}
\algrenewcommand{\algorithmicthen}{\textbf{então}}
\algrenewcommand{\algorithmicelse}{\textbf{senão}}
\algrenewcommand{\algorithmicswitch}{\textbf{escolha}}
\algrenewcommand{\algorithmicof}{\textbf{de}}
\algrenewcommand{\algorithmiccase}{\textbf{caso}}
\algrenewcommand{\algorithmicotherwise}{\textbf{caso~contrário}}
\algrenewcommand{\algorithmicfor}{\textbf{para}}
\algrenewcommand{\algorithmicdo}{\textbf{faça}}
\algrenewcommand{\algorithmicwhile}{\textbf{enquanto}}
\algrenewcommand{\algorithmicforall}{\textbf{para cada}}
\algrenewcommand{\algorithmicrepeat}{\textbf{repita}}
\algrenewcommand{\algorithmicuntil}{\textbf{até que}}
\algrenewcommand{\algorithmicloop}{\textbf{repita}} 
\algrenewcommand{\algorithmicforeach}{\textbf{para~cada}}
\algrenewcommand{\algorithmicforall}{\textbf{para~todo}}
\algrenewcommand{\algorithmicfunction}{\textbf{função}}
\algrenewcommand{\algorithmicprocedure}{\textbf{procedimento}}
\algrenewcommand{\algorithmicreturn}{\textbf{retorne}}
\algrenewcommand\algorithmictrue{\textsc{Verdadeiro}}
\algrenewcommand\algorithmicfalse{\textsc{Falso}}
\algrenewcommand\algorithmicnil{\textsc{Nulo}}
\algrenewcommand{\algorithmicread}{\textbf{leia}}
\algrenewcommand{\algorithmicwrite}{\textbf{escreva}}
\algrenewcommand{\To}{\textbf{até}}
\algrenewcommand{\DownTo}{\textbf{decrescente~até}}
\algrenewcommand{\Step}{\textbf{passo}}
\fi
%    \end{macrocode}
% 
% \section{To do\ldots}
% There are lots of improvements to make in the code. I recognize it!
% 
% \section*{Appendix}
% \appendix
%\section{An example}
% \newcommand*{\Leaf}{\mbox{\textsc{Leaf}}}
% \newcommand*{\Internal}{\mbox{\textsc{Internal}}}
% \newcommand*{\InvalidItem}{\mbox{\textsc{InvalidItem}}}
% 
% \begin{example}
% 	\Description Inserts a new item in the B-tree structure,
% 		handling only the root node
% 	\Input The \Id{item} to be inserted
% 	\Output Returns \True\ in case of success, \False\ in
% 		case of failure (i.e., duplicated keys)
% 	\Function{Insert}{\Id{item}}
% 		\If{\Id{tree.root address} is \Nil}
% 			\Statep{\Commentl{Create first node}}
% 			\Statep[\Nil\ = new node]{$\Id{new root node}
% 				\gets \Call{GetNode}{\Nil}$}
% 			\Statep[only item]{Insert \Id{item} in \Id{new
% 				root node} and set both  its left and right
% 				childs to \Nil; also set \Id{new root
% 				node.count} to 1}
% 			\Statep[first node is always a leaf]{Set \Id{new
% 				root node.type} to \Leaf}
% 			\Statep[flag that node must be updated in file]
% 				{Set \Id{new root node.modified} to \True}
% 			\Statep{\Call{WriteNode}{\Id{new root node}}}
% 			\Statep{$\Id{tree.root address} \gets
% 				\Id{new root node.address}$}
% 			\Statep[update root address in file]
% 				{\Call{WriteRootAddress}{}}
% 			\Statep{\Return \True}
% 		\Else
% 			\Statep{\Commentl{Insert in existing tree}}
% 			\Statep[]{$\Id{success}$, 
% 			$\Id{promoted item}$, $\Id{new node address} \gets
% 				\Call{SearchInsert}{\Id{tree.root address},
% 				\Id{item}}$}
% 			\If[root has splitted]{\Id{success} and
% 				${\Id{new node address}\neq\Nil}$}
% 				\Statep[new root]{$\Id{new root node} \gets
% 					\Call{GetNode}{\Nil}$}
% 				\Statep{Insert \Id{promoted item} in \Id{new
% 					root node} and set \Id{new root node.count}
% 					to 1}
% 				\Statep[tree height grows]{Set \Id{item}'s
% 					left child to \Id{tree.root
% 					address} and right child to \Id{new
% 					node address}}
% 				\Statep[not a leaf]{Set \Id{new root
% 						node.type} to \Internal}
% 				\Statep{Set \Id{new root node.modified}
% 					to \True}
% 				\Statep{\Call{WriteNode}{\Id{new root
% 					node}}}
% 				\Statep{$\Id{tree.root address} \gets
% 					\Id{new root node.address}$}
% 				\Statep[update root address in
% 					file]{\Call{WriteRootAddress}{}}
% 			\EndIf
% 			\Statep[insertion status]{\Return \Id{success}}
% 		\EndIf
% 	\EndFunction
% \end{example}
%
% \clearpage\PrintIndex
%
% \Finale
\endinput