summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-06-05 03:02:48 +0000
committerNorbert Preining <norbert@preining.info>2020-06-05 03:02:48 +0000
commitf51a463b880756f6a989cac367c3d99fb1373719 (patch)
tree05acf2595be1af2b548896487426646955e36a8c /macros
parent6c90555ebb89f41cc4dfb6cf3ee6bfaa8107650e (diff)
CTAN sync 202006050302
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/crop/Makefile14
-rw-r--r--[l---------]macros/latex/contrib/crop/README41
-rw-r--r--macros/latex/contrib/crop/crop.dtx8
-rw-r--r--macros/latex/contrib/crop/crop.pdfbin0 -> 327371 bytes
-rw-r--r--macros/latex/contrib/crop/crop.txt50
-rw-r--r--macros/latex/contrib/ellipsis/README.md8
-rw-r--r--macros/latex/contrib/ellipsis/ellipsis.dtx121
-rw-r--r--macros/latex/contrib/ellipsis/ellipsis.ins56
-rw-r--r--macros/latex/contrib/ellipsis/ellipsis.pdfbin215749 -> 216835 bytes
-rw-r--r--macros/latex/contrib/erw-l3/README.md10
-rw-r--r--macros/latex/contrib/erw-l3/erw-l3.dtx2633
-rw-r--r--macros/latex/contrib/erw-l3/erw-l3.pdfbin532611 -> 678206 bytes
-rw-r--r--macros/latex/contrib/lion-msc/lion-msc.cls7
-rw-r--r--macros/latex/contrib/pdftexcmds/README.md18
-rw-r--r--macros/latex/contrib/pdftexcmds/pdftexcmds.dtx432
-rw-r--r--macros/latex/contrib/pdftexcmds/pdftexcmds.pdfbin411206 -> 386262 bytes
-rw-r--r--macros/xetex/latex/xepersian-hm/INSTALL.txt2
-rw-r--r--macros/xetex/latex/xepersian-hm/kashida-glyph-example.pdfbin149558 -> 149502 bytes
-rw-r--r--macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.pdfbin144562 -> 145149 bytes
-rw-r--r--macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.tex3
-rw-r--r--macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.pdfbin147870 -> 147896 bytes
-rw-r--r--macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.tex2
-rw-r--r--macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.pdfbin100363 -> 100197 bytes
-rw-r--r--macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.tex2
-rw-r--r--macros/xetex/latex/xepersian-hm/xepersian-hm-doc.ltx8
-rw-r--r--macros/xetex/latex/xepersian-hm/xepersian-hm-doc.pdfbin267314 -> 268013 bytes
-rw-r--r--macros/xetex/latex/xepersian-hm/xepersian-hm.dtx34
-rw-r--r--macros/xetex/latex/xepersian-hm/xepersian-hm.pdfbin59000 -> 59687 bytes
28 files changed, 1818 insertions, 1631 deletions
diff --git a/macros/latex/contrib/crop/Makefile b/macros/latex/contrib/crop/Makefile
index 09679fec8c..6b48c0902e 100644
--- a/macros/latex/contrib/crop/Makefile
+++ b/macros/latex/contrib/crop/Makefile
@@ -1,16 +1,16 @@
NAME=crop
ARCHIVE_NAME=$(NAME).tar.gz
-ARCHIVE_CONTENTS=$(NAME).dtx Makefile $(NAME).txt $(NAME).ins
+ARCHIVE_CONTENTS=$(NAME).dtx $(NAME).pdf Makefile README $(NAME).ins $(NAME).sty
all: $(NAME).sty $(NAME).pdf
-archive: $(NAME).ins
- @ tar -czf $(ARCHIVE_NAME) $(ARCHIVE_CONTENTS)
- @ echo $(ARCHIVE_NAME):
- @ echo ====================
- @ tar -tzf $(ARCHIVE_NAME)
+archive: $(ARCHIVE_CONTENTS)
+ rm -rf $(NAME)/
+ mkdir $(NAME)/
+ cp $(ARCHIVE_CONTENTS) $(NAME)/
+ tar -czf $(ARCHIVE_NAME) $(NAME)
-$(NAME).pdf:
+$(NAME).pdf: $(NAME.dtx)
latexmk $(NAME).dtx
$(NAME).sty: $(NAME).ins
diff --git a/macros/latex/contrib/crop/README b/macros/latex/contrib/crop/README
index 87013da88f..704e46daf8 120000..100644
--- a/macros/latex/contrib/crop/README
+++ b/macros/latex/contrib/crop/README
@@ -1 +1,40 @@
-crop.txt \ No newline at end of file
+crop.sty
+========
+
+provides different forms of cropmarks for
+trimming paper stacks, for camera alignment and
+for visualizing the page dimensions.
+There are options for centering the page with
+respect to some physical paper size, for marking
+the vertical and horizontal middle axis, for
+mounting pages on a physical sheet, for
+reflecting and inverting the whole document or
+printing it upside-down, and for suppressing
+either text or graphics output.
+
+
+author = "Melchior FRANZ"
+maintainer = "Reuben Thomas"
+version = "1.10.1"
+date = "04 Jun 2020"
+URL = "https://github.com/rrthomas/crop/"
+email = "rrt@sc3d.org"
+codetable = "ISO/ASCII"
+keywords = "cropmarks, frame, mirror, rotate, invert"
+supported = "yes"
+
+
+
+COPYRIGHT NOTICE
+================
+This package is free software that can be redistributed and/or modified
+under the terms of the LaTeX Project Public License as specified
+in the file macros/latex/base/lppl.txt on any CTAN archive server.
+
+
+
+Installation
+============
+
+The package is supplied ready to install: just copy crop.sty and crop.pdf to
+suitable directories.
diff --git a/macros/latex/contrib/crop/crop.dtx b/macros/latex/contrib/crop/crop.dtx
index cb0cfd8b4d..15e8f04c6f 100644
--- a/macros/latex/contrib/crop/crop.dtx
+++ b/macros/latex/contrib/crop/crop.dtx
@@ -27,8 +27,8 @@
%% ====================================================================
%% @LaTeX-package-file{
%% author = "Melchior FRANZ",
-%% version = "1.10",
-%% date = "19 Nov 2017",
+%% version = "1.10.1",
+%% date = "04 Jun 2020",
%% filename = "crop.dtx",
%% address = "Melchior FRANZ
%% Rieder Hauptstrasse 52
@@ -74,8 +74,8 @@
%
%
%<*driver>
-\def\fileversion{1.10}
-\def\filedate{2017/11/19}
+\def\fileversion{1.10.1}
+\def\filedate{2020/06/04g}
\documentclass{ltxdoc}
\usepackage{hyperref}
\hypersetup{
diff --git a/macros/latex/contrib/crop/crop.pdf b/macros/latex/contrib/crop/crop.pdf
new file mode 100644
index 0000000000..bfdedfcde0
--- /dev/null
+++ b/macros/latex/contrib/crop/crop.pdf
Binary files differ
diff --git a/macros/latex/contrib/crop/crop.txt b/macros/latex/contrib/crop/crop.txt
deleted file mode 100644
index 3d09373de8..0000000000
--- a/macros/latex/contrib/crop/crop.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-crop.sty
-========
-
-provides different forms of cropmarks for
-trimming paper stacks, for camera alignment and
-for visualizing the page dimensions.
-There are options for centering the page with
-respect to some physical paper size, for marking
-the vertical and horizontal middle axis, for
-mounting pages on a physical sheet, for
-reflecting and inverting the whole document or
-printing it upside-down, and for suppressing
-either text or graphics output.
-
-
-author = "Melchior FRANZ"
-maintainer = "Reuben Thomas"
-version = "1.10"
-date = "19 Nov 2017"
-URL = "https://github.org/rrthomas/crop/"
-email = "rrt@sc3d.org"
-codetable = "ISO/ASCII"
-keywords = "cropmarks, frame, mirror, rotate, invert"
-supported = "yes"
-
-
-
-COPYRIGHT NOTICE
-================
-This package is free software that can be redistributed and/or modified
-under the terms of the LaTeX Project Public License as specified
-in the file macros/latex/base/lppl.txt on any CTAN archive server.
-
-
-
-Extracting the package & processing the documentation
-=====================================================
-
-on Unix/Linux just run "make" to get the style file and the documentation;
-else generate the driver crop.ins (if you don't already have it):
-
- $ latex crop.dtx
-
-Now generate the style file:
-
- $ tex crop.ins
-
-And finally to produce the documentation run LaTeX three times:
-
- $ latex crop.dtx
diff --git a/macros/latex/contrib/ellipsis/README.md b/macros/latex/contrib/ellipsis/README.md
index b7b555e565..169dde7265 100644
--- a/macros/latex/contrib/ellipsis/README.md
+++ b/macros/latex/contrib/ellipsis/README.md
@@ -4,13 +4,11 @@ If you have ever tried to print something like [...] in LateX text mode, you may
Ellipsis.sty is a package that attempts to solve this problem by only adding the extra space in cases where the ellipsis is followed immediately by a punctuation character that should be spaced evenly with respect to the internal spacing between the three dots of the ellipsis. The package is described on p.~82 of the second edition of The LaTeX Companion.
-Get the package from [CTAN](https://www.ctan.org/pkg/ellipsis).
+[CTAN](https://www.ctan.org/pkg/ellipsis)
-Alternatively, run latex on ellipsis.ins to generate the ellipsis.sty file, and then run latex on ellipsis.dtx to generate the documentation. Put the file
-ellipsis.sty where LaTeX will find it, and refresh TeX's list of
-available files.
+[Github](https://github.com/pjheslin/ellipsis)
-See the PDF file for full documentation.
+See the [PDF file](http://mirrors.ctan.org/macros/latex/contrib/ellipsis/ellipsis.pdf) for full documentation.
Peter Heslin
p.j.heslin@dur.ac.uk
diff --git a/macros/latex/contrib/ellipsis/ellipsis.dtx b/macros/latex/contrib/ellipsis/ellipsis.dtx
index 42462ab2a2..6cdc6c0994 100644
--- a/macros/latex/contrib/ellipsis/ellipsis.dtx
+++ b/macros/latex/contrib/ellipsis/ellipsis.dtx
@@ -1,25 +1,75 @@
% \iffalse meta-comment
+%<*package>
+%%
+%% Copyright (C) 2003-2020 by Peter Heslin <p.j.heslin@dur.ac.uk>
+%% ---------------------------------------------------------------------
+%%
+%% This work may be distributed and/or modified under the conditions
+%% of the LaTeX Project Public License, version 1.3c of the license
+%% or (at your option) any later version. The latest version of this
+%% license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status "author-maintained".
+%%
+%% The current maintainer and author of this work is Peter Heslin.
+%%
+%</package>
+% \fi
%
-% Copyright (C) 2003-20 by Peter Heslin <pheslin@gmail.com>
-% --------------------------------------------------
-%
-% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, either version 1.2 of this license
-% or (at your option) any later version. The latest version of this
-% license is in:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% and version 1.2 or later is part of all distributions of LaTeX
-% version 1999/12/01 or later.
-%
+% \iffalse
+%<*batch>
+\ifx\documentclass\undefined
+
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\usedir{tex/latex/ellipsis}
+
+\preamble
+
+ellipsis -- fixes spacing around ellipses (three dots)
+
+\endpreamble
+
+\generate{\file{ellipsis.sty}{\from{ellipsis.dtx}{package}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* ellipsis.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file ellipsis.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\else
+
+\let\endbatchfile\relax
+
+\fi
+\endbatchfile
+%</batch>
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\ProvidesPackage{ellipsis}
-%<package> [2020/5/22 v1.7 ellipsis: fixes spacing around \dots]
-%
+%<*driver>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\ProvidesFile{ellipsis.dtx}%
+%</driver>
+%<package>\ProvidesPackage{ellipsis}%
+ [2020/05/22 v1.8 fixes spacing around ellipses (three dots)]
%<*driver>
\documentclass{ltxdoc}
\usepackage{ellipsis}
@@ -68,6 +118,7 @@
% \changes{v1.7}{2020/5/22}{Fixed incompatilbility with amsmath; fixed fragile
% command; fixed spacing when \cs{nofrenchspacing}; all fixes thanks to Frank
% Mittelbach. Added ref to xellipsis package.}
+% \changes{v1.8}{2004/9/28}{Code cleanups contributed by Falk Hanisch.}
%
% \GetFileInfo{ellipsis.sty}
%
@@ -75,7 +126,10 @@
% corresponds to \textsf{ellipsis}~\fileversion, dated \filedate.
% Many thanks to Frank Mittelbach, who made numerous suggestions
% and bugfixes that greatly improved this package.}}
-% \author{Peter J. Heslin \\ \texttt{p.j.heslin@dur.ac.uk}}
+% \author{^^A
+% Peter J. Heslin\\^^A
+% \texttt{p.j.heslin@dur.ac.uk}\\^^A
+% \texttt{https://github.com/pjheslin/ellipsis}}
%
% \maketitle
%
@@ -106,12 +160,12 @@
% consists in the fact that \LaTeX\ always adds it, regardless of what text
% follows.
%
-% This package implements a simple fix. It redefines the |\dots| and
-% |\textellipsis| commands so that they can look ahead at the next character and
-% change their behavior accordingly: if the next character is one of .,;:?! the
-% extra space is added, if not, no extra space is added (if you load a package
-% that makes any of these characters active, you may want to reload this list;
-% see the section below on see below on |\ellipsispunctuation| and
+% This package implements a simple fix. It redefines the commands |\dots| and
+% |\textellipsis| so that they can look ahead at the next character and change
+% their behavior accordingly: if the next character is one of \texttt{.,;:?!}
+% the extra space is added, if not, no extra space is added (if you load a
+% package that makes any of these characters active, you may want to reload
+% this list; see the section below on see below on |\ellipsispunctuation| and
% compatibility). This particular list of punctuation marks was not chosen
% arbitrarily: it includes all marks with a dot on the baseline (or a comma,
% which is like a dot with a tail). These marks produce a series of four dots
@@ -134,7 +188,7 @@
% own set of rules for the spacing before and after an ellipsis. The latter
% offers more flexibility, but also tends to prefer the Chicago/MLA style. The
% Chicago and MLA manuals are good guides for preparing a typescript that will
-% be typeset by someone else; but for fine typography, they are they wrong
+% be typeset by someone else; but for fine typography, they are the wrong
% authorities to follow.
%
% Traditional typographers firmly reject the Chicago style of setting ellipses,
@@ -145,12 +199,11 @@
%
% \DescribeMacro{chicago} If you nevertheless want or have to use the
% Chicago-style, widely spaced ellipsis with this package, you can pass it the
-% option |chicago|, like so: |\usepackage[chicago]{ellipsis}|. If, on the other
-% hand, you want to adhere to the full recommendations of the Chicago manual,
-% then you should probably use \textsf{lips} or \textsf{xellipsis} instead of
-% this package. \DescribeMacro{mla} \textsf{Ellipsis.sty} also has an |mla|
-% package option, modeled on the same feature of \textsf{lips.sty}, which
-% automatically puts square brackets around all ellipses.
+% package option |chicago|. \DescribeMacro{mla} There is also package option
+% |mla|, modeled on the same feature of \textsf{lips.sty}, which automatically
+% puts square brackets around all ellipses. If, on the other hand, you want to
+% adhere to the full recommendations of the Chicago manual, then you should
+% consider using \textsf{lips} or \textsf{xellipsis} instead of this package.
%
% In conclusion, the best solution to the problem of typesetting ellipses is not
% to use this package at all, but to use XeTeX. You can put the Unicode
@@ -158,8 +211,8 @@
% precomposed ellipsis glyph. If you use a professional-quality OpenType font,
% it will have an ellipsis glyph created by the type designer to fit with the
% typeface and with proper kerning for punctuation afterward. Not all fonts do
-% this, so make sure that the ellipsis character kerns properly with following
-% .,:;!?
+% this, so make sure that the ellipsis character kerns properly with
+% \texttt{.,;:?!} following.
%
% \section{Usage}
%
@@ -297,7 +350,7 @@
%
% \begin{macro}{\ellipsis@default}
% This is the LaTeX default definition, which is necessary to use
-% when punctuation such as .,:;!? follows.
+% when punctuation such as \texttt{.,;:?!} follows.
% \begin{macrocode}
\newcommand{\ellipsis@default}{%
\ellipsis@before
@@ -359,7 +412,7 @@
\fi}
% \end{macrocode}
%
-% Here is the macro that looks ahead at the next token, put it in
+% Here is the actual macro that looks ahead at the next token, stores it in
% \cs{ellipsis@token}, and invokes the code to scan for it in the
% punctuation list.
%
diff --git a/macros/latex/contrib/ellipsis/ellipsis.ins b/macros/latex/contrib/ellipsis/ellipsis.ins
deleted file mode 100644
index 34cc622656..0000000000
--- a/macros/latex/contrib/ellipsis/ellipsis.ins
+++ /dev/null
@@ -1,56 +0,0 @@
-%%
-%% Copyright (C) 2003 by Peter Heslin <p.j.heslin@dur.ac.uk>
-%%
-%% This file may be distributed and/or modified under the conditions of
-%% the LaTeX Project Public License, either version 1.2 of this license
-%% or (at your option) any later version. The latest version of this
-%% license is in:
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% and version 1.2 or later is part of all distributions of LaTeX version
-%% 1999/12/01 or later.
-%%
-
-\input docstrip.tex
-\keepsilent
-
-\usedir{tex/latex/ellipsis}
-
-\preamble
-
-This is a generated file.
-
-Copyright (C) 2003 by Peter Heslin <p.j.heslin@dur.ac.uk>
-
-This file may be distributed and/or modified under the conditions of
-the LaTeX Project Public License, either version 1.2 of this license
-or (at your option) any later version. The latest version of this
-license is in:
-
- http://www.latex-project.org/lppl.txt
-
-and version 1.2 or later is part of all distributions of LaTeX version
-1999/12/01 or later.
-
-\endpreamble
-
-\generate{\file{ellipsis.sty}{\from{ellipsis.dtx}{package}}}
-
-\obeyspaces
-\Msg{*************************************************************}
-\Msg{* *}
-\Msg{* To finish the installation you have to move the following *}
-\Msg{* file into a directory searched by TeX: *}
-\Msg{* *}
-\Msg{* ellipsis.sty *}
-\Msg{* *}
-\Msg{* To produce the documentation run the file ellipsis.dtx *}
-\Msg{* through LaTeX. *}
-\Msg{* *}
-\Msg{* Happy TeXing! *}
-\Msg{* *}
-\Msg{*************************************************************}
-
-\endbatchfile
-
diff --git a/macros/latex/contrib/ellipsis/ellipsis.pdf b/macros/latex/contrib/ellipsis/ellipsis.pdf
index 762e9cb36b..79ff974ed7 100644
--- a/macros/latex/contrib/ellipsis/ellipsis.pdf
+++ b/macros/latex/contrib/ellipsis/ellipsis.pdf
Binary files differ
diff --git a/macros/latex/contrib/erw-l3/README.md b/macros/latex/contrib/erw-l3/README.md
index a50f369134..5facff0f19 100644
--- a/macros/latex/contrib/erw-l3/README.md
+++ b/macros/latex/contrib/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/macros/latex/contrib/erw-l3/erw-l3.dtx b/macros/latex/contrib/erw-l3/erw-l3.dtx
index b538f3dd77..eb504d5bbb 100644
--- a/macros/latex/contrib/erw-l3/erw-l3.dtx
+++ b/macros/latex/contrib/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/macros/latex/contrib/erw-l3/erw-l3.pdf b/macros/latex/contrib/erw-l3/erw-l3.pdf
index bbcff81588..e8178b0dc4 100644
--- a/macros/latex/contrib/erw-l3/erw-l3.pdf
+++ b/macros/latex/contrib/erw-l3/erw-l3.pdf
Binary files differ
diff --git a/macros/latex/contrib/lion-msc/lion-msc.cls b/macros/latex/contrib/lion-msc/lion-msc.cls
index 629babad1f..a970d94d4b 100644
--- a/macros/latex/contrib/lion-msc/lion-msc.cls
+++ b/macros/latex/contrib/lion-msc/lion-msc.cls
@@ -16,8 +16,7 @@
% e-mail: dood@physics.leidenuniv.nl %
% telephone: +31-(0)71.527.5929 %
% %
-% Permission to copy all or part of this work is granted, provided %
-% that the copies are not made or distributed for resale. %
+% Permission to copy all or part of this work is granted. %
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -48,9 +47,9 @@
\typeout{}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{lion-msc}[2020/05/27 v0.29]
+\ProvidesClass{lion-msc}[2020/06/03 v0.30]
\typeout{}
-\typeout{Leiden Institute of Physics thesis class - version 0.29}
+\typeout{Leiden Institute of Physics thesis class - version 0.30}
\typeout{}
\typeout{Copyright (c) 2014-2020 Michiel de Dood}
\typeout{Please send questions, comments, additions, complaints to:}
diff --git a/macros/latex/contrib/pdftexcmds/README.md b/macros/latex/contrib/pdftexcmds/README.md
index 1079a2ccf2..ab86311304 100644
--- a/macros/latex/contrib/pdftexcmds/README.md
+++ b/macros/latex/contrib/pdftexcmds/README.md
@@ -1,11 +1,19 @@
# pdftexcmds
-pdftexcmds package for LaTeX
+Version: 2020-06-04 v0.32
+
+pdftexcmds package for LaTeX
+LuaTeX provides most of the commands of pdfTeX 1.40. However
+a number of utility functions are removed. This package tries to fill
+the gap and implements some of the missing primitive using Lua.
+Also provides similar wrappers for XeLaTeX and other engines that provide
+these primitives, under possibly different names.
+## Copyright (C)
+* 2007, 2009-2011 Heiko Oberdiek
+* 2016-2020 Oberdiek Package Support Group
- doc/latex/pdftexcmds/pdftexcmds.pdf
- scripts/pdftexcmds/pdftexcmds.lua
- source/latex/pdftexcmds/pdftexcmds.dtx
- tex/generic/pdftexcmds/pdftexcmds.sty
+## License
+LATEX Project Public License, version 1.3c or later.
diff --git a/macros/latex/contrib/pdftexcmds/pdftexcmds.dtx b/macros/latex/contrib/pdftexcmds/pdftexcmds.dtx
index c7002222ea..7e9de4e558 100644
--- a/macros/latex/contrib/pdftexcmds/pdftexcmds.dtx
+++ b/macros/latex/contrib/pdftexcmds/pdftexcmds.dtx
@@ -1,12 +1,12 @@
% \iffalse meta-comment
%
% File: pdftexcmds.dtx
-% Version: 2019/11/24 v0.31
+% Version: 2020-06-04 v0.32
% Info: Utility functions of pdfTeX for LuaTeX
%
% Copyright (C)
% 2007, 2009-2011 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -86,7 +86,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO)}
+\Msg{* Package: pdftexcmds 2020-06-04 v0.32 Utility functions of pdfTeX for LuaTeX (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -98,7 +98,7 @@
This is a generated file.
Project: pdftexcmds
-Version: 2019/11/24 v0.31
+Version: 2020-06-04 v0.32
Copyright (C)
2007, 2009-2011 Heiko Oberdiek
@@ -147,10 +147,6 @@ and the derived files
% \file{pdftexcmds-test2.tex}{\from{pdftexcmds.dtx}{test2}}%
% \file{pdftexcmds-test-shell.tex}{\from{pdftexcmds.dtx}{test-shell}}%
% \file{pdftexcmds-test-escape.tex}{\from{pdftexcmds.dtx}{test-escape}}%
- \nopreamble
- \nopostamble
-% \usedir{source/latex/pdftexcmds/catalogue}%
-% \file{pdftexcmds.xml}{\from{pdftexcmds.dtx}{catalogue}}%
}
\def\MetaPrefix{-- }
\def\defaultpostamble{%
@@ -200,7 +196,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{pdftexcmds.drv}%
- [2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO)]%
+ [2020-06-04 v0.32 Utility functions of pdfTeX for LuaTeX (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\usepackage{paralist}
@@ -219,26 +215,11 @@ and the derived files
% \fi
%
%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
%
% \GetFileInfo{pdftexcmds.drv}
%
% \title{The \xpackage{pdftexcmds} package}
-% \date{2019/11/24 v0.31}
+% \date{2020-06-04 v0.32}
% \author{Heiko Oberdiek\thanks
% {Please report any issues at \url{https://github.com/ho-tex/pdftexcmds/issues}}}
%
@@ -616,7 +597,7 @@ and the derived files
\fi
\expandafter\x\csname ver@pdftexcmds.sty\endcsname
\ProvidesPackage{pdftexcmds}%
- [2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO)]%
+ [2020-06-04 v0.32 Utility functions of pdfTeX for LuaTeX (HO)]%
% \end{macrocode}
%
% \subsection{Catcodes}
@@ -1156,7 +1137,7 @@ and the derived files
\fi
\fi
\begingroup
- \def\x{2019/11/24 v0.31}%
+ \def\x{2020-06-04 v0.32}%
\ltx@onelevel@sanitize\x
\edef\y{%
\pdftexcmds@directlua{%
@@ -1563,7 +1544,7 @@ local pdftexcmds = oberdiek.pdftexcmds or {}
oberdiek.pdftexcmds = pdftexcmds
local systemexitstatus
function pdftexcmds.getversion()
- tex.write("2019/11/24 v0.31")
+ tex.write("2020-06-04 v0.32")
end
% \end{macrocode}
%
@@ -1859,7 +1840,7 @@ function pdftexcmds.elapsedtime()
if val > 2147483647 then
val = 2147483647
end
- tex.write(string.format("%d", val))
+ tex.write(string.format("%d", math.floor(val)))
end
% \end{macrocode}
%
@@ -1952,389 +1933,7 @@ end
% \begin{macrocode}
%</lua>
% \end{macrocode}
-%
-% \section{Test}
-%
-% \subsection{Catcode checks for loading}
-%
-% \begin{macrocode}
-%<*test1>
-% \end{macrocode}
-% \begin{macrocode}
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\@=11 %
-\expandafter\ifx\csname count@\endcsname\relax
- \countdef\count@=255 %
-\fi
-\expandafter\ifx\csname @gobble\endcsname\relax
- \long\def\@gobble#1{}%
-\fi
-\expandafter\ifx\csname @firstofone\endcsname\relax
- \long\def\@firstofone#1{#1}%
-\fi
-\expandafter\ifx\csname loop\endcsname\relax
- \expandafter\@firstofone
-\else
- \expandafter\@gobble
-\fi
-{%
- \def\loop#1\repeat{%
- \def\body{#1}%
- \iterate
- }%
- \def\iterate{%
- \body
- \let\next\iterate
- \else
- \let\next\relax
- \fi
- \next
- }%
- \let\repeat=\fi
-}%
-\def\RestoreCatcodes{}
-\count@=0 %
-\loop
- \edef\RestoreCatcodes{%
- \RestoreCatcodes
- \catcode\the\count@=\the\catcode\count@\relax
- }%
-\ifnum\count@<255 %
- \advance\count@ 1 %
-\repeat
-
-\def\RangeCatcodeInvalid#1#2{%
- \count@=#1\relax
- \loop
- \catcode\count@=15 %
- \ifnum\count@<#2\relax
- \advance\count@ 1 %
- \repeat
-}
-\def\RangeCatcodeCheck#1#2#3{%
- \count@=#1\relax
- \loop
- \ifnum#3=\catcode\count@
- \else
- \errmessage{%
- Character \the\count@\space
- with wrong catcode \the\catcode\count@\space
- instead of \number#3%
- }%
- \fi
- \ifnum\count@<#2\relax
- \advance\count@ 1 %
- \repeat
-}
-\def\space{ }
-\expandafter\ifx\csname LoadCommand\endcsname\relax
- \def\LoadCommand{\input pdftexcmds.sty\relax}%
-\fi
-\def\Test{%
- \RangeCatcodeInvalid{0}{47}%
- \RangeCatcodeInvalid{58}{64}%
- \RangeCatcodeInvalid{91}{96}%
- \RangeCatcodeInvalid{123}{255}%
- \catcode`\@=12 %
- \catcode`\\=0 %
- \catcode`\%=14 %
- \LoadCommand
- \RangeCatcodeCheck{0}{36}{15}%
- \RangeCatcodeCheck{37}{37}{14}%
- \RangeCatcodeCheck{38}{47}{15}%
- \RangeCatcodeCheck{48}{57}{12}%
- \RangeCatcodeCheck{58}{63}{15}%
- \RangeCatcodeCheck{64}{64}{12}%
- \RangeCatcodeCheck{65}{90}{11}%
- \RangeCatcodeCheck{91}{91}{15}%
- \RangeCatcodeCheck{92}{92}{0}%
- \RangeCatcodeCheck{93}{96}{15}%
- \RangeCatcodeCheck{97}{122}{11}%
- \RangeCatcodeCheck{123}{255}{15}%
- \RestoreCatcodes
-}
-\Test
-\csname @@end\endcsname
-\end
-% \end{macrocode}
-% \begin{macrocode}
-%</test1>
-% \end{macrocode}
-%
-% \subsection{Test for \cs{pdf@isprimitive}}
-%
-% \begin{macrocode}
-%<*test2>
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\@=11 %
-\input pdftexcmds.sty\relax
-\def\msg#1{%
- \begingroup
- \escapechar=92 %
- \immediate\write16{#1}%
- \endgroup
-}
-\long\def\test#1#2#3#4{%
- \begingroup
- #4%
- \def\str{%
- Test \string\pdf@isprimitive
- {\string #1}{\string #2}{...}: %
- }%
- \pdf@isprimitive{#1}{#2}{%
- \ifx#3Y%
- \msg{\str true ==> OK.}%
- \else
- \errmessage{\str false ==> FAILED}%
- \fi
- }{%
- \ifx#3Y%
- \errmessage{\str true ==> FAILED}%
- \else
- \msg{\str false ==> OK.}%
- \fi
- }%
- \endgroup
-}
-\test\relax\relax Y{}
-\test\foobar\relax Y{\let\foobar\relax}
-\test\foobar\relax N{}
-\test\hbox\hbox Y{}
-\test\foobar@hbox\hbox Y{\let\foobar@hbox\hbox}
-\test\if\if Y{}
-\test\if\ifx N{}
-\test\ifx\if N{}
-\test\par\par Y{}
-\test\hbox\par N{}
-\test\par\hbox N{}
-\csname @@end\endcsname\end
-%</test2>
-% \end{macrocode}
-%
-% \subsection{Test for \cs{pdf@shellescape}}
-%
-% \begin{macrocode}
-%<*test-shell>
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\@=11 %
-\input pdftexcmds.sty\relax
-\def\msg#{\immediate\write16}
-\def\MaybeEnd{}
-\ifx\luatexversion\UnDeFiNeD
-\else
- \ifnum\luatexversion<68 %
- \ifx\pdf@shellescape\@undefined
- \msg{SHELL=U}%
- \msg{OK (LuaTeX < 0.68)}%
- \else
- \msg{SHELL=defined}%
- \errmessage{Failed (LuaTeX < 0.68)}%
- \fi
- \def\MaybeEnd{\csname @@end\endcsname\end}%
- \fi
-\fi
-\MaybeEnd
-\ifx\pdf@shellescape\@undefined
- \msg{SHELL=U}%
-\else
- \msg{SHELL=\number\pdf@shellescape}%
-\fi
-\ifx\expected\@undefined
-\else
- \ifx\expected\relax
- \msg{EXPECTED=U}%
- \ifx\pdf@shellescape\@undefined
- \msg{OK}%
- \else
- \errmessage{Failed}%
- \fi
- \else
- \msg{EXPECTED=\number\expected}%
- \ifnum\pdf@shellescape=\expected\relax
- \msg{OK}%
- \else
- \errmessage{Failed}%
- \fi
- \fi
-\fi
-\csname @@end\endcsname\end
-%</test-shell>
-% \end{macrocode}
-%
-% \subsection{Test for escape functions}
-%
-% \begin{macrocode}
-%<*test-escape>
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\^=7 %
-\catcode`\@=11 %
-\errorcontextlines=1000 %
-\input pdftexcmds.sty\relax
-\def\msg#1{%
- \begingroup
- \escapechar=92 %
- \immediate\write16{#1}%
- \endgroup
-}
-% \end{macrocode}
-% \begin{macrocode}
-\begingroup
- \catcode`\@=11 %
- \countdef\count@=255 %
- \def\space{ }%
- \long\def\@whilenum#1\do #2{%
- \ifnum #1\relax
- #2\relax
- \@iwhilenum{#1\relax#2\relax}%
- \fi
- }%
- \long\def\@iwhilenum#1{%
- \ifnum #1%
- \expandafter\@iwhilenum
- \else
- \expandafter\ltx@gobble
- \fi
- {#1}%
- }%
- \gdef\AllBytes{}%
- \count@=0 %
- \catcode0=12 %
- \@whilenum\count@<256 \do{%
- \lccode0=\count@
- \ifnum\count@=32 %
- \xdef\AllBytes{\AllBytes\space}%
- \else
- \lowercase{%
- \xdef\AllBytes{\AllBytes^^@}%
- }%
- \fi
- \advance\count@ by 1 %
- }%
-\endgroup
-% \end{macrocode}
-% \begin{macrocode}
-\def\AllBytesHex{%
- 000102030405060708090A0B0C0D0E0F%
- 101112131415161718191A1B1C1D1E1F%
- 202122232425262728292A2B2C2D2E2F%
- 303132333435363738393A3B3C3D3E3F%
- 404142434445464748494A4B4C4D4E4F%
- 505152535455565758595A5B5C5D5E5F%
- 606162636465666768696A6B6C6D6E6F%
- 707172737475767778797A7B7C7D7E7F%
- 808182838485868788898A8B8C8D8E8F%
- 909192939495969798999A9B9C9D9E9F%
- A0A1A2A3A4A5A6A7A8A9AAABACADAEAF%
- B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF%
- C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF%
- D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF%
- E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF%
- F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF%
-}
-\ltx@onelevel@sanitize\AllBytesHex
-\expandafter\lowercase\expandafter{%
- \expandafter\def\expandafter\AllBytesHexLC
- \expandafter{\AllBytesHex}%
-}
-\begingroup
- \catcode`\#=12 %
- \xdef\AllBytesName{%
- #01#02#03#04#05#06#07#08#09#0A#0B#0C#0D#0E#0F%
- #10#11#12#13#14#15#16#17#18#19#1A#1B#1C#1D#1E#1F%
- #20!"#23$#25&'#28#29*+,-.#2F%
- 0123456789:;#3C=#3E?%
- @ABCDEFGHIJKLMNO%
- PQRSTUVWXYZ#5B\ltx@backslashchar#5D^_%
- `abcdefghijklmno%
- pqrstuvwxyz#7B|#7D\string~#7F%
- #80#81#82#83#84#85#86#87#88#89#8A#8B#8C#8D#8E#8F%
- #90#91#92#93#94#95#96#97#98#99#9A#9B#9C#9D#9E#9F%
- #A0#A1#A2#A3#A4#A5#A6#A7#A8#A9#AA#AB#AC#AD#AE#AF%
- #B0#B1#B2#B3#B4#B5#B6#B7#B8#B9#BA#BB#BC#BD#BE#BF%
- #C0#C1#C2#C3#C4#C5#C6#C7#C8#C9#CA#CB#CC#CD#CE#CF%
- #D0#D1#D2#D3#D4#D5#D6#D7#D8#D9#DA#DB#DC#DD#DE#DF%
- #E0#E1#E2#E3#E4#E5#E6#E7#E8#E9#EA#EB#EC#ED#EE#EF%
- #F0#F1#F2#F3#F4#F5#F6#F7#F8#F9#FA#FB#FC#FD#FE#FF%
- }%
-\endgroup
-\ltx@onelevel@sanitize\AllBytesName
-\edef\AllBytesFromName{\expandafter\ltx@gobble\AllBytes}
-\begingroup
- \def\|{|}%
- \edef\%{\ltx@percentchar}%
- \catcode`\|=0 %
- \catcode`\#=12 %
- \catcode`\~=12 %
- \catcode`\\=12 %
- |xdef|AllBytesString{%
- \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017%
- \020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037%
- \040!"#$|%&'\(\)*+,-./%
- 0123456789:;<=>?%
- @ABCDEFGHIJKLMNO%
- PQRSTUVWXYZ[\\]^_%
- `abcdefghijklmno%
- pqrstuvwxyz{||}~\177%
- \200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217%
- \220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237%
- \240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257%
- \260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277%
- \300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317%
- \320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337%
- \340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357%
- \360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377%
- }%
-|endgroup
-\ltx@onelevel@sanitize\AllBytesString
-% \end{macrocode}
-% \begin{macrocode}
-\def\Test#1#2#3{%
- \begingroup
- \expandafter\expandafter\expandafter\def
- \expandafter\expandafter\expandafter\TestResult
- \expandafter\expandafter\expandafter{%
- #1{#2}%
- }%
- \ifx\TestResult#3%
- \else
- \newlinechar=10 %
- \msg{Expect:^^J#3}%
- \msg{Result:^^J\TestResult}%
- \errmessage{\string#2 -\string#1-> \string#3}%
- \fi
- \endgroup
-}
-\def\test#1#2#3{%
- \edef\TestFrom{#2}%
- \edef\TestExpect{#3}%
- \ltx@onelevel@sanitize\TestExpect
- \Test#1\TestFrom\TestExpect
-}
-\test\pdf@unescapehex{74657374}{test}
-\begingroup
- \catcode0=12 %
- \catcode1=12 %
- \test\pdf@unescapehex{740074017400740174}{t^^@t^^At^^@t^^At}%
-\endgroup
-\Test\pdf@escapehex\AllBytes\AllBytesHex
-\Test\pdf@unescapehex\AllBytesHex\AllBytes
-\Test\pdf@escapename\AllBytes\AllBytesName
-\Test\pdf@escapestring\AllBytes\AllBytesString
-% \end{macrocode}
-% \begin{macrocode}
-\csname @@end\endcsname\end
-%</test-escape>
-% \end{macrocode}
-%
-% \section{Installation}
+%% \section{Installation}
%
% \subsection{Download}
%
@@ -2354,7 +1953,7 @@ end
% \item[\CTANinstall{install/macros/latex/contrib/pdftexcmds.tds.zip}]
% \end{description}
% \emph{TDS} refers to the standard ``A Directory Structure
-% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories
+% for \TeX\ Files'' (\CTANpkg{tds}). Directories
% with \xfile{texmf} in their name are usually organized this way.
%
% \subsection{Bundle installation}
@@ -2457,8 +2056,8 @@ end
% \subsection{Refresh file name databases}
%
% If your \TeX~distribution
-% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh
-% these. For example, \teTeX\ users run \verb|texhash| or
+% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \TeX\,Live\ users run \verb|texhash| or
% \verb|mktexlsr|.
%
% \subsection{Some details for the interested}
@@ -2654,6 +2253,9 @@ end
% the same as in \hologo{pdfTeX} in the 8bit
% range and not drop all non ascii characters.
% \end{Version}
+% \begin{Version}{2020-06-04 v0.32}
+% \item Updated pdftexcmds.elapsedtime to lua 5.3 (issue 4).
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/macros/latex/contrib/pdftexcmds/pdftexcmds.pdf b/macros/latex/contrib/pdftexcmds/pdftexcmds.pdf
index 3de8102fc2..b75aed4a3a 100644
--- a/macros/latex/contrib/pdftexcmds/pdftexcmds.pdf
+++ b/macros/latex/contrib/pdftexcmds/pdftexcmds.pdf
Binary files differ
diff --git a/macros/xetex/latex/xepersian-hm/INSTALL.txt b/macros/xetex/latex/xepersian-hm/INSTALL.txt
index 340d9819aa..6c4c2415e9 100644
--- a/macros/xetex/latex/xepersian-hm/INSTALL.txt
+++ b/macros/xetex/latex/xepersian-hm/INSTALL.txt
@@ -1,7 +1,7 @@
xepersian-hm -- INSTALL
======================
- Source: xepersian-hm.dtx ( 2020/05/11 v0.5e)
+ Source: xepersian-hm.dtx (2020-06-04 v1.0b)
Author: Hossein Movahhedian
Info: filecontents + macro + verbatim
License: LPPL 1.3c
diff --git a/macros/xetex/latex/xepersian-hm/kashida-glyph-example.pdf b/macros/xetex/latex/xepersian-hm/kashida-glyph-example.pdf
index 8ea503d221..144600ad08 100644
--- a/macros/xetex/latex/xepersian-hm/kashida-glyph-example.pdf
+++ b/macros/xetex/latex/xepersian-hm/kashida-glyph-example.pdf
Binary files differ
diff --git a/macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.pdf b/macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.pdf
index 6f4530ae89..49280769e0 100644
--- a/macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.pdf
+++ b/macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.pdf
Binary files differ
diff --git a/macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.tex b/macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.tex
index bad9ac6a55..41ecd9f013 100644
--- a/macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.tex
+++ b/macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.tex
@@ -5,6 +5,7 @@
% \textheight=620pt
% \usepackage[Kashida]{xepersian} % Fails
% \usepackage{xepersian-hm} % Succeeds
+% \usepackage[Kashida=On,kashidastretch=0.14 em plus 0.5 em]{xepersian-hm} % Succeeds
\usepackage[Kashida=leaders+glyph,kashidastretch=0.14 em plus 0.5 em]{xepersian-hm} % Succeeds
% \usepackage[Kashida=hrule,kashidastretch=0.14 em plus 5.5 em]{xepersian-hm} % Succeeds
% \usepackage[Kashida=glyph,linebreakpenalty=8,kashidastretch=0.14 em plus 5.5 em]{xepersian-hm} % Succeeds
@@ -60,7 +61,7 @@
\begin{latin}
\begin{center}
-\Huge\textsf{xepersian-hm}\vspace{20pt}\\ Example of Use\vspace{20pt}\\ \texttt{Kashida=hrule} \vspace{40pt}
+\Huge\textsf{xepersian-hm}\vspace{20pt}\\ Example of Use\vspace{20pt}\\ \texttt{Kashida=leaders+glyph} \vspace{40pt}
{\Large
\begin{tabular}{ll}
diff --git a/macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.pdf b/macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.pdf
index 51f7f1b024..e7a50aa897 100644
--- a/macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.pdf
+++ b/macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.pdf
Binary files differ
diff --git a/macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.tex b/macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.tex
index 0045ebe69e..ea0f19e1e4 100644
--- a/macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.tex
+++ b/macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.tex
@@ -60,7 +60,7 @@
\begin{latin}
\begin{center}
-\Huge\textsf{xepersian-hm}\vspace{20pt}\\ Example of Use\vspace{20pt}\\ \texttt{Kashida=hrule} \vspace{40pt}
+\Huge\textsf{xepersian-hm}\vspace{20pt}\\ Example of Use\vspace{20pt}\\ \texttt{Kashida=leaders+hrule} \vspace{40pt}
{\Large
\begin{tabular}{ll}
diff --git a/macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.pdf b/macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.pdf
index 098cef1e4f..9e233e6ab7 100644
--- a/macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.pdf
+++ b/macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.pdf
Binary files differ
diff --git a/macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.tex b/macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.tex
index 6e5b13ef8b..ad9f193239 100644
--- a/macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.tex
+++ b/macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.tex
@@ -23,7 +23,7 @@
\begin{latin}
\begin{center}
-\Huge\textsf{xepersian}\vspace{20pt}\\ Example of Use\vspace{20pt}\\ \texttt{Kashida=hrule} \vspace{40pt}
+\Huge\textsf{xepersian}\vspace{20pt}\\ Example of Use\vspace{20pt}\\ \texttt{Kashida=On} \vspace{40pt}
{\Large
\begin{tabular}{ll}
diff --git a/macros/xetex/latex/xepersian-hm/xepersian-hm-doc.ltx b/macros/xetex/latex/xepersian-hm/xepersian-hm-doc.ltx
index 535b6dedd4..e2c64b3073 100644
--- a/macros/xetex/latex/xepersian-hm/xepersian-hm-doc.ltx
+++ b/macros/xetex/latex/xepersian-hm/xepersian-hm-doc.ltx
@@ -27,7 +27,7 @@
}
}
-\date{Released \quad 2020-05-31 \quad v1.0a}
+\date{Released \quad 2020-06-04 \quad v1.0b}
\let\tmpthepage\thepage
\renewcommand{\thepage}{\lr{\Large\textbf\tmpthepage}}
@@ -187,6 +187,12 @@ The options available in \textsf{xepersian-hm} are:
\item \texttt{leaders+hrule}: \\
which uses horizontal rule (\verb|\hrule|) leaders to stretch the text.
+ \item \texttt{Off}: \\
+ which disables kashida feature.
+
+ \item \texttt{On}: \\
+ which is the same as \texttt{leaders+glyph}.
+
\end{itemize}
Also, please note that the value of \texttt{Kashida} is mandatory.
For example \texttt{Kashida=glyph} inserts a stretched \texttt{kashida} glyph
diff --git a/macros/xetex/latex/xepersian-hm/xepersian-hm-doc.pdf b/macros/xetex/latex/xepersian-hm/xepersian-hm-doc.pdf
index 9df6063331..5c0adbb357 100644
--- a/macros/xetex/latex/xepersian-hm/xepersian-hm-doc.pdf
+++ b/macros/xetex/latex/xepersian-hm/xepersian-hm-doc.pdf
Binary files differ
diff --git a/macros/xetex/latex/xepersian-hm/xepersian-hm.dtx b/macros/xetex/latex/xepersian-hm/xepersian-hm.dtx
index 0daba1b3e0..8628fb08cc 100644
--- a/macros/xetex/latex/xepersian-hm/xepersian-hm.dtx
+++ b/macros/xetex/latex/xepersian-hm/xepersian-hm.dtx
@@ -67,7 +67,7 @@ make time to fix.
% }^^A
% }
%
-% \date{Released \quad 2020-05-31 \quad v1.0a}
+% \date{Released \quad 2020-06-04 \quad v1.0b}
%
% \maketitle
%
@@ -96,7 +96,7 @@ make time to fix.
\RequirePackage{zref-savepos}[2020-03-03]
\RequirePackage{xepersian}
\ExplSyntaxOn
-\ProvidesExplPackage {xepersian-hm} {2020-05-31} {1.0a} { Fixes~issues~in~xepersian~package }
+\ProvidesExplPackage {xepersian-hm} {2020-06-04} {1.0b} { Fixes~issues~in~xepersian~package }
\box_new:N \l_xephm_ksh_box
@@ -151,6 +151,8 @@ make time to fix.
\tl_set:Nn \l_xephm_stretch_glyph_tl { glyph }
\tl_set:Nn \l_xephm_stretch_leaders_glyph_tl { leaders+glyph }
\tl_set:Nn \l_xephm_stretch_leaders_hrule_tl { leaders+hrule }
+\tl_set:Nn \l_xephm_stretch_off_tl { Off }
+\tl_set:Nn \l_xephm_stretch_on_tl { On }
\tl_set:Nn \l_xephm_fnt_kayhan_tl { kayhan }
\tl_set:Nn \l_xephm_fnt_kayhannavaar_tl { kayhannavaar }
@@ -268,18 +270,30 @@ make time to fix.
\msg_error:nnx { xepersian-hm } { error-kashida-character-is-not-available-in-the-main-font } { \l_xephm_main_font_name_tl }
}
}
+ \bool_set_true:N \l_xephm_kashida_hm_fix_bool
}
\l_xephm_stretch_leaders_glyph_tl
{
\tl_set:Nx \l_xephm_gap_filler_tl { \l_xephm_stretch_leaders_glyph_tl }
+ \bool_set_true:N \l_xephm_kashida_hm_fix_bool
}
\l_xephm_stretch_leaders_hrule_tl
{
\tl_set:Nx \l_xephm_gap_filler_tl { \l_xephm_stretch_leaders_hrule_tl }
+ \bool_set_true:N \l_xephm_kashida_hm_fix_bool
+ }
+ \l_xephm_stretch_off_tl
+ {
+ \tl_set:Nx \l_xephm_gap_filler_tl { \l_xephm_stretch_off_tl }
+ \bool_set_false:N \l_xephm_kashida_hm_fix_bool
+ }
+ \l_xephm_stretch_on_tl
+ {
+ \tl_set:Nx \l_xephm_gap_filler_tl { \l_xephm_stretch_leaders_glyph_tl }
+ \bool_set_true:N \l_xephm_kashida_hm_fix_bool
}
} { } { \tl_set:Nx \l_xephm_gap_filler_tl { #1 } }
\tl_if_empty:NT \l_xephm_gap_filler_tl { \msg_error:nn { xepersian-hm } { error-specify-value-for-kashida-option } }
- \bool_set_true:N \l_xephm_kashida_hm_fix_bool
} ,
linebreakpenalty .code:n =
@@ -353,7 +367,6 @@ make time to fix.
\bool_set_true:N \l_xephm_ligature_bool
} ,
ligatures .default:n = \tl_set:Nn \l_xephm_active_ligs_tl { \l_xephm_lig_default_tl } ,
-
}
\ProcessKeysOptions { xepersian-hm }
@@ -372,7 +385,7 @@ make time to fix.
% \begin{macrocode}
%<*kashida-xepersian-hm-def>
\ExplSyntaxOn
-\ProvidesExplFile {kashida-xepersian-hm.def} {2020-05-31} {1.0a} { Fixes~implementation~of~Kashida~in~xepersian~package }
+\ProvidesExplFile {kashida-xepersian-hm.def} {2020-06-04} {1.0b} { Fixes~implementation~of~Kashida~in~xepersian~package }
\newXeTeXintercharclass \c_xephm_d_charclass % dual-joiner class
\newXeTeXintercharclass \c_xephm_l_charclass % lam
@@ -429,7 +442,7 @@ make time to fix.
{ \skip_horizontal:N \l_tmpa_skip \tex_ignorespaces:D }
\fi:
}
-
+
\NewDocumentCommand { \discouragebadlinebreaks } { O{\l_xephm_line_break_penalty_int} O{\c_xephm_skip_b_tl} m }
{
\IfNoValueF {#1}
@@ -438,7 +451,7 @@ make time to fix.
{ \tl_set:Nn \l_xephm_skip_default_tl {#2} }
\xephm_put_line_breaks:n { #3 }
}
-
+
\cs_new_protected:Nn \xephm_put_line_breaks:n
{
\tl_set:Nn \l_xephm_line_break_tl { #1 }
@@ -498,7 +511,7 @@ make time to fix.
{
\bool_if:NT \l_xephm_kashida_hm_fix_bool
{
- \tl_if_eq:NNTF \l_xephm_gap_filler_tl \l_xephm_stretch_leaders_glyph_tl
+ \tl_if_eq:NNTF \l_xephm_gap_filler_tl \l_xephm_stretch_leaders_glyph_tl
{
\tl_set:Nx \l_xephm_font_full_tl { \tex_fontname:D \tex_the:D \tex_font:D }
\tl_set:Nx \l_xephm_font_name_tl { \l_xephm_font_full_tl }
@@ -636,7 +649,10 @@ make time to fix.
\makeatletter
\newif\if@Kashida@on
-\newif\if@Kashida@XB@fix
+%% Becuase Vafa Khalighi has copied the above code (injecting the character uni+200E) in xepersian-23.0
+%% (https://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/xelatex/xepersian/kashida-xepersian.def?revision=55165&view=co),
+%% the following line of code is not needed in xepersian anymore.
+%% % \newif\if@Kashida@XB@fix
\makeatother
\endinput
diff --git a/macros/xetex/latex/xepersian-hm/xepersian-hm.pdf b/macros/xetex/latex/xepersian-hm/xepersian-hm.pdf
index 610320c3e8..60f34fde89 100644
--- a/macros/xetex/latex/xepersian-hm/xepersian-hm.pdf
+++ b/macros/xetex/latex/xepersian-hm/xepersian-hm.pdf
Binary files differ