summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2024-04-30 20:03:09 +0000
committerKarl Berry <karl@freefriends.org>2024-04-30 20:03:09 +0000
commit753708379c1fbd17a96f1a6788c94ce1fa1208d7 (patch)
treed1bfa8c85ad78bf1312298d97eb72490baa44683 /Master/texmf-dist/source
parent93ae2978eea5bd5c39e8e0ac208a658c4c0c2e05 (diff)
l3kernel (30apr24)
git-svn-id: svn://tug.org/texlive/trunk@71140 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/expl3.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3.ins3
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3basics.dtx16
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3box.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx33
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3clist.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3color.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3debug.dtx15
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx63
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3doc.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3expan.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3file.dtx19
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3flag.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx57
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3int.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx75
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx29
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3keys.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3msg.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3names.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx362
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prg.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prop.dtx40
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3quark.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3regex.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3seq.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3skip.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sort.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sys.dtx21
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx5
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3token.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx4
62 files changed, 639 insertions, 213 deletions
diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
index 76ef8ec9193..56a62010fae 100644
--- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2024-03-14}%
+\def\ExplFileDate{2024-04-11}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins
index 29402305057..bf7a75381d6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3.ins
+++ b/Master/texmf-dist/source/latex/l3kernel/l3.ins
@@ -105,7 +105,7 @@ and all files in that bundle must be distributed together.
\from{l3regex.dtx} {package}
\from{l3box.dtx} {package}
\from{l3color.dtx} {package}
- \from{l3pdf.dtx} {package}
+ \from{l3pdf.dtx} {package,tex}
\from{l3coffins.dtx} {package}
\from{l3luatex.dtx} {package,tex}
\from{l3unicode.dtx} {package}
@@ -176,6 +176,7 @@ and all files in that bundle must be distributed together.
\from{l3sys.dtx}{package,lua}
\from{l3token.dtx}{package,lua}
\from{l3intarray.dtx}{package,lua}
+ \from{l3pdf.dtx}{package,lua}
}}
\endbatchfile
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
index 66e999fe62c..eabf678caa6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -1340,8 +1340,9 @@
% only locally/globally assigned;
% \item \texttt{check-expressions} that checks integer, dimension,
% skip, and muskip expressions are not terminated prematurely;
-% \item \texttt{deprecation} that makes soon-to-be-deprecated commands produce errors;
-% \item \texttt{log-functions} that logs function definitions;
+% \item \texttt{deprecation} that makes deprecated commands produce errors;
+% \item \texttt{log-functions} that logs function definitions and
+% variable declarations;
% \item \texttt{all} that does all of the above.
% \end{itemize}
% Providing these as switches rather than options allows testing code
@@ -1355,10 +1356,10 @@
% \cs{debug_suspend:} \ldots{} \cs{debug_resume:}
% \end{syntax}
% Suppress (locally) errors and logging from \texttt{debug} commands,
-% except for the \texttt{deprecation} errors or warnings. These pairs
+% except for the \texttt{deprecation} errors. These pairs
% of commands can be nested. This can be used around pieces of code
% that are known to fail checks, if such failures should be ignored.
-% See for instance \pkg{l3coffins}.
+% See for instance \pkg{l3cctab} and \pkg{l3coffins}.
% \end{function}
%
% \end{documentation}
@@ -1871,9 +1872,8 @@
%
% \begin{macro}{\__kernel_deprecation_code:nn}
% \begin{variable}{\g_@@_deprecation_on_tl, \g_@@_deprecation_off_tl}
-% Some commands were more recently deprecated and not yet removed;
-% only make these into errors if the user requests it. This relies on
-% two token lists, filled up in \pkg{l3deprecation}.
+% Make deprecated commands throw errors if the user requests it.
+% This relies on two token lists, filled up in \pkg{l3deprecation}.
% \begin{macrocode}
\cs_gset_nopar:Npn \g_@@_deprecation_on_tl { }
\cs_gset_nopar:Npn \g_@@_deprecation_off_tl { }
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx
index 3100c284637..b0bd996d261 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
index 5ff0c2e68d4..2c51bf3bb04 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
index 08463db56d7..2d4902950fb 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
index 5cdaa3dc920..dd35fb00a3d 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -286,15 +286,23 @@
% \end{macrocode}
% Now the case for other engines. Here, each table is an integer
% array. Following the \LuaTeX{} pattern, a new table starts with
-% \IniTeX{} codes. The index base is out-by-one, so we have an
+% \IniTeX{} codes. The \cs{debug_suspend:} and \cs{debug_resume:}
+% functions prevent errors and logging from \texttt{debug} commands
+% which are either duplicate or false when \cs{@@_new:N} is used
+% by \cs{cctab_new:N} or \cs{cctab_const:Nn}.
+% The index base is out-by-one, so we have an
% internal function to handle that. The \IniTeX{} \tn{endlinechar} is
% $13$.
% \begin{macrocode}
{
\cs_new_protected:Npn \@@_new:N #1
- { \intarray_new:Nn #1 { 257 } }
+ {
+ \debug_suspend:
+ \intarray_new:Nn #1 { 257 }
+ \debug_resume:
+ }
\cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
- { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} }
+ { \intarray_gset:Nnn #1 { #2 + 1 } {#3} }
\cs_new_protected:Npn \cctab_new:N #1
{
\__kernel_chk_if_free_cs:N #1
@@ -796,13 +804,22 @@
% \subsection{Constant category code tables}
%
% \begin{macro}{\cctab_const:Nn,\cctab_const:cn}
-% Creates a new \meta{cctab~var} then sets it with the current and
-% user-supplied codes.
+% Creates a new \meta{cctab~var} then sets it with the \IniTeX{} and
+% user-supplied codes. To avoid false \texttt{debug} errors, we write
+% out implementation of \cs{cctab_new:N} and \cs{cctab_gset:Nn}
+% instead of directly using them here. The initialization part in
+% \cs{cctab_new:N} in non-\LuaTeX{} is omitted as it's covered by
+% the \IniTeX{} settings.
% \begin{macrocode}
\cs_new_protected:Npn \cctab_const:Nn #1#2
{
- \cctab_new:N #1
- \cctab_gset:Nn #1 {#2}
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new:N #1
+ \group_begin:
+ \cctab_select:N \c_initex_cctab
+ #2 \scan_stop:
+ \@@_gset:n {#1}
+ \group_end:
}
\cs_generate_variant:Nn \cctab_const:Nn { c }
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
index ad65a4b1749..c67f70db2c8 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
index ad41224aa0d..164d10019db 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
index 514ff326a4e..0edc225c526 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
index 6654b6d4cd7..6dbe13f96e6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -69,7 +69,7 @@
%
% Standard file identification.
% \begin{macrocode}
-\ProvidesExplFile{l3debug.def}{2024-03-14}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2024-04-11}{}{L3 Debugging support}
% \end{macrocode}
%
% \begin{variable}{\s_@@_stop}
@@ -389,10 +389,9 @@
% \end{macro}
%
% \begin{macro}{\@@_deprecation_on:, \@@_deprecation_off:}
-% Some commands were more recently deprecated and not yet removed;
-% only make these into errors if the user requests it. This relies on
-% two token lists, filled up in \pkg{l3deprecation} by calls to
-% \cs{__kernel_deprecation_code:nn}.
+% Make deprecated commands throw errors if the user requests it.
+% This relies on two token lists, filled up in \pkg{l3deprecation} by
+% calls to \cs{__kernel_deprecation_code:nn}.
% \begin{macrocode}
\cs_new_protected:Npn \@@_deprecation_on:
{ \g_@@_deprecation_on_tl }
@@ -781,7 +780,7 @@
\prop_pop:NnNF
\prop_pop:NnNTF
\prop_put:Nnn
- \prop_put_if_new:Nnn
+ \prop_put_if_not_in:Nnn
\prop_put_from_keyval:Nn
\prop_remove:Nn
\prop_set_eq:NN
@@ -862,7 +861,7 @@
\prop_gpop:NnNF
\prop_gpop:NnNTF
\prop_gput:Nnn
- \prop_gput_if_new:Nnn
+ \prop_gput_if_not_in:Nnn
\prop_gput_from_keyval:Nn
\prop_gremove:Nn
\prop_gset_eq:NN
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
index 3906c6786ef..7af8700df76 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -51,8 +51,10 @@
%
% \section{\pkg{l3deprecation} documentation}
%
-% A few commands have had to be deprecated over the years. This module
-% defines deprecated and deleted commands to produce an error.
+% A few commands have had to be deprecated over the years.
+% All commands deprecated before release 2022-01-12 were already
+% removed; commands deprecated since then will no longer be removed.
+% Instead, this module defines them to produce errors.
%
% \end{documentation}
%
@@ -74,31 +76,12 @@
% \cs{__kernel_patch_deprecation:nnNNpn} \Arg{date} \Arg{replacement}
% \meta{definition} \meta{function} \meta{parameters} \Arg{code}
% \end{quote}
-% defines the \meta{function} to produce a warning and run its
-% \meta{code}, or to produce an error and not run any \meta{code},
-% depending on the \pkg{expl3} date.
-% \begin{itemize}
-% \item If the \pkg{expl3} date is less than the \meta{date} (plus
-% $6$~months in case \texttt{undo-recent-deprecations} is used) then
-% we define the \meta{function} to produce a warning and run its code.
-% The warning is actually suppressed in two cases:
-% \begin{itemize}
-% \item if neither \texttt{undo-recent-deprecations} nor
-% \texttt{enable-debug} are in effect we may be in an end-user's
-% document so it is suppressed;
-% \item if the command is expandable then we cannot produce a warning.
-% \end{itemize}
-% \item Otherwise, we define the \meta{function} to produce an error.
-% \end{itemize}
-% In both cases we additionally make \cs{debug_on:n} |{deprecation}|
-% turn the \meta{function} into an \tn{outer} error, and
-% \cs{debug_off:n} |{deprecation}| restore whatever the behaviour was
-% without \cs{debug_on:n} |{deprecation}|.
-%
-% In later sections we use the \pkg{l3doc} key \texttt{deprecated} with
-% a date equal to that \meta{date} plus $6$~months, so that \pkg{l3doc}
-% will complain if we forget to remove the stale \meta{parameters} and
-% \Arg{code}.
+% defines the \meta{function} to produce an error and run its
+% \meta{code}.
+%
+% We make \cs{debug_on:n} |{deprecation}| turn the \meta{function} into
+% an \tn{outer} error, and \cs{debug_off:n} |{deprecation}| restore
+% whatever the behaviour was without \cs{debug_on:n} |{deprecation}|.
%
% In the explanations below, \meta{definition} \meta{function}
% \meta{parameters} \Arg{code} or assignments that only differ in the
@@ -183,8 +166,7 @@
%
% \begin{macro}{\__kernel_deprecation_error:Nnn}
% The \tn{outer} definition here ensures the command cannot appear
-% in an argument. Use this auxiliary on all commands that have been
-% removed since 2015.
+% in an argument.
% \begin{macrocode}
\cs_new_protected:Npn \__kernel_deprecation_error:Nnn #1#2#3
{
@@ -679,6 +661,27 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Deprecated \pkg{l3prop} functions}
+%
+% \begin{macro}[deprecated]
+% {
+% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV,
+% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV,
+% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV,
+% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV
+% }
+% \begin{macrocode}
+%\__kernel_patch_deprecation:nnNNpn { 2024-03-30 } { \prop_put_if_not_in:Nnn }
+\cs_new_protected:Npn \prop_put_if_new:Nnn { \prop_put_if_not_in:Nnn }
+%\__kernel_patch_deprecation:nnNNpn { 2024-03-30 } { \prop_gput_if_not_in:Nnn }
+\cs_new_protected:Npn \prop_gput_if_new:Nnn { \prop_gput_if_not_in:Nnn }
+\cs_generate_variant:Nn \prop_put_if_new:Nnn
+ { NnV , NV , c , cnV , cV }
+\cs_generate_variant:Nn \prop_gput_if_new:Nnn
+ { NnV , NV , c , cnV , cV }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
index a48a24df238..9156bd385e5 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
@@ -71,7 +71,7 @@ and all files in that bundle must be distributed together.
% This isn't included in the typeset documentation because it's a bit
% ugly:
%<*class>
-\ProvidesExplClass{l3doc}{2024-03-14}{}
+\ProvidesExplClass{l3doc}{2024-04-11}{}
{L3 Experimental documentation class}
%</class>
% \fi
@@ -84,7 +84,7 @@ and all files in that bundle must be distributed together.
% require you to do updates, if the class changes.}}
%
% \author{\Team}
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
% \maketitle
% \tableofcontents
%
@@ -2181,6 +2181,8 @@ and all files in that bundle must be distributed together.
{
\tl_remove_all:Ne \l_@@_tmpa_tl
{ \iow_char:N \^^M \c_percent_str }
+ \tl_remove_all:Ne \l_@@_tmpa_tl
+ { \token_to_str:N \obeyedline \c_space_tl \c_percent_str }
\tl_remove_all:Ne \l_@@_tmpa_tl { \tl_to_str:n { ^ ^ A } }
\tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^I }
\tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^M }
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
index c973d593c52..c2733e810ef 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
index 7e507b75984..e79b5f32b90 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
index 3a4d1c06dc3..6111d270cab 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -107,7 +107,7 @@
% control sequence for file 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{file name} until a \cs{ior_close:N} instruction
+% allocated to \meta{file name} until an \cs{ior_close:N} instruction
% is given or the \TeX{} run ends.
% If the file is not found, an error is raised.
% \end{function}
@@ -167,7 +167,7 @@
% 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{iow_close:N} instruction
+% allocated to \meta{shell command} until an \cs{iow_close:N} instruction
% is given or the \TeX{} run ends.
% If piped system calls are disabled an error is raised.
%
@@ -1679,6 +1679,7 @@
% \end{variable}
%
% \begin{macro}{\iow_open:Nn, \iow_open:NV, \iow_open:cn, \iow_open:cV}
+% \begin{macro}{\__kernel_iow_open:Nn, \__kernel_iow_open:No}
% \begin{macro}{\@@_open_stream:Nn, \@@_open_stream:NV}
% The same idea as for reading, but without the path and without the need
% to allow for a conditional version.
@@ -1687,16 +1688,21 @@
{
\__kernel_tl_set:Nx \l_@@_file_name_tl
{ \__kernel_file_name_sanitize:n {#2} }
+ \__kernel_iow_open:No #1 \l_@@_file_name_tl
+ }
+\cs_generate_variant:Nn \iow_open:Nn { NV , c , cV }
+\cs_new_protected:Npn \__kernel_iow_open:Nn #1#2
+ {
\iow_close:N #1
\seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
- { \@@_open_stream:NV #1 \l_@@_file_name_tl }
+ { \@@_open_stream:Nn #1 {#2} }
{
\@@_new:N #1
\__kernel_tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
- \@@_open_stream:NV #1 \l_@@_file_name_tl
+ \@@_open_stream:Nn #1 {#2}
}
}
-\cs_generate_variant:Nn \iow_open:Nn { NV , c , cV }
+\cs_generate_variant:Nn \__kernel_iow_open:Nn { No }
\cs_new_protected:Npn \@@_open_stream:Nn #1#2
{
\tex_global:D \tex_chardef:D #1 = \l_@@_stream_tl \scan_stop:
@@ -1708,6 +1714,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\iow_shell_open:Nn}
% \begin{macro}{\@@_shell_open:nN, \@@_shell_open:oN}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
index 40614c7348c..c3bd4a5085a 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
index 6d00047e4da..d54f0920858 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
% \maketitle
%
% \begin{documentation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
index 1f4ea5d34dc..c9d0c228f56 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
index a7401407cd0..d3dcb68dde3 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
index 0459331326a..a0536c12995 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
index 5b5f947c384..6fbc9de52c7 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
index bcd16a4b683..356c32b2328 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx
index b26d8e7f265..f6c9ec346fe 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
index c95704085cb..9df6a4730a4 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
index 53b85a7cc83..ee2eedbc227 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
index cdbdf38ee1d..ce5a0c48f70 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
index bddb146be7d..48ae82730c7 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx
index 26a084733da..901ce7a27ca 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
index e1a3dd89a03..5a4a3b41f9f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
% \maketitle
%
% \begin{documentation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
index 21cefc166c1..d8585ebe662 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx
index 0d589c9549f..2c23c613930 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
index 11dbcdceeff..7cef5739702 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
index 1517840431b..24f4ac85f80 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
@@ -44,20 +44,20 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
% \begin{documentation}
%
-% \section{\pkg{l3fparray} documentation}
-%
% For applications requiring heavy use of floating points, this module
% provides arrays which can be accessed in constant time (contrast
% \pkg{l3seq}, where access time is linear). The interface is very
% close to that of \pkg{l3intarray}. The size of the array is fixed and
% must be given at point of initialisation
%
+% \section{Creating and initialising floating point array variables}
+%
% \begin{function}[added = 2018-05-05]{\fparray_new:Nn, \fparray_new:cn}
% \begin{syntax}
% \cs{fparray_new:Nn} \meta{fparray~var} \Arg{size}
@@ -68,14 +68,16 @@
% assignments are always global.
% \end{function}
%
-% \begin{function}[EXP, added = 2018-05-05]{\fparray_count:N, \fparray_count:c}
+% \begin{function}[added = 2018-05-05]{\fparray_gzero:N, \fparray_gzero:c}
% \begin{syntax}
-% \cs{fparray_count:N} \meta{fparray~var}
+% \cs{fparray_gzero:N} \meta{fparray~var}
% \end{syntax}
-% Expands to the number of entries in the \meta{floating point array
-% variable}. This is performed in constant time.
+% Sets all entries of the \meta{floating point array variable} to
+% $+0$. Assignments are always global.
% \end{function}
%
+% \section{Adding data to floating point arrays}
+%
% \begin{function}[added = 2018-05-05]{\fparray_gset:Nnn, \fparray_gset:cnn}
% \begin{syntax}
% \cs{fparray_gset:Nnn} \meta{fparray~var} \Arg{position} \Arg{value}
@@ -87,17 +89,21 @@
% Assignments are always global.
% \end{function}
%
-% \begin{function}[added = 2018-05-05]{\fparray_gzero:N, \fparray_gzero:c}
+% \section{Couting entries in floating point arrays}
+%
+% \begin{function}[EXP, added = 2018-05-05]{\fparray_count:N, \fparray_count:c}
% \begin{syntax}
-% \cs{fparray_gzero:N} \meta{fparray~var}
+% \cs{fparray_count:N} \meta{fparray~var}
% \end{syntax}
-% Sets all entries of the \meta{floating point array variable} to
-% $+0$. Assignments are always global.
+% Expands to the number of entries in the \meta{floating point array
+% variable}. This is performed in constant time.
% \end{function}
%
+% \section{Using a single entry}
+%
% \begin{function}[EXP, added = 2018-05-05]
% {
-% \fparray_item:Nn, \fparray_item:cn
+% \fparray_item:Nn, \fparray_item:cn,
% \fparray_item_to_tl:Nn, \fparray_item_to_tl:cn
% }
% \begin{syntax}
@@ -106,8 +112,21 @@
% Applies \cs{fp_use:N} or \cs{fp_to_tl:N} (respectively) to the
% floating point entry stored at the (integer expression)
% \meta{position} in the \meta{floating point array variable}. If the
-% \meta{position} is not between $1$ and the \cs{fparray_count:N}, an
-% error occurs.
+% \meta{position} is not between $1$ and the
+% \cs{fparray_count:N} \meta{fparray~var}, an error occurs.
+% \end{function}
+%
+% \section{Floating point array conditional}
+%
+% \begin{function}[pTF, added = 2024-03-31]
+% {\fparray_if_exist:N, \fparray_if_exist:c}
+% \begin{syntax}
+% \cs{fparray_if_exist_p:N} \meta{fparray~var}
+% \cs{fparray_if_exist:NTF} \meta{fparray~var} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether the \meta{fparray~var} is currently defined. This
+% does not check that the \meta{fparray~var} really is a floating
+% point array variable.
% \end{function}
%
% \end{documentation}
@@ -389,6 +408,16 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}[pTF]{\fparray_if_exist:N, \fparray_if_exist:c}
+% Copies of the \texttt{cs} functions defined in \pkg{l3basics}.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn \fparray_if_exist:N \cs_if_exist:N
+ { TF , T , F , p }
+\prg_new_eq_conditional:NNn \fparray_if_exist:c \cs_if_exist:c
+ { TF , T , F , p }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
index 9fa2a547ffd..a1c9458436f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
index 5704a2ab756..bbc41c0cdb3 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
@@ -44,14 +44,12 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
% \begin{documentation}
%
-% \section{\pkg{l3intarray} documentation}
-%
% For applications requiring heavy use of integers, this module provides
% arrays which can be accessed in constant time (contrast \pkg{l3seq},
% where access time is linear). These arrays have several important
@@ -66,6 +64,8 @@
% The use of \texttt{intarray} data is therefore recommended for cases where
% the need for fast access is of paramount importance.
%
+% \section{Creating and initialising integer array variables}
+%
% \begin{function}[added = 2018-03-29]{\intarray_new:Nn, \intarray_new:cn}
% \begin{syntax}
% \cs{intarray_new:Nn} \meta{intarray~var} \Arg{size}
@@ -76,14 +76,27 @@
% always global.
% \end{function}
%
-% \begin{function}[EXP, added = 2018-03-29]{\intarray_count:N, \intarray_count:c}
+% \begin{function}[added = 2018-05-04]
+% {\intarray_const_from_clist:Nn, \intarray_const_from_clist:cn}
% \begin{syntax}
-% \cs{intarray_count:N} \meta{intarray~var}
+% \cs{intarray_const_from_clist:Nn} \meta{intarray~var} \meta{int expr clist}
% \end{syntax}
-% Expands to the number of entries in the \meta{integer array variable}.
-% Contrarily to \cs{seq_count:N} this is performed in constant time.
+% Creates a new constant \meta{integer array variable} or raises an
+% error if the name is already taken. The \meta{integer array
+% variable} is set (globally) to contain as its items the results of
+% evaluating each \meta{integer expression} in the \meta{comma list}.
% \end{function}
%
+% \begin{function}[added = 2018-05-04]{\intarray_gzero:N, \intarray_gzero:c}
+% \begin{syntax}
+% \cs{intarray_gzero:N} \meta{intarray~var}
+% \end{syntax}
+% Sets all entries of the \meta{integer array variable} to zero.
+% Assignments are always global.
+% \end{function}
+%
+% \section{Adding data to integer arrays}
+%
% \begin{function}[added = 2018-03-29]{\intarray_gset:Nnn, \intarray_gset:cnn}
% \begin{syntax}
% \cs{intarray_gset:Nnn} \meta{intarray~var} \Arg{position} \Arg{value}
@@ -96,25 +109,18 @@
% global.
% \end{function}
%
-% \begin{function}[added = 2018-05-04]
-% {\intarray_const_from_clist:Nn, \intarray_const_from_clist:cn}
-% \begin{syntax}
-% \cs{intarray_const_from_clist:Nn} \meta{intarray~var} \meta{int expr clist}
-% \end{syntax}
-% Creates a new constant \meta{integer array variable} or raises an
-% error if the name is already taken. The \meta{integer array
-% variable} is set (globally) to contain as its items the results of
-% evaluating each \meta{integer expression} in the \meta{comma list}.
-% \end{function}
+% \section{Couting entries in integer arrays}
%
-% \begin{function}[added = 2018-05-04]{\intarray_gzero:N, \intarray_gzero:c}
+% \begin{function}[EXP, added = 2018-03-29]{\intarray_count:N, \intarray_count:c}
% \begin{syntax}
-% \cs{intarray_gzero:N} \meta{intarray~var}
+% \cs{intarray_count:N} \meta{intarray~var}
% \end{syntax}
-% Sets all entries of the \meta{integer array variable} to zero.
-% Assignments are always global.
+% Expands to the number of entries in the \meta{integer array variable}.
+% Contrarily to \cs{seq_count:N} this is performed in constant time.
% \end{function}
%
+% \section{Using a single entry}
+%
% \begin{function}[EXP, added = 2018-03-29]{\intarray_item:Nn, \intarray_item:cn}
% \begin{syntax}
% \cs{intarray_item:Nn} \meta{intarray~var} \Arg{position}
@@ -134,6 +140,21 @@
% \meta{integer array} is empty, produce an error.
% \end{function}
%
+% \section{Integer array conditional}
+%
+% \begin{function}[pTF, added = 2024-03-31]
+% {\intarray_if_exist:N, \intarray_if_exist:c}
+% \begin{syntax}
+% \cs{intarray_if_exist_p:N} \meta{intarray~var}
+% \cs{intarray_if_exist:NTF} \meta{intarray~var} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether the \meta{intarray~var} is currently defined. This
+% does not check that the \meta{intarray~var} really is an integer
+% array variable.
+% \end{function}
+%
+% \section{Viewing integer arrays}
+%
% \begin{function}[added = 2018-05-04]
% {\intarray_show:N, \intarray_show:c, \intarray_log:N, \intarray_log:c}
% \begin{syntax}
@@ -144,7 +165,7 @@
% terminal or writes them in the log file.
% \end{function}
%
-% \subsection{Implementation notes}
+% \section{Implementation notes}
%
% It is a wrapper around the \tn{fontdimen} primitive, used to store
% arrays of integers (with a restricted range: absolute value at most
@@ -912,6 +933,16 @@ luacmd('@@_gset_range:w', function()
%
% \subsection{Common parts}
%
+% \begin{macro}[pTF]{\intarray_if_exist:N, \intarray_if_exist:c}
+% Copies of the \texttt{cs} functions defined in \pkg{l3basics}.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn \intarray_if_exist:N \cs_if_exist:N
+ { TF , T , F , p }
+\prg_new_eq_conditional:NNn \intarray_if_exist:c \cs_if_exist:c
+ { TF , T , F , p }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\intarray_show:N, \intarray_show:c, \intarray_log:N, \intarray_log:c}
% Convert the list to a comma list (with spaces after each comma)
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
index 480425d7306..1706bb594a7 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -333,7 +333,21 @@
% higher-level
% functions which have already fully expanded the \meta{file name} and which
% need to perform multiple open or close operations. See for example the
-% implementation of \cs{file_get_full_name:nN},
+% implementation of \cs{ior_shell_open:Nn}.
+% \end{function}
+%
+% \begin{function}{\__kernel_iow_open:Nn, \__kernel_iow_open:No}
+% \begin{syntax}
+% \cs{__kernel_iow_open:Nn} \meta{stream} \Arg{file name}
+% \end{syntax}
+% This function has identical syntax to the public version. However,
+% is does not take precautions against active characters in the
+% \meta{file name}, and it does not attempt to add a \meta{path} to
+% the \meta{file name}: it is therefore intended to be used by
+% higher-level
+% functions which have already fully expanded the \meta{file name} and which
+% need to perform multiple open or close operations. See for example the
+% implementation of \cs{iow_shell_open:Nn}.
% \end{function}
%
% \begin{function}{\__kernel_iow_with:Nnn}
@@ -367,6 +381,17 @@
% |1+2| then this logs |> 1+2=3.|
% \end{function}
%
+% \begin{function}[EXP]{\__kernel_pdf_object_id:n, \__kernel_pdf_object_id_indexed:nn}
+% \begin{syntax}
+% \cs{__kernel_pdf_object_id:n} \Arg{object}
+% \cs{__kernel_pdf_object_id_indexed:nn} \Arg{class} \Arg{number}
+% \end{syntax}
+% Expands to the ID of \meta{object} (or object of \meta{number} within
+% the \meta{class}), in for example page resource allocation. Depending on
+% the backend, the result may be the same as
+% \cs{pdf_object_id:n}/\cs{pdf_object_id_indexed:nn}.
+% \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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
index 5ea436176f4..a1d2c011691 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
index bd56f1ed3a8..ed7dadf2220 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
index 3d177f63452..f0107d465be 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
index 3acae8d111d..ab4d882dcbf 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
index 3e78d86acfd..468481c28c6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
index 7ffd0c1c056..b0b17f26902 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -51,6 +51,11 @@
%
% \section{Objects}
%
+% \subsection{Named objects}
+%
+% An \meta{object} name should fully expand to tokens suitable for use in a
+% label-like context.
+%
% \begin{function}[added = 2022-08-23]{\pdf_object_new:n}
% \begin{syntax}
% \cs{pdf_object_new:n} \Arg{object}
@@ -62,7 +67,7 @@
% \begin{function}[added = 2022-08-23]
% {\pdf_object_write:nnn, \pdf_object_write:nne}
% \begin{syntax}
-% \cs{pdf_object_write:nn} \Arg{object} \Arg{type} \Arg{content}
+% \cs{pdf_object_write:nnn} \Arg{object} \Arg{type} \Arg{content}
% \end{syntax}
% Writes the \meta{content} as content of the \meta{object}. Depending on the
% \meta{type} declared for the object, the format required for the
@@ -83,9 +88,71 @@
% \cs{pdf_object_ref:n} \Arg{object}
% \end{syntax}
% Inserts the appropriate information to reference the \meta{object}
-% in for example page resource allocation
+% in for example page resource allocation. If the \meta{object} does
+% not exist then the function expands to a reference to object zero;
+% no PDF indirect object ever has this number, so this is a marker for
+% error.
+% \end{function}
+%
+% \begin{function}[EXP, pTF, added = 2020-05-15]{\pdf_object_if_exist:n}
+% \begin{syntax}
+% \cs{pdf_object_if_exist_p:n} \Arg{object}
+% \cs{pdf_object_if_exist:nTF} \Arg{object} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether an object with name \Arg{object} has been defined.
+% \end{function}
+%
+% \subsection{Indexed objects}
+%
+% Objects can also be created using a pair of \meta{class} and \emph{index};
+% the \meta{class} argument should expand to character tokens, whilst the
+% \meta{index} is an \meta{int expr} and starts at $1$. For large
+% families of objects, this approach is more efficient than using
+% individual names.
+%
+% \begin{function}[added = 2024-04-01]{\pdf_object_new_indexed:nn}
+% \begin{syntax}
+% \cs{pdf_object_new_indexed:nn} \Arg{class} \Arg{index}
+% \end{syntax}
+% Declares a PDF object of \meta{class} and \meta{index}. The object may be
+% referenced from this point on, and written later using
+% \cs{pdf_object_write_indexed:nnnn}.
% \end{function}
%
+% \begin{function}[added = 2024-04-01]
+% {\pdf_object_write_indexed:nnnn, \pdf_object_write_indexed:nnne}
+% \begin{syntax}
+% \cs{pdf_object_write_indexed:nnnn} \Arg{class} \Arg{index} \Arg{type} \Arg{content}
+% \end{syntax}
+% Writes the \meta{content} as content of the object of \meta{class} and
+% \meta{index}. Depending on the
+% \meta{type} declared for the object, the format required for the
+% \meta{content} will vary
+% \begin{itemize}
+% \item[\texttt{array}] A space-separated list of values
+% \item[\texttt{dict}] Key--value pairs in the form
+% \texttt{/\meta{key} \meta{value}}
+% \item[\texttt{fstream}] Two brace groups: \meta{file name} and
+% \meta{file content}
+% \item[\texttt{stream}] Two brace groups: \meta{attributes (dictionary)}
+% and \meta{stream contents}
+% \end{itemize}
+% \end{function}
+%
+% \begin{function}[EXP, added = 2024-04-01]{\pdf_object_ref_indexed:nn}
+% \begin{syntax}
+% \cs{pdf_object_ref_indexed:nn} \Arg{class} \Arg{index}
+% \end{syntax}
+% Inserts the appropriate information to reference the object of \meta{class}
+% and \meta{index} in for example page resource allocation. If the
+% \meta{class}/\meta{index} combination does
+% not exist then the function expands to a reference to object zero;
+% no PDF indirect object ever has this number, so this is a marker for
+% error.
+% \end{function}
+%
+% \subsection{General functions}
+%
% \begin{function}[added = 2021-02-10]
% {\pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne}
% \begin{syntax}
@@ -119,14 +186,6 @@
% Inserts the appropriate information to reference the \meta{pageobject}.
% \end{function}
%
-% \begin{function}[EXP, pTF, added = 2020-05-15]{\pdf_object_if_exist:n}
-% \begin{syntax}
-% \cs{pdf_object_if_exist_p:n} \Arg{object}
-% \cs{pdf_object_if_exist:nTF} \Arg{object}
-% \end{syntax}
-% Tests whether an object with name \Arg{object} has been defined.
-% \end{function}
-%
% \section{Version}
%
% \begin{function}[pTF, EXP, added = 2021-02-10]{\pdf_version_compare:Nn}
@@ -267,6 +326,10 @@
%<@@=pdf>
% \end{macrocode}
%
+% \begin{macrocode}
+%<*tex>
+% \end{macrocode}
+%
% \begin{variable}{\s_@@_stop}
% Internal scan marks.
% \begin{macrocode}
@@ -311,53 +374,286 @@
%
% \subsection{Objects}
%
+% \begin{variable}{\g_@@_backend_object_int}
+% For returning object numbers.
+% \begin{macrocode}
+\int_new:N \g_@@_backend_object_int
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\pdf_object_new:n}
% \begin{macro}
% {\pdf_object_write:nnn, \pdf_object_write:nne, \pdf_object_write:nnx}
% \begin{macro}{\pdf_object_ref:n}
-% \begin{macro}
-% {
-% \pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne,
-% \pdf_object_unnamed_write:nx
-% }
-% \begin{macro}{\pdf_object_ref_last:}
-% \begin{macro}[pTF]{\pdf_object_if_exist:n}
+% \begin{macro}{\__kernel_pdf_object_id:n}
% Simple to do: all objects create a constant |int| so it is not a
% backend-specific name.
% \begin{macrocode}
\cs_new_protected:Npn \pdf_object_new:n #1
{
- \@@_backend_object_new:n {#1}
- \cs_new_eq:cc
- { c_@@_backend_object_ \tl_to_str:n {#1} _int }
- { c_@@_object_ \tl_to_str:n {#1} _int }
+ \@@_backend_object_new:
+ \@@_object_record:nN {#1} \g_@@_backend_object_int
}
\cs_new_protected:Npn \pdf_object_write:nnn #1#2#3
{
- \@@_backend_object_write:nnn {#1} {#2} {#3}
+ \exp_args:Ne \@@_backend_object_write:nnn
+ { \@@_object_retrieve:n {#1} } {#2} {#3}
\bool_gset_true:N \g_@@_init_bool
}
\cs_generate_variant:Nn \pdf_object_write:nnn { nne , nnx }
-\cs_new:Npn \pdf_object_ref:n #1 { \@@_backend_object_ref:n {#1} }
-\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2
+\cs_new:Npn \pdf_object_ref:n #1
{
- \@@_backend_object_now:nn {#1} {#2}
- \bool_gset_true:N \g_@@_init_bool
+ \exp_args:Ne \@@_backend_object_ref:n
+ { \@@_object_retrieve:n {#1} }
}
-\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { ne , nx }
-\cs_new:Npn \pdf_object_ref_last: { \@@_backend_object_last: }
+\cs_new:Npn \__kernel_pdf_object_id:n #1
+ {
+ \exp_args:Ne \@@_backend_object_id:n
+ { \@@_object_retrieve:n {#1} }
+ }
+%</tex>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@@_object_record:nN}
+% \begin{macro}[EXP]{\@@_object_retrieve:n}
+% \begin{macro}{ltx.pdf.object_id}
+% Object mappings are tracked in Lua for \LuaTeX{} as this makes retrieving
+% them much easier; as a result, there is a split in approaches. In Lua we
+% store values in a table indexed by name. The Lua function here is set up
+% to deal with both named and indexed objects: fits the Lua idiom well.
+% \begin{macrocode}
+%<*lua>
+
+local scan_int = token.scan_int
+local scan_string = token.scan_string
+local cprint = tex.cprint
+
+local @@_objects_named = {}
+local @@_objects_indexed = {}
+
+luacmd('@@_object_record:nN', function()
+ local name = scan_string()
+ local n = scan_int()
+ @@_objects_named[name] = n
+end,'protected','global')
+
+local function object_id(name,index)
+ if index then
+ return @@_objects_indexed[name][index] or 0
+ else
+ return @@_objects_named[name] or 0
+ end
+end
+
+luacmd('@@_object_retrieve:n', function()
+ local name = scan_string()
+ return cprint(12,tostring(object_id(name)))
+end,'global')
+
+ltx.pdf = ltx.pdf or {}
+ltx.pdf.object_id = object_id
+
+%</lua>
+% \end{macrocode}
+% Whereas in \TeX{} we use integer constants.
+% \begin{macrocode}
+%<*tex>
+\sys_if_engine_luatex:F
+ {
+ \cs_new_protected:Npn \@@_object_record:nN #1#2
+ {
+ \int_const:cn
+ { c_@@_object_ #1 _int } {#2}
+ }
+ \cs_new:Npn \@@_object_retrieve:n #1
+ {
+ \int_if_exist:cTF { c_@@_object_ #1 _int }
+ {
+ \int_use:c
+ { c_@@_object_ #1 _int }
+ }
+ { 0 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}[pTF,EXP]{\pdf_object_if_exist:n}
+% \begin{macrocode}
\prg_new_conditional:Npnn \pdf_object_if_exist:n #1 { p , T , F , TF }
{
- \int_if_exist:cTF { c_@@_object_ \tl_to_str:n {#1} _int }
- \prg_return_true:
+ \int_compare:nNnTF { \@@_object_retrieve:n {#1} } = 0
\prg_return_false:
+ \prg_return_true:
}
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\pdf_object_new_indexed:nn}
+% \begin{macro}{\pdf_object_write_indexed:nnnn, \pdf_object_write_indexed:nnne}
+% \begin{macro}[EXP]{\pdf_object_ref_indexed:nn}
+% \begin{macro}[EXP]{\__kernel_pdf_object_id_indexed:nn}
+% Again we split between the common code and the macro- or Lua-based
+% implementation. To make life easier for the Lua route, all of the
+% potential expressions are expanded to braced numbers.
+% \begin{macrocode}
+\cs_new_protected:Npn \pdf_object_new_indexed:nn #1#2
+ {
+ \@@_backend_object_new:
+ \@@_object_record:neN {#1}
+ { \int_eval:n {#2} } \g_@@_backend_object_int
+ }
+\cs_new_protected:Npn \pdf_object_write_indexed:nnnn #1#2#3#4
+ {
+ \exp_args:Ne \@@_backend_object_write:nnn
+ { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } } {#3} {#4}
+ \bool_gset_true:N \g_@@_init_bool
+ }
+\cs_generate_variant:Nn \pdf_object_write_indexed:nnnn { nnne }
+\cs_new:Npn \pdf_object_ref_indexed:nn #1#2
+ {
+ \exp_args:Ne \@@_backend_object_ref:n
+ { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } }
+ }
+\cs_new:Npn \__kernel_pdf_object_id_indexed:nn #1#2
+ {
+ \exp_args:Ne \@@_backend_object_id:n
+ { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } }
+ }
+%</tex>
+% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
+% \begin{macro}{\@@_object_record:nnN, \@@_object_record:neN}
+% \begin{macro}[EXP]{\@@_object_retrieve:nn}
+% \begin{macro}{\@@_object_record:NnN}
+% \begin{macro}[EXP]{\@@_object_retrieve:Nn}
+% Again we split for Lua: the same idea as above but with nested tables.
+% As we've arranged above that the \TeX{} code passes a braced number,
+% we can use |tonumber(scan_string())| rather than |scan_int()|
+% for the index.
+% \begin{macrocode}
+%<*lua>
+
+luacmd('@@_object_record:nnN', function()
+ local name = scan_string()
+ local index = tonumber(scan_string())
+ local n = scan_int()
+ @@_objects_indexed[name] = @@_objects_indexed[name] or {}
+ @@_objects_indexed[name][index] = n
+end,'protected','global')
+
+luacmd('@@_object_retrieve:nn', function()
+ local name = scan_string()
+ local index = tonumber(scan_string())
+ return cprint(12,tostring(object_id(name,index)))
+end,'global')
+
+%</lua>
+% \end{macrocode}
+% The non-Lua approach is to divide the range into blocks, and store in integer
+% arrays that can simulate dynamic assignment.
+% \begin{macrocode}
+%<*tex>
+\sys_if_engine_luatex:F
+ {
+ \cs_new_protected:Npn \@@_object_record:nnN #1#2#3
+ {
+ \use:e
+ {
+ \@@_object_record:NnN
+ \@@_object_index_split:nn {#1} {#2}
+ \exp_not:N #3
+ }
+ }
+ \cs_new_protected:Npn \@@_object_record:NnN #1#2#3
+ {
+ \intarray_if_exist:NF #1
+ { \intarray_new:Nn #1 \c_@@_object_block_size_int }
+ \intarray_gset:Nnn #1 {#2} #3
+ }
+ \cs_new:Npn \@@_object_retrieve:nn #1#2
+ {
+ \use:e
+ {
+ \exp_not:N \@@_object_retrieve:Nn
+ \@@_object_index_split:nn {#1} {#2}
+ }
+ }
+ \cs_new:Npn \@@_object_retrieve:Nn #1#2
+ { \intarray_item:Nn #1 {#2} }
+% \end{macrocode}
+% As we want blocks to start from one, and within the block for the top value
+% to be \enquote{in} the block, we do a little bit of manipulation. By shifting
+% down by one, we keep the values \enquote{in} the block, then we adjust the
+% block/index number to get back on track.
+% \begin{macrocode}
+ \cs_new:Npn \@@_object_index_split:nn #1#2
+ {
+ \exp_not:c
+ {
+ g_@@_object_ #1 _
+ \int_eval:n
+ {
+ \int_div_truncate:nn { #2 - 1 }
+ \c_@@_object_block_size_int + 1
+ }
+ _intarray
+ }
+ {
+ \int_eval:n
+ { \int_mod:nn { #2 - 1 } \c_@@_object_block_size_int + 1 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{variable}{\c_@@_object_block_size_int}
+% Sets the block size used for managing indexed objects.
+% \begin{macrocode}
+ \int_const:Nn \c_@@_object_block_size_int { 10000 }
+ }
+% \end{macrocode}
+% \end{variable}
+% \begin{macro}{\@@_object_record:neN}
+% \begin{macro}[EXP]{\@@_object_retrieve:ne}
+% Common variants.
+% \begin{macrocode}
+\cs_generate_variant:Nn \@@_object_record:nnN { ne }
+\cs_generate_variant:Nn \@@_object_retrieve:nn { ne }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne,
+% \pdf_object_unnamed_write:nx
+% }
+% No tracking needed here.
+% \begin{macrocode}
+\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2
+ {
+ \exp_args:Ne \@@_backend_object_now:nn {#1} {#2}
+ \bool_gset_true:N \g_@@_init_bool
+ }
+\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { ne , nx }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdf_object_ref_last:}
+% A one-step wrapper for consistency.
+% \begin{macrocode}
+\cs_new:Npn \pdf_object_ref_last: { \@@_backend_object_last: }
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\pdf_pageobject_ref:n}
@@ -523,6 +819,10 @@
% \end{macrocode}
%
% \begin{macrocode}
+%</tex>
+% \end{macrocode}
+%
+% \begin{macrocode}
%</package>
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
index 8bbdd6a5870..ea76955d82f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
index 878b9eb7586..6d8054e956d 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -299,15 +299,15 @@
% codes are ignored.
% \end{function}
%
-% \begin{function}
+% \begin{function}[added = 2024-03-30]
% {
-% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV,
-% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV,
-% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV,
-% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV
+% \prop_put_if_not_in:Nnn, \prop_put_if_not_in:NVn, \prop_put_if_not_in:NnV,
+% \prop_put_if_not_in:cnn, \prop_put_if_not_in:cVn, \prop_put_if_not_in:cnV,
+% \prop_gput_if_not_in:Nnn, \prop_gput_if_not_in:NVn, \prop_gput_if_not_in:NnV,
+% \prop_gput_if_not_in:cnn, \prop_gput_if_not_in:cVn, \prop_gput_if_not_in:cnV
% }
% \begin{syntax}
-% \cs{prop_put_if_new:Nnn} \meta{property list} \Arg{key} \Arg{value}
+% \cs{prop_put_if_not_in:Nnn} \meta{property list} \Arg{key} \Arg{value}
% \end{syntax}
% If the \meta{key} is present in the \meta{property list} then no
% action is taken. Otherwise, a new entry is added as described for
@@ -1358,7 +1358,7 @@
% in the linked case. If |#5| is |#3| itself we have to be careful
% not to lose the data, and we even take the opportunity to skip the
% copying step completely. To keep the correct version of the
-% duplicate keys we use the code underlying \cs{prop_put_if_new:Nnn},
+% duplicate keys we use the code underlying \cs{prop_put_if_not_in:Nnn},
% which involves passing \cs{use_none:nnn} to the auxiliary instead of
% nothing.
% There is no need to check for the case where |#3| is equal to~|#4|
@@ -1940,10 +1940,10 @@
% }
% \begin{macro}[tested = m3prop002]
% {
-% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV,
-% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV,
-% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV,
-% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV
+% \prop_put_if_not_in:Nnn, \prop_put_if_not_in:NVn, \prop_put_if_not_in:NnV,
+% \prop_put_if_not_in:cnn, \prop_put_if_not_in:cVn, \prop_put_if_not_in:cnV,
+% \prop_gput_if_not_in:Nnn, \prop_gput_if_not_in:NVn, \prop_gput_if_not_in:NnV,
+% \prop_gput_if_not_in:cnn, \prop_gput_if_not_in:cVn, \prop_gput_if_not_in:cnV
% }
% \begin{macro}[tested = m3prop002]
% {
@@ -1965,17 +1965,17 @@
% auxiliary to skip this checking step and avoid getting multiple
% error messages for the same error.
% The \meta{code} (empty for |put| and \cs{use_none:nnn} for
-% |put_if_new|) is placed before the assignment in cases where the key
+% |put_if_not_in|) is placed before the assignment in cases where the key
% is already present, in order to suppress the assignment in the
-% |put_if_new| case.
+% |put_if_not_in| case.
% \begin{macrocode}
\cs_new_protected:Npn \prop_put:Nnn
{ \@@_put:nNNnn { } \cs_set_nopar:Npe }
\cs_new_protected:Npn \prop_gput:Nnn
{ \@@_put:nNNnn { } \cs_gset_nopar:Npe }
-\cs_new_protected:Npn \prop_put_if_new:Nnn
+\cs_new_protected:Npn \prop_put_if_not_in:Nnn
{ \@@_put:nNNnn \use_none:nnn \cs_set_nopar:Npe }
-\cs_new_protected:Npn \prop_gput_if_new:Nnn
+\cs_new_protected:Npn \prop_gput_if_not_in:Nnn
{ \@@_put:nNNnn \use_none:nnn \cs_gset_nopar:Npe }
\cs_generate_variant:Nn \prop_put:Nnn
{
@@ -2005,10 +2005,10 @@
}
\cs_generate_variant:Nn \prop_gput:Nnn
{ cno , co , coo , cnx , cVx , cxV , cxx }
-\cs_generate_variant:Nn \prop_put_if_new:Nnn
- { NnV , NV , cnV , cV }
-\cs_generate_variant:Nn \prop_gput_if_new:Nnn
- { NnV , NV , cnV , cV }
+\cs_generate_variant:Nn \prop_put_if_not_in:Nnn
+ { NnV , NV , c , cnV , cV }
+\cs_generate_variant:Nn \prop_gput_if_not_in:Nnn
+ { NnV , NV , c , cnV , cV }
% \end{macrocode}
% Since the true branch of \cs{@@_split:NnTFn} is used as the
% replacement text of an internal macro, and since the \meta{key} and
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
index 000063bc005..6dba950462c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
index 395be76907a..ce85b562627 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
index 5334e8fd888..6be32f7a831 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
index 1839c8a2e56..a3d9256223d 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
index 818f605e076..81a025b4744 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
index be850b31099..75dbdd095b8 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
index 88ad33c74b1..efc24fe8eae 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
index feec1232fd0..085b5f2c979 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -333,7 +333,7 @@
% not directly available within the \TeX{} run. Note that if restricted
% shell escape is disabled, no results can be obtained.
%
-% \begin{function}[added = 2024-03-08]
+% \begin{function}[added = 2024-03-08, updated = 2024-04-08]
% {\sys_get_query:nN, \sys_get_query:nnN, \sys_get_query:nnnN}
% \begin{syntax}
% \cs{sys_get_query:nN} \Arg{cmd} \Arg{tl var}
@@ -357,6 +357,14 @@
% The \meta{spec} and \meta{options}, if given, are expanded fully
% before passing to the underlying script.
%
+% Spaces in the output are stored as active tokens, allowing them to be
+% replaced by for example a visible space easily. Other non-letter
+% characters in the ASCII range are set to category code~12. The category
+% codes for characters out of the ASCII range are left unchanged: typically
+% this will mean that with an 8-bit engine, accented values can be typeset
+% directly whilst in Unicode engines, standard category code setup will
+% apply.
+%
% If more than one line of text is returned by the \meta{cmd}, these will be
% separated by character~13 (|^^M|) tokens of category code~12. In most
% cases, \cs{sys_split_query:nnnN} should be preferred when multi-line
@@ -1161,7 +1169,7 @@ end
{ \sys_get_query:nnnN {#1} { } {#2} #3 }
\cs_new_protected:Npn \sys_get_query:nnnN #1#2#3#4
{
- \str_clear:N #4
+ \tl_clear:N #4
\@@_get_query_auxi:neeN {#1} {#2} {#3} #4
}
\cs_new:Npn \@@_get_query_auxi:nnnN #1#2#3#4
@@ -1187,10 +1195,13 @@ end
\sys_get_shell:nnN
{ l3sys-query~#1 #2 #3 }
{
- \int_step_inline:nnn { 0 } { `a - 1 }
+ \int_step_inline:nnn { 0 } { `A - 1 }
+ { \char_set_catcode_other:n {##1} }
+ \int_step_inline:nnn { `Z + 1 } { `a - 1 }
{ \char_set_catcode_other:n {##1} }
- \int_step_inline:nnn { `Z + 1 } { 127 }
+ \int_step_inline:nnn { `z + 1 } { 127 }
{ \char_set_catcode_other:n {##1} }
+ \char_set_catcode_active:n { `\ }
\tex_endlinechar:D 13 \scan_stop:
}
\l_@@_tmp_tl
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
index 0547db28b1d..5010114fb4b 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
index d364c321994..213d8281a96 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
index 8f92c1eae95..a713cd6e403 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
index 5feff565b9c..56c9a5533c3 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
index d965050c76a..a4141dcfe4a 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
index 175b7bc24fe..859dd5025c8 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -73,7 +73,8 @@
% \end{syntax}
% Clears the \meta{tl~var} and sets it up to support other
% \cs[no-index]{tl_build_\ldots{}} functions. Until \cs{tl_build_end:N}
-% \meta{tl~var} is called, applying any function from \pkg{l3tl} other
+% \meta{tl~var} or \cs{tl_build_gend:N} \meta{tl~var} is called,
+% applying any function from \pkg{l3tl} other
% than \cs[no-index]{tl_build_\ldots{}} will lead to incorrect
% results. The |begin| and |gbegin| functions must be used for local
% and global \meta{tl~var} respectively.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
index 0938e7cd5e6..30e16636e54 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
index cd538ee6d05..a38860b548c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -2298,7 +2298,7 @@
% is not a primitive.
%
% For \LuaTeX{} we use a different implementation which just looks at the
-% command code for the token and compaes it to a list of non-primitives.
+% command code for the token and compares it to a list of non-primitives.
% Again, \tn{nullfont} is a special case because it is the only primitive
% with the normally non-primitive |set_font| command code.
%
@@ -2345,11 +2345,11 @@ do
[cmd'outer_call' or cmd'tolerant_call'] = true,
[cmd'long_outer_call' or cmd'tolerant_protected_call'] = true,
[cmd'assign_glue' or cmd'register_glue'] = index_not_nil,
- [cmd'assign_mu_glue' or cmd'register_mu_glue'] = index_not_nil,
+ [cmd'assign_mu_glue' or cmd'register_mu_glue' or cmd'register_muglue'] = index_not_nil,
[cmd'assign_toks' or cmd'register_toks'] = index_not_nil,
- [cmd'assign_int' or cmd'register_int'] = index_not_nil,
+ [cmd'assign_int' or cmd'register_int' or cmd'register_integer'] = index_not_nil,
[cmd'assign_attr' or cmd'register_attribute'] = true,
- [cmd'assign_dimen' or cmd'register_dimen'] = index_not_nil,
+ [cmd'assign_dimen' or cmd'register_dimen' or cmd'register_dimension'] = index_not_nil,
}
luacmd("@@_if_primitive_lua:N", function()
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
index cd552800b07..0ee6858f5b9 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-04-11}
%
% \maketitle
%
@@ -82,7 +82,7 @@
% range, the generated character tokens will be active (category code
% $13$); for codepoints in the ASCII range, the given \meta{catcode}
% will be used. To allow the result of this function to be used
-% inside a expansion context, the result is protected by \cs{exp_not:n}.
+% inside an expansion context, the result is protected by \cs{exp_not:n}.
%
% \begin{texnote}
% Users of (u)p\TeX{} note that these engines are treated as $8$-bit in