diff options
Diffstat (limited to 'macros/latex/contrib')
154 files changed, 2475 insertions, 2330 deletions
diff --git a/macros/latex/contrib/l3experimental/CHANGELOG.md b/macros/latex/contrib/l3experimental/CHANGELOG.md index 51a104cc70..b66593198b 100644 --- a/macros/latex/contrib/l3experimental/CHANGELOG.md +++ b/macros/latex/contrib/l3experimental/CHANGELOG.md @@ -7,6 +7,16 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2020-07-17] + +### Added +- `\color_export:nn(n)N` (see #742) +- Support for multiple color models (see #739) + +### Removed + +- `l3cctab`: moved to `l3kernel` + ## [2020-06-18] ### Changed @@ -139,7 +149,8 @@ this project uses date-based 'snapshot' version identifiers. - New `l3color` module using `xcolor`-like expression syntax - New `l3draw` module, based on `pgf` layer of the TikZ system -[Unreleased]: https://github.com/latex3/latex3/compare/2020-06-18...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2020-07-17...HEAD +[2020-07-17]: https://github.com/latex3/latex3/compare/2020-06-18...2020-07-17 [2020-06-18]: https://github.com/latex3/latex3/compare/2020-06-03...2020-06-18 [2020-06-03]: https://github.com/latex3/latex3/compare/2020-05-18...2020-06-03 [2020-05-18]: https://github.com/latex3/latex3/compare/2020-01-12...2020-05-18 diff --git a/macros/latex/contrib/l3experimental/README.md b/macros/latex/contrib/l3experimental/README.md index 0a3e72316a..413d946314 100644 --- a/macros/latex/contrib/l3experimental/README.md +++ b/macros/latex/contrib/l3experimental/README.md @@ -1,7 +1,7 @@ Experimental LaTeX3 Concepts ============================ -Release 2020-06-18 +Release 2020-07-17 Overview -------- @@ -22,7 +22,6 @@ updated at the same time. Currently included in the CTAN release of l3experimental are the following bundles: * `l3benchmark` -* `l3cctab` * `l3color` * `l3draw` * `l3graphics` @@ -37,12 +36,6 @@ bundles: This module provides support for benchmarking the performance of code. -`l3cctab` ---------- - -This module provides support for saving and restoring category codes -_en masse_ in a table. This is supported for the 8-bit range for all engines, -and for the entire Unicode range with LuaTeX. `l3color` --------- diff --git a/macros/latex/contrib/l3experimental/l3benchmark.dtx b/macros/latex/contrib/l3experimental/l3benchmark.dtx index a5654f97cd..bd5fa245a9 100644 --- a/macros/latex/contrib/l3experimental/l3benchmark.dtx +++ b/macros/latex/contrib/l3experimental/l3benchmark.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -130,7 +130,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3benchmark}{2020-06-18}{} +\ProvidesExplPackage{l3benchmark}{2020-07-17}{} {L3 Experimental benchmarking} %</package> % \end{macrocode} diff --git a/macros/latex/contrib/l3experimental/l3benchmark.pdf b/macros/latex/contrib/l3experimental/l3benchmark.pdf Binary files differindex 6bfd2b5bec..7b2598f0d5 100644 --- a/macros/latex/contrib/l3experimental/l3benchmark.pdf +++ b/macros/latex/contrib/l3experimental/l3benchmark.pdf 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 Binary files differdeleted file mode 100644 index bd691d11c2..0000000000 --- a/macros/latex/contrib/l3experimental/l3cctab.pdf +++ /dev/null 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 Binary files differindex 26f43e0e1f..80ecd21fe5 100644 --- a/macros/latex/contrib/l3experimental/l3color.pdf +++ b/macros/latex/contrib/l3experimental/l3color.pdf 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 Binary files differindex 33c81c0e60..9536595edc 100644 --- a/macros/latex/contrib/l3experimental/l3draw-code.pdf +++ b/macros/latex/contrib/l3experimental/l3draw-code.pdf 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 Binary files differindex a6cc55f4a1..a8cb1a14dc 100644 --- a/macros/latex/contrib/l3experimental/l3draw.pdf +++ b/macros/latex/contrib/l3experimental/l3draw.pdf 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 Binary files differindex 2070aa9727..568e913fd2 100644 --- a/macros/latex/contrib/l3experimental/l3galley.pdf +++ b/macros/latex/contrib/l3experimental/l3galley.pdf 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 Binary files differindex 976b88a418..80f61fa228 100644 --- a/macros/latex/contrib/l3experimental/l3graphics.pdf +++ b/macros/latex/contrib/l3experimental/l3graphics.pdf diff --git a/macros/latex/contrib/l3experimental/l3pdf-code.pdf b/macros/latex/contrib/l3experimental/l3pdf-code.pdf Binary files differindex 82a5328fd3..d74c199483 100644 --- a/macros/latex/contrib/l3experimental/l3pdf-code.pdf +++ b/macros/latex/contrib/l3experimental/l3pdf-code.pdf 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 Binary files differindex aa887d20cc..c51a2055be 100644 --- a/macros/latex/contrib/l3experimental/l3pdf.pdf +++ b/macros/latex/contrib/l3experimental/l3pdf.pdf 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 Binary files differindex df3c4c985a..fe0b1e71cb 100644 --- a/macros/latex/contrib/l3experimental/l3str-format.pdf +++ b/macros/latex/contrib/l3experimental/l3str-format.pdf 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 Binary files differindex 7a311ee701..a455433a5c 100644 --- a/macros/latex/contrib/l3experimental/l3sys-shell.pdf +++ b/macros/latex/contrib/l3experimental/l3sys-shell.pdf 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 Binary files differindex d7a782681c..ff560afb71 100644 --- a/macros/latex/contrib/l3experimental/xcoffins.pdf +++ b/macros/latex/contrib/l3experimental/xcoffins.pdf 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 Binary files differindex dfd4200570..e5c6e5ee48 100644 --- a/macros/latex/contrib/l3experimental/xgalley.pdf +++ b/macros/latex/contrib/l3experimental/xgalley.pdf diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md index d487068859..1386856157 100644 --- a/macros/latex/contrib/l3kernel/CHANGELOG.md +++ b/macros/latex/contrib/l3kernel/CHANGELOG.md @@ -7,6 +7,27 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2020-07-17] + +### Added +- `l3cctab` module for using category code tables +- `\file_parse_full_name:n` and `\file_parse_full_name_apply:nN` +- Additional `\prop_put:Nnn` variants +- `\seq_set_map_x:NNn` +- `\msg_term:nn(nnnn)` + +### Fixed +- File lookup with `\input@path` + +### Changed +- Implementation of `\file_parse_full_name:nNNN` now uses + `\file_parse_full_name:n` internally +- `\seq_set_map:NNn` no longer `x`-expands `<inline function>` + (`\seq_set_map_x:NNn` now does that). Both moved to stable. + +### Removed +- Functions deprecated at end of 2019 + ## [2020-06-18] ### Changed @@ -704,7 +725,8 @@ this project uses date-based 'snapshot' version identifiers. - Step funcÂtions have been added for dim variÂables, e.g. `\dim_step_inÂline:nnnn` -[Unreleased]: https://github.com/latex3/latex3/compare/2020-06-18...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2020-07-17...HEAD +[2020-07-17]: https://github.com/latex3/latex3/compare/2020-06-18...2020-07-17 [2020-06-18]: https://github.com/latex3/latex3/compare/2020-06-03...2020-06-18 [2020-06-03]: https://github.com/latex3/latex3/compare/2020-05-15...2020-06-03 [2020-05-15]: https://github.com/latex3/latex3/compare/2020-05-14...2020-05-15 diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md index 8ff01699d7..bfd238bcce 100644 --- a/macros/latex/contrib/l3kernel/README.md +++ b/macros/latex/contrib/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2020-06-18 +Release 2020-07-17 Overview -------- diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx index 0710d88c5d..e1a36c6db5 100644 --- a/macros/latex/contrib/l3kernel/expl3.dtx +++ b/macros/latex/contrib/l3kernel/expl3.dtx @@ -24,7 +24,7 @@ % %<*driver|generic|package|2ekernel> %</driver|generic|package|2ekernel> -\def\ExplFileDate{2020-06-18}% +\def\ExplFileDate{2020-07-17}% %<*driver> \documentclass[full]{l3doc} \usepackage{graphicx} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -423,6 +423,7 @@ % \item[bool] either true or false (the \LaTeX3 implementation does % not use \tn{iftrue} or \tn{iffalse}); % \item[box] box register; +% \item[cctab] category code table; % \item[clist] comma separated list; % \item[coffin] a \enquote{box with handles} --- a higher-level data % type for carrying out |box| alignment operations; diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf Binary files differindex 18721992ab..d76040d2bd 100644 --- a/macros/latex/contrib/l3kernel/expl3.pdf +++ b/macros/latex/contrib/l3kernel/expl3.pdf diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf Binary files differindex 8f3d8ec787..3c44cfaf5e 100644 --- a/macros/latex/contrib/l3kernel/interface3.pdf +++ b/macros/latex/contrib/l3kernel/interface3.pdf diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex index 2c600d4696..467d04cf86 100644 --- a/macros/latex/contrib/l3kernel/interface3.tex +++ b/macros/latex/contrib/l3kernel/interface3.tex @@ -54,7 +54,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2020-06-18} +\date{Released 2020-07-17} \pagenumbering{roman} \maketitle diff --git a/macros/latex/contrib/l3kernel/l3.ins b/macros/latex/contrib/l3kernel/l3.ins index 04d1e18a34..e54fe0cb51 100644 --- a/macros/latex/contrib/l3kernel/l3.ins +++ b/macros/latex/contrib/l3kernel/l3.ins @@ -95,6 +95,7 @@ and all files in that bundle must be distributed together. \from{l3fp-convert.dtx} {package} \from{l3fp-random.dtx} {package} \from{l3fparray.dtx} {package} + \from{l3cctab.dtx} {package} \from{l3sort.dtx} {package} \from{l3str-convert.dtx}{package} \from{l3tl-analysis.dtx}{package} diff --git a/macros/latex/contrib/l3kernel/l3alloc.dtx b/macros/latex/contrib/l3kernel/l3alloc.dtx index 4fdce60bdc..8f60b563f7 100644 --- a/macros/latex/contrib/l3kernel/l3alloc.dtx +++ b/macros/latex/contrib/l3kernel/l3alloc.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx index c871aeb759..3cee7e2e9e 100644 --- a/macros/latex/contrib/l3kernel/l3basics.dtx +++ b/macros/latex/contrib/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx index 8ff412298c..5043d39d56 100644 --- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx +++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx index a30bed22c7..e604fe5e4f 100644 --- a/macros/latex/contrib/l3kernel/l3box.dtx +++ b/macros/latex/contrib/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx index a307cb02df..d8d6bf6808 100644 --- a/macros/latex/contrib/l3kernel/l3candidates.dtx +++ b/macros/latex/contrib/l3kernel/l3candidates.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -426,24 +426,6 @@ % \end{texnote} % \end{function} % -% \begin{function}[added = 2011-12-22] -% {\seq_set_map:NNn, \seq_gset_map:NNn} -% \begin{syntax} -% \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function} -% \end{syntax} -% Applies \meta{inline function} to every \meta{item} stored -% within the \meta{sequence_2}. The \meta{inline function} should -% consist of code which will receive the \meta{item} as |#1|. -% The sequence resulting from \texttt{x}-expanding -% \meta{inline function} applied to each \meta{item} -% is assigned to \meta{sequence_1}. As such, the code -% in \meta{inline function} should be expandable. -% \begin{texnote} -% Contrarily to other mapping functions, \cs{seq_map_break:} cannot -% be used in this function, and would lead to low-level \TeX{} errors. -% \end{texnote} -% \end{function} -% % \begin{function}[added = 2018-04-06] % {\seq_set_from_function:NnN, \seq_gset_from_function:NnN} % \begin{syntax} @@ -622,7 +604,8 @@ % \cs{tl_build_end:N} \meta{tl~var} % \end{syntax} % Gets the contents of \meta{tl~var} and stores that into the -% \meta{tl~var} using \cs{tl_set:Nn}. The \meta{tl~var} must have +% \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}. +% The \meta{tl~var} must have % been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}. % The |end| and |gend| functions must be used for local and global % \meta{tl~var} respectively. These functions completely remove the @@ -1145,26 +1128,6 @@ % \end{macro} % \end{macro} % -% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn} -% \begin{macro}{\@@_set_map:NNNn} -% Very similar to \cs{seq_set_filter:NNn}. We could actually -% merge the two within a single function, but it would have weird -% semantics. -% \begin{macrocode} -\cs_new_protected:Npn \seq_set_map:NNn - { \@@_set_map:NNNn \tl_set:Nx } -\cs_new_protected:Npn \seq_gset_map:NNn - { \@@_set_map:NNNn \tl_gset:Nx } -\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4 - { - \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} } - #1 #2 { #3 } - \@@_pop_item_def: - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% % \begin{macro}{\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn} % \begin{macro}{\@@_set_from_inline_x:NNnn} % Set \cs{@@_item:n} then map it using the loop code. diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/contrib/l3kernel/l3cctab.dtx new file mode 100644 index 0000000000..25becd59fd --- /dev/null +++ b/macros/latex/contrib/l3kernel/l3cctab.dtx @@ -0,0 +1,891 @@ +% \iffalse meta-comment +% +%% File: l3cctab.dtx +% +% Copyright (C) 2018-2020 The LaTeX3 Project +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file +% +% http://www.latex-project.org/lppl.txt +% +% This file is part of the "l3kernel bundle" (The Work in LPPL) +% and all files in that bundle must be distributed together. +% +% ----------------------------------------------------------------------- +% +% The development version of the bundle can be found at +% +% https://github.com/latex3/latex3 +% +% for those people who are interested. +% +%<*driver> +\documentclass[full]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3cctab} package\\ Category code tables^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2020-07-17} +% +% \maketitle +% +% \begin{documentation} +% +% A category code table enables rapid switching of all category codes in +% one operation. For \LuaTeX{}, this is possible over the entire Unicode +% range. For other engines, only the $8$-bit range ($0$--$255$) is covered by +% such tables. +% +% \section{Creating and initialising category code tables} +% +% \begin{function}[updated = 2020-07-02]{\cctab_new:N,\cctab_new:c} +% \begin{syntax} +% \cs{cctab_new:N} \meta{category code table} +% \end{syntax} +% Creates a new \meta{category code table} variable or raises an error if +% the name is already taken. The declaration is global. The +% \meta{category code table} is initialised with the codes +% as used by \IniTeX{}. +% \end{function} +% +% \begin{function}[updated = 2020-07-07]{\cctab_const:Nn,\cctab_const:cn} +% \begin{syntax} +% \cs{cctab_const:Nn} \meta{category code table} \Arg{category code set up} +% \end{syntax} +% Creates a new \meta{category code table}, applies (in a group) the +% \meta{category code set up} on top of \IniTeX{} settings, +% then saves them globally as a constant +% table. The \meta{category code set up} can include a call to +% \cs{cctab_select:N}. +% \end{function} +% +% \begin{function}[updated = 2020-07-07]{\cctab_gset:Nn,\cctab_gset:cn} +% \begin{syntax} +% \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up} +% \end{syntax} +% Starting from the \IniTeX{} category codes, +% applies (in a group) the \meta{category code set up}, then saves them +% globally in the \meta{category code table}. The \meta{category code set up} +% can include a call to \cs{cctab_select:N}. +% \end{function} +% +% \section{Using category code tables} +% +% \begin{function}[updated = 2020-07-02]{\cctab_begin:N,\cctab_begin:c} +% \begin{syntax} +% \cs{cctab_begin:N} \meta{category code table} +% \end{syntax} +% Switches locally the category codes in force to those stored in the +% \meta{category code table}. The prevailing codes before the +% function is called are added to a stack, for use with +% \cs{cctab_end:}. This function does not start a \TeX{} group. +% \end{function} +% +% \begin{function}[updated = 2020-07-02]{\cctab_end:} +% \begin{syntax} +% \cs{cctab_end:} +% \end{syntax} +% Ends the scope of a \meta{category code table} started using +% \cs{cctab_begin:N}, returning the codes to those in force before the +% matching \cs{cctab_begin:N} was used. This must be used within the +% same \TeX{} group (and at the same \TeX{} group level) as the +% matching \cs{cctab_begin:N}. +% \end{function} +% +% \begin{function}[added = 2020-05-19, updated = 2020-07-02]{\cctab_select:N} +% \begin{syntax} +% \cs{cctab_select:N} \meta{category code table} +% \end{syntax} +% Selects the \meta{category code table} for the scope of the current +% group. This is in particular useful in the \meta{setup} arguments +% of \cs{tl_set_rescan:Nnn}, \cs{tl_rescan:nn}, \cs{cctab_const:Nn}, +% and \cs{cctab_gset:Nn}. +% \end{function} +% +% \section{Category code table conditionals} +% +% \begin{function}[pTF]{\cctab_if_exist:N, \cctab_if_exist:c} +% \begin{syntax} +% \cs{cctab_if_exist_p:N} \meta{category code table} +% \cs{cctab_if_exist:NTF} \meta{category code table} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests whether the \meta{category code table} is currently defined. +% This does not check that the \meta{category code table} really is a +% category code table. +% \end{function} +% +% \section{Constant category code tables} +% +% \begin{variable}[updated = 2020-07-10]{\c_code_cctab} +% Category code table for the \pkg{expl3} code environment; this does +% \emph{not} include \texttt{@}, which is retained as an \enquote{other} +% character. +% \end{variable} +% +% \begin{variable}[updated = 2020-07-08]{\c_document_cctab} +% Category code table for a standard \LaTeX{} document, as set by the \LaTeX{} +% kernel. In particular, the upper-half of the $8$-bit range will be set to +% \enquote{active} with \pdfTeX{} \emph{only}. No \pkg{babel} shorthands +% will be activated. +% \end{variable} +% +% \begin{variable}[updated = 2020-07-02]{\c_initex_cctab} +% Category code table as set up by \IniTeX{}. +% \end{variable} +% +% \begin{variable}[updated = 2020-07-02]{\c_other_cctab} +% Category code table where all characters have category code $12$ +% (other). +% \end{variable} +% +% \begin{variable}[updated = 2020-07-02]{\c_str_cctab} +% Category code table where all characters have category code $12$ +% (other) with the exception of spaces, which have category code +% $10$ (space). +% \end{variable} +% +% \end{documentation} +% +% \begin{implementation} +% +% \section{\pkg{l3cctab} implementation} +% +% \begin{macrocode} +%<*initex|package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=cctab> +% \end{macrocode} +% +% As \LuaTeX{} offers engine support for category code tables, and this +% is entirely lacking from the other engines, we need two complementary +% approaches. (Some future \XeTeX{} may add support, at which point the +% conditionals below would be different.) +% +% \subsection{Variables} +% +% \begin{variable}{\g_@@_stack_seq, \g_@@_unused_seq} +% List of catcode tables saved by nested \cs{cctab_begin:N}, to +% restore catcodes at the matching \cs{cctab_end:}. When popped from +% the \cs{g_@@_stack_seq} the table numbers are stored in +% \cs{g_@@_unused_seq} for later reuse. +% \begin{macrocode} +\seq_new:N \g_@@_stack_seq +\seq_new:N \g_@@_unused_seq +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_group_seq} +% A stack to store the group level when a catcode table started. +% \begin{macrocode} +\seq_new:N \g_@@_group_seq +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_allocate_int} +% Integer to keep track of what category code table to allocate. In +% \LuaTeX{} it is only used in format mode to implement +% \cs{cctab_new:N}. In other engines it is used to make csnames for +% dynamic tables. +% \begin{macrocode} +\int_new:N \g_@@_allocate_int +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_internal_a_tl,\l_@@_internal_b_tl} +% Scratch space. For instance, when popping +% \cs{g_@@_stack_seq}/\cs{g_@@_unused_seq}, consists of the +% catcodetable number (integer denotation) in \LuaTeX{}, or of an +% intarray variable (as a single token) in other engines. +% \begin{macrocode} +\tl_new:N \l_@@_internal_a_tl +\tl_new:N \l_@@_internal_b_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_endlinechar_prop} +% In \LuaTeX{} we store the \tn{endlinechar} associated to each +% \tn{catcodetable} in a property list, unless it is the default +% value~$13$. +% \begin{macrocode} +\prop_new:N \g_@@_endlinechar_prop +% \end{macrocode} +% \end{variable} +% +% \subsection{Allocating category code tables} +% +% \begin{macro}{\cctab_new:N, \cctab_new:c, \@@_new:N, \@@_gstore:Nnn} +% The \cs{@@_new:N} auxiliary allocates a new catcode table but does +% not attempt to set its value consistently across engines. It is +% used both in \cs{cctab_new:N}, which sets catcodes to \IniTeX{} +% values, and in \cs{cctab_begin:N}/\cs{cctab_end:} for dynamically +% allocated tables. +% +% First, the \LuaTeX{} case. +% Creating a new category code table is done like other registers. +% \begin{macrocode} +\sys_if_engine_luatex:TF + { + \cs_new_protected:Npn \cctab_new:N #1 + { + \__kernel_chk_if_free_cs:N #1 + \@@_new:N #1 + } +%<*initex> + \cs_new_protected:Npn \@@_new:N #1 + { + \int_gincr:N \g_@@_allocate_int + \int_compare:nNnTF + \g_@@_allocate_int > \c_max_register_int + { + \__kernel_msg_fatal:nnx + { kernel } { out-of-registers } { cctab } + } + { + \tex_global:D \tex_chardef:D #1 \g_@@_allocate_int + \tex_initcatcodetable:D #1 + } + } +%</initex> +%<*package> + \cs_new_eq:NN \@@_new:N \newcatcodetable +%</package> + } +% \end{macrocode} +% Now the case for other engines. Here, each table is an integer +% array. Following the \LuaTeX{} pattern, a new table starts with +% \IniTeX{} codes. The index base is out-by-one, so we have an +% internal function to handle that. The \IniTeX{} \tn{endlinechar} is +% $13$. +% \begin{macrocode} + { + \cs_new_protected:Npn \@@_new:N #1 + { \intarray_new:Nn #1 { 257 } } + \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3 + { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} } + \cs_new_protected:Npn \cctab_new:N #1 + { + \__kernel_chk_if_free_cs:N #1 + \@@_new:N #1 + \int_step_inline:nn { 256 } + { \__kernel_intarray_gset:Nnn #1 {##1} { 12 } } + \__kernel_intarray_gset:Nnn #1 { 257 } { 13 } + \@@_gstore:Nnn #1 { 0 } { 9 } + \@@_gstore:Nnn #1 { 13 } { 5 } + \@@_gstore:Nnn #1 { 32 } { 10 } + \@@_gstore:Nnn #1 { 37 } { 14 } + \int_step_inline:nnn { 65 } { 90 } + { \@@_gstore:Nnn #1 {##1} { 11 } } + \@@_gstore:Nnn #1 { 92 } { 0 } + \int_step_inline:nnn { 97 } { 122 } + { \@@_gstore:Nnn #1 {##1} { 11 } } + \@@_gstore:Nnn #1 { 127 } { 15 } + } + } +\cs_generate_variant:Nn \cctab_new:N { c } +% \end{macrocode} +% \end{macro} +% +% \subsection{Saving category code tables} +% +% \begin{macro}{\@@_gset:n, \@@_gset_aux:n} +% In various functions we need to save the current catcodes (globally) +% in a table. In \LuaTeX{}, saving the catcodes is a primitives, but +% the \tn{endlinechar} needs more work: to avoid filling +% \cs{g_@@_endlinechar_prop} with many entries we special-case the +% default value $13$. In other engines we store $256$ current +% catcodes and the \tn{endlinechar} in an intarray variable. +% \begin{macrocode} +\sys_if_engine_luatex:TF + { + \cs_new_protected:Npn \@@_gset:n #1 + { \exp_args:Nf \@@_gset_aux:n { \int_eval:n {#1} } } + \cs_new_protected:Npn \@@_gset_aux:n #1 + { + \tex_savecatcodetable:D #1 \scan_stop: + \int_compare:nNnTF { \tex_endlinechar:D } = { 13 } + { \prop_gremove:Nn \g_@@_endlinechar_prop {#1} } + { + \prop_gput:NnV \g_@@_endlinechar_prop {#1} + \tex_endlinechar:D + } + } + } + { + \cs_new_protected:Npn \@@_gset:n #1 + { + \int_step_inline:nn { 256 } + { + \__kernel_intarray_gset:Nnn #1 {##1} + { \char_value_catcode:n { ##1 - 1 } } + } + \__kernel_intarray_gset:Nnn #1 { 257 } + { \tex_endlinechar:D } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cctab_gset:Nn, \cctab_gset:cn} +% Category code tables are always global, so only one version of +% assignments is needed. Simply run the setup in a group and save the +% result in a category code table~|#1|, provided it is valid. The +% internal function is defined above depending on the engine. +% \begin{macrocode} +\cs_new_protected:Npn \cctab_gset:Nn #1#2 + { + \@@_chk_if_valid:NT #1 + { + \group_begin: + \cctab_select:N \c_initex_cctab + #2 \scan_stop: + \@@_gset:n {#1} + \group_end: + } + } +\cs_generate_variant:Nn \cctab_gset:Nn { c } +% \end{macrocode} +% \end{macro} +% +% \subsection{Using category code tables} +% +% \begin{variable}{\g_@@_internal_cctab} +% \begin{macro}[EXP]{\@@_internal_cctab_name:} +% In \LuaTeX{}, we must ensure that the saved tables are read-only. +% This is done by applying the saved table, then switching immediately +% to a scratch table. Any later catcode assignment will affect that +% scratch table rather than the saved one. If we simply switched to +% the saved tables, then \cs{char_set_catcode_other:N} in the example +% below would change \cs{c_document_cctab} and a later use of that +% table would give the wrong category code to |_|. +% \begin{verbatim} +% \use:n +% { +% \cctab_begin:N \c_document_cctab +% \char_set_catcode_other:N \_ +% \cctab_end: +% \cctab_begin:N \c_document_cctab +% \int_compare:nTF { \char_value_catcode:n { `_ } = 8 } +% { \TRUE } { \ERROR } +% \cctab_end: +% } +% \end{verbatim} +% We must also make sure that a scratch table is never reused in a +% nested group: in the following example, the scratch table used by +% the first \cs{cctab_begin:N} would be changed globally by the second +% one issuing \tn{savecatcodetable}, and after \cs{group_end:} the +% wrong category codes (those of \cs{c_str_cctab}) would be imposed. +% Note that the inner \cs{cctab_end:} restores the correct catcodes +% only locally, so the problem really comes up because of the +% different grouping level. The simplest is to use a scratch table +% labeled by the \tn{currentgrouplevel}. We initialize one of them as +% an example. +% \begin{verbatim} +% \use:n +% { +% \cctab_begin:N \c_document_cctab +% \group_begin: +% \cctab_begin:N \c_str_cctab +% \cctab_end: +% \group_end: +% \cctab_end: +% } +% \end{verbatim} +% \begin{macrocode} +\sys_if_engine_luatex:T + { + \@@_new:N \g_@@_internal_cctab + \cs_new:Npn \@@_internal_cctab_name: + { + g_@@_internal + \tex_romannumeral:D \tex_currentgrouplevel:D + _cctab + } + } +% \end{macrocode} +% \end{macro} +% \end{variable} +% +% \begin{macro}{\cctab_select:N, \cctab_select:c} +% \begin{macro}{\@@_select:N} +% The public function simply checks the \meta{cctab~var} exists before +% using the engine-dependent \cs{@@_select:N}. Skipping these checks +% would result in low-level engine-dependent errors. First, the +% \LuaTeX{} case. In other engines, selecting a catcode table is a matter +% of doing $256$ catcode assignments and setting the \tn{endlinechar}. +% \begin{macrocode} +\cs_new_protected:Npn \cctab_select:N #1 + { \@@_chk_if_valid:NT #1 { \@@_select:N #1 } } +\cs_generate_variant:Nn \cctab_select:N { c } +\sys_if_engine_luatex:TF + { + \cs_new_protected:Npn \@@_select:N #1 + { + \tex_catcodetable:D #1 + \prop_get:NVNTF \g_@@_endlinechar_prop #1 \l_@@_internal_a_tl + { \int_set:Nn \tex_endlinechar:D { \l_@@_internal_a_tl } } + { \int_set:Nn \tex_endlinechar:D { 13 } } + \cs_if_exist:cF { \@@_internal_cctab_name: } + { \exp_args:Nc \@@_new:N { \@@_internal_cctab_name: } } + \exp_args:Nc \tex_savecatcodetable:D { \@@_internal_cctab_name: } + \exp_args:Nc \tex_catcodetable:D { \@@_internal_cctab_name: } + } + } + { + \cs_new_protected:Npn \@@_select:N #1 + { + \int_step_inline:nn { 256 } + { + \char_set_catcode:nn { ##1 - 1 } + { \__kernel_intarray_item:Nn #1 {##1} } + } + \int_set:Nn \tex_endlinechar:D + { \__kernel_intarray_item:Nn #1 { 257 } } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{variable}{\g_@@_next_cctab} +% \begin{macro}{\@@_begin_aux:} +% For \cs{cctab_begin:N}/\cs{cctab_end:} we will need to allocate +% dynamic tables. This is done here by \cs{@@_begin_aux:}, which puts +% a table number (in \LuaTeX{}) or name (in other engines) into +% \cs{l_@@_internal_a_tl}. In \LuaTeX{} this simply calls \cs{@@_new:N} +% and uses the resulting catcodetable number; in other engines we need +% to give a name to the intarray variable and use that. In \LuaTeX{}, +% to restore catcodes at \cs{cctab_end:} we cannot just set +% \tn{catcodetable} to its value before \cs{cctab_begin:N}, because +% that table may have been altered by other code in the mean time. So +% we must make sure to save the catcodes in a table we control and +% restore them at \cs{cctab_end:}. +% \begin{macrocode} +\sys_if_engine_luatex:TF + { + \cs_new_protected:Npn \@@_begin_aux: + { + \@@_new:N \g_@@_next_cctab + \tl_set:NV \l_@@_internal_a_tl \g_@@_next_cctab + \cs_undefine:N \g_@@_next_cctab + } + } + { + \cs_new_protected:Npn \@@_begin_aux: + { + \int_gincr:N \g_@@_allocate_int + \exp_args:Nc \@@_new:N + { g_@@_ \int_use:N \g_@@_allocate_int _cctab } + \exp_args:NNc \tl_set:Nn \l_@@_internal_a_tl + { g_@@_ \int_use:N \g_@@_allocate_int _cctab } + } + } +% \end{macrocode} +% \end{macro} +% \end{variable} +% +% \begin{macro}{\cctab_begin:N, \cctab_begin:c} +% Check the \meta{cctab~var} exists, to avoid low-level errors. Get +% in \cs{l_@@_internal_a_tl} the number/name of a dynamic table, either +% from \cs{g_@@_unused_seq} where we save tables that are not +% currently in use, or from \cs{@@_begin_aux:} if none are available. +% Then save the current catcodes into the table (pointed to by) +% \cs{l_@@_internal_a_tl} and save that table number in a stack before +% selecting the desired catcodes. +% \begin{macrocode} +\cs_new_protected:Npn \cctab_begin:N #1 + { + \@@_chk_if_valid:NT #1 + { + \seq_gpop:NNF \g_@@_unused_seq \l_@@_internal_a_tl + { \@@_begin_aux: } + \exp_args:Nx \@@_chk_group_begin:n + { \@@_nesting_number:N \l_@@_internal_a_tl } + \seq_gpush:NV \g_@@_stack_seq \l_@@_internal_a_tl + \exp_args:NV \@@_gset:n \l_@@_internal_a_tl + \@@_select:N #1 + } + } +\cs_generate_variant:Nn \cctab_begin:N { c } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cctab_end:} +% Make sure a \cs{cctab_begin:N} was used some time earlier, get in +% \cs{l_@@_internal_a_tl} the catcode table number/name in which the +% prevailing catcodes were stored, then restore these catcodes. The +% dynamic table is now unused hence stored in \cs{g_@@_unused_seq} for +% recycling by later \cs{cctab_begin:N}. +% \begin{macrocode} +\cs_new_protected:Npn \cctab_end: + { + \seq_gpop:NNTF \g_@@_stack_seq \l_@@_internal_a_tl + { + \seq_gpush:NV \g_@@_unused_seq \l_@@_internal_a_tl + \exp_args:Nx \@@_chk_group_end:n + { \@@_nesting_number:N \l_@@_internal_a_tl } + \@@_select:N \l_@@_internal_a_tl + } + { \__kernel_msg_error:nn { kernel } { cctab-extra-end } } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_chk_group_begin:n,\@@_chk_group_end:n} +% Catcode tables are not allowed to be intermixed with groups, so here +% we check that they are properly nested regarding \TeX{} groups. +% \cs{@@_chk_group_begin:n} stores the current group level in a stack, +% and locally defines a dummy control sequence +% \cs[no-index]{@@_group_\meta{cctab-level}_chk:}. +% +% \cs{@@_chk_group_end:n} pops the stack, and compares the returned +% value with \cs{tex_currentgrouplevel:D}. If they differ, +% \cs{cctab_end:} is in a different grouping level than the matching +% \cs{cctab_begin:N}. If they are the same, both happened at the same +% level, however a group might have ended and another started between +% \cs{cctab_begin:N} and \cs{cctab_end:}: +% \begin{verbatim} +% \group_begin: +% \cctab_begin:N \c_document_cctab +% \group_end: +% \group_begin: +% \cctab_end: +% \group_end: +% \end{verbatim} +% In this case checking \cs{tex_currentgrouplevel:D} is not enough, so +% we locally define \cs[no-index]{@@_group_\meta{cctab-level}_chk:}, +% and then check if it exist in \cs{cctab_end:}. If it doesn't, +% we know there was a group end where it shouldn't. +% +% The \meta{cctab-level} in the sentinel macro above cannot be +% replaced by the more convenient \cs{tex_currentgrouplevel:D} because +% with the latter we might be tricked. Suppose: +% \begin{verbatim} +% \group_begin: +% \cctab_begin:N \c_code_cctab % A +% \group_end: +% \group_begin: +% \cctab_begin:N \c_code_cctab % B +% \cctab_end: % C +% \cctab_end: % D +% \group_end: +% \end{verbatim} +% The line marked with |A| would start a |cctab| with a sentinel token +% named \cs[no-index]{@@_group_1_chk:}, which would disappear at the +% \cs{group_end:} that follows. But |B| would create the same +% sentinel token, since both are at the same group level. Line |C| +% would end the |cctab| from line |B| correctly, but so would line |D| +% because line |B| created the same sentinel token. Using +% \meta{cctab-level} works correctly because it signals that certain +% |cctab| level was activated somewhere, but if it doesn't exist when +% the \cs{cctab_end:} is reached, we had a problem. +% +% Unfortunately these tests only flag the wrong usage at the +% \cs{cctab_end:}, which might be far from the \cs{cctab_begin:N}. +% However it isn't possible to signal the wrong usage at the +% \cs{group_end:} without using \cs{tex_aftergroup:D}, which is +% unsafe in certain types of groups. +% +% The three cases checked here just raise an error, and no recovery is +% attempted: usually interleaving groups and catcode tables will work +% predictably. +% \begin{macrocode} +\cs_new_protected:Npn \@@_chk_group_begin:n #1 + { + \seq_gpush:Nx \g_@@_group_seq + { \int_use:N \tex_currentgrouplevel:D } + \cs_set_eq:cN { @@_group_ #1 _chk: } \prg_do_nothing: + } +\cs_new_protected:Npn \@@_chk_group_end:n #1 + { + \seq_gpop:NN \g_@@_group_seq \l_@@_internal_b_tl + \bool_lazy_and:nnF + { + \int_compare_p:nNn + { \tex_currentgrouplevel:D } = { \l_@@_internal_b_tl } + } + { \cs_if_exist_p:c { @@_group_ #1 _chk: } } + { + \__kernel_msg_error:nnx { kernel } { cctab-group-mismatch } + { + \int_sign:n + { \tex_currentgrouplevel:D - \l_@@_internal_b_tl } + } + } + \cs_undefine:c { @@_group_ #1 _chk: } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_nesting_number:N,\@@_nesting_number:w} +% This macro returns the numeric index of the current catcode table. +% In \LuaTeX{} this is just the argument, which is a count reference +% to a \tn{catcodetable} register. In other engines, the number is +% extracted from the |cctab| variable. +% \begin{macrocode} +\sys_if_engine_luatex:TF + { \cs_new:Npn \@@_nesting_number:N #1 {#1} } + { + \cs_new:Npn \@@_nesting_number:N #1 + { + \exp_after:wN \exp_after:wN \exp_after:wN \@@_nesting_number:w + \exp_after:wN \token_to_str:N #1 + } + \use:x + { + \cs_new:Npn \exp_not:N \@@_nesting_number:w + ##1 \tl_to_str:n { g_@@_ } ##2 \tl_to_str:n { _cctab } {##2} + } + } +% \end{macrocode} +% \end{macro} +% +% Finally, install some code at the end of the \TeX{} run to check that +% all \cs{cctab_begin:N} were ended by some \cs{cctab_end:}. +% \begin{macrocode} +\cs_if_exist:NT \hook_gput_code:nnn + { + \hook_gput_code:nnn { enddocument/end } { kernel } + { + \seq_if_empty:NF \g_@@_stack_seq + { \__kernel_msg_error:nn { kernel } { cctab-missing-end } } + } + } +% \end{macrocode} +% +% \subsection{Category code table conditionals} +% +% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c} +% Checks whether a \meta{cctab~var} is defined. +% \begin{macrocode} +\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N + { TF , T , F , p } +\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c + { TF , T , F , p } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[TF]{\@@_chk_if_valid:N} +% \begin{macro}{\@@_chk_if_valid_aux:NTF} +% Checks whether the argument is defined and whether it is a valid +% \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var} +% is checked by the engine, which complains if the argument is not a +% \cs{chardef}'ed constant. In other engines, check if the given +% command is an intarray variable (the underlying definition is a copy +% of the \texttt{cmr10} font). +% \begin{macrocode} +\prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1 + { TF , T , F } + { + \cctab_if_exist:NTF #1 + { + \@@_chk_if_valid_aux:NTF #1 + { \prg_return_true: } + { + \__kernel_msg_error:nnx { kernel } { invalid-cctab } + { \token_to_str:N #1 } + \prg_return_false: + } + } + { + \__kernel_msg_error:nnx { kernel } { command-not-defined } + { \token_to_str:N #1 } + \prg_return_false: + } + } +\sys_if_engine_luatex:TF + { + \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1 + { +%<*initex> + \bool_lazy_and:nnTF + { \int_if_odd_p:n {#1} } + { \int_compare_p:nNn {#1-1} < { \g_@@_allocate_int } } +%</initex> +%<*package> + \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count } +%</package> + } + } + { + \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1 + { + \exp_args:Nf \str_if_in:nnTF + { \cs_meaning:N #1 } + { select~font~cmr10~at~ } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Constant category code tables} +% +% \begin{macro}{\cctab_const:Nn,\cctab_const:cn} +% Creates a new \meta{cctab~var} then sets it with the current and +% user-supplied codes. +% \begin{macrocode} +\cs_new_protected:Npn \cctab_const:Nn #1#2 + { + \cctab_new:N #1 + \cctab_gset:Nn #1 {#2} + } +\cs_generate_variant:Nn \cctab_const:Nn { c } +% \end{macrocode} +% \end{macro} +% +% \begin{variable} +% { +% \c_initex_cctab , +% \c_other_cctab , +% \c_str_cctab +% } +% Creating category code tables means thinking starting from \IniTeX{}. +% For all-other and the standard \enquote{string} tables that's easy. +% \begin{macrocode} +\cctab_new:N \c_initex_cctab +\cctab_const:Nn \c_other_cctab + { + \cctab_select:N \c_initex_cctab + \int_set:Nn \tex_endlinechar:D { -1 } + \int_step_inline:nnn { 0 } { 127 } + { \char_set_catcode_other:n {#1} } + } +\cctab_const:Nn \c_str_cctab + { + \cctab_select:N \c_other_cctab + \char_set_catcode_space:n { 32 } + } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\c_document_cctab, \c_other_cctab} +% To pick up document-level category codes, we need to delay set up to the +% end of the format, where that's possible. Also, as there are a \emph{lot} +% of category codes to set, we avoid using the official interface and store the +% document codes using internal code. Depending on whether we are in the hook +% or not, the catcodes may be code or document, so we explicitly set up both +% correctly. +% \begin{macrocode} +\cs_if_exist:NTF \@expl@finalise@setup@@@@ + { \tl_gput_right:Nn \@expl@finalise@setup@@@@ } + { \use:n } + { + \@@_new:N \c_code_cctab + \group_begin: + \int_set:Nn \tex_endlinechar:D { 32 } + \char_set_catcode_invalid:n { 0 } + \bool_lazy_or:nnTF + { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: } + { \int_step_function:nN { 31 } \char_set_catcode_invalid:n } + { \int_step_function:nN { 31 } \char_set_catcode_active:n } + \int_step_function:nnN { 33 } { 64 } \char_set_catcode_other:n + \int_step_function:nnN { 65 } { 90 } \char_set_catcode_letter:n + \int_step_function:nnN { 91 } { 96 } \char_set_catcode_other:n + \int_step_function:nnN { 97 } { 122 } \char_set_catcode_letter:n + \char_set_catcode_ignore:n { 9 } % tab + \char_set_catcode_other:n { 10 } % lf + \char_set_catcode_active:n { 12 } % ff + \char_set_catcode_end_line:n { 13 } % cr + \char_set_catcode_ignore:n { 32 } % space + \char_set_catcode_parameter:n { 35 } % hash + \char_set_catcode_math_toggle:n { 36 } % dollar + \char_set_catcode_comment:n { 37 } % percent + \char_set_catcode_alignment:n { 38 } % ampersand + \char_set_catcode_letter:n { 58 } % colon + \char_set_catcode_escape:n { 92 } % backslash + \char_set_catcode_math_superscript:n { 94 } % circumflex + \char_set_catcode_letter:n { 95 } % underscore + \char_set_catcode_group_begin:n { 123 } % left brace + \char_set_catcode_other:n { 124 } % pipe + \char_set_catcode_group_end:n { 125 } % right brace + \char_set_catcode_space:n { 126 } % tilde + \char_set_catcode_invalid:n { 127 } % ^^? + \@@_gset:n { \c_code_cctab } + \group_end: + \cctab_const:Nn \c_document_cctab + { + \cctab_select:N \c_code_cctab + \int_set:Nn \tex_endlinechar:D { 13 } + \char_set_catcode_space:n { 9 } + \char_set_catcode_space:n { 32 } + \char_set_catcode_other:n { 58 } + \char_set_catcode_math_subscript:n { 95 } + \char_set_catcode_active:n { 126 } + } + } +% \end{macrocode} +% \end{variable} +% +% \subsection{Messages} +% +% \begin{macrocode} +\__kernel_msg_new:nnnn { kernel } { cctab-stack-full } + { The~category~code~table~stack~is~exhausted. } + { + LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~ + but~there~is~no~more~space~to~do~this! + } +\__kernel_msg_new:nnnn { kernel } { cctab-extra-end } + { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. } + { + LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~ + \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored. + } +\__kernel_msg_new:nnnn { kernel } { cctab-missing-end } + { Missing~\iow_char:N\\cctab_end:~before~end~of~TeX~run. } + { + LaTeX~came~across~more~\iow_char:N\\cctab_begin:N~than~ + \iow_char:N\\cctab_end:. + } +\__kernel_msg_new:nnnn { kernel } { invalid-cctab } + { Invalid~\iow_char:N\\catcode~table. } + { + You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~ + initialized~using~\iow_char:N\\cctab_new:N~or~ + \iow_char:N\\cctab_const:Nn. + } +\__kernel_msg_new:nnnn { kernel } { cctab-group-mismatch } + { + \iow_char:N\\cctab_end:~occurred~in~a~ + \int_case:nn {#1} + { + { 0 } { different~group } + { 1 } { higher~group~level } + { -1 } { lower~group~level } + } ~than~ + the~matching~\iow_char:N\\cctab_begin:N. + } + { + Catcode~tables~and~groups~must~be~properly~nested,~but~ + you~tried~to~interleave~them.~LaTeX~will~try~to~proceed,~ + but~results~may~be~unexpected. + } +% \end{macrocode} +% +% \begin{macrocode} +%</initex|package> +% \end{macrocode} +% +% \end{implementation} +% +%\PrintIndex diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx index a05860e286..da18711b6e 100644 --- a/macros/latex/contrib/l3kernel/l3clist.dtx +++ b/macros/latex/contrib/l3kernel/l3clist.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx index b19b71f3f9..8c9f29e93b 100644 --- a/macros/latex/contrib/l3kernel/l3coffins.dtx +++ b/macros/latex/contrib/l3kernel/l3coffins.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -2233,9 +2233,6 @@ % flexible. % \begin{macrocode} \tl_new:N \l_@@_display_font_tl -%<*initex> -\tl_set:Nn \l_@@_display_font_tl { } % TODO -%</initex> %<*package> \tl_set:Nn \l_@@_display_font_tl { \sffamily \tiny } %</package> @@ -2263,7 +2260,7 @@ \hcoffin_set:Nn \l_@@_display_pole_coffin { %<*initex> - \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO + \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } %</initex> %<*package> \@@_color:n {#4} @@ -2274,9 +2271,6 @@ \l_@@_display_pole_coffin { hc } { vc } { 0pt } { 0pt } \hcoffin_set:Nn \l_@@_display_coord_coffin { -%<*initex> - % TODO -%</initex> %<*package> \@@_color:n {#4} %</package> @@ -2332,7 +2326,7 @@ \hcoffin_set:Nn \l_@@_display_pole_coffin { %<*initex> - \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO + \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } %</initex> %<*package> \@@_color:n {#2} @@ -2377,9 +2371,6 @@ { 0pt } { 0pt } \hcoffin_set:Nn \l_@@_display_coord_coffin { -%<*initex> - % TODO -%</initex> %<*package> \@@_color:n {#6} %</package> diff --git a/macros/latex/contrib/l3kernel/l3color-base.dtx b/macros/latex/contrib/l3kernel/l3color-base.dtx index 178cd98b19..a01acb8fa1 100644 --- a/macros/latex/contrib/l3kernel/l3color-base.dtx +++ b/macros/latex/contrib/l3kernel/l3color-base.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx index 3aa7eb3998..632e62e58b 100644 --- a/macros/latex/contrib/l3kernel/l3debug.dtx +++ b/macros/latex/contrib/l3kernel/l3debug.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -865,6 +865,7 @@ \box_gset_eq:NN \box_gset_eq_drop:NN \box_gset_to_last:N + \cctab_gset:Nn \clist_gset_eq:NN \dim_gset_eq:NN \dim_gzero:N @@ -926,6 +927,7 @@ { } { \bool_const:Nn + \cctab_const:Nn \dim_const:Nn \int_const:Nn \intarray_const_from_clist:Nn @@ -961,6 +963,10 @@ \__kernel_patch:nnn { \__kernel_chk_var_scope:NN g #1 } { } + { \cctab_new:N } + \__kernel_patch:nnn + { \__kernel_chk_var_scope:NN g #1 } + { } { \intarray_new:Nn } \__kernel_patch:nnn { \__kernel_chk_var_scope:NN q #1 } diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx index 012e0d3208..8faf863504 100644 --- a/macros/latex/contrib/l3kernel/l3deprecation.dtx +++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -402,6 +402,52 @@ { \c_sys_jobname_str } { 2017-01-01 } \@@_old:Nnn \c_minus_one { -1 } { 2019-01-01 } +\@@_old:Nnn \c_zero + { 0 } { 2020-01-01 } +\@@_old:Nnn \c_one + { 1 } { 2020-01-01 } +\@@_old:Nnn \c_two + { 2 } { 2020-01-01 } +\@@_old:Nnn \c_three + { 3 } { 2020-01-01 } +\@@_old:Nnn \c_four + { 4 } { 2020-01-01 } +\@@_old:Nnn \c_five + { 5 } { 2020-01-01 } +\@@_old:Nnn \c_six + { 6 } { 2020-01-01 } +\@@_old:Nnn \c_seven + { 7 } { 2020-01-01 } +\@@_old:Nnn \c_eight + { 8 } { 2020-01-01 } +\@@_old:Nnn \c_nine + { 9 } { 2020-01-01 } +\@@_old:Nnn \c_ten + { 10 } { 2020-01-01 } +\@@_old:Nnn \c_eleven + { 11 } { 2020-01-01 } +\@@_old:Nnn \c_twelve + { 12 } { 2020-01-01 } +\@@_old:Nnn \c_thirteen + { 13 } { 2020-01-01 } +\@@_old:Nnn \c_fourteen + { 14 } { 2020-01-01 } +\@@_old:Nnn \c_fifteen + { 15 } { 2020-01-01 } +\@@_old:Nnn \c_sixteen + { 16 } { 2020-01-01 } +\@@_old:Nnn \c_thirty_two + { 32 } { 2020-01-01 } +\@@_old:Nnn \c_one_hundred + { 100 } { 2020-01-01 } +\@@_old:Nnn \c_two_hundred_fifty_five + { 255 } { 2020-01-01 } +\@@_old:Nnn \c_two_hundred_fifty_six + { 256 } { 2020-01-01 } +\@@_old:Nnn \c_one_thousand + { 1000 } { 2020-01-01 } +\@@_old:Nnn \c_ten_thousand + { 10000 } { 2020-01-01 } \@@_old:Nnn \dim_case:nnn { \dim_case:nnF } { 2015-07-14 } \@@_old:Nnn \file_add_path:nN @@ -442,6 +488,12 @@ { \iow_show_list: } { 2019-01-01 } \@@_old:Nnn \iow_log_streams: { \iow_log_list: } { 2019-01-01 } +\@@_old:Nnn \lua_escape_x:n + { \lua_escape:e } { 2020-01-01 } +\@@_old:Nnn \lua_now_x:n + { \lua_now:e } { 2020-01-01 } +\@@_old_protected:Nnn \lua_shipout_x:n + { \lua_shipout_e:n } { 2020-01-01 } \@@_old:Nnn \luatex_if_engine_p: { \sys_if_engine_luatex_p: } { 2017-01-01 } \@@_old:Nnn \luatex_if_engine:F @@ -450,6 +502,12 @@ { \sys_if_engine_luatex:T } { 2017-01-01 } \@@_old:Nnn \luatex_if_engine:TF { \sys_if_engine_luatex:TF } { 2017-01-01 } +\@@_old_protected:Nnn \msg_interrupt:nnn + { [Defined~error~message] } { 2020-01-01 } +\@@_old_protected:Nnn \msg_log:n + { \iow_log:n } { 2020-01-01 } +\@@_old_protected:Nnn \msg_term:n + { \iow_term:n } { 2020-01-01 } \@@_old:Nnn \pdftex_if_engine_p: { \sys_if_engine_pdftex_p: } { 2017-01-01 } \@@_old:Nnn \pdftex_if_engine:F @@ -476,8 +534,28 @@ { \str_case:nnF } { 2015-07-14 } \@@_old:Nnn \str_case:onn { \str_case:onF } { 2015-07-14 } +\@@_old:Nnn \str_case_x:nn + { \str_case_e:nn } { 2020-01-01 } \@@_old:Nnn \str_case_x:nnn { \str_case_e:nnF } { 2015-07-14 } +\@@_old:Nnn \str_case_x:nnT + { \str_case_e:nnT } { 2020-01-01 } +\@@_old:Nnn \str_case_x:nnTF + { \str_case_e:nnTF } { 2020-01-01 } +\@@_old:Nnn \str_case_x:nnF + { \str_case_e:nnF } { 2020-01-01 } +\@@_old:Nnn \str_if_eq_x_p:nn + { \str_if_eq_p:ee } { 2020-01-01 } +\@@_old:Nnn \str_if_eq_x:nnT + { \str_if_eq:eeT } { 2020-01-01 } +\@@_old:Nnn \str_if_eq_x:nnF + { \str_if_eq:eeF } { 2020-01-01 } +\@@_old:Nnn \str_if_eq_x:nnTF + { \str_if_eq:eeTF } { 2020-01-01 } +\@@_old_protected:Nnn \tl_show_analysis:N + { \tl_analysis_show:N } { 2020-01-01 } +\@@_old_protected:Nnn \tl_show_analysis:n + { \tl_analysis_show:n } { 2020-01-01 } \@@_old:Nnn \tl_case:cnn { \tl_case:cnF } { 2015-07-14 } \@@_old:Nnn \tl_case:Nnn @@ -499,70 +577,6 @@ % \end{macrocode} % \end{macro} % -% \subsection{Deprecated primitives} -% -% \begin{macro}[deprecated = 2020-07-01]{\etex_beginL:D} -% \begin{macro}{\@@_primitive:NN, \@@_primitive:w} -% We renamed all primitives to \cs[no-index]{tex_\ldots{}:D} so all -% others are deprecated. In \pkg{l3names}, \cs{__kernel_primitives:} -% is defined to contain \cs{__kernel_primitive:NN} \cs{beginL} -% \cs{etex_beginL:D} and so on, one for each deprecated primitive. We -% apply \cs{exp_not:N} to the second argument of -% \cs{__kernel_primitive:NN} because it may be outer (both when doing -% and undoing deprecation actually), then \cs{@@_primitive:NN} uses -% \cs{tex_let:D} to change the meaning of this potentially outer -% token. Then, either turn it into an error or make it equal to the -% primitive~|#1|. To be more precise, |#1| may not be defined, so try -% a \cs[no-index]{tex_\ldots{}:D} command as well. -% \begin{macrocode} -\cs_new_protected:Npn \@@_primitive:NN #1#2 { } -\exp_last_unbraced:NNNNo - \cs_new:Npn \@@_primitive:w #1 { \token_to_str:N _ } { } -\__kernel_deprecation_code:nn - { - \cs_set_protected:Npn \__kernel_primitive:NN #1 - { - \exp_after:wN \@@_primitive:NN - \exp_after:wN #1 - \exp_not:N - } - \cs_set_protected:Npn \@@_primitive:NN #1#2 - { - \tex_let:D #2 \scan_stop: - \exp_args:NNx \__kernel_deprecation_error:Nnn #2 - { - \iow_char:N \\ - \cs_if_exist:NTF #1 - { \cs_to_str:N #1 } - { - tex_ - \exp_last_unbraced:Nf - \@@_primitive:w { \cs_to_str:N #2 } - } - } - { 2020-01-01 } - } - \__kernel_primitives: - } - { - \cs_set_protected:Npn \__kernel_primitive:NN #1 - { - \exp_after:wN \@@_primitive:NN - \exp_after:wN #1 - \exp_not:N - } - \cs_set_protected:Npn \@@_primitive:NN #1#2 - { - \tex_let:D #2 #1 - \cs_if_exist:cT { tex_ \cs_to_str:N #1 :D } - { \cs_set_eq:Nc #2 { tex_ \cs_to_str:N #1 :D } } - } - \__kernel_primitives: - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% % \subsection{Loading the patches} % % When loaded first, the patches are simply read here. @@ -646,243 +660,6 @@ % \end{macrocode} % \end{macro} % -% \subsection{Deprecated \pkg{l3int} functions} -% -% \begin{macrocode} -%<@@=int> -% \end{macrocode} -% -% \begin{variable}[deprecated = 2020-07-01] -% { -% \c_zero, \c_one, \c_two, \c_three, \c_four, \c_five, \c_six, -% \c_seven, \c_eight, \c_nine, \c_ten, \c_eleven, \c_twelve, -% \c_thirteen, \c_fourteen, \c_fifteen, \c_sixteen, \c_thirty_two, -% \c_one_hundred, \c_two_hundred_fifty_five, -% \c_two_hundred_fifty_six, \c_one_thousand, \c_ten_thousand, -% } -% \begin{macro}{\@@_deprecated_constants:nn} -% Constants that are now deprecated. By default define them with -% \cs{int_const:Nn}. To deprecate them call for instance -% \cs{__kernel_deprecation_error:Nnn} \cs{c_zero} |{0}| -% |{2020-01-01}|. To redefine them (locally), use -% \cs{@@_constdef:Nw}, with an \cs{exp_not:N} construction because the -% constants themselves are outer at that point. -% \begin{macrocode} -\cs_gset_protected:Npn \@@_deprecated_constants:nn #1#2 - { - #1 \c_zero { 0 } #2 - #1 \c_one { 1 } #2 - #1 \c_two { 2 } #2 - #1 \c_three { 3 } #2 - #1 \c_four { 4 } #2 - #1 \c_five { 5 } #2 - #1 \c_six { 6 } #2 - #1 \c_seven { 7 } #2 - #1 \c_eight { 8 } #2 - #1 \c_nine { 9 } #2 - #1 \c_ten { 10 } #2 - #1 \c_eleven { 11 } #2 - #1 \c_twelve { 12 } #2 - #1 \c_thirteen { 13 } #2 - #1 \c_fourteen { 14 } #2 - #1 \c_fifteen { 15 } #2 - #1 \c_sixteen { 16 } #2 - #1 \c_thirty_two { 32 } #2 - #1 \c_one_hundred { 100 } #2 - #1 \c_two_hundred_fifty_five { 255 } #2 - #1 \c_two_hundred_fifty_six { 256 } #2 - #1 \c_one_thousand { 1000 } #2 - #1 \c_ten_thousand { 10000 } #2 - } -\cs_set_protected:Npn \@@_deprecated_constants:Nn #1#2 - { - \cs_if_free:NT #1 - { \int_const:Nn #1 {#2} } - } -\@@_deprecated_constants:nn { \@@_deprecated_constants:Nn } { } -\__kernel_deprecation_code:nn - { - \@@_deprecated_constants:nn - { \exp_after:wN \__kernel_deprecation_error:Nnn \exp_not:N } - { { 2020-01-01 } } - } - { - \@@_deprecated_constants:nn - { - \exp_after:wN \use:nnn - \exp_after:wN \@@_constdef:Nw \exp_not:N - } - { \exp_stop_f: } - } -% \end{macrocode} -% \end{macro} -% \end{variable} -% -% \begin{macro}[deprecated = 2020-07-01]{\@@_value:w} -% Made public. -% \begin{macrocode} -\cs_gset_eq:NN \@@_value:w \int_value:w -% \end{macrocode} -% \end{macro} -% -% \subsection{Deprecated \pkg{l3luatex} functions} -% -% \begin{macrocode} -%<@@=lua> -% \end{macrocode} -% -% \begin{macro}[EXP, deprecated = 2020-07-01]{\lua_now_x:n, \lua_escape_x:n} -% \begin{macro}[deprecated = 2020-07-01]{\lua_shipout_x:n} -% \begin{macrocode} -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_now:e } -\cs_gset:Npn \lua_now_x:n #1 { \@@_now:n {#1} } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_escape:e } -\cs_gset:Npn \lua_escape_x:n #1 { \@@_escape:n {#1} } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_shipout_e:n } -\cs_gset_protected:Npn \lua_shipout_x:n #1 { \@@_shipout:n {#1} } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Deprecated \pkg{l3msg} functions} -% -% \begin{macrocode} -%<@@=msg> -% \end{macrocode} -% -% \begin{macro}[deprecated = 2020-07-01]{\msg_log:n, \msg_term:n} -% \begin{macrocode} -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_log:n } -\cs_gset_protected:Npn \msg_log:n #1 - { - \iow_log:n { ................................................. } - \iow_wrap:nnnN { . ~ #1} { . ~ } { } \iow_log:n - \iow_log:n { ................................................. } - } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_term:n } -\cs_gset_protected:Npn \msg_term:n #1 - { - \iow_term:n { ************************************************* } - \iow_wrap:nnnN { * ~ #1} { * ~ } { } \iow_term:n - \iow_term:n { ************************************************* } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[deprecated = 2020-07-01]{\msg_interrupt:nnn} -% \begin{macrocode} -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { [Defined~error~message] } -\cs_gset_protected:Npn \msg_interrupt:nnn #1#2#3 - { - \tl_if_empty:nTF {#3} - { - \@@_old_interrupt_wrap:nn { \\ \c_@@_no_info_text_tl } - {#1 \\\\ #2 \\\\ \c_@@_continue_text_tl } - } - { - \@@_old_interrupt_wrap:nn { \\ #3 } - {#1 \\\\ #2 \\\\ \c_@@_help_text_tl } - } - } -\cs_gset_protected:Npn \@@_old_interrupt_wrap:nn #1#2 - { - \iow_wrap:nnnN {#1} { | ~ } { } \@@_old_interrupt_more_text:n - \iow_wrap:nnnN {#2} { ! ~ } { } \@@_old_interrupt_text:n - } -\cs_gset_protected:Npn \@@_old_interrupt_more_text:n #1 - { - \exp_args:Nx \tex_errhelp:D - { - |''''''''''''''''''''''''''''''''''''''''''''''' - #1 \iow_newline: - |............................................... - } - } -\group_begin: - \char_set_lccode:nn {`\{} {`\ } - \char_set_lccode:nn {`\}} {`\ } - \char_set_lccode:nn {`\&} {`\!} - \char_set_catcode_active:N \& -\tex_lowercase:D - { - \group_end: - \cs_gset_protected:Npn \@@_old_interrupt_text:n #1 - { - \iow_term:x - { - \iow_newline: - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - \iow_newline: - ! - } - \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J } - { - \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 } - { - \group_begin: - \cs_set_protected:Npn & - { - \tex_errmessage:D - { - #1 - \use_none:n - { ............................................ } - } - } - \exp_after:wN - \group_end: - & - } - } - } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Deprecated \pkg{l3prg} functions} -% -% \begin{macrocode} -%<@@=prg> -% \end{macrocode} -% -% \begin{macro}[deprecated = 2020-07-01] -% { -% \@@_break_point:Nn, -% \@@_break_point:, -% \@@_map_break:Nn, -% \@@_break:, -% \@@_break:n -% } -% Made public, but used by a few third-parties. It's not possible to -% perfectly support a mixture of \cs{@@_map_break:Nn} and -% \cs{prg_map_break:Nn} because they use different delimiters. The -% following code only breaks if someone tries to break from two -% \enquote{old-style} \cs{@@_map_break:Nn} \ldots{} -% \cs{@@_break_point:Nn} mappings in one go. Basically, the -% \cs{@@_map_break:Nn} converts a single \cs{@@_break_point:Nn} to -% \cs{prg_break_point:Nn}, and that delimiter had better be the right -% one. Then we call \cs{prg_map_break:Nn} which may end up breaking -% intermediate looks in the (unbraced) argument |#1|. It is essential -% to define the |break_point| functions before the corresponding -% |break| functions: otherwise \cs{debug_on:n} |{deprecation}| -% \cs{debug_off:n} |{deprecation}| would break when trying to restore -% the definitions because they would involve deprecated commands whose -% definition has not yet been restored. -% \begin{macrocode} -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point:Nn } -\cs_gset:Npn \@@_break_point:Nn { \prg_break_point:Nn } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point: } -\cs_gset:Npn \@@_break_point: { \prg_break_point: } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_map_break:Nn } -\cs_gset:Npn \@@_map_break:Nn #1 \@@_break_point:Nn - { \prg_map_break:Nn #1 \prg_break_point:Nn } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break: } -\cs_gset:Npn \@@_break: #1 \@@_break_point: { } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break:n } -\cs_gset:Npn \@@_break:n #1#2 \@@_break_point: {#1} -% \end{macrocode} -% \end{macro} -% % \subsection{Deprecated \pkg{l3str} functions} % % \begin{macro}[EXP, deprecated = 2022-07-01] @@ -907,29 +684,6 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}[EXP, deprecated = 2020-07-01, noTF]{\str_case_x:nn} -% \begin{macro}[EXP, deprecated = 2020-07-01, pTF]{\str_if_eq_x:nn} -% \begin{macrocode} -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nn } -\cs_gset:Npn \str_case_x:nn { \str_case_e:nn } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnT } -\cs_gset:Npn \str_case_x:nnT { \str_case_e:nnT } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnF } -\cs_gset:Npn \str_case_x:nnF { \str_case_e:nnF } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnTF } -\cs_gset:Npn \str_case_x:nnTF { \str_case_e:nnTF } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq_p:ee } -\cs_gset:Npn \str_if_eq_x_p:nn { \str_if_eq_p:ee } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeT } -\cs_gset:Npn \str_if_eq_x:nnT { \str_if_eq:eeT } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeF } -\cs_gset:Npn \str_if_eq_x:nnF { \str_if_eq:eeF } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeTF } -\cs_gset:Npn \str_if_eq_x:nnTF { \str_if_eq:eeTF } -% \end{macrocode} -% \end{macro} -% \end{macro} -% % \subsection{Deprecated \pkg{l3seq} functions} % % \begin{macro}[EXP, deprecated = 2023-01-01] @@ -1023,19 +777,6 @@ % \end{macrocode} % \end{macro} % -% \subsection{Deprecated \pkg{l3tl-analysis} functions} -% -% \begin{macro}[deprecated = 2020-07-01] -% {\tl_show_analysis:N, \tl_show_analysis:n} -% Simple renames. -% \begin{macrocode} -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:N } -\cs_gset_protected:Npn \tl_show_analysis:N { \tl_analysis_show:N } -\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:n } -\cs_gset_protected:Npn \tl_show_analysis:n { \tl_analysis_show:n } -% \end{macrocode} -% \end{macro} -% % \subsection{Deprecated \pkg{l3token} functions} % % \begin{macro}[EXP, deprecated = 2021-07-01] diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx index ffb7269f49..0954108c96 100644 --- a/macros/latex/contrib/l3kernel/l3doc.dtx +++ b/macros/latex/contrib/l3kernel/l3doc.dtx @@ -79,7 +79,7 @@ and all files in that bundle must be distributed together. % % \title{The \cls{l3doc} class} % \author{\Team} -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % \maketitle % \tableofcontents % @@ -3368,7 +3368,7 @@ and all files in that bundle must be distributed together. { \seq_set_map:NNn \l_@@_tmpa_seq \g_@@_nested_names_seq - { \exp_not:n { \@@_macro_end_wrap_item:n {##1} } } + { \@@_macro_end_wrap_item:n {##1} } End~ definition~ for~ \int_compare:nTF { \seq_count:N \l_@@_tmpa_seq <= 3 } { diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx index a334b443d0..bf56cdd54f 100644 --- a/macros/latex/contrib/l3kernel/l3docstrip.dtx +++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf Binary files differindex 52aaff704f..4c59fc9770 100644 --- a/macros/latex/contrib/l3kernel/l3docstrip.pdf +++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx index df60bcd3ab..e902085148 100644 --- a/macros/latex/contrib/l3kernel/l3expan.dtx +++ b/macros/latex/contrib/l3kernel/l3expan.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx index c189e4bdd9..7ee7df5347 100644 --- a/macros/latex/contrib/l3kernel/l3file.dtx +++ b/macros/latex/contrib/l3kernel/l3file.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -677,7 +677,7 @@ % If the file is not found on the path, the expansion is empty. % \end{function} % -% \begin{function}[added = 2017-06-23, updated = 2017-06-26] +% \begin{function}[added = 2017-06-23, updated = 2020-06-24] % {\file_parse_full_name:nNNN, \file_parse_full_name:VNNN} % \begin{syntax} % \cs{file_parse_full_name:nNNN} \Arg{full name} \meta{dir} \meta{name} \meta{ext} @@ -697,9 +697,28 @@ % \item The \meta{ext}: everything after the last |.| (including the dot). % The \meta{ext} is empty if there is no |.| after the last |/|. % \end{itemize} -% This function does not expand the \meta{full name} before turning it -% to a string. It assume that the \meta{full name} either contains no -% quote (|"|) characters or is surrounded by a pair of quotes. +% +% Before parsing, the \meta{full name} is expanded until only non-expandable +% tokens remain, except that active characters are also not expanded. +% Quotes (|"|) are invalid in file names and are discarded from the input. +% \end{function} +% +% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name:n} +% \begin{syntax} +% \cs{file_parse_full_name:n} \Arg{full name} +% \end{syntax} +% Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN}, +% and leaves \meta{dir}, \meta{name}, and \meta{ext} in the input stream, +% each inside a pair of braces. +% \end{function} +% +% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name_apply:nN} +% \begin{syntax} +% \cs{file_parse_full_name_apply:nN} \Arg{full name} \meta{function} +% \end{syntax} +% Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN}, +% and passes \meta{dir}, \meta{name}, and \meta{ext} as arguments to \meta{function}, +% as an \texttt{n}-type argument each, in this order. % \end{function} % % \begin{function}[rEXP, added = 2019-11-19] @@ -2682,8 +2701,8 @@ % \end{macro} % % \begin{macro}[EXP]{\file_full_name:n, \@@_full_name:n} -% \begin{macro}[EXP]{\@@_full_name_aux:nn} -% \begin{macro}[EXP]{\@@_full_name_aux:n} +% \begin{macro}[EXP]{\@@_full_name_aux:Nnn} +% \begin{macro}[EXP]{\@@_full_name_aux:nN} % \begin{macro}[EXP]{\@@_name_cleanup:w} % \begin{macro}[EXP]{\@@_name_end:} % \begin{macro}[EXP]{\@@_name_ext_check:n} @@ -2714,12 +2733,12 @@ \tl_if_blank:eTF { \@@_size:n {#1} } { \seq_map_tokens:Nn \l_file_search_path_seq - { \@@_full_name_aux:nn {#1} } + { \@@_full_name_aux:Nnn \seq_map_break:n {#1} } %<*package> \cs_if_exist:NT \input@path { \tl_map_tokens:Nn \input@path - { \@@_full_name_aux:nn {#1} } + { \@@_full_name_aux:Nnn \tl_map_break:n {#1} } } %</package> \@@_name_end: @@ -2731,13 +2750,13 @@ % Two pars to the auxiliary here so we can avoid doing quoting % twice in the event we find the right file. % \begin{macrocode} -\cs_new:Npn \@@_full_name_aux:nn #1#2 - { \exp_args:Ne \@@_full_name_aux:n { \tl_to_str:n {#2} / #1 } } -\cs_new:Npn \@@_full_name_aux:n #1 +\cs_new:Npn \@@_full_name_aux:Nnn #1#2#3 + { \exp_args:Ne \@@_full_name_aux:nN { \tl_to_str:n {#3} / #2 } #1 } +\cs_new:Npn \@@_full_name_aux:nN #1 #2 { \tl_if_blank:eF { \@@_size:n {#1} } { - \seq_map_break:n + #2 { \@@_ext_check:n {#1} \@@_name_cleanup:w @@ -3358,63 +3377,113 @@ % \end{macro} % \end{macro} % -% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN} -% \begin{macro} -% {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF} -% Parsing starts by stripping off any surrounding quotes. Then find -% the directory |#4| by splitting at the last~|/|. (The auxiliary -% returns \texttt{true}/\texttt{false} depending on whether it found -% the delimiter.) We correct for the case of a file in the root |/|, -% as in that case we wish to keep the trailing (and only) slash. Then -% split the base name |#5| at the last dot. If there was indeed a -% dot, |#5| contains the name and |#6| the extension without the dot, -% which we add back for convenience. In the special case of no -% extension given, the auxiliary stored the name into |#6|, we just -% have to move it to |#5|. -% \begin{macrocode} -\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4 - { - \exp_after:wN \@@_parse_full_name_auxi:w - \tl_to_str:n { #1 " #1 " } \s_@@_stop #2#3#4 +% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name_apply:nN} +% The main parsing macro \cs{file_parse_full_name_apply:nN} passes the +% file name |#1| through \cs{__kernel_file_name_sanitize:n} so that we +% have a single normalised way to treat files internally. +% \cs{file_parse_full_name:n} uses the former, with +% \cs{prg_do_nothing:} to +% leave each part of the name within a pair of braces. +% \begin{macrocode} +\cs_new:Npn \file_parse_full_name:n #1 + { + \file_parse_full_name_apply:nN {#1} + \prg_do_nothing: } -\cs_generate_variant:Nn \file_parse_full_name:nNNN { V } -\cs_new_protected:Npn \@@_parse_full_name_auxi:w - #1 " #2 " #3 \s_@@_stop #4#5#6 - { - \@@_parse_full_name_split:nNNNTF {#2} / #4 #5 - { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } } - { } - \exp_args:No \@@_parse_full_name_split:nNNNTF {#5} . #5 #6 - { \str_put_left:Nn #6 { . } } - { - \str_set_eq:NN #5 #6 - \str_clear:N #6 - } +\cs_new:Npn \file_parse_full_name_apply:nN #1 + { + \exp_args:Ne \@@_parse_full_name_auxi:nN + { \__kernel_file_name_sanitize:n {#1} } } -\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4 +% \end{macrocode} +% +% \begin{macro}{\@@_parse_full_name_auxi:nN} +% \begin{macro}{\@@_parse_full_name_area:nw} +% \cs{@@_parse_full_name_area:nw} splits the file name into chunks +% separated by |/|, until the last one is reached. The last chunk is +% the file name plus the extension, and everything before that is the +% path. When \cs{@@_parse_full_name_area:nw} is done, it leaves +% the path within braces after the scan mark \cs{s_@@_stop} and +% proceeds parsing the actual file name. +% \begin{macrocode} +\cs_new:Npn \@@_parse_full_name_auxi:nN #1 { - \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \s_@@_stop + \@@_parse_full_name_area:nw { } #1 + / \s_@@_stop + } +\cs_new:Npn \@@_parse_full_name_area:nw #1 #2 / #3 \s_@@_stop + { + \tl_if_empty:nTF {#3} + { \@@_parse_full_name_base:nw { } #2 . \s_@@_stop {#1} } + { \@@_parse_full_name_area:nw { #1 / #2 } #3 \s_@@_stop } + } +% \end{macrocode} +% +% \begin{macro}{\@@_parse_full_name_base:nw} +% \cs{@@_parse_full_name_base:nw} does roughly the same as above, but +% it separates the chunks at each period. However here there's some +% extra complications: In case |#1| is empty, it is assumed that the +% extension is actually empty, and the file name is |#2|. Besides, an +% extra |.| has to be added to |#2| because it is later removed in +% \cs{@@_parse_full_name_tidy:nnnN}. In any case, if there's an +% extension, it is returned with a leading |.|. +% \begin{macrocode} +\cs_new:Npn \@@_parse_full_name_base:nw #1 #2 . #3 \s_@@_stop + { + \tl_if_empty:nTF {#3} { - \tl_if_empty:nTF {##3} + \tl_if_empty:nTF {#1} { - \str_set:Nn #4 {##2} - \tl_if_empty:nTF {##1} - { - \str_clear:N #3 - \use_ii:nn - } - { - \str_set:Nx #3 { \str_tail:n {##1} } - \use_i:nn - } + \tl_if_empty:nTF {#2} + { \@@_parse_full_name_tidy:nnnN { } { } } + { \@@_parse_full_name_tidy:nnnN { .#2 } { } } } - { \@@_tmp:w { ##1 #2 ##2 } ##3 \s_@@_stop } + { \@@_parse_full_name_tidy:nnnN {#1} { .#2 } } } - \@@_tmp:w { } #1 #2 \s_@@_stop + { \@@_parse_full_name_base:nw { #1 . #2 } #3 \s_@@_stop } + } +% \end{macrocode} +% +% \begin{macro}{\@@_parse_full_name_tidy:nnnN} +% Now we just need to tidy some bits left loose before. The loop +% used in the two macros above start with a leading |/| and |.| in the +% file path an name, so here we need to remove them, except in the +% path, if it is a single |/|, in which case it's left as is. After +% all's done, pass to |#4|. +% \begin{macrocode} +\cs_new:Npn \@@_parse_full_name_tidy:nnnN #1 #2 #3 #4 + { + \exp_args:Nee #4 + { + \str_if_eq:nnF {#3} { / } { \use_none:n } + #3 \prg_do_nothing: + } + { \use_none:n #1 \prg_do_nothing: } + {#2} } % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN} +% \begin{macrocode} +\cs_new_protected:Npn \file_parse_full_name:nNNN #1 #2 #3 #4 + { + \file_parse_full_name_apply:nN {#1} + \@@_full_name_assign:nnnNNN #2 #3 #4 + } +\cs_new_protected:Npn \@@_full_name_assign:nnnNNN #1 #2 #3 #4 #5 #6 + { + \str_set:Nn #4 {#1} + \str_set:Nn #5 {#2} + \str_set:Nn #6 {#3} + } +\cs_generate_variant:Nn \file_parse_full_name:nNNN { V } +% \end{macrocode} +% \end{macro} % % \begin{macro}{\file_show_list:, \file_log_list:, \@@_list:N} % \begin{macro}[EXP]{\@@_list_aux:n} diff --git a/macros/latex/contrib/l3kernel/l3final.dtx b/macros/latex/contrib/l3kernel/l3final.dtx index 5f3a74fb0d..809850d1a5 100644 --- a/macros/latex/contrib/l3kernel/l3final.dtx +++ b/macros/latex/contrib/l3kernel/l3final.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx index de8f7b5046..0d68f05eee 100644 --- a/macros/latex/contrib/l3kernel/l3flag.dtx +++ b/macros/latex/contrib/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3format.ins b/macros/latex/contrib/l3kernel/l3format.ins index 99e9389728..0671ed9ee6 100644 --- a/macros/latex/contrib/l3kernel/l3format.ins +++ b/macros/latex/contrib/l3kernel/l3format.ins @@ -95,6 +95,7 @@ and all files in that bundle must be distributed together. \from{l3fp-convert.dtx} {initex} \from{l3fp-random.dtx} {initex} \from{l3fparray.dtx} {initex} + \from{l3cctab.dtx} {initex} \from{l3sort.dtx} {initex} \from{l3str-convert.dtx}{initex} \from{l3tl-analysis.dtx}{initex} diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx index 3ef09ee2c7..73e28d4b3f 100644 --- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % \maketitle % % \begin{documentation} diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx index adce22a426..09a876ee8d 100644 --- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx index fd1cffd494..68cb42369d 100644 --- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx index 8c8d474918..a07e4fb982 100644 --- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx index 93835e8c71..aafc77e1a6 100644 --- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx index 67960e47fe..498da7895c 100644 --- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx index 26c7ed784a..13457604be 100644 --- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx index 28257218e7..c3125a8478 100644 --- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -1643,7 +1643,7 @@ % \end{macro} % % \begin{macro}[rEXP] -% {\@@_parse_exponent:N, \@@_parse_exponent_aux:N} +% {\@@_parse_exponent:N, \@@_parse_exponent_aux:NN} % This function should be called within an \cs{int_value:w} % expansion (or within an integer expression). It leaves digits of the % exponent behind it in the input stream, and terminates the expansion @@ -1657,22 +1657,23 @@ \cs_new:Npn \@@_parse_exponent:N #1 { \if:w e \if:w E \exp_not:N #1 e \else: \exp_not:N #1 \fi: - \exp_after:wN \@@_parse_exponent_aux:N + \exp_after:wN \@@_parse_exponent_aux:NN + \exp_after:wN #1 \exp:w \else: 0 \@@_parse_return_semicolon:w #1 \fi: \@@_parse_expand:w } -\cs_new:Npn \@@_parse_exponent_aux:N #1 +\cs_new:Npn \@@_parse_exponent_aux:NN #1#2 { - \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1 - 0 \else: `#1 \fi: > `9 \exp_stop_f: - 0 \exp_after:wN ; \exp_after:wN e + \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #2 + 0 \else: `#2 \fi: > `9 \exp_stop_f: + 0 \exp_after:wN ; \exp_after:wN #1 \else: \exp_after:wN \@@_parse_exponent_sign:N \fi: - #1 + #2 } % \end{macrocode} % \end{macro} diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx index 25e1d1cb9d..062f0d59b4 100644 --- a/macros/latex/contrib/l3kernel/l3fp-random.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx index 281e5339d0..ef2092959b 100644 --- a/macros/latex/contrib/l3kernel/l3fp-round.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx index 6c68c6181e..40332fc340 100644 --- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % \maketitle % % \begin{documentation} diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx index dcf57a15f9..a9c9600244 100644 --- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx index 81b652565a..b76089b5c6 100644 --- a/macros/latex/contrib/l3kernel/l3fp.dtx +++ b/macros/latex/contrib/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx index da04ae867c..be62eac38b 100644 --- a/macros/latex/contrib/l3kernel/l3fparray.dtx +++ b/macros/latex/contrib/l3kernel/l3fparray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx index a3d0ca4a8f..7384a5f257 100644 --- a/macros/latex/contrib/l3kernel/l3int.dtx +++ b/macros/latex/contrib/l3kernel/l3int.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx index 6ab5647a82..7a96ed2873 100644 --- a/macros/latex/contrib/l3kernel/l3intarray.dtx +++ b/macros/latex/contrib/l3kernel/l3intarray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -266,29 +266,28 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNn} +% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNnw} % The functions \cs{intarray_gset:Nnn} and \cs{intarray_item:Nn} share % bounds checking. The |T| branch is used if |#3| is within bounds of % the array |#2|. % \begin{macrocode} -\cs_new:Npn \@@_bounds:NNnTF #1#2#3#4#5 +\cs_new:Npn \@@_bounds:NNnTF #1#2#3 { \if_int_compare:w 1 > #3 \exp_stop_f: - \@@_bounds_error:NNn #1 #2 {#3} - #5 + \@@_bounds_error:NNnw #1 #2 {#3} \else: \if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f: - \@@_bounds_error:NNn #1 #2 {#3} - #5 - \else: - #4 + \@@_bounds_error:NNnw #1 #2 {#3} \fi: \fi: + \use_i:nn } -\cs_new:Npn \@@_bounds_error:NNn #1#2#3 +\cs_new:Npn \@@_bounds_error:NNnw #1#2#3#4 \use_i:nn #5#6 { + #4 #1 { kernel } { out-of-bounds } { \token_to_str:N #2 } {#3} { \intarray_count:N #2 } + #6 } % \end{macrocode} % \end{macro} diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx index e63035f68e..c73b661cfc 100644 --- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx +++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -162,6 +162,33 @@ % than once. % \end{function} % +% \begin{function}[added = 2018-03-31]{\__kernel_intarray_gset:Nnn} +% \begin{syntax} +% \cs{__kernel_intarray_gset:Nnn} \meta{intarray~var} \Arg{index} \Arg{value} +% \end{syntax} +% Faster version of \cs{intarray_gset:Nnn}. Stores the \meta{value} +% into the \meta{integer array variable} at the \meta{position}. The +% \meta{index} and \meta{value} must be suitable for a direct +% assignment to a \TeX{} count register, for instance expanding to an +% integer denotation or obtained through the primitive \tn{numexpr} +% (which may be un-terminated). No bound checking is performed: the +% caller is responsible for ensuring that the \meta{position} is +% between $1$ and the \cs{intarray_count:N}, and the \meta{value}'s +% absolute value is at most $2^{30}-1$. Assignments are always +% global. +% \end{function} +% +% \begin{function}[EXP, added = 2018-03-31]{\__kernel_intarray_item:Nn} +% \begin{syntax} +% \cs{__kernel_intarray_item:Nn} \meta{intarray~var} \Arg{index} +% \end{syntax} +% Faster version of \cs{intarray_item:Nn}. Expands to the integer +% entry stored at the \meta{index} in the \meta{integer array +% variable}. The \meta{index} must be suitable for a direct +% assignment to a \TeX{} count register and must be between $1$ and +% the \cs{intarray_count:N}, lest a low-level \TeX{} error occur. +% \end{function} +% % \begin{function}{\__kernel_ior_open:Nn, \__kernel_ior_open:No} % \begin{syntax} % \cs{__kernel_ior_open:Nn} \meta{stream} \Arg{file name} diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx index c9dd6209f6..77fa7d1aff 100644 --- a/macros/latex/contrib/l3kernel/l3keys.dtx +++ b/macros/latex/contrib/l3kernel/l3keys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx index 0a71938f2b..c0fbef3745 100644 --- a/macros/latex/contrib/l3kernel/l3legacy.dtx +++ b/macros/latex/contrib/l3kernel/l3legacy.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx index 56181c77b8..298ecee05e 100644 --- a/macros/latex/contrib/l3kernel/l3luatex.dtx +++ b/macros/latex/contrib/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx index f7182ea092..5cbc7e9b09 100644 --- a/macros/latex/contrib/l3kernel/l3msg.dtx +++ b/macros/latex/contrib/l3kernel/l3msg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -404,6 +404,27 @@ % is briefer than \cs{msg_info:nnnnnn}. % \end{function} % +% \begin{function}[added = 2020-07-16] +% { +% \msg_term:nnnnnn , +% \msg_term:nnnnn , +% \msg_term:nnnn , +% \msg_term:nnn , +% \msg_term:nn , +% \msg_term:nnxxxx , +% \msg_term:nnxxx , +% \msg_term:nnxx , +% \msg_term:nnx +% } +% \begin{syntax} +% \cs{msg_term:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four} +% \end{syntax} +% Issues \meta{module} information \meta{message}, passing +% \meta{arg one} to \meta{arg four} to the text-creating functions. +% The information text is printed on the terminal (and added to the +% log file): the output is similar to that of \cs{msg_log:nnnnnn}. +% \end{function} +% % \begin{function}[updated = 2012-08-11] % { % \msg_none:nnnnnn , @@ -1214,6 +1235,31 @@ % % \begin{macro} % { +% \msg_term:nnnnnn , +% \msg_term:nnnnn , +% \msg_term:nnnn , +% \msg_term:nnn , +% \msg_term:nn , +% \msg_term:nnxxxx , +% \msg_term:nnxxx , +% \msg_term:nnxx , +% \msg_term:nnx +% } +% \enquote{Term} is used for communicating with the user through the +% terminal, like diagnostic messages, and debugging. This is similar +% to \enquote{log} messages, but uses the terminal output. +% \begin{macrocode} + \@@_class_new:nn { term } + { + \iow_wrap:nnnN + { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} } + { } { } \iow_term:n + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { % \msg_none:nnnnnn , % \msg_none:nnnnn , % \msg_none:nnnn , diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx index 3a49253af6..03a9f2ae2b 100644 --- a/macros/latex/contrib/l3kernel/l3names.dtx +++ b/macros/latex/contrib/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -600,9 +600,7 @@ \@@_primitive:NN \pdfuniqueresname \tex_pdfuniqueresname:D \@@_primitive:NN \pdfvorigin \tex_pdfvorigin:D \@@_primitive:NN \pdfxform \tex_pdfxform:D - \@@_primitive:NN \pdfxformattr \tex_pdfxformattr:D \@@_primitive:NN \pdfxformname \tex_pdfxformname:D - \@@_primitive:NN \pdfxformresources \tex_pdfxformresources:D \@@_primitive:NN \pdfximage \tex_pdfximage:D \@@_primitive:NN \pdfximagebbox \tex_pdfximagebbox:D % \end{macrocode} @@ -924,7 +922,7 @@ \@@_primitive:NN \normaldeviate \tex_normaldeviate:D \@@_primitive:NN \outputmode \tex_pdfoutput:D \@@_primitive:NN \pageheight \tex_pageheight:D - \@@_primitive:NN \pagewidth \tex_pagewith:D + \@@_primitive:NN \pagewidth \tex_pagewidth:D \@@_primitive:NN \protrudechars \tex_protrudechars:D \@@_primitive:NN \pxdimen \tex_pxdimen:D \@@_primitive:NN \randomseed \tex_randomseed:D @@ -1209,15 +1207,26 @@ % \end{macrocode} % % \LaTeXe{} moves a few primitives, so these are sorted out. -% A convenient test for \LaTeXe{} is the \cs{@@@@end} saved primitive. +% In newer versions of \LaTeXe{}, \pkg{expl3} is loaded rather early, so +% only some primitives are already renamed, so we need two tests here. +% At the beginning of the \LaTeXe{} format, the primitives \tn{end} and +% \tn{input} are renamed, and only later on the other ones. % \begin{macrocode} %<*package> \tex_ifdefined:D \@@@@end \tex_let:D \tex_end:D \@@@@end + \tex_let:D \tex_input:D \@@@@input +\tex_fi:D +% \end{macrocode} +% +% If \tn{@@@@hyph} is defined, we are loading \pkg{expl3} in a +% pre-2020/10/01 release of \LaTeXe{}, so a few other primitives have to +% be tested as well. +% \begin{macrocode} +\tex_ifdefined:D \@@@@hyph \tex_let:D \tex_everydisplay:D \frozen@everydisplay \tex_let:D \tex_everymath:D \frozen@everymath \tex_let:D \tex_hyphen:D \@@@@hyph - \tex_let:D \tex_input:D \@@@@input \tex_let:D \tex_italiccorrection:D \@@@@italiccorr \tex_let:D \tex_underline:D \@@@@underline % \end{macrocode} @@ -1438,652 +1447,6 @@ %</package> % \end{macrocode} % -% \subsection{Deprecated functions} -% -% Older versions of \pkg{expl3} divided up primitives by \enquote{source}: that -% becomes very tricky with multiple parallel engine developments, so has been -% dropped. To cover the transition, we provide the older names here for a -% limited period (until the end of 2019). -% -% To allow \cs{debug_on:n} \Arg{deprecation} to work we save the list of -% primitives into \cs{@@_primitives:} -% \begin{macrocode} -%<*package> -\tex_begingroup:D - \tex_long:D \tex_def:D \use_ii:nn #1#2 {#2} - \tex_long:D \tex_def:D \use_none:n #1 { } - \tex_long:D \tex_def:D \@@_primitive:NN #1#2 - { - \tex_ifdefined:D #1 - \tex_expandafter:D \use_ii:nn - \tex_fi:D - \use_none:n { \tex_global:D \tex_let:D #2 #1 } - } - \tex_xdef:D \@@_primitives: - { - \tex_unexpanded:D - { - \@@_primitive:NN \beginL \etex_beginL:D - \@@_primitive:NN \beginR \etex_beginR:D - \@@_primitive:NN \botmarks \etex_botmarks:D - \@@_primitive:NN \clubpenalties \etex_clubpenalties:D - \@@_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D - \@@_primitive:NN \currentgrouptype \etex_currentgrouptype:D - \@@_primitive:NN \currentifbranch \etex_currentifbranch:D - \@@_primitive:NN \currentiflevel \etex_currentiflevel:D - \@@_primitive:NN \currentiftype \etex_currentiftype:D - \@@_primitive:NN \detokenize \etex_detokenize:D - \@@_primitive:NN \dimexpr \etex_dimexpr:D - \@@_primitive:NN \displaywidowpenalties - \etex_displaywidowpenalties:D - \@@_primitive:NN \endL \etex_endL:D - \@@_primitive:NN \endR \etex_endR:D - \@@_primitive:NN \eTeXrevision \etex_eTeXrevision:D - \@@_primitive:NN \eTeXversion \etex_eTeXversion:D - \@@_primitive:NN \everyeof \etex_everyeof:D - \@@_primitive:NN \firstmarks \etex_firstmarks:D - \@@_primitive:NN \fontchardp \etex_fontchardp:D - \@@_primitive:NN \fontcharht \etex_fontcharht:D - \@@_primitive:NN \fontcharic \etex_fontcharic:D - \@@_primitive:NN \fontcharwd \etex_fontcharwd:D - \@@_primitive:NN \glueexpr \etex_glueexpr:D - \@@_primitive:NN \glueshrink \etex_glueshrink:D - \@@_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D - \@@_primitive:NN \gluestretch \etex_gluestretch:D - \@@_primitive:NN \gluestretchorder \etex_gluestretchorder:D - \@@_primitive:NN \gluetomu \etex_gluetomu:D - \@@_primitive:NN \ifcsname \etex_ifcsname:D - \@@_primitive:NN \ifdefined \etex_ifdefined:D - \@@_primitive:NN \iffontchar \etex_iffontchar:D - \@@_primitive:NN \interactionmode \etex_interactionmode:D - \@@_primitive:NN \interlinepenalties \etex_interlinepenalties:D - \@@_primitive:NN \lastlinefit \etex_lastlinefit:D - \@@_primitive:NN \lastnodetype \etex_lastnodetype:D - \@@_primitive:NN \marks \etex_marks:D - \@@_primitive:NN \middle \etex_middle:D - \@@_primitive:NN \muexpr \etex_muexpr:D - \@@_primitive:NN \mutoglue \etex_mutoglue:D - \@@_primitive:NN \numexpr \etex_numexpr:D - \@@_primitive:NN \pagediscards \etex_pagediscards:D - \@@_primitive:NN \parshapedimen \etex_parshapedimen:D - \@@_primitive:NN \parshapeindent \etex_parshapeindent:D - \@@_primitive:NN \parshapelength \etex_parshapelength:D - \@@_primitive:NN \predisplaydirection \etex_predisplaydirection:D - \@@_primitive:NN \protected \etex_protected:D - \@@_primitive:NN \readline \etex_readline:D - \@@_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D - \@@_primitive:NN \savingvdiscards \etex_savingvdiscards:D - \@@_primitive:NN \scantokens \etex_scantokens:D - \@@_primitive:NN \showgroups \etex_showgroups:D - \@@_primitive:NN \showifs \etex_showifs:D - \@@_primitive:NN \showtokens \etex_showtokens:D - \@@_primitive:NN \splitbotmarks \etex_splitbotmarks:D - \@@_primitive:NN \splitdiscards \etex_splitdiscards:D - \@@_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D - \@@_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D - \@@_primitive:NN \topmarks \etex_topmarks:D - \@@_primitive:NN \tracingassigns \etex_tracingassigns:D - \@@_primitive:NN \tracinggroups \etex_tracinggroups:D - \@@_primitive:NN \tracingifs \etex_tracingifs:D - \@@_primitive:NN \tracingnesting \etex_tracingnesting:D - \@@_primitive:NN \tracingscantokens \etex_tracingscantokens:D - \@@_primitive:NN \unexpanded \etex_unexpanded:D - \@@_primitive:NN \unless \etex_unless:D - \@@_primitive:NN \widowpenalties \etex_widowpenalties:D - \@@_primitive:NN \pdfannot \pdftex_pdfannot:D - \@@_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D - \@@_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D - \@@_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D - \@@_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D - \@@_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D - \@@_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D - \@@_primitive:NN \pdfdest \pdftex_pdfdest:D - \@@_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D - \@@_primitive:NN \pdfendlink \pdftex_pdfendlink:D - \@@_primitive:NN \pdfendthread \pdftex_pdfendthread:D - \@@_primitive:NN \pdffontattr \pdftex_pdffontattr:D - \@@_primitive:NN \pdffontname \pdftex_pdffontname:D - \@@_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D - \@@_primitive:NN \pdfgamma \pdftex_pdfgamma:D - \@@_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D - \@@_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D - \@@_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D - \@@_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D - \@@_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D - \@@_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D - \@@_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D - \@@_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D - \@@_primitive:NN \pdfinclusioncopyfonts - \pdftex_pdfinclusioncopyfonts:D - \@@_primitive:NN \pdfinclusionerrorlevel - \pdftex_pdfinclusionerrorlevel:D - \@@_primitive:NN \pdfinfo \pdftex_pdfinfo:D - \@@_primitive:NN \pdflastannot \pdftex_pdflastannot:D - \@@_primitive:NN \pdflastlink \pdftex_pdflastlink:D - \@@_primitive:NN \pdflastobj \pdftex_pdflastobj:D - \@@_primitive:NN \pdflastxform \pdftex_pdflastxform:D - \@@_primitive:NN \pdflastximage \pdftex_pdflastximage:D - \@@_primitive:NN \pdflastximagecolordepth - \pdftex_pdflastximagecolordepth:D - \@@_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D - \@@_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D - \@@_primitive:NN \pdfliteral \pdftex_pdfliteral:D - \@@_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D - \@@_primitive:NN \pdfnames \pdftex_pdfnames:D - \@@_primitive:NN \pdfobj \pdftex_pdfobj:D - \@@_primitive:NN \pdfobjcompresslevel - \pdftex_pdfobjcompresslevel:D - \@@_primitive:NN \pdfoutline \pdftex_pdfoutline:D - \@@_primitive:NN \pdfoutput \pdftex_pdfoutput:D - \@@_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D - \@@_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D - \@@_primitive:NN \pdfpageref \pdftex_pdfpageref:D - \@@_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D - \@@_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D - \@@_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D - \@@_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D - \@@_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D - \@@_primitive:NN \pdfrestore \pdftex_pdfrestore:D - \@@_primitive:NN \pdfretval \pdftex_pdfretval:D - \@@_primitive:NN \pdfsave \pdftex_pdfsave:D - \@@_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D - \@@_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D - \@@_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D - \@@_primitive:NN \pdfsuppressptexinfo - \pdftex_pdfsuppressptexinfo:D - \@@_primitive:NN \pdfthread \pdftex_pdfthread:D - \@@_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D - \@@_primitive:NN \pdftrailer \pdftex_pdftrailer:D - \@@_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D - \@@_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D - \@@_primitive:NN \pdfxform \pdftex_pdfxform:D - \@@_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D - \@@_primitive:NN \pdfxformname \pdftex_pdfxformname:D - \@@_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D - \@@_primitive:NN \pdfximage \pdftex_pdfximage:D - \@@_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D - \@@_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D - \@@_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D - \@@_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D - \@@_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D - \@@_primitive:NN \pdfcopyfont \pdftex_copyfont:D - \@@_primitive:NN \pdfdraftmode \pdftex_draftmode:D - \@@_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D - \@@_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D - \@@_primitive:NN \pdffilemoddate \pdftex_filemoddate:D - \@@_primitive:NN \pdffilesize \pdftex_filesize:D - \@@_primitive:NN \pdffirstlineheight \pdftex_firstlineheight:D - \@@_primitive:NN \pdffontexpand \pdftex_fontexpand:D - \@@_primitive:NN \pdffontsize \pdftex_fontsize:D - \@@_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D - \@@_primitive:NN \pdfinsertht \pdftex_insertht:D - \@@_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D - \@@_primitive:NN \pdflastxpos \pdftex_lastxpos:D - \@@_primitive:NN \pdflastypos \pdftex_lastypos:D - \@@_primitive:NN \pdfmapfile \pdftex_mapfile:D - \@@_primitive:NN \pdfmapline \pdftex_mapline:D - \@@_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D - \@@_primitive:NN \pdfnoligatures \pdftex_noligatures:D - \@@_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D - \@@_primitive:NN \pdfpageheight \pdftex_pageheight:D - \@@_primitive:NN \pdfpagewidth \pdftex_pagewidth:D - \@@_primitive:NN \pdfpkmode \pdftex_pkmode:D - \@@_primitive:NN \pdfpkresolution \pdftex_pkresolution:D - \@@_primitive:NN \pdfprimitive \pdftex_primitive:D - \@@_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D - \@@_primitive:NN \pdfpxdimen \pdftex_pxdimen:D - \@@_primitive:NN \pdfrandomseed \pdftex_randomseed:D - \@@_primitive:NN \pdfsavepos \pdftex_savepos:D - \@@_primitive:NN \pdfstrcmp \pdftex_strcmp:D - \@@_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D - \@@_primitive:NN \pdfshellescape \pdftex_shellescape:D - \@@_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D - \@@_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D - \@@_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D - \@@_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D - \@@_primitive:NN \pdftexversion \pdftex_pdftexversion:D - \@@_primitive:NN \efcode \pdftex_efcode:D - \@@_primitive:NN \ifincsname \pdftex_ifincsname:D - \@@_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D - \@@_primitive:NN \letterspacefont \pdftex_letterspacefont:D - \@@_primitive:NN \lpcode \pdftex_lpcode:D - \@@_primitive:NN \quitvmode \pdftex_quitvmode:D - \@@_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D - \@@_primitive:NN \rpcode \pdftex_rpcode:D - \@@_primitive:NN \synctex \pdftex_synctex:D - \@@_primitive:NN \tagcode \pdftex_tagcode:D - \@@_primitive:NN \mdfivesum \pdftex_mdfivesum:D - \@@_primitive:NN \ifprimitive \pdftex_ifprimitive:D - \@@_primitive:NN \primitive \pdftex_primitive:D - \@@_primitive:NN \shellescape \pdftex_shellescape:D - \@@_primitive:NN \adjustspacing \pdftex_adjustspacing:D - \@@_primitive:NN \copyfont \pdftex_copyfont:D - \@@_primitive:NN \draftmode \pdftex_draftmode:D - \@@_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D - \@@_primitive:NN \ifabsdim \pdftex_ifabsdim:D - \@@_primitive:NN \ifabsnum \pdftex_ifabsnum:D - \@@_primitive:NN \ignoreligaturesinfont - \pdftex_ignoreligaturesinfont:D - \@@_primitive:NN \insertht \pdftex_insertht:D - \@@_primitive:NN \lastsavedboxresourceindex - \pdftex_pdflastxform:D - \@@_primitive:NN \lastsavedimageresourceindex - \pdftex_pdflastximage:D - \@@_primitive:NN \lastsavedimageresourcepages - \pdftex_pdflastximagepages:D - \@@_primitive:NN \lastxpos \pdftex_lastxpos:D - \@@_primitive:NN \lastypos \pdftex_lastypos:D - \@@_primitive:NN \normaldeviate \pdftex_normaldeviate:D - \@@_primitive:NN \outputmode \pdftex_pdfoutput:D - \@@_primitive:NN \pageheight \pdftex_pageheight:D - \@@_primitive:NN \pagewidth \pdftex_pagewith:D - \@@_primitive:NN \protrudechars \pdftex_protrudechars:D - \@@_primitive:NN \pxdimen \pdftex_pxdimen:D - \@@_primitive:NN \randomseed \pdftex_randomseed:D - \@@_primitive:NN \useboxresource \pdftex_pdfrefxform:D - \@@_primitive:NN \useimageresource \pdftex_pdfrefximage:D - \@@_primitive:NN \savepos \pdftex_savepos:D - \@@_primitive:NN \saveboxresource \pdftex_pdfxform:D - \@@_primitive:NN \saveimageresource \pdftex_pdfximage:D - \@@_primitive:NN \setrandomseed \pdftex_setrandomseed:D - \@@_primitive:NN \tracingfonts \pdftex_tracingfonts:D - \@@_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D - \@@_primitive:NN \suppressfontnotfounderror - \xetex_suppressfontnotfounderror:D - \@@_primitive:NN \XeTeXcharclass \xetex_charclass:D - \@@_primitive:NN \XeTeXcharglyph \xetex_charglyph:D - \@@_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D - \@@_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D - \@@_primitive:NN \XeTeXcountselectors \xetex_countselectors:D - \@@_primitive:NN \XeTeXcountvariations \xetex_countvariations:D - \@@_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D - \@@_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D - \@@_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D - \@@_primitive:NN \XeTeXfeaturename \xetex_featurename:D - \@@_primitive:NN \XeTeXfindfeaturebyname - \xetex_findfeaturebyname:D - \@@_primitive:NN \XeTeXfindselectorbyname - \xetex_findselectorbyname:D - \@@_primitive:NN \XeTeXfindvariationbyname - \xetex_findvariationbyname:D - \@@_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D - \@@_primitive:NN \XeTeXfonttype \xetex_fonttype:D - \@@_primitive:NN \XeTeXgenerateactualtext - \xetex_generateactualtext:D - \@@_primitive:NN \XeTeXglyph \xetex_glyph:D - \@@_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D - \@@_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D - \@@_primitive:NN \XeTeXglyphname \xetex_glyphname:D - \@@_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D - \@@_primitive:NN \XeTeXinputnormalization - \xetex_inputnormalization:D - \@@_primitive:NN \XeTeXinterchartokenstate - \xetex_interchartokenstate:D - \@@_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D - \@@_primitive:NN \XeTeXisdefaultselector - \xetex_isdefaultselector:D - \@@_primitive:NN \XeTeXisexclusivefeature - \xetex_isexclusivefeature:D - \@@_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D - \@@_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D - \@@_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D - \@@_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D - \@@_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D - \@@_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D - \@@_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D - \@@_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D - \@@_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D - \@@_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D - \@@_primitive:NN \XeTeXpdffile \xetex_pdffile:D - \@@_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D - \@@_primitive:NN \XeTeXpicfile \xetex_picfile:D - \@@_primitive:NN \XeTeXselectorname \xetex_selectorname:D - \@@_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D - \@@_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D - \@@_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D - \@@_primitive:NN \XeTeXvariation \xetex_variation:D - \@@_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D - \@@_primitive:NN \XeTeXvariationmax \xetex_variationmax:D - \@@_primitive:NN \XeTeXvariationmin \xetex_variationmin:D - \@@_primitive:NN \XeTeXvariationname \xetex_variationname:D - \@@_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D - \@@_primitive:NN \XeTeXversion \xetex_XeTeXversion:D - \@@_primitive:NN \alignmark \luatex_alignmark:D - \@@_primitive:NN \aligntab \luatex_aligntab:D - \@@_primitive:NN \attribute \luatex_attribute:D - \@@_primitive:NN \attributedef \luatex_attributedef:D - \@@_primitive:NN \automaticdiscretionary - \luatex_automaticdiscretionary:D - \@@_primitive:NN \automatichyphenmode - \luatex_automatichyphenmode:D - \@@_primitive:NN \automatichyphenpenalty - \luatex_automatichyphenpenalty:D - \@@_primitive:NN \begincsname \luatex_begincsname:D - \@@_primitive:NN \breakafterdirmode \luatex_breakafterdirmode:D - \@@_primitive:NN \catcodetable \luatex_catcodetable:D - \@@_primitive:NN \clearmarks \luatex_clearmarks:D - \@@_primitive:NN \crampeddisplaystyle - \luatex_crampeddisplaystyle:D - \@@_primitive:NN \crampedscriptscriptstyle - \luatex_crampedscriptscriptstyle:D - \@@_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D - \@@_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D - \@@_primitive:NN \directlua \luatex_directlua:D - \@@_primitive:NN \dviextension \luatex_dviextension:D - \@@_primitive:NN \dvifeedback \luatex_dvifeedback:D - \@@_primitive:NN \dvivariable \luatex_dvivariable:D - \@@_primitive:NN \etoksapp \luatex_etoksapp:D - \@@_primitive:NN \etokspre \luatex_etokspre:D - \@@_primitive:NN \explicithyphenpenalty - \luatex_explicithyphenpenalty:D - \@@_primitive:NN \expanded \luatex_expanded:D - \@@_primitive:NN \explicitdiscretionary - \luatex_explicitdiscretionary:D - \@@_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D - \@@_primitive:NN \fontid \luatex_fontid:D - \@@_primitive:NN \formatname \luatex_formatname:D - \@@_primitive:NN \hjcode \luatex_hjcode:D - \@@_primitive:NN \hpack \luatex_hpack:D - \@@_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D - \@@_primitive:NN \hyphenationmin \luatex_hyphenationmin:D - \@@_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D - \@@_primitive:NN \gleaders \luatex_gleaders:D - \@@_primitive:NN \initcatcodetable \luatex_initcatcodetable:D - \@@_primitive:NN \lastnamedcs \luatex_lastnamedcs:D - \@@_primitive:NN \latelua \luatex_latelua:D - \@@_primitive:NN \letcharcode \luatex_letcharcode:D - \@@_primitive:NN \luaescapestring \luatex_luaescapestring:D - \@@_primitive:NN \luafunction \luatex_luafunction:D - \@@_primitive:NN \luatexbanner \luatex_luatexbanner:D - \@@_primitive:NN \luatexrevision \luatex_luatexrevision:D - \@@_primitive:NN \luatexversion \luatex_luatexversion:D - \@@_primitive:NN \mathdelimitersmode \luatex_mathdelimitersmode:D - \@@_primitive:NN \mathdisplayskipmode - \luatex_mathdisplayskipmode:D - \@@_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D - \@@_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D - \@@_primitive:NN \mathoption \luatex_mathoption:D - \@@_primitive:NN \mathpenaltiesmode \luatex_mathpenaltiesmode:D - \@@_primitive:NN \mathrulesfam \luatex_mathrulesfam:D - \@@_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D - \@@_primitive:NN \mathscriptboxmode \luatex_mathscriptboxmode:D - \@@_primitive:NN \mathstyle \luatex_mathstyle:D - \@@_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D - \@@_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D - \@@_primitive:NN \nohrule \luatex_nohrule:D - \@@_primitive:NN \nokerns \luatex_nokerns:D - \@@_primitive:NN \noligs \luatex_noligs:D - \@@_primitive:NN \nospaces \luatex_nospaces:D - \@@_primitive:NN \novrule \luatex_novrule:D - \@@_primitive:NN \outputbox \luatex_outputbox:D - \@@_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D - \@@_primitive:NN \pageleftoffset \luatex_pageleftoffset:D - \@@_primitive:NN \pagerightoffset \luatex_pagerightoffset:D - \@@_primitive:NN \pagetopoffset \luatex_pagetopoffset:D - \@@_primitive:NN \pdfextension \luatex_pdfextension:D - \@@_primitive:NN \pdffeedback \luatex_pdffeedback:D - \@@_primitive:NN \pdfvariable \luatex_pdfvariable:D - \@@_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D - \@@_primitive:NN \posthyphenchar \luatex_posthyphenchar:D - \@@_primitive:NN \prebinoppenalty \luatex_prebinoppenalty:D - \@@_primitive:NN \predisplaygapfactor - \luatex_predisplaygapfactor:D - \@@_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D - \@@_primitive:NN \prehyphenchar \luatex_prehyphenchar:D - \@@_primitive:NN \prerelpenalty \luatex_prerelpenalty:D - \@@_primitive:NN \savecatcodetable \luatex_savecatcodetable:D - \@@_primitive:NN \scantextokens \luatex_scantextokens:D - \@@_primitive:NN \setfontid \luatex_setfontid:D - \@@_primitive:NN \shapemode \luatex_shapemode:D - \@@_primitive:NN \suppressifcsnameerror - \luatex_suppressifcsnameerror:D - \@@_primitive:NN \suppresslongerror \luatex_suppresslongerror:D - \@@_primitive:NN \suppressmathparerror - \luatex_suppressmathparerror:D - \@@_primitive:NN \suppressoutererror \luatex_suppressoutererror:D - \@@_primitive:NN \suppressprimitiveerror - \luatex_suppressprimitiveerror:D - \@@_primitive:NN \toksapp \luatex_toksapp:D - \@@_primitive:NN \tokspre \luatex_tokspre:D - \@@_primitive:NN \tpack \luatex_tpack:D - \@@_primitive:NN \vpack \luatex_vpack:D - \@@_primitive:NN \bodydir \luatex_bodydir:D - \@@_primitive:NN \boxdir \luatex_boxdir:D - \@@_primitive:NN \leftghost \luatex_leftghost:D - \@@_primitive:NN \linedir \luatex_linedir:D - \@@_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D - \@@_primitive:NN \localinterlinepenalty - \luatex_localinterlinepenalty:D - \@@_primitive:NN \localleftbox \luatex_localleftbox:D - \@@_primitive:NN \localrightbox \luatex_localrightbox:D - \@@_primitive:NN \mathdir \luatex_mathdir:D - \@@_primitive:NN \pagedir \luatex_pagedir:D - \@@_primitive:NN \pardir \luatex_pardir:D - \@@_primitive:NN \rightghost \luatex_rightghost:D - \@@_primitive:NN \textdir \luatex_textdir:D - \@@_primitive:NN \Uchar \utex_char:D - \@@_primitive:NN \Ucharcat \utex_charcat:D - \@@_primitive:NN \Udelcode \utex_delcode:D - \@@_primitive:NN \Udelcodenum \utex_delcodenum:D - \@@_primitive:NN \Udelimiter \utex_delimiter:D - \@@_primitive:NN \Udelimiterover \utex_delimiterover:D - \@@_primitive:NN \Udelimiterunder \utex_delimiterunder:D - \@@_primitive:NN \Uhextensible \utex_hextensible:D - \@@_primitive:NN \Umathaccent \utex_mathaccent:D - \@@_primitive:NN \Umathaxis \utex_mathaxis:D - \@@_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D - \@@_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D - \@@_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D - \@@_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D - \@@_primitive:NN \Umathbinopspacing \utex_binopspacing:D - \@@_primitive:NN \Umathbinordspacing \utex_binordspacing:D - \@@_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D - \@@_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D - \@@_primitive:NN \Umathchar \utex_mathchar:D - \@@_primitive:NN \Umathcharclass \utex_mathcharclass:D - \@@_primitive:NN \Umathchardef \utex_mathchardef:D - \@@_primitive:NN \Umathcharfam \utex_mathcharfam:D - \@@_primitive:NN \Umathcharnum \utex_mathcharnum:D - \@@_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D - \@@_primitive:NN \Umathcharslot \utex_mathcharslot:D - \@@_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D - \@@_primitive:NN \Umathcloseclosespacing - \utex_closeclosespacing:D - \@@_primitive:NN \Umathcloseinnerspacing - \utex_closeinnerspacing:D - \@@_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D - \@@_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D - \@@_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D - \@@_primitive:NN \Umathclosepunctspacing - \utex_closepunctspacing:D - \@@_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D - \@@_primitive:NN \Umathcode \utex_mathcode:D - \@@_primitive:NN \Umathcodenum \utex_mathcodenum:D - \@@_primitive:NN \Umathconnectoroverlapmin - \utex_connectoroverlapmin:D - \@@_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D - \@@_primitive:NN \Umathfractiondenomdown - \utex_fractiondenomdown:D - \@@_primitive:NN \Umathfractiondenomvgap - \utex_fractiondenomvgap:D - \@@_primitive:NN \Umathfractionnumup \utex_fractionnumup:D - \@@_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D - \@@_primitive:NN \Umathfractionrule \utex_fractionrule:D - \@@_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D - \@@_primitive:NN \Umathinnerclosespacing - \utex_innerclosespacing:D - \@@_primitive:NN \Umathinnerinnerspacing - \utex_innerinnerspacing:D - \@@_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D - \@@_primitive:NN \Umathinneropspacing \utex_inneropspacing:D - \@@_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D - \@@_primitive:NN \Umathinnerpunctspacing - \utex_innerpunctspacing:D - \@@_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D - \@@_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D - \@@_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D - \@@_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D - \@@_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D - \@@_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D - \@@_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D - \@@_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D - \@@_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D - \@@_primitive:NN \Umathopbinspacing \utex_opbinspacing:D - \@@_primitive:NN \Umathopclosespacing \utex_opclosespacing:D - \@@_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D - \@@_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D - \@@_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D - \@@_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D - \@@_primitive:NN \Umathopenopspacing \utex_openopspacing:D - \@@_primitive:NN \Umathopenordspacing \utex_openordspacing:D - \@@_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D - \@@_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D - \@@_primitive:NN \Umathoperatorsize \utex_operatorsize:D - \@@_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D - \@@_primitive:NN \Umathopopenspacing \utex_opopenspacing:D - \@@_primitive:NN \Umathopopspacing \utex_opopspacing:D - \@@_primitive:NN \Umathopordspacing \utex_opordspacing:D - \@@_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D - \@@_primitive:NN \Umathoprelspacing \utex_oprelspacing:D - \@@_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D - \@@_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D - \@@_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D - \@@_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D - \@@_primitive:NN \Umathordopspacing \utex_ordopspacing:D - \@@_primitive:NN \Umathordordspacing \utex_ordordspacing:D - \@@_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D - \@@_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D - \@@_primitive:NN \Umathoverbarkern \utex_overbarkern:D - \@@_primitive:NN \Umathoverbarrule \utex_overbarrule:D - \@@_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D - \@@_primitive:NN \Umathoverdelimiterbgap - \utex_overdelimiterbgap:D - \@@_primitive:NN \Umathoverdelimitervgap - \utex_overdelimitervgap:D - \@@_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D - \@@_primitive:NN \Umathpunctclosespacing - \utex_punctclosespacing:D - \@@_primitive:NN \Umathpunctinnerspacing - \utex_punctinnerspacing:D - \@@_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D - \@@_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D - \@@_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D - \@@_primitive:NN \Umathpunctpunctspacing\utex_punctpunctspacing:D - \@@_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D - \@@_primitive:NN \Umathquad \utex_quad:D - \@@_primitive:NN \Umathradicaldegreeafter - \utex_radicaldegreeafter:D - \@@_primitive:NN \Umathradicaldegreebefore - \utex_radicaldegreebefore:D - \@@_primitive:NN \Umathradicaldegreeraise - \utex_radicaldegreeraise:D - \@@_primitive:NN \Umathradicalkern \utex_radicalkern:D - \@@_primitive:NN \Umathradicalrule \utex_radicalrule:D - \@@_primitive:NN \Umathradicalvgap \utex_radicalvgap:D - \@@_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D - \@@_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D - \@@_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D - \@@_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D - \@@_primitive:NN \Umathrelopspacing \utex_relopspacing:D - \@@_primitive:NN \Umathrelordspacing \utex_relordspacing:D - \@@_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D - \@@_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D - \@@_primitive:NN \Umathskewedfractionhgap - \utex_skewedfractionhgap:D - \@@_primitive:NN \Umathskewedfractionvgap - \utex_skewedfractionvgap:D - \@@_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D - \@@_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D - \@@_primitive:NN \Umathstacknumup \utex_stacknumup:D - \@@_primitive:NN \Umathstackvgap \utex_stackvgap:D - \@@_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D - \@@_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D - \@@_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D - \@@_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D - \@@_primitive:NN \Umathsubtopmax \utex_subtopmax:D - \@@_primitive:NN \Umathsupbottommin \utex_supbottommin:D - \@@_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D - \@@_primitive:NN \Umathsupshiftup \utex_supshiftup:D - \@@_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D - \@@_primitive:NN \Umathunderbarkern \utex_underbarkern:D - \@@_primitive:NN \Umathunderbarrule \utex_underbarrule:D - \@@_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D - \@@_primitive:NN \Umathunderdelimiterbgap - \utex_underdelimiterbgap:D - \@@_primitive:NN \Umathunderdelimitervgap - \utex_underdelimitervgap:D - \@@_primitive:NN \Unosubscript \utex_nosubscript:D - \@@_primitive:NN \Unosuperscript \utex_nosuperscript:D - \@@_primitive:NN \Uoverdelimiter \utex_overdelimiter:D - \@@_primitive:NN \Uradical \utex_radical:D - \@@_primitive:NN \Uroot \utex_root:D - \@@_primitive:NN \Uskewed \utex_skewed:D - \@@_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D - \@@_primitive:NN \Ustack \utex_stack:D - \@@_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D - \@@_primitive:NN \Ustartmath \utex_startmath:D - \@@_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D - \@@_primitive:NN \Ustopmath \utex_stopmath:D - \@@_primitive:NN \Usubscript \utex_subscript:D - \@@_primitive:NN \Usuperscript \utex_superscript:D - \@@_primitive:NN \Uunderdelimiter \utex_underdelimiter:D - \@@_primitive:NN \Uvextensible \utex_vextensible:D - \@@_primitive:NN \autospacing \ptex_autospacing:D - \@@_primitive:NN \autoxspacing \ptex_autoxspacing:D - \@@_primitive:NN \dtou \ptex_dtou:D - \@@_primitive:NN \epTeXinputencoding \ptex_inputencoding:D - \@@_primitive:NN \epTeXversion \ptex_epTeXversion:D - \@@_primitive:NN \euc \ptex_euc:D - \@@_primitive:NN \ifdbox \ptex_ifdbox:D - \@@_primitive:NN \ifddir \ptex_ifddir:D - \@@_primitive:NN \ifmdir \ptex_ifmdir:D - \@@_primitive:NN \iftbox \ptex_iftbox:D - \@@_primitive:NN \iftdir \ptex_iftdir:D - \@@_primitive:NN \ifybox \ptex_ifybox:D - \@@_primitive:NN \ifydir \ptex_ifydir:D - \@@_primitive:NN \inhibitglue \ptex_inhibitglue:D - \@@_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D - \@@_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D - \@@_primitive:NN \jfam \ptex_jfam:D - \@@_primitive:NN \jfont \ptex_jfont:D - \@@_primitive:NN \jis \ptex_jis:D - \@@_primitive:NN \kanjiskip \ptex_kanjiskip:D - \@@_primitive:NN \kansuji \ptex_kansuji:D - \@@_primitive:NN \kansujichar \ptex_kansujichar:D - \@@_primitive:NN \kcatcode \ptex_kcatcode:D - \@@_primitive:NN \kuten \ptex_kuten:D - \@@_primitive:NN \noautospacing \ptex_noautospacing:D - \@@_primitive:NN \noautoxspacing \ptex_noautoxspacing:D - \@@_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D - \@@_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D - \@@_primitive:NN \ptexminorversion \ptex_ptexminorversion:D - \@@_primitive:NN \ptexrevision \ptex_ptexrevision:D - \@@_primitive:NN \ptexversion \ptex_ptexversion:D - \@@_primitive:NN \showmode \ptex_showmode:D - \@@_primitive:NN \sjis \ptex_sjis:D - \@@_primitive:NN \tate \ptex_tate:D - \@@_primitive:NN \tbaselineshift \ptex_tbaselineshift:D - \@@_primitive:NN \tfont \ptex_tfont:D - \@@_primitive:NN \xkanjiskip \ptex_xkanjiskip:D - \@@_primitive:NN \xspcode \ptex_xspcode:D - \@@_primitive:NN \ybaselineshift \ptex_ybaselineshift:D - \@@_primitive:NN \yoko \ptex_yoko:D - \@@_primitive:NN \disablecjktoken \uptex_disablecjktoken:D - \@@_primitive:NN \enablecjktoken \uptex_enablecjktoken:D - \@@_primitive:NN \forcecjktoken \uptex_forcecjktoken:D - \@@_primitive:NN \kchar \uptex_kchar:D - \@@_primitive:NN \kchardef \uptex_kchardef:D - \@@_primitive:NN \kuten \uptex_kuten:D - \@@_primitive:NN \ucs \uptex_ucs:D - \@@_primitive:NN \uptexrevision \uptex_uptexrevision:D - \@@_primitive:NN \uptexversion \uptex_uptexversion:D - } - } - \@@_primitives: -\tex_endgroup:D -%</package> -% \end{macrocode} -% % \begin{macrocode} %</initex|package> % \end{macrocode} diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf Binary files differindex b5ccaa4abd..9463b85375 100644 --- a/macros/latex/contrib/l3kernel/l3news.pdf +++ b/macros/latex/contrib/l3kernel/l3news.pdf diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf Binary files differindex 9df1d2e357..5c3bb76914 100644 --- a/macros/latex/contrib/l3kernel/l3news01.pdf +++ b/macros/latex/contrib/l3kernel/l3news01.pdf diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf Binary files differindex 986447ba43..0d80eae081 100644 --- a/macros/latex/contrib/l3kernel/l3news02.pdf +++ b/macros/latex/contrib/l3kernel/l3news02.pdf diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf Binary files differindex b574f29d39..29264d3578 100644 --- a/macros/latex/contrib/l3kernel/l3news03.pdf +++ b/macros/latex/contrib/l3kernel/l3news03.pdf diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf Binary files differindex bd28986715..1b990e3889 100644 --- a/macros/latex/contrib/l3kernel/l3news04.pdf +++ b/macros/latex/contrib/l3kernel/l3news04.pdf diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf Binary files differindex 98f1049a04..ab75e4b939 100644 --- a/macros/latex/contrib/l3kernel/l3news05.pdf +++ b/macros/latex/contrib/l3kernel/l3news05.pdf diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf Binary files differindex 09db992250..95606ad096 100644 --- a/macros/latex/contrib/l3kernel/l3news06.pdf +++ b/macros/latex/contrib/l3kernel/l3news06.pdf diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf Binary files differindex 7c1d2e11a6..a51e4512e4 100644 --- a/macros/latex/contrib/l3kernel/l3news07.pdf +++ b/macros/latex/contrib/l3kernel/l3news07.pdf diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf Binary files differindex fde17f4305..45e221f9ba 100644 --- a/macros/latex/contrib/l3kernel/l3news08.pdf +++ b/macros/latex/contrib/l3kernel/l3news08.pdf diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf Binary files differindex b088958a78..c2a1cc1816 100644 --- a/macros/latex/contrib/l3kernel/l3news09.pdf +++ b/macros/latex/contrib/l3kernel/l3news09.pdf diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf Binary files differindex bc0ccc14ec..af9d89b61a 100644 --- a/macros/latex/contrib/l3kernel/l3news10.pdf +++ b/macros/latex/contrib/l3kernel/l3news10.pdf diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf Binary files differindex 6a3bc0787d..c9a93fa975 100644 --- a/macros/latex/contrib/l3kernel/l3news11.pdf +++ b/macros/latex/contrib/l3kernel/l3news11.pdf diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf Binary files differindex 573feb45f8..cc045f3a19 100644 --- a/macros/latex/contrib/l3kernel/l3news12.pdf +++ b/macros/latex/contrib/l3kernel/l3news12.pdf diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv index 3738670cf3..bcf02f23b6 100644 --- a/macros/latex/contrib/l3kernel/l3prefixes.csv +++ b/macros/latex/contrib/l3kernel/l3prefixes.csv @@ -123,6 +123,7 @@ morewrites,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrite msg,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, msvg,media4svg,Alexander Grahn,,https://gitlab.com/agrahn/media4svg,https://gitlab.com/agrahn/media4svg/issues,2020-04-15,2020-04-15, muskip,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, +namedef,namedef,Phelype Oleinik,https://github.com/PhelypeOleinik/namedef,https://github.com/PhelypeOleinik/namedef.git,https://github.com/PhelypeOleinik/namedef/issues,2020-06-22,2020-06-22, nan,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, nicematrix,nicematrix,François Pantigny,,,,2019-12-19,2019-12-19, nil,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, @@ -138,9 +139,11 @@ overleaf,overleaf,Overleaf,https://www.overleaf.com/about,,support+tex-dev@overl parameter,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, pbs,media9,Alexander Grahn,,https://gitlab.com/agrahn/media9,https://gitlab.com/agrahn/media9/issues,2016-02-26,2020-04-15, pdf,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02, +pdfoverlay,pdfoverlay,David Purton,https://github.com/dcpurton/pdfoverlay,https://github.com/dcpurton/pdfoverlay.git,https://github.com/dcpurton/pdfoverlay/issues,2020-06-22,2020-06-22, pdftex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, peek,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, percent,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, +pgf,pgf,The PGF/TikZ Team,https://pgf-tikz.github.io,https://github.com/pgf-tikz/pgf,https://github.com/pgf-tikz/pgf/issues,2020-07-03,2020-07-03, pi,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, pkgploader,pkgploader,Michiel Helvensteijn,,,,2014-02-05,2014-02-05, polyglossia,polyglossia,Arthur Reutenauer,https://www.polyglossia.org/,https://github.com/reutenauer/polyglossia,https://github.com/reutenauer/polyglossia/issues,2019-09-03,, @@ -149,7 +152,9 @@ primargs,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrites, prop,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, pseudo,pseudo,Magnus Lie Hetland,https://github.com/mlhetland/pseudo.sty,https://github.com/mlhetland/pseudo.sty.git,https://github.com/mlhetland/pseudo.sty/issues,2019-06-24,2019-06-24, ptex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-07-28,2015-07-28, +ptxcd,ptxcd, Marei Peischl,,,,2020-07-27,2020-07-27,Used for specific corporate design templates quark,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, +qrbill,qrbill,Marei Peischl,https://github.com/peiTeX/qrbill,https://github.com/peiTeX/qrbill.git,https://github.com/peiTeX/qrbill/issues,2020-06-27,2020-06-27, randomwalk,randomwalk,Bruno Le Floch,https://github.com/blefloch/latex-randomwalk,https://github.com/blefloch/latex-randomwalk.git,https://github.com/blefloch/latex-randomwalk/issues,2013-03-16,2015-09-22, recursion,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, regex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2018-04-06, diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf Binary files differindex fe9b65c217..9b9fc68466 100644 --- a/macros/latex/contrib/l3kernel/l3prefixes.pdf +++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx index 52d6794833..c1f794e015 100644 --- a/macros/latex/contrib/l3kernel/l3prg.dtx +++ b/macros/latex/contrib/l3kernel/l3prg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx index a85becf5e3..790f0e3b31 100644 --- a/macros/latex/contrib/l3kernel/l3prop.dtx +++ b/macros/latex/contrib/l3kernel/l3prop.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -146,13 +146,17 @@ % \begin{function}[updated = 2012-07-09] % { % \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx, -% \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo, +% \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx, +% \prop_put:Non, \prop_put:Noo,, \prop_put:Nxx, % \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx, -% \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo, +% \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx, +% \prop_put:con, \prop_put:coo, \prop_put:cxx, % \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx, -% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo, +% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVx, \prop_gput:Nvx, +% \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx, % \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx, -% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo +% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx, +% \prop_gput:con, \prop_gput:coo, \prop_gput:cxx % } % \begin{syntax} % \cs{prop_put:Nnn} \meta{property list} \Arg{key} \Arg{value} @@ -186,8 +190,8 @@ % % \begin{function}[updated = 2011-08-28] % { -% \prop_get:NnN, \prop_get:NVN, \prop_get:NoN, -% \prop_get:cnN, \prop_get:cVN, \prop_get:coN, +% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN, +% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN, % } % \begin{syntax} % \cs{prop_get:NnN} \meta{property list} \Arg{key} \meta{tl var} @@ -319,8 +323,8 @@ % % \begin{function}[updated = 2012-05-19, TF] % { -% \prop_get:NnN, \prop_get:NVN, \prop_get:NoN, -% \prop_get:cnN, \prop_get:cVN, \prop_get:coN +% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN, +% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN % } % \begin{syntax} % \cs{prop_get:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\ @@ -911,8 +915,8 @@ { \tl_set:Nn #3 {##2} } { \tl_set:Nn #3 { \q_no_value } } } -\cs_generate_variant:Nn \prop_get:NnN { NV , No } -\cs_generate_variant:Nn \prop_get:NnN { c , cV , co } +\cs_generate_variant:Nn \prop_get:NnN { NV , Nv , No } +\cs_generate_variant:Nn \prop_get:NnN { c , cV , cv , co } % \end{macrocode} % \end{macro} % @@ -1038,16 +1042,20 @@ % \begin{macro}[tested = m3prop002] % { % \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx, -% \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo, +% \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx, +% \prop_put:Non, \prop_put:Noo, \prop_put:Nxx, % \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx, -% \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo +% \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx, +% \prop_put:con, \prop_put:coo, \prop_put:cxx % } % \begin{macro}[tested = m3prop002] % { % \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx, -% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo, +% \prop_gput:NVn, \prop_gput:NVV, \prop_hput:NVx, \prop_hput:Nvx, +% \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx, % \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx, -% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo +% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx, +% \prop_gput:con, \prop_gput:coo, \prop_gput:cxx % } % \begin{macro}{\@@_put:NNnn} % Since the branches of \cs{@@_split:NnTF} are used as the replacement @@ -1077,13 +1085,13 @@ { #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } } } \cs_generate_variant:Nn \prop_put:Nnn - { NnV , Nno , Nnx , NV , NVV , No , Noo } + { NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx } \cs_generate_variant:Nn \prop_put:Nnn - { c , cnV , cno , cnx , cV , cVV , co , coo } + { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx } \cs_generate_variant:Nn \prop_gput:Nnn - { NnV , Nno , Nnx , NV , NVV , No , Noo } + { NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx } \cs_generate_variant:Nn \prop_gput:Nnn - { c , cnV , cno , cnx , cV , cVV , co , coo } + { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx } % \end{macrocode} % \end{macro} % \end{macro} @@ -1230,7 +1238,7 @@ { \prg_return_false: } } \prg_generate_conditional_variant:Nnn \prop_get:NnN - { NV , No , c , cV , co } { T , F , TF } + { NV , Nv , No , c , cV , cv , co } { T , F , TF } % \end{macrocode} % \end{macro} % diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx index 3368fa159b..62474447ef 100644 --- a/macros/latex/contrib/l3kernel/l3quark.dtx +++ b/macros/latex/contrib/l3kernel/l3quark.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx index 30e355eada..3820ecdb67 100644 --- a/macros/latex/contrib/l3kernel/l3regex.dtx +++ b/macros/latex/contrib/l3kernel/l3regex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -3699,7 +3699,7 @@ \cs_new_protected:Npn \@@_show_item_exact_cs:n #1 { \seq_set_split:Nnn \l_@@_internal_seq { \scan_stop: } {#1} - \seq_set_map:NNn \l_@@_internal_seq + \seq_set_map_x:NNn \l_@@_internal_seq \l_@@_internal_seq { \iow_char:N\\##1 } \@@_show_one:n { control~sequence~ \seq_use:Nn \l_@@_internal_seq { ~or~ } } @@ -6109,7 +6109,7 @@ { \flag_height:n { @@_end } } { \flag_height:n { @@_begin } } } - \seq_set_map:NNn \l_@@_internal_seq \l_@@_internal_seq {##1} + \seq_set_map_x:NNn \l_@@_internal_seq \l_@@_internal_seq {##1} \exp_args:NNNo \group_end: \tl_set:Nn #1 { \l_@@_internal_seq } diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx index 40d829f96c..bd935c6f60 100644 --- a/macros/latex/contrib/l3kernel/l3seq.dtx +++ b/macros/latex/contrib/l3kernel/l3seq.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -139,7 +139,7 @@ % this space trimming behaviour is identical to that of % \pkg{l3clist} functions. Empty \meta{items} are preserved by % \cs{seq_set_split:Nnn}, and can be removed afterwards using -% \cs{seq_remove_all:Nn} \meta{sequence} \Arg{}. +% \cs{seq_remove_all:Nn} \meta{sequence} |{}|. % The \meta{delimiter} may not contain |{|, |}| or |#| % (assuming \TeX{}'s normal category code r\'egime). % If the \meta{delimiter} is empty, the \meta{token list} is split @@ -653,6 +653,40 @@ % \end{texnote} % \end{function} % +% \begin{function}[added = 2011-12-22, updated = 2020-07-16] +% {\seq_set_map:NNn, \seq_gset_map:NNn} +% \begin{syntax} +% \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function} +% \end{syntax} +% Applies \meta{inline function} to every \meta{item} stored +% within the \meta{sequence_2}. The \meta{inline function} should +% consist of code which will receive the \meta{item} as |#1|. +% The sequence resulting applying \meta{inline function} to each +% \meta{item} is assigned to \meta{sequence_1}. +% \begin{texnote} +% Contrarily to other mapping functions, \cs{seq_map_break:} cannot +% be used in this function, and would lead to low-level \TeX{} errors. +% \end{texnote} +% \end{function} +% +% \begin{function}[added = 2020-07-16] +% {\seq_set_map_x:NNn, \seq_gset_map_x:NNn} +% \begin{syntax} +% \cs{seq_set_map_x:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function} +% \end{syntax} +% Applies \meta{inline function} to every \meta{item} stored +% within the \meta{sequence_2}. The \meta{inline function} should +% consist of code which will receive the \meta{item} as |#1|. +% The sequence resulting from \texttt{x}-expanding +% \meta{inline function} applied to each \meta{item} +% is assigned to \meta{sequence_1}. As such, the code +% in \meta{inline function} should be expandable. +% \begin{texnote} +% Contrarily to other mapping functions, \cs{seq_map_break:} cannot +% be used in this function, and would lead to low-level \TeX{} errors. +% \end{texnote} +% \end{function} +% % \begin{function}[EXP, added = 2012-07-13]{\seq_count:N, \seq_count:c} % \begin{syntax} % \cs{seq_count:N} \meta{sequence} @@ -2082,6 +2116,45 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn} +% \begin{macro}{\@@_set_map_x:NNNn} +% Very similar to \cs{seq_set_filter:NNn}. We could actually +% merge the two within a single function, but it would have weird +% semantics. +% \begin{macrocode} +\cs_new_protected:Npn \seq_set_map_x:NNn + { \@@_set_map_x:NNNn \tl_set:Nx } +\cs_new_protected:Npn \seq_gset_map_x:NNn + { \@@_set_map_x:NNNn \tl_gset:Nx } +\cs_new_protected:Npn \@@_set_map_x:NNNn #1#2#3#4 + { + \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} } + #1 #2 { #3 } + \@@_pop_item_def: + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn} +% \begin{macro}{\@@_set_map:NNNn} +% Similar to \cs{seq_set_map_x:NNn}, but prevents expansion of the +% <inline function>. +% \begin{macrocode} +\cs_new_protected:Npn \seq_set_map:NNn + { \@@_set_map:NNNn \tl_set:Nx } +\cs_new_protected:Npn \seq_gset_map:NNn + { \@@_set_map:NNNn \tl_gset:Nx } +\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4 + { + \@@_push_item_def:n { \exp_not:n { \@@_item:n {#4} } } + #1 #2 { #3 } + \@@_pop_item_def: + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \begin{macro}{\seq_count:N, \seq_count:c} % \begin{macro}{\@@_count:w, \@@_count_end:w} % Since counting the items in a sequence is quite common, we optimize diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx index 7b534be25c..a87f940938 100644 --- a/macros/latex/contrib/l3kernel/l3skip.dtx +++ b/macros/latex/contrib/l3kernel/l3skip.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx index 9163b494d0..b84c2e298a 100644 --- a/macros/latex/contrib/l3kernel/l3sort.dtx +++ b/macros/latex/contrib/l3kernel/l3sort.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx index 6a910b8040..e57c165f1b 100644 --- a/macros/latex/contrib/l3kernel/l3str-convert.dtx +++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx index a6fad22d02..539881e139 100644 --- a/macros/latex/contrib/l3kernel/l3str.dtx +++ b/macros/latex/contrib/l3kernel/l3str.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -306,7 +306,8 @@ % \end{syntax} % Compares the content of two \meta{str variables} and % is logically \texttt{true} if the two contain the same characters -% in the same order. +% in the same order. See \cs{tl_if_eq:NNTF} to compare tokens +% (including their category codes) rather than characters. % \end{function} % % \begin{function}[EXP,pTF, updated = 2018-06-18] @@ -326,7 +327,8 @@ % \begin{verbatim} % \str_if_eq_p:no { abc } { \tl_to_str:n { abc } } % \end{verbatim} -% is logically \texttt{true}. +% is logically \texttt{true}. See \cs{tl_if_eq:nnTF} to compare +% tokens (including their category codes) rather than characters. % \end{function} % % \begin{function}[TF, added = 2017-10-08]{\str_if_in:Nn, \str_if_in:cn} diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf Binary files differindex 73d3f8840b..575770b6c8 100644 --- a/macros/latex/contrib/l3kernel/l3styleguide.pdf +++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex index 915534ed11..0d2028f2c2 100644 --- a/macros/latex/contrib/l3kernel/l3styleguide.tex +++ b/macros/latex/contrib/l3kernel/l3styleguide.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2020-06-18} +\date{Released 2020-07-17} \begin{document} diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf Binary files differindex 15c831eb55..76dc0f00c9 100644 --- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf +++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex index 4e280f75d2..58824c3b4b 100644 --- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex +++ b/macros/latex/contrib/l3kernel/l3syntax-changes.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2020-06-18} +\date{Released 2020-07-17} \newcommand{\TF}{\textit{(TF)}} diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx index 8a27d4b78e..b15b61d521 100644 --- a/macros/latex/contrib/l3kernel/l3sys.dtx +++ b/macros/latex/contrib/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf Binary files differindex 1a6beba13f..5826dda253 100644 --- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf +++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex index 99464b67c9..90e2c3c768 100644 --- a/macros/latex/contrib/l3kernel/l3term-glossary.tex +++ b/macros/latex/contrib/l3kernel/l3term-glossary.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2020-06-18} +\date{Released 2020-07-17} \newcommand{\TF}{\textit{(TF)}} @@ -53,7 +53,98 @@ beginning of a line. \section{Structure of tokens} -Copy there the section ``Description of all possible tokens'' from \texttt{l3token}. +We refer to the documentation of \texttt{l3token} for a complete +description of all \TeX{} tokens. We distinguish the meaning of the +token, which controls the expansion of the token and its effect on +\TeX{}'s state, and its shape, which is used when comparing token lists +such as for delimited arguments. At any given time two tokens of the +same shape automatically have the same meaning, but the converse does +not hold, and the meaning associated with a given shape change when +doing assignments. + +Apart from a few exceptions, a token has one of the following shapes. +\begin{itemize} + \item A control sequence, characterized by the sequence of characters + that constitute its name: for instance, \cs{use:n} is a five-letter + control sequence. + \item An active character token, characterized by its character code + (between $0$ and $1114111$ for \LuaTeX{} and \XeTeX{} and less for + other engines) and category code~$13$. + \item A character token such as |A| or |#|, characterized by its + character code and category code (one of $1$, $2$, $3$, $4$, $6$, + $7$, $8$, $10$, $11$ or~$12$ whose meaning is described below). +\end{itemize} + +The meaning of a (non-active) character token is fixed by its category +code (and character code) and cannot be changed. We call these tokens +\emph{explicit} character tokens. Category codes that a character token +can have are listed below by giving a sample output of the \TeX{} +primitive \tn{meaning}, together with their \LaTeX3 names and most +common example: +\begin{itemize} + \item[1] begin-group character (|group_begin|, often |{|), + \item[2] end-group character (|group_end|, often |}|), + \item[3] math shift character (|math_toggle|, often |$|), % $ + \item[4] alignment tab character (|alignment|, often |&|), + \item[6] macro parameter character (|parameter|, often |#|), + \item[7] superscript character (|math_superscript|, often |^|), + \item[8] subscript character (|math_subscript|, often |_|), + \item[10] blank space (|space|, often character code~$32$), + \item[11] the letter (|letter|, such as |A|), + \item[12] the character (|other|, such as |0|). +\end{itemize} +Category code~$13$ (|active|) is discussed below. Input characters can +also have several other category codes which do not lead to character +tokens for later processing: $0$~(|escape|), $5$~(|end_line|), +$9$~(|ignore|), $14$~(|comment|), and $15$~(|invalid|). + +The meaning of a control sequence or active character can be identical +to that of any character token listed above (with any character code), +and we call such tokens \emph{implicit} character tokens. The meaning +is otherwise in the following list: +\begin{itemize} + \item a macro, used in \LaTeX3 for most functions and some variables + (|tl|, |fp|, |seq|, \ldots{}), + \item a primitive such as \tn{def} or \tn{topmark}, used in \LaTeX3 + for some functions, + \item a register such as \tn{count}|123|, used in \LaTeX3{} for the + implementation of some variables (|int|, |dim|, \ldots{}), + \item a constant integer such as \tn{char}|"56| or + \tn{mathchar}|"121|, used when defining a constant using + \cs{int_const:Nn}, + \item a font selection command, + \item undefined. +\end{itemize} +Macros can be \tn{protected} or not, \tn{long} or not (the opposite of +what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in \LaTeX3). +Their \tn{meaning} takes the form +\begin{quote} + \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement} +\end{quote} +where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer}, +\meta{argument} describes parameters that the macro expects, such as +|#1#2#3|, and \meta{replacement} describes how the parameters are +manipulated, such as~|\int_eval:n{#2+#1*#3}|. This information can be +accessed by \cs{cs_prefix_spec:N}, \cs{cs_argument_spec:N}, +\cs{cs_replacement_spec:N}. + +When a macro takes an undelimited argument, explicit space characters +(with character code $32$ and category code $10$) are ignored. If the +following token is an explicit character token with category code $1$ +(begin-group) and an arbitrary character code, then \TeX{} scans ahead +to obtain an equal number of explicit character tokens with category +code $1$ (begin-group) and $2$ (end-group), and the resulting list of +tokens (with outer braces removed) becomes the argument. Otherwise, a +single token is taken as the argument for the macro: we call such single +tokens \enquote{N-type}, as they are suitable to be used as an argument +for a function with the signature~\texttt{:N}. + +When a macro takes a delimited argument \TeX{} scans ahead until finding +the delimiter (outside any pairs of begin-group/end-group explicit +characters), and the resulting list of tokens (with outer braces +removed) becomes the argument. Note that explicit space characters at +the start of the argument are \emph{not} ignored in this case (and they +prevent brace-stripping). \section{Quantities and expressions} diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx index b8e534b4b6..a3dde63359 100644 --- a/macros/latex/contrib/l3kernel/l3text-case.dtx +++ b/macros/latex/contrib/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx index 2543dbebae..c48ac585a2 100644 --- a/macros/latex/contrib/l3kernel/l3text-purify.dtx +++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx index 00648a4b84..2946a48df3 100644 --- a/macros/latex/contrib/l3kernel/l3text.dtx +++ b/macros/latex/contrib/l3kernel/l3text.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx index a5662491e1..4944e42682 100644 --- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx +++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx index b10167ca25..c315612b43 100644 --- a/macros/latex/contrib/l3kernel/l3tl.dtx +++ b/macros/latex/contrib/l3kernel/l3tl.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -305,7 +305,8 @@ % This allows the \meta{tl~var} to contain material % with category codes other than those that apply when \meta{tokens} % are absorbed. The \meta{setup} is run within a group and may -% contain any valid input, although only changes in category codes +% contain any valid input, although only changes in category codes, +% such as uses of \cs{cctab_select:N}, % are relevant. See also \cs{tl_rescan:nn}. % \begin{texnote} % The \meta{tokens} are first turned into a string (using @@ -332,7 +333,8 @@ % by the \meta{setup} are those in force at the point of use of % \cs{tl_rescan:nn}.) % The \meta{setup} is run within a group and may -% contain any valid input, although only changes in category codes +% contain any valid input, although only changes in category codes, +% such as uses of \cs{cctab_select:N}, % are relevant. See also \cs{tl_set_rescan:Nnn}, which is more % robust than using \cs{tl_set:Nn} in the \meta{tokens} argument of % \cs{tl_rescan:nn}. @@ -401,6 +403,19 @@ % \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl { true } { false } % \end{verbatim} % yields \texttt{false}. +% See also \cs{str_if_eq:nnTF} for a comparison that ignores category codes. +% \end{function} +% +% \begin{function}[TF, added = 2020-07-14]{\tl_if_eq:Nn, \tl_if_eq:cn} +% \begin{syntax} +% \cs{tl_if_eq:NnTF} \meta{tl~var_1} \Arg{token list_2} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests if the \meta{token list variable_1} and the \meta{token +% list_2} contain the same list of tokens, both in respect of +% character codes and category codes. This conditional is not +% expandable: see \cs{tl_if_eq:NNTF} for an expandable version when +% both token lists are stored in variables, or \cs{str_if_eq:nnTF} if +% category codes are not important. % \end{function} % % \begin{function}[TF]{\tl_if_eq:nn} @@ -409,7 +424,9 @@ % \end{syntax} % Tests if \meta{token list_1} and \meta{token list_2} contain the % same list of tokens, both in respect of character codes and category -% codes. +% codes. This conditional is not expandable: see \cs{tl_if_eq:NNTF} +% for an expandable version when token lists are stored in variables, +% or \cs{str_if_eq:nnTF} if category codes are not important. % \end{function} % % \begin{function}[TF]{\tl_if_in:Nn, \tl_if_in:cn} @@ -1203,7 +1220,7 @@ % will \emph{not} match the simple text input |-NoValue-|, \emph{i.e.} % that % \begin{verbatim} -% \tl_if_eq:VnTF \c_novalue_tl { -NoValue- } +% \tl_if_eq:NnTF \c_novalue_tl { -NoValue- } % \end{verbatim} % is logically \texttt{false}. The \cs{c_novalue_tl} marker is intended for % use in creating document-level interfaces, where it serves as an indicator @@ -2125,8 +2142,34 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}[TF]{\tl_if_eq:nn} % \begin{variable}{\l_@@_internal_a_tl, \l_@@_internal_b_tl} +% Temporary storage. +% \begin{macrocode} +\tl_new:N \l_@@_internal_a_tl +\tl_new:N \l_@@_internal_b_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macro}[TF]{\tl_if_eq:Nn} +% A simple store and compare routine. +% \begin{macrocode} +\prg_new_protected_conditional:Npnn \tl_if_eq:Nn #1#2 { T , F , TF } + { + \group_begin: + \tl_set:Nn \l_@@_internal_b_tl {#2} + \exp_after:wN + \group_end: + \if_meaning:w #1 \l_@@_internal_b_tl + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\prg_generate_conditional_variant:Nnn \tl_if_eq:Nn { c } { TF , T , F } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[TF]{\tl_if_eq:nn} % A simple store and compare routine. % \begin{macrocode} \prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F , TF } @@ -2142,10 +2185,7 @@ \prg_return_false: \fi: } -\tl_new:N \l_@@_internal_a_tl -\tl_new:N \l_@@_internal_b_tl % \end{macrocode} -% \end{variable} % \end{macro} % % \begin{macro}[TF]{\tl_if_in:Nn, \tl_if_in:cn} diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx index d12c5deeed..cffbea2c97 100644 --- a/macros/latex/contrib/l3kernel/l3token.dtx +++ b/macros/latex/contrib/l3kernel/l3token.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -992,11 +992,7 @@ % other engines) and category code~$13$. % \item A character token, characterized by its character code and % category code (one of $1$, $2$, $3$, $4$, $6$, $7$, $8$, $10$, -% $11$ or~$12$ whose meaning is described below).\footnote{In -% \LuaTeX{}, there is also the case of \enquote{bytes}, which behave as -% character tokens of category code $12$~(other) and character code -% between $1114112$ and~$1114366$. They are used to output -% individual bytes to files, rather than UTF-8.} +% $11$ or~$12$ whose meaning is described below). % \end{itemize} % There are also a few internal tokens. The following list may be % incomplete in some engines. @@ -1017,6 +1013,19 @@ % \item Tricky programming might access a frozen |\endwrite|. % \item Some frozen tokens can only be accessed in interactive % sessions: |\cr|, |\right|, |\endgroup|, |\fi|, |\inaccessible|. +% \item In \LuaTeX{}, there is also the strange case of \enquote{bytes} +% |^^^^^^1100|$x$$y$ where $x,y$ are any two lowercase hexadecimal +% digits, so that the hexadecimal number ranges from +% $"\text{110000}=1114112$ to~$"\text{1100ff}=1114367$. These are +% used to output individual bytes to files, rather than UTF-8. For +% the purposes of token comparisons they behave like non-expandable +% primitive control sequences (\emph{not characters}) whose +% \tn{meaning} is \verb*|the character | followed by the given byte. +% If this byte is in the range |80|--|ff| this gives an ``invalid +% utf-8 sequence'' error: applying \cs{token_to_str:N} or +% \cs{token_to_meaning:N} to these tokens is unsafe. Unfortunately, +% they don't seem to be detectable safely by any means except perhaps +% Lua code. % \end{itemize} % % The meaning of a (non-active) character token is fixed by its category @@ -1028,7 +1037,7 @@ % \begin{itemize} % \item[1] begin-group character (|group_begin|, often |{|), % \item[2] end-group character (|group_end|, often |}|), -% \item[3] math shift character (|math_toggle|, often |$|), +% \item[3] math shift character (|math_toggle|, often |$|), %^^A $ % \item[4] alignment tab character (|alignment|, often |&|), % \item[6] macro parameter character (|parameter|, often |#|), % \item[7] superscript character (|math_superscript|, often |^|), @@ -1058,18 +1067,16 @@ % \item a font selection command, % \item undefined. % \end{itemize} -% Macros be \tn{protected} or not, \tn{long} or not (the opposite of +% Macros can be \tn{protected} or not, \tn{long} or not (the opposite of % what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in % \LaTeX3). Their \tn{meaning} takes the form % \begin{quote} -% \meta{properties} |macro:|\meta{parameters}|->|\meta{replacement} +% \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement} % \end{quote} -% where \meta{properties} is among \tn{protected}\tn{long}\tn{outer}, -% \meta{parameters} describes parameters that the macro expects, such as +% where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer}, +% \meta{argument} describes parameters that the macro expects, such as % |#1#2#3|, and \meta{replacement} describes how the parameters are -% manipulated, such as~|#2/#1/#3|. -% -% ^^A todo Bruno: discuss here some other subtleties of space tokens? when looking for numbers, when looking for equal signs in let, in expressions, etc. +% manipulated, such as~|\int_eval:n{#2+#1*#3}|. % % Now is perhaps a good time to mention some subtleties relating to % tokens with category code $10$ (space). Any input character with this @@ -1087,6 +1094,13 @@ % single tokens \enquote{N-type}, as they are suitable to be used as an % argument for a function with the signature~\texttt{:N}. % +% When a macro takes a delimited argument \TeX{} scans ahead until +% finding the delimiter (outside any pairs of begin-group/end-group +% explicit characters), and the resulting list of tokens (with outer +% braces removed) becomes the argument. Note that explicit space +% characters at the start of the argument are \emph{not} ignored in this +% case (and they prevent brace-stripping). +% % \end{documentation} % % \begin{implementation} diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx index 28452d5a2c..334e8b7086 100644 --- a/macros/latex/contrib/l3kernel/l3unicode.dtx +++ b/macros/latex/contrib/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf Binary files differindex 4ea4120d6d..01a6f88ddf 100644 --- a/macros/latex/contrib/l3kernel/source3.pdf +++ b/macros/latex/contrib/l3kernel/source3.pdf diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex index 985adb77b5..e9381760fc 100644 --- a/macros/latex/contrib/l3kernel/source3.tex +++ b/macros/latex/contrib/l3kernel/source3.tex @@ -53,7 +53,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2020-06-18} +\date{Released 2020-07-17} \pagenumbering{roman} \maketitle diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex index 83203e6427..5586d73799 100644 --- a/macros/latex/contrib/l3kernel/source3body.tex +++ b/macros/latex/contrib/l3kernel/source3body.tex @@ -476,6 +476,7 @@ used on top of \LaTeXe{} if \cs{outer} tokens are used in the arguments. \ExplSyntaxOff \DocInput{l3fparray.dtx} +\DocInput{l3cctab.dtx} \DocInput{l3sort.dtx} \DocInput{l3tl-analysis.dtx} \DocInput{l3regex.dtx} diff --git a/macros/latex/contrib/thmtools/README b/macros/latex/contrib/thmtools/README deleted file mode 100644 index 711b6051ff..0000000000 --- a/macros/latex/contrib/thmtools/README +++ /dev/null @@ -1,22 +0,0 @@ - The \thmtools\ bundle provides several packages for commonly-needed - features for theorems. As designed, the bundle should work with kernel - theorems, the theorem package and the amsthm package. - - WARNING: Currently, things might still be a bit rough. You - might want to consider not relying on \thmtools\ for your Ph.D. thesis - masterpiece. - -Provided features: -a keyval interface to \newtheorem -a \listoftheorem command -hyperref/autoref compatibility -a way of restating entire theorems with a single macro call - -License: LPPL 1.3c - -Currently the package has no maintainer ... and is looking for one! - -Previous Maintainer was Ulrich M. Schwarz, ulmi@absatzen.de - - -$Id: README,v 1.1 2008/02/17 21:13:58 ulmi Exp ulmi $ diff --git a/macros/latex/contrib/thmtools/README.md b/macros/latex/contrib/thmtools/README.md new file mode 100644 index 0000000000..ffcfb135d3 --- /dev/null +++ b/macros/latex/contrib/thmtools/README.md @@ -0,0 +1,17 @@ +The `thmtools` bundle provides several packages for commonly-needed +features for theorems. As designed, the bundle should work with kernel +theorems (theorems ‘out of the box’ with LaTeX), +the [`amsthm`](https://ctan.org/pkg/amsmath) package and +the [`ntheorem`](https://ctan.org/pkg/ntheorem) package. + +Provided features: + - a keyval interface to `\newtheorem` and `\newtheoremstyle` + - a `\listoftheorem` command with filtering ability + - [`hyperref`](https://ctan.org/pkg/hyperref) and [`cleveref`](https://ctan.org/pkg/cleveref) compatibility + - a way of restating entire theorems with a single macro call + +License: LPPL 1.3c + +Currently the package is maintained by Yukai Chou, <span>muzimuzhi@gmail.com</span> + +Previous Maintainer was Ulrich M. Schwarz, <span>ulmi@absatzen.de</span> diff --git a/macros/latex/contrib/thmtools/TODO b/macros/latex/contrib/thmtools/TODO deleted file mode 100644 index e35b77530a..0000000000 --- a/macros/latex/contrib/thmtools/TODO +++ /dev/null @@ -1,3 +0,0 @@ -- ref close-by/far-away -- complex refs - (these two are very similar) diff --git a/macros/latex/contrib/thmtools/VERSION.tex b/macros/latex/contrib/thmtools/VERSION.tex deleted file mode 100644 index 466ff0ebce..0000000000 --- a/macros/latex/contrib/thmtools/VERSION.tex +++ /dev/null @@ -1,2 +0,0 @@ -% set by hand as I don't use CVS -\def\x #1-#2-#3 #4 v#5\@{\def\VERSION{#1/#2/#3 v#5}}\x 2019-12-22 00:00:00 +0200 v68\@ diff --git a/macros/latex/contrib/thmtools/changes.txt b/macros/latex/contrib/thmtools/changes.txt deleted file mode 100644 index 06dc12ef79..0000000000 --- a/macros/latex/contrib/thmtools/changes.txt +++ /dev/null @@ -1,6 +0,0 @@ -2019-12-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org> - - * thm-kv.dtx: - removed dependency on etexcmds package - - diff --git a/macros/latex/contrib/thmtools/COPYING b/macros/latex/contrib/thmtools/doc/COPYING index 2244313901..2244313901 100644 --- a/macros/latex/contrib/thmtools/COPYING +++ b/macros/latex/contrib/thmtools/doc/COPYING diff --git a/macros/latex/contrib/thmtools/doc/VERSION.tex b/macros/latex/contrib/thmtools/doc/VERSION.tex new file mode 100644 index 0000000000..9bfeb6f890 --- /dev/null +++ b/macros/latex/contrib/thmtools/doc/VERSION.tex @@ -0,0 +1 @@ +\def\VERSION{2020/07/16 v69} diff --git a/macros/latex/contrib/thmtools/doc/changes.txt b/macros/latex/contrib/thmtools/doc/changes.txt new file mode 100644 index 0000000000..c16fb63e78 --- /dev/null +++ b/macros/latex/contrib/thmtools/doc/changes.txt @@ -0,0 +1,12 @@ +2019-12-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * thm-kv.dtx: + removed dependency on etexcmds package + +2020-07-16 Yukai Chou <muzimuzhi@gmail.com> + + * thm-restate.dtx: + made compatible with cleveref's \label[]{} syntax + + * thmtools-manual.tex (and comment part of dtx files): + refined manual diff --git a/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf b/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf Binary files differnew file mode 100644 index 0000000000..8d9ff5fc01 --- /dev/null +++ b/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf diff --git a/macros/latex/contrib/thmtools/thmtools-manual.tex b/macros/latex/contrib/thmtools/doc/thmtools-manual.tex index 111acda6dc..47f1235f5f 100644 --- a/macros/latex/contrib/thmtools/thmtools-manual.tex +++ b/macros/latex/contrib/thmtools/doc/thmtools-manual.tex @@ -1,4 +1,4 @@ -%&pdflatex +% !TeX program = pdflatex \documentclass[paper=a4, pagesize, DIV=20, english, headings=small,11pt, @@ -27,10 +27,18 @@ \usepackage{listings} \usepackage{amsmath, amsthm} +\usepackage{enumitem} +\setlist[description, 1]{labelindent=2em, leftmargin=2em, rightmargin=2em, labelwidth=!} \usepackage{tikz} +\usetikzlibrary{tikzmark} \usepackage{nameref} \usepackage{hyperref} +\hypersetup{ + colorlinks, + linkcolor=RoyalBlue, + linktocpage +} \usepackage{cleveref}[2010/05/01] \usepackage{thmtools, thm-restate} @@ -115,11 +123,13 @@ \input{VERSION.tex} \title{\Thmtools Users' Guide} -\author{Dr. Ulrich M. Schwarz -- ulmi@absatzen.de\thanks{ +\author{Dr. Ulrich M. Schwarz -- ulmi@absatzen.de\thanks{% who would like to thank the users for testing, encouragement, feature requests, and bug reports. In particular, Denis Bitouz\'e prompted further improvement - when \thmtools got stuck in a ``good enough for me'' slump. -}} + when \thmtools got stuck in a ``good enough for me'' slump.} + \and + Yukai Chou -- muzimuzhi@gmail.com +} \date{\VERSION} \begin{document} @@ -138,7 +148,8 @@ \autoref{cha:reference}. \begin{multicols}{2}[\section*{\contentsname}] - \makeatletter\let\chapter\@gobbletwo + \makeatletter + \let\chapter\@gobbletwo \tableofcontents \end{multicols} \clearpage @@ -160,13 +171,13 @@ \begin{body}[gobble=4] % Document code looks like this. \begin{theorem}[Euclid] - \label{thm:euclid}% - For every prime $p$, there is a prime $p'>p$. - In particular, the list of primes, - \begin{equation}\label{eq:1} - 2,3,5,7,\dots - \end{equation} - is infinite. + \label{thm:euclid}% + For every prime $p$, there is a prime $p'>p$. + In particular, the list of primes, + \begin{equation}\label{eq:1} + 2,3,5,7,\dots + \end{equation} + is infinite. \end{theorem} \end{body} \end{source} @@ -220,8 +231,8 @@ \end{restatable} \end{result} - Instead of ``numberwithin='', you can also use ``parent='' and - ``within=''. They're all the same, use the one you find easiest to + Instead of |numberwithin=|, you can also use |parent=| and + |within=|. They're all the same, use the one you find easiest to remember. Note the example above looks somewhat bad: sometimes, the name of the environment, @@ -272,8 +283,8 @@ \end{lemma} \end{result} - Again, instead of ``sibling='', you can also use ``numberlike='' and - ``sharecounter=''. + Again, instead of |sibling=|, you can also use |numberlike=| and + |sharecounter=|. Some theorems have a fixed name and are not supposed to get a number. To this end, \pkg{amsthm} provides |\newtheorem*|, which is @@ -355,7 +366,8 @@ \begin{preamble}[gobble=6] \usepackage{amsthm, thmtools} \usepackage{ - nameref,%\nameref + % nameref,%\nameref + % n.b. usually nameref is autoloaded by hyperref hyperref,%\autoref % n.b. \Autoref is defined by thmtools cleveref,% \cref @@ -391,6 +403,7 @@ \end{result} \section{Styling theorems} + \label{sec:styling} The major backends provide a command |\theoremstyle| to switch between looks of theorems. This is handled as follows: @@ -403,10 +416,11 @@ \end{preamble} \begin{body}[gobble=4] \begin{Theorem} - This is a theorem. + Note how it still retains the default style, + `plain'. \end{Theorem} \begin{remark} - Note how it still retains the default style, `plain'. + This is a remark. \end{remark} \end{body} \end{source} @@ -419,7 +433,7 @@ \end{remark} \end{result} - Thmtools also supports the shadethm and thmbox packages: + Thmtools also supports the \pkg{shadethm} and \pkg{thmbox} packages: \begin{source} \begin{preamble}[gobble=4] \usepackage{amsthm} @@ -457,9 +471,9 @@ start with a curly brace, in which case it is assumed that |\definecolor{colorname}|$\langle$\textsl{what you said}$\rangle$ will be valid \LaTeX\ code. In our case, we use the rbg model to manually specify - white. (Shadethm's default value is some sort of gray.) + white. (|shadethm|'s default value is {\fboxsep=0pt \fcolorbox{black}[gray]{0.92}{\phantom{XX}}} |[gray]{0.92}|) - For the thmbox package, use the thmbox key: + For the \pkg{thmbox} package, use the |thmbox| key: \begin{source} \begin{preamble}[gobble=4] \usepackage{amsthm} @@ -498,7 +512,7 @@ \end{boxtheorem S} \end{result} - Note that for both thmbox and shaded keys, it's quite possible they will not + Note that for both |thmbox| and |shaded| keys, it's quite possible they will not cooperate with a style key you give at the same time. \subsection{Declaring new theoremstyles} @@ -539,52 +553,62 @@ more keys you can pass to |\declaretheoremstyle|: if \thmtools\ cannot figure out at all what to do with it, it will pass it on to the |\declaretheorem| commands that use that style. For example, you may use - the boxed and shaded keys here. + the |boxed| and |shaded| keys here. To change the order in which title, number and note appear, there is a key - headformat. Currently, the values ``margin'' and ``swapnumber'' are + |headformat|. Currently, the values ``margin'' and ``swapnumber'' are supported. The daring may also try to give a macro here that uses the commands |\NUMBER|, |\NAME| and |\NOTE|. You cannot circumvent the fact - that headpunct comes at the end, though, nor the fonts and braces you + that |headpunct| comes at the end, though, nor the fonts and braces you select with the other keys. - \begin{figure}\centering - % please don't make me touch this picture ever again. - \fbox{ - \begin{minipage}{0.618\textwidth}\Large - \tikzset{font=\normalfont\small\sffamily\itshape,y=12pt,>=latex} - \noindent which resulted in the following insight: - \par - \tikz{\draw[|<->|] (0,-1)--(0,1); - \draw[anchor=west] (0,0) node {spaceabove};} - \par - \tikz{\draw[|<->|] (-1,0)--(1,0); - \draw[anchor=south] (0,0) node {headindent};} - \textbf{Theo% - \smash{\clap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south]{headfont};}}}% - rem 1.2 - (\smash{\rlap{\tikz{\draw (0,0)--(0,2.5) node [anchor=base west]{notebraces};}}}% - Euc% -\smash{\clap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south]{notefont};}}}% - lid)% - .\smash{\rlap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south west]{headpunct};}}}}% - \tikz{\draw[|<->|] (-1,0)--(1,0); - \draw[anchor=south] (0,0) node {postheadspace};} - For every prime $p$, there is a prime $p'>p$. - In particular, the list of primes, - $2,3,5,7,\dots$, - is infinite. - \hfill{\tikz{\draw[anchor=north east] (0,0) node{qed}; }}$\Box$ - \par - \tikz{\draw[|<->|] (0,-1)--(0,1); - \draw[anchor=west] (0,0) node {spacebelow};} - \par - - As a consequence, lorem ipsum dolor sit amet frob-%nicate foo -% paret. - \end{minipage} - } + \begin{figure} + \centering + \fbox{% + \begin{tikzpicture}[ + remember picture, + >=latex, + nodes={ + font=\normalfont\sffamily\itshape\small, + RoyalBlue + }, + every subnode/.style={ + inner sep=0pt + }, + tip/.style={|<->|} + ] + \node[black, font=\Large, text width=.618\textwidth, align=justify] + {% + which resulted in the following insight: \\ + \subnode{space above}{\rule{0pt}{1.3\baselineskip}} \\ + \subnode{head indent}{\strut\hspace*{4em}} + \textbf{% + \subnode{head}{Theorem} 1.2 + \subnode{note brace}{(}% + \subnode{note}{\textit{Euclid}})% + \subnode{head punct}{.} % + } + \subnode{post head space}{\strut\hspace*{4.5em}} + For every prime~$p$, there is a prime~$p'>p$. In particular, the list + of primes, $2,3,5,7,\dots$, is infinite. \hfill + \subnode{qed}{$\Box$} \\ + \subnode{space below}{\rule{0pt}{1.3\baselineskip}} \\ + As a consequence, lorem ipsum dolor sit amet frob-%nicate foo + % paret. + }; + + \draw[tip] (space above.south west) -- node[right] {spaceabove} (space above.north west); + \draw[tip] (head indent.west) -- node[above] {headindent} (head indent.east); + \draw (head.center) -- +(0, 10pt) node[above] {headfont}; + \draw (note brace.north) -- +(0, 20pt) node[above] {notebraces}; + \draw (note.center) -- +(0, 10pt) node[above] {notefont}; + \draw (head punct.base east) -- +(0, 28pt) node[above] {headpunct}; + \draw[tip] (post head space.west) -- node[above] {postheadspace} (post head space.east); + \node at ([xshift=-12pt]qed.150) {qed}; + \draw[tip] (space below.south west) -- node[right] {spacebelow} (space below.north west); + \end{tikzpicture}% + } \caption{Settable parameters of a theorem style.} \label{fig:params} \end{figure} @@ -631,14 +655,14 @@ mechanism, so that this reference: \autoref{thm:euclid} points to p.\,\pageref{thm:euclid}, where the unstarred environment is used. (You can also use a starred environment and an unstarred command, in which case the - behaviour is reversed.) Also, if you use \pkg{hyperref}, the links will lead you + behaviour is reversed.) Also, if you use \pkg{hyperref} (like you see in this manual), the links will lead you to the unstarred occurence. Just to demonstrate that we also handle more involved cases, I repeat another theorem here, but this one was numbered within its section: note we retain the section number which does not fit the current section: \begin{source} - \begin{body} + \begin{body}[gobble=6] \euclidii* \end{body} \end{source} @@ -678,7 +702,7 @@ And you can also restrict to those environments that have an optional argument given. Note that two theorems disappear compared to the previous - example. You could also say just ``onlynamed'', in which case it will + example. You could also say just |onlynamed|, in which case it will apply to \emph{all} theorem environments you have defined. \begin{source} \begin{body}[gobble=6] @@ -705,13 +729,16 @@ \emph{optional} argument, which will go into the list of theorems. Be aware that since we already are within an optional argument, you have to use an extra level of curly braces: - |\begin{theorem}[{name=[Short name]A long name,...}]| + |\begin{theorem}[name={[Short name]A long name,...]}| + \item[label] This will issue a |\label| command after the head. Not very useful, more of a demo. + \item[continues] Saying |continues=foo| will cause the number that is given to be changed to |\ref{foo}|, and a text is added to the note. (The exact text is given by the macro |\thmcontinues|, which takes the label as its argument.) + \item[restate] Saying |restate=foo| will hopefully work like wrapping this theorem in a restatable environment. (It probably still fails in cases that I didn't think of.) This key also accepts an optional @@ -766,8 +793,8 @@ |...postheadhook|, |...prefoothook| and |...postfoothook|. All of these take an \emph{optional} argument, the name of the - environment, and the new code as a mandatory argument. The environment is - optional because there is also a set of ``generic'' hooks added to every + environment, and the new code as a mandatory argument. The name of environment is + optional because there is also a set of ``generic'' hooks added to every theorem that you define. The other way is to use the keys |preheadhook| et al. in your @@ -796,9 +823,9 @@ handling itself is added as part of the headkeys.) - \section{Case in point: the shaded key} + \section{Case in point: the \texttt{shaded} key} - Let us look at a reasonably simple example: the shaded key, which we've + Let us look at a reasonably simple example: the |shaded| key, which we've already seen in the first section. You'll observe that we run into a problem similar to the four-hook mess: your code may either want to modify parameters that need to be set beforehand, or it wants to modify the @@ -826,8 +853,8 @@ using internal macros with @ in their name (viz., |\thmt@envname| and friends). You can also put them into a package (then, without the |\makeat...|), - which is simply a file ending in .sty put somewhere that \LaTeX\ can find - it, which can then be laoded with |\usepackage|. + which is simply a file ending in |.sty| put somewhere that \LaTeX\ can find + it, which can then be loaded with |\usepackage|. To find out where exactly that is, and if you'd need to update administrative helper files such as a filename database FNDB, please consult the documentation of your \TeX\ distribution. @@ -912,7 +939,8 @@ Additionally, a number of keywords are allowed here instead of \LaTeX\ code: \begin{description} - \item[margin] Lets the number protude in the (left) margin. + \item[margin] Lets the number protrude in the (left) margin. + \item[swapnumber] Puts the number before the name. Currently not working so well for unnumbered theorems. \item[] \emph{This list is likely to grow} @@ -932,16 +960,10 @@ |section|. \key{numberwithin} - Value: a counter name. The theorem will be reset whenever that counter - is incremented. Usually, this will be a sectioning level, |chapter| or - |section|. - (Same as parent.) + (Same as |parent|.) \key{within} - Value: a counter name. The theorem will be reset whenever that counter - is incremented. Usually, this will be a sectioning level, |chapter| or - |section|. - (Same as parent.) + (Same as |parent|.) \key{sibling} @@ -949,31 +971,21 @@ Usually, this is the name of another theorem environment. \key{numberlike} - Value: a counter name. The theorem will use this counter for numbering. - Usually, this is the name of another theorem environment. - (Same as sibling.) + (Same as |sibling|.) \key{sharenumber} - Value: a counter name. The theorem will use this counter for numbering. - Usually, this is the name of another theorem environment. - (Same as sibling.) + (Same as |sibling|.) \key{title} Value: \TeX\ code. The title of the theorem. Default is the name of the environment, with |\MakeUppercase| prepended. You'll have to give - this if your title starts with a accented character, for example. + this if your title starts with an accented character, for example. \key{name} - Value: \TeX\ code. The title of the theorem. Default is the name of the - environment, with |\MakeUppercase| prepended. You'll have to give - this if your title starts with a accented character, for example. (Same as title.) \key{heading} - Value: \TeX\ code. The title of the theorem. Default is the name of the - environment, with |\MakeUppercase| prepended. You'll have to give - this if your title starts with a accented character, for example. (Same as title.) \key{numbered} @@ -1009,14 +1021,14 @@ group defined by the environment. \key{refname} - Value: one string, or two string separated by a comma (no spaces). This + Value: one string, or two strings separated by a comma (no spaces). This is the name of the theorem as used by |\autoref|, |\cref| and friends. If it is two strings, the second is the plural form used by |\cref|. Default value is the value of |name|, i.e. usually the environment name, with - \MakeUppercase. + |\MakeUppercase| prepended. \key{Refname} - Value: one string, or two string separated by a comma (no spaces). This + Value: one string, or two strings separated by a comma (no spaces). This is the name of the theorem as used by |\Autoref|, |\Cref| and friends. If it is two strings, the second is the plural form used by |\Cref|. This can be used for alternate spellings, for example if your style requests no @@ -1041,7 +1053,7 @@ \end{description} \key{thmbox} - Value: one of the characters L, M and S; see examples above. + Value: one of the characters |L|, |M| and |S|; see examples in \autoref{sec:styling}. \section{Known keys to in-document theorems} @@ -1053,16 +1065,16 @@ \key{name} Value: \TeX\ code that will be typeset. What you would have put in the optional argument in the non-keyval style, i.e. the note to the head. This is \emph{not} the same - as the name key to |\declaretheorem|, you cannot override that from within + as the |name| key to |\declaretheorem|, you cannot override that from within the document. \key{listhack} Value: doesn't matter. (But put something to trigger - key-val behaviour, maybe listhack=true.) Linebreak styles in \pkg{amsthm} + key-val behaviour, maybe |listhack=true|.) Linebreak styles in \pkg{amsthm} don't linebreak if they start with another list, like an |enumerate| environment. Giving the |listhack| key fixes that. \emph{Don't} give this key for non-break styles, you'll get too little vertical space! (Just use |\leavevmode| manually there.) - An all-around listhack that handles both situations might come in a + An all-around |listhack| that handles both situations might come in a cleaner rewrite of the style system. \section{Restatable -- hints and caveats} @@ -1071,14 +1083,14 @@ \begin{itemize} \item Some counters are saved so that the same values appear when you re-use them. The list of these counters is stored in the macro - |\thmt@innercounters| as a comma-separated list without spaces; default: equation. + |\thmt@innercounters| as a comma-separated list without spaces; default: |equation|. \item To preserve the influence of other counters (think: equation numbered per section and recall the theorem in another section), we need to know all macros that are used to turn a counter into printed output. Again, comma-separated list without spaces, without leading backslash, stored as |\thmt@counterformatters|. Default: - |@alph,@Alph,@arabic,@roman,@Roman,@fnsymbol| + |@alph,@Alph,@arabic,@roman,@Roman,@fnsymbol|. All these only take the \LaTeX\ counter |\c@foo| as arguments. If you bypass this and use |\romannumeral|, your numbers go wrong and you get what you deserve. @@ -1101,7 +1113,7 @@ \chapter{\Thmtools for the morbidly curious}\label{cha:sourcecode} - This chapter consists of the implementation of Thmtools, in case you + This chapter consists of the implementation of \thmtools, in case you wonder how this or that feature was implemented. Read on if you want a look under the bonnet, but you enter at your own risk, and bring an oily rag with you. @@ -1123,18 +1135,18 @@ \subsection{Re-using environments} \DocInput{thm-restate.dtx} - \subsection{Fixing autoref and friends} + \subsection{Fixing \texttt{autoref} and friends} \DocInput{thm-autoref.dtx} \section{Glue code for different backends} - \subsection{amsthm} + \subsection{\texttt{amsthm}} \DocInput{thm-amsthm.dtx} - \subsection{beamer} + \subsection{\texttt{beamer}} \DocInput{thm-beamer.dtx} - \subsection{ntheorem} + \subsection{\texttt{ntheorem}} \DocInput{thm-ntheorem.dtx} \section{Generic tools} @@ -1145,7 +1157,7 @@ \subsection{Different counters sharing the same register} \DocInput{aliasctr.dtx} - \subsection{Tracking occurences: none, one or many} + \subsection{Tracking occurrences: none, one or many} \DocInput{unique.dtx} diff --git a/macros/latex/contrib/thmtools/aliasctr.dtx b/macros/latex/contrib/thmtools/source/aliasctr.dtx index b492f95f56..3c75e11c98 100644 --- a/macros/latex/contrib/thmtools/aliasctr.dtx +++ b/macros/latex/contrib/thmtools/source/aliasctr.dtx @@ -1,10 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2005-7 by Ulrich M. Schwarz +% Copyright (C) 2005-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. The full license text -% is available from http://www.latex-project.org/ +% the LaTeX Project Public License, version 1.3c. +% The license can be obtained from +% http://www.latex-project.org/lppl/lppl-1-3c.txt % %<*code> % \fi diff --git a/macros/latex/contrib/thmtools/parseargs.dtx b/macros/latex/contrib/thmtools/source/parseargs.dtx index 8f4aa42171..4efcd3ecd9 100644 --- a/macros/latex/contrib/thmtools/parseargs.dtx +++ b/macros/latex/contrib/thmtools/source/parseargs.dtx @@ -1,11 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2008 by Ulrich M. Schwarz +% Copyright (C) 2008-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. +% the LaTeX Project Public License, version 1.3c. % The license can be obtained from -% http://www.latex-project.org/lppl/lppl-1-3a.txt +% http://www.latex-project.org/lppl/lppl-1-3c.txt % % \fi % diff --git a/macros/latex/contrib/thmtools/thm-amsthm.dtx b/macros/latex/contrib/thmtools/source/thm-amsthm.dtx index 31a2397f47..b45a6c276e 100644 --- a/macros/latex/contrib/thmtools/thm-amsthm.dtx +++ b/macros/latex/contrib/thmtools/source/thm-amsthm.dtx @@ -1,7 +1,14 @@ % \iffalse meta-comment % -% Copyright (C) 2010 by Ulrich M. Schwarz -% See file COPYING for more details. +% Copyright (C) 2010-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou +% +% This file may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c. +% The license can be obtained from +% http://www.latex-project.org/lppl/lppl-1-3c.txt +% %\fi % %\iffalse (hide this from DocInput) diff --git a/macros/latex/contrib/thmtools/thm-autoref.dtx b/macros/latex/contrib/thmtools/source/thm-autoref.dtx index 90a164f1af..cf84463c09 100644 --- a/macros/latex/contrib/thmtools/thm-autoref.dtx +++ b/macros/latex/contrib/thmtools/source/thm-autoref.dtx @@ -1,11 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2008 by Ulrich M. Schwarz +% Copyright (C) 2008-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. +% the LaTeX Project Public License, version 1.3c. % The license can be obtained from -% http://www.latex-project.org/lppl/lppl-1-3a.txt +% http://www.latex-project.org/lppl/lppl-1-3c.txt % % \fi % diff --git a/macros/latex/contrib/thmtools/thm-beamer.dtx b/macros/latex/contrib/thmtools/source/thm-beamer.dtx index 7c56099ce6..44319480c7 100644 --- a/macros/latex/contrib/thmtools/thm-beamer.dtx +++ b/macros/latex/contrib/thmtools/source/thm-beamer.dtx @@ -1,7 +1,14 @@ % \iffalse meta-comment % -% Copyright (C) 2010 by Ulrich M. Schwarz -% See file COPYING for more details. +% Copyright (C) 2010-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou +% +% This file may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c. +% The license can be obtained from +% http://www.latex-project.org/lppl/lppl-1-3c.txt +% %\fi % %\iffalse (hide this from DocInput) diff --git a/macros/latex/contrib/thmtools/thm-kv.dtx b/macros/latex/contrib/thmtools/source/thm-kv.dtx index 4a31a51885..bdac30899d 100644 --- a/macros/latex/contrib/thmtools/thm-kv.dtx +++ b/macros/latex/contrib/thmtools/source/thm-kv.dtx @@ -1,11 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2008 by Ulrich M. Schwarz +% Copyright (C) 2008-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. +% the LaTeX Project Public License, version 1.3c. % The license can be obtained from -% http://www.latex-project.org/lppl/lppl-1-3a.txt +% http://www.latex-project.org/lppl/lppl-1-3c.txt % % \fi % diff --git a/macros/latex/contrib/thmtools/thm-listof.dtx b/macros/latex/contrib/thmtools/source/thm-listof.dtx index e91219eca1..39603b4341 100644 --- a/macros/latex/contrib/thmtools/thm-listof.dtx +++ b/macros/latex/contrib/thmtools/source/thm-listof.dtx @@ -1,11 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2008 by Ulrich M. Schwarz +% Copyright (C) 2008-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. +% the LaTeX Project Public License, version 1.3c. % The license can be obtained from -% http://www.latex-project.org/lppl/lppl-1-3a.txt +% http://www.latex-project.org/lppl/lppl-1-3c.txt % % \fi % diff --git a/macros/latex/contrib/thmtools/thm-llncs.dtx b/macros/latex/contrib/thmtools/source/thm-llncs.dtx index 5a3b480c2e..134acb18b7 100644 --- a/macros/latex/contrib/thmtools/thm-llncs.dtx +++ b/macros/latex/contrib/thmtools/source/thm-llncs.dtx @@ -1,7 +1,14 @@ % \iffalse meta-comment % -% Copyright (C) 2010 by Ulrich M. Schwarz -% See file COPYING for more details. +% Copyright (C) 2010-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou +% +% This file may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c. +% The license can be obtained from +% http://www.latex-project.org/lppl/lppl-1-3c.txt +% %\fi % %\iffalse (hide this from DocInput) diff --git a/macros/latex/contrib/thmtools/thm-ntheorem.dtx b/macros/latex/contrib/thmtools/source/thm-ntheorem.dtx index ccd12dc30d..ef29870931 100644 --- a/macros/latex/contrib/thmtools/thm-ntheorem.dtx +++ b/macros/latex/contrib/thmtools/source/thm-ntheorem.dtx @@ -1,7 +1,14 @@ % \iffalse meta-comment % -% Copyright (C) 2010 by Ulrich M. Schwarz -% See file COPYING for more details. +% Copyright (C) 2010-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou +% +% This file may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c. +% The license can be obtained from +% http://www.latex-project.org/lppl/lppl-1-3c.txt +% %\fi % %\iffalse (hide this from DocInput) diff --git a/macros/latex/contrib/thmtools/thm-patch.dtx b/macros/latex/contrib/thmtools/source/thm-patch.dtx index b1e28b6fe4..dd00028ca8 100644 --- a/macros/latex/contrib/thmtools/thm-patch.dtx +++ b/macros/latex/contrib/thmtools/source/thm-patch.dtx @@ -1,11 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2008 by Ulrich M. Schwarz +% Copyright (C) 2008-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. +% the LaTeX Project Public License, version 1.3c. % The license can be obtained from -% http://www.latex-project.org/lppl/lppl-1-3a.txt +% http://www.latex-project.org/lppl/lppl-1.3c.txt % % \fi % diff --git a/macros/latex/contrib/thmtools/thm-restate.dtx b/macros/latex/contrib/thmtools/source/thm-restate.dtx index 033a48254e..d02b3630ab 100644 --- a/macros/latex/contrib/thmtools/thm-restate.dtx +++ b/macros/latex/contrib/thmtools/source/thm-restate.dtx @@ -1,11 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2008 by Ulrich M. Schwarz +% Copyright (C) 2008-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. +% the LaTeX Project Public License, version 1.3c. % The license can be obtained from -% http://www.latex-project.org/lppl/lppl-1-3a.txt +% http://www.latex-project.org/lppl/lppl-1.3c.txt % % \fi % @@ -224,7 +226,7 @@ \@xa\let\csname c@#2\endcsname=\c@thmt@dummyctr \@xa\let\csname theH#2\endcsname=\theHthmt@dummyctr % disable labeling. - \let\label=\@gobble + \let\label=\thmt@gobble@label \let\ltx@label=\@gobble% amsmath needs this % We shall need to restore the counters at the end % of the environment, so we get @@ -268,6 +270,14 @@ %% now empty, just used as a marker. } +\let\thmt@gobble@label\@gobble +% cleveref extends syntax of \label to \label[...]{...} +\AtBeginDocument{ + \@ifpackageloaded{cleveref}{ + \renewcommand*\thmt@gobble@label[2][]{} + }{} +} + \newenvironment{restatable}{% \thmt@thisistheonetrue\thmt@restatable }{% diff --git a/macros/latex/contrib/thmtools/thmdef-mdframed.dtx b/macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx index a3fd3658cb..85c5d9bd2d 100644 --- a/macros/latex/contrib/thmtools/thmdef-mdframed.dtx +++ b/macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx @@ -1,14 +1,21 @@ % \iffalse meta-comment % -% Copyright (C) 2010 by Ulrich M. Schwarz -% See file COPYING for more details. +% Copyright (C) 2010-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou +% +% This file may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c. +% The license can be obtained from +% http://www.latex-project.org/lppl/lppl-1-3c.txt +% %\fi % %\iffalse (hide this from DocInput) %<*mdframed> %\fi % -% Mostly, this key wraps the theorem in a mdframed environment. +% Mostly, this key wraps the theorem in a |mdframed| environment. % The parameters are set by treating the value we are given as % a new key-val list, see below. % @@ -20,7 +27,7 @@ \addtotheorempreheadhook[\thmt@envname]{% \begin{mdframed}[#1]}% \addtotheorempostfoothook[\thmt@envname]{\end{mdframed}}% - }% + }% } % \end{macrocode} %\iffalse (hide this from DocInput) diff --git a/macros/latex/contrib/thmtools/thmdef-shaded.dtx b/macros/latex/contrib/thmtools/source/thmdef-shaded.dtx index 6377182c3e..c7501cae36 100644 --- a/macros/latex/contrib/thmtools/thmdef-shaded.dtx +++ b/macros/latex/contrib/thmtools/source/thmdef-shaded.dtx @@ -1,14 +1,21 @@ % \iffalse meta-comment % -% Copyright (C) 2010 by Ulrich M. Schwarz -% See file COPYING for more details. +% Copyright (C) 2010-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou +% +% This file may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c. +% The license can be obtained from +% http://www.latex-project.org/lppl/lppl-1-3c.txt +% %\fi % %\iffalse (hide this from DocInput) %<*shaded> %\fi % -% Mostly, this key wraps the theorem in a shadebox environment. +% Mostly, this key wraps the theorem in a |shadebox| environment. % The parameters are set by treating the value we are given as % a new key-val list, see below. % @@ -24,45 +31,45 @@ }% } % \end{macrocode} -% The docs for shadethm say: +% The docs for |shadethm| say: % \begin{quote} % There are some parameters you could set the default for (try them as is, % first). % \begin{itemize} -% \item shadethmcolor The shading color of the background. See the +% \item |shadethmcolor|\quad The shading color of the background. See the % documentation for the color package, but with a `gray' model, I find .97 % looks good out of my printer, while a darker shade like .92 is needed % to make it copy well. (Black is 0, white is 1.) -% \item shaderulecolor The shading color of the border of the shaded box. +% \item |shaderulecolor|\quad The shading color of the border of the shaded box. % See (i). If shadeboxrule is set to 0pt then this won't print anyway. -% \item shadeboxrule The width of the border around the shading. Set it to +% \item |shadeboxrule|\quad The width of the border around the shading. Set it to % 0pt (not just 0) to make it disappear. -% \item shadeboxsep The length by which the shade box surrounds the text. +% \item |shadeboxsep|\quad The length by which the shade box surrounds the text. % \end{itemize} % \end{quote} % % So, let's just define keys for all of these. % % \begin{macrocode} -\define@key{thmt@shade}{textwidth}{\setlength\shadedtextwidth{#1}} -\define@key{thmt@shade}{bgcolor}{\thmt@definecolor{shadethmcolor}{#1}} -\define@key{thmt@shade}{rulecolor}{\thmt@definecolor{shaderulecolor}{#1}} -\define@key{thmt@shade}{rulewidth}{\setlength\shadeboxrule{#1}} -\define@key{thmt@shade}{margin}{\setlength\shadeboxsep{#1}} -\define@key{thmt@shade}{padding}{\setlength\shadeboxsep{#1}} -\define@key{thmt@shade}{leftmargin}{\setlength\shadeleftshift{#1}} +\define@key{thmt@shade}{textwidth} {\setlength\shadedtextwidth{#1}} +\define@key{thmt@shade}{bgcolor} {\thmt@definecolor{shadethmcolor}{#1}} +\define@key{thmt@shade}{rulecolor} {\thmt@definecolor{shaderulecolor}{#1}} +\define@key{thmt@shade}{rulewidth} {\setlength\shadeboxrule{#1}} +\define@key{thmt@shade}{margin} {\setlength\shadeboxsep{#1}} +\define@key{thmt@shade}{padding} {\setlength\shadeboxsep{#1}} +\define@key{thmt@shade}{leftmargin} {\setlength\shadeleftshift{#1}} \define@key{thmt@shade}{rightmargin}{\setlength\shaderightshift{#1}} % \end{macrocode} % % What follows is wizardry you don't have to understand. In essence, % we want to support two notions of color: one is ``everything that goes -% after \lstinline|\definecolor{shadethmcolor}|'', such as -% \lstinline|{rgb}{0.8,0.85,1}|. On the other hand, we'd also like -% to recognize an already defined color name such as \lstinline|blue|. +% after |\definecolor{shadethmcolor}|'', such as +% |{rgb}{0.8,0.85,1}|. On the other hand, we'd also like +% to recognize an already defined color name such as |blue|. % % To handle the latter case, we need to copy the definition of one color -% into another. The xcolor package offers \lstinline|\colorlet| for that, -% for the color package, we just cross our fingers. +% into another. The \pkg{xcolor} package offers |\colorlet| for that, +% for the \pkg{color} package, we just cross our fingers. % \begin{macrocode} \def\thmt@colorlet#1#2{% %\typeout{don't know how to let color `#1' be like color `#2'!}% @@ -78,19 +85,19 @@ % \end{macrocode} % Now comes the interesting part: we assume that a simple color name % must not be in braces, and a color definition starts with an opening -% curly brace. (So, if \lstinline|\definecolor| ever gets an optional arg, +% curly brace. (So, if |\definecolor| ever gets an optional arg, % we are in a world of pain.) % -% If the second argument to \lstinline|\thmt@definecolor| (the key) starts +% If the second argument to |\thmt@definecolor| (the key) starts % with a brace, -% then \lstinline|\thmt@def@color| will have an empty second argument, +% then |\thmt@def@color| will have an empty second argument, % delimited by the brace of the key. Hopefully, the key will have exactly -% enough arguments to satisfy \lstinline|\definecolor|. Then, -% \lstinline|thmt@drop@relax| will be executed and gobble the fallback -% values and the \lstinline|\thmt@colorlet|. +% enough arguments to satisfy |\definecolor|. Then, +% |thmt@drop@relax| will be executed and gobble the fallback +% values and the |\thmt@colorlet|. % -% If the key does not contain an opening brace, \lstinline|\thmt@def@color| -% will drop everything up to \lstinline|{gray}{0.5}|. So, first the color +% If the key does not contain an opening brace, |\thmt@def@color| +% will drop everything up to |{gray}{0.5}|. So, first the color % gets defined to a medium gray, but then, it immediately gets overwritten % with the definition corresponding to the color name. % \begin{macrocode} diff --git a/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx b/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx new file mode 100644 index 0000000000..59409fd79e --- /dev/null +++ b/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx @@ -0,0 +1,43 @@ +% \iffalse meta-comment +% +% Copyright (C) 2010-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou +% +% This file may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c. +% The license can be obtained from +% http://www.latex-project.org/lppl/lppl-1-3c.txt +% +%\fi +% +%\iffalse (hide this from DocInput) +%<*thmbox> +%\fi +% The \pkg{thmbox} package does something else: instead of having a separate +% environment, we have to use a command different from +% |\newtheorem| to get the boxed style. Fortunately, +% \thmtools stores the command as |\thmt@theoremdefiner|, so we +% can modify it. (One of the perks if extension writer and framework writer +% are the same person.) So, in contrast to the previous example, this time +% we need to do something before the actual |\newtheorem| is +% called. +% \begin{macrocode} +\define@key{thmdef}{thmbox}[L]{% + \thmt@trytwice{% + \let\oldproof=\proof + \let\oldendproof=\endproof + \let\oldexample=\example + \let\oldendexample=\endexample + \RequirePackage[nothm]{thmbox} + \let\proof=\oldproof + \let\endproof=\oldendproof + \let\example=\oldexample + \let\endexample=\oldendexample + \def\thmt@theoremdefiner{\newboxtheorem[#1]}% + }{}% +}% +% \end{macrocode} +%\iffalse (hide this from DocInput) +%</thmbox> +%\fi diff --git a/macros/latex/contrib/thmtools/thmtools.dtx b/macros/latex/contrib/thmtools/source/thmtools.dtx index d5139e30c6..32e819c8e1 100644 --- a/macros/latex/contrib/thmtools/thmtools.dtx +++ b/macros/latex/contrib/thmtools/source/thmtools.dtx @@ -1,11 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2008 by Ulrich M. Schwarz +% Copyright (C) 2008-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. +% the LaTeX Project Public License, version 1.3c. % The license can be obtained from -% http://www.latex-project.org/lppl/lppl-1-3a.txt +% http://www.latex-project.org/lppl/lppl-1.3c.txt % % \fi % diff --git a/macros/latex/contrib/thmtools/source/thmtools.ins b/macros/latex/contrib/thmtools/source/thmtools.ins new file mode 100644 index 0000000000..461856c73c --- /dev/null +++ b/macros/latex/contrib/thmtools/source/thmtools.ins @@ -0,0 +1,64 @@ +%% +%% This is a bog-standard .ins file: thmtools.ins +%% +\input VERSION.tex +%\show\VERSION +\def\dropext #1.#2\relax{#1} +\input docstrip.tex +%\keepsilent +\askonceonly +\preamble +This is a generated file. + +This file is part of the `thmtools' package. +The `thmtools' package has the LPPL maintenance status: maintained. +Current Maintainer is Yukai Chou, muzimuzhi@gmail.com + +Copyright (C) 2008-2014 by Ulrich M. Schwarz +Copyright (C) 2019 by Frank Mittelbach +Copyright (C) 2020- by Yukai Chou + +This file may be distributed and/or modified under the +conditions of the LaTeX Project Public License, version 1.3c. +This version is obtainable at +http://www.latex-project.org/lppl/lppl-1-3c.txt + +^^J\noexpand\noexpand\noexpand\NeedsTeXFormat{LaTeX2e}^^J\noexpand\noexpand\noexpand\ProvidesPackage{\noexpand\expandafter\noexpand\dropext\outFileName\relax}[\VERSION] +\endpreamble + +\generate{% + \file{thmtools.sty} {\from{thmtools.dtx}{thmtools}} + \file{thm-restate.sty} {\from{thm-restate.dtx}{restate}} + \file{thm-patch.sty} {\from{thm-patch.dtx}{patch}} + \file{thm-autoref.sty} {\from{thm-autoref.dtx}{autoref}} + \file{thm-listof.sty} {\from{thm-listof.dtx}{listof}} + \file{thm-kv.sty} {\from{thm-kv.dtx}{kv}} + \file{parseargs.sty} {\from{parseargs.dtx}{parseargs}} + \file{aliasctr.sty} {\from{aliasctr.dtx}{code}} + \file{unique.sty} {\from{unique.dtx}{code}} + \file{thm-amsthm.sty} {\from{thm-amsthm.dtx}{amsthm}} + \file{thm-ntheorem.sty} {\from{thm-ntheorem.dtx}{ntheorem}} + \file{thm-beamer.sty} {\from{thm-beamer.dtx}{beamer}} + \file{thm-llncs.sty} {\from{thm-llncs.dtx}{llncs}} + \file{thmdef-shaded.sty} {\from{thmdef-shaded.dtx}{shaded}} + \file{thmdef-thmbox.sty} {\from{thmdef-thmbox.dtx}{thmbox}} + \file{thmdef-mdframed.sty}{\from{thmdef-mdframed.dtx}{mdframed}} +} +\Msg{*********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the} +\Msg{* following files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space thmtools.sty} +\Msg{* \space\space thm-restate.sty} +\Msg{* \space\space thm-patch.sty} +\Msg{* \space\space thm-autoref.sty} +\Msg{* \space\space thm-listof.sty} +\Msg{* \space\space thm-kv.sty} +\Msg{* \space\space aliasctr.sty} +\Msg{* \space\space unique.sty} +\Msg{* \space\space parseargs.sty} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*********************************************************} +\endbatchfile diff --git a/macros/latex/contrib/thmtools/unique.dtx b/macros/latex/contrib/thmtools/source/unique.dtx index 9afbd2cffa..bf013ca6d4 100644 --- a/macros/latex/contrib/thmtools/unique.dtx +++ b/macros/latex/contrib/thmtools/source/unique.dtx @@ -1,11 +1,13 @@ % \iffalse meta-comment % -% Copyright (C) 2005-8 by Ulrich M. Schwarz +% Copyright (C) 2005-2014 by Ulrich M. Schwarz +% Copyright (C) 2019 by Frank Mittelbach +% Copyright (C) 2020- by Yukai Chou % % This file may be distributed and/or modified under the conditions of -% the LaTeX Project Public License, version 1.3a. +% the LaTeX Project Public License, version 1.3c. % The license can be obtained from -% http://www.latex-project.org/lppl/lppl-1-3a.txt +% http://www.latex-project.org/lppl/lppl-1.3c.txt % % \fi % diff --git a/macros/latex/contrib/thmtools/thmdef-thmbox.dtx b/macros/latex/contrib/thmtools/thmdef-thmbox.dtx deleted file mode 100644 index ea22cbae97..0000000000 --- a/macros/latex/contrib/thmtools/thmdef-thmbox.dtx +++ /dev/null @@ -1,36 +0,0 @@ -% \iffalse meta-comment -% -% Copyright (C) 2010 by Ulrich M. Schwarz -% See file COPYING for more details. -%\fi -% -%\iffalse (hide this from DocInput) -%<*thmbox> -%\fi -% The thmbox package does something else: instead of having a separate -% environment, we have to use a command different from -% \lstinline|\newtheorem| to get the boxed style. Fortunately, -% \thmtools stores the command as \lstinline|\thmt@theoremdefiner|, so we -% can modify it. (One of the perks if extension writer and framework writer -% are the same person.) So, in contrast to the previous example, this time -% we need to do something before the actual \lstinline|\newtheorem| is -% called. -% \begin{macrocode} -\define@key{thmdef}{thmbox}[L]{% - \thmt@trytwice{% - \let\oldproof=\proof - \let\oldendproof=\endproof - \let\oldexample=\example - \let\oldendexample=\endexample - \RequirePackage[nothm]{thmbox} - \let\proof=\oldproof - \let\endproof=\oldendproof - \let\example=\oldexample - \let\endexample=\oldendexample - \def\thmt@theoremdefiner{\newboxtheorem[#1]}% - }{}% -}% -% \end{macrocode} -%\iffalse (hide this from DocInput) -%</thmbox> -%\fi diff --git a/macros/latex/contrib/thmtools/thmtools.ins b/macros/latex/contrib/thmtools/thmtools.ins deleted file mode 100644 index 4b97aae226..0000000000 --- a/macros/latex/contrib/thmtools/thmtools.ins +++ /dev/null @@ -1,61 +0,0 @@ -%% -%% This is a bog-standard .ins file: thmtools.ins -%% -\input VERSION.tex -%\show\VERSION -\def\dropext #1.#2\relax{#1} -\input docstrip.tex -%\keepsilent -\askonceonly -\preamble -This is a generated file. - -This file is part of the `thmtools' package. -The `thmtools' package has the LPPL maintenance status: unmaintained. - -Copyright (C) 2008-2014 by Ulrich M. Schwarz. - -This file may be distributed and/or modified under the -conditions of the LaTeX Project Public License, version 1.3a. -This version is obtainable at -http://www.latex-project.org/lppl/lppl-1-3a.txt - -^^J\noexpand\noexpand\noexpand\NeedsTeXFormat{LaTeX2e}^^J\noexpand\noexpand\noexpand\ProvidesPackage{\noexpand\expandafter\noexpand\dropext\outFileName\relax}[\VERSION] -\endpreamble - -\generate{% - \file{thmtools.sty}{\from{thmtools.dtx}{thmtools}} - \file{thm-restate.sty}{\from{thm-restate.dtx}{restate}} - \file{thm-patch.sty}{\from{thm-patch.dtx}{patch}} - \file{thm-autoref.sty}{\from{thm-autoref.dtx}{autoref}} - \file{thm-listof.sty}{\from{thm-listof.dtx}{listof}} - \file{thm-kv.sty}{\from{thm-kv.dtx}{kv}} - \file{parseargs.sty}{\from{parseargs.dtx}{parseargs}} - \file{aliasctr.sty}{\from{aliasctr.dtx}{code}} - \file{unique.sty}{\from{unique.dtx}{code}} - \file{thm-amsthm.sty}{\from{thm-amsthm.dtx}{amsthm}} - \file{thm-ntheorem.sty}{\from{thm-ntheorem.dtx}{ntheorem}} - \file{thm-beamer.sty}{\from{thm-beamer.dtx}{beamer}} - \file{thm-llncs.sty}{\from{thm-llncs.dtx}{llncs}} - \file{thmdef-shaded.sty}{\from{thmdef-shaded.dtx}{shaded}} - \file{thmdef-thmbox.sty}{\from{thmdef-thmbox.dtx}{thmbox}} - \file{thmdef-mdframed.sty}{\from{thmdef-mdframed.dtx}{mdframed}} - } -\Msg{*********************************************************} -\Msg{*} -\Msg{* To finish the installation you have to move the} -\Msg{* following files into a directory searched by TeX:} -\Msg{*} -\Msg{* \space\space thmtools.sty} -\Msg{* \space\space thm-restate.sty} -\Msg{* \space\space thm-patch.sty} -\Msg{* \space\space thm-autoref.sty} -\Msg{* \space\space thm-listof.sty} -\Msg{* \space\space thm-kv.sty} -\Msg{* \space\space aliasctr.sty} -\Msg{* \space\space unique.sty} -\Msg{* \space\space parseargs.sty} -\Msg{*} -\Msg{* Happy TeXing!} -\Msg{*********************************************************} -\endbatchfile diff --git a/macros/latex/contrib/thmtools/thmtools.pdf b/macros/latex/contrib/thmtools/thmtools.pdf Binary files differdeleted file mode 100644 index 5ab3fd1d69..0000000000 --- a/macros/latex/contrib/thmtools/thmtools.pdf +++ /dev/null |