summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/erw-l3
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/erw-l3
Initial commit
Diffstat (limited to 'macros/latex/contrib/erw-l3')
-rw-r--r--macros/latex/contrib/erw-l3/README.txt7
-rw-r--r--macros/latex/contrib/erw-l3/erw-l3.dtx1120
-rw-r--r--macros/latex/contrib/erw-l3/erw-l3.pdfbin0 -> 531652 bytes
3 files changed, 1127 insertions, 0 deletions
diff --git a/macros/latex/contrib/erw-l3/README.txt b/macros/latex/contrib/erw-l3/README.txt
new file mode 100644
index 0000000000..6d9e79fad5
--- /dev/null
+++ b/macros/latex/contrib/erw-l3/README.txt
@@ -0,0 +1,7 @@
+----------------------------------------------------------------
+erw-l3 --- Utilities built around expl3
+Source repository: https://github.com/er-cpp/erw-l3
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
diff --git a/macros/latex/contrib/erw-l3/erw-l3.dtx b/macros/latex/contrib/erw-l3/erw-l3.dtx
new file mode 100644
index 0000000000..9c66237579
--- /dev/null
+++ b/macros/latex/contrib/erw-l3/erw-l3.dtx
@@ -0,0 +1,1120 @@
+% \iffalse meta-comment
+% !TEX program = pdfLaTeX
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+----------------------------------------------------------------
+erw-l3 --- Utilities built around expl3
+Source repository: https://github.com/er-cpp/erw-l3
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+----------------------------------------------------------------
+erw-l3 Utilities built around expl3
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2018 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file erw-l3.dtx
+and the derived files erw-l3.ins,
+ erw-l3.pdf and
+ erw-l3.sty.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+%</install>
+%<install>\endbatchfile
+%<*internal>
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%</internal>
+%<package>\ProvidesExplPackage
+%<package> {erw-l3} % Package name
+%<package> {2018/6/21} % Release date
+%<package> {0.1.3} % Release version
+%<package> {Utilities built around expl3} % Description
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\usepackage{erw-l3}
+\usepackage{float}
+\usepackage{tabto}
+\usepackage{cleveref}
+\ExplSyntaxOn
+\tl_gset:Nn \partname {Part}
+\ExplSyntaxOff
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+% \AtEndDocument { \PrintChanges \PrintIndex } % TODO
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{\jobname.sty}
+%
+%
+%\title{^^A
+% \textsf{erw-l3}\thanks{^^A
+% This file describes version \fileversion, last revised \filedate.^^A
+% }^^A
+%}
+%\author{Erwann Rogard\thanks{firstname dot lastname AusTria gmail dot com}}
+%
+%
+%\date{Released \filedate}
+%
+%\maketitle
+%
+%\begin{abstract}\LaTeX3 package defining commands built around \pkg{expl3}\cite{interface3}.
+% For example, \cs{erw_compose} implements the mathematical concept $f_1 \circ f_2 \dots \circ f_n$.
+%\end{abstract}
+%
+% \tableofcontents
+%
+% \section{Preliminaries}
+%
+% See \autoref{part:other}~\autoref{support} on how to get this package.
+% To use it, make sure the file \file{erw-l3.sty} is in the path of the \LaTeX~engine.
+% In the preamble of your \LaTeX document, put:
+% \begin{center}
+% \cs{usepackage}\oarg{options}|{|\pkg{erw-l3}|}|\linebreak
+% \end{center}
+%
+% \floatstyle{ruled}
+% \newfloat{Listing}{H}{lop}
+% \NewDocumentCommand{\erwtab}{O{0.5}}{\tabto{#1\linewidth}}
+%
+% \part{Usage}\label{part:usage}
+%
+% The naming conventions are (loosely) those of \LaTeX3.
+% For example, \meta{cs} stands for \emph{control sequence}, which is described in \cite[Part~\pkg{l3basics}]{interface3}.
+%
+% \section{backend}
+%
+% We call `backend' commands that are \pkg{expl3}-like.
+%
+% \subsection{\textsf{compose}}
+%
+% \begin{function}{\erw_compose:nV,\erw_compose:nn}
+% \begin{syntax}
+% \cs{erw_compose:nV}\marg{cs list}\meta{var}
+% \end{syntax} Implements the mathematical concept $f_1 \circ f_2 \dots \circ f_n$.
+% See Listing~\autoref{listng:compose}
+% \end{function}
+%
+% \begin{function}{\erw_compose_c:nV,\erw_compose_c:nn}
+% \begin{syntax}
+% \cs{erw_compose_c:nV}\marg{cs names}\meta{var}
+% \end{syntax}
+% See Listing~\autoref{listng:compose:c}
+% \end{function}
+%
+% \begin{function}{\erw_compose_seq:nV}
+% \begin{syntax}
+% \cs{erw_compose_seq:nV}\marg{cs list}\meta{seq}
+% \end{syntax} Same as \cs{erw_compose:nV}, but saves each intermediary step
+% See Listing~\autoref{listng:compose:seq}
+% \end{function}
+%
+% \begin{function}{\erw_compose_seq_c:nV}
+% \begin{syntax}
+% \cs{erw_compose_seq_c:nV}\marg{cs names}\meta{seq}
+% \end{syntax}
+% See Listing~\autoref{listng:compose:seq:c}
+% \end{function}
+%
+% \begin{function}{\erw_compose_vers:nV,\erw_compose_vers:nn}
+% \begin{syntax}
+% \cs{erw_compose_vers:nV}\marg{list of cs or code}\meta{var}
+% \end{syntax}
+% See Listing~\autoref{listng:compose:vers}.
+% Only the |nn| version is implemented
+% \end{function}
+%
+% \begin{function}{\erw_compose_seq_vers:nV,\erw_compose_seq_vers:nn}
+% \begin{syntax}
+% \cs{erw_compose_seq_vers:nV}\marg{list of cs or code}\meta{seq}
+% \end{syntax}
+% Not implemented.
+% \end{function}
+%
+% \subsection{\textsf{csutil}}
+%
+% \begin{function}{\erw_apply:Nn, \erw_apply:cn}
+% \begin{syntax}{\cs{erw_apply:Nn}}\meta{cs}\marg{arg}
+% \end{syntax}Expands to \meta{cs}\marg{arg}
+% \end{function}
+%
+% \begin{function}{\erw_cs_set_eq:NN, \erw_cs_set_eq:cN}
+% \begin{syntax}{\cs{erw_cs_set_eq:NN}}\meta{cs1}\meta{cs2}
+% \end{syntax}\meta{cs1}\textleftarrow\meta{cs2}
+% \end{function}
+%
+% \begin{function}{\erw_cs_set_inline:Nn, \erw_cs_set_inline:cn}
+% \begin{syntax}{\cs{erw_cs_set_inline:Nn}}\meta{cs}\marg{code}
+% \end{syntax}
+% \end{function}
+%
+% \begin{function}{\erw_identity:N,\erw_identity:c}
+% \begin{syntax}{\cs{erw_identity:N}}\marg{arg}
+% \end{syntax} Expands to \meta{arg}
+% \end{function}
+%
+% \begin{function}{\erw_fold:NV, \erw_fold:cV}
+% \begin{syntax}{\cs{erw_fold:NV}}\meta{cs}\meta{var}
+% \end{syntax}\meta{var}\textleftarrow \cs{erw_apply:NV}\meta{cs}\meta{var}.
+% See Listing~\autoref{listng:fold}.
+% \end{function}
+%
+% \begin{function}{\erw_items_to:nn}
+% \begin{syntax}{\cs{erw_items_to:nn}}\marg{int}\marg{token list}
+% \end{syntax} See Listing~\autoref{listng:items}
+% \end{function}
+%
+% \begin{function}{\erw_last_item:nn}
+% \begin{syntax}{\cs{erw_last_item:nn}}\marg{int}\marg{token list}
+% \end{syntax} See Listing~\autoref{listng:items}
+% \end{function}
+%
+% \begin{function}{\erw_repeat:nn}
+% \begin{syntax}{\cs{erw_repeat:nn}}\marg{int}\marg{value}
+% \end{syntax}
+% See Listing~\autoref{listng:repeat}
+% \end{function}
+%
+% \begin{function}{\erw_split:nn}
+% \begin{syntax}{\cs{erw_split:nn}}\marg{token list}\marg{delimiter}
+% \end{syntax} See Listing~\autoref{listng:split}
+% \end{function}
+%
+% \subsection{\textsf{map}}
+%
+% \begin{function}{\erw_map:Nn}
+% \begin{syntax}{\cs{erw_map:Nn}}\meta{cs}\marg{args}
+% \end{syntax}
+% See Listing~\autoref{listng:map}.
+% Redundant with \cs{tl_map_function:nN}
+% \end{function}
+%
+% \begin{function}{\erw_map_inline:nn}
+% \begin{syntax}{\cs{erw_map_inline:nn}}\marg{code}\marg{args}
+% \end{syntax}
+% See Listing~\autoref{listng:mapinl}
+% \end{function}
+%
+% \begin{function}{\erw_map_thread:Nn}
+% \begin{syntax}{\cs{erw_map_thread:Nn}}\meta{cs}\marg{matrix of tokens}
+% \end{syntax} Threads \meta{cs} over the columns, where the arity of \meta{cs} is equal to the number of rows.
+% See Listing~\autoref{listng:thread}
+% \end{function}
+%
+% \begin{function}{\erw_map_thread_at:Nnn}
+% \begin{syntax}{\cs{erw_map_thread_at:Nnn}}\meta{cs}\marg{matrix of tokens}
+% \end{syntax}
+% \end{function}
+%
+% \subsection{\textsf{numbrdcs}}
+%
+% Part of these commands have a frontend counterpart, see \autoref{usage:frontend:numbrdcs}.
+%
+% \begin{function}{\erw_numbrd_cs_reset:}
+% \begin{syntax}\cs{erw_numbrd_cs_reset:}|{}|
+% \end{syntax} See Listing~\ref{listng:numbrdcs:names}
+% \end{function}
+%
+% \begin{function}{ \erw_numbrd_cs_new:n}
+% \begin{syntax}\cs{erw_numbrd_cs_new:n} \marg{cs or code}
+% \end{syntax} Use it as the first arg to \cs{tl_function_map:Nn}
+% \end{function}
+%
+% \begin{function}{ \erw_numbrd_cs:nn}
+% \begin{syntax}\cs{erw_numbrd_cs:nn} \marg{cs or code}
+% \end{syntax}
+% \end{function}
+%
+% \begin{function}{\erw_numbrd_cs_names_braced:nnn}
+% \begin{syntax}\cs{erw_numbrd_cs_names_braced:nnn}\marg{first}\marg{step}\marg{last}
+% \end{syntax}See Listing~\ref{listng:numbrdcs:names}
+% \end{function}
+%
+% \section{frontend}\label{part:frontend}
+%
+% We call frontend commands created with pkg{xparse}'s\cs{NewDocumentCommand}\cite{xparse}
+%
+% \subsection{\textsf{disambig}}
+%
+% \begin{function}{\disambignewcmd,\disambignewcmd*}
+% \begin{syntax}{\cs{disambignewcmd}}\marg{token}\marg{pars}\marg{code}
+% \end{syntax}Analogues of \cs{NewDocumentCommand} and \cs{RenewDocumentCommand}. See~Listing~\ref{listng:disambig:cmd}
+% \end{function}
+%
+% \begin{function}{\disambignewenv,\disambignewenv*}
+% \begin{syntax}{\cs{disambignewenv}}\marg{token}\marg{pars}\marg{code1}\marg{code2}
+% \end{syntax}Analogues of \cs{NewDocumentEnvironment} and \cs{RenewDocumentEnvironment}. See~Listing~\ref{listng:disambig:env}
+% \end{function}
+%
+% \begin{function}{\disambigset}
+% \begin{syntax}{\cs{disambigset}}\marg{prefix}
+% \end{syntax}
+% \end{function}
+%
+% \begin{function}{\disambigunset}
+% \begin{syntax}{\cs{disambigunset}}|{}|
+% \end{syntax}
+% \end{function}
+%
+% \subsection{\textsf{numbrdcs}}\label{usage:frontend:numbrdcs}
+%
+% \begin{function}{\numbrdcsnew,\numbrdcsnew*}
+% \begin{syntax}\cs{numbrdcsnew}\marg{list of cs or code}
+% \end{syntax} Creates numbered control sequences. The starred version does not reset. See Listing~\ref{listng:numbrdcs}
+% \end{function}
+%
+% \begin{function}{\numbrdcs}
+% \begin{syntax}\cs{numbrdcs}\marg{int}\marg{arg}
+% \end{syntax} Evaluates control sequence numbered \meta{int} with argument \meta{arg}. See Listing~\ref{listng:numbrdcs}
+% \end{function}
+%
+% \clearpage
+%
+% \part{Listings}\label{part:listng}
+%
+% \section{Backend}
+%
+% \subsection{compose}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\erwtab\cs_set:Npn \__bar #1 {g[#1]}
+% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\erwtab\cs_set:Npn \__baz #1 {h\{#1\}}
+% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\erwtab\tl_set:Nn \l_tmpa_tl{X}
+% \\\verb|\erw_compose:nV{|
+% \\\verb| {\__baz}{\__bar}{\__foo}}|
+% \\\verb| \l_tmpa_tl|\erwtab\erw_compose:nV{{\__baz}{\__bar}{\__foo}}\l_tmpa_tl
+% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
+% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\tl_set:Nn \l_tmpa_tl{X}
+% \\\verb|\erw_compose:nn{|
+% \\\verb| {\__baz}{\__bar}{\__foo}}|
+% \\\verb| {X}|\erwtab\erw_compose:nn{{\__baz}{\__bar}{\__foo}}{X}
+% \ExplSyntaxOff
+% \caption{ }\label{listng:compose}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
+% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
+% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\tl_set:Nn \l_tmpa_tl{X}
+% \\\verb|\erw_compose_c:nV{|
+% \\\verb| {__baz}{__bar}{__foo}}|
+% \\\verb| \l_tmpa_tl|\erwtab\erw_compose_c:nV{{__baz}{__bar}{__foo}}\l_tmpa_tl
+% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
+% \\\verb|\erw_compose_c:nn{|
+% \\\verb| {__baz}{__bar}{__foo}}|
+% \\\verb| {X}|\erwtab\erw_compose_c:nn{{__baz}{__bar}{__foo}}{X}
+% \ExplSyntaxOff
+% \caption{ }\label{listng:compose:c}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
+% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
+% \\\verb|\seq_new:N\l_tmp_seq|\erwtab\seq_new:N \l_tmp_seq
+% \\\verb|\seq_put_right:Nn\l_tmp_seq{X}|\erwtab\seq_put_right:Nn \l_tmp_seq{X}
+% \\\verb| \erw_compose_seq:nV{|
+% \\\verb| {\__baz}{\__bar}{\__foo}}|
+% \\\verb| \l_tmp_seq|\erwtab \erw_compose_seq:nV{{\__baz}{\__bar}{\__foo}}\l_tmp_seq
+% \\\verb|\seq_item:Nn\l_tmp_seq{1}|\erwtab \seq_item:Nn \l_tmp_seq{1}
+% \\\verb|\seq_item:Nn\l_tmp_seq{2}|\erwtab \seq_item:Nn \l_tmp_seq{2}
+% \\\verb|\seq_item:Nn\l_tmp_seq{3}|\erwtab \seq_item:Nn \l_tmp_seq{3}
+% \\\verb|\seq_item:Nn\l_tmp_seq{4}|\erwtab \seq_item:Nn \l_tmp_seq{4}
+% \ExplSyntaxOff
+% \caption{}\label{listng:compose:seq}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
+% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
+% \\\verb|\seq_new:N\l_tmp_seq|
+% \\\verb|\seq_put_right:Nn\l_tmp_seq{X}|\erwtab\seq_put_right:Nn \l_tmp_seq{X}
+% \\\verb|\erw_compose_seq_c:nV{|
+% \\\verb| {__baz}{__bar}{__foo}}|
+% \\\verb| \l_tmp_seq|\erwtab \erw_compose_seq_c:nV{{__baz}{__bar}{__foo}}\l_tmp_seq
+% \\\verb|\seq_item:Nn\l_tmp_seq{1}|\erwtab \seq_item:Nn \l_tmp_seq{1}
+% \\\verb|\seq_item:Nn\l_tmp_seq{2}|\erwtab \seq_item:Nn \l_tmp_seq{2}
+% \\\verb|\seq_item:Nn\l_tmp_seq{3}|\erwtab \seq_item:Nn \l_tmp_seq{3}
+% \\\verb|\seq_item:Nn\l_tmp_seq{4}|\erwtab \seq_item:Nn \l_tmp_seq{4}
+% \ExplSyntaxOff
+% \caption{}\label{listng:compose:seq:c}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
+% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
+% \\\verb|\erw_compose_vers:nn{|
+% \\\verb| {\__baz}{g[#1]}{\__foo}}|
+% \\\verb| {X}|\erwtab\erw_compose_vers:nn{{\__baz}{g[#1]}{\__foo}}{X}
+% \ExplSyntaxOff
+% \caption{}\label{listng:compose:vers}
+% \end{Listing}
+%
+% \subsection{csutil}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\ExplSyntaxOn| \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\erw_apply:Nn\__foo{X}|\erwtab\erw_apply:Nn\__foo{X}
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{ }\label{listng:apply}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\ExplSyntaxOn| \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\erwtab\tl_set:Nn \l_tmpa_tl{X}
+% \\\verb|\erw_fold_set_par:n{Nf}|\erw_fold_set_par:n{Nf}
+% \\\verb|\erw_fold_apply_par:n{Nf}|\erw_fold_apply_par:n{Nf}
+% \\\verb|\erw_fold:NV\__foo\l_tmpa_tl|\erwtab\erw_fold:NV\__foo\l_tmpa_tl
+% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
+% \\\verb|\cs_set:Npn\__bar #1 {g[#1]}|\erwtab\cs_set:Npn \__bar #1 {g[#1]}
+% \\\verb|\erw_fold:cV{__bar}\l_tmpa_tl|\erwtab\erw_fold:cV {__bar}\l_tmpa_tl
+% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{ }\label{listng:fold}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\ExplSyntaxOn| \ExplSyntaxOn
+% \verb|\erw_last_item:n{{a}{b}{c}}|\erwtab \erw_last_item:n {{a}{b}{c}}
+% \\\verb|\\\erw_items_to:nn{1}{{a}{b}{c}{d}}|\erwtab \erw_items_to:nn{1}{{a}{b}{c}{d}}
+% \\\verb|\\\erw_items_to:nn{2}{{a}{b}{c}{d}}|\erwtab \erw_items_to:nn{2}{{a}{b}{c}{d}}
+% \\\verb|\\\erw_items_to:nn{3}{{a}{b}{c}{d}}|\erwtab \erw_items_to:nn{3}{{a}{b}{c}{d}}
+% \\\verb|\\\erw_items_to:nn{4}{{a}{b}{c}{d}}|\erwtab \erw_items_to:nn{4}{{a}{b}{c}{d}}
+% \\\verb|\ExplSyntaxOff| \ExplSyntaxOff
+% \caption{ }\label{listng:items}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\ExplSyntaxOn| \ExplSyntaxOn
+% \\\verb|\erw_repeat:nn{|
+% \\\verb| {3}{abracad}}abra| \erwtab \erw_repeat:nn{3}{abracad}abra
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{ }\label{listng:repeat}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\ExplSyntaxOn| \ExplSyntaxOn
+% \\\verb|\erw_split:nn{|
+% \\\verb| {{a}{b}{c}}{==}}| \erwtab \erw_split:nn{{a}{b}{c}}{==}
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{ }\label{listng:split}
+% \end{Listing}
+%
+% \subsection{\textsf{map}}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\ExplSyntaxOn| \ExplSyntaxOn
+%\verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
+% \\\verb|\erw_map:Nn \__foo{{a}{b}{c}}|\erwtab\erw_map:Nn \__foo{{a}{b}{c}}
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{ }\label{listng:map}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\ExplSyntaxOn| \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
+% \\\verb|\erw_map_inline:nn{|
+% \\\verb| (#1)}{{a}{b}{c}}| \erwtab\erw_map_inline:nn{(#1)}{{a}{b}{c}}
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{ }\label{listng:mapinl}
+% \end{Listing}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \ExplSyntaxOn
+% \verb|\cs_set:Npn \__foo:n #1 {(#1)}|\cs_set:Npn \__foo:n #1 {(#1)}
+% \\\verb|\erw_map_thread:Nn \__foo:n|
+% \\\verb|{|
+% \\\verb| {{a}{b}{c}{d}{e}{f}}|
+% \\\verb|}|\erwtab\erw_map_thread:Nn \__foo:n
+% {
+% {{a}{b}{c}{d}{e}{f}}
+% }
+% \\\verb|\cs_set:Npn \__foo:nn #1 #2|
+% \\\verb| {(#1+#2)}|\cs_set:Npn \__foo:nn #1 #2 {(#1+#2)}
+% \\\verb|\erw_map_thread:Nn \__foo:nn|
+% \\\verb|{|
+% \\\verb| {{a}{b}{c}{d}{e}{f}}|
+% \\\verb| {{A}{B}{C}{D}{E}{F}}|
+% \\\verb|}|\erwtab\erw_map_thread:Nn \__foo:nn
+% {
+% {{a}{b}{c}{d}{e}{f}}
+% {{A}{B}{C}{D}{E}{F}}
+% }
+% \\\verb|\cs_set:Npn \__foo:nnn|
+% \\\verb| #1 #2 #3 |
+% \\\verb| {(#1+#2+#3)}|\cs_set:Npn \__foo:nnn #1 #2 #3 {(#1+#2+#3)}
+% \\\verb|\erw_map_thread:Nn \__foo:nnn|
+% \\\verb|{|
+% \\\verb| {{a}{b}{c}{d}{e}{f}}|
+% \\\verb| {{A}{B}{C}{D}{E}{F}}|
+% \\\verb| {{k}{l}{m}{n}{o}{p}}|
+% \\\verb|}|\erwtab[0.3]\erw_map_thread:Nn \__foo:nnn
+% {
+% {{a}{b}{c}{d}{e}{f}}
+% {{A}{B}{C}{D}{E}{F}}
+% {{k}{l}{m}{n}{o}{p}}
+% }
+% \\\verb|\cs_set:Npn \__foo:nnnn|
+% \\\verb| #1 #2 #3 #4 |
+% \\\verb| {(#1+#2+#3+#4)}|\cs_set:Npn \__foo:nnnn #1 #2 #3 #4 {(#1+#2+#3+#4)}
+% \\\verb|\erw_map_thread:Nn \__foo:nnnn|
+% \\\verb|{|
+% \\\verb| {{a}{b}{c}{d}{e}{f}}|
+% \\\verb| {{A}{B}{C}{D}{E}{F}}|
+% \\\verb| {{k}{l}{m}{n}{o}{p}}|
+% \\\verb| {{K}{L}{M}{N}{O}{P}}|
+% \\\verb|}|\erwtab[0.1]\erw_map_thread:Nn \__foo:nnnn
+% {
+% {{a}{b}{c}{d}{e}{f}}
+% {{A}{B}{C}{D}{E}{F}}
+% {{k}{l}{m}{n}{o}{p}}
+% {{K}{L}{M}{N}{O}{P}}
+% }
+% \caption{ }\label{listng:thread}
+% \ExplSyntaxOff
+% \end{Listing}
+%
+% \subsection{\textsf{numbrdcs}}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\NewDocumentCommand{\myfoo}{m}{f(#1)}|\NewDocumentCommand{\myfoo}{m}{f(#1)}
+% \\\verb|\NewDocumentCommand{\mybar}{m}{g[#1]}|\NewDocumentCommand{\mybar}{m}{g[#1]}
+% \\\verb|\NewDocumentCommand{\mybaz}{m}{h\{#1\}}|\NewDocumentCommand{\mybaz}{m}{h\{#1\}}
+% \\\verb|\numbrdcsnew{{\mybaz}{g[#1]}{\myfoo}}|\numbrdcsnew{{\mybaz}{g[#1]}{\myfoo}}
+% \\\verb|\ExplSyntaxOn|
+% \\\verb|\exp_last_unbraced:Nx|
+% \\\verb| \erw_compose_c:nn|
+% \\\verb| {|
+% \\\verb| {\erw_numbrd_cs_names|
+% \\\verb| _braced:nnn{1}{1}{3}}|
+% \\\verb| {X}|
+% \\\verb| }|
+% \\\verb|\ExplSyntaxOff|\erwtab
+% \ExplSyntaxOn
+% \exp_last_unbraced:Nx
+% \erw_compose_c:nn
+% {{\erw_numbrd_cs_names_braced:nnn{1}{1}{3}}
+% {X}}
+% \ExplSyntaxOff
+% \caption{ }\label{listng:numbrdcs:names}
+% \end{Listing}
+%
+% \section{Frontend}
+%
+% ^^A\vspace*{\fill}
+% ^^A\begin{Listing}
+% ^^A\verb|\NewDocumentCommand{\thefoo}{m}{f(#1)}|
+% ^^A\\\verb|\NewDocumentCommand{\thebar}{m}{g[#1]}|
+% ^^A\\\verb|\NewDocumentCommand{\thebaz}{m}{h\{#1\}}|
+% ^^A\caption{Initialization}\label{listng:init:front}
+% ^^A\end{Listing}
+%
+% \subsection{disambig}
+%
+% \begin{Listing}
+% \textbf{Input}
+% \begin{verbatim}
+% \disambigset{my}
+% \disambignewcmd{\foo}{m}{#1~world!}
+% \noindent\myfoo{Hello}
+% \disambignewcmd*{\foo}{m}{#1~universe!}
+% \\\myfoo{Hello}
+% \disambigunset
+% \disambignewcmd{\foo}{m}{#1~world!}
+% \\\foo{Hello}
+% \end{verbatim}
+% \textbf{Output}
+% \\\disambigset{my}
+% \disambignewcmd{\foo}{m}{#1~world!}
+% \noindent\myfoo{Hello}
+% \disambignewcmd*{\foo}{m}{#1~universe!}
+% \\\myfoo{Hello}
+% \disambigunset
+% \disambignewcmd{\foo}{m}{#1~world!}
+% \\\foo{Hello}
+% \caption{}\label{listng:disambig:cmd}
+% \end{Listing}
+%
+% \begin{Listing}
+% \textbf{Input}
+% \begin{verbatim}
+% \disambigset{my}
+% \disambignewenv{bar}{}{H}{!}
+% \\\begin{mybar}ello~world\end{mybar}
+% \disambignewenv*{bar}{}{J}{!}
+% \\\begin{mybar}ello~world\end{mybar}
+% \end{verbatim}
+% \textbf{Output}
+% \disambigset{my}
+% \disambignewenv{bar}{}{H}{!}
+% \\\begin{mybar}ello~world\end{mybar}
+% \disambignewenv*{bar}{}{J}{!}
+% \\\begin{mybar}ello~world\end{mybar}
+% \caption{}\label{listng:disambig:env}
+% \end{Listing}
+%
+% \subsection{\textsf{numbrdcs}}
+%
+% \vspace*{\fill}
+% \begin{Listing}
+% \verb|\NewDocumentCommand{\thefoo}{m}{f(#1)}|\NewDocumentCommand{\thefoo}{m}{f(#1)}
+% \\\verb|\NewDocumentCommand{\thebar}{m}{g[#1]}|\NewDocumentCommand{\thebar}{m}{g[#1]}
+% \\\verb|\NewDocumentCommand{\thebaz}{m}{h\{#1\}}|\NewDocumentCommand{\thebaz}{m}{h\{#1\}}
+% \\\verb|\numbrdcsnew{|
+% \\\verb| {\thefoo}|
+% \\\verb| {g[#1]}|
+% \\\verb| {\thebaz}}|\erwtab\numbrdcsnew{{\thefoo}{g[#1]}{\thebaz}}
+% \\\verb|\numbrdcs{1}{X}|\erwtab\numbrdcs{1}{X}
+% \\\verb|\numbrdcs{2}{X}|\erwtab\numbrdcs{2}{X}
+% \\\verb|\numbrdcs{3}{X}|\erwtab\numbrdcs{3}{X}
+% \\\verb|\numbrdcsnew*{|
+% \\\verb| {\thefoo}|
+% \\\verb| {g[#1]}|
+% \\\verb| {\thebaz}}|\erwtab\numbrdcsnew*{{\thefoo}{g[#1]}{\thebaz}}
+% \\\verb|\numbrdcs{4}{X}|\erwtab\numbrdcs{4}{X}
+% \\\verb|\numbrdcs{5}{X}|\erwtab\numbrdcs{5}{X}
+% \\\verb|\numbrdcs{6}{X}|\erwtab\numbrdcs{6}{X}
+% \caption{ }\label{listng:numbrdcs}
+% \end{Listing}
+%
+% \part{Other}\label{part:other}
+%
+% \section{Support}\label{support}
+%
+% This package is available from \url{https://www.ctan.org/pkg/erw-l3} (release) or \url{https://github.com/er-cpp/erw-l3} (development) where you can report issues.
+%
+% \section{Acknowledgment}
+% I thank those that have answered my questions on forums pertaining to \LaTeX3. See here: \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
+% and here: \url{https://latex.org/forum/memberlist.php?mode=viewprofile&u=61329}
+%
+% ^^A \section{Change history}
+% ^^A TODO Bring the change history under this section
+% ^^A The versions showns are of those of the development stage, some may have been skipped in the release.
+% ^^A \iffalse
+% ^^A : changes
+% ^^A \fi
+%
+% \changes{0.1}{2018/05/20}{Initial version}
+% \changes{0.1.1}{2018/05/23}{}
+% \changes{0.1.1}{2018/05/23}{Brought all the modules under one file; renamed \pkg{l3erw} to \pkg{erw-l3};}
+% \changes{0.1.1}{2018/05/23}{\pkg{disambig}/backend: changes to the key, added \cs{ProcessPackageKeysOption};}
+% \changes{0.1.1}{2018/05/23}{\cs{numbrdcsnew} changed to \cs{newnumbrdcs} and made 'disambiguable'}
+% \changes{0.1.2}{2018/06/21}{}
+% \changes{0.1.2}{2018/06/21}{\cs{erw_compose} reversed order in which the functions are composed, such that it now conforms to
+% the mathematical convention ($g\circ f$ means $f$ comes before $g$)}
+%\changes{0.1.2}{2018/06/21}{Front end cmds no longer generated with module \pkg{disambig}; Option of the same name deleted;}
+%\changes{0.1.2}{2018/06/21}{\pkg{disambig}: pushed the code inside \cs{keys_define};\cs{disambignewcmd} no longer takes a token name as arg, rather a token.}
+%\changes{0.1.2}{2018/06/21}{Added \cs{erw_repeat}}
+%\changes{0.1.2}{2018/06/21}{Added \cs{erw_split}}
+%\changes{0.1.2}{2018/06/21}{Added \cs{erw_last_item}}
+%\changes{0.1.2}{2018/06/21}{Added \cs{erw_items_to}}
+%\changes{0.1.2}{2018/06/21}{Added \cs{map_thread}}
+%\changes{0.1.2}{2018/06/21}{Re-arranged the doc to clearly separate frontend from backend}
+%
+% % \begin{thebibliography}{1}
+%
+% ^^A\bibitem{expl3} The \LaTeX3 Project Team {\em The \pkg{expl3} package and \LaTeX3 programming}
+% ^^A\url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/expl3.pdf}
+%
+% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
+%
+% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package}
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
+%
+% ^^A \bibitem{l3pckg} The \LaTeX3 Project Team {\em l3packages} \url{http://mirror.ctan.org/macros/latex/contrib/l3packages/}
+%
+% ^^A \bibitem{tex.stack:431046} \url{https://tex.stackexchange.com/questions/431046/calling-expl3s-usec-on-an-expression-expanding-to-a-cs-name-causes-error}
+%
+% ^^A \bibitem{tex.stack:432171} \url{https://tex.stackexchange.com/questions/432171/expl3-making-arguments-from-a-loop}
+%
+% \end{thebibliography}
+%
+%
+%\StopEventually{^^A
+% \PrintChanges
+% \PrintIndex
+%}
+%
+% \part{Implementation}\label{part:impl}
+%
+% \iffalse
+%<*package>
+% \fi
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{expl3}[2018/06/01]
+\RequirePackage{xparse}[2018/02/01]
+\RequirePackage{l3keys2e}
+\ExplSyntaxOn
+\msg_new:nnn{erw}{generic}{#1}
+% \end{macrocode}
+% \section{Back end}
+% \subsection{\textsf{compose}}
+% \begin{macrocode}
+\cs_set:Npn \erw_compose:NnV
+ #1 % method
+ #2 % funs
+ #3 % var
+{
+ \erw_fold_set_par:n{Nf}
+ \erw_fold_apply_par:n{Nf}
+ \erw_cs_set_inline:Nn \__erw_map:n
+ {
+ #1{##1}#3
+ }
+ \exp_args:Nf\erw_map:n
+ {
+ \tl_reverse:n{#2}
+ }
+}
+\cs_set:Npn \erw_compose:nV #1 #2
+{
+ \erw_compose:NnV \erw_fold:NV {#1} #2
+}
+\cs_set:Npn \erw_compose_c:nV #1 #2
+{
+ \erw_compose:NnV \erw_fold:cV {#1} #2
+}
+\tl_new:N \__erw_compose_tl
+\cs_set:Npn \erw_compose:nn #1 #2
+{
+ \tl_set:Nn \__erw_compose_tl {#2}
+ \erw_compose:nV{#1}\__erw_compose_tl
+ \__erw_compose_tl
+}
+\cs_set:Npn \erw_compose_c:nn #1 #2
+{
+ \tl_set:Nn \__erw_compose_tl {#2}
+ \erw_compose_c:nV{#1}\__erw_compose_tl
+ \__erw_compose_tl
+}
+\cs_set:Npn \erw_compose_seq:nV #1 #2
+{
+ \erw_compose:NnV \erw_fold_seq:NV {#1} #2
+}
+\cs_set:Npn \erw_compose_seq_c:nV
+ #1 % funs
+ #2 % seq
+{
+ \erw_compose:NnV \erw_fold_seq:cV {#1} #2
+}
+\cs_set:Npn \erw_compose_vers:nV #1 #2
+{
+ \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented}
+}
+\cs_set:Npn \erw_compose_seq_vers:nV #1 #2
+{
+ \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented}
+}
+\cs_set:Npn \erw_compose_vers:nn #1 #2
+{
+ \erw_numbrd_cs_reset:{}
+ \tl_map_function:nN{#1}\erw_numbrd_cs_new:n
+ \exp_last_unbraced:Nx
+ \erw_compose_c:nn
+ {{\erw_numbrd_cs_names_braced:{}}}
+ {#2}
+}
+% \end{macrocode}
+% \subsection{\textsf{csutil}}
+% \begin{macrocode}
+\cs_set:Npn \__erw_cs_name:N #1
+{
+ \exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1}
+}
+\cs_set:Npn \erw_apply:Nn
+ #1 % fun
+ #2 % tl
+{
+ #1{#2}
+}
+\cs_generate_variant:Nn \erw_apply:Nn {No, Nf, Nx, c}
+\cs_set:Npn \erw_cs_set_eq:NN #1 #2
+{
+ \cs_set:Npn #1 ##1{#2{##1}}
+}
+\cs_generate_variant:Nn \erw_cs_set_eq:NN {cN}
+\cs_set:Npn \erw_cs_set_inline:Nn #1 #2
+{
+ \cs_set:Npn #1 ##1{#2}
+}
+\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn}
+\tl_set:Nn \__erw_fold_set_par_tl{\c_novalue_tl}
+\tl_set:Nn \__erw_fold_apply_par_tl{\c_novalue_tl}
+\cs_set:Npn \erw_fold_set_par:n #1
+{
+ \tl_set:Nn \__erw_fold_set_par_tl{#1}
+}
+\cs_set:Npn \erw_fold_apply_par:n #1
+{
+ \tl_set:Nn \__erw_fold_apply_par_tl{#1}
+}
+\cs_set:Npn \erw_fold:NV
+ #1 % fun
+ #2 % var
+{
+ \use:c{tl_set:\__erw_fold_set_par_tl}
+ #2
+ {\use:c{erw_apply:\__erw_fold_apply_par_tl}{#1}{#2}}
+}
+\cs_generate_variant:Nn \erw_fold:NV {cV}
+\tl_new:N \__erw_fold_seq_item_tl
+\cs_set:Npn \erw_fold_seq:NV
+ #1 % fun
+ #2 % seq
+{
+ \seq_get_right:NN #2 \__erw_fold_seq_item_tl
+ \erw_fold:NV #1 \__erw_fold_seq_item_tl
+ \seq_put_right:No #2 {\__erw_fold_seq_item_tl}
+}
+\cs_generate_variant:Nn \erw_fold_seq:NV {cV}
+\cs_set:Npn \erw_identity:n #1{#1}
+\cs_set:Npn\__erw_items_to:nnn #1 #2 #3
+{
+ \int_compare:nNnTF
+ {#1}>{#2}
+ {
+ \exp_args:Nf \tl_head:n{#3}
+ \__erw_items_to:nnn
+ {#1}
+ {\int_eval:n{#2+1}}
+ {\exp_args:Nf \tl_tail:n{#3}}
+ }
+ {
+ \exp_args:Nf \tl_head:n{#3}
+ }
+}
+\cs_set:Npn \erw_items_to:nn #1 #2
+{
+ \__erw_items_to:nnn
+ {#1}
+ {1}
+ {#2}
+}
+\cs_set:Npn \erw_last_item:n #1
+{
+ \exp_args:Nof \tl_item:nn
+ {#1}
+ {
+ \tl_count:n{#1}
+ }
+}
+\cs_set:Npn \erw_repeat:nn #1 #2
+{
+ \int_step_inline:nnnn{1}{1}{#1}{#2}
+}
+\cs_set:Npn \erw_split:nnn #1 #2 #3
+{
+ \tl_head:n{#1}
+ \use:c{exp_args:#3} \tl_map_inline:nn
+ {
+ \tl_tail:n
+ {
+ #1
+ }
+ }{#2##1}
+}
+\cs_set:Npn \erw_split:nn #1 #2
+{
+ \erw_split:nnn{#1}{#2}{Nf}
+}
+% \end{macrocode}
+% \subsection{\textsf{map}}
+% \begin{macrocode}
+\cs_set:Npn \erw_map:n #1
+{
+ \__erw_map:nn#1\q_recursion_tail\q_recursion_stop\q_recursion_tail\q_recursion_stop
+}
+\cs_set:Npn \__erw_map:nn #1 #2
+{
+ \quark_if_recursion_tail_stop:n{#1}
+ \__erw_map:n{#1} \__erw_map:nn{#2}
+}
+\cs_new:Npn \__erw_map:n #1
+{
+ \msg_error:nnn
+ {erw}
+ {generic}
+ {__erw_map:n~not~set}
+}
+\cs_set:Npn \erw_map:Nn
+ #1 % fun
+ #2 % tl
+{
+ \erw_cs_set_eq:NN \__erw_map:n #1
+ \erw_map:n{#2}
+}
+\cs_set:Npn \erw_map_inline:nn
+ #1 % inl
+ #2 % tl
+{
+ \erw_cs_set_inline:Nn \__erw_map:n {#1}
+ \erw_map:n{#2}
+}
+\cs_set:Npn \erw_apply:Nnn #1 #2 #3
+{
+ #1{#2}{#3}
+}
+\cs_set:Npn \erw_apply:Nnnn #1 #2 #3 #4
+{
+ #1{#2}{#3}{#4}
+}
+\cs_set:Npn \erw_apply:Nnnnn #1 #2 #3 #4 #5
+{
+ #1{#2}{#3}{#4}{#5}
+}
+
+\cs_set:Npn \__erw_map_thread_at:Nnn #1 #2 #3
+{
+ \erw_apply:Nn #1
+ {\exp_args:Nf\tl_item:nn {#3} {#2} }
+}
+\cs_set:Npn \__erw_map_thread_at:Nnnn #1 #2 #3 #4
+{
+ \erw_apply:Nnn #1
+ {\exp_args:Nf\tl_item:nn {#3} {#2} }
+ {\exp_args:Nf\tl_item:nn {#4} {#2} }
+}
+\cs_set:Npn \__erw_map_thread_at:Nnnnn #1 #2 #3 #4 #5
+{
+ \erw_apply:Nnnn #1
+ {\exp_args:Nf\tl_item:nn {#3} {#2} }
+ {\exp_args:Nf\tl_item:nn {#4} {#2} }
+ {\exp_args:Nf\tl_item:nn {#5} {#2} }
+}
+\cs_set:Npn \__erw_map_thread_at:Nnnnnn #1 #2 #3 #4 #5 #6
+{
+ \erw_apply:Nnnnn #1
+ {\exp_args:Nf\tl_item:nn {#3} {#2} }
+ {\exp_args:Nf\tl_item:nn {#4} {#2} }
+ {\exp_args:Nf\tl_item:nn {#5} {#2} }
+ {\exp_args:Nf\tl_item:nn {#6} {#2} }
+}
+\cs_set:Npn \erw_map_thread_at:Nnn #1 #2 #3
+{
+ \exp_args:Nf\int_case:nnTF
+ {
+ \tl_count:n{#3}
+ }
+ {
+ {1}{ \__erw_map_thread_at:Nnn #1{#2}#3 }
+ {2}{ \__erw_map_thread_at:Nnnn #1{#2}#3 }
+ {3}{ \__erw_map_thread_at:Nnnnn #1{#2}#3 }
+ {4}{ \__erw_map_thread_at:Nnnnnn #1{#2}#3 }
+ }
+ {
+ % Do nothing
+ }
+ {
+ \msg_error:nnn{erw}
+ {generic}
+ {erw_map_thread_at:~count~of~#3~not~withing~1~to~4}
+ }
+}
+
+\cs_set:Npn \erw_map_thread:Nn #1 #2
+{
+ % TODO check that #2 is a matrix
+ \int_step_inline:nn
+ {
+ \exp_args:Nf \tl_count:n{ \tl_head:n{#2} }
+ }
+ {
+ \erw_map_thread_at:Nnn #1 {##1} {#2}
+ }
+}
+% \end{macrocode}
+% \subsection{\textsf{numbrdcs}}
+% \begin{macrocode}
+\int_new:N \__erw_numbrd_cs_int
+\cs_set:Npn \erw_numbrd_cs_name:n #1{__erw_numbrd_cs_\int_to_alph:n{#1}:n}
+\cs_set:Npn \erw_numbrd_cs_name_braced:n #1{{\erw_numbrd_cs_name:n{#1}}}
+\tl_set:Nn \__erw_numbrd_cs_name_tl {\erw_numbrd_cs_name:n{\__erw_numbrd_cs_int}}
+\cs_set:Npn \erw_numbrd_cs:nn #1 #2
+{
+ \erw_apply:cn{__erw_numbrd_cs_\int_to_alph:n{#1}:n}{#2}
+}
+\cs_new_protected:Npn \erw_numbrd_cs_reset:
+{
+ \int_zero:N \__erw_numbrd_cs_int
+ \tl_set:Nn \__erw_numbrd_cs_ext_tl{}
+}
+\cs_new_protected:Npn \erw_numbrd_cs_new:n #1
+{
+ \int_incr:N \__erw_numbrd_cs_int
+ \erw_cs_set_inline:cn{\__erw_numbrd_cs_name_tl}
+ {
+ \token_if_cs:NTF
+ {#1}
+ {#1{##1}}
+ {#1}
+ }
+}
+\cs_new:Npn \erw_numbrd_cs_names:nnn #1 #2 #3
+{
+ \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name:n
+}
+\cs_new:Npn \erw_numbrd_cs_names_braced:nnn #1 #2 #3
+{
+ \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name_braced:n
+ % TODO \tl_range_braced:nnn?
+}
+\cs_new:Npn \erw_numbrd_cs_names_braced:
+{
+ \erw_numbrd_cs_names_braced:nnn{1}{1}{\__erw_numbrd_cs_int}
+}
+% \end{macrocode}
+% \section{frontend}
+% \subsection{\textsf{disambig}}
+% \begin{macrocode}
+\cs_set:Npn \__erw_disambig:NN #1 #2 {#1{#2}}
+\cs_generate_variant:Nn \__erw_disambig:NN { Nc }
+\NewDocumentCommand{\disambignewcmd}{ s m m m }
+{
+ \msg_error:nnn{erw}{generic}{disambignewcmd~undefined}
+}
+\NewDocumentCommand{\disambignewenv}{ s m m m m }
+{
+ \msg_error:nnn{erw}{generic}{disambignewenv~undefined}
+}
+\keys_define:nn { erw }
+{
+ disambig .code:n =
+ {
+ \RenewDocumentCommand{\disambignewcmd}{ s m m m }
+ {
+ \IfBooleanTF{##1}
+ {\__erw_disambig:Nc{\RenewDocumentCommand}}
+ {\__erw_disambig:Nc{\NewDocumentCommand}}
+ {#1 \__erw_cs_name:N ##2}
+ {##3}
+ {##4}
+ }
+ \RenewDocumentCommand{\disambignewenv}{ s m m m m }
+ {
+ \IfBooleanTF{##1}
+ {\RenewDocumentEnvironment}
+ {\NewDocumentEnvironment}
+ {#1##2}
+ {##3}
+ {##4}
+ {##5}
+ }
+ },
+ disambig .initial:n = \c_empty_tl
+}
+\NewDocumentCommand{\disambigset}{ m }
+{
+ \keys_set:nn { erw }
+ {
+ disambig={#1}
+ }
+}
+\NewDocumentCommand{\disambigunset}{}
+{
+ \disambigset{\c_empty_tl}
+}
+% \end{macrocode}
+% \subsection{\textsf{numbrdcs}}
+% \begin{macrocode}
+\NewDocumentCommand{\numbrdcsnew}{ s m }
+{
+ \IfBooleanTF{#1}
+ {}
+ { \erw_numbrd_cs_reset:{}}
+ \tl_map_function:nN {#2}\erw_numbrd_cs_new:n
+}
+\NewDocumentCommand{\numbrdcs}{ m m }
+{
+ \erw_numbrd_cs:nn{#1}{#2}
+}
+% \end{macrocode}
+% \begin{macrocode}
+% \ProcessKeysPackageOptions{ erw }
+\ExplSyntaxOff
+% \end{macrocode}
+%
+%
+% \iffalse
+%</package>
+% \fi
+% \Finale
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/erw-l3/erw-l3.pdf b/macros/latex/contrib/erw-l3/erw-l3.pdf
new file mode 100644
index 0000000000..ef0725e710
--- /dev/null
+++ b/macros/latex/contrib/erw-l3/erw-l3.pdf
Binary files differ