From c4ee329d9de36c54e6715838a7617a385228e519 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 2 Sep 2020 21:38:04 +0000 Subject: l3 (2sep20) git-svn-id: svn://tug.org/texlive/trunk@56245 c570f23f-e606-0410-a88d-b1316a301751 --- .../l3experimental/l3benchmark/l3benchmark.dtx | 4 +- .../latex/l3experimental/l3color/l3color.dtx | 246 +++++++++------- .../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 | 2 +- .../l3experimental/l3draw/l3draw-transforms.dtx | 6 +- .../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 | 121 +++----- .../texmf-dist/source/latex/l3kernel/l3basics.dtx | 2 +- .../source/latex/l3kernel/l3bootstrap.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3box.dtx | 14 +- .../source/latex/l3kernel/l3candidates.dtx | 4 +- .../texmf-dist/source/latex/l3kernel/l3cctab.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3clist.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3coffins.dtx | 2 +- .../source/latex/l3kernel/l3color-base.dtx | 3 +- .../texmf-dist/source/latex/l3kernel/l3debug.dtx | 2 +- .../source/latex/l3kernel/l3deprecation.dtx | 18 +- Master/texmf-dist/source/latex/l3kernel/l3doc.dtx | 13 +- .../source/latex/l3kernel/l3docstrip.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3expan.dtx | 13 +- Master/texmf-dist/source/latex/l3kernel/l3file.dtx | 139 ++++++++- Master/texmf-dist/source/latex/l3kernel/l3flag.dtx | 2 +- .../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 | 2 +- .../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 | 2 +- .../source/latex/l3kernel/l3kernel-functions.dtx | 20 +- 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 | 2 +- .../texmf-dist/source/latex/l3kernel/l3names.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3prg.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3prop.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3quark.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3regex.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3seq.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3skip.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3sort.dtx | 2 +- .../source/latex/l3kernel/l3str-convert.dtx | 318 +++++++++++---------- Master/texmf-dist/source/latex/l3kernel/l3str.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3sys.dtx | 115 +++++++- .../source/latex/l3kernel/l3text-case.dtx | 4 +- .../source/latex/l3kernel/l3text-purify.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3text.dtx | 4 +- .../source/latex/l3kernel/l3tl-analysis.dtx | 2 +- Master/texmf-dist/source/latex/l3kernel/l3tl.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3token.dtx | 2 +- .../texmf-dist/source/latex/l3kernel/l3unicode.dtx | 2 +- 73 files changed, 742 insertions(+), 430 deletions(-) (limited to 'Master/texmf-dist/source/latex') diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx index 05058bdef62..80079c1c416 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -129,7 +129,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3benchmark}{2020-08-07}{} +\ProvidesExplPackage{l3benchmark}{2020-09-01}{} {L3 Experimental benchmarking} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx index 42151e2a41e..ec8266d06f3 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -59,7 +59,7 @@ % or print. Parameter-based models can describe a very large number of unique % colors, and have a varying number of \emph{axes} which define a color % space. In contrast, various proprietary models are available which define -% \emph{spot} colors. +% \emph{spot} colors (more formally separations). % % Core models are used to pass color information to output; these are % \enquote{native} to \pkg{l3color}. Core models use real numbers in the range @@ -71,31 +71,38 @@ % the components % \item \texttt{cmyk} Cyan-magenta-yellow-black color, with four axes, one for % each of the components -% \item \texttt{spot} Spot color, with one value, the name of the color -% (see \url{https://helpx.adobe.com/indesign/using/spot-process-colors.html} -% for details of the use of spot colors in print) % \end{itemize} % There are also interface models: these are convenient for users but have % to be manipulated before storing/passing to the backend. Interface models % are primarily integer-based: see below for more detail. The supported % interface models are % \begin{itemize} +% \item \texttt{Gray} Grayscale color, with a single axis running from +% $0$ (fully black) to $15$ (fully white) +% \item \texttt{hsb} Hue-saturation-brightness color, with three axes,all +% real values in the range $[0,1]$ for hue saturation and brightness % \item \texttt{Hsb} Hue-saturation-brightness color, with three axes, integer % in the range $[0,360]$ for hue, real values in the range $[0,1]$ for % saturation and brightness -% \item \texttt{HSB} Hue-saturation-brightness color, with three axes, integer -% in the range $[0,360]$ for hue, integer values in the range $[0,255]$ for -% saturation and brightness +% \item \texttt{HSB} Hue-saturation-brightness color, with three axes, integers +% in the range $[0,240]$ for hue, saturation and brightness % \item \texttt{HTML} HTML format representation of RGB color given as a % single six-digit hexadecimal number % \item \texttt{RGB} Red-green-blue color, with three axes, one for each of % the components, values as integers from $0$ to $255$ +% \item \texttt{wave} Light wavelength, a real number in the range +% $380$ to $780$ (nanometres) % \end{itemize} % All interface models are internally stored as |rgb|. % -% Additional models may be created to allow mixing of spot colors +% To allow parsing of data from \pkg{xcolor}, any leading model up the first +% \texttt{:} will be discarded; the approach of selecting an internal form +% for data is \emph{not} used in \pkg{l3color}. +% +% Additional models may be created to allow mixing of separation colors % with each other or with those from other models. See -% Section~\ref{l3color:sec:new-models} for more detail of spot color support. +% Section~\ref{l3color:sec:new-models} for more detail of color support +% for additional models. % % When color is selected by model, the \meta{values} given are specified as % a comma-separated list. The length of the list will therefore be determined @@ -327,7 +334,7 @@ % \meta{tl}. % \end{function} % -% \begin{function}{\color_export:nnN} +% \begin{function}{\color_export:nnnN} % \begin{syntax} % \cs{color_export:nnnN} \Arg{model} \Arg{value(s)} \Arg{format} \Arg{tl} % \end{syntax} @@ -405,7 +412,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3color}{2020-08-07}{} +\ProvidesExplPackage{l3color}{2020-09-01}{} {L3 Experimental color support} % \end{macrocode} % @@ -593,14 +600,12 @@ % \begin{macrocode} \cs_new_protected:Npx \@@_parse:nN #1#2 { -%<*package> \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_not:N \exp_args:Ne \exp_not:N \@@_parse_aux:nN { \exp_not:N \tl_to_str:n {#1} } #2 } @@ -822,11 +827,10 @@ % \begin{macro}[EXP] % { % \@@_parse_model_gray:w, \@@_parse_model_rgb:w, -% \@@_parse_model_cmyk:w, \@@_parse_model_spot:w +% \@@_parse_model_cmyk:w % } % \begin{macro}[EXP]{\@@_parse_number:n} % \begin{macro}[EXP]{\@@_parse_number:w} -% \begin{macro}[EXP]{\@@_parse_spot_aux:w} % Turn the input into internal form, also tidying up the number quickly. % \begin{macrocode} \cs_new:Npn \@@_parse_model_gray:w #1 , #2 \s_@@_stop @@ -850,13 +854,6 @@ \@@_parse_number:n {#4} } } -\cs_new:Npn \@@_parse_model_spot:w #1 , #2 \s_@@_stop - { - { spot } - { \@@_parse_spot_aux:w #1 ! 100 ! \s_@@_stop } - } -\cs_new:Npn \@@_parse_spot_aux:w #1 ! #2 ! #3 \s_@@_stop - { #1 ~ \fp_eval:n { #2 / 100 } } \cs_new:Npn \@@_parse_number:n #1 { \@@_parse_number:w #1 . 0 . \s_@@_stop } \cs_new:Npn \@@_parse_number:w #1 . #2 . #3 \s_@@_stop @@ -865,14 +862,34 @@ % \end{macro} % \end{macro} % \end{macro} -% \end{macro} % % \begin{macro}[EXP] % { +% \@@_parse_model_Gray:w, \@@_parse_model_hsb:w, % \@@_parse_model_Hsb:w, \@@_parse_model_HSB:w, % \@@_parse_model_HTML:w, \@@_parse_model_RGB:w % } +% \begin{macro}[EXP]{\@@_parse_model_hsb:nnn, \@@_parse_model_hsb_aux:nnn} +% \begin{macro}[EXP]{\@@_parse_model_hsb:nnnn} +% \begin{macro}[EXP]{\@@_parse_model_hsb:nnnnn} +% \begin{macro}[EXP] +% { +% \@@_parse_model_hsb_0:nnnn , +% \@@_parse_model_hsb_1:nnnn , +% \@@_parse_model_hsb_2:nnnn , +% \@@_parse_model_hsb_3:nnnn , +% \@@_parse_model_hsb_4:nnnn , +% \@@_parse_model_hsb_5:nnnn +% } +% \begin{macro}[EXP]{\@@_parse_model_wave:w} +% \begin{macro}[EXP] +% {\@@_parse_model_wave_auxi:nn, \@@_parse_model_wave_auxii:nn} +% \begin{macro}[EXP]{\@@_parse_model_wave_rho:n} % \begin{macrocode} +\cs_new:Npn \@@_parse_model_Gray:w #1 , #2 \s_@@_stop + { { gray } { \fp_eval:n { #1 / 15 } } } +\cs_new:Npn \@@_parse_model_hsb:w #1 , #2 , #3 , #4 \s_@@_stop + { \@@_parse_model_hsb:nnn {#1} {#2} {#3} } \cs_new:Npn \@@_parse_model_Hsb:w #1 , #2 , #3 , #4 \s_@@_stop { \exp_args:Ne \@@_parse_model_hsb:nnn { \fp_eval:n { #1 / 360 } } @@ -923,9 +940,9 @@ \cs_new:Npn \@@_parse_model_HSB:w #1 , #2 , #3 , #4 \s_@@_stop { \exp_args:Neee \@@_parse_model_hsb:nnn - { \fp_eval:n {#1 / 360} } - { \fp_eval:n {#2 / 255} } - { \fp_eval:n {#3 / 255} } + { \fp_eval:n {#1 / 240} } + { \fp_eval:n {#2 / 240} } + { \fp_eval:n {#3 / 240} } } \cs_new:Npn \@@_parse_model_HTML:w #1 , #2 \s_@@_stop { \@@_parse_model_HTML_aux:w #1 0 0 0 0 0 0 \s_@@_stop } @@ -948,6 +965,83 @@ } } % \end{macrocode} +% Following the description in the \pkg{xcolor} manual. As we always use |rgb|, +% there is no need to find the sixth, we just pas the information straight +% to the |hsb| auxiliary defined earlier. +% \begin{macrocode} +\cs_new:Npn \@@_parse_model_wave:w #1 , #2 \s_@@_stop + { + { rgb } + { + \fp_compare:nNnTF {#1} < { 420 } + { \@@_parse_model_wave_auxi:nn {#1} { 0.3 + 0.7 * (#1 - 380) / 40 } + } + { + \fp_compare:nNnTF {#1} > { 700 } + { \@@_parse_model_wave_auxi:nn {#1} { 0.3 + 0.7 * (#1 - 780) / -80 } } + { \@@_parse_model_wave_auxi:nn {#1} { 1 } } + } + } + } +\cs_new:Npn \@@_parse_model_wave_auxi:nn #1#2 + { + \fp_compare:nNnTF {#1} < { 440 } + { + \@@_parse_model_wave_auxii:nn + { 4 + \@@_parse_model_wave_rho:n { (#1 - 440) / -60 } } + {#2} + } + { + \fp_compare:nNnTF {#1} < { 490 } + { + \@@_parse_model_wave_auxii:nn + { 4 - \@@_parse_model_wave_rho:n { (#1 - 440) / 50 } } + {#2} + } + { + \fp_compare:nNnTF {#1} < { 510 } + { + \@@_parse_model_wave_auxii:nn + { 2 + \@@_parse_model_wave_rho:n { (#1 - 510) / -20 } } + {#2} + } + { + \fp_compare:nNnTF {#1} < { 580 } + { + \@@_parse_model_wave_auxii:nn + { 2 - \@@_parse_model_wave_rho:n { (#1 - 510) / 70 } } + {#2} + } + { + \fp_compare:nNnTF {#1} < { 645 } + { + \@@_parse_model_wave_auxii:nn + { \@@_parse_model_wave_rho:n { (#1 - 645) / -65 } } + {#2} + } + { \@@_parse_model_wave_auxii:nn { 0 } {#2} } + } + } + } + } + } +\cs_new:Npn \@@_parse_model_wave_auxii:nn #1#2 + { + \exp_args:Neee \@@_parse_model_hsb_aux:nnn + { \fp_eval:n {#1} } + { 1 } + { \@@_parse_model_wave_rho:n {#2} } + } +\cs_new:Npn \@@_parse_model_wave_rho:n #1 + { \fp_eval:n { min(1, max(0,#1) ) } } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % \end{macro} % % \subsection{Selecting colors (and color models)} @@ -1127,6 +1221,7 @@ % \begin{macro}{\@@_set:nn} % \begin{macro}{\@@_set:nnw} % \begin{macro}{\color_set:nnn} +% \begin{macro}{\@@_set_colon:nnw} % \begin{macro}{\@@_set_loop:nw} % \begin{macro}{\color_set_eq:nn} % Defining named colors means working through the model list and saving @@ -1189,15 +1284,28 @@ } } } -\cs_new_protected:Npn \color_set:nnn #1#2#3 +\cs_new_protected:Npx \color_set:nnn #1#2#3 { - \str_if_eq:nnF {#1} { . } + \exp_not:N \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 + \exp_not:N \@@_set_colon:nnw {#1} {#3} + #2 \c_colon_str \c_colon_str \exp_not:N \s_@@_stop } } +\use:x + { + \cs_new_protected:Npn \exp_not:N \@@_set_colon:nnw + ##1##2 ##3 \c_colon_str ##4 \c_colon_str + ##5 \exp_not:N \s_@@_stop + } + { + \tl_if_blank:nTF {#4} + { \@@_set_loop:nw {#1} #3 } + { \@@_set_loop:nw {#1} #4 } + / / \s_@@_mark #2 / / \s_@@_stop + } \cs_new_protected:Npn \@@_set_loop:nw #1#2 / #3 \s_@@_mark #4 / #5 \s_@@_stop { @@ -1242,9 +1350,10 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % A small set of colors are always defined. -% \begin{macrocode} +% \begin{macrocode} \color_set:nnn { black } { gray } { 0 } \color_set:nnn { white } { gray } { 1 } \color_set:nnn { cyan } { cmyk } { 1 , 0 , 0 , 0 } @@ -1253,7 +1362,7 @@ \color_set:nnn { red } { rgb } { 1 , 0 , 0 } \color_set:nnn { green } { rgb } { 0 , 1 , 0 } \color_set:nnn { blue } { rgb } { 0 , 0 , 1 } -% \end{macrocode} +% \end{macrocode} % % \begin{variable}{\l_@@_named_._prop, \l_@@_named_._tl} % A special named color: this is always defined though not fixed in @@ -1457,9 +1566,6 @@ % \begin{macro}{\@@_model_convert:nnn} % \begin{macro}{\@@_model_separation_cielab:nnnnnn} % \begin{macro}{\@@_model_separation_cielab:nnnnnnn} -% \begin{macro}{\@@_model_separation_init:nnnnn} -% \begin{macro}{\@@_model_separation_init_cielab:n} -% \begin{macro}{\@@_model_separation_init_cielab:nnnnn} % Set up a new model: in general this has to be handled by a family-dependent % function. To avoid some \enquote{interesting} questions with casing, we % fold the case of the family name. The key--value list should always be @@ -1590,7 +1696,7 @@ } \@@_model_convert:nnn {#1} { cmyk } { rgb } \@@_model_convert:nnn {#1} { cmyk } { gray } - \@@_model_separation_init:nnnnn {#2} { /DeviceCMYK } { } + \@@_backend_separation_init:nnnnn {#2} { /DeviceCMYK } { } { 0 ~ 0 ~ 0 ~ 0 } { #3 ~ #4 ~ #5 ~ #6 } } \cs_new_protected:Npn \@@_model_separation_rgb:nnnnnn #1#2#3#4#5#6 @@ -1603,7 +1709,7 @@ } \@@_model_convert:nnn {#1} { rgb } { cmyk } \@@_model_convert:nnn {#1} { rgb } { gray } - \@@_model_separation_init:nnnnn {#2} { /DeviceRGB } { } + \@@_backend_separation_init:nnnnn {#2} { /DeviceRGB } { } { 0 ~ 0 ~ 0 } { #3 ~ #4 ~ #5 } } \cs_new_protected:Npn \@@_model_separation_gray:nnnnnn #1#2#3#4#5#6 @@ -1623,7 +1729,7 @@ \fp_eval:n {##1 * #3} ~ \fp_eval:n {##1 * #3} } - \@@_model_separation_init:nnnnn {#2} { /DeviceGray } { } { 0 } {#3} + \@@_backend_separation_init:nnnnn {#2} { /DeviceGray } { } { 0 } {#3} } % \end{macrocode} % Generic model conversion \emph{via} an alternative intermediate. @@ -1665,8 +1771,8 @@ { \tl_if_exist:cTF { c_@@_model_whitepoint_cielab_ #1 _tl } { - \@@_model_separation_init_cielab:n {#1} - \@@_model_separation_init_cielab:nnnnn {#2} {#3} {#4} {#5} {#6} + \@@_backend_separation_init_cielab:n {#1} + \@@_backend_separation_init_cielab:nnnnn {#2} {#3} {#4} {#5} {#6} \cs_new:cpn { @@_convert_ #2 _cmyk:w } ##1 ~ ##2 \s_@@_stop { 0 ~ 0 ~ 0 ~ 1 } \cs_new:cpn { @@_convert_ #2 _rgb:w } ##1 ~ ##2 \s_@@_stop @@ -1680,66 +1786,6 @@ } } % \end{macrocode} -% Initialising the PDF structures needs two parts: creating an object -% containing the \enquote{real} name of the Separation, then adding a reference -% to that to each page. The latter uses the internal name of the \texttt{cs}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_model_separation_init:nnnnn #1#2#3#4#5 - { - \pdf_object_now:nx { array } - { - /Separation - / \str_convert_pdfname:n {#1} ~ #2 ~ - << - /FunctionType ~ 2 - /Domain ~ [0 ~ 1] - \tl_if_blank:nF {#3} { /Range ~ [#3] } - /C0 ~ [#4] ~ - /C1 ~ [#5] /N ~ 1 - >> - } - \use:x - { - \pdfcoredict_gput:nnn - { Page / Resources / ColorSpace } - { color \int_use:N \g_@@_separation_int } - { \pdf_object_last: } - } - } -\cs_if_exist:NF \pdf_object_now:nn - { \cs_gset_protected:Npn \@@_model_separation_init:nnnnn #1#2#3#4#5 { } } -% \end{macrocode} -% For CIELAB colors, we need one object per document for the illuminant, -% plus initialisation of the color space referencing that object. -% \begin{macrocode} -\cs_new_protected:Npn \@@_model_separation_init_cielab:n #1 - { - \pdf_object_new:nn { @@_illuminant_cielab_ #1 } { array } - \pdf_object_write:nx { @@_illuminant_cielab_ #1 } - { - /Lab ~ - << - /WhitePoint ~ - [ \tl_use:c { c_@@_model_whitepoint_cielab_ #1 _tl } ] - /Range ~ [ \c_@@_model_range_lab_tl ] - >> - } - } -\cs_if_exist:NF \pdf_object_new:nn - { \cs_gset_protected:Npn \@@_model_separation_init_cielab:n #1 { } } -\cs_new_protected:Npn \@@_model_separation_init_cielab:nnnnn #1#2#3#4#5 - { - \@@_model_separation_init:nnnnn - {#2} - { \pdf_object_ref:n { @@_illuminant_cielab_ #1 } } - { \c_@@_model_range_lab_tl } - { 100 ~ 0 ~ 0 } - { #3 ~ #4 ~ #5 } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} % \end{macro} % \end{macro} % \end{macro} 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 8ab5d0c59c6..940dd8c31de 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-08-07} +% \date{Released 2020-09-01} % % \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 ad1238cd2f2..50a8fd81c16 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-08-07} +% \date{Released 2020-09-01} % % \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 5da166a75dd..cba6efdb760 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-08-07} +% \date{Released 2020-09-01} % % \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 3c2b8395a97..b6d9ba08372 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-08-07} +% \date{Released 2020-09-01} % % \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 7ecb49df287..88d08888843 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-08-07} +% \date{Released 2020-09-01} % % \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 e232869980b..0ca26af807e 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-08-07} +% \date{Released 2020-09-01} % % \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 67010269486..4b3298e0d1a 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % 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 e9a06f67d05..6329c05fb9d 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -70,8 +70,12 @@ % these to fully understand them. % \item \cs{pgftransformarrow}: Likely to be done when other arrow functions % are added. +% \item \cs{pgftransformationadjustments}: Used mainly by CircuiTi\textit{k}Z +% although also for shapes, likely needs more use cases before addressing. % \item \cs{pgflowlevelsynccm}, \cs{pgflowlevel}: Likely to be added when % use cases are encountered in other parts of the code. +% \item \cs{pgfviewboxscope}: Seems very speicalied, need to understand the +% requirements here. % \end{itemize} % % \begin{variable}{\l_@@_matrix_active_bool} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx index 11ed7487c13..841eae28c0d 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -1136,7 +1136,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3draw}{2020-08-07}{} +\ProvidesExplPackage{l3draw}{2020-09-01}{} {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 fd030ce6434..15f963e60d0 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -240,7 +240,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3graphics}{2020-08-07}{} +\ProvidesExplPackage{l3graphics}{2020-09-01}{} {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 403410f99d9..7be0907d0b8 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -190,7 +190,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3pdf}{2020-08-07}{} +\ProvidesExplPackage{l3pdf}{2020-09-01}{} {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 e44bde9dff5..8264409fb4f 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -166,7 +166,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3str-format}{2020-08-07}{} +\ProvidesExplPackage{l3str-format}{2020-09-01}{} {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 e368a925825..f3a06c643b0 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -135,7 +135,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3sys-shell}{2020-08-07}{} +\ProvidesExplPackage{l3sys-shell}{2020-09-01}{} {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 7e030c8e3b6..d890d28428c 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -675,7 +675,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xcoffins}{2020-08-07}{} +\ProvidesExplPackage{xcoffins}{2020-09-01}{} {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 8ed82bcce4f..73779d70a31 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -686,7 +686,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3galley}{2020-08-07}{} +\ProvidesExplPackage{l3galley}{2020-09-01}{} {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 0d9bf34149d..77557731ad1 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -734,7 +734,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xgalley}{2020-08-07}{} +\ProvidesExplPackage{xgalley}{2020-09-01}{} {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 85284e594ac..9e38bfb6dbb 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-08-07}% +\def\ExplFileDate{2020-09-01}% %<*driver> \documentclass[full]{l3doc} \usepackage{graphicx} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2020-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -924,10 +924,13 @@ % \item[dvips] Use the \texttt{dvips} driver. % \item[dvipdfmx] Use the \texttt{dvipdfmx} driver. % \item[dvisvgm] Use the \texttt{dvisvgm} driver. -% \item[pdfmode] Use the \texttt{pdfmode} driver (direct PDF output from -% \pdfTeX{} or \LuaTeX{}). -% \item[xdvipdfmx] Use the \texttt{xdvipdfmx} driver (\XeTeX{} only). +% \item[luatex] Use the direct PDF output mode of \LuaTeX{} +% \item[pdftex] Use the direct PDF output mode of \pdfTeX{} +% \item[xetex] Use the \XeTeX{} version of the \texttt{dvipdfmx} driver. % \end{itemize} +% For historical reasons, there is also \texttt{pdfmode} as an equivalent of +% \texttt{luatex} or \texttt{pdftex}, and \texttt{xdvipdfmx} as +% an equivalent to \texttt{xetex}, but these are deprecated % % \DescribeOption{suppress-backend-headers} % The \texttt{suppress-backend-headers} option suppresses loading of @@ -1064,8 +1067,10 @@ % \url{https://github.com/latex3/latex3/issues/781}). % \begin{macrocode} %<*2ekernel> -\global\expandafter\let\csname\detokenize - {c__kernel_expl_date_tl}\endcsname\ExplFileDate +\unless\ifcsname\detokenize{c__kernel_expl_date_tl}\endcsname + \global\expandafter\let\csname\detokenize + {c__kernel_expl_date_tl}\endcsname\ExplFileDate +\fi % % \end{macrocode} % \end{macro} @@ -1243,86 +1248,50 @@ %<@@=expl> % \end{macrocode} % -% Several times users reported this error when loading \pkg{expl3}: -% \begin{verbatim} -% ! Undefined control sequence. -% l.67 \bool -% _new:N \g__expl_reload_bool -% \end{verbatim} -% raised in the reload block below. This happens because the reload -% check below assumes that if the boolean \cs{g_@@_reload_bool} doesn't -% exist, this file is being loaded for the first time, and \pkg{expl3} -% syntax is on. This is a bit of a stretch for assumptions, but it's -% valid as long as everything's in sync. However the problem reported -% happened because of a stray format file in the user tree which didn't -% have the reload code defined here (commit \texttt{1d16336}), so the -% \cs{g_@@_reload_bool} doesn't exist, but \pkg{expl3} syntax is off, -% thus the error. -% -% At this point, if we have \cs{c__kernel_expl_date_tl} defined, the -% situation is straightforward: if it matches \cs{ExplLoaderFileDate}, -% then everything's as expected, so no need to worry. If it doesn't, -% then the current version of \pkg{expl3} differs from the one in the -% format, so raise a fatal error: the bahaviour is too unpredictable to -% continue safely. Also, if the error is to be raised, then we're -% reloading, which means that \pkg{expl3} syntax is off, so we turn it -% on for the message. +% At this point, if we have \cs{c__kernel_expl_date_tl} defined, just +% call the \cs{__kernel_dependency_version_check:Nn} auxiliary to check +% if it matches \cs{ExplLoaderFileDate}. Here the test is performed +% only if \cs{c__kernel_expl_date_tl} exists because this file can be +% loaded in a \LaTeXe{} format without \pkg{expl3} preloaded, where that +% token list doesn't exist. +% +% This is all done in the \texttt{package} \pkg{docstrip} guard because +% it doesn't apply to \pkg{expl3.ltx}. % \begin{macrocode} +%<*package> \ifcsname\detokenize{c__kernel_expl_date_tl}\endcsname - \expandafter\ifx\csname\detokenize - {c__kernel_expl_date_tl}\endcsname\ExplLoaderFileDate - \else - \ExplSyntaxOn - \__kernel_msg_set:nnn { kernel } { mismatched-expl3 } - { - Mismatched~expl3~detected!~Loading~expl3~will~abort. - \\ \\ - The~version~of~expl3~preloaded~in~LaTeX~is~ - \c__kernel_expl_date_tl,~but~the~version~of~expl3~you~are~ - trying~to~load~is~dated~\ExplLoaderFileDate.~This~is~most~ - likely~due~to~a~stray~format~file~in~the~user~tree.~Please~ - make~sure~that~your~LaTeX~format~is~updated. - } - \exp_after:wN \ExplSyntaxOff \use:n - { - \__kernel_msg_critical:nn { kernel } { mismatched-expl3 } - \use:c { fi: } \use:c { fi: } - } - \fi + \expandafter\@firstofone +\else % \end{macrocode} -% If \cs{c__kernel_expl_date_tl} does \emph{not} exist, then we're on -% uncharted lands (that is, any time prior to the version that -% introduced this token list :-). Two cases might be here, depending -% whether \pkg{expl3} is loaded into the kernel or not. If we're loading -% \pkg{expl3} \enquote{normally} as a package, \pkg{expl3} syntax is on. -% Otherwise it's already loaded in the kernel and we're reloading -% \file{expl3.sty} so (\file{expl3-code.tex} doesn't load again and) -% \pkg{expl3} syntax is off. +% If \cs{c__kernel_expl_date_tl} does \emph{not} exist we may be loading +% in a format without \pkg{expl3} preloaded or in the earlier (although +% still compatible) version in which the error mentioned above showed +% up. If loading as a package, \file{expl3-code.tex} got read and here +% the \pkg{expl3} syntax is on. Otherwise it was already loaded in a +% sligtly older kernel, so we fire the incompatibility error message and +% abort loading. % \begin{macrocode} -\else \ifodd\csname\detokenize{l__kernel_expl_bool}\endcsname % \end{macrocode} -% Package mode; all should be fine, since \file{expl3.sty} and -% \file{expl3-code.tex} are both loaded in one go, so versions should -% match (if they don't, it's detected above). -% Also, we've just tested that \pkg{expl3} syntax is on, so the reload -% test below will return false and \cs{bool_new:N} will run correctly. +% In package mode all files are loaded in one go, so versions will +% match. We just have to set \cs{c__kernel_expl_date_tl} so that +% further dependencies don't break: % \begin{macrocode} + \global\expandafter\let\csname\detokenize + {c__kernel_expl_date_tl}\endcsname\ExplLoaderFileDate + \expandafter\expandafter + \expandafter\@gobble \else % \end{macrocode} -% In this branch we're reloading, but there are still two cases to -% consider (sigh\ldots); whether the version preloaded in the format -% is recent enough to have \cs{g_@@_reload_bool} (2020-06-18 and -% later) or not. If the boolean is there, we have to do nothing -% because right ahead we deal with this case. -% If it is not, we just have to create it: +% And reloading in an incompatible version is an error: % \begin{macrocode} - \ExplSyntaxOn - \bool_if_exist:NF \g_@@_reload_bool - { \bool_new:N \g_@@_reload_bool } - \ExplSyntaxOff + \expandafter\expandafter + \expandafter\@firstofone \fi \fi + {\csname\detokenize{__kernel_dependency_version_check:Nn}\endcsname + \ExplLoaderFileDate{expl3.sty}}% +% % \end{macrocode} % % Here we can also detect whether we're reloading. This code goes into @@ -1403,7 +1372,7 @@ \keys_define:nn { sys } { backend .choices:nn = - { dvipdfmx , dvips , dvisvgm , pdfmode , xdvipdfmx } + { dvipdfmx , dvips , dvisvgm , luatex , pdftex , pdfmode , xdvipdfmx , xetex } { \sys_load_backend:n {#1} } , check-declarations .code:n = { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index ba422a79612..c6559136c15 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index cf749116d62..bcb2f715627 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index 8adeb3fb6d4..30ba3c75533 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -370,6 +370,14 @@ % and then stores the result inside the \meta{box}. % \end{function} % +% \begin{function}[added = 2020-08-25]{\hbox_overlap_center:n} +% \begin{syntax} +% \cs{hbox_overlap_center:n} \Arg{contents} +% \end{syntax} +% Typesets the \meta{contents} into a horizontal box of zero width +% such that material protrudes equally to both sides of the insertion point. +% \end{function} +% % \begin{function}[updated = 2017-04-05]{\hbox_overlap_right:n} % \begin{syntax} % \cs{hbox_overlap_right:n} \Arg{contents} @@ -1381,10 +1389,12 @@ % \end{macro} % \end{macro} % -% \begin{macro}{\hbox_overlap_left:n, \hbox_overlap_right:n} +% \begin{macro}{\hbox_overlap_center:n, \hbox_overlap_left:n, \hbox_overlap_right:n} % Put a zero-sized box with the contents pushed against one side (which % makes it stick out on the other) directly into the input stream. % \begin{macrocode} +\cs_new_protected:Npn \hbox_overlap_center:n #1 + { \hbox_to_zero:n { \tex_hss:D #1 \tex_hss:D } } \cs_new_protected:Npn \hbox_overlap_left:n #1 { \hbox_to_zero:n { \tex_hss:D #1 } } \cs_new_protected:Npn \hbox_overlap_right:n #1 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index 7e2cf8df90d..fc5d83dcd59 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -206,7 +206,7 @@ % % \begin{function}[added = 2019-05-08]{\ior_shell_open:Nn} % \begin{syntax} -% \cs{ior_shell_open:nN} \meta{stream} \Arg{shell~command} +% \cs{ior_shell_open:Nn} \meta{stream} \Arg{shell~command} % \end{syntax} % Opens the \emph{pseudo}-file created by the output of the % \meta{shell command} for reading using \meta{stream} as the diff --git a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx index a8c063b944f..2d908820f78 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2020-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index f32ad49748b..e050d065536 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index f828834daf4..b9f73a8f1c2 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx index 628a4c6f230..10199c298e9 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -66,6 +66,7 @@ % \cs{color_group_end:} % \end{syntax} % Creates a color group: one used to \enquote{trap} color settings. +% This grouping is built in to for example \cs{hbox_set:Nn}. % \end{function} % % \begin{function}[added = 2011-09-03]{\color_ensure_current:} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx index 5f8f0b93e9f..c7c0f70058a 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index 10dae76668e..6eebef3b6b8 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -662,6 +662,10 @@ % % \subsection{Deprecated \pkg{l3str} functions} % +% \begin{macrocode} +%<@@=str> +% \end{macrocode} +% % \begin{macro}[EXP, deprecated = 2022-07-01] % { % \str_lower_case:n, \str_lower_case:f, @@ -684,6 +688,18 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[EXP, deprecated = 2022-07-01] +% {\str_declare_eight_bit_encoding:nnn} +% This command was made internal, with one more argument. There is no +% easy way to compute a reasonable value for that extra argument so we +% take a value that is big enough to accomodate all of Unicode. +% \begin{macrocode} +\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { } +\cs_gset_protected:Npn \str_declare_eight_bit_encoding:nnn #1 + { \@@_declare_eight_bit_encoding:nnnn {#1} { 1114112 } } +% \end{macrocode} +% \end{macro} +% % \subsection{Deprecated \pkg{l3seq} functions} % % \begin{macro}[EXP, deprecated = 2023-01-01] diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index 9e7498e265f..8721d50f4bb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -61,7 +61,7 @@ and all files in that bundle must be distributed together. % % %<*driver> -\ProvidesFile{l3doc.dtx}[2017/03/18 L3 Experimental documentation class] +\ProvidesFile{l3doc.dtx}[2020/08/21 L3 Experimental documentation class] \documentclass{l3doc} \usepackage{framed,lipsum} \begin{document} @@ -79,7 +79,7 @@ and all files in that bundle must be distributed together. % % \title{The \cls{l3doc} class} % \author{\Team} -% \date{Released 2020-08-07} +% \date{Released 2020-09-01} % \maketitle % \tableofcontents % @@ -3154,7 +3154,10 @@ and all files in that bundle must be distributed together. \vbox_set:Nn \l_@@_macro_box { \vbox_unpack_drop:N \l_@@_macro_box - \hbox { \llap { \@@_print_macroname:nN {#1} #2 \ } } + \hbox { \llap { \__codedoc_print_macroname:nN {#1} #2 + \MacroFont % <----- without it the \ is in lmr10 if a link is made + \ + } } } \int_incr:N \l_@@_macro_int } @@ -3716,7 +3719,7 @@ and all files in that bundle must be distributed together. { \cs_set:Npn \currentfile{#1.dtx} } \int_compare:nNnTF \@auxout = \@partaux { \@latexerr{\string\include\space cannot~be~nested}\@eha } - { \@docinclude #1 } + { \@docinclude {#1} } } % \end{macrocode} % @@ -3750,7 +3753,7 @@ and all files in that bundle must be distributed together. { \cs_set_eq:NN \ttfamily\relax \cs_gset:Npx \filekey - { \filekey, \thepart = { \ttfamily \currentfile } } + { \filekey,~ \thepart = { \ttfamily \currentfile } } } \DocInput{\currentfile} \cs_set_eq:NN \PrintIndex \@ltxdoc@PrintIndex diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index 24a061d1925..e8a835dfb6a 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index d2ef71dac4e..df3b71d9a88 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -504,6 +504,7 @@ % { % \exp_args:NNNo, % \exp_args:NNNV, +% \exp_args:NNNv, % \exp_args:Nccc, % \exp_args:NcNc, % \exp_args:NcNo, @@ -1365,7 +1366,8 @@ % % \begin{macro}[EXP] % { -% \exp_args:NNNV, \exp_args:NcNc, \exp_args:NcNo, +% \exp_args:NNNV, \exp_args:NNNv, +% \exp_args:NcNc, \exp_args:NcNo, % \exp_args:Ncco, % } % A few more that we can hand-tune. @@ -1377,6 +1379,13 @@ \exp_after:wN #3 \exp_after:wN { \exp:w \@@_eval_register:N #4 } } +\cs_new:Npn \exp_args:NNNv #1#2#3#4 + { + \exp_after:wN #1 + \exp_after:wN #2 + \exp_after:wN #3 + \exp_after:wN { \exp:w \@@_eval_register:c {#4} } + } \cs_new:Npn \exp_args:NcNc #1#2#3#4 { \exp_after:wN #1 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 553c5419cbc..81e509bcbca 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -2868,12 +2868,10 @@ % \end{macro} % \end{macro} % \begin{variable}{\g_@@_internal_ior} -% A reserved stream to test for file existence, if required. +% A reserved stream to test for file existence (if required), and for +% opening a shell. % \begin{macrocode} -\bool_lazy_or:nnF - { \cs_if_exist_p:N \tex_filesize:D } - { \sys_if_engine_luatex_p: } - { \ior_new:N \g_@@_internal_ior } +\ior_new:N \g_@@_internal_ior % \end{macrocode} % \end{variable} % @@ -3180,7 +3178,7 @@ } } { \cs_new_eq:NN \@@_timestamp:n \tex_filemoddate:D } -\cs_if_exist:NF \tex_filemoddate:D +\cs_if_exist:NF \@@_timestamp:n { \prg_set_conditional:Npnn \file_compare_timestamp:nNn #1#2#3 { p , T , F , TF } @@ -3471,7 +3469,7 @@ } % \end{macrocode} % -% \subsection{GetIfInfo} +% \subsection{GetIdInfo} % % \begin{macro}{\GetIdInfo} % \begin{macro}{\@@_id_info_auxi:w, \@@_id_info_auxii:w, \@@_id_info_auxiii:w} @@ -3545,6 +3543,131 @@ % \end{macro} % \end{macro} % +% \subsection{Checking the version of kernel dependencies} +% +% \begin{macro}{\__kernel_dependency_version_check:Nn} +% \begin{macro}{\__kernel_dependency_version_check:nn} +% \begin{macro}{\@@_kernel_dependency_compare:nnn,\@@_parse_version:w} +% This function is responsible for checking if dependencies of the +% \LaTeX3 kernel match the version preloaded in the \LaTeXe{} kernel. +% If versions don't match, the function attempts to tell why by +% searching for a possible stray format file. +% +% The function starts by checking that the kernel date is defined, and +% if not zero is used to force the error route. The kernel date is +% then compared with the argument requested date (ususally the +% packaging date of the dependency). If the kernel date is less than +% the required date, it's an error and the loading should abort. +% \begin{macrocode} +\cs_new_protected:Npn \__kernel_dependency_version_check:Nn #1 + { \exp_args:NV \__kernel_dependency_version_check:nn #1 } +\cs_new_protected:Npn \__kernel_dependency_version_check:nn #1 + { + \cs_if_exist:NTF \c__kernel_expl_date_tl + { + \exp_args:NV \@@_kernel_dependency_compare:nnn + \c__kernel_expl_date_tl {#1} + } + { \@@_kernel_dependency_compare:nnn { 0000-00-00 } {#1} } + } +\cs_new_protected:Npn \@@_kernel_dependency_compare:nnn #1 #2 #3 + { + \int_compare:nNnT + { \@@_parse_version:w #1 \s_@@_stop } < + { \@@_parse_version:w #2 \s_@@_stop } + { \@@_mismatched_dependency_error:nn {#2} {#3} } + } +\cs_new:Npn \@@_parse_version:w #1 - #2 - #3 \s_@@_stop {#1#2#3} +% \end{macrocode} +% +% \begin{macro}{\@@_mismatched_dependency_error:nn} +% If the versions differ, then we try to give the user some guidance. +% This function starts by taking the engine name \cs{c_sys_engine_str} +% and replacing |tex| by |latex|, then building a command of the form: +% \begin{texttt} +% kpsewhich --all --engine=\meta{engine} \meta{format}[-dev].fmt +% \end{texttt} +% to query the format files available. A shell is opened and each +% line is read into a sequence. +% \begin{macrocode} +\cs_new_protected:Npn \@@_mismatched_dependency_error:nn #1 #2 + { + \exp_args:NNx \ior_shell_open:Nn \g_@@_internal_ior + { + kpsewhich ~ --all ~ + --engine = \c_sys_engine_exec_str + \c_space_tl \c_sys_engine_format_str + \tl_if_empty:NF \development@branch@name { -dev } .fmt + } + \seq_clear:N \l_@@_tmp_seq + \ior_map_inline:Nn \g_@@_internal_ior + { \seq_put_right:Nn \l_@@_tmp_seq {##1} } + \ior_close:N \g_@@_internal_ior +% \end{macrocode} +% Now define a some shorthands so that we can use \cs{@latex@error} +% (almost) easily: +% \begin{macrocode} + \group_begin: + \cs_set:Npn \\ { \MessageBreak } + \cs_set_eq:NN \ \c_space_tl + \@latex@error + { + Mismatched~LaTeX~support~files~detected. \\ + Loading~'#2'~aborted! +% \end{macrocode} +% \cs{c__kernel_expl_date_tl} may not exist, due to an older format, +% so only print the dates when the sentinel token list exists: +% \begin{macrocode} + \tl_if_exist:NT \c__kernel_expl_date_tl + { + \\ \\ + The~L3~programming~layer~in~the~LaTeX~format \\ + is~dated~\c__kernel_expl_date_tl,~but~in~your~TeX~ + tree~the~files~require \\ at~least~#1. + } + \use_none:n + } + { +% \end{macrocode} +% The sequence containing the format files should have exactly one +% item: the format file currently being run. If that's the case, the +% cause of the error is not that, so print a generic help with some +% possible causes. If more than one format file was found, then print +% the list to the user, with appropriate indications of what's in the +% system and what's in the user tree. +% \begin{macrocode} + \int_compare:nNnTF { \seq_count:N \l_@@_tmp_seq } > 1 + { + The~cause~seems~to~be~an~old~format~file~in~the~user~tree. \\ + LaTeX~found~these~files: + \seq_map_tokens:Nn \l_@@_tmp_seq { \\~-~\use:n } \\ + Try~deleting~the~file~in~the~user~tree~then~run~LaTeX~again. + } + { + The~most~likely~causes~are: + \\~-~A~recent~format~generation~failed; + \\~-~A~stray~format~file~in~the~user~tree~which~needs~ + to~be~removed~or~rebuilt; + \\~-~You~are~running~a~manually~installed~version~of~#2 \\ + \ \ \ which~is~incompatible~with~the~version~in~LaTeX. \\ + } + \\ + LaTeX~will~abort~loading~the~incompatible~support~files~ + but~this~may~lead~to \\ later~errors.~Please~ensure~that~ + your~LaTeX~format~is~correctly~regenerated. + } + \group_end: +% \end{macrocode} +% And finish by ending the current file. +% \begin{macrocode} + \tex_endinput:D + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% % \subsection{Messages} % % \begin{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 9bc6f9de6f8..a45167ea89d 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index 8f06b76ea40..3476c0349c0 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-08-07} +% \date{Released 2020-09-01} % \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 38fd8b13668..82b4dad3291 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index ae77fc4be2e..9cfc1c0bd0a 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index e16a947e6c7..252ecb7ce0a 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index fc8789101d9..13ee5ed1924 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index f7566ff062e..f6e24d3074c 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index d36cbb30035..45712a48b5e 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index e56abc6bb17..5d6f46a2384 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index 6dd9a63d701..458575e3dc8 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index 487f48fa7cd..21892fcb941 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 8f7ef9afdc0..8b748ed363b 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-08-07} +% \date{Released 2020-09-01} % \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 c5c85d20a3d..3fd98aeb8eb 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index f1743be720b..0f9a1c301aa 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index 1a2775935b8..3dafd988816 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index ac08971cd0d..e9e15036440 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index 208ec1cfe53..b80aee90392 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index 793ea280316..b28b06a3078 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -101,6 +101,19 @@ % the \meta{follow-on}. % \end{function} % +% \begin{function}{ +% \__kernel_dependency_version_check:Nn, +% \__kernel_dependency_version_check:nn, +% } +% \begin{syntax} +% \cs{__kernel_dependency_version_check:Nn} \Arg{\cs{date}} \Arg{file} +% \cs{__kernel_dependency_version_check:nn} \Arg{date} \Arg{file} +% \end{syntax} +% Checks if the loaded version of the \pkg{expl3} kernel is at least \meta{date}, +% required by \meta{file}. If the kernel date is older than \meta{date}, the +% loading of \meta{file} is aborted and an error is raised. +% \end{function} +% % \begin{function}{\__kernel_deprecation_code:nn} % \begin{syntax} % \cs{__kernel_deprecation_code:nn} \Arg{error code} \Arg{working code} @@ -125,6 +138,11 @@ % set by \cs{ExplSyntaxOn}/\cs{ExplSyntaxOff}. % \end{variable} % +% \begin{variable}{\c__kernel_expl_date_tl} +% A token list containing the release date of the \pkg{l3kernel} preloaded +% in \LaTeXe{} used to check if dependencies match. +% \end{variable} +% % \begin{function}{\__kernel_file_missing:n} % \begin{syntax} % \cs{__kernel_file_missing:n} \Arg{name} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 9c5216ceb6a..fcbee8893dc 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx index 33d3749515b..f3ca1a1af81 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 01686ced0da..deb78363d07 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index f95f4ddabd4..fa5c81c7da4 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index d070bb29528..9b53598aca9 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index c993560bf78..2b655614006 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index d8923d2177c..79f5eaa2dca 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index d0adf2a00c7..b03af55b49a 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index dcc408e48b9..19871166938 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index b0a1638170b..337fd891832 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index 9987d4f57cd..7aad033c333 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 808d6214d0f..fdfe7dc3ad0 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx index 324066cd414..fed3e38c494 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -199,19 +199,6 @@ % basis with non-ASCII codepoints escaped using hashes. % \end{function} % -% \section[Creating 8-bit mappings]{Creating $8$-bit mappings} -% -% \begin{function}{\str_declare_eight_bit_encoding:nnn} -% \begin{syntax} -% \cs{str_declare_eight_bit_encoding:nnn} \Arg{name} \Arg{mapping} \Arg{missing} -% \end{syntax} -% Declares the encoding \meta{name} to map bytes to Unicode -% characters according to the \meta{mapping}, and map those bytes -% which are not mentioned in the \meta{mapping} either to the -% replacement character (if they appear in \meta{missing}), or to -% themselves. -% \end{function} -% % \section{Possibilities, and things to do} % % Encoding/escaping-related tasks. @@ -261,16 +248,13 @@ % \subsubsection{Variables and constants} % % \begin{macro}{\@@_tmp:w} -% \begin{variable}{\l_@@_internal_int} % \begin{variable}{\l_@@_internal_tl} % Internal scratch space for some functions. % \begin{macrocode} \cs_new_protected:Npn \@@_tmp:w { } \tl_new:N \l_@@_internal_tl -\int_new:N \l_@@_internal_int % \end{macrocode} % \end{variable} -% \end{variable} % \end{macro} % % \begin{variable}{\g_@@_result_tl} @@ -1093,159 +1077,193 @@ % % \subsubsection{8-bit encodings} % -% This section will be entirely rewritten: it is not yet clear in what -% situations 8-bit encodings are used, hence I don't know what exactly -% should be optimized. The current approach is reasonably efficient to -% convert long strings, and it scales well when using many different -% encodings. An approach based on csnames would have a smaller constant -% load time for each individual conversion, but has a large hash table -% cost. Using a range of \tn{count} registers works for decoding, but -% not for encoding: one possibility there would be to use a binary tree -% for the mapping of Unicode characters to bytes, stored as a box, one -% per encoding. -% -% Since the section is going to be rewritten, documentation lacks. -% -% All the 8-bit encodings which \pkg{l3str} supports rely on the same -% internal functions. -% -% \begin{macro}{\str_declare_eight_bit_encoding:nnn} -% All the 8-bit encoding definition file start with -% \cs{str_declare_eight_bit_encoding:nnn} \Arg{encoding name} -% \Arg{mapping} \Arg{missing bytes}. The \meta{mapping} argument is a -% token list of pairs \Arg{byte} \Arg{Unicode} expressed in uppercase -% hexadecimal notation. The \meta{missing} argument is a token list -% of \Arg{byte}. Every \meta{byte} which does not appear in the -% \meta{mapping} nor the \meta{missing} lists maps to the same code -% point in Unicode. -% \begin{macrocode} -\cs_new_protected:Npn \str_declare_eight_bit_encoding:nnn #1#2#3 +% It is not clear in what situations 8-bit encodings are used, hence it +% is not clear what should be optimized. The current approach is +% reasonably efficient to convert long strings, and it scales well when +% using many different encodings. +% +% The data needed to support a given 8-bit encoding is stored in a file +% that consists of a single function call +% \begin{quote}\ttfamily +% \cs{@@_declare_eight_bit_encoding:nnnn} \Arg{name} \Arg{modulo} +% \Arg{mapping} \Arg{missing} +% \end{quote} +% This declares the encoding \meta{name} to map bytes to Unicode +% characters according to the \meta{mapping}, and map those bytes which +% are not mentioned in the \meta{mapping} either to the replacement +% character (if they appear in \meta{missing}), or to themselves. The +% \meta{mapping} argument is a token list of pairs \Arg{byte} +% \Arg{Unicode} expressed in uppercase hexadecimal notation. The +% \meta{missing} argument is a token list of \Arg{byte}. Every +% \meta{byte} which does not appear in the \meta{mapping} nor the +% \meta{missing} lists maps to itself in Unicode, so for instance the +% \texttt{latin1} encoding has empty \meta{mapping} and \meta{missing} +% lists. The \meta{modulo} is a (decimal) integer between $256$ and +% $558$ inclusive, modulo which all Unicode code points supported by the +% encodings must be different. +% +% We use two integer arrays per encoding. When decoding we only use the +% \texttt{decode} integer array, with entry $n+1$ (offset needed because +% integer array indices start at~$1$) equal to the Unicode code point +% that corresponds to the $n$-th byte in the encoding under +% consideration, or $-1$ if the given byte is invalid in this encoding. +% When encoding we use both arrays: upon seeing a code point~$n$, we +% look up the entry ($1$~plus) $n$ modulo some number $M$ in the +% \texttt{encode} array, which tells us the byte that might encode the +% given Unicode code point, then we check in the \texttt{decode} array +% that indeed this byte encodes the Unicode code point we want. Here, +% $M$ is an encoding-dependent integer between $256$ and $558$ (it turns +% out), chosen so that among the Unicode code points that can be validly +% represented in the given encoding, no pair of code points have the +% same value modulo~$M$. +% +% \begin{macro} +% { +% \@@_declare_eight_bit_encoding:nnnn, +% \@@_declare_eight_bit_aux:NNnnn, +% \@@_declare_eight_bit_loop:Nnn, +% \@@_declare_eight_bit_loop:Nn +% } +% Loop through both lists of bytes to fill in the \texttt{decode} +% integer array, then fill the \texttt{encode} array accordingly. +% For bytes that are invalid in the given encoding, store $-1$ in the +% \texttt{decode} array. +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_eight_bit_encoding:nnnn #1 { \tl_set:Nn \l_@@_internal_tl {#1} \cs_new_protected:cpn { @@_convert_decode_#1: } { \@@_convert_decode_eight_bit:n {#1} } \cs_new_protected:cpn { @@_convert_encode_#1: } { \@@_convert_encode_eight_bit:n {#1} } - \tl_const:cn { c_@@_encoding_#1_tl } {#2} - \tl_const:cn { c_@@_encoding_#1_missing_tl } {#3} + \exp_args:Ncc \@@_declare_eight_bit_aux:NNnnn + { g_@@_decode_#1_intarray } { g_@@_encode_#1_intarray } + } +\cs_new_protected:Npn \@@_declare_eight_bit_aux:NNnnn #1#2#3#4#5 + { + \intarray_new:Nn #1 { 256 } + \int_step_inline:nnn { 0 } { 255 } + { \intarray_gset:Nnn #1 { 1 + ##1 } {##1} } + \@@_declare_eight_bit_loop:Nnn #1 + #4 { \s_@@_stop \prg_break: } { } + \prg_break_point: + \@@_declare_eight_bit_loop:Nn #1 + #5 { \s_@@_stop \prg_break: } + \prg_break_point: + \intarray_new:Nn #2 {#3} + \int_step_inline:nnn { 0 } { 255 } + { + \int_compare:nNnF { \intarray_item:Nn #1 { 1 + ##1 } } = { -1 } + { + \intarray_gset:Nnn #2 + { + 1 + + \int_mod:nn { \intarray_item:Nn #1 { 1 + ##1 } } + { \intarray_count:N #2 } + } + {##1} + } + } + } +\cs_new_protected:Npn \@@_declare_eight_bit_loop:Nnn #1#2#3 + { + \@@_use_none_delimit_by_s_stop:w #2 \s_@@_stop + \intarray_gset:Nnn #1 { 1 + "#2 } { "#3 } + \@@_declare_eight_bit_loop:Nnn #1 + } +\cs_new_protected:Npn \@@_declare_eight_bit_loop:Nn #1#2 + { + \@@_use_none_delimit_by_s_stop:w #2 \s_@@_stop + \intarray_gset:Nnn #1 { 1 + "#2 } { -1 } + \@@_declare_eight_bit_loop:Nn #1 } % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_convert_decode_eight_bit:n} -% \begin{macro}{\@@_decode_eight_bit_load:nn} -% \begin{macro}{\@@_decode_eight_bit_load_missing:n} -% \begin{macro}[EXP]{\@@_decode_eight_bit_char:N} -%^^A todo: document +% \begin{macro}[rEXP]{\@@_decode_eight_bit_aux:n, \@@_decode_eight_bit_aux:Nn} +% The map from bytes to Unicode code points is in the \texttt{decode} +% array corresponding to the given encoding. Define \cs{@@_tmp:w} and +% pass it successively all bytes in the string. It produces an +% internal representation with suitable \cs{s_@@} inserted, and the +% corresponding code point is obtained by looking it up in the integer +% array. If the entry is $-1$ then issue a replacement character and +% raise the flag indicating that there was an error. % \begin{macrocode} \cs_new_protected:Npn \@@_convert_decode_eight_bit:n #1 { - \group_begin: - \int_zero:N \l_@@_internal_int - \exp_last_unbraced:Nx \@@_decode_eight_bit_load:nn - { \tl_use:c { c_@@_encoding_#1_tl } } - { \s_@@_stop \prg_break: } { } - \prg_break_point: - \exp_last_unbraced:Nx \@@_decode_eight_bit_load_missing:n - { \tl_use:c { c_@@_encoding_#1_missing_tl } } - { \s_@@_stop \prg_break: } - \prg_break_point: - \flag_clear:n { str_error } - \@@_convert_gmap:N \@@_decode_eight_bit_char:N - \@@_if_flag_error:nnx { str_error } { decode-8-bit } {#1} - \group_end: - } -\cs_new_protected:Npn \@@_decode_eight_bit_load:nn #1#2 - { - \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop - \tex_dimen:D "#1 = \l_@@_internal_int sp \scan_stop: - \tex_skip:D \l_@@_internal_int = "#1 sp \scan_stop: - \tex_toks:D \l_@@_internal_int \exp_after:wN { \int_value:w "#2 } - \int_incr:N \l_@@_internal_int - \@@_decode_eight_bit_load:nn + \cs_set:Npx \@@_tmp:w + { + \exp_not:N \@@_decode_eight_bit_aux:Nn + \exp_not:c { g_@@_decode_#1_intarray } + } + \flag_clear:n { str_error } + \@@_convert_gmap:N \@@_tmp:w + \@@_if_flag_error:nnx { str_error } { decode-8-bit } {#1} } -\cs_new_protected:Npn \@@_decode_eight_bit_load_missing:n #1 +\cs_new:Npn \@@_decode_eight_bit_aux:Nn #1#2 { - \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop - \tex_dimen:D "#1 = \l_@@_internal_int sp \scan_stop: - \tex_skip:D \l_@@_internal_int = "#1 sp \scan_stop: - \tex_toks:D \l_@@_internal_int \exp_after:wN - { \int_use:N \c_@@_replacement_char_int } - \int_incr:N \l_@@_internal_int - \@@_decode_eight_bit_load_missing:n + #2 \s_@@ + \exp_args:Nf \@@_decode_eight_bit_aux:n + { \intarray_item:Nn #1 { 1 + `#2 } } + \s_@@ } -\cs_new:Npn \@@_decode_eight_bit_char:N #1 +\cs_new:Npn \@@_decode_eight_bit_aux:n #1 { - #1 \s_@@ - \if_int_compare:w \tex_dimen:D `#1 < \l_@@_internal_int - \if_int_compare:w \tex_skip:D \tex_dimen:D `#1 = `#1 \exp_stop_f: - \tex_the:D \tex_toks:D \tex_dimen:D - \fi: + \if_int_compare:w #1 < \c_zero_int + \flag_raise:n { str_error } + \int_value:w \c_@@_replacement_char_int + \else: + #1 \fi: - \int_value:w `#1 \s_@@ } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} -% \end{macro} % % \begin{macro}{\@@_convert_encode_eight_bit:n} -% \begin{macro}{\@@_encode_eight_bit_load:nn} -% \begin{macro}[rEXP]{\@@_encode_eight_bit_char:n} -% \begin{macro}[rEXP]{\@@_encode_eight_bit_char_aux:n} -%^^A todo: document -% \begin{macrocode} +% \begin{macro}[rEXP]{\@@_encode_eight_bit_aux:nnN, \@@_encode_eight_bit_aux:NNn} +% It is not practical to make an integer array with indices in the +% full Unicode range, so we work modulo some number, which is simply +% the size of the \texttt{encode} integer array for the given +% encoding. This gives us a candidate byte for representing a given +% Unicode code point. Of course taking the modulo leads to collisions +% so we check in the \texttt{decode} array that the byte we got is +% indeed correct. Otherwise the Unicode code point we started from is +% simply not representable in the given encoding. +% \begin{macrocode} +\int_new:N \l_@@_modulo_int \cs_new_protected:Npn \@@_convert_encode_eight_bit:n #1 { - \group_begin: - \int_zero:N \l_@@_internal_int - \exp_last_unbraced:Nx \@@_encode_eight_bit_load:nn - { \tl_use:c { c_@@_encoding_#1_tl } } - { \s_@@_stop \prg_break: } { } - \prg_break_point: - \flag_clear:n { str_error } - \@@_convert_gmap_internal:N \@@_encode_eight_bit_char:n - \@@_if_flag_error:nnx { str_error } { encode-8-bit } {#1} - \group_end: - } -\cs_new_protected:Npn \@@_encode_eight_bit_load:nn #1#2 - { - \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop - \tex_dimen:D "#2 = \l_@@_internal_int sp \scan_stop: - \tex_skip:D \l_@@_internal_int = "#2 sp \scan_stop: - \exp_args:NNf \tex_toks:D \l_@@_internal_int - { \@@_output_byte:n { "#1 } } - \int_incr:N \l_@@_internal_int - \@@_encode_eight_bit_load:nn + \cs_set:Npx \@@_tmp:w + { + \exp_not:N \@@_encode_eight_bit_aux:NNn + \exp_not:c { g_@@_encode_#1_intarray } + \exp_not:c { g_@@_decode_#1_intarray } + } + \flag_clear:n { str_error } + \@@_convert_gmap_internal:N \@@_tmp:w + \@@_if_flag_error:nnx { str_error } { encode-8-bit } {#1} } -\cs_new:Npn \@@_encode_eight_bit_char:n #1 +\cs_new:Npn \@@_encode_eight_bit_aux:NNn #1#2#3 { - \if_int_compare:w #1 > \c_max_register_int - \flag_raise:n { str_error } - \else: - \if_int_compare:w \tex_dimen:D #1 < \l_@@_internal_int - \if_int_compare:w \tex_skip:D \tex_dimen:D #1 = #1 \exp_stop_f: - \tex_the:D \tex_toks:D \tex_dimen:D #1 \exp_stop_f: - \exp_after:wN \exp_after:wN \exp_after:wN \use_none:nn - \fi: - \fi: - \@@_encode_eight_bit_char_aux:n {#1} - \fi: + \exp_args:Nf \@@_encode_eight_bit_aux:nnN + { + \intarray_item:Nn #1 + { 1 + \int_mod:nn {#3} { \intarray_count:N #1 } } + } + {#3} + #2 } -\cs_new:Npn \@@_encode_eight_bit_char_aux:n #1 +\cs_new:Npn \@@_encode_eight_bit_aux:nnN #1#2#3 { - \if_int_compare:w #1 > \c_@@_max_byte_int - \flag_raise:n { str_error } - \else: - \@@_output_byte:n {#1} - \fi: + \int_compare:nNnTF { \intarray_item:Nn #3 { 1 + #1 } } = {#2} + { \@@_output_byte:n {#1} } + { \flag_raise:n { str_error } } } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} -% \end{macro} % % \subsection{Messages} % @@ -2664,7 +2682,7 @@ % family, we keep track only of differences, and of unassigned bytes. % \begin{macrocode} %<*iso88591> -\str_declare_eight_bit_encoding:nnn { iso88591 } +\@@_declare_eight_bit_encoding:nnnn { iso88591 } { 256 } { } { @@ -2674,7 +2692,7 @@ % % \begin{macrocode} %<*iso88592> -\str_declare_eight_bit_encoding:nnn { iso88592 } +\@@_declare_eight_bit_encoding:nnnn { iso88592 } { 399 } { { A1 } { 0104 } { A2 } { 02D8 } @@ -2741,7 +2759,7 @@ % % \begin{macrocode} %<*iso88593> -\str_declare_eight_bit_encoding:nnn { iso88593 } +\@@_declare_eight_bit_encoding:nnnn { iso88593 } { 384 } { { A1 } { 0126 } { A2 } { 02D8 } @@ -2786,7 +2804,7 @@ % % \begin{macrocode} %<*iso88594> -\str_declare_eight_bit_encoding:nnn { iso88594 } +\@@_declare_eight_bit_encoding:nnnn { iso88594 } { 383 } { { A1 } { 0104 } { A2 } { 0138 } @@ -2846,7 +2864,7 @@ % % \begin{macrocode} %<*iso88595> -\str_declare_eight_bit_encoding:nnn { iso88595 } +\@@_declare_eight_bit_encoding:nnnn { iso88595 } { 374 } { { A1 } { 0401 } { A2 } { 0402 } @@ -2950,7 +2968,7 @@ % % \begin{macrocode} %<*iso88596> -\str_declare_eight_bit_encoding:nnn { iso88596 } +\@@_declare_eight_bit_encoding:nnnn { iso88596 } { 344 } { { AC } { 060C } { BB } { 061B } @@ -3040,7 +3058,7 @@ % % \begin{macrocode} %<*iso88597> -\str_declare_eight_bit_encoding:nnn { iso88597 } +\@@_declare_eight_bit_encoding:nnnn { iso88597 } { 498 } { { A1 } { 2018 } { A2 } { 2019 } @@ -3129,7 +3147,7 @@ % % \begin{macrocode} %<*iso88598> -\str_declare_eight_bit_encoding:nnn { iso88598 } +\@@_declare_eight_bit_encoding:nnnn { iso88598 } { 308 } { { AA } { 00D7 } { BA } { 00F7 } @@ -3206,7 +3224,7 @@ % % \begin{macrocode} %<*iso88599> -\str_declare_eight_bit_encoding:nnn { iso88599 } +\@@_declare_eight_bit_encoding:nnnn { iso88599 } { 352 } { { D0 } { 011E } { DD } { 0130 } @@ -3222,7 +3240,7 @@ % % \begin{macrocode} %<*iso885910> -\str_declare_eight_bit_encoding:nnn { iso885910 } +\@@_declare_eight_bit_encoding:nnnn { iso885910 } { 383 } { { A1 } { 0104 } { A2 } { 0112 } @@ -3278,7 +3296,7 @@ % % \begin{macrocode} %<*iso885911> -\str_declare_eight_bit_encoding:nnn { iso885911 } +\@@_declare_eight_bit_encoding:nnnn { iso885911 } { 369 } { { A1 } { 0E01 } { A2 } { 0E02 } @@ -3379,7 +3397,7 @@ % % \begin{macrocode} %<*iso885913> -\str_declare_eight_bit_encoding:nnn { iso885913 } +\@@_declare_eight_bit_encoding:nnnn { iso885913 } { 399 } { { A1 } { 201D } { A5 } { 201E } @@ -3445,7 +3463,7 @@ % % \begin{macrocode} %<*iso885914> -\str_declare_eight_bit_encoding:nnn { iso885914 } +\@@_declare_eight_bit_encoding:nnnn { iso885914 } { 529 } { { A1 } { 1E02 } { A2 } { 1E03 } @@ -3486,7 +3504,7 @@ % % \begin{macrocode} %<*iso885915> -\str_declare_eight_bit_encoding:nnn { iso885915 } +\@@_declare_eight_bit_encoding:nnnn { iso885915 } { 383 } { { A4 } { 20AC } { A6 } { 0160 } @@ -3504,7 +3522,7 @@ % % \begin{macrocode} %<*iso885916> -\str_declare_eight_bit_encoding:nnn { iso885916 } +\@@_declare_eight_bit_encoding:nnnn { iso885916 } { 558 } { { A1 } { 0104 } { A2 } { 0105 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 466519ac8c2..9685c6d40fc 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 16cdfe6f3d5..b7dd54d2e85 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -105,6 +105,22 @@ % |luatex|, |pdftex|, |ptex|, |uptex| or |xetex|. % \end{variable} % +% \begin{variable}[added = 2020-08-20]{\c_sys_engine_exec_str} +% The name of the standard executable for the current \TeX{} engine given +% as a lower case string: one of |luatex|, +% |luahbtex|, |pdftex|, |eptex|, |euptex| or |xetex|. +% \end{variable} +% +% \begin{variable}[added = 2020-08-20]{\c_sys_engine_format_str} +% The name of the preloaded format for the current \TeX{} run given +% as a lower case string: one of +% |lualatex| (or |dvilualatex|), +% |pdflatex| (or |latex|), |platex|, |uplatex| or |xelatex| for \LaTeX{}, +% similar names for plain \TeX{} (except \pdfTeX{} in DVI mode yields +% |etex|), and |cont-en| for Con\TeX{}t (i.e.~the +% \tn{fmtname}). +% \end{variable} +% % \section{Output format} % % \begin{function}[added = 2015-09-19, EXP, pTF] @@ -252,7 +268,7 @@ % Execute \meta{tokens} through shell escape at shipout. % \end{function} % -% \subsection{Loading configuration data} +% \section{Loading configuration data} % % \begin{function}[added = 2019-09-12]{\sys_load_backend:n} % \begin{syntax} @@ -277,7 +293,7 @@ % back deprecations, respectively. % \end{function} % -% \subsection{Final settins} +% \subsection{Final settings} % % \begin{function}[added = 2019-10-06]{\sys_finalise:} % \begin{syntax} @@ -361,6 +377,72 @@ % \end{variable} % \end{macro} % +% \begin{variable}{\c_sys_engine_exec_str,\c_sys_engine_format_str} +% Take the functions defined above, and set up the engine and format +% names. \cs{c_sys_engine_exec_str} differs from \cs{c_sys_engine_str} +% as it is the \emph{actual} engine name, not a \enquote{filtered} +% version. It differs for |ptex| and |uptex|, which have a leading +% |e|, and for |luatex|, because \LaTeX{} uses the \Lua HB\TeX{} +% engine. +% +% \cs{c_sys_engine_format_str} is quite similar to +% \cs{c_sys_engine_str}, except that it differentiates |pdflatex| from +% |latex| (which is \pdfTeX{} in DVI mode). This differentiation, +% however, is reliable only if the user doesn't change +% \cs{tex_pdfoutput:D} before loading this code. +% \begin{macrocode} +\str_const:Nx \c_sys_engine_exec_str + { + \sys_if_engine_pdftex:T { pdf } + \sys_if_engine_xetex:T { xe } + \sys_if_engine_ptex:T { ep } + \sys_if_engine_uptex:T { eup } + \sys_if_engine_luatex:T + { + lua \lua_now:e + { + if (pcall(require, 'luaharfbuzz')) then ~ + tex.print("hb") ~ + end + } + } + tex + } +\str_const:Nx \c_sys_engine_format_str + { + \cs_if_exist:NTF \fmtname + { + \bool_lazy_or:nnTF + { \str_if_eq_p:Vn \fmtname { plain } } + { \str_if_eq_p:Vn \fmtname { LaTeX2e } } + { + \sys_if_engine_pdftex:T + { \int_compare:nNnT { \tex_pdfoutput:D } = { 1 } { pdf } } + \sys_if_engine_xetex:T { xe } + \sys_if_engine_ptex:T { p } + \sys_if_engine_uptex:T { up } + \sys_if_engine_luatex:T + { + \int_compare:nNnT { \tex_pdfoutput:D } = { 0 } { dvi } + lua + } + \str_if_eq:VnTF \fmtname { LaTeX2e } + { latex } + { + \bool_lazy_and:nnT + { \sys_if_engine_pdftex_p: } + { \int_compare_p:nNn { \tex_pdfoutput:D } = { 0 } } + { e } + tex + } + } + { \fmtname } + } + { unknown } + } +% \end{macrocode} +% \end{variable} +% % \subsubsection{Randomness} % % This candidate function is placed there because @@ -415,22 +497,35 @@ \str_case:VnF #1 { { dvisvgm } { } - { xdvipdfmx } { } + { xdvipdfmx } { \tl_gset:Nn #1 { xetex } } + { xetex } { } } { \__kernel_msg_error:nnxx { sys } { wrong-backend } - #1 { xdvipdfmx } - \tl_gset:Nn #1 { xdvipdfmx } + #1 { xetex } + \tl_gset:Nn #1 { xetex } } } { \sys_if_output_pdf:TF { - \str_if_eq:VnF #1 { pdfmode } + \str_if_eq:VnTF #1 { pdfmode } { - \__kernel_msg_error:nnxx { sys } { wrong-backend } - #1 { pdfmode } - \tl_gset:Nn #1 { pdfmode } + \sys_if_engine_luatex:TF + { \tl_gset:Nn #1 { luatex } } + { \tl_gset:Nn #1 { pdftex } } + } + { + \bool_lazy_or:nnF + { \str_if_eq_p:Vn #1 { luatex } } + { \str_if_eq_p:Vn #1 { pdftex } } + { + \__kernel_msg_error:nnxx { sys } { wrong-backend } + #1 { \sys_if_engine_luatex:TF { luatex } { pdftex } } + \sys_if_engine_luatex:TF + { \tl_gset:Nn #1 { luatex } } + { \tl_gset:Nn #1 { pdftex } } + } } } { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx index 0f56576b23c..23d0b331f0b 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -408,7 +408,7 @@ { \@@_if_recursion_tail_stop_do:Nn #4 { \use:c { @@_change_case_letterlike_ #1 :nnN } {#1} {#2} #3 } - \cs_if_eq:NNTF #3 #4 + \str_if_eq:nnTF {#3} {#4} { \@@_use_i_delimit_by_q_recursion_stop:nw { \@@_change_case_exclude:nnNn {#1} {#2} #3 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx index 9978eb3cc05..3dfb06a8a33 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx index b1246336dac..a8774c069b3 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % @@ -875,7 +875,7 @@ { \@@_if_recursion_tail_stop_do:Nn #2 { \@@_expand_letterlike:N #1 } - \cs_if_eq:NNTF #2 #1 + \str_if_eq:nnTF {#1} {#2} { \@@_use_i_delimit_by_q_recursion_stop:nw { \@@_expand_exclude:Nn #1 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index 14af0c466e2..56360865678 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index 5e088e45584..315db1ace01 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index 11f4fc4bcd0..544a721886c 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index 3c55fdfc85a..35f71b70cad 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-08-07} +% \date{Released 2020-09-01} % % \maketitle % -- cgit v1.2.3