diff options
author | Karl Berry <karl@freefriends.org> | 2024-04-30 20:03:09 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-04-30 20:03:09 +0000 |
commit | 753708379c1fbd17a96f1a6788c94ce1fa1208d7 (patch) | |
tree | d1bfa8c85ad78bf1312298d97eb72490baa44683 | |
parent | 93ae2978eea5bd5c39e8e0ac208a658c4c0c2e05 (diff) |
l3kernel (30apr24)
git-svn-id: svn://tug.org/texlive/trunk@71140 c570f23f-e606-0410-a88d-b1316a301751
99 files changed, 902 insertions, 261 deletions
diff --git a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md index 9c8c4d506cd..e770f3fe368 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md @@ -7,6 +7,30 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2024-04-11] + +### Added +- `\prop_(g)put_if_not_in:Nnn` (renamed from `\prop_(g)put_if_new:Nnn`) +- `\intarray_if_exist:N(TF)` +- `\fparray_if_exist:N(TF)` +- Support for 'indexed' PDF objects + +### Changed +- Expand object names in `\pdf_object_...` functions (issue \#1521) +- Adapt `l3doc` for `ltcmd` change to handling of newlines + (see latex3/latex2e\#1304) +- Return active spaces from `\sys_get_query:n(nn)N` (issue \#1529) + +### Fixed +- False `debug` error raised by `\cctab_const:Nn` (issue \#1508) +- Undefined `\__kernel_iwo_open:Nn` used in `\iow_shell_open:Nn` + (issue \#1515) +- Naming of register functions in LuaMetaTeX 2.11+ (issue \#1518) +- Catcode applied to letters by `\sys_get_query:n(nn)N` + +### Deprecated +- `\prop_(g)put_if_new:Nnn` (renamed to `\prop_(g)put_if_not_in:Nnn`) + ## [2024-03-14] ### Added @@ -20,6 +44,7 @@ this project uses date-based 'snapshot' version identifiers. ### Fixed - Typeset `TF` of internal conditionals in current color (issue \#730) - Some functions and variables were defined locally + ## [2024-02-20] ### Changed @@ -1700,7 +1725,8 @@ this project uses date-based 'snapshot' version identifiers. - Step functions have been added for dim variables, e.g. `\dim_step_inline:nnnn` -[Unreleased]: https://github.com/latex3/latex3/compare/2024-03-14...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2024-04-11...HEAD +[2024-04-11]: https://github.com/latex3/latex3/compare/2024-03-14...2024-04-11 [2024-03-14]: https://github.com/latex3/latex3/compare/2024-02-20...2024-03-14 [2024-02-20]: https://github.com/latex3/latex3/compare/2024-02-18...2024-02-20 [2024-02-18]: https://github.com/latex3/latex3/compare/2024-02-13...2024-02-18 diff --git a/Master/texmf-dist/doc/latex/l3kernel/README.md b/Master/texmf-dist/doc/latex/l3kernel/README.md index 8ef94a41ac9..70d106b4967 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/README.md +++ b/Master/texmf-dist/doc/latex/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2024-03-14 +Release 2024-04-11 Overview -------- diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf Binary files differindex b36343153ab..56a734d6bf2 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf Binary files differindex 1df60adf1ad..bf177baf39d 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex index ff8114028ed..1bf31032ee8 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex @@ -58,7 +58,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2024-03-14} +\date{Released 2024-04-11} \pagenumbering{roman} \maketitle diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf Binary files differindex 2f85329fdca..6ef4101a782 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf Binary files differindex f2e611b2c9c..6ce1fc34e27 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf Binary files differindex 87f01af5a76..aa266291267 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf Binary files differindex 5a6d4af9e29..2eb7750066a 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf Binary files differindex 8cda69f9714..832e6f583d0 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf Binary files differindex f16bb587508..dd6b7e7e9af 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf Binary files differindex 52c33e516ad..1d20917d2b9 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf Binary files differindex 1f6bda96877..36c813db4dd 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf Binary files differindex cd65bce3a67..f0e99f47276 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf Binary files differindex 721252a9b09..b9cbba576a8 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf Binary files differindex 855db5bdc51..c812ae5e670 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf Binary files differindex 5dc3a3b9ade..eff6e741fe0 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf Binary files differindex e921d2c81b2..4ac02d46844 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf Binary files differindex a4866d55e79..27011b2c4bc 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf Binary files differindex 4b6072bca16..86b5ffa0637 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt b/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt index b747afb4fee..0403ec5225e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt +++ b/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt @@ -64,6 +64,18 @@ Function Date deprecated \pdf_object_new:nn 2022-08-23 \pdf_object_write:nn 2022-08-23 \pdf_object_write:nx 2022-08-23 +\prop_gput_if_new:cnn 2024-03-30 +\prop_gput_if_new:cnV 2024-03-30 +\prop_gput_if_new:cVn 2024-03-30 +\prop_gput_if_new:Nnn 2024-03-30 +\prop_gput_if_new:NnV 2024-03-30 +\prop_gput_if_new:NVn 2024-03-30 +\prop_put_if_new:cnn 2024-03-30 +\prop_put_if_new:cnV 2024-03-30 +\prop_put_if_new:cVn 2024-03-30 +\prop_put_if_new:Nnn 2024-03-30 +\prop_put_if_new:NnV 2024-03-30 +\prop_put_if_new:NVn 2024-03-30 \str_declare_eight_bit_encoding:nnn 2020-08-20 \str_fold_case:n 2020-01-03 \str_fold_case:V 2020-01-03 diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf Binary files differindex 9b2e9b407e1..0506709020c 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf Binary files differindex 322b032a673..8b2f592339a 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex index a2ffe8d770a..da169cd8b16 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-03-14} +\date{Released 2024-04-11} \begin{document} diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf Binary files differindex 2a701d8ec58..1f2f4ca513c 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex index 7e124576c7f..85f83bf0e3d 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-03-14} +\date{Released 2024-04-11} \newcommand{\TF}{\textit{(TF)}} diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf Binary files differindex 93def3980b3..721513e8859 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex index 5db9e83a455..d1b4b0082c2 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-03-14} +\date{Released 2024-04-11} \newcommand{\TF}{\textit{(TF)}} diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf Binary files differindex c6a6396503f..9dda7182f4f 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.tex b/Master/texmf-dist/doc/latex/l3kernel/source3.tex index c09d75767b3..f0aaeb20c87 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.tex @@ -57,7 +57,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2024-03-14} +\date{Released 2024-04-11} \pagenumbering{roman} \maketitle diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 76ef8ec9193..56a62010fae 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -24,7 +24,7 @@ % %<*driver|generic|package|2ekernel> %</driver|generic|package|2ekernel> -\def\ExplFileDate{2024-03-14}% +\def\ExplFileDate{2024-04-11}% %<*driver> \documentclass[full]{l3doc} \usepackage{graphicx} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins index 29402305057..bf7a75381d6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3.ins +++ b/Master/texmf-dist/source/latex/l3kernel/l3.ins @@ -105,7 +105,7 @@ and all files in that bundle must be distributed together. \from{l3regex.dtx} {package} \from{l3box.dtx} {package} \from{l3color.dtx} {package} - \from{l3pdf.dtx} {package} + \from{l3pdf.dtx} {package,tex} \from{l3coffins.dtx} {package} \from{l3luatex.dtx} {package,tex} \from{l3unicode.dtx} {package} @@ -176,6 +176,7 @@ and all files in that bundle must be distributed together. \from{l3sys.dtx}{package,lua} \from{l3token.dtx}{package,lua} \from{l3intarray.dtx}{package,lua} + \from{l3pdf.dtx}{package,lua} }} \endbatchfile diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index 66e999fe62c..eabf678caa6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -1340,8 +1340,9 @@ % only locally/globally assigned; % \item \texttt{check-expressions} that checks integer, dimension, % skip, and muskip expressions are not terminated prematurely; -% \item \texttt{deprecation} that makes soon-to-be-deprecated commands produce errors; -% \item \texttt{log-functions} that logs function definitions; +% \item \texttt{deprecation} that makes deprecated commands produce errors; +% \item \texttt{log-functions} that logs function definitions and +% variable declarations; % \item \texttt{all} that does all of the above. % \end{itemize} % Providing these as switches rather than options allows testing code @@ -1355,10 +1356,10 @@ % \cs{debug_suspend:} \ldots{} \cs{debug_resume:} % \end{syntax} % Suppress (locally) errors and logging from \texttt{debug} commands, -% except for the \texttt{deprecation} errors or warnings. These pairs +% except for the \texttt{deprecation} errors. These pairs % of commands can be nested. This can be used around pieces of code % that are known to fail checks, if such failures should be ignored. -% See for instance \pkg{l3coffins}. +% See for instance \pkg{l3cctab} and \pkg{l3coffins}. % \end{function} % % \end{documentation} @@ -1871,9 +1872,8 @@ % % \begin{macro}{\__kernel_deprecation_code:nn} % \begin{variable}{\g_@@_deprecation_on_tl, \g_@@_deprecation_off_tl} -% Some commands were more recently deprecated and not yet removed; -% only make these into errors if the user requests it. This relies on -% two token lists, filled up in \pkg{l3deprecation}. +% Make deprecated commands throw errors if the user requests it. +% This relies on two token lists, filled up in \pkg{l3deprecation}. % \begin{macrocode} \cs_gset_nopar:Npn \g_@@_deprecation_on_tl { } \cs_gset_nopar:Npn \g_@@_deprecation_off_tl { } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx index 3100c284637..b0bd996d261 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bitset.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 5ff0c2e68d4..2c51bf3bb04 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index 08463db56d7..2d4902950fb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx index 5cdaa3dc920..dd35fb00a3d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -286,15 +286,23 @@ % \end{macrocode} % Now the case for other engines. Here, each table is an integer % array. Following the \LuaTeX{} pattern, a new table starts with -% \IniTeX{} codes. The index base is out-by-one, so we have an +% \IniTeX{} codes. The \cs{debug_suspend:} and \cs{debug_resume:} +% functions prevent errors and logging from \texttt{debug} commands +% which are either duplicate or false when \cs{@@_new:N} is used +% by \cs{cctab_new:N} or \cs{cctab_const:Nn}. +% The index base is out-by-one, so we have an % internal function to handle that. The \IniTeX{} \tn{endlinechar} is % $13$. % \begin{macrocode} { \cs_new_protected:Npn \@@_new:N #1 - { \intarray_new:Nn #1 { 257 } } + { + \debug_suspend: + \intarray_new:Nn #1 { 257 } + \debug_resume: + } \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3 - { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} } + { \intarray_gset:Nnn #1 { #2 + 1 } {#3} } \cs_new_protected:Npn \cctab_new:N #1 { \__kernel_chk_if_free_cs:N #1 @@ -796,13 +804,22 @@ % \subsection{Constant category code tables} % % \begin{macro}{\cctab_const:Nn,\cctab_const:cn} -% Creates a new \meta{cctab~var} then sets it with the current and -% user-supplied codes. +% Creates a new \meta{cctab~var} then sets it with the \IniTeX{} and +% user-supplied codes. To avoid false \texttt{debug} errors, we write +% out implementation of \cs{cctab_new:N} and \cs{cctab_gset:Nn} +% instead of directly using them here. The initialization part in +% \cs{cctab_new:N} in non-\LuaTeX{} is omitted as it's covered by +% the \IniTeX{} settings. % \begin{macrocode} \cs_new_protected:Npn \cctab_const:Nn #1#2 { - \cctab_new:N #1 - \cctab_gset:Nn #1 {#2} + \__kernel_chk_if_free_cs:N #1 + \@@_new:N #1 + \group_begin: + \cctab_select:N \c_initex_cctab + #2 \scan_stop: + \@@_gset:n {#1} + \group_end: } \cs_generate_variant:Nn \cctab_const:Nn { c } % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index ad65a4b1749..c67f70db2c8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index ad41224aa0d..164d10019db 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx index 514ff326a4e..0edc225c526 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx index 6654b6d4cd7..6dbe13f96e6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -69,7 +69,7 @@ % % Standard file identification. % \begin{macrocode} -\ProvidesExplFile{l3debug.def}{2024-03-14}{}{L3 Debugging support} +\ProvidesExplFile{l3debug.def}{2024-04-11}{}{L3 Debugging support} % \end{macrocode} % % \begin{variable}{\s_@@_stop} @@ -389,10 +389,9 @@ % \end{macro} % % \begin{macro}{\@@_deprecation_on:, \@@_deprecation_off:} -% Some commands were more recently deprecated and not yet removed; -% only make these into errors if the user requests it. This relies on -% two token lists, filled up in \pkg{l3deprecation} by calls to -% \cs{__kernel_deprecation_code:nn}. +% Make deprecated commands throw errors if the user requests it. +% This relies on two token lists, filled up in \pkg{l3deprecation} by +% calls to \cs{__kernel_deprecation_code:nn}. % \begin{macrocode} \cs_new_protected:Npn \@@_deprecation_on: { \g_@@_deprecation_on_tl } @@ -781,7 +780,7 @@ \prop_pop:NnNF \prop_pop:NnNTF \prop_put:Nnn - \prop_put_if_new:Nnn + \prop_put_if_not_in:Nnn \prop_put_from_keyval:Nn \prop_remove:Nn \prop_set_eq:NN @@ -862,7 +861,7 @@ \prop_gpop:NnNF \prop_gpop:NnNTF \prop_gput:Nnn - \prop_gput_if_new:Nnn + \prop_gput_if_not_in:Nnn \prop_gput_from_keyval:Nn \prop_gremove:Nn \prop_gset_eq:NN diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index 3906c6786ef..7af8700df76 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -51,8 +51,10 @@ % % \section{\pkg{l3deprecation} documentation} % -% A few commands have had to be deprecated over the years. This module -% defines deprecated and deleted commands to produce an error. +% A few commands have had to be deprecated over the years. +% All commands deprecated before release 2022-01-12 were already +% removed; commands deprecated since then will no longer be removed. +% Instead, this module defines them to produce errors. % % \end{documentation} % @@ -74,31 +76,12 @@ % \cs{__kernel_patch_deprecation:nnNNpn} \Arg{date} \Arg{replacement} % \meta{definition} \meta{function} \meta{parameters} \Arg{code} % \end{quote} -% defines the \meta{function} to produce a warning and run its -% \meta{code}, or to produce an error and not run any \meta{code}, -% depending on the \pkg{expl3} date. -% \begin{itemize} -% \item If the \pkg{expl3} date is less than the \meta{date} (plus -% $6$~months in case \texttt{undo-recent-deprecations} is used) then -% we define the \meta{function} to produce a warning and run its code. -% The warning is actually suppressed in two cases: -% \begin{itemize} -% \item if neither \texttt{undo-recent-deprecations} nor -% \texttt{enable-debug} are in effect we may be in an end-user's -% document so it is suppressed; -% \item if the command is expandable then we cannot produce a warning. -% \end{itemize} -% \item Otherwise, we define the \meta{function} to produce an error. -% \end{itemize} -% In both cases we additionally make \cs{debug_on:n} |{deprecation}| -% turn the \meta{function} into an \tn{outer} error, and -% \cs{debug_off:n} |{deprecation}| restore whatever the behaviour was -% without \cs{debug_on:n} |{deprecation}|. -% -% In later sections we use the \pkg{l3doc} key \texttt{deprecated} with -% a date equal to that \meta{date} plus $6$~months, so that \pkg{l3doc} -% will complain if we forget to remove the stale \meta{parameters} and -% \Arg{code}. +% defines the \meta{function} to produce an error and run its +% \meta{code}. +% +% We make \cs{debug_on:n} |{deprecation}| turn the \meta{function} into +% an \tn{outer} error, and \cs{debug_off:n} |{deprecation}| restore +% whatever the behaviour was without \cs{debug_on:n} |{deprecation}|. % % In the explanations below, \meta{definition} \meta{function} % \meta{parameters} \Arg{code} or assignments that only differ in the @@ -183,8 +166,7 @@ % % \begin{macro}{\__kernel_deprecation_error:Nnn} % The \tn{outer} definition here ensures the command cannot appear -% in an argument. Use this auxiliary on all commands that have been -% removed since 2015. +% in an argument. % \begin{macrocode} \cs_new_protected:Npn \__kernel_deprecation_error:Nnn #1#2#3 { @@ -679,6 +661,27 @@ % \end{macrocode} % \end{macro} % +% \subsection{Deprecated \pkg{l3prop} functions} +% +% \begin{macro}[deprecated] +% { +% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV, +% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV, +% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV, +% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV +% } +% \begin{macrocode} +%\__kernel_patch_deprecation:nnNNpn { 2024-03-30 } { \prop_put_if_not_in:Nnn } +\cs_new_protected:Npn \prop_put_if_new:Nnn { \prop_put_if_not_in:Nnn } +%\__kernel_patch_deprecation:nnNNpn { 2024-03-30 } { \prop_gput_if_not_in:Nnn } +\cs_new_protected:Npn \prop_gput_if_new:Nnn { \prop_gput_if_not_in:Nnn } +\cs_generate_variant:Nn \prop_put_if_new:Nnn + { NnV , NV , c , cnV , cV } +\cs_generate_variant:Nn \prop_gput_if_new:Nnn + { NnV , NV , c , cnV , cV } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index a48a24df238..9156bd385e5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -71,7 +71,7 @@ and all files in that bundle must be distributed together. % This isn't included in the typeset documentation because it's a bit % ugly: %<*class> -\ProvidesExplClass{l3doc}{2024-03-14}{} +\ProvidesExplClass{l3doc}{2024-04-11}{} {L3 Experimental documentation class} %</class> % \fi @@ -84,7 +84,7 @@ and all files in that bundle must be distributed together. % require you to do updates, if the class changes.}} % % \author{\Team} -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % \maketitle % \tableofcontents % @@ -2181,6 +2181,8 @@ and all files in that bundle must be distributed together. { \tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^M \c_percent_str } + \tl_remove_all:Ne \l_@@_tmpa_tl + { \token_to_str:N \obeyedline \c_space_tl \c_percent_str } \tl_remove_all:Ne \l_@@_tmpa_tl { \tl_to_str:n { ^ ^ A } } \tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^I } \tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^M } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index c973d593c52..c2733e810ef 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index 7e507b75984..e79b5f32b90 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 3a4d1c06dc3..6111d270cab 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -107,7 +107,7 @@ % control sequence for file access. If the \meta{stream} was already % open it is closed before the new operation begins. The % \meta{stream} is available for access immediately and will remain -% allocated to \meta{file name} until a \cs{ior_close:N} instruction +% allocated to \meta{file name} until an \cs{ior_close:N} instruction % is given or the \TeX{} run ends. % If the file is not found, an error is raised. % \end{function} @@ -167,7 +167,7 @@ % control sequence for access. If the \meta{stream} was already % open it is closed before the new operation begins. The % \meta{stream} is available for access immediately and will remain -% allocated to \meta{shell command} until a \cs{iow_close:N} instruction +% allocated to \meta{shell command} until an \cs{iow_close:N} instruction % is given or the \TeX{} run ends. % If piped system calls are disabled an error is raised. % @@ -1679,6 +1679,7 @@ % \end{variable} % % \begin{macro}{\iow_open:Nn, \iow_open:NV, \iow_open:cn, \iow_open:cV} +% \begin{macro}{\__kernel_iow_open:Nn, \__kernel_iow_open:No} % \begin{macro}{\@@_open_stream:Nn, \@@_open_stream:NV} % The same idea as for reading, but without the path and without the need % to allow for a conditional version. @@ -1687,16 +1688,21 @@ { \__kernel_tl_set:Nx \l_@@_file_name_tl { \__kernel_file_name_sanitize:n {#2} } + \__kernel_iow_open:No #1 \l_@@_file_name_tl + } +\cs_generate_variant:Nn \iow_open:Nn { NV , c , cV } +\cs_new_protected:Npn \__kernel_iow_open:Nn #1#2 + { \iow_close:N #1 \seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl - { \@@_open_stream:NV #1 \l_@@_file_name_tl } + { \@@_open_stream:Nn #1 {#2} } { \@@_new:N #1 \__kernel_tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} } - \@@_open_stream:NV #1 \l_@@_file_name_tl + \@@_open_stream:Nn #1 {#2} } } -\cs_generate_variant:Nn \iow_open:Nn { NV , c , cV } +\cs_generate_variant:Nn \__kernel_iow_open:Nn { No } \cs_new_protected:Npn \@@_open_stream:Nn #1#2 { \tex_global:D \tex_chardef:D #1 = \l_@@_stream_tl \scan_stop: @@ -1708,6 +1714,7 @@ % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro}{\iow_shell_open:Nn} % \begin{macro}{\@@_shell_open:nN, \@@_shell_open:oN} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 40614c7348c..c3bd4a5085a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index 6d00047e4da..d54f0920858 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index 1f4ea5d34dc..c9d0c228f56 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index a7401407cd0..d3dcb68dde3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index 0459331326a..a0536c12995 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index 5b5f947c384..6fbc9de52c7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index bcd16a4b683..356c32b2328 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx index b26d8e7f265..f6c9ec346fe 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-functions.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index c95704085cb..9df6a4730a4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index 53b85a7cc83..ee2eedbc227 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index cdbdf38ee1d..ce5a0c48f70 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index bddb146be7d..48ae82730c7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx index 26a084733da..901ce7a27ca 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-symbolic.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index e1a3dd89a03..5a4a3b41f9f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index 21cefc166c1..d8585ebe662 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx index 0d589c9549f..2c23c613930 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-types.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index 11dbcdceeff..7cef5739702 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index 1517840431b..24f4ac85f80 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx @@ -44,20 +44,20 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % % \begin{documentation} % -% \section{\pkg{l3fparray} documentation} -% % For applications requiring heavy use of floating points, this module % provides arrays which can be accessed in constant time (contrast % \pkg{l3seq}, where access time is linear). The interface is very % close to that of \pkg{l3intarray}. The size of the array is fixed and % must be given at point of initialisation % +% \section{Creating and initialising floating point array variables} +% % \begin{function}[added = 2018-05-05]{\fparray_new:Nn, \fparray_new:cn} % \begin{syntax} % \cs{fparray_new:Nn} \meta{fparray~var} \Arg{size} @@ -68,14 +68,16 @@ % assignments are always global. % \end{function} % -% \begin{function}[EXP, added = 2018-05-05]{\fparray_count:N, \fparray_count:c} +% \begin{function}[added = 2018-05-05]{\fparray_gzero:N, \fparray_gzero:c} % \begin{syntax} -% \cs{fparray_count:N} \meta{fparray~var} +% \cs{fparray_gzero:N} \meta{fparray~var} % \end{syntax} -% Expands to the number of entries in the \meta{floating point array -% variable}. This is performed in constant time. +% Sets all entries of the \meta{floating point array variable} to +% $+0$. Assignments are always global. % \end{function} % +% \section{Adding data to floating point arrays} +% % \begin{function}[added = 2018-05-05]{\fparray_gset:Nnn, \fparray_gset:cnn} % \begin{syntax} % \cs{fparray_gset:Nnn} \meta{fparray~var} \Arg{position} \Arg{value} @@ -87,17 +89,21 @@ % Assignments are always global. % \end{function} % -% \begin{function}[added = 2018-05-05]{\fparray_gzero:N, \fparray_gzero:c} +% \section{Couting entries in floating point arrays} +% +% \begin{function}[EXP, added = 2018-05-05]{\fparray_count:N, \fparray_count:c} % \begin{syntax} -% \cs{fparray_gzero:N} \meta{fparray~var} +% \cs{fparray_count:N} \meta{fparray~var} % \end{syntax} -% Sets all entries of the \meta{floating point array variable} to -% $+0$. Assignments are always global. +% Expands to the number of entries in the \meta{floating point array +% variable}. This is performed in constant time. % \end{function} % +% \section{Using a single entry} +% % \begin{function}[EXP, added = 2018-05-05] % { -% \fparray_item:Nn, \fparray_item:cn +% \fparray_item:Nn, \fparray_item:cn, % \fparray_item_to_tl:Nn, \fparray_item_to_tl:cn % } % \begin{syntax} @@ -106,8 +112,21 @@ % Applies \cs{fp_use:N} or \cs{fp_to_tl:N} (respectively) to the % floating point entry stored at the (integer expression) % \meta{position} in the \meta{floating point array variable}. If the -% \meta{position} is not between $1$ and the \cs{fparray_count:N}, an -% error occurs. +% \meta{position} is not between $1$ and the +% \cs{fparray_count:N} \meta{fparray~var}, an error occurs. +% \end{function} +% +% \section{Floating point array conditional} +% +% \begin{function}[pTF, added = 2024-03-31] +% {\fparray_if_exist:N, \fparray_if_exist:c} +% \begin{syntax} +% \cs{fparray_if_exist_p:N} \meta{fparray~var} +% \cs{fparray_if_exist:NTF} \meta{fparray~var} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests whether the \meta{fparray~var} is currently defined. This +% does not check that the \meta{fparray~var} really is a floating +% point array variable. % \end{function} % % \end{documentation} @@ -389,6 +408,16 @@ % \end{macro} % \end{macro} % +% \begin{macro}[pTF]{\fparray_if_exist:N, \fparray_if_exist:c} +% Copies of the \texttt{cs} functions defined in \pkg{l3basics}. +% \begin{macrocode} +\prg_new_eq_conditional:NNn \fparray_if_exist:N \cs_if_exist:N + { TF , T , F , p } +\prg_new_eq_conditional:NNn \fparray_if_exist:c \cs_if_exist:c + { TF , T , F , p } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index 9fa2a547ffd..a1c9458436f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index 5704a2ab756..bbc41c0cdb3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx @@ -44,14 +44,12 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % % \begin{documentation} % -% \section{\pkg{l3intarray} documentation} -% % For applications requiring heavy use of integers, this module provides % arrays which can be accessed in constant time (contrast \pkg{l3seq}, % where access time is linear). These arrays have several important @@ -66,6 +64,8 @@ % The use of \texttt{intarray} data is therefore recommended for cases where % the need for fast access is of paramount importance. % +% \section{Creating and initialising integer array variables} +% % \begin{function}[added = 2018-03-29]{\intarray_new:Nn, \intarray_new:cn} % \begin{syntax} % \cs{intarray_new:Nn} \meta{intarray~var} \Arg{size} @@ -76,14 +76,27 @@ % always global. % \end{function} % -% \begin{function}[EXP, added = 2018-03-29]{\intarray_count:N, \intarray_count:c} +% \begin{function}[added = 2018-05-04] +% {\intarray_const_from_clist:Nn, \intarray_const_from_clist:cn} % \begin{syntax} -% \cs{intarray_count:N} \meta{intarray~var} +% \cs{intarray_const_from_clist:Nn} \meta{intarray~var} \meta{int expr clist} % \end{syntax} -% Expands to the number of entries in the \meta{integer array variable}. -% Contrarily to \cs{seq_count:N} this is performed in constant time. +% Creates a new constant \meta{integer array variable} or raises an +% error if the name is already taken. The \meta{integer array +% variable} is set (globally) to contain as its items the results of +% evaluating each \meta{integer expression} in the \meta{comma list}. % \end{function} % +% \begin{function}[added = 2018-05-04]{\intarray_gzero:N, \intarray_gzero:c} +% \begin{syntax} +% \cs{intarray_gzero:N} \meta{intarray~var} +% \end{syntax} +% Sets all entries of the \meta{integer array variable} to zero. +% Assignments are always global. +% \end{function} +% +% \section{Adding data to integer arrays} +% % \begin{function}[added = 2018-03-29]{\intarray_gset:Nnn, \intarray_gset:cnn} % \begin{syntax} % \cs{intarray_gset:Nnn} \meta{intarray~var} \Arg{position} \Arg{value} @@ -96,25 +109,18 @@ % global. % \end{function} % -% \begin{function}[added = 2018-05-04] -% {\intarray_const_from_clist:Nn, \intarray_const_from_clist:cn} -% \begin{syntax} -% \cs{intarray_const_from_clist:Nn} \meta{intarray~var} \meta{int expr clist} -% \end{syntax} -% Creates a new constant \meta{integer array variable} or raises an -% error if the name is already taken. The \meta{integer array -% variable} is set (globally) to contain as its items the results of -% evaluating each \meta{integer expression} in the \meta{comma list}. -% \end{function} +% \section{Couting entries in integer arrays} % -% \begin{function}[added = 2018-05-04]{\intarray_gzero:N, \intarray_gzero:c} +% \begin{function}[EXP, added = 2018-03-29]{\intarray_count:N, \intarray_count:c} % \begin{syntax} -% \cs{intarray_gzero:N} \meta{intarray~var} +% \cs{intarray_count:N} \meta{intarray~var} % \end{syntax} -% Sets all entries of the \meta{integer array variable} to zero. -% Assignments are always global. +% Expands to the number of entries in the \meta{integer array variable}. +% Contrarily to \cs{seq_count:N} this is performed in constant time. % \end{function} % +% \section{Using a single entry} +% % \begin{function}[EXP, added = 2018-03-29]{\intarray_item:Nn, \intarray_item:cn} % \begin{syntax} % \cs{intarray_item:Nn} \meta{intarray~var} \Arg{position} @@ -134,6 +140,21 @@ % \meta{integer array} is empty, produce an error. % \end{function} % +% \section{Integer array conditional} +% +% \begin{function}[pTF, added = 2024-03-31] +% {\intarray_if_exist:N, \intarray_if_exist:c} +% \begin{syntax} +% \cs{intarray_if_exist_p:N} \meta{intarray~var} +% \cs{intarray_if_exist:NTF} \meta{intarray~var} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests whether the \meta{intarray~var} is currently defined. This +% does not check that the \meta{intarray~var} really is an integer +% array variable. +% \end{function} +% +% \section{Viewing integer arrays} +% % \begin{function}[added = 2018-05-04] % {\intarray_show:N, \intarray_show:c, \intarray_log:N, \intarray_log:c} % \begin{syntax} @@ -144,7 +165,7 @@ % terminal or writes them in the log file. % \end{function} % -% \subsection{Implementation notes} +% \section{Implementation notes} % % It is a wrapper around the \tn{fontdimen} primitive, used to store % arrays of integers (with a restricted range: absolute value at most @@ -912,6 +933,16 @@ luacmd('@@_gset_range:w', function() % % \subsection{Common parts} % +% \begin{macro}[pTF]{\intarray_if_exist:N, \intarray_if_exist:c} +% Copies of the \texttt{cs} functions defined in \pkg{l3basics}. +% \begin{macrocode} +\prg_new_eq_conditional:NNn \intarray_if_exist:N \cs_if_exist:N + { TF , T , F , p } +\prg_new_eq_conditional:NNn \intarray_if_exist:c \cs_if_exist:c + { TF , T , F , p } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\intarray_show:N, \intarray_show:c, \intarray_log:N, \intarray_log:c} % Convert the list to a comma list (with spaces after each comma) % \begin{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index 480425d7306..1706bb594a7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -333,7 +333,21 @@ % higher-level % functions which have already fully expanded the \meta{file name} and which % need to perform multiple open or close operations. See for example the -% implementation of \cs{file_get_full_name:nN}, +% implementation of \cs{ior_shell_open:Nn}. +% \end{function} +% +% \begin{function}{\__kernel_iow_open:Nn, \__kernel_iow_open:No} +% \begin{syntax} +% \cs{__kernel_iow_open:Nn} \meta{stream} \Arg{file name} +% \end{syntax} +% This function has identical syntax to the public version. However, +% is does not take precautions against active characters in the +% \meta{file name}, and it does not attempt to add a \meta{path} to +% the \meta{file name}: it is therefore intended to be used by +% higher-level +% functions which have already fully expanded the \meta{file name} and which +% need to perform multiple open or close operations. See for example the +% implementation of \cs{iow_shell_open:Nn}. % \end{function} % % \begin{function}{\__kernel_iow_with:Nnn} @@ -367,6 +381,17 @@ % |1+2| then this logs |> 1+2=3.| % \end{function} % +% \begin{function}[EXP]{\__kernel_pdf_object_id:n, \__kernel_pdf_object_id_indexed:nn} +% \begin{syntax} +% \cs{__kernel_pdf_object_id:n} \Arg{object} +% \cs{__kernel_pdf_object_id_indexed:nn} \Arg{class} \Arg{number} +% \end{syntax} +% Expands to the ID of \meta{object} (or object of \meta{number} within +% the \meta{class}), in for example page resource allocation. Depending on +% the backend, the result may be the same as +% \cs{pdf_object_id:n}/\cs{pdf_object_id_indexed:nn}. +% \end{function} +% % \begin{variable}{\g__kernel_prg_map_int} % This integer is used by non-expandable mapping functions to track % the level of nesting in force. The functions diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 5ea436176f4..a1d2c011691 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx index bd56f1ed3a8..ed7dadf2220 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 3d177f63452..f0107d465be 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 3acae8d111d..ab4d882dcbf 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index 3e78d86acfd..468481c28c6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx index 7ffd0c1c056..b0b17f26902 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -51,6 +51,11 @@ % % \section{Objects} % +% \subsection{Named objects} +% +% An \meta{object} name should fully expand to tokens suitable for use in a +% label-like context. +% % \begin{function}[added = 2022-08-23]{\pdf_object_new:n} % \begin{syntax} % \cs{pdf_object_new:n} \Arg{object} @@ -62,7 +67,7 @@ % \begin{function}[added = 2022-08-23] % {\pdf_object_write:nnn, \pdf_object_write:nne} % \begin{syntax} -% \cs{pdf_object_write:nn} \Arg{object} \Arg{type} \Arg{content} +% \cs{pdf_object_write:nnn} \Arg{object} \Arg{type} \Arg{content} % \end{syntax} % Writes the \meta{content} as content of the \meta{object}. Depending on the % \meta{type} declared for the object, the format required for the @@ -83,9 +88,71 @@ % \cs{pdf_object_ref:n} \Arg{object} % \end{syntax} % Inserts the appropriate information to reference the \meta{object} -% in for example page resource allocation +% in for example page resource allocation. If the \meta{object} does +% not exist then the function expands to a reference to object zero; +% no PDF indirect object ever has this number, so this is a marker for +% error. +% \end{function} +% +% \begin{function}[EXP, pTF, added = 2020-05-15]{\pdf_object_if_exist:n} +% \begin{syntax} +% \cs{pdf_object_if_exist_p:n} \Arg{object} +% \cs{pdf_object_if_exist:nTF} \Arg{object} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests whether an object with name \Arg{object} has been defined. +% \end{function} +% +% \subsection{Indexed objects} +% +% Objects can also be created using a pair of \meta{class} and \emph{index}; +% the \meta{class} argument should expand to character tokens, whilst the +% \meta{index} is an \meta{int expr} and starts at $1$. For large +% families of objects, this approach is more efficient than using +% individual names. +% +% \begin{function}[added = 2024-04-01]{\pdf_object_new_indexed:nn} +% \begin{syntax} +% \cs{pdf_object_new_indexed:nn} \Arg{class} \Arg{index} +% \end{syntax} +% Declares a PDF object of \meta{class} and \meta{index}. The object may be +% referenced from this point on, and written later using +% \cs{pdf_object_write_indexed:nnnn}. % \end{function} % +% \begin{function}[added = 2024-04-01] +% {\pdf_object_write_indexed:nnnn, \pdf_object_write_indexed:nnne} +% \begin{syntax} +% \cs{pdf_object_write_indexed:nnnn} \Arg{class} \Arg{index} \Arg{type} \Arg{content} +% \end{syntax} +% Writes the \meta{content} as content of the object of \meta{class} and +% \meta{index}. Depending on the +% \meta{type} declared for the object, the format required for the +% \meta{content} will vary +% \begin{itemize} +% \item[\texttt{array}] A space-separated list of values +% \item[\texttt{dict}] Key--value pairs in the form +% \texttt{/\meta{key} \meta{value}} +% \item[\texttt{fstream}] Two brace groups: \meta{file name} and +% \meta{file content} +% \item[\texttt{stream}] Two brace groups: \meta{attributes (dictionary)} +% and \meta{stream contents} +% \end{itemize} +% \end{function} +% +% \begin{function}[EXP, added = 2024-04-01]{\pdf_object_ref_indexed:nn} +% \begin{syntax} +% \cs{pdf_object_ref_indexed:nn} \Arg{class} \Arg{index} +% \end{syntax} +% Inserts the appropriate information to reference the object of \meta{class} +% and \meta{index} in for example page resource allocation. If the +% \meta{class}/\meta{index} combination does +% not exist then the function expands to a reference to object zero; +% no PDF indirect object ever has this number, so this is a marker for +% error. +% \end{function} +% +% \subsection{General functions} +% % \begin{function}[added = 2021-02-10] % {\pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne} % \begin{syntax} @@ -119,14 +186,6 @@ % Inserts the appropriate information to reference the \meta{pageobject}. % \end{function} % -% \begin{function}[EXP, pTF, added = 2020-05-15]{\pdf_object_if_exist:n} -% \begin{syntax} -% \cs{pdf_object_if_exist_p:n} \Arg{object} -% \cs{pdf_object_if_exist:nTF} \Arg{object} -% \end{syntax} -% Tests whether an object with name \Arg{object} has been defined. -% \end{function} -% % \section{Version} % % \begin{function}[pTF, EXP, added = 2021-02-10]{\pdf_version_compare:Nn} @@ -267,6 +326,10 @@ %<@@=pdf> % \end{macrocode} % +% \begin{macrocode} +%<*tex> +% \end{macrocode} +% % \begin{variable}{\s_@@_stop} % Internal scan marks. % \begin{macrocode} @@ -311,53 +374,286 @@ % % \subsection{Objects} % +% \begin{variable}{\g_@@_backend_object_int} +% For returning object numbers. +% \begin{macrocode} +\int_new:N \g_@@_backend_object_int +% \end{macrocode} +% \end{variable} +% % \begin{macro}{\pdf_object_new:n} % \begin{macro} % {\pdf_object_write:nnn, \pdf_object_write:nne, \pdf_object_write:nnx} % \begin{macro}{\pdf_object_ref:n} -% \begin{macro} -% { -% \pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne, -% \pdf_object_unnamed_write:nx -% } -% \begin{macro}{\pdf_object_ref_last:} -% \begin{macro}[pTF]{\pdf_object_if_exist:n} +% \begin{macro}{\__kernel_pdf_object_id:n} % Simple to do: all objects create a constant |int| so it is not a % backend-specific name. % \begin{macrocode} \cs_new_protected:Npn \pdf_object_new:n #1 { - \@@_backend_object_new:n {#1} - \cs_new_eq:cc - { c_@@_backend_object_ \tl_to_str:n {#1} _int } - { c_@@_object_ \tl_to_str:n {#1} _int } + \@@_backend_object_new: + \@@_object_record:nN {#1} \g_@@_backend_object_int } \cs_new_protected:Npn \pdf_object_write:nnn #1#2#3 { - \@@_backend_object_write:nnn {#1} {#2} {#3} + \exp_args:Ne \@@_backend_object_write:nnn + { \@@_object_retrieve:n {#1} } {#2} {#3} \bool_gset_true:N \g_@@_init_bool } \cs_generate_variant:Nn \pdf_object_write:nnn { nne , nnx } -\cs_new:Npn \pdf_object_ref:n #1 { \@@_backend_object_ref:n {#1} } -\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2 +\cs_new:Npn \pdf_object_ref:n #1 { - \@@_backend_object_now:nn {#1} {#2} - \bool_gset_true:N \g_@@_init_bool + \exp_args:Ne \@@_backend_object_ref:n + { \@@_object_retrieve:n {#1} } } -\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { ne , nx } -\cs_new:Npn \pdf_object_ref_last: { \@@_backend_object_last: } +\cs_new:Npn \__kernel_pdf_object_id:n #1 + { + \exp_args:Ne \@@_backend_object_id:n + { \@@_object_retrieve:n {#1} } + } +%</tex> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\@@_object_record:nN} +% \begin{macro}[EXP]{\@@_object_retrieve:n} +% \begin{macro}{ltx.pdf.object_id} +% Object mappings are tracked in Lua for \LuaTeX{} as this makes retrieving +% them much easier; as a result, there is a split in approaches. In Lua we +% store values in a table indexed by name. The Lua function here is set up +% to deal with both named and indexed objects: fits the Lua idiom well. +% \begin{macrocode} +%<*lua> + +local scan_int = token.scan_int +local scan_string = token.scan_string +local cprint = tex.cprint + +local @@_objects_named = {} +local @@_objects_indexed = {} + +luacmd('@@_object_record:nN', function() + local name = scan_string() + local n = scan_int() + @@_objects_named[name] = n +end,'protected','global') + +local function object_id(name,index) + if index then + return @@_objects_indexed[name][index] or 0 + else + return @@_objects_named[name] or 0 + end +end + +luacmd('@@_object_retrieve:n', function() + local name = scan_string() + return cprint(12,tostring(object_id(name))) +end,'global') + +ltx.pdf = ltx.pdf or {} +ltx.pdf.object_id = object_id + +%</lua> +% \end{macrocode} +% Whereas in \TeX{} we use integer constants. +% \begin{macrocode} +%<*tex> +\sys_if_engine_luatex:F + { + \cs_new_protected:Npn \@@_object_record:nN #1#2 + { + \int_const:cn + { c_@@_object_ #1 _int } {#2} + } + \cs_new:Npn \@@_object_retrieve:n #1 + { + \int_if_exist:cTF { c_@@_object_ #1 _int } + { + \int_use:c + { c_@@_object_ #1 _int } + } + { 0 } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}[pTF,EXP]{\pdf_object_if_exist:n} +% \begin{macrocode} \prg_new_conditional:Npnn \pdf_object_if_exist:n #1 { p , T , F , TF } { - \int_if_exist:cTF { c_@@_object_ \tl_to_str:n {#1} _int } - \prg_return_true: + \int_compare:nNnTF { \@@_object_retrieve:n {#1} } = 0 \prg_return_false: + \prg_return_true: } % \end{macrocode} % \end{macro} +% +% \begin{macro}{\pdf_object_new_indexed:nn} +% \begin{macro}{\pdf_object_write_indexed:nnnn, \pdf_object_write_indexed:nnne} +% \begin{macro}[EXP]{\pdf_object_ref_indexed:nn} +% \begin{macro}[EXP]{\__kernel_pdf_object_id_indexed:nn} +% Again we split between the common code and the macro- or Lua-based +% implementation. To make life easier for the Lua route, all of the +% potential expressions are expanded to braced numbers. +% \begin{macrocode} +\cs_new_protected:Npn \pdf_object_new_indexed:nn #1#2 + { + \@@_backend_object_new: + \@@_object_record:neN {#1} + { \int_eval:n {#2} } \g_@@_backend_object_int + } +\cs_new_protected:Npn \pdf_object_write_indexed:nnnn #1#2#3#4 + { + \exp_args:Ne \@@_backend_object_write:nnn + { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } } {#3} {#4} + \bool_gset_true:N \g_@@_init_bool + } +\cs_generate_variant:Nn \pdf_object_write_indexed:nnnn { nnne } +\cs_new:Npn \pdf_object_ref_indexed:nn #1#2 + { + \exp_args:Ne \@@_backend_object_ref:n + { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } } + } +\cs_new:Npn \__kernel_pdf_object_id_indexed:nn #1#2 + { + \exp_args:Ne \@@_backend_object_id:n + { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } } + } +%</tex> +% \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} +% \begin{macro}{\@@_object_record:nnN, \@@_object_record:neN} +% \begin{macro}[EXP]{\@@_object_retrieve:nn} +% \begin{macro}{\@@_object_record:NnN} +% \begin{macro}[EXP]{\@@_object_retrieve:Nn} +% Again we split for Lua: the same idea as above but with nested tables. +% As we've arranged above that the \TeX{} code passes a braced number, +% we can use |tonumber(scan_string())| rather than |scan_int()| +% for the index. +% \begin{macrocode} +%<*lua> + +luacmd('@@_object_record:nnN', function() + local name = scan_string() + local index = tonumber(scan_string()) + local n = scan_int() + @@_objects_indexed[name] = @@_objects_indexed[name] or {} + @@_objects_indexed[name][index] = n +end,'protected','global') + +luacmd('@@_object_retrieve:nn', function() + local name = scan_string() + local index = tonumber(scan_string()) + return cprint(12,tostring(object_id(name,index))) +end,'global') + +%</lua> +% \end{macrocode} +% The non-Lua approach is to divide the range into blocks, and store in integer +% arrays that can simulate dynamic assignment. +% \begin{macrocode} +%<*tex> +\sys_if_engine_luatex:F + { + \cs_new_protected:Npn \@@_object_record:nnN #1#2#3 + { + \use:e + { + \@@_object_record:NnN + \@@_object_index_split:nn {#1} {#2} + \exp_not:N #3 + } + } + \cs_new_protected:Npn \@@_object_record:NnN #1#2#3 + { + \intarray_if_exist:NF #1 + { \intarray_new:Nn #1 \c_@@_object_block_size_int } + \intarray_gset:Nnn #1 {#2} #3 + } + \cs_new:Npn \@@_object_retrieve:nn #1#2 + { + \use:e + { + \exp_not:N \@@_object_retrieve:Nn + \@@_object_index_split:nn {#1} {#2} + } + } + \cs_new:Npn \@@_object_retrieve:Nn #1#2 + { \intarray_item:Nn #1 {#2} } +% \end{macrocode} +% As we want blocks to start from one, and within the block for the top value +% to be \enquote{in} the block, we do a little bit of manipulation. By shifting +% down by one, we keep the values \enquote{in} the block, then we adjust the +% block/index number to get back on track. +% \begin{macrocode} + \cs_new:Npn \@@_object_index_split:nn #1#2 + { + \exp_not:c + { + g_@@_object_ #1 _ + \int_eval:n + { + \int_div_truncate:nn { #2 - 1 } + \c_@@_object_block_size_int + 1 + } + _intarray + } + { + \int_eval:n + { \int_mod:nn { #2 - 1 } \c_@@_object_block_size_int + 1 } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{variable}{\c_@@_object_block_size_int} +% Sets the block size used for managing indexed objects. +% \begin{macrocode} + \int_const:Nn \c_@@_object_block_size_int { 10000 } + } +% \end{macrocode} +% \end{variable} +% \begin{macro}{\@@_object_record:neN} +% \begin{macro}[EXP]{\@@_object_retrieve:ne} +% Common variants. +% \begin{macrocode} +\cs_generate_variant:Nn \@@_object_record:nnN { ne } +\cs_generate_variant:Nn \@@_object_retrieve:nn { ne } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro} +% { +% \pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne, +% \pdf_object_unnamed_write:nx +% } +% No tracking needed here. +% \begin{macrocode} +\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2 + { + \exp_args:Ne \@@_backend_object_now:nn {#1} {#2} + \bool_gset_true:N \g_@@_init_bool + } +\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { ne , nx } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pdf_object_ref_last:} +% A one-step wrapper for consistency. +% \begin{macrocode} +\cs_new:Npn \pdf_object_ref_last: { \@@_backend_object_last: } +% \end{macrocode} % \end{macro} % % \begin{macro}{\pdf_pageobject_ref:n} @@ -523,6 +819,10 @@ % \end{macrocode} % % \begin{macrocode} +%</tex> +% \end{macrocode} +% +% \begin{macrocode} %</package> % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index 8bbdd6a5870..ea76955d82f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index 878b9eb7586..6d8054e956d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -299,15 +299,15 @@ % codes are ignored. % \end{function} % -% \begin{function} +% \begin{function}[added = 2024-03-30] % { -% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV, -% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV, -% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV, -% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV +% \prop_put_if_not_in:Nnn, \prop_put_if_not_in:NVn, \prop_put_if_not_in:NnV, +% \prop_put_if_not_in:cnn, \prop_put_if_not_in:cVn, \prop_put_if_not_in:cnV, +% \prop_gput_if_not_in:Nnn, \prop_gput_if_not_in:NVn, \prop_gput_if_not_in:NnV, +% \prop_gput_if_not_in:cnn, \prop_gput_if_not_in:cVn, \prop_gput_if_not_in:cnV % } % \begin{syntax} -% \cs{prop_put_if_new:Nnn} \meta{property list} \Arg{key} \Arg{value} +% \cs{prop_put_if_not_in:Nnn} \meta{property list} \Arg{key} \Arg{value} % \end{syntax} % If the \meta{key} is present in the \meta{property list} then no % action is taken. Otherwise, a new entry is added as described for @@ -1358,7 +1358,7 @@ % in the linked case. If |#5| is |#3| itself we have to be careful % not to lose the data, and we even take the opportunity to skip the % copying step completely. To keep the correct version of the -% duplicate keys we use the code underlying \cs{prop_put_if_new:Nnn}, +% duplicate keys we use the code underlying \cs{prop_put_if_not_in:Nnn}, % which involves passing \cs{use_none:nnn} to the auxiliary instead of % nothing. % There is no need to check for the case where |#3| is equal to~|#4| @@ -1940,10 +1940,10 @@ % } % \begin{macro}[tested = m3prop002] % { -% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV, -% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV, -% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV, -% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV +% \prop_put_if_not_in:Nnn, \prop_put_if_not_in:NVn, \prop_put_if_not_in:NnV, +% \prop_put_if_not_in:cnn, \prop_put_if_not_in:cVn, \prop_put_if_not_in:cnV, +% \prop_gput_if_not_in:Nnn, \prop_gput_if_not_in:NVn, \prop_gput_if_not_in:NnV, +% \prop_gput_if_not_in:cnn, \prop_gput_if_not_in:cVn, \prop_gput_if_not_in:cnV % } % \begin{macro}[tested = m3prop002] % { @@ -1965,17 +1965,17 @@ % auxiliary to skip this checking step and avoid getting multiple % error messages for the same error. % The \meta{code} (empty for |put| and \cs{use_none:nnn} for -% |put_if_new|) is placed before the assignment in cases where the key +% |put_if_not_in|) is placed before the assignment in cases where the key % is already present, in order to suppress the assignment in the -% |put_if_new| case. +% |put_if_not_in| case. % \begin{macrocode} \cs_new_protected:Npn \prop_put:Nnn { \@@_put:nNNnn { } \cs_set_nopar:Npe } \cs_new_protected:Npn \prop_gput:Nnn { \@@_put:nNNnn { } \cs_gset_nopar:Npe } -\cs_new_protected:Npn \prop_put_if_new:Nnn +\cs_new_protected:Npn \prop_put_if_not_in:Nnn { \@@_put:nNNnn \use_none:nnn \cs_set_nopar:Npe } -\cs_new_protected:Npn \prop_gput_if_new:Nnn +\cs_new_protected:Npn \prop_gput_if_not_in:Nnn { \@@_put:nNNnn \use_none:nnn \cs_gset_nopar:Npe } \cs_generate_variant:Nn \prop_put:Nnn { @@ -2005,10 +2005,10 @@ } \cs_generate_variant:Nn \prop_gput:Nnn { cno , co , coo , cnx , cVx , cxV , cxx } -\cs_generate_variant:Nn \prop_put_if_new:Nnn - { NnV , NV , cnV , cV } -\cs_generate_variant:Nn \prop_gput_if_new:Nnn - { NnV , NV , cnV , cV } +\cs_generate_variant:Nn \prop_put_if_not_in:Nnn + { NnV , NV , c , cnV , cV } +\cs_generate_variant:Nn \prop_gput_if_not_in:Nnn + { NnV , NV , c , cnV , cV } % \end{macrocode} % Since the true branch of \cs{@@_split:NnTFn} is used as the % replacement text of an internal macro, and since the \meta{key} and diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index 000063bc005..6dba950462c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index 395be76907a..ce85b562627 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 5334e8fd888..6be32f7a831 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index 1839c8a2e56..a3d9256223d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 818f605e076..81a025b4744 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx index be850b31099..75dbdd095b8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 88ad33c74b1..efc24fe8eae 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index feec1232fd0..085b5f2c979 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -333,7 +333,7 @@ % not directly available within the \TeX{} run. Note that if restricted % shell escape is disabled, no results can be obtained. % -% \begin{function}[added = 2024-03-08] +% \begin{function}[added = 2024-03-08, updated = 2024-04-08] % {\sys_get_query:nN, \sys_get_query:nnN, \sys_get_query:nnnN} % \begin{syntax} % \cs{sys_get_query:nN} \Arg{cmd} \Arg{tl var} @@ -357,6 +357,14 @@ % The \meta{spec} and \meta{options}, if given, are expanded fully % before passing to the underlying script. % +% Spaces in the output are stored as active tokens, allowing them to be +% replaced by for example a visible space easily. Other non-letter +% characters in the ASCII range are set to category code~12. The category +% codes for characters out of the ASCII range are left unchanged: typically +% this will mean that with an 8-bit engine, accented values can be typeset +% directly whilst in Unicode engines, standard category code setup will +% apply. +% % If more than one line of text is returned by the \meta{cmd}, these will be % separated by character~13 (|^^M|) tokens of category code~12. In most % cases, \cs{sys_split_query:nnnN} should be preferred when multi-line @@ -1161,7 +1169,7 @@ end { \sys_get_query:nnnN {#1} { } {#2} #3 } \cs_new_protected:Npn \sys_get_query:nnnN #1#2#3#4 { - \str_clear:N #4 + \tl_clear:N #4 \@@_get_query_auxi:neeN {#1} {#2} {#3} #4 } \cs_new:Npn \@@_get_query_auxi:nnnN #1#2#3#4 @@ -1187,10 +1195,13 @@ end \sys_get_shell:nnN { l3sys-query~#1 #2 #3 } { - \int_step_inline:nnn { 0 } { `a - 1 } + \int_step_inline:nnn { 0 } { `A - 1 } + { \char_set_catcode_other:n {##1} } + \int_step_inline:nnn { `Z + 1 } { `a - 1 } { \char_set_catcode_other:n {##1} } - \int_step_inline:nnn { `Z + 1 } { 127 } + \int_step_inline:nnn { `z + 1 } { 127 } { \char_set_catcode_other:n {##1} } + \char_set_catcode_active:n { `\ } \tex_endlinechar:D 13 \scan_stop: } \l_@@_tmp_tl diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx index 0547db28b1d..5010114fb4b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx index d364c321994..213d8281a96 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx index 8f92c1eae95..a713cd6e403 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx index 5feff565b9c..56c9a5533c3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index d965050c76a..a4141dcfe4a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx index 175b7bc24fe..859dd5025c8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-build.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -73,7 +73,8 @@ % \end{syntax} % Clears the \meta{tl~var} and sets it up to support other % \cs[no-index]{tl_build_\ldots{}} functions. Until \cs{tl_build_end:N} -% \meta{tl~var} is called, applying any function from \pkg{l3tl} other +% \meta{tl~var} or \cs{tl_build_gend:N} \meta{tl~var} is called, +% applying any function from \pkg{l3tl} other % than \cs[no-index]{tl_build_\ldots{}} will lead to incorrect % results. The |begin| and |gbegin| functions must be used for local % and global \meta{tl~var} respectively. diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index 0938e7cd5e6..30e16636e54 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index cd538ee6d05..a38860b548c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -2298,7 +2298,7 @@ % is not a primitive. % % For \LuaTeX{} we use a different implementation which just looks at the -% command code for the token and compaes it to a list of non-primitives. +% command code for the token and compares it to a list of non-primitives. % Again, \tn{nullfont} is a special case because it is the only primitive % with the normally non-primitive |set_font| command code. % @@ -2345,11 +2345,11 @@ do [cmd'outer_call' or cmd'tolerant_call'] = true, [cmd'long_outer_call' or cmd'tolerant_protected_call'] = true, [cmd'assign_glue' or cmd'register_glue'] = index_not_nil, - [cmd'assign_mu_glue' or cmd'register_mu_glue'] = index_not_nil, + [cmd'assign_mu_glue' or cmd'register_mu_glue' or cmd'register_muglue'] = index_not_nil, [cmd'assign_toks' or cmd'register_toks'] = index_not_nil, - [cmd'assign_int' or cmd'register_int'] = index_not_nil, + [cmd'assign_int' or cmd'register_int' or cmd'register_integer'] = index_not_nil, [cmd'assign_attr' or cmd'register_attribute'] = true, - [cmd'assign_dimen' or cmd'register_dimen'] = index_not_nil, + [cmd'assign_dimen' or cmd'register_dimen' or cmd'register_dimension'] = index_not_nil, } luacmd("@@_if_primitive_lua:N", function() diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index cd552800b07..0ee6858f5b9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-03-14} +% \date{Released 2024-04-11} % % \maketitle % @@ -82,7 +82,7 @@ % range, the generated character tokens will be active (category code % $13$); for codepoints in the ASCII range, the given \meta{catcode} % will be used. To allow the result of this function to be used -% inside a expansion context, the result is protected by \cs{exp_not:n}. +% inside an expansion context, the result is protected by \cs{exp_not:n}. % % \begin{texnote} % Users of (u)p\TeX{} note that these engines are treated as $8$-bit in diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex index bc4dfe706a4..8207f52f0fe 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex @@ -51,7 +51,7 @@ %% l3regex.dtx (with options: `package') %% l3box.dtx (with options: `package') %% l3color.dtx (with options: `package') -%% l3pdf.dtx (with options: `package') +%% l3pdf.dtx (with options: `package,tex') %% l3coffins.dtx (with options: `package') %% l3luatex.dtx (with options: `package,tex') %% l3unicode.dtx (with options: `package') @@ -75,7 +75,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2024-03-14}% +\def\ExplFileDate{2024-04-11}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -7960,7 +7960,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \sys_get_query:nnnN {#1} { } {#2} #3 } \cs_new_protected:Npn \sys_get_query:nnnN #1#2#3#4 { - \str_clear:N #4 + \tl_clear:N #4 \__sys_get_query_auxi:neeN {#1} {#2} {#3} #4 } \cs_new:Npn \__sys_get_query_auxi:nnnN #1#2#3#4 @@ -7986,10 +7986,13 @@ Type H <return> for immediate help}\def~{\errmessage{% \sys_get_shell:nnN { l3sys-query~#1 #2 #3 } { - \int_step_inline:nnn { 0 } { `a - 1 } + \int_step_inline:nnn { 0 } { `A - 1 } { \char_set_catcode_other:n {##1} } - \int_step_inline:nnn { `Z + 1 } { 127 } + \int_step_inline:nnn { `Z + 1 } { `a - 1 } { \char_set_catcode_other:n {##1} } + \int_step_inline:nnn { `z + 1 } { 127 } + { \char_set_catcode_other:n {##1} } + \char_set_catcode_active:n { `\ } \tex_endlinechar:D 13 \scan_stop: } \l__sys_tmp_tl @@ -10042,9 +10045,9 @@ Type H <return> for immediate help}\def~{\errmessage{% { \__prop_put:nNNnn { } \cs_set_nopar:Npe } \cs_new_protected:Npn \prop_gput:Nnn { \__prop_put:nNNnn { } \cs_gset_nopar:Npe } -\cs_new_protected:Npn \prop_put_if_new:Nnn +\cs_new_protected:Npn \prop_put_if_not_in:Nnn { \__prop_put:nNNnn \use_none:nnn \cs_set_nopar:Npe } -\cs_new_protected:Npn \prop_gput_if_new:Nnn +\cs_new_protected:Npn \prop_gput_if_not_in:Nnn { \__prop_put:nNNnn \use_none:nnn \cs_gset_nopar:Npe } \cs_generate_variant:Nn \prop_put:Nnn { @@ -10074,10 +10077,10 @@ Type H <return> for immediate help}\def~{\errmessage{% } \cs_generate_variant:Nn \prop_gput:Nnn { cno , co , coo , cnx , cVx , cxV , cxx } -\cs_generate_variant:Nn \prop_put_if_new:Nnn - { NnV , NV , cnV , cV } -\cs_generate_variant:Nn \prop_gput_if_new:Nnn - { NnV , NV , cnV , cV } +\cs_generate_variant:Nn \prop_put_if_not_in:Nnn + { NnV , NV , c , cnV , cV } +\cs_generate_variant:Nn \prop_gput_if_not_in:Nnn + { NnV , NV , c , cnV , cV } \cs_new_protected:Npn \__prop_put:nNNnn #1#2#3#4#5 { \tl_set:Nn \l__prop_internal_tl @@ -11633,16 +11636,21 @@ Type H <return> for immediate help}\def~{\errmessage{% { \__kernel_tl_set:Nx \l__iow_file_name_tl { \__kernel_file_name_sanitize:n {#2} } + \__kernel_iow_open:No #1 \l__iow_file_name_tl + } +\cs_generate_variant:Nn \iow_open:Nn { NV , c , cV } +\cs_new_protected:Npn \__kernel_iow_open:Nn #1#2 + { \iow_close:N #1 \seq_gpop:NNTF \g__iow_streams_seq \l__iow_stream_tl - { \__iow_open_stream:NV #1 \l__iow_file_name_tl } + { \__iow_open_stream:Nn #1 {#2} } { \__iow_new:N #1 \__kernel_tl_set:Nx \l__iow_stream_tl { \int_eval:n {#1} } - \__iow_open_stream:NV #1 \l__iow_file_name_tl + \__iow_open_stream:Nn #1 {#2} } } -\cs_generate_variant:Nn \iow_open:Nn { NV , c , cV } +\cs_generate_variant:Nn \__kernel_iow_open:Nn { No } \cs_new_protected:Npn \__iow_open_stream:Nn #1#2 { \tex_global:D \tex_chardef:D #1 = \l__iow_stream_tl \scan_stop: @@ -15196,6 +15204,10 @@ Type H <return> for immediate help}\def~{\errmessage{% \__intarray_gset_range:Nw #1 } } +\prg_new_eq_conditional:NNn \intarray_if_exist:N \cs_if_exist:N + { TF , T , F , p } +\prg_new_eq_conditional:NNn \intarray_if_exist:c \cs_if_exist:c + { TF , T , F , p } \cs_new_protected:Npn \intarray_show:N { \__intarray_show:NN \msg_show:nneeee } \cs_generate_variant:Nn \intarray_show:N { c } \cs_new_protected:Npn \intarray_log:N { \__intarray_show:NN \msg_log:nneeee } @@ -22131,6 +22143,10 @@ Type H <return> for immediate help}\def~{\errmessage{% } \cs_new:Npn \__fp_array_item_normal:w #1 #2#3#4#5 #6 ; #7 ; #8 ; #9 { #9 \s__fp \__fp_chk:w 1 #1 {#8} #7 {#2#3#4#5} {#6} ; } +\prg_new_eq_conditional:NNn \fparray_if_exist:N \cs_if_exist:N + { TF , T , F , p } +\prg_new_eq_conditional:NNn \fparray_if_exist:c \cs_if_exist:c + { TF , T , F , p } %% File: l3bitset.dtx \cs_if_exist:NT \@expl@finalise@setup@@ { @@ -22361,9 +22377,13 @@ Type H <return> for immediate help}\def~{\errmessage{% } { \cs_new_protected:Npn \__cctab_new:N #1 - { \intarray_new:Nn #1 { 257 } } + { + \debug_suspend: + \intarray_new:Nn #1 { 257 } + \debug_resume: + } \cs_new_protected:Npn \__cctab_gstore:Nnn #1#2#3 - { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} } + { \intarray_gset:Nnn #1 { #2 + 1 } {#3} } \cs_new_protected:Npn \cctab_new:N #1 { \__kernel_chk_if_free_cs:N #1 @@ -22622,8 +22642,13 @@ Type H <return> for immediate help}\def~{\errmessage{% } \cs_new_protected:Npn \cctab_const:Nn #1#2 { - \cctab_new:N #1 - \cctab_gset:Nn #1 {#2} + \__kernel_chk_if_free_cs:N #1 + \__cctab_new:N #1 + \group_begin: + \cctab_select:N \c_initex_cctab + #2 \scan_stop: + \__cctab_gset:n {#1} + \group_end: } \cs_generate_variant:Nn \cctab_const:Nn { c } \cctab_new:N \c_initex_cctab @@ -31784,33 +31809,130 @@ Type H <return> for immediate help}\def~{\errmessage{% \__pdf_backend_compress_objects:n { \c_false_bool } } } +\int_new:N \g__pdf_backend_object_int \cs_new_protected:Npn \pdf_object_new:n #1 { - \__pdf_backend_object_new:n {#1} - \cs_new_eq:cc - { c__pdf_backend_object_ \tl_to_str:n {#1} _int } - { c__pdf_object_ \tl_to_str:n {#1} _int } + \__pdf_backend_object_new: + \__pdf_object_record:nN {#1} \g__pdf_backend_object_int } \cs_new_protected:Npn \pdf_object_write:nnn #1#2#3 { - \__pdf_backend_object_write:nnn {#1} {#2} {#3} + \exp_args:Ne \__pdf_backend_object_write:nnn + { \__pdf_object_retrieve:n {#1} } {#2} {#3} \bool_gset_true:N \g__pdf_init_bool } \cs_generate_variant:Nn \pdf_object_write:nnn { nne , nnx } -\cs_new:Npn \pdf_object_ref:n #1 { \__pdf_backend_object_ref:n {#1} } -\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2 +\cs_new:Npn \pdf_object_ref:n #1 { - \__pdf_backend_object_now:nn {#1} {#2} - \bool_gset_true:N \g__pdf_init_bool + \exp_args:Ne \__pdf_backend_object_ref:n + { \__pdf_object_retrieve:n {#1} } + } +\cs_new:Npn \__kernel_pdf_object_id:n #1 + { + \exp_args:Ne \__pdf_backend_object_id:n + { \__pdf_object_retrieve:n {#1} } + } +\sys_if_engine_luatex:F + { + \cs_new_protected:Npn \__pdf_object_record:nN #1#2 + { + \int_const:cn + { c__pdf_object_ #1 _int } {#2} + } + \cs_new:Npn \__pdf_object_retrieve:n #1 + { + \int_if_exist:cTF { c__pdf_object_ #1 _int } + { + \int_use:c + { c__pdf_object_ #1 _int } + } + { 0 } + } } -\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { ne , nx } -\cs_new:Npn \pdf_object_ref_last: { \__pdf_backend_object_last: } \prg_new_conditional:Npnn \pdf_object_if_exist:n #1 { p , T , F , TF } { - \int_if_exist:cTF { c__pdf_object_ \tl_to_str:n {#1} _int } - \prg_return_true: + \int_compare:nNnTF { \__pdf_object_retrieve:n {#1} } = 0 \prg_return_false: + \prg_return_true: + } +\cs_new_protected:Npn \pdf_object_new_indexed:nn #1#2 + { + \__pdf_backend_object_new: + \__pdf_object_record:neN {#1} + { \int_eval:n {#2} } \g__pdf_backend_object_int + } +\cs_new_protected:Npn \pdf_object_write_indexed:nnnn #1#2#3#4 + { + \exp_args:Ne \__pdf_backend_object_write:nnn + { \__pdf_object_retrieve:ne {#1} { \int_eval:n {#2} } } {#3} {#4} + \bool_gset_true:N \g__pdf_init_bool + } +\cs_generate_variant:Nn \pdf_object_write_indexed:nnnn { nnne } +\cs_new:Npn \pdf_object_ref_indexed:nn #1#2 + { + \exp_args:Ne \__pdf_backend_object_ref:n + { \__pdf_object_retrieve:ne {#1} { \int_eval:n {#2} } } + } +\cs_new:Npn \__kernel_pdf_object_id_indexed:nn #1#2 + { + \exp_args:Ne \__pdf_backend_object_id:n + { \__pdf_object_retrieve:ne {#1} { \int_eval:n {#2} } } + } +\sys_if_engine_luatex:F + { + \cs_new_protected:Npn \__pdf_object_record:nnN #1#2#3 + { + \use:e + { + \__pdf_object_record:NnN + \__pdf_object_index_split:nn {#1} {#2} + \exp_not:N #3 + } + } + \cs_new_protected:Npn \__pdf_object_record:NnN #1#2#3 + { + \intarray_if_exist:NF #1 + { \intarray_new:Nn #1 \c__pdf_object_block_size_int } + \intarray_gset:Nnn #1 {#2} #3 + } + \cs_new:Npn \__pdf_object_retrieve:nn #1#2 + { + \use:e + { + \exp_not:N \__pdf_object_retrieve:Nn + \__pdf_object_index_split:nn {#1} {#2} + } + } + \cs_new:Npn \__pdf_object_retrieve:Nn #1#2 + { \intarray_item:Nn #1 {#2} } + \cs_new:Npn \__pdf_object_index_split:nn #1#2 + { + \exp_not:c + { + g__pdf_object_ #1 _ + \int_eval:n + { + \int_div_truncate:nn { #2 - 1 } + \c__pdf_object_block_size_int + 1 + } + _intarray + } + { + \int_eval:n + { \int_mod:nn { #2 - 1 } \c__pdf_object_block_size_int + 1 } + } + } + \int_const:Nn \c__pdf_object_block_size_int { 10000 } + } +\cs_generate_variant:Nn \__pdf_object_record:nnN { ne } +\cs_generate_variant:Nn \__pdf_object_retrieve:nn { ne } +\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2 + { + \exp_args:Ne \__pdf_backend_object_now:nn {#1} {#2} + \bool_gset_true:N \g__pdf_init_bool } +\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { ne , nx } +\cs_new:Npn \pdf_object_ref_last: { \__pdf_backend_object_last: } \cs_new:Npn \pdf_pageobject_ref:n #1 { \__pdf_backend_pageobject_ref:n {#1} } \prg_new_conditional:Npnn \pdf_version_compare:Nn #1#2 { p , T , F , TF } @@ -37365,6 +37487,12 @@ Type H <return> for immediate help}\def~{\errmessage{% } } } +\cs_new_protected:Npn \prop_put_if_new:Nnn { \prop_put_if_not_in:Nnn } +\cs_new_protected:Npn \prop_gput_if_new:Nnn { \prop_gput_if_not_in:Nnn } +\cs_generate_variant:Nn \prop_put_if_new:Nnn + { NnV , NV , c , cnV , cV } +\cs_generate_variant:Nn \prop_gput_if_new:Nnn + { NnV , NV , c , cnV , cV } %% %% %% End of file `expl3-code.tex'. diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex index 213c07e7254..dd19a6f698a 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2024-03-14}% +\def\ExplFileDate{2024-04-11}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \catcode`\_=11 diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx b/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx index 6120a015e75..9c853155636 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2024-03-14}% +\def\ExplFileDate{2024-04-11}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \catcode`\_=11 diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.lua b/Master/texmf-dist/tex/latex/l3kernel/expl3.lua index 0ed3d56ab8c..f436dc4daf3 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.lua +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.lua @@ -9,6 +9,7 @@ -- l3sys.dtx (with options: `package,lua') -- l3token.dtx (with options: `package,lua') -- l3intarray.dtx (with options: `package,lua') +-- l3pdf.dtx (with options: `package,lua') -- -- Copyright (C) 1990-2024 The LaTeX Project -- @@ -418,11 +419,11 @@ do [cmd'outer_call' or cmd'tolerant_call'] = true, [cmd'long_outer_call' or cmd'tolerant_protected_call'] = true, [cmd'assign_glue' or cmd'register_glue'] = index_not_nil, - [cmd'assign_mu_glue' or cmd'register_mu_glue'] = index_not_nil, + [cmd'assign_mu_glue' or cmd'register_mu_glue' or cmd'register_muglue'] = index_not_nil, [cmd'assign_toks' or cmd'register_toks'] = index_not_nil, - [cmd'assign_int' or cmd'register_int'] = index_not_nil, + [cmd'assign_int' or cmd'register_int' or cmd'register_integer'] = index_not_nil, [cmd'assign_attr' or cmd'register_attribute'] = true, - [cmd'assign_dimen' or cmd'register_dimen'] = index_not_nil, + [cmd'assign_dimen' or cmd'register_dimen' or cmd'register_dimension'] = index_not_nil, } luacmd("__token_if_primitive_lua:N", function() @@ -569,3 +570,49 @@ luacmd('__intarray_gset_range:w', function() from = from + 1 end end, 'global', 'protected') +-- File: l3pdf.dtx + +local scan_int = token.scan_int +local scan_string = token.scan_string +local cprint = tex.cprint + +local __pdf_objects_named = {} +local __pdf_objects_indexed = {} + +luacmd('__pdf_object_record:nN', function() + local name = scan_string() + local n = scan_int() + __pdf_objects_named[name] = n +end,'protected','global') + +local function object_id(name,index) + if index then + return __pdf_objects_indexed[name][index] or 0 + else + return __pdf_objects_named[name] or 0 + end +end + +luacmd('__pdf_object_retrieve:n', function() + local name = scan_string() + return cprint(12,tostring(object_id(name))) +end,'global') + +ltx.pdf = ltx.pdf or {} +ltx.pdf.object_id = object_id + + +luacmd('__pdf_object_record:nnN', function() + local name = scan_string() + local index = tonumber(scan_string()) + local n = scan_int() + __pdf_objects_indexed[name] = __pdf_objects_indexed[name] or {} + __pdf_objects_indexed[name][index] = n +end,'protected','global') + +luacmd('__pdf_object_retrieve:nn', function() + local name = scan_string() + local index = tonumber(scan_string()) + return cprint(12,tostring(object_id(name,index))) +end,'global') + diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty index 4fcce5872d7..17f9599acdb 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2024-03-14}% +\def\ExplFileDate{2024-04-11}% \let\ExplLoaderFileDate\ExplFileDate \ProvidesPackage{expl3} [% diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3debug.def b/Master/texmf-dist/tex/latex/l3kernel/l3debug.def index dd2820e0385..8b210aa484a 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3debug.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3debug.def @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: l3debug.dtx -\ProvidesExplFile{l3debug.def}{2024-03-14}{}{L3 Debugging support} +\ProvidesExplFile{l3debug.def}{2024-04-11}{}{L3 Debugging support} \scan_new:N \s__debug_stop \cs_new:Npn \__debug_use_i_delimit_by_s_stop:nw #1 #2 \s__debug_stop {#1} \quark_new:N \q__debug_recursion_tail @@ -470,7 +470,7 @@ \prop_pop:NnNF \prop_pop:NnNTF \prop_put:Nnn - \prop_put_if_new:Nnn + \prop_put_if_not_in:Nnn \prop_put_from_keyval:Nn \prop_remove:Nn \prop_set_eq:NN @@ -551,7 +551,7 @@ \prop_gpop:NnNF \prop_gpop:NnNTF \prop_gput:Nnn - \prop_gput_if_new:Nnn + \prop_gput_if_not_in:Nnn \prop_gput_from_keyval:Nn \prop_gremove:Nn \prop_gset_eq:NN diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls index c91ab01446c..55284d08838 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls +++ b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls @@ -20,7 +20,7 @@ %% %% File: l3doc.dtx \RequirePackage{calc} -\ProvidesExplClass{l3doc}{2024-03-14}{} +\ProvidesExplClass{l3doc}{2024-04-11}{} {L3 Experimental documentation class} \clist_new:N \g_docinput_clist \seq_new:N \g_doc_functions_seq @@ -798,6 +798,8 @@ { \tl_remove_all:Ne \l__codedoc_tmpa_tl { \iow_char:N \^^M \c_percent_str } + \tl_remove_all:Ne \l__codedoc_tmpa_tl + { \token_to_str:N \obeyedline \c_space_tl \c_percent_str } \tl_remove_all:Ne \l__codedoc_tmpa_tl { \tl_to_str:n { ^ ^ A } } \tl_remove_all:Ne \l__codedoc_tmpa_tl { \iow_char:N \^^I } \tl_remove_all:Ne \l__codedoc_tmpa_tl { \iow_char:N \^^M } |