diff options
author | Karl Berry <karl@freefriends.org> | 2021-07-25 20:48:38 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-07-25 20:48:38 +0000 |
commit | 768d6790ab7c65a44384ce0aefc24e179aab38fd (patch) | |
tree | 74620d1bee1206fbdfa97b3a31ce54b0c9b5b4ff /Master/texmf-dist/source | |
parent | 6f654705f79b314523e5e0b829da91294b8a3eb6 (diff) |
macrolist (25jul21)
git-svn-id: svn://tug.org/texlive/trunk@60063 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r-- | Master/texmf-dist/source/latex/macrolist/macrolist.dtx | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/Master/texmf-dist/source/latex/macrolist/macrolist.dtx b/Master/texmf-dist/source/latex/macrolist/macrolist.dtx index 3ccbc85edc1..382faf2930e 100644 --- a/Master/texmf-dist/source/latex/macrolist/macrolist.dtx +++ b/Master/texmf-dist/source/latex/macrolist/macrolist.dtx @@ -16,7 +16,7 @@ %<*package> \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{macrolist}[2021/07/23 v1.1.1 Create lists of macros and perform operations on them] +\ProvidesPackage{macrolist}[2021/07/23 v1.2.0 Create lists of macros and perform operations on them] \RequirePackage{pgffor} %</package> @@ -56,8 +56,7 @@ % \end{abstract} % % \section{Usage} -% -% The scope of lists is always global. This seems to provide the most +% The scope of lists is always global. This provides the most consistency and functionality for developers in places that are usually local (part of a group), such as environments and loops. % % \DescribeMacro{\newlist} % To create a list, pass in |\newlist{listname}| to create a list with the name \textsf{listname}. @@ -95,6 +94,50 @@ \csname macrolist@list@#1\the\numexpr #2\relax\endcsname% } % \fi +% \changes{v1.2.0}{2021/07/23}{Add listindexof and listcontains} +% \DescribeMacro{\listindexof} +% +% This works similar to \textsf{indexof} in almost any ordinary programming language. Write |\listindexof{list}{element}| to get the index of where \textsf{element} first appears in \textsf{list}. If it never does, then the macro will expand to \textsf{0}. +% +% The command uses |\ifx| instead of |\if|; this means that if you have |\macro| as an element with the definition \textsf{this is a macro} (assuming that \textsf{this is a macro} is not an element itself), then |\listindexof{listname}{this is a macro}| will expand to \textsf{0}. +% +% Because of the implementation of this macro, it can't actually be parsed as a number. (See the `Limitations' section for more information.) +% \iffalse +\newcommand{\listindexof}[2]{% + \def\macrolist@listindex{0}% + \macrolist@exists{#1}% + \def\macrolist@el{#2}% + \listforeach{#1}{\macrolist@listindexel}[\listsize{#1}][1]{% + \ifx\macrolist@el\macrolist@listindexel + \xdef\macrolist@listindex{\macrolist@index}% + \fi + }% + \macrolist@listindex% + \let\macrolist@listindex\relax% +} +% \fi +% +% \DescribeMacro{\listcontains} +% +% Writing |\listcontains{listname}{element}{true branch}{false branch}| checks whether list \textsf{listname} contains \textsf{element}, executing \textsf{true branch} if it does and \textsf{false branch} if it does not. +% +% \iffalse +\newcommand{\listcontains}[4]{% + \def\macrolist@listindex{0}% + \macrolist@exists{#1}% + \def\macrolist@el{#2}% + \listforeach{#1}{\macrolist@listindexel}[\listsize{#1}][1]{% + \ifx\macrolist@el\macrolist@listindexel + \xdef\macrolist@listindex{\macrolist@index}% + \fi + }% + \ifnum\macrolist@listindex>0\relax + #3% + \else + #4% + \fi +} +% \fi % % \DescribeMacro{\listadd} % @@ -299,6 +342,10 @@ %\end{document} % \end{verbatim} % +% \section{Limitations} +% +% The |\listindexof| macro cannot be parsed as a number. This is because we have to compare each element of the list to the passed in element and requires storing the index in a macro, which requires some unexpandable macros. (This is why we do not directly use |\listindexof| when defining |\listcontains|.) +% % \section{Implementation details} % % All internal macros are namespaced to prevent package conflicts. |