diff options
author | Karl Berry <karl@freefriends.org> | 2020-06-04 21:07:37 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-06-04 21:07:37 +0000 |
commit | 56d8ecd6f0302bfcfee027a368d5f2b12e88bf8f (patch) | |
tree | 4444df610c3208fb726fe04f5183a12ea8e77f57 /Master | |
parent | f2cab13b34afedef982062c02d5b6ff89c864785 (diff) |
erw-l3 (4jun20)
git-svn-id: svn://tug.org/texlive/trunk@55414 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r-- | Master/texmf-dist/doc/latex/erw-l3/1343c9c903.tex | 1 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/erw-l3/README.md | 10 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/erw-l3/README.txt | 7 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/erw-l3/erw-l3.pdf | bin | 532611 -> 678206 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx | 2633 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/erw-l3/erw-l3.ins | 68 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/erw-l3/erw-l3.sty | 642 |
7 files changed, 1985 insertions, 1376 deletions
diff --git a/Master/texmf-dist/doc/latex/erw-l3/1343c9c903.tex b/Master/texmf-dist/doc/latex/erw-l3/1343c9c903.tex new file mode 100644 index 00000000000..2b16c526d77 --- /dev/null +++ b/Master/texmf-dist/doc/latex/erw-l3/1343c9c903.tex @@ -0,0 +1 @@ +Hello,\ world! diff --git a/Master/texmf-dist/doc/latex/erw-l3/README.md b/Master/texmf-dist/doc/latex/erw-l3/README.md index a50f3691345..5facff0f19d 100644 --- a/Master/texmf-dist/doc/latex/erw-l3/README.md +++ b/Master/texmf-dist/doc/latex/erw-l3/README.md @@ -1,7 +1,7 @@ ----------------------------------------------------------------- -#### erw-l3 --- Utilities built around expl3 +----------------------------------------------------------------- +##### erw-l3 --- Utilities for LaTeX3 programming - 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 - ----------------------------------------------------------------- +- Released under the LaTeX Project Public License v1.3c or later +- See http://www.latex-project.org/lppl.txt +----------------------------------------------------------------- diff --git a/Master/texmf-dist/doc/latex/erw-l3/README.txt b/Master/texmf-dist/doc/latex/erw-l3/README.txt deleted file mode 100644 index 4010a82d977..00000000000 --- a/Master/texmf-dist/doc/latex/erw-l3/README.txt +++ /dev/null @@ -1,7 +0,0 @@ ----------------------------------------------------------------- -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 ----------------------------------------------------------------- - diff --git a/Master/texmf-dist/doc/latex/erw-l3/erw-l3.pdf b/Master/texmf-dist/doc/latex/erw-l3/erw-l3.pdf Binary files differindex bbcff81588e..e8178b0dc40 100644 --- a/Master/texmf-dist/doc/latex/erw-l3/erw-l3.pdf +++ b/Master/texmf-dist/doc/latex/erw-l3/erw-l3.pdf diff --git a/Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx b/Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx index b538f3dd77d..eb504d5bbb6 100644 --- a/Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx +++ b/Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx @@ -1,39 +1,39 @@ % \iffalse meta-comment % !TEX program = pdfLaTeX -%<*internal> +%<*internal> \iffalse -%</internal> -%<*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> +%<*readme> +----------------------------------------------------------------- +##### erw-l3 --- Utilities for LaTeX3 programming +- 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 +----------------------------------------------------------------- -%</readme> -%<*internal> +%</readme> +%<*internal> \fi \def\nameofplainTeX{plain} \ifx\fmtname\nameofplainTeX\else - \expandafter\begingroup +\expandafter\begingroup \fi -%</internal> -%<*install> -\input docstrip.tex +%</internal> +%<*install> +\input l3docstrip.tex \keepsilent \askforoverwritefalse \preamble ----------------------------------------------------------------- -erw-l3 Utilities built around expl3 +---------------------------------------------------------------------------- +erw-l3 --- Utilities for LaTeX3 programming 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 +Copyright (C) 2018-2020 by Erwann Rogard This work may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either @@ -45,1172 +45,1743 @@ 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. +This work consists of the file erw-l3.dtx and the derived files: +erw-l3.sty, and erw-l3.pdf. \endpostamble \generate{ \file{\jobname.sty}{\from{\jobname.dtx}{package}} } -%</install> -%<install>\endbatchfile -%<*internal> +%</install> +%<install> \endbatchfile +%<*internal> \generate{ \file{\jobname.ins}{\from{\jobname.dtx}{install}} } \nopreamble\nopostamble \generate{ - \file{README.txt}{\from{\jobname.dtx}{readme}} + \file{README.md}{\from{\jobname.dtx}{readme}} } \ifx\fmtname\nameofplainTeX - \expandafter\endbatchfile +\expandafter\endbatchfile \else - \expandafter\endgroup +\expandafter\endgroup \fi -%</internal> -%<package>\RequirePackage{expl3}[2018/06/01] -%<package>\RequirePackage{xparse}[2018/02/01] -%<package>\RequirePackage{l3keys2e} -%<package>\ProvidesExplPackage -%<package> {erw-l3} % Package name -%<package> {2020/02/05} % Release date -%<package> {0.1.6} % Release version -%<package> {Utilities built around expl3} % Description -% -%<*driver> +%</internal> +%<package> \NeedsTeXFormat{LaTeX2e}[2020/02/02] +%<package> \RequirePackage{etoolbox}[2019/09/21] +%<package> \RequirePackage{l3keys2e}[2020/03/06] +%<package> \RequirePackage{xparse}[2020/03/06] +%<package> \ProvidesExplPackage +%<package> {erw-l3} % Package name +%<package> {2020/06/04} % Release date +%<package> {3.1} % Release version +%<package> {erw-l3 --- Utilities for LaTeX3 programming } % Description +% +%<*driver> +\RequirePackage{fvextra}%^^A\NB{done}{Warning:csquotes should be loaded after fvextra->nope} \documentclass[full]{l3doc} +\listfiles +\usepackage[english]{babel} +\AtBeginDocument{\selectlanguage{english}} +\usepackage{bookmark} +\usepackage[T1]{fontenc} \usepackage{erw-l3} -\usepackage{float} +\usepackage{microtype} +\usepackage{nolbreaks} \usepackage{tabto} -\usepackage{cleveref} -\ExplSyntaxOn -\tl_gset:Nn \partname {Part} -\ExplSyntaxOff +\usepackage{tcolorbox} +\tcbuselibrary{listings, breakable} +\usepackage{xparse} +\usepackage{hyperref} \EnableCrossrefs \CodelineIndex \RecordChanges -% \AtEndDocument { \PrintChanges \PrintIndex } % TODO +% ^^A\AtEndDocument { \PrintChanges \PrintIndex } +\makeatletter +\newcommand*{\docsetnameref}{\def\@currentlabelname}%https://tex.stackexchange.com/questions/537751 +\makeatother +\ExplSyntaxOn +\tl_gset:Nn \partname {Part} +\newenvironment{docabstract}[1]%https://latex.org/forum/viewtopic.php?t=12156 +{\renewcommand{\abstractname}{#1}\begin{abstract}} + {\end{abstract}} +\cs_new:Nn \__erw_docu:n{\MakeUppercase #1} +\ProvideDocumentCommand\DocPhantomSection{smmm} +{ + \leavevmode + \refstepcounter{#2} + \IfBooleanT{#1} + { + \addcontentsline{toc}{#2}{\protect\numberline{\use:c{the#2}}#3} + } + \docsetnameref{#3} + \label{#4} +} +\providecommand\docU[1]{\exp_args:Nx \__erw_docu:n{#1}} +\ExplSyntaxOff +% ^^A Sort---> +\providecommand\docarg[1]{\texttt{#1}} % fun[param] (macro) vs fun[arg] (eval) +\providecommand\docargnoval{\c_novalue_tl} +\providecommand\docassign[2]{#1~$\leftarrow$~#2} +\providecommand\docccept[1]{\textit{#1}} +\providecommand\doccceptargspec{arg~spec} +\providecommand\doccceptbool{boolean} +\providecommand\doccceptcont{container} +\providecommand\doccceptclist{clist} +\providecommand\doccceptcode{code} +\providecommand\doccceptcsname{cs name} +\providecommand\doccceptcsorcode{cs~or~code} +\providecommand\doccceptcs{cs} +\providecommand\doccceptempty{empty} +\providecommand\doccceptgroup{local~group} +\providecommand\doccceptint{integer} +\providecommand\doccceptitems{items} +\providecommand\doccceptkey{key} +\providecommand\doccceptkvl{keyval~list} +\providecommand\doccceptopt{option} +\providecommand\doccceptpath{path} +\providecommand\doccceptplaceh{placeholder} +\providecommand\doccceptpre{preamble} +\providecommand\doccceptprop{prop} +\providecommand\doccceptsep{separators} +\providecommand\doccceptseq{seq} +\providecommand\docccepttlvar{tl~var} +\providecommand\docccepttl{token~list} +\providecommand\docccepttok{token} +\providecommand\doccceptval{val} +\providecommand\docconv[1]{convention~\autoref{conv:#1}} +\providecommand\docdefaultfor{default~for~} +\providecommand\docenvdoc{\env{document}} +\providecommand\doceval[1]{\texttt{\char`\{}#1\texttt{\char`\}}} +\providecommand\docexpand[2]{#1~$\rightarrow$~#2} +\providecommand\docfillblank{\begin{minipage}[t]{\linewidth}\end{minipage}} +\providecommand\docissuedont{Don't: } +\providecommand\docissuedo{Do: } +\providecommand\docissuesymp{Symptom: } +\providecommand\doclist[1]{Listing~\ref{listing:#1}} +\providecommand\docnb{\noindent\textbf{NB}:~} +\providecommand\docoptd[1]{\texttt{\textless}#1\texttt{\textgreater}} +\providecommand\docopte[2]{\texttt{#1}\doceval{#2}} +\providecommand\docopto[1]{\texttt{[}#1\texttt{]}} +\providecommand\docpipe{\textbar} +\providecommand\doccs[1]{\texttt{\textbackslash{}#1}} +\providecommand\docreflist[1]{Listing~\ref{listing:#1}} +\providecommand\docsee{See:~} +\providecommand\docstep[1]{step~\ref{step:#1}} +\providecommand\doctip{\noindent\textbf{Tip}:~} +\providecommand\docvers[2]{v#1.#2} +\providecommand\docwarn{\noindent\textbf{Warning}:~} +\providecommand\docxparsed[1][~argument]{`d'-type~#1} +\providecommand\docxparsee[1][~argument]{`e'-type~#1} +\providecommand\docxparsem[1][~argument]{`m'-type~#1} +\providecommand\docxparseo[1][~argument]{`o'-type~#1} +\providecommand\pkgkey{key$_{i}$} +\providecommand\pkgobj[1]{object identified by #1} +\providecommand\pkgoptex{\docarg{Expans}} +\providecommand\pkgoptfi{\docarg{File}} +\providecommand\pkgoptin{\docarg{Inner}} +\providecommand\pkgoptions{kvl0} +\providecommand\pkgoptou{\docarg{Outer}} +\providecommand\pkgoptpad{\docarg{Default}}%default +\providecommand\pkgoptpa{\docarg{Param}} +\providecommand\pkgoptse{\docarg{Separ}} +\providecommand\pkgoptwr{\docarg{Write}} +\providecommand\pkgparap{\texttt{+}}%append +\providecommand\pkgparex{\texttt{*}}%expand +\providecommand\pkgparhe{tl$_{1}$}%head +\providecommand\pkgparin{code$_{1}$}%inner +\providecommand\pkgparkvlnxt{kvl$_{2}$} +\providecommand\pkgparkvl{kvl$_{1}$} +\providecommand\pkgparou{code$_{2}$}%outer +\providecommand\pkgparpa{tl$_{2}$}%param +\providecommand\pkgparsiii{tl$_{5}$} +\providecommand\pkgparsii{tl$_{4}$} +\providecommand\pkgparsi{tl$_{3}$} +\providecommand\pkgpars{\Arg{\pkgparsi}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}%separ +\providecommand\pkgparta{tl$_{6}$}%tail +\providecommand\pkgsep[1]{\Arg{#1}} +\providecommand\pkgval{val$_{i}$} +% ^^A Sort<--- \begin{document} - \DocInput{\jobname.dtx} +\DocInput{\jobname.dtx} \end{document} -%</driver> +%</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*{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} +% \begin{documentation} +% \title{The \pkg{erw-l3} package \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 +% \begingroup +% \selectlanguage{english} +% \begin{docabstract}{Abstract} +% Utilities for \LaTeX3 programming\cite{interface3}. +% \end{docabstract} +% \endgroup +% +% \tableofcontents +% +% \part{Usage}\label{part:usage} +% ^^A \VerbatimFootnotes +% +% \DocPhantomSection*{section}{Loading the package}{usage:load} +% \begin{function}{\usepackage} +% \begin{syntax} +% \cs{usepackage}\doceval{\pkg{\jobname}} % \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} +% \begin{description} +% \item[Requirement]\docfillblank +% \begin{enumerate} +% \item \file{\jobname.sty} and its dependencies are in the path of the \LaTeX~engine. See \autoref{part:other}, \autoref{other:support}. +% \item Goes in the~\docccept{\doccceptpre} +% \end{enumerate} +% \end{description} +% \end{function} +% +% \section{\textsf{cs}}\label{usage:cs} +% \begin{function}{\erw_cs_compose:NnN} +% \begin{syntax} +% \cs{erw_cs_compose:NnN}\meta{\doccceptcs}\Arg{\doccceptitems}\meta{\docccepttlvar} % \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{function} +% \begin{function}{\erw_cs_identity:n} +% \begin{syntax} +% \cs{erw_cs_identity:n}\Arg{arg} % \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} -% +% \end{function} +% \begin{function}{\erw_cs_set_inline:Nn, \erw_cs_set_inline:cn, \erw_cs_gset_inline:Nn, \erw_cs_set_inline:cn} +% \begin{syntax} +% \cs{erw_cs_set_inline:Nn}\meta{\doccceptcs}\Arg{\doccceptcode} +% \end{syntax} +% \end{function} +% +% \section{\textsf{csint}} +% \begin{function}{\erw_csint:nn} +% \begin{syntax} +% \cs{erw_csint:nn}\Arg{\doccceptint}\Arg{arg} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_csint_name:n} +% \begin{syntax} +% \cs{erw_csint_name:n}\Arg{\doccceptint} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_csint_names_braced:, \erw_csint_names_braced:n, \erw_csint_names_braced:nnn} +% \end{function} +% \begin{function}{\erw_csint_new:n} +% \begin{syntax} +% \cs{erw_csint_new:n}\Arg{\doccceptint} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_csint_reset:} +% \begin{syntax} +% \cs{erw_csint_reset:} +% \end{syntax} +% \end{function} +% +% \section{\textsf{int}} \label{usage:int} +% \begin{function}{\erw_int_range:n, \erw_int_range:nn} +% \begin{syntax} +% \cs{erw_int_range:n}\Arg{\doccceptint} +% \end{syntax} +% \end{function} +% +% \section{\textsf{keys}} \label{usage:keys} +% \begin{function}{\erw_keyval_parse:NNNn} +% \begin{syntax} +% \cs{erw_keyval_parse:NNNn} \meta{\doccceptcont}\meta{\doccceptcs_1}\meta{\doccceptcs_2}\doceval{\doceval{\meta\docccepttl_1}\dots} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_keyval_error:Nn, \erw_keyval_error:Nnn} +% \begin{syntax} +% \cs{erw_keyval_error:Nn}\meta{\docccepttok}\Arg{\doccceptkvl}\\ +% \cs{erw_keyval_error:Nnn}\meta{\docccepttok}\Arg{\doccceptclist} +% \end{syntax} +% \end{function} +% +% \section{\textsf{lambda}} \label{usage:lambda} +% \begin{function}{\erw_lambda:nnn} +% \begin{syntax} +% \cs{erw_lambda:nnn}\meta{\docccepttok}\Arg{\doccceptargspec}\Arg{\doccceptcode} +% \end{syntax} +% \end{function} +% +% \section{\textsf{option}}\label{usage:option} +% \begin{function}{\erw_option:n} +% \begin{syntax} +% \cs{erw_option:n}\Arg{\doccceptkvl} +% \end{syntax} +% \end{function} +% +% \DescribeOption{tl / fold_set_par} +% \DescribeOption{tl / fold_apply_par} +% \DescribeOption{sys / timestamp_delim} +% +% \section{\textsf{prop}}\label{usage:prop} +% All functions that modify a \meta{\doccceptprop} first create it if not exist. +% +% \begin{function}{\erw_prop_keyval_parse:NNNn} +% \begin{syntax} +% \cs{erw_prop_keyval_parse:NNNn}\meta{\doccceptprop}\meta{\doccceptcs_1}\meta{\doccceptcs_2}\Arg{\doccceptkvl} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_prop_map_item:NNN} +% \begin{syntax} +% \cs{erw_prop_map_item:NNN}\meta{\doccceptcs}\meta{\doccceptprop_1}\meta{\doccceptprop_2} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_prop_to_clist:Nn} +% \begin{syntax} +% \cs{erw_prop_to_clist:Nn}\meta{\doccceptprop}\doceval{\meta{\doccceptkey_1},\dots} +% \end{syntax} +% \end{function} +% +% +% \section{\textsf{seq}}\label{usage:seq} +% All functions that modify a \meta{\doccceptseq} first create it if not exists. +% \begin{function}{\erw_seq_fold:NN,\erw_seq_fold:cN} +% \begin{syntax} +% \cs{erw_seq_fold:NN}\Arg{\Arg{\doccceptcs_1}\dots} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_seq_put_right_clist:Nn, \erw_seq_put_right_clist:cn} +% \begin{syntax} +% \cs{erw_seq_put_right_clist:Nn}\meta{\doccceptseq}\Arg{\doccceptclist} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_seq_put_right_prop:NNn} +% \begin{syntax} +% \cs{erw_seq_put_right_prop:NNn}\meta{\doccceptseq}\meta{\doccceptprop}\Arg{\doccceptclist} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_seq_use:Nn} +% \begin{syntax} +% \cs{erw_seq_use:Nn}\meta{\doccceptseq}\Arg{\doccceptitems} +% \end{syntax} +% \begin{description} +% \item[Also see] \cite[Section 8 of \pkg{l3seq}]{interface3} +% \item[Semantics] \cs{seq_use:Nnnn}\meta{\doccceptseq}\nameref{usage:tl:sep}\Arg{\doccceptitems} +% \end{description} +% \end{function} +% +% \section{\textsf{sys}}\label{usage:sys} +% \begin{function}{\erw_sys_jobnametimestamp:nn,\erw_sys_jobnametimestamp:} +% \begin{syntax} +% \cs{erw_sys_jobnametimestamp:nn}\doceval{date\docpipe{}time\docpipe{}datetime}\doceval{10\docpipe{}16} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_sys_timestamp:nn,\erw_sys_timestamp:} +% \begin{syntax} +% \cs{erw_sys_timestamp:nn}\doceval{date\docpipe{}time\docpipe{}datetime}\doceval{10\docpipe{}16} +% \end{syntax} +% \begin{description} +% \item[Semantics] Timestamp in base 10 or 16 +% \end{description} +% \end{function} +% \begin{function}{\erw_sys_timestamp_delimiter:} +% \begin{syntax} +% \cs{erw_sys_timestamp_delimiter:} +% \end{syntax} +% \end{function} +% +% \section{\textsf{tl}} +% All functions that modify a \meta{\docccepttl} first create it if not exist. +% \begin{function}{\erw_tl_append_item:nn} +% \begin{syntax} +% \cs{erw_tl_append_item:nn}\Arg{arg list}\Arg{arg} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_tl_fold:NN, \erw_tl_fold:cN} +% \begin{syntax} +% \cs{erw_tl_fold:NN}\meta{\doccceptcs}\meta{\docccepttlvar} +% \end{syntax} +% \end{function} +% \DocPhantomSection{subsection}{\cs{erw_tl_gset_function:n}}{usage:tl:function} +% \begin{function}{\erw_tl_gset_function:N, \erw_tl_gset_function:n} +% \begin{syntax} +% \cs{erw_tl_gset_function:n}\Arg{\doccceptcode} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_tl_join:nn, \erw_tl_join:nnn, \erw_tl_join:nnnn, \erw_tl_join:nnnnn} +% \begin{syntax} +% \cs{erw_tl_join:nn}\Arg{\docccepttl_{1}}\Arg{\docccepttl_{2}} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_tl_last_item:n} +% \begin{syntax} +% \cs{erw_tl_last_item:n}\Arg{\docccepttl} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_tl_map:n, \erw_tl_map:Nn} +% \begin{syntax} +% \cs{erw_tl_map:n}\Arg{\doccceptitems} +% \end{syntax} +% \begin{description} +% \item[Semantics] Maps over \meta{\doccceptitems} using the internal function set by \nameref{usage:tl:function} +% \end{description} +% \end{function} +% \begin{function}{\erw_tl_map_inline:nn } +% \begin{syntax} +% \cs{erw_tl_map_inline:nn}\Arg{\doccceptcode}\Arg{\doccceptitems} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_tl_map_thread:Nn} +% \begin{syntax} +% \cs{erw_tl_math_thread:Nn}\meta{\doccceptcs}\doceval{\meta{\doccceptitems}} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_tl_map_thread_at:Nnn} +% \begin{syntax} +% \cs{erw_tl_math_thread_at:Nnn}\Arg{\doccceptint{}}\Arg{\docccepttl} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_tl_repeat:nn} +% \begin{syntax} +% \cs{erw_tl_repeat:nn}\Arg{\doccceptint{}}\Arg{\docccepttl} +% \end{syntax} +% \end{function} +% \begin{function}{\erw_tl_split:nnn, \erw_tl_split:nn} +% \begin{syntax} +% \cs{erw_tl_split:nn}\Arg{\doccceptitems}\Arg{delimiter} +% \end{syntax} +% \end{function} +% \DocPhantomSection{subsection}{\cs{erw_tl_separators:n}}{usage:tl:sep} +% \begin{function}{\erw_tl_separators:n} +% \begin{syntax} +% \cs{erw_tl_separators:n}\Arg{\doccceptitems} +% \end{syntax} +% \begin{description} +% \item[Semantics] According to the count of \meta{\doccceptitems}: +% \begin{enumerate}[label=\emph{\arabic*)}] +% \item \Arg{\docccepttl_1}\Arg{\docccepttl_1}\Arg{\docccepttl_1} +% \item \Arg{\docccepttl_1}\Arg{\docccepttl_2}\Arg{\docccepttl_1\docccepttl_2} +% \item \Arg{\docccepttl_1}\Arg{\docccepttl_2}\Arg{\docccepttl_3} +% \end{enumerate} +% \end{description} +% \end{function} +% \clearpage +% +% \part{Listing}\label{part:listing} +% +% \newtcblisting[auto counter] +% {listing}[2][]{ +% noparskip, +% breakable, +% colback=white, +% colframe=black, +% opacitybacktitle=.8,% +% fonttitle=\bfseries, +% title={Listing~\thetcbcounter. #1}, +% arc=0pt, +% outer arc=0pt, +% boxrule=1pt, +% listing and text, +% #2} +% +% \section{\textsf{constants}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:const}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:const, listing and text} + \ExplSyntaxOn + \seq_const_from_clist:Nn \foo_seq{ A, B, C } + \prop_const_from_keyval:Nn \foo_prop{ A = a, B = b, C = c } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \section{\textsf{cs}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:cs:compose}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:cs:compose, listing and text} + \ExplSyntaxOn + \cs_set:Nn \__foo:n { f(#1) } + \cs_set:Nn \__bar:n { g[#1] } + \cs_set:Nn \__baz:n { h\{#1\} } + \tl_set:Nn \l_tmpa_tl{ X } + \erw_cs_compose:NnN \erw_tl_fold:NN{ {\__baz:n}{\__bar:n}{\__foo:n} }\l_tmpa_tl + \tl_use:N \l_tmpa_tl + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:cs:compose:c}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:cs:compose:c, listing and text} + \ExplSyntaxOn + \tl_map_function:nN { {f(#1)} {g[#1]} {h\{#1\}} }\erw_csint_new:n + \tl_set:Nn \l_tmpa_tl{X} + \exp_args:NNx + \erw_cs_compose:NnN \erw_tl_fold:cN + {\erw_csint_names_braced:nnn{ 1 }{ 1 }{ 3 }} + \l_tmpa_tl + \tl_use:N \l_tmpa_tl + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \section{\textsf{csint}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:csint}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:csint, listing and text} + \ExplSyntaxOn + \cs_set:Nn\__foo:n{ f(#1) } + \cs_set:Nn\__baz:n{ h\{#1\} } + \tl_map_function:nN { {\__foo:n} {g[#1]} {\__baz:n} }\erw_csint_new:n + \erw_csint:nn{1}{X},\ + \erw_csint:nn{2}{X},\ + \erw_csint:nn{3}{X}. + \erw_csint_reset: + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi % \section{\textsf{int}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:int:range}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:int:range, listing and text} + \ExplSyntaxOn + \erw_int_range:nn{ 2 }{ 5 }\\ + \erw_int_range:n{ 5 } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \section{\textsf{lambda}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:lambda}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:lambda, listing and text} + \ExplSyntaxOn + \tl_set:Nn \l_tmpa_tl + { + \erw_lambda:nnn \DeclareDocumentCommand{ m }{ Hello,~#1! } + } + \l_tmpa_tl{ world } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \section{\textsf{prop}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:prop:map}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:prop:map, listing and text} + \ExplSyntaxOn + \erw_prop_map_item:NNN \prop_put:Nnx \baz_prop \foo_prop + \prop_if_exist:NTF\baz_prop{T}{F}\\ + \prop_item:Nn \baz_prop{ A } + ,\prop_item:Nn \baz_prop{ B } + ,\prop_item:Nn \baz_prop{ C } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:prop:put:keyval}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:prop:put:keyval, listing and text} + \ExplSyntaxOn + \erw_prop_keyval_parse:NNNn + \foo_prop + \erw_keyval_error:Nn + \prop_put:Nnn{ X = x, Y = y, Z = z} + \prop_item:Nn \foo_prop{ X } + ,\prop_item:Nn \foo_prop{ Y } + ,\prop_item:Nn \foo_prop{ Z } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection}{\ref{listing:prop:clist}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:prop:clist, listing and text} + \ExplSyntaxOn + \erw_prop_to_clist:Nn \foo_prop{ A, B, C } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \section{\textsf{seq}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:seq:fold}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:seq:fold, listing and text} + \ExplSyntaxOn + \cs_set:Nn \__foo:n { f(#1) } + \cs_set:Nn \__bar:n { g[#1] } + \cs_set:Nn \__baz:n { h\{#1\} } + \seq_new:N \l_tmp_seq + \seq_put_right:Nn \l_tmp_seq{X} + \erw_cs_compose:NnN \erw_seq_fold:NN{ {\__baz:n}{\__bar:n}{\__foo:n} }\l_tmp_seq + \seq_item:Nn \l_tmp_seq{ 1 }\\ + \seq_item:Nn \l_tmp_seq{ 2 }\\ + \seq_item:Nn \l_tmp_seq{ 3 }\\ + \seq_item:Nn \l_tmp_seq{ 4 } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:seq:fold:c}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:seq:fold:c, listing and text} + \ExplSyntaxOn + \cs_set:Nn \__foo:n { f(#1) } + \cs_set:Nn \__bar:n { g[#1] } + \cs_set:Nn \__baz:n { h\{#1\} } + \seq_put_right:Nn \l_tmpa_seq{X} + \erw_cs_compose:NnN \erw_seq_fold:cN{ {__baz:n}{__bar:n}{__foo:n} }\l_tmpa_seq + \seq_item:Nn \l_tmpa_seq{ 1 }\\ + \seq_item:Nn \l_tmpa_seq{ 2 }\\ + \seq_item:Nn \l_tmpa_seq{ 3 }\\ + \seq_item:Nn \l_tmpa_seq{ 4 } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:seq:prop}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:seq:prop, listing and text} + \ExplSyntaxOn + \erw_seq_put_right_prop:NNn \bar_seq\foo_prop{ A, B, C } + \seq_use:Nn\bar_seq{,} + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:seq:use}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:seq:use, listing and text} + \ExplSyntaxOn + \seq_put_right:Nn\l_tmpa_seq{ A } + \seq_put_right:Nn\l_tmpa_seq{ B } + \erw_seq_use:Nn \l_tmpa_seq{ {~and~} }\\ + \erw_seq_use:Nn \l_tmpa_seq{ {,\ }{~and~} }\\ + \erw_seq_use:Nn \l_tmpa_seq{ {~and~}{,\ }{,~and~} }\\[1em] + \seq_put_right:Nn\l_tmpa_seq{ C } + \erw_seq_use:Nn \l_tmpa_seq{ {~and~} }\\ + \erw_seq_use:Nn \l_tmpa_seq{ {,\ }{and~} }\\ + \erw_seq_use:Nn \l_tmpa_seq{ {~and~}{,\ }{,~and~} }\\ + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \section{\textsf{sys}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:sys:alone}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:sys:alone, listing and text} + \ExplSyntaxOn + \noindent\erw_sys_timestamp:nn{date}{10}{-} + \noindent\erw_sys_timestamp:nn{time}{10}\\ + \noindent\erw_sys_timestamp:nn{datetime}{10}\\ + \erw_sys_timestamp:nn{date}{16}{\%} + \erw_sys_timestamp:nn{time}{16}\\ + \erw_option:n{ sys / timestamp_delim = {\%} } + \erw_sys_timestamp:nn{datetime}{16}\\ + \erw_sys_jobnametimestamp: + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:sys:iow}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:sys:iow, listing and text} + \ExplSyntaxOn + \erw_option:n{ sys / timestamp_delim = \c_empty_tl } + \iow_new:N \foo_iow + \tl_set:Nx \foo_dec { \erw_sys_timestamp:nn{datetime}{10} } + \tl_set:Nx \foo_hex { \erw_sys_timestamp: } + \iow_open:Nn \foo_iow{ \foo_hex } + \iow_now:Nn\foo_iow{ Hello,\ world! } + \iow_close:N \foo_iow + D:\foo_dec\\ + \file_timestamp:n{ \foo_hex }\\ + \file_input:n{ \foo_hex } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \section{\textsf{tl}} +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:tl:fold}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:tl:fold, listing and text} + \ExplSyntaxOn + \cs_set:Nn \__foo:n { f(#1) } + \tl_set:Nn \l_tmpa_tl{ X } + \erw_tl_fold:NN\__foo:n\l_tmpa_tl + \l_tmpa_tl\\ + \cs_set:Nn \__bar:n { g[#1] } + \erw_tl_fold:cN {__bar:n}\l_tmpa_tl + \l_tmpa_tl + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:tl:repeat}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:tl:repeat, listing and text} + \ExplSyntaxOn + \erw_tl_repeat:nn{ 3 }{ x } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:tl:split}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:tl:split, listing and text} + \ExplSyntaxOn + \erw_tl_split:nn{ {a} {b} {c} }{ == } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:tl:map}.} +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:tl:map, listing and text} + \ExplSyntaxOn + \cs_set:Nn \__foo:n { (#1) } + \erw_tl_map:Nn \__foo:n{ {a}{b}{c} } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:tl:map:thread}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:tl:map:thread, listing and text} + \ExplSyntaxOn + \cs_set:Nn \__foo:n { (#1) } + \erw_tl_map_thread:Nn \__foo:n + { + { {a}{b}{c}{d}{e}{f} } + }\\ + \cs_set:Nn\__foo:nn { (#1+#2) } + \erw_tl_map_thread:Nn \__foo:nn + { + { {a}{b}{c}{d}{e}{f} } + { {A}{B}{C}{D}{E}{F} } + }\\ + \cs_set:Nn \__foo:nnn { (#1+#2+#3) } + \erw_tl_map_thread:Nn \__foo:nnn + { + { {a}{b}{c}{d}{e}{f} } + { {A}{B}{C}{D}{E}{F} } + { {k}{l}{m}{n}{o}{p} } + }\\ + \cs_set:Nn \__foo:nnnn { (#1+#2+#3+#4) } + \erw_tl_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} } + } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% \phantomsection\addcontentsline{toc}{subsection} +% {\ref{listing:tl:map:thread:at}. } +% \iffalse +%<*guardlisting> +% \fi +\begin{listing}[] + {label=listing:tl:map:thread:at, listing and text} + \ExplSyntaxOn + \cs_set:Nn\__foo:nn { (#1+#2) } + \erw_tl_map_thread_at:Nnn \__foo:nn{ 2 } + { + { {a}{b}{c}{d}{e}{f} } + { {A}{B}{C}{D}{E}{F} } + } + \ExplSyntaxOff +\end{listing} +% \iffalse +%</guardlisting> +% \fi +% +% \clearpage +% \part{Other}\label{part:other} +% +% \section{Acknowledgment}\label{other:acknowl} +% +% This work has benefited from Q\&A's from the \LaTeX community\cite{user-erw}. \nameref{usage:lambda} originally appeared in \cite{a-188053}. +% +% \section{Install}\label{other:install} +% \begin{enumerate}[label=\emph{\arabic*)}] +% \item Compile \file{\jobname.dtx} (under Unix, \texttt{\$tex timestamp.dtx}) +% \item Put the generated \file{\jobname.sty} in the search path of the \LaTeX engine +% \end{enumerate} +% +% \section{Support}\label{other:support} +% +% This package is available from \url{https://www.ctan.org/pkg/\jobname} and \url{https://github.com/rogard/\jobname}. +% +% \subsection{Platform} +% \begin{enumerate}[label=\emph{\roman*)}] +% \item +% ^^A uname -a +% \begin{Verbatim}[breaklines=true] +% Linux laptop 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux +% \end{Verbatim} +% \label{plat:lin} +% \end{enumerate} +% +% \subsection{Engine} +% \begin{enumerate}[label=\emph{\alph*)}] +% \item +% \begin{Verbatim}[breaklines=true] +% pdfTeX 3.14159265-2.6-1.40.20 (TeX Live 2019) +% \end{Verbatim} +% \label{eng:tlxviiii:pdf} +% \item +% \begin{Verbatim}[breaklines=true] +% pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020) +% \end{Verbatim} +% \label{eng:tlxx:pdf} +% \item +% \begin{Verbatim}[breaklines=true] +% LuaHBTeX, Version 1.12.0 (TeX Live 2020) +% \end{Verbatim} +% \label{eng:tlxx:lua} +% \item +% \begin{Verbatim}[breaklines=true] +% XeTeX 3.14159265-2.6-0.999992 (TeX Live 2020) +% \end{Verbatim} +% \label{eng:tlxx:xe} +% \end{enumerate} +% +% \subsection{Results} +% +% \begin{enumerate}[label=\emph{\arabic*)}] +% \item \pkg{\jobname} \docvers{2}{0} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe} +% \end{enumerate} +% +% \DocPhantomSection*{section}{References}{other:bib} +% \begin{thebibliography}{1} +% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}, 2019, +% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf} +% \bibitem{l3build} The \LaTeX3 Project Team {\em The \pkg{l3build} package}, 2020, +% \url{http://mirror.utexas.edu/ctan/macros/latex/contrib/l3build/l3build.pdf} +% \bibitem{a-188053} \href{https://tex.stackexchange.com/users/17423/sean-allred}{@{}sean-allred}'s answer to +% ``How to create lambda expressions?'', \url{https://tex.stackexchange.com/a/188053/112708} +% \bibitem{user-erw} \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions} +% \end{thebibliography} % -% \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}} +% \section{To do} % -% \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} +% \begin{enumerate}[label=\emph{\alph*)}] +% \item Regression testing using \cite[Section 3.2—Specifying expectations]{l3build}. \label{todo:regtest} +% \end{enumerate} +% Also see: +% \begin{enumerate}[label=\emph{\alph*)}] +% \setcounter{enumi}{1} +% \item \env{NOTE} or \cs{NB} tagged \texttt{abandon\docpipe{}done\docpipe{}todo} inside \jobname|.dtx| +% \end{enumerate} % -% \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}} +% \changes{\docvers{1}{1}}{2018/05/23}{Brought all the modules under one file; renamed \pkg{l3erw} to \pkg{erw-l3};} +% \changes{\docvers{1}{1}}{2018/05/23}{\cs{numbrdcsnew} changed to \cs{newnumbrdcs} and made 'disambiguable'} +% \changes{\docvers{1}{1}}{2018/05/23}{\pkg{disambig}/backend: changes to the key, added \cs{ProcessPackageKeysOption};} +% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{erw_items_to}} +% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{erw_last_item}} +% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{erw_repeat}} +% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{erw_split}} +% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{map_thread}} +% \changes{\docvers{1}{2}}{2018/06/21}{Front end cmds no longer generated with module \pkg{disambig}; Option of the same name deleted;} +% \changes{\docvers{1}{2}}{2018/06/21}{Rearrange: the doc to clearly separate frontend from backend} +% \changes{\docvers{1}{2}}{2018/06/21}{Modify: \cs{erw_compose}, order in which functions composed ($g\circ f$ means $f$ comes before $g$)} +% \changes{\docvers{1}{2}}{2018/06/21}{\pkg{disambig}: pushed the code inside \cs{keys_define};} +% \changes{\docvers{1}{2}}{2018/06/21}{\pkg{disambig}: \cs{disambignewcmd} no longer takes a token name as arg, rather a token.} +% \changes{\docvers{1}{3}}{2018/06/22}{Replace: versioning, should have been 0.1.2} +% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_accum}} +% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_int_range}} +% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_is_matrix} (to check arg of \cs{erw_tl_map_thread:Nn})} +% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_merge}} +% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_set_map_inline}} +% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_set_map}} +% \changes{\docvers{1}{4}}{2018/06/22}{Remove: \doccs{erw_items_to} (redundant with \cs{tl_range:nnn})} +% \changes{\docvers{1}{5}}{2019/12/12}{Modify: source repository} +% \changes{\docvers{1}{5}}{2019/12/12}{Rearrange: frontend/backend sections} +% \changes{\docvers{1}{5}}{2019/12/12}{Remove: \pkg{disambig}} +% \changes{\docvers{1}{5}}{2019/12/12}{Split Section Preliminaries into Conventions and Requirement.} +% \changes{\docvers{1}{6}}{2020/02/05}{Fix: critical bug preventing \pkg{erw-l3} from working without explicit inclusion of \pkg{expl3}} +% \changes{\docvers{1}{7}}{2020/04/24}{Add: \nameref{impl:option}} +% \changes{\docvers{1}{7}}{2020/04/24}{Add: \nameref{impl:sys}} +% \changes{\docvers{1}{7}}{2020/04/24}{Move: \cs{erw_fold_apply_par:n}} +% \changes{\docvers{1}{7}}{2020/04/24}{Move: \cs{erw_fold_set_par:n}} +% \changes{\docvers{1}{7}}{2020/04/24}{(deleted)} +% \changes{\docvers{1}{7}}{2020/04/24}{Remove: \doccs{numbrdcsnew}, \doccs{numbrdcs}} +% \changes{\docvers{1}{7}}{2020/04/24}{Rename: variables with suffix |tl| get 'private mode' prexif in pl. of |\__erw| } +% \changes{\docvers{1}{7}}{2020/04/24}{Rename: |csnum| to |csint| } +% \changes{\docvers{1}{7}}{2020/04/24}{Rename: |numbrd_cs| to |csnum| } +% \changes{\docvers{1}{7}}{2020/04/24}{Replace: listing's implem with that of \pkg{tocloft}} +% \changes{\docvers{1}{7}}{2020/04/24}{Replace: vers. numb. from 3 to 2 digits} +% \changes{\docvers{1}{8}}{2020/04/24}{Add: \env{function} for all frontend functions.} +% \changes{\docvers{1}{8}}{2020/04/30}{Remove: \doccs{erw_cs_set_eq:NN} and variants} +% \changes{\docvers{1}{8}}{2020/04/30}{Remove: \doccs{erw_is_matrix:n} (predicate must be expandable)} +% \changes{\docvers{1}{8}}{2020/04/30}{Rename: all cs prefixes to agree with heading under which they come, e.g. \cs{erw_identity:n} by \cs{erw_cs_identity:n} } +% \changes{\docvers{1}{8}}{2020/04/30}{(deleted)} +% \changes{\docvers{1}{8}}{2020/04/30}{Replace: \cs{erw_seq_fold:NN} by \cs{erw_oper_fold_seq:NN} and likewise for variants} +% \changes{\docvers{1}{8}}{2020/04/30}{(deleted)} +% \changes{\docvers{1}{9}}{2020/05/01}{Add: \cs{erw_sys_timestamp_delimiter:}} +% \changes{\docvers{1}{9}}{2020/05/01}{Add: \cs{erw_tl_join:nn} and variants} +% \changes{\docvers{1}{9}}{2020/05/01}{Rename: \cs{erw_append_arg:nn} to \cs{erw_tl_append_item:nn}} +% \changes{\docvers{1}{9}}{2020/05/01}{Rename: \cs{erw_oper_gset_function:N} to \cs{erw_tl_gset_function:N} (and variants)} +% \changes{\docvers{1}{9}}{2020/05/01}{Rename: prefix |timestamp| by |sys|} +% \changes{\docvers{2}{0}}{2020/05/01}{Add: \cs{erw_jobnametimestamp:nn} and variants} +% \changes{\docvers{2}{0}}{2020/05/01}{Remove: \doccs{merge:nn} (redundant with \cs{erw_join:nn})} +% \changes{\docvers{2}{0}}{2020/05/01}{Rename: \docvers{0}{0} to \docvers{1}{0}, etc.} +% \changes{\docvers{2}{1}}{2020/05/09}{Add: \cs{erw_prop_to_clist:Nn}, \cs{erw_prop_put:NN}, and \cs{erw_prop_put:Nnn}} +% \changes{\docvers{2}{1}}{2020/05/09}{Add: \cs{erw_seq_from_clist:Nn}, \cs{erw_seq_from_prop:NNn}, and \cs{erw_seq_put_right:Nn}} +% \changes{\docvers{2}{1}}{2020/05/09}{(delete)} +% \changes{\docvers{2}{1}}{2020/05/09}{Replace: \cs{erw_seq_fold:NN} by \cs{__erw_seq_fold:NN}} +% \changes{\docvers{2}{2}}{2020/05/18}{Add: \cs{erw_seq_use:Nn}} +% \changes{\docvers{2}{2}}{2020/05/18}{Add: \cs{erw_tl_separators:n}} +% \changes{\docvers{2}{3}}{2020/05/20}{Add: \cs{msg_new:nnn}\doceval{erw}\doceval{csnset}} +% \changes{\docvers{2}{3}}{2020/05/20}{Add: \cs{msg_new:nnn}\doceval{erw}\doceval{keyval/\dots}} +% \changes{\docvers{2}{3}}{2020/05/20}{Fix: 'mark as private code' (hiherto unnoticed)} +% \changes{\docvers{2}{3}}{2020/05/20}{Modify: behavior of \cs{erw_seq_use:Nn}} +% \changes{\docvers{2}{3}}{2020/05/20}{Move: all \cs{msg_new:Nnnn} statements under same heading} +% \changes{\docvers{2}{4}}{2020/05/21}{Add: \cs{erw_lambda:nnn}} +% \changes{\docvers{2}{5}}{2020/05/22}{Add: \cs{erw_prop_put_keyval:Nn}} +% \changes{\docvers{2}{6}}{2020/05/22}{Add: \cs{erw_keyval_parse:NNNn}} +% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{erw_cs_error:nn}} +% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{erw_cs_error:n}} +% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{erw_prop_keyval_parse:NNNn}} +% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{erw_prop_map_item:NNN} } +% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{msg_new:nnn}\doceval{erw}\doceval{varnset}} +% \changes{\docvers{2}{6}}{2020/05/23}{Remove: \doccs{erw_cs_apply}} +% \changes{\docvers{2}{6}}{2020/05/23}{Remove: \doccs{erw_prop_put:NN} } +% \changes{\docvers{2}{6}}{2020/05/23}{Remove: \doccs{erw_prop_put_keyval:Nn} } +% \changes{\docvers{2}{6}}{2020/05/23}{Remove: \cs{msg_new:nnn}, module \texttt{erw}, messages: \texttt{keyval/\dots}} +% \changes{\docvers{2}{6}}{2020/05/23}{Rename: \textsf{basics} to \nameref{usage:cs}} +% \changes{\docvers{2}{6}}{2020/05/23}{Replace: \cs{erw_seq_from_clist} by \cs{erw_seq_put_right_clist}} +% \changes{\docvers{2}{6}}{2020/05/23}{Replace: \cs{erw_seq_from_prop} by \cs{erw_seq_put_right_prop}} +% \changes{\docvers{2}{7}}{2020/05/23}{Remove: \doccs{erw_cs_error:n} } +% \changes{\docvers{2}{7}}{2020/05/23}{Remove: \doccs{erw_cs_error:nn} } +% \changes{\docvers{2}{7}}{2020/05/23}{Add: \cs{erw_keyval_error:Nn} } +% \changes{\docvers{2}{7}}{2020/05/23}{Add: \cs{erw_keyval_error:Nnn} } +% \changes{\docvers{2}{8}}{2020/05/24}{Add: \cs{msg_new:nnn}\doceval{erw}\doceval{notset}} +% \changes{\docvers{2}{8}}{2020/05/24}{Remove: \cs{msg_new:nnn}\doceval{erw}\doceval{csnset}} +% \changes{\docvers{2}{8}}{2020/05/24}{Remove: \cs{msg_new:nnn}\doceval{erw}\doceval{varnset}} +% \changes{\docvers{2}{9}}{2020/05/27}{Add: \cs{erw_seq_fold:NN}, \cs{erw_seq_fold:cN}} +% \changes{\docvers{2}{9}}{2020/05/27}{Add: \cs{erw_cs_compose:NnN}} +% \changes{\docvers{2}{9}}{2020/05/27}{Remove: \doccs{erw_seq_compose:nN},\doccs{erw_seq_compose_c:nN},\doccs{erw_seq_compose_vers:nN}} +% \changes{\docvers{2}{9}}{2020/05/27}{Remove: +% \doccs{erw_tl_compose:nN}, +% \doccs{erw_tl_compose:Nnn}, +% \doccs{erw_tl_compose:nn}, +% \doccs{erw_tl_compose_c:nN}, +% \doccs{erw_tl_compose_c:nn}, +% \doccs{erw_tl_compose_vers:nN}, +% \doccs{erw_tl_compose_vers:nn} % } -% \\\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}} +% \changes{\docvers{2}{9}}{2020/05/27}{Rename: \texttt{oper / fold_set_par} to \texttt{tl / fold_set_par} } +% \changes{\docvers{2}{9}}{2020/05/27}{Rename: \texttt{oper / fold_apply_par} to \texttt{tl / fold_apply_par} } +% \changes{\docvers{3}{0}}{2020/06/03}{Fix: warning \pkg{csquotes}+\pkg{fvextra} } +% \changes{\docvers{3}{1}}{2020/06/04}{Miscellaneous} +% \PrintChanges +% \PrintIndex +% \clearpage +% \StopEventually{ +% ^^A \PrintChanges +% ^^A \PrintIndex % } -% \\\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 +% \end{documentation} +% \begin{implementation} +% \part{Implementation}\label{part:impl} +% +% \section{Opening} % \begin{macrocode} -\NeedsTeXFormat{LaTeX2e} -\ExplSyntaxOn -\msg_new:nnn{erw}{generic}{#1} +%<*package> +%<@@=erw> +% \ExplSyntaxOn +% \end{macrocode} +% \section{\textsf{cs}} +% \label{impl:cs} +% \subsection{backend} +% \begin{macrocode} +\cs_new:Nn \@@_cs_name:N +{ + \exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1} +} % \end{macrocode} -% \section{\textsf{compose}} -% \subsection{backend} +% \subsection{frontend}\label{basics:frontend} +% \begin{macro}{\erw_cs_compose:NnN} % \begin{macrocode} -\cs_set:Npn \erw_compose:NnV - #1 % method - #2 % funs - #3 % var +\cs_new:Nn \erw_cs_compose:NnN { - \erw_fold_set_par:n{Nf} - \erw_fold_apply_par:n{Nf} - \erw_cs_set_inline:Nn \__erw_map:n + \erw_cs_set_inline:Nn \g@@_tl_function:n { - #1{##1}#3 + #1{##1}#3 } - \exp_args:Nf\erw_map:n + \exp_args:Nf\erw_tl_map:n { - \tl_reverse:n{#2} + \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 +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_cs_identity:n} +% \begin{macrocode} +\cs_set:Npn \erw_cs_identity:n #1{#1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_cs_set_inline:Nn, \erw_cs_gset_inline:Nn} +% \begin{macrocode} +\cs_new_protected:Nn \erw_cs_set_inline:Nn { - \erw_compose:NnV \erw_fold:cV {#1} #2 + \cs_set:Npn #1 ##1{#2} } -\tl_new:N \__erw_compose_tl -\cs_set:Npn \erw_compose:nn #1 #2 +\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_cs_gset_inline:Nn} +% \begin{macrocode} +\cs_new:Nn \erw_cs_gset_inline:Nn { - \tl_set:Nn \__erw_compose_tl {#2} - \erw_compose:nV{#1}\__erw_compose_tl - \__erw_compose_tl + \cs_gset:Npn #1 ##1{#2} } -\cs_set:Npn \erw_compose_c:nn #1 #2 +\cs_generate_variant:Nn \erw_cs_gset_inline:Nn {cn} +% \end{macrocode} +% \end{macro} +% \section{\textsf{csint}} +% \label{impl:csint} +% \subsection{backend} +% \begin{macrocode} +\int_new:N \g@@_csint_int +\cs_new:Nn \@@_csint_name: {\erw_csint_name:n{\g@@_csint_int}} +% \end{macrocode} +% \subsection{frontend} +% \begin{macro}{\erw_csint:nn} +% \begin{macrocode} +\cs_new:Nn \erw_csint:nn { - \tl_set:Nn \__erw_compose_tl {#2} - \erw_compose_c:nV{#1}\__erw_compose_tl - \__erw_compose_tl + \exp_args:No \use:c{\erw_csint_name:n{#1}}{#2} } -\cs_set:Npn \erw_compose_seq:nV #1 #2 -{ - \erw_compose:NnV \erw_fold_seq:NV {#1} #2 +% \end{macrocode} +% \end{macro} +%^^A% \begin{macro}{\erw_csint_list:nnn}%^^A TODO +%^^A% \begin{macrocode} +%^^A\cs_new:Nn \erw_csint_list:nnn +%^^A{ +%^^A \int_step_inline:nnnn { #1 }{ #2 }{ #3 } +%^^A { +%^^A { \exp_args:No \use:c{\erw_csint_name:n{##1}} } +%^^A } +%^^A} +%^^A% \end{macrocode} +%^^A% \end{macro} +% \begin{macro}{\erw_csint_name:n} +% \begin{macrocode} +\cs_new:Nn \erw_csint_name:n {@@_csint_\int_to_alph:n{#1}:n} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_csint_new:n} +% \begin{macrocode} +\cs_new_protected:Nn \erw_csint_new:n +{ + \int_incr:N \g@@_csint_int + \exp_args:No + \erw_cs_set_inline:cn{\@@_csint_name:} + { + \token_if_cs:NTF + {#1} + {#1{##1}} + {#1} + } } -\cs_set:Npn \erw_compose_seq_c:nV - #1 % funs - #2 % seq +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_csint_names_braced:nnn,\erw_csint_names_braced:n,\erw_csint_names_braced:} +% \begin{macrocode} +\cs_new:Nn \erw_csint_names_braced:nnn { - \erw_compose:NnV \erw_fold_seq:cV {#1} #2 + \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_csint_names_braced:n + % TODO \tl_range_braced:nnn? } -\cs_set:Npn \erw_compose_vers:nV #1 #2 +\cs_new:Nn \erw_csint_names_braced:n {{\erw_csint_name:n{#1}}} +\cs_new:Nn \erw_csint_names_braced: { - \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented} + \erw_csint_names_braced:nnn{1}{1}{\g@@_csint_int} } -\cs_set:Npn \erw_compose_seq_vers:nV #1 #2 +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_csint_reset:} +% \begin{macrocode} +\cs_new_protected:Nn \erw_csint_reset: { - \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented} + \int_zero:N \g@@_csint_int + \tl_set:Nn \@@_csint_ext_tl{}%^^A TODO remove? } -\cs_set:Npn \erw_compose_vers:nn #1 #2 +% \end{macrocode} +% \end{macro} +% \section{\textsf{int}} +% \label{impl:int} +% \subsection{backend} +% \begin{macrocode} +\cs_set:Npn \@@_int_range:nnn #1 #2 #3 { - \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} + \int_compare:nNnTF + { + \int_eval:n{#2+1} + }>{#3} + { + {#1} + } + { + \@@_int_range:nnn + { + \exp_args:Nx\erw_tl_append_item:nn{#1} + { + \int_eval:n{#2+1} + } + } + {\int_eval:n{#2+1}} + {#3} + } } % \end{macrocode} -% \section{\textsf{csutil}} -% \subsection{\textsf{backend}} +% \subsection{frontend} +% \begin{macro}{\erw_int_range:nn, \erw_int_range:n } % \begin{macrocode} -\cs_set:Npn \erw_accum:nn #1 #2 +\cs_new:Nn \erw_int_range:nn { - {#1{#2}} + \@@_int_range:nnn {{#1}}{#1}{#2} } -\cs_set:Npn \__erw_cs_name:N #1 +\cs_new:Nn \erw_int_range:n { - \exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1} + \@@_int_range:nnn {}{0}{#1} +% ^^A Alt to: +% ^^A \int_step_inline:nn {#1}{##1} } -\cs_set:Npn \erw_apply:Nn - #1 % fun - #2 % tl +% \end{macrocode} +% \end{macro} +% \section{\textsf{keys}} +% \subsection{frontend} +% \begin{macro}{\erw_keyval_error:Nn,\erw_keyval_error:Nnn} +% \begin{macrocode} +\cs_new:Nn \erw_keyval_error:Nn{\msg_error:nnnnn{@@}{keyval/n}{\erw_keyval_error:Nn}{#1}{#2}} +\cs_new:Nn \erw_keyval_error:Nnn{\msg_error:nnnnnn{@@}{keyval/nn}{\erw_keyval_error:Nnn}{#1}{#2}{#3}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_keyval_parse:NNNn} +% \begin{macrocode} +\cs_new_protected:Nn\erw_keyval_parse:NNNn { - #1{#2} + \cs_set_protected:Nn \@@_keyval_function:n {#2 #1{##1}} + \cs_set_protected:Nn \@@_keyval_function:nn {#3 #1{##1}{##2}} + \keyval_parse:NNn + \@@_keyval_function:n + \@@_keyval_function:nn + {#4} } -\cs_generate_variant:Nn \erw_apply:Nn {No, Nf, Nx, c} -\cs_set:Npn \erw_cs_set_eq:NN #1 #2 +% \end{macrocode} +% \end{macro} +% \section{\texttt{lambda}} +% \begin{macro}{\erw_lambda:nnn} +% \begin{macrocode} +\cs_new_protected:Npn \erw_lambda:nnn #1 #2 #3 { - \cs_set:Npn #1 ##1{#2{##1}} + \exp_args:NNx + #1 \@@_lambda_expression + {#2} + {#3} + \@@_lambda_expression } -\cs_generate_variant:Nn \erw_cs_set_eq:NN {cN} -\cs_set:Npn \erw_cs_gset_eq:NN #1 #2 +% \end{macrocode} +% \end{macro} +% \section{\textsf{msg}} +% \label{impl:msg} +% \subsection{backend} +% \begin{macrocode} +\msg_new:nnn{@@}{generic}{#1} +\msg_new:nnn{@@}{keyval/nn}{#1#2{#3}{#4};~encountered~key=val~where~only~key~required} +\msg_new:nnn{@@}{keyval/n}{#1#2{#3};~encountered~key~~where~only~key=val~required} +\msg_new:nnn{@@}{separ}{#1~expects~1~to~3~items,~#2} +\msg_new:nnn{@@}{timestamp / base}{Calling~#1,~arg~must~be~'dec|hex'} +\msg_new:nnn{@@}{timestamp / period}{Calling~#1,~arg~must~be~'date|time|datetime'} +% \end{macrocode} +% \subsection{frontend} +% \begin{macrocode} +\msg_new:nnn{erw}{notset}{#1~not~set} +% \end{macrocode} +% \section{\textsf{prop}} +% \subsection{backend} +% \begin{macrocode} +\cs_new_protected:Nn \@@_prop_map_item:NNN { - \cs_gset:Npn #1 ##1{#2{##1}} + \cs_set_protected:Nn \@@_function:nn + { + #1 #2 {##1}{##2} + } + \prop_map_function:NN #3 \@@_function:nn } -\cs_generate_variant:Nn \erw_cs_gset_eq:NN {cN} -\cs_set:Npn \erw_cs_set_inline:Nn #1 #2 +% \end{macrocode} +% \subsection{frontend} +% \begin{macro}{\erw_prop_to_clist:Nn} +% \begin{macrocode} +\cs_new_protected:Nn \erw_prop_to_clist:Nn { - \cs_set:Npn #1 ##1{#2} + \cs_set:Nn \@@_keyval_function:n {,\prop_item:Nn#1{##1}} + \exp_args:Nf + \tl_tail:n + { + \keyval_parse:NNn + \@@_keyval_function:n + \erw_keyval_error:Nnn + {#2} + } } -\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn} -\cs_set:Npn \erw_cs_gset_inline:Nn #1 #2 +\cs_generate_variant:Nn \erw_prop_to_clist:Nn { c } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_prop_map_item:NNN} +% \begin{macrocode} +\cs_new_protected:Nn \erw_prop_map_item:NNN { - \cs_gset:Npn #1 ##1{#2} + \prop_if_exist:NTF #2 + {\@@_prop_map_item:NNN #1#2#3} + { + \prop_new:N #2 + \erw_prop_map_item:NNN #1#2#3 + } } -\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 +% \end{macrocode} +% \end{macro} +% \begin{macro}{\erw_prop_keyval_parse:NNNn} +% \begin{macrocode} +\cs_new_protected:Nn\erw_prop_keyval_parse:NNNn { - \tl_set:Nn \__erw_fold_set_par_tl{#1} + \prop_if_exist:NTF#1 + {\erw_keyval_parse:NNNn #1#2#3{#4}} + { + \prop_new:N #1 + \erw_prop_keyval_parse:NNNn#1#2#3{#4} + } +} +% \end{macrocode} +% \end{macro} +% \section{\textsf{oper}} +% \label{impl:oper} +% \subsection{backend} +% \subsection{frontend} +% \begin{macrocode} +\keys_define:nn{@@} +{ + tl/fold_set_par.tl_gset:N = \g@@_tl_fold_set_par_tl, + tl/fold_set_par.value_required:n = true, + tl/fold_set_par.default:n = {Nf}, + tl/fold_set_par.initial:n = {Nf}, + tl/fold_apply_par.tl_gset:N = \g@@_tl_fold_apply_par_tl, + tl/fold_apply_par.value_required:n = true, + tl/fold_apply_par.default:n = {Nf}, + tl/fold_apply_par.initial:n = {Nf} } -\cs_set:Npn \erw_fold_apply_par:n #1 +% \end{macrocode} +% \section{option} +% \label{impl:option} +% \begin{macrocode} +\cs_new_protected:Nn\erw_option:n { - \tl_set:Nn \__erw_fold_apply_par_tl{#1} + \keys_set:nn{@@}{#1} } -\cs_set:Npn \erw_fold:NV - #1 % fun - #2 % var +% \end{macrocode} +% \section{\textsf{seq}} +% \label{impl:seq} +% \subsection{backend} +% \begin{macrocode} +\tl_new:N \g@@_seq_fold_item_tl +\cs_new_protected:Nn\@@_seq_put_right_clist:Nn { - \use:c{tl_set:\__erw_fold_set_par_tl} - #2 - {\use:c{erw_apply:\__erw_fold_apply_par_tl}{#1}{#2}} + \cs_set_protected:Nn \@@_function:n + { + \seq_put_right:Nn #1{##1} + } + \keyval_parse:NNn + \@@_function:n + \erw_keyval_keyonly:nn + {#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 +\cs_generate_variant:Nn \@@_seq_put_right_clist:Nn { c } +\cs_new_protected:Nn\@@_seq_put_right_prop:NNn { - \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} + \@@_seq_put_right_clist:Nn #1 + {\erw_prop_to_clist:Nn #2 {#3}} } -\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 } +\cs_generate_variant:Nn \@@_seq_put_right_prop:NNn { cc } +% \end{macrocode} +% \subsection{frontend} +% ^^A TODO see if can replace compose with just oper +% \begin{macrocode} +\cs_new_protected:Nn\erw_seq_put_right_clist:Nn { - \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:} + \seq_if_exist:NTF#1 + {\@@_seq_put_right_clist:Nn#1{#2}} + {\seq_new:N#1\erw_seq_put_right_clist:Nn#1{#2}} } -% 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 +\cs_generate_variant:Nn \erw_seq_put_right_clist:Nn { c } +\cs_new_protected:Nn\erw_seq_put_right_prop:NNn { - \exp_args:Nof \tl_item:nn - {#1} - { - \tl_count:n{#1} - } + \seq_if_exist:NTF#1 + {\@@_seq_put_right_prop:NNn#1#2{#3}} + {\seq_new:N#1\erw_seq_put_right_prop:NNn#1#2{#3}} } -\cs_set:Npn \erw_merge:nn #1 #2 +\cs_generate_variant:Nn \erw_seq_put_right_prop:NNn { cc } +\cs_new_protected:Nn \erw_seq_fold:NN { - {#1#2} + \seq_get_right:NN #2 \g@@_seq_fold_item_tl + \erw_tl_fold:NN #1 \g@@_seq_fold_item_tl + \seq_put_right:No #2 {\g@@_seq_fold_item_tl} } -\cs_set:Npn \erw_repeat:nn #1 #2 +\cs_generate_variant:Nn \erw_seq_fold:NN {cN} +\cs_new:Nn \erw_seq_use:Nn { - \int_step_inline:nnnn{1}{1}{#1}{#2} + \exp_last_unbraced:NNf + \seq_use:Nnnn #1 + \erw_tl_separators:n{#2} } -\cs_set:Npn \erw_split:nnn #1 #2 #3 +% \end{macrocode} +% \section{\textsf{sys}} +% \label{impl:sys} +% \subsection{backend} +% \begin{macrocode} +% \end{macrocode} +% \begin{macro}{\@@_sys_date:N, \@@_sys_date_dec:, \@@_sys_date_hex:} +% \begin{macrocode} +\cs_new:Nn \@@_sys_date_dec: { - \tl_head:n{#1} - \use:c{exp_args:#3} \tl_map_inline:nn - { - \tl_tail:n - { - #1 - } - }{#2##1} + \int_eval:n + { + \c_sys_year_int * 10000 + +\c_sys_month_int * 100 + +\c_sys_day_int * 1 + } } -\cs_set:Npn \erw_split:nn #1 #2 +\cs_new:Nn \@@_sys_date:N{\int_to_hex:n{\@@_sys_date_dec:}} +\cs_new:Nn \@@_sys_date_hex:{\int_to_hex:n{\@@_sys_date_dec:}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@_sys_time_dec:, \@@_sys_time_hex} +% \begin{macrocode} +\cs_new:Nn \@@_sys_time_dec: { - \erw_split:nnn{#1}{#2}{Nf} + \int_eval:n + { + \c_sys_hour_int * 100 + +\c_sys_minute_int * 1 + } } +\cs_new:Nn\@@_sys_time_hex:{\int_to_hex:n{\@@_sys_time_dec:}} % \end{macrocode} -% \section{\textsf{map}} -% \subsection{\textsf{backend}} +% \end{macro} +% \begin{macro}{\@@_sys_datetime_base:n, \@@_sys_datetime_dec:n, \@@_sys_datetime_join:nn, \@@_sys_datetime_hex:n, \@@_sys_datetime_period:n } % \begin{macrocode} -\cs_set:Npn \__erw_int_range:nnn #1 #2 #3 +\cs_new:Nn\@@_sys_datetime_base:n { - \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} - } + \int_case:nnTF{#1} + { + {10}{dec} + {16}{hex} + } + {\c_empty_tl} + {\msg_error:nnn{@@}{timestamp / base}{\@@_sys_datetime_base:n{#1}}} } -\cs_set:Npn \erw_int_range:nn #1 #2 +\cs_new:Nn\@@_sys_datetime_join:nn{\erw_tl_join:nnn{#1}{\g@@_sys_timestamp_delim_str}{#2}} +\cs_new:Nn\@@_sys_datetime_period:n { - \__erw_int_range:nnn {{#1}}{#1}{#2} + \str_case:nnTF{#1} + { + {date}{date} + {time}{time} + {datetime}{datetime} + } + {\c_empty_tl} + {\msg_error:nnn{@@}{ timestamp / period }{\@@_sys_datetime_period:n{#1}}} } -\cs_set:Npn \erw_int_range:n #1 +\cs_new:Nn\@@_sys_datetime_dec: {\@@_sys_datetime_join:nn{\@@_sys_date_dec:}{\@@_sys_time_dec:}} +\cs_new:Nn\@@_sys_datetime_hex: {\@@_sys_datetime_join:nn{\@@_sys_date_hex:}{\@@_sys_time_hex:}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@_sys_jobnametimestamp_prefix:} +% \begin{macrocode} +\cs_new:Nn\@@_sys_jobnametimestamp_prefix: { - \__erw_int_range:nnn {}{0}{#1} -% Alt to: -% \int_step_inline:nn {#1}{##1} + \erw_tl_join:nn + {\c_sys_jobname_str} + {\g@@_sys_timestamp_delim_str} } % \end{macrocode} -% \section{\textsf{map}} -% \subsection{\textsf{backend}} +% \end{macro} +% \begin{macro}{\@@_sys_jobnametimestamp:n, \@@_sys_jobnametimestamp:} % \begin{macrocode} -\cs_set:Npn \erw_gset_map:N #1 +\cs_new:Nn\@@_sys_jobnametimestamp:nn { - \erw_cs_gset_eq:NN \__erw_map:n #1 + \erw_tl_join:nn + {\@@_sys_jobnametimestamp_prefix:} + {\erw_sys_timestamp:nn{#1}{#2}} } -\cs_set:Npn \erw_gset_map_inline:n #1 +\cs_new:Nn\@@_sys_jobnametimestamp: { - \erw_cs_gset_inline:Nn \__erw_map:n {#1} + \erw_tl_join:nn + {\@@_sys_jobnametimestamp_prefix:} + {\erw_sys_timestamp:} } -\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 +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@_sys_timestamp:nn} +% \begin{macrocode} +\cs_new:Nn\@@_sys_timestamp:nn { - \quark_if_recursion_tail_stop:n{#1} - \__erw_map:n{#1} \__erw_map:nn{#2} + \exp_args:No + \use:c{@@_sys_\@@_sys_datetime_period:n{#1}_\@@_sys_datetime_base:n{#2}:} } -\cs_new:Npn \__erw_map:n #1 +\cs_new_protected:Nn \@@_sys_set_delim:nn { - \msg_error:nnn - {erw} - {generic} - {__erw_map:n~not~set} + \use:c{tl_gset:N#1} + \g@@_sys_timestamp_delim_str{#2} } -\cs_set:Npn \erw_map:Nn - #1 % fun - #2 % tl +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\keys_define:nn{@@} +{ + sys / timestamp_delim .code:n = + { + \exp_last_unbraced:No + \@@_sys_set_delim:nn{n}{#1} + }, + sys / timestamp_delim .value_required:n = true, + sys / timestamp_delim .default:n = {-}, + sys / timestamp_delim .initial:n = {-} +} +% \subsection{frontend} +% \begin{macrocode} +\cs_new:Nn\erw_sys_jobnametimestamp:nn{\@@_sys_jobnametimestamp:nn{#1}{#2}} +\cs_new:Nn\erw_sys_jobnametimestamp:{\@@_sys_jobnametimestamp:} +\cs_new:Nn\erw_sys_timestamp_delimiter: { - \erw_cs_set_eq:NN \__erw_map:n #1 - \erw_map:n{#2} + \use:N \g@@_sys_timestamp_delim_str } -\cs_set:Npn \erw_map_inline:nn - #1 % inl - #2 % tl +\cs_new:Nn\erw_sys_timestamp:nn { - \erw_cs_set_inline:Nn \__erw_map:n {#1} - \erw_map:n{#2} + \@@_sys_timestamp:nn{#1}{#2} } -\cs_set:Npn \erw_apply:Nnn #1 #2 #3 +\cs_new:Nn\erw_sys_timestamp: { - #1{#2}{#3} + \@@_sys_timestamp:nn{datetime}{16} } -\cs_set:Npn \erw_apply:Nnnn #1 #2 #3 #4 +% \end{macrocode} +% \section{\textsf{tl}} +% \label{impl:tl} +% \subsection{backend} +% \begin{macrocode} +\tl_new:N \g@@_tl_compose_tl +% \end{macrocode} +% \begin{macro}{\g@@_tl_function:n} +% \begin{macrocode} +\cs_new_protected:Nn \g@@_tl_function:n { - #1{#2}{#3}{#4} + \msg_error:nnn + {erw} + {notset} + {\g@@_tl_function:n} } -\cs_set:Npn \erw_apply:Nnnnn #1 #2 #3 #4 #5 +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@_tl_map:nn} +% \begin{macrocode} +\cs_set_protected:Nn \@@_tl_map:nn { - #1{#2}{#3}{#4}{#5} + \quark_if_recursion_tail_stop:n{#1} + \g@@_tl_function:n{#1} \@@_tl_map:nn{#2} } -\cs_set:Npn \__erw_map_thread_at:Nnn #1 #2 #3 +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@_tl_map_thread_at:Nnn, \@@_tl_map_thread_at:Nnnn, \@@_tl_map_thread_at:Nnnnn, \@@_tl_map_thread_at:Nnnnnn} +% \begin{macrocode} +\cs_set_protected:Nn \@@_tl_map_thread_at:Nnn { - \erw_apply:Nn #1 - {\exp_args:Nf\tl_item:nn {#3} {#2} } + #1 + {\exp_args:Nf\tl_item:nn {#3} {#2} } } -\cs_set:Npn \__erw_map_thread_at:Nnnn #1 #2 #3 #4 +\cs_set_protected:Nn \@@_tl_map_thread_at:Nnnn { - \erw_apply:Nnn #1 - {\exp_args:Nf\tl_item:nn {#3} {#2} } - {\exp_args:Nf\tl_item:nn {#4} {#2} } + #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 +\cs_set_protected:Nn \@@_tl_map_thread_at:Nnnnn { - \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} } + #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 +\cs_set_protected:Nn \@@_tl_map_thread_at:Nnnnnn { - \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} } + #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 +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@_tl_separators:nn} +% \begin{arguments} +% \item \meta{ int } +% \item \meta{ items } +% \end{arguments} +% \begin{macrocode} +\cs_new:Nn \@@_tl_separators:nn { - \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 - } + \int_case:nnTF {#1} + { + {1} + { \prg_replicate:nn{ 3 }{#2} } + {2} { - \msg_error:nnn{erw} - {generic} - {erw_map_thread_at:~count~of~#3~not~withing~1~to~4} + { \use_ii:nn #2 } + { \use_i:nn #2 } + { \use_i:nn #2 \use_ii:nn #2 } } + {3}{#2} + } + { \c_empty_tl } + { + \msg_error:nnnn { @@ } + { separ } + { \@@_tl_separators:nn } + {#2} + } } -\cs_set:Npn \erw_map_thread:Nn #1 #2 +\cs_generate_variant:Nn \@@_tl_separators:nn { e } +% \end{macrocode} +% \end{macro} +% \subsection{frontend} +% ^^A TODO see if can replace compose with just oper +% \begin{macrocode} +\cs_new:Nn \erw_tl_append_item:nn { - % 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} - } + {#1{#2}} } +\cs_new:Nn \erw_tl_fold:NN +{ + \use:c{tl_set:\g@@_tl_fold_set_par_tl} + #2 + { + \use:c{exp_args:\g@@_tl_fold_apply_par_tl}{#1}{#2} + } +} +\cs_generate_variant:Nn \erw_tl_fold:NN {cN} +\cs_new:Nn \erw_tl_gset_function:N +{ + \erw_cs_gset_eq:NN \g@@_tl_function:n #1 +} +\cs_new:Nn \erw_tl_gset_function:n +{ + \erw_cs_gset_inline:Nn \g@@_tl_function:n {#1} +} +\cs_new:Nn \erw_tl_last_item:n +{ + \exp_args:Nof \tl_item:nn + {#1} + { + \tl_count:n{#1} + } +} +% \end{macrocode} +% \begin{macro}{\erw_tl_join:nn, \erw_tl_join:nnn, \erw_tl_join:nnnn, \erw_tl_join:nnnnn} +% \begin{macrocode} +\cs_new:Nn \erw_tl_join:nn{#1#2} +\cs_new:Nn \erw_tl_join:nnn{#1#2#3} +\cs_new:Nn \erw_tl_join:nnnn{#1#2#3#4} +\cs_new:Nn \erw_tl_join:nnnnn{#1#2#3#4#5} % \end{macrocode} -% \section{\textsf{numbrdcs}} -% \subsection{\textsf{backend}} +% \end{macro} % \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 +\cs_new_protected:Nn \erw_tl_map:n +{ + \@@_tl_map:nn#1\q_recursion_tail\q_recursion_stop\q_recursion_tail\q_recursion_stop +} +\cs_new_protected:Nn \erw_tl_map:Nn { - \erw_apply:cn{__erw_numbrd_cs_\int_to_alph:n{#1}:n}{#2} + \cs_set_eq:NN \g@@_tl_function:n #1 + \erw_tl_map:n{#2} } -\cs_new_protected:Npn \erw_numbrd_cs_reset: +\cs_new_protected:Nn \erw_tl_map_inline:nn { - \int_zero:N \__erw_numbrd_cs_int - \tl_set:Nn \__erw_numbrd_cs_ext_tl{} + \erw_cs_set_inline:Nn \g@@_tl_function:n {#1} + \erw_tl_map:n{#2} } -\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:Nn \erw_tl_repeat:nn +{ + \int_step_inline:nnnn{1}{1}{#1}{#2} } -\cs_new:Npn \erw_numbrd_cs_names:nnn #1 #2 #3 +\cs_new:Nn \erw_tl_split:nnn { - \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name:n + \tl_head:n{#1} + \use:c{exp_args:#3} \tl_map_inline:nn + { + \tl_tail:n + { + #1 + } + }{#2##1} } -\cs_new:Npn \erw_numbrd_cs_names_braced:nnn #1 #2 #3 +\cs_new:Nn \erw_tl_split:nn { - \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name_braced:n - % TODO \tl_range_braced:nnn? + \erw_tl_split:nnn{#1}{#2}{Nf} } -\cs_new:Npn \erw_numbrd_cs_names_braced: +\cs_new_protected:Nn \erw_tl_map_thread_at:Nnn { - \erw_numbrd_cs_names_braced:nnn{1}{1}{\__erw_numbrd_cs_int} + \exp_args:Nf\int_case:nnTF + { + \tl_count:n{#3} + } + { + {1}{ \@@_tl_map_thread_at:Nnn #1{#2}#3 } + {2}{ \@@_tl_map_thread_at:Nnnn #1{#2}#3 } + {3}{ \@@_tl_map_thread_at:Nnnnn #1{#2}#3 } + {4}{ \@@_tl_map_thread_at:Nnnnnn #1{#2}#3 } + } + { + % Do nothing + } + { + \msg_error:nnn{@@} + {generic} + {erw_tl_map_thread_at:~count~of~#3~not~withing~1~to~4} + } } -% \end{macrocode} -% \subsection{\textsf{frontend}} -% \begin{macrocode} -\NewDocumentCommand{\numbrdcsnew}{ s m } +\cs_new_protected:Nn \erw_tl_map_thread:Nn { - \IfBooleanTF{#1} - {} - { \erw_numbrd_cs_reset:{}} - \tl_map_function:nN {#2}\erw_numbrd_cs_new:n + \int_step_inline:nn + { + \exp_args:Nf \tl_count:n{ \tl_head:n{#2} } + } + { + \erw_tl_map_thread_at:Nnn #1 {##1} {#2} + } } -\NewDocumentCommand{\numbrdcs}{ m m } +\cs_new:Nn \erw_tl_separators:n { - \erw_numbrd_cs:nn{#1}{#2} + \@@_tl_separators:en{ \tl_count:n{#1} }{#1} } -% \ProcessKeysPackageOptions{ erw } +% \end{macrocode} +% \section{Closing} +% \label{impl:closing} +% +% \begin{macrocode} \ExplSyntaxOff +%</package> % \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 -%</package> -% \fi +% \end{implementation} +% ^^A% \iffalse +% ^^A%</package> +% ^^A% \fi % \Finale \endinput
\ No newline at end of file diff --git a/Master/texmf-dist/source/latex/erw-l3/erw-l3.ins b/Master/texmf-dist/source/latex/erw-l3/erw-l3.ins deleted file mode 100644 index 9ce820375b6..00000000000 --- a/Master/texmf-dist/source/latex/erw-l3/erw-l3.ins +++ /dev/null @@ -1,68 +0,0 @@ -%% -%% This is file `erw-l3.ins', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% erw-l3.dtx (with options: `install') -%% ---------------------------------------------------------------- -%% 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 -%% ---------------------------------------------------------------- -%% -\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 -%% -%% 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. -%% -%% -%% End of file `erw-l3.ins'. diff --git a/Master/texmf-dist/tex/latex/erw-l3/erw-l3.sty b/Master/texmf-dist/tex/latex/erw-l3/erw-l3.sty index ba4182d0e1d..18e94e85057 100644 --- a/Master/texmf-dist/tex/latex/erw-l3/erw-l3.sty +++ b/Master/texmf-dist/tex/latex/erw-l3/erw-l3.sty @@ -5,385 +5,499 @@ %% The original source files were: %% %% erw-l3.dtx (with options: `package') -%% ---------------------------------------------------------------- -%% erw-l3 Utilities built around expl3 +%% ---------------------------------------------------------------------------- +%% erw-l3 --- Utilities for LaTeX3 programming %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt -%% ---------------------------------------------------------------- +%% ---------------------------------------------------------------------------- %% -\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 -\NeedsTeXFormat{LaTeX2e} -\ExplSyntaxOn -\msg_new:nnn{erw}{generic}{#1} -\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 + \NeedsTeXFormat{LaTeX2e}[2020/02/02] + \RequirePackage{etoolbox}[2019/09/21] + \RequirePackage{l3keys2e}[2020/03/06] + \RequirePackage{xparse}[2020/03/06] + \ProvidesExplPackage + {erw-l3} % Package name + {2020/06/04} % Release date + {3.1} % Release version + {erw-l3 --- Utilities for LaTeX3 programming } % Description +\cs_new:Nn \__erw_cs_name:N +{ + \exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1} +} +\cs_new:Nn \erw_cs_compose:NnN +{ + \erw_cs_set_inline:Nn \g__erw_tl_function:n { - #1{##1}#3 + #1{##1}#3 } - \exp_args:Nf\erw_map:n + \exp_args:Nf\erw_tl_map:n { - \tl_reverse:n{#2} + \tl_reverse:n{#2} } } -\cs_set:Npn \erw_compose:nV #1 #2 +\cs_set:Npn \erw_cs_identity:n #1{#1} +\cs_new_protected:Nn \erw_cs_set_inline:Nn { - \erw_compose:NnV \erw_fold:NV {#1} #2 + \cs_set:Npn #1 ##1{#2} } -\cs_set:Npn \erw_compose_c:nV #1 #2 +\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn} +\cs_new:Nn \erw_cs_gset_inline:Nn { - \erw_compose:NnV \erw_fold:cV {#1} #2 + \cs_gset:Npn #1 ##1{#2} } -\tl_new:N \__erw_compose_tl -\cs_set:Npn \erw_compose:nn #1 #2 +\cs_generate_variant:Nn \erw_cs_gset_inline:Nn {cn} +\int_new:N \g__erw_csint_int +\cs_new:Nn \__erw_csint_name: {\erw_csint_name:n{\g__erw_csint_int}} +\cs_new:Nn \erw_csint:nn { - \tl_set:Nn \__erw_compose_tl {#2} - \erw_compose:nV{#1}\__erw_compose_tl - \__erw_compose_tl + \exp_args:No \use:c{\erw_csint_name:n{#1}}{#2} } -\cs_set:Npn \erw_compose_c:nn #1 #2 +\cs_new:Nn \erw_csint_name:n {__erw_csint_\int_to_alph:n{#1}:n} +\cs_new_protected:Nn \erw_csint_new:n { - \tl_set:Nn \__erw_compose_tl {#2} - \erw_compose_c:nV{#1}\__erw_compose_tl - \__erw_compose_tl + \int_incr:N \g__erw_csint_int + \exp_args:No + \erw_cs_set_inline:cn{\__erw_csint_name:} + { + \token_if_cs:NTF + {#1} + {#1{##1}} + {#1} + } } -\cs_set:Npn \erw_compose_seq:nV #1 #2 +\cs_new:Nn \erw_csint_names_braced:nnn { - \erw_compose:NnV \erw_fold_seq:NV {#1} #2 + \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_csint_names_braced:n + % TODO \tl_range_braced:nnn? } -\cs_set:Npn \erw_compose_seq_c:nV - #1 % funs - #2 % seq +\cs_new:Nn \erw_csint_names_braced:n {{\erw_csint_name:n{#1}}} +\cs_new:Nn \erw_csint_names_braced: { - \erw_compose:NnV \erw_fold_seq:cV {#1} #2 + \erw_csint_names_braced:nnn{1}{1}{\g__erw_csint_int} } -\cs_set:Npn \erw_compose_vers:nV #1 #2 +\cs_new_protected:Nn \erw_csint_reset: { - \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented} + \int_zero:N \g__erw_csint_int + \tl_set:Nn \__erw_csint_ext_tl{}%^^A TODO remove? } -\cs_set:Npn \erw_compose_seq_vers:nV #1 #2 +\cs_set:Npn \__erw_int_range:nnn #1 #2 #3 { - \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented} + \int_compare:nNnTF + { + \int_eval:n{#2+1} + }>{#3} + { + {#1} + } + { + \__erw_int_range:nnn + { + \exp_args:Nx\erw_tl_append_item:nn{#1} + { + \int_eval:n{#2+1} + } + } + {\int_eval:n{#2+1}} + {#3} + } } -\cs_set:Npn \erw_compose_vers:nn #1 #2 +\cs_new:Nn \erw_int_range:nn { - \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} + \__erw_int_range:nnn {{#1}}{#1}{#2} } -\cs_set:Npn \erw_accum:nn #1 #2 +\cs_new:Nn \erw_int_range:n { - {#1{#2}} + \__erw_int_range:nnn {}{0}{#1} } -\cs_set:Npn \__erw_cs_name:N #1 +\cs_new:Nn \erw_keyval_error:Nn{\msg_error:nnnnn{__erw}{keyval/n}{\erw_keyval_error:Nn}{#1}{#2}} +\cs_new:Nn \erw_keyval_error:Nnn{\msg_error:nnnnnn{__erw}{keyval/nn}{\erw_keyval_error:Nnn}{#1}{#2}{#3}} +\cs_new_protected:Nn\erw_keyval_parse:NNNn { - \exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1} + \cs_set_protected:Nn \__erw_keyval_function:n {#2 #1{##1}} + \cs_set_protected:Nn \__erw_keyval_function:nn {#3 #1{##1}{##2}} + \keyval_parse:NNn + \__erw_keyval_function:n + \__erw_keyval_function:nn + {#4} } -\cs_set:Npn \erw_apply:Nn - #1 % fun - #2 % tl +\cs_new_protected:Npn \erw_lambda:nnn #1 #2 #3 { - #1{#2} + \exp_args:NNx + #1 \__erw_lambda_expression + {#2} + {#3} + \__erw_lambda_expression } -\cs_generate_variant:Nn \erw_apply:Nn {No, Nf, Nx, c} -\cs_set:Npn \erw_cs_set_eq:NN #1 #2 +\msg_new:nnn{__erw}{generic}{#1} +\msg_new:nnn{__erw}{keyval/nn}{#1#2{#3}{#4};~encountered~key=val~where~only~key~required} +\msg_new:nnn{__erw}{keyval/n}{#1#2{#3};~encountered~key~~where~only~key=val~required} +\msg_new:nnn{__erw}{separ}{#1~expects~1~to~3~items,~#2} +\msg_new:nnn{__erw}{timestamp / base}{Calling~#1,~arg~must~be~'dec|hex'} +\msg_new:nnn{__erw}{timestamp / period}{Calling~#1,~arg~must~be~'date|time|datetime'} +\msg_new:nnn{erw}{notset}{#1~not~set} +\cs_new_protected:Nn \__erw_prop_map_item:NNN { - \cs_set:Npn #1 ##1{#2{##1}} + \cs_set_protected:Nn \__erw_function:nn + { + #1 #2 {##1}{##2} + } + \prop_map_function:NN #3 \__erw_function:nn } -\cs_generate_variant:Nn \erw_cs_set_eq:NN {cN} -\cs_set:Npn \erw_cs_gset_eq:NN #1 #2 +\cs_new_protected:Nn \erw_prop_to_clist:Nn { - \cs_gset:Npn #1 ##1{#2{##1}} + \cs_set:Nn \__erw_keyval_function:n {,\prop_item:Nn#1{##1}} + \exp_args:Nf + \tl_tail:n + { + \keyval_parse:NNn + \__erw_keyval_function:n + \erw_keyval_error:Nnn + {#2} + } } -\cs_generate_variant:Nn \erw_cs_gset_eq:NN {cN} -\cs_set:Npn \erw_cs_set_inline:Nn #1 #2 +\cs_generate_variant:Nn \erw_prop_to_clist:Nn { c } +\cs_new_protected:Nn \erw_prop_map_item:NNN { - \cs_set:Npn #1 ##1{#2} + \prop_if_exist:NTF #2 + {\__erw_prop_map_item:NNN #1#2#3} + { + \prop_new:N #2 + \erw_prop_map_item:NNN #1#2#3 + } } -\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn} -\cs_set:Npn \erw_cs_gset_inline:Nn #1 #2 +\cs_new_protected:Nn\erw_prop_keyval_parse:NNNn { - \cs_gset:Npn #1 ##1{#2} + \prop_if_exist:NTF#1 + {\erw_keyval_parse:NNNn #1#2#3{#4}} + { + \prop_new:N #1 + \erw_prop_keyval_parse:NNNn#1#2#3{#4} + } } -\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 +\keys_define:nn{__erw} { - \tl_set:Nn \__erw_fold_set_par_tl{#1} + tl/fold_set_par.tl_gset:N = \g__erw_tl_fold_set_par_tl, + tl/fold_set_par.value_required:n = true, + tl/fold_set_par.default:n = {Nf}, + tl/fold_set_par.initial:n = {Nf}, + tl/fold_apply_par.tl_gset:N = \g__erw_tl_fold_apply_par_tl, + tl/fold_apply_par.value_required:n = true, + tl/fold_apply_par.default:n = {Nf}, + tl/fold_apply_par.initial:n = {Nf} } -\cs_set:Npn \erw_fold_apply_par:n #1 +\cs_new_protected:Nn\erw_option:n { - \tl_set:Nn \__erw_fold_apply_par_tl{#1} + \keys_set:nn{__erw}{#1} } -\cs_set:Npn \erw_fold:NV - #1 % fun - #2 % var +\tl_new:N \g__erw_seq_fold_item_tl +\cs_new_protected:Nn\__erw_seq_put_right_clist:Nn { - \use:c{tl_set:\__erw_fold_set_par_tl} - #2 - {\use:c{erw_apply:\__erw_fold_apply_par_tl}{#1}{#2}} + \cs_set_protected:Nn \__erw_function:n + { + \seq_put_right:Nn #1{##1} + } + \keyval_parse:NNn + \__erw_function:n + \erw_keyval_keyonly:nn + {#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 +\cs_generate_variant:Nn \__erw_seq_put_right_clist:Nn { c } +\cs_new_protected:Nn\__erw_seq_put_right_prop:NNn { - \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} + \__erw_seq_put_right_clist:Nn #1 + {\erw_prop_to_clist:Nn #2 {#3}} } -\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 } +\cs_generate_variant:Nn \__erw_seq_put_right_prop:NNn { cc } +\cs_new_protected:Nn\erw_seq_put_right_clist:Nn { - \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:} + \seq_if_exist:NTF#1 + {\__erw_seq_put_right_clist:Nn#1{#2}} + {\seq_new:N#1\erw_seq_put_right_clist:Nn#1{#2}} } -\cs_set:Npn \erw_last_item:n #1 +\cs_generate_variant:Nn \erw_seq_put_right_clist:Nn { c } +\cs_new_protected:Nn\erw_seq_put_right_prop:NNn { - \exp_args:Nof \tl_item:nn - {#1} - { - \tl_count:n{#1} - } + \seq_if_exist:NTF#1 + {\__erw_seq_put_right_prop:NNn#1#2{#3}} + {\seq_new:N#1\erw_seq_put_right_prop:NNn#1#2{#3}} } -\cs_set:Npn \erw_merge:nn #1 #2 +\cs_generate_variant:Nn \erw_seq_put_right_prop:NNn { cc } +\cs_new_protected:Nn \erw_seq_fold:NN { - {#1#2} + \seq_get_right:NN #2 \g__erw_seq_fold_item_tl + \erw_tl_fold:NN #1 \g__erw_seq_fold_item_tl + \seq_put_right:No #2 {\g__erw_seq_fold_item_tl} } -\cs_set:Npn \erw_repeat:nn #1 #2 +\cs_generate_variant:Nn \erw_seq_fold:NN {cN} +\cs_new:Nn \erw_seq_use:Nn { - \int_step_inline:nnnn{1}{1}{#1}{#2} + \exp_last_unbraced:NNf + \seq_use:Nnnn #1 + \erw_tl_separators:n{#2} } -\cs_set:Npn \erw_split:nnn #1 #2 #3 +\cs_new:Nn \__erw_sys_date_dec: { - \tl_head:n{#1} - \use:c{exp_args:#3} \tl_map_inline:nn - { - \tl_tail:n - { - #1 - } - }{#2##1} + \int_eval:n + { + \c_sys_year_int * 10000 + +\c_sys_month_int * 100 + +\c_sys_day_int * 1 + } } -\cs_set:Npn \erw_split:nn #1 #2 +\cs_new:Nn \__erw_sys_date:N{\int_to_hex:n{\__erw_sys_date_dec:}} +\cs_new:Nn \__erw_sys_date_hex:{\int_to_hex:n{\__erw_sys_date_dec:}} +\cs_new:Nn \__erw_sys_time_dec: { - \erw_split:nnn{#1}{#2}{Nf} + \int_eval:n + { + \c_sys_hour_int * 100 + +\c_sys_minute_int * 1 + } } -\cs_set:Npn \__erw_int_range:nnn #1 #2 #3 +\cs_new:Nn\__erw_sys_time_hex:{\int_to_hex:n{\__erw_sys_time_dec:}} +\cs_new:Nn\__erw_sys_datetime_base:n { - \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} - } + \int_case:nnTF{#1} + { + {10}{dec} + {16}{hex} + } + {\c_empty_tl} + {\msg_error:nnn{__erw}{timestamp / base}{\__erw_sys_datetime_base:n{#1}}} } -\cs_set:Npn \erw_int_range:nn #1 #2 +\cs_new:Nn\__erw_sys_datetime_join:nn{\erw_tl_join:nnn{#1}{\g__erw_sys_timestamp_delim_str}{#2}} +\cs_new:Nn\__erw_sys_datetime_period:n { - \__erw_int_range:nnn {{#1}}{#1}{#2} + \str_case:nnTF{#1} + { + {date}{date} + {time}{time} + {datetime}{datetime} + } + {\c_empty_tl} + {\msg_error:nnn{__erw}{ timestamp / period }{\__erw_sys_datetime_period:n{#1}}} } -\cs_set:Npn \erw_int_range:n #1 +\cs_new:Nn\__erw_sys_datetime_dec: {\__erw_sys_datetime_join:nn{\__erw_sys_date_dec:}{\__erw_sys_time_dec:}} +\cs_new:Nn\__erw_sys_datetime_hex: {\__erw_sys_datetime_join:nn{\__erw_sys_date_hex:}{\__erw_sys_time_hex:}} +\cs_new:Nn\__erw_sys_jobnametimestamp_prefix: { - \__erw_int_range:nnn {}{0}{#1} + \erw_tl_join:nn + {\c_sys_jobname_str} + {\g__erw_sys_timestamp_delim_str} } -\cs_set:Npn \erw_gset_map:N #1 +\cs_new:Nn\__erw_sys_jobnametimestamp:nn { - \erw_cs_gset_eq:NN \__erw_map:n #1 + \erw_tl_join:nn + {\__erw_sys_jobnametimestamp_prefix:} + {\erw_sys_timestamp:nn{#1}{#2}} } -\cs_set:Npn \erw_gset_map_inline:n #1 +\cs_new:Nn\__erw_sys_jobnametimestamp: { - \erw_cs_gset_inline:Nn \__erw_map:n {#1} + \erw_tl_join:nn + {\__erw_sys_jobnametimestamp_prefix:} + {\erw_sys_timestamp:} } -\cs_set:Npn \erw_map:n #1 +\cs_new:Nn\__erw_sys_timestamp:nn { - \__erw_map:nn#1\q_recursion_tail\q_recursion_stop\q_recursion_tail\q_recursion_stop + \exp_args:No + \use:c{__erw_sys_\__erw_sys_datetime_period:n{#1}_\__erw_sys_datetime_base:n{#2}:} } -\cs_set:Npn \__erw_map:nn #1 #2 +\cs_new_protected:Nn \__erw_sys_set_delim:nn { - \quark_if_recursion_tail_stop:n{#1} - \__erw_map:n{#1} \__erw_map:nn{#2} + \use:c{tl_gset:N#1} + \g__erw_sys_timestamp_delim_str{#2} } -\cs_new:Npn \__erw_map:n #1 +\keys_define:nn{__erw} { - \msg_error:nnn - {erw} - {generic} - {__erw_map:n~not~set} + sys / timestamp_delim .code:n = + { + \exp_last_unbraced:No + \__erw_sys_set_delim:nn{n}{#1} + }, + sys / timestamp_delim .value_required:n = true, + sys / timestamp_delim .default:n = {-}, + sys / timestamp_delim .initial:n = {-} } -\cs_set:Npn \erw_map:Nn - #1 % fun - #2 % tl +\cs_new:Nn\erw_sys_jobnametimestamp:nn{\__erw_sys_jobnametimestamp:nn{#1}{#2}} +\cs_new:Nn\erw_sys_jobnametimestamp:{\__erw_sys_jobnametimestamp:} +\cs_new:Nn\erw_sys_timestamp_delimiter: { - \erw_cs_set_eq:NN \__erw_map:n #1 - \erw_map:n{#2} + \use:N \g__erw_sys_timestamp_delim_str } -\cs_set:Npn \erw_map_inline:nn - #1 % inl - #2 % tl +\cs_new:Nn\erw_sys_timestamp:nn { - \erw_cs_set_inline:Nn \__erw_map:n {#1} - \erw_map:n{#2} + \__erw_sys_timestamp:nn{#1}{#2} } -\cs_set:Npn \erw_apply:Nnn #1 #2 #3 +\cs_new:Nn\erw_sys_timestamp: { - #1{#2}{#3} + \__erw_sys_timestamp:nn{datetime}{16} } -\cs_set:Npn \erw_apply:Nnnn #1 #2 #3 #4 +\tl_new:N \g__erw_tl_compose_tl +\cs_new_protected:Nn \g__erw_tl_function:n { - #1{#2}{#3}{#4} + \msg_error:nnn + {erw} + {notset} + {\g__erw_tl_function:n} } -\cs_set:Npn \erw_apply:Nnnnn #1 #2 #3 #4 #5 +\cs_set_protected:Nn \__erw_tl_map:nn { - #1{#2}{#3}{#4}{#5} + \quark_if_recursion_tail_stop:n{#1} + \g__erw_tl_function:n{#1} \__erw_tl_map:nn{#2} } -\cs_set:Npn \__erw_map_thread_at:Nnn #1 #2 #3 +\cs_set_protected:Nn \__erw_tl_map_thread_at:Nnn { - \erw_apply:Nn #1 - {\exp_args:Nf\tl_item:nn {#3} {#2} } + #1 + {\exp_args:Nf\tl_item:nn {#3} {#2} } } -\cs_set:Npn \__erw_map_thread_at:Nnnn #1 #2 #3 #4 +\cs_set_protected:Nn \__erw_tl_map_thread_at:Nnnn { - \erw_apply:Nnn #1 - {\exp_args:Nf\tl_item:nn {#3} {#2} } - {\exp_args:Nf\tl_item:nn {#4} {#2} } + #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 +\cs_set_protected:Nn \__erw_tl_map_thread_at:Nnnnn { - \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} } + #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 +\cs_set_protected:Nn \__erw_tl_map_thread_at:Nnnnnn { - \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} } + #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 +\cs_new:Nn \__erw_tl_separators:nn { - \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 - } + \int_case:nnTF {#1} + { + {1} + { \prg_replicate:nn{ 3 }{#2} } + {2} { - \msg_error:nnn{erw} - {generic} - {erw_map_thread_at:~count~of~#3~not~withing~1~to~4} + { \use_ii:nn #2 } + { \use_i:nn #2 } + { \use_i:nn #2 \use_ii:nn #2 } } + {3}{#2} + } + { \c_empty_tl } + { + \msg_error:nnnn { __erw } + { separ } + { \__erw_tl_separators:nn } + {#2} + } } -\cs_set:Npn \erw_map_thread:Nn #1 #2 +\cs_generate_variant:Nn \__erw_tl_separators:nn { e } +\cs_new:Nn \erw_tl_append_item:nn { - % 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} - } + {#1{#2}} +} +\cs_new:Nn \erw_tl_fold:NN +{ + \use:c{tl_set:\g__erw_tl_fold_set_par_tl} + #2 + { + \use:c{exp_args:\g__erw_tl_fold_apply_par_tl}{#1}{#2} + } } -\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 +\cs_generate_variant:Nn \erw_tl_fold:NN {cN} +\cs_new:Nn \erw_tl_gset_function:N { - \erw_apply:cn{__erw_numbrd_cs_\int_to_alph:n{#1}:n}{#2} + \erw_cs_gset_eq:NN \g__erw_tl_function:n #1 } -\cs_new_protected:Npn \erw_numbrd_cs_reset: +\cs_new:Nn \erw_tl_gset_function:n { - \int_zero:N \__erw_numbrd_cs_int - \tl_set:Nn \__erw_numbrd_cs_ext_tl{} + \erw_cs_gset_inline:Nn \g__erw_tl_function:n {#1} } -\cs_new_protected:Npn \erw_numbrd_cs_new:n #1 +\cs_new:Nn \erw_tl_last_item:n { - \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} - } + \exp_args:Nof \tl_item:nn + {#1} + { + \tl_count:n{#1} + } } -\cs_new:Npn \erw_numbrd_cs_names:nnn #1 #2 #3 +\cs_new:Nn \erw_tl_join:nn{#1#2} +\cs_new:Nn \erw_tl_join:nnn{#1#2#3} +\cs_new:Nn \erw_tl_join:nnnn{#1#2#3#4} +\cs_new:Nn \erw_tl_join:nnnnn{#1#2#3#4#5} +\cs_new_protected:Nn \erw_tl_map:n { - \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name:n + \__erw_tl_map:nn#1\q_recursion_tail\q_recursion_stop\q_recursion_tail\q_recursion_stop } -\cs_new:Npn \erw_numbrd_cs_names_braced:nnn #1 #2 #3 +\cs_new_protected:Nn \erw_tl_map:Nn { - \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name_braced:n - % TODO \tl_range_braced:nnn? + \cs_set_eq:NN \g__erw_tl_function:n #1 + \erw_tl_map:n{#2} } -\cs_new:Npn \erw_numbrd_cs_names_braced: +\cs_new_protected:Nn \erw_tl_map_inline:nn { - \erw_numbrd_cs_names_braced:nnn{1}{1}{\__erw_numbrd_cs_int} + \erw_cs_set_inline:Nn \g__erw_tl_function:n {#1} + \erw_tl_map:n{#2} } -\NewDocumentCommand{\numbrdcsnew}{ s m } +\cs_new:Nn \erw_tl_repeat:nn { - \IfBooleanTF{#1} - {} - { \erw_numbrd_cs_reset:{}} - \tl_map_function:nN {#2}\erw_numbrd_cs_new:n + \int_step_inline:nnnn{1}{1}{#1}{#2} +} +\cs_new:Nn \erw_tl_split:nnn +{ + \tl_head:n{#1} + \use:c{exp_args:#3} \tl_map_inline:nn + { + \tl_tail:n + { + #1 + } + }{#2##1} +} +\cs_new:Nn \erw_tl_split:nn +{ + \erw_tl_split:nnn{#1}{#2}{Nf} +} +\cs_new_protected:Nn \erw_tl_map_thread_at:Nnn +{ + \exp_args:Nf\int_case:nnTF + { + \tl_count:n{#3} + } + { + {1}{ \__erw_tl_map_thread_at:Nnn #1{#2}#3 } + {2}{ \__erw_tl_map_thread_at:Nnnn #1{#2}#3 } + {3}{ \__erw_tl_map_thread_at:Nnnnn #1{#2}#3 } + {4}{ \__erw_tl_map_thread_at:Nnnnnn #1{#2}#3 } + } + { + % Do nothing + } + { + \msg_error:nnn{__erw} + {generic} + {erw_tl_map_thread_at:~count~of~#3~not~withing~1~to~4} + } +} +\cs_new_protected:Nn \erw_tl_map_thread:Nn +{ + \int_step_inline:nn + { + \exp_args:Nf \tl_count:n{ \tl_head:n{#2} } + } + { + \erw_tl_map_thread_at:Nnn #1 {##1} {#2} + } } -\NewDocumentCommand{\numbrdcs}{ m m } +\cs_new:Nn \erw_tl_separators:n { - \erw_numbrd_cs:nn{#1}{#2} + \__erw_tl_separators:en{ \tl_count:n{#1} }{#1} } \ExplSyntaxOff %% -%% Copyright (C) 2018 by Erwann Rogard +%% Copyright (C) 2018-2020 by Erwann Rogard %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either @@ -395,10 +509,8 @@ %% 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. +%% This work consists of the file erw-l3.dtx and the derived files: +%% erw-l3.sty, and erw-l3.pdf. %% %% %% End of file `erw-l3.sty'. |