texlive[67026] Master/texmf-dist: l3kernel (5may23)
commits+karl at tug.org
commits+karl at tug.org
Fri May 5 23:23:27 CEST 2023
Revision: 67026
http://tug.org/svn/texlive?view=revision&revision=67026
Author: karl
Date: 2023-05-05 23:23:26 +0200 (Fri, 05 May 2023)
Log Message:
-----------
l3kernel (5may23)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
trunk/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md 2023-05-05 21:23:26 UTC (rev 67026)
@@ -7,6 +7,44 @@
## [Unreleased]
+## [2023-05-05]
+
+### Added
+- `\bool_case:n(TF)` (renamed from `\bool_case_true:n(TF)`)
+- `\flag_ensure_raised:n` (renamed from `\flag_raise_if_clear:n`)
+- `\iow_wrap_allow_break:` (renamed from `\iow_allow_break:`)
+
+### Changed
+- Moved to stable status:
+ - `\bool_(g)set_inverse:N`
+ - `\c_catcode_active_space_tl`
+ - `\c_sys_engine_version_str`
+ - `\exp_args_generate:n`
+ - `\fp_if_nan:n(TF)`
+ - `\ior_get_term:nN` and `\ior_str_get_term:nN`
+ - `\ior_shell_open:Nn`
+ - `\msg_show_item:n`, `\msg_show_item_unbraced:n`,
+ `\msg_show_item:nn`, `\msg_show_item_unbraced:nn`
+- Require random number support from engine
+
+### Removed
+- Experimental functions from `l3candidates`:
+ - `\bool_case_false:n(TF)`
+ - `\intarray_gset_rand:Nn(n)`
+ - `\intarray_to_clist:N`
+ - `\peek_catcode_collect_inline:Nn`, `\peek_charcode_collect_inline:Nn` and
+ `\peek_meaning_collect_inline:Nn`
+ - `\prop_rand_key_value:N`
+ - `\seq_set_from_function:Nnn` and `\seq_set_from_inline_x:Nnn`
+ - `\sys_if_rand_exist:(TF)`
+ - `\tl_range_braced:Nnn` and `\tl_range_unbraced:Nnn`
+- Experimental functions now renamed
+ - `\bool_case_true:n(TF)` (now `\bool_case:n(TF)`)
+ - `\flag_raise_if_clear:n` (now `\flag_raise_if_clear:n`)
+ - `\iow_allow_break:` (now `\iow_wrap_allow_break:`)
+- Experimental functions moved to kernel-internal:
+ - `\msg_log_eval:Nn` and `\msg_show_eval:Nn`
+
## [2023-04-20]
### Changed
@@ -1345,7 +1383,8 @@
- Step functions have been added for dim variables,
e.g. `\dim_step_inline:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2023-04-20...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-05-05...HEAD
+[2023-05-05]: https://github.com/latex3/latex3/compare/2023-04-20...2023-05-05
[2023-04-20]: https://github.com/latex3/latex3/compare/2023-04-19...2023-04-20
[2023-04-19]: https://github.com/latex3/latex3/compare/2023-03-30...2023-04-19
[2023-03-30]: https://github.com/latex3/latex3/compare/2023-02-22...2023-03-30
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md 2023-05-05 21:23:26 UTC (rev 67026)
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2023-04-20
+Release 2023-05-05
Overview
--------
@@ -21,9 +21,6 @@
very minor when compared to the scope of `l3kernel`. In particular, no functions
will be removed, although some may be deprecated.
-Programmers making use of `l3kernel` are *strongly* encouraged to subscribe to
-the LaTeX-L mailing list (see below): announcements concerning the deprecation
-or modification of functions are made on the list.
Requirements
------------
@@ -77,21 +74,6 @@
The existence of the primitive `\Umathcode` is used as the marker for Unicode
support.
-Discussion
-----------
-
-Discussion concerning the approach, suggestions for improvements,
-changes, additions, _etc._ should be addressed to the list
-[LaTeX-L](https://listserv.uni-heidelberg.de/cgi-bin/wa?A0=LATEX-L).
-
-You can subscribe to this list by sending mail to
-
- listserv at urz.uni-heidelberg.de
-
-with the body containing
-
- subscribe LATEX-L <Your-First-Name> <Your-Second-Name>
-
Issues
------
@@ -98,9 +80,6 @@
The issue tracker for LaTeX3 is currently located
[on GitHub](https://github.com/latex3/latex3/issues).
-Please report specific issues with LaTeX3 code there; more general
-discussion should be directed to the [LaTeX-L list](#Discussion).
-
The LaTeX Project
------------------
@@ -108,8 +87,7 @@
[The LaTeX Project](https://www.latex-project.org/latex3/).
The development team can be contacted
-by e-mail: <latex-team at latex-project.org>; for general LaTeX3 discussion
-the [LaTeX-L list](#Discussion) should be used.
+by e-mail: <latex-team at latex-project.org>.
-----
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex 2023-05-05 21:23:26 UTC (rev 67026)
@@ -62,7 +62,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
\pagenumbering{roman}
\maketitle
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex 2023-05-05 21:23:26 UTC (rev 67026)
@@ -32,7 +32,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
\begin{document}
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex 2023-05-05 21:23:26 UTC (rev 67026)
@@ -32,7 +32,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
\newcommand{\TF}{\textit{(TF)}}
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex 2023-05-05 21:23:26 UTC (rev 67026)
@@ -32,7 +32,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
\newcommand{\TF}{\textit{(TF)}}
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex 2023-05-05 21:23:26 UTC (rev 67026)
@@ -53,7 +53,7 @@
{latex-team at latex-project.org}%
}%
}
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
\pagenumbering{roman}
\maketitle
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -84,221 +84,6 @@
% into the kernel. However, real use sometimes leads to better ideas, so functions from this module are
% \textbf{not necessarily stable} and we may have to adjust them!
%
-% \section{Additions to \pkg{l3expan}}
-%
-% \begin{function}[added = 2018-04-04, updated = 2019-02-08]
-% {\exp_args_generate:n}
-% \begin{syntax}
-% \cs{exp_args_generate:n} \Arg{variant argument specifiers}
-% \end{syntax}
-% Defines \cs[no-index]{exp_args:N\meta{variant}} functions for each
-% \meta{variant} given in the comma list \Arg{variant argument
-% specifiers}. Each \meta{variant} should consist of the letters |N|,
-% |c|, |n|, |V|, |v|, |o|, |f|, |e|, |x|, |p| and the resulting function is
-% protected if the letter |x| appears in the \meta{variant}. This is
-% only useful for cases where \cs{cs_generate_variant:Nn} is not
-% applicable.
-% \end{function}
-%
-% \section{Additions to \pkg{l3fp}}
-%
-% \begin{function}[pTF, added = 2019-08-25]{\fp_if_nan:n}
-% \begin{syntax}
-% \cs{fp_if_nan:n} \Arg{fp expr}
-% \end{syntax}
-% Evaluates the \meta{fp expr} and tests whether the result is exactly
-% \nan{}. The test returns \texttt{false} for any other result, even
-% a tuple containing \nan{}.
-% \end{function}
-%
-% \section{Additions to \pkg{l3file}}
-%
-% \begin{function}[added = 2018-12-29]{\iow_allow_break:}
-% \begin{syntax}
-% \cs{iow_allow_break:}
-% \end{syntax}
-% In the first argument of \cs{iow_wrap:nnnN} (for instance in
-% messages), inserts a break-point that allows a line break.
-% In other words this is a zero-width breaking space.
-% \end{function}
-%
-% \begin{function}[added = 2019-03-23]{\ior_get_term:nN, \ior_str_get_term:nN}
-% \begin{syntax}
-% \cs{ior_get_term:nN} \meta{prompt} \meta{token list variable}
-% \end{syntax}
-% Function that reads one or more lines (until an equal number of left
-% and right braces are found) from the terminal and stores
-% the result locally in the \meta{token list} variable. Tokenization
-% occurs as described for \cs{ior_get:NN} or \cs{ior_str_get:NN}, respectively.
-% When the \meta{prompt}
-% is empty, \TeX{} will wait for input without any other indication:
-% typically the programmer will have provided a suitable text using
-% e.g.~\cs{iow_term:n}. Where the \meta{prompt} is given, it will appear
-% in the terminal followed by an |=|, e.g.
-% \begin{verbatim}
-% prompt=
-% \end{verbatim}
-% \end{function}
-%
-% \begin{function}[added = 2019-05-08]{\ior_shell_open:Nn}
-% \begin{syntax}
-% \cs{ior_shell_open:Nn} \meta{stream} \Arg{shell~command}
-% \end{syntax}
-% Opens the \emph{pseudo}-file created by the output of the
-% \meta{shell command} for reading using \meta{stream} as the
-% control sequence for access. If the \meta{stream} was already
-% open it is closed before the new operation begins. The
-% \meta{stream} is available for access immediately and will remain
-% allocated to \meta{shell command} until a \cs{ior_close:N} instruction
-% is given or the \TeX{} run ends.
-% If piped system calls are disabled an error is raised.
-%
-% For details of handling of the \meta{shell command}, see
-% \cs{sys_get_shell:nnNTF}.
-% \end{function}
-%
-% \section{Additions to \pkg{l3flag}}
-%
-% \begin{function}[EXP, added = 2018-04-02]{\flag_raise_if_clear:n}
-% \begin{syntax}
-% \cs{flag_raise_if_clear:n} \Arg{flag name}
-% \end{syntax}
-% Ensures the \meta{flag} is raised by making its height at least~$1$,
-% locally.
-% \end{function}
-%
-% \section{Additions to \pkg{l3intarray}}
-%
-% \begin{function}[added = 2018-05-05]
-% {
-% \intarray_gset_rand:Nnn, \intarray_gset_rand:cnn,
-% \intarray_gset_rand:Nn, \intarray_gset_rand:cn
-% }
-% \begin{syntax}
-% \cs{intarray_gset_rand:Nnn} \meta{intarray~var} \Arg{minimum} \Arg{maximum}
-% \cs{intarray_gset_rand:Nn} \meta{intarray~var} \Arg{maximum}
-% \end{syntax}
-% Evaluates the integer expressions \meta{minimum} and \meta{maximum}
-% then sets each entry (independently) of the \meta{integer array
-% variable} to a pseudo-random number between the two (with bounds
-% included). If the absolute value of either bound is bigger than
-% $2^{30}-1$, an error occurs. Entries are generated in the same way
-% as repeated calls to \cs{int_rand:nn} or \cs{int_rand:n}
-% respectively, in particular for the second function the
-% \meta{minimum} is $1$.
-% Assignments are always global.
-% This is not available in older versions of \XeTeX{}.
-% \end{function}
-%
-% \begin{function}[added = 2018-05-04, rEXP]{\intarray_to_clist:N}
-% \begin{syntax}
-% \cs{intarray_to_clist:N} \meta{intarray~var}
-% \end{syntax}
-% Converts the \meta{intarray} to integer denotations separated by
-% commas. All tokens have category code other. If the
-% \meta{intarray} has no entry the result is empty; otherwise the
-% result has one fewer comma than the number of items.
-% \end{function}
-%
-% \section{Additions to \pkg{l3msg}}
-%
-% \begin{function}[added = 2017-12-04]{\msg_show_eval:Nn, \msg_log_eval:Nn}
-% \begin{syntax}
-% \cs{msg_show_eval:Nn} \meta{function} \Arg{expression}
-% \end{syntax}
-% Shows or logs the \meta{expression} (turned into a string), an equal
-% sign, and the result of applying the \meta{function} to the
-% \Arg{expression} (with \texttt{f}-expansion). For instance, if the
-% \meta{function} is \cs{int_eval:n} and the \meta{expression} is
-% |1+2| then this logs |> 1+2=3.|
-% \end{function}
-%
-% \begin{function}[EXP, added = 2017-12-04]
-% {\msg_show_item:n, \msg_show_item_unbraced:n, \msg_show_item:nn, \msg_show_item_unbraced:nn}
-% \begin{syntax}
-% \cs{seq_map_function:NN} \meta{seq} \cs{msg_show_item:n}
-% \cs{prop_map_function:NN} \meta{prop} \cs{msg_show_item:nn}
-% \end{syntax}
-% Used in the text of messages for \cs{msg_show:nnxxxx} to show or log
-% a list of items or key--value pairs. The one-argument functions are
-% used for sequences, clist or token lists and the others for property
-% lists. These functions turn their arguments to strings.
-% \end{function}
-%
-% \section{Additions to \pkg{l3prg}}
-%
-% \begin{function}[added = 2018-05-10]
-% {
-% \bool_set_inverse:N , \bool_set_inverse:c ,
-% \bool_gset_inverse:N, \bool_gset_inverse:c
-% }
-% \begin{syntax}
-% \cs{bool_set_inverse:N} \meta{boolean}
-% \end{syntax}
-% Toggles the \meta{boolean} from \texttt{true} to \texttt{false} and
-% conversely: sets it to the inverse of its current value.
-% \end{function}
-%
-% \begin{function}[added = 2019-02-10, EXP, noTF]
-% {\bool_case_true:n, \bool_case_false:n}
-% \begin{syntax}
-% \cs{bool_case_true:nTF} \\
-% ~~|{| \\
-% ~~~~\Arg{boolexpr case_1} \Arg{code case_1} \\
-% ~~~~\Arg{boolexpr case_2} \Arg{code case_2} \\
-% ~~~~\ldots \\
-% ~~~~\Arg{boolexpr case_n} \Arg{code case_n} \\
-% ~~|}| \\
-% ~~\Arg{true code}
-% ~~\Arg{false code}
-% \end{syntax}
-% Evaluates in turn each of the \meta{boolean expression cases} until
-% the first one that evaluates to \texttt{true} or to \texttt{false},
-% for \cs{bool_case_true:n} and \cs{bool_case_false:n}, respectively.
-% The \meta{code} associated to this first case is left in the input
-% stream, followed by the \meta{true code}, and other cases are
-% discarded. If none of the cases match then only the \meta{false
-% code} is inserted. The functions \cs{bool_case_true:n} and
-% \cs{bool_case_false:n}, which do nothing if there is no match, are
-% also available. For example
-% \begin{verbatim}
-% \bool_case_true:nF
-% {
-% { \dim_compare_p:n { \l__mypkg_wd_dim <= 10pt } }
-% { Fits }
-% { \int_compare_p:n { \l__mypkg_total_int >= 10 } }
-% { Many }
-% { \l__mypkg_special_bool }
-% { Special }
-% }
-% { No idea! }
-% \end{verbatim}
-% leaves \enquote{\texttt{Fits}} or \enquote{\texttt{Many}} or
-% \enquote{\texttt{Special}} or \enquote{\texttt{No idea!}} in the
-% input stream, in a way similar to some other language's
-% \enquote{\texttt{if} \ldots\ \texttt{elseif} \ldots\ \texttt{elseif} \ldots\
-% \texttt{else} \ldots}.
-% \end{function}
-%
-% \section{Additions to \pkg{l3prop}}
-%
-% \begin{function}[EXP, added = 2016-12-06]
-% {\prop_rand_key_value:N, \prop_rand_key_value:c}
-% \begin{syntax}
-% \cs{prop_rand_key_value:N} \meta{property list}
-% \end{syntax}
-% Selects a pseudo-random key--value pair from the \meta{property list}
-% and returns \Arg{key} and \Arg{value}. If the \meta{property list} is
-% empty the result is empty.
-% This is not available in older versions of \XeTeX{}.
-% \begin{texnote}
-% The result is returned within the \tn{unexpanded}
-% primitive (\cs{exp_not:n}), which means that the \meta{value}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
-% \end{texnote}
-% \end{function}
-%
% \section{Additions to \pkg{l3seq}}
%
% \begin{function}[rEXP]
@@ -334,44 +119,6 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[added = 2018-04-06]
-% {\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
-% \begin{syntax}
-% \cs{seq_set_from_function:NnN} \meta{seq~var} \Arg{loop~code} \meta{function}
-% \end{syntax}
-% Sets the \meta{seq~var} equal to a sequence whose items are obtained
-% by \texttt{x}-expanding \meta{loop~code} \meta{function}. This
-% expansion must result in successive calls to the \meta{function}
-% with no nonexpandable tokens in between. More precisely the
-% \meta{function} is replaced by a wrapper function that inserts the
-% appropriate separators between items in the sequence. The
-% \meta{loop~code} must be expandable; it can be for example
-% \cs{tl_map_function:NN} \meta{tl~var} or \cs{clist_map_function:nN}
-% \Arg{clist} or \cs{int_step_function:nnnN} \Arg{initial value}
-% \Arg{step} \Arg{final value}.
-% \end{function}
-%
-% \begin{function}[added = 2018-04-06]
-% {\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
-% \begin{syntax}
-% \cs{seq_set_from_inline_x:Nnn} \meta{seq~var} \Arg{loop~code} \Arg{inline~code}
-% \end{syntax}
-% Sets the \meta{seq~var} equal to a sequence whose items are obtained
-% by \texttt{x}-expanding \meta{loop~code} applied to a
-% \meta{function} derived from the \meta{inline~code}. A
-% \meta{function} is defined, that takes one argument,
-% \texttt{x}-expands the \meta{inline~code} with that argument
-% as~|#1|, then adds appropriate separators to turn the result into an
-% item of the sequence. The \texttt{x}-expansion of \meta{loop~code}
-% \meta{function} must result in successive calls to the
-% \meta{function} with no nonexpandable tokens in between. The
-% \meta{loop~code} must be expandable; it can be for example
-% \cs{tl_map_function:NN} \meta{tl~var} or \cs{clist_map_function:nN}
-% \Arg{clist} or \cs{int_step_function:nnnN} \Arg{initial value}
-% \Arg{step} \Arg{final value}, but not the analogous \enquote{inline}
-% mappings.
-% \end{function}
-%
% \begin{function}[added = 2021-04-29, noTF]
% {\seq_set_item:Nnn, \seq_set_item:cnn, \seq_gset_item:Nnn, \seq_gset_item:cnn}
% \begin{syntax}
@@ -408,87 +155,8 @@
% assigned locally for |pop| or globally for |gpop| functions.
% \end{function}
%
-% \section{Additions to \pkg{l3sys}}
-%
-% \begin{variable}[added = 2018-05-02]{\c_sys_engine_version_str}
-% The version string of the current engine, in the same form as
-% given in the banner issued when running a job. For \pdfTeX{}
-% and \LuaTeX{} this is of the form
-% \begin{quote}
-% \meta{major}.\meta{minor}.\meta{revision}
-% \end{quote}
-% For \XeTeX{}, the form is
-% \begin{quote}
-% \meta{major}.\meta{minor}
-% \end{quote}
-% For \pTeX{} and \upTeX{}, only releases since \TeX{} Live 2018
-% make the data available, and the form is more complex, as it comprises
-% the \pTeX{} version, the \upTeX{} version and the e-\pTeX{} version.
-% \begin{quote}
-% p\meta{major}.\meta{minor}.\meta{revision}-u\meta{major}.\meta{minor}^^A
-% -\meta{epTeX}
-% \end{quote}
-% where the |u| part is only present for \upTeX{}.
-% \end{variable}
-%
-% \begin{function}[added = 2017-05-27, EXP, pTF]{\sys_if_rand_exist:}
-% \begin{syntax}
-% \cs{sys_if_rand_exist_p:}
-% \cs{sys_if_rand_exist:TF} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests if the engine has a pseudo-random number generator. Currently
-% this is the case in \pdfTeX{}, \LuaTeX{}, \pTeX{}, \upTeX{} and recent
-% releases of \XeTeX{}.
-% \end{function}
-%
% \section{Additions to \pkg{l3tl}}
%
-% \begin{function}[EXP, added = 2017-07-15]
-% {
-% \tl_range_braced:Nnn, \tl_range_braced:cnn, \tl_range_braced:nnn,
-% \tl_range_unbraced:Nnn, \tl_range_unbraced:cnn, \tl_range_unbraced:nnn
-% }
-% \begin{syntax}
-% \cs{tl_range_braced:Nnn} \meta{tl~var} \Arg{start index} \Arg{end index}
-% \cs{tl_range_braced:nnn} \Arg{token list} \Arg{start index} \Arg{end index}
-% \cs{tl_range_unbraced:Nnn} \meta{tl~var} \Arg{start index} \Arg{end index}
-% \cs{tl_range_unbraced:nnn} \Arg{token list} \Arg{start index} \Arg{end index}
-% \end{syntax}
-% Leaves in the input stream the items from the \meta{start index} to
-% the \meta{end index} inclusive, using the same indexing as
-% \cs{tl_range:nnn}. Spaces are ignored. Regardless of whether items
-% appear with or without braces in the \meta{token list}, the
-% \cs{tl_range_braced:nnn} function wraps each item in braces, while
-% \cs{tl_range_unbraced:nnn} does not (overall it removes an outer set
-% of braces). For instance,
-% \begin{verbatim}
-% \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { 2 } { 5 } }
-% \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { -4 } { -1 } }
-% \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { -2 } { -1 } }
-% \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { 0 } { -1 } }
-% \end{verbatim}
-% prints \verb*|{b}{c}{d}{e{}}|, \verb*|{c}{d}{e{}}{f}|, \verb*|{e{}}{f}|, and an empty
-% line to the terminal, while
-% \begin{verbatim}
-% \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { 2 } { 5 } }
-% \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { -4 } { -1 } }
-% \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { -2 } { -1 } }
-% \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { 0 } { -1 } }
-% \end{verbatim}
-% prints \verb*|bcde{}|, \verb*|cde{}f|, \verb*|e{}f|, and an empty
-% line to the terminal. Because braces are removed, the result of
-% \cs{tl_range_unbraced:nnn} may have a different number of items as
-% for \cs{tl_range:nnn} or \cs{tl_range_braced:nnn}. In cases where
-% preserving spaces is important, consider the slower function
-% \cs{tl_range:nnn}.
-% \begin{texnote}
-% The result is returned within the \tn{unexpanded}
-% primitive (\cs{exp_not:n}), which means that the \meta{item}
-% does not expand further when appearing in an \texttt{x}-type
-% or \texttt{e}-type argument expansion.
-% \end{texnote}
-% \end{function}
-%
% \begin{function}[added = 2018-04-01]{\tl_build_begin:N, \tl_build_gbegin:N}
% \begin{syntax}
% \cs{tl_build_begin:N} \meta{tl~var}
@@ -557,46 +225,6 @@
% \cs[no-index]{tl_build_\ldots{}} functions.
% \end{function}
%
-% \section{Additions to \pkg{l3token}}
-%
-% \begin{variable}[added = 2017-08-07]{\c_catcode_active_space_tl}
-% Token list containing one character with category code $13$,
-% (\enquote{active}), and character code $32$ (space).
-% \end{variable}
-%
-% \begin{function}[added = 2018-09-23]
-% {
-% \peek_catcode_collect_inline:Nn,
-% \peek_charcode_collect_inline:Nn,
-% \peek_meaning_collect_inline:Nn
-% }
-% \begin{syntax}
-% \cs{peek_catcode_collect_inline:Nn} \meta{test token} \Arg{inline code}
-% \cs{peek_charcode_collect_inline:Nn} \meta{test token} \Arg{inline code}
-% \cs{peek_meaning_collect_inline:Nn} \meta{test token} \Arg{inline code}
-% \end{syntax}
-% Collects and removes tokens from the input stream until finding a
-% token that does not match the \meta{test token} (as defined by the
-% test \cs{token_if_eq_catcode:NNTF} or \cs{token_if_eq_charcode:NNTF}
-% or \cs{token_if_eq_meaning:NNTF}). The collected tokens are passed
-% to the \meta{inline code} as~|#1|. When begin-group or end-group
-% tokens (usually |{| or~|}|) are collected they are replaced by
-% implicit \cs{c_group_begin_token} and \cs{c_group_end_token}, and
-% when spaces (including \cs{c_space_token}) are collected they are
-% replaced by explicit spaces.
-%
-% For example the following code prints ``Hello'' to the terminal and
-% leave ``, world!'' in the input stream.
-% \begin{verbatim}
-% \peek_catcode_collect_inline:Nn A { \iow_term:n {#1} } Hello,~world!
-% \end{verbatim}
-% Another example is that the following code tests if the next token is |*|, ignoring intervening spaces, but putting them back using |#1| if there is no~|*|.
-% \begin{verbatim}
-% \peek_meaning_collect_inline:Nn \c_space_token
-% { \peek_charcode:NTF * { star } { no~star #1 } }
-% \end{verbatim}
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -607,202 +235,6 @@
%<*package>
% \end{macrocode}
%
-% \subsection{Additions to \pkg{l3flag}}
-%
-% \begin{macrocode}
-%<@@=flag>
-% \end{macrocode}
-%
-% \begin{macro}[EXP]{\flag_raise_if_clear:n}
-% It might be faster to just call the \enquote{trap} function in all
-% cases but conceptually the function name suggests we should only run
-% it if the flag is zero in case the \enquote{trap} made customizable
-% in the future.
-% \begin{macrocode}
-\cs_new:Npn \flag_raise_if_clear:n #1
- {
- \if_cs_exist:w flag~#1~0 \cs_end:
- \else:
- \cs:w flag~#1 \cs_end: 0 ;
- \fi:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Additions to \pkg{l3msg}}
-%
-% \begin{macrocode}
-%<@@=msg>
-% \end{macrocode}
-%
-% \begin{macro}{\msg_show_eval:Nn, \msg_log_eval:Nn, \@@_show_eval:nnN}
-% A short-hand used for \cs{int_show:n} and similar functions that
-% passes to \cs{tl_show:n} the result of applying |#1| (a
-% function such as \cs{int_eval:n}) to the expression |#2|. The use of
-% \texttt{f}-expansion ensures that |#1| is expanded in the scope in which the
-% show command is called, rather than in the group created by
-% \cs{iow_wrap:nnnN}. This is only important for expressions
-% involving the \tn{currentgrouplevel} or \tn{currentgrouptype}.
-% On the other hand we want the expression to be converted to a string
-% with the usual escape character, hence within the wrapping code.
-% \begin{macrocode}
-\cs_new_protected:Npn \msg_show_eval:Nn #1#2
- { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
-\cs_new_protected:Npn \msg_log_eval:Nn #1#2
- { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
-\cs_new_protected:Npn \@@_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\msg_show_item:n}
-% \begin{macro}[EXP]{\msg_show_item_unbraced:n}
-% \begin{macro}[EXP]{\msg_show_item:nn}
-% \begin{macro}[EXP]{\msg_show_item_unbraced:nn}
-% Each item in the variable is formatted using one of the following
-% functions. We cannot use |\\| and so on because these short-hands
-% cannot be used inside the arguments of messages, only when defining
-% the messages.
-% \begin{macrocode}
-\cs_new:Npx \msg_show_item:n #1
- { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
-\cs_new:Npx \msg_show_item_unbraced:n #1
- { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
-\cs_new:Npx \msg_show_item:nn #1#2
- {
- \iow_newline: > \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n { {#1} }
- \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n { {#2} }
- }
-\cs_new:Npx \msg_show_item_unbraced:nn #1#2
- {
- \iow_newline: > \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n {#1}
- \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n {#2}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Additions to \pkg{l3prg}}
-%
-% \begin{macrocode}
-%<@@=bool>
-% \end{macrocode}
-%
-% \begin{macro}[added = 2018-05-10]
-% {\bool_set_inverse:N, \bool_set_inverse:c, \bool_gset_inverse:N, \bool_gset_inverse:c}
-% Set to \texttt{false} or \texttt{true} locally or globally.
-% \begin{macrocode}
-\cs_new_protected:Npn \bool_set_inverse:N #1
- { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
-\cs_generate_variant:Nn \bool_set_inverse:N { c }
-\cs_new_protected:Npn \bool_gset_inverse:N #1
- { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
-\cs_generate_variant:Nn \bool_gset_inverse:N { c }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}{\s_@@_mark,\s_@@_stop}
-% Internal scan marks.
-% \begin{macrocode}
-\scan_new:N \s_@@_mark
-\scan_new:N \s_@@_stop
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP, noTF]{\bool_case_true:n, \bool_case_false:n}
-% \begin{macro}{\@@_case:NnTF}
-% \begin{macro}{\@@_case_true:w, \@@_case_false:w, \@@_case_end:nw}
-% For boolean cases the overall idea is the same as for
-% \cs{tl_case:nnTF} as described in \pkg{l3tl}.
-% \begin{macrocode}
-\cs_new:Npn \bool_case_true:nTF
- { \exp:w \@@_case:NnTF \c_true_bool }
-\cs_new:Npn \bool_case_true:nT #1#2
- { \exp:w \@@_case:NnTF \c_true_bool {#1} {#2} { } }
-\cs_new:Npn \bool_case_true:nF #1
- { \exp:w \@@_case:NnTF \c_true_bool {#1} { } }
-\cs_new:Npn \bool_case_true:n #1
- { \exp:w \@@_case:NnTF \c_true_bool {#1} { } { } }
-\cs_new:Npn \bool_case_false:nTF
- { \exp:w \@@_case:NnTF \c_false_bool }
-\cs_new:Npn \bool_case_false:nT #1#2
- { \exp:w \@@_case:NnTF \c_false_bool {#1} {#2} { } }
-\cs_new:Npn \bool_case_false:nF #1
- { \exp:w \@@_case:NnTF \c_false_bool {#1} { } }
-\cs_new:Npn \bool_case_false:n #1
- { \exp:w \@@_case:NnTF \c_false_bool {#1} { } { } }
-\cs_new:Npn \@@_case:NnTF #1#2#3#4
- {
- \bool_if:NTF #1 \@@_case_true:w \@@_case_false:w
- #2 #1 { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop
- }
-\cs_new:Npn \@@_case_true:w #1#2
- {
- \bool_if:nTF {#1}
- { \@@_case_end:nw {#2} }
- { \@@_case_true:w }
- }
-\cs_new:Npn \@@_case_false:w #1#2
- {
- \bool_if:nTF {#1}
- { \@@_case_false:w }
- { \@@_case_end:nw {#2} }
- }
-\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
- { \exp_end: #1 #4 }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Additions to \pkg{l3prop}}
-%
-% \begin{macrocode}
-%<@@=prop>
-% \end{macrocode}
-%
-% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
-% Functions to gobble up to a scan mark.
-% \begin{macrocode}
-\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]
-% {\prop_rand_key_value:N, \prop_rand_key_value:c}
-% \begin{macro}[EXP]{\@@_rand_item:w}
-% Contrarily to |clist|, |seq| and |tl|, there is no function to get
-% an item of a |prop| given an integer between $1$ and the number of
-% items, so we write the appropriate code. There is no bounds
-% checking because \cs{int_rand:nn} is always within bounds. The
-% initial \cs{int_value:w} is stopped by the first \cs{s_@@} in~|#1|.
-% \begin{macrocode}
-\cs_new:Npn \prop_rand_key_value:N #1
- {
- \prop_if_empty:NF #1
- {
- \exp_after:wN \@@_rand_item:w
- \int_value:w \int_rand:nn { 1 } { \prop_count:N #1 }
- #1 \s_@@_stop
- }
- }
-\cs_generate_variant:Nn \prop_rand_key_value:N { c }
-\cs_new:Npn \@@_rand_item:w #1 \s_@@ \@@_pair:wn #2 \s_@@ #3
- {
- \int_compare:nNnF {#1} > 1
- { \@@_use_i_delimit_by_s_stop:nw { \exp_not:n { {#2} {#3} } } }
- \exp_after:wN \@@_rand_item:w
- \int_value:w \int_eval:n { #1 - 1 } \s_@@
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Additions to \pkg{l3seq}}
%
% \begin{macrocode}
@@ -880,35 +312,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
-% \begin{macro}{\@@_set_from_inline_x:NNnn}
-% Set \cs{@@_item:n} then map it using the loop code.
-% \begin{macrocode}
-\cs_new_protected:Npn \seq_set_from_inline_x:Nnn
- { \@@_set_from_inline_x:NNnn \__kernel_tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
- { \@@_set_from_inline_x:NNnn \__kernel_tl_gset:Nx }
-\cs_new_protected:Npn \@@_set_from_inline_x:NNnn #1#2#3#4
- {
- \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
- #1 #2 { \s_@@ #3 \@@_item:n }
- \@@_pop_item_def:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
-% Reuse \cs{seq_set_from_inline_x:Nnn}.
-% \begin{macrocode}
-\cs_new_protected:Npn \seq_set_from_function:NnN #1#2#3
- { \seq_set_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
-\cs_new_protected:Npn \seq_gset_from_function:NnN #1#2#3
- { \seq_gset_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
-% \end{macrocode}
-% \end{macro}
-%
-%
% \begin{macro}{\@@_int_eval:w}
% Useful to more quickly go through items.
% \begin{macrocode}
@@ -1079,114 +482,6 @@
% \end{macro}
% \end{macro}
%
-% \subsection{Additions to \pkg{l3sys}}
-%
-% \begin{macrocode}
-%<@@=sys>
-% \end{macrocode}
-%
-% \begin{variable}{\c_sys_engine_version_str}
-% Various different engines, various different ways to extract the
-% data!
-% \begin{macrocode}
-\str_const:Nx \c_sys_engine_version_str
- {
- \str_case:on \c_sys_engine_str
- {
- { pdftex }
- {
- \int_div_truncate:nn { \tex_pdftexversion:D } { 100 }
- .
- \int_mod:nn { \tex_pdftexversion:D } { 100 }
- .
- \tex_pdftexrevision:D
- }
- { ptex }
- {
- \cs_if_exist:NT \tex_ptexversion:D
- {
- p
- \int_use:N \tex_ptexversion:D
- .
- \int_use:N \tex_ptexminorversion:D
- \tex_ptexrevision:D
- -
- \int_use:N \tex_epTeXversion:D
- }
- }
- { luatex }
- {
- \int_div_truncate:nn { \tex_luatexversion:D } { 100 }
- .
- \int_mod:nn { \tex_luatexversion:D } { 100 }
- .
- \tex_luatexrevision:D
- }
- { uptex }
- {
- \cs_if_exist:NT \tex_ptexversion:D
- {
- p
- \int_use:N \tex_ptexversion:D
- .
- \int_use:N \tex_ptexminorversion:D
- \tex_ptexrevision:D
- -
- u
- \int_use:N \tex_uptexversion:D
- \tex_uptexrevision:D
- -
- \int_use:N \tex_epTeXversion:D
- }
- }
- { xetex }
- {
- \int_use:N \tex_XeTeXversion:D
- \tex_XeTeXrevision:D
- }
- }
- }
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Additions to \pkg{l3file}}
-%
-% \begin{macrocode}
-%<@@=ior>
-% \end{macrocode}
-%
-% \begin{macro}{\ior_shell_open:Nn}
-% \begin{macro}{\@@_shell_open:nN}
-% Actually much easier than either the standard open or input versions!
-% When calling \cs{__kernel_ior_open:Nn} the file the pipe is added to
-% signal a shell command, but the quotes are not added yet---they are
-% added later by \cs{__kernel_file_name_quote:n}.
-% \begin{macrocode}
-\cs_new_protected:Npn \ior_shell_open:Nn #1#2
- {
- \sys_if_shell:TF
- { \exp_args:No \@@_shell_open:nN { \tl_to_str:n {#2} } #1 }
- { \msg_error:nn { ior } { pipe-failed } }
- }
-\cs_new_protected:Npn \@@_shell_open:nN #1#2
- {
- \tl_if_in:nnTF {#1} { " }
- {
- \msg_error:nnx
- { kernel } { quote-in-shell } {#1}
- }
- { \__kernel_ior_open:Nn #2 { |#1 } }
- }
-\msg_new:nnnn { ior } { pipe-failed }
- { Cannot~run~piped~system~commands. }
- {
- LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
- Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Additions to \pkg{l3tl}}
%
% \subsubsection{Building a token list}
@@ -1409,162 +704,7 @@
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{Other additions to \pkg{l3tl}}
-%
-% \begin{macro}{\tl_range_braced:Nnn, \tl_range_braced:cnn, \tl_range_braced:nnn}
-% \begin{macro}
-% {\tl_range_unbraced:Nnn, \tl_range_unbraced:cnn, \tl_range_unbraced:nnn}
-% \begin{macro}
-% {
-% \@@_range_braced:w, \@@_range_collect_braced:w,
-% \@@_range_unbraced:w, \@@_range_collect_unbraced:w,
-% }
-% For the braced version \cs{@@_range_braced:w} sets up
-% \cs{@@_range_collect_braced:w} which stores items one by one in an
-% argument after the semicolon. The unbraced version is almost
-% identical. The version preserving braces and spaces starts by
-% deleting spaces before the argument to avoid collecting them, and
-% sets up \cs{@@_range_collect:nn} with a first argument of the form
-% |{| \Arg{collected} \meta{tokens} |}|, whose head is the collected
-% tokens and whose tail is what remains of the original token list.
-% This form makes it easier to move tokens to the \meta{collected}
-% tokens.
% \begin{macrocode}
-\cs_new:Npn \tl_range_braced:Nnn { \exp_args:No \tl_range_braced:nnn }
-\cs_generate_variant:Nn \tl_range_braced:Nnn { c }
-\cs_new:Npn \tl_range_braced:nnn { \@@_range:Nnnn \@@_range_braced:w }
-\cs_new:Npn \tl_range_unbraced:Nnn
- { \exp_args:No \tl_range_unbraced:nnn }
-\cs_generate_variant:Nn \tl_range_unbraced:Nnn { c }
-\cs_new:Npn \tl_range_unbraced:nnn
- { \@@_range:Nnnn \@@_range_unbraced:w }
-\cs_new:Npn \@@_range_braced:w #1 ; #2
- { \@@_range_collect_braced:w #1 ; { } #2 }
-\cs_new:Npn \@@_range_unbraced:w #1 ; #2
- { \@@_range_collect_unbraced:w #1 ; { } #2 }
-\cs_new:Npn \@@_range_collect_braced:w #1 ; #2#3
- {
- \if_int_compare:w #1 > \c_one_int
- \exp_after:wN \@@_range_collect_braced:w
- \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
- \fi:
- { #2 {#3} }
- }
-\cs_new:Npn \@@_range_collect_unbraced:w #1 ; #2#3
- {
- \if_int_compare:w #1 > \c_one_int
- \exp_after:wN \@@_range_collect_unbraced:w
- \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
- \fi:
- { #2 #3 }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Additions to \pkg{l3token}}
-%
-% \begin{variable}{\c_catcode_active_space_tl}
-% While \cs{char_generate:nn} can produce active characters in some
-% engines it cannot in general. It would be possible to simply change
-% the catcode of space but then the code would need to avoid all
-% spaces, making it quite unreadable. Instead we use the primitive
-% \cs{tex_lowercase:D} trick.
-% \begin{macrocode}
-\group_begin:
- \char_set_catcode_active:N *
- \char_set_lccode:nn { `* } { `\ }
- \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } }
-\group_end:
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macrocode}
-%<@@=peek>
-% \end{macrocode}
-%
-% \begin{variable}{\l_@@_collect_tl}
-% \begin{macrocode}
-\tl_new:N \l_@@_collect_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}
-% {
-% \peek_catcode_collect_inline:Nn,
-% \peek_charcode_collect_inline:Nn,
-% \peek_meaning_collect_inline:Nn
-% }
-% \begin{macro}
-% {
-% \@@_collect:NNn, \@@_collect_true:w,
-% \@@_collect_remove:nw, \@@_collect:N
-% }
-% Most of the work is done by \cs{@@_execute_branches_\ldots{}:},
-% which calls either \cs{@@_true:w} or \cs{@@_false:w} according to
-% whether the next token \cs{l_peek_token} matches the search token
-% (stored in \cs{l_@@_search_token} and \cs{l_@@_search_tl}).
-% Here, in the \texttt{true} case we run \cs{@@_collect_true:w},
-% which generally calls \cs{@@_collect:N} to store the peeked token
-% into \cs{l_@@_collect_tl}, except in special non-\texttt{N}-type
-% cases (begin-group, end-group, or space), where a frozen token is
-% stored. The \texttt{true} branch calls
-% \cs{@@_execute_branches_\ldots{}:} to fetch more matching tokens.
-% Once there are no more, \cs{@@_false_aux:n} closes the safe-align
-% group and runs the user's inline code.
-% \begin{macrocode}
-\cs_new_protected:Npn \peek_catcode_collect_inline:Nn
- { \@@_collect:NNn \@@_execute_branches_catcode: }
-\cs_new_protected:Npn \peek_charcode_collect_inline:Nn
- { \@@_collect:NNn \@@_execute_branches_charcode: }
-\cs_new_protected:Npn \peek_meaning_collect_inline:Nn
- { \@@_collect:NNn \@@_execute_branches_meaning: }
-\cs_new_protected:Npn \@@_collect:NNn #1#2#3
- {
- \group_align_safe_begin:
- \cs_set_eq:NN \l_@@_search_token #2
- \tl_set:Nn \l_@@_search_tl {#2}
- \tl_clear:N \l_@@_collect_tl
- \cs_set:Npn \@@_false:w
- { \exp_args:No \@@_false_aux:n \l_@@_collect_tl }
- \cs_set:Npn \@@_false_aux:n ##1
- {
- \group_align_safe_end:
- #3
- }
- \cs_set_eq:NN \@@_true:w \@@_collect_true:w
- \cs_set:Npn \@@_true_aux:w { \peek_after:Nw #1 }
- \@@_true_aux:w
- }
-\cs_new_protected:Npn \@@_collect_true:w
- {
- \if_case:w
- \if_catcode:w \exp_not:N \l_peek_token { 1 \exp_stop_f: \fi:
- \if_catcode:w \exp_not:N \l_peek_token } 2 \exp_stop_f: \fi:
- \if_meaning:w \l_peek_token \c_space_token 3 \exp_stop_f: \fi:
- 0 \exp_stop_f:
- \exp_after:wN \@@_collect:N
- \or: \@@_collect_remove:nw { \c_group_begin_token }
- \or: \@@_collect_remove:nw { \c_group_end_token }
- \or: \@@_collect_remove:nw { ~ }
- \fi:
- }
-\cs_new_protected:Npn \@@_collect:N #1
- {
- \tl_put_right:Nn \l_@@_collect_tl {#1}
- \@@_true_aux:w
- }
-\cs_new_protected:Npn \@@_collect_remove:nw #1
- {
- \tl_put_right:Nn \l_@@_collect_tl {#1}
- \exp_after:wN \@@_true_remove:w
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macrocode}
%</package>
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -954,7 +954,7 @@
\flag_if_raised:nTF
\flag_if_raised_p:n
\flag_height:n
- \flag_raise_if_clear:n
+ \flag_ensure_raised:n
\flag_clear:n
}
% \end{macrocode}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -447,6 +447,25 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Deprecated \pkg{l3prg} functions}
+%
+% \begin{macrocode}
+%<@@=cs>
+% \end{macrocode}
+%
+% \begin{macro}[EXP, noTF]{\bool_case_true:n}
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:n }
+\cs_gset:Npn \bool_case_true:n { \bool_case:n }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nT }
+\cs_gset:Npn \bool_case_true:nT { \bool_case:nT }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nF }
+\cs_gset:Npn \bool_case_true:nF { \bool_case:nF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nTF }
+\cs_gset:Npn \bool_case_true:nTF { \bool_case:nTF }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Deprecated \pkg{l3str} functions}
%
% \begin{macrocode}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -85,7 +85,7 @@
% require you to do updates, if the class changes.}}
%
% \author{\Team}
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
% \maketitle
% \tableofcontents
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -180,6 +180,20 @@
% functions explicitly is preferred to defining confusing variants.
% \end{function}
%
+% \begin{function}[added = 2018-04-04, updated = 2019-02-08]
+% {\exp_args_generate:n}
+% \begin{syntax}
+% \cs{exp_args_generate:n} \Arg{variant argument specifiers}
+% \end{syntax}
+% Defines \cs[no-index]{exp_args:N\meta{variant}} functions for each
+% \meta{variant} given in the comma list \Arg{variant argument
+% specifiers}. Each \meta{variant} should consist of the letters |N|,
+% |c|, |n|, |V|, |v|, |o|, |f|, |e|, |x|, |p| and the resulting function is
+% protected if the letter |x| appears in the \meta{variant}. This is
+% only useful for cases where \cs{cs_generate_variant:Nn} is not
+% applicable.
+% \end{function}
+%
% \section{Introducing the variants}
%
% The |V| type returns the value of a register, which can be one of
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -140,6 +140,23 @@
% additive).
% \end{function}
%
+% \begin{function}[added = 2019-05-08]{\ior_shell_open:Nn}
+% \begin{syntax}
+% \cs{ior_shell_open:Nn} \meta{stream} \Arg{shell~command}
+% \end{syntax}
+% Opens the \emph{pseudo}-file created by the output of the
+% \meta{shell command} for reading using \meta{stream} as the
+% control sequence for access. If the \meta{stream} was already
+% open it is closed before the new operation begins. The
+% \meta{stream} is available for access immediately and will remain
+% allocated to \meta{shell command} until a \cs{ior_close:N} instruction
+% is given or the \TeX{} run ends.
+% If piped system calls are disabled an error is raised.
+%
+% For details of handling of the \meta{shell command}, see
+% \cs{sys_get_shell:nnNTF}.
+% \end{function}
+%
% \begin{function}[updated = 2012-07-31]
% {\ior_close:N, \ior_close:c, \iow_close:N, \iow_close:c}
% \begin{syntax}
@@ -390,6 +407,26 @@
% the \meta{stream} is not open.
% \end{function}
%
+% \subsection{Reading from the terminal}
+%
+% \begin{function}[added = 2019-03-23]{\ior_get_term:nN, \ior_str_get_term:nN}
+% \begin{syntax}
+% \cs{ior_get_term:nN} \meta{prompt} \meta{token list variable}
+% \end{syntax}
+% Function that reads one or more lines (until an equal number of left
+% and right braces are found) from the terminal and stores
+% the result locally in the \meta{token list} variable. Tokenization
+% occurs as described for \cs{ior_get:NN} or \cs{ior_str_get:NN}, respectively.
+% When the \meta{prompt}
+% is empty, \TeX{} will wait for input without any other indication:
+% typically the programmer will have provided a suitable text using
+% e.g.~\cs{iow_term:n}. Where the \meta{prompt} is given, it will appear
+% in the terminal followed by an |=|, e.g.
+% \begin{verbatim}
+% prompt=
+% \end{verbatim}
+% \end{function}
+%
% \subsection{Writing to files}
%
% \begin{function}[updated = 2012-06-05]{\iow_now:Nn, \iow_now:Nx, \iow_now:cn, \iow_now:cx}
@@ -516,8 +553,8 @@
% (for example after a control sequence),
% \item |\#|, |\%|, |\{|, |\}|, |\~| may be used to represent
% the corresponding character,
-% \item \cs{iow_allow_break:} may be used to allow a line-break
-% without inserting a space (this is experimental),
+% \item \cs{iow_wrap_allow_break:} may be used to allow a line-break
+% without inserting a space,
% \item \cs{iow_indent:n} may be used to indent a part of the
% \meta{text} (not the \meta{run-on text}).
% \end{itemize}
@@ -547,6 +584,15 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[added = 2023-04-25]{\iow_wrap_allow_break:}
+% \begin{syntax}
+% \cs{iow_wrap_allow_break:}
+% \end{syntax}
+% In the first argument of \cs{iow_wrap:nnnN} (for instance in
+% messages), inserts a break-point that allows a line break. If
+% no break occurs, this function adds nothing to the output.
+% \end{function}
+%
% \begin{function}[added = 2011-09-21]{\iow_indent:n}
% \begin{syntax}
% \cs{iow_indent:n} \Arg{text}
@@ -1111,6 +1157,38 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\ior_shell_open:Nn}
+% \begin{macro}{\@@_shell_open:nN}
+% Actually much easier than either the standard open or input versions!
+% When calling \cs{__kernel_ior_open:Nn} the file the pipe is added to
+% signal a shell command, but the quotes are not added yet---they are
+% added later by \cs{__kernel_file_name_quote:n}.
+% \begin{macrocode}
+\cs_new_protected:Npn \ior_shell_open:Nn #1#2
+ {
+ \sys_if_shell:TF
+ { \exp_args:No \@@_shell_open:nN { \tl_to_str:n {#2} } #1 }
+ { \msg_error:nn { ior } { pipe-failed } }
+ }
+\cs_new_protected:Npn \@@_shell_open:nN #1#2
+ {
+ \tl_if_in:nnTF {#1} { " }
+ {
+ \msg_error:nnx
+ { kernel } { quote-in-shell } {#1}
+ }
+ { \__kernel_ior_open:Nn #2 { |#1 } }
+ }
+\msg_new:nnnn { ior } { pipe-failed }
+ { Cannot~run~piped~system~commands. }
+ {
+ LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
+ Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\ior_close:N, \ior_close:c}
% Closing a stream means getting rid of it at the \TeX{} level and
% removing from the various data structures. Unless the name passed
@@ -1846,24 +1924,24 @@
% \end{variable}
% \end{variable}
%
-% \begin{macro}{\iow_allow_break:}
-% \begin{macro}[EXP]{\@@_allow_break:}
-% \begin{macro}[EXP]{\@@_allow_break_error:}
-% We set \cs{iow_allow_break:n} to produce an error when outside
-% messages. Within wrapped message, it is set to \cs{@@_allow_break:}
-% when valid and otherwise to \cs{@@_allow_break_error:}. The second
+% \begin{macro}{\iow_wrap_allow_break:}
+% \begin{macro}[EXP]{\@@_wrap_allow_break:}
+% \begin{macro}[EXP]{\@@_wrap_allow_break_error:}
+% We set \cs{iow_wrap_allow_break:n} to produce an error when outside
+% messages. Within wrapped message, it is set to \cs{@@_wrap_allow_break:}
+% when valid and otherwise to \cs{@@_wrap_allow_break_error:}. The second
% produces an error expandably.
% \begin{macrocode}
-\cs_new_protected:Npn \iow_allow_break:
+\cs_new_protected:Npn \iow_wrap_allow_break:
{
\msg_error:nnnn { kernel } { iow-indent }
- { \iow_wrap:nnnN } { \iow_allow_break: }
+ { \iow_wrap:nnnN } { \iow_wrap_allow_break: }
}
-\cs_new:Npx \@@_allow_break: { \c_@@_wrap_allow_break_marker_tl }
-\cs_new:Npn \@@_allow_break_error:
+\cs_new:Npx \@@_wrap_allow_break: { \c_@@_wrap_allow_break_marker_tl }
+\cs_new:Npn \@@_wrap_allow_break_error:
{
\msg_expandable_error:nnnn { kernel } { iow-indent }
- { \iow_wrap:nnnN } { \iow_allow_break: }
+ { \iow_wrap:nnnN } { \iow_wrap_allow_break: }
}
% \end{macrocode}
% \end{macro}
@@ -1928,7 +2006,7 @@
\int_set:Nn \tex_escapechar:D { 92 }
\cs_set_eq:NN \\ \iow_newline:
\cs_set_eq:NN \ \c_catcode_other_space_tl
- \cs_set_eq:NN \iow_allow_break: \@@_allow_break:
+ \cs_set_eq:NN \iow_wrap_allow_break: \@@_wrap_allow_break:
\cs_set_eq:NN \iow_indent:n \@@_indent:n
#3
% \end{macrocode}
@@ -1941,7 +2019,7 @@
% \begin{macrocode}
\cs_set_eq:NN \protect \token_to_str:N
\__kernel_tl_set:Nx \l_@@_wrap_tl {#1}
- \cs_set_eq:NN \iow_allow_break: \@@_allow_break_error:
+ \cs_set_eq:NN \iow_wrap_allow_break: \@@_wrap_allow_break_error:
\cs_set_eq:NN \iow_indent:n \@@_indent_error:n
% \end{macrocode}
% Afterwards, set the newline marker (two assignments to fully expand,
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -152,6 +152,14 @@
% The \meta{flag}'s height is increased by $1$ locally.
% \end{function}
%
+% \begin{function}[EXP, added = 2023-04-25]{\flag_ensure_raised:n}
+% \begin{syntax}
+% \cs{flag_ensure_raised:n} \Arg{flag name}
+% \end{syntax}
+% Ensures the \meta{flag} is raised by making its height at least~$1$,
+% locally.
+% \end{function}
+%
% \end{documentation}
%
% \begin{implementation}
@@ -299,7 +307,23 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP]{\flag_ensure_raised:n}
+% It might be faster to just call the \enquote{trap} function in all
+% cases but conceptually the function name suggests we should only run
+% it if the flag is zero in case the \enquote{trap} made customizable
+% in the future.
% \begin{macrocode}
+\cs_new:Npn \flag_ensure_raised:n #1
+ {
+ \if_cs_exist:w flag~#1~0 \cs_end:
+ \else:
+ \cs:w flag~#1 \cs_end: 0 ;
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
%</package>
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
% \maketitle
%
% \begin{documentation}
@@ -200,9 +200,9 @@
% Use general tools.
% \begin{macrocode}
\cs_new_protected:Npn \fp_show:n
- { \msg_show_eval:Nn \fp_to_tl:n }
+ { \__kernel_msg_show_eval:Nn \fp_to_tl:n }
\cs_new_protected:Npn \fp_log:n
- { \msg_log_eval:Nn \fp_to_tl:n }
+ { \__kernel_msg_log_eval:Nn \fp_to_tl:n }
% \end{macrocode}
% \end{macro}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -73,37 +73,6 @@
%
% \subsection{Engine support}
%
-% Most engines provide random numbers, but not all. We write the test
-% twice simply in order to write the \texttt{false} branch first.
-% \begin{macrocode}
-\sys_if_rand_exist:F
- {
- \msg_new:nnn { kernel } { fp-no-random }
- { Random~numbers~unavailable~for~#1 }
- \cs_new:Npn \@@_rand_o:Nw ? #1 @
- {
- \msg_expandable_error:nnn { kernel } { fp-no-random }
- { fp~rand }
- \exp_after:wN \c_nan_fp
- }
- \cs_new_eq:NN \@@_randint_o:Nw \@@_rand_o:Nw
- \cs_new:Npn \int_rand:nn #1#2
- {
- \msg_expandable_error:nnn { kernel } { fp-no-random }
- { \int_rand:nn {#1} {#2} }
- \int_eval:n {#1}
- }
- \cs_new:Npn \int_rand:n #1
- {
- \msg_expandable_error:nnn { kernel } { fp-no-random }
- { \int_rand:n {#1} }
- 1
- }
- }
-\sys_if_rand_exist:T
- {
-% \end{macrocode}
-%
% Obviously, every word \enquote{random} below means
% \enquote{pseudo-random}, as we have no access to entropy (except a
% very unreliable source of entropy: the time it takes to run some
@@ -271,7 +240,7 @@
% Constant equal to $2^{17}-1$, the maximal size of a range that
% \cs{int_range:nn} can do with its \enquote{simple} algorithm.
% \begin{macrocode}
- \int_const:Nn \c__kernel_randint_max_int { 131071 }
+\int_const:Nn \c__kernel_randint_max_int { 131071 }
% \end{macrocode}
% \end{variable}
%
@@ -284,11 +253,11 @@
% $\operatorname{ediv}(p-2^{13},2^{14})$ but that wrongly gives $-1$
% for $p=0$.
% \begin{macrocode}
- \cs_new:Npn \__kernel_randint:n #1
- {
- (#1 * \tex_uniformdeviate:D 16384
- + \tex_uniformdeviate:D #1 + 8192 ) / 16384
- }
+\cs_new:Npn \__kernel_randint:n #1
+ {
+ (#1 * \tex_uniformdeviate:D 16384
+ + \tex_uniformdeviate:D #1 + 8192 ) / 16384
+ }
% \end{macrocode}
% \end{macro}
%
@@ -300,17 +269,17 @@
% four (pseudo-random) digits. Digits are produced as a random number
% in $[10000,19999]$ for the usual reason of preserving leading zeros.
% \begin{macrocode}
- \cs_new:Npn \@@_rand_myriads:n #1
- { \@@_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
- \cs_new:Npn \@@_rand_myriads_loop:w #1 X
- {
- #1
- \exp_after:wN \@@_rand_myriads_get:w
- \int_value:w \@@_int_eval:w 9999 +
- \__kernel_randint:n { 10000 }
- \@@_rand_myriads_loop:w
- }
- \cs_new:Npn \@@_rand_myriads_get:w 1 #1 ; { ; {#1} }
+\cs_new:Npn \@@_rand_myriads:n #1
+ { \@@_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
+\cs_new:Npn \@@_rand_myriads_loop:w #1 X
+ {
+ #1
+ \exp_after:wN \@@_rand_myriads_get:w
+ \int_value:w \@@_int_eval:w 9999 +
+ \__kernel_randint:n { 10000 }
+ \@@_rand_myriads_loop:w
+ }
+\cs_new:Npn \@@_rand_myriads_get:w 1 #1 ; { ; {#1} }
% \end{macrocode}
% \end{macro}
%
@@ -324,27 +293,27 @@
% is correctly~$0$ but it raises the \texttt{underflow} flag; it
% should not do that.
% \begin{macrocode}
- \cs_new:Npn \@@_rand_o:Nw ? #1 @
+\cs_new:Npn \@@_rand_o:Nw ? #1 @
+ {
+ \tl_if_empty:nTF {#1}
{
- \tl_if_empty:nTF {#1}
- {
- \exp_after:wN \@@_rand_o:w
- \exp:w \exp_end_continue_f:w
- \@@_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
- }
- {
- \msg_expandable_error:nnnnn
- { fp } { num-args } { rand() } { 0 } { 0 }
- \exp_after:wN \c_nan_fp
- }
+ \exp_after:wN \@@_rand_o:w
+ \exp:w \exp_end_continue_f:w
+ \@@_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
}
- \cs_new:Npn \@@_rand_o:w ;
{
- \exp_after:wN \@@_sanitize:Nw
- \exp_after:wN 0
- \int_value:w \@@_int_eval:w \c_zero_int
- \@@_fixed_to_float_o:wN
+ \msg_expandable_error:nnnnn
+ { fp } { num-args } { rand() } { 0 } { 0 }
+ \exp_after:wN \c_nan_fp
}
+ }
+\cs_new:Npn \@@_rand_o:w ;
+ {
+ \exp_after:wN \@@_sanitize:Nw
+ \exp_after:wN 0
+ \int_value:w \@@_int_eval:w \c_zero_int
+ \@@_fixed_to_float_o:wN
+ }
% \end{macrocode}
% \end{macro}
%
@@ -382,115 +351,115 @@
% numbers (namely $10^{16}$ to the integers they represent), except
% of course when it is time to convert back to a float.
% \begin{macrocode}
- \cs_new:Npn \@@_randint_o:Nw ?
+\cs_new:Npn \@@_randint_o:Nw ?
+ {
+ \@@_parse_function_one_two:nnw
+ { randint }
+ { \@@_randint_default:w \@@_randint_o:w }
+ }
+\cs_new:Npn \@@_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
+\cs_new:Npn \@@_randint_badarg:w \s_@@ \@@_chk:w #1#2#3;
+ {
+ \@@_int:wTF \s_@@ \@@_chk:w #1#2#3;
{
- \@@_parse_function_one_two:nnw
- { randint }
- { \@@_randint_default:w \@@_randint_o:w }
- }
- \cs_new:Npn \@@_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
- \cs_new:Npn \@@_randint_badarg:w \s_@@ \@@_chk:w #1#2#3;
- {
- \@@_int:wTF \s_@@ \@@_chk:w #1#2#3;
- {
- \if_meaning:w 1 #1
- \if_int_compare:w
- \@@_use_i_until_s:nw #3 ; > \c_@@_prec_int
- \c_one_int
- \fi:
- \fi:
- }
- { \c_one_int }
- }
- \cs_new:Npn \@@_randint_o:w #1; #2; @
- {
- \if_case:w
- \@@_randint_badarg:w #1;
- \@@_randint_badarg:w #2;
- \if:w 1 \@@_compare_back:ww #2; #1; \c_one_int \fi:
- \c_zero_int
- \@@_randint_auxi_o:ww #1; #2;
- \or:
- \@@_invalid_operation_tl_o:ff
- { randint } { \@@_array_to_clist:n { #1; #2; } }
- \exp:w
+ \if_meaning:w 1 #1
+ \if_int_compare:w
+ \@@_use_i_until_s:nw #3 ; > \c_@@_prec_int
+ \c_one_int
+ \fi:
\fi:
- \exp_after:wN \exp_end:
}
- \cs_new:Npn \@@_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
+ { \c_one_int }
+ }
+\cs_new:Npn \@@_randint_o:w #1; #2; @
+ {
+ \if_case:w
+ \@@_randint_badarg:w #1;
+ \@@_randint_badarg:w #2;
+ \if:w 1 \@@_compare_back:ww #2; #1; \c_one_int \fi:
+ \c_zero_int
+ \@@_randint_auxi_o:ww #1; #2;
+ \or:
+ \@@_invalid_operation_tl_o:ff
+ { randint } { \@@_array_to_clist:n { #1; #2; } }
+ \exp:w
+ \fi:
+ \exp_after:wN \exp_end:
+ }
+\cs_new:Npn \@@_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
+ {
+ \fi:
+ \@@_randint_auxii:wn #2 ;
+ { \@@_randint_auxii:wn #1 ; \@@_randint_auxiii_o:ww }
+ }
+\cs_new:Npn \@@_randint_auxii:wn \s_@@ \@@_chk:w #1#2#3#4 ;
+ {
+ \if_meaning:w 0 #1
+ \exp_after:wN \use_i:nn
+ \else:
+ \exp_after:wN \use_ii:nn
+ \fi:
+ { \exp_after:wN \@@_fixed_continue:wn \c_@@_one_fixed_tl }
+ {
+ \exp_after:wN \@@_ep_to_fixed:wwn
+ \int_value:w \@@_int_eval:w
+ #3 - \c_@@_prec_int , #4 {0000} {0000} ;
{
+ \if_meaning:w 0 #2
+ \exp_after:wN \use_i:nnnn
+ \exp_after:wN \@@_fixed_add_one:wN
\fi:
- \@@_randint_auxii:wn #2 ;
- { \@@_randint_auxii:wn #1 ; \@@_randint_auxiii_o:ww }
- }
- \cs_new:Npn \@@_randint_auxii:wn \s_@@ \@@_chk:w #1#2#3#4 ;
- {
- \if_meaning:w 0 #1
- \exp_after:wN \use_i:nn
- \else:
- \exp_after:wN \use_ii:nn
- \fi:
- { \exp_after:wN \@@_fixed_continue:wn \c_@@_one_fixed_tl }
- {
- \exp_after:wN \@@_ep_to_fixed:wwn
- \int_value:w \@@_int_eval:w
- #3 - \c_@@_prec_int , #4 {0000} {0000} ;
- {
- \if_meaning:w 0 #2
- \exp_after:wN \use_i:nnnn
- \exp_after:wN \@@_fixed_add_one:wN
- \fi:
- \exp_after:wN \@@_fixed_sub:wwn \c_@@_one_fixed_tl
- }
- \@@_fixed_continue:wn
- }
- }
- \cs_new:Npn \@@_randint_auxiii_o:ww #1 ; #2 ;
- {
- \@@_fixed_add:wwn #2 ;
- {0000} {0000} {0000} {0001} {0000} {0000} ;
- \@@_fixed_sub:wwn #1 ;
- {
- \exp_after:wN \use_i:nn
- \exp_after:wN \@@_fixed_mul_add:wwwn
- \exp:w \exp_end_continue_f:w \@@_rand_myriads:n { XXXXXX } ;
- }
- #1 ;
- \@@_randint_auxiv_o:ww
- #2 ;
- \@@_randint_auxv_o:w #1 ; @
- }
- \cs_new:Npn \@@_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
- {
- \if_int_compare:w
- \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
- \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
- #3#4 > #8#9 \exp_stop_f:
- \@@_use_i_until_s:nw
- \fi:
- \@@_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
- }
- \cs_new:Npn \@@_randint_auxv_o:w #1#2#3#4#5 ; #6 @
- {
- \exp_after:wN \@@_sanitize:Nw
- \int_value:w
- \if_int_compare:w #1 < 10000 \exp_stop_f:
- 2
- \else:
- 0
- \exp_after:wN \exp_after:wN
- \exp_after:wN \@@_reverse_args:Nww
- \fi:
\exp_after:wN \@@_fixed_sub:wwn \c_@@_one_fixed_tl
- {#1} {#2} {#3} {#4} {0000} {0000} ;
- {
- \exp_after:wN \exp_stop_f:
- \int_value:w \@@_int_eval:w \c_@@_prec_int
- \@@_fixed_to_float_o:wN
- }
- 0
- \exp:w \exp_after:wN \exp_end:
}
+ \@@_fixed_continue:wn
+ }
+ }
+\cs_new:Npn \@@_randint_auxiii_o:ww #1 ; #2 ;
+ {
+ \@@_fixed_add:wwn #2 ;
+ {0000} {0000} {0000} {0001} {0000} {0000} ;
+ \@@_fixed_sub:wwn #1 ;
+ {
+ \exp_after:wN \use_i:nn
+ \exp_after:wN \@@_fixed_mul_add:wwwn
+ \exp:w \exp_end_continue_f:w \@@_rand_myriads:n { XXXXXX } ;
+ }
+ #1 ;
+ \@@_randint_auxiv_o:ww
+ #2 ;
+ \@@_randint_auxv_o:w #1 ; @
+ }
+\cs_new:Npn \@@_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
+ {
+ \if_int_compare:w
+ \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
+ \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
+ #3#4 > #8#9 \exp_stop_f:
+ \@@_use_i_until_s:nw
+ \fi:
+ \@@_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
+ }
+\cs_new:Npn \@@_randint_auxv_o:w #1#2#3#4#5 ; #6 @
+ {
+ \exp_after:wN \@@_sanitize:Nw
+ \int_value:w
+ \if_int_compare:w #1 < 10000 \exp_stop_f:
+ 2
+ \else:
+ 0
+ \exp_after:wN \exp_after:wN
+ \exp_after:wN \@@_reverse_args:Nww
+ \fi:
+ \exp_after:wN \@@_fixed_sub:wwn \c_@@_one_fixed_tl
+ {#1} {#2} {#3} {#4} {0000} {0000} ;
+ {
+ \exp_after:wN \exp_stop_f:
+ \int_value:w \@@_int_eval:w \c_@@_prec_int
+ \@@_fixed_to_float_o:wN
+ }
+ 0
+ \exp:w \exp_after:wN \exp_end:
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -504,38 +473,38 @@
% where \meta{choices} is the number of possible outcomes. If the
% range is wide, use somewhat slower code.
% \begin{macrocode}
- \cs_new:Npn \int_rand:nn #1#2
+\cs_new:Npn \int_rand:nn #1#2
+ {
+ \int_eval:n
{
- \int_eval:n
- {
- \exp_after:wN \@@_randint:ww
- \int_value:w \int_eval:n {#1} \exp_after:wN ;
- \int_value:w \int_eval:n {#2} ;
- }
+ \exp_after:wN \@@_randint:ww
+ \int_value:w \int_eval:n {#1} \exp_after:wN ;
+ \int_value:w \int_eval:n {#2} ;
}
- \cs_new:Npn \@@_randint:ww #1; #2;
- {
- \if_int_compare:w #1 > #2 \exp_stop_f:
- \msg_expandable_error:nnnn
- { kernel } { randint-backward-range } {#1} {#2}
- \@@_randint:ww #2; #1;
- \else:
- \if_int_compare:w \@@_int_eval:w #2
- \if_int_compare:w #1 > \c_zero_int
- - #1 < \@@_int_eval:w
- \else:
- < \@@_int_eval:w #1 +
- \fi:
- \c__kernel_randint_max_int
- \@@_int_eval_end:
- \__kernel_randint:n
- { \@@_int_eval:w #2 - #1 + 1 \@@_int_eval_end: }
- - 1 + #1
+ }
+\cs_new:Npn \@@_randint:ww #1; #2;
+ {
+ \if_int_compare:w #1 > #2 \exp_stop_f:
+ \msg_expandable_error:nnnn
+ { kernel } { randint-backward-range } {#1} {#2}
+ \@@_randint:ww #2; #1;
+ \else:
+ \if_int_compare:w \@@_int_eval:w #2
+ \if_int_compare:w #1 > \c_zero_int
+ - #1 < \@@_int_eval:w
\else:
- \__kernel_randint:nn {#1} {#2}
+ < \@@_int_eval:w #1 +
\fi:
- \fi:
- }
+ \c__kernel_randint_max_int
+ \@@_int_eval_end:
+ \__kernel_randint:n
+ { \@@_int_eval:w #2 - #1 + 1 \@@_int_eval_end: }
+ - 1 + #1
+ \else:
+ \__kernel_randint:nn {#1} {#2}
+ \fi:
+ \fi:
+ }
% \end{macrocode}
% \end{macro}
%
@@ -557,68 +526,68 @@
% \meta{Y_1}|;|\meta{Y_0}|;| \meta{R_2}|;|\meta{R_1}|;|\meta{R_0}|;.|
% and we apply the algorithm described earlier.
% \begin{macrocode}
- \cs_new:Npn \__kernel_randint:nn #1#2
- {
- #1
- \exp_after:wN \@@_randint_wide_aux:w
+\cs_new:Npn \__kernel_randint:nn #1#2
+ {
+ #1
+ \exp_after:wN \@@_randint_wide_aux:w
+ \int_value:w
+ \exp_after:wN \@@_randint_split_o:Nw
+ \tex_uniformdeviate:D 268435456 ;
+ \int_value:w
+ \exp_after:wN \@@_randint_split_o:Nw
+ \tex_uniformdeviate:D 268435456 ;
+ \int_value:w
+ \exp_after:wN \@@_randint_split_o:Nw
+ \int_value:w \@@_int_eval:w 131072 +
+ \exp_after:wN \@@_randint_split_o:Nw
\int_value:w
- \exp_after:wN \@@_randint_split_o:Nw
- \tex_uniformdeviate:D 268435456 ;
- \int_value:w
- \exp_after:wN \@@_randint_split_o:Nw
- \tex_uniformdeviate:D 268435456 ;
- \int_value:w
- \exp_after:wN \@@_randint_split_o:Nw
- \int_value:w \@@_int_eval:w 131072 +
- \exp_after:wN \@@_randint_split_o:Nw
- \int_value:w
- \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
- .
- }
- \cs_new:Npn \@@_randint_split_o:Nw #1#2 ;
- {
- \if_meaning:w 0 #1
- 0 \exp_after:wN ; \int_value:w 0
- \else:
- \exp_after:wN \@@_randint_split_aux:w
- \int_value:w \@@_int_eval:w (#1#2 - 8192) / 16384 ;
- + #1#2
- \fi:
- \exp_after:wN ;
- }
- \cs_new:Npn \@@_randint_split_aux:w #1 ;
- {
- #1 \exp_after:wN ;
- \int_value:w \@@_int_eval:w - #1 * 16384
- }
- \cs_new:Npn \@@_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
- {
- \exp_after:wN \@@_randint_wide_auxii:w
- \int_value:w \@@_int_eval:w #5 * #3 + #6 * #1 +
- (#5 * #4 + #6 * #3 + #7 * #1 +
- (#5 * #2 + #7 * #3 +
- (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
- ) / 16384 \exp_after:wN ;
- \int_value:w \@@_int_eval:w (#5 + #6) * 16384 + #7 ;
- #1 ; #5 ;
- }
- \cs_new:Npn \@@_randint_wide_auxii:w #1; #2; #3; #4;
- {
- \if_int_odd:w 0
- \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
- \if_int_compare:w #4 = \c_zero_int 1 \fi:
- \if_int_compare:w #3 = 16383 ~ 1 \fi:
- \exp_stop_f:
- \exp_after:wN \prg_break:
- \fi:
- \if_int_compare:w #4 < 8 \exp_stop_f:
- + #4 * #3 * 16384
- \else:
- + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
- \fi:
- + #1
- \prg_break_point:
- }
+ \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
+ .
+ }
+\cs_new:Npn \@@_randint_split_o:Nw #1#2 ;
+ {
+ \if_meaning:w 0 #1
+ 0 \exp_after:wN ; \int_value:w 0
+ \else:
+ \exp_after:wN \@@_randint_split_aux:w
+ \int_value:w \@@_int_eval:w (#1#2 - 8192) / 16384 ;
+ + #1#2
+ \fi:
+ \exp_after:wN ;
+ }
+\cs_new:Npn \@@_randint_split_aux:w #1 ;
+ {
+ #1 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w - #1 * 16384
+ }
+\cs_new:Npn \@@_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
+ {
+ \exp_after:wN \@@_randint_wide_auxii:w
+ \int_value:w \@@_int_eval:w #5 * #3 + #6 * #1 +
+ (#5 * #4 + #6 * #3 + #7 * #1 +
+ (#5 * #2 + #7 * #3 +
+ (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
+ ) / 16384 \exp_after:wN ;
+ \int_value:w \@@_int_eval:w (#5 + #6) * 16384 + #7 ;
+ #1 ; #5 ;
+ }
+\cs_new:Npn \@@_randint_wide_auxii:w #1; #2; #3; #4;
+ {
+ \if_int_odd:w 0
+ \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
+ \if_int_compare:w #4 = \c_zero_int 1 \fi:
+ \if_int_compare:w #3 = 16383 ~ 1 \fi:
+ \exp_stop_f:
+ \exp_after:wN \prg_break:
+ \fi:
+ \if_int_compare:w #4 < 8 \exp_stop_f:
+ + #4 * #3 * 16384
+ \else:
+ + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
+ \fi:
+ + #1
+ \prg_break_point:
+ }
% \end{macrocode}
% \end{macro}
%
@@ -625,35 +594,29 @@
% \begin{macro}{\int_rand:n, \@@_randint:n}
% Similar to \cs{int_rand:nn}, but needs fewer checks.
% \begin{macrocode}
- \cs_new:Npn \int_rand:n #1
- {
- \int_eval:n
- { \exp_args:Nf \@@_randint:n { \int_eval:n {#1} } }
- }
- \cs_new:Npn \@@_randint:n #1
- {
- \if_int_compare:w #1 < \c_one_int
- \msg_expandable_error:nnnn
- { kernel } { randint-backward-range } { 1 } {#1}
- \@@_randint:ww #1; 1;
- \else:
- \if_int_compare:w #1 > \c__kernel_randint_max_int
- \__kernel_randint:nn { 1 } {#1}
- \else:
- \__kernel_randint:n {#1}
- \fi:
- \fi:
- }
+\cs_new:Npn \int_rand:n #1
+ {
+ \int_eval:n
+ { \exp_args:Nf \@@_randint:n { \int_eval:n {#1} } }
+ }
+\cs_new:Npn \@@_randint:n #1
+ {
+ \if_int_compare:w #1 < \c_one_int
+ \msg_expandable_error:nnnn
+ { kernel } { randint-backward-range } { 1 } {#1}
+ \@@_randint:ww #1; 1;
+ \else:
+ \if_int_compare:w #1 > \c__kernel_randint_max_int
+ \__kernel_randint:nn { 1 } {#1}
+ \else:
+ \__kernel_randint:n {#1}
+ \fi:
+ \fi:
+ }
% \end{macrocode}
% \end{macro}
%
-% End the initial conditional that ensures these commands are only
-% defined in engines that support random numbers.
% \begin{macrocode}
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
%</package>
% \end{macrocode}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
% \maketitle
%
% \begin{documentation}
@@ -165,7 +165,7 @@
{
#1
\@@_error:nnfn { invalid } {##2} { \fp_to_tl:n { ##3; } } { }
- \flag_raise_if_clear:n { fp_invalid_operation }
+ \flag_ensure_raised:n { fp_invalid_operation }
##1
}
\exp_args:Nno \use:n
@@ -174,7 +174,7 @@
#1
\@@_error:nffn { invalid-ii }
{ \fp_to_tl:n { ##2; } } { \fp_to_tl:n { ##3; } } {##1}
- \flag_raise_if_clear:n { fp_invalid_operation }
+ \flag_ensure_raised:n { fp_invalid_operation }
\exp_after:wN \c_nan_fp
}
\exp_args:Nno \use:n
@@ -182,7 +182,7 @@
{
#1
\@@_error:nffn { invalid } {##1} {##2} { }
- \flag_raise_if_clear:n { fp_invalid_operation }
+ \flag_ensure_raised:n { fp_invalid_operation }
\exp_after:wN \c_nan_fp
}
}
@@ -215,7 +215,7 @@
{
#1
\@@_error:nnfn { zero-div } {##2} { \fp_to_tl:n { ##3; } } { }
- \flag_raise_if_clear:n { fp_division_by_zero }
+ \flag_ensure_raised:n { fp_division_by_zero }
\exp_after:wN ##1
}
\exp_args:Nno \use:n
@@ -224,7 +224,7 @@
#1
\@@_error:nffn { zero-div-ii }
{ \fp_to_tl:n { ##3; } } { \fp_to_tl:n { ##4; } } {##2}
- \flag_raise_if_clear:n { fp_division_by_zero }
+ \flag_ensure_raised:n { fp_division_by_zero }
\exp_after:wN ##1
}
}
@@ -287,7 +287,7 @@
{ \fp_to_tl:n { \s_@@ \@@_chk:w ##1##2##3; } }
{ \token_if_eq_meaning:NNF 0 ##2 { - } #4 }
{#2}
- \flag_raise_if_clear:n { fp_#2 }
+ \flag_ensure_raised:n { fp_#2 }
#3 ##2
}
}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
% {latex-team at latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -476,6 +476,15 @@
% slightly slower.
% \end{function}
%
+% \begin{function}[pTF, added = 2019-08-25]{\fp_if_nan:n}
+% \begin{syntax}
+% \cs{fp_if_nan:n} \Arg{fp expr}
+% \end{syntax}
+% Evaluates the \meta{fp expr} and tests whether the result is exactly
+% \nan{}. The test returns \texttt{false} for any other result, even
+% a tuple containing \nan{}.
+% \end{function}
+%
% \section{Floating point expression loops}
%
% \begin{function}[rEXP, added = 2012-08-16, tested = m3fp-logic003]
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -2555,7 +2555,7 @@
% expressions: this gives a more unified output.
% \begin{macrocode}
\cs_new_protected:Npn \int_show:n
- { \msg_show_eval:Nn \int_eval:n }
+ { \__kernel_msg_show_eval:Nn \int_eval:n }
% \end{macrocode}
% \end{macro}
%
@@ -2571,7 +2571,7 @@
% Similar to \cs{int_show:n}.
% \begin{macrocode}
\cs_new_protected:Npn \int_log:n
- { \msg_log_eval:Nn \int_eval:n }
+ { \__kernel_msg_log_eval:Nn \int_eval:n }
% \end{macrocode}
% \end{macro}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -495,7 +495,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[rEXP]{\intarray_to_clist:N, \intarray_to_clist:c}
% \begin{macro}[rEXP]{\@@_to_clist:Nn, \@@_to_clist:w}
% The \cs{@@_to_clist:Nn} auxiliary allows to choose the delimiter and
% is also used in \cs{intarray_show:N}. Here we just pass the information
@@ -504,8 +503,6 @@
% an issue since the delimiter is always just a comma or a comma and a space.
% In both cases \texttt{sprint(2, ...)} provides the right catcodes.
% \begin{macrocode}
- \cs_new:Npn \intarray_to_clist:N #1 { \@@_to_clist:Nn #1 { , } }
- \cs_generate_variant:Nn \intarray_to_clist:N { c }
%</tex>
%<*lua>
local concat = table.concat
@@ -517,7 +514,6 @@
%</lua>
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}[rEXP]{\__kernel_intarray_range_to_clist:Nnn, \@@_range_to_clist:w}
% Loop through part of the array.
@@ -840,14 +836,11 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[rEXP]{\intarray_to_clist:N, \intarray_to_clist:c}
% \begin{macro}[rEXP]{\@@_to_clist:Nn, \@@_to_clist:w}
% Loop through the array, putting a comma before each item. Remove
% the leading comma with |f|-expansion. We also use the auxiliary in
% \cs{intarray_show:N} with argument comma, space.
% \begin{macrocode}
- \cs_new:Npn \intarray_to_clist:N #1 { \@@_to_clist:Nn #1 { , } }
- \cs_generate_variant:Nn \intarray_to_clist:N { c }
\cs_new:Npn \@@_to_clist:Nn #1#2
{
\int_compare:nNnF { \intarray_count:N #1 } = \c_zero_int
@@ -867,7 +860,6 @@
}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}[rEXP]{\__kernel_intarray_range_to_clist:Nnn, \@@_range_to_clist:ww}
% Loop through part of the array.
@@ -941,103 +933,7 @@
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{Random arrays}
-%
-% \begin{macro}{\intarray_gset_rand:Nn, \intarray_gset_rand:cn}
-% \begin{macro}{\intarray_gset_rand:Nnn, \intarray_gset_rand:cnn}
-% \begin{macro}
-% {
-% \@@_gset_rand:Nnn,
-% \@@_gset_rand:Nff,
-% \@@_gset_rand_auxi:Nnnn,
-% \@@_gset_rand_auxii:Nnnn,
-% \@@_gset_rand_auxiii:Nnnn,
-% \@@_gset_all_same:Nn,
-% }
-% We only perform the bounds checks once. This is done by two
-% \cs{@@_gset_overflow_test:nw}, with an appropriate empty argument to
-% avoid a spurious \enquote{at position \texttt{\#1}} part in the
-% error message. Then calculate the number of choices: this is at
-% most $(2^{30}-1)-(-(2^{30}-1))+1=2^{31}-1$, which just barely does
-% not overflow. For small ranges use \cs{__kernel_randint:n} (making
-% sure to subtract~$1$ \emph{before} adding the random number to the
-% \meta{min}, to avoid overflow when \meta{min} or \meta{max} are
-% $\pm\cs{c_max_int}$), otherwise \cs{__kernel_randint:nn}. Finally,
-% if there are no random numbers do not define any of the auxiliaries.
% \begin{macrocode}
-\cs_new_protected:Npn \intarray_gset_rand:Nn #1
- { \intarray_gset_rand:Nnn #1 { 1 } }
-\cs_generate_variant:Nn \intarray_gset_rand:Nn { c }
-\sys_if_rand_exist:TF
- {
- \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
- {
- \@@_gset_rand:Nff #1
- { \int_eval:n {#2} } { \int_eval:n {#3} }
- }
- \cs_new_protected:Npn \@@_gset_rand:Nnn #1#2#3
- {
- \int_compare:nNnTF {#2} > {#3}
- {
- \msg_expandable_error:nnnn
- { kernel } { randint-backward-range } {#2} {#3}
- \@@_gset_rand:Nnn #1 {#3} {#2}
- }
- {
- \@@_gset_overflow_test:nw {#2}
- \@@_gset_rand_auxi:Nnnn #1 { } {#2} {#3}
- }
- }
- \cs_generate_variant:Nn \@@_gset_rand:Nnn { Nff }
- \cs_new_protected:Npn \@@_gset_rand_auxi:Nnnn #1#2#3#4
- {
- \@@_gset_overflow_test:nw {#4}
- \@@_gset_rand_auxii:Nnnn #1 { } {#4} {#3}
- }
- \cs_new_protected:Npn \@@_gset_rand_auxii:Nnnn #1#2#3#4
- {
- \exp_args:NNf \@@_gset_rand_auxiii:Nnnn #1
- { \int_eval:n { #3 - #4 + 1 } } {#4} {#3}
- }
- \cs_new_protected:Npn \@@_gset_rand_auxiii:Nnnn #1#2#3#4
- {
- \exp_args:NNf \@@_gset_all_same:Nn #1
- {
- \int_compare:nNnTF {#2} > \c__kernel_randint_max_int
- {
- \exp_stop_f:
- \int_eval:n { \__kernel_randint:nn {#3} {#4} }
- }
- {
- \exp_stop_f:
- \int_eval:n { \__kernel_randint:n {#2} - 1 + #3 }
- }
- }
- }
- \cs_new_protected:Npn \@@_gset_all_same:Nn #1#2
- {
- \int_zero:N \l_@@_loop_int
- \prg_replicate:nn { \intarray_count:N #1 }
- {
- \int_incr:N \l_@@_loop_int
- \__kernel_intarray_gset:Nnn #1 \l_@@_loop_int {#2}
- }
- }
- }
- {
- \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
- {
- \msg_error:nnn { kernel } { fp-no-random }
- { \intarray_gset_rand:Nnn #1 {#2} {#3} }
- }
- }
-\cs_generate_variant:Nn \intarray_gset_rand:Nnn { c }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macrocode}
%</tex>
%</package>
% \end{macrocode}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -296,6 +296,17 @@
% Inserts a kern of the specified \meta{length}, a dimension expression.
% \end{variable}
%
+% \begin{function}{\__kernel_msg_show_eval:Nn, \__kernel_msg_log_eval:Nn}
+% \begin{syntax}
+% \cs{__kernel_msg_show_eval:Nn} \meta{function} \Arg{expression}
+% \end{syntax}
+% Shows or logs the \meta{expression} (turned into a string), an equal
+% sign, and the result of applying the \meta{function} to the
+% \Arg{expression} (with \texttt{f}-expansion). For instance, if the
+% \meta{function} is \cs{int_eval:n} and the \meta{expression} is
+% |1+2| then this logs |> 1+2=3.|
+% \end{function}
+%
% \begin{variable}{\g__kernel_prg_map_int}
% This integer is used by non-expandable mapping functions to track
% the level of nesting in force. The functions
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -496,6 +496,35 @@
% present.
% \end{function}
%
+% \begin{function}[EXP, added = 2017-12-04]
+% {\msg_show_item:n, \msg_show_item_unbraced:n, \msg_show_item:nn, \msg_show_item_unbraced:nn}
+% \begin{syntax}
+% \cs{seq_map_function:NN} \meta{seq} \cs{msg_show_item:n}
+% \cs{prop_map_function:NN} \meta{prop} \cs{msg_show_item:nn}
+% \end{syntax}
+% Used in the text of messages for \cs{msg_show:nnxxxx} to show or log
+% a list of items or key--value pairs. The output of
+% \cs{msg_show_item:n} produces a newline, the prefix |>|, two spaces,
+% then the braced string representation of its argument.
+% The two-argument versions separates the key and value using
+% \verb*| => |, and the \texttt{unbraced} versions don't print the
+% surrounding braces.
+%
+% These functions are suitable for usage with iterator functions like
+% \cs{seq_map_function:NN}, \cs{prop_map_function:NN}, etc. For
+% example, with a sequence \cs[no-index]{l_tmpa_seq} containing |a|,
+% |{b}| and |\c|,
+% \begin{verbatim}
+% \seq_map_function:NN \l_tmpa_seq \msg_show_item:n
+% \end{verbatim}
+% would expand to three lines:
+% \begin{quotation}
+% \noindent\verb*|> {a}|\\
+% \verb*|> {{b}}|\\
+% \verb*|> {\c }|
+% \end{quotation}
+% \end{function}
+%
% \subsection{Expandable error messages}
%
% In very rare cases it may be necessary to produce errors in an
@@ -1382,6 +1411,40 @@
\group_end:
% \end{macrocode}
%
+% \begin{macro}[EXP]{\msg_show_item:n}
+% \begin{macro}[EXP]{\msg_show_item_unbraced:n}
+% \begin{macro}[EXP]{\msg_show_item:nn}
+% \begin{macro}[EXP]{\msg_show_item_unbraced:nn}
+% Each item in the variable is formatted using one of the following
+% functions. We cannot use |\\| and so on because these short-hands
+% cannot be used inside the arguments of messages, only when defining
+% the messages. We need to use |^^J| here directly as \pkg{l3file} is
+% not yet loaded.
+% \begin{macrocode}
+\cs_new:Npx \msg_show_item:n #1
+ { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
+\cs_new:Npx \msg_show_item_unbraced:n #1
+ { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
+\cs_new:Npx \msg_show_item:nn #1#2
+ {
+ ^^J > \use:nn { ~ } { ~ }
+ \exp_not:N \tl_to_str:n { {#1} }
+ \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
+ \exp_not:N \tl_to_str:n { {#2} }
+ }
+\cs_new:Npx \msg_show_item_unbraced:nn #1#2
+ {
+ ^^J > \use:nn { ~ } { ~ }
+ \exp_not:N \tl_to_str:n {#1}
+ \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
+ \exp_not:N \tl_to_str:n {#2}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\@@_class_chk_exist:nT}
% Checking that a message class exists. We build this from
% \cs{cs_if_free:cTF} rather than \cs{cs_if_exist:cTF} because that
@@ -1634,6 +1697,25 @@
%
% \subsection{Kernel-specific functions}
%
+% \begin{macro}{\__kernel_msg_show_eval:Nn, \__kernel_msg_log_eval:Nn, \@@_show_eval:nnN}
+% A short-hand used for \cs{int_show:n} and similar functions that
+% passes to \cs{tl_show:n} the result of applying |#1| (a
+% function such as \cs{int_eval:n}) to the expression |#2|. The use of
+% \texttt{f}-expansion ensures that |#1| is expanded in the scope in which the
+% show command is called, rather than in the group created by
+% \cs{iow_wrap:nnnN}. This is only important for expressions
+% involving the \tn{currentgrouplevel} or \tn{currentgrouptype}.
+% On the other hand we want the expression to be converted to a string
+% with the usual escape character, hence within the wrapping code.
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_msg_show_eval:Nn #1#2
+ { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
+\cs_new_protected:Npn \__kernel_msg_log_eval:Nn #1#2
+ { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
+\cs_new_protected:Npn \@@_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
+% \end{macrocode}
+% \end{macro}
+%
% These are all retained purely for older \pkg{xparse} support.
%
% \begin{macro}{\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -304,6 +304,18 @@
% the logical truth of this evaluation.
% \end{function}
%
+% \begin{function}[added = 2018-05-10]
+% {
+% \bool_set_inverse:N , \bool_set_inverse:c ,
+% \bool_gset_inverse:N, \bool_gset_inverse:c
+% }
+% \begin{syntax}
+% \cs{bool_set_inverse:N} \meta{boolean}
+% \end{syntax}
+% Toggles the \meta{boolean} from \texttt{true} to \texttt{false} and
+% conversely: sets it to the inverse of its current value.
+% \end{function}
+%
% \begin{function}[EXP,pTF, updated = 2017-07-15]{\bool_if:N, \bool_if:c}
% \begin{syntax}
% \cs{bool_if_p:N} \meta{boolean}
@@ -625,6 +637,45 @@
% then loops until the \meta{boolean expression} is \texttt{false}.
% \end{function}
%
+% \begin{function}[added = 2023-05-03, EXP, noTF]{\bool_case:n}
+% \begin{syntax}
+% \cs{bool_case:nTF} \\
+% ~~|{| \\
+% ~~~~\Arg{boolexpr case_1} \Arg{code case_1} \\
+% ~~~~\Arg{boolexpr case_2} \Arg{code case_2} \\
+% ~~~~\ldots \\
+% ~~~~\Arg{boolexpr case_n} \Arg{code case_n} \\
+% ~~|}| \\
+% ~~\Arg{true code}
+% ~~\Arg{false code}
+% \end{syntax}
+% Evaluates in turn each of the \meta{boolean expression cases} until
+% the first one that evaluates to \texttt{true}.
+% The \meta{code} associated to this first case is left in the input
+% stream, followed by the \meta{true code}, and other cases are
+% discarded. If none of the cases match then only the \meta{false
+% code} is inserted. The function \cs{bool_case_true:n},
+% which does nothing if there is no match, is
+% also available. For example
+% \begin{verbatim}
+% \bool_case:nF
+% {
+% { \dim_compare_p:n { \l__mypkg_wd_dim <= 10pt } }
+% { Fits }
+% { \int_compare_p:n { \l__mypkg_total_int >= 10 } }
+% { Many }
+% { \l__mypkg_special_bool }
+% { Special }
+% }
+% { No idea! }
+% \end{verbatim}
+% leaves \enquote{\texttt{Fits}} or \enquote{\texttt{Many}} or
+% \enquote{\texttt{Special}} or \enquote{\texttt{No idea!}} in the
+% input stream, in a way similar to some other language's
+% \enquote{\texttt{if} \ldots\ \texttt{elseif} \ldots\ \texttt{elseif} \ldots\
+% \texttt{else} \ldots}.
+% \end{function}
+%
% \section{Producing multiple copies}
%
% \begin{function}[updated = 2011-07-04, EXP]{\prg_replicate:nn}
@@ -929,6 +980,19 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}[added = 2018-05-10]
+% {\bool_set_inverse:N, \bool_set_inverse:c, \bool_gset_inverse:N, \bool_gset_inverse:c}
+% Set to \texttt{false} or \texttt{true} locally or globally.
+% \begin{macrocode}
+\cs_new_protected:Npn \bool_set_inverse:N #1
+ { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
+\cs_generate_variant:Nn \bool_set_inverse:N { c }
+\cs_new_protected:Npn \bool_gset_inverse:N #1
+ { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
+\cs_generate_variant:Nn \bool_gset_inverse:N { c }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Internal auxiliaries}
%
% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
@@ -984,9 +1048,9 @@
% Show the truth value of the boolean.
% \begin{macrocode}
\cs_new_protected:Npn \bool_show:n
- { \msg_show_eval:Nn \bool_to_str:n }
+ { \__kernel_msg_show_eval:Nn \bool_to_str:n }
\cs_new_protected:Npn \bool_log:n
- { \msg_log_eval:Nn \bool_to_str:n }
+ { \__kernel_msg_log_eval:Nn \bool_to_str:n }
% \end{macrocode}
% \end{macro}
%
@@ -1458,6 +1522,46 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP, noTF]{\bool_case:n}
+% \begin{macro}{\@@_case:NnTF}
+% \begin{macro}{\@@_case:w,a\@@_case_end:nw}
+% For boolean cases the overall idea is the same as for
+% \cs{tl_case:nnTF} as described in \pkg{l3tl}.
+% \begin{macrocode}
+\cs_new:Npn \bool_case:nTF
+ { \exp:w \@@_case:nTF }
+\cs_new:Npn \bool_case:nT #1#2
+ { \exp:w \@@_case:nTF {#1} {#2} { } }
+\cs_new:Npn \bool_case:nF #1
+ { \exp:w \@@_case:nTF {#1} { } }
+\cs_new:Npn \bool_case:n #1
+ { \exp:w \@@_case:nTF {#1} { } { } }
+\cs_new:Npn \@@_case:nTF #1#2#3
+ {
+ \@@_case:w
+ #1 \c_true_bool { } \s_@@_mark {#2} \s_@@_mark {#3} \s_@@_stop
+ }
+\cs_new:Npn \@@_case:w #1#2
+ {
+ \bool_if:nTF {#1}
+ { \@@_case_end:nw {#2} }
+ { \@@_case:w }
+ }
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
+ { \exp_end: #1 #4 }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Producing multiple copies}
%
% \begin{macrocode}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -3536,7 +3536,7 @@
\@@_compile_cs_aux:Nn
}
{
- \@@_quark_if_nil:NF #1 { \flag_raise_if_clear:n { @@_cs } }
+ \@@_quark_if_nil:NF #1 { \flag_ensure_raised:n { @@_cs } }
\@@_use_none_delimit_by_q_recursion_stop:w
}
}
@@ -3558,7 +3558,7 @@
{
\@@_quark_if_nil:NF #1
{
- \flag_raise_if_clear:n { @@_cs }
+ \flag_ensure_raised:n { @@_cs }
\@@_use_i_delimit_by_q_recursion_stop:nw
}
\@@_use_none_delimit_by_q_recursion_stop:w
@@ -6938,6 +6938,9 @@
% \end{macro}
%
% \begin{macro}{\@@_group_end_extract_seq:N}
+% \begin{macro}{\@@_extract_seq:N}
+% \begin{macro}{\@@_extract_seq:NNn}
+% \begin{macro}{\@@_extract_seq_loop:Nw}
% The end-points of submatches are stored as entries of two arrays
% from \cs{l_@@_min_submatch_int} to \cs{l_@@_submatch_int}
% (exclusive). Extract the relevant ranges into \cs{g_@@_internal_tl},
@@ -6977,12 +6980,28 @@
{ \int_use:N \l_@@_added_end_int }
}
\group_end:
- \cs_set_eq:NN \@@_tmp:w \@@_extract_map_loop:w
- \seq_set_from_function:NnN #1
- { \@@_extract_map:N } \exp_not:n
+ \@@_extract_seq:N #1
}
+\cs_gset_protected:Npn \@@_extract_seq:N #1
+ {
+ \seq_clear:N #1
+ \cs_set_eq:NN \@@_tmp:w \@@_extract_seq_loop:Nw
+ \exp_after:wN \@@_extract_seq:NNn
+ \exp_after:wN #1
+ \g_@@_internal_tl \use_none:nnn
+ }
+\cs_new_protected:Npn \@@_extract_seq:NNn #1#2#3
+ { #3 #2 #1 \prg_do_nothing: }
+\cs_new_protected:Npn \@@_extract_seq_loop:Nw #1#2 \@@_tmp:w #3
+ {
+ \seq_put_right:No #1 {#2}
+ #3 \@@_extract_seq_loop:Nw #1 \prg_do_nothing:
+ }
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}[EXP]{\@@_extract_seq_aux:n, \@@_extract_seq_aux:ww}
% The \texttt{:n} auxiliary builds one item of the sequence of
@@ -7090,35 +7109,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]
-% {
-% \@@_extract_map:N,
-% \@@_extract_map_aux:NNn,
-% \@@_extract_map_loop:w
-% }
-% This receives a |seq| internal function and maps it over all items
-% in \cs{g_@@_internal_tl}. This token list takes the form
-% \cs{@@_tmp:w} |{}| \meta{item_1} \cs{@@_tmp:w} |{}| \meta{item_2}
-% \ldots{} \cs{@@_tmp:w}, and the calling code has set \cs{@@_tmp:w}
-% equal to \cs{@@_extract_map_loop:w}. The loop is otherwise pretty
-% standard, with \cs{prg_do_nothing:} to avoid losing braces.
-% \begin{macrocode}
-\cs_new:Npn \@@_extract_map:N #1
- {
- \exp_after:wN \@@_extract_map_aux:NNn
- \exp_after:wN #1
- \g_@@_internal_tl \use_none:nnn
- }
-\cs_new:Npn \@@_extract_map_aux:NNn #1#2#3
- { #3 #2 #1 \prg_do_nothing: }
-\cs_new:Npn \@@_extract_map_loop:w #1#2 \@@_tmp:w #3
- {
- \exp_after:wN #1 \exp_after:wN {#2}
- #3 \@@_extract_map_loop:w #1 \prg_do_nothing:
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\@@_extract:, \@@_extract_aux:w}
% Our task here is to store the list of end-points of submatches, and
% store them in appropriate array entries, from
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -1608,50 +1608,42 @@
% somewhat moot. The integer variables are declared in \pkg{l3int}:
% load-order issues.
% \begin{macrocode}
-\cs_if_exist:NTF \tex_uniformdeviate:D
+\seq_new:N \g_@@_internal_seq
+\cs_new_protected:Npn \seq_shuffle:N { \@@_shuffle:NN \seq_set_eq:NN }
+\cs_new_protected:Npn \seq_gshuffle:N { \@@_shuffle:NN \seq_gset_eq:NN }
+\cs_new_protected:Npn \@@_shuffle:NN #1#2
{
- \seq_new:N \g_@@_internal_seq
- \cs_new_protected:Npn \seq_shuffle:N { \@@_shuffle:NN \seq_set_eq:NN }
- \cs_new_protected:Npn \seq_gshuffle:N { \@@_shuffle:NN \seq_gset_eq:NN }
- \cs_new_protected:Npn \@@_shuffle:NN #1#2
+ \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
{
- \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
- {
- \msg_error:nnx { seq } { shuffle-too-large }
- { \token_to_str:N #2 }
- }
- {
- \group_begin:
- \int_zero:N \l_@@_internal_a_int
- \@@_push_item_def:
- \cs_gset_eq:NN \@@_item:n \@@_shuffle_item:n
- #2
- \@@_pop_item_def:
- \seq_gset_from_inline_x:Nnn \g_@@_internal_seq
- { \int_step_function:nN { \l_@@_internal_a_int } }
- { \tex_the:D \tex_toks:D ##1 }
- \group_end:
- #1 #2 \g_@@_internal_seq
- \seq_gclear:N \g_@@_internal_seq
- }
+ \msg_error:nnx { seq } { shuffle-too-large }
+ { \token_to_str:N #2 }
}
- \cs_new_protected:Npn \@@_shuffle_item:n
{
- \int_incr:N \l_@@_internal_a_int
- \int_set:Nn \l_@@_internal_b_int
- { 1 + \tex_uniformdeviate:D \l_@@_internal_a_int }
- \tex_toks:D \l_@@_internal_a_int
- = \tex_toks:D \l_@@_internal_b_int
- \tex_toks:D \l_@@_internal_b_int
- }
+ \group_begin:
+ \int_zero:N \l_@@_internal_a_int
+ \@@_push_item_def:
+ \cs_gset_eq:NN \@@_item:n \@@_shuffle_item:n
+ #2
+ \@@_pop_item_def:
+ \seq_gclear:N \g_@@_internal_seq
+ \int_step_inline:nn \l_@@_internal_a_int
+ {
+ \seq_gput_right:Nx \g_@@_internal_seq
+ { \tex_the:D \tex_toks:D ##1 }
+ }
+ \group_end:
+ #1 #2 \g_@@_internal_seq
+ \seq_gclear:N \g_@@_internal_seq
+ }
}
+\cs_new_protected:Npn \@@_shuffle_item:n
{
- \cs_new_protected:Npn \seq_shuffle:N #1
- {
- \msg_error:nnn { kernel } { fp-no-random }
- { \seq_shuffle:N #1 }
- }
- \cs_new_eq:NN \seq_gshuffle:N \seq_shuffle:N
+ \int_incr:N \l_@@_internal_a_int
+ \int_set:Nn \l_@@_internal_b_int
+ { 1 + \tex_uniformdeviate:D \l_@@_internal_a_int }
+ \tex_toks:D \l_@@_internal_a_int
+ = \tex_toks:D \l_@@_internal_b_int
+ \tex_toks:D \l_@@_internal_b_int
}
\cs_generate_variant:Nn \seq_shuffle:N { c }
\cs_generate_variant:Nn \seq_gshuffle:N { c }
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -1738,7 +1738,7 @@
% dimension expressions: this gives a more unified output.
% \begin{macrocode}
\cs_new_protected:Npn \dim_show:n
- { \msg_show_eval:Nn \dim_eval:n }
+ { \__kernel_msg_show_eval:Nn \dim_eval:n }
% \end{macrocode}
% \end{macro}
%
@@ -1748,7 +1748,7 @@
\cs_new_eq:NN \dim_log:N \__kernel_register_log:N
\cs_new_eq:NN \dim_log:c \__kernel_register_log:c
\cs_new_protected:Npn \dim_log:n
- { \msg_log_eval:Nn \dim_eval:n }
+ { \__kernel_msg_log_eval:Nn \dim_eval:n }
% \end{macrocode}
% \end{macro}
%
@@ -1996,7 +1996,7 @@
% skip expressions: this gives a more unified output.
% \begin{macrocode}
\cs_new_protected:Npn \skip_show:n
- { \msg_show_eval:Nn \skip_eval:n }
+ { \__kernel_msg_show_eval:Nn \skip_eval:n }
% \end{macrocode}
% \end{macro}
%
@@ -2006,7 +2006,7 @@
\cs_new_eq:NN \skip_log:N \__kernel_register_log:N
\cs_new_eq:NN \skip_log:c \__kernel_register_log:c
\cs_new_protected:Npn \skip_log:n
- { \msg_log_eval:Nn \skip_eval:n }
+ { \__kernel_msg_log_eval:Nn \skip_eval:n }
% \end{macrocode}
% \end{macro}
%
@@ -2195,7 +2195,7 @@
% muskip expressions: this gives a more unified output.
% \begin{macrocode}
\cs_new_protected:Npn \muskip_show:n
- { \msg_show_eval:Nn \muskip_eval:n }
+ { \__kernel_msg_show_eval:Nn \muskip_eval:n }
% \end{macrocode}
% \end{macro}
%
@@ -2205,7 +2205,7 @@
\cs_new_eq:NN \muskip_log:N \__kernel_register_log:N
\cs_new_eq:NN \muskip_log:c \__kernel_register_log:c
\cs_new_protected:Npn \muskip_log:n
- { \msg_log_eval:Nn \muskip_eval:n }
+ { \__kernel_msg_log_eval:Nn \muskip_eval:n }
% \end{macrocode}
% \end{macro}
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -428,12 +428,13 @@
{
\group_begin:
\@@_main:NNNn #1 #2 #4 {#5}
- \seq_gset_from_inline_x:Nnn \g_@@_internal_seq
+ \seq_gclear:N \g_@@_internal_seq
+ \int_step_inline:nnn
+ \l_@@_min_int { \l_@@_top_int - 1 }
{
- \int_step_function:nnN
- { \l_@@_min_int } { \l_@@_top_int - 1 }
+ \seq_gput_right:Nx \g_@@_internal_seq
+ { \tex_the:D \tex_toks:D ##1 }
}
- { \tex_the:D \tex_toks:D ##1 }
\group_end:
#3 #4 \g_@@_internal_seq
\seq_gclear:N \g_@@_internal_seq
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -121,6 +121,27 @@
% \tn{fmtname}).
% \end{variable}
%
+% \begin{variable}[added = 2018-05-02]{\c_sys_engine_version_str}
+% The version string of the current engine, in the same form as
+% given in the banner issued when running a job. For \pdfTeX{}
+% and \LuaTeX{} this is of the form
+% \begin{quote}
+% \meta{major}.\meta{minor}.\meta{revision}
+% \end{quote}
+% For \XeTeX{}, the form is
+% \begin{quote}
+% \meta{major}.\meta{minor}
+% \end{quote}
+% For \pTeX{} and \upTeX{}, only releases since \TeX{} Live 2018
+% make the data available, and the form is more complex, as it comprises
+% the \pTeX{} version, the \upTeX{} version and the e-\pTeX{} version.
+% \begin{quote}
+% p\meta{major}.\meta{minor}.\meta{revision}-u\meta{major}.\meta{minor}^^A
+% -\meta{epTeX}
+% \end{quote}
+% where the |u| part is only present for \upTeX{}.
+% \end{variable}
+%
% \begin{function}[added = 2020-09-24, EXP]{\sys_timer:}
% \begin{syntax}
% \cs{sys_timer:}
@@ -472,18 +493,69 @@
% \end{macrocode}
% \end{variable}
%
-% \subsubsection{Randomness}
-%
-% This candidate function is placed there because
-% \cs{sys_if_rand_exist:TF} is used in \pkg{l3fp-rand}.
-%
-% \begin{macro}[EXP, pTF]{\sys_if_rand_exist:}
-% Currently, randomness exists under \pdfTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{}.
+% \begin{variable}{\c_sys_engine_version_str}
+% Various different engines, various different ways to extract the
+% data!
% \begin{macrocode}
-\@@_const:nn { sys_if_rand_exist }
- { \cs_if_exist_p:N \tex_uniformdeviate:D }
+\str_const:Nx \c_sys_engine_version_str
+ {
+ \str_case:on \c_sys_engine_str
+ {
+ { pdftex }
+ {
+ \int_div_truncate:nn { \tex_pdftexversion:D } { 100 }
+ .
+ \int_mod:nn { \tex_pdftexversion:D } { 100 }
+ .
+ \tex_pdftexrevision:D
+ }
+ { ptex }
+ {
+ \cs_if_exist:NT \tex_ptexversion:D
+ {
+ p
+ \int_use:N \tex_ptexversion:D
+ .
+ \int_use:N \tex_ptexminorversion:D
+ \tex_ptexrevision:D
+ -
+ \int_use:N \tex_epTeXversion:D
+ }
+ }
+ { luatex }
+ {
+ \int_div_truncate:nn { \tex_luatexversion:D } { 100 }
+ .
+ \int_mod:nn { \tex_luatexversion:D } { 100 }
+ .
+ \tex_luatexrevision:D
+ }
+ { uptex }
+ {
+ \cs_if_exist:NT \tex_ptexversion:D
+ {
+ p
+ \int_use:N \tex_ptexversion:D
+ .
+ \int_use:N \tex_ptexminorversion:D
+ \tex_ptexrevision:D
+ -
+ u
+ \int_use:N \tex_uptexversion:D
+ \tex_uptexrevision:D
+ -
+ \int_use:N \tex_epTeXversion:D
+ }
+ }
+ { xetex }
+ {
+ \int_use:N \tex_XeTeXversion:D
+ \tex_XeTeXrevision:D
+ }
+ }
+ }
% \end{macrocode}
-% \end{macro}
+% \end{variable}
%
% \subsubsection{Platform}
%
@@ -856,23 +928,11 @@
% \subsubsection{Random numbers}
%
% \begin{macro}[EXP]{\sys_rand_seed:}
-% Unpack the primitive. When random numbers are not available, we
-% return zero after an error (and incidentally make sure the number of
-% expansions needed is the same as with random numbers available).
+% Unpack the primitive.
% \begin{macrocode}
\@@_everyjob:n
{
- \sys_if_rand_exist:TF
- { \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D } }
- {
- \cs_new:Npn \sys_rand_seed:
- {
- \int_value:w
- \msg_expandable_error:nnn { kernel } { fp-no-random }
- { \sys_rand_seed: }
- \c_zero_int
- }
- }
+ \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D }
}
% \end{macrocode}
% \end{macro}
@@ -882,18 +942,8 @@
% \begin{macrocode}
\@@_everyjob:n
{
- \sys_if_rand_exist:TF
- {
- \cs_new_protected:Npn \sys_gset_rand_seed:n #1
- { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
- }
- {
- \cs_new_protected:Npn \sys_gset_rand_seed:n #1
- {
- \msg_error:nnn { kernel } { fp-no-random }
- { \sys_gset_rand_seed:n {#1} }
- }
- }
+ \cs_new_protected:Npn \sys_gset_rand_seed:n #1
+ { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
}
% \end{macrocode}
% \end{macro}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -1048,8 +1048,6 @@
%^^A The behavior of \cs{tl_range:Nnn} is exactly the same, acting on the
%^^A contents of the tl variable.
%
-% For better performance, see \cs{tl_range_braced:nnn} and
-% \cs{tl_range_unbraced:nnn}.
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{item}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
@@ -155,6 +155,11 @@
% \end{texnote}
% \end{function}
%
+% \begin{variable}[added = 2017-08-07]{\c_catcode_active_space_tl}
+% Token list containing one character with category code $13$,
+% (\enquote{active}), and character code $32$ (space).
+% \end{variable}
+%
% \begin{variable}[added = 2011-09-05]{\c_catcode_other_space_tl}
% Token list containing one character with category code $12$,
% (\enquote{other}), and character code $32$ (space).
@@ -1838,6 +1843,21 @@
% \end{macro}
% \end{macro}
%
+% \begin{variable}{\c_catcode_active_space_tl}
+% While \cs{char_generate:nn} can produce active characters in some
+% engines it cannot in general. It would be possible to simply change
+% the catcode of space but then the code would need to avoid all
+% spaces, making it quite unreadable. Instead we use the primitive
+% \cs{tex_lowercase:D} trick.
+% \begin{macrocode}
+\group_begin:
+ \char_set_catcode_active:N *
+ \char_set_lccode:nn { `* } { `\ }
+ \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } }
+\group_end:
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\c_catcode_other_space_tl}
% Create a space with category code $12$: an \enquote{other} space.
% \begin{macrocode}
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex 2023-05-05 21:23:26 UTC (rev 67026)
@@ -71,7 +71,7 @@
%% and all files in that bundle must be distributed together.
%%
%% File: expl3.dtx
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
\begingroup
\def\next{\endgroup}%
\expandafter\ifx\csname PackageError\endcsname\relax
@@ -5838,50 +5838,42 @@
}
\prg_generate_conditional_variant:Nnn \seq_if_empty:N
{ c } { p , T , F , TF }
-\cs_if_exist:NTF \tex_uniformdeviate:D
+\seq_new:N \g__seq_internal_seq
+\cs_new_protected:Npn \seq_shuffle:N { \__seq_shuffle:NN \seq_set_eq:NN }
+\cs_new_protected:Npn \seq_gshuffle:N { \__seq_shuffle:NN \seq_gset_eq:NN }
+\cs_new_protected:Npn \__seq_shuffle:NN #1#2
{
- \seq_new:N \g__seq_internal_seq
- \cs_new_protected:Npn \seq_shuffle:N { \__seq_shuffle:NN \seq_set_eq:NN }
- \cs_new_protected:Npn \seq_gshuffle:N { \__seq_shuffle:NN \seq_gset_eq:NN }
- \cs_new_protected:Npn \__seq_shuffle:NN #1#2
+ \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
{
- \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
- {
- \msg_error:nnx { seq } { shuffle-too-large }
- { \token_to_str:N #2 }
- }
- {
- \group_begin:
- \int_zero:N \l__seq_internal_a_int
- \__seq_push_item_def:
- \cs_gset_eq:NN \__seq_item:n \__seq_shuffle_item:n
- #2
- \__seq_pop_item_def:
- \seq_gset_from_inline_x:Nnn \g__seq_internal_seq
- { \int_step_function:nN { \l__seq_internal_a_int } }
- { \tex_the:D \tex_toks:D ##1 }
- \group_end:
- #1 #2 \g__seq_internal_seq
- \seq_gclear:N \g__seq_internal_seq
- }
+ \msg_error:nnx { seq } { shuffle-too-large }
+ { \token_to_str:N #2 }
}
- \cs_new_protected:Npn \__seq_shuffle_item:n
{
- \int_incr:N \l__seq_internal_a_int
- \int_set:Nn \l__seq_internal_b_int
- { 1 + \tex_uniformdeviate:D \l__seq_internal_a_int }
- \tex_toks:D \l__seq_internal_a_int
- = \tex_toks:D \l__seq_internal_b_int
- \tex_toks:D \l__seq_internal_b_int
- }
+ \group_begin:
+ \int_zero:N \l__seq_internal_a_int
+ \__seq_push_item_def:
+ \cs_gset_eq:NN \__seq_item:n \__seq_shuffle_item:n
+ #2
+ \__seq_pop_item_def:
+ \seq_gclear:N \g__seq_internal_seq
+ \int_step_inline:nn \l__seq_internal_a_int
+ {
+ \seq_gput_right:Nx \g__seq_internal_seq
+ { \tex_the:D \tex_toks:D ##1 }
+ }
+ \group_end:
+ #1 #2 \g__seq_internal_seq
+ \seq_gclear:N \g__seq_internal_seq
+ }
}
+\cs_new_protected:Npn \__seq_shuffle_item:n
{
- \cs_new_protected:Npn \seq_shuffle:N #1
- {
- \msg_error:nnn { kernel } { fp-no-random }
- { \seq_shuffle:N #1 }
- }
- \cs_new_eq:NN \seq_gshuffle:N \seq_shuffle:N
+ \int_incr:N \l__seq_internal_a_int
+ \int_set:Nn \l__seq_internal_b_int
+ { 1 + \tex_uniformdeviate:D \l__seq_internal_a_int }
+ \tex_toks:D \l__seq_internal_a_int
+ = \tex_toks:D \l__seq_internal_b_int
+ \tex_toks:D \l__seq_internal_b_int
}
\cs_generate_variant:Nn \seq_shuffle:N { c }
\cs_generate_variant:Nn \seq_gshuffle:N { c }
@@ -7117,11 +7109,11 @@
\cs_new_eq:NN \int_show:N \__kernel_register_show:N
\cs_generate_variant:Nn \int_show:N { c }
\cs_new_protected:Npn \int_show:n
- { \msg_show_eval:Nn \int_eval:n }
+ { \__kernel_msg_show_eval:Nn \int_eval:n }
\cs_new_eq:NN \int_log:N \__kernel_register_log:N
\cs_generate_variant:Nn \int_log:N { c }
\cs_new_protected:Npn \int_log:n
- { \msg_log_eval:Nn \int_eval:n }
+ { \__kernel_msg_log_eval:Nn \int_eval:n }
\int_const:Nn \c_one_int { 1 }
\int_const:Nn \c_max_int { 2 147 483 647 }
\int_const:Nn \c_max_char_int
@@ -7199,6 +7191,13 @@
\cs:w flag~#1 \exp_after:wN \cs_end:
\int_value:w \flag_height:n {#1} ;
}
+\cs_new:Npn \flag_ensure_raised:n #1
+ {
+ \if_cs_exist:w flag~#1~0 \cs_end:
+ \else:
+ \cs:w flag~#1 \cs_end: 0 ;
+ \fi:
+ }
%% File: l3prg.dtx
\cs_new_eq:NN \if_predicate:w \tex_ifodd:D
\cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool }
@@ -7237,6 +7236,12 @@
}
\cs_generate_variant:Nn \bool_set:Nn { c }
\cs_generate_variant:Nn \bool_gset:Nn { c }
+\cs_new_protected:Npn \bool_set_inverse:N #1
+ { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
+\cs_generate_variant:Nn \bool_set_inverse:N { c }
+\cs_new_protected:Npn \bool_gset_inverse:N #1
+ { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
+\cs_generate_variant:Nn \bool_gset_inverse:N { c }
\quark_new:N \q__bool_recursion_tail
\quark_new:N \q__bool_recursion_stop
\cs_new:Npn \__bool_use_i_delimit_by_q_recursion_stop:nw
@@ -7255,9 +7260,9 @@
\cs_generate_variant:Nn \bool_to_str:N { c }
\cs_new:Npn \bool_to_str:n #1 { \bool_if:nTF {#1} { true } { false } }
\cs_new_protected:Npn \bool_show:n
- { \msg_show_eval:Nn \bool_to_str:n }
+ { \__kernel_msg_show_eval:Nn \bool_to_str:n }
\cs_new_protected:Npn \bool_log:n
- { \msg_log_eval:Nn \bool_to_str:n }
+ { \__kernel_msg_log_eval:Nn \bool_to_str:n }
\cs_new_protected:Npn \bool_show:N { \__bool_show:NN \tl_show:n }
\cs_generate_variant:Nn \bool_show:N { c }
\cs_new_protected:Npn \bool_log:N { \__bool_show:NN \tl_log:n }
@@ -7444,6 +7449,29 @@
#2
\bool_if:nF {#1} { \bool_do_until:nn {#1} {#2} }
}
+\scan_new:N \s__bool_mark
+\scan_new:N \s__bool_stop
+\cs_new:Npn \bool_case:nTF
+ { \exp:w \__bool_case:nTF }
+\cs_new:Npn \bool_case:nT #1#2
+ { \exp:w \__bool_case:nTF {#1} {#2} { } }
+\cs_new:Npn \bool_case:nF #1
+ { \exp:w \__bool_case:nTF {#1} { } }
+\cs_new:Npn \bool_case:n #1
+ { \exp:w \__bool_case:nTF {#1} { } { } }
+\cs_new:Npn \__bool_case:nTF #1#2#3
+ {
+ \__bool_case:w
+ #1 \c_true_bool { } \s__bool_mark {#2} \s__bool_mark {#3} \s__bool_stop
+ }
+\cs_new:Npn \__bool_case:w #1#2
+ {
+ \bool_if:nTF {#1}
+ { \__bool_case_end:nw {#2} }
+ { \__bool_case:w }
+ }
+\cs_new:Npn \__bool_case_end:nw #1#2#3 \s__bool_mark #4#5 \s__bool_stop
+ { \exp_end: #1 #4 }
\cs_new:Npn \prg_replicate:nn #1
{
\exp:w
@@ -7594,8 +7622,63 @@
}
{ unknown }
}
-\__sys_const:nn { sys_if_rand_exist }
- { \cs_if_exist_p:N \tex_uniformdeviate:D }
+\str_const:Nx \c_sys_engine_version_str
+ {
+ \str_case:on \c_sys_engine_str
+ {
+ { pdftex }
+ {
+ \int_div_truncate:nn { \tex_pdftexversion:D } { 100 }
+ .
+ \int_mod:nn { \tex_pdftexversion:D } { 100 }
+ .
+ \tex_pdftexrevision:D
+ }
+ { ptex }
+ {
+ \cs_if_exist:NT \tex_ptexversion:D
+ {
+ p
+ \int_use:N \tex_ptexversion:D
+ .
+ \int_use:N \tex_ptexminorversion:D
+ \tex_ptexrevision:D
+ -
+ \int_use:N \tex_epTeXversion:D
+ }
+ }
+ { luatex }
+ {
+ \int_div_truncate:nn { \tex_luatexversion:D } { 100 }
+ .
+ \int_mod:nn { \tex_luatexversion:D } { 100 }
+ .
+ \tex_luatexrevision:D
+ }
+ { uptex }
+ {
+ \cs_if_exist:NT \tex_ptexversion:D
+ {
+ p
+ \int_use:N \tex_ptexversion:D
+ .
+ \int_use:N \tex_ptexminorversion:D
+ \tex_ptexrevision:D
+ -
+ u
+ \int_use:N \tex_uptexversion:D
+ \tex_uptexrevision:D
+ -
+ \int_use:N \tex_epTeXversion:D
+ }
+ }
+ { xetex }
+ {
+ \int_use:N \tex_XeTeXversion:D
+ \tex_XeTeXrevision:D
+ }
+ }
+ }
\cs_new_protected:Npn \sys_load_backend:n #1
{
\sys_finalise:
@@ -7786,32 +7869,12 @@
}
\__sys_everyjob:n
{
- \sys_if_rand_exist:TF
- { \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D } }
- {
- \cs_new:Npn \sys_rand_seed:
- {
- \int_value:w
- \msg_expandable_error:nnn { kernel } { fp-no-random }
- { \sys_rand_seed: }
- \c_zero_int
- }
- }
+ \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D }
}
\__sys_everyjob:n
{
- \sys_if_rand_exist:TF
- {
- \cs_new_protected:Npn \sys_gset_rand_seed:n #1
- { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
- }
- {
- \cs_new_protected:Npn \sys_gset_rand_seed:n #1
- {
- \msg_error:nnn { kernel } { fp-no-random }
- { \sys_gset_rand_seed:n {#1} }
- }
- }
+ \cs_new_protected:Npn \sys_gset_rand_seed:n #1
+ { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
}
\sys_if_engine_luatex:TF
{
@@ -8961,6 +9024,11 @@
}
\cs_new:Npn \__char_str_change_case:n #1
{ \char_generate:nn {#1} { 12 } }
+\group_begin:
+ \char_set_catcode_active:N *
+ \char_set_lccode:nn { `* } { `\ }
+ \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } }
+\group_end:
\tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\ } { 12 } }
\scan_new:N \s__token_mark
\scan_new:N \s__token_stop
@@ -10248,6 +10316,24 @@
}
}
\group_end:
+\cs_new:Npx \msg_show_item:n #1
+ { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
+\cs_new:Npx \msg_show_item_unbraced:n #1
+ { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
+\cs_new:Npx \msg_show_item:nn #1#2
+ {
+ ^^J > \use:nn { ~ } { ~ }
+ \exp_not:N \tl_to_str:n { {#1} }
+ \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
+ \exp_not:N \tl_to_str:n { {#2} }
+ }
+\cs_new:Npx \msg_show_item_unbraced:nn #1#2
+ {
+ ^^J > \use:nn { ~ } { ~ }
+ \exp_not:N \tl_to_str:n {#1}
+ \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
+ \exp_not:N \tl_to_str:n {#2}
+ }
\cs_new:Npn \__msg_class_chk_exist:nT #1
{
\cs_if_free:cTF { __msg_ #1 _code:nnnnnn }
@@ -10382,6 +10468,11 @@
}
\cs_generate_variant:Nn \__msg_redirect_loop_chk:nnn { o }
\cs_new:Npn \__msg_redirect_loop_list:n #1 { {#1} ~ => ~ }
+\cs_new_protected:Npn \__kernel_msg_show_eval:Nn #1#2
+ { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
+\cs_new_protected:Npn \__kernel_msg_log_eval:Nn #1#2
+ { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
+\cs_new_protected:Npn \__msg_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
\cs_new_protected:Npn \__kernel_msg_new:nnnn #1
{ \msg_new:nnnn { LaTeX / #1 } }
\cs_new_protected:Npn \__kernel_msg_new:nnn #1
@@ -10854,6 +10945,27 @@
{ {#2} }
{ \exp_not:N \__kernel_file_name_quote:n {#2} \scan_stop: }
}
+\cs_new_protected:Npn \ior_shell_open:Nn #1#2
+ {
+ \sys_if_shell:TF
+ { \exp_args:No \__ior_shell_open:nN { \tl_to_str:n {#2} } #1 }
+ { \msg_error:nn { ior } { pipe-failed } }
+ }
+\cs_new_protected:Npn \__ior_shell_open:nN #1#2
+ {
+ \tl_if_in:nnTF {#1} { " }
+ {
+ \msg_error:nnx
+ { kernel } { quote-in-shell } {#1}
+ }
+ { \__kernel_ior_open:Nn #2 { |#1 } }
+ }
+\msg_new:nnnn { ior } { pipe-failed }
+ { Cannot~run~piped~system~commands. }
+ {
+ LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
+ Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
+ }
\cs_new_protected:Npn \ior_close:N #1
{
\int_compare:nT { -1 < #1 < \c__ior_term_ior }
@@ -11184,16 +11296,16 @@
\c_catcode_other_space_tl
}
}
-\cs_new_protected:Npn \iow_allow_break:
+\cs_new_protected:Npn \iow_wrap_allow_break:
{
\msg_error:nnnn { kernel } { iow-indent }
- { \iow_wrap:nnnN } { \iow_allow_break: }
+ { \iow_wrap:nnnN } { \iow_wrap_allow_break: }
}
-\cs_new:Npx \__iow_allow_break: { \c__iow_wrap_allow_break_marker_tl }
-\cs_new:Npn \__iow_allow_break_error:
+\cs_new:Npx \__iow_wrap_allow_break: { \c__iow_wrap_allow_break_marker_tl }
+\cs_new:Npn \__iow_wrap_allow_break_error:
{
\msg_expandable_error:nnnn { kernel } { iow-indent }
- { \iow_wrap:nnnN } { \iow_allow_break: }
+ { \iow_wrap:nnnN } { \iow_wrap_allow_break: }
}
\cs_new_protected:Npn \iow_indent:n #1
{
@@ -11226,12 +11338,12 @@
\int_set:Nn \tex_escapechar:D { 92 }
\cs_set_eq:NN \\ \iow_newline:
\cs_set_eq:NN \ \c_catcode_other_space_tl
- \cs_set_eq:NN \iow_allow_break: \__iow_allow_break:
+ \cs_set_eq:NN \iow_wrap_allow_break: \__iow_wrap_allow_break:
\cs_set_eq:NN \iow_indent:n \__iow_indent:n
#3
\cs_set_eq:NN \protect \token_to_str:N
\__kernel_tl_set:Nx \l__iow_wrap_tl {#1}
- \cs_set_eq:NN \iow_allow_break: \__iow_allow_break_error:
+ \cs_set_eq:NN \iow_wrap_allow_break: \__iow_wrap_allow_break_error:
\cs_set_eq:NN \iow_indent:n \__iow_indent_error:n
\__kernel_tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 }
\__kernel_tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl }
@@ -12646,11 +12758,11 @@
\cs_new_eq:NN \dim_show:N \__kernel_register_show:N
\cs_generate_variant:Nn \dim_show:N { c }
\cs_new_protected:Npn \dim_show:n
- { \msg_show_eval:Nn \dim_eval:n }
+ { \__kernel_msg_show_eval:Nn \dim_eval:n }
\cs_new_eq:NN \dim_log:N \__kernel_register_log:N
\cs_new_eq:NN \dim_log:c \__kernel_register_log:c
\cs_new_protected:Npn \dim_log:n
- { \msg_log_eval:Nn \dim_eval:n }
+ { \__kernel_msg_log_eval:Nn \dim_eval:n }
\dim_const:Nn \c_zero_dim { 0 pt }
\dim_const:Nn \c_max_dim { 16383.99999 pt }
\dim_new:N \l_tmpa_dim
@@ -12738,11 +12850,11 @@
\cs_new_eq:NN \skip_show:N \__kernel_register_show:N
\cs_generate_variant:Nn \skip_show:N { c }
\cs_new_protected:Npn \skip_show:n
- { \msg_show_eval:Nn \skip_eval:n }
+ { \__kernel_msg_show_eval:Nn \skip_eval:n }
\cs_new_eq:NN \skip_log:N \__kernel_register_log:N
\cs_new_eq:NN \skip_log:c \__kernel_register_log:c
\cs_new_protected:Npn \skip_log:n
- { \msg_log_eval:Nn \skip_eval:n }
+ { \__kernel_msg_log_eval:Nn \skip_eval:n }
\skip_const:Nn \c_zero_skip { \c_zero_dim }
\skip_const:Nn \c_max_skip { \c_max_dim }
\skip_new:N \l_tmpa_skip
@@ -12806,11 +12918,11 @@
\cs_new_eq:NN \muskip_show:N \__kernel_register_show:N
\cs_generate_variant:Nn \muskip_show:N { c }
\cs_new_protected:Npn \muskip_show:n
- { \msg_show_eval:Nn \muskip_eval:n }
+ { \__kernel_msg_show_eval:Nn \muskip_eval:n }
\cs_new_eq:NN \muskip_log:N \__kernel_register_log:N
\cs_new_eq:NN \muskip_log:c \__kernel_register_log:c
\cs_new_protected:Npn \muskip_log:n
- { \msg_log_eval:Nn \muskip_eval:n }
+ { \__kernel_msg_log_eval:Nn \muskip_eval:n }
\muskip_const:Nn \c_zero_muskip { 0 mu }
\muskip_const:Nn \c_max_muskip { 16383.99999 mu }
\muskip_new:N \l_tmpa_muskip
@@ -14302,8 +14414,6 @@
\__kernel_intarray_gset:Nnn #1 \l__intarray_loop_int { \int_eval:n {##1} } }
}
\cs_generate_variant:Nn \intarray_const_from_clist:Nn { c }
- \cs_new:Npn \intarray_to_clist:N #1 { \__intarray_to_clist:Nn #1 { , } }
- \cs_generate_variant:Nn \intarray_to_clist:N { c }
\cs_new:Npn \__kernel_intarray_range_to_clist:Nnn #1#2#3
{
\__intarray_range_to_clist:w #1
@@ -14451,8 +14561,6 @@
\__intarray_gset_overflow_test:nw {#1}
\__kernel_intarray_gset:Nnn #2 \l__intarray_loop_int {#1}
}
- \cs_new:Npn \intarray_to_clist:N #1 { \__intarray_to_clist:Nn #1 { , } }
- \cs_generate_variant:Nn \intarray_to_clist:N { c }
\cs_new:Npn \__intarray_to_clist:Nn #1#2
{
\int_compare:nNnF { \intarray_count:N #1 } = \c_zero_int
@@ -14519,73 +14627,6 @@
{ }
}
}
-\cs_new_protected:Npn \intarray_gset_rand:Nn #1
- { \intarray_gset_rand:Nnn #1 { 1 } }
-\cs_generate_variant:Nn \intarray_gset_rand:Nn { c }
-\sys_if_rand_exist:TF
- {
- \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
- {
- \__intarray_gset_rand:Nff #1
- { \int_eval:n {#2} } { \int_eval:n {#3} }
- }
- \cs_new_protected:Npn \__intarray_gset_rand:Nnn #1#2#3
- {
- \int_compare:nNnTF {#2} > {#3}
- {
- \msg_expandable_error:nnnn
- { kernel } { randint-backward-range } {#2} {#3}
- \__intarray_gset_rand:Nnn #1 {#3} {#2}
- }
- {
- \__intarray_gset_overflow_test:nw {#2}
- \__intarray_gset_rand_auxi:Nnnn #1 { } {#2} {#3}
- }
- }
- \cs_generate_variant:Nn \__intarray_gset_rand:Nnn { Nff }
- \cs_new_protected:Npn \__intarray_gset_rand_auxi:Nnnn #1#2#3#4
- {
- \__intarray_gset_overflow_test:nw {#4}
- \__intarray_gset_rand_auxii:Nnnn #1 { } {#4} {#3}
- }
- \cs_new_protected:Npn \__intarray_gset_rand_auxii:Nnnn #1#2#3#4
- {
- \exp_args:NNf \__intarray_gset_rand_auxiii:Nnnn #1
- { \int_eval:n { #3 - #4 + 1 } } {#4} {#3}
- }
- \cs_new_protected:Npn \__intarray_gset_rand_auxiii:Nnnn #1#2#3#4
- {
- \exp_args:NNf \__intarray_gset_all_same:Nn #1
- {
- \int_compare:nNnTF {#2} > \c__kernel_randint_max_int
- {
- \exp_stop_f:
- \int_eval:n { \__kernel_randint:nn {#3} {#4} }
- }
- {
- \exp_stop_f:
- \int_eval:n { \__kernel_randint:n {#2} - 1 + #3 }
- }
- }
- }
- \cs_new_protected:Npn \__intarray_gset_all_same:Nn #1#2
- {
- \int_zero:N \l__intarray_loop_int
- \prg_replicate:nn { \intarray_count:N #1 }
- {
- \int_incr:N \l__intarray_loop_int
- \__kernel_intarray_gset:Nnn #1 \l__intarray_loop_int {#2}
- }
- }
- }
- {
- \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
- {
- \msg_error:nnn { kernel } { fp-no-random }
- { \intarray_gset_rand:Nnn #1 {#2} {#3} }
- }
- }
-\cs_generate_variant:Nn \intarray_gset_rand:Nnn { c }
%% File: l3fp.dtx
%% File: l3fp-aux.dtx
\cs_new_eq:NN \__fp_int_eval:w \tex_numexpr:D
@@ -15016,7 +15057,7 @@
{
#1
\__fp_error:nnfn { invalid } {##2} { \fp_to_tl:n { ##3; } } { }
- \flag_raise_if_clear:n { fp_invalid_operation }
+ \flag_ensure_raised:n { fp_invalid_operation }
##1
}
\exp_args:Nno \use:n
@@ -15025,7 +15066,7 @@
#1
\__fp_error:nffn { invalid-ii }
{ \fp_to_tl:n { ##2; } } { \fp_to_tl:n { ##3; } } {##1}
- \flag_raise_if_clear:n { fp_invalid_operation }
+ \flag_ensure_raised:n { fp_invalid_operation }
\exp_after:wN \c_nan_fp
}
\exp_args:Nno \use:n
@@ -15033,7 +15074,7 @@
{
#1
\__fp_error:nffn { invalid } {##1} {##2} { }
- \flag_raise_if_clear:n { fp_invalid_operation }
+ \flag_ensure_raised:n { fp_invalid_operation }
\exp_after:wN \c_nan_fp
}
}
@@ -15050,7 +15091,7 @@
{
#1
\__fp_error:nnfn { zero-div } {##2} { \fp_to_tl:n { ##3; } } { }
- \flag_raise_if_clear:n { fp_division_by_zero }
+ \flag_ensure_raised:n { fp_division_by_zero }
\exp_after:wN ##1
}
\exp_args:Nno \use:n
@@ -15059,7 +15100,7 @@
#1
\__fp_error:nffn { zero-div-ii }
{ \fp_to_tl:n { ##3; } } { \fp_to_tl:n { ##4; } } {##2}
- \flag_raise_if_clear:n { fp_division_by_zero }
+ \flag_ensure_raised:n { fp_division_by_zero }
\exp_after:wN ##1
}
}
@@ -15090,7 +15131,7 @@
{ \fp_to_tl:n { \s__fp \__fp_chk:w ##1##2##3; } }
{ \token_if_eq_meaning:NNF 0 ##2 { - } #4 }
{#2}
- \flag_raise_if_clear:n { fp_#2 }
+ \flag_ensure_raised:n { fp_#2 }
#3 ##2
}
}
@@ -16854,9 +16895,9 @@
{ \s__fp \__fp_chk:w #2 #3 #4 #5 ; }
}
\cs_new_protected:Npn \fp_show:n
- { \msg_show_eval:Nn \fp_to_tl:n }
+ { \__kernel_msg_show_eval:Nn \fp_to_tl:n }
\cs_new_protected:Npn \fp_log:n
- { \msg_log_eval:Nn \fp_to_tl:n }
+ { \__kernel_msg_log_eval:Nn \fp_to_tl:n }
\fp_const:Nn \c_e_fp { 2.718 2818 2845 9045 }
\fp_const:Nn \c_one_fp { 1 }
\fp_const:Nn \c_pi_fp { 3.141 5926 5358 9793 }
@@ -20472,293 +20513,266 @@
{ \__fp_parse_function:NNN \__fp_rand_o:Nw ? }
\cs_new:Npn \__fp_parse_word_randint:N
{ \__fp_parse_function:NNN \__fp_randint_o:Nw ? }
-\sys_if_rand_exist:F
+\int_const:Nn \c__kernel_randint_max_int { 131071 }
+\cs_new:Npn \__kernel_randint:n #1
{
- \msg_new:nnn { kernel } { fp-no-random }
- { Random~numbers~unavailable~for~#1 }
- \cs_new:Npn \__fp_rand_o:Nw ? #1 @
+ (#1 * \tex_uniformdeviate:D 16384
+ + \tex_uniformdeviate:D #1 + 8192 ) / 16384
+ }
+\cs_new:Npn \__fp_rand_myriads:n #1
+ { \__fp_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
+\cs_new:Npn \__fp_rand_myriads_loop:w #1 X
+ {
+ #1
+ \exp_after:wN \__fp_rand_myriads_get:w
+ \int_value:w \__fp_int_eval:w 9999 +
+ \__kernel_randint:n { 10000 }
+ \__fp_rand_myriads_loop:w
+ }
+\cs_new:Npn \__fp_rand_myriads_get:w 1 #1 ; { ; {#1} }
+\cs_new:Npn \__fp_rand_o:Nw ? #1 @
+ {
+ \tl_if_empty:nTF {#1}
{
- \msg_expandable_error:nnn { kernel } { fp-no-random }
- { fp~rand }
- \exp_after:wN \c_nan_fp
+ \exp_after:wN \__fp_rand_o:w
+ \exp:w \exp_end_continue_f:w
+ \__fp_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
}
- \cs_new_eq:NN \__fp_randint_o:Nw \__fp_rand_o:Nw
- \cs_new:Npn \int_rand:nn #1#2
{
- \msg_expandable_error:nnn { kernel } { fp-no-random }
- { \int_rand:nn {#1} {#2} }
- \int_eval:n {#1}
+ \msg_expandable_error:nnnnn
+ { fp } { num-args } { rand() } { 0 } { 0 }
+ \exp_after:wN \c_nan_fp
}
- \cs_new:Npn \int_rand:n #1
- {
- \msg_expandable_error:nnn { kernel } { fp-no-random }
- { \int_rand:n {#1} }
- 1
- }
}
-\sys_if_rand_exist:T
+\cs_new:Npn \__fp_rand_o:w ;
{
- \int_const:Nn \c__kernel_randint_max_int { 131071 }
- \cs_new:Npn \__kernel_randint:n #1
+ \exp_after:wN \__fp_sanitize:Nw
+ \exp_after:wN 0
+ \int_value:w \__fp_int_eval:w \c_zero_int
+ \__fp_fixed_to_float_o:wN
+ }
+\cs_new:Npn \__fp_randint_o:Nw ?
+ {
+ \__fp_parse_function_one_two:nnw
+ { randint }
+ { \__fp_randint_default:w \__fp_randint_o:w }
+ }
+\cs_new:Npn \__fp_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
+\cs_new:Npn \__fp_randint_badarg:w \s__fp \__fp_chk:w #1#2#3;
+ {
+ \__fp_int:wTF \s__fp \__fp_chk:w #1#2#3;
{
- (#1 * \tex_uniformdeviate:D 16384
- + \tex_uniformdeviate:D #1 + 8192 ) / 16384
- }
- \cs_new:Npn \__fp_rand_myriads:n #1
- { \__fp_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
- \cs_new:Npn \__fp_rand_myriads_loop:w #1 X
- {
- #1
- \exp_after:wN \__fp_rand_myriads_get:w
- \int_value:w \__fp_int_eval:w 9999 +
- \__kernel_randint:n { 10000 }
- \__fp_rand_myriads_loop:w
- }
- \cs_new:Npn \__fp_rand_myriads_get:w 1 #1 ; { ; {#1} }
- \cs_new:Npn \__fp_rand_o:Nw ? #1 @
- {
- \tl_if_empty:nTF {#1}
- {
- \exp_after:wN \__fp_rand_o:w
- \exp:w \exp_end_continue_f:w
- \__fp_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
- }
- {
- \msg_expandable_error:nnnnn
- { fp } { num-args } { rand() } { 0 } { 0 }
- \exp_after:wN \c_nan_fp
- }
- }
- \cs_new:Npn \__fp_rand_o:w ;
- {
- \exp_after:wN \__fp_sanitize:Nw
- \exp_after:wN 0
- \int_value:w \__fp_int_eval:w \c_zero_int
- \__fp_fixed_to_float_o:wN
- }
- \cs_new:Npn \__fp_randint_o:Nw ?
- {
- \__fp_parse_function_one_two:nnw
- { randint }
- { \__fp_randint_default:w \__fp_randint_o:w }
- }
- \cs_new:Npn \__fp_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
- \cs_new:Npn \__fp_randint_badarg:w \s__fp \__fp_chk:w #1#2#3;
- {
- \__fp_int:wTF \s__fp \__fp_chk:w #1#2#3;
- {
- \if_meaning:w 1 #1
- \if_int_compare:w
- \__fp_use_i_until_s:nw #3 ; > \c__fp_prec_int
- \c_one_int
- \fi:
- \fi:
- }
- { \c_one_int }
- }
- \cs_new:Npn \__fp_randint_o:w #1; #2; @
- {
- \if_case:w
- \__fp_randint_badarg:w #1;
- \__fp_randint_badarg:w #2;
- \if:w 1 \__fp_compare_back:ww #2; #1; \c_one_int \fi:
- \c_zero_int
- \__fp_randint_auxi_o:ww #1; #2;
- \or:
- \__fp_invalid_operation_tl_o:ff
- { randint } { \__fp_array_to_clist:n { #1; #2; } }
- \exp:w
+ \if_meaning:w 1 #1
+ \if_int_compare:w
+ \__fp_use_i_until_s:nw #3 ; > \c__fp_prec_int
+ \c_one_int
+ \fi:
\fi:
- \exp_after:wN \exp_end:
}
- \cs_new:Npn \__fp_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
+ { \c_one_int }
+ }
+\cs_new:Npn \__fp_randint_o:w #1; #2; @
+ {
+ \if_case:w
+ \__fp_randint_badarg:w #1;
+ \__fp_randint_badarg:w #2;
+ \if:w 1 \__fp_compare_back:ww #2; #1; \c_one_int \fi:
+ \c_zero_int
+ \__fp_randint_auxi_o:ww #1; #2;
+ \or:
+ \__fp_invalid_operation_tl_o:ff
+ { randint } { \__fp_array_to_clist:n { #1; #2; } }
+ \exp:w
+ \fi:
+ \exp_after:wN \exp_end:
+ }
+\cs_new:Npn \__fp_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
+ {
+ \fi:
+ \__fp_randint_auxii:wn #2 ;
+ { \__fp_randint_auxii:wn #1 ; \__fp_randint_auxiii_o:ww }
+ }
+\cs_new:Npn \__fp_randint_auxii:wn \s__fp \__fp_chk:w #1#2#3#4 ;
+ {
+ \if_meaning:w 0 #1
+ \exp_after:wN \use_i:nn
+ \else:
+ \exp_after:wN \use_ii:nn
+ \fi:
+ { \exp_after:wN \__fp_fixed_continue:wn \c__fp_one_fixed_tl }
+ {
+ \exp_after:wN \__fp_ep_to_fixed:wwn
+ \int_value:w \__fp_int_eval:w
+ #3 - \c__fp_prec_int , #4 {0000} {0000} ;
{
+ \if_meaning:w 0 #2
+ \exp_after:wN \use_i:nnnn
+ \exp_after:wN \__fp_fixed_add_one:wN
\fi:
- \__fp_randint_auxii:wn #2 ;
- { \__fp_randint_auxii:wn #1 ; \__fp_randint_auxiii_o:ww }
- }
- \cs_new:Npn \__fp_randint_auxii:wn \s__fp \__fp_chk:w #1#2#3#4 ;
- {
- \if_meaning:w 0 #1
- \exp_after:wN \use_i:nn
- \else:
- \exp_after:wN \use_ii:nn
- \fi:
- { \exp_after:wN \__fp_fixed_continue:wn \c__fp_one_fixed_tl }
- {
- \exp_after:wN \__fp_ep_to_fixed:wwn
- \int_value:w \__fp_int_eval:w
- #3 - \c__fp_prec_int , #4 {0000} {0000} ;
- {
- \if_meaning:w 0 #2
- \exp_after:wN \use_i:nnnn
- \exp_after:wN \__fp_fixed_add_one:wN
- \fi:
- \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl
- }
- \__fp_fixed_continue:wn
- }
- }
- \cs_new:Npn \__fp_randint_auxiii_o:ww #1 ; #2 ;
- {
- \__fp_fixed_add:wwn #2 ;
- {0000} {0000} {0000} {0001} {0000} {0000} ;
- \__fp_fixed_sub:wwn #1 ;
- {
- \exp_after:wN \use_i:nn
- \exp_after:wN \__fp_fixed_mul_add:wwwn
- \exp:w \exp_end_continue_f:w \__fp_rand_myriads:n { XXXXXX } ;
- }
- #1 ;
- \__fp_randint_auxiv_o:ww
- #2 ;
- \__fp_randint_auxv_o:w #1 ; @
- }
- \cs_new:Npn \__fp_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
- {
- \if_int_compare:w
- \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
- \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
- #3#4 > #8#9 \exp_stop_f:
- \__fp_use_i_until_s:nw
- \fi:
- \__fp_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
- }
- \cs_new:Npn \__fp_randint_auxv_o:w #1#2#3#4#5 ; #6 @
- {
- \exp_after:wN \__fp_sanitize:Nw
- \int_value:w
- \if_int_compare:w #1 < 10000 \exp_stop_f:
- 2
- \else:
- 0
- \exp_after:wN \exp_after:wN
- \exp_after:wN \__fp_reverse_args:Nww
- \fi:
\exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl
- {#1} {#2} {#3} {#4} {0000} {0000} ;
- {
- \exp_after:wN \exp_stop_f:
- \int_value:w \__fp_int_eval:w \c__fp_prec_int
- \__fp_fixed_to_float_o:wN
- }
- 0
- \exp:w \exp_after:wN \exp_end:
}
- \cs_new:Npn \int_rand:nn #1#2
+ \__fp_fixed_continue:wn
+ }
+ }
+\cs_new:Npn \__fp_randint_auxiii_o:ww #1 ; #2 ;
+ {
+ \__fp_fixed_add:wwn #2 ;
+ {0000} {0000} {0000} {0001} {0000} {0000} ;
+ \__fp_fixed_sub:wwn #1 ;
+ {
+ \exp_after:wN \use_i:nn
+ \exp_after:wN \__fp_fixed_mul_add:wwwn
+ \exp:w \exp_end_continue_f:w \__fp_rand_myriads:n { XXXXXX } ;
+ }
+ #1 ;
+ \__fp_randint_auxiv_o:ww
+ #2 ;
+ \__fp_randint_auxv_o:w #1 ; @
+ }
+\cs_new:Npn \__fp_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
+ {
+ \if_int_compare:w
+ \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
+ \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
+ #3#4 > #8#9 \exp_stop_f:
+ \__fp_use_i_until_s:nw
+ \fi:
+ \__fp_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
+ }
+\cs_new:Npn \__fp_randint_auxv_o:w #1#2#3#4#5 ; #6 @
+ {
+ \exp_after:wN \__fp_sanitize:Nw
+ \int_value:w
+ \if_int_compare:w #1 < 10000 \exp_stop_f:
+ 2
+ \else:
+ 0
+ \exp_after:wN \exp_after:wN
+ \exp_after:wN \__fp_reverse_args:Nww
+ \fi:
+ \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl
+ {#1} {#2} {#3} {#4} {0000} {0000} ;
+ {
+ \exp_after:wN \exp_stop_f:
+ \int_value:w \__fp_int_eval:w \c__fp_prec_int
+ \__fp_fixed_to_float_o:wN
+ }
+ 0
+ \exp:w \exp_after:wN \exp_end:
+ }
+\cs_new:Npn \int_rand:nn #1#2
+ {
+ \int_eval:n
{
- \int_eval:n
- {
- \exp_after:wN \__fp_randint:ww
- \int_value:w \int_eval:n {#1} \exp_after:wN ;
- \int_value:w \int_eval:n {#2} ;
- }
+ \exp_after:wN \__fp_randint:ww
+ \int_value:w \int_eval:n {#1} \exp_after:wN ;
+ \int_value:w \int_eval:n {#2} ;
}
- \cs_new:Npn \__fp_randint:ww #1; #2;
- {
- \if_int_compare:w #1 > #2 \exp_stop_f:
- \msg_expandable_error:nnnn
- { kernel } { randint-backward-range } {#1} {#2}
- \__fp_randint:ww #2; #1;
- \else:
- \if_int_compare:w \__fp_int_eval:w #2
- \if_int_compare:w #1 > \c_zero_int
- - #1 < \__fp_int_eval:w
- \else:
- < \__fp_int_eval:w #1 +
- \fi:
- \c__kernel_randint_max_int
- \__fp_int_eval_end:
- \__kernel_randint:n
- { \__fp_int_eval:w #2 - #1 + 1 \__fp_int_eval_end: }
- - 1 + #1
+ }
+\cs_new:Npn \__fp_randint:ww #1; #2;
+ {
+ \if_int_compare:w #1 > #2 \exp_stop_f:
+ \msg_expandable_error:nnnn
+ { kernel } { randint-backward-range } {#1} {#2}
+ \__fp_randint:ww #2; #1;
+ \else:
+ \if_int_compare:w \__fp_int_eval:w #2
+ \if_int_compare:w #1 > \c_zero_int
+ - #1 < \__fp_int_eval:w
\else:
- \__kernel_randint:nn {#1} {#2}
+ < \__fp_int_eval:w #1 +
\fi:
- \fi:
- }
- \cs_new:Npn \__kernel_randint:nn #1#2
- {
- #1
- \exp_after:wN \__fp_randint_wide_aux:w
+ \c__kernel_randint_max_int
+ \__fp_int_eval_end:
+ \__kernel_randint:n
+ { \__fp_int_eval:w #2 - #1 + 1 \__fp_int_eval_end: }
+ - 1 + #1
+ \else:
+ \__kernel_randint:nn {#1} {#2}
+ \fi:
+ \fi:
+ }
+\cs_new:Npn \__kernel_randint:nn #1#2
+ {
+ #1
+ \exp_after:wN \__fp_randint_wide_aux:w
+ \int_value:w
+ \exp_after:wN \__fp_randint_split_o:Nw
+ \tex_uniformdeviate:D 268435456 ;
+ \int_value:w
+ \exp_after:wN \__fp_randint_split_o:Nw
+ \tex_uniformdeviate:D 268435456 ;
+ \int_value:w
+ \exp_after:wN \__fp_randint_split_o:Nw
+ \int_value:w \__fp_int_eval:w 131072 +
+ \exp_after:wN \__fp_randint_split_o:Nw
\int_value:w
- \exp_after:wN \__fp_randint_split_o:Nw
- \tex_uniformdeviate:D 268435456 ;
- \int_value:w
- \exp_after:wN \__fp_randint_split_o:Nw
- \tex_uniformdeviate:D 268435456 ;
- \int_value:w
- \exp_after:wN \__fp_randint_split_o:Nw
- \int_value:w \__fp_int_eval:w 131072 +
- \exp_after:wN \__fp_randint_split_o:Nw
- \int_value:w
- \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
- .
- }
- \cs_new:Npn \__fp_randint_split_o:Nw #1#2 ;
- {
- \if_meaning:w 0 #1
- 0 \exp_after:wN ; \int_value:w 0
- \else:
- \exp_after:wN \__fp_randint_split_aux:w
- \int_value:w \__fp_int_eval:w (#1#2 - 8192) / 16384 ;
- + #1#2
- \fi:
- \exp_after:wN ;
- }
- \cs_new:Npn \__fp_randint_split_aux:w #1 ;
- {
- #1 \exp_after:wN ;
- \int_value:w \__fp_int_eval:w - #1 * 16384
- }
- \cs_new:Npn \__fp_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
- {
- \exp_after:wN \__fp_randint_wide_auxii:w
- \int_value:w \__fp_int_eval:w #5 * #3 + #6 * #1 +
- (#5 * #4 + #6 * #3 + #7 * #1 +
- (#5 * #2 + #7 * #3 +
- (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
- ) / 16384 \exp_after:wN ;
- \int_value:w \__fp_int_eval:w (#5 + #6) * 16384 + #7 ;
- #1 ; #5 ;
- }
- \cs_new:Npn \__fp_randint_wide_auxii:w #1; #2; #3; #4;
- {
- \if_int_odd:w 0
- \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
- \if_int_compare:w #4 = \c_zero_int 1 \fi:
- \if_int_compare:w #3 = 16383 ~ 1 \fi:
- \exp_stop_f:
- \exp_after:wN \prg_break:
- \fi:
- \if_int_compare:w #4 < 8 \exp_stop_f:
- + #4 * #3 * 16384
- \else:
- + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
- \fi:
- + #1
- \prg_break_point:
- }
- \cs_new:Npn \int_rand:n #1
- {
- \int_eval:n
- { \exp_args:Nf \__fp_randint:n { \int_eval:n {#1} } }
- }
- \cs_new:Npn \__fp_randint:n #1
- {
- \if_int_compare:w #1 < \c_one_int
- \msg_expandable_error:nnnn
- { kernel } { randint-backward-range } { 1 } {#1}
- \__fp_randint:ww #1; 1;
- \else:
- \if_int_compare:w #1 > \c__kernel_randint_max_int
- \__kernel_randint:nn { 1 } {#1}
- \else:
- \__kernel_randint:n {#1}
- \fi:
- \fi:
- }
+ \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
+ .
}
+\cs_new:Npn \__fp_randint_split_o:Nw #1#2 ;
+ {
+ \if_meaning:w 0 #1
+ 0 \exp_after:wN ; \int_value:w 0
+ \else:
+ \exp_after:wN \__fp_randint_split_aux:w
+ \int_value:w \__fp_int_eval:w (#1#2 - 8192) / 16384 ;
+ + #1#2
+ \fi:
+ \exp_after:wN ;
+ }
+\cs_new:Npn \__fp_randint_split_aux:w #1 ;
+ {
+ #1 \exp_after:wN ;
+ \int_value:w \__fp_int_eval:w - #1 * 16384
+ }
+\cs_new:Npn \__fp_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
+ {
+ \exp_after:wN \__fp_randint_wide_auxii:w
+ \int_value:w \__fp_int_eval:w #5 * #3 + #6 * #1 +
+ (#5 * #4 + #6 * #3 + #7 * #1 +
+ (#5 * #2 + #7 * #3 +
+ (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
+ ) / 16384 \exp_after:wN ;
+ \int_value:w \__fp_int_eval:w (#5 + #6) * 16384 + #7 ;
+ #1 ; #5 ;
+ }
+\cs_new:Npn \__fp_randint_wide_auxii:w #1; #2; #3; #4;
+ {
+ \if_int_odd:w 0
+ \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
+ \if_int_compare:w #4 = \c_zero_int 1 \fi:
+ \if_int_compare:w #3 = 16383 ~ 1 \fi:
+ \exp_stop_f:
+ \exp_after:wN \prg_break:
+ \fi:
+ \if_int_compare:w #4 < 8 \exp_stop_f:
+ + #4 * #3 * 16384
+ \else:
+ + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
+ \fi:
+ + #1
+ \prg_break_point:
+ }
+\cs_new:Npn \int_rand:n #1
+ {
+ \int_eval:n
+ { \exp_args:Nf \__fp_randint:n { \int_eval:n {#1} } }
+ }
+\cs_new:Npn \__fp_randint:n #1
+ {
+ \if_int_compare:w #1 < \c_one_int
+ \msg_expandable_error:nnnn
+ { kernel } { randint-backward-range } { 1 } {#1}
+ \__fp_randint:ww #1; 1;
+ \else:
+ \if_int_compare:w #1 > \c__kernel_randint_max_int
+ \__kernel_randint:nn { 1 } {#1}
+ \else:
+ \__kernel_randint:n {#1}
+ \fi:
+ \fi:
+ }
%% File: l3fparray.dtx
\int_new:N \g__fp_array_int
\int_new:N \l__fp_array_loop_int
@@ -21470,12 +21484,13 @@
{
\group_begin:
\__sort_main:NNNn #1 #2 #4 {#5}
- \seq_gset_from_inline_x:Nnn \g__sort_internal_seq
+ \seq_gclear:N \g__sort_internal_seq
+ \int_step_inline:nnn
+ \l__sort_min_int { \l__sort_top_int - 1 }
{
- \int_step_function:nnN
- { \l__sort_min_int } { \l__sort_top_int - 1 }
+ \seq_gput_right:Nx \g__sort_internal_seq
+ { \tex_the:D \tex_toks:D ##1 }
}
- { \tex_the:D \tex_toks:D ##1 }
\group_end:
#3 #4 \g__sort_internal_seq
\seq_gclear:N \g__sort_internal_seq
@@ -25168,7 +25183,7 @@
\__regex_compile_cs_aux:Nn
}
{
- \__regex_quark_if_nil:NF #1 { \flag_raise_if_clear:n { __regex_cs } }
+ \__regex_quark_if_nil:NF #1 { \flag_ensure_raised:n { __regex_cs } }
\__regex_use_none_delimit_by_q_recursion_stop:w
}
}
@@ -25190,7 +25205,7 @@
{
\__regex_quark_if_nil:NF #1
{
- \flag_raise_if_clear:n { __regex_cs }
+ \flag_ensure_raised:n { __regex_cs }
\__regex_use_i_delimit_by_q_recursion_stop:nw
}
\__regex_use_none_delimit_by_q_recursion_stop:w
@@ -27051,10 +27066,23 @@
{ \int_use:N \l__regex_added_end_int }
}
\group_end:
- \cs_set_eq:NN \__regex_tmp:w \__regex_extract_map_loop:w
- \seq_set_from_function:NnN #1
- { \__regex_extract_map:N } \exp_not:n
+ \__regex_extract_seq:N #1
}
+\cs_gset_protected:Npn \__regex_extract_seq:N #1
+ {
+ \seq_clear:N #1
+ \cs_set_eq:NN \__regex_tmp:w \__regex_extract_seq_loop:Nw
+ \exp_after:wN \__regex_extract_seq:NNn
+ \exp_after:wN #1
+ \g__regex_internal_tl \use_none:nnn
+ }
+\cs_new_protected:Npn \__regex_extract_seq:NNn #1#2#3
+ { #3 #2 #1 \prg_do_nothing: }
+\cs_new_protected:Npn \__regex_extract_seq_loop:Nw #1#2 \__regex_tmp:w #3
+ {
+ \seq_put_right:No #1 {#2}
+ #3 \__regex_extract_seq_loop:Nw #1 \prg_do_nothing:
+ }
\cs_new:Npn \__regex_extract_seq_aux:n #1
{
\__regex_tmp:w { }
@@ -27115,19 +27143,6 @@
\if_false: { \fi: }
\__regex_tmp:w
}
-\cs_new:Npn \__regex_extract_map:N #1
- {
- \exp_after:wN \__regex_extract_map_aux:NNn
- \exp_after:wN #1
- \g__regex_internal_tl \use_none:nnn
- }
-\cs_new:Npn \__regex_extract_map_aux:NNn #1#2#3
- { #3 #2 #1 \prg_do_nothing: }
-\cs_new:Npn \__regex_extract_map_loop:w #1#2 \__regex_tmp:w #3
- {
- \exp_after:wN #1 \exp_after:wN {#2}
- #3 \__regex_extract_map_loop:w #1 \prg_do_nothing:
- }
\cs_new_protected:Npn \__regex_extract:
{
\if_meaning:w \c_true_bool \g__regex_success_bool
@@ -35540,97 +35555,6 @@
\q_recursion_stop
\group_end:
%% File: l3candidates.dtx
-\cs_new:Npn \flag_raise_if_clear:n #1
- {
- \if_cs_exist:w flag~#1~0 \cs_end:
- \else:
- \cs:w flag~#1 \cs_end: 0 ;
- \fi:
- }
-\cs_new_protected:Npn \msg_show_eval:Nn #1#2
- { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
-\cs_new_protected:Npn \msg_log_eval:Nn #1#2
- { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
-\cs_new_protected:Npn \__msg_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
-\cs_new:Npx \msg_show_item:n #1
- { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
-\cs_new:Npx \msg_show_item_unbraced:n #1
- { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
-\cs_new:Npx \msg_show_item:nn #1#2
- {
- \iow_newline: > \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n { {#1} }
- \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n { {#2} }
- }
-\cs_new:Npx \msg_show_item_unbraced:nn #1#2
- {
- \iow_newline: > \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n {#1}
- \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n {#2}
- }
-\cs_new_protected:Npn \bool_set_inverse:N #1
- { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
-\cs_generate_variant:Nn \bool_set_inverse:N { c }
-\cs_new_protected:Npn \bool_gset_inverse:N #1
- { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
-\cs_generate_variant:Nn \bool_gset_inverse:N { c }
-\scan_new:N \s__bool_mark
-\scan_new:N \s__bool_stop
-\cs_new:Npn \bool_case_true:nTF
- { \exp:w \__bool_case:NnTF \c_true_bool }
-\cs_new:Npn \bool_case_true:nT #1#2
- { \exp:w \__bool_case:NnTF \c_true_bool {#1} {#2} { } }
-\cs_new:Npn \bool_case_true:nF #1
- { \exp:w \__bool_case:NnTF \c_true_bool {#1} { } }
-\cs_new:Npn \bool_case_true:n #1
- { \exp:w \__bool_case:NnTF \c_true_bool {#1} { } { } }
-\cs_new:Npn \bool_case_false:nTF
- { \exp:w \__bool_case:NnTF \c_false_bool }
-\cs_new:Npn \bool_case_false:nT #1#2
- { \exp:w \__bool_case:NnTF \c_false_bool {#1} {#2} { } }
-\cs_new:Npn \bool_case_false:nF #1
- { \exp:w \__bool_case:NnTF \c_false_bool {#1} { } }
-\cs_new:Npn \bool_case_false:n #1
- { \exp:w \__bool_case:NnTF \c_false_bool {#1} { } { } }
-\cs_new:Npn \__bool_case:NnTF #1#2#3#4
- {
- \bool_if:NTF #1 \__bool_case_true:w \__bool_case_false:w
- #2 #1 { } \s__bool_mark {#3} \s__bool_mark {#4} \s__bool_stop
- }
-\cs_new:Npn \__bool_case_true:w #1#2
- {
- \bool_if:nTF {#1}
- { \__bool_case_end:nw {#2} }
- { \__bool_case_true:w }
- }
-\cs_new:Npn \__bool_case_false:w #1#2
- {
- \bool_if:nTF {#1}
- { \__bool_case_false:w }
- { \__bool_case_end:nw {#2} }
- }
-\cs_new:Npn \__bool_case_end:nw #1#2#3 \s__bool_mark #4#5 \s__bool_stop
- { \exp_end: #1 #4 }
-\cs_new:Npn \__prop_use_i_delimit_by_s_stop:nw #1 #2 \s__prop_stop {#1}
-\cs_new:Npn \prop_rand_key_value:N #1
- {
- \prop_if_empty:NF #1
- {
- \exp_after:wN \__prop_rand_item:w
- \int_value:w \int_rand:nn { 1 } { \prop_count:N #1 }
- #1 \s__prop_stop
- }
- }
-\cs_generate_variant:Nn \prop_rand_key_value:N { c }
-\cs_new:Npn \__prop_rand_item:w #1 \s__prop \__prop_pair:wn #2 \s__prop #3
- {
- \int_compare:nNnF {#1} > 1
- { \__prop_use_i_delimit_by_s_stop:nw { \exp_not:n { {#2} {#3} } } }
- \exp_after:wN \__prop_rand_item:w
- \int_value:w \int_eval:n { #1 - 1 } \s__prop
- }
\cs_new:Npn \seq_mapthread_function:NNN #1#2#3
{ \exp_after:wN \__seq_mapthread_function:wNN #2 \s__seq_stop #1 #3 }
\cs_new:Npn \__seq_mapthread_function:wNN \s__seq #1 \s__seq_stop #2#3
@@ -35663,20 +35587,6 @@
#1 #2 { #3 }
\__seq_pop_item_def:
}
-\cs_new_protected:Npn \seq_set_from_inline_x:Nnn
- { \__seq_set_from_inline_x:NNnn \__kernel_tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
- { \__seq_set_from_inline_x:NNnn \__kernel_tl_gset:Nx }
-\cs_new_protected:Npn \__seq_set_from_inline_x:NNnn #1#2#3#4
- {
- \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} }
- #1 #2 { \s__seq #3 \__seq_item:n }
- \__seq_pop_item_def:
- }
-\cs_new_protected:Npn \seq_set_from_function:NnN #1#2#3
- { \seq_set_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
-\cs_new_protected:Npn \seq_gset_from_function:NnN #1#2#3
- { \seq_gset_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
\cs_new_eq:NN \__seq_int_eval:w \tex_numexpr:D
\cs_new_protected:Npn \seq_set_item:Nnn #1#2#3
{ \__seq_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_set:Nx \use_i:nn }
@@ -35784,84 +35694,6 @@
\if_false: { \fi: }
\l__seq_internal_b_tl { \if_false: } \fi: \exp_not:n {#1}
}
-\str_const:Nx \c_sys_engine_version_str
- {
- \str_case:on \c_sys_engine_str
- {
- { pdftex }
- {
- \int_div_truncate:nn { \tex_pdftexversion:D } { 100 }
- .
- \int_mod:nn { \tex_pdftexversion:D } { 100 }
- .
- \tex_pdftexrevision:D
- }
- { ptex }
- {
- \cs_if_exist:NT \tex_ptexversion:D
- {
- p
- \int_use:N \tex_ptexversion:D
- .
- \int_use:N \tex_ptexminorversion:D
- \tex_ptexrevision:D
- -
- \int_use:N \tex_epTeXversion:D
- }
- }
- { luatex }
- {
- \int_div_truncate:nn { \tex_luatexversion:D } { 100 }
- .
- \int_mod:nn { \tex_luatexversion:D } { 100 }
- .
- \tex_luatexrevision:D
- }
- { uptex }
- {
- \cs_if_exist:NT \tex_ptexversion:D
- {
- p
- \int_use:N \tex_ptexversion:D
- .
- \int_use:N \tex_ptexminorversion:D
- \tex_ptexrevision:D
- -
- u
- \int_use:N \tex_uptexversion:D
- \tex_uptexrevision:D
- -
- \int_use:N \tex_epTeXversion:D
- }
- }
- { xetex }
- {
- \int_use:N \tex_XeTeXversion:D
- \tex_XeTeXrevision:D
- }
- }
- }
-\cs_new_protected:Npn \ior_shell_open:Nn #1#2
- {
- \sys_if_shell:TF
- { \exp_args:No \__ior_shell_open:nN { \tl_to_str:n {#2} } #1 }
- { \msg_error:nn { ior } { pipe-failed } }
- }
-\cs_new_protected:Npn \__ior_shell_open:nN #1#2
- {
- \tl_if_in:nnTF {#1} { " }
- {
- \msg_error:nnx
- { kernel } { quote-in-shell } {#1}
- }
- { \__kernel_ior_open:Nn #2 { |#1 } }
- }
-\msg_new:nnnn { ior } { pipe-failed }
- { Cannot~run~piped~system~commands. }
- {
- LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
- Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
- }
\cs_new_protected:Npn \tl_build_begin:N #1
{ \__tl_build_begin:NN \cs_set_nopar:Npx #1 }
\cs_new_protected:Npn \tl_build_gbegin:N #1
@@ -35968,86 +35800,6 @@
#2 #1
\exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } #2
}
-\cs_new:Npn \tl_range_braced:Nnn { \exp_args:No \tl_range_braced:nnn }
-\cs_generate_variant:Nn \tl_range_braced:Nnn { c }
-\cs_new:Npn \tl_range_braced:nnn { \__tl_range:Nnnn \__tl_range_braced:w }
-\cs_new:Npn \tl_range_unbraced:Nnn
- { \exp_args:No \tl_range_unbraced:nnn }
-\cs_generate_variant:Nn \tl_range_unbraced:Nnn { c }
-\cs_new:Npn \tl_range_unbraced:nnn
- { \__tl_range:Nnnn \__tl_range_unbraced:w }
-\cs_new:Npn \__tl_range_braced:w #1 ; #2
- { \__tl_range_collect_braced:w #1 ; { } #2 }
-\cs_new:Npn \__tl_range_unbraced:w #1 ; #2
- { \__tl_range_collect_unbraced:w #1 ; { } #2 }
-\cs_new:Npn \__tl_range_collect_braced:w #1 ; #2#3
- {
- \if_int_compare:w #1 > \c_one_int
- \exp_after:wN \__tl_range_collect_braced:w
- \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
- \fi:
- { #2 {#3} }
- }
-\cs_new:Npn \__tl_range_collect_unbraced:w #1 ; #2#3
- {
- \if_int_compare:w #1 > \c_one_int
- \exp_after:wN \__tl_range_collect_unbraced:w
- \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
- \fi:
- { #2 #3 }
- }
-\group_begin:
- \char_set_catcode_active:N *
- \char_set_lccode:nn { `* } { `\ }
- \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } }
-\group_end:
-\tl_new:N \l__peek_collect_tl
-\cs_new_protected:Npn \peek_catcode_collect_inline:Nn
- { \__peek_collect:NNn \__peek_execute_branches_catcode: }
-\cs_new_protected:Npn \peek_charcode_collect_inline:Nn
- { \__peek_collect:NNn \__peek_execute_branches_charcode: }
-\cs_new_protected:Npn \peek_meaning_collect_inline:Nn
- { \__peek_collect:NNn \__peek_execute_branches_meaning: }
-\cs_new_protected:Npn \__peek_collect:NNn #1#2#3
- {
- \group_align_safe_begin:
- \cs_set_eq:NN \l__peek_search_token #2
- \tl_set:Nn \l__peek_search_tl {#2}
- \tl_clear:N \l__peek_collect_tl
- \cs_set:Npn \__peek_false:w
- { \exp_args:No \__peek_false_aux:n \l__peek_collect_tl }
- \cs_set:Npn \__peek_false_aux:n ##1
- {
- \group_align_safe_end:
- #3
- }
- \cs_set_eq:NN \__peek_true:w \__peek_collect_true:w
- \cs_set:Npn \__peek_true_aux:w { \peek_after:Nw #1 }
- \__peek_true_aux:w
- }
-\cs_new_protected:Npn \__peek_collect_true:w
- {
- \if_case:w
- \if_catcode:w \exp_not:N \l_peek_token { 1 \exp_stop_f: \fi:
- \if_catcode:w \exp_not:N \l_peek_token } 2 \exp_stop_f: \fi:
- \if_meaning:w \l_peek_token \c_space_token 3 \exp_stop_f: \fi:
- 0 \exp_stop_f:
- \exp_after:wN \__peek_collect:N
- \or: \__peek_collect_remove:nw { \c_group_begin_token }
- \or: \__peek_collect_remove:nw { \c_group_end_token }
- \or: \__peek_collect_remove:nw { ~ }
- \fi:
- }
-\cs_new_protected:Npn \__peek_collect:N #1
- {
- \tl_put_right:Nn \l__peek_collect_tl {#1}
- \__peek_true_aux:w
- }
-\cs_new_protected:Npn \__peek_collect_remove:nw #1
- {
- \tl_put_right:Nn \l__peek_collect_tl {#1}
- \exp_after:wN \__peek_true_remove:w
- }
%% File: l3legacy.dtx
\prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF }
{
@@ -36349,6 +36101,14 @@
\__deprecation_old:Nnn \xetex_if_engine:TF
{ \sys_if_engine_xetex:TF } { 2017-01-01 }
\cs_gset:Npn \cs_argument_spec:N { \cs_parameter_spec:N }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:n }
+\cs_gset:Npn \bool_case_true:n { \bool_case:n }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nT }
+\cs_gset:Npn \bool_case_true:nT { \bool_case:nT }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nF }
+\cs_gset:Npn \bool_case_true:nF { \bool_case:nF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nTF }
+\cs_gset:Npn \bool_case_true:nTF { \bool_case:nTF }
\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:n }
\cs_gset:Npn \str_lower_case:n { \str_lowercase:n }
\__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:f }
Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex 2023-05-05 21:23:26 UTC (rev 67026)
@@ -19,7 +19,7 @@
%% and all files in that bundle must be distributed together.
%%
%% File: expl3.dtx
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
\let\ExplLoaderFileDate\ExplFileDate
\begingroup
\catcode`\_=11
Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx 2023-05-05 21:23:26 UTC (rev 67026)
@@ -19,7 +19,7 @@
%% and all files in that bundle must be distributed together.
%%
%% File: expl3.dtx
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
\let\ExplLoaderFileDate\ExplFileDate
\begingroup
\catcode`\_=11
Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty 2023-05-05 21:23:26 UTC (rev 67026)
@@ -19,7 +19,7 @@
%% and all files in that bundle must be distributed together.
%%
%% File: expl3.dtx
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
\let\ExplLoaderFileDate\ExplFileDate
\ProvidesPackage{expl3}
[%
Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def 2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def 2023-05-05 21:23:26 UTC (rev 67026)
@@ -575,7 +575,7 @@
\flag_if_raised:nTF
\flag_if_raised_p:n
\flag_height:n
- \flag_raise_if_clear:n
+ \flag_ensure_raised:n
\flag_clear:n
}
\__kernel_patch:nnn
More information about the tex-live-commits
mailing list.