% \iffalse meta-comment % !TEX program = pdfLaTeX %<*internal> \iffalse % %<*readme> ---------------------------------------------------------------- erw-l3 --- Utilities built around expl3 Source repository: https://github.com/rogard/erw-l3 Released under the LaTeX Project Public License v1.3c or later See http://www.latex-project.org/lppl.txt ---------------------------------------------------------------- % %<*internal> \fi \def\nameofplainTeX{plain} \ifx\fmtname\nameofplainTeX\else \expandafter\begingroup \fi % %<*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}} } % %\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 % %\RequirePackage{expl3}[2018/06/01] %\RequirePackage{xparse}[2018/02/01] %\RequirePackage{l3keys2e} %\ProvidesExplPackage % {erw-l3} % Package name % {2020/02/05} % Release date % {0.1.6} % Release version % {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} % % \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*{Conventions} % % 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*{Requirement} % % Have \file{erw-l3.sty} is in the path of the \LaTeX~engine. % % \part{Usage}\label{part:usage} % % In the preamble of \cs{documentclass}, put: % \begin{center} % \cs{usepackage}\oarg{options}|{|\pkg{erw-l3}|}|\linebreak % \end{center} % % \section{\textsf{compose}} % % \subsection{\textsf{backend}} % % \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} % {\color{red}Not implemented} % \end{function} % % \section{\textsf{csutil}} % % \subsection{\textsf{backend}} % % \begin{function}{\erw_accum:nn} % \begin{syntax}{\cs{erw_accum:nn}}\marg{token list}\marg{item} % \end{syntax}Expands to a token list comprising the items of \meta{token list} and \meta{item} % \end{function} % % \begin{function}{\erw_apply:Nn, \erw_apply:cn, \erw_apply:Nnn, \erw_apply:Nnnn, \erw_apply:Nnnnn} % \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,\erw_cs_gset_eq:NN, \erw_cs_gset_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,\erw_cs_gset_inline:Nn, \erw_cs_gset_inline:cn} % \begin{syntax}{\cs{erw_cs_set_inline:Nn}}\meta{cs}\marg{code} % \end{syntax} % \end{function} % % \begin{function}{\erw_identity:n} % \begin{syntax}{\cs{erw_identity:n}}\marg{arg} % \end{syntax} Expands to \meta{arg} % \end{function} % % \begin{function}{\erw_is_matrix_p:n,\erw_is_matrix:nTF} % \begin{syntax}{\cs{erw_is_matrix_p:n}}\marg{token list} % \end{syntax} Checks if \meta{token list} is a (square) matrix. % \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_last_item:nn} % \begin{syntax}{\cs{erw_last_item:nn}}\marg{int}\marg{token list} % \end{syntax} ^^ASee Listing~\autoref{listng:items} % \end{function} % % \begin{function}{\erw_merge:nn} % \begin{syntax}{\cs{erw_merge:nn}}\marg{tl 1}\marg{tl 2} % \end{syntax}Merges \meta{tl 1}\meta{tl 2} % \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} % % \section{\textsf{int}} % % \subsection{\textsf{backend}} % % \begin{function}{\erw_int_range:nn} % \begin{syntax}{\cs{erw_int_range:nn}}\marg{first}{last} % \end{syntax} Returns a range of integers. Implementation different than \cs{int_step_inline} % \end{function} % % \begin{function}{\erw_int_range:n} % \begin{syntax}{\cs{erw_int_range:n}}\marg{count} % \end{syntax} Returns a range of integers. Implementation different than \cs{int_step_inline}. See Listing~\autoref{listng:int:range} % \end{function} % % \section{\textsf{map}} % % \subsection{\textsf{backend}} % % \begin{function}{\erw_set_map:N,\erw_gset_map:N} % \begin{syntax}{\cs{erw_set_map:N}}\meta{cs} % \end{syntax} Sets the function used by \cs{erw_map:n}. % \end{function} % % \begin{function}{\erw_set_map_inline:n,\erw_gset_map_inline:n} % \begin{syntax}{\cs{erw_set_map_inline:n}}\marg{code} % \end{syntax} Sets the function used by \cs{erw_map:n}. % \end{function} % % \begin{function}{\erw_map:n} % \begin{syntax}{\cs{erw_map:n}}\marg{token list} % \end{syntax} Applies the stored \meta{cs} to each item in \meta{token list}. An application is \cs{erw_is_matrix} % \end{function} % % \begin{function}{\erw_map:Nn} % \begin{syntax}{\cs{erw_map:Nn}}\meta{cs}\marg{token list} % \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_indexed:Nnn} % \begin{syntax}{\cs{erw_map_indexed:Nnn}}\meta{cs}\marg{int}\marg{matrix of tokens} % \end{syntax} {\color{red} Not implemented}. See Listing~\autoref{listng:mapindexed}. % \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} must be 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} % % \section{\textsf{numbrdcs}} % % \subsection{backend} % % \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} % % \subsection{frontend} % % \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} % % \floatstyle{ruled} % \newfloat{Listing}{H}{lop} % \NewDocumentCommand{\erwtab}{O{0.5}}{\tabto{#1\linewidth}} % % \section{compose} % % \subsection{\textsf{backend}} % % \vspace*{\fill} % \begin{Listing} % \verb|\ExplSyntaxOn|\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} % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{ }\label{listng:compose} % \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|\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} % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{ }\label{listng:compose:c} % \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|\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} % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{}\label{listng:compose:seq} % \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|\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} % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{}\label{listng:compose:seq:c} % \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|\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} % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{}\label{listng:compose:vers} % \end{Listing} % % \section{csutil} % % \subsection{\textsf{backend}} % % \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_is_matrix:nTF| % \\\verb|{| % \\\verb| { {a}{b}{c} }| % \\\verb| { {k}{l}{m} }| % \\\verb| { {x}{y}{z} }| % \\\verb|}{T}{F}|\erwtab\erw_is_matrix:nTF % { % { {a}{b}{c} } % { {k}{l}{m} } % { {x}{y}{z} } % }{T}{F} % \\\verb|\erw_is_matrix:nTF| % \\\verb|{| % \\\verb| { {a}{c} }| % \\\verb| { {k} }| % \\\verb| { {x}{y}{z} }| % \\\verb|}{T}{F}|\erwtab % \erw_is_matrix:nTF % { % { {a}{c} } % { {k} } % { {x}{y}{z} } % }{T}{F} % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{ }\label{listng:ismatrix} % \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} % % \section{\textsf{int}} % % \subsection{\textsf{backend}} % % \begin{Listing} % \verb|\ExplSyntaxOn|\ExplSyntaxOn % \\\verb|\erw_int_range:nn{2}{5}|\erwtab\erw_int_range:nn{2}{5} % \\\verb|\erw_int_range:n{5}|\erwtab\erw_int_range:n{5} % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{ }\label{listng:int:range} % \end{Listing} % % \section{\textsf{map}} % % \subsection{\textsf{backend}} % % \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} % \verb|\ExplSyntaxOn|\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}} % } % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{ }\label{listng:thread} % \end{Listing} % % \begin{Listing} % \verb|\ExplSyntaxOn|\ExplSyntaxOn % \\\verb|\cs_set_protected:Npn \__foo:nn #1 #2| % \\\verb| {(#1+#2)}| \cs_set_protected:Npn \__foo:nn #1 #2 {(#1+#2)} % \\\verb|\erw_map_thread:Nn| % \\\verb| \__foo:nn | % \\\verb| { | % \\\verb| {{1}{2}{3}} | % \\\verb| {{a}{b}{c}}| % \\\verb| }|\erwtab\erw_map_thread:Nn % \__foo:nn % { % {{1}{2}{3}} % {{a}{b}{c}} % } % \\\verb|\exp_last_unbraced:Nx| % \\\verb|\erw_map_thread:Nn| % \\\verb|{| % \\\verb| \__foo:nn | % \\\verb| { | % \\\verb| {\erw_int_range:n{3}} | % \\\verb| {{a}{b}{c}}| % \\\verb| }| % \\\verb|}| \erwtab % \exp_last_unbraced:Nx % \erw_map_thread:Nn % { % \__foo:nn % { % {\erw_int_range:n{3}} % {{a}{b}{c}} % } % }\erwtab[0.7]{\color{red} (does~not~thread!)} % \\\verb|\exp_last_unbraced:Nx| % \\\verb|\erw_map_thread:Nn| % \\\verb|{| % \\\verb| \__foo:nn | % \\\verb| { | % \\\verb| {\int_step_inline:nn{3}{#1}} | % \\\verb| {{a}{b}{c}}| % \\\verb| }| % \\\verb|}| % \erwtab[0.2]{\color{red} \verb|Illegal parameter number in definition of \l__exp_internal_tl!|} % \\\verb|\ExplSyntaxOff|\ExplSyntaxOff % \caption{Debugging~for~\cs{erw_map_indexed}}\label{listng:mapindexed} % \end{Listing} % % \section{\textsf{numbrdcs}} % % \subsection{\textsf{backend}} % % \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_braced:| % \\\verb| 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} % % \subsection{frontend} % % \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} % % %\StopEventually{^^A % \PrintChanges % \PrintIndex %} % % \part{Implementation}\label{part:impl} % % \iffalse %<*package> % \fi % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ExplSyntaxOn \msg_new:nnn{erw}{generic}{#1} % \end{macrocode} % \section{\textsf{compose}} % \subsection{backend} % \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} % \section{\textsf{csutil}} % \subsection{\textsf{backend}} % \begin{macrocode} \cs_set:Npn \erw_accum:nn #1 #2 { {#1{#2}} } \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_gset_eq:NN #1 #2 { \cs_gset:Npn #1 ##1{#2{##1}} } \cs_generate_variant:Nn \erw_cs_gset_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} \cs_set:Npn \erw_cs_gset_inline:Nn #1 #2 { \cs_gset:Npn #1 ##1{#2} } \cs_generate_variant:Nn \erw_cs_gset_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} \prg_set_conditional:Npnn \erw_is_matrix:n #1 { p, TF } { \erw_gset_map_inline:n{==\tl_count:n{##1}} \int_compare:nTF { \exp_args:Nf\tl_count:n{\tl_head:n{#1}} \exp_args:Nf \erw_map:n { \tl_tail:n{#1} } } {\prg_return_true:} {\prg_return_false:} } % Deprecated in v0.1.4 after realizing \cs{tl_range:n} does the job %\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_merge:nn #1 #2 { {#1#2} } \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} % \section{\textsf{map}} % \subsection{\textsf{backend}} % \begin{macrocode} \cs_set:Npn \__erw_int_range:nnn #1 #2 #3 { \int_compare:nNnTF { \int_eval:n{#2+1} }>{#3} { {#1} } { \__erw_int_range:nnn { \exp_args:Nx\erw_accum:nn{#1} { \int_eval:n{#2+1} } } {\int_eval:n{#2+1}} {#3} } } \cs_set:Npn \erw_int_range:nn #1 #2 { \__erw_int_range:nnn {{#1}}{#1}{#2} } \cs_set:Npn \erw_int_range:n #1 { \__erw_int_range:nnn {}{0}{#1} % Alt to: % \int_step_inline:nn {#1}{##1} } % \end{macrocode} % \section{\textsf{map}} % \subsection{\textsf{backend}} % \begin{macrocode} \cs_set:Npn \erw_gset_map:N #1 { \erw_cs_gset_eq:NN \__erw_map:n #1 } \cs_set:Npn \erw_gset_map_inline:n #1 { \erw_cs_gset_inline:Nn \__erw_map:n {#1} } \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} % \section{\textsf{numbrdcs}} % \subsection{\textsf{backend}} % \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} % \subsection{\textsf{frontend}} % \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} } % \ProcessKeysPackageOptions{ erw } \ExplSyntaxOff % \end{macrocode} % \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/rogard/erw-l3} (development) where you can report issues. % % \section{To do}\label{todo} % % \begin{itemize} % \item Missing variants of \cs{erw_compose} % \item \cs{erw_map_indexed}. See Listing~\autoref{listng:mapindexed} % \item Need to give some thought to `protected' % \end{itemize} % % \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} %\changes{0.1.3}{2018/06/22}{Wrong versioning, should have been 0.1.2} %\changes{0.1.4}{2018/06/22}{} %\changes{0.1.4}{2018/06/22}{Removed \cs{erw_items_to} (redundant with \cs{tl_range:nnn})} %\changes{0.1.4}{2018/06/22}{Added \cs{erw_accum}} %\changes{0.1.4}{2018/06/22}{Added \cs{erw_merge}} %\changes{0.1.4}{2018/06/22}{Added \cs{erw_int_range}} %\changes{0.1.4}{2018/06/22}{Added \cs{erw_set_map}} %\changes{0.1.4}{2018/06/22}{Added \cs{erw_set_map_inline}} %\changes{0.1.4}{2018/06/22}{Added \cs{erw_is_matrix}} %\changes{0.1.5}{2019/12/12}{Modified source repository} %\changes{0.1.5}{2019/12/12}{Rearranged frontend/backend sections} %\changes{0.1.5}{2019/12/12}{Split Section Preliminaries into Conventions and Requirement.} %\changes{0.1.5}{2019/12/12}{Removed \pkg{disambig}} %\changes{0.1.6}{2020/02/05}{Fixed critical bug preventing \pkg{erw-l3} from working without explicit inclusion of \pkg{expl3}} % % % \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} % % % \iffalse % % \fi % \Finale \endinput