summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/l3kernel
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2023-12-08 21:36:03 +0000
committerKarl Berry <karl@freefriends.org>2023-12-08 21:36:03 +0000
commit801627f1bc8e15dbaf9dabf3eb66d5926b77171d (patch)
tree4f96944a520e450c5710b54b6e2ab3dd17289957 /Master/texmf-dist/source/latex/l3kernel
parent6d3705c4cb01ac51e8b9224ceef15066cf850536 (diff)
l3kernel (8dec23)
git-svn-id: svn://tug.org/texlive/trunk@69066 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/l3kernel')
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/expl3.dtx16
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3.ins1
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3basics.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx604
-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/l3candidates.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3clist.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3color.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3debug.dtx13
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx149
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3doc.dtx195
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3expan.dtx34
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3file.dtx34
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3flag.dtx4
-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.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3int.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx9
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3keys.dtx56
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3msg.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3names.dtx14
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx31
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prg.dtx21
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prop.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3quark.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3regex.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3seq.dtx6
-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.dtx194
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str.dtx101
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sys.dtx13
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl.dtx88
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3token.dtx182
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx6
63 files changed, 1196 insertions, 683 deletions
diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
index 02779c2b2d6..835b29d525b 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{2023-11-09}%
+\def\ExplFileDate{2023-12-08}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -414,6 +414,8 @@
%
% The data types in \LaTeX3 are:
% \begin{description}
+% \item[bitset] a string of bits (\texttt{0} and \texttt{1} tokens) that are
+% accessed by position or by name;
% \item[bool] either true or false (the \LaTeX3 implementation does
% not use \tn{iftrue} or \tn{iffalse});
% \item[box] box register;
@@ -900,7 +902,7 @@
% \texttt{check-declarations} option enables checking for all variable
% assignments, issuing an error if any variables are assigned without being
% initialised. See also \cs{debug_on:n} \texttt{\{check-declarations\}}
-% in \pkg{l3candidates} for finer control.
+% in \pkg{interface3} for finer control.
%
% \DescribeOption{log-functions}
% The \texttt{log-functions} option is used to enable recording of every new
@@ -908,7 +910,7 @@
% purposes, as it means that there is a complete list of all functions
% created by each module loaded (with the exceptions of a very small number
% required by the bootstrap code). See also \cs{debug_on:n}
-% \texttt{\{log-functions\}} in \pkg{l3candidates} for finer control.
+% \texttt{\{log-functions\}} in \pkg{interface3} for finer control.
%
% \DescribeOption{backend}
% Selects the backend to be used for color, graphics and related operations that
@@ -1510,10 +1512,10 @@
\tex_everyjob:D \exp_after:wN
{
\tex_the:D \tex_everyjob:D
- \sys_everyjob:
+ \__kernel_sys_everyjob:
}
}
- { \sys_everyjob: }
+ { \__kernel_sys_everyjob: }
% \end{macrocode}
%
% \begin{variable}{\s_@@_stop}
@@ -1759,7 +1761,7 @@
% \begin{macro}{\g__kernel_backend_header_bool}
% Load the dynamic code and standard back-end.
% \begin{macrocode}
-\sys_everyjob:
+\__kernel_sys_everyjob:
\bool_new:N \g__kernel_backend_header_bool
\bool_gset_true:N \g__kernel_backend_header_bool
\sys_load_backend:n { }
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins
index 0018a81d704..248017ba2f1 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3.ins
+++ b/Master/texmf-dist/source/latex/l3kernel/l3.ins
@@ -97,6 +97,7 @@ and all files in that bundle must be distributed together.
\from{l3fp-symbolic.dtx}{package}
\from{l3fp-functions.dtx}{package}
\from{l3fparray.dtx} {package}
+ \from{l3bitset.dtx} {package}
\from{l3cctab.dtx} {package}
\from{l3sort.dtx} {package}
\from{l3str-convert.dtx}{package}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
index 576f3c5365f..d4f447287ba 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -1631,7 +1631,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\use:x}
+% \begin{macro}[deprecated]{\use:x}
% Fully expands its argument and passes it to the input stream. Uses
% the reserved \cs{l_@@_internal_tl} which we've set up above.
% \begin{macrocode}
@@ -2587,7 +2587,7 @@
% us to generate error messages. The next few definitions here are
% only temporary, they will be redefined later on.
%
-% \begin{macro}
+% \begin{macro}[documented-as = \msg_error:nnnn]
% {\msg_error:nnee, \msg_error:nne, \msg_error:nn}
% If an internal error occurs before \LaTeX3 has loaded \pkg{l3msg} then
% the code should issue a usable if terse error message and halt. This
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx
new file mode 100644
index 00000000000..101a2aa4143
--- /dev/null
+++ b/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx
@@ -0,0 +1,604 @@
+% \iffalse meta-comment
+%
+%% File: l3bitset.dtx
+%
+% Copyright (C) 2020-2023 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{^^A
+% The \pkg{l3bitset} package \\ Bitsets ^^A
+% }
+%
+% \author{^^A
+% The \LaTeX{} Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2023-12-08}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% This package defines and implements the data type \texttt{bitset}, a vector of
+% bits. The size of the vector may grow dynamically.
+% Individual bits can be set and unset by names pointing to an index position.
+% The names |1|, |2|, |3|, \ldots\ are predeclared and point to the
+% index positions $1$, $2$, $3$,\ldots. More names can be added and existing names can
+% be changed.
+% The index is like all other indices in \pkg{expl3} modules \emph{1-based}.
+% A \texttt{bitset} can be output as binary number or---as needed e.g. in a
+% PDF dictionary---as decimal (arabic) number.
+% Currently only a small subset of the functions provided by the \pkg{bitset}
+% package are implemented here, mainly the functions needed to use bitsets in
+% PDF dictionaries.
+%
+% The bitset is stored as a string (but one shouldn't rely on the internal
+% representation) and so the vector size is theoretically
+% unlimited, only restricted by \TeX-memory. But the functions to set and clear
+% bits uses integer functions for the index so bitsets can't be longer
+% than $2^{31} - 1$.
+% The export function
+% \cs{bitset_to_arabic:N} can use functions from the \texttt{int} module only if
+% the largest index used for this bitset is smaller then $32$, for longer
+% bitsets \texttt{fp} is used and this is slower.
+%
+% \section{Creating bitsets}
+%
+% \begin{function}[added = 2021-01-26,updated=2020-12-29]
+% {\bitset_new:N,\bitset_new:c,\bitset_new:Nn, \bitset_new:cn}
+% \begin{syntax}
+% \cs{bitset_new:N} \meta{bitset var} \\
+% \cs{bitset_new:Nn} \meta{bitset var}
+% \{
+% \meta{name1} |=| \meta{index1} |,|
+% \meta{name2} |=| \meta{index2} |,| \ldots{}
+% \}
+% \end{syntax}
+% Creates a new \meta{bitset var} or raises an error if the name is already taken.
+% The declaration is global. The \meta{bitset var} is initially $0$.
+%
+% Bitsets are implemented as string variables consisting of
+% \texttt{1}'s and \texttt{0}'s.
+% The rightmost number is the index position $1$, so
+% the string variable can be viewed directly as the binary number.
+% But one shouldn't rely on the internal representation, but use the
+% dedicated \cs{bitset_to_bin:N} instead to get the binary number.
+%
+% The name--index pairs given in the second
+% argument of \cs{bitset_new:Nn} declares names for some indices,
+% which can be used to set and unset bits.
+% The names |1|, |2|, |3|, \ldots\ are predeclared and point to the
+% index positions $1$, $2$, $3$, \ldots.
+%
+% \meta{index\ldots} should be a positive number or an
+% \meta{integer expression} which evaluates to a positive number.
+% The expression is evaluated when the index is used, not a declaration time.
+% The names \meta{name\ldots}
+% should be unique. Using a number as name, e.g.~|10=1|, is allowed, it
+% then overwrites the predeclared name |10|,
+% but the index position $10$ can then only be reached if some other
+% name for it exists, e.g. |ten=10|.
+% It is not necessary to give every index
+% a name, and an index can have more than one name. The named index
+% can be extended or changed with the next function.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% {\bitset_addto_named_index:Nn}
+% \begin{syntax}
+% \cs{bitset_addto_named_index:Nn} \meta{bitset var}
+% \{
+% \meta{name1} |=| \meta{index1} |,|
+% \meta{name2} |=| \meta{index2} |,| \ldots{}
+% \}
+% \end{syntax}
+% This extends or changes the name--index pairs for \meta{bitset var}
+% globally as described for \cs{bitset_new:Nn}.
+% \end{function}
+%
+% For example after these settings
+% \begin{verbatim}
+% \bitset_new:Nn \l_pdfannot_F_bitset
+% {
+% Invisible = 1,
+% Hidden = 2,
+% Print = 3,
+% NoZoom = 4,
+% NoRotate = 5,
+% NoView = 6,
+% ReadOnly = 7,
+% Locked = 8,
+% ToggleNoView = 9,
+% LockedContents = 10
+% }
+% \bitset_addto_named_index:Nn \l_pdfannot_F_bitset
+% {
+% print = 3
+% }
+% \end{verbatim}
+% it is possible to set bit $3$ by using any of this alternatives:
+% \begin{verbatim}
+% \bitset_set_true:Nn \l_pdfannot_F_bitset {Print}
+% \bitset_set_true:Nn \l_pdfannot_F_bitset {print}
+% \bitset_set_true:Nn \l_pdfannot_F_bitset {3}
+% \end{verbatim}
+%
+% \begin{function}[EXP, pTF,added = 2021-01-26]
+% {\bitset_if_exist:N, \bitset_if_exist:c}
+% \begin{syntax}
+% \cs{bitset_if_exist_p:N} \meta{bitset var}
+% \cs{bitset_if_exist:NTF} \meta{bitset var} \Arg{true code} \Arg{false code}%
+% \end{syntax}
+% Tests whether the \meta{bitset var} exist.
+% \end{function}
+%
+% \section{Setting and unsetting bits}
+%
+% \begin{function}[added = 2021-01-26]
+% {
+% \bitset_set_true:Nn, \bitset_set_true:cn,
+% \bitset_gset_true:Nn, \bitset_gset_true:cn
+% }
+% \begin{syntax}
+% \cs{bitset_set_true:Nn} \meta{bitset var} \Arg{name}\\
+% \cs{bitset_gset_true:Nn} \meta{bitset var} \Arg{name}
+% \end{syntax}
+% This sets the bit of the index position represented by \Arg{name} to $1$.
+% \Arg{name} should be either one of the predeclared names
+% |1|, |2|, |3|, \ldots, or one of the names added manually.
+% Index position are 1-based.
+% If needed the length of the bit vector is enlarged.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% {
+% \bitset_set_false:Nn, \bitset_set_false:cn,
+% \bitset_gset_false:Nn, \bitset_set_false:cn
+% }
+% \begin{syntax}
+% \cs{bitset_set_false:Nn} \meta{bitset var} \Arg{name}\\
+% \cs{bitset_gset_false:Nn} \meta{bitset var} \Arg{name}
+% \end{syntax}
+% This unsets the bit of the index position represented by \Arg{name} (sets
+% it to $0$).
+% \Arg{name} should be either one of the predeclared names
+% |1|, |2|, |3|, \ldots, or one of the names added manually.
+% The index is $1$-based. If the index position is larger
+% than the current length of the bit vector
+% nothing happens. If the leading (left most) bit is unset,
+% zeros are not trimmed but stay in the bit vector and are still shown
+% by \cs{bitset_show:N}.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% {\bitset_clear:N,\bitset_clear:c,\bitset_gclear:N,\bitset_gclear:c}
+% \begin{syntax}
+% \cs{bitset_clear:N} \meta{bitset var} \\
+% \cs{bitset_gclear:N} \meta{bitset var}
+% \end{syntax}
+% This resets the bitset to the initial state. The declared names are not changed.
+% \end{function}
+%
+% \section{Using bitsets}
+%
+% \begin{function}[EXP,added = 2021-01-26]
+% {\bitset_item:Nn, \bitset_item:cn}
+% \begin{syntax}
+% \cs{bitset_item:Nn} \meta{bitset var} \Arg{name}
+% \end{syntax}
+% \cs{bitset_item:Nn} outputs \texttt{1} if the bit with
+% the index number represented by \Arg{name} is set and \texttt{0} otherwise.
+% \Arg{name} is either one of the predeclared names
+% |1|, |2|, |3|, \ldots, or one of the names added manually.
+% \end{function}
+%
+% \begin{function}[EXP,added = 2021-01-26]
+% {\bitset_to_bin:N, \bitset_to_bin:c}
+% \begin{syntax}
+% \cs{bitset_to_bin:N} \meta{bitset var}
+% \end{syntax}
+% This leaves the current value of the bitset expressed as
+% a binary (string) number in the input stream.
+% If no bit has been set yet, the output is zero.
+% \end{function}
+% \begin{function}[EXP,added = 2021-01-26]
+% {\bitset_to_arabic:N, \bitset_to_arabic:c}
+% \begin{syntax}
+% \cs{bitset_to_arabic:N} \meta{bitset var}
+% \end{syntax}
+% This leaves the current value of the bitset expressed as
+% a decimal number in the input stream. If no bit has been set yet,
+% the output is zero. The function uses \cs{int_from_bin:n} if the largest
+% index that have been set or unset is smaller then $32$, and a slower implementation
+% based on \cs{fp_eval:n} otherwise.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% {\bitset_show:N, \bitset_show:c}
+% \begin{syntax}
+% \cs{bitset_show:N} \meta{bitset var}
+% \end{syntax}
+% Displays the binary and decimal value of the \meta{bitset var} on the terminal,
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% {\bitset_log:N, \bitset_log:c}
+% \begin{syntax}
+% \cs{bitset_log:N} \meta{bitset var}
+% \end{syntax}
+% Writes the value of the \meta{bitset var} in the log file.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3bitset} implementation}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=bitset>
+% \end{macrocode}
+%
+% Transitional support.
+% \begin{macrocode}
+\cs_if_exist:NT \@expl@finalise@setup@@@@
+ {
+ \tl_gput_right:Nn \@expl@finalise@setup@@@@
+ { \disable@package@load { l3bitset } { } }
+ }
+% \end{macrocode}
+%
+% A bitset is a string variable.
+% \begin{macro}{\bitset_new:N, \bitset_new:c}
+% \begin{macro}{\bitset_new:Nn, \bitset_new:cn}
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \cs_gset_eq:NN #1 \c_zero_str
+ \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop }
+ }
+
+\cs_new_protected:Npn \bitset_new:Nn #1 #2
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \cs_gset_eq:NN #1 \c_zero_str
+ \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop }
+ \prop_gset_from_keyval:cn
+ { g__bitset_ \cs_to_str:N #1 _name_prop }
+ {#2}
+ }
+\cs_generate_variant:Nn \bitset_new:N { c }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_tmp_prop}
+% A scratch prop to be able to extend the names properties.
+% \begin{macrocode}
+\prop_new:N \l_@@_tmp_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\bitset_addto_named_index:Nn}
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_addto_named_index:Nn #1#2
+ {
+ \prop_set_from_keyval:Nn \l_@@_tmp_prop {#2}
+ \prop_map_inline:Nn \l_@@_tmp_prop
+ {
+ \prop_gput:cnn
+ { g_@@_ \cs_to_str:N #1 _name_prop }
+ {##1}
+ {##2}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[EXP,pTF]
+% {
+% \bitset_if_exist:N, \bitset_if_exist:c
+% }
+% Existence tests.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn
+ \bitset_if_exist:N \str_if_exist:N { p , T , F , TF }
+\prg_new_eq_conditional:NNn
+ \bitset_if_exist:c \str_if_exist:c
+ { p , T , F , TF }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_set_true:Nn, \@@_gset_true:Nn, \@@_set_false:Nn, \@@_gset_false:Nn}
+% \begin{macro}{\@@_set:NNnN}
+% The internal command uses only numbers (integer expressions) for the
+% position.
+% A bit is set by either extending the string or by splitting it and
+% then inserting an $1$. It is not checked if the value was already $1$.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_true:Nn #1#2
+ { \@@_set:NNnN \str_set:Ne #1 {#2} 1 }
+\cs_new_protected:Npn \@@_gset_true:Nn #1#2
+ { \@@_set:NNnN \str_gset:Ne #1 {#2} 1 }
+\cs_new_protected:Npn \@@_set_false:Nn #1#2
+ { \@@_set:NNnN \str_set:Ne #1 {#2} 0 }
+\cs_new_protected:Npn \@@_gset_false:Nn #1#2
+ { \@@_set:NNnN \str_gset:Ne #1 {#2} 0 }
+\cs_new_protected:Npn \@@_set:NNnN #1#2#3#4
+ {
+ \int_compare:nNnT {#3} > { 0 }
+ {
+ \int_compare:nNnTF { \str_count:N #2 } < {#3}
+ {
+ #1 #2
+ {
+ #4
+ \prg_replicate:nn { #3 - \str_count:N #2 - 1 } { 0 }
+ #2
+ }
+ }
+ {
+ #1 #2
+ {
+ \str_range:Nnn #2 { 1 } { -1 - (#3) }
+ #4
+ \str_range:Nnn #2 { 1 - (#3) } { -1 }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_internal_int}
+% \begin{macrocode}
+\int_new:N \l_@@_internal_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[TF]{\@@_test_digits:n}
+% \begin{macro}{\@@_test_digits_end:n}
+% \begin{macro}{\@@_test_digits:wn}
+% \url{https://chat.stackexchange.com/transcript/message/56878159#56878159}
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_test_digits:n #1 { TF }
+ {
+ \tex_afterassignment:D \@@_test_digits:w
+ \l_@@_internal_int = 0 \tl_trim_spaces_apply:nN {#1} \tl_to_str:n
+ \@@_test_digits_end:
+ \use_i:nnn \if_false:
+ \@@_test_digits_end:
+ \if_int_compare:w \c_zero_int < \l_@@_internal_int
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\cs_new_eq:NN \@@_test_digits_end: \exp_stop_f:
+\cs_new_protected:Npn \@@_test_digits:w #1 \@@_test_digits_end: { }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \bitset_set_true:Nn, \bitset_set_true:cn,
+% \bitset_gset_true:Nn, \bitset_gset_true:cn,
+% }
+% \begin{macro}{\@@_set_aux:NNn}
+% The user commands must first translate the argument to an index number.
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_set_true:Nn #1#2
+ { \@@_set:NNn \@@_set_true:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_gset_true:Nn #1#2
+ { \@@_set:NNn \@@_gset_true:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_set_false:Nn #1#2
+ { \@@_set:NNn \@@_set_false:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_gset_false:Nn #1#2
+ { \@@_set:NNn \@@_gset_false:Nn #1 {#2} }
+\cs_new_protected:Npn \@@_set:NNn #1#2#3
+ {
+ \prop_if_in:cnTF { g_@@_ \cs_to_str:N #2 _name_prop } {#3}
+ {
+ #1 #2
+ {
+ \prop_item:cn { g_@@_ \cs_to_str:N #2 _name_prop } {#3}
+ }
+ }
+ {
+ \@@_test_digits:nTF {#3}
+ {
+ #1 #2 {#3}
+ \prop_gput:cnn { g_@@_ \cs_to_str:N #2 _name_prop } {#3} {#3}
+ }
+ {
+ \msg_warning:nnee { bitset } { unknown-name }
+ { \token_to_str:N #2 }
+ { \tl_to_str:n {#3} }
+ }
+ }
+ }
+\cs_generate_variant:Nn \bitset_set_true:Nn { c }
+\cs_generate_variant:Nn \bitset_gset_true:Nn { c }
+\cs_generate_variant:Nn \bitset_set_false:Nn { c }
+\cs_generate_variant:Nn \bitset_gset_false:Nn { c }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \bitset_clear:N, \bitset_clear:c,
+% \bitset_gclear:N, \bitset_gclear:c
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_clear:N #1
+ {
+ \str_set_eq:NN #1 \c_zero_str
+ }
+\cs_new_protected:Npn \bitset_gclear:N #1
+ {
+ \str_gset_eq:NN #1 \c_zero_str
+ }
+\cs_generate_variant:Nn \bitset_clear:N { c }
+\cs_generate_variant:Nn \bitset_gclear:N { c }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}
+% {
+% \bitset_to_arabic:N, \bitset_to_arabic:c,
+% \bitset_to_bin:N, \bitset_to_bin:c,
+% }
+% The naming of the commands follow the names in the \texttt{int} module.
+% \cs{bitset_to_arabic:N} uses \cs{int_from_bin:n} if the string is shorter
+% then $32$ and the slower \cs{fp_eval} for larger bitsets.
+% \begin{macrocode}
+\cs_new:Npn \bitset_to_arabic:N #1
+ {
+ \int_compare:nNnTF { \str_count:N #1 } < { 32 }
+ { \exp_args:No \int_from_bin:n {#1} }
+ {
+ \exp_after:wN \@@_to_int:nN \exp_after:wN 0
+ #1 \q_recursion_tail \q_recursion_stop
+ }
+ }
+
+\cs_new:Npn \@@_to_int:nN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2 {#1}
+ \exp_args:Nf \@@_to_int:nN { \fp_eval:n { #1 * 2 + #2 } }
+ }
+
+\cs_new:Npn \bitset_to_bin:N #1
+ {
+ #1
+ }
+\cs_generate_variant:Nn \bitset_to_arabic:N { c }
+\cs_generate_variant:Nn \bitset_to_bin:N { c }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}
+% {
+% \bitset_item:Nn, \bitset_item:cn
+% }
+% All bits that have been set at anytime have an entry in the prop,
+% so we can take everything else as $0$.
+% \begin{macrocode}
+\cs_new:Npn \bitset_item:Nn #1#2
+ {
+ \prop_if_in:cnTF { g_@@_ \cs_to_str:N #1 _name_prop } {#2}
+ {
+ \int_eval:n
+ {
+ \str_item:Nn #1
+ { 0 - ( \prop_item:cn { g_@@_ \cs_to_str:N #1 _name_prop } {#2} ) }
+ +0
+ }
+ }
+ {
+ 0
+ }
+ }
+\cs_generate_variant:Nn \bitset_item:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \bitset_show:N, \bitset_show:c,
+% \bitset_log:N, \bitset_log:c
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_show:N { \@@_show:NN \msg_show:nneeee }
+\cs_generate_variant:Nn \bitset_show:N { c }
+\cs_new_protected:Npn \bitset_log:N { \@@_show:NN \msg_log:nneeee }
+\cs_generate_variant:Nn \bitset_log:N { c }
+\cs_new_protected:Npn \bitset_show_named_index:N { \@@_show_named_index:NN \msg_show:nneeee }
+\cs_generate_variant:Nn \bitset_show_named_index:N { c }
+\cs_new_protected:Npn \@@_show:NN #1#2
+ {
+ \__kernel_chk_defined:NT #2
+ {
+ #1 { bitset } { show }
+ { \token_to_str:N #2 }
+ { \bitset_to_bin:N #2 }
+ { \bitset_to_arabic:N #2 }
+ { }
+ }
+ }
+\cs_new_protected:Npn \@@_show_named_index:NN #1#2
+ {
+ \__kernel_chk_defined:NT #2
+ {
+ #1 { bitset } { show-names }
+ { \token_to_str:N #2 }
+ { \prop_map_function:cN { g_@@_ \cs_to_str:N #2 _name_prop } \msg_show_item:nn }
+ { }
+ { }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Messages}
+% \begin{macrocode}
+ \msg_new:nnn { bitset } { show }
+ {
+ The~bitset~#1~has~the~representation: \\
+ >~binary:~#2 \\
+ >~arabic:~#3 .
+ }
+\msg_new:nnn { bitset } { show-names }
+ {
+ The~bitset~#1~
+ \tl_if_empty:nTF {#2}
+ { knows~no~names~yet \\>~ . }
+ { knows~the~name/index~pairs~(without~outer~braces): #2 . }
+ }
+\msg_new:nnn { bitset } { unknown-name }
+ { The~name~'#2'~is~unknown~for~bitset~\tl_to_str:n {#1} }
+\prop_gput:Nnn \g_msg_module_name_prop { bitset } { LaTeX }
+\prop_gput:Nnn \g_msg_module_type_prop { bitset } { }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
index aae051cfffb..169279638c7 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
index 56e374ac131..62c6ea7379f 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
index 75dfcb1f60a..2ebb8a93444 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
index 788258863b6..3806feffa19 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
index 67132003e00..966de0333ef 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -1435,7 +1435,7 @@
% \begin{macro}
% {
% \clist_gremove_all:Nn, \clist_gremove_all:cn,
-% \clist_gremove_all:NV, \clist_remove_all:cV
+% \clist_gremove_all:NV, \clist_gremove_all:cV
% }
% \UnitTested
% \begin{macro}{\@@_remove_all:NNNn}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
index 0689ba36493..576a11d47b2 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -1766,7 +1766,7 @@
% \coffin_scale:Nnn, \coffin_scale:cnn,
% \coffin_gscale:Nnn, \coffin_gscale:cnn
% }
-% \begin{macro}{\coffin_scale:NnnNN}
+% \begin{macro}{\@@_scale:NnnNN}
% For scaling, the opposite calculation is done to find the new
% dimensions for the coffin. Only the total height is needed, as this
% is the shift required for corners and poles. The scaling is done
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
index 815ece45531..fa8508262aa 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
index 6b182058eda..ad908c22fa1 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -128,7 +128,7 @@
%
% Standard file identification.
% \begin{macrocode}
-\ProvidesExplFile{l3debug.def}{2019-04-06}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2023-12-08}{}{L3 Debugging support}
% \end{macrocode}
%
% \begin{variable}{\s_@@_stop}
@@ -838,6 +838,10 @@
\skip_set_eq:NN
\skip_add:Nn
\skip_sub:Nn
+ \str_clear:N
+ \str_set_eq:NN
+ \str_put_left:Nn
+ \str_put_right:Nn
\__kernel_tl_set:Ne
\tl_clear:N
\tl_set_eq:NN
@@ -903,6 +907,10 @@
\skip_gset_eq:NN
\skip_gadd:Nn
\skip_gsub:Nn
+ \str_gclear:N
+ \str_gset_eq:NN
+ \str_gput_left:Nn
+ \str_gput_right:Nn
\__kernel_tl_gset:Ne
\tl_gclear:N
\tl_gset_eq:NN
@@ -941,6 +949,7 @@
\intarray_const_from_clist:Nn
\muskip_const:Nn
\skip_const:Nn
+ \str_const:Nn
\tl_const:Nn
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
index 0caac652d96..03380199007 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -396,9 +396,9 @@
\@@_old_protected:Nnn \tl_show_analysis:n
{ \tl_analysis_show:n } { 2020-01-01 }
\@@_old:Nnn \tl_case:cnn
- { \tl_case:cnF } { 2015-07-14 }
+ { \exp_args:Nc \token_case_meaning:NnF } { 2015-07-14 }
\@@_old:Nnn \tl_case:Nnn
- { \tl_case:NnF } { 2015-07-14 }
+ { \token_case_meaning:NnF } { 2015-07-14 }
\@@_old_protected:Nnn \tl_gset_from_file:Nnn
{ \file_get:nnN } { 2021-07-01 }
\@@_old_protected:Nnn \tl_gset_from_file_x:Nnn
@@ -438,7 +438,7 @@
%<@@=cs>
% \end{macrocode}
%
-% \begin{macro}[EXP]{\cs_argument_spec:N}
+% \begin{macro}[EXP, deprecated]{\cs_argument_spec:N}
% For the present, do not deprecate fully as \LaTeXe{} will need to catch
% up: one for Fall 2022.
% \begin{macrocode}
@@ -447,21 +447,102 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Deprecated \pkg{l3file} functions}
+%
+% \begin{macro}[deprecated]
+% {
+% \iow_shipout_x:Nn, \iow_shipout_x:Nx,
+% \iow_shipout_x:cn, \iow_shipout_x:cx
+% }
+% Previously described as \texttt{x}-type, but the hash behaviour is really
+% \texttt{e}-type. Currently not \enquote{live} as we need to have a transition.
+% \begin{macrocode}
+% \__kernel_patch_deprecation:nnNNpn { 2023-10-10 } { \iow_shipout_e:Nn }
+\cs_new_protected:Npn \iow_shipout_x:Nn { \iow_shipout_e:Nn }
+\cs_generate_variant:Nn \iow_shipout_x:Nn { Nx , c, cx }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Deprecated \pkg{l3keys} functions}
+%
+% \begin{macrocode}
+%<@@=keys>
+% \end{macrocode}
+%
+% \begin{macro}[deprecated]{.str_set_x:N, .str_set_x:c}
+% \begin{macro}[deprecated]{.str_gset_x:N, .str_gset_x:c}
+% \begin{macrocode}
+\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:N } #1
+ { \@@_variable_set:NnnN #1 { str } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:c } #1
+ { \@@_variable_set:cnnN {#1} { str } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:N } #1
+ { \@@_variable_set:NnnN #1 { str } { g } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:c } #1
+ { \@@_variable_set:cnnN {#1} { str } { g } x }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[deprecated]{.tl_set_x:N, .tl_set_x:c}
+% \begin{macro}[deprecated]{.tl_gset_x:N, .tl_gset_x:c}
+% \begin{macrocode}
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:N } #1
+ { \@@_variable_set:NnnN #1 { tl } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:c } #1
+ { \@@_variable_set:cnnN {#1} { tl } { } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:N } #1
+ { \@@_variable_set:NnnN #1 { tl } { g } x }
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:c } #1
+ { \@@_variable_set:cnnN {#1} { tl } { g } x }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Deprecated \pkg{l3pdf} functions}
+%
+% \begin{variable}[deprecated]{\g_@@_object_prop}
+% For tracking objects.
+% \begin{macrocode}
+\prop_new:N \g_@@_object_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[deprecated]
+% {\pdf_object_new:nn, \pdf_object_write:nn, \pdf_object_write:nx}
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2022-08-30 } { [\pdf_object_new:n] }
+\cs_new_protected:Npn \pdf_object_new:nn #1#2
+ {
+ \prop_gput:Nnn \g_@@_object_prop {#1} {#2}
+ \@@_backend_object_new:n {#1}
+ }
+\__kernel_patch_deprecation:nnNNpn { 2022-08-30 } { [\pdf_object_write:n] }
+\cs_new_protected:Npn \pdf_object_write:nn #1#2
+ {
+ \exp_args:Nne \@@_backend_object_write:nnn
+ {#1} { \prop_item:Nn \g_@@_object_prop {#1} } {#2}
+ \bool_gset_true:N \g_@@_init_bool
+ }
+\cs_generate_variant:Nn \pdf_object_write:nn { nx }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Deprecated \pkg{l3prg} functions}
%
% \begin{macrocode}
%<@@=cs>
% \end{macrocode}
%
-% \begin{macro}[EXP, noTF]{\bool_case_true:n}
+% \begin{macro}[EXP, noTF, deprecated]{\bool_case_true:n}
% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:n }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:n }
\cs_gset:Npn \bool_case_true:n { \bool_case:n }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nT }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nT }
\cs_gset:Npn \bool_case_true:nT { \bool_case:nT }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nF }
\cs_gset:Npn \bool_case_true:nF { \bool_case:nF }
-\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nTF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case:nTF }
\cs_gset:Npn \bool_case_true:nTF { \bool_case:nTF }
% \end{macrocode}
% \end{macro}
@@ -472,7 +553,7 @@
%<@@=str>
% \end{macrocode}
%
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
% {
% \str_lower_case:n, \str_lower_case:f,
% \str_upper_case:n, \str_upper_case:f,
@@ -494,7 +575,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
% {\str_foldcase:n, \str_foldcase:V}
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2020-10-17 } { \str_casefold:n }
@@ -504,7 +585,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
% {\str_declare_eight_bit_encoding:nnn}
% This command was made internal, with one more argument. There is no
% easy way to compute a reasonable value for that extra argument so we
@@ -518,8 +599,8 @@
%
% \subsection{Deprecated \pkg{l3seq} functions}
%
-% \begin{macro}{\seq_indexed_map_inline:Nn}
-% \begin{macro}[EXP]{ \seq_indexed_map_function:NN}
+% \begin{macro}[deprecated]{\seq_indexed_map_inline:Nn}
+% \begin{macro}[EXP, deprecated]{ \seq_indexed_map_function:NN}
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2020-06-18 } { \seq_map_indexed_inline:Nn }
\cs_gset_protected:Npn \seq_indexed_map_inline:Nn { \seq_map_indexed_inline:Nn }
@@ -529,14 +610,14 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_mapthread_function:NNN}
+% \begin{macro}[deprecated]{\seq_mapthread_function:NNN}
% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2023-05-10 } { \seq_mapthread_function:NNN }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-10 } { \seq_map_pairwise_function:NNN }
\cs_gset:Npn \seq_mapthread_function:NNN { \seq_map_pairwise_function:NNN }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{macro}[deprecated]{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2023-10-26 } { \seq_set_map_e:NNn }
\cs_gset_protected:Npn \seq_set_map_x:NNn { \seq_set_map_e:NNn }
@@ -551,7 +632,7 @@
%<@@=sys>
% \end{macrocode}
%
-% \begin{macro}{\sys_load_deprecation:}
+% \begin{macro}[deprecated]{\sys_load_deprecation:}
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2021-01-11 } { (no~longer~required) }
\cs_gset_protected:Npn \sys_load_deprecation: { }
@@ -560,8 +641,8 @@
%
% \subsection{Deprecated \pkg{l3text} functions}
%
-% \begin{macro}[EXP]{\text_titlecase:n}
-% \begin{macro}[EXP]{\text_titlecase:nn}
+% \begin{macro}[EXP, deprecated]{\text_titlecase:n}
+% \begin{macro}[EXP, deprecated]{\text_titlecase:nn}
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2023-07-08 } { \text_titlecase_first:n }
\cs_gset:Npn \text_titlecase:n #1
@@ -579,7 +660,7 @@
%<@@=tl>
% \end{macrocode}
%
-% \begin{macro}
+% \begin{macro}[deprecated]
% {
% \tl_lower_case:n, \tl_lower_case:nn,
% \tl_upper_case:n, \tl_upper_case:nn,
@@ -607,7 +688,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[noTF]{\tl_case:Nn, \tl_case:cn}
+% \begin{macro}[noTF, deprecated]{\tl_case:Nn, \tl_case:cn}
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2022-05-23 } { \token_case_meaning:Nn }
\cs_gset:Npn \tl_case:Nn { \token_case_meaning:Nn }
@@ -623,7 +704,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\tl_build_clear:N, \tl_build_gclear:N}
+% \begin{macro}[deprecated]{\tl_build_clear:N, \tl_build_gclear:N}
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2023-10-18 } { \tl_build_begin:N }
\cs_new_protected:Npn \tl_build_clear:N { \tl_build_begin:N }
@@ -634,14 +715,14 @@
%
% \subsection{Deprecated \pkg{l3token} functions}
%
-% \begin{macro}[EXP]{\char_to_utfviii_bytes:n}
+% \begin{macro}[EXP, deprecated]{\char_to_utfviii_bytes:n}
% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { [ \codepoint_generate:n ] }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { [ \codepoint_generate:nn ] }
\cs_gset:Npn \char_to_utfviii_bytes:n { \__kernel_codepoint_to_bytes:n }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\char_to_nfd:N, \char_to_nfd:n}
+% \begin{macro}[EXP, deprecated]{\char_to_nfd:N, \char_to_nfd:n}
% \begin{macrocode}
\__kernel_patch_deprecation:nnNNpn { 2022-10-09 } { \codepoint_to_nfd:n }
\cs_gset:Npn \char_to_nfd:N #1 { \codepoint_to_nfd:n {`#1} }
@@ -650,7 +731,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
% {
% \char_lower_case:N, \char_upper_case:N,
% \char_mixed_case:Nn, \char_fold_case:N,
@@ -677,11 +758,11 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]
+% \begin{macro}[EXP, deprecated]
% {
-% \char_lowercase:N, \char_uppercase:N,
+% \char_lowercase:N, \char_titlecase:N, \char_uppercase:N,
% \char_foldcase:N,
-% \char_str_lowercase:N, \char_str_uppercase:N,
+% \char_str_lowercase:N, \char_str_titlecase:N, \char_str_uppercase:N,
% \char_str_foldcase:N,
% }
% \begin{macrocode}
@@ -689,10 +770,16 @@
\cs_gset:Npn \char_lowercase:N { \text_lowercase:n }
\__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \text_uppercase:n }
\cs_gset:Npn \char_uppercase:N { \text_uppercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \text_titlecase_first:n }
+\cs_gset:Npn \char_titlecase:N { \text_titlecase_first:n }
\__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_casefold:n }
\cs_gset:Npn \char_foldcase:N { \str_casefold:n }
\__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_lowercase:n }
\cs_gset:Npn \char_str_lowercase:N { \str_lowercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2022-10-17 }
+ { \tl_to_str:e { \text_titlecase_first:n } }
+\cs_gset:Npn \char_str_titlecase:N #1
+ { \tl_to_str:e { \text_titlecase_first:n {#1} } }
\__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_uppercase:n }
\cs_gset:Npn \char_str_uppercase:N { \str_uppercase:n }
\__kernel_patch_deprecation:nnNNpn { 2022-10-17 } { \str_casefold:n }
@@ -700,7 +787,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]
+% \begin{macro}[TF, deprecated]
% {
% \peek_catcode_ignore_spaces:N, \peek_catcode_remove_ignore_spaces:N,
% \peek_charcode_ignore_spaces:N, \peek_charcode_remove_ignore_spaces:N,
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
index 731748faf43..b6f98aa3664 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
@@ -85,7 +85,7 @@ and all files in that bundle must be distributed together.
% require you to do updates, if the class changes.}}
%
% \author{\Team}
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
% \maketitle
% \tableofcontents
%
@@ -469,6 +469,10 @@ and all files in that bundle must be distributed together.
% |T| nor |F|, to document functions such as \cs[no-index]{prop_get:NN}
% which also have conditional forms (\cs[no-index]{prop_get:NNTF}).
%
+% In a very small number of cases, there is no user documentation for
+% a \enquote{public} function. In these rare cases, the option
+% |no-user-doc| may be added to suppress the undefined reference that
+% would otherwise then arises.
%
% \DescribeMacro{\TestFiles}
% \cs{TestFiles}\marg{list of files} is used to indicate which test
@@ -695,8 +699,9 @@ and all files in that bundle must be distributed together.
%
% \begin{variable}
% {
-% \l_@@_macro_internal_set_bool,
+% \l_@@_macro_deprecated_bool ,
% \l_@@_macro_internal_bool,
+% \l_@@_macro_nodoc_bool ,
% \l_@@_macro_TF_bool,
% \l_@@_macro_pTF_bool,
% \l_@@_macro_noTF_bool,
@@ -710,8 +715,9 @@ and all files in that bundle must be distributed together.
% environments. We initialize \cs{l_@@_override_module_tl} to avoid
% overriding module names by an empty name (meaning no module).
% \begin{macrocode}
-\bool_new:N \l_@@_macro_internal_set_bool
+\bool_new:N \l_@@_macro_deprecated_bool
\bool_new:N \l_@@_macro_internal_bool
+\bool_new:N \l_@@_macro_nodoc_bool
\bool_new:N \l_@@_macro_TF_bool
\bool_new:N \l_@@_macro_pTF_bool
\bool_new:N \l_@@_macro_noTF_bool
@@ -955,56 +961,19 @@ and all files in that bundle must be distributed together.
% \begin{macro}
% {
% \seq_set_split:NoV,
-% \str_case:fn,
-% \tl_count:f,
-% \tl_greplace_all:Nen,
-% \tl_greplace_all:Nno,
-% \tl_if_head_eq_charcode:oNTF,
-% \tl_if_head_eq_charcode:oNT,
-% \tl_if_head_eq_charcode:oNF,
-% \tl_if_head_eq_meaning:VNF,
-% \tl_if_in:noTF,
-% \tl_if_in:ooTF,
-% \tl_if_in:NoTF,
-% \tl_if_in:NoT,
-% \tl_if_in:NoF,
-% \tl_remove_all:Ne,
-% \tl_replace_all:Nen,
-% \tl_replace_all:Nne,
-% \tl_replace_all:Non,
-% \tl_replace_all:Nno,
-% \tl_replace_once:Noo,
-% \tl_to_str:f,
-% \tl_to_str:o,
+% \tl_to_str:f
% }
% A few missing variants.
% \begin{macrocode}
\cs_generate_variant:Nn \seq_set_split:Nnn { NoV }
-\cs_generate_variant:Nn \seq_gput_right:Nn { Nf }
-\cs_generate_variant:Nn \str_case:nn { fn }
-\cs_generate_variant:Nn \tl_count:n { f }
-\cs_generate_variant:Nn \tl_greplace_all:Nnn { Nx , Nno }
-\cs_generate_variant:Nn \tl_if_empty:nTF { f }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { o }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT { o }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF { o }
-\cs_generate_variant:Nn \tl_if_head_eq_meaning:nNF { V }
-\cs_generate_variant:Nn \tl_if_in:nnTF { no , oo }
-\cs_generate_variant:Nn \tl_if_in:NnTF { No }
-\cs_generate_variant:Nn \tl_if_in:NnT { No }
-\cs_generate_variant:Nn \tl_if_in:NnF { No }
-\cs_generate_variant:Nn \tl_remove_all:Nn { Nx }
-\cs_generate_variant:Nn \tl_replace_all:Nnn { Nx , Nnx, No , Nno }
-\cs_generate_variant:Nn \tl_replace_once:Nnn { Noo }
-\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
-\cs_generate_variant:Nn \tl_to_str:n { f , o }
+\cs_generate_variant:Nn \tl_to_str:n { f }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF]{\@@_if_almost_str:n}
% Used to test if the argument of |\cmd| or other macros to be indexed
% is almost a string or not: for instance this is \texttt{false} if |#1|
-% contains |\meta{...}|. The surprising |f|-expansion are there to
+% contains |\meta{...}|. The surprising |f|-expansion is there to
% cope with the case of |#1| starting with \cs{c_backslash_str}
% which should be expanded and considered to be \enquote{normal}.
% \begin{macrocode}
@@ -1012,11 +981,11 @@ and all files in that bundle must be distributed together.
{
\int_compare:nNnTF
{ \tl_count:n {#1} }
- < { \tl_count:f { \tl_to_str:f {#1} } }
+ < { \tl_count:e { \tl_to_str:f {#1} } }
{ \prg_return_false: }
{ \prg_return_true: }
}
-\cs_generate_variant:Nn \@@_if_almost_str:nT { V }
+\prg_generate_conditional_variant:Nnn \@@_if_almost_str:n { V } { T }
% \end{macrocode}
% \end{macro}
%
@@ -1110,7 +1079,7 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_detect_internals_aux:N #1
{
\tl_set_eq:NN \l_@@_detect_internals_tl #1
- \tl_replace_all:Non \l_@@_detect_internals_tl { \token_to_str:N _ } { _ }
+ \tl_replace_all:NVn \l_@@_detect_internals_tl \c_underscore_str { _ }
\seq_set_split:NnV \l_@@_tmpa_seq { _ _ } \l_@@_detect_internals_tl
\seq_pop_left:NN \l_@@_tmpa_seq \l_@@_detect_internals_tl
\seq_map_variable:NNn \l_@@_tmpa_seq \l_@@_detect_internals_tl
@@ -1993,9 +1962,9 @@ and all files in that bundle must be distributed together.
\bool_if:NT \l_@@_cmd_replace_bool
{
\tl_set_rescan:Nnn \l_@@_tmpb_tl { } { _ }
- \tl_replace_all:Non \l_@@_cmd_tl \l_@@_tmpb_tl { _ }
+ \tl_replace_all:NVn \l_@@_cmd_tl \l_@@_tmpb_tl { _ }
\@@_replace_at_at:N \l_@@_cmd_tl
- \tl_replace_all:Nno \l_@@_cmd_tl { _ } \l_@@_tmpb_tl
+ \tl_replace_all:NnV \l_@@_cmd_tl { _ } \l_@@_tmpb_tl
}
% \end{macrocode}
% Typesetting.
@@ -2075,7 +2044,7 @@ and all files in that bundle must be distributed together.
{
\tl_set_rescan:Nnn \l_@@_tmpb_tl
{ \char_set_catcode:nn { `_ } {##1} } { _ }
- \tl_replace_all:Non \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \tl_replace_all:NVn \l_@@_tmpa_tl \l_@@_tmpb_tl
{ \@@_ensuremath_sb:n }
}
\exp_args:NV \@@_meta_original:n \l_@@_tmpa_tl
@@ -2155,8 +2124,8 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_get_hyper_target:nN #1#2
{
\__kernel_tl_set:Ne #2 { \tl_to_str:n {#1} }
- \tl_replace_all:Nen #2 { \c_underscore_str } { / }
- \tl_remove_all:Ne #2 { \c_backslash_str }
+ \tl_replace_all:NVn #2 \c_underscore_str { / }
+ \tl_remove_all:NV #2 \c_backslash_str
\tl_put_left:Nn #2 { doc/function// }
}
\cs_generate_variant:Nn \@@_get_hyper_target:nN { o , e }
@@ -2282,8 +2251,8 @@ and all files in that bundle must be distributed together.
{
\seq_pop:NN #1 \l_@@_tmpa_tl
\tl_gset_eq:NN \g_@@_base_name_tl \l_@@_tmpa_tl
- \tl_greplace_all:Nno \g_@@_base_name_tl
- { ~ } { \c_catcode_other_space_tl }
+ \tl_greplace_all:NnV \g_@@_base_name_tl
+ { ~ } \c_catcode_other_space_tl
\seq_get:NN #1 \l_@@_tmpa_tl
\str_if_eq:VnTF \l_@@_tmpa_tl { \scan_stop: }
{
@@ -2350,13 +2319,10 @@ and all files in that bundle must be distributed together.
% \begin{macrocode}
\prg_new_conditional:Npnn \@@_if_macro_internal:n #1 { p , T , F , TF }
{
- \bool_if:NTF \l_@@_macro_internal_set_bool
- {
- \bool_if:NTF \l_@@_macro_internal_bool
- { \prg_return_true: } { \prg_return_false: }
- }
+ \bool_if:NTF \l_@@_macro_internal_bool
+ { \prg_return_true: }
{
- \tl_if_empty:fTF
+ \tl_if_empty:eTF
{
\exp_after:wN \@@_if_macro_internal_aux:w
\tl_to_str:n { #1 ~ __ }
@@ -2437,7 +2403,8 @@ and all files in that bundle must be distributed together.
} ,
added .code:n = { \@@_date_set_past:Nn \l_@@_date_added_tl {#1} },
updated .code:n = { \@@_date_set_past:Nn \l_@@_date_updated_tl {#1} } ,
- deprecated .code:n = {} , % A stub
+ deprecated .bool_set:N = \l_@@_macro_deprecated_bool ,
+ no-user-doc .bool_set:N = \l_@@_macro_nodoc_bool ,
tested .code:n = { } ,
label .code:n =
{
@@ -2884,18 +2851,14 @@ and all files in that bundle must be distributed together.
\msg_warning:nnnn { l3doc } { deprecated-option }
{ aux } { function/macro }
} ,
+ deprecated .bool_set:N = \l_@@_macro_deprecated_bool ,
internal .value_forbidden:n = true ,
internal .code:n =
- {
- \bool_set_true:N \l_@@_macro_internal_bool
- \bool_set_true:N \l_@@_macro_internal_set_bool
- } ,
+ { \bool_set_true:N \l_@@_macro_internal_bool } ,
int .value_forbidden:n = true ,
int .code:n =
- {
- \bool_set_true:N \l_@@_macro_internal_bool
- \bool_set_true:N \l_@@_macro_internal_set_bool
- } ,
+ { \bool_set_true:N \l_@@_macro_internal_bool } ,
+ no-user-doc .bool_set:N = \l_@@_macro_nodoc_bool ,
var .value_forbidden:n = true ,
var .code:n =
{ \bool_set_true:N \l_@@_macro_var_bool } ,
@@ -2934,7 +2897,6 @@ and all files in that bundle must be distributed together.
} ,
added .code:n = {} , % TODO
updated .code:n = {} , % TODO
- deprecated .code:n = {} , % A stub
verb .bool_set:N = \l_@@_names_verb_bool ,
module .tl_set:N = \l_@@_override_module_tl ,
documented-as .tl_set:N = \l_@@_macro_documented_tl ,
@@ -2977,8 +2939,8 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_macro_init:
{
\int_incr:N \l_@@_nested_macro_int
+ \bool_set_false:N \l_@@_macro_deprecated_bool
\bool_set_false:N \l_@@_macro_internal_bool
- \bool_set_false:N \l_@@_macro_internal_set_bool
\bool_set_false:N \l_@@_macro_TF_bool
\bool_set_false:N \l_@@_macro_pTF_bool
\bool_set_false:N \l_@@_macro_noTF_bool
@@ -3026,8 +2988,8 @@ and all files in that bundle must be distributed together.
\tl_if_empty:NTF \l_@@_macro_documented_tl
{ \@@_names_block_base_map:N \@@_macro_save_names_aux:n }
{
- \seq_gput_right:Nf \g_@@_nested_names_seq
- { \exp_after:wN \token_to_str:N \l_@@_macro_documented_tl }
+ \seq_gput_right:Ne \g_@@_nested_names_seq
+ { \tl_to_str:N \l_@@_macro_documented_tl }
}
}
\cs_new_protected:Npn \@@_macro_save_names_aux:n #1
@@ -3103,7 +3065,6 @@ and all files in that bundle must be distributed together.
{ \@@_get_function_name:n {#1} } #2
}
}
-\cs_generate_variant:Nn \@@_macro_typeset_block:nN { x }
\cs_new_protected:Npn \@@_macro_typeset_variant_list:nN #1#2
{
\seq_map_inline:Nn \g_@@_variants_seq
@@ -3140,7 +3101,12 @@ and all files in that bundle must be distributed together.
\DoNotIndex {#1}
\bool_if:NT #2
{
- \@@_if_macro_internal:nF {#1}
+ \bool_lazy_any:nF
+ {
+ { \@@_if_macro_internal_p:n {#1} }
+ { \l_@@_macro_deprecated_bool }
+ { \l_@@_macro_nodoc_bool }
+ }
{ \seq_gput_right:Nn \g_doc_macros_seq {#1} }
\hbox_set:Nw \l_@@_macro_index_box
\hbox_unpack_drop:N \l_@@_macro_index_box
@@ -3198,8 +3164,8 @@ and all files in that bundle must be distributed together.
\int_compare:nTF { \str_count:n {#1} <= 28 }
{ \MacroFont } { \MacroLongFont }
\tl_set:Nn \l_@@_tmpa_tl {#1}
- \tl_replace_all:Nno \l_@@_tmpa_tl
- { ~ } { \c_catcode_other_space_tl }
+ \tl_replace_all:NnV \l_@@_tmpa_tl
+ { ~ } \c_catcode_other_space_tl
\@@_macroname_prefix:o \l_@@_tmpa_tl
\@@_macroname_suffix:N #2
}
@@ -3377,8 +3343,8 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_macro_end_wrap_item:n #1
{
\tl_set:Nn \l_@@_tmpa_tl {#1}
- \tl_replace_all:Non \l_@@_tmpa_tl
- { \token_to_str:N _ } { \_ }
+ \tl_replace_all:NVn \l_@@_tmpa_tl
+ \c_underscore_str { \_ }
\texttt { \l_@@_tmpa_tl }
}
\cs_new_protected:Npn \@@_print_end_definition:
@@ -3400,7 +3366,14 @@ and all files in that bundle must be distributed together.
{
\seq_gset_filter:NNn \g_@@_nested_names_seq
\g_@@_nested_names_seq
- { ! \@@_if_macro_internal_p:n {##1} }
+ {
+ ! \bool_lazy_any_p:n
+ {
+ { \@@_if_macro_internal_p:n {##1} }
+ { \l_@@_macro_deprecated_bool }
+ { \l_@@_macro_nodoc_bool }
+ }
+ }
\seq_if_empty:NF \g_@@_nested_names_seq
{
\int_set:Nn \l_@@_tmpa_int
@@ -3963,18 +3936,18 @@ and all files in that bundle must be distributed together.
\tl_clear:N \l_@@_doc_def_tl
\tl_clear:N \l_@@_doc_undef_tl
\tl_clear:N \l_@@_undoc_def_tl
+ \seq_gremove_duplicates:N \g_doc_functions_seq
+ \seq_gremove_duplicates:N \g_doc_macros_seq
\seq_map_inline:Nn \g_doc_functions_seq
{
\seq_if_in:NnTF \g_doc_macros_seq {##1}
{
\tl_put_right:Ne \l_@@_doc_def_tl
- { ##1 \iow_newline: }
- \iow_now:Nn \g_@@_func_iow { > ~ ##1 }
+ { \iow_newline: > ~ ##1 }
}
{
\tl_put_right:Ne \l_@@_doc_undef_tl
- { ##1 \iow_newline: }
- \iow_now:Nn \g_@@_func_iow { ! ~ ##1 }
+ { \iow_newline: ! ~ ##1 }
}
}
\seq_map_inline:Nn \g_doc_macros_seq
@@ -3982,8 +3955,7 @@ and all files in that bundle must be distributed together.
\seq_if_in:NnF \g_doc_functions_seq {##1}
{
\tl_put_right:Ne \l_@@_undoc_def_tl
- { ##1 \iow_newline: }
- \iow_now:Nn \g_@@_func_iow { ? ~ ##1 }
+ { \iow_newline: ? ~ ##1 }
}
}
\@@_functions_typeout:nN
@@ -4012,11 +3984,11 @@ and all files in that bundle must be distributed together.
{
\tl_if_empty:NF #2
{
- \typeout
+ \iow_now:Ne \g_@@_func_iow
{
\c_@@_iow_midrule_tl \iow_newline:
#1 \iow_newline:
- \c_@@_iow_midrule_tl \iow_newline:
+ \c_@@_iow_midrule_tl
#2
}
\tl_clear:N #2
@@ -4367,7 +4339,7 @@ and all files in that bundle must be distributed together.
\__kernel_tl_set:Ne #1 { \tl_to_str:n {#2} }
\@@_if_almost_str:nTF {#2}
{
- \tl_replace_all:Non #1 { \tl_to_str:n { __ } }
+ \tl_replace_all:Nen #1 { \tl_to_str:n { __ } }
{
\verbatimchar
\token_to_str:N \_ \token_to_str:N \_
@@ -4390,8 +4362,8 @@ and all files in that bundle must be distributed together.
}
{
\tl_set:Nn #1 {#2}
- \tl_replace_all:Non #1
- { \c_backslash_str }
+ \tl_replace_all:NVn #1
+ \c_backslash_str
{ \token_to_str:N \bslash \c_space_tl }
}
\@@_quote_special_char:N #1
@@ -4430,27 +4402,26 @@ and all files in that bundle must be distributed together.
% module name, while for \TeX{}/\LaTeXe{} commands the module name is
% |TeX|, and others have an empty module name.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_key_get:n #1
- {
- \@@_key_get_base:nN {#1} \l_@@_index_macro_tl
- \__kernel_tl_set:Ne \l_@@_index_key_tl
- { \tl_to_str:N \l_@@_index_macro_tl }
- \tl_clear:N \l_@@_index_module_tl
- \tl_if_in:NoTF \l_@@_index_key_tl { \tl_to_str:n { __ } }
- { \bool_set_true:N \l_@@_index_internal_bool }
- { \bool_set_false:N \l_@@_index_internal_bool }
- \exp_last_unbraced:NNo
- \tl_if_head_eq_charcode:oNT
- { \l_@@_index_key_tl } \c_backslash_str
- { \@@_key_pop: }
- \tl_if_in:NoTF \l_@@_index_key_tl { \token_to_str:N : }
- { \@@_key_func: }
+\cs_new_protected:Npe \@@_key_get:n #1
+ {
+ \exp_not:N \@@_key_get_base:nN {#1} \exp_not:N \l_@@_index_macro_tl
+ \__kernel_tl_set:Ne \exp_not:N \l_@@_index_key_tl
+ { \exp_not:N \tl_to_str:N \exp_not:N \l_@@_index_macro_tl }
+ \tl_clear:N \exp_not:N \l_@@_index_module_tl
+ \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \tl_to_str:n { __ } }
+ { \bool_set_true:N \exp_not:N \l_@@_index_internal_bool }
+ { \bool_set_false:N \exp_not:N \l_@@_index_internal_bool }
+ \exp_not:N \tl_if_head_eq_charcode:VNT
+ \exp_not:N \l_@@_index_key_tl \c_backslash_str
+ { \exp_not:N \@@_key_pop: }
+ \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \token_to_str:N : }
+ { \exp_not:N \@@_key_func: }
{
- \tl_if_in:NoTF \l_@@_index_key_tl { \token_to_str:N _ }
- { \@@_key_var: }
+ \tl_if_in:NnTF \exp_not:N \l_@@_index_key_tl { \token_to_str:N _ }
+ { \exp_not:N \@@_key_var: }
{
- \tl_if_in:NoT \l_@@_index_key_tl { \token_to_str:N @ }
- { \tl_set:Nn \l_@@_index_module_tl { TeX } }
+ \tl_if_in:NnT \exp_not:N \l_@@_index_key_tl { \token_to_str:N @ }
+ { \tl_set:Nn \exp_not:N \l_@@_index_module_tl { TeX } }
}
}
}
@@ -4476,7 +4447,7 @@ and all files in that bundle must be distributed together.
}
\cs_new_protected:Npn \@@_key_drop_underscores:
{
- \tl_if_head_eq_charcode:oNT { \l_@@_index_key_tl } _
+ \tl_if_head_eq_charcode:VNT \l_@@_index_key_tl _
{ \@@_key_pop: \@@_key_drop_underscores: }
}
% \end{macrocode}
@@ -4491,7 +4462,7 @@ and all files in that bundle must be distributed together.
% \begin{macrocode}
\cs_new_protected:Npn \@@_key_func:
{
- \tl_if_head_eq_charcode:oNT { \l_@@_index_key_tl } .
+ \tl_if_head_eq_charcode:VNT \l_@@_index_key_tl .
{ \@@_key_pop: }
\@@_key_drop_underscores:
\tl_set_eq:NN \l_@@_index_module_tl \l_@@_index_key_tl
@@ -4527,7 +4498,7 @@ and all files in that bundle must be distributed together.
\exp_args:Ne \tl_if_head_eq_charcode:nNTF
{ \exp_args:No \str_tail:n \l_@@_index_key_tl } _
{
- \str_case:fn { \str_head:N \l_@@_index_key_tl }
+ \str_case:en { \str_head:N \l_@@_index_key_tl }
{
{ q } { \tl_set:Nn \l_@@_index_module_tl { quark } }
{ s } { \tl_set:Nn \l_@@_index_module_tl { scan } }
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
index e6c46d39655..ebf9af795f5 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
index 613af946f92..36fb87f2acc 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -310,23 +310,16 @@
%
% When speed is essential (for functions that do very little work and
% whose variants are used numerous times in a document) the following
-% considerations apply because internal functions for argument expansion
-% come in two flavours, some faster than others.
+% considerations apply because the speed of internal functions that
+% expand the arguments of a base function depend on what needs doing
+% with each argument and where this happens in the list of arguments:
% \begin{itemize}
-% \item
-% Arguments that might need expansion should come first in the list
-% of arguments.
-% \item
-% Arguments that should consist of single tokens |N|, |c|, |V|, or
-% |v| should come first among these.
-% \item
-% Arguments that appear after the first multi-token argument |n|,
-% |f|, |e|, or |o| require slightly slower special processing to be
-% expanded. Therefore it is best to use the optimized functions,
-% namely those that contain only |N|, |c|, |V|, and |v|, and, in the
-% last position, |o|, |f|, |e|, with possible trailing |N| or |n| or
-% |T| or |F|, which are not expanded. Any |x|-type argument causes
-% slightly slower processing.
+% \item for fastest processing any |c|-type arguments should come first
+% followed by all other modified arguments;
+% \item unchanged |N|-type args that appear before modified ones have
+% a small performance hit;
+% \item unchanged |n|-type args that appear before modified ones have
+% a relative larger performance hit.
% \end{itemize}
%
% \section{Manipulating the first argument}
@@ -471,7 +464,6 @@
% third as detailed by their argument specifier. The first argument
% of the function is then the next item on the input stream, followed
% by the expansion of the second and third arguments.
-% These functions need slower processing.
% \end{function}
%
% \begin{function}
@@ -542,7 +534,6 @@
% and fourth as detailed by their argument specifier. The first
% argument of the function is then the next item on the input stream,
% followed by the expansion of the second argument, \emph{etc}.
-% These functions need slower processing.
% \end{function}
%
% \begin{function}[added = 2015-08-12]
@@ -2384,8 +2375,9 @@
%
% \subsection{Held-over variant generation}
%
-% \begin{macro}{\cs_generate_from_arg_count:NNno}
-% \begin{macro}{\cs_replacement_spec:c}
+% \begin{macro}[documented-as = \cs_generate_from_arg_count:NNnn]
+% {\cs_generate_from_arg_count:NNno}
+% \begin{macro}[documented-as = \cs_replacement_spec:N]{\cs_replacement_spec:c}
% A couple of variants that are from early functions.
% \begin{macrocode}
\cs_generate_variant:Nn \cs_generate_from_arg_count:NNnn { NNno }
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
index 6af1bc4c00b..8545a839473 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -716,7 +716,8 @@
% \cs{file_if_exist_p:n} \Arg{file name}
% \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
% \end{syntax}
-% Searches for \meta{file name} using the current \TeX{} search
+% Expands the argument of the \cs{file name} to give a string, then
+% searches for this string using the current \TeX{} search
% path and the additional paths controlled by
% \cs{l_file_search_path_seq}.
% \end{function}
@@ -724,10 +725,10 @@
% \begin{function}[noTF, added = 2019-01-16, updated = 2019-02-16]
% {\file_get:nnN, \file_get:VnN}
% \begin{syntax}
-% \cs{file_get:nnN} \Arg{filename} \Arg{setup} \meta{tl}
-% \cs{file_get:nnNTF} \Arg{filename} \Arg{setup} \meta{tl} \Arg{true code} \Arg{false code}
+% \cs{file_get:nnN} \Arg{file name} \Arg{setup} \meta{tl}
+% \cs{file_get:nnNTF} \Arg{file name} \Arg{setup} \meta{tl} \Arg{true code} \Arg{false code}
% \end{syntax}
-% Defines \meta{tl} to the contents of \meta{filename}.
+% Defines \meta{tl} to the contents of \meta{file name}.
% Category codes may need to be set appropriately via the \meta{setup}
% argument.
% The non-branching version sets the \meta{tl} to \cs{q_no_value} if the file is
@@ -2546,21 +2547,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated functions}
-%
-% \begin{macro}
-% {
-% \iow_shipout_x:Nn, \iow_shipout_x:Nx,
-% \iow_shipout_x:cn, \iow_shipout_x:cx
-% }
-% Previously described as \texttt{x}-type, but the hash behaviour is really
-% \texttt{e}-type.
-% \begin{macrocode}
-\cs_new_eq:NN \iow_shipout_x:Nn \iow_shipout_e:Nn
-\cs_generate_variant:Nn \iow_shipout_x:Nn { Nx , c, cx }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macrocode}
%<@@=file>
% \end{macrocode}
@@ -3359,7 +3345,7 @@
% {
% \file_compare_timestamp:nNn,
% \file_compare_timestamp:nNV,
-% \file_compare_timestamp:VNn
+% \file_compare_timestamp:VNn,
% \file_compare_timestamp:VNV
% }
% \begin{macro}[EXP]{\@@_compare_timestamp:nnN}
@@ -3415,7 +3401,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[TF]{\file_if_exist:n, \file_if_exist:V}
+% \begin{macro}[pTF]{\file_if_exist:n, \file_if_exist:V}
% The test for the existence of a file is a wrapper around the function to
% add a path to a file. If the file was found, the path contains
% something, whereas if the file was not located then the return value
@@ -3569,8 +3555,8 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name:nV}
-% \begin{macro}{\file_parse_full_name_apply:nN \file_parse_full_name_apply:VN}
+% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name:V}
+% \begin{macro}{\file_parse_full_name_apply:nN, \file_parse_full_name_apply:VN}
% The main parsing macro \cs{file_parse_full_name_apply:nN} passes the
% file name |#1| through \cs{__kernel_file_name_sanitize:n} so that we
% have a single normalised way to treat files internally.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
index cecc72ceea7..d94897f87d4 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -61,7 +61,7 @@
% to zero requires non-expandable assignments.
%
% Flag variables are always local. They are referenced by a \meta{flag
-% name} such as \texttt{str_missing}. The \meta{flag name} is used as
+% name} such as \texttt{@@_missing}. The \meta{flag name} is used as
% part of \cs{use:c} constructions hence is expanded at point of use.
% It must expand to character tokens only, with no spaces.
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
index 08a7d80880b..42f915af33c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
% \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 dad8ef3c312..53ce603de0d 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
index e29d08f3178..e0e8965aea6 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
index 879d9bed5a9..0a8252da36d 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
index 7bf48968b95..7f29ebf992a 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
index a6f1b1fcaad..7103a8d4eae 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx
index 917f0bf3305..5b5a29395f8 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
index ed5fe892b30..692b2839a31 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
index 17fef949236..025bd5b7e34 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
index e2654aae99e..09097cc68e1 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
index afbff6f769f..961c60363f3 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx
index 201bec92704..7b25907b77a 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
index 2b152c5ca65..0371eddb5de 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
% \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 4421bda0a4e..2c62fd572bc 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx
index 2c1f66ff712..100e3f00f48 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
index 77c7bc625ca..526a2a81bc2 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
index 180b11fdaa5..9e9acd795dd 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
index 417e3cc08d1..f50b3e0add7 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
index 806b10c6c97..b566791654d 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
index a07c55d7f5b..72ea6c74809 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -415,6 +415,13 @@
% are errors, and in such case the definition is aborted.
% \end{function}
%
+% \begin{function}{\__kernel_sys_everyjob:}
+% \begin{syntax}
+% \cs{__kernel_sys_everyjob:}
+% \end{syntax}
+% Inserts the internal token list required at the start of every run (job).
+% \end{function}
+%
% \begin{variable}{\c__kernel_randint_max_int}
% Maximal allowed argument to \cs{__kernel_randint:n}. Equal to
% $2^{17}-1$.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
index 7dc05afee07..75c4c34f224 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -1585,11 +1585,16 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_keys_key_str, \l_keys_key_tl}
-% The name of a key itself: needed when setting keys. The |tl| version
-% is deprecated but has to be handled manually.
+% \begin{variable}{\l_keys_key_str}
+% The name of a key itself: needed when setting keys.
% \begin{macrocode}
\str_new:N \l_keys_key_str
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}[deprecated]{\l_keys_key_tl}
+% The |tl| version is deprecated but has to be handled manually.
+% \begin{macrocode}
\tl_new:N \l_keys_key_tl
% \end{macrocode}
% \end{variable}
@@ -1616,12 +1621,17 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_keys_path_str, \l_keys_path_tl}
+% \begin{variable}{\l_keys_path_str}
% The \enquote{path} of the current key is stored here: this is
-% available to the programmer and so is public. The older version is
-% deprecated but has to be handled manually.
+% available to the programmer and so is public.
% \begin{macrocode}
\str_new:N \l_keys_path_str
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}[deprecated]{\l_keys_path_tl}
+% The older version is deprecated but has to be handled manually.
+% \begin{macrocode}
\tl_new:N \l_keys_path_tl
% \end{macrocode}
% \end{variable}
@@ -3593,38 +3603,6 @@
\prop_gput:Nnn \g_msg_module_type_prop { keys } { }
% \end{macrocode}
%
-% \subsection{Deprecated functions}
-%
-% \begin{macro}{.str_set_x:N, .str_set_x:c}
-% \begin{macro}{.str_gset_x:N, .str_gset_x:c}
-% \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:N } #1
- { \@@_variable_set:NnnN #1 { str } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .str_set_x:c } #1
- { \@@_variable_set:cnnN {#1} { str } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:N } #1
- { \@@_variable_set:NnnN #1 { str } { g } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .str_gset_x:c } #1
- { \@@_variable_set:cnnN {#1} { str } { g } x }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{.tl_set_x:N, .tl_set_x:c}
-% \begin{macro}{.tl_gset_x:N, .tl_gset_x:c}
-% \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:N } #1
- { \@@_variable_set:NnnN #1 { tl } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:c } #1
- { \@@_variable_set:cnnN {#1} { tl } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:N } #1
- { \@@_variable_set:NnnN #1 { tl } { g } x }
-\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:c } #1
- { \@@_variable_set:cnnN {#1} { tl } { g } x }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
index 091da9a2cf6..915ae07bb81 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
index ef582049e2a..d94a2c6ad60 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -450,7 +450,7 @@ ltxutils.filedump = filedump
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{md5.HEX}
+% \begin{macro}[int]{md5.HEX}
% Hash a string and return the hash in uppercase hexadecimal format.
% In some engines, this is build-in. For traditional \LuaTeX{}, the conversion
% to hexadecimal has to be done by us.
@@ -681,7 +681,7 @@ if luatexbase then
if status.ini_version then
% \end{macrocode}
%
-% \begin{macro}{register_luadata}
+% \begin{macro}[int]{register_luadata}
% \texttt{register_luadata} is only available during format generation.
% It accept a string which uniquely identifies the data object and has to be
% provided to retrieve it later. Additionally it accepts a function which is
@@ -716,7 +716,7 @@ if luatexbase then
else
% \end{macrocode}
%
-% \begin{macro}{get_luadata}
+% \begin{macro}[int]{get_luadata}
% \texttt{get_luadata} is only available if data should be restored.
% It accept the identifier which was used when the data object was registered and
% returns the associated object. Every object can only be retrieved once.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
index 54c25fd3c3f..b12cdab55c0 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
index 479a4b5dfc8..1441e889c31 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -1461,7 +1461,7 @@
%<*lua>
% \end{macrocode}
%
-% \begin{macro}{\tex_strcmp:D}
+% \begin{macro}[no-user-doc]{\tex_strcmp:D}
% Compare two strings, expanding to |0| if they are equal,
% |-1| if the first one is smaller and |1| if the second one is smaller.
% Here \enquote{smaller} refers to codepoint order which does not correspond to
@@ -1482,7 +1482,7 @@ end, 'global')
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\tex_Ucharcat:D}
+% \begin{macro}[no-user-doc]{\tex_Ucharcat:D}
% Creating arbitrary chars using |tex.cprint|.
% The alternative approach using |token.new(...)| is about 10\% slower
% but needed to create arbitrary space tokens.
@@ -1501,7 +1501,7 @@ end, 'global')
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\tex_filesize:D}
+% \begin{macro}[no-user-doc]{\tex_filesize:D}
% Wrap the function from |ltxutils|.
% \begin{macrocode}
luacmd('tex_filesize:D', function()
@@ -1511,7 +1511,7 @@ end, 'global')
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\tex_mdfivesum:D}
+% \begin{macro}[no-user-doc]{\tex_mdfivesum:D}
% There are two cases: Either hash a file or a string.
% Both are already implemented in l3luatex or built-in.
% \begin{macrocode}
@@ -1527,7 +1527,7 @@ end, 'global')
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\tex_filemoddate:D}
+% \begin{macro}[no-user-doc]{\tex_filemoddate:D}
% A primitive for getting the modification date of a file.
% \begin{macrocode}
luacmd('tex_filemoddate:D', function()
@@ -1537,7 +1537,7 @@ end, 'global')
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\tex_filedump:D}
+% \begin{macro}[no-user-doc]{\tex_filedump:D}
% An emulated primitive for getting a hexdump from a (partial) file.
% The length has a default of |0|. This is consistent with
% \pdfTeX, but it effectivly makes the primitive useless without an
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
index 1ac0468ac6e..ae07ef82a6b 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -369,7 +369,7 @@
%
% \subsection{Version}
%
-% \begin{macro}{\pdf_version_compare:Nn}
+% \begin{macro}[pTF,EXP]{\pdf_version_compare:Nn}
% \begin{macro}
% {
% @@_version_compare_=:w ,
@@ -522,33 +522,6 @@
}
% \end{macrocode}
%
-% \subsection{Deprecated functions}
-%
-% \begin{variable}{\g_@@_object_prop}
-% For tracking objects.
-% \begin{macrocode}
-\prop_new:N \g_@@_object_prop
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\pdf_object_new:nn, \pdf_object_write:nn, \pdf_object_write:nx}
-% Wrap up the type data in a prop.
-% \begin{macrocode}
-\cs_new_protected:Npn \pdf_object_new:nn #1#2
- {
- \prop_gput:Nnn \g_@@_object_prop {#1} {#2}
- \@@_backend_object_new:n {#1}
- }
-\cs_new_protected:Npn \pdf_object_write:nn #1#2
- {
- \exp_args:Nne \@@_backend_object_write:nnn
- {#1} { \prop_item:Nn \g_@@_object_prop {#1} } {#2}
- \bool_gset_true:N \g_@@_init_bool
- }
-\cs_generate_variant:Nn \pdf_object_write:nn { nx }
-% \end{macrocode}
-% \end{macro}
-%
% \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 b5cd8bc3a47..201d7bde90c 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -330,12 +330,13 @@
% based on this result.
% \end{function}
%
-% \begin{function}[EXP, added = 2021-11-01]{\bool_to_str:N, \bool_to_str:c, \bool_to_str:n}
+% \begin{function}[EXP, added = 2021-11-01, updated = 2023-11-14]
+% {\bool_to_str:N, \bool_to_str:c, \bool_to_str:n}
% \begin{syntax}
% \cs{bool_to_str:N} \meta{boolean}
% \cs{bool_to_str:n} \meta{boolean expression}
% \end{syntax}
-% Expands to the letters \texttt{true} or \texttt{false} depending on
+% Expands to the string \texttt{true} or \texttt{false} depending on
% the logical truth of the \meta{boolean} or \meta{boolean
% expression}.
% \end{function}
@@ -1048,11 +1049,19 @@
% \end{macro}
%
% \begin{macro}[EXP]{\bool_to_str:N, \bool_to_str:c, \bool_to_str:n}
-% Expands to \texttt{true} or \texttt{false} with category code letter.
+% Expands to string literal \texttt{true} or \texttt{false}.
% \begin{macrocode}
-\cs_new:Npn \bool_to_str:N #1 { \bool_if:NTF #1 { true } { false } }
+\cs_new:Npe \bool_to_str:N #1
+ {
+ \exp_not:N \bool_if:NTF #1
+ { \tl_to_str:n { true } } { \tl_to_str:n { false } }
+ }
\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:Npe \bool_to_str:n #1
+ {
+ \exp_not:N \bool_if:nTF {#1}
+ { \tl_to_str:n { true } } { \tl_to_str:n { false } }
+ }
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
index c6dc4afc996..bf1a1a0c334 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
index 252cf67aef9..21d6dbc9d7b 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
index aa6cf69c8ad..f9e2663cc32 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -667,7 +667,7 @@
% \begin{function}[noTF, added = 2017-05-26]
% {
% \regex_extract_once:nnN, \regex_extract_once:nVN,
-% \regex_extract_once:NVN, \regex_extract_once:NVN
+% \regex_extract_once:NnN, \regex_extract_once:NVN
% }
% \begin{syntax}
% \cs{regex_extract_once:nnN} \Arg{regex} \Arg{token list} \meta{seq~var}
@@ -6683,7 +6683,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[noTF]{\regex_case_replace_all:nN}
+% \begin{macro}[noTF]{\regex_replace_case_all:nN}
% If the input is bad (odd number of items) then take the false
% branch. Otherwise, use the same auxiliary as
% \cs{regex_replace_all:nnN}, but with more complicated code to build
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
index 64ab9771a9b..5021a700779 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -1413,7 +1413,7 @@
% \seq_gput_left:Nn, \seq_gput_left:NV, \seq_gput_left:Nv, \seq_gput_left:Ne,
% \seq_gput_left:No, \seq_gput_left:Nx,
% \seq_gput_left:cn, \seq_gput_left:cV, \seq_gput_left:cv, \seq_gput_left:ce,
-% \seq_gput_left:co, \seq_put_left:cx
+% \seq_gput_left:co, \seq_gput_left:cx
% }
% \begin{macro}[EXP]{\@@_put_left_aux:w}
% When adding to the left of a sequence, remove \cs{s_@@}. This is
@@ -1525,7 +1525,7 @@
% {
% \seq_remove_all:Nn, \seq_remove_all:NV, \seq_remove_all:Ne,
% \seq_remove_all:Nx,
-% \seq_remove_all:cn, \seq_remove_all:cV, \seq_remove_all:ce
+% \seq_remove_all:cn, \seq_remove_all:cV, \seq_remove_all:ce,
% \seq_remove_all:cx,
% }
% \UnitTested
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
index eba5656f82c..750c0995f3b 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
index e296421b045..c1525643040 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
index 51419bd87eb..0da2e88de8d 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -343,13 +343,13 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{str_byte, str_error}
+% \begin{variable}{@@_byte, @@_error}
% Conversions from one \meta{encoding}/\meta{escaping} pair to another
% are done within \texttt{e}-expanding assignments. Errors are
% signalled by raising the relevant flag.
% \begin{macrocode}
-\flag_new:n { str_byte }
-\flag_new:n { str_error }
+\flag_new:n { @@_byte }
+\flag_new:n { @@_error }
% \end{macrocode}
% \end{variable}
%
@@ -714,6 +714,8 @@
{ encode } { escape }
\use_ii_i:nn
\@@_convert_encode_:
+ \__kernel_tl_gset:Ne \g_@@_result_tl
+ { \tl_to_str:V \g_@@_result_tl }
\group_end:
#2 #3 \g_@@_result_tl
}
@@ -891,7 +893,7 @@
% \begin{macro}[rEXP]{\@@_filter_bytes_aux:N}
% In the case of 8-bit engines, every character is a byte. For
% Unicode-aware engines, test the character code; non-bytes cause us
-% to raise the flag \texttt{str_byte}. Spaces have already been given
+% to raise the flag \texttt{@@_byte}. Spaces have already been given
% the correct category code when this function is called.
% \begin{macrocode}
\bool_lazy_any:nTF
@@ -912,7 +914,7 @@
\if_int_compare:w `#1 < 256 \exp_stop_f:
#1
\else:
- \flag_raise:n { str_byte }
+ \flag_raise:n { @@_byte }
\fi:
\@@_filter_bytes_aux:N
}
@@ -935,10 +937,10 @@
{
\cs_new_protected:Npn \@@_convert_unescape_:
{
- \flag_clear:n { str_byte }
+ \flag_clear:n { @@_byte }
\__kernel_tl_gset:Ne \g_@@_result_tl
{ \exp_args:No \@@_filter_bytes:n \g_@@_result_tl }
- \@@_if_flag_error:nne { str_byte } { non-byte } { bytes }
+ \@@_if_flag_error:nne { @@_byte } { non-byte } { bytes }
}
}
{ \cs_new_protected:Npn \@@_convert_unescape_: { } }
@@ -995,15 +997,15 @@
{
\cs_new_protected:Npn \@@_convert_encode_:
{
- \flag_clear:n { str_error }
+ \flag_clear:n { @@_error }
\@@_convert_gmap_internal:N \@@_encode_native_char:n
- \@@_if_flag_error:nne { str_error }
+ \@@_if_flag_error:nne { @@_error }
{ native-overflow } { }
}
\cs_new:Npn \@@_encode_native_char:n #1
{
\if_int_compare:w #1 > \c_@@_max_byte_int
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
?
\else:
\char_generate:nn {#1} {12}
@@ -1184,9 +1186,9 @@
\exp_not:N \@@_decode_eight_bit_aux:Nn
\exp_not:c { g_@@_decode_#1_intarray }
}
- \flag_clear:n { str_error }
+ \flag_clear:n { @@_error }
\@@_convert_gmap:N \@@_tmp:w
- \@@_if_flag_error:nne { str_error } { decode-8-bit } {#1}
+ \@@_if_flag_error:nne { @@_error } { decode-8-bit } {#1}
}
\cs_new:Npn \@@_decode_eight_bit_aux:Nn #1#2
{
@@ -1198,7 +1200,7 @@
\cs_new:Npn \@@_decode_eight_bit_aux:n #1
{
\if_int_compare:w #1 < \c_zero_int
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
\int_value:w \c_@@_replacement_char_int
\else:
#1
@@ -1228,9 +1230,9 @@
\exp_not:c { g_@@_encode_#1_intarray }
\exp_not:c { g_@@_decode_#1_intarray }
}
- \flag_clear:n { str_error }
+ \flag_clear:n { @@_error }
\@@_convert_gmap_internal:N \@@_tmp:w
- \@@_if_flag_error:nne { str_error } { encode-8-bit } {#1}
+ \@@_if_flag_error:nne { @@_error } { encode-8-bit } {#1}
}
\cs_new:Npn \@@_encode_eight_bit_aux:NNn #1#2#3
{
@@ -1246,7 +1248,7 @@
{
\int_compare:nNnTF { \intarray_item:Nn #3 { 1 + #1 } } = {#2}
{ \@@_output_byte:n {#1} }
- { \flag_raise:n { str_error } }
+ { \flag_raise:n { @@_error } }
}
% \end{macrocode}
% \end{macro}
@@ -1266,7 +1268,7 @@
{
Since~native~strings~do~not~consist~in~bytes,~
none~of~the~escaping~methods~make~sense.~
- The~specified~escaping,~'#1',~will be ignored.
+ The~specified~escaping,~'#1',~will~be~ignored.
}
\msg_new:nnn { str } { file-not-found }
{ File~'l3str-#1.def'~not~found. }
@@ -1347,7 +1349,7 @@
\cs_new_protected:Npn \@@_convert_unescape_hex:
{
\group_begin:
- \flag_clear:n { str_error }
+ \flag_clear:n { @@_error }
\int_set:Nn \tex_escapechar:D { 92 }
\__kernel_tl_gset:Ne \g_@@_result_tl
{
@@ -1358,7 +1360,7 @@
\prg_break_point:
\@@_output_end:
}
- \@@_if_flag_error:nne { str_error } { unescape-hex } { }
+ \@@_if_flag_error:nne { @@_error } { unescape-hex } { }
\group_end:
}
\cs_new:Npn \@@_unescape_hex_auxi:N #1
@@ -1367,7 +1369,7 @@
\@@_hexadecimal_use:NTF #1
{ \@@_unescape_hex_auxii:N }
{
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
\@@_unescape_hex_auxi:N
}
}
@@ -1380,7 +1382,7 @@
\@@_output_byte:w " \@@_unescape_hex_auxi:N
}
{
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
\@@_unescape_hex_auxii:N
}
}
@@ -1425,8 +1427,8 @@
\cs_new_protected:cpn { @@_convert_unescape_#2: }
{
\group_begin:
- \flag_clear:n { str_byte }
- \flag_clear:n { str_error }
+ \flag_clear:n { @@_byte }
+ \flag_clear:n { @@_error }
\int_set:Nn \tex_escapechar:D { 92 }
\__kernel_tl_gset:Ne \g_@@_result_tl
{
@@ -1434,8 +1436,8 @@
#1 ? { ? \prg_break: }
\prg_break_point:
}
- \@@_if_flag_error:nne { str_byte } { non-byte } { #2 }
- \@@_if_flag_error:nne { str_error } { unescape-#2 } { }
+ \@@_if_flag_error:nne { @@_byte } { non-byte } { #2 }
+ \@@_if_flag_error:nne { @@_error } { unescape-#2 } { }
\group_end:
}
\cs_new:Npn #3 ##1#1##2##3
@@ -1448,12 +1450,12 @@
\@@_hexadecimal_use:NTF ##3
{ }
{
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
* 0 + `#1 \use_i:nn
}
}
{
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
0 + `#1 \use_i:nn
}
\@@_output_end:
@@ -1511,8 +1513,8 @@
\cs_new_protected:Npn \@@_convert_unescape_string:
{
\group_begin:
- \flag_clear:n { str_byte }
- \flag_clear:n { str_error }
+ \flag_clear:n { @@_byte }
+ \flag_clear:n { @@_error }
\int_set:Nn \tex_escapechar:D { 92 }
\__kernel_tl_gset:Ne \g_@@_result_tl
{
@@ -1526,8 +1528,8 @@
\g_@@_result_tl #1 ?? { ? \prg_break: }
\prg_break_point:
}
- \@@_if_flag_error:nne { str_byte } { non-byte } { string }
- \@@_if_flag_error:nne { str_error } { unescape-string } { }
+ \@@_if_flag_error:nne { @@_byte } { non-byte } { string }
+ \@@_if_flag_error:nne { @@_error } { unescape-string } { }
\group_end:
}
}
@@ -1567,7 +1569,7 @@
{ ^^J } { 0 - 1 }
}
{
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
0 - 1 \use_i:nn
}
}
@@ -1844,19 +1846,19 @@
% first remind the user what a correct \textsc{utf-8} string should
% look like, then add error-specific information.
% \begin{macrocode}
-\flag_clear_new:n { str_missing }
-\flag_clear_new:n { str_extra }
-\flag_clear_new:n { str_overlong }
-\flag_clear_new:n { str_overflow }
+\flag_clear_new:n { @@_missing }
+\flag_clear_new:n { @@_extra }
+\flag_clear_new:n { @@_overlong }
+\flag_clear_new:n { @@_overflow }
\msg_new:nnnn { str } { utf8-decode }
{
Invalid~UTF-8~string:
\exp_last_unbraced:Nf \use_none:n
{
- \@@_if_flag_times:nT { str_missing } { ,~missing~continuation~byte }
- \@@_if_flag_times:nT { str_extra } { ,~extra~continuation~byte }
- \@@_if_flag_times:nT { str_overlong } { ,~overlong~form }
- \@@_if_flag_times:nT { str_overflow } { ,~code~point~too~large }
+ \@@_if_flag_times:nT { @@_missing } { ,~missing~continuation~byte }
+ \@@_if_flag_times:nT { @@_extra } { ,~extra~continuation~byte }
+ \@@_if_flag_times:nT { @@_overlong } { ,~overlong~form }
+ \@@_if_flag_times:nT { @@_overflow } { ,~code~point~too~large }
}
.
}
@@ -1871,25 +1873,25 @@
Code~point~ <~1114112:~11110xxx~10xxxxxx~10xxxxxx~10xxxxxx \\
}
Bytes~of~the~form~10xxxxxx~are~called~continuation~bytes.
- \flag_if_raised:nT { str_missing }
+ \flag_if_raised:nT { @@_missing }
{
\\\\
A~leading~byte~(in~the~range~[192,255])~was~not~followed~by~
the~appropriate~number~of~continuation~bytes.
}
- \flag_if_raised:nT { str_extra }
+ \flag_if_raised:nT { @@_extra }
{
\\\\
LaTeX~came~across~a~continuation~byte~when~it~was~not~expected.
}
- \flag_if_raised:nT { str_overlong }
+ \flag_if_raised:nT { @@_overlong }
{
\\\\
Every~Unicode~code~point~must~be~expressed~in~the~shortest~
possible~form.~For~instance,~'0xC0'~'0x83'~is~not~a~valid~
representation~for~the~code~point~3.
}
- \flag_if_raised:nT { str_overflow }
+ \flag_if_raised:nT { @@_overflow }
{
\\\\
Unicode~limits~code~points~to~the~range~[0,1114111].
@@ -1968,18 +1970,18 @@
% \begin{macrocode}
\cs_new_protected:cpn { @@_convert_decode_utf8: }
{
- \flag_clear:n { str_error }
- \flag_clear:n { str_missing }
- \flag_clear:n { str_extra }
- \flag_clear:n { str_overlong }
- \flag_clear:n { str_overflow }
+ \flag_clear:n { @@_error }
+ \flag_clear:n { @@_missing }
+ \flag_clear:n { @@_extra }
+ \flag_clear:n { @@_overlong }
+ \flag_clear:n { @@_overflow }
\__kernel_tl_gset:Ne \g_@@_result_tl
{
\exp_after:wN \@@_decode_utf_viii_start:N \g_@@_result_tl
{ \prg_break: \@@_decode_utf_viii_end: }
\prg_break_point:
}
- \@@_if_flag_error:nne { str_error } { utf8-decode } { }
+ \@@_if_flag_error:nne { @@_error } { utf8-decode } { }
}
\cs_new:Npn \@@_decode_utf_viii_start:N #1
{
@@ -1989,8 +1991,8 @@
\if_int_compare:w `#1 < "80 \exp_stop_f:
\int_value:w `#1
\else:
- \flag_raise:n { str_extra }
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_extra }
+ \flag_raise:n { @@_error }
\int_use:N \c_@@_replacement_char_int
\fi:
\else:
@@ -2013,8 +2015,8 @@
\int_value:w \int_eval:n { #1 * "40 + `#3 - "80 } \exp_after:wN
\else:
\s_@@
- \flag_raise:n { str_missing }
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_missing }
+ \flag_raise:n { @@_error }
\int_use:N \c_@@_replacement_char_int
\fi:
\s_@@
@@ -2027,8 +2029,8 @@
\if_int_compare:w #1 < #4 \exp_stop_f:
\s_@@
\if_int_compare:w #1 < #3 \exp_stop_f:
- \flag_raise:n { str_overlong }
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_overlong }
+ \flag_raise:n { @@_error }
\int_use:N \c_@@_replacement_char_int
\else:
#1
@@ -2047,15 +2049,15 @@
\cs_new:Npn \@@_decode_utf_viii_overflow:w #1 \fi: #2 \fi:
{
\fi: \fi:
- \flag_raise:n { str_overflow }
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_overflow }
+ \flag_raise:n { @@_error }
\int_use:N \c_@@_replacement_char_int
}
\cs_new:Npn \@@_decode_utf_viii_end:
{
\s_@@
- \flag_raise:n { str_missing }
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_missing }
+ \flag_raise:n { @@_error }
\int_use:N \c_@@_replacement_char_int \s_@@
\prg_break:
}
@@ -2117,10 +2119,10 @@
{ \@@_encode_utf_xvi_aux:N \@@_output_byte_pair_le:n }
\cs_new_protected:Npn \@@_encode_utf_xvi_aux:N #1
{
- \flag_clear:n { str_error }
+ \flag_clear:n { @@_error }
\cs_set_eq:NN \@@_tmp:w #1
\@@_convert_gmap_internal:N \@@_encode_utf_xvi_char:n
- \@@_if_flag_error:nne { str_error } { utf16-encode } { }
+ \@@_if_flag_error:nne { @@_error } { utf16-encode } { }
}
\cs_new:Npn \@@_encode_utf_xvi_char:n #1
{
@@ -2129,7 +2131,7 @@
\else:
\if_int_compare:w #1 < "10000 \exp_stop_f:
\if_int_compare:w #1 < "E000 \exp_stop_f:
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
\@@_tmp:w { \c_@@_replacement_char_int }
\else:
\@@_tmp:w {#1}
@@ -2160,9 +2162,9 @@
% an unexpected trail surrogate, and a string containing an odd number
% of bytes.
% \begin{macrocode}
- \flag_clear_new:n { str_missing }
- \flag_clear_new:n { str_extra }
- \flag_clear_new:n { str_end }
+ \flag_clear_new:n { @@_missing }
+ \flag_clear_new:n { @@_extra }
+ \flag_clear_new:n { @@_end }
\msg_new:nnnn { str } { utf16-encode }
{ Unicode~string~cannot~be~expressed~in~UTF-16:~surrogate. }
{
@@ -2175,9 +2177,9 @@
Invalid~UTF-16~string:
\exp_last_unbraced:Nf \use_none:n
{
- \@@_if_flag_times:nT { str_missing } { ,~missing~trail~surrogate }
- \@@_if_flag_times:nT { str_extra } { ,~extra~trail~surrogate }
- \@@_if_flag_times:nT { str_end } { ,~odd~number~of~bytes }
+ \@@_if_flag_times:nT { @@_missing } { ,~missing~trail~surrogate }
+ \@@_if_flag_times:nT { @@_extra } { ,~extra~trail~surrogate }
+ \@@_if_flag_times:nT { @@_end } { ,~odd~number~of~bytes }
}
.
}
@@ -2194,17 +2196,17 @@
}
Lead~surrogates~are~pairs~of~bytes~in~the~range~[0xD800,~0xDBFF],~
and~trail~surrogates~are~in~the~range~[0xDC00,~0xDFFF].
- \flag_if_raised:nT { str_missing }
+ \flag_if_raised:nT { @@_missing }
{
\\\\
A~lead~surrogate~was~not~followed~by~a~trail~surrogate.
}
- \flag_if_raised:nT { str_extra }
+ \flag_if_raised:nT { @@_extra }
{
\\\\
LaTeX~came~across~a~trail~surrogate~when~it~was~not~expected.
}
- \flag_if_raised:nT { str_end }
+ \flag_if_raised:nT { @@_end }
{
\\\\
The~string~contained~an~odd~number~of~bytes.~This~is~invalid:~
@@ -2258,10 +2260,10 @@
}
\cs_new_protected:Npn \@@_decode_utf_xvi:Nw #1#2 \s_@@_stop
{
- \flag_clear:n { str_error }
- \flag_clear:n { str_missing }
- \flag_clear:n { str_extra }
- \flag_clear:n { str_end }
+ \flag_clear:n { @@_error }
+ \flag_clear:n { @@_missing }
+ \flag_clear:n { @@_extra }
+ \flag_clear:n { @@_end }
\cs_set:Npn \@@_tmp:w ##1 ##2 { ` ## #1 }
\__kernel_tl_gset:Ne \g_@@_result_tl
{
@@ -2269,7 +2271,7 @@
#2 \q_@@_nil \q_@@_nil
\prg_break_point:
}
- \@@_if_flag_error:nne { str_error } { utf16-decode } { }
+ \@@_if_flag_error:nne { @@_error } { utf16-decode } { }
}
% \end{macrocode}
% \end{macro}
@@ -2375,7 +2377,7 @@
{ \@@_decode_utf_xvi_error:nNN { extra } #1#2 }
\cs_new:Npn \@@_decode_utf_xvi_error:nNN #1#2#3
{
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_error }
\flag_raise:n { str_#1 }
#2 #3 \s_@@
\int_use:N \c_@@_replacement_char_int \s_@@
@@ -2454,36 +2456,36 @@
% \end{macro}
% \end{macro}
%
-% \begin{variable}{str_overflow, str_end}
+% \begin{variable}{@@_overflow, @@_end}
% There can be no error when encoding in \textsc{utf-32}. When
% decoding, the string may not have length $4n$, or it may contain
% code points larger than \hexnum{10FFFF}. The latter case often
% happens if the encoding was in fact not \textsc{utf-32}, because
% most arbitrary strings are not valid in \textsc{utf-32}.
% \begin{macrocode}
- \flag_clear_new:n { str_overflow }
- \flag_clear_new:n { str_end }
+ \flag_clear_new:n { @@_overflow }
+ \flag_clear_new:n { @@_end }
\msg_new:nnnn { str } { utf32-decode }
{
Invalid~UTF-32~string:
\exp_last_unbraced:Nf \use_none:n
{
- \@@_if_flag_times:nT { str_overflow } { ,~code~point~too~large }
- \@@_if_flag_times:nT { str_end } { ,~truncated~string }
+ \@@_if_flag_times:nT { @@_overflow } { ,~code~point~too~large }
+ \@@_if_flag_times:nT { @@_end } { ,~truncated~string }
}
.
}
{
In~the~UTF-32~encoding,~every~Unicode~character~
(in~the~range~[U+0000,~U+10FFFF])~is~encoded~as~4~bytes.
- \flag_if_raised:nT { str_overflow }
+ \flag_if_raised:nT { @@_overflow }
{
\\\\
LaTeX~came~across~a~code~point~larger~than~1114111,~
the~maximum~code~point~defined~by~Unicode.~
Perhaps~the~string~was~not~encoded~in~the~UTF-32~encoding?
}
- \flag_if_raised:nT { str_end }
+ \flag_if_raised:nT { @@_end }
{
\\\\
The~length~of~the~string~is~not~a~multiple~of~4.~
@@ -2547,9 +2549,9 @@
}
\cs_new_protected:Npn \@@_decode_utf_xxxii:Nw #1#2 \s_@@_stop
{
- \flag_clear:n { str_overflow }
- \flag_clear:n { str_end }
- \flag_clear:n { str_error }
+ \flag_clear:n { @@_overflow }
+ \flag_clear:n { @@_end }
+ \flag_clear:n { @@_error }
\cs_set:Npn \@@_tmp:w ##1 ##2 { ` ## #1 }
\__kernel_tl_gset:Ne \g_@@_result_tl
{
@@ -2557,7 +2559,7 @@
#2 \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop
\prg_break_point:
}
- \@@_if_flag_error:nne { str_error } { utf32-decode } { }
+ \@@_if_flag_error:nne { @@_error } { utf32-decode } { }
}
\cs_new:Npn \@@_decode_utf_xxxii_loop:NNNN #1#2#3#4
{
@@ -2566,13 +2568,13 @@
\fi:
#1#2#3#4 \s_@@
\if_int_compare:w \@@_tmp:w #1#4 > \c_zero_int
- \flag_raise:n { str_overflow }
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_overflow }
+ \flag_raise:n { @@_error }
\int_use:N \c_@@_replacement_char_int
\else:
\if_int_compare:w \@@_tmp:w #2#3 > 16 \exp_stop_f:
- \flag_raise:n { str_overflow }
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_overflow }
+ \flag_raise:n { @@_error }
\int_use:N \c_@@_replacement_char_int
\else:
\int_eval:n
@@ -2586,8 +2588,8 @@
{
\tl_if_empty:nF {#1}
{
- \flag_raise:n { str_end }
- \flag_raise:n { str_error }
+ \flag_raise:n { @@_end }
+ \flag_raise:n { @@_error }
#1 \s_@@
\int_use:N \c_@@_replacement_char_int \s_@@
}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
index 4ebc1af7033..fc8594bf0bc 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -127,7 +127,11 @@
% Clears the content of the \meta{str~var}.
% \end{function}
%
-% \begin{function}[added = 2015-09-18]{\str_clear_new:N, \str_clear_new:c}
+% \begin{function}[added = 2015-09-18]
+% {
+% \str_clear_new:N, \str_clear_new:c,
+% \str_gclear_new:N, \str_gclear_new:c
+% }
% \begin{syntax}
% \cs{str_clear_new:N} \meta{str~var}
% \end{syntax}
@@ -839,6 +843,10 @@
% code $12$.
% \end{variable}
%
+% \begin{variable}[added = 2023-12-07]{\c_empty_str}
+% Constant that is always empty.
+% \end{variable}
+%
% \section{Scratch strings}
%
% \begin{variable}{\l_tmpa_str, \l_tmpb_str}
@@ -855,16 +863,6 @@
% code and so should only be used for short-term storage.
% \end{variable}
%
-% \section{Deprecated functions}
-%
-% \begin{function}[EXP, added = 2019-11-26]
-% {\str_foldcase:n, \str_foldcase:V}
-% \begin{syntax}
-% \cs{str_foldcase:n} \Arg{tokens}
-% \end{syntax}
-% A previous name for the functionally-identical \cs{str_casefold:n}.
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -989,33 +987,53 @@
% \str_gput_right:Nn, \str_gput_right:NV, \str_gput_right:Ne, \str_gput_right:Nx,
% \str_gput_right:cn, \str_gput_right:cV, \str_gput_right:ce, \str_gput_right:cx
% }
-% Simply convert the token list inputs to \meta{strings}.
+% Similar to corresponding \pkg{l3tl} base functions, except that
+% \cs{__kernel_exp_not:w} is replaced with \cs{__kernel_tl_to_str:w}.
+% Just like token list, string constants use \cs{cs_gset_nopar:Npe}
+% instead of \cs{__kernel_tl_gset:Ne} so that the scope checking for
+% |c| is applied when \pkg{l3debug} is used.
+% To maintain backward compatibility, in
+% \cs[index=str_put_left:Nn]{str_(g)put_left:Nn} and
+% \cs[index=str_put_right:Nn]{str_(g)put_right:Nn},
+% contents of string variables are wrapped in \cs{__kernel_exp_not:w}
+% to prevent further expansion.
% \begin{macrocode}
-\group_begin:
- \cs_set_protected:Npn \@@_tmp:n #1
- {
- \tl_if_blank:nF {#1}
- {
- \cs_new_protected:cpe { str_ #1 :Nn } ##1##2
- {
- \exp_not:c { tl_ #1 :Ne } ##1
- { \exp_not:N \tl_to_str:n {##2} }
- }
- \cs_generate_variant:cn { str_ #1 :Nn }
- { NV , Ne , Nx , cn , cV , ce , cx }
- \@@_tmp:n
- }
- }
- \@@_tmp:n
- { set }
- { gset }
- { const }
- { put_left }
- { gput_left }
- { put_right }
- { gput_right }
- { }
-\group_end:
+\cs_new_protected:Npn \str_set:Nn #1#2
+ { \__kernel_tl_set:Ne #1 { \__kernel_tl_to_str:w {#2} } }
+\cs_gset_protected:Npn \str_gset:Nn #1#2
+ { \__kernel_tl_gset:Ne #1 { \__kernel_tl_to_str:w {#2} } }
+\cs_new_protected:Npn \str_const:Nn #1#2
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \cs_gset_nopar:Npe #1 { \__kernel_tl_to_str:w {#2} }
+ }
+\cs_new_protected:Npn \str_put_left:Nn #1#2
+ {
+ \__kernel_tl_set:Ne #1
+ { \__kernel_tl_to_str:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+ }
+\cs_new_protected:Npn \str_gput_left:Nn #1#2
+ {
+ \__kernel_tl_gset:Ne #1
+ { \__kernel_tl_to_str:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+ }
+\cs_new_protected:Npn \str_put_right:Nn #1#2
+ {
+ \__kernel_tl_set:Ne #1
+ { \__kernel_exp_not:w \exp_after:wN {#1} \__kernel_tl_to_str:w {#2} }
+ }
+\cs_new_protected:Npn \str_gput_right:Nn #1#2
+ {
+ \__kernel_tl_gset:Ne #1
+ { \__kernel_exp_not:w \exp_after:wN {#1} \__kernel_tl_to_str:w {#2} }
+ }
+\cs_generate_variant:Nn \str_set:Nn { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gset:Nn { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_const:Nn { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_put_left:Nn { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gput_left:Nn { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_put_right:Nn { NV , Ne , Nx , c , cV , ce , cx }
+\cs_generate_variant:Nn \str_gput_right:Nn { NV , Ne , Nx , c , cV , ce , cx }
% \end{macrocode}
% \end{macro}
%
@@ -2158,6 +2176,13 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\c_empty_str}
+% An empty string is simply an empty token list.
+% \begin{macrocode}
+\cs_new_eq:NN \c_empty_str \c_empty_tl
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\l_tmpa_str, \l_tmpb_str, \g_tmpa_str, \g_tmpb_str}
% Scratch strings.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
index fc041a25d83..a2682947728 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -260,6 +260,11 @@
% \meta{shell command}. The \cs{sys_get_shell:nnNTF} conditional
% inserts the \meta{true code} if the shell is available and no quote is
% detected, and the \meta{false code} otherwise.
+%
+% \emph{Note}: It is not possible to tell from \TeX{} if a command is allowed
+% in restricted shell escape. If restricted escape is enabled, the
+% \texttt{true} branch is taken: if the command is forbidden at this stage, a
+% low-level \TeX{} error will arise.
% \end{function}
%
% \begin{variable}[added = 2017-05-27]{\c_sys_shell_escape_int}
@@ -861,11 +866,11 @@ end
%
% \subsection{Dynamic (every job) code}
%
-% \begin{macro}{\sys_everyjob:}
+% \begin{macro}{\__kernel_sys_everyjob:}
% \begin{macro}{\@@_everyjob:n}
% \begin{variable}{\g_@@_everyjob_tl}
% \begin{macrocode}
-\cs_new_protected:Npn \sys_everyjob:
+\cs_new_protected:Npn \__kernel_sys_everyjob:
{
\tl_use:N \g_@@_everyjob_tl
\tl_gclear:N \g_@@_everyjob_tl
@@ -1088,7 +1093,7 @@ end
% \begin{macrocode}
\cs_new_protected:Npn \sys_finalise:
{
- \sys_everyjob:
+ \__kernel_sys_everyjob:
\tl_use:N \g_@@_finalise_tl
\tl_gclear:N \g_@@_finalise_tl
}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
index 9f4c672993b..5651243cd9e 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -1634,7 +1634,7 @@
% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnN}
% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnn}
% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnnnw}
-% There is one things that need special treatment at start start of
+% There is one things that need special treatment at the start of
% words in Greek. For an isolated accent \emph{eta},
% which is handled by seeing if we have exactly one of the affected
% codepoints followed by a space or brace group.
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
index ea2559748e8..f728915387d 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -368,7 +368,7 @@
% \end{macrocode}
% Hangul needs additional treatment. First we have to deal with
% the start-of-Hangul position: output what we had up to now, then
-% move the the specialist handler. The idea here is to pick off the
+% move the specialist handler. The idea here is to pick off the
% different codepoint types one at a time, tracking what else can be
% considered at each stage until we hit the end of the viable types.
% Other than that, we just keep building up the Hangul codepoints
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
index 5d7bb6ef51f..8c955419ce3 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
index abf85a7ac27..85eedfab13e 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -794,7 +794,7 @@
%
% \subsection{Configuration variables}
%
-% \begin{variable}{\l_text_accents_tl, \l_text_letterlike_tl}
+% \begin{variable}[deprecated]{\l_text_accents_tl, \l_text_letterlike_tl}
% Used to be used for excluding these ideas from expansion: now deprecated.
% \begin{macrocode}
\tl_new:N \l_text_accents_tl
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
index ca3b2a1ff12..746b68c2f03 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx
index 65b9566d6a9..43b08d902d5 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
index cf506b9feca..0f38c95aa74 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -295,7 +295,11 @@
% or \cs{str_if_eq:nnTF} if category codes are not important.
% \end{function}
%
-% \begin{function}[TF]{\tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:cn, \tl_if_in:cV}
+% \begin{function}[TF]
+% {
+% \tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:No,
+% \tl_if_in:cn, \tl_if_in:cV, \tl_if_in:co
+% }
% \begin{syntax}
% \cs{tl_if_in:NnTF} \meta{tl~var} \Arg{token list} \Arg{true code} \Arg{false code}
% \end{syntax}
@@ -307,7 +311,10 @@
% \end{function}
%
% \begin{function}[TF]
-% {\tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:nV, \tl_if_in:on, \tl_if_in:no}
+% {
+% \tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:VV, \tl_if_in:on, \tl_if_in:oo,
+% \tl_if_in:nV, \tl_if_in:no
+% }
% \begin{syntax}
% \cs{tl_if_in:nnTF} \Arg{token list_1} \Arg{token list_2} \Arg{true code} \Arg{false code}
% \end{syntax}
@@ -367,7 +374,10 @@
% \subsection{Testing the first token}
%
% \begin{function}[updated = 2012-07-09, EXP, pTF]
-% {\tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:oN}
+% {
+% \tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:VN,
+% \tl_if_head_eq_catcode:eN, \tl_if_head_eq_catcode:oN
+% }
% \begin{syntax}
% \cs{tl_if_head_eq_catcode_p:nN} \Arg{token list} \meta{test token}
% \cs{tl_if_head_eq_catcode:nNTF} \Arg{token list} \meta{test token}
@@ -379,7 +389,10 @@
% \end{function}
%
% \begin{function}[updated = 2012-07-09, EXP, pTF]
-% {\tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:fN}
+% {
+% \tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:VN,
+% \tl_if_head_eq_charcode:eN, \tl_if_head_eq_charcode:fN
+% }
% \begin{syntax}
% \cs{tl_if_head_eq_charcode_p:nN} \Arg{token list} \meta{test token}
% \cs{tl_if_head_eq_charcode:nNTF} \Arg{token list} \meta{test token}
@@ -390,7 +403,11 @@
% \meta{token list} is empty, the test is always \texttt{false}.
% \end{function}
%
-% \begin{function}[updated = 2012-07-09, EXP, pTF]{\tl_if_head_eq_meaning:nN}
+% \begin{function}[updated = 2012-07-09, EXP, pTF]
+% {
+% \tl_if_head_eq_meaning:nN, \tl_if_head_eq_meaning:VN,
+% \tl_if_head_eq_meaning:eN
+% }
% \begin{syntax}
% \cs{tl_if_head_eq_meaning_p:nN} \Arg{token list} \meta{test token}
% \cs{tl_if_head_eq_meaning:nNTF} \Arg{token list} \meta{test token}
@@ -516,7 +533,7 @@
% \subsection{Counting and reversing token lists}
%
% \begin{function}[added = 2012-05-13, EXP]
-% {\tl_count:n, \tl_count:V, \tl_count:o}
+% {\tl_count:n, \tl_count:V, \tl_count:v, \tl_count:e, \tl_count:o}
% \begin{syntax}
% \cs{tl_count:n} \Arg{tokens}
% \end{syntax}
@@ -1352,8 +1369,11 @@
% \tl_const:cn, \tl_const:ce, \tl_const:cx
% }
% Constants are also easy to generate. They use \cs{cs_gset_nopar:Npe} instead
-% of \cs{__kernel_tl_gset:Ne} so that the correct scope checking is applied if
-% \pkg{l3debug} is used.
+% of \cs{__kernel_tl_gset:Ne} so that the correct scope checking for |c|,
+% instead of for |g|, is applied when
+% \cs{debug_on:n} |{ check-declarations }| is used.
+% Constant assignment functions are patched specially in \pkg{l3debug} to
+% apply such checks.
% \begin{macrocode}
\cs_new_protected:Npn \tl_const:Nn #1#2
{
@@ -2429,12 +2449,16 @@
\fi:
}
\prg_generate_conditional_variant:Nnn \tl_if_eq:nn
- { nV , ne , nx , e , ee , x , xx }
+ { nV , ne , nx , V, e , ee , x , xx }
{ TF , T , F }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:cn, \tl_if_in:cV}
+% \begin{macro}[TF]
+% {
+% \tl_if_in:Nn, \tl_if_in:NV, \tl_if_in:No,
+% \tl_if_in:cn, \tl_if_in:cV, \tl_if_in:co
+% }
% See \cs{tl_if_in:nnTF} for further comments. Here we simply
% expand the token list variable and pass it to \cs{tl_if_in:nnTF}.
% \begin{macrocode}
@@ -2442,11 +2466,15 @@
\cs_new_protected:Npn \tl_if_in:NnF { \exp_args:No \tl_if_in:nnF }
\cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF }
\prg_generate_conditional_variant:Nnn \tl_if_in:Nn
- { NV , c , cV } { T , F , TF }
+ { NV , No , c , cV , co } { T , F , TF }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:on, \tl_if_in:nV, \tl_if_in:no}
+% \begin{macro}[TF]
+% {
+% \tl_if_in:nn, \tl_if_in:Vn, \tl_if_in:VV, \tl_if_in:on, \tl_if_in:oo,
+% \tl_if_in:nV, \tl_if_in:no
+% }
% Once more, the test relies on the emptiness test for robustness.
% The function \cs{@@_tmp:w} removes tokens until the first occurrence
% of |#2|. If this does not appear in |#1|, then the final |#2| is removed,
@@ -2476,7 +2504,7 @@
\if_false: } \fi:
}
\prg_generate_conditional_variant:Nnn \tl_if_in:nn
- { V , o , nV , no } { T , F , TF }
+ { V , VV , o , oo , nV , no } { T , F , TF }
% \end{macrocode}
% \end{macro}
%
@@ -2756,7 +2784,7 @@
%
% \subsection{Working with the contents of token lists}
%
-% \begin{macro}{\tl_count:n, \tl_count:V, \tl_count:o}
+% \begin{macro}{\tl_count:n, \tl_count:V, \tl_count:v, \tl_count:e, \tl_count:o}
% \begin{macro}{\tl_count:N, \tl_count:c}
% \begin{macro}{\@@_count:n}
% Count number of elements within a token list or token list
@@ -2776,7 +2804,7 @@
{ 0 \tl_map_function:NN #1 \@@_count:n }
}
\cs_new:Npn \@@_count:n #1 { + 1 }
-\cs_generate_variant:Nn \tl_count:n { V , o }
+\cs_generate_variant:Nn \tl_count:n { V , v , e , o }
\cs_generate_variant:Nn \tl_count:N { c }
% \end{macrocode}
% \end{macro}
@@ -3014,11 +3042,21 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[pTF]{\tl_if_head_eq_meaning:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_charcode:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_charcode:fN}
-% \begin{macro}[pTF]{\tl_if_head_eq_catcode:nN}
-% \begin{macro}[pTF]{\tl_if_head_eq_catcode:oN}
+% \begin{macro}[pTF]
+% {
+% \tl_if_head_eq_meaning:nN, \tl_if_head_eq_meaning:VN,
+% \tl_if_head_eq_meaning:eN
+% }
+% \begin{macro}[pTF]
+% {
+% \tl_if_head_eq_charcode:nN, \tl_if_head_eq_charcode:VN,
+% \tl_if_head_eq_charcode:eN, \tl_if_head_eq_charcode:fN
+% }
+% \begin{macro}[pTF]
+% {
+% \tl_if_head_eq_catcode:nN, \tl_if_head_eq_catcode:VN,
+% \tl_if_head_eq_catcode:eN, \tl_if_head_eq_catcode:oN
+% }
% \begin{macro}[EXP]{\@@_head_exp_not:w}
% \begin{macro}[EXP]{\@@_if_head_eq_empty_arg:w}
% Accessing the first token of a token list is tricky in three cases:
@@ -3057,7 +3095,7 @@
\fi:
}
\prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN
- { f } { p , TF , T , F }
+ { V , e , f } { p , TF , T , F }
% \end{macrocode}
% For \cs{tl_if_head_eq_catcode:nN}, again we detect special cases
% with a \cs{tl_if_head_is_N_type:n}. Then we need to test if the
@@ -3084,7 +3122,7 @@
\fi:
}
\prg_generate_conditional_variant:Nnn \tl_if_head_eq_catcode:nN
- { o } { p , TF , T , F }
+ { V , e , o } { p , TF , T , F }
% \end{macrocode}
% For \cs{tl_if_head_eq_meaning:nN}, again, detect special cases. In
% the normal case, use \cs{tl_head:w}, with no \cs{exp_not:N} this
@@ -3105,6 +3143,8 @@
\@@_if_head_eq_meaning_special:nN
{#1} #2
}
+\prg_generate_conditional_variant:Nnn \tl_if_head_eq_meaning:nN
+ { V , e } { p , TF , T , F }
\cs_new:Npn \@@_if_head_eq_meaning_normal:nN #1 #2
{
\exp_after:wN \if_meaning:w
@@ -3158,8 +3198,6 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}[pTF]{\tl_if_head_is_N_type:n}
% \begin{macro}[EXP]
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
index 4e7e1c4745f..bf882c57e48 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -1132,9 +1132,9 @@
% \item Some frozen tokens can only be accessed in interactive
% sessions: |\cr|, |\right|, |\endgroup|, |\fi|, |\inaccessible|.
% \item In \LuaTeX{}, there is also the strange case of \enquote{bytes}
-% |^^^^^^1100|$x$$y$ where $x,y$ are any two lowercase hexadecimal
+% |^^^^^^1100|$xy$ where $x,y$ are any two lowercase hexadecimal
% digits, so that the hexadecimal number ranges from
-% $"\text{110000}=1114112$ to~$"\text{1100ff}=1114367$. These are
+% |"|$11\,0000=1\,114\,112$ to~|"|$110\,0\mathrm{ff}=1\,114\,367$. These are
% used to output individual bytes to files, rather than UTF-8. For
% the purposes of token comparisons they behave like non-expandable
% primitive control sequences (\emph{not characters}) whose
@@ -1219,28 +1219,6 @@
% characters at the start of the argument are \emph{not} ignored in this
% case (and they prevent brace-stripping).
%
-% \section{Deprecated functions}
-%
-% \begin{function}[added = 2020-01-09, EXP]
-% {
-% \char_lowercase:N, \char_uppercase:N,
-% \char_titlecase:N, \char_foldcase:N,
-% \char_str_lowercase:N, \char_str_uppercase:N,
-% \char_str_titlecase:N, \char_str_foldcase:N
-% }
-% \begin{syntax}
-% \cs{char_lowercase:N} \meta{char}
-% \end{syntax}
-% Converts the \meta{char} to the equivalent case-changed character
-% as detailed by the function name (see \cs{str_foldcase:n}
-% and \cs{text_titlecase_all:n} for details of these terms). The case mapping
-% is carried out with no context-dependence (\emph{cf.}~\cs{text_uppercase:n},
-% \emph{etc.}) The \texttt{str} versions always generate \enquote{other}
-% (category code $12$) characters, whilst the standard versions generate
-% characters with the category code of the \meta{char} (i.e.~only
-% the character code changes).
-% \end{function}
-%
% \end{documentation}
%
% \begin{implementation}
@@ -1688,160 +1666,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]
-% {
-% \char_lowercase:N, \char_uppercase:N,
-% \char_titlecase:N, \char_foldcase:N
-% }
-% \begin{macro}[EXP]{\@@_change_case:nN}
-% \begin{macro}[EXP]{\@@_change_case:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_auxi:nN, \@@_change_case_auxii:nN}
-% \begin{macro}[EXP]{\@@_change_case_catcode:N}
-% \begin{macro}[EXP]
-% {
-% \char_str_lowercase:N, \char_str_uppercase:N,
-% \char_str_titlecase:N, \char_str_foldcase:N
-% }
-% \begin{macro}[EXP]{\@@_str_change_case:nN, \@@_str_change_case_aux:nN}
-% \begin{macro}[EXP]{\@@_str_change_case:nnnN}
-% \begin{macro}[EXP]{\@@_str_change_case:n}
-% To ensure that the category codes produced are predictable, every character
-% is re-generated even if it is otherwise unchanged.
-% \begin{macrocode}
-\cs_new:Npn \char_lowercase:N
- { \@@_change_case:nN { lowercase } }
-\cs_new:Npn \char_uppercase:N
- { \@@_change_case:nN { uppercase } }
-\cs_new:Npn \char_titlecase:N
- { \@@_change_case:nN { titlecase } }
-\cs_new:Npn \char_foldcase:N
- { \@@_change_case:nN { casefold } }
-\cs_new:Npn \@@_change_case:nN #1#2
- {
- \int_compare:nNnTF {`#2} = { `\ }
- { ~ }
- {
- \exp_args:Ne \@@_change_case_auxi:nN
- { \__kernel_codepoint_case:nn {#1} {`#2} } #2
- }
- }
-\cs_new:Npn \@@_change_case_auxi:nN #1#2
- { \use:e { \@@_change_case:nnnN #1 #2 } }
-\cs_new:Npn \@@_change_case:nnnN #1#2#3#4
- {
- \int_compare:nNnTF {#1} = {`#4}
- { \exp_not:n {#4} }
- {
- \@@_change_case_auxii:nN {#1} {#4}
- \tl_if_blank:nF {#2}
- {
- \@@_change_case_auxii:nN {#2} {#4}
- \tl_if_blank:nF {#3}
- { \@@_change_case_auxii:nN {#3} {#4} }
- }
- }
- }
-\cs_new:Npn \@@_change_case_auxii:nN #1#2
- {
- \char_generate:nn {#1}
- { \@@_change_case_catcode:N #2 }
- }
-\bool_lazy_or:nnF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- {
- \cs_gset:Npn \@@_change_case_auxii:nN #1#2
- {
- \int_compare:nNnTF {#1} < { "80 }
- {
- \char_generate:nn {#1}
- { \@@_change_case_catcode:N #2 }
- }
- { \exp_not:n {#2} }
- }
- }
-\cs_new:Npn \@@_change_case_catcode:N #1
- {
- \if_catcode:w \exp_not:N #1 \c_math_toggle_token
- 3
- \else:
- \if_catcode:w \exp_not:N #1 \c_alignment_token
- 4
- \else:
- \if_catcode:w \exp_not:N #1 \c_math_superscript_token
- 7
- \else:
- \if_catcode:w \exp_not:N #1 \c_math_subscript_token
- 8
- \else:
- \if_catcode:w \exp_not:N #1 \c_space_token
- 10
- \else:
- \if_catcode:w \exp_not:N #1 \c_catcode_letter_token
- 11
- \else:
- \if_catcode:w \exp_not:N #1 \c_catcode_other_token
- 12
- \else:
- 13
- \fi:
- \fi:
- \fi:
- \fi:
- \fi:
- \fi:
- \fi:
- }
-% \end{macrocode}
-% Same story for the string version, except category code is easier
-% to follow. This of course makes this version faster.
-% \begin{macrocode}
-\cs_new:Npn \char_str_lowercase:N
- { \@@_str_change_case:nN { lowercase } }
-\cs_new:Npn \char_str_uppercase:N
- { \@@_str_change_case:nN { uppercase } }
-\cs_new:Npn \char_str_titlecase:N
- { \@@_str_change_case:nN { titlecase } }
-\cs_new:Npn \char_str_foldcase:N
- { \@@_str_change_case:nN { casefold } }
-\cs_new:Npn \@@_str_change_case:nN #1#2
- {
- \int_compare:nNnTF {`#2} = { `\ }
- { ~ }
- {
- \exp_args:Ne \@@_str_change_case_aux:nN
- { \__kernel_codepoint_case:nn {#1} {`#2} } #2
- }
- }
-\cs_new:Npn \@@_str_change_case_aux:nN #1#2
- { \use:e { \@@_str_change_case:nnnN #1 #2 } }
-\cs_new:Npn \@@_str_change_case:nnnN #1#2#3#4
- {
- \int_compare:nNnTF {#1} = {`#4}
- { \tl_to_str:n {#4} }
- {
- \@@_str_change_case:n {#1}
- \tl_if_blank:nF {#2}
- {
- \@@_str_change_case:n {#2}
- \tl_if_blank:nF {#3}
- { \@@_str_change_case:n {#3} }
- }
- }
- }
-\cs_new:Npn \@@_str_change_case:n #1
- { \char_generate:nn {#1} { 12 } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \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
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
index 1cbc34267de..adab2aa934b 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 2023-11-09}
+% \date{Released 2023-12-08}
%
% \maketitle
%
@@ -857,7 +857,7 @@
\fi:
}
% \end{macrocode}
-% Here, |#4| can have have a trailing space, so we tidy up a bit at the cost of
+% Here, |#4| can have a trailing space, so we tidy up a bit at the cost of
% speed for these small number of cases it applies to.
% \begin{macrocode}
\cs_set_protected:Npn \@@_data_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop
@@ -922,7 +922,7 @@
% \begin{macro}[EXP]{\@@_case:nnn}
% \begin{macro}[EXP]
% {\@@_uppercase:n, \@@_lowercase:n, \@@_titlecase:n, \@@_casefold:n}
-% \begin{macro}[EXP]{\@_case:nn}
+% \begin{macro}[EXP]{\@@_case:nn}
% With the core data files loaded, there is now a need to provide access to
% this information for other modules. That is done here such that case
% folding can also be covered. At this level, all that needs to be returned