From 522964b40afca63660485cdcfc577b25bdf02e35 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 17 Jul 2020 21:45:53 +0000 Subject: l3 (17jul20) git-svn-id: svn://tug.org/texlive/trunk@55860 c570f23f-e606-0410-a88d-b1316a301751 --- .../l3experimental/l3benchmark/l3benchmark.dtx | 4 +- .../latex/l3experimental/l3cctab/l3cctab.dtx | 587 -------------- .../latex/l3experimental/l3cctab/l3cctab.ins | 62 -- .../latex/l3experimental/l3color/l3color.dtx | 576 ++++++++++--- .../latex/l3experimental/l3draw/l3draw-boxes.dtx | 2 +- .../latex/l3experimental/l3draw/l3draw-layers.dtx | 2 +- .../latex/l3experimental/l3draw/l3draw-paths.dtx | 2 +- .../latex/l3experimental/l3draw/l3draw-points.dtx | 2 +- .../latex/l3experimental/l3draw/l3draw-scopes.dtx | 2 +- .../l3experimental/l3draw/l3draw-softpath.dtx | 2 +- .../latex/l3experimental/l3draw/l3draw-state.dtx | 4 +- .../l3experimental/l3draw/l3draw-transforms.dtx | 2 +- .../source/latex/l3experimental/l3draw/l3draw.dtx | 4 +- .../latex/l3experimental/l3graphics/l3graphics.dtx | 4 +- .../source/latex/l3experimental/l3pdf/l3pdf.dtx | 4 +- .../latex/l3experimental/l3str/l3str-format.dtx | 4 +- .../l3experimental/l3sys-shell/l3sys-shell.dtx | 4 +- .../latex/l3experimental/xcoffins/xcoffins.dtx | 4 +- .../latex/l3experimental/xgalley/l3galley.dtx | 4 +- .../latex/l3experimental/xgalley/xgalley.dtx | 4 +- Master/texmf-dist/source/latex/l3kernel/expl3.dtx | 5 +- Master/texmf-dist/source/latex/l3kernel/l3.ins | 1 + .../texmf-dist/source/latex/l3kernel/l3alloc.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3basics.dtx | 2 +- .../source/latex/l3kernel/l3bootstrap.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3box.dtx | 2 +- .../source/latex/l3kernel/l3candidates.dtx | 43 +- .../texmf-dist/source/latex/l3kernel/l3cctab.dtx | 891 +++++++++++++++++++++ .../texmf-dist/source/latex/l3kernel/l3clist.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3coffins.dtx | 15 +- .../source/latex/l3kernel/l3color-base.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3debug.dtx | 8 +- .../source/latex/l3kernel/l3deprecation.dtx | 417 ++-------- Master/texmf-dist/source/latex/l3kernel/l3doc.dtx | 4 +- .../source/latex/l3kernel/l3docstrip.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3expan.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3file.dtx | 187 +++-- .../texmf-dist/source/latex/l3kernel/l3final.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3flag.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3format.ins | 1 + .../source/latex/l3kernel/l3fp-assign.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fp-aux.dtx | 2 +- .../source/latex/l3kernel/l3fp-basics.dtx | 2 +- .../source/latex/l3kernel/l3fp-convert.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fp-expo.dtx | 2 +- .../source/latex/l3kernel/l3fp-extended.dtx | 2 +- .../source/latex/l3kernel/l3fp-logic.dtx | 2 +- .../source/latex/l3kernel/l3fp-parse.dtx | 17 +- .../source/latex/l3kernel/l3fp-random.dtx | 2 +- .../source/latex/l3kernel/l3fp-round.dtx | 2 +- .../source/latex/l3kernel/l3fp-traps.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fp-trig.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3fp.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3fparray.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3int.dtx | 2 +- .../source/latex/l3kernel/l3intarray.dtx | 19 +- .../source/latex/l3kernel/l3kernel-functions.dtx | 29 +- Master/texmf-dist/source/latex/l3kernel/l3keys.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3legacy.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3luatex.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3msg.dtx | 48 +- .../texmf-dist/source/latex/l3kernel/l3names.dtx | 667 +-------------- Master/texmf-dist/source/latex/l3kernel/l3prg.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3prop.dtx | 48 +- .../texmf-dist/source/latex/l3kernel/l3quark.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3regex.dtx | 6 +- Master/texmf-dist/source/latex/l3kernel/l3seq.dtx | 77 +- Master/texmf-dist/source/latex/l3kernel/l3skip.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3sort.dtx | 2 +- .../source/latex/l3kernel/l3str-convert.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3str.dtx | 8 +- Master/texmf-dist/source/latex/l3kernel/l3sys.dtx | 2 +- .../source/latex/l3kernel/l3text-case.dtx | 2 +- .../source/latex/l3kernel/l3text-purify.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3text.dtx | 2 +- .../source/latex/l3kernel/l3tl-analysis.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3tl.dtx | 58 +- .../texmf-dist/source/latex/l3kernel/l3token.dtx | 42 +- .../texmf-dist/source/latex/l3kernel/l3unicode.dtx | 2 +- 79 files changed, 1940 insertions(+), 2006 deletions(-) delete mode 100644 Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx delete mode 100644 Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins create mode 100644 Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx (limited to 'Master/texmf-dist/source') diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx index a5654f97cdd..bd5fa245a97 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -130,7 +130,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3benchmark}{2020-06-18}{} +\ProvidesExplPackage{l3benchmark}{2020-07-17}{} {L3 Experimental benchmarking} % % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx deleted file mode 100644 index 4bda61148d0..00000000000 --- a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx +++ /dev/null @@ -1,587 +0,0 @@ -% \iffalse meta-comment -% -%% File: l3cctab.dtx -% -% Copyright (C) 2018-2020 The LaTeX3 Project -% -% It may be distributed and/or modified under the conditions of the -% LaTeX Project Public License (LPPL), either version 1.3c of this -% license or (at your option) any later version. The latest version -% of this license is in the file -% -% http://www.latex-project.org/lppl.txt -% -% This file is part of the "l3experimental bundle" (The Work in LPPL) -% and all files in that bundle must be distributed together. -% -% ----------------------------------------------------------------------- -% -% The development version of the bundle can be found at -% -% https://github.com/latex3/latex3 -% -% for those people who are interested. -% -%<*driver|package> -\RequirePackage{expl3} -% -%<*driver> -\documentclass[full]{l3doc} -\begin{document} - \DocInput{\jobname.dtx} -\end{document} -% -% \fi -% -% \title{^^A -% The \pkg{l3cctab} package\\ Experimental category code tables^^A -% } -% -% \author{^^A -% The \LaTeX3 Project\thanks -% {^^A -% E-mail: -% \href{mailto:latex-team@latex-project.org} -% {latex-team@latex-project.org}^^A -% }^^A -% } -% -% \date{Released 2020-06-18} -% -% \maketitle -% -% \begin{documentation} -% -% \section{\pkg{l3cctab} documentation} -% -% A category code table enables rapid switching of all category codes in -% one operation. For \LuaTeX{}, this is possible over the entire Unicode -% range. For other engines, only the $8$-bit range ($0$-$255$) is covered by -% such tables. -% -% \subsection{Creating and initialising category code tables} -% -% \begin{function}{\cctab_new:N,\cctab_new:c} -% \begin{syntax} -% \cs{cctab_new:N} \meta{category code table} -% \end{syntax} -% Creates a new \meta{category code table} variable or raises an error if -% the name is already taken. The declaration is global. The -% \meta{category code table} is initialised with the codes -% as used by \IniTeX{}. -% \end{function} -% -% \begin{function}{\cctab_const:Nn,\cctab_const:cn} -% \begin{syntax} -% \cs{cctab_const:Nn} \meta{category code table} \Arg{category code set up} -% \end{syntax} -% Creates a new \meta{category code table} with the category code settings in -% force at the time the function is called, and applies the -% \meta{category code set up} on top of prevailing settings, then saves -% as a constant table. -% \end{function} -% -% \begin{function}{\cctab_gset:Nn,\cctab_gset:cn} -% \begin{syntax} -% \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up} -% \end{syntax} -% Sets the \meta{category code table} to apply the category codes -% which apply when the prevailing régime is modified by the -% \meta{category code set up}. Thus within a standard code block -% the starting point will be the code applied by \cs{c_code_cctab}. -% The assignment of the table is global: the underlying primitive does -% not respect grouping. -% \end{function} -% -% \subsection{Using category code tables} -% -% \begin{function}{\cctab_begin:N,\cctab_begin:c} -% \begin{syntax} -% \cs{cctab_begin:N} \meta{category code table} -% \end{syntax} -% Switches the category codes in force to those stored in the -% \meta{category code table}. The prevailing codes before the -% function is called are added to a stack, for use with -% \cs{cctab_end:}. This function does not start a \TeX{} group. -% \end{function} -% -% \begin{function}{\cctab_end:} -% \begin{syntax} -% \cs{cctab_end:} -% \end{syntax} -% Ends the scope of a \meta{category code table} started using -% \cs{cctab_begin:N}, retuning the codes to those in force before -% the matching \cs{cctab_begin:N} was used. -% \end{function} -% -% \begin{function}[added = 2020-05-19]{\cctab_select:N} -% \begin{syntax} -% \cs{cctab_select:N}\meta{category code table} -% \end{syntax} -% Selects the \meta{category code table} for the scope of the current -% group. -% \end{function} -% -% \subsection{Category code table conditionals} -% -% \begin{function}[pTF]{\cctab_if_exist:N,\cctab_if_exist:c} -% \begin{syntax} -% \cs{cctab_if_exist_p:N} \meta{category code table} -% \cs{cctab_if_exist:NTF} \meta{category code table} \Arg{true code} \Arg{false code} -% \end{syntax} -% Tests whether the \meta{category code table} is currently defined. -% This does not check that the \meta{category code table} really is a -% category code table. -% \end{function} -% -% \subsection{Constant category code tables} -% -% \begin{variable}{\c_code_cctab} -% Category code table for the code environment. This does not include -% setting the behaviour of the line-end character, which is only -% altered by \cs{ExplSyntaxOn}. -% \end{variable} -% -% \begin{variable}{\c_document_cctab} -% Category code table for a standard \LaTeX{} document. This does not -% include setting the behaviour of the line-end character, which is -% only altered by \cs{ExplSyntaxOff}. -% \end{variable} -% -% \begin{variable}{\c_initex_cctab} -% Category code table as set up by \IniTeX{}. -% \end{variable} -% -% \begin{variable}{\c_other_cctab} -% Category code table where all characters have category code $12$ -% (other). -% \end{variable} -% -% \begin{variable}{\c_str_cctab} -% Category code table where all characters have category code $12$ -% (other) with the exception of spaces, which have category code -% $10$ (space). -% \end{variable} -% -% \end{documentation} -% -% \begin{implementation} -% -% \section{\pkg{l3cctab} implementation} -% -% \begin{macrocode} -%<*initex|package> -% \end{macrocode} -% -% \begin{macrocode} -%<@@=cctab> -% \end{macrocode} -% -% \begin{macrocode} -%<*package> -\ProvidesExplPackage{l3cctab}{2020-06-18}{} - {L3 Experimental category code tables} -% -% \end{macrocode} -% -% \begin{variable}{\g_@@_allocate_int} -% \begin{variable}{\g_@@_stack_int} -% \begin{variable}{\g_@@_stack_seq} -% To allocate category code tables, both the read-only and stack -% tables need to be followed. There is also a sequence stack for the -% dynamic tables themselves. -% \begin{macrocode} -\int_new:N \g_@@_allocate_int -\int_gset:Nn \g_@@_allocate_int { -1 } -\int_new:N \g_@@_stack_int -\seq_new:N \g_@@_stack_seq -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_tmp_tl} -% Scratch space. -% \begin{macrocode} -\tl_new:N \l_@@_tmp_tl -% \end{macrocode} -% \end{variable} -% -% \begin{macro}{\cctab_new:N,\cctab_new:c} -% \begin{macro}{\@@_begin:N,\@@_begin:c} -% \begin{macro}{\@@_end:} -% \begin{macro}{\cctab_gset:Nn,\cctab_gset:cn} -% As \LuaTeX{} offers engine support for category code tables, and this is -% entirely lacking from the other engines, we need two complementary -% approaches here. Rather than intermix them, we split the set up based on -% engine. (Some future \XeTeX{} may add support, at which point the -% conditional here would be subtly different.) -% -% First, the \LuaTeX{} case. -% \begin{macrocode} -\sys_if_engine_luatex:TF - { -% \end{macrocode} -% Creating a new category code table is done slightly differently -% from other registers. Low-numbered tables are more efficiently-stored -% than high-numbered ones. There is also a need to have a stack of -% flexible tables as well as the set of read-only ones. To satisfy both -% of these requirements, odd numbered tables are used for read-only -% tables, and even ones for the stack. Here, therefore, the odd numbers -% are allocated. -% \begin{macrocode} - \cs_new_protected:Npn \cctab_new:N #1 - { - \__kernel_chk_if_free_cs:N #1 -%<*initex> - \int_gadd:Nn \g_@@_allocate_int { 2 } - \int_compare:nNnTF - \g_@@_allocate_int < { \c_max_register_int + 1 } - { - \tex_global:D \tex_chardef:D #1 \g_@@_allocate_int - \tex_initcatcodetable:D #1 - } - { - \__kernel_msg_fatal:nnx - { kernel } { out-of-registers } { cctab } - } -% -%<*package> - \newcatcodetable #1 -% - } -% \end{macrocode} -% The aim here is to ensure that the saved tables are read-only. This is -% done by using a stack of tables which are not read only, and actually -% having them as \enquote{in use} copies. -% \begin{macrocode} - \cs_new_protected:Npn \@@_begin:N #1 - { - \seq_gpush:Nx \g_@@_stack_seq { \tex_the:D \tex_catcodetable:D } - \tex_catcodetable:D #1 - \int_gadd:Nn \g_@@_stack_int { 2 } - \int_compare:nNnT \g_@@_stack_int > \c_max_register_int - { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } } - \tex_savecatcodetable:D \g_@@_stack_int - \tex_catcodetable:D \g_@@_stack_int - } - \cs_new_protected:Npn \@@_end: - { - \int_gsub:Nn \g_@@_stack_int { 2 } - \seq_if_empty:NTF \g_@@_stack_seq - { \tl_set:Nn \l_@@_tmp_tl { 0 } } - { \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl } - \tex_catcodetable:D \l_@@_tmp_tl \scan_stop: - } -% \end{macrocode} -% Category code tables are always global, so only one version is needed. -% The set up here is simple, and means that at the point of use there is -% no need to worry about escaping category codes. -% \begin{macrocode} - \cs_new_protected:Npn \cctab_gset:Nn #1#2 - { - \group_begin: - #2 \scan_stop: - \tex_savecatcodetable:D #1 - \group_end: - } - } -% \end{macrocode} -% Now the case for other engines. Here, we use an integer array for each -% table. The index base is out-by-one, so we have an internal function to -% handle that. The rest of the approach here is pretty simple: use a stack -% of tables, and save to them at each |begin|. Unlike the \LuaTeX{} case, -% we can't accidentally alter a saved table, which makes life a little -% easier. -% \begin{macrocode} - { - \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3 - { - \intarray_gset:cnn - { g_@@_ \int_use:N #1 _cctab } { #2 + 1 } {#3} - } -% \end{macrocode} -% Following the \LuaTeX{} pattern, a new table starts with \IniTeX{} codes. -% \begin{macrocode} - \cs_new_protected:Npn \cctab_new:N #1 - { - \int_gadd:Nn \g_@@_allocate_int { 2 } - \int_const:Nn #1 { \g_@@_allocate_int } - \intarray_new:cn { g_@@_ \int_use:N #1 _cctab } { 256 } - \int_step_inline:nn { 256 } - { - \intarray_gset:cnn - { g_@@_ \int_use:N #1 _cctab } {##1} { 12 } - } - \@@_gstore:Nnn #1 { 0 } { 9 } - \@@_gstore:Nnn #1 { 13 } { 5 } - \@@_gstore:Nnn #1 { 32 } { 10 } - \@@_gstore:Nnn #1 { 37 } { 14 } - \int_step_inline:nnn { 65 } { 90 } - { \@@_gstore:Nnn #1 {##1} { 11 } } - \@@_gstore:Nnn #1 { 92 } { 0 } - \int_step_inline:nnn { 97 } { 122 } - { \@@_gstore:Nnn #1 {##1} { 11 } } - \@@_gstore:Nnn #1 { 127 } { 15 } - } - \cs_new_protected:Npn \@@_begin:N #1 - { - \int_gadd:Nn \g_@@_stack_int { 2 } - \int_compare:nNnT \g_@@_stack_int > \c_max_register_int - { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } } - \cs_if_exist:cF { g_@@_ \int_use:N \g_@@_stack_int _cctab } - { - \intarray_new:cn - { g_@@_ \int_use:N \g_@@_stack_int _cctab } - { 256 } - } - \int_step_inline:nn { 256 } - { - \intarray_gset:cnn - { g_@@_ \int_use:N \g_@@_stack_int _cctab } - {##1} - { \char_value_catcode:n { ##1 - 1 } } - } - \int_step_inline:nn { 256 } - { - \char_set_catcode:nn { ##1 - 1 } - { - \intarray_item:cn - { g_@@_ \int_use:N #1 _cctab } {##1} - } - } - } - \cs_generate_variant:Nn \intarray_new:Nn { c } - \cs_generate_variant:Nn \intarray_gset:Nnn { c } - \cs_new_protected:Npn \@@_end: - { - \int_step_inline:nn { 256 } - { - \char_set_catcode:nn { ##1 - 1 } - { - \intarray_item:cn - { g_@@_ \int_use:N \g_@@_stack_int _cctab } - {##1} - } - } - \int_gsub:Nn \g_@@_stack_int { 2 } - } - \cs_generate_variant:Nn \intarray_item:Nn { c } - \cs_new_protected:Npn \cctab_gset:Nn #1#2 - { - \group_begin: - #2 \scan_stop: - \int_step_inline:nn { 256 } - { - \intarray_gset:cnn { g_@@_ \int_use:N #1 _cctab } {##1} - { \char_value_catcode:n { ##1 - 1 } } - } - \group_end: - } - } -\cs_generate_variant:Nn \cctab_new:N { c } -\cs_generate_variant:Nn \cctab_gset:Nn { c } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\cctab_begin:N,\cctab_end:} -% These functions perform a few sanity checks before calling the -% functions which will do the heavy-lifting. -% \cs{cctab_begin:N} checks if a \meta{cctab~var} exists before trying -% to use it. \cs{cctab_end:} checks if a \cs{cctab_begin:N} was used -% some time earlier. -% -% Skipping these checks would result in an \enquote{Undefined control -% sequence} error for \cs{cctab_begin:N} with an undefined -% \meta{cctab~var}, and a \enquote{Missing font identifier} for an extra -% \cs{cctab_end:}. -% \begin{macrocode} -\cs_new_protected:Npn \cctab_begin:N #1 - { \@@_chk_if_valid:NT #1 { \@@_begin:N #1 } } -\cs_generate_variant:Nn \cctab_begin:N { c } -\cs_new_protected:Npn \cctab_end: - { - \int_compare:nNnTF { \g_@@_stack_int } = { \c_zero_int } - { \__kernel_msg_error:nn { kernel } { cctab-extra-end } } - { \@@_end: } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cctab_select:N} -% \begin{macro}{\@@_end_fast:} -% Select a catcode table within a group. -% \begin{macrocode} -\cs_new_protected:Npn \cctab_select:N #1 - { - \@@_chk_if_valid:NT #1 - { - \@@_begin:N #1 - \group_insert_after:N \@@_end_fast: - } - } -\cs_generate_variant:Nn \cctab_select:N { c } -\cs_new_protected:Npx \@@_end_fast: - { - \int_gsub:Nn \exp_not:N \g_@@_stack_int { 2 } - \sys_if_engine_luatex:T - { \seq_gpop:NN \exp_not:N \g_@@_stack_seq \exp_not:N \l_@@_tmp_tl } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c} -% Checks whether a \meta{cctab~var} is defined. -% \begin{macrocode} -\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N - { TF , T , F , p } -\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c - { TF , T , F , p } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_chk_if_valid:N} -% Checks whether the argument is defined and whether it is a valid -% \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var} -% is checked by the engine, which complains if the argument is not -% a \cs{chardef}'ed constant. In other engines, check if the -% underlying \cs[no-index]{g_@@_\meta{integer}_cctab} -% \meta{intarray~var} exists. -% \begin{macrocode} -\sys_if_engine_luatex:TF - { - \prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1 - { TF , T , F } - { - \cctab_if_exist:NTF #1 - { -%<*initex> - \bool_lazy_and:nnTF - { \int_if_odd_p:n {#1} } - { \int_compare_p:nNn {#1-1} < { \g_@@_allocate_int } } -% -%<*package> - \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count } -% - { \prg_return_true: } - { - \__kernel_msg_error:nnx { kernel } { invalid-cctab } - { \token_to_str:N #1 } - \prg_return_false: - } - } - { - \__kernel_msg_error:nnx { kernel } { command-not-defined } - { \token_to_str:N #1 } - \prg_return_false: - } - } - } - { - \prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1 - { TF , T , F } - { - \cctab_if_exist:NTF #1 - { - \cs_if_exist:cTF { g_@@_ \int_use:N #1 _cctab } - { \prg_return_true: } - { - \__kernel_msg_error:nnx { kernel } { invalid-cctab } - { \token_to_str:N #1 } - \prg_return_false: - } - } - { - \__kernel_msg_error:nnx { kernel } { command-not-defined } - { \token_to_str:N #1 } - \prg_return_false: - } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\cctab_const:Nn,\cctab_const:cn} -% Creates a new \meta{cctab~var} then sets it with the current and -% user-supplied codes. -% \begin{macrocode} -\cs_new_protected:Npn \cctab_const:Nn #1#2 - { - \cctab_new:N #1 - \cctab_gset:Nn #1 {#2} - } -\cs_generate_variant:Nn \cctab_const:Nn { c } -% \end{macrocode} -% \end{macro} -% -% \begin{variable} -% { -% \c_initex_cctab , -% \c_code_cctab , -% \c_document_cctab , -% \c_other_cctab , -% \c_str_cctab -% } -% Creating category code tables is easy using the function above. -% The \texttt{other} and \texttt{string} ones are done by completely -% ignoring the existing codes as this makes life a lot less complex. -% \begin{macrocode} -\cctab_new:N \c_initex_cctab -\cctab_const:Nn \c_code_cctab { } -\cctab_const:Nn \c_document_cctab - { - \char_set_catcode_space:n { 9 } - \char_set_catcode_space:n { 32 } - \char_set_catcode_other:n { 58 } - \char_set_catcode_math_subscript:n { 95 } - \char_set_catcode_active:n { 126 } - } -\cctab_const:Nn \c_other_cctab - { - \int_step_inline:nnn { 0 } { 127 } - { \char_set_catcode_other:n {#1} } - } -\cctab_const:Nn \c_str_cctab - { - \int_step_inline:nnn { 0 } { 127 } - { \char_set_catcode_other:n {#1} } - \char_set_catcode_space:n { 32 } - } -% \end{macrocode} -% \end{variable} -% -% \subsection{Messages} -% -% \begin{macrocode} -\__kernel_msg_new:nnnn { kernel } { cctab-stack-full } - { The~category~code~table~stack~is~exhausted. } - { - LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~ - but~there~is~no~more~space~to~do~this! - } -\__kernel_msg_new:nnnn { kernel } { cctab-extra-end } - { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. } - { - LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~ - \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored. - } -\__kernel_msg_new:nnnn { kernel } { invalid-cctab } - { Invalid~\iow_char:N\\catcode~table. } - { - You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~ - initialized~using~\iow_char:N\\cctab_new:N~or~ - \iow_char:N\\cctab_const:Nn. - } -% \end{macrocode} -% -% \begin{macrocode} -% -% \end{macrocode} -% -%\end{implementation} -% -%\PrintIndex diff --git a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins deleted file mode 100644 index e968f1bf838..00000000000 --- a/Master/texmf-dist/source/latex/l3experimental/l3cctab/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/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx index 8a87d390b4f..91cb13e0b45 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -190,9 +190,9 @@ % % \begin{function}{\color_set:nnn} % \begin{syntax} -% \cs{color_set:nnn} \Arg{name} \Arg{model} \Arg{value(s)} +% \cs{color_set:nnn} \Arg{name} \Arg{model(s)} \Arg{value(s)} % \end{syntax} -% Stores the color specification equivalent to the \meta{model} and +% Stores the color specification equivalent to the \meta{model(s)} and % \meta{values} as the \meta{name}. % \end{function} % @@ -225,9 +225,9 @@ % % \begin{function}{\color_select:nn} % \begin{syntax} -% \cs{color_select:nn} \Arg{model} \Arg{value(s)} +% \cs{color_select:nn} \Arg{model(s)} \Arg{value(s)} % \end{syntax} -% Activates the color specification equivalent to the \meta{model} and +% Activates the color specification equivalent to the \meta{model(s)} and % \meta{value(s)} for typeset material. % \end{function} % @@ -237,23 +237,69 @@ % and similar are not influenced by this setting. % \end{variable} % -% \section{Core color representation} +% \section{Multiple color models} % -% To allow data to be handled internally, \pkg{l3color} uses a simple -% representation of color, comprising two \meta{balanced text} entries, the first -% the \meta{model} and the second the \meta{values} given -% \emph{separated by spaces}. -% -% This core representation is produced when parsing color expressions. +% When selecting or setting a color with an explicit model, it is possible +% to give values for more than one model at one time. This is particularly +% useful where automated conversion between models does not give the desired +% outcome. To do this, the list of models and list of values are both subdivided +% using |/| characters (as for the similar function in \pkg{xcolor}). For +% example, to save a color with explicit |cmyk| and |rgb| values, one could +% use +% \begin{verbatim} +% \color_set:nnn { foo } { cmyk / rgb } +% { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 } +% \end{verbatim} +% The manually-specified conversion will be used in preference to automated +% calculation whenever the model(s) listed are used: both in expressions and +% when a fixed model is active. % -% \begin{function}{\color_parse:nN} +% Similarly, the same syntax can be applied to directly selecting a color. +% \begin{verbatim} +% \color_select:nn { cmyk / rgb } +% { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 } +% \end{verbatim} +% Again, this list is used when a fixed model is active: the first entry is used +% unless there is a fixed model matching one of the other entries. +% +% \section{Exporting color specifications} +% +% The major use of color expressions is in setting typesetting output, but there +% are other places in which some form of color information is required. These +% may need data in a different format or using a different model to the internal +% representation. Thus a set of functions are available to export colors in +% different formats. +% +% Valid export targets are +% \begin{itemize} +% \item \texttt{backend} Two brace groups: the first containing the +% model, the second containing space-separated values appropriate +% for the model; this is the format required by backend functions +% of \pkg{expl3} +% \item \texttt{HTML} Uppercase two-digit hexadecimal values, expressing +% a red-green-blue color; the digits are \emph{not} separated +% \item \texttt{space-sep-cmyk} Space-separated cyan-magenta-yellow-black +% values +% \item \texttt{space-sep-rgb} Space-separated red-green-blue values +% suitable for use as a PDF annotation color +% \end{itemize} +% +% \begin{function}{\color_export:nnN} % \begin{syntax} -% \cs{color_parse:nN} \Arg{color expression} \Arg{tl} +% \cs{color_export:nnN} \Arg{color expression} \Arg{format} \Arg{tl} % \end{syntax} -% Parses the \meta{color expression} as described above, and sets the -% \meta{tl} to the equivalent \meta{core color representation} -% (used at the backend level and based on \texttt{dvips} color -% representation). +% Parses the \meta{color expression} as described earlier, +% then converts to the \meta{format} specified and assigns the data to the +% \meta{tl}. +% \end{function} +% +% \begin{function}{\color_export:nnN} +% \begin{syntax} +% \cs{color_export:nnnN} \Arg{model} \Arg{value(s)} \Arg{format} \Arg{tl} +% \end{syntax} +% Expresses the combination of \meta{model} and \meta{value(s)} in an +% internal representation, then converts to the \meta{format} specified and +% assigns the data to the \meta{tl}. % \end{function} % % \section{Spot colors} @@ -275,7 +321,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3color}{2020-06-18}{} +\ProvidesExplPackage{l3color}{2020-07-17}{} {L3 Experimental color support} % % \end{macrocode} @@ -297,8 +343,8 @@ % functions). % % Since there is no need to manipulate colors \emph{en masse}, each is stored -% in a separate token list variable, rather than the alternative of using a -% single property list for all names. +% in a two-part structure: a \texttt{prop} for the colors themselves, and a +% \texttt{tl} for the default model for each color. % % \subsection{Setup} % @@ -323,42 +369,37 @@ % \begin{macrocode} \prg_new_conditional:Npnn \@@_if_defined:n #1 { T, F, TF } { - \tl_if_exist:cTF { l_@@_named_ #1 _tl } + \prop_if_exist:cTF { l_@@_named_ #1 _prop } \prg_return_true: \prg_return_false: } % \end{macrocode} % \end{macro} % +% \begin{macro}[EXP]{\@@_model:N, \@@_values:N} +% Simple abstractions. +% \begin{macrocode} +\cs_new:Npn \@@_model:N #1 { \exp_after:wN \use_i:nn #1 } +\cs_new:Npn \@@_values:N #1 { \exp_after:wN \use_ii:nn #1 } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\@@_extract:nNN, \@@_extract:VNN} -% \begin{macro}{\@@_extract:NNnn} -% Split the model and color from a named color, and store the two. No test -% for the existence of the color: that is assumed to be the case (this -% is internal only). Somewhat \enquote{old-fashioned} but should be quite -% fast. +% Recover the values for the standard model for a color. % \begin{macrocode} \cs_new_protected:Npn \@@_extract:nNN #1#2#3 { - \exp_after:wN \exp_after:wN \exp_after:wN - \@@_extract:NNnn - \exp_after:wN \exp_after:wN \exp_after:wN #2 - \exp_after:wN \exp_after:wN \exp_after:wN #3 - \cs:w l_@@_named_ #1 _tl \cs_end: + \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl } + \prop_get:cVN { l_@@_named_ #1 _prop } #2 #3 } \cs_generate_variant:Nn \@@_extract:nNN { V } -\cs_new_protected:Npn \@@_extract:NNnn #1#2#3#4 - { - \tl_set:Nn #1 {#3} - \tl_set:Nn #2 {#4} - } % \end{macrocode} % \end{macro} -% \end{macro} % % \subsection{Model conversion} % % \begin{macro}{\@@_convert:nnN, \@@_convert:VVN} -% \begin{macro}{\@@_convert:nnnN} +% \begin{macro}{\@@_convert:nnnN, \@@_convert:nVnN, \@@_convert:nnVN} % \begin{macro}[aux, EXP] % { % \@@_convert_gray_rgb:w @@ -383,7 +424,7 @@ \tl_set:Nx #4 { \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s_@@_stop } } -\cs_generate_variant:Nn \@@_convert:nnnN { nnV } +\cs_generate_variant:Nn \@@_convert:nnnN { nV , nnV } \cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \s_@@_stop { #1 ~ #1 ~ #1 } \cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \s_@@_stop @@ -442,12 +483,15 @@ % \end{macrocode} % \end{variable} % -% \begin{macro}{\color_parse:nN} % \begin{macro}{\@@_parse:nN} +% \begin{macro}{\@@_parse_aux:nN} +% \begin{macro}{\@@_parse_eq:Nn} +% \begin{macro}{\@@_parse_eq:nNn} % \begin{macro}{\@@_parse:Nw} % \begin{macro}{\@@_parse_loop_init:Nnn} % \begin{macro}{\@@_parse_loop:w} % \begin{macro}{\@@_parse_loop:nn} +% \begin{macro}{\@@_parse_gray:n, \@@_parse_std:n} % \begin{macro}{\@@_parse_break:w} % \begin{macro}{\@@_parse_end:} % \begin{macro}[aux, EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn} @@ -462,37 +506,73 @@ % otherwise expands, then starts working through the expression itself. % At the end, we apply the payload. % \begin{macrocode} -\cs_new_protected:Npn \color_parse:nN #1#2 +\cs_new_protected:Npx \@@_parse:nN #1#2 { %<*package> - \@@_backend_pickup:N \l_@@_current_tl - \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl + \exp_not:N \@@_backend_pickup:N \exp_not:N \l_@@_current_tl + \tl_set:Nx \exp_not:c { l_@@_named_ . _tl } + { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl } + \prop_put:NVx \exp_not:c { l_@@_named_ . _prop } + \exp_not:c { l_@@_named_ . _tl } + { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl } % - \exp_args:Ne \@@_parse:nN { \tl_to_str:n {#1} } #2 + \exp_not:N \exp_args:Ne \exp_not:N \@@_parse_aux:nN + { \exp_not:N \tl_to_str:n {#1} } #2 } % \end{macrocode} % Before going to all of the effort of parsing an expression, these two % precursor functions look for a pre-defined name, either on its own or % with a trailing |!| (which is the same thing). % \begin{macrocode} -\cs_new_protected:Npn \@@_parse:nN #1#2 +\cs_new_protected:Npn \@@_parse_aux:nN #1#2 { - \tl_if_exist:cTF { l_@@_named_ #1 _tl } - { \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl } } + \tl_if_exist:cTF { l_@@_named_ #1 _prop } + { \@@_parse_set_eq:Nn #2 {#1} } { \@@_parse:Nw #2#1 ! \s_@@_stop } \@@_check_model:N #2 } +\cs_new_protected:Npn \@@_parse_set_eq:Nn #1#2 + { + \tl_if_empty:NTF \l_color_fixed_model_tl + { \exp_args:Nv \@@_parse_set_eq:nNn { l_@@_named_ #2 _tl } } + { \exp_args:NV \@@_parse_set_eq:nNn \l_color_fixed_model_tl } + #1 {#2} + } +% \end{macrocode} +% Here, we have to allow for the case where there is a fixed model: +% that can't be swept up by generic conversion as we are dealing with a +% named color. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_set_eq:nNn #1#2#3 + { + \prop_get:cnNTF + { l_@@_named_ #3 _prop } {#1} + \l_@@_value_tl + { \tl_set:Nx #2 { {#1} { \l_@@_value_tl } } } + { + \tl_set_eq:Nc \l_@@_model_tl { l_@@_named_ #3 _tl } + \prop_get:cVN { l_@@_named_ #3 _prop } \l_@@_model_tl + \l_@@_value_tl + \@@_convert:nnN + \l_@@_model_tl {#1} \l_@@_value_tl + \tl_set:Nx #2 + { + {#1} + { \l_@@_value_tl } + } + } + } \cs_new_protected:Npn \@@_parse:Nw #1#2 ! #3 \s_@@_stop { \@@_if_defined:nTF {#2} { \tl_if_blank:nTF {#3} - { \tl_set_eq:Nc #1 { l_@@_named_ #2 _tl } } + { \@@_parse_set_eq:Nn #1 {#2} } { \@@_parse_loop_init:Nnn #1 {#2} {#3} } } { \__kernel_msg_error:nnn { color } { unknown-color } {#2} - \tl_set_eq:NN \l_@@_current_tl \l_@@_named_black_tl + \tl_set:Nn \l_@@_current_tl { { gray } { 0 } } } } % \end{macrocode} @@ -562,24 +642,9 @@ \@@_extract:nNN {#2} \l_@@_next_model_tl \l_@@_next_value_tl \tl_if_eq:NNF \l_@@_model_tl \l_@@_next_model_tl { - \str_if_eq:VnT \l_@@_model_tl { gray } - { - \use:x - { - \tl_set:Nn \exp_not:N \l_@@_model_tl - { \l_@@_next_model_tl } - \tl_set:Nn \exp_not:N \l_@@_value_tl - { \l_@@_next_value_tl } - \tl_set:Nn \exp_not:N \l_next_@@_model_tl - { \l_@@_model_tl } - \tl_set:Nn \exp_not:N \l_next_@@_value_tl - { \l_@@_value_tl } - } - } - \@@_convert:VVN - \l_@@_next_model_tl - \l_@@_model_tl - \l_@@_next_value_tl + \str_if_eq:VnTF \l_@@_model_tl { gray } + { \@@_parse_gray:n {#2} } + { \@@_parse_std:n {#2} } } \tl_set:Nx \l_@@_value_tl { @@ -593,6 +658,31 @@ \@@_parse_break:w } } +% \end{macrocode} +% The \texttt{gray} model needs special handling: the models need to be +% swapped: we do that using a dedicated function. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_gray:n #1 + { + \tl_set_eq:NN \l_@@_model_tl \l_@@_next_model_tl + \tl_set:Nn \l_@@_next_model_tl { gray } + \exp_args:NnV \@@_convert:nnN { gray } \l_@@_model_tl + \l_@@_value_tl + \prop_get:cVN { l_@@_named_ #1 _prop } \l_@@_model_tl + \l_@@_next_value_tl + } +\cs_new_protected:Npn \@@_parse_std:n #1 + { + \prop_get:cVNF { l_@@_named_ #1 _prop } + \l_@@_model_tl + \l_@@_next_value_tl + { + \@@_convert:VVN + \l_@@_next_model_tl + \l_@@_model_tl + \l_@@_next_value_tl + } + } \cs_new_protected:Npn \@@_parse_break:w #1 \@@_parse_end: { } \cs_new_protected:Npn \@@_parse_end: { } % \end{macrocode} @@ -640,6 +730,9 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % % \begin{macro}[EXP] % { @@ -814,52 +907,91 @@ % will therefore always be available. The finalisation is separate from the % main function so it can also be applied to \emph{e.g.}~page color. % \begin{macrocode} -\cs_new_protected:Npn \@@_select: +\cs_new_protected:Npx \@@_select: { - \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl - \@@_select:N \l_@@_current_tl + \tl_set:Nx \exp_not:c { l_@@_named_ . _tl } + { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl } + \prop_clear:N \exp_not:c { l_@@_named_ . _prop } + \prop_put:NVx \exp_not:c { l_@@_named_ . _prop } + \exp_not:c { l_@@_named_ . _tl } + { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl } + \@@_select:N \exp_not:N \l_@@_current_tl } % \end{macrocode} % \end{macro} % % \begin{macro}{\color_select:n} % \begin{macro}{\color_select:nn} +% \begin{macro}{\@@_select_main:Nw, \@@_select_loop:Nw} +% \begin{macro}{\@@_select:nnN} +% \begin{macro}{\@@_select_swap:Nnn} % Parse the input expressions then get the backend to actually activate -% them. +% them. The main complexity here is the need to check through multiple models. +% That is done \enquote{locally} here as the approach is subtly different to +% when different models are being stored. % \begin{macrocode} \cs_new_protected:Npn \color_select:n #1 { - \color_parse:nN {#1} \l_@@_current_tl + \@@_parse:nN {#1} \l_@@_current_tl \@@_select: } \cs_new_protected:Npn \color_select:nn #1#2 { - \@@_direct:nnN {#1} {#2} \l_@@_current_tl + \@@_select_main:Nw \l_@@_current_tl + #1 / / \s_@@_mark #2 / / \s_@@_stop \@@_select: } % \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Direct model use} -% -% \begin{macro}{\@@_direct:nnN} -% Directly set a color based on a model/value combination. +% If the first color model is the fixed one, or if there is no fixed +% model, we don't need most of the data: just set up and apply the backend +% function. % \begin{macrocode} -\cs_new_protected:Npn \@@_direct:nnN #1#2#3 +\cs_new_protected:Npn \@@_select_main:Nw + #1 #2 / #3 / #4 \s_@@_mark #5 / #6 / #7 \s_@@_stop + { + \@@_select:nnN {#2} {#5} #1 + \bool_lazy_or:nnF + { \tl_if_empty_p:N \l_color_fixed_model_tl } + { \str_if_eq_p:nV {#2} \l_color_fixed_model_tl } + { \@@_select_loop:Nw #1 #3 / #4 \s_@@_mark #6 / #7 \s_@@_stop } + } +% \end{macrocode} +% If a fixed model applies, we need to check each possible value in order. +% If there is no hit at all, fall back on the generic formula-based +% interchange. +% \begin{macrocode} +\cs_new_protected:Npn \@@_select_loop:Nw + #1 #2 / #3 \s_@@_mark #4 / #5 \s_@@_stop + { + \str_if_eq:nVTF {#2} \l_color_fixed_model_tl + { \@@_select:nnN {#2} {#4} #1 } + { + \tl_if_blank:nTF {#2} + { \exp_after:wN \@@_select_swap:Nnn \exp_after:wN #1 #1 } + { \@@_select_loop:Nw #1 #3 \s_@@_mark #5 \s_@@_stop } + } + } +\cs_new_protected:Npn \@@_select:nnN #1#2#3 { \cs_if_exist:cTF { @@_parse_model_ #1 :w } { \tl_set:Nx #3 { \use:c { @@_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \s_@@_stop } - \@@_check_model:N #3 - } - { - \__kernel_msg_error:nnn { color } { unknown-model } {#1} } + { \__kernel_msg_error:nnn { color } { unknown-model } {#1} } + } +\cs_new_protected:Npn \@@_select_swap:Nnn #1#2#3 + { + \@@_convert:nVnN {#2} \l_color_fixed_model_tl {#3} \l_@@_value_tl + \tl_set:Nx #1 + { { \l_color_fixed_model_tl } { \l_@@_value_tl } } } % \end{macrocode} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % % \subsection{Defining named colors} % @@ -870,44 +1002,113 @@ % \end{macrocode} % \end{variable} % -% \begin{macro}{\@@_store:Nn} -% Store the named color unless it has an invalid name. -% \begin{macrocode} -\cs_new_protected:Npn \@@_store:Nn #1#2 +% \begin{macro}{\color_set:nn} +% \begin{macro}{\@@_set:nnn} +% \begin{macro}{\@@_set:nn} +% \begin{macro}{\@@_set:nnw} +% \begin{macro}{\color_set:nnn} +% \begin{macro}{\@@_set_loop:nw} +% \begin{macro}{\color_set_eq:nn} +% Defining named colors means working through the model list and saving +% both the \enquote{main} color and any equivalents in other models. Even +% if there is only one model, we store a |prop| as well as a |tl|, as there +% could be grouping weirdness, etc. When setting using an expression, +% we need to avoid any fixed model issues, which is done without a group as +% in \pkg{l3keys}. +% \begin{macrocode} +\cs_new_protected:Npn \color_set:nn #1#2 + { + \exp_args:NV \@@_set:nnn + \l_color_fixed_model_tl {#1} {#2} + } +\cs_new_protected:Npn \@@_set:nnn #1#2#3 + { + \tl_clear:N \l_color_fixed_model_tl + \@@_set:nn {#2} {#3} + \tl_set:Nn \l_color_fixed_model_tl {#1} + } +\cs_new_protected:Npn \@@_set:nn #1#2 { - \str_if_eq:nnF {#2} { . } + \str_if_eq:nnF {#1} { . } { - \tl_clear_new:c { l_@@_named_ #2 _tl } - \tl_set_eq:cN { l_@@_named_ #2 _tl } #1 + \@@_parse:nN {#2} \l_@@_named_tl + \tl_clear_new:c { l_@@_named_ #1 _tl } + \tl_set:cx { l_@@_named_ #1 _tl } + { \@@_model:N \l_@@_named_tl } + \prop_clear_new:c { l_@@_named_ #1 _prop } + \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl } + { \@@_values:N \l_@@_named_tl } + \@@_set:nnw {#1} {#2} #2 ! \s_@@_stop } } % \end{macrocode} -% \end{macro} -% -% \begin{macro}{\color_set:nn} -% \begin{macro}{\color_set:nnn} -% \begin{macro}{\color_set_eq:nn} -% Defining named colors has to include a step to force creation of the -% underlying token list to avoid errors when checking is enabled. +% When setting an expression-based color, there could be multiple model +% data available for one or more of the input colors. Where that is true for +% the \emph{first} named color in an expression, we re-parse the expression +% when they are also parameter-based: only |cmyk|, |gray| and |rgb| make +% any sense here. There is a bit of a performance hit but this should be +% rare and taking place during set-up. % \begin{macrocode} -\cs_new_protected:Npn \color_set:nn #1#2 +\cs_new_protected:Npn \@@_set:nnw #1#2#3 ! #4 \s_@@_stop { - \color_parse:nN {#2} \l_@@_named_tl - \@@_store:Nn \l_@@_named_tl {#1} + \clist_map_inline:nn { cmyk , gray , rgb } + { + \prop_get:cnNT { l_@@_named_ #3 _prop } {##1} \l_@@_internal_tl + { + \prop_if_in:cnF { l_@@_named_ #1 _prop } {##1} + { + \group_begin: + \tl_set:cn { l_@@_named_ #3 _tl } {##1} + \@@_parse:nN {#2} \l_@@_internal_tl + \exp_args:NNNV \group_end: + \tl_set:Nn \l_@@_internal_tl \l_@@_internal_tl + \prop_put:cxx { l_@@_named_ #1 _prop } + { \@@_model:N \l_@@_internal_tl } + { \@@_values:N \l_@@_internal_tl } + } + } + } } \cs_new_protected:Npn \color_set:nnn #1#2#3 { - \@@_direct:nnN {#2} {#3} \l_@@_named_tl - \@@_store:Nn \l_@@_named_tl {#1} + \str_if_eq:nnF {#1} { . } + { + \tl_clear_new:c { l_@@_named_ #1 _tl } + \prop_clear_new:c { l_@@_named_ #1 _prop } + \@@_set_loop:nw {#1} #2 / / \s_@@_mark #3 / / \s_@@_stop + } + } +\cs_new_protected:Npn \@@_set_loop:nw + #1#2 / #3 \s_@@_mark #4 / #5 \s_@@_stop + { + \tl_if_blank:nF {#2} + { + \@@_select:nnN {#2} {#4} \l_@@_named_tl + \tl_set:Nx \l_@@_internal_tl { \@@_model:N \l_@@_named_tl } + \tl_if_empty:cT { l_@@_named_ #1 _tl } + { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_internal_tl } + \prop_put:cVx { l_@@_named_ #1 _prop } \l_@@_internal_tl + { \@@_values:N \l_@@_named_tl } + \@@_set_loop:nw {#1} #3 \s_@@_mark #5 \s_@@_stop + } } \cs_new_protected:Npn \color_set_eq:nn #1#2 { \@@_if_defined:nTF {#2} { \tl_clear_new:c { l_@@_named_ #1 _tl } + \prop_clear_new:c { l_@@_named_ #1 _prop } \str_if_eq:nnTF {#2} { . } - { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_current_tl } - { \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl } } + { + \tl_set:cx { l_@@_named_ #1 _tl } + { \@@_model:N \l_@@_current_tl } + \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl } + { \@@_values:N \l_@@_current_tl } + } + { + \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl } + \prop_set_eq:cc { l_@@_named_ #1 _prop } { l_@@_named_ #2 _prop } + } } { \__kernel_msg_error:nnn { color } { unknown-color } {#2} @@ -920,6 +1121,7 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % A small set of colors are always defined. % \begin{macrocode} @@ -933,19 +1135,154 @@ \color_set:nnn { blue } { rgb } { 0 , 0 , 1 } % \end{macrocode} % -% \begin{variable}{\l_@@_named_._tl} +% \begin{variable}{\l_@@_named_._prop, \l_@@_named_._tl} % A special named color: this is always defined though not fixed in % definition. % \begin{macrocode} +\prop_new:c { l_@@_named_._prop } \tl_new:c { l_@@_named_._tl } -\tl_set_eq:cN { l_@@_named_._tl } \l_@@_current_tl +\tl_set:cx { l_@@_named_._tl } { \@@_model:N \l_@@_current_tl } +% \end{macrocode} +% \end{variable} +% +% \subsection{Exporting colors} +% +% \begin{macro}{\color_export:nnN} +% \begin{macro}{\color_export:nnnN} +% \begin{macro}{\@@_export:nN} +% \begin{macro}{\@@_export:nnnN} +% \begin{macrocode} +\cs_new_protected:Npn \color_export:nnN #1#2#3 + { + \group_begin: + \tl_if_exist:cT { c_@@_export_ #2 _tl } + { \tl_set_eq:Nc \l_color_fixed_model_tl { c_@@_export_ #2 _tl } } + \@@_parse:nN {#1} #3 + \@@_export:nN {#2} #3 + \exp_args:NNNV \group_end: + \tl_set:Nn #3 #3 + } +\cs_new_protected:Npn \color_export:nnnN #1#2#3#4 + { + \@@_select_main:Nw #4 + #1 / / \s_@@_mark #2 / / \s_@@_stop + \@@_export:nN {#3} #4 + } +\cs_new_protected:Npn \@@_export:nN #1#2 + { \exp_after:wN \@@_export:nnnN #2 {#1} #2 } +\cs_new:Npn \@@_export:nnnN #1#2#3#4 + { + \cs_if_exist_use:cF { @@_export_format_ #3 :nnN } + { + \__kernel_msg_error:nnn { color } { unknown-export-format } {#3} + \use_none:nnn + } + {#1} {#2} #4 + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_export_format_backend:nnN} +% Simple. +% \begin{macrocode} +\cs_new_protected:Npn \@@_export_format_backend:nnN #1#2#3 + { \tl_set:Nn #3 { {#1} {#2} } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_export:nnnNN} +% A generic auxiliary for cases where only one model is appropriate. +% \begin{macrocode} +\cs_new_protected:Npn \@@_export:nnnNN #1#2#3#4#5 + { + \str_if_eq:nnTF {#2} {#1} + { #5 #4 #3 \s_@@_stop } + { + \@@_convert:nnnN {#2} {#1} {#3} #4 + \exp_after:wN #5 \exp_after:wN #4 + #4 \s_@@_stop + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{variable} +% { +% \c_@@_export_HTML_tl , +% \c_@@_export_space-sep-cmyk_tl , +% \c_@@_export_space-sep-rgb_tl +% } +% \begin{macrocode} +\tl_const:Nn \c_@@_export_HTML_tl { rgb } +\tl_const:cn { c_@@_export_space-sep-cmyk_tl } { cmyk } +\tl_const:cn { c_@@_export_space-sep-rgb_tl } { rgb } % \end{macrocode} % \end{variable} % +% \begin{macro}{\@@_export_format_space-sep-cmyk:nnN} +% \begin{macro}{\@@_export_space-sep-cmyk:Nw} +% \begin{macrocode} +\cs_new_protected:cpx { @@_export_format_space-sep-cmyk:nnN } #1#2#3 + { + \exp_not:N \@@_export:nnnNN { cmyk } {#1} {#2} #3 + \exp_not:c { @@_export_space-sep-cmyk:Nw } + } +\cs_new_protected:cpn { @@_export_space-sep-cmyk:Nw } #1#2 \s_@@_stop + { \tl_set:Nx #1 {#2} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro} +% { +% \@@_export_format_HTML:nnN , +% \@@_export_format_space-sep-rgb:nnN +% } +% \begin{macro} +% { +% \@@_export_HTML:Nw , +% \@@_export_space-sep-rgb:Nw +% } +% \begin{macro}[EXP]{\@@_export_HTML:n} +% \textsc{html} values must be given in |rgb|: we force conversion if +% required, then do some simple maths. +% \begin{macrocode} +\cs_new_protected:Npn \@@_export_format_HTML:nnN #1#2#3 + { \@@_export:nnnNN { rgb } {#1} {#2}#3 \@@_export_HTML:Nw } +\cs_new_protected:cpx { @@_export_format_space-sep-rgb:nnN } #1#2#3 + { + \exp_not:N \@@_export:nnnNN { rgb } {#1} {#2} #3 + \exp_not:c { @@_export_space-sep-rgb:Nw } + } +\cs_new_protected:Npn \@@_export_HTML:Nw #1#2 ~ #3 ~ #4 \s_@@_stop + { + \tl_set:Nx #1 + { + \@@_export_HTML:n {#2} + \@@_export_HTML:n {#3} + \@@_export_HTML:n {#4} + } + } +\cs_new:Npn \@@_export_HTML:n #1 + { + \fp_compare:nNnTF {#1} = { 0 } + { 00 } + { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } } + } +\cs_new_protected:cpn { @@_export_space-sep-rgb:Nw } #1#2 \s_@@_stop + { \tl_set:Nx #1 {#2} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% % \subsection{Diagnostics} % % \begin{macro}{\color_show:n} -% \begin{macro}{\@@_show:nn} +% \begin{macro}{\@@_show:n} % Extract the information about a color and format for the user: the approach % is similar to the keys module here. % \begin{macrocode} @@ -954,17 +1291,20 @@ \msg_show:nnxxxx { LaTeX / color } { show } {#1} { - \@@_if_defined:nTF {#1} - { \exp_last_unbraced:Nv \@@_show:nn { l_@@_named_ #1 _tl } } - { } + \@@_if_defined:nT {#1} + { + \exp_args:Nv \@@_show:n { l_@@_named_ #1 _tl } + \prop_map_function:cN + { l_@@_named_ #1 _prop } + \msg_show_item_unbraced:nn + } } { } { } } -\cs_new:Npn \@@_show:nn #1#2 +\cs_new:Npn \@@_show:n #1 { \msg_show_item_unbraced:nn { model } {#1} - \msg_show_item_unbraced:nn { value } {#2} } % \end{macrocode} % \end{macro} @@ -979,6 +1319,12 @@ LaTeX~has~been~asked~to~use~a~color~named~'#1',~ but~this~has~never~been~defined. } +\__kernel_msg_new:nnnn { color } { unknown-export-format } + { Unknown~export~format~'#1'. } + { + LaTeX~has~been~asked~to~export~a~color~in~format~'#1',~ + but~this~has~never~been~defined. + } \__kernel_msg_new:nnnn { color } { unknown-model } { Unknown~color~model~'#1'. } { diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx index 8a20c1a3485..a39bd99f308 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx index 1f1debc79e5..43d699b64b1 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx index bf446436807..847ade5f441 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx index 6e578a694a4..15ad9e1f179 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx index b2cd3db4456..038c93dbf64 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx index 943484d811f..75af8516ae2 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx index 4f434d924b6..cfced7e0d59 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/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/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx index b995cf6fc9a..dcdfc783b74 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx index 4ba0e2cb74e..081d42e7f36 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx @@ -110,7 +110,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -1146,7 +1146,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3draw}{2020-06-18}{} +\ProvidesExplPackage{l3draw}{2020-07-17}{} {L3 Experimental core drawing support} % % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx index 73517bfe80e..9908f59c34c 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -241,7 +241,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3graphics}{2020-06-18}{} +\ProvidesExplPackage{l3graphics}{2020-07-17}{} {L3 Experimental graphics inclusion support} % % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx b/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx index 1a21347ef3b..984336443e8 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -191,7 +191,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3pdf}{2020-06-18}{} +\ProvidesExplPackage{l3pdf}{2020-07-17}{} {L3 Experimental core PDF support} % % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx index 52902e21a81..3c4fbc63363 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -167,7 +167,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3str-format}{2020-06-18}{} +\ProvidesExplPackage{l3str-format}{2020-07-17}{} {L3 Experimental string formatting} % % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx index 7da0422159b..466a4d4107e 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -136,7 +136,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3sys-shell}{2020-06-18}{} +\ProvidesExplPackage{l3sys-shell}{2020-07-17}{} {L3 Experimental system shell functions} % % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx index 68776e0572f..65c18726450 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/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/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx index 639e7ade994..7865c39b7f7 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx @@ -61,7 +61,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % @@ -687,7 +687,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3galley}{2020-06-18}{} +\ProvidesExplPackage{l3galley}{2020-07-17}{} {L3 Experimental galley code} % % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx index 59be5e01ea1..d917bdecff6 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/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/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 0710d88c5d0..e1a36c6db56 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -24,7 +24,7 @@ % %<*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/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins index 04d1e18a343..e54fe0cb51c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3.ins +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx index 4fdce60bdc6..8f60b563f75 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index c871aeb7594..3cee7e2e9e0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 8ff412298c0..5043d39d569 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index a30bed22c79..e604fe5e4f8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index a307cb02df5..d8d6bf68086 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx new file mode 100644 index 00000000000..25becd59fd2 --- /dev/null +++ b/Master/texmf-dist/source/latex/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} +% +% \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 + } + } +% +%<*package> + \cs_new_eq:NN \@@_new:N \newcatcodetable +% + } +% \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 } } +% +%<*package> + \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count } +% + } + } + { + \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} +% +% \end{macrocode} +% +% \end{implementation} +% +%\PrintIndex diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index a05860e2868..da18711b6ea 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index b19b71f3f99..8c9f29e93b1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/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 -% %<*package> \tl_set:Nn \l_@@_display_font_tl { \sffamily \tiny } % @@ -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: } % %<*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 -% %<*package> \@@_color:n {#4} % @@ -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: } % %<*package> \@@_color:n {#2} @@ -2377,9 +2371,6 @@ { 0pt } { 0pt } \hcoffin_set:Nn \l_@@_display_coord_coffin { -%<*initex> - % TODO -% %<*package> \@@_color:n {#6} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx index 178cd98b19e..a01acb8fa1c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx index 3aa7eb3998a..632e62e58be 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx +++ b/Master/texmf-dist/source/latex/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 @@ -958,6 +960,10 @@ { \__kernel_chk_cs_exist:N #1 } { } { \cs_generate_variant:Nn } + \__kernel_patch:nnn + { \__kernel_chk_var_scope:NN g #1 } + { } + { \cctab_new:N } \__kernel_patch:nnn { \__kernel_chk_var_scope:NN g #1 } { } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index 012e0d32088..8faf8635049 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index ffb7269f492..0954108c963 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index a334b443d02..bf56cdd54f9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index df60bcd3ab8..e9020851488 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index c189e4bdd95..7ee7df53475 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/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} } } % \@@_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/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx index 5f3a74fb0d0..809850d1a52 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index de8f7b5046f..0d68f05eeec 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3format.ins b/Master/texmf-dist/source/latex/l3kernel/l3format.ins index 99e9389728f..0671ed9ee67 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3format.ins +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index 3ef09ee2c7b..73e28d4b3f1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index adce22a4265..09a876ee8dd 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index fd1cffd4948..68cb42369d2 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index 8c8d4749181..a07e4fb9824 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index 93835e8c71c..aafc77e1a61 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index 67960e47fe6..498da7895c9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index 26c7ed784a3..13457604be0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index 28257218e7e..c3125a8478c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index 25e1d1cb9dc..062f0d59b48 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index 281e5339d0a..ef2092959be 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 6c68c6181e1..40332fc340a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index dcf57a15f99..a9c96002443 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index 81b652565ae..b76089b5c60 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index da04ae867c2..be62eac38b9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index a3d0ca4a8f8..7384a5f257f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index 6ab5647a82a..7a96ed28739 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index e63035f68e8..c73b661cfc5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index c9dd6209f66..77fa7d1aff1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx index 0a71938f2b2..c0fbef37454 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 56181c77b80..298ecee05e8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index f7182ea0920..5cbc7e9b09c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index 3a49253af67..03a9f2ae2b9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/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 @@ % % \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 -% -% \end{macrocode} -% % \begin{macrocode} % % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index 52d6794833d..c1f794e0158 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index a85becf5e34..790f0e3b311 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index 3368fa159bc..62474447ef2 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index 30e355eada4..3820ecdb671 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 40d829f96cb..bd935c6f602 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/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 +% . +% \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/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index 7b534be25c8..a87f9409388 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 9163b494d0e..b84c2e298a9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx index 6a910b80400..e57c165f1b0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index a6fad22d022..539881e1396 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 8a27d4b78e8..b15b61d521b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx index b8e534b4b6e..a3dde63359f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx index 2543dbebae7..c48ac585a20 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx index 00648a4b842..2946a48df37 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index a5662491e16..4944e42682a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index b10167ca25d..c315612b435 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index d12c5deeed7..cffbea2c975 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index 28452d5a2c8..334e8b7086c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-06-18} +% \date{Released 2020-07-17} % % \maketitle % -- cgit v1.2.3