summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/l3experimental
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-07-18 03:01:08 +0000
committerNorbert Preining <norbert@preining.info>2020-07-18 03:01:08 +0000
commit63c4f21a5716ebbed11926d0bfbb26d656a766ea (patch)
treec02159e6ceb2453208664129ccda8ff306147328 /macros/latex/contrib/l3experimental
parent4ea983e3d411ade406c09b30ece9139457516b6f (diff)
CTAN sync 202007180301
Diffstat (limited to 'macros/latex/contrib/l3experimental')
-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
35 files changed, 501 insertions, 800 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