From 63c4f21a5716ebbed11926d0bfbb26d656a766ea Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Sat, 18 Jul 2020 03:01:08 +0000 Subject: CTAN sync 202007180301 --- macros/latex/contrib/l3experimental/CHANGELOG.md | 13 +- macros/latex/contrib/l3experimental/README.md | 9 +- .../latex/contrib/l3experimental/l3benchmark.dtx | 4 +- .../latex/contrib/l3experimental/l3benchmark.pdf | Bin 314598 -> 314158 bytes macros/latex/contrib/l3experimental/l3cctab.dtx | 587 --------------------- macros/latex/contrib/l3experimental/l3cctab.ins | 62 --- macros/latex/contrib/l3experimental/l3cctab.pdf | Bin 358686 -> 0 bytes macros/latex/contrib/l3experimental/l3color.dtx | 576 ++++++++++++++++---- macros/latex/contrib/l3experimental/l3color.pdf | Bin 350143 -> 356022 bytes .../latex/contrib/l3experimental/l3draw-boxes.dtx | 2 +- .../latex/contrib/l3experimental/l3draw-code.pdf | Bin 625280 -> 625002 bytes .../latex/contrib/l3experimental/l3draw-layers.dtx | 2 +- .../latex/contrib/l3experimental/l3draw-paths.dtx | 2 +- .../latex/contrib/l3experimental/l3draw-points.dtx | 2 +- .../latex/contrib/l3experimental/l3draw-scopes.dtx | 2 +- .../contrib/l3experimental/l3draw-softpath.dtx | 2 +- .../latex/contrib/l3experimental/l3draw-state.dtx | 4 +- .../contrib/l3experimental/l3draw-transforms.dtx | 2 +- macros/latex/contrib/l3experimental/l3draw.dtx | 4 +- macros/latex/contrib/l3experimental/l3draw.pdf | Bin 491676 -> 491247 bytes macros/latex/contrib/l3experimental/l3galley.dtx | 4 +- macros/latex/contrib/l3experimental/l3galley.pdf | Bin 386087 -> 385667 bytes macros/latex/contrib/l3experimental/l3graphics.dtx | 4 +- macros/latex/contrib/l3experimental/l3graphics.pdf | Bin 363448 -> 363017 bytes macros/latex/contrib/l3experimental/l3pdf-code.pdf | Bin 278911 -> 278541 bytes macros/latex/contrib/l3experimental/l3pdf.dtx | 4 +- macros/latex/contrib/l3experimental/l3pdf.pdf | Bin 351127 -> 350700 bytes .../latex/contrib/l3experimental/l3str-format.dtx | 4 +- .../latex/contrib/l3experimental/l3str-format.pdf | Bin 345232 -> 344797 bytes .../latex/contrib/l3experimental/l3sys-shell.dtx | 4 +- .../latex/contrib/l3experimental/l3sys-shell.pdf | Bin 312062 -> 311621 bytes macros/latex/contrib/l3experimental/xcoffins.dtx | 4 +- macros/latex/contrib/l3experimental/xcoffins.pdf | Bin 373229 -> 372787 bytes macros/latex/contrib/l3experimental/xgalley.dtx | 4 +- macros/latex/contrib/l3experimental/xgalley.pdf | Bin 286017 -> 285577 bytes 35 files changed, 501 insertions(+), 800 deletions(-) delete mode 100644 macros/latex/contrib/l3experimental/l3cctab.dtx delete mode 100644 macros/latex/contrib/l3experimental/l3cctab.ins delete mode 100644 macros/latex/contrib/l3experimental/l3cctab.pdf (limited to 'macros/latex/contrib/l3experimental') 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} % % \end{macrocode} diff --git a/macros/latex/contrib/l3experimental/l3benchmark.pdf b/macros/latex/contrib/l3experimental/l3benchmark.pdf index 6bfd2b5bec..7b2598f0d5 100644 Binary files a/macros/latex/contrib/l3experimental/l3benchmark.pdf and b/macros/latex/contrib/l3experimental/l3benchmark.pdf 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> -\documentclass[full]{l3doc} -\begin{document} - \DocInput{\jobname.dtx} -\end{document} -% -% \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} -% -% \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 } - } -% -%<*package> - \newcatcodetable #1 -% - } -% \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 } } -% -%<*package> - \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count } -% - { \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} -% -% \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 Binary files a/macros/latex/contrib/l3experimental/l3cctab.pdf and /dev/null 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} % % \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 } % - \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 Binary files a/macros/latex/contrib/l3experimental/l3color.pdf and b/macros/latex/contrib/l3experimental/l3color.pdf 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 Binary files a/macros/latex/contrib/l3experimental/l3draw-code.pdf and b/macros/latex/contrib/l3experimental/l3draw-code.pdf 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} % % \end{macrocode} diff --git a/macros/latex/contrib/l3experimental/l3draw.pdf b/macros/latex/contrib/l3experimental/l3draw.pdf index a6cc55f4a1..a8cb1a14dc 100644 Binary files a/macros/latex/contrib/l3experimental/l3draw.pdf and b/macros/latex/contrib/l3experimental/l3draw.pdf 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} % % \end{macrocode} diff --git a/macros/latex/contrib/l3experimental/l3galley.pdf b/macros/latex/contrib/l3experimental/l3galley.pdf index 2070aa9727..568e913fd2 100644 Binary files a/macros/latex/contrib/l3experimental/l3galley.pdf and b/macros/latex/contrib/l3experimental/l3galley.pdf 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} % % \end{macrocode} diff --git a/macros/latex/contrib/l3experimental/l3graphics.pdf b/macros/latex/contrib/l3experimental/l3graphics.pdf index 976b88a418..80f61fa228 100644 Binary files a/macros/latex/contrib/l3experimental/l3graphics.pdf and b/macros/latex/contrib/l3experimental/l3graphics.pdf differ diff --git a/macros/latex/contrib/l3experimental/l3pdf-code.pdf b/macros/latex/contrib/l3experimental/l3pdf-code.pdf index 82a5328fd3..d74c199483 100644 Binary files a/macros/latex/contrib/l3experimental/l3pdf-code.pdf and b/macros/latex/contrib/l3experimental/l3pdf-code.pdf 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} % % \end{macrocode} diff --git a/macros/latex/contrib/l3experimental/l3pdf.pdf b/macros/latex/contrib/l3experimental/l3pdf.pdf index aa887d20cc..c51a2055be 100644 Binary files a/macros/latex/contrib/l3experimental/l3pdf.pdf and b/macros/latex/contrib/l3experimental/l3pdf.pdf 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} % % \end{macrocode} diff --git a/macros/latex/contrib/l3experimental/l3str-format.pdf b/macros/latex/contrib/l3experimental/l3str-format.pdf index df3c4c985a..fe0b1e71cb 100644 Binary files a/macros/latex/contrib/l3experimental/l3str-format.pdf and b/macros/latex/contrib/l3experimental/l3str-format.pdf 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} % % \end{macrocode} diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.pdf b/macros/latex/contrib/l3experimental/l3sys-shell.pdf index 7a311ee701..a455433a5c 100644 Binary files a/macros/latex/contrib/l3experimental/l3sys-shell.pdf and b/macros/latex/contrib/l3experimental/l3sys-shell.pdf 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 Binary files a/macros/latex/contrib/l3experimental/xcoffins.pdf and b/macros/latex/contrib/l3experimental/xcoffins.pdf 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 Binary files a/macros/latex/contrib/l3experimental/xgalley.pdf and b/macros/latex/contrib/l3experimental/xgalley.pdf differ -- cgit v1.2.3