X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw-algo.tex;h=3d76de07ce80dc1cec769803981a285a20a19c72;hb=fa766b8a159045ea246038d2f07f6b0bf5c24e06;hp=6259fbce4f9265f535df63de52f1ebe360ab2d77;hpb=7b42b6e264b475b438ac4bcd31029942d4b04925;p=ucwmac.git diff --git a/ucw-algo.tex b/ucw-algo.tex index 6259fbc..3d76de0 100644 --- a/ucw-algo.tex +++ b/ucw-algo.tex @@ -2,57 +2,95 @@ % Written by Martin Mares 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}}