]> mj.ucw.cz Git - ucwmac.git/blobdiff - ucw-algo.tex
Algorithms: \func
[ucwmac.git] / ucw-algo.tex
index 6259fbce4f9265f535df63de52f1ebe360ab2d77..3d76de07ce80dc1cec769803981a285a20a19c72 100644 (file)
@@ -2,57 +2,95 @@
 % Written by Martin Mares <mj@ucw.cz> in 2018 and placed into public domain
 % -------------------------------------------------------------------------
 
+\ucwdefmodule{algo}
+
 %      \algo{name of the algorithm}\algalias{a longer name}
 %      \algin input description
 %      \:step
-%      \:step
+%      \:step  \cmt{comment}
 %      \::[identifier]nested step
 %      \:::yet more nested step
 %      \algout output description
 %      \endalgo
 
 % Localized strings
-\localedef{en}{alg:alg}{Algorithm}
-\localedef{en}{alg:proc}{Procedure}
-\localedef{en}{alg:in}{Input}
-\localedef{en}{alg:out}{Output}
+\localedef{0}{alg:alg}{Algorithm}
+\localedef{0}{alg:proc}{Procedure}
+\localedef{0}{alg:func}{Function}
+\localedef{0}{alg:in}{Input}
+\localedef{0}{alg:out}{Output}
+
+% Item indent
+\newdimen\algoindent
+\algoindent=2em
+
+% Extra indent for nested items
+\newdimen\algonestindent
+\algonestindent=2em
+
+% Width of item label
+\newdimen\algolabelwidth
+\algolabelwidth=0.5em
+
+% Set up spacing (customizable)
+\def\algospacing{
+       \itemnarrow=\itemindent
+       \interitemskip=1pt
+       \preitemizeskip=\bigskipamount
+       \postitemizeskip=\dimexpr \bigskipamount - \parskip \relax
+}
+
+% Set up paragraph mode for a single step of the algorithm (customizable)
+\def\algopar{
+       \par
+       \parindent=\algoindent
+       \hangindent=\algoindent
+       \advance\hangindent by \algolabelwidth
+       \hangafter=1
+       \leavevmode
+}
+
+% Typeset step label (customizable)
+\def\algostep#1{\hbox to \algolabelwidth{\hss #1~~}}
 
 \def\algoinit{
-\goodbreak
-\begingroup
-\itemnarrow=\itemindent
-\interitemskip=1pt
-\preitemizeskip=\bigskipamount
-\postitemizeskip=\dimexpr \bigskipamount - \parskip \relax
-\inititemize
-\let\:=\algoitem
-\def\={\leftarrow}
-\itemcount=0
+       \begingroup
+       \algospacing
+       \inititemize
+       \let\:=\algoitem
+       \def\={\leftarrow}
+       \let\cmt=\algcmt
+       \itemcount=0
 }
+
 \def\typedalgo#1#2{\algoinit {\bo #1\/} \alg{#2}}
 \def\algo#1{\typedalgo{\localestr{alg:alg}}{#1}}
 \def\proc#1{\typedalgo{\localestr{alg:proc}}{#1}}
+\def\func#1{\typedalgo{\localestr{alg:func}}{#1}}
 \def\headlessalgo{\algoinit}
-\def\endalgo{\goodbreak\endlist\endgroup}
+
+\def\endalgo{\endlist\endgroup}
 \let\endproc=\endalgo
-\def\algopar{\par
-\parindent=2em
-\hangindent=2.5em      % \parindent + width of box for the step number
-\hangafter=1
-\leavevmode
+
+\def\algoitem{%
+       \ifnum\itemcount=0\par\nobreak\smallskip\fi
+       \algopar\advance\itemcount by 1
+       \algostep{\the\itemcount.}%
+       \futurelet\next\algoitemh
 }
-\def\algoitem{
-\ifnum\itemcount=0\par\nobreak\smallskip\fi
-\algopar\advance\itemcount by 1
-\hbox to 0.5em{\hss \the\itemcount.~~}%
-\futurelet\next\algoitemh}
+
 \def\algoitemh{\ifx\next:\let\next=\algohang\else\let\next=\algoitemgo\fi\next}
-\def\algohang:{\advance\hangindent by 2em \hskip 2em\futurelet\next\algoitemh}
+\def\algohang:{\advance\hangindent by \algonestindent \hskip \algonestindent\futurelet\next\algoitemh}
 \optdef\algoitemgo{\ifx\addid\undefined\else\addid{item}{\the\itemcount}\fi}
+
 \def\algin{\par\nobreak{\it \localestr{alg:in}:\/} }
-\def\algout{\par\nobreak\parindent=0pt{\it \localestr{alg:in}:\/} }
-\def\alginbreak{\hfil\break\hphantom{\it \localestr{alg:out}:\/} }
+\def\algout{\par\nobreak\parindent=0pt{\it \localestr{alg:out}:\/} }
+\def\alginbreak{\hfil\break\hphantom{\it \localestr{alg:in}:\/} }
 \def\algalias#1{ (#1)}
 
 % Algorithm name in text or in a formula
 \protected\def\alg#1{\leavevmode\hbox{\csc #1}}
+
+% Comments
+\def\algcmt#1{\unskip~~\hfill\fullcmt{#1}\ignorespaces}
+\def\fullcmt#1{{$\triangleleft$\hskip0.5em\it #1}}