CIS6700-Spring2025/listproc.sty

349 lines
10 KiB
TeX

%%
%% This is file `listproc.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% listproc.dtx (with options: `package')
%%
%% Copyright (C) 2011 by Jesse A. Tov
%%
%% This file may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License, either version 1.2 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.2 or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%%
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{listproc}[2011/08/03 v0.2 (list processing)]
\newcommand\newlist{\@lstp@def{}\newcommand}
\newcommand\renewlist{\@lstp@def{}\renewcommand}
\newcommand\deflist{\@lstp@def{}\def}
\newcommand\gdeflist{\@lstp@def\global\def}
\newcommand\@lstp@def[4]{%
#2#3{}%
\@for\lstp@def@temp:=#4\do{%
\expandafter\SnocTo\expandafter{\lstp@def@temp}#3%
}%
#1\let#3#3%
\let\lstp@def@temp\@undefined
}
\newtoks\lstp@ta
\newtoks\lstp@tb
\newcommand\ConsTo{\@lstp@ConsTo\relax\def}
\newcommand\gConsTo{\@lstp@ConsTo\global\def}
\newcommand\eConsTo{\@lstp@ConsTo\relax\edef}
\newcommand\xConsTo{\@lstp@ConsTo\global\edef}
\newcommand\@lstp@ConsTo[4]{%
\long#2\lstp@temp{#3}%
\lstp@ta=\expandafter{\expandafter\listitem\expandafter{\lstp@temp}}%
\lstp@tb=\expandafter{#4}%
#1\edef#4{\the\lstp@ta\the\lstp@tb}%
}
\newcommand\SnocTo{\@lstp@SnocTo\relax\def}
\newcommand\gSnocTo{\@lstp@SnocTo\global\def}
\newcommand\eSnocTo{\@lstp@SnocTo\relax\edef}
\newcommand\xSnocTo{\@lstp@SnocTo\global\edef}
\newcommand\@lstp@SnocTo[4]{%
\long#2\lstp@temp{#3}%
\lstp@ta=\expandafter{\expandafter\listitem\expandafter{\lstp@temp}}%
\lstp@tb=\expandafter{#4}%
#1\edef#4{\the\lstp@tb\the\lstp@ta}%
}
\newcommand\AppendTo{\@lstp@AppendTo\relax}
\newcommand\gAppendTo{\@lstp@AppendTo\global}
\newcommand\@lstp@AppendTo[3]{%
\lstp@ta=\expandafter{#2}%
\lstp@tb=\expandafter{#3}%
#1\edef#3{\the\lstp@ta\the\lstp@tb}%
}
\long\def\@LopOff\listitem#1#2\@LopOff#3#4{%
#3{#1}%
#4{#2}%
}
\newcommand\@lstp@LopTo[4]{\expandafter\@LopOff#3\@LopOff{#1\def#4}{#2\def#3}}
\newcommand\@lstp@RestTo[3]{\expandafter\@LopOff#2\@LopOff{\@gobble}{#1\def#3}}
\newcommand\LopTo{\@lstp@LopTo\relax\relax}
\newcommand\gLopTo{\@lstp@LopTo\global\global}
\newcommand\glLopTo{\@lstp@LopTo\global\relax}
\newcommand\lgLopTo{\@lstp@LopTo\relax\global}
\newcommand\FirstTo{\@lstp@LopTo\relax\@gobblethree}
\newcommand\gFirstTo{\@lstp@LopTo\global\@gobblethree}
\newcommand\RestTo{\@lstp@RestTo\relax}
\newcommand\gRestTo{\@lstp@RestTo\global}
\newcommand*\IfList[1]{%
{%
\expandafter\@IfList#1\@IfList
}%
}
\def\@IfList#1#2\@IfList{%
\ifx\listitem#1\relax
\aftergroup\@firstoftwo
\else
\aftergroup\@secondoftwo
\fi
}
\def\@forList#1:=#2\do#3{%
\long\def\lstp@for@listitem##1{%
\long\def#1{##1}%
#3%
\let\listitem\lstp@for@listitem%
}%
\let\listitem\lstp@for@listitem%
#2%
\let\listitem\@undefined%
}
\newcommand\SetToListLength[2]{%
\lstp@length{#2}{\value{#1}}%
}
\newcommand\lstp@length[2]{%
#2=0 %
\long\def\listitem##1{\advance#2 by1 }%
#1\let\listitem\@undefined%
}
\newcommand\MapListTo{\@lstp@MapListTo\relax}
\newcommand\gMapListTo{\@lstp@MapListTo\global}
\newcommand\MapAndAppendTo{\@lstp@MapAndAppendTo\relax}
\newcommand\gMapAndAppendTo{\@lstp@MapAndAppendTo\global}
\newcommand\@lstp@MapListTo[4]{%
\let\lstp@map@temp#3%
#1\let#4\empty%
\@lstp@MapAndAppendTo{#1}{#2}\lstp@map@temp#4%
\let\lstp@map@temp\@undefined%
}
\newcommand\@lstp@MapAndAppendTo[4]{%
\long\def\listitem##1{\@lstp@SnocTo{#1}\def{#2}{#4}}%
#3%
\let\listitem\@undefined%
}
\newcommand\lstp@insert[3]{%
\edef\lstp@insert@temp@a{#2{#1}}%
\let\lstp@insert@temp@i#3%
\let#3\empty
\long\def\lstp@insert@listitem##1{%
\edef\lstp@insert@temp@b{#2{##1}}%
\ifnum\lstp@insert@temp@a<\lstp@insert@temp@b
\SnocTo{#1}{#3}%
\let\listitem\lstp@insert@listitem@done
\else
\let\listitem\lstp@insert@listitem
\fi
\SnocTo{##1}{#3}%
}%
\long\def\lstp@insert@listitem@done##1{\SnocTo{##1}{#3}}%
\let\listitem\lstp@insert@listitem
\lstp@insert@temp@i%
\ifx\listitem\lstp@insert@listitem%
\SnocTo{#1}{#3}%
\fi%
\let\lstp@insert@temp@i\@undefined%
\let\listitem\@undefined%
}
\providecommand\@apply@group[2]{#1#2}
\newcommand\SortList[2][\@apply@group{}]{%
\let\lstp@sort@temp@i#2%
\let#2\empty
\long\def\lstp@sort@listitem##1{%
\lstp@insert{##1}{#1}{#2}%
\let\listitem\lstp@sort@listitem
}%
\let\listitem\lstp@sort@listitem
\lstp@sort@temp@i
\let\lstp@sort@temp@i\@undefined
\let\listitem\@undefined
}
\newcounter{lstp@ifsucc}
\newcommand\lstp@ifsucc[2]{%
\setcounter{lstp@ifsucc}{#1}%
\addtocounter{lstp@ifsucc}{1}%
\ifnum#2=\value{lstp@ifsucc}%
\let\@lstp@ifsucc@kont\@firstoftwo
\else
\let\@lstp@ifsucc@kont\@secondoftwo
\fi
\@lstp@ifsucc@kont
}
\newcommand\CompressList[2][\@apply@group{}]{%
\let\lstp@compress@temp@i#2%
\let#2\empty
\def\lstp@compress@add@single{%
\expandafter\SnocTo\expandafter
{\expandafter\@single\expandafter{\lstp@compress@temp@a}}{#2}%
}%
\def\lstp@compress@add@range{%
\expandafter\expandafter\expandafter\SnocTo
\expandafter\expandafter\expandafter{%
\expandafter\expandafter\expandafter\@range
\expandafter\expandafter\expandafter{%
\expandafter\lstp@compress@temp@a\expandafter}%
\expandafter{\lstp@compress@temp@b}}#2%
}%
\long\def\lstp@compress@listitem@start##1{%
\def\lstp@compress@temp@a{##1}%
\edef\lstp@compress@temp@a@key{#1{##1}}%
\let\listitem\lstp@compress@listitem@single
}%
\long\def\lstp@compress@listitem@single##1{%
\def\lstp@compress@temp@b{##1}%
\edef\lstp@compress@temp@b@key{#1{##1}}%
\ifnum\lstp@compress@temp@a@key=\lstp@compress@temp@b@key
\let\listitem\lstp@compress@listitem@single
\else
\lstp@ifsucc{\lstp@compress@temp@a@key}{\lstp@compress@temp@b@key}
{\let\listitem\lstp@compress@listitem@range}
{\lstp@compress@add@single
\let\lstp@compress@temp@a\lstp@compress@temp@b
\let\lstp@compress@temp@a@key\lstp@compress@temp@b@key
\let\listitem\lstp@compress@listitem@single}%
\fi
}%
\long\def\lstp@compress@listitem@range##1{%
\def\lstp@compress@temp@c{##1}%
\edef\lstp@compress@temp@c@key{#1{##1}}%
\ifnum\lstp@compress@temp@b@key=\lstp@compress@temp@c@key
\let\listitem\lstp@compress@listitem@range
\else
\lstp@ifsucc{\lstp@compress@temp@b@key}{\lstp@compress@temp@c@key}
{%
\let\lstp@compress@temp@b\lstp@compress@temp@c
\let\lstp@compress@temp@b@key\lstp@compress@temp@c@key
\let\listitem\lstp@compress@listitem@range
}
{%
\lstp@compress@add@range
\let\lstp@compress@temp@a\lstp@compress@temp@c
\let\lstp@compress@temp@a@key\lstp@compress@temp@c@key
\let\listitem\lstp@compress@listitem@single
}%
\fi
}%
\let\listitem\lstp@compress@listitem@start
\lstp@compress@temp@i
\ifx\listitem\lstp@compress@listitem@single
\lstp@compress@add@single
\else
\ifx\listitem\lstp@compress@listitem@range
\lstp@compress@add@range
\fi
\fi
\let\lstp@compress@temp@a\@undefined
\let\lstp@compress@temp@b\@undefined
\let\lstp@compress@temp@c\@undefined
\let\lstp@compress@temp@a@key\@undefined
\let\lstp@compress@temp@b@key\@undefined
\let\lstp@compress@temp@c@key\@undefined
\let\lstp@compress@temp@i\@undefined
\let\listitem\@undefined
}
\newcommand\FormatListSepTwo{ and }
\newcommand\FormatListSepMore{, }
\newcommand\FormatListSepLast{, and }
\newcounter{lstp@FormatList@length}
\newcounter{lstp@FormatList@posn}
\newcommand\FormatList[4]{{%
\deflist\lstp@FormatList@list{#4}%
\SetToListLength{lstp@FormatList@length}\lstp@FormatList@list%
\setcounter{lstp@FormatList@posn}{0}%
\ifnum\value{lstp@FormatList@length}=1%
#1%
\else%
#2%
\fi%
\def\listitem##1{%
\addtocounter{lstp@FormatList@posn}{1}%
\ifnum1<\value{lstp@FormatList@posn}%
\ifnum2=\value{lstp@FormatList@length}%
\FormatListSepTwo
\else
\ifnum\value{lstp@FormatList@length}=\value{lstp@FormatList@posn}%
\FormatListSepLast
\else
\FormatListSepMore
\fi
\fi
\fi
#3{##1}%
}%
\lstp@FormatList@list
}}
\newcommand\ListExpr[1]{\@lstp@ListExpr{#1}\relax}
\newcommand\ListExprTo[2]{\@lstp@ListExpr{#1}{\def#2}}
\newcommand\gListExprTo[2]{\@lstp@ListExpr{#1}{\gdef#2}}
\newcommand\@lstp@defbinop[2]{%
\newcommand#1[2]{%
\Eval{##1}\let\@lstp@tmp\@lstp@acc
{\Eval{##2}}%
#2\@lstp@tmp\@lstp@acc
}%
}
\newcommand\@lstp@defunop[2]{%
\newcommand#1[1]{%
\Eval{##1}%
#2\@lstp@acc\@lstp@acc
}%
}
\newcommand\@lstp@definplaceunopopt[3][]{%
\newcommand#2[2][#1]{%
\Eval{##2}%
#3[##1]\@lstp@acc
\global\let\@lstp@acc\@lstp@acc
}%
}
\newcommand\@lstp@ListExpr[2]{%
{%
\gdef\@lstp@acc{}%
\def\Eval##1{%
\IfList{##1}{%
\global\let\@lstp@acc##1%
}{%
\@lstp@ifListOp##1\@lstp@ifListOp{%
##1%
}{%
\xdef\@lstp@acc{##1}%
}%
}%
}%
\def\Q##1{\gdef\@lstp@acc{##1}}%
\def\Nil{\global\let\@lstp@acc\empty}%
\def\List##1{\gdeflist\@lstp@acc{##1}}%
\@lstp@defbinop\Cons\xConsTo
\@lstp@defbinop\Snoc\xSnocTo
\@lstp@defunop\First\gFirstTo
\@lstp@defunop\Rest\gRestTo
\@lstp@defbinop\Append\gAppendTo
\@lstp@definplaceunopopt[\@apply@group{}]\Sort\SortList
\@lstp@definplaceunopopt[\@apply@group{}]\Compress\CompressList
\newcommand\Map[2]{%
\Eval{##2}%
\gMapListTo{##1}\@lstp@acc\@lstp@acc
}%
\Eval{#1}%
}%
\def\@lstp@finish##1{#2{##1}}%
\expandafter\@lstp@finish\expandafter{\@lstp@acc}%
}
\def\@lstp@ifListOp#1#2\@lstp@ifListOp{%
\@lstp@ifInToks#1{
\Q\Nil\List\Cons\Snoc\Append
\First\Rest\Sort\Compress\Map
}
}
\newcommand\@lstp@ifInToks[2]{%
{%
\def\@tester##1#1##2\@tester{%
\ifx\@notfound##2\relax
\aftergroup\@secondoftwo
\else
\aftergroup\@firstoftwo
\fi
}%
\@tester#2\@lstp@ifInToks#1\@notfound\@tester
}%
}
\endinput
%%
%% End of file `listproc.sty'.