migrate to xparse syntax

This commit is contained in:
David 2021-01-24 22:17:33 +01:00
commit 0e8508a2ee

View file

@ -27,42 +27,48 @@
% creates a new collection % creates a new collection
% usage: \collectionnew{<collection name>} % usage: \collectionnew{<collection name>}
\newcommand*{\collectionnew}[1]{% \NewDocumentCommand\collectionnew{m}{%
\newcounter{collection@#1@count}} \newcounter{collection@#1@count}%
}%
% adds an item to a collection % adds an item to a collection
% usage: \collectionadd[<optional key>]{<collection name>}{<item to add>} % usage: \collectionadd[<optional key>]{<collection name>}{<item to add>}
\newcommand*{\collectionadd}[3][]{% \NewDocumentCommand\collectionadd{ O{} m m }{%
\expandafter\def\csname collection@#2@item\roman{collection@#2@count}\endcsname{#3}% \expandafter\def\csname collection@#2@item\roman{collection@#2@count}\endcsname{#3}%
\if\relax\noexpand#1\relax% if #1 is empty \def\optional@FirstArg{#1}%
\else\expandafter\def\csname collection@#2@key\roman{collection@#2@count}\endcsname{#1}\fi% \ifdefempty{\optional@FirstArg}{%
\stepcounter{collection@#2@count}} \relax% if #1 is empty
}{%
\expandafter\def\csname collection@#2@key\roman{collection@#2@count}\endcsname{#1}%
}%
\stepcounter{collection@#2@count}%
}%
% returns the number of items in a collection % returns the number of items in a collection
% usage: \collectioncount{<collection name>} % usage: \collectioncount{<collection name>}
\newcommand*{\collectioncount}[1]{% \NewDocumentCommand\collectioncount{m}{%
\value{collection@#1@count}} \value{collection@#1@count}%
}%
% gets an item from a collection % gets an item from a collection
% usage: \collectiongetitem{<collection name>}{<element id>} % usage: \collectiongetitem{<collection name>}{<element id>}
% where <element id> is an integer between 0 and (collectioncount-1) % where <element id> is an integer between 0 and (collectioncount-1)
\newcommand*{\collectiongetitem}[2]{% \NewDocumentCommand\collectiongetitem{m m}{%
\csname collection@#1@item\romannumeral #2\endcsname} \csname collection@#1@item\romannumeral #2\endcsname%
}%
% gets a key from a collection % gets a key from a collection
% usage: \collectiongetkey{<collection name>}{<element id>} % usage: \collectiongetkey{<collection name>}{<element id>}
% where <element id> is an integer between 0 and (collectioncount-1) % where <element id> is an integer between 0 and (collectioncount-1)
\newcommand*{\collectiongetkey}[2]{% \NewDocumentCommand\collectiongetkey{m m}{%
\csname collection@#1@key\romannumeral #2\endcsname} \csname collection@#1@key\romannumeral #2\endcsname%
}%
% loops through a collection and perform the given operation on every element % loops through a collection and perform the given operation on every element
% usage: \collectionloop{<collection name>}{<operation sequence>} % usage: \collectionloop{<collection name>}{<operation sequence>}
% where <operation sequence> is the code sequence to be evaluated for each collection item, % where <operation sequence> is the code sequence to be evaluated for each collection item,
% code which can refer to \collectionloopid, \collectionloopkey, \collectionloopitem and % code which can refer to \collectionloopid, \collectionloopkey, \collectionloopitem and
% \collectionloopbreak % \collectionloopbreak
\newcounter{collection@iterator} \newcounter{collection@iterator}
\newcommand*{\collectionloopbreak}{\let\iterate\relax} \NewDocumentCommand\collectionloopbreak{}{\let\iterate\relax}
\newcommand*{\collectionloop}[2]{% \NewDocumentCommand\collectionloop{m m}{%
\setcounter{collection@iterator}{0}% \setcounter{collection@iterator}{0}%
\loop\ifnum\value{collection@iterator}<\value{collection@#1@count}% \loop\ifnum\value{collection@iterator}<\value{collection@#1@count}%
\def\collectionloopid{\arabic{collection@iterator}}% \def\collectionloopid{\arabic{collection@iterator}}%
@ -70,14 +76,15 @@
\def\collectionloopkey{\collectiongetkey{#1}{\collectionloopid}}% \def\collectionloopkey{\collectiongetkey{#1}{\collectionloopid}}%
#2% #2%
\stepcounter{collection@iterator}% \stepcounter{collection@iterator}%
\repeat} \repeat%
}
% loops through a collection and finds the (first) element matching the given key % loops through a collection and finds the (first) element matching the given key
% usage: \collectionfindbykey{<collection name>}{key>} % usage: \collectionfindbykey{<collection name>}{key>}
\newcommand*{\collectionfindbykey}[2]{% \NewDocumentCommand\collectionfindbykey{m m}{%
\collectionloop{#1}{% \collectionloop{#1}{%
\ifthenelse{\equal{\collectionloopkey}{#2}}{\collectionloopitem\collectionloopbreak}{}}} \ifthenelse{\equal{\collectionloopkey}{#2}}{\collectionloopitem\collectionloopbreak}{}}%
}%
\endinput \endinput