From 801627f1bc8e15dbaf9dabf3eb66d5926b77171d Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 8 Dec 2023 21:36:03 +0000 Subject: l3kernel (8dec23) git-svn-id: svn://tug.org/texlive/trunk@69066 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/source/latex/l3kernel/expl3.dtx | 16 +- Master/texmf-dist/source/latex/l3kernel/l3.ins | 1 + .../texmf-dist/source/latex/l3kernel/l3basics.dtx | 6 +- .../texmf-dist/source/latex/l3kernel/l3bitset.dtx | 604 +++++++++++++++++++++ .../source/latex/l3kernel/l3bootstrap.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3box.dtx | 2 +- .../source/latex/l3kernel/l3candidates.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3cctab.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3clist.dtx | 4 +- .../texmf-dist/source/latex/l3kernel/l3coffins.dtx | 4 +- .../texmf-dist/source/latex/l3kernel/l3color.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3debug.dtx | 13 +- .../source/latex/l3kernel/l3deprecation.dtx | 149 +++-- Master/texmf-dist/source/latex/l3kernel/l3doc.dtx | 195 +++---- .../source/latex/l3kernel/l3docstrip.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3expan.dtx | 34 +- Master/texmf-dist/source/latex/l3kernel/l3file.dtx | 34 +- Master/texmf-dist/source/latex/l3kernel/l3flag.dtx | 4 +- .../source/latex/l3kernel/l3fp-assign.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fp-aux.dtx | 2 +- .../source/latex/l3kernel/l3fp-basics.dtx | 2 +- .../source/latex/l3kernel/l3fp-convert.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fp-expo.dtx | 2 +- .../source/latex/l3kernel/l3fp-extended.dtx | 2 +- .../source/latex/l3kernel/l3fp-functions.dtx | 2 +- .../source/latex/l3kernel/l3fp-logic.dtx | 2 +- .../source/latex/l3kernel/l3fp-parse.dtx | 2 +- .../source/latex/l3kernel/l3fp-random.dtx | 2 +- .../source/latex/l3kernel/l3fp-round.dtx | 2 +- .../source/latex/l3kernel/l3fp-symbolic.dtx | 2 +- .../source/latex/l3kernel/l3fp-traps.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fp-trig.dtx | 2 +- .../source/latex/l3kernel/l3fp-types.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3fp.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fparray.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3int.dtx | 2 +- .../source/latex/l3kernel/l3intarray.dtx | 2 +- .../source/latex/l3kernel/l3kernel-functions.dtx | 9 +- Master/texmf-dist/source/latex/l3kernel/l3keys.dtx | 56 +- .../texmf-dist/source/latex/l3kernel/l3legacy.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3luatex.dtx | 8 +- Master/texmf-dist/source/latex/l3kernel/l3msg.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3names.dtx | 14 +- Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx | 31 +- Master/texmf-dist/source/latex/l3kernel/l3prg.dtx | 21 +- Master/texmf-dist/source/latex/l3kernel/l3prop.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3quark.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3regex.dtx | 6 +- Master/texmf-dist/source/latex/l3kernel/l3seq.dtx | 6 +- Master/texmf-dist/source/latex/l3kernel/l3skip.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3sort.dtx | 2 +- .../source/latex/l3kernel/l3str-convert.dtx | 194 +++---- Master/texmf-dist/source/latex/l3kernel/l3str.dtx | 101 ++-- Master/texmf-dist/source/latex/l3kernel/l3sys.dtx | 13 +- .../source/latex/l3kernel/l3text-case.dtx | 4 +- .../source/latex/l3kernel/l3text-map.dtx | 4 +- .../source/latex/l3kernel/l3text-purify.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3text.dtx | 4 +- .../source/latex/l3kernel/l3tl-analysis.dtx | 2 +- .../source/latex/l3kernel/l3tl-build.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3tl.dtx | 88 ++- .../texmf-dist/source/latex/l3kernel/l3token.dtx | 182 +------ .../texmf-dist/source/latex/l3kernel/l3unicode.dtx | 6 +- 63 files changed, 1196 insertions(+), 683 deletions(-) create mode 100644 Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx (limited to 'Master/texmf-dist/source/latex') 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> % -\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} +% +% \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} +% +% \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} % % \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} % % \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 -- cgit v1.2.3