summaryrefslogtreecommitdiff
path: root/macros/latex/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib')
-rw-r--r--macros/latex/contrib/l3experimental/CHANGELOG.md13
-rw-r--r--macros/latex/contrib/l3experimental/README.md9
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.pdfbin314598 -> 314158 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3cctab.dtx587
-rw-r--r--macros/latex/contrib/l3experimental/l3cctab.ins62
-rw-r--r--macros/latex/contrib/l3experimental/l3cctab.pdfbin358686 -> 0 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3color.dtx576
-rw-r--r--macros/latex/contrib/l3experimental/l3color.pdfbin350143 -> 356022 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-boxes.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-code.pdfbin625280 -> 625002 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-layers.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-paths.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-points.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-scopes.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-softpath.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-state.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-transforms.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.pdfbin491676 -> 491247 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.pdfbin386087 -> 385667 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.pdfbin363448 -> 363017 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3pdf-code.pdfbin278911 -> 278541 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3pdf.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3pdf.pdfbin351127 -> 350700 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.pdfbin345232 -> 344797 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.pdfbin312062 -> 311621 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.pdfbin373229 -> 372787 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.pdfbin286017 -> 285577 bytes
-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
-rw-r--r--macros/latex/contrib/thmtools/README22
-rw-r--r--macros/latex/contrib/thmtools/README.md17
-rw-r--r--macros/latex/contrib/thmtools/TODO3
-rw-r--r--macros/latex/contrib/thmtools/VERSION.tex2
-rw-r--r--macros/latex/contrib/thmtools/changes.txt6
-rw-r--r--macros/latex/contrib/thmtools/doc/COPYING (renamed from macros/latex/contrib/thmtools/COPYING)0
-rw-r--r--macros/latex/contrib/thmtools/doc/VERSION.tex1
-rw-r--r--macros/latex/contrib/thmtools/doc/changes.txt12
-rw-r--r--macros/latex/contrib/thmtools/doc/thmtools-manual.pdfbin0 -> 227619 bytes
-rw-r--r--macros/latex/contrib/thmtools/doc/thmtools-manual.tex (renamed from macros/latex/contrib/thmtools/thmtools-manual.tex)230
-rw-r--r--macros/latex/contrib/thmtools/source/aliasctr.dtx (renamed from macros/latex/contrib/thmtools/aliasctr.dtx)9
-rw-r--r--macros/latex/contrib/thmtools/source/parseargs.dtx (renamed from macros/latex/contrib/thmtools/parseargs.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-amsthm.dtx (renamed from macros/latex/contrib/thmtools/thm-amsthm.dtx)11
-rw-r--r--macros/latex/contrib/thmtools/source/thm-autoref.dtx (renamed from macros/latex/contrib/thmtools/thm-autoref.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-beamer.dtx (renamed from macros/latex/contrib/thmtools/thm-beamer.dtx)11
-rw-r--r--macros/latex/contrib/thmtools/source/thm-kv.dtx (renamed from macros/latex/contrib/thmtools/thm-kv.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-listof.dtx (renamed from macros/latex/contrib/thmtools/thm-listof.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-llncs.dtx (renamed from macros/latex/contrib/thmtools/thm-llncs.dtx)11
-rw-r--r--macros/latex/contrib/thmtools/source/thm-ntheorem.dtx (renamed from macros/latex/contrib/thmtools/thm-ntheorem.dtx)11
-rw-r--r--macros/latex/contrib/thmtools/source/thm-patch.dtx (renamed from macros/latex/contrib/thmtools/thm-patch.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-restate.dtx (renamed from macros/latex/contrib/thmtools/thm-restate.dtx)18
-rw-r--r--macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx (renamed from macros/latex/contrib/thmtools/thmdef-mdframed.dtx)15
-rw-r--r--macros/latex/contrib/thmtools/source/thmdef-shaded.dtx (renamed from macros/latex/contrib/thmtools/thmdef-shaded.dtx)63
-rw-r--r--macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx43
-rw-r--r--macros/latex/contrib/thmtools/source/thmtools.dtx (renamed from macros/latex/contrib/thmtools/thmtools.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thmtools.ins64
-rw-r--r--macros/latex/contrib/thmtools/source/unique.dtx (renamed from macros/latex/contrib/thmtools/unique.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/thmdef-thmbox.dtx36
-rw-r--r--macros/latex/contrib/thmtools/thmtools.ins61
-rw-r--r--macros/latex/contrib/thmtools/thmtools.pdfbin225947 -> 0 bytes
154 files changed, 2475 insertions, 2330 deletions
diff --git a/macros/latex/contrib/l3experimental/CHANGELOG.md b/macros/latex/contrib/l3experimental/CHANGELOG.md
index 51a104cc70..b66593198b 100644
--- a/macros/latex/contrib/l3experimental/CHANGELOG.md
+++ b/macros/latex/contrib/l3experimental/CHANGELOG.md
@@ -7,6 +7,16 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2020-07-17]
+
+### Added
+- `\color_export:nn(n)N` (see #742)
+- Support for multiple color models (see #739)
+
+### Removed
+
+- `l3cctab`: moved to `l3kernel`
+
## [2020-06-18]
### Changed
@@ -139,7 +149,8 @@ this project uses date-based 'snapshot' version identifiers.
- New `l3color` module using `xcolor`-like expression syntax
- New `l3draw` module, based on `pgf` layer of the TikZ system
-[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-18...2020-06-03
[2020-05-18]: https://github.com/latex3/latex3/compare/2020-01-12...2020-05-18
diff --git a/macros/latex/contrib/l3experimental/README.md b/macros/latex/contrib/l3experimental/README.md
index 0a3e72316a..413d946314 100644
--- a/macros/latex/contrib/l3experimental/README.md
+++ b/macros/latex/contrib/l3experimental/README.md
@@ -1,7 +1,7 @@
Experimental LaTeX3 Concepts
============================
-Release 2020-06-18
+Release 2020-07-17
Overview
--------
@@ -22,7 +22,6 @@ updated at the same time.
Currently included in the CTAN release of l3experimental are the following
bundles:
* `l3benchmark`
-* `l3cctab`
* `l3color`
* `l3draw`
* `l3graphics`
@@ -37,12 +36,6 @@ bundles:
This module provides support for benchmarking the performance of code.
-`l3cctab`
----------
-
-This module provides support for saving and restoring category codes
-_en masse_ in a table. This is supported for the 8-bit range for all engines,
-and for the entire Unicode range with LuaTeX.
`l3color`
---------
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.dtx b/macros/latex/contrib/l3experimental/l3benchmark.dtx
index a5654f97cd..bd5fa245a9 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.dtx
+++ b/macros/latex/contrib/l3experimental/l3benchmark.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -130,7 +130,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3benchmark}{2020-06-18}{}
+\ProvidesExplPackage{l3benchmark}{2020-07-17}{}
{L3 Experimental benchmarking}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.pdf b/macros/latex/contrib/l3experimental/l3benchmark.pdf
index 6bfd2b5bec..7b2598f0d5 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.pdf
+++ b/macros/latex/contrib/l3experimental/l3benchmark.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3cctab.dtx b/macros/latex/contrib/l3experimental/l3cctab.dtx
deleted file mode 100644
index 4bda61148d..0000000000
--- a/macros/latex/contrib/l3experimental/l3cctab.dtx
+++ /dev/null
@@ -1,587 +0,0 @@
-% \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 "l3experimental 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|package>
-\RequirePackage{expl3}
-%</driver|package>
-%<*driver>
-\documentclass[full]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \pkg{l3cctab} package\\ Experimental 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-06-18}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% \section{\pkg{l3cctab} 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.
-%
-% \subsection{Creating and initialising category code tables}
-%
-% \begin{function}{\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}{\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} with the category code settings in
-% force at the time the function is called, and applies the
-% \meta{category code set up} on top of prevailing settings, then saves
-% as a constant table.
-% \end{function}
-%
-% \begin{function}{\cctab_gset:Nn,\cctab_gset:cn}
-% \begin{syntax}
-% \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up}
-% \end{syntax}
-% Sets the \meta{category code table} to apply the category codes
-% which apply when the prevailing régime is modified by the
-% \meta{category code set up}. Thus within a standard code block
-% the starting point will be the code applied by \cs{c_code_cctab}.
-% The assignment of the table is global: the underlying primitive does
-% not respect grouping.
-% \end{function}
-%
-% \subsection{Using category code tables}
-%
-% \begin{function}{\cctab_begin:N,\cctab_begin:c}
-% \begin{syntax}
-% \cs{cctab_begin:N} \meta{category code table}
-% \end{syntax}
-% Switches 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}{\cctab_end:}
-% \begin{syntax}
-% \cs{cctab_end:}
-% \end{syntax}
-% Ends the scope of a \meta{category code table} started using
-% \cs{cctab_begin:N}, retuning the codes to those in force before
-% the matching \cs{cctab_begin:N} was used.
-% \end{function}
-%
-% \begin{function}[added = 2020-05-19]{\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.
-% \end{function}
-%
-% \subsection{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}
-%
-% \subsection{Constant category code tables}
-%
-% \begin{variable}{\c_code_cctab}
-% Category code table for the code environment. This does not include
-% setting the behaviour of the line-end character, which is only
-% altered by \cs{ExplSyntaxOn}.
-% \end{variable}
-%
-% \begin{variable}{\c_document_cctab}
-% Category code table for a standard \LaTeX{} document. This does not
-% include setting the behaviour of the line-end character, which is
-% only altered by \cs{ExplSyntaxOff}.
-% \end{variable}
-%
-% \begin{variable}{\c_initex_cctab}
-% Category code table as set up by \IniTeX{}.
-% \end{variable}
-%
-% \begin{variable}{\c_other_cctab}
-% Category code table where all characters have category code $12$
-% (other).
-% \end{variable}
-%
-% \begin{variable}{\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}
-%
-% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3cctab}{2020-06-18}{}
- {L3 Experimental category code tables}
-%</package>
-% \end{macrocode}
-%
-% \begin{variable}{\g_@@_allocate_int}
-% \begin{variable}{\g_@@_stack_int}
-% \begin{variable}{\g_@@_stack_seq}
-% To allocate category code tables, both the read-only and stack
-% tables need to be followed. There is also a sequence stack for the
-% dynamic tables themselves.
-% \begin{macrocode}
-\int_new:N \g_@@_allocate_int
-\int_gset:Nn \g_@@_allocate_int { -1 }
-\int_new:N \g_@@_stack_int
-\seq_new:N \g_@@_stack_seq
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_tmp_tl}
-% Scratch space.
-% \begin{macrocode}
-\tl_new:N \l_@@_tmp_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\cctab_new:N,\cctab_new:c}
-% \begin{macro}{\@@_begin:N,\@@_begin:c}
-% \begin{macro}{\@@_end:}
-% \begin{macro}{\cctab_gset:Nn,\cctab_gset:cn}
-% As \LuaTeX{} offers engine support for category code tables, and this is
-% entirely lacking from the other engines, we need two complementary
-% approaches here. Rather than intermix them, we split the set up based on
-% engine. (Some future \XeTeX{} may add support, at which point the
-% conditional here would be subtly different.)
-%
-% First, the \LuaTeX{} case.
-% \begin{macrocode}
-\sys_if_engine_luatex:TF
- {
-% \end{macrocode}
-% Creating a new category code table is done slightly differently
-% from other registers. Low-numbered tables are more efficiently-stored
-% than high-numbered ones. There is also a need to have a stack of
-% flexible tables as well as the set of read-only ones. To satisfy both
-% of these requirements, odd numbered tables are used for read-only
-% tables, and even ones for the stack. Here, therefore, the odd numbers
-% are allocated.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_new:N #1
- {
- \__kernel_chk_if_free_cs:N #1
-%<*initex>
- \int_gadd:Nn \g_@@_allocate_int { 2 }
- \int_compare:nNnTF
- \g_@@_allocate_int < { \c_max_register_int + 1 }
- {
- \tex_global:D \tex_chardef:D #1 \g_@@_allocate_int
- \tex_initcatcodetable:D #1
- }
- {
- \__kernel_msg_fatal:nnx
- { kernel } { out-of-registers } { cctab }
- }
-%</initex>
-%<*package>
- \newcatcodetable #1
-%</package>
- }
-% \end{macrocode}
-% The aim here is to ensure that the saved tables are read-only. This is
-% done by using a stack of tables which are not read only, and actually
-% having them as \enquote{in use} copies.
-% \begin{macrocode}
- \cs_new_protected:Npn \@@_begin:N #1
- {
- \seq_gpush:Nx \g_@@_stack_seq { \tex_the:D \tex_catcodetable:D }
- \tex_catcodetable:D #1
- \int_gadd:Nn \g_@@_stack_int { 2 }
- \int_compare:nNnT \g_@@_stack_int > \c_max_register_int
- { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
- \tex_savecatcodetable:D \g_@@_stack_int
- \tex_catcodetable:D \g_@@_stack_int
- }
- \cs_new_protected:Npn \@@_end:
- {
- \int_gsub:Nn \g_@@_stack_int { 2 }
- \seq_if_empty:NTF \g_@@_stack_seq
- { \tl_set:Nn \l_@@_tmp_tl { 0 } }
- { \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl }
- \tex_catcodetable:D \l_@@_tmp_tl \scan_stop:
- }
-% \end{macrocode}
-% Category code tables are always global, so only one version is needed.
-% The set up here is simple, and means that at the point of use there is
-% no need to worry about escaping category codes.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_gset:Nn #1#2
- {
- \group_begin:
- #2 \scan_stop:
- \tex_savecatcodetable:D #1
- \group_end:
- }
- }
-% \end{macrocode}
-% Now the case for other engines. Here, we use an integer array for each
-% table. The index base is out-by-one, so we have an internal function to
-% handle that. The rest of the approach here is pretty simple: use a stack
-% of tables, and save to them at each |begin|. Unlike the \LuaTeX{} case,
-% we can't accidentally alter a saved table, which makes life a little
-% easier.
-% \begin{macrocode}
- {
- \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N #1 _cctab } { #2 + 1 } {#3}
- }
-% \end{macrocode}
-% Following the \LuaTeX{} pattern, a new table starts with \IniTeX{} codes.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_new:N #1
- {
- \int_gadd:Nn \g_@@_allocate_int { 2 }
- \int_const:Nn #1 { \g_@@_allocate_int }
- \intarray_new:cn { g_@@_ \int_use:N #1 _cctab } { 256 }
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N #1 _cctab } {##1} { 12 }
- }
- \@@_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_new_protected:Npn \@@_begin:N #1
- {
- \int_gadd:Nn \g_@@_stack_int { 2 }
- \int_compare:nNnT \g_@@_stack_int > \c_max_register_int
- { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
- \cs_if_exist:cF { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {
- \intarray_new:cn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- { 256 }
- }
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {##1}
- { \char_value_catcode:n { ##1 - 1 } }
- }
- \int_step_inline:nn { 256 }
- {
- \char_set_catcode:nn { ##1 - 1 }
- {
- \intarray_item:cn
- { g_@@_ \int_use:N #1 _cctab } {##1}
- }
- }
- }
- \cs_generate_variant:Nn \intarray_new:Nn { c }
- \cs_generate_variant:Nn \intarray_gset:Nnn { c }
- \cs_new_protected:Npn \@@_end:
- {
- \int_step_inline:nn { 256 }
- {
- \char_set_catcode:nn { ##1 - 1 }
- {
- \intarray_item:cn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {##1}
- }
- }
- \int_gsub:Nn \g_@@_stack_int { 2 }
- }
- \cs_generate_variant:Nn \intarray_item:Nn { c }
- \cs_new_protected:Npn \cctab_gset:Nn #1#2
- {
- \group_begin:
- #2 \scan_stop:
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn { g_@@_ \int_use:N #1 _cctab } {##1}
- { \char_value_catcode:n { ##1 - 1 } }
- }
- \group_end:
- }
- }
-\cs_generate_variant:Nn \cctab_new:N { c }
-\cs_generate_variant:Nn \cctab_gset:Nn { c }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\cctab_begin:N,\cctab_end:}
-% These functions perform a few sanity checks before calling the
-% functions which will do the heavy-lifting.
-% \cs{cctab_begin:N} checks if a \meta{cctab~var} exists before trying
-% to use it. \cs{cctab_end:} checks if a \cs{cctab_begin:N} was used
-% some time earlier.
-%
-% Skipping these checks would result in an \enquote{Undefined control
-% sequence} error for \cs{cctab_begin:N} with an undefined
-% \meta{cctab~var}, and a \enquote{Missing font identifier} for an extra
-% \cs{cctab_end:}.
-% \begin{macrocode}
-\cs_new_protected:Npn \cctab_begin:N #1
- { \@@_chk_if_valid:NT #1 { \@@_begin:N #1 } }
-\cs_generate_variant:Nn \cctab_begin:N { c }
-\cs_new_protected:Npn \cctab_end:
- {
- \int_compare:nNnTF { \g_@@_stack_int } = { \c_zero_int }
- { \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
- { \@@_end: }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cctab_select:N}
-% \begin{macro}{\@@_end_fast:}
-% Select a catcode table within a group.
-% \begin{macrocode}
-\cs_new_protected:Npn \cctab_select:N #1
- {
- \@@_chk_if_valid:NT #1
- {
- \@@_begin:N #1
- \group_insert_after:N \@@_end_fast:
- }
- }
-\cs_generate_variant:Nn \cctab_select:N { c }
-\cs_new_protected:Npx \@@_end_fast:
- {
- \int_gsub:Nn \exp_not:N \g_@@_stack_int { 2 }
- \sys_if_engine_luatex:T
- { \seq_gpop:NN \exp_not:N \g_@@_stack_seq \exp_not:N \l_@@_tmp_tl }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \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}{\@@_chk_if_valid:N}
-% 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
-% underlying \cs[no-index]{g_@@_\meta{integer}_cctab}
-% \meta{intarray~var} exists.
-% \begin{macrocode}
-\sys_if_engine_luatex:TF
- {
- \prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
- { TF , T , F }
- {
- \cctab_if_exist: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>
- { \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:
- }
- }
- }
- {
- \prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
- { TF , T , F }
- {
- \cctab_if_exist:NTF #1
- {
- \cs_if_exist:cTF { g_@@_ \int_use:N #1 _cctab }
- { \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:
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \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_code_cctab ,
-% \c_document_cctab ,
-% \c_other_cctab ,
-% \c_str_cctab
-% }
-% Creating category code tables is easy using the function above.
-% The \texttt{other} and \texttt{string} ones are done by completely
-% ignoring the existing codes as this makes life a lot less complex.
-% \begin{macrocode}
-\cctab_new:N \c_initex_cctab
-\cctab_const:Nn \c_code_cctab { }
-\cctab_const:Nn \c_document_cctab
- {
- \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 }
- }
-\cctab_const:Nn \c_other_cctab
- {
- \int_step_inline:nnn { 0 } { 127 }
- { \char_set_catcode_other:n {#1} }
- }
-\cctab_const:Nn \c_str_cctab
- {
- \int_step_inline:nnn { 0 } { 127 }
- { \char_set_catcode_other:n {#1} }
- \char_set_catcode_space:n { 32 }
- }
-% \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 } { 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.
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-%\end{implementation}
-%
-%\PrintIndex
diff --git a/macros/latex/contrib/l3experimental/l3cctab.ins b/macros/latex/contrib/l3experimental/l3cctab.ins
deleted file mode 100644
index e968f1bf83..0000000000
--- a/macros/latex/contrib/l3experimental/l3cctab.ins
+++ /dev/null
@@ -1,62 +0,0 @@
-\iffalse meta-comment
-
-File: l3cctab.ins
-
-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 "l3experimental 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.
-
------------------------------------------------------------------------
-
-Any modification of this file should ensure that the copyright and
-license information is placed in the derived files.
-
-\fi
-
-\input l3docstrip.tex
-\askforoverwritefalse
-
-\preamble
-
-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 "l3experimental bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-
-\keepsilent
-
-\generate{\file{l3cctab.sty}
- {
- \from{l3cctab.dtx}{package}
- }
-}
-
-\endbatchfile
diff --git a/macros/latex/contrib/l3experimental/l3cctab.pdf b/macros/latex/contrib/l3experimental/l3cctab.pdf
deleted file mode 100644
index bd691d11c2..0000000000
--- a/macros/latex/contrib/l3experimental/l3cctab.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3color.dtx b/macros/latex/contrib/l3experimental/l3color.dtx
index 8a87d390b4..91cb13e0b4 100644
--- a/macros/latex/contrib/l3experimental/l3color.dtx
+++ b/macros/latex/contrib/l3experimental/l3color.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -190,9 +190,9 @@
%
% \begin{function}{\color_set:nnn}
% \begin{syntax}
-% \cs{color_set:nnn} \Arg{name} \Arg{model} \Arg{value(s)}
+% \cs{color_set:nnn} \Arg{name} \Arg{model(s)} \Arg{value(s)}
% \end{syntax}
-% Stores the color specification equivalent to the \meta{model} and
+% Stores the color specification equivalent to the \meta{model(s)} and
% \meta{values} as the \meta{name}.
% \end{function}
%
@@ -225,9 +225,9 @@
%
% \begin{function}{\color_select:nn}
% \begin{syntax}
-% \cs{color_select:nn} \Arg{model} \Arg{value(s)}
+% \cs{color_select:nn} \Arg{model(s)} \Arg{value(s)}
% \end{syntax}
-% Activates the color specification equivalent to the \meta{model} and
+% Activates the color specification equivalent to the \meta{model(s)} and
% \meta{value(s)} for typeset material.
% \end{function}
%
@@ -237,23 +237,69 @@
% and similar are not influenced by this setting.
% \end{variable}
%
-% \section{Core color representation}
+% \section{Multiple color models}
%
-% To allow data to be handled internally, \pkg{l3color} uses a simple
-% representation of color, comprising two \meta{balanced text} entries, the first
-% the \meta{model} and the second the \meta{values} given
-% \emph{separated by spaces}.
-%
-% This core representation is produced when parsing color expressions.
+% When selecting or setting a color with an explicit model, it is possible
+% to give values for more than one model at one time. This is particularly
+% useful where automated conversion between models does not give the desired
+% outcome. To do this, the list of models and list of values are both subdivided
+% using |/| characters (as for the similar function in \pkg{xcolor}). For
+% example, to save a color with explicit |cmyk| and |rgb| values, one could
+% use
+% \begin{verbatim}
+% \color_set:nnn { foo } { cmyk / rgb }
+% { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 }
+% \end{verbatim}
+% The manually-specified conversion will be used in preference to automated
+% calculation whenever the model(s) listed are used: both in expressions and
+% when a fixed model is active.
%
-% \begin{function}{\color_parse:nN}
+% Similarly, the same syntax can be applied to directly selecting a color.
+% \begin{verbatim}
+% \color_select:nn { cmyk / rgb }
+% { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 }
+% \end{verbatim}
+% Again, this list is used when a fixed model is active: the first entry is used
+% unless there is a fixed model matching one of the other entries.
+%
+% \section{Exporting color specifications}
+%
+% The major use of color expressions is in setting typesetting output, but there
+% are other places in which some form of color information is required. These
+% may need data in a different format or using a different model to the internal
+% representation. Thus a set of functions are available to export colors in
+% different formats.
+%
+% Valid export targets are
+% \begin{itemize}
+% \item \texttt{backend} Two brace groups: the first containing the
+% model, the second containing space-separated values appropriate
+% for the model; this is the format required by backend functions
+% of \pkg{expl3}
+% \item \texttt{HTML} Uppercase two-digit hexadecimal values, expressing
+% a red-green-blue color; the digits are \emph{not} separated
+% \item \texttt{space-sep-cmyk} Space-separated cyan-magenta-yellow-black
+% values
+% \item \texttt{space-sep-rgb} Space-separated red-green-blue values
+% suitable for use as a PDF annotation color
+% \end{itemize}
+%
+% \begin{function}{\color_export:nnN}
% \begin{syntax}
-% \cs{color_parse:nN} \Arg{color expression} \Arg{tl}
+% \cs{color_export:nnN} \Arg{color expression} \Arg{format} \Arg{tl}
% \end{syntax}
-% Parses the \meta{color expression} as described above, and sets the
-% \meta{tl} to the equivalent \meta{core color representation}
-% (used at the backend level and based on \texttt{dvips} color
-% representation).
+% Parses the \meta{color expression} as described earlier,
+% then converts to the \meta{format} specified and assigns the data to the
+% \meta{tl}.
+% \end{function}
+%
+% \begin{function}{\color_export:nnN}
+% \begin{syntax}
+% \cs{color_export:nnnN} \Arg{model} \Arg{value(s)} \Arg{format} \Arg{tl}
+% \end{syntax}
+% Expresses the combination of \meta{model} and \meta{value(s)} in an
+% internal representation, then converts to the \meta{format} specified and
+% assigns the data to the \meta{tl}.
% \end{function}
%
% \section{Spot colors}
@@ -275,7 +321,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3color}{2020-06-18}{}
+\ProvidesExplPackage{l3color}{2020-07-17}{}
{L3 Experimental color support}
%</package>
% \end{macrocode}
@@ -297,8 +343,8 @@
% functions).
%
% Since there is no need to manipulate colors \emph{en masse}, each is stored
-% in a separate token list variable, rather than the alternative of using a
-% single property list for all names.
+% in a two-part structure: a \texttt{prop} for the colors themselves, and a
+% \texttt{tl} for the default model for each color.
%
% \subsection{Setup}
%
@@ -323,42 +369,37 @@
% \begin{macrocode}
\prg_new_conditional:Npnn \@@_if_defined:n #1 { T, F, TF }
{
- \tl_if_exist:cTF { l_@@_named_ #1 _tl }
+ \prop_if_exist:cTF { l_@@_named_ #1 _prop }
\prg_return_true:
\prg_return_false:
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP]{\@@_model:N, \@@_values:N}
+% Simple abstractions.
+% \begin{macrocode}
+\cs_new:Npn \@@_model:N #1 { \exp_after:wN \use_i:nn #1 }
+\cs_new:Npn \@@_values:N #1 { \exp_after:wN \use_ii:nn #1 }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_extract:nNN, \@@_extract:VNN}
-% \begin{macro}{\@@_extract:NNnn}
-% Split the model and color from a named color, and store the two. No test
-% for the existence of the color: that is assumed to be the case (this
-% is internal only). Somewhat \enquote{old-fashioned} but should be quite
-% fast.
+% Recover the values for the standard model for a color.
% \begin{macrocode}
\cs_new_protected:Npn \@@_extract:nNN #1#2#3
{
- \exp_after:wN \exp_after:wN \exp_after:wN
- \@@_extract:NNnn
- \exp_after:wN \exp_after:wN \exp_after:wN #2
- \exp_after:wN \exp_after:wN \exp_after:wN #3
- \cs:w l_@@_named_ #1 _tl \cs_end:
+ \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl }
+ \prop_get:cVN { l_@@_named_ #1 _prop } #2 #3
}
\cs_generate_variant:Nn \@@_extract:nNN { V }
-\cs_new_protected:Npn \@@_extract:NNnn #1#2#3#4
- {
- \tl_set:Nn #1 {#3}
- \tl_set:Nn #2 {#4}
- }
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \subsection{Model conversion}
%
% \begin{macro}{\@@_convert:nnN, \@@_convert:VVN}
-% \begin{macro}{\@@_convert:nnnN}
+% \begin{macro}{\@@_convert:nnnN, \@@_convert:nVnN, \@@_convert:nnVN}
% \begin{macro}[aux, EXP]
% {
% \@@_convert_gray_rgb:w
@@ -383,7 +424,7 @@
\tl_set:Nx #4
{ \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s_@@_stop }
}
-\cs_generate_variant:Nn \@@_convert:nnnN { nnV }
+\cs_generate_variant:Nn \@@_convert:nnnN { nV , nnV }
\cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \s_@@_stop
{ #1 ~ #1 ~ #1 }
\cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \s_@@_stop
@@ -442,12 +483,15 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\color_parse:nN}
% \begin{macro}{\@@_parse:nN}
+% \begin{macro}{\@@_parse_aux:nN}
+% \begin{macro}{\@@_parse_eq:Nn}
+% \begin{macro}{\@@_parse_eq:nNn}
% \begin{macro}{\@@_parse:Nw}
% \begin{macro}{\@@_parse_loop_init:Nnn}
% \begin{macro}{\@@_parse_loop:w}
% \begin{macro}{\@@_parse_loop:nn}
+% \begin{macro}{\@@_parse_gray:n, \@@_parse_std:n}
% \begin{macro}{\@@_parse_break:w}
% \begin{macro}{\@@_parse_end:}
% \begin{macro}[aux, EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn}
@@ -462,37 +506,73 @@
% otherwise expands, then starts working through the expression itself.
% At the end, we apply the payload.
% \begin{macrocode}
-\cs_new_protected:Npn \color_parse:nN #1#2
+\cs_new_protected:Npx \@@_parse:nN #1#2
{
%<*package>
- \@@_backend_pickup:N \l_@@_current_tl
- \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
+ \exp_not:N \@@_backend_pickup:N \exp_not:N \l_@@_current_tl
+ \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
+ \prop_put:NVx \exp_not:c { l_@@_named_ . _prop }
+ \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl }
%</package>
- \exp_args:Ne \@@_parse:nN { \tl_to_str:n {#1} } #2
+ \exp_not:N \exp_args:Ne \exp_not:N \@@_parse_aux:nN
+ { \exp_not:N \tl_to_str:n {#1} } #2
}
% \end{macrocode}
% Before going to all of the effort of parsing an expression, these two
% precursor functions look for a pre-defined name, either on its own or
% with a trailing |!| (which is the same thing).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse:nN #1#2
+\cs_new_protected:Npn \@@_parse_aux:nN #1#2
{
- \tl_if_exist:cTF { l_@@_named_ #1 _tl }
- { \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl } }
+ \tl_if_exist:cTF { l_@@_named_ #1 _prop }
+ { \@@_parse_set_eq:Nn #2 {#1} }
{ \@@_parse:Nw #2#1 ! \s_@@_stop }
\@@_check_model:N #2
}
+\cs_new_protected:Npn \@@_parse_set_eq:Nn #1#2
+ {
+ \tl_if_empty:NTF \l_color_fixed_model_tl
+ { \exp_args:Nv \@@_parse_set_eq:nNn { l_@@_named_ #2 _tl } }
+ { \exp_args:NV \@@_parse_set_eq:nNn \l_color_fixed_model_tl }
+ #1 {#2}
+ }
+% \end{macrocode}
+% Here, we have to allow for the case where there is a fixed model:
+% that can't be swept up by generic conversion as we are dealing with a
+% named color.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_set_eq:nNn #1#2#3
+ {
+ \prop_get:cnNTF
+ { l_@@_named_ #3 _prop } {#1}
+ \l_@@_value_tl
+ { \tl_set:Nx #2 { {#1} { \l_@@_value_tl } } }
+ {
+ \tl_set_eq:Nc \l_@@_model_tl { l_@@_named_ #3 _tl }
+ \prop_get:cVN { l_@@_named_ #3 _prop } \l_@@_model_tl
+ \l_@@_value_tl
+ \@@_convert:nnN
+ \l_@@_model_tl {#1} \l_@@_value_tl
+ \tl_set:Nx #2
+ {
+ {#1}
+ { \l_@@_value_tl }
+ }
+ }
+ }
\cs_new_protected:Npn \@@_parse:Nw #1#2 ! #3 \s_@@_stop
{
\@@_if_defined:nTF {#2}
{
\tl_if_blank:nTF {#3}
- { \tl_set_eq:Nc #1 { l_@@_named_ #2 _tl } }
+ { \@@_parse_set_eq:Nn #1 {#2} }
{ \@@_parse_loop_init:Nnn #1 {#2} {#3} }
}
{
\__kernel_msg_error:nnn { color } { unknown-color } {#2}
- \tl_set_eq:NN \l_@@_current_tl \l_@@_named_black_tl
+ \tl_set:Nn \l_@@_current_tl { { gray } { 0 } }
}
}
% \end{macrocode}
@@ -562,24 +642,9 @@
\@@_extract:nNN {#2} \l_@@_next_model_tl \l_@@_next_value_tl
\tl_if_eq:NNF \l_@@_model_tl \l_@@_next_model_tl
{
- \str_if_eq:VnT \l_@@_model_tl { gray }
- {
- \use:x
- {
- \tl_set:Nn \exp_not:N \l_@@_model_tl
- { \l_@@_next_model_tl }
- \tl_set:Nn \exp_not:N \l_@@_value_tl
- { \l_@@_next_value_tl }
- \tl_set:Nn \exp_not:N \l_next_@@_model_tl
- { \l_@@_model_tl }
- \tl_set:Nn \exp_not:N \l_next_@@_value_tl
- { \l_@@_value_tl }
- }
- }
- \@@_convert:VVN
- \l_@@_next_model_tl
- \l_@@_model_tl
- \l_@@_next_value_tl
+ \str_if_eq:VnTF \l_@@_model_tl { gray }
+ { \@@_parse_gray:n {#2} }
+ { \@@_parse_std:n {#2} }
}
\tl_set:Nx \l_@@_value_tl
{
@@ -593,6 +658,31 @@
\@@_parse_break:w
}
}
+% \end{macrocode}
+% The \texttt{gray} model needs special handling: the models need to be
+% swapped: we do that using a dedicated function.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_gray:n #1
+ {
+ \tl_set_eq:NN \l_@@_model_tl \l_@@_next_model_tl
+ \tl_set:Nn \l_@@_next_model_tl { gray }
+ \exp_args:NnV \@@_convert:nnN { gray } \l_@@_model_tl
+ \l_@@_value_tl
+ \prop_get:cVN { l_@@_named_ #1 _prop } \l_@@_model_tl
+ \l_@@_next_value_tl
+ }
+\cs_new_protected:Npn \@@_parse_std:n #1
+ {
+ \prop_get:cVNF { l_@@_named_ #1 _prop }
+ \l_@@_model_tl
+ \l_@@_next_value_tl
+ {
+ \@@_convert:VVN
+ \l_@@_next_model_tl
+ \l_@@_model_tl
+ \l_@@_next_value_tl
+ }
+ }
\cs_new_protected:Npn \@@_parse_break:w #1 \@@_parse_end: { }
\cs_new_protected:Npn \@@_parse_end: { }
% \end{macrocode}
@@ -640,6 +730,9 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}[EXP]
% {
@@ -814,52 +907,91 @@
% will therefore always be available. The finalisation is separate from the
% main function so it can also be applied to \emph{e.g.}~page color.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_select:
+\cs_new_protected:Npx \@@_select:
{
- \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
- \@@_select:N \l_@@_current_tl
+ \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
+ \prop_clear:N \exp_not:c { l_@@_named_ . _prop }
+ \prop_put:NVx \exp_not:c { l_@@_named_ . _prop }
+ \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl }
+ \@@_select:N \exp_not:N \l_@@_current_tl
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\color_select:n}
% \begin{macro}{\color_select:nn}
+% \begin{macro}{\@@_select_main:Nw, \@@_select_loop:Nw}
+% \begin{macro}{\@@_select:nnN}
+% \begin{macro}{\@@_select_swap:Nnn}
% Parse the input expressions then get the backend to actually activate
-% them.
+% them. The main complexity here is the need to check through multiple models.
+% That is done \enquote{locally} here as the approach is subtly different to
+% when different models are being stored.
% \begin{macrocode}
\cs_new_protected:Npn \color_select:n #1
{
- \color_parse:nN {#1} \l_@@_current_tl
+ \@@_parse:nN {#1} \l_@@_current_tl
\@@_select:
}
\cs_new_protected:Npn \color_select:nn #1#2
{
- \@@_direct:nnN {#1} {#2} \l_@@_current_tl
+ \@@_select_main:Nw \l_@@_current_tl
+ #1 / / \s_@@_mark #2 / / \s_@@_stop
\@@_select:
}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Direct model use}
-%
-% \begin{macro}{\@@_direct:nnN}
-% Directly set a color based on a model/value combination.
+% If the first color model is the fixed one, or if there is no fixed
+% model, we don't need most of the data: just set up and apply the backend
+% function.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_direct:nnN #1#2#3
+\cs_new_protected:Npn \@@_select_main:Nw
+ #1 #2 / #3 / #4 \s_@@_mark #5 / #6 / #7 \s_@@_stop
+ {
+ \@@_select:nnN {#2} {#5} #1
+ \bool_lazy_or:nnF
+ { \tl_if_empty_p:N \l_color_fixed_model_tl }
+ { \str_if_eq_p:nV {#2} \l_color_fixed_model_tl }
+ { \@@_select_loop:Nw #1 #3 / #4 \s_@@_mark #6 / #7 \s_@@_stop }
+ }
+% \end{macrocode}
+% If a fixed model applies, we need to check each possible value in order.
+% If there is no hit at all, fall back on the generic formula-based
+% interchange.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_select_loop:Nw
+ #1 #2 / #3 \s_@@_mark #4 / #5 \s_@@_stop
+ {
+ \str_if_eq:nVTF {#2} \l_color_fixed_model_tl
+ { \@@_select:nnN {#2} {#4} #1 }
+ {
+ \tl_if_blank:nTF {#2}
+ { \exp_after:wN \@@_select_swap:Nnn \exp_after:wN #1 #1 }
+ { \@@_select_loop:Nw #1 #3 \s_@@_mark #5 \s_@@_stop }
+ }
+ }
+\cs_new_protected:Npn \@@_select:nnN #1#2#3
{
\cs_if_exist:cTF { @@_parse_model_ #1 :w }
{
\tl_set:Nx #3
{ \use:c { @@_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \s_@@_stop }
- \@@_check_model:N #3
- }
- {
- \__kernel_msg_error:nnn { color } { unknown-model } {#1}
}
+ { \__kernel_msg_error:nnn { color } { unknown-model } {#1} }
+ }
+\cs_new_protected:Npn \@@_select_swap:Nnn #1#2#3
+ {
+ \@@_convert:nVnN {#2} \l_color_fixed_model_tl {#3} \l_@@_value_tl
+ \tl_set:Nx #1
+ { { \l_color_fixed_model_tl } { \l_@@_value_tl } }
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \subsection{Defining named colors}
%
@@ -870,44 +1002,113 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_store:Nn}
-% Store the named color unless it has an invalid name.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_store:Nn #1#2
+% \begin{macro}{\color_set:nn}
+% \begin{macro}{\@@_set:nnn}
+% \begin{macro}{\@@_set:nn}
+% \begin{macro}{\@@_set:nnw}
+% \begin{macro}{\color_set:nnn}
+% \begin{macro}{\@@_set_loop:nw}
+% \begin{macro}{\color_set_eq:nn}
+% Defining named colors means working through the model list and saving
+% both the \enquote{main} color and any equivalents in other models. Even
+% if there is only one model, we store a |prop| as well as a |tl|, as there
+% could be grouping weirdness, etc. When setting using an expression,
+% we need to avoid any fixed model issues, which is done without a group as
+% in \pkg{l3keys}.
+% \begin{macrocode}
+\cs_new_protected:Npn \color_set:nn #1#2
+ {
+ \exp_args:NV \@@_set:nnn
+ \l_color_fixed_model_tl {#1} {#2}
+ }
+\cs_new_protected:Npn \@@_set:nnn #1#2#3
+ {
+ \tl_clear:N \l_color_fixed_model_tl
+ \@@_set:nn {#2} {#3}
+ \tl_set:Nn \l_color_fixed_model_tl {#1}
+ }
+\cs_new_protected:Npn \@@_set:nn #1#2
{
- \str_if_eq:nnF {#2} { . }
+ \str_if_eq:nnF {#1} { . }
{
- \tl_clear_new:c { l_@@_named_ #2 _tl }
- \tl_set_eq:cN { l_@@_named_ #2 _tl } #1
+ \@@_parse:nN {#2} \l_@@_named_tl
+ \tl_clear_new:c { l_@@_named_ #1 _tl }
+ \tl_set:cx { l_@@_named_ #1 _tl }
+ { \@@_model:N \l_@@_named_tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
+ \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl }
+ { \@@_values:N \l_@@_named_tl }
+ \@@_set:nnw {#1} {#2} #2 ! \s_@@_stop
}
}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\color_set:nn}
-% \begin{macro}{\color_set:nnn}
-% \begin{macro}{\color_set_eq:nn}
-% Defining named colors has to include a step to force creation of the
-% underlying token list to avoid errors when checking is enabled.
+% When setting an expression-based color, there could be multiple model
+% data available for one or more of the input colors. Where that is true for
+% the \emph{first} named color in an expression, we re-parse the expression
+% when they are also parameter-based: only |cmyk|, |gray| and |rgb| make
+% any sense here. There is a bit of a performance hit but this should be
+% rare and taking place during set-up.
% \begin{macrocode}
-\cs_new_protected:Npn \color_set:nn #1#2
+\cs_new_protected:Npn \@@_set:nnw #1#2#3 ! #4 \s_@@_stop
{
- \color_parse:nN {#2} \l_@@_named_tl
- \@@_store:Nn \l_@@_named_tl {#1}
+ \clist_map_inline:nn { cmyk , gray , rgb }
+ {
+ \prop_get:cnNT { l_@@_named_ #3 _prop } {##1} \l_@@_internal_tl
+ {
+ \prop_if_in:cnF { l_@@_named_ #1 _prop } {##1}
+ {
+ \group_begin:
+ \tl_set:cn { l_@@_named_ #3 _tl } {##1}
+ \@@_parse:nN {#2} \l_@@_internal_tl
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l_@@_internal_tl \l_@@_internal_tl
+ \prop_put:cxx { l_@@_named_ #1 _prop }
+ { \@@_model:N \l_@@_internal_tl }
+ { \@@_values:N \l_@@_internal_tl }
+ }
+ }
+ }
}
\cs_new_protected:Npn \color_set:nnn #1#2#3
{
- \@@_direct:nnN {#2} {#3} \l_@@_named_tl
- \@@_store:Nn \l_@@_named_tl {#1}
+ \str_if_eq:nnF {#1} { . }
+ {
+ \tl_clear_new:c { l_@@_named_ #1 _tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
+ \@@_set_loop:nw {#1} #2 / / \s_@@_mark #3 / / \s_@@_stop
+ }
+ }
+\cs_new_protected:Npn \@@_set_loop:nw
+ #1#2 / #3 \s_@@_mark #4 / #5 \s_@@_stop
+ {
+ \tl_if_blank:nF {#2}
+ {
+ \@@_select:nnN {#2} {#4} \l_@@_named_tl
+ \tl_set:Nx \l_@@_internal_tl { \@@_model:N \l_@@_named_tl }
+ \tl_if_empty:cT { l_@@_named_ #1 _tl }
+ { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_internal_tl }
+ \prop_put:cVx { l_@@_named_ #1 _prop } \l_@@_internal_tl
+ { \@@_values:N \l_@@_named_tl }
+ \@@_set_loop:nw {#1} #3 \s_@@_mark #5 \s_@@_stop
+ }
}
\cs_new_protected:Npn \color_set_eq:nn #1#2
{
\@@_if_defined:nTF {#2}
{
\tl_clear_new:c { l_@@_named_ #1 _tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
\str_if_eq:nnTF {#2} { . }
- { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_current_tl }
- { \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl } }
+ {
+ \tl_set:cx { l_@@_named_ #1 _tl }
+ { \@@_model:N \l_@@_current_tl }
+ \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl }
+ { \@@_values:N \l_@@_current_tl }
+ }
+ {
+ \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl }
+ \prop_set_eq:cc { l_@@_named_ #1 _prop } { l_@@_named_ #2 _prop }
+ }
}
{
\__kernel_msg_error:nnn { color } { unknown-color } {#2}
@@ -920,6 +1121,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% A small set of colors are always defined.
% \begin{macrocode}
@@ -933,19 +1135,154 @@
\color_set:nnn { blue } { rgb } { 0 , 0 , 1 }
% \end{macrocode}
%
-% \begin{variable}{\l_@@_named_._tl}
+% \begin{variable}{\l_@@_named_._prop, \l_@@_named_._tl}
% A special named color: this is always defined though not fixed in
% definition.
% \begin{macrocode}
+\prop_new:c { l_@@_named_._prop }
\tl_new:c { l_@@_named_._tl }
-\tl_set_eq:cN { l_@@_named_._tl } \l_@@_current_tl
+\tl_set:cx { l_@@_named_._tl } { \@@_model:N \l_@@_current_tl }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Exporting colors}
+%
+% \begin{macro}{\color_export:nnN}
+% \begin{macro}{\color_export:nnnN}
+% \begin{macro}{\@@_export:nN}
+% \begin{macro}{\@@_export:nnnN}
+% \begin{macrocode}
+\cs_new_protected:Npn \color_export:nnN #1#2#3
+ {
+ \group_begin:
+ \tl_if_exist:cT { c_@@_export_ #2 _tl }
+ { \tl_set_eq:Nc \l_color_fixed_model_tl { c_@@_export_ #2 _tl } }
+ \@@_parse:nN {#1} #3
+ \@@_export:nN {#2} #3
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #3 #3
+ }
+\cs_new_protected:Npn \color_export:nnnN #1#2#3#4
+ {
+ \@@_select_main:Nw #4
+ #1 / / \s_@@_mark #2 / / \s_@@_stop
+ \@@_export:nN {#3} #4
+ }
+\cs_new_protected:Npn \@@_export:nN #1#2
+ { \exp_after:wN \@@_export:nnnN #2 {#1} #2 }
+\cs_new:Npn \@@_export:nnnN #1#2#3#4
+ {
+ \cs_if_exist_use:cF { @@_export_format_ #3 :nnN }
+ {
+ \__kernel_msg_error:nnn { color } { unknown-export-format } {#3}
+ \use_none:nnn
+ }
+ {#1} {#2} #4
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_export_format_backend:nnN}
+% Simple.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export_format_backend:nnN #1#2#3
+ { \tl_set:Nn #3 { {#1} {#2} } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_export:nnnNN}
+% A generic auxiliary for cases where only one model is appropriate.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export:nnnNN #1#2#3#4#5
+ {
+ \str_if_eq:nnTF {#2} {#1}
+ { #5 #4 #3 \s_@@_stop }
+ {
+ \@@_convert:nnnN {#2} {#1} {#3} #4
+ \exp_after:wN #5 \exp_after:wN #4
+ #4 \s_@@_stop
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}
+% {
+% \c_@@_export_HTML_tl ,
+% \c_@@_export_space-sep-cmyk_tl ,
+% \c_@@_export_space-sep-rgb_tl
+% }
+% \begin{macrocode}
+\tl_const:Nn \c_@@_export_HTML_tl { rgb }
+\tl_const:cn { c_@@_export_space-sep-cmyk_tl } { cmyk }
+\tl_const:cn { c_@@_export_space-sep-rgb_tl } { rgb }
% \end{macrocode}
% \end{variable}
%
+% \begin{macro}{\@@_export_format_space-sep-cmyk:nnN}
+% \begin{macro}{\@@_export_space-sep-cmyk:Nw}
+% \begin{macrocode}
+\cs_new_protected:cpx { @@_export_format_space-sep-cmyk:nnN } #1#2#3
+ {
+ \exp_not:N \@@_export:nnnNN { cmyk } {#1} {#2} #3
+ \exp_not:c { @@_export_space-sep-cmyk:Nw }
+ }
+\cs_new_protected:cpn { @@_export_space-sep-cmyk:Nw } #1#2 \s_@@_stop
+ { \tl_set:Nx #1 {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_export_format_HTML:nnN ,
+% \@@_export_format_space-sep-rgb:nnN
+% }
+% \begin{macro}
+% {
+% \@@_export_HTML:Nw ,
+% \@@_export_space-sep-rgb:Nw
+% }
+% \begin{macro}[EXP]{\@@_export_HTML:n}
+% \textsc{html} values must be given in |rgb|: we force conversion if
+% required, then do some simple maths.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export_format_HTML:nnN #1#2#3
+ { \@@_export:nnnNN { rgb } {#1} {#2}#3 \@@_export_HTML:Nw }
+\cs_new_protected:cpx { @@_export_format_space-sep-rgb:nnN } #1#2#3
+ {
+ \exp_not:N \@@_export:nnnNN { rgb } {#1} {#2} #3
+ \exp_not:c { @@_export_space-sep-rgb:Nw }
+ }
+\cs_new_protected:Npn \@@_export_HTML:Nw #1#2 ~ #3 ~ #4 \s_@@_stop
+ {
+ \tl_set:Nx #1
+ {
+ \@@_export_HTML:n {#2}
+ \@@_export_HTML:n {#3}
+ \@@_export_HTML:n {#4}
+ }
+ }
+\cs_new:Npn \@@_export_HTML:n #1
+ {
+ \fp_compare:nNnTF {#1} = { 0 }
+ { 00 }
+ { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } }
+ }
+\cs_new_protected:cpn { @@_export_space-sep-rgb:Nw } #1#2 \s_@@_stop
+ { \tl_set:Nx #1 {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Diagnostics}
%
% \begin{macro}{\color_show:n}
-% \begin{macro}{\@@_show:nn}
+% \begin{macro}{\@@_show:n}
% Extract the information about a color and format for the user: the approach
% is similar to the keys module here.
% \begin{macrocode}
@@ -954,17 +1291,20 @@
\msg_show:nnxxxx { LaTeX / color } { show }
{#1}
{
- \@@_if_defined:nTF {#1}
- { \exp_last_unbraced:Nv \@@_show:nn { l_@@_named_ #1 _tl } }
- { }
+ \@@_if_defined:nT {#1}
+ {
+ \exp_args:Nv \@@_show:n { l_@@_named_ #1 _tl }
+ \prop_map_function:cN
+ { l_@@_named_ #1 _prop }
+ \msg_show_item_unbraced:nn
+ }
}
{ }
{ }
}
-\cs_new:Npn \@@_show:nn #1#2
+\cs_new:Npn \@@_show:n #1
{
\msg_show_item_unbraced:nn { model } {#1}
- \msg_show_item_unbraced:nn { value } {#2}
}
% \end{macrocode}
% \end{macro}
@@ -979,6 +1319,12 @@
LaTeX~has~been~asked~to~use~a~color~named~'#1',~
but~this~has~never~been~defined.
}
+\__kernel_msg_new:nnnn { color } { unknown-export-format }
+ { Unknown~export~format~'#1'. }
+ {
+ LaTeX~has~been~asked~to~export~a~color~in~format~'#1',~
+ but~this~has~never~been~defined.
+ }
\__kernel_msg_new:nnnn { color } { unknown-model }
{ Unknown~color~model~'#1'. }
{
diff --git a/macros/latex/contrib/l3experimental/l3color.pdf b/macros/latex/contrib/l3experimental/l3color.pdf
index 26f43e0e1f..80ecd21fe5 100644
--- a/macros/latex/contrib/l3experimental/l3color.pdf
+++ b/macros/latex/contrib/l3experimental/l3color.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
index 8a20c1a348..a39bd99f30 100644
--- a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-code.pdf b/macros/latex/contrib/l3experimental/l3draw-code.pdf
index 33c81c0e60..9536595edc 100644
--- a/macros/latex/contrib/l3experimental/l3draw-code.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-layers.dtx b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
index 1f1debc79e..43d699b64b 100644
--- a/macros/latex/contrib/l3experimental/l3draw-layers.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-paths.dtx b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
index bf44643680..847ade5f44 100644
--- a/macros/latex/contrib/l3experimental/l3draw-paths.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-points.dtx b/macros/latex/contrib/l3experimental/l3draw-points.dtx
index 6e578a694a..15ad9e1f17 100644
--- a/macros/latex/contrib/l3experimental/l3draw-points.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-points.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
index b2cd3db445..038c93dbf6 100644
--- a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
index 943484d811..75af8516ae 100644
--- a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-state.dtx b/macros/latex/contrib/l3experimental/l3draw-state.dtx
index 4f434d924b..cfced7e0d5 100644
--- a/macros/latex/contrib/l3experimental/l3draw-state.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-state.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -167,7 +167,7 @@
{ \@@_color:nn { stroke } {#1} }
\cs_new_protected:Npn \@@_color:nn #1#2
{
- \color_parse:nN {#2} \l_@@_color_tmp_tl
+ \color_export:nnN {#2} { backend } \l_@@_color_tmp_tl
\exp_after:wN \@@_color:nnn \l_@@_color_tmp_tl {#1}
}
\cs_new_protected:Npn \@@_color:nnn #1#2#3
diff --git a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
index b995cf6fc9..dcdfc783b7 100644
--- a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw.dtx b/macros/latex/contrib/l3experimental/l3draw.dtx
index 4ba0e2cb74..081d42e7f3 100644
--- a/macros/latex/contrib/l3experimental/l3draw.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw.dtx
@@ -110,7 +110,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -1146,7 +1146,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3draw}{2020-06-18}{}
+\ProvidesExplPackage{l3draw}{2020-07-17}{}
{L3 Experimental core drawing support}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3draw.pdf b/macros/latex/contrib/l3experimental/l3draw.pdf
index a6cc55f4a1..a8cb1a14dc 100644
--- a/macros/latex/contrib/l3experimental/l3draw.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3galley.dtx b/macros/latex/contrib/l3experimental/l3galley.dtx
index 639e7ade99..7865c39b7f 100644
--- a/macros/latex/contrib/l3experimental/l3galley.dtx
+++ b/macros/latex/contrib/l3experimental/l3galley.dtx
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -687,7 +687,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3galley}{2020-06-18}{}
+\ProvidesExplPackage{l3galley}{2020-07-17}{}
{L3 Experimental galley code}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3galley.pdf b/macros/latex/contrib/l3experimental/l3galley.pdf
index 2070aa9727..568e913fd2 100644
--- a/macros/latex/contrib/l3experimental/l3galley.pdf
+++ b/macros/latex/contrib/l3experimental/l3galley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3graphics.dtx b/macros/latex/contrib/l3experimental/l3graphics.dtx
index 73517bfe80..9908f59c34 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.dtx
+++ b/macros/latex/contrib/l3experimental/l3graphics.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -241,7 +241,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3graphics}{2020-06-18}{}
+\ProvidesExplPackage{l3graphics}{2020-07-17}{}
{L3 Experimental graphics inclusion support}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3graphics.pdf b/macros/latex/contrib/l3experimental/l3graphics.pdf
index 976b88a418..80f61fa228 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.pdf
+++ b/macros/latex/contrib/l3experimental/l3graphics.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3pdf-code.pdf b/macros/latex/contrib/l3experimental/l3pdf-code.pdf
index 82a5328fd3..d74c199483 100644
--- a/macros/latex/contrib/l3experimental/l3pdf-code.pdf
+++ b/macros/latex/contrib/l3experimental/l3pdf-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3pdf.dtx b/macros/latex/contrib/l3experimental/l3pdf.dtx
index 1a21347ef3..984336443e 100644
--- a/macros/latex/contrib/l3experimental/l3pdf.dtx
+++ b/macros/latex/contrib/l3experimental/l3pdf.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -191,7 +191,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3pdf}{2020-06-18}{}
+\ProvidesExplPackage{l3pdf}{2020-07-17}{}
{L3 Experimental core PDF support}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3pdf.pdf b/macros/latex/contrib/l3experimental/l3pdf.pdf
index aa887d20cc..c51a2055be 100644
--- a/macros/latex/contrib/l3experimental/l3pdf.pdf
+++ b/macros/latex/contrib/l3experimental/l3pdf.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3str-format.dtx b/macros/latex/contrib/l3experimental/l3str-format.dtx
index 52902e21a8..3c4fbc6336 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.dtx
+++ b/macros/latex/contrib/l3experimental/l3str-format.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -167,7 +167,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3str-format}{2020-06-18}{}
+\ProvidesExplPackage{l3str-format}{2020-07-17}{}
{L3 Experimental string formatting}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3str-format.pdf b/macros/latex/contrib/l3experimental/l3str-format.pdf
index df3c4c985a..fe0b1e71cb 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.pdf
+++ b/macros/latex/contrib/l3experimental/l3str-format.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.dtx b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
index 7da0422159..466a4d4107 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.dtx
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -136,7 +136,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3sys-shell}{2020-06-18}{}
+\ProvidesExplPackage{l3sys-shell}{2020-07-17}{}
{L3 Experimental system shell functions}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.pdf b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
index 7a311ee701..a455433a5c 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.pdf
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xcoffins.dtx b/macros/latex/contrib/l3experimental/xcoffins.dtx
index 68776e0572..65c1872645 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.dtx
+++ b/macros/latex/contrib/l3experimental/xcoffins.dtx
@@ -56,7 +56,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -675,7 +675,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2020-06-18}{}
+\ProvidesExplPackage{xcoffins}{2020-07-17}{}
{L3 Experimental design level coffins}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/xcoffins.pdf b/macros/latex/contrib/l3experimental/xcoffins.pdf
index d7a782681c..ff560afb71 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.pdf
+++ b/macros/latex/contrib/l3experimental/xcoffins.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xgalley.dtx b/macros/latex/contrib/l3experimental/xgalley.dtx
index 59be5e01ea..d917bdecff 100644
--- a/macros/latex/contrib/l3experimental/xgalley.dtx
+++ b/macros/latex/contrib/l3experimental/xgalley.dtx
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -734,7 +734,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2020-06-18}{}
+\ProvidesExplPackage{xgalley}{2020-07-17}{}
{L3 Experimental galley}
\RequirePackage{xparse,xtemplate,l3galley}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/xgalley.pdf b/macros/latex/contrib/l3experimental/xgalley.pdf
index dfd4200570..e5c6e5ee48 100644
--- a/macros/latex/contrib/l3experimental/xgalley.pdf
+++ b/macros/latex/contrib/l3experimental/xgalley.pdf
Binary files differ
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}
diff --git a/macros/latex/contrib/thmtools/README b/macros/latex/contrib/thmtools/README
deleted file mode 100644
index 711b6051ff..0000000000
--- a/macros/latex/contrib/thmtools/README
+++ /dev/null
@@ -1,22 +0,0 @@
- The \thmtools\ bundle provides several packages for commonly-needed
- features for theorems. As designed, the bundle should work with kernel
- theorems, the theorem package and the amsthm package.
-
- WARNING: Currently, things might still be a bit rough. You
- might want to consider not relying on \thmtools\ for your Ph.D. thesis
- masterpiece.
-
-Provided features:
-a keyval interface to \newtheorem
-a \listoftheorem command
-hyperref/autoref compatibility
-a way of restating entire theorems with a single macro call
-
-License: LPPL 1.3c
-
-Currently the package has no maintainer ... and is looking for one!
-
-Previous Maintainer was Ulrich M. Schwarz, ulmi@absatzen.de
-
-
-$Id: README,v 1.1 2008/02/17 21:13:58 ulmi Exp ulmi $
diff --git a/macros/latex/contrib/thmtools/README.md b/macros/latex/contrib/thmtools/README.md
new file mode 100644
index 0000000000..ffcfb135d3
--- /dev/null
+++ b/macros/latex/contrib/thmtools/README.md
@@ -0,0 +1,17 @@
+The `thmtools` bundle provides several packages for commonly-needed
+features for theorems. As designed, the bundle should work with kernel
+theorems (theorems ‘out of the box’ with LaTeX),
+the [`amsthm`](https://ctan.org/pkg/amsmath) package and
+the [`ntheorem`](https://ctan.org/pkg/ntheorem) package.
+
+Provided features:
+ - a keyval interface to `\newtheorem` and `\newtheoremstyle`
+ - a `\listoftheorem` command with filtering ability
+ - [`hyperref`](https://ctan.org/pkg/hyperref) and [`cleveref`](https://ctan.org/pkg/cleveref) compatibility
+ - a way of restating entire theorems with a single macro call
+
+License: LPPL 1.3c
+
+Currently the package is maintained by Yukai Chou, <span>muzimuzhi@gmail.com</span>
+
+Previous Maintainer was Ulrich M. Schwarz, <span>ulmi@absatzen.de</span>
diff --git a/macros/latex/contrib/thmtools/TODO b/macros/latex/contrib/thmtools/TODO
deleted file mode 100644
index e35b77530a..0000000000
--- a/macros/latex/contrib/thmtools/TODO
+++ /dev/null
@@ -1,3 +0,0 @@
-- ref close-by/far-away
-- complex refs
- (these two are very similar)
diff --git a/macros/latex/contrib/thmtools/VERSION.tex b/macros/latex/contrib/thmtools/VERSION.tex
deleted file mode 100644
index 466ff0ebce..0000000000
--- a/macros/latex/contrib/thmtools/VERSION.tex
+++ /dev/null
@@ -1,2 +0,0 @@
-% set by hand as I don't use CVS
-\def\x #1-#2-#3 #4 v#5\@{\def\VERSION{#1/#2/#3 v#5}}\x 2019-12-22 00:00:00 +0200 v68\@
diff --git a/macros/latex/contrib/thmtools/changes.txt b/macros/latex/contrib/thmtools/changes.txt
deleted file mode 100644
index 06dc12ef79..0000000000
--- a/macros/latex/contrib/thmtools/changes.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-2019-12-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
-
- * thm-kv.dtx:
- removed dependency on etexcmds package
-
-
diff --git a/macros/latex/contrib/thmtools/COPYING b/macros/latex/contrib/thmtools/doc/COPYING
index 2244313901..2244313901 100644
--- a/macros/latex/contrib/thmtools/COPYING
+++ b/macros/latex/contrib/thmtools/doc/COPYING
diff --git a/macros/latex/contrib/thmtools/doc/VERSION.tex b/macros/latex/contrib/thmtools/doc/VERSION.tex
new file mode 100644
index 0000000000..9bfeb6f890
--- /dev/null
+++ b/macros/latex/contrib/thmtools/doc/VERSION.tex
@@ -0,0 +1 @@
+\def\VERSION{2020/07/16 v69}
diff --git a/macros/latex/contrib/thmtools/doc/changes.txt b/macros/latex/contrib/thmtools/doc/changes.txt
new file mode 100644
index 0000000000..c16fb63e78
--- /dev/null
+++ b/macros/latex/contrib/thmtools/doc/changes.txt
@@ -0,0 +1,12 @@
+2019-12-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * thm-kv.dtx:
+ removed dependency on etexcmds package
+
+2020-07-16 Yukai Chou <muzimuzhi@gmail.com>
+
+ * thm-restate.dtx:
+ made compatible with cleveref's \label[]{} syntax
+
+ * thmtools-manual.tex (and comment part of dtx files):
+ refined manual
diff --git a/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf b/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf
new file mode 100644
index 0000000000..8d9ff5fc01
--- /dev/null
+++ b/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf
Binary files differ
diff --git a/macros/latex/contrib/thmtools/thmtools-manual.tex b/macros/latex/contrib/thmtools/doc/thmtools-manual.tex
index 111acda6dc..47f1235f5f 100644
--- a/macros/latex/contrib/thmtools/thmtools-manual.tex
+++ b/macros/latex/contrib/thmtools/doc/thmtools-manual.tex
@@ -1,4 +1,4 @@
-%&pdflatex
+% !TeX program = pdflatex
\documentclass[paper=a4, pagesize, DIV=20,
english,
headings=small,11pt,
@@ -27,10 +27,18 @@
\usepackage{listings}
\usepackage{amsmath, amsthm}
+\usepackage{enumitem}
+\setlist[description, 1]{labelindent=2em, leftmargin=2em, rightmargin=2em, labelwidth=!}
\usepackage{tikz}
+\usetikzlibrary{tikzmark}
\usepackage{nameref}
\usepackage{hyperref}
+\hypersetup{
+ colorlinks,
+ linkcolor=RoyalBlue,
+ linktocpage
+}
\usepackage{cleveref}[2010/05/01]
\usepackage{thmtools, thm-restate}
@@ -115,11 +123,13 @@
\input{VERSION.tex}
\title{\Thmtools Users' Guide}
-\author{Dr. Ulrich M. Schwarz -- ulmi@absatzen.de\thanks{
+\author{Dr. Ulrich M. Schwarz -- ulmi@absatzen.de\thanks{%
who would like to thank the users for testing, encouragement, feature requests, and
bug reports. In particular, Denis Bitouz\'e prompted further improvement
- when \thmtools got stuck in a ``good enough for me'' slump.
-}}
+ when \thmtools got stuck in a ``good enough for me'' slump.}
+ \and
+ Yukai Chou -- muzimuzhi@gmail.com
+}
\date{\VERSION}
\begin{document}
@@ -138,7 +148,8 @@
\autoref{cha:reference}.
\begin{multicols}{2}[\section*{\contentsname}]
- \makeatletter\let\chapter\@gobbletwo
+ \makeatletter
+ \let\chapter\@gobbletwo
\tableofcontents
\end{multicols}
\clearpage
@@ -160,13 +171,13 @@
\begin{body}[gobble=4]
% Document code looks like this.
\begin{theorem}[Euclid]
- \label{thm:euclid}%
- For every prime $p$, there is a prime $p'>p$.
- In particular, the list of primes,
- \begin{equation}\label{eq:1}
- 2,3,5,7,\dots
- \end{equation}
- is infinite.
+ \label{thm:euclid}%
+ For every prime $p$, there is a prime $p'>p$.
+ In particular, the list of primes,
+ \begin{equation}\label{eq:1}
+ 2,3,5,7,\dots
+ \end{equation}
+ is infinite.
\end{theorem}
\end{body}
\end{source}
@@ -220,8 +231,8 @@
\end{restatable}
\end{result}
- Instead of ``numberwithin='', you can also use ``parent='' and
- ``within=''. They're all the same, use the one you find easiest to
+ Instead of |numberwithin=|, you can also use |parent=| and
+ |within=|. They're all the same, use the one you find easiest to
remember.
Note the example above looks somewhat bad: sometimes, the name of the environment,
@@ -272,8 +283,8 @@
\end{lemma}
\end{result}
- Again, instead of ``sibling='', you can also use ``numberlike='' and
- ``sharecounter=''.
+ Again, instead of |sibling=|, you can also use |numberlike=| and
+ |sharecounter=|.
Some theorems have a fixed name and are not supposed to get a number.
To this end, \pkg{amsthm} provides |\newtheorem*|, which is
@@ -355,7 +366,8 @@
\begin{preamble}[gobble=6]
\usepackage{amsthm, thmtools}
\usepackage{
- nameref,%\nameref
+ % nameref,%\nameref
+ % n.b. usually nameref is autoloaded by hyperref
hyperref,%\autoref
% n.b. \Autoref is defined by thmtools
cleveref,% \cref
@@ -391,6 +403,7 @@
\end{result}
\section{Styling theorems}
+ \label{sec:styling}
The major backends provide a command |\theoremstyle| to switch
between looks of theorems. This is handled as follows:
@@ -403,10 +416,11 @@
\end{preamble}
\begin{body}[gobble=4]
\begin{Theorem}
- This is a theorem.
+ Note how it still retains the default style,
+ `plain'.
\end{Theorem}
\begin{remark}
- Note how it still retains the default style, `plain'.
+ This is a remark.
\end{remark}
\end{body}
\end{source}
@@ -419,7 +433,7 @@
\end{remark}
\end{result}
- Thmtools also supports the shadethm and thmbox packages:
+ Thmtools also supports the \pkg{shadethm} and \pkg{thmbox} packages:
\begin{source}
\begin{preamble}[gobble=4]
\usepackage{amsthm}
@@ -457,9 +471,9 @@
start with a curly brace, in which case it is assumed that
|\definecolor{colorname}|$\langle$\textsl{what you said}$\rangle$ will be
valid \LaTeX\ code. In our case, we use the rbg model to manually specify
- white. (Shadethm's default value is some sort of gray.)
+ white. (|shadethm|'s default value is {\fboxsep=0pt \fcolorbox{black}[gray]{0.92}{\phantom{XX}}} |[gray]{0.92}|)
- For the thmbox package, use the thmbox key:
+ For the \pkg{thmbox} package, use the |thmbox| key:
\begin{source}
\begin{preamble}[gobble=4]
\usepackage{amsthm}
@@ -498,7 +512,7 @@
\end{boxtheorem S}
\end{result}
- Note that for both thmbox and shaded keys, it's quite possible they will not
+ Note that for both |thmbox| and |shaded| keys, it's quite possible they will not
cooperate with a style key you give at the same time.
\subsection{Declaring new theoremstyles}
@@ -539,52 +553,62 @@
more keys you can pass to |\declaretheoremstyle|: if \thmtools\ cannot
figure out at all what to do with it, it will pass it on to the
|\declaretheorem| commands that use that style. For example, you may use
- the boxed and shaded keys here.
+ the |boxed| and |shaded| keys here.
To change the order in which title, number and note appear, there is a key
- headformat. Currently, the values ``margin'' and ``swapnumber'' are
+ |headformat|. Currently, the values ``margin'' and ``swapnumber'' are
supported. The daring may also try to give a macro here that uses the
commands |\NUMBER|, |\NAME| and |\NOTE|.
You cannot circumvent the fact
- that headpunct comes at the end, though, nor the fonts and braces you
+ that |headpunct| comes at the end, though, nor the fonts and braces you
select with the other keys.
- \begin{figure}\centering
- % please don't make me touch this picture ever again.
- \fbox{
- \begin{minipage}{0.618\textwidth}\Large
- \tikzset{font=\normalfont\small\sffamily\itshape,y=12pt,>=latex}
- \noindent which resulted in the following insight:
- \par
- \tikz{\draw[|<->|] (0,-1)--(0,1);
- \draw[anchor=west] (0,0) node {spaceabove};}
- \par
- \tikz{\draw[|<->|] (-1,0)--(1,0);
- \draw[anchor=south] (0,0) node {headindent};}
- \textbf{Theo%
- \smash{\clap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south]{headfont};}}}%
- rem 1.2
- (\smash{\rlap{\tikz{\draw (0,0)--(0,2.5) node [anchor=base west]{notebraces};}}}%
- Euc%
-\smash{\clap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south]{notefont};}}}%
- lid)%
- .\smash{\rlap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south west]{headpunct};}}}}%
- \tikz{\draw[|<->|] (-1,0)--(1,0);
- \draw[anchor=south] (0,0) node {postheadspace};}
- For every prime $p$, there is a prime $p'>p$.
- In particular, the list of primes,
- $2,3,5,7,\dots$,
- is infinite.
- \hfill{\tikz{\draw[anchor=north east] (0,0) node{qed}; }}$\Box$
- \par
- \tikz{\draw[|<->|] (0,-1)--(0,1);
- \draw[anchor=west] (0,0) node {spacebelow};}
- \par
-
- As a consequence, lorem ipsum dolor sit amet frob-%nicate foo
-% paret.
- \end{minipage}
- }
+ \begin{figure}
+ \centering
+ \fbox{%
+ \begin{tikzpicture}[
+ remember picture,
+ >=latex,
+ nodes={
+ font=\normalfont\sffamily\itshape\small,
+ RoyalBlue
+ },
+ every subnode/.style={
+ inner sep=0pt
+ },
+ tip/.style={|<->|}
+ ]
+ \node[black, font=\Large, text width=.618\textwidth, align=justify]
+ {%
+ which resulted in the following insight: \\
+ \subnode{space above}{\rule{0pt}{1.3\baselineskip}} \\
+ \subnode{head indent}{\strut\hspace*{4em}}
+ \textbf{%
+ \subnode{head}{Theorem} 1.2
+ \subnode{note brace}{(}%
+ \subnode{note}{\textit{Euclid}})%
+ \subnode{head punct}{.} %
+ }
+ \subnode{post head space}{\strut\hspace*{4.5em}}
+ For every prime~$p$, there is a prime~$p'>p$. In particular, the list
+ of primes, $2,3,5,7,\dots$, is infinite. \hfill
+ \subnode{qed}{$\Box$} \\
+ \subnode{space below}{\rule{0pt}{1.3\baselineskip}} \\
+ As a consequence, lorem ipsum dolor sit amet frob-%nicate foo
+ % paret.
+ };
+
+ \draw[tip] (space above.south west) -- node[right] {spaceabove} (space above.north west);
+ \draw[tip] (head indent.west) -- node[above] {headindent} (head indent.east);
+ \draw (head.center) -- +(0, 10pt) node[above] {headfont};
+ \draw (note brace.north) -- +(0, 20pt) node[above] {notebraces};
+ \draw (note.center) -- +(0, 10pt) node[above] {notefont};
+ \draw (head punct.base east) -- +(0, 28pt) node[above] {headpunct};
+ \draw[tip] (post head space.west) -- node[above] {postheadspace} (post head space.east);
+ \node at ([xshift=-12pt]qed.150) {qed};
+ \draw[tip] (space below.south west) -- node[right] {spacebelow} (space below.north west);
+ \end{tikzpicture}%
+ }
\caption{Settable parameters of a theorem style.}
\label{fig:params}
\end{figure}
@@ -631,14 +655,14 @@
mechanism, so that this reference: \autoref{thm:euclid} points to
p.\,\pageref{thm:euclid}, where the unstarred environment is used. (You can
also use a starred environment and an unstarred command, in which case the
- behaviour is reversed.) Also, if you use \pkg{hyperref}, the links will lead you
+ behaviour is reversed.) Also, if you use \pkg{hyperref} (like you see in this manual), the links will lead you
to the unstarred occurence.
Just to demonstrate that we also handle more involved cases, I repeat
another theorem here, but this one was numbered within its section: note
we retain the section number which does not fit the current section:
\begin{source}
- \begin{body}
+ \begin{body}[gobble=6]
\euclidii*
\end{body}
\end{source}
@@ -678,7 +702,7 @@
And you can also restrict to those environments that have an optional
argument given. Note that two theorems disappear compared to the previous
- example. You could also say just ``onlynamed'', in which case it will
+ example. You could also say just |onlynamed|, in which case it will
apply to \emph{all} theorem environments you have defined.
\begin{source}
\begin{body}[gobble=6]
@@ -705,13 +729,16 @@
\emph{optional} argument, which will go into the list of theorems. Be
aware that since we already are within an optional argument, you have to
use an extra level of curly braces:
- |\begin{theorem}[{name=[Short name]A long name,...}]|
+ |\begin{theorem}[name={[Short name]A long name,...]}|
+
\item[label] This will issue a |\label| command after the head. Not very
useful, more of a demo.
+
\item[continues] Saying |continues=foo| will cause the number that is
given to be changed to |\ref{foo}|, and a text is added to the note.
(The exact text is given by the macro |\thmcontinues|, which takes the
label as its argument.)
+
\item[restate] Saying |restate=foo| will hopefully work like
wrapping this theorem in a restatable environment. (It probably still fails
in cases that I didn't think of.) This key also accepts an optional
@@ -766,8 +793,8 @@
|...postheadhook|, |...prefoothook|
and |...postfoothook|.
All of these take an \emph{optional} argument, the name of the
- environment, and the new code as a mandatory argument. The environment is
- optional because there is also a set of ``generic'' hooks added to every
+ environment, and the new code as a mandatory argument. The name of environment is
+ optional because there is also a set of ``generic'' hooks added to every
theorem that you define.
The other way is to use the keys |preheadhook| et al. in your
@@ -796,9 +823,9 @@
handling itself is added as part of the headkeys.)
- \section{Case in point: the shaded key}
+ \section{Case in point: the \texttt{shaded} key}
- Let us look at a reasonably simple example: the shaded key, which we've
+ Let us look at a reasonably simple example: the |shaded| key, which we've
already seen in the first section. You'll observe that we run into a
problem similar to the four-hook mess: your code may either want to modify
parameters that need to be set beforehand, or it wants to modify the
@@ -826,8 +853,8 @@
using internal macros with @ in their name (viz.,
|\thmt@envname| and friends). You can also put them into a
package (then, without the |\makeat...|),
- which is simply a file ending in .sty put somewhere that \LaTeX\ can find
- it, which can then be laoded with |\usepackage|.
+ which is simply a file ending in |.sty| put somewhere that \LaTeX\ can find
+ it, which can then be loaded with |\usepackage|.
To find out where exactly that is, and if you'd need to update
administrative helper files such as a filename database FNDB,
please consult the documentation of your \TeX\ distribution.
@@ -912,7 +939,8 @@
Additionally, a number of keywords are allowed here instead of \LaTeX\
code:
\begin{description}
- \item[margin] Lets the number protude in the (left) margin.
+ \item[margin] Lets the number protrude in the (left) margin.
+
\item[swapnumber] Puts the number before the name. Currently
not working so well for unnumbered theorems.
\item[] \emph{This list is likely to grow}
@@ -932,16 +960,10 @@
|section|.
\key{numberwithin}
- Value: a counter name. The theorem will be reset whenever that counter
- is incremented. Usually, this will be a sectioning level, |chapter| or
- |section|.
- (Same as parent.)
+ (Same as |parent|.)
\key{within}
- Value: a counter name. The theorem will be reset whenever that counter
- is incremented. Usually, this will be a sectioning level, |chapter| or
- |section|.
- (Same as parent.)
+ (Same as |parent|.)
\key{sibling}
@@ -949,31 +971,21 @@
Usually, this is the name of another theorem environment.
\key{numberlike}
- Value: a counter name. The theorem will use this counter for numbering.
- Usually, this is the name of another theorem environment.
- (Same as sibling.)
+ (Same as |sibling|.)
\key{sharenumber}
- Value: a counter name. The theorem will use this counter for numbering.
- Usually, this is the name of another theorem environment.
- (Same as sibling.)
+ (Same as |sibling|.)
\key{title}
Value: \TeX\ code. The title of the theorem. Default is the name of the
environment, with |\MakeUppercase| prepended. You'll have to give
- this if your title starts with a accented character, for example.
+ this if your title starts with an accented character, for example.
\key{name}
- Value: \TeX\ code. The title of the theorem. Default is the name of the
- environment, with |\MakeUppercase| prepended. You'll have to give
- this if your title starts with a accented character, for example.
(Same as title.)
\key{heading}
- Value: \TeX\ code. The title of the theorem. Default is the name of the
- environment, with |\MakeUppercase| prepended. You'll have to give
- this if your title starts with a accented character, for example.
(Same as title.)
\key{numbered}
@@ -1009,14 +1021,14 @@
group defined by the environment.
\key{refname}
- Value: one string, or two string separated by a comma (no spaces). This
+ Value: one string, or two strings separated by a comma (no spaces). This
is the name of the theorem as used by |\autoref|, |\cref| and friends. If it is
two strings, the second is the plural form used by |\cref|. Default
value is the value of |name|, i.e. usually the environment name, with
- \MakeUppercase.
+ |\MakeUppercase| prepended.
\key{Refname}
- Value: one string, or two string separated by a comma (no spaces). This
+ Value: one string, or two strings separated by a comma (no spaces). This
is the name of the theorem as used by |\Autoref|, |\Cref| and friends. If it is
two strings, the second is the plural form used by |\Cref|. This can be
used for alternate spellings, for example if your style requests no
@@ -1041,7 +1053,7 @@
\end{description}
\key{thmbox}
- Value: one of the characters L, M and S; see examples above.
+ Value: one of the characters |L|, |M| and |S|; see examples in \autoref{sec:styling}.
\section{Known keys to in-document theorems}
@@ -1053,16 +1065,16 @@
\key{name} Value: \TeX\ code that will be typeset.
What you would have put in the optional argument in the
non-keyval style, i.e. the note to the head. This is \emph{not} the same
- as the name key to |\declaretheorem|, you cannot override that from within
+ as the |name| key to |\declaretheorem|, you cannot override that from within
the document.
\key{listhack} Value: doesn't matter. (But put something to trigger
- key-val behaviour, maybe listhack=true.) Linebreak styles in \pkg{amsthm}
+ key-val behaviour, maybe |listhack=true|.) Linebreak styles in \pkg{amsthm}
don't linebreak if they start with another list, like an |enumerate|
environment. Giving the |listhack| key fixes that. \emph{Don't} give this
key for non-break styles, you'll get too little vertical space! (Just use
|\leavevmode| manually there.)
- An all-around listhack that handles both situations might come in a
+ An all-around |listhack| that handles both situations might come in a
cleaner rewrite of the style system.
\section{Restatable -- hints and caveats}
@@ -1071,14 +1083,14 @@
\begin{itemize}
\item Some counters are saved so that the same values appear when you
re-use them. The list of these counters is stored in the macro
- |\thmt@innercounters| as a comma-separated list without spaces; default: equation.
+ |\thmt@innercounters| as a comma-separated list without spaces; default: |equation|.
\item To preserve the influence of other counters (think: equation
numbered per section and recall the theorem in another section), we need
to know all macros that are used to turn a counter into printed output.
Again, comma-separated list without spaces, without leading backslash, stored as
|\thmt@counterformatters|. Default:
- |@alph,@Alph,@arabic,@roman,@Roman,@fnsymbol|
+ |@alph,@Alph,@arabic,@roman,@Roman,@fnsymbol|.
All these only take
the \LaTeX\ counter |\c@foo| as arguments. If you bypass this and use
|\romannumeral|, your numbers go wrong and you get what you deserve.
@@ -1101,7 +1113,7 @@
\chapter{\Thmtools for the morbidly curious}\label{cha:sourcecode}
- This chapter consists of the implementation of Thmtools, in case you
+ This chapter consists of the implementation of \thmtools, in case you
wonder how this or that feature was implemented. Read on if you want a
look under the bonnet, but you enter at your own risk, and bring an oily
rag with you.
@@ -1123,18 +1135,18 @@
\subsection{Re-using environments}
\DocInput{thm-restate.dtx}
- \subsection{Fixing autoref and friends}
+ \subsection{Fixing \texttt{autoref} and friends}
\DocInput{thm-autoref.dtx}
\section{Glue code for different backends}
- \subsection{amsthm}
+ \subsection{\texttt{amsthm}}
\DocInput{thm-amsthm.dtx}
- \subsection{beamer}
+ \subsection{\texttt{beamer}}
\DocInput{thm-beamer.dtx}
- \subsection{ntheorem}
+ \subsection{\texttt{ntheorem}}
\DocInput{thm-ntheorem.dtx}
\section{Generic tools}
@@ -1145,7 +1157,7 @@
\subsection{Different counters sharing the same register}
\DocInput{aliasctr.dtx}
- \subsection{Tracking occurences: none, one or many}
+ \subsection{Tracking occurrences: none, one or many}
\DocInput{unique.dtx}
diff --git a/macros/latex/contrib/thmtools/aliasctr.dtx b/macros/latex/contrib/thmtools/source/aliasctr.dtx
index b492f95f56..3c75e11c98 100644
--- a/macros/latex/contrib/thmtools/aliasctr.dtx
+++ b/macros/latex/contrib/thmtools/source/aliasctr.dtx
@@ -1,10 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2005-7 by Ulrich M. Schwarz
+% Copyright (C) 2005-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a. The full license text
-% is available from http://www.latex-project.org/
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
%<*code>
% \fi
diff --git a/macros/latex/contrib/thmtools/parseargs.dtx b/macros/latex/contrib/thmtools/source/parseargs.dtx
index 8f4aa42171..4efcd3ecd9 100644
--- a/macros/latex/contrib/thmtools/parseargs.dtx
+++ b/macros/latex/contrib/thmtools/source/parseargs.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-amsthm.dtx b/macros/latex/contrib/thmtools/source/thm-amsthm.dtx
index 31a2397f47..b45a6c276e 100644
--- a/macros/latex/contrib/thmtools/thm-amsthm.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-amsthm.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thm-autoref.dtx b/macros/latex/contrib/thmtools/source/thm-autoref.dtx
index 90a164f1af..cf84463c09 100644
--- a/macros/latex/contrib/thmtools/thm-autoref.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-autoref.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-beamer.dtx b/macros/latex/contrib/thmtools/source/thm-beamer.dtx
index 7c56099ce6..44319480c7 100644
--- a/macros/latex/contrib/thmtools/thm-beamer.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-beamer.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thm-kv.dtx b/macros/latex/contrib/thmtools/source/thm-kv.dtx
index 4a31a51885..bdac30899d 100644
--- a/macros/latex/contrib/thmtools/thm-kv.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-kv.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-listof.dtx b/macros/latex/contrib/thmtools/source/thm-listof.dtx
index e91219eca1..39603b4341 100644
--- a/macros/latex/contrib/thmtools/thm-listof.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-listof.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-llncs.dtx b/macros/latex/contrib/thmtools/source/thm-llncs.dtx
index 5a3b480c2e..134acb18b7 100644
--- a/macros/latex/contrib/thmtools/thm-llncs.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-llncs.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thm-ntheorem.dtx b/macros/latex/contrib/thmtools/source/thm-ntheorem.dtx
index ccd12dc30d..ef29870931 100644
--- a/macros/latex/contrib/thmtools/thm-ntheorem.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-ntheorem.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thm-patch.dtx b/macros/latex/contrib/thmtools/source/thm-patch.dtx
index b1e28b6fe4..dd00028ca8 100644
--- a/macros/latex/contrib/thmtools/thm-patch.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-patch.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-restate.dtx b/macros/latex/contrib/thmtools/source/thm-restate.dtx
index 033a48254e..d02b3630ab 100644
--- a/macros/latex/contrib/thmtools/thm-restate.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-restate.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
@@ -224,7 +226,7 @@
\@xa\let\csname c@#2\endcsname=\c@thmt@dummyctr
\@xa\let\csname theH#2\endcsname=\theHthmt@dummyctr
% disable labeling.
- \let\label=\@gobble
+ \let\label=\thmt@gobble@label
\let\ltx@label=\@gobble% amsmath needs this
% We shall need to restore the counters at the end
% of the environment, so we get
@@ -268,6 +270,14 @@
%% now empty, just used as a marker.
}
+\let\thmt@gobble@label\@gobble
+% cleveref extends syntax of \label to \label[...]{...}
+\AtBeginDocument{
+ \@ifpackageloaded{cleveref}{
+ \renewcommand*\thmt@gobble@label[2][]{}
+ }{}
+}
+
\newenvironment{restatable}{%
\thmt@thisistheonetrue\thmt@restatable
}{%
diff --git a/macros/latex/contrib/thmtools/thmdef-mdframed.dtx b/macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx
index a3fd3658cb..85c5d9bd2d 100644
--- a/macros/latex/contrib/thmtools/thmdef-mdframed.dtx
+++ b/macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx
@@ -1,14 +1,21 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
%<*mdframed>
%\fi
%
-% Mostly, this key wraps the theorem in a mdframed environment.
+% Mostly, this key wraps the theorem in a |mdframed| environment.
% The parameters are set by treating the value we are given as
% a new key-val list, see below.
%
@@ -20,7 +27,7 @@
\addtotheorempreheadhook[\thmt@envname]{%
\begin{mdframed}[#1]}%
\addtotheorempostfoothook[\thmt@envname]{\end{mdframed}}%
- }%
+ }%
}
% \end{macrocode}
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thmdef-shaded.dtx b/macros/latex/contrib/thmtools/source/thmdef-shaded.dtx
index 6377182c3e..c7501cae36 100644
--- a/macros/latex/contrib/thmtools/thmdef-shaded.dtx
+++ b/macros/latex/contrib/thmtools/source/thmdef-shaded.dtx
@@ -1,14 +1,21 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
%<*shaded>
%\fi
%
-% Mostly, this key wraps the theorem in a shadebox environment.
+% Mostly, this key wraps the theorem in a |shadebox| environment.
% The parameters are set by treating the value we are given as
% a new key-val list, see below.
%
@@ -24,45 +31,45 @@
}%
}
% \end{macrocode}
-% The docs for shadethm say:
+% The docs for |shadethm| say:
% \begin{quote}
% There are some parameters you could set the default for (try them as is,
% first).
% \begin{itemize}
-% \item shadethmcolor The shading color of the background. See the
+% \item |shadethmcolor|\quad The shading color of the background. See the
% documentation for the color package, but with a `gray' model, I find .97
% looks good out of my printer, while a darker shade like .92 is needed
% to make it copy well. (Black is 0, white is 1.)
-% \item shaderulecolor The shading color of the border of the shaded box.
+% \item |shaderulecolor|\quad The shading color of the border of the shaded box.
% See (i). If shadeboxrule is set to 0pt then this won't print anyway.
-% \item shadeboxrule The width of the border around the shading. Set it to
+% \item |shadeboxrule|\quad The width of the border around the shading. Set it to
% 0pt (not just 0) to make it disappear.
-% \item shadeboxsep The length by which the shade box surrounds the text.
+% \item |shadeboxsep|\quad The length by which the shade box surrounds the text.
% \end{itemize}
% \end{quote}
%
% So, let's just define keys for all of these.
%
% \begin{macrocode}
-\define@key{thmt@shade}{textwidth}{\setlength\shadedtextwidth{#1}}
-\define@key{thmt@shade}{bgcolor}{\thmt@definecolor{shadethmcolor}{#1}}
-\define@key{thmt@shade}{rulecolor}{\thmt@definecolor{shaderulecolor}{#1}}
-\define@key{thmt@shade}{rulewidth}{\setlength\shadeboxrule{#1}}
-\define@key{thmt@shade}{margin}{\setlength\shadeboxsep{#1}}
-\define@key{thmt@shade}{padding}{\setlength\shadeboxsep{#1}}
-\define@key{thmt@shade}{leftmargin}{\setlength\shadeleftshift{#1}}
+\define@key{thmt@shade}{textwidth} {\setlength\shadedtextwidth{#1}}
+\define@key{thmt@shade}{bgcolor} {\thmt@definecolor{shadethmcolor}{#1}}
+\define@key{thmt@shade}{rulecolor} {\thmt@definecolor{shaderulecolor}{#1}}
+\define@key{thmt@shade}{rulewidth} {\setlength\shadeboxrule{#1}}
+\define@key{thmt@shade}{margin} {\setlength\shadeboxsep{#1}}
+\define@key{thmt@shade}{padding} {\setlength\shadeboxsep{#1}}
+\define@key{thmt@shade}{leftmargin} {\setlength\shadeleftshift{#1}}
\define@key{thmt@shade}{rightmargin}{\setlength\shaderightshift{#1}}
% \end{macrocode}
%
% What follows is wizardry you don't have to understand. In essence,
% we want to support two notions of color: one is ``everything that goes
-% after \lstinline|\definecolor{shadethmcolor}|'', such as
-% \lstinline|{rgb}{0.8,0.85,1}|. On the other hand, we'd also like
-% to recognize an already defined color name such as \lstinline|blue|.
+% after |\definecolor{shadethmcolor}|'', such as
+% |{rgb}{0.8,0.85,1}|. On the other hand, we'd also like
+% to recognize an already defined color name such as |blue|.
%
% To handle the latter case, we need to copy the definition of one color
-% into another. The xcolor package offers \lstinline|\colorlet| for that,
-% for the color package, we just cross our fingers.
+% into another. The \pkg{xcolor} package offers |\colorlet| for that,
+% for the \pkg{color} package, we just cross our fingers.
% \begin{macrocode}
\def\thmt@colorlet#1#2{%
%\typeout{don't know how to let color `#1' be like color `#2'!}%
@@ -78,19 +85,19 @@
% \end{macrocode}
% Now comes the interesting part: we assume that a simple color name
% must not be in braces, and a color definition starts with an opening
-% curly brace. (So, if \lstinline|\definecolor| ever gets an optional arg,
+% curly brace. (So, if |\definecolor| ever gets an optional arg,
% we are in a world of pain.)
%
-% If the second argument to \lstinline|\thmt@definecolor| (the key) starts
+% If the second argument to |\thmt@definecolor| (the key) starts
% with a brace,
-% then \lstinline|\thmt@def@color| will have an empty second argument,
+% then |\thmt@def@color| will have an empty second argument,
% delimited by the brace of the key. Hopefully, the key will have exactly
-% enough arguments to satisfy \lstinline|\definecolor|. Then,
-% \lstinline|thmt@drop@relax| will be executed and gobble the fallback
-% values and the \lstinline|\thmt@colorlet|.
+% enough arguments to satisfy |\definecolor|. Then,
+% |thmt@drop@relax| will be executed and gobble the fallback
+% values and the |\thmt@colorlet|.
%
-% If the key does not contain an opening brace, \lstinline|\thmt@def@color|
-% will drop everything up to \lstinline|{gray}{0.5}|. So, first the color
+% If the key does not contain an opening brace, |\thmt@def@color|
+% will drop everything up to |{gray}{0.5}|. So, first the color
% gets defined to a medium gray, but then, it immediately gets overwritten
% with the definition corresponding to the color name.
% \begin{macrocode}
diff --git a/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx b/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx
new file mode 100644
index 0000000000..59409fd79e
--- /dev/null
+++ b/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx
@@ -0,0 +1,43 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
+%\fi
+%
+%\iffalse (hide this from DocInput)
+%<*thmbox>
+%\fi
+% The \pkg{thmbox} package does something else: instead of having a separate
+% environment, we have to use a command different from
+% |\newtheorem| to get the boxed style. Fortunately,
+% \thmtools stores the command as |\thmt@theoremdefiner|, so we
+% can modify it. (One of the perks if extension writer and framework writer
+% are the same person.) So, in contrast to the previous example, this time
+% we need to do something before the actual |\newtheorem| is
+% called.
+% \begin{macrocode}
+\define@key{thmdef}{thmbox}[L]{%
+ \thmt@trytwice{%
+ \let\oldproof=\proof
+ \let\oldendproof=\endproof
+ \let\oldexample=\example
+ \let\oldendexample=\endexample
+ \RequirePackage[nothm]{thmbox}
+ \let\proof=\oldproof
+ \let\endproof=\oldendproof
+ \let\example=\oldexample
+ \let\endexample=\oldendexample
+ \def\thmt@theoremdefiner{\newboxtheorem[#1]}%
+ }{}%
+}%
+% \end{macrocode}
+%\iffalse (hide this from DocInput)
+%</thmbox>
+%\fi
diff --git a/macros/latex/contrib/thmtools/thmtools.dtx b/macros/latex/contrib/thmtools/source/thmtools.dtx
index d5139e30c6..32e819c8e1 100644
--- a/macros/latex/contrib/thmtools/thmtools.dtx
+++ b/macros/latex/contrib/thmtools/source/thmtools.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/source/thmtools.ins b/macros/latex/contrib/thmtools/source/thmtools.ins
new file mode 100644
index 0000000000..461856c73c
--- /dev/null
+++ b/macros/latex/contrib/thmtools/source/thmtools.ins
@@ -0,0 +1,64 @@
+%%
+%% This is a bog-standard .ins file: thmtools.ins
+%%
+\input VERSION.tex
+%\show\VERSION
+\def\dropext #1.#2\relax{#1}
+\input docstrip.tex
+%\keepsilent
+\askonceonly
+\preamble
+This is a generated file.
+
+This file is part of the `thmtools' package.
+The `thmtools' package has the LPPL maintenance status: maintained.
+Current Maintainer is Yukai Chou, muzimuzhi@gmail.com
+
+Copyright (C) 2008-2014 by Ulrich M. Schwarz
+Copyright (C) 2019 by Frank Mittelbach
+Copyright (C) 2020- by Yukai Chou
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, version 1.3c.
+This version is obtainable at
+http://www.latex-project.org/lppl/lppl-1-3c.txt
+
+^^J\noexpand\noexpand\noexpand\NeedsTeXFormat{LaTeX2e}^^J\noexpand\noexpand\noexpand\ProvidesPackage{\noexpand\expandafter\noexpand\dropext\outFileName\relax}[\VERSION]
+\endpreamble
+
+\generate{%
+ \file{thmtools.sty} {\from{thmtools.dtx}{thmtools}}
+ \file{thm-restate.sty} {\from{thm-restate.dtx}{restate}}
+ \file{thm-patch.sty} {\from{thm-patch.dtx}{patch}}
+ \file{thm-autoref.sty} {\from{thm-autoref.dtx}{autoref}}
+ \file{thm-listof.sty} {\from{thm-listof.dtx}{listof}}
+ \file{thm-kv.sty} {\from{thm-kv.dtx}{kv}}
+ \file{parseargs.sty} {\from{parseargs.dtx}{parseargs}}
+ \file{aliasctr.sty} {\from{aliasctr.dtx}{code}}
+ \file{unique.sty} {\from{unique.dtx}{code}}
+ \file{thm-amsthm.sty} {\from{thm-amsthm.dtx}{amsthm}}
+ \file{thm-ntheorem.sty} {\from{thm-ntheorem.dtx}{ntheorem}}
+ \file{thm-beamer.sty} {\from{thm-beamer.dtx}{beamer}}
+ \file{thm-llncs.sty} {\from{thm-llncs.dtx}{llncs}}
+ \file{thmdef-shaded.sty} {\from{thmdef-shaded.dtx}{shaded}}
+ \file{thmdef-thmbox.sty} {\from{thmdef-thmbox.dtx}{thmbox}}
+ \file{thmdef-mdframed.sty}{\from{thmdef-mdframed.dtx}{mdframed}}
+}
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space thmtools.sty}
+\Msg{* \space\space thm-restate.sty}
+\Msg{* \space\space thm-patch.sty}
+\Msg{* \space\space thm-autoref.sty}
+\Msg{* \space\space thm-listof.sty}
+\Msg{* \space\space thm-kv.sty}
+\Msg{* \space\space aliasctr.sty}
+\Msg{* \space\space unique.sty}
+\Msg{* \space\space parseargs.sty}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+\endbatchfile
diff --git a/macros/latex/contrib/thmtools/unique.dtx b/macros/latex/contrib/thmtools/source/unique.dtx
index 9afbd2cffa..bf013ca6d4 100644
--- a/macros/latex/contrib/thmtools/unique.dtx
+++ b/macros/latex/contrib/thmtools/source/unique.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2005-8 by Ulrich M. Schwarz
+% Copyright (C) 2005-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thmdef-thmbox.dtx b/macros/latex/contrib/thmtools/thmdef-thmbox.dtx
deleted file mode 100644
index ea22cbae97..0000000000
--- a/macros/latex/contrib/thmtools/thmdef-thmbox.dtx
+++ /dev/null
@@ -1,36 +0,0 @@
-% \iffalse meta-comment
-%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
-%\fi
-%
-%\iffalse (hide this from DocInput)
-%<*thmbox>
-%\fi
-% The thmbox package does something else: instead of having a separate
-% environment, we have to use a command different from
-% \lstinline|\newtheorem| to get the boxed style. Fortunately,
-% \thmtools stores the command as \lstinline|\thmt@theoremdefiner|, so we
-% can modify it. (One of the perks if extension writer and framework writer
-% are the same person.) So, in contrast to the previous example, this time
-% we need to do something before the actual \lstinline|\newtheorem| is
-% called.
-% \begin{macrocode}
-\define@key{thmdef}{thmbox}[L]{%
- \thmt@trytwice{%
- \let\oldproof=\proof
- \let\oldendproof=\endproof
- \let\oldexample=\example
- \let\oldendexample=\endexample
- \RequirePackage[nothm]{thmbox}
- \let\proof=\oldproof
- \let\endproof=\oldendproof
- \let\example=\oldexample
- \let\endexample=\oldendexample
- \def\thmt@theoremdefiner{\newboxtheorem[#1]}%
- }{}%
-}%
-% \end{macrocode}
-%\iffalse (hide this from DocInput)
-%</thmbox>
-%\fi
diff --git a/macros/latex/contrib/thmtools/thmtools.ins b/macros/latex/contrib/thmtools/thmtools.ins
deleted file mode 100644
index 4b97aae226..0000000000
--- a/macros/latex/contrib/thmtools/thmtools.ins
+++ /dev/null
@@ -1,61 +0,0 @@
-%%
-%% This is a bog-standard .ins file: thmtools.ins
-%%
-\input VERSION.tex
-%\show\VERSION
-\def\dropext #1.#2\relax{#1}
-\input docstrip.tex
-%\keepsilent
-\askonceonly
-\preamble
-This is a generated file.
-
-This file is part of the `thmtools' package.
-The `thmtools' package has the LPPL maintenance status: unmaintained.
-
-Copyright (C) 2008-2014 by Ulrich M. Schwarz.
-
-This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, version 1.3a.
-This version is obtainable at
-http://www.latex-project.org/lppl/lppl-1-3a.txt
-
-^^J\noexpand\noexpand\noexpand\NeedsTeXFormat{LaTeX2e}^^J\noexpand\noexpand\noexpand\ProvidesPackage{\noexpand\expandafter\noexpand\dropext\outFileName\relax}[\VERSION]
-\endpreamble
-
-\generate{%
- \file{thmtools.sty}{\from{thmtools.dtx}{thmtools}}
- \file{thm-restate.sty}{\from{thm-restate.dtx}{restate}}
- \file{thm-patch.sty}{\from{thm-patch.dtx}{patch}}
- \file{thm-autoref.sty}{\from{thm-autoref.dtx}{autoref}}
- \file{thm-listof.sty}{\from{thm-listof.dtx}{listof}}
- \file{thm-kv.sty}{\from{thm-kv.dtx}{kv}}
- \file{parseargs.sty}{\from{parseargs.dtx}{parseargs}}
- \file{aliasctr.sty}{\from{aliasctr.dtx}{code}}
- \file{unique.sty}{\from{unique.dtx}{code}}
- \file{thm-amsthm.sty}{\from{thm-amsthm.dtx}{amsthm}}
- \file{thm-ntheorem.sty}{\from{thm-ntheorem.dtx}{ntheorem}}
- \file{thm-beamer.sty}{\from{thm-beamer.dtx}{beamer}}
- \file{thm-llncs.sty}{\from{thm-llncs.dtx}{llncs}}
- \file{thmdef-shaded.sty}{\from{thmdef-shaded.dtx}{shaded}}
- \file{thmdef-thmbox.sty}{\from{thmdef-thmbox.dtx}{thmbox}}
- \file{thmdef-mdframed.sty}{\from{thmdef-mdframed.dtx}{mdframed}}
- }
-\Msg{*********************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the}
-\Msg{* following files into a directory searched by TeX:}
-\Msg{*}
-\Msg{* \space\space thmtools.sty}
-\Msg{* \space\space thm-restate.sty}
-\Msg{* \space\space thm-patch.sty}
-\Msg{* \space\space thm-autoref.sty}
-\Msg{* \space\space thm-listof.sty}
-\Msg{* \space\space thm-kv.sty}
-\Msg{* \space\space aliasctr.sty}
-\Msg{* \space\space unique.sty}
-\Msg{* \space\space parseargs.sty}
-\Msg{*}
-\Msg{* Happy TeXing!}
-\Msg{*********************************************************}
-\endbatchfile
diff --git a/macros/latex/contrib/thmtools/thmtools.pdf b/macros/latex/contrib/thmtools/thmtools.pdf
deleted file mode 100644
index 5ab3fd1d69..0000000000
--- a/macros/latex/contrib/thmtools/thmtools.pdf
+++ /dev/null
Binary files differ