summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/l3kernel
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-07-18 03:01:08 +0000
committerNorbert Preining <norbert@preining.info>2020-07-18 03:01:08 +0000
commit63c4f21a5716ebbed11926d0bfbb26d656a766ea (patch)
treec02159e6ceb2453208664129ccda8ff306147328 /macros/latex/contrib/l3kernel
parent4ea983e3d411ade406c09b30ece9139457516b6f (diff)
CTAN sync 202007180301
Diffstat (limited to 'macros/latex/contrib/l3kernel')
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md24
-rw-r--r--macros/latex/contrib/l3kernel/README.md2
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx5
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin585320 -> 584938 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1545894 -> 1555993 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3.ins1
-rw-r--r--macros/latex/contrib/l3kernel/l3alloc.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3candidates.dtx43
-rw-r--r--macros/latex/contrib/l3kernel/l3cctab.dtx891
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx15
-rw-r--r--macros/latex/contrib/l3kernel/l3color-base.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx417
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin263622 -> 263178 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx187
-rw-r--r--macros/latex/contrib/l3kernel/l3final.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3format.ins1
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx17
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx19
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx29
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx48
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx667
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin379248 -> 379235 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin113529 -> 113527 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin140776 -> 140776 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin144784 -> 144785 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin107117 -> 107115 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin105090 -> 105090 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin140797 -> 140795 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin119092 -> 119094 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin152413 -> 152413 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin235323 -> 235322 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin147096 -> 147097 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin165956 -> 165946 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin199153 -> 199139 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.csv5
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin75645 -> 75852 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx48
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx77
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin280369 -> 279956 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin228663 -> 228250 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin186883 -> 217628 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex95
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-purify.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx58
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx42
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin5904224 -> 5865524 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/source3body.tex1
89 files changed, 1579 insertions, 1223 deletions
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index d487068859..1386856157 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,27 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2020-07-17]
+
+### Added
+- `l3cctab` module for using category code tables
+- `\file_parse_full_name:n` and `\file_parse_full_name_apply:nN`
+- Additional `\prop_put:Nnn` variants
+- `\seq_set_map_x:NNn`
+- `\msg_term:nn(nnnn)`
+
+### Fixed
+- File lookup with `\input@path`
+
+### Changed
+- Implementation of `\file_parse_full_name:nNNN` now uses
+ `\file_parse_full_name:n` internally
+- `\seq_set_map:NNn` no longer `x`-expands `<inline function>`
+ (`\seq_set_map_x:NNn` now does that). Both moved to stable.
+
+### Removed
+- Functions deprecated at end of 2019
+
## [2020-06-18]
### Changed
@@ -704,7 +725,8 @@ this project uses date-based 'snapshot' version identifiers.
- Step func­tions have been added for dim vari­ables,
e.g. `\dim_step_in­line:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-06-18...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-07-17...HEAD
+[2020-07-17]: https://github.com/latex3/latex3/compare/2020-06-18...2020-07-17
[2020-06-18]: https://github.com/latex3/latex3/compare/2020-06-03...2020-06-18
[2020-06-03]: https://github.com/latex3/latex3/compare/2020-05-15...2020-06-03
[2020-05-15]: https://github.com/latex3/latex3/compare/2020-05-14...2020-05-15
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index 8ff01699d7..bfd238bcce 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2020-06-18
+Release 2020-07-17
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 0710d88c5d..e1a36c6db5 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2020-06-18}%
+\def\ExplFileDate{2020-07-17}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -423,6 +423,7 @@
% \item[bool] either true or false (the \LaTeX3 implementation does
% not use \tn{iftrue} or \tn{iffalse});
% \item[box] box register;
+% \item[cctab] category code table;
% \item[clist] comma separated list;
% \item[coffin] a \enquote{box with handles} --- a higher-level data
% type for carrying out |box| alignment operations;
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 18721992ab..d76040d2bd 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index 8f3d8ec787..3c44cfaf5e 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index 2c600d4696..467d04cf86 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -54,7 +54,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3.ins b/macros/latex/contrib/l3kernel/l3.ins
index 04d1e18a34..e54fe0cb51 100644
--- a/macros/latex/contrib/l3kernel/l3.ins
+++ b/macros/latex/contrib/l3kernel/l3.ins
@@ -95,6 +95,7 @@ and all files in that bundle must be distributed together.
\from{l3fp-convert.dtx} {package}
\from{l3fp-random.dtx} {package}
\from{l3fparray.dtx} {package}
+ \from{l3cctab.dtx} {package}
\from{l3sort.dtx} {package}
\from{l3str-convert.dtx}{package}
\from{l3tl-analysis.dtx}{package}
diff --git a/macros/latex/contrib/l3kernel/l3alloc.dtx b/macros/latex/contrib/l3kernel/l3alloc.dtx
index 4fdce60bdc..8f60b563f7 100644
--- a/macros/latex/contrib/l3kernel/l3alloc.dtx
+++ b/macros/latex/contrib/l3kernel/l3alloc.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index c871aeb759..3cee7e2e9e 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index 8ff412298c..5043d39d56 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index a30bed22c7..e604fe5e4f 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index a307cb02df..d8d6bf6808 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -426,24 +426,6 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[added = 2011-12-22]
-% {\seq_set_map:NNn, \seq_gset_map:NNn}
-% \begin{syntax}
-% \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
-% \end{syntax}
-% Applies \meta{inline function} to every \meta{item} stored
-% within the \meta{sequence_2}. The \meta{inline function} should
-% consist of code which will receive the \meta{item} as |#1|.
-% The sequence resulting from \texttt{x}-expanding
-% \meta{inline function} applied to each \meta{item}
-% is assigned to \meta{sequence_1}. As such, the code
-% in \meta{inline function} should be expandable.
-% \begin{texnote}
-% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
-% be used in this function, and would lead to low-level \TeX{} errors.
-% \end{texnote}
-% \end{function}
-%
% \begin{function}[added = 2018-04-06]
% {\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
% \begin{syntax}
@@ -622,7 +604,8 @@
% \cs{tl_build_end:N} \meta{tl~var}
% \end{syntax}
% Gets the contents of \meta{tl~var} and stores that into the
-% \meta{tl~var} using \cs{tl_set:Nn}. The \meta{tl~var} must have
+% \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}.
+% The \meta{tl~var} must have
% been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
% The |end| and |gend| functions must be used for local and global
% \meta{tl~var} respectively. These functions completely remove the
@@ -1145,26 +1128,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
-% \begin{macro}{\@@_set_map:NNNn}
-% Very similar to \cs{seq_set_filter:NNn}. We could actually
-% merge the two within a single function, but it would have weird
-% semantics.
-% \begin{macrocode}
-\cs_new_protected:Npn \seq_set_map:NNn
- { \@@_set_map:NNNn \tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_map:NNn
- { \@@_set_map:NNNn \tl_gset:Nx }
-\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
- {
- \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
- #1 #2 { #3 }
- \@@_pop_item_def:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
% \begin{macro}{\@@_set_from_inline_x:NNnn}
% Set \cs{@@_item:n} then map it using the loop code.
diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/contrib/l3kernel/l3cctab.dtx
new file mode 100644
index 0000000000..25becd59fd
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3cctab.dtx
@@ -0,0 +1,891 @@
+% \iffalse meta-comment
+%
+%% File: l3cctab.dtx
+%
+% Copyright (C) 2018-2020 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \pkg{l3cctab} package\\ Category code tables^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2020-07-17}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% A category code table enables rapid switching of all category codes in
+% one operation. For \LuaTeX{}, this is possible over the entire Unicode
+% range. For other engines, only the $8$-bit range ($0$--$255$) is covered by
+% such tables.
+%
+% \section{Creating and initialising category code tables}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_new:N,\cctab_new:c}
+% \begin{syntax}
+% \cs{cctab_new:N} \meta{category code table}
+% \end{syntax}
+% Creates a new \meta{category code table} variable or raises an error if
+% the name is already taken. The declaration is global. The
+% \meta{category code table} is initialised with the codes
+% as used by \IniTeX{}.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-07]{\cctab_const:Nn,\cctab_const:cn}
+% \begin{syntax}
+% \cs{cctab_const:Nn} \meta{category code table} \Arg{category code set up}
+% \end{syntax}
+% Creates a new \meta{category code table}, applies (in a group) the
+% \meta{category code set up} on top of \IniTeX{} settings,
+% then saves them globally as a constant
+% table. The \meta{category code set up} can include a call to
+% \cs{cctab_select:N}.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-07]{\cctab_gset:Nn,\cctab_gset:cn}
+% \begin{syntax}
+% \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up}
+% \end{syntax}
+% Starting from the \IniTeX{} category codes,
+% applies (in a group) the \meta{category code set up}, then saves them
+% globally in the \meta{category code table}. The \meta{category code set up}
+% can include a call to \cs{cctab_select:N}.
+% \end{function}
+%
+% \section{Using category code tables}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_begin:N,\cctab_begin:c}
+% \begin{syntax}
+% \cs{cctab_begin:N} \meta{category code table}
+% \end{syntax}
+% Switches locally the category codes in force to those stored in the
+% \meta{category code table}. The prevailing codes before the
+% function is called are added to a stack, for use with
+% \cs{cctab_end:}. This function does not start a \TeX{} group.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_end:}
+% \begin{syntax}
+% \cs{cctab_end:}
+% \end{syntax}
+% Ends the scope of a \meta{category code table} started using
+% \cs{cctab_begin:N}, returning the codes to those in force before the
+% matching \cs{cctab_begin:N} was used. This must be used within the
+% same \TeX{} group (and at the same \TeX{} group level) as the
+% matching \cs{cctab_begin:N}.
+% \end{function}
+%
+% \begin{function}[added = 2020-05-19, updated = 2020-07-02]{\cctab_select:N}
+% \begin{syntax}
+% \cs{cctab_select:N} \meta{category code table}
+% \end{syntax}
+% Selects the \meta{category code table} for the scope of the current
+% group. This is in particular useful in the \meta{setup} arguments
+% of \cs{tl_set_rescan:Nnn}, \cs{tl_rescan:nn}, \cs{cctab_const:Nn},
+% and \cs{cctab_gset:Nn}.
+% \end{function}
+%
+% \section{Category code table conditionals}
+%
+% \begin{function}[pTF]{\cctab_if_exist:N, \cctab_if_exist:c}
+% \begin{syntax}
+% \cs{cctab_if_exist_p:N} \meta{category code table}
+% \cs{cctab_if_exist:NTF} \meta{category code table} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether the \meta{category code table} is currently defined.
+% This does not check that the \meta{category code table} really is a
+% category code table.
+% \end{function}
+%
+% \section{Constant category code tables}
+%
+% \begin{variable}[updated = 2020-07-10]{\c_code_cctab}
+% Category code table for the \pkg{expl3} code environment; this does
+% \emph{not} include \texttt{@}, which is retained as an \enquote{other}
+% character.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-08]{\c_document_cctab}
+% Category code table for a standard \LaTeX{} document, as set by the \LaTeX{}
+% kernel. In particular, the upper-half of the $8$-bit range will be set to
+% \enquote{active} with \pdfTeX{} \emph{only}. No \pkg{babel} shorthands
+% will be activated.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_initex_cctab}
+% Category code table as set up by \IniTeX{}.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_other_cctab}
+% Category code table where all characters have category code $12$
+% (other).
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_str_cctab}
+% Category code table where all characters have category code $12$
+% (other) with the exception of spaces, which have category code
+% $10$ (space).
+% \end{variable}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3cctab} implementation}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=cctab>
+% \end{macrocode}
+%
+% As \LuaTeX{} offers engine support for category code tables, and this
+% is entirely lacking from the other engines, we need two complementary
+% approaches. (Some future \XeTeX{} may add support, at which point the
+% conditionals below would be different.)
+%
+% \subsection{Variables}
+%
+% \begin{variable}{\g_@@_stack_seq, \g_@@_unused_seq}
+% List of catcode tables saved by nested \cs{cctab_begin:N}, to
+% restore catcodes at the matching \cs{cctab_end:}. When popped from
+% the \cs{g_@@_stack_seq} the table numbers are stored in
+% \cs{g_@@_unused_seq} for later reuse.
+% \begin{macrocode}
+\seq_new:N \g_@@_stack_seq
+\seq_new:N \g_@@_unused_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_group_seq}
+% A stack to store the group level when a catcode table started.
+% \begin{macrocode}
+\seq_new:N \g_@@_group_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_allocate_int}
+% Integer to keep track of what category code table to allocate. In
+% \LuaTeX{} it is only used in format mode to implement
+% \cs{cctab_new:N}. In other engines it is used to make csnames for
+% dynamic tables.
+% \begin{macrocode}
+\int_new:N \g_@@_allocate_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_internal_a_tl,\l_@@_internal_b_tl}
+% Scratch space. For instance, when popping
+% \cs{g_@@_stack_seq}/\cs{g_@@_unused_seq}, consists of the
+% catcodetable number (integer denotation) in \LuaTeX{}, or of an
+% intarray variable (as a single token) in other engines.
+% \begin{macrocode}
+\tl_new:N \l_@@_internal_a_tl
+\tl_new:N \l_@@_internal_b_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_endlinechar_prop}
+% In \LuaTeX{} we store the \tn{endlinechar} associated to each
+% \tn{catcodetable} in a property list, unless it is the default
+% value~$13$.
+% \begin{macrocode}
+\prop_new:N \g_@@_endlinechar_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Allocating category code tables}
+%
+% \begin{macro}{\cctab_new:N, \cctab_new:c, \@@_new:N, \@@_gstore:Nnn}
+% The \cs{@@_new:N} auxiliary allocates a new catcode table but does
+% not attempt to set its value consistently across engines. It is
+% used both in \cs{cctab_new:N}, which sets catcodes to \IniTeX{}
+% values, and in \cs{cctab_begin:N}/\cs{cctab_end:} for dynamically
+% allocated tables.
+%
+% First, the \LuaTeX{} case.
+% Creating a new category code table is done like other registers.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \cctab_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new:N #1
+ }
+%<*initex>
+ \cs_new_protected:Npn \@@_new:N #1
+ {
+ \int_gincr:N \g_@@_allocate_int
+ \int_compare:nNnTF
+ \g_@@_allocate_int > \c_max_register_int
+ {
+ \__kernel_msg_fatal:nnx
+ { kernel } { out-of-registers } { cctab }
+ }
+ {
+ \tex_global:D \tex_chardef:D #1 \g_@@_allocate_int
+ \tex_initcatcodetable:D #1
+ }
+ }
+%</initex>
+%<*package>
+ \cs_new_eq:NN \@@_new:N \newcatcodetable
+%</package>
+ }
+% \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
+% 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 } }
+ \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
+ { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} }
+ \cs_new_protected:Npn \cctab_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new:N #1
+ \int_step_inline:nn { 256 }
+ { \__kernel_intarray_gset:Nnn #1 {##1} { 12 } }
+ \__kernel_intarray_gset:Nnn #1 { 257 } { 13 }
+ \@@_gstore:Nnn #1 { 0 } { 9 }
+ \@@_gstore:Nnn #1 { 13 } { 5 }
+ \@@_gstore:Nnn #1 { 32 } { 10 }
+ \@@_gstore:Nnn #1 { 37 } { 14 }
+ \int_step_inline:nnn { 65 } { 90 }
+ { \@@_gstore:Nnn #1 {##1} { 11 } }
+ \@@_gstore:Nnn #1 { 92 } { 0 }
+ \int_step_inline:nnn { 97 } { 122 }
+ { \@@_gstore:Nnn #1 {##1} { 11 } }
+ \@@_gstore:Nnn #1 { 127 } { 15 }
+ }
+ }
+\cs_generate_variant:Nn \cctab_new:N { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Saving category code tables}
+%
+% \begin{macro}{\@@_gset:n, \@@_gset_aux:n}
+% In various functions we need to save the current catcodes (globally)
+% in a table. In \LuaTeX{}, saving the catcodes is a primitives, but
+% the \tn{endlinechar} needs more work: to avoid filling
+% \cs{g_@@_endlinechar_prop} with many entries we special-case the
+% default value $13$. In other engines we store $256$ current
+% catcodes and the \tn{endlinechar} in an intarray variable.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_gset:n #1
+ { \exp_args:Nf \@@_gset_aux:n { \int_eval:n {#1} } }
+ \cs_new_protected:Npn \@@_gset_aux:n #1
+ {
+ \tex_savecatcodetable:D #1 \scan_stop:
+ \int_compare:nNnTF { \tex_endlinechar:D } = { 13 }
+ { \prop_gremove:Nn \g_@@_endlinechar_prop {#1} }
+ {
+ \prop_gput:NnV \g_@@_endlinechar_prop {#1}
+ \tex_endlinechar:D
+ }
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_gset:n #1
+ {
+ \int_step_inline:nn { 256 }
+ {
+ \__kernel_intarray_gset:Nnn #1 {##1}
+ { \char_value_catcode:n { ##1 - 1 } }
+ }
+ \__kernel_intarray_gset:Nnn #1 { 257 }
+ { \tex_endlinechar:D }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cctab_gset:Nn, \cctab_gset:cn}
+% Category code tables are always global, so only one version of
+% assignments is needed. Simply run the setup in a group and save the
+% result in a category code table~|#1|, provided it is valid. The
+% internal function is defined above depending on the engine.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_gset:Nn #1#2
+ {
+ \@@_chk_if_valid:NT #1
+ {
+ \group_begin:
+ \cctab_select:N \c_initex_cctab
+ #2 \scan_stop:
+ \@@_gset:n {#1}
+ \group_end:
+ }
+ }
+\cs_generate_variant:Nn \cctab_gset:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Using category code tables}
+%
+% \begin{variable}{\g_@@_internal_cctab}
+% \begin{macro}[EXP]{\@@_internal_cctab_name:}
+% In \LuaTeX{}, we must ensure that the saved tables are read-only.
+% This is done by applying the saved table, then switching immediately
+% to a scratch table. Any later catcode assignment will affect that
+% scratch table rather than the saved one. If we simply switched to
+% the saved tables, then \cs{char_set_catcode_other:N} in the example
+% below would change \cs{c_document_cctab} and a later use of that
+% table would give the wrong category code to |_|.
+% \begin{verbatim}
+% \use:n
+% {
+% \cctab_begin:N \c_document_cctab
+% \char_set_catcode_other:N \_
+% \cctab_end:
+% \cctab_begin:N \c_document_cctab
+% \int_compare:nTF { \char_value_catcode:n { `_ } = 8 }
+% { \TRUE } { \ERROR }
+% \cctab_end:
+% }
+% \end{verbatim}
+% We must also make sure that a scratch table is never reused in a
+% nested group: in the following example, the scratch table used by
+% the first \cs{cctab_begin:N} would be changed globally by the second
+% one issuing \tn{savecatcodetable}, and after \cs{group_end:} the
+% wrong category codes (those of \cs{c_str_cctab}) would be imposed.
+% Note that the inner \cs{cctab_end:} restores the correct catcodes
+% only locally, so the problem really comes up because of the
+% different grouping level. The simplest is to use a scratch table
+% labeled by the \tn{currentgrouplevel}. We initialize one of them as
+% an example.
+% \begin{verbatim}
+% \use:n
+% {
+% \cctab_begin:N \c_document_cctab
+% \group_begin:
+% \cctab_begin:N \c_str_cctab
+% \cctab_end:
+% \group_end:
+% \cctab_end:
+% }
+% \end{verbatim}
+% \begin{macrocode}
+\sys_if_engine_luatex:T
+ {
+ \@@_new:N \g_@@_internal_cctab
+ \cs_new:Npn \@@_internal_cctab_name:
+ {
+ g_@@_internal
+ \tex_romannumeral:D \tex_currentgrouplevel:D
+ _cctab
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}{\cctab_select:N, \cctab_select:c}
+% \begin{macro}{\@@_select:N}
+% The public function simply checks the \meta{cctab~var} exists before
+% using the engine-dependent \cs{@@_select:N}. Skipping these checks
+% would result in low-level engine-dependent errors. First, the
+% \LuaTeX{} case. In other engines, selecting a catcode table is a matter
+% of doing $256$ catcode assignments and setting the \tn{endlinechar}.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_select:N #1
+ { \@@_chk_if_valid:NT #1 { \@@_select:N #1 } }
+\cs_generate_variant:Nn \cctab_select:N { c }
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_select:N #1
+ {
+ \tex_catcodetable:D #1
+ \prop_get:NVNTF \g_@@_endlinechar_prop #1 \l_@@_internal_a_tl
+ { \int_set:Nn \tex_endlinechar:D { \l_@@_internal_a_tl } }
+ { \int_set:Nn \tex_endlinechar:D { 13 } }
+ \cs_if_exist:cF { \@@_internal_cctab_name: }
+ { \exp_args:Nc \@@_new:N { \@@_internal_cctab_name: } }
+ \exp_args:Nc \tex_savecatcodetable:D { \@@_internal_cctab_name: }
+ \exp_args:Nc \tex_catcodetable:D { \@@_internal_cctab_name: }
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_select:N #1
+ {
+ \int_step_inline:nn { 256 }
+ {
+ \char_set_catcode:nn { ##1 - 1 }
+ { \__kernel_intarray_item:Nn #1 {##1} }
+ }
+ \int_set:Nn \tex_endlinechar:D
+ { \__kernel_intarray_item:Nn #1 { 257 } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_next_cctab}
+% \begin{macro}{\@@_begin_aux:}
+% For \cs{cctab_begin:N}/\cs{cctab_end:} we will need to allocate
+% dynamic tables. This is done here by \cs{@@_begin_aux:}, which puts
+% a table number (in \LuaTeX{}) or name (in other engines) into
+% \cs{l_@@_internal_a_tl}. In \LuaTeX{} this simply calls \cs{@@_new:N}
+% and uses the resulting catcodetable number; in other engines we need
+% to give a name to the intarray variable and use that. In \LuaTeX{},
+% to restore catcodes at \cs{cctab_end:} we cannot just set
+% \tn{catcodetable} to its value before \cs{cctab_begin:N}, because
+% that table may have been altered by other code in the mean time. So
+% we must make sure to save the catcodes in a table we control and
+% restore them at \cs{cctab_end:}.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_begin_aux:
+ {
+ \@@_new:N \g_@@_next_cctab
+ \tl_set:NV \l_@@_internal_a_tl \g_@@_next_cctab
+ \cs_undefine:N \g_@@_next_cctab
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_begin_aux:
+ {
+ \int_gincr:N \g_@@_allocate_int
+ \exp_args:Nc \@@_new:N
+ { g_@@_ \int_use:N \g_@@_allocate_int _cctab }
+ \exp_args:NNc \tl_set:Nn \l_@@_internal_a_tl
+ { g_@@_ \int_use:N \g_@@_allocate_int _cctab }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}{\cctab_begin:N, \cctab_begin:c}
+% Check the \meta{cctab~var} exists, to avoid low-level errors. Get
+% in \cs{l_@@_internal_a_tl} the number/name of a dynamic table, either
+% from \cs{g_@@_unused_seq} where we save tables that are not
+% currently in use, or from \cs{@@_begin_aux:} if none are available.
+% Then save the current catcodes into the table (pointed to by)
+% \cs{l_@@_internal_a_tl} and save that table number in a stack before
+% selecting the desired catcodes.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_begin:N #1
+ {
+ \@@_chk_if_valid:NT #1
+ {
+ \seq_gpop:NNF \g_@@_unused_seq \l_@@_internal_a_tl
+ { \@@_begin_aux: }
+ \exp_args:Nx \@@_chk_group_begin:n
+ { \@@_nesting_number:N \l_@@_internal_a_tl }
+ \seq_gpush:NV \g_@@_stack_seq \l_@@_internal_a_tl
+ \exp_args:NV \@@_gset:n \l_@@_internal_a_tl
+ \@@_select:N #1
+ }
+ }
+\cs_generate_variant:Nn \cctab_begin:N { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cctab_end:}
+% Make sure a \cs{cctab_begin:N} was used some time earlier, get in
+% \cs{l_@@_internal_a_tl} the catcode table number/name in which the
+% prevailing catcodes were stored, then restore these catcodes. The
+% dynamic table is now unused hence stored in \cs{g_@@_unused_seq} for
+% recycling by later \cs{cctab_begin:N}.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_end:
+ {
+ \seq_gpop:NNTF \g_@@_stack_seq \l_@@_internal_a_tl
+ {
+ \seq_gpush:NV \g_@@_unused_seq \l_@@_internal_a_tl
+ \exp_args:Nx \@@_chk_group_end:n
+ { \@@_nesting_number:N \l_@@_internal_a_tl }
+ \@@_select:N \l_@@_internal_a_tl
+ }
+ { \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_chk_group_begin:n,\@@_chk_group_end:n}
+% Catcode tables are not allowed to be intermixed with groups, so here
+% we check that they are properly nested regarding \TeX{} groups.
+% \cs{@@_chk_group_begin:n} stores the current group level in a stack,
+% and locally defines a dummy control sequence
+% \cs[no-index]{@@_group_\meta{cctab-level}_chk:}.
+%
+% \cs{@@_chk_group_end:n} pops the stack, and compares the returned
+% value with \cs{tex_currentgrouplevel:D}. If they differ,
+% \cs{cctab_end:} is in a different grouping level than the matching
+% \cs{cctab_begin:N}. If they are the same, both happened at the same
+% level, however a group might have ended and another started between
+% \cs{cctab_begin:N} and \cs{cctab_end:}:
+% \begin{verbatim}
+% \group_begin:
+% \cctab_begin:N \c_document_cctab
+% \group_end:
+% \group_begin:
+% \cctab_end:
+% \group_end:
+% \end{verbatim}
+% In this case checking \cs{tex_currentgrouplevel:D} is not enough, so
+% we locally define \cs[no-index]{@@_group_\meta{cctab-level}_chk:},
+% and then check if it exist in \cs{cctab_end:}. If it doesn't,
+% we know there was a group end where it shouldn't.
+%
+% The \meta{cctab-level} in the sentinel macro above cannot be
+% replaced by the more convenient \cs{tex_currentgrouplevel:D} because
+% with the latter we might be tricked. Suppose:
+% \begin{verbatim}
+% \group_begin:
+% \cctab_begin:N \c_code_cctab % A
+% \group_end:
+% \group_begin:
+% \cctab_begin:N \c_code_cctab % B
+% \cctab_end: % C
+% \cctab_end: % D
+% \group_end:
+% \end{verbatim}
+% The line marked with |A| would start a |cctab| with a sentinel token
+% named \cs[no-index]{@@_group_1_chk:}, which would disappear at the
+% \cs{group_end:} that follows. But |B| would create the same
+% sentinel token, since both are at the same group level. Line |C|
+% would end the |cctab| from line |B| correctly, but so would line |D|
+% because line |B| created the same sentinel token. Using
+% \meta{cctab-level} works correctly because it signals that certain
+% |cctab| level was activated somewhere, but if it doesn't exist when
+% the \cs{cctab_end:} is reached, we had a problem.
+%
+% Unfortunately these tests only flag the wrong usage at the
+% \cs{cctab_end:}, which might be far from the \cs{cctab_begin:N}.
+% However it isn't possible to signal the wrong usage at the
+% \cs{group_end:} without using \cs{tex_aftergroup:D}, which is
+% unsafe in certain types of groups.
+%
+% The three cases checked here just raise an error, and no recovery is
+% attempted: usually interleaving groups and catcode tables will work
+% predictably.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_chk_group_begin:n #1
+ {
+ \seq_gpush:Nx \g_@@_group_seq
+ { \int_use:N \tex_currentgrouplevel:D }
+ \cs_set_eq:cN { @@_group_ #1 _chk: } \prg_do_nothing:
+ }
+\cs_new_protected:Npn \@@_chk_group_end:n #1
+ {
+ \seq_gpop:NN \g_@@_group_seq \l_@@_internal_b_tl
+ \bool_lazy_and:nnF
+ {
+ \int_compare_p:nNn
+ { \tex_currentgrouplevel:D } = { \l_@@_internal_b_tl }
+ }
+ { \cs_if_exist_p:c { @@_group_ #1 _chk: } }
+ {
+ \__kernel_msg_error:nnx { kernel } { cctab-group-mismatch }
+ {
+ \int_sign:n
+ { \tex_currentgrouplevel:D - \l_@@_internal_b_tl }
+ }
+ }
+ \cs_undefine:c { @@_group_ #1 _chk: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_nesting_number:N,\@@_nesting_number:w}
+% This macro returns the numeric index of the current catcode table.
+% In \LuaTeX{} this is just the argument, which is a count reference
+% to a \tn{catcodetable} register. In other engines, the number is
+% extracted from the |cctab| variable.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ { \cs_new:Npn \@@_nesting_number:N #1 {#1} }
+ {
+ \cs_new:Npn \@@_nesting_number:N #1
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN \@@_nesting_number:w
+ \exp_after:wN \token_to_str:N #1
+ }
+ \use:x
+ {
+ \cs_new:Npn \exp_not:N \@@_nesting_number:w
+ ##1 \tl_to_str:n { g_@@_ } ##2 \tl_to_str:n { _cctab } {##2}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% Finally, install some code at the end of the \TeX{} run to check that
+% all \cs{cctab_begin:N} were ended by some \cs{cctab_end:}.
+% \begin{macrocode}
+\cs_if_exist:NT \hook_gput_code:nnn
+ {
+ \hook_gput_code:nnn { enddocument/end } { kernel }
+ {
+ \seq_if_empty:NF \g_@@_stack_seq
+ { \__kernel_msg_error:nn { kernel } { cctab-missing-end } }
+ }
+ }
+% \end{macrocode}
+%
+% \subsection{Category code table conditionals}
+%
+% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c}
+% Checks whether a \meta{cctab~var} is defined.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N
+ { TF , T , F , p }
+\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c
+ { TF , T , F , p }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_chk_if_valid:N}
+% \begin{macro}{\@@_chk_if_valid_aux:NTF}
+% Checks whether the argument is defined and whether it is a valid
+% \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var}
+% is checked by the engine, which complains if the argument is not a
+% \cs{chardef}'ed constant. In other engines, check if the given
+% command is an intarray variable (the underlying definition is a copy
+% of the \texttt{cmr10} font).
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
+ { TF , T , F }
+ {
+ \cctab_if_exist:NTF #1
+ {
+ \@@_chk_if_valid_aux:NTF #1
+ { \prg_return_true: }
+ {
+ \__kernel_msg_error:nnx { kernel } { invalid-cctab }
+ { \token_to_str:N #1 }
+ \prg_return_false:
+ }
+ }
+ {
+ \__kernel_msg_error:nnx { kernel } { command-not-defined }
+ { \token_to_str:N #1 }
+ \prg_return_false:
+ }
+ }
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1
+ {
+%<*initex>
+ \bool_lazy_and:nnTF
+ { \int_if_odd_p:n {#1} }
+ { \int_compare_p:nNn {#1-1} < { \g_@@_allocate_int } }
+%</initex>
+%<*package>
+ \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count }
+%</package>
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1
+ {
+ \exp_args:Nf \str_if_in:nnTF
+ { \cs_meaning:N #1 }
+ { select~font~cmr10~at~ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \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.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_const:Nn #1#2
+ {
+ \cctab_new:N #1
+ \cctab_gset:Nn #1 {#2}
+ }
+\cs_generate_variant:Nn \cctab_const:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}
+% {
+% \c_initex_cctab ,
+% \c_other_cctab ,
+% \c_str_cctab
+% }
+% Creating category code tables means thinking starting from \IniTeX{}.
+% For all-other and the standard \enquote{string} tables that's easy.
+% \begin{macrocode}
+\cctab_new:N \c_initex_cctab
+\cctab_const:Nn \c_other_cctab
+ {
+ \cctab_select:N \c_initex_cctab
+ \int_set:Nn \tex_endlinechar:D { -1 }
+ \int_step_inline:nnn { 0 } { 127 }
+ { \char_set_catcode_other:n {#1} }
+ }
+\cctab_const:Nn \c_str_cctab
+ {
+ \cctab_select:N \c_other_cctab
+ \char_set_catcode_space:n { 32 }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_document_cctab, \c_other_cctab}
+% To pick up document-level category codes, we need to delay set up to the
+% end of the format, where that's possible. Also, as there are a \emph{lot}
+% of category codes to set, we avoid using the official interface and store the
+% document codes using internal code. Depending on whether we are in the hook
+% or not, the catcodes may be code or document, so we explicitly set up both
+% correctly.
+% \begin{macrocode}
+\cs_if_exist:NTF \@expl@finalise@setup@@@@
+ { \tl_gput_right:Nn \@expl@finalise@setup@@@@ }
+ { \use:n }
+ {
+ \@@_new:N \c_code_cctab
+ \group_begin:
+ \int_set:Nn \tex_endlinechar:D { 32 }
+ \char_set_catcode_invalid:n { 0 }
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: }
+ { \int_step_function:nN { 31 } \char_set_catcode_invalid:n }
+ { \int_step_function:nN { 31 } \char_set_catcode_active:n }
+ \int_step_function:nnN { 33 } { 64 } \char_set_catcode_other:n
+ \int_step_function:nnN { 65 } { 90 } \char_set_catcode_letter:n
+ \int_step_function:nnN { 91 } { 96 } \char_set_catcode_other:n
+ \int_step_function:nnN { 97 } { 122 } \char_set_catcode_letter:n
+ \char_set_catcode_ignore:n { 9 } % tab
+ \char_set_catcode_other:n { 10 } % lf
+ \char_set_catcode_active:n { 12 } % ff
+ \char_set_catcode_end_line:n { 13 } % cr
+ \char_set_catcode_ignore:n { 32 } % space
+ \char_set_catcode_parameter:n { 35 } % hash
+ \char_set_catcode_math_toggle:n { 36 } % dollar
+ \char_set_catcode_comment:n { 37 } % percent
+ \char_set_catcode_alignment:n { 38 } % ampersand
+ \char_set_catcode_letter:n { 58 } % colon
+ \char_set_catcode_escape:n { 92 } % backslash
+ \char_set_catcode_math_superscript:n { 94 } % circumflex
+ \char_set_catcode_letter:n { 95 } % underscore
+ \char_set_catcode_group_begin:n { 123 } % left brace
+ \char_set_catcode_other:n { 124 } % pipe
+ \char_set_catcode_group_end:n { 125 } % right brace
+ \char_set_catcode_space:n { 126 } % tilde
+ \char_set_catcode_invalid:n { 127 } % ^^?
+ \@@_gset:n { \c_code_cctab }
+ \group_end:
+ \cctab_const:Nn \c_document_cctab
+ {
+ \cctab_select:N \c_code_cctab
+ \int_set:Nn \tex_endlinechar:D { 13 }
+ \char_set_catcode_space:n { 9 }
+ \char_set_catcode_space:n { 32 }
+ \char_set_catcode_other:n { 58 }
+ \char_set_catcode_math_subscript:n { 95 }
+ \char_set_catcode_active:n { 126 }
+ }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Messages}
+%
+% \begin{macrocode}
+\__kernel_msg_new:nnnn { kernel } { cctab-stack-full }
+ { The~category~code~table~stack~is~exhausted. }
+ {
+ LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~
+ but~there~is~no~more~space~to~do~this!
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-extra-end }
+ { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. }
+ {
+ LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~
+ \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored.
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-missing-end }
+ { Missing~\iow_char:N\\cctab_end:~before~end~of~TeX~run. }
+ {
+ LaTeX~came~across~more~\iow_char:N\\cctab_begin:N~than~
+ \iow_char:N\\cctab_end:.
+ }
+\__kernel_msg_new:nnnn { kernel } { invalid-cctab }
+ { Invalid~\iow_char:N\\catcode~table. }
+ {
+ You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~
+ initialized~using~\iow_char:N\\cctab_new:N~or~
+ \iow_char:N\\cctab_const:Nn.
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-group-mismatch }
+ {
+ \iow_char:N\\cctab_end:~occurred~in~a~
+ \int_case:nn {#1}
+ {
+ { 0 } { different~group }
+ { 1 } { higher~group~level }
+ { -1 } { lower~group~level }
+ } ~than~
+ the~matching~\iow_char:N\\cctab_begin:N.
+ }
+ {
+ Catcode~tables~and~groups~must~be~properly~nested,~but~
+ you~tried~to~interleave~them.~LaTeX~will~try~to~proceed,~
+ but~results~may~be~unexpected.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</initex|package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+%\PrintIndex
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index a05860e286..da18711b6e 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index b19b71f3f9..8c9f29e93b 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -2233,9 +2233,6 @@
% flexible.
% \begin{macrocode}
\tl_new:N \l_@@_display_font_tl
-%<*initex>
-\tl_set:Nn \l_@@_display_font_tl { } % TODO
-%</initex>
%<*package>
\tl_set:Nn \l_@@_display_font_tl { \sffamily \tiny }
%</package>
@@ -2263,7 +2260,7 @@
\hcoffin_set:Nn \l_@@_display_pole_coffin
{
%<*initex>
- \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO
+ \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: }
%</initex>
%<*package>
\@@_color:n {#4}
@@ -2274,9 +2271,6 @@
\l_@@_display_pole_coffin { hc } { vc } { 0pt } { 0pt }
\hcoffin_set:Nn \l_@@_display_coord_coffin
{
-%<*initex>
- % TODO
-%</initex>
%<*package>
\@@_color:n {#4}
%</package>
@@ -2332,7 +2326,7 @@
\hcoffin_set:Nn \l_@@_display_pole_coffin
{
%<*initex>
- \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO
+ \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: }
%</initex>
%<*package>
\@@_color:n {#2}
@@ -2377,9 +2371,6 @@
{ 0pt } { 0pt }
\hcoffin_set:Nn \l_@@_display_coord_coffin
{
-%<*initex>
- % TODO
-%</initex>
%<*package>
\@@_color:n {#6}
%</package>
diff --git a/macros/latex/contrib/l3kernel/l3color-base.dtx b/macros/latex/contrib/l3kernel/l3color-base.dtx
index 178cd98b19..a01acb8fa1 100644
--- a/macros/latex/contrib/l3kernel/l3color-base.dtx
+++ b/macros/latex/contrib/l3kernel/l3color-base.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index 3aa7eb3998..632e62e58b 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -865,6 +865,7 @@
\box_gset_eq:NN
\box_gset_eq_drop:NN
\box_gset_to_last:N
+ \cctab_gset:Nn
\clist_gset_eq:NN
\dim_gset_eq:NN
\dim_gzero:N
@@ -926,6 +927,7 @@
{ }
{
\bool_const:Nn
+ \cctab_const:Nn
\dim_const:Nn
\int_const:Nn
\intarray_const_from_clist:Nn
@@ -961,6 +963,10 @@
\__kernel_patch:nnn
{ \__kernel_chk_var_scope:NN g #1 }
{ }
+ { \cctab_new:N }
+ \__kernel_patch:nnn
+ { \__kernel_chk_var_scope:NN g #1 }
+ { }
{ \intarray_new:Nn }
\__kernel_patch:nnn
{ \__kernel_chk_var_scope:NN q #1 }
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index 012e0d3208..8faf863504 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -402,6 +402,52 @@
{ \c_sys_jobname_str } { 2017-01-01 }
\@@_old:Nnn \c_minus_one
{ -1 } { 2019-01-01 }
+\@@_old:Nnn \c_zero
+ { 0 } { 2020-01-01 }
+\@@_old:Nnn \c_one
+ { 1 } { 2020-01-01 }
+\@@_old:Nnn \c_two
+ { 2 } { 2020-01-01 }
+\@@_old:Nnn \c_three
+ { 3 } { 2020-01-01 }
+\@@_old:Nnn \c_four
+ { 4 } { 2020-01-01 }
+\@@_old:Nnn \c_five
+ { 5 } { 2020-01-01 }
+\@@_old:Nnn \c_six
+ { 6 } { 2020-01-01 }
+\@@_old:Nnn \c_seven
+ { 7 } { 2020-01-01 }
+\@@_old:Nnn \c_eight
+ { 8 } { 2020-01-01 }
+\@@_old:Nnn \c_nine
+ { 9 } { 2020-01-01 }
+\@@_old:Nnn \c_ten
+ { 10 } { 2020-01-01 }
+\@@_old:Nnn \c_eleven
+ { 11 } { 2020-01-01 }
+\@@_old:Nnn \c_twelve
+ { 12 } { 2020-01-01 }
+\@@_old:Nnn \c_thirteen
+ { 13 } { 2020-01-01 }
+\@@_old:Nnn \c_fourteen
+ { 14 } { 2020-01-01 }
+\@@_old:Nnn \c_fifteen
+ { 15 } { 2020-01-01 }
+\@@_old:Nnn \c_sixteen
+ { 16 } { 2020-01-01 }
+\@@_old:Nnn \c_thirty_two
+ { 32 } { 2020-01-01 }
+\@@_old:Nnn \c_one_hundred
+ { 100 } { 2020-01-01 }
+\@@_old:Nnn \c_two_hundred_fifty_five
+ { 255 } { 2020-01-01 }
+\@@_old:Nnn \c_two_hundred_fifty_six
+ { 256 } { 2020-01-01 }
+\@@_old:Nnn \c_one_thousand
+ { 1000 } { 2020-01-01 }
+\@@_old:Nnn \c_ten_thousand
+ { 10000 } { 2020-01-01 }
\@@_old:Nnn \dim_case:nnn
{ \dim_case:nnF } { 2015-07-14 }
\@@_old:Nnn \file_add_path:nN
@@ -442,6 +488,12 @@
{ \iow_show_list: } { 2019-01-01 }
\@@_old:Nnn \iow_log_streams:
{ \iow_log_list: } { 2019-01-01 }
+\@@_old:Nnn \lua_escape_x:n
+ { \lua_escape:e } { 2020-01-01 }
+\@@_old:Nnn \lua_now_x:n
+ { \lua_now:e } { 2020-01-01 }
+\@@_old_protected:Nnn \lua_shipout_x:n
+ { \lua_shipout_e:n } { 2020-01-01 }
\@@_old:Nnn \luatex_if_engine_p:
{ \sys_if_engine_luatex_p: } { 2017-01-01 }
\@@_old:Nnn \luatex_if_engine:F
@@ -450,6 +502,12 @@
{ \sys_if_engine_luatex:T } { 2017-01-01 }
\@@_old:Nnn \luatex_if_engine:TF
{ \sys_if_engine_luatex:TF } { 2017-01-01 }
+\@@_old_protected:Nnn \msg_interrupt:nnn
+ { [Defined~error~message] } { 2020-01-01 }
+\@@_old_protected:Nnn \msg_log:n
+ { \iow_log:n } { 2020-01-01 }
+\@@_old_protected:Nnn \msg_term:n
+ { \iow_term:n } { 2020-01-01 }
\@@_old:Nnn \pdftex_if_engine_p:
{ \sys_if_engine_pdftex_p: } { 2017-01-01 }
\@@_old:Nnn \pdftex_if_engine:F
@@ -476,8 +534,28 @@
{ \str_case:nnF } { 2015-07-14 }
\@@_old:Nnn \str_case:onn
{ \str_case:onF } { 2015-07-14 }
+\@@_old:Nnn \str_case_x:nn
+ { \str_case_e:nn } { 2020-01-01 }
\@@_old:Nnn \str_case_x:nnn
{ \str_case_e:nnF } { 2015-07-14 }
+\@@_old:Nnn \str_case_x:nnT
+ { \str_case_e:nnT } { 2020-01-01 }
+\@@_old:Nnn \str_case_x:nnTF
+ { \str_case_e:nnTF } { 2020-01-01 }
+\@@_old:Nnn \str_case_x:nnF
+ { \str_case_e:nnF } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x_p:nn
+ { \str_if_eq_p:ee } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnT
+ { \str_if_eq:eeT } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnF
+ { \str_if_eq:eeF } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnTF
+ { \str_if_eq:eeTF } { 2020-01-01 }
+\@@_old_protected:Nnn \tl_show_analysis:N
+ { \tl_analysis_show:N } { 2020-01-01 }
+\@@_old_protected:Nnn \tl_show_analysis:n
+ { \tl_analysis_show:n } { 2020-01-01 }
\@@_old:Nnn \tl_case:cnn
{ \tl_case:cnF } { 2015-07-14 }
\@@_old:Nnn \tl_case:Nnn
@@ -499,70 +577,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated primitives}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\etex_beginL:D}
-% \begin{macro}{\@@_primitive:NN, \@@_primitive:w}
-% We renamed all primitives to \cs[no-index]{tex_\ldots{}:D} so all
-% others are deprecated. In \pkg{l3names}, \cs{__kernel_primitives:}
-% is defined to contain \cs{__kernel_primitive:NN} \cs{beginL}
-% \cs{etex_beginL:D} and so on, one for each deprecated primitive. We
-% apply \cs{exp_not:N} to the second argument of
-% \cs{__kernel_primitive:NN} because it may be outer (both when doing
-% and undoing deprecation actually), then \cs{@@_primitive:NN} uses
-% \cs{tex_let:D} to change the meaning of this potentially outer
-% token. Then, either turn it into an error or make it equal to the
-% primitive~|#1|. To be more precise, |#1| may not be defined, so try
-% a \cs[no-index]{tex_\ldots{}:D} command as well.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_primitive:NN #1#2 { }
-\exp_last_unbraced:NNNNo
- \cs_new:Npn \@@_primitive:w #1 { \token_to_str:N _ } { }
-\__kernel_deprecation_code:nn
- {
- \cs_set_protected:Npn \__kernel_primitive:NN #1
- {
- \exp_after:wN \@@_primitive:NN
- \exp_after:wN #1
- \exp_not:N
- }
- \cs_set_protected:Npn \@@_primitive:NN #1#2
- {
- \tex_let:D #2 \scan_stop:
- \exp_args:NNx \__kernel_deprecation_error:Nnn #2
- {
- \iow_char:N \\
- \cs_if_exist:NTF #1
- { \cs_to_str:N #1 }
- {
- tex_
- \exp_last_unbraced:Nf
- \@@_primitive:w { \cs_to_str:N #2 }
- }
- }
- { 2020-01-01 }
- }
- \__kernel_primitives:
- }
- {
- \cs_set_protected:Npn \__kernel_primitive:NN #1
- {
- \exp_after:wN \@@_primitive:NN
- \exp_after:wN #1
- \exp_not:N
- }
- \cs_set_protected:Npn \@@_primitive:NN #1#2
- {
- \tex_let:D #2 #1
- \cs_if_exist:cT { tex_ \cs_to_str:N #1 :D }
- { \cs_set_eq:Nc #2 { tex_ \cs_to_str:N #1 :D } }
- }
- \__kernel_primitives:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Loading the patches}
%
% When loaded first, the patches are simply read here.
@@ -646,243 +660,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated \pkg{l3int} functions}
-%
-% \begin{macrocode}
-%<@@=int>
-% \end{macrocode}
-%
-% \begin{variable}[deprecated = 2020-07-01]
-% {
-% \c_zero, \c_one, \c_two, \c_three, \c_four, \c_five, \c_six,
-% \c_seven, \c_eight, \c_nine, \c_ten, \c_eleven, \c_twelve,
-% \c_thirteen, \c_fourteen, \c_fifteen, \c_sixteen, \c_thirty_two,
-% \c_one_hundred, \c_two_hundred_fifty_five,
-% \c_two_hundred_fifty_six, \c_one_thousand, \c_ten_thousand,
-% }
-% \begin{macro}{\@@_deprecated_constants:nn}
-% Constants that are now deprecated. By default define them with
-% \cs{int_const:Nn}. To deprecate them call for instance
-% \cs{__kernel_deprecation_error:Nnn} \cs{c_zero} |{0}|
-% |{2020-01-01}|. To redefine them (locally), use
-% \cs{@@_constdef:Nw}, with an \cs{exp_not:N} construction because the
-% constants themselves are outer at that point.
-% \begin{macrocode}
-\cs_gset_protected:Npn \@@_deprecated_constants:nn #1#2
- {
- #1 \c_zero { 0 } #2
- #1 \c_one { 1 } #2
- #1 \c_two { 2 } #2
- #1 \c_three { 3 } #2
- #1 \c_four { 4 } #2
- #1 \c_five { 5 } #2
- #1 \c_six { 6 } #2
- #1 \c_seven { 7 } #2
- #1 \c_eight { 8 } #2
- #1 \c_nine { 9 } #2
- #1 \c_ten { 10 } #2
- #1 \c_eleven { 11 } #2
- #1 \c_twelve { 12 } #2
- #1 \c_thirteen { 13 } #2
- #1 \c_fourteen { 14 } #2
- #1 \c_fifteen { 15 } #2
- #1 \c_sixteen { 16 } #2
- #1 \c_thirty_two { 32 } #2
- #1 \c_one_hundred { 100 } #2
- #1 \c_two_hundred_fifty_five { 255 } #2
- #1 \c_two_hundred_fifty_six { 256 } #2
- #1 \c_one_thousand { 1000 } #2
- #1 \c_ten_thousand { 10000 } #2
- }
-\cs_set_protected:Npn \@@_deprecated_constants:Nn #1#2
- {
- \cs_if_free:NT #1
- { \int_const:Nn #1 {#2} }
- }
-\@@_deprecated_constants:nn { \@@_deprecated_constants:Nn } { }
-\__kernel_deprecation_code:nn
- {
- \@@_deprecated_constants:nn
- { \exp_after:wN \__kernel_deprecation_error:Nnn \exp_not:N }
- { { 2020-01-01 } }
- }
- {
- \@@_deprecated_constants:nn
- {
- \exp_after:wN \use:nnn
- \exp_after:wN \@@_constdef:Nw \exp_not:N
- }
- { \exp_stop_f: }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{variable}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\@@_value:w}
-% Made public.
-% \begin{macrocode}
-\cs_gset_eq:NN \@@_value:w \int_value:w
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3luatex} functions}
-%
-% \begin{macrocode}
-%<@@=lua>
-% \end{macrocode}
-%
-% \begin{macro}[EXP, deprecated = 2020-07-01]{\lua_now_x:n, \lua_escape_x:n}
-% \begin{macro}[deprecated = 2020-07-01]{\lua_shipout_x:n}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_now:e }
-\cs_gset:Npn \lua_now_x:n #1 { \@@_now:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_escape:e }
-\cs_gset:Npn \lua_escape_x:n #1 { \@@_escape:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_shipout_e:n }
-\cs_gset_protected:Npn \lua_shipout_x:n #1 { \@@_shipout:n {#1} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3msg} functions}
-%
-% \begin{macrocode}
-%<@@=msg>
-% \end{macrocode}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\msg_log:n, \msg_term:n}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_log:n }
-\cs_gset_protected:Npn \msg_log:n #1
- {
- \iow_log:n { ................................................. }
- \iow_wrap:nnnN { . ~ #1} { . ~ } { } \iow_log:n
- \iow_log:n { ................................................. }
- }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_term:n }
-\cs_gset_protected:Npn \msg_term:n #1
- {
- \iow_term:n { ************************************************* }
- \iow_wrap:nnnN { * ~ #1} { * ~ } { } \iow_term:n
- \iow_term:n { ************************************************* }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\msg_interrupt:nnn}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { [Defined~error~message] }
-\cs_gset_protected:Npn \msg_interrupt:nnn #1#2#3
- {
- \tl_if_empty:nTF {#3}
- {
- \@@_old_interrupt_wrap:nn { \\ \c_@@_no_info_text_tl }
- {#1 \\\\ #2 \\\\ \c_@@_continue_text_tl }
- }
- {
- \@@_old_interrupt_wrap:nn { \\ #3 }
- {#1 \\\\ #2 \\\\ \c_@@_help_text_tl }
- }
- }
-\cs_gset_protected:Npn \@@_old_interrupt_wrap:nn #1#2
- {
- \iow_wrap:nnnN {#1} { | ~ } { } \@@_old_interrupt_more_text:n
- \iow_wrap:nnnN {#2} { ! ~ } { } \@@_old_interrupt_text:n
- }
-\cs_gset_protected:Npn \@@_old_interrupt_more_text:n #1
- {
- \exp_args:Nx \tex_errhelp:D
- {
- |'''''''''''''''''''''''''''''''''''''''''''''''
- #1 \iow_newline:
- |...............................................
- }
- }
-\group_begin:
- \char_set_lccode:nn {`\{} {`\ }
- \char_set_lccode:nn {`\}} {`\ }
- \char_set_lccode:nn {`\&} {`\!}
- \char_set_catcode_active:N \&
-\tex_lowercase:D
- {
- \group_end:
- \cs_gset_protected:Npn \@@_old_interrupt_text:n #1
- {
- \iow_term:x
- {
- \iow_newline:
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- \iow_newline:
- !
- }
- \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J }
- {
- \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
- {
- \group_begin:
- \cs_set_protected:Npn &
- {
- \tex_errmessage:D
- {
- #1
- \use_none:n
- { ............................................ }
- }
- }
- \exp_after:wN
- \group_end:
- &
- }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3prg} functions}
-%
-% \begin{macrocode}
-%<@@=prg>
-% \end{macrocode}
-%
-% \begin{macro}[deprecated = 2020-07-01]
-% {
-% \@@_break_point:Nn,
-% \@@_break_point:,
-% \@@_map_break:Nn,
-% \@@_break:,
-% \@@_break:n
-% }
-% Made public, but used by a few third-parties. It's not possible to
-% perfectly support a mixture of \cs{@@_map_break:Nn} and
-% \cs{prg_map_break:Nn} because they use different delimiters. The
-% following code only breaks if someone tries to break from two
-% \enquote{old-style} \cs{@@_map_break:Nn} \ldots{}
-% \cs{@@_break_point:Nn} mappings in one go. Basically, the
-% \cs{@@_map_break:Nn} converts a single \cs{@@_break_point:Nn} to
-% \cs{prg_break_point:Nn}, and that delimiter had better be the right
-% one. Then we call \cs{prg_map_break:Nn} which may end up breaking
-% intermediate looks in the (unbraced) argument |#1|. It is essential
-% to define the |break_point| functions before the corresponding
-% |break| functions: otherwise \cs{debug_on:n} |{deprecation}|
-% \cs{debug_off:n} |{deprecation}| would break when trying to restore
-% the definitions because they would involve deprecated commands whose
-% definition has not yet been restored.
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point:Nn }
-\cs_gset:Npn \@@_break_point:Nn { \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point: }
-\cs_gset:Npn \@@_break_point: { \prg_break_point: }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_map_break:Nn }
-\cs_gset:Npn \@@_map_break:Nn #1 \@@_break_point:Nn
- { \prg_map_break:Nn #1 \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break: }
-\cs_gset:Npn \@@_break: #1 \@@_break_point: { }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break:n }
-\cs_gset:Npn \@@_break:n #1#2 \@@_break_point: {#1}
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Deprecated \pkg{l3str} functions}
%
% \begin{macro}[EXP, deprecated = 2022-07-01]
@@ -907,29 +684,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP, deprecated = 2020-07-01, noTF]{\str_case_x:nn}
-% \begin{macro}[EXP, deprecated = 2020-07-01, pTF]{\str_if_eq_x:nn}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nn }
-\cs_gset:Npn \str_case_x:nn { \str_case_e:nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnT }
-\cs_gset:Npn \str_case_x:nnT { \str_case_e:nnT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnF }
-\cs_gset:Npn \str_case_x:nnF { \str_case_e:nnF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnTF }
-\cs_gset:Npn \str_case_x:nnTF { \str_case_e:nnTF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq_p:ee }
-\cs_gset:Npn \str_if_eq_x_p:nn { \str_if_eq_p:ee }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeT }
-\cs_gset:Npn \str_if_eq_x:nnT { \str_if_eq:eeT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeF }
-\cs_gset:Npn \str_if_eq_x:nnF { \str_if_eq:eeF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeTF }
-\cs_gset:Npn \str_if_eq_x:nnTF { \str_if_eq:eeTF }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Deprecated \pkg{l3seq} functions}
%
% \begin{macro}[EXP, deprecated = 2023-01-01]
@@ -1023,19 +777,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated \pkg{l3tl-analysis} functions}
-%
-% \begin{macro}[deprecated = 2020-07-01]
-% {\tl_show_analysis:N, \tl_show_analysis:n}
-% Simple renames.
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:N }
-\cs_gset_protected:Npn \tl_show_analysis:N { \tl_analysis_show:N }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:n }
-\cs_gset_protected:Npn \tl_show_analysis:n { \tl_analysis_show:n }
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Deprecated \pkg{l3token} functions}
%
% \begin{macro}[EXP, deprecated = 2021-07-01]
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index ffb7269f49..0954108c96 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -79,7 +79,7 @@ and all files in that bundle must be distributed together.
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
% \maketitle
% \tableofcontents
%
@@ -3368,7 +3368,7 @@ and all files in that bundle must be distributed together.
{
\seq_set_map:NNn \l_@@_tmpa_seq
\g_@@_nested_names_seq
- { \exp_not:n { \@@_macro_end_wrap_item:n {##1} } }
+ { \@@_macro_end_wrap_item:n {##1} }
End~ definition~ for~
\int_compare:nTF { \seq_count:N \l_@@_tmpa_seq <= 3 }
{
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index a334b443d0..bf56cdd54f 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index 52aaff704f..4c59fc9770 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index df60bcd3ab..e902085148 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index c189e4bdd9..7ee7df5347 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -677,7 +677,7 @@
% If the file is not found on the path, the expansion is empty.
% \end{function}
%
-% \begin{function}[added = 2017-06-23, updated = 2017-06-26]
+% \begin{function}[added = 2017-06-23, updated = 2020-06-24]
% {\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
% \begin{syntax}
% \cs{file_parse_full_name:nNNN} \Arg{full name} \meta{dir} \meta{name} \meta{ext}
@@ -697,9 +697,28 @@
% \item The \meta{ext}: everything after the last |.| (including the dot).
% The \meta{ext} is empty if there is no |.| after the last |/|.
% \end{itemize}
-% This function does not expand the \meta{full name} before turning it
-% to a string. It assume that the \meta{full name} either contains no
-% quote (|"|) characters or is surrounded by a pair of quotes.
+%
+% Before parsing, the \meta{full name} is expanded until only non-expandable
+% tokens remain, except that active characters are also not expanded.
+% Quotes (|"|) are invalid in file names and are discarded from the input.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name:n}
+% \begin{syntax}
+% \cs{file_parse_full_name:n} \Arg{full name}
+% \end{syntax}
+% Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN},
+% and leaves \meta{dir}, \meta{name}, and \meta{ext} in the input stream,
+% each inside a pair of braces.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name_apply:nN}
+% \begin{syntax}
+% \cs{file_parse_full_name_apply:nN} \Arg{full name} \meta{function}
+% \end{syntax}
+% Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN},
+% and passes \meta{dir}, \meta{name}, and \meta{ext} as arguments to \meta{function},
+% as an \texttt{n}-type argument each, in this order.
% \end{function}
%
% \begin{function}[rEXP, added = 2019-11-19]
@@ -2682,8 +2701,8 @@
% \end{macro}
%
% \begin{macro}[EXP]{\file_full_name:n, \@@_full_name:n}
-% \begin{macro}[EXP]{\@@_full_name_aux:nn}
-% \begin{macro}[EXP]{\@@_full_name_aux:n}
+% \begin{macro}[EXP]{\@@_full_name_aux:Nnn}
+% \begin{macro}[EXP]{\@@_full_name_aux:nN}
% \begin{macro}[EXP]{\@@_name_cleanup:w}
% \begin{macro}[EXP]{\@@_name_end:}
% \begin{macro}[EXP]{\@@_name_ext_check:n}
@@ -2714,12 +2733,12 @@
\tl_if_blank:eTF { \@@_size:n {#1} }
{
\seq_map_tokens:Nn \l_file_search_path_seq
- { \@@_full_name_aux:nn {#1} }
+ { \@@_full_name_aux:Nnn \seq_map_break:n {#1} }
%<*package>
\cs_if_exist:NT \input@path
{
\tl_map_tokens:Nn \input@path
- { \@@_full_name_aux:nn {#1} }
+ { \@@_full_name_aux:Nnn \tl_map_break:n {#1} }
}
%</package>
\@@_name_end:
@@ -2731,13 +2750,13 @@
% Two pars to the auxiliary here so we can avoid doing quoting
% twice in the event we find the right file.
% \begin{macrocode}
-\cs_new:Npn \@@_full_name_aux:nn #1#2
- { \exp_args:Ne \@@_full_name_aux:n { \tl_to_str:n {#2} / #1 } }
-\cs_new:Npn \@@_full_name_aux:n #1
+\cs_new:Npn \@@_full_name_aux:Nnn #1#2#3
+ { \exp_args:Ne \@@_full_name_aux:nN { \tl_to_str:n {#3} / #2 } #1 }
+\cs_new:Npn \@@_full_name_aux:nN #1 #2
{
\tl_if_blank:eF { \@@_size:n {#1} }
{
- \seq_map_break:n
+ #2
{
\@@_ext_check:n {#1}
\@@_name_cleanup:w
@@ -3358,63 +3377,113 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
-% \begin{macro}
-% {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF}
-% Parsing starts by stripping off any surrounding quotes. Then find
-% the directory |#4| by splitting at the last~|/|. (The auxiliary
-% returns \texttt{true}/\texttt{false} depending on whether it found
-% the delimiter.) We correct for the case of a file in the root |/|,
-% as in that case we wish to keep the trailing (and only) slash. Then
-% split the base name |#5| at the last dot. If there was indeed a
-% dot, |#5| contains the name and |#6| the extension without the dot,
-% which we add back for convenience. In the special case of no
-% extension given, the auxiliary stored the name into |#6|, we just
-% have to move it to |#5|.
-% \begin{macrocode}
-\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
- {
- \exp_after:wN \@@_parse_full_name_auxi:w
- \tl_to_str:n { #1 " #1 " } \s_@@_stop #2#3#4
+% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name_apply:nN}
+% The main parsing macro \cs{file_parse_full_name_apply:nN} passes the
+% file name |#1| through \cs{__kernel_file_name_sanitize:n} so that we
+% have a single normalised way to treat files internally.
+% \cs{file_parse_full_name:n} uses the former, with
+% \cs{prg_do_nothing:} to
+% leave each part of the name within a pair of braces.
+% \begin{macrocode}
+\cs_new:Npn \file_parse_full_name:n #1
+ {
+ \file_parse_full_name_apply:nN {#1}
+ \prg_do_nothing:
}
-\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
-\cs_new_protected:Npn \@@_parse_full_name_auxi:w
- #1 " #2 " #3 \s_@@_stop #4#5#6
- {
- \@@_parse_full_name_split:nNNNTF {#2} / #4 #5
- { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
- { }
- \exp_args:No \@@_parse_full_name_split:nNNNTF {#5} . #5 #6
- { \str_put_left:Nn #6 { . } }
- {
- \str_set_eq:NN #5 #6
- \str_clear:N #6
- }
+\cs_new:Npn \file_parse_full_name_apply:nN #1
+ {
+ \exp_args:Ne \@@_parse_full_name_auxi:nN
+ { \__kernel_file_name_sanitize:n {#1} }
}
-\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_auxi:nN}
+% \begin{macro}{\@@_parse_full_name_area:nw}
+% \cs{@@_parse_full_name_area:nw} splits the file name into chunks
+% separated by |/|, until the last one is reached. The last chunk is
+% the file name plus the extension, and everything before that is the
+% path. When \cs{@@_parse_full_name_area:nw} is done, it leaves
+% the path within braces after the scan mark \cs{s_@@_stop} and
+% proceeds parsing the actual file name.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_auxi:nN #1
{
- \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \s_@@_stop
+ \@@_parse_full_name_area:nw { } #1
+ / \s_@@_stop
+ }
+\cs_new:Npn \@@_parse_full_name_area:nw #1 #2 / #3 \s_@@_stop
+ {
+ \tl_if_empty:nTF {#3}
+ { \@@_parse_full_name_base:nw { } #2 . \s_@@_stop {#1} }
+ { \@@_parse_full_name_area:nw { #1 / #2 } #3 \s_@@_stop }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_base:nw}
+% \cs{@@_parse_full_name_base:nw} does roughly the same as above, but
+% it separates the chunks at each period. However here there's some
+% extra complications: In case |#1| is empty, it is assumed that the
+% extension is actually empty, and the file name is |#2|. Besides, an
+% extra |.| has to be added to |#2| because it is later removed in
+% \cs{@@_parse_full_name_tidy:nnnN}. In any case, if there's an
+% extension, it is returned with a leading |.|.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_base:nw #1 #2 . #3 \s_@@_stop
+ {
+ \tl_if_empty:nTF {#3}
{
- \tl_if_empty:nTF {##3}
+ \tl_if_empty:nTF {#1}
{
- \str_set:Nn #4 {##2}
- \tl_if_empty:nTF {##1}
- {
- \str_clear:N #3
- \use_ii:nn
- }
- {
- \str_set:Nx #3 { \str_tail:n {##1} }
- \use_i:nn
- }
+ \tl_if_empty:nTF {#2}
+ { \@@_parse_full_name_tidy:nnnN { } { } }
+ { \@@_parse_full_name_tidy:nnnN { .#2 } { } }
}
- { \@@_tmp:w { ##1 #2 ##2 } ##3 \s_@@_stop }
+ { \@@_parse_full_name_tidy:nnnN {#1} { .#2 } }
}
- \@@_tmp:w { } #1 #2 \s_@@_stop
+ { \@@_parse_full_name_base:nw { #1 . #2 } #3 \s_@@_stop }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_tidy:nnnN}
+% Now we just need to tidy some bits left loose before. The loop
+% used in the two macros above start with a leading |/| and |.| in the
+% file path an name, so here we need to remove them, except in the
+% path, if it is a single |/|, in which case it's left as is. After
+% all's done, pass to |#4|.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_tidy:nnnN #1 #2 #3 #4
+ {
+ \exp_args:Nee #4
+ {
+ \str_if_eq:nnF {#3} { / } { \use_none:n }
+ #3 \prg_do_nothing:
+ }
+ { \use_none:n #1 \prg_do_nothing: }
+ {#2}
}
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
+% \begin{macrocode}
+\cs_new_protected:Npn \file_parse_full_name:nNNN #1 #2 #3 #4
+ {
+ \file_parse_full_name_apply:nN {#1}
+ \@@_full_name_assign:nnnNNN #2 #3 #4
+ }
+\cs_new_protected:Npn \@@_full_name_assign:nnnNNN #1 #2 #3 #4 #5 #6
+ {
+ \str_set:Nn #4 {#1}
+ \str_set:Nn #5 {#2}
+ \str_set:Nn #6 {#3}
+ }
+\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\file_show_list:, \file_log_list:, \@@_list:N}
% \begin{macro}[EXP]{\@@_list_aux:n}
diff --git a/macros/latex/contrib/l3kernel/l3final.dtx b/macros/latex/contrib/l3kernel/l3final.dtx
index 5f3a74fb0d..809850d1a5 100644
--- a/macros/latex/contrib/l3kernel/l3final.dtx
+++ b/macros/latex/contrib/l3kernel/l3final.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index de8f7b5046..0d68f05eee 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3format.ins b/macros/latex/contrib/l3kernel/l3format.ins
index 99e9389728..0671ed9ee6 100644
--- a/macros/latex/contrib/l3kernel/l3format.ins
+++ b/macros/latex/contrib/l3kernel/l3format.ins
@@ -95,6 +95,7 @@ and all files in that bundle must be distributed together.
\from{l3fp-convert.dtx} {initex}
\from{l3fp-random.dtx} {initex}
\from{l3fparray.dtx} {initex}
+ \from{l3cctab.dtx} {initex}
\from{l3sort.dtx} {initex}
\from{l3str-convert.dtx}{initex}
\from{l3tl-analysis.dtx}{initex}
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index 3ef09ee2c7..73e28d4b3f 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index adce22a426..09a876ee8d 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index fd1cffd494..68cb42369d 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index 8c8d474918..a07e4fb982 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index 93835e8c71..aafc77e1a6 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index 67960e47fe..498da7895c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index 26c7ed784a..13457604be 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index 28257218e7..c3125a8478 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -1643,7 +1643,7 @@
% \end{macro}
%
% \begin{macro}[rEXP]
-% {\@@_parse_exponent:N, \@@_parse_exponent_aux:N}
+% {\@@_parse_exponent:N, \@@_parse_exponent_aux:NN}
% This function should be called within an \cs{int_value:w}
% expansion (or within an integer expression). It leaves digits of the
% exponent behind it in the input stream, and terminates the expansion
@@ -1657,22 +1657,23 @@
\cs_new:Npn \@@_parse_exponent:N #1
{
\if:w e \if:w E \exp_not:N #1 e \else: \exp_not:N #1 \fi:
- \exp_after:wN \@@_parse_exponent_aux:N
+ \exp_after:wN \@@_parse_exponent_aux:NN
+ \exp_after:wN #1
\exp:w
\else:
0 \@@_parse_return_semicolon:w #1
\fi:
\@@_parse_expand:w
}
-\cs_new:Npn \@@_parse_exponent_aux:N #1
+\cs_new:Npn \@@_parse_exponent_aux:NN #1#2
{
- \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1
- 0 \else: `#1 \fi: > `9 \exp_stop_f:
- 0 \exp_after:wN ; \exp_after:wN e
+ \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #2
+ 0 \else: `#2 \fi: > `9 \exp_stop_f:
+ 0 \exp_after:wN ; \exp_after:wN #1
\else:
\exp_after:wN \@@_parse_exponent_sign:N
\fi:
- #1
+ #2
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 25e1d1cb9d..062f0d59b4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index 281e5339d0..ef2092959b 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index 6c68c6181e..40332fc340 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index dcf57a15f9..a9c9600244 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index 81b652565a..b76089b5c6 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index da04ae867c..be62eac38b 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index a3d0ca4a8f..7384a5f257 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index 6ab5647a82..7a96ed2873 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -266,29 +266,28 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNn}
+% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNnw}
% The functions \cs{intarray_gset:Nnn} and \cs{intarray_item:Nn} share
% bounds checking. The |T| branch is used if |#3| is within bounds of
% the array |#2|.
% \begin{macrocode}
-\cs_new:Npn \@@_bounds:NNnTF #1#2#3#4#5
+\cs_new:Npn \@@_bounds:NNnTF #1#2#3
{
\if_int_compare:w 1 > #3 \exp_stop_f:
- \@@_bounds_error:NNn #1 #2 {#3}
- #5
+ \@@_bounds_error:NNnw #1 #2 {#3}
\else:
\if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f:
- \@@_bounds_error:NNn #1 #2 {#3}
- #5
- \else:
- #4
+ \@@_bounds_error:NNnw #1 #2 {#3}
\fi:
\fi:
+ \use_i:nn
}
-\cs_new:Npn \@@_bounds_error:NNn #1#2#3
+\cs_new:Npn \@@_bounds_error:NNnw #1#2#3#4 \use_i:nn #5#6
{
+ #4
#1 { kernel } { out-of-bounds }
{ \token_to_str:N #2 } {#3} { \intarray_count:N #2 }
+ #6
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index e63035f68e..c73b661cfc 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -162,6 +162,33 @@
% than once.
% \end{function}
%
+% \begin{function}[added = 2018-03-31]{\__kernel_intarray_gset:Nnn}
+% \begin{syntax}
+% \cs{__kernel_intarray_gset:Nnn} \meta{intarray~var} \Arg{index} \Arg{value}
+% \end{syntax}
+% Faster version of \cs{intarray_gset:Nnn}. Stores the \meta{value}
+% into the \meta{integer array variable} at the \meta{position}. The
+% \meta{index} and \meta{value} must be suitable for a direct
+% assignment to a \TeX{} count register, for instance expanding to an
+% integer denotation or obtained through the primitive \tn{numexpr}
+% (which may be un-terminated). No bound checking is performed: the
+% caller is responsible for ensuring that the \meta{position} is
+% between $1$ and the \cs{intarray_count:N}, and the \meta{value}'s
+% absolute value is at most $2^{30}-1$. Assignments are always
+% global.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2018-03-31]{\__kernel_intarray_item:Nn}
+% \begin{syntax}
+% \cs{__kernel_intarray_item:Nn} \meta{intarray~var} \Arg{index}
+% \end{syntax}
+% Faster version of \cs{intarray_item:Nn}. Expands to the integer
+% entry stored at the \meta{index} in the \meta{integer array
+% variable}. The \meta{index} must be suitable for a direct
+% assignment to a \TeX{} count register and must be between $1$ and
+% the \cs{intarray_count:N}, lest a low-level \TeX{} error occur.
+% \end{function}
+%
% \begin{function}{\__kernel_ior_open:Nn, \__kernel_ior_open:No}
% \begin{syntax}
% \cs{__kernel_ior_open:Nn} \meta{stream} \Arg{file name}
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index c9dd6209f6..77fa7d1aff 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index 0a71938f2b..c0fbef3745 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index 56181c77b8..298ecee05e 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index f7182ea092..5cbc7e9b09 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -404,6 +404,27 @@
% is briefer than \cs{msg_info:nnnnnn}.
% \end{function}
%
+% \begin{function}[added = 2020-07-16]
+% {
+% \msg_term:nnnnnn ,
+% \msg_term:nnnnn ,
+% \msg_term:nnnn ,
+% \msg_term:nnn ,
+% \msg_term:nn ,
+% \msg_term:nnxxxx ,
+% \msg_term:nnxxx ,
+% \msg_term:nnxx ,
+% \msg_term:nnx
+% }
+% \begin{syntax}
+% \cs{msg_term:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues \meta{module} information \meta{message}, passing
+% \meta{arg one} to \meta{arg four} to the text-creating functions.
+% The information text is printed on the terminal (and added to the
+% log file): the output is similar to that of \cs{msg_log:nnnnnn}.
+% \end{function}
+%
% \begin{function}[updated = 2012-08-11]
% {
% \msg_none:nnnnnn ,
@@ -1214,6 +1235,31 @@
%
% \begin{macro}
% {
+% \msg_term:nnnnnn ,
+% \msg_term:nnnnn ,
+% \msg_term:nnnn ,
+% \msg_term:nnn ,
+% \msg_term:nn ,
+% \msg_term:nnxxxx ,
+% \msg_term:nnxxx ,
+% \msg_term:nnxx ,
+% \msg_term:nnx
+% }
+% \enquote{Term} is used for communicating with the user through the
+% terminal, like diagnostic messages, and debugging. This is similar
+% to \enquote{log} messages, but uses the terminal output.
+% \begin{macrocode}
+ \@@_class_new:nn { term }
+ {
+ \iow_wrap:nnnN
+ { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
+ { } { } \iow_term:n
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
% \msg_none:nnnnnn ,
% \msg_none:nnnnn ,
% \msg_none:nnnn ,
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index 3a49253af6..03a9f2ae2b 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -600,9 +600,7 @@
\@@_primitive:NN \pdfuniqueresname \tex_pdfuniqueresname:D
\@@_primitive:NN \pdfvorigin \tex_pdfvorigin:D
\@@_primitive:NN \pdfxform \tex_pdfxform:D
- \@@_primitive:NN \pdfxformattr \tex_pdfxformattr:D
\@@_primitive:NN \pdfxformname \tex_pdfxformname:D
- \@@_primitive:NN \pdfxformresources \tex_pdfxformresources:D
\@@_primitive:NN \pdfximage \tex_pdfximage:D
\@@_primitive:NN \pdfximagebbox \tex_pdfximagebbox:D
% \end{macrocode}
@@ -924,7 +922,7 @@
\@@_primitive:NN \normaldeviate \tex_normaldeviate:D
\@@_primitive:NN \outputmode \tex_pdfoutput:D
\@@_primitive:NN \pageheight \tex_pageheight:D
- \@@_primitive:NN \pagewidth \tex_pagewith:D
+ \@@_primitive:NN \pagewidth \tex_pagewidth:D
\@@_primitive:NN \protrudechars \tex_protrudechars:D
\@@_primitive:NN \pxdimen \tex_pxdimen:D
\@@_primitive:NN \randomseed \tex_randomseed:D
@@ -1209,15 +1207,26 @@
% \end{macrocode}
%
% \LaTeXe{} moves a few primitives, so these are sorted out.
-% A convenient test for \LaTeXe{} is the \cs{@@@@end} saved primitive.
+% In newer versions of \LaTeXe{}, \pkg{expl3} is loaded rather early, so
+% only some primitives are already renamed, so we need two tests here.
+% At the beginning of the \LaTeXe{} format, the primitives \tn{end} and
+% \tn{input} are renamed, and only later on the other ones.
% \begin{macrocode}
%<*package>
\tex_ifdefined:D \@@@@end
\tex_let:D \tex_end:D \@@@@end
+ \tex_let:D \tex_input:D \@@@@input
+\tex_fi:D
+% \end{macrocode}
+%
+% If \tn{@@@@hyph} is defined, we are loading \pkg{expl3} in a
+% pre-2020/10/01 release of \LaTeXe{}, so a few other primitives have to
+% be tested as well.
+% \begin{macrocode}
+\tex_ifdefined:D \@@@@hyph
\tex_let:D \tex_everydisplay:D \frozen@everydisplay
\tex_let:D \tex_everymath:D \frozen@everymath
\tex_let:D \tex_hyphen:D \@@@@hyph
- \tex_let:D \tex_input:D \@@@@input
\tex_let:D \tex_italiccorrection:D \@@@@italiccorr
\tex_let:D \tex_underline:D \@@@@underline
% \end{macrocode}
@@ -1438,652 +1447,6 @@
%</package>
% \end{macrocode}
%
-% \subsection{Deprecated functions}
-%
-% Older versions of \pkg{expl3} divided up primitives by \enquote{source}: that
-% becomes very tricky with multiple parallel engine developments, so has been
-% dropped. To cover the transition, we provide the older names here for a
-% limited period (until the end of 2019).
-%
-% To allow \cs{debug_on:n} \Arg{deprecation} to work we save the list of
-% primitives into \cs{@@_primitives:}
-% \begin{macrocode}
-%<*package>
-\tex_begingroup:D
- \tex_long:D \tex_def:D \use_ii:nn #1#2 {#2}
- \tex_long:D \tex_def:D \use_none:n #1 { }
- \tex_long:D \tex_def:D \@@_primitive:NN #1#2
- {
- \tex_ifdefined:D #1
- \tex_expandafter:D \use_ii:nn
- \tex_fi:D
- \use_none:n { \tex_global:D \tex_let:D #2 #1 }
- }
- \tex_xdef:D \@@_primitives:
- {
- \tex_unexpanded:D
- {
- \@@_primitive:NN \beginL \etex_beginL:D
- \@@_primitive:NN \beginR \etex_beginR:D
- \@@_primitive:NN \botmarks \etex_botmarks:D
- \@@_primitive:NN \clubpenalties \etex_clubpenalties:D
- \@@_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D
- \@@_primitive:NN \currentgrouptype \etex_currentgrouptype:D
- \@@_primitive:NN \currentifbranch \etex_currentifbranch:D
- \@@_primitive:NN \currentiflevel \etex_currentiflevel:D
- \@@_primitive:NN \currentiftype \etex_currentiftype:D
- \@@_primitive:NN \detokenize \etex_detokenize:D
- \@@_primitive:NN \dimexpr \etex_dimexpr:D
- \@@_primitive:NN \displaywidowpenalties
- \etex_displaywidowpenalties:D
- \@@_primitive:NN \endL \etex_endL:D
- \@@_primitive:NN \endR \etex_endR:D
- \@@_primitive:NN \eTeXrevision \etex_eTeXrevision:D
- \@@_primitive:NN \eTeXversion \etex_eTeXversion:D
- \@@_primitive:NN \everyeof \etex_everyeof:D
- \@@_primitive:NN \firstmarks \etex_firstmarks:D
- \@@_primitive:NN \fontchardp \etex_fontchardp:D
- \@@_primitive:NN \fontcharht \etex_fontcharht:D
- \@@_primitive:NN \fontcharic \etex_fontcharic:D
- \@@_primitive:NN \fontcharwd \etex_fontcharwd:D
- \@@_primitive:NN \glueexpr \etex_glueexpr:D
- \@@_primitive:NN \glueshrink \etex_glueshrink:D
- \@@_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D
- \@@_primitive:NN \gluestretch \etex_gluestretch:D
- \@@_primitive:NN \gluestretchorder \etex_gluestretchorder:D
- \@@_primitive:NN \gluetomu \etex_gluetomu:D
- \@@_primitive:NN \ifcsname \etex_ifcsname:D
- \@@_primitive:NN \ifdefined \etex_ifdefined:D
- \@@_primitive:NN \iffontchar \etex_iffontchar:D
- \@@_primitive:NN \interactionmode \etex_interactionmode:D
- \@@_primitive:NN \interlinepenalties \etex_interlinepenalties:D
- \@@_primitive:NN \lastlinefit \etex_lastlinefit:D
- \@@_primitive:NN \lastnodetype \etex_lastnodetype:D
- \@@_primitive:NN \marks \etex_marks:D
- \@@_primitive:NN \middle \etex_middle:D
- \@@_primitive:NN \muexpr \etex_muexpr:D
- \@@_primitive:NN \mutoglue \etex_mutoglue:D
- \@@_primitive:NN \numexpr \etex_numexpr:D
- \@@_primitive:NN \pagediscards \etex_pagediscards:D
- \@@_primitive:NN \parshapedimen \etex_parshapedimen:D
- \@@_primitive:NN \parshapeindent \etex_parshapeindent:D
- \@@_primitive:NN \parshapelength \etex_parshapelength:D
- \@@_primitive:NN \predisplaydirection \etex_predisplaydirection:D
- \@@_primitive:NN \protected \etex_protected:D
- \@@_primitive:NN \readline \etex_readline:D
- \@@_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D
- \@@_primitive:NN \savingvdiscards \etex_savingvdiscards:D
- \@@_primitive:NN \scantokens \etex_scantokens:D
- \@@_primitive:NN \showgroups \etex_showgroups:D
- \@@_primitive:NN \showifs \etex_showifs:D
- \@@_primitive:NN \showtokens \etex_showtokens:D
- \@@_primitive:NN \splitbotmarks \etex_splitbotmarks:D
- \@@_primitive:NN \splitdiscards \etex_splitdiscards:D
- \@@_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D
- \@@_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D
- \@@_primitive:NN \topmarks \etex_topmarks:D
- \@@_primitive:NN \tracingassigns \etex_tracingassigns:D
- \@@_primitive:NN \tracinggroups \etex_tracinggroups:D
- \@@_primitive:NN \tracingifs \etex_tracingifs:D
- \@@_primitive:NN \tracingnesting \etex_tracingnesting:D
- \@@_primitive:NN \tracingscantokens \etex_tracingscantokens:D
- \@@_primitive:NN \unexpanded \etex_unexpanded:D
- \@@_primitive:NN \unless \etex_unless:D
- \@@_primitive:NN \widowpenalties \etex_widowpenalties:D
- \@@_primitive:NN \pdfannot \pdftex_pdfannot:D
- \@@_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D
- \@@_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D
- \@@_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D
- \@@_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D
- \@@_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D
- \@@_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D
- \@@_primitive:NN \pdfdest \pdftex_pdfdest:D
- \@@_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D
- \@@_primitive:NN \pdfendlink \pdftex_pdfendlink:D
- \@@_primitive:NN \pdfendthread \pdftex_pdfendthread:D
- \@@_primitive:NN \pdffontattr \pdftex_pdffontattr:D
- \@@_primitive:NN \pdffontname \pdftex_pdffontname:D
- \@@_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D
- \@@_primitive:NN \pdfgamma \pdftex_pdfgamma:D
- \@@_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D
- \@@_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D
- \@@_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D
- \@@_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D
- \@@_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D
- \@@_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D
- \@@_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D
- \@@_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D
- \@@_primitive:NN \pdfinclusioncopyfonts
- \pdftex_pdfinclusioncopyfonts:D
- \@@_primitive:NN \pdfinclusionerrorlevel
- \pdftex_pdfinclusionerrorlevel:D
- \@@_primitive:NN \pdfinfo \pdftex_pdfinfo:D
- \@@_primitive:NN \pdflastannot \pdftex_pdflastannot:D
- \@@_primitive:NN \pdflastlink \pdftex_pdflastlink:D
- \@@_primitive:NN \pdflastobj \pdftex_pdflastobj:D
- \@@_primitive:NN \pdflastxform \pdftex_pdflastxform:D
- \@@_primitive:NN \pdflastximage \pdftex_pdflastximage:D
- \@@_primitive:NN \pdflastximagecolordepth
- \pdftex_pdflastximagecolordepth:D
- \@@_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D
- \@@_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D
- \@@_primitive:NN \pdfliteral \pdftex_pdfliteral:D
- \@@_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D
- \@@_primitive:NN \pdfnames \pdftex_pdfnames:D
- \@@_primitive:NN \pdfobj \pdftex_pdfobj:D
- \@@_primitive:NN \pdfobjcompresslevel
- \pdftex_pdfobjcompresslevel:D
- \@@_primitive:NN \pdfoutline \pdftex_pdfoutline:D
- \@@_primitive:NN \pdfoutput \pdftex_pdfoutput:D
- \@@_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D
- \@@_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D
- \@@_primitive:NN \pdfpageref \pdftex_pdfpageref:D
- \@@_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D
- \@@_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D
- \@@_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D
- \@@_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D
- \@@_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D
- \@@_primitive:NN \pdfrestore \pdftex_pdfrestore:D
- \@@_primitive:NN \pdfretval \pdftex_pdfretval:D
- \@@_primitive:NN \pdfsave \pdftex_pdfsave:D
- \@@_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D
- \@@_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D
- \@@_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D
- \@@_primitive:NN \pdfsuppressptexinfo
- \pdftex_pdfsuppressptexinfo:D
- \@@_primitive:NN \pdfthread \pdftex_pdfthread:D
- \@@_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D
- \@@_primitive:NN \pdftrailer \pdftex_pdftrailer:D
- \@@_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D
- \@@_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D
- \@@_primitive:NN \pdfxform \pdftex_pdfxform:D
- \@@_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D
- \@@_primitive:NN \pdfxformname \pdftex_pdfxformname:D
- \@@_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D
- \@@_primitive:NN \pdfximage \pdftex_pdfximage:D
- \@@_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D
- \@@_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D
- \@@_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D
- \@@_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D
- \@@_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D
- \@@_primitive:NN \pdfcopyfont \pdftex_copyfont:D
- \@@_primitive:NN \pdfdraftmode \pdftex_draftmode:D
- \@@_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D
- \@@_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D
- \@@_primitive:NN \pdffilemoddate \pdftex_filemoddate:D
- \@@_primitive:NN \pdffilesize \pdftex_filesize:D
- \@@_primitive:NN \pdffirstlineheight \pdftex_firstlineheight:D
- \@@_primitive:NN \pdffontexpand \pdftex_fontexpand:D
- \@@_primitive:NN \pdffontsize \pdftex_fontsize:D
- \@@_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D
- \@@_primitive:NN \pdfinsertht \pdftex_insertht:D
- \@@_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D
- \@@_primitive:NN \pdflastxpos \pdftex_lastxpos:D
- \@@_primitive:NN \pdflastypos \pdftex_lastypos:D
- \@@_primitive:NN \pdfmapfile \pdftex_mapfile:D
- \@@_primitive:NN \pdfmapline \pdftex_mapline:D
- \@@_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D
- \@@_primitive:NN \pdfnoligatures \pdftex_noligatures:D
- \@@_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D
- \@@_primitive:NN \pdfpageheight \pdftex_pageheight:D
- \@@_primitive:NN \pdfpagewidth \pdftex_pagewidth:D
- \@@_primitive:NN \pdfpkmode \pdftex_pkmode:D
- \@@_primitive:NN \pdfpkresolution \pdftex_pkresolution:D
- \@@_primitive:NN \pdfprimitive \pdftex_primitive:D
- \@@_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D
- \@@_primitive:NN \pdfpxdimen \pdftex_pxdimen:D
- \@@_primitive:NN \pdfrandomseed \pdftex_randomseed:D
- \@@_primitive:NN \pdfsavepos \pdftex_savepos:D
- \@@_primitive:NN \pdfstrcmp \pdftex_strcmp:D
- \@@_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D
- \@@_primitive:NN \pdfshellescape \pdftex_shellescape:D
- \@@_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D
- \@@_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D
- \@@_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D
- \@@_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D
- \@@_primitive:NN \pdftexversion \pdftex_pdftexversion:D
- \@@_primitive:NN \efcode \pdftex_efcode:D
- \@@_primitive:NN \ifincsname \pdftex_ifincsname:D
- \@@_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D
- \@@_primitive:NN \letterspacefont \pdftex_letterspacefont:D
- \@@_primitive:NN \lpcode \pdftex_lpcode:D
- \@@_primitive:NN \quitvmode \pdftex_quitvmode:D
- \@@_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D
- \@@_primitive:NN \rpcode \pdftex_rpcode:D
- \@@_primitive:NN \synctex \pdftex_synctex:D
- \@@_primitive:NN \tagcode \pdftex_tagcode:D
- \@@_primitive:NN \mdfivesum \pdftex_mdfivesum:D
- \@@_primitive:NN \ifprimitive \pdftex_ifprimitive:D
- \@@_primitive:NN \primitive \pdftex_primitive:D
- \@@_primitive:NN \shellescape \pdftex_shellescape:D
- \@@_primitive:NN \adjustspacing \pdftex_adjustspacing:D
- \@@_primitive:NN \copyfont \pdftex_copyfont:D
- \@@_primitive:NN \draftmode \pdftex_draftmode:D
- \@@_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D
- \@@_primitive:NN \ifabsdim \pdftex_ifabsdim:D
- \@@_primitive:NN \ifabsnum \pdftex_ifabsnum:D
- \@@_primitive:NN \ignoreligaturesinfont
- \pdftex_ignoreligaturesinfont:D
- \@@_primitive:NN \insertht \pdftex_insertht:D
- \@@_primitive:NN \lastsavedboxresourceindex
- \pdftex_pdflastxform:D
- \@@_primitive:NN \lastsavedimageresourceindex
- \pdftex_pdflastximage:D
- \@@_primitive:NN \lastsavedimageresourcepages
- \pdftex_pdflastximagepages:D
- \@@_primitive:NN \lastxpos \pdftex_lastxpos:D
- \@@_primitive:NN \lastypos \pdftex_lastypos:D
- \@@_primitive:NN \normaldeviate \pdftex_normaldeviate:D
- \@@_primitive:NN \outputmode \pdftex_pdfoutput:D
- \@@_primitive:NN \pageheight \pdftex_pageheight:D
- \@@_primitive:NN \pagewidth \pdftex_pagewith:D
- \@@_primitive:NN \protrudechars \pdftex_protrudechars:D
- \@@_primitive:NN \pxdimen \pdftex_pxdimen:D
- \@@_primitive:NN \randomseed \pdftex_randomseed:D
- \@@_primitive:NN \useboxresource \pdftex_pdfrefxform:D
- \@@_primitive:NN \useimageresource \pdftex_pdfrefximage:D
- \@@_primitive:NN \savepos \pdftex_savepos:D
- \@@_primitive:NN \saveboxresource \pdftex_pdfxform:D
- \@@_primitive:NN \saveimageresource \pdftex_pdfximage:D
- \@@_primitive:NN \setrandomseed \pdftex_setrandomseed:D
- \@@_primitive:NN \tracingfonts \pdftex_tracingfonts:D
- \@@_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D
- \@@_primitive:NN \suppressfontnotfounderror
- \xetex_suppressfontnotfounderror:D
- \@@_primitive:NN \XeTeXcharclass \xetex_charclass:D
- \@@_primitive:NN \XeTeXcharglyph \xetex_charglyph:D
- \@@_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D
- \@@_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D
- \@@_primitive:NN \XeTeXcountselectors \xetex_countselectors:D
- \@@_primitive:NN \XeTeXcountvariations \xetex_countvariations:D
- \@@_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D
- \@@_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D
- \@@_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D
- \@@_primitive:NN \XeTeXfeaturename \xetex_featurename:D
- \@@_primitive:NN \XeTeXfindfeaturebyname
- \xetex_findfeaturebyname:D
- \@@_primitive:NN \XeTeXfindselectorbyname
- \xetex_findselectorbyname:D
- \@@_primitive:NN \XeTeXfindvariationbyname
- \xetex_findvariationbyname:D
- \@@_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D
- \@@_primitive:NN \XeTeXfonttype \xetex_fonttype:D
- \@@_primitive:NN \XeTeXgenerateactualtext
- \xetex_generateactualtext:D
- \@@_primitive:NN \XeTeXglyph \xetex_glyph:D
- \@@_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D
- \@@_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D
- \@@_primitive:NN \XeTeXglyphname \xetex_glyphname:D
- \@@_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D
- \@@_primitive:NN \XeTeXinputnormalization
- \xetex_inputnormalization:D
- \@@_primitive:NN \XeTeXinterchartokenstate
- \xetex_interchartokenstate:D
- \@@_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D
- \@@_primitive:NN \XeTeXisdefaultselector
- \xetex_isdefaultselector:D
- \@@_primitive:NN \XeTeXisexclusivefeature
- \xetex_isexclusivefeature:D
- \@@_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D
- \@@_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D
- \@@_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D
- \@@_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
- \@@_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D
- \@@_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
- \@@_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D
- \@@_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D
- \@@_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D
- \@@_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D
- \@@_primitive:NN \XeTeXpdffile \xetex_pdffile:D
- \@@_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D
- \@@_primitive:NN \XeTeXpicfile \xetex_picfile:D
- \@@_primitive:NN \XeTeXselectorname \xetex_selectorname:D
- \@@_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D
- \@@_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D
- \@@_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D
- \@@_primitive:NN \XeTeXvariation \xetex_variation:D
- \@@_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
- \@@_primitive:NN \XeTeXvariationmax \xetex_variationmax:D
- \@@_primitive:NN \XeTeXvariationmin \xetex_variationmin:D
- \@@_primitive:NN \XeTeXvariationname \xetex_variationname:D
- \@@_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D
- \@@_primitive:NN \XeTeXversion \xetex_XeTeXversion:D
- \@@_primitive:NN \alignmark \luatex_alignmark:D
- \@@_primitive:NN \aligntab \luatex_aligntab:D
- \@@_primitive:NN \attribute \luatex_attribute:D
- \@@_primitive:NN \attributedef \luatex_attributedef:D
- \@@_primitive:NN \automaticdiscretionary
- \luatex_automaticdiscretionary:D
- \@@_primitive:NN \automatichyphenmode
- \luatex_automatichyphenmode:D
- \@@_primitive:NN \automatichyphenpenalty
- \luatex_automatichyphenpenalty:D
- \@@_primitive:NN \begincsname \luatex_begincsname:D
- \@@_primitive:NN \breakafterdirmode \luatex_breakafterdirmode:D
- \@@_primitive:NN \catcodetable \luatex_catcodetable:D
- \@@_primitive:NN \clearmarks \luatex_clearmarks:D
- \@@_primitive:NN \crampeddisplaystyle
- \luatex_crampeddisplaystyle:D
- \@@_primitive:NN \crampedscriptscriptstyle
- \luatex_crampedscriptscriptstyle:D
- \@@_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D
- \@@_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D
- \@@_primitive:NN \directlua \luatex_directlua:D
- \@@_primitive:NN \dviextension \luatex_dviextension:D
- \@@_primitive:NN \dvifeedback \luatex_dvifeedback:D
- \@@_primitive:NN \dvivariable \luatex_dvivariable:D
- \@@_primitive:NN \etoksapp \luatex_etoksapp:D
- \@@_primitive:NN \etokspre \luatex_etokspre:D
- \@@_primitive:NN \explicithyphenpenalty
- \luatex_explicithyphenpenalty:D
- \@@_primitive:NN \expanded \luatex_expanded:D
- \@@_primitive:NN \explicitdiscretionary
- \luatex_explicitdiscretionary:D
- \@@_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D
- \@@_primitive:NN \fontid \luatex_fontid:D
- \@@_primitive:NN \formatname \luatex_formatname:D
- \@@_primitive:NN \hjcode \luatex_hjcode:D
- \@@_primitive:NN \hpack \luatex_hpack:D
- \@@_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D
- \@@_primitive:NN \hyphenationmin \luatex_hyphenationmin:D
- \@@_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D
- \@@_primitive:NN \gleaders \luatex_gleaders:D
- \@@_primitive:NN \initcatcodetable \luatex_initcatcodetable:D
- \@@_primitive:NN \lastnamedcs \luatex_lastnamedcs:D
- \@@_primitive:NN \latelua \luatex_latelua:D
- \@@_primitive:NN \letcharcode \luatex_letcharcode:D
- \@@_primitive:NN \luaescapestring \luatex_luaescapestring:D
- \@@_primitive:NN \luafunction \luatex_luafunction:D
- \@@_primitive:NN \luatexbanner \luatex_luatexbanner:D
- \@@_primitive:NN \luatexrevision \luatex_luatexrevision:D
- \@@_primitive:NN \luatexversion \luatex_luatexversion:D
- \@@_primitive:NN \mathdelimitersmode \luatex_mathdelimitersmode:D
- \@@_primitive:NN \mathdisplayskipmode
- \luatex_mathdisplayskipmode:D
- \@@_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D
- \@@_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D
- \@@_primitive:NN \mathoption \luatex_mathoption:D
- \@@_primitive:NN \mathpenaltiesmode \luatex_mathpenaltiesmode:D
- \@@_primitive:NN \mathrulesfam \luatex_mathrulesfam:D
- \@@_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D
- \@@_primitive:NN \mathscriptboxmode \luatex_mathscriptboxmode:D
- \@@_primitive:NN \mathstyle \luatex_mathstyle:D
- \@@_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D
- \@@_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D
- \@@_primitive:NN \nohrule \luatex_nohrule:D
- \@@_primitive:NN \nokerns \luatex_nokerns:D
- \@@_primitive:NN \noligs \luatex_noligs:D
- \@@_primitive:NN \nospaces \luatex_nospaces:D
- \@@_primitive:NN \novrule \luatex_novrule:D
- \@@_primitive:NN \outputbox \luatex_outputbox:D
- \@@_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D
- \@@_primitive:NN \pageleftoffset \luatex_pageleftoffset:D
- \@@_primitive:NN \pagerightoffset \luatex_pagerightoffset:D
- \@@_primitive:NN \pagetopoffset \luatex_pagetopoffset:D
- \@@_primitive:NN \pdfextension \luatex_pdfextension:D
- \@@_primitive:NN \pdffeedback \luatex_pdffeedback:D
- \@@_primitive:NN \pdfvariable \luatex_pdfvariable:D
- \@@_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D
- \@@_primitive:NN \posthyphenchar \luatex_posthyphenchar:D
- \@@_primitive:NN \prebinoppenalty \luatex_prebinoppenalty:D
- \@@_primitive:NN \predisplaygapfactor
- \luatex_predisplaygapfactor:D
- \@@_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D
- \@@_primitive:NN \prehyphenchar \luatex_prehyphenchar:D
- \@@_primitive:NN \prerelpenalty \luatex_prerelpenalty:D
- \@@_primitive:NN \savecatcodetable \luatex_savecatcodetable:D
- \@@_primitive:NN \scantextokens \luatex_scantextokens:D
- \@@_primitive:NN \setfontid \luatex_setfontid:D
- \@@_primitive:NN \shapemode \luatex_shapemode:D
- \@@_primitive:NN \suppressifcsnameerror
- \luatex_suppressifcsnameerror:D
- \@@_primitive:NN \suppresslongerror \luatex_suppresslongerror:D
- \@@_primitive:NN \suppressmathparerror
- \luatex_suppressmathparerror:D
- \@@_primitive:NN \suppressoutererror \luatex_suppressoutererror:D
- \@@_primitive:NN \suppressprimitiveerror
- \luatex_suppressprimitiveerror:D
- \@@_primitive:NN \toksapp \luatex_toksapp:D
- \@@_primitive:NN \tokspre \luatex_tokspre:D
- \@@_primitive:NN \tpack \luatex_tpack:D
- \@@_primitive:NN \vpack \luatex_vpack:D
- \@@_primitive:NN \bodydir \luatex_bodydir:D
- \@@_primitive:NN \boxdir \luatex_boxdir:D
- \@@_primitive:NN \leftghost \luatex_leftghost:D
- \@@_primitive:NN \linedir \luatex_linedir:D
- \@@_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D
- \@@_primitive:NN \localinterlinepenalty
- \luatex_localinterlinepenalty:D
- \@@_primitive:NN \localleftbox \luatex_localleftbox:D
- \@@_primitive:NN \localrightbox \luatex_localrightbox:D
- \@@_primitive:NN \mathdir \luatex_mathdir:D
- \@@_primitive:NN \pagedir \luatex_pagedir:D
- \@@_primitive:NN \pardir \luatex_pardir:D
- \@@_primitive:NN \rightghost \luatex_rightghost:D
- \@@_primitive:NN \textdir \luatex_textdir:D
- \@@_primitive:NN \Uchar \utex_char:D
- \@@_primitive:NN \Ucharcat \utex_charcat:D
- \@@_primitive:NN \Udelcode \utex_delcode:D
- \@@_primitive:NN \Udelcodenum \utex_delcodenum:D
- \@@_primitive:NN \Udelimiter \utex_delimiter:D
- \@@_primitive:NN \Udelimiterover \utex_delimiterover:D
- \@@_primitive:NN \Udelimiterunder \utex_delimiterunder:D
- \@@_primitive:NN \Uhextensible \utex_hextensible:D
- \@@_primitive:NN \Umathaccent \utex_mathaccent:D
- \@@_primitive:NN \Umathaxis \utex_mathaxis:D
- \@@_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D
- \@@_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D
- \@@_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D
- \@@_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D
- \@@_primitive:NN \Umathbinopspacing \utex_binopspacing:D
- \@@_primitive:NN \Umathbinordspacing \utex_binordspacing:D
- \@@_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D
- \@@_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D
- \@@_primitive:NN \Umathchar \utex_mathchar:D
- \@@_primitive:NN \Umathcharclass \utex_mathcharclass:D
- \@@_primitive:NN \Umathchardef \utex_mathchardef:D
- \@@_primitive:NN \Umathcharfam \utex_mathcharfam:D
- \@@_primitive:NN \Umathcharnum \utex_mathcharnum:D
- \@@_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D
- \@@_primitive:NN \Umathcharslot \utex_mathcharslot:D
- \@@_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D
- \@@_primitive:NN \Umathcloseclosespacing
- \utex_closeclosespacing:D
- \@@_primitive:NN \Umathcloseinnerspacing
- \utex_closeinnerspacing:D
- \@@_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
- \@@_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D
- \@@_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D
- \@@_primitive:NN \Umathclosepunctspacing
- \utex_closepunctspacing:D
- \@@_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D
- \@@_primitive:NN \Umathcode \utex_mathcode:D
- \@@_primitive:NN \Umathcodenum \utex_mathcodenum:D
- \@@_primitive:NN \Umathconnectoroverlapmin
- \utex_connectoroverlapmin:D
- \@@_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D
- \@@_primitive:NN \Umathfractiondenomdown
- \utex_fractiondenomdown:D
- \@@_primitive:NN \Umathfractiondenomvgap
- \utex_fractiondenomvgap:D
- \@@_primitive:NN \Umathfractionnumup \utex_fractionnumup:D
- \@@_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D
- \@@_primitive:NN \Umathfractionrule \utex_fractionrule:D
- \@@_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D
- \@@_primitive:NN \Umathinnerclosespacing
- \utex_innerclosespacing:D
- \@@_primitive:NN \Umathinnerinnerspacing
- \utex_innerinnerspacing:D
- \@@_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
- \@@_primitive:NN \Umathinneropspacing \utex_inneropspacing:D
- \@@_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D
- \@@_primitive:NN \Umathinnerpunctspacing
- \utex_innerpunctspacing:D
- \@@_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D
- \@@_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D
- \@@_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D
- \@@_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D
- \@@_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D
- \@@_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D
- \@@_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D
- \@@_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
- \@@_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
- \@@_primitive:NN \Umathopbinspacing \utex_opbinspacing:D
- \@@_primitive:NN \Umathopclosespacing \utex_opclosespacing:D
- \@@_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D
- \@@_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
- \@@_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
- \@@_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D
- \@@_primitive:NN \Umathopenopspacing \utex_openopspacing:D
- \@@_primitive:NN \Umathopenordspacing \utex_openordspacing:D
- \@@_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
- \@@_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D
- \@@_primitive:NN \Umathoperatorsize \utex_operatorsize:D
- \@@_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D
- \@@_primitive:NN \Umathopopenspacing \utex_opopenspacing:D
- \@@_primitive:NN \Umathopopspacing \utex_opopspacing:D
- \@@_primitive:NN \Umathopordspacing \utex_opordspacing:D
- \@@_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D
- \@@_primitive:NN \Umathoprelspacing \utex_oprelspacing:D
- \@@_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D
- \@@_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D
- \@@_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D
- \@@_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D
- \@@_primitive:NN \Umathordopspacing \utex_ordopspacing:D
- \@@_primitive:NN \Umathordordspacing \utex_ordordspacing:D
- \@@_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D
- \@@_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D
- \@@_primitive:NN \Umathoverbarkern \utex_overbarkern:D
- \@@_primitive:NN \Umathoverbarrule \utex_overbarrule:D
- \@@_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D
- \@@_primitive:NN \Umathoverdelimiterbgap
- \utex_overdelimiterbgap:D
- \@@_primitive:NN \Umathoverdelimitervgap
- \utex_overdelimitervgap:D
- \@@_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D
- \@@_primitive:NN \Umathpunctclosespacing
- \utex_punctclosespacing:D
- \@@_primitive:NN \Umathpunctinnerspacing
- \utex_punctinnerspacing:D
- \@@_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
- \@@_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D
- \@@_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D
- \@@_primitive:NN \Umathpunctpunctspacing\utex_punctpunctspacing:D
- \@@_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D
- \@@_primitive:NN \Umathquad \utex_quad:D
- \@@_primitive:NN \Umathradicaldegreeafter
- \utex_radicaldegreeafter:D
- \@@_primitive:NN \Umathradicaldegreebefore
- \utex_radicaldegreebefore:D
- \@@_primitive:NN \Umathradicaldegreeraise
- \utex_radicaldegreeraise:D
- \@@_primitive:NN \Umathradicalkern \utex_radicalkern:D
- \@@_primitive:NN \Umathradicalrule \utex_radicalrule:D
- \@@_primitive:NN \Umathradicalvgap \utex_radicalvgap:D
- \@@_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D
- \@@_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D
- \@@_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D
- \@@_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D
- \@@_primitive:NN \Umathrelopspacing \utex_relopspacing:D
- \@@_primitive:NN \Umathrelordspacing \utex_relordspacing:D
- \@@_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D
- \@@_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D
- \@@_primitive:NN \Umathskewedfractionhgap
- \utex_skewedfractionhgap:D
- \@@_primitive:NN \Umathskewedfractionvgap
- \utex_skewedfractionvgap:D
- \@@_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
- \@@_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D
- \@@_primitive:NN \Umathstacknumup \utex_stacknumup:D
- \@@_primitive:NN \Umathstackvgap \utex_stackvgap:D
- \@@_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D
- \@@_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D
- \@@_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D
- \@@_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D
- \@@_primitive:NN \Umathsubtopmax \utex_subtopmax:D
- \@@_primitive:NN \Umathsupbottommin \utex_supbottommin:D
- \@@_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D
- \@@_primitive:NN \Umathsupshiftup \utex_supshiftup:D
- \@@_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D
- \@@_primitive:NN \Umathunderbarkern \utex_underbarkern:D
- \@@_primitive:NN \Umathunderbarrule \utex_underbarrule:D
- \@@_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D
- \@@_primitive:NN \Umathunderdelimiterbgap
- \utex_underdelimiterbgap:D
- \@@_primitive:NN \Umathunderdelimitervgap
- \utex_underdelimitervgap:D
- \@@_primitive:NN \Unosubscript \utex_nosubscript:D
- \@@_primitive:NN \Unosuperscript \utex_nosuperscript:D
- \@@_primitive:NN \Uoverdelimiter \utex_overdelimiter:D
- \@@_primitive:NN \Uradical \utex_radical:D
- \@@_primitive:NN \Uroot \utex_root:D
- \@@_primitive:NN \Uskewed \utex_skewed:D
- \@@_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D
- \@@_primitive:NN \Ustack \utex_stack:D
- \@@_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D
- \@@_primitive:NN \Ustartmath \utex_startmath:D
- \@@_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D
- \@@_primitive:NN \Ustopmath \utex_stopmath:D
- \@@_primitive:NN \Usubscript \utex_subscript:D
- \@@_primitive:NN \Usuperscript \utex_superscript:D
- \@@_primitive:NN \Uunderdelimiter \utex_underdelimiter:D
- \@@_primitive:NN \Uvextensible \utex_vextensible:D
- \@@_primitive:NN \autospacing \ptex_autospacing:D
- \@@_primitive:NN \autoxspacing \ptex_autoxspacing:D
- \@@_primitive:NN \dtou \ptex_dtou:D
- \@@_primitive:NN \epTeXinputencoding \ptex_inputencoding:D
- \@@_primitive:NN \epTeXversion \ptex_epTeXversion:D
- \@@_primitive:NN \euc \ptex_euc:D
- \@@_primitive:NN \ifdbox \ptex_ifdbox:D
- \@@_primitive:NN \ifddir \ptex_ifddir:D
- \@@_primitive:NN \ifmdir \ptex_ifmdir:D
- \@@_primitive:NN \iftbox \ptex_iftbox:D
- \@@_primitive:NN \iftdir \ptex_iftdir:D
- \@@_primitive:NN \ifybox \ptex_ifybox:D
- \@@_primitive:NN \ifydir \ptex_ifydir:D
- \@@_primitive:NN \inhibitglue \ptex_inhibitglue:D
- \@@_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D
- \@@_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D
- \@@_primitive:NN \jfam \ptex_jfam:D
- \@@_primitive:NN \jfont \ptex_jfont:D
- \@@_primitive:NN \jis \ptex_jis:D
- \@@_primitive:NN \kanjiskip \ptex_kanjiskip:D
- \@@_primitive:NN \kansuji \ptex_kansuji:D
- \@@_primitive:NN \kansujichar \ptex_kansujichar:D
- \@@_primitive:NN \kcatcode \ptex_kcatcode:D
- \@@_primitive:NN \kuten \ptex_kuten:D
- \@@_primitive:NN \noautospacing \ptex_noautospacing:D
- \@@_primitive:NN \noautoxspacing \ptex_noautoxspacing:D
- \@@_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D
- \@@_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D
- \@@_primitive:NN \ptexminorversion \ptex_ptexminorversion:D
- \@@_primitive:NN \ptexrevision \ptex_ptexrevision:D
- \@@_primitive:NN \ptexversion \ptex_ptexversion:D
- \@@_primitive:NN \showmode \ptex_showmode:D
- \@@_primitive:NN \sjis \ptex_sjis:D
- \@@_primitive:NN \tate \ptex_tate:D
- \@@_primitive:NN \tbaselineshift \ptex_tbaselineshift:D
- \@@_primitive:NN \tfont \ptex_tfont:D
- \@@_primitive:NN \xkanjiskip \ptex_xkanjiskip:D
- \@@_primitive:NN \xspcode \ptex_xspcode:D
- \@@_primitive:NN \ybaselineshift \ptex_ybaselineshift:D
- \@@_primitive:NN \yoko \ptex_yoko:D
- \@@_primitive:NN \disablecjktoken \uptex_disablecjktoken:D
- \@@_primitive:NN \enablecjktoken \uptex_enablecjktoken:D
- \@@_primitive:NN \forcecjktoken \uptex_forcecjktoken:D
- \@@_primitive:NN \kchar \uptex_kchar:D
- \@@_primitive:NN \kchardef \uptex_kchardef:D
- \@@_primitive:NN \kuten \uptex_kuten:D
- \@@_primitive:NN \ucs \uptex_ucs:D
- \@@_primitive:NN \uptexrevision \uptex_uptexrevision:D
- \@@_primitive:NN \uptexversion \uptex_uptexversion:D
- }
- }
- \@@_primitives:
-\tex_endgroup:D
-%</package>
-% \end{macrocode}
-%
% \begin{macrocode}
%</initex|package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
index b5ccaa4abd..9463b85375 100644
--- a/macros/latex/contrib/l3kernel/l3news.pdf
+++ b/macros/latex/contrib/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf
index 9df1d2e357..5c3bb76914 100644
--- a/macros/latex/contrib/l3kernel/l3news01.pdf
+++ b/macros/latex/contrib/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf
index 986447ba43..0d80eae081 100644
--- a/macros/latex/contrib/l3kernel/l3news02.pdf
+++ b/macros/latex/contrib/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf
index b574f29d39..29264d3578 100644
--- a/macros/latex/contrib/l3kernel/l3news03.pdf
+++ b/macros/latex/contrib/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf
index bd28986715..1b990e3889 100644
--- a/macros/latex/contrib/l3kernel/l3news04.pdf
+++ b/macros/latex/contrib/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf
index 98f1049a04..ab75e4b939 100644
--- a/macros/latex/contrib/l3kernel/l3news05.pdf
+++ b/macros/latex/contrib/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf
index 09db992250..95606ad096 100644
--- a/macros/latex/contrib/l3kernel/l3news06.pdf
+++ b/macros/latex/contrib/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf
index 7c1d2e11a6..a51e4512e4 100644
--- a/macros/latex/contrib/l3kernel/l3news07.pdf
+++ b/macros/latex/contrib/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf
index fde17f4305..45e221f9ba 100644
--- a/macros/latex/contrib/l3kernel/l3news08.pdf
+++ b/macros/latex/contrib/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf
index b088958a78..c2a1cc1816 100644
--- a/macros/latex/contrib/l3kernel/l3news09.pdf
+++ b/macros/latex/contrib/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf
index bc0ccc14ec..af9d89b61a 100644
--- a/macros/latex/contrib/l3kernel/l3news10.pdf
+++ b/macros/latex/contrib/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf
index 6a3bc0787d..c9a93fa975 100644
--- a/macros/latex/contrib/l3kernel/l3news11.pdf
+++ b/macros/latex/contrib/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf
index 573feb45f8..cc045f3a19 100644
--- a/macros/latex/contrib/l3kernel/l3news12.pdf
+++ b/macros/latex/contrib/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv
index 3738670cf3..bcf02f23b6 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/contrib/l3kernel/l3prefixes.csv
@@ -123,6 +123,7 @@ morewrites,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrite
msg,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
msvg,media4svg,Alexander Grahn,,https://gitlab.com/agrahn/media4svg,https://gitlab.com/agrahn/media4svg/issues,2020-04-15,2020-04-15,
muskip,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+namedef,namedef,Phelype Oleinik,https://github.com/PhelypeOleinik/namedef,https://github.com/PhelypeOleinik/namedef.git,https://github.com/PhelypeOleinik/namedef/issues,2020-06-22,2020-06-22,
nan,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
nicematrix,nicematrix,François Pantigny,,,,2019-12-19,2019-12-19,
nil,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
@@ -138,9 +139,11 @@ overleaf,overleaf,Overleaf,https://www.overleaf.com/about,,support+tex-dev@overl
parameter,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
pbs,media9,Alexander Grahn,,https://gitlab.com/agrahn/media9,https://gitlab.com/agrahn/media9/issues,2016-02-26,2020-04-15,
pdf,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
+pdfoverlay,pdfoverlay,David Purton,https://github.com/dcpurton/pdfoverlay,https://github.com/dcpurton/pdfoverlay.git,https://github.com/dcpurton/pdfoverlay/issues,2020-06-22,2020-06-22,
pdftex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
peek,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
percent,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
+pgf,pgf,The PGF/TikZ Team,https://pgf-tikz.github.io,https://github.com/pgf-tikz/pgf,https://github.com/pgf-tikz/pgf/issues,2020-07-03,2020-07-03,
pi,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
pkgploader,pkgploader,Michiel Helvensteijn,,,,2014-02-05,2014-02-05,
polyglossia,polyglossia,Arthur Reutenauer,https://www.polyglossia.org/,https://github.com/reutenauer/polyglossia,https://github.com/reutenauer/polyglossia/issues,2019-09-03,,
@@ -149,7 +152,9 @@ primargs,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrites,
prop,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
pseudo,pseudo,Magnus Lie Hetland,https://github.com/mlhetland/pseudo.sty,https://github.com/mlhetland/pseudo.sty.git,https://github.com/mlhetland/pseudo.sty/issues,2019-06-24,2019-06-24,
ptex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-07-28,2015-07-28,
+ptxcd,ptxcd, Marei Peischl,,,,2020-07-27,2020-07-27,Used for specific corporate design templates
quark,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+qrbill,qrbill,Marei Peischl,https://github.com/peiTeX/qrbill,https://github.com/peiTeX/qrbill.git,https://github.com/peiTeX/qrbill/issues,2020-06-27,2020-06-27,
randomwalk,randomwalk,Bruno Le Floch,https://github.com/blefloch/latex-randomwalk,https://github.com/blefloch/latex-randomwalk.git,https://github.com/blefloch/latex-randomwalk/issues,2013-03-16,2015-09-22,
recursion,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
regex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2018-04-06,
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index fe9b65c217..9b9fc68466 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index 52d6794833..c1f794e015 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index a85becf5e3..790f0e3b31 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -146,13 +146,17 @@
% \begin{function}[updated = 2012-07-09]
% {
% \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx,
-% \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo,
+% \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx,
+% \prop_put:Non, \prop_put:Noo,, \prop_put:Nxx,
% \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx,
-% \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo,
+% \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx,
+% \prop_put:con, \prop_put:coo, \prop_put:cxx,
% \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx,
-% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo,
+% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVx, \prop_gput:Nvx,
+% \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx,
% \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx,
-% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo
+% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx,
+% \prop_gput:con, \prop_gput:coo, \prop_gput:cxx
% }
% \begin{syntax}
% \cs{prop_put:Nnn} \meta{property list} \Arg{key} \Arg{value}
@@ -186,8 +190,8 @@
%
% \begin{function}[updated = 2011-08-28]
% {
-% \prop_get:NnN, \prop_get:NVN, \prop_get:NoN,
-% \prop_get:cnN, \prop_get:cVN, \prop_get:coN,
+% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN,
+% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN,
% }
% \begin{syntax}
% \cs{prop_get:NnN} \meta{property list} \Arg{key} \meta{tl var}
@@ -319,8 +323,8 @@
%
% \begin{function}[updated = 2012-05-19, TF]
% {
-% \prop_get:NnN, \prop_get:NVN, \prop_get:NoN,
-% \prop_get:cnN, \prop_get:cVN, \prop_get:coN
+% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN,
+% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN
% }
% \begin{syntax}
% \cs{prop_get:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\
@@ -911,8 +915,8 @@
{ \tl_set:Nn #3 {##2} }
{ \tl_set:Nn #3 { \q_no_value } }
}
-\cs_generate_variant:Nn \prop_get:NnN { NV , No }
-\cs_generate_variant:Nn \prop_get:NnN { c , cV , co }
+\cs_generate_variant:Nn \prop_get:NnN { NV , Nv , No }
+\cs_generate_variant:Nn \prop_get:NnN { c , cV , cv , co }
% \end{macrocode}
% \end{macro}
%
@@ -1038,16 +1042,20 @@
% \begin{macro}[tested = m3prop002]
% {
% \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx,
-% \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo,
+% \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx,
+% \prop_put:Non, \prop_put:Noo, \prop_put:Nxx,
% \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx,
-% \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo
+% \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx,
+% \prop_put:con, \prop_put:coo, \prop_put:cxx
% }
% \begin{macro}[tested = m3prop002]
% {
% \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx,
-% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo,
+% \prop_gput:NVn, \prop_gput:NVV, \prop_hput:NVx, \prop_hput:Nvx,
+% \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx,
% \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx,
-% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo
+% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx,
+% \prop_gput:con, \prop_gput:coo, \prop_gput:cxx
% }
% \begin{macro}{\@@_put:NNnn}
% Since the branches of \cs{@@_split:NnTF} are used as the replacement
@@ -1077,13 +1085,13 @@
{ #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } }
}
\cs_generate_variant:Nn \prop_put:Nnn
- { NnV , Nno , Nnx , NV , NVV , No , Noo }
+ { NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
\cs_generate_variant:Nn \prop_put:Nnn
- { c , cnV , cno , cnx , cV , cVV , co , coo }
+ { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
\cs_generate_variant:Nn \prop_gput:Nnn
- { NnV , Nno , Nnx , NV , NVV , No , Noo }
+ { NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
\cs_generate_variant:Nn \prop_gput:Nnn
- { c , cnV , cno , cnx , cV , cVV , co , coo }
+ { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1230,7 +1238,7 @@
{ \prg_return_false: }
}
\prg_generate_conditional_variant:Nnn \prop_get:NnN
- { NV , No , c , cV , co } { T , F , TF }
+ { NV , Nv , No , c , cV , cv , co } { T , F , TF }
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index 3368fa159b..62474447ef 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index 30e355eada..3820ecdb67 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -3699,7 +3699,7 @@
\cs_new_protected:Npn \@@_show_item_exact_cs:n #1
{
\seq_set_split:Nnn \l_@@_internal_seq { \scan_stop: } {#1}
- \seq_set_map:NNn \l_@@_internal_seq
+ \seq_set_map_x:NNn \l_@@_internal_seq
\l_@@_internal_seq { \iow_char:N\\##1 }
\@@_show_one:n
{ control~sequence~ \seq_use:Nn \l_@@_internal_seq { ~or~ } }
@@ -6109,7 +6109,7 @@
{ \flag_height:n { @@_end } }
{ \flag_height:n { @@_begin } }
}
- \seq_set_map:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
+ \seq_set_map_x:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
\exp_args:NNNo
\group_end:
\tl_set:Nn #1 { \l_@@_internal_seq }
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index 40d829f96c..bd935c6f60 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -139,7 +139,7 @@
% this space trimming behaviour is identical to that of
% \pkg{l3clist} functions. Empty \meta{items} are preserved by
% \cs{seq_set_split:Nnn}, and can be removed afterwards using
-% \cs{seq_remove_all:Nn} \meta{sequence} \Arg{}.
+% \cs{seq_remove_all:Nn} \meta{sequence} |{}|.
% The \meta{delimiter} may not contain |{|, |}| or |#|
% (assuming \TeX{}'s normal category code r\'egime).
% If the \meta{delimiter} is empty, the \meta{token list} is split
@@ -653,6 +653,40 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[added = 2011-12-22, updated = 2020-07-16]
+% {\seq_set_map:NNn, \seq_gset_map:NNn}
+% \begin{syntax}
+% \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
+% \end{syntax}
+% Applies \meta{inline function} to every \meta{item} stored
+% within the \meta{sequence_2}. The \meta{inline function} should
+% consist of code which will receive the \meta{item} as |#1|.
+% The sequence resulting applying \meta{inline function} to each
+% \meta{item} is assigned to \meta{sequence_1}.
+% \begin{texnote}
+% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+% be used in this function, and would lead to low-level \TeX{} errors.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}[added = 2020-07-16]
+% {\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{syntax}
+% \cs{seq_set_map_x:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
+% \end{syntax}
+% Applies \meta{inline function} to every \meta{item} stored
+% within the \meta{sequence_2}. The \meta{inline function} should
+% consist of code which will receive the \meta{item} as |#1|.
+% The sequence resulting from \texttt{x}-expanding
+% \meta{inline function} applied to each \meta{item}
+% is assigned to \meta{sequence_1}. As such, the code
+% in \meta{inline function} should be expandable.
+% \begin{texnote}
+% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+% be used in this function, and would lead to low-level \TeX{} errors.
+% \end{texnote}
+% \end{function}
+%
% \begin{function}[EXP, added = 2012-07-13]{\seq_count:N, \seq_count:c}
% \begin{syntax}
% \cs{seq_count:N} \meta{sequence}
@@ -2082,6 +2116,45 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{macro}{\@@_set_map_x:NNNn}
+% Very similar to \cs{seq_set_filter:NNn}. We could actually
+% merge the two within a single function, but it would have weird
+% semantics.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_map_x:NNn
+ { \@@_set_map_x:NNNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map_x:NNn
+ { \@@_set_map_x:NNNn \tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_map_x:NNNn #1#2#3#4
+ {
+ \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
+ #1 #2 { #3 }
+ \@@_pop_item_def:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
+% \begin{macro}{\@@_set_map:NNNn}
+% Similar to \cs{seq_set_map_x:NNn}, but prevents expansion of the
+% <inline function>.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_map:NNn
+ { \@@_set_map:NNNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map:NNn
+ { \@@_set_map:NNNn \tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
+ {
+ \@@_push_item_def:n { \exp_not:n { \@@_item:n {#4} } }
+ #1 #2 { #3 }
+ \@@_pop_item_def:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\seq_count:N, \seq_count:c}
% \begin{macro}{\@@_count:w, \@@_count_end:w}
% Since counting the items in a sequence is quite common, we optimize
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index 7b534be25c..a87f940938 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index 9163b494d0..b84c2e298a 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index 6a910b8040..e57c165f1b 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index a6fad22d02..539881e139 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -306,7 +306,8 @@
% \end{syntax}
% Compares the content of two \meta{str variables} and
% is logically \texttt{true} if the two contain the same characters
-% in the same order.
+% in the same order. See \cs{tl_if_eq:NNTF} to compare tokens
+% (including their category codes) rather than characters.
% \end{function}
%
% \begin{function}[EXP,pTF, updated = 2018-06-18]
@@ -326,7 +327,8 @@
% \begin{verbatim}
% \str_if_eq_p:no { abc } { \tl_to_str:n { abc } }
% \end{verbatim}
-% is logically \texttt{true}.
+% is logically \texttt{true}. See \cs{tl_if_eq:nnTF} to compare
+% tokens (including their category codes) rather than characters.
% \end{function}
%
% \begin{function}[TF, added = 2017-10-08]{\str_if_in:Nn, \str_if_in:cn}
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index 73d3f8840b..575770b6c8 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex
index 915534ed11..0d2028f2c2 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/contrib/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index 15c831eb55..76dc0f00c9 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
index 4e280f75d2..58824c3b4b 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/contrib/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 2020-06-18}
+\date{Released 2020-07-17}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 8a27d4b78e..b15b61d521 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index 1a6beba13f..5826dda253 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex
index 99464b67c9..90e2c3c768 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/contrib/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 2020-06-18}
+\date{Released 2020-07-17}
\newcommand{\TF}{\textit{(TF)}}
@@ -53,7 +53,98 @@ beginning of a line.
\section{Structure of tokens}
-Copy there the section ``Description of all possible tokens'' from \texttt{l3token}.
+We refer to the documentation of \texttt{l3token} for a complete
+description of all \TeX{} tokens. We distinguish the meaning of the
+token, which controls the expansion of the token and its effect on
+\TeX{}'s state, and its shape, which is used when comparing token lists
+such as for delimited arguments. At any given time two tokens of the
+same shape automatically have the same meaning, but the converse does
+not hold, and the meaning associated with a given shape change when
+doing assignments.
+
+Apart from a few exceptions, a token has one of the following shapes.
+\begin{itemize}
+ \item A control sequence, characterized by the sequence of characters
+ that constitute its name: for instance, \cs{use:n} is a five-letter
+ control sequence.
+ \item An active character token, characterized by its character code
+ (between $0$ and $1114111$ for \LuaTeX{} and \XeTeX{} and less for
+ other engines) and category code~$13$.
+ \item A character token such as |A| or |#|, characterized by its
+ character code and category code (one of $1$, $2$, $3$, $4$, $6$,
+ $7$, $8$, $10$, $11$ or~$12$ whose meaning is described below).
+\end{itemize}
+
+The meaning of a (non-active) character token is fixed by its category
+code (and character code) and cannot be changed. We call these tokens
+\emph{explicit} character tokens. Category codes that a character token
+can have are listed below by giving a sample output of the \TeX{}
+primitive \tn{meaning}, together with their \LaTeX3 names and most
+common example:
+\begin{itemize}
+ \item[1] begin-group character (|group_begin|, often |{|),
+ \item[2] end-group character (|group_end|, often |}|),
+ \item[3] math shift character (|math_toggle|, often |$|), % $
+ \item[4] alignment tab character (|alignment|, often |&|),
+ \item[6] macro parameter character (|parameter|, often |#|),
+ \item[7] superscript character (|math_superscript|, often |^|),
+ \item[8] subscript character (|math_subscript|, often |_|),
+ \item[10] blank space (|space|, often character code~$32$),
+ \item[11] the letter (|letter|, such as |A|),
+ \item[12] the character (|other|, such as |0|).
+\end{itemize}
+Category code~$13$ (|active|) is discussed below. Input characters can
+also have several other category codes which do not lead to character
+tokens for later processing: $0$~(|escape|), $5$~(|end_line|),
+$9$~(|ignore|), $14$~(|comment|), and $15$~(|invalid|).
+
+The meaning of a control sequence or active character can be identical
+to that of any character token listed above (with any character code),
+and we call such tokens \emph{implicit} character tokens. The meaning
+is otherwise in the following list:
+\begin{itemize}
+ \item a macro, used in \LaTeX3 for most functions and some variables
+ (|tl|, |fp|, |seq|, \ldots{}),
+ \item a primitive such as \tn{def} or \tn{topmark}, used in \LaTeX3
+ for some functions,
+ \item a register such as \tn{count}|123|, used in \LaTeX3{} for the
+ implementation of some variables (|int|, |dim|, \ldots{}),
+ \item a constant integer such as \tn{char}|"56| or
+ \tn{mathchar}|"121|, used when defining a constant using
+ \cs{int_const:Nn},
+ \item a font selection command,
+ \item undefined.
+\end{itemize}
+Macros can be \tn{protected} or not, \tn{long} or not (the opposite of
+what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in \LaTeX3).
+Their \tn{meaning} takes the form
+\begin{quote}
+ \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement}
+\end{quote}
+where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer},
+\meta{argument} describes parameters that the macro expects, such as
+|#1#2#3|, and \meta{replacement} describes how the parameters are
+manipulated, such as~|\int_eval:n{#2+#1*#3}|. This information can be
+accessed by \cs{cs_prefix_spec:N}, \cs{cs_argument_spec:N},
+\cs{cs_replacement_spec:N}.
+
+When a macro takes an undelimited argument, explicit space characters
+(with character code $32$ and category code $10$) are ignored. If the
+following token is an explicit character token with category code $1$
+(begin-group) and an arbitrary character code, then \TeX{} scans ahead
+to obtain an equal number of explicit character tokens with category
+code $1$ (begin-group) and $2$ (end-group), and the resulting list of
+tokens (with outer braces removed) becomes the argument. Otherwise, a
+single token is taken as the argument for the macro: we call such single
+tokens \enquote{N-type}, as they are suitable to be used as an argument
+for a function with the signature~\texttt{:N}.
+
+When a macro takes a delimited argument \TeX{} scans ahead until finding
+the delimiter (outside any pairs of begin-group/end-group explicit
+characters), and the resulting list of tokens (with outer braces
+removed) becomes the argument. Note that explicit space characters at
+the start of the argument are \emph{not} ignored in this case (and they
+prevent brace-stripping).
\section{Quantities and expressions}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
index b8e534b4b6..a3dde63359 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx
index 2543dbebae..c48ac585a2 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
index 00648a4b84..2946a48df3 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index a5662491e1..4944e42682 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index b10167ca25..c315612b43 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -305,7 +305,8 @@
% This allows the \meta{tl~var} to contain material
% with category codes other than those that apply when \meta{tokens}
% are absorbed. The \meta{setup} is run within a group and may
-% contain any valid input, although only changes in category codes
+% contain any valid input, although only changes in category codes,
+% such as uses of \cs{cctab_select:N},
% are relevant. See also \cs{tl_rescan:nn}.
% \begin{texnote}
% The \meta{tokens} are first turned into a string (using
@@ -332,7 +333,8 @@
% by the \meta{setup} are those in force at the point of use of
% \cs{tl_rescan:nn}.)
% The \meta{setup} is run within a group and may
-% contain any valid input, although only changes in category codes
+% contain any valid input, although only changes in category codes,
+% such as uses of \cs{cctab_select:N},
% are relevant. See also \cs{tl_set_rescan:Nnn}, which is more
% robust than using \cs{tl_set:Nn} in the \meta{tokens} argument of
% \cs{tl_rescan:nn}.
@@ -401,6 +403,19 @@
% \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl { true } { false }
% \end{verbatim}
% yields \texttt{false}.
+% See also \cs{str_if_eq:nnTF} for a comparison that ignores category codes.
+% \end{function}
+%
+% \begin{function}[TF, added = 2020-07-14]{\tl_if_eq:Nn, \tl_if_eq:cn}
+% \begin{syntax}
+% \cs{tl_if_eq:NnTF} \meta{tl~var_1} \Arg{token list_2} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{token list variable_1} and the \meta{token
+% list_2} contain the same list of tokens, both in respect of
+% character codes and category codes. This conditional is not
+% expandable: see \cs{tl_if_eq:NNTF} for an expandable version when
+% both token lists are stored in variables, or \cs{str_if_eq:nnTF} if
+% category codes are not important.
% \end{function}
%
% \begin{function}[TF]{\tl_if_eq:nn}
@@ -409,7 +424,9 @@
% \end{syntax}
% Tests if \meta{token list_1} and \meta{token list_2} contain the
% same list of tokens, both in respect of character codes and category
-% codes.
+% codes. This conditional is not expandable: see \cs{tl_if_eq:NNTF}
+% for an expandable version when token lists are stored in variables,
+% or \cs{str_if_eq:nnTF} if category codes are not important.
% \end{function}
%
% \begin{function}[TF]{\tl_if_in:Nn, \tl_if_in:cn}
@@ -1203,7 +1220,7 @@
% will \emph{not} match the simple text input |-NoValue-|, \emph{i.e.}
% that
% \begin{verbatim}
-% \tl_if_eq:VnTF \c_novalue_tl { -NoValue- }
+% \tl_if_eq:NnTF \c_novalue_tl { -NoValue- }
% \end{verbatim}
% is logically \texttt{false}. The \cs{c_novalue_tl} marker is intended for
% use in creating document-level interfaces, where it serves as an indicator
@@ -2125,8 +2142,34 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\tl_if_eq:nn}
% \begin{variable}{\l_@@_internal_a_tl, \l_@@_internal_b_tl}
+% Temporary storage.
+% \begin{macrocode}
+\tl_new:N \l_@@_internal_a_tl
+\tl_new:N \l_@@_internal_b_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[TF]{\tl_if_eq:Nn}
+% A simple store and compare routine.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \tl_if_eq:Nn #1#2 { T , F , TF }
+ {
+ \group_begin:
+ \tl_set:Nn \l_@@_internal_b_tl {#2}
+ \exp_after:wN
+ \group_end:
+ \if_meaning:w #1 \l_@@_internal_b_tl
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\prg_generate_conditional_variant:Nnn \tl_if_eq:Nn { c } { TF , T , F }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\tl_if_eq:nn}
% A simple store and compare routine.
% \begin{macrocode}
\prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F , TF }
@@ -2142,10 +2185,7 @@
\prg_return_false:
\fi:
}
-\tl_new:N \l_@@_internal_a_tl
-\tl_new:N \l_@@_internal_b_tl
% \end{macrocode}
-% \end{variable}
% \end{macro}
%
% \begin{macro}[TF]{\tl_if_in:Nn, \tl_if_in:cn}
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index d12c5deeed..cffbea2c97 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -992,11 +992,7 @@
% other engines) and category code~$13$.
% \item A character token, characterized by its character code and
% category code (one of $1$, $2$, $3$, $4$, $6$, $7$, $8$, $10$,
-% $11$ or~$12$ whose meaning is described below).\footnote{In
-% \LuaTeX{}, there is also the case of \enquote{bytes}, which behave as
-% character tokens of category code $12$~(other) and character code
-% between $1114112$ and~$1114366$. They are used to output
-% individual bytes to files, rather than UTF-8.}
+% $11$ or~$12$ whose meaning is described below).
% \end{itemize}
% There are also a few internal tokens. The following list may be
% incomplete in some engines.
@@ -1017,6 +1013,19 @@
% \item Tricky programming might access a frozen |\endwrite|.
% \item Some frozen tokens can only be accessed in interactive
% sessions: |\cr|, |\right|, |\endgroup|, |\fi|, |\inaccessible|.
+% \item In \LuaTeX{}, there is also the strange case of \enquote{bytes}
+% |^^^^^^1100|$x$$y$ where $x,y$ are any two lowercase hexadecimal
+% digits, so that the hexadecimal number ranges from
+% $"\text{110000}=1114112$ to~$"\text{1100ff}=1114367$. These are
+% used to output individual bytes to files, rather than UTF-8. For
+% the purposes of token comparisons they behave like non-expandable
+% primitive control sequences (\emph{not characters}) whose
+% \tn{meaning} is \verb*|the character | followed by the given byte.
+% If this byte is in the range |80|--|ff| this gives an ``invalid
+% utf-8 sequence'' error: applying \cs{token_to_str:N} or
+% \cs{token_to_meaning:N} to these tokens is unsafe. Unfortunately,
+% they don't seem to be detectable safely by any means except perhaps
+% Lua code.
% \end{itemize}
%
% The meaning of a (non-active) character token is fixed by its category
@@ -1028,7 +1037,7 @@
% \begin{itemize}
% \item[1] begin-group character (|group_begin|, often |{|),
% \item[2] end-group character (|group_end|, often |}|),
-% \item[3] math shift character (|math_toggle|, often |$|),
+% \item[3] math shift character (|math_toggle|, often |$|), %^^A $
% \item[4] alignment tab character (|alignment|, often |&|),
% \item[6] macro parameter character (|parameter|, often |#|),
% \item[7] superscript character (|math_superscript|, often |^|),
@@ -1058,18 +1067,16 @@
% \item a font selection command,
% \item undefined.
% \end{itemize}
-% Macros be \tn{protected} or not, \tn{long} or not (the opposite of
+% Macros can be \tn{protected} or not, \tn{long} or not (the opposite of
% what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in
% \LaTeX3). Their \tn{meaning} takes the form
% \begin{quote}
-% \meta{properties} |macro:|\meta{parameters}|->|\meta{replacement}
+% \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement}
% \end{quote}
-% where \meta{properties} is among \tn{protected}\tn{long}\tn{outer},
-% \meta{parameters} describes parameters that the macro expects, such as
+% where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer},
+% \meta{argument} describes parameters that the macro expects, such as
% |#1#2#3|, and \meta{replacement} describes how the parameters are
-% manipulated, such as~|#2/#1/#3|.
-%
-% ^^A todo Bruno: discuss here some other subtleties of space tokens? when looking for numbers, when looking for equal signs in let, in expressions, etc.
+% manipulated, such as~|\int_eval:n{#2+#1*#3}|.
%
% Now is perhaps a good time to mention some subtleties relating to
% tokens with category code $10$ (space). Any input character with this
@@ -1087,6 +1094,13 @@
% single tokens \enquote{N-type}, as they are suitable to be used as an
% argument for a function with the signature~\texttt{:N}.
%
+% When a macro takes a delimited argument \TeX{} scans ahead until
+% finding the delimiter (outside any pairs of begin-group/end-group
+% explicit characters), and the resulting list of tokens (with outer
+% braces removed) becomes the argument. Note that explicit space
+% characters at the start of the argument are \emph{not} ignored in this
+% case (and they prevent brace-stripping).
+%
% \end{documentation}
%
% \begin{implementation}
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index 28452d5a2c..334e8b7086 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index 4ea4120d6d..01a6f88ddf 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex
index 985adb77b5..e9381760fc 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/contrib/l3kernel/source3.tex
@@ -53,7 +53,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex
index 83203e6427..5586d73799 100644
--- a/macros/latex/contrib/l3kernel/source3body.tex
+++ b/macros/latex/contrib/l3kernel/source3body.tex
@@ -476,6 +476,7 @@ used on top of \LaTeXe{} if \cs{outer} tokens are used in the arguments.
\ExplSyntaxOff
\DocInput{l3fparray.dtx}
+\DocInput{l3cctab.dtx}
\DocInput{l3sort.dtx}
\DocInput{l3tl-analysis.dtx}
\DocInput{l3regex.dtx}