diff options
author | Karl Berry <karl@freefriends.org> | 2022-04-11 20:14:43 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-04-11 20:14:43 +0000 |
commit | 9dc9eb0cc555a34fc566da8be3a89891f9e12898 (patch) | |
tree | 6f5790ed1de99f6b4c6cb30b34ad2b3e983f90f5 /Master/texmf-dist/source/latex | |
parent | 81d082bcfbaee9189138d6ff85256e047409a769 (diff) |
l3 (11apr22)
git-svn-id: svn://tug.org/texlive/trunk@63007 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex')
82 files changed, 1147 insertions, 900 deletions
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx index d7c3c6e4c38..f4bf61fe70b 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -70,27 +70,27 @@ % \begin{macrocode} \ProvidesExplFile %<*dvipdfmx> - {l3backend-dvipdfmx.def}{2022-02-07}{} + {l3backend-dvipdfmx.def}{2022-04-10}{} {L3 backend support: dvipdfmx} %</dvipdfmx> %<*dvips> - {l3backend-dvips.def}{2022-02-07}{} + {l3backend-dvips.def}{2022-04-10}{} {L3 backend support: dvips} %</dvips> %<*dvisvgm> - {l3backend-dvisvgm.def}{2022-02-07}{} + {l3backend-dvisvgm.def}{2022-04-10}{} {L3 backend support: dvisvgm} %</dvisvgm> %<*luatex> - {l3backend-luatex.def}{2022-02-07}{} + {l3backend-luatex.def}{2022-04-10}{} {L3 backend support: PDF output (LuaTeX)} %</luatex> %<*pdftex> - {l3backend-pdftex.def}{2022-02-07}{} + {l3backend-pdftex.def}{2022-04-10}{} {L3 backend support: PDF output (pdfTeX)} %</pdftex> %<*xetex> - {l3backend-xetex.def}{2022-02-07}{} + {l3backend-xetex.def}{2022-04-10}{} {L3 backend support: XeTeX} %</xetex> % \end{macrocode} @@ -395,35 +395,6 @@ % \end{macro} % % \begin{macrocode} -%<@@=sys> -% \end{macrocode} -% -% \begin{macro}{\c__kernel_sys_dvipdfmx_version_int} -% A short excursion into the |sys| module to set up the backend version -% information. -% \begin{macrocode} -\group_begin: - \cs_set:Npn \@@_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2} - \sys_get_shell:nnNTF { extractbb~--version } - { \char_set_catcode_space:n { `\ } } - \l_@@_internal_tl - { - \int_const:Nn \c__kernel_sys_dvipdfmx_version_int - { - \exp_after:wN \@@_tmp:w \l_@@_internal_tl - \q_stop - } - } - { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } } -\group_end: -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%<@@=> -% \end{macrocode} -% -% \begin{macrocode} %</dvipdfmx|xetex> % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx index 1d3450c78ca..a732d605641 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx index 064c55fa606..815b41302a5 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -203,54 +203,50 @@ % In \texttt{(x)dvipdfmx}, the base color stack is not set up, so we have to % force that, as well as providing a mechanism more generally. % \begin{macrocode} -\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } } +\int_new:N \g_@@_backend_stack_int +\cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3 { - \int_new:N \g_@@_backend_stack_int - \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3 + \int_gincr:N \exp_not:N \g_@@_backend_stack_int + \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int } + \use:x { - \int_gincr:N \exp_not:N \g_@@_backend_stack_int - \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int } - \use:x + \__kernel_backend_first_shipout:n { - \__kernel_backend_first_shipout:n + \__kernel_backend_literal:n { - \__kernel_backend_literal:n - { - pdfcolorstackinit ~ - \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int - \c_space_tl - \exp_not:N \tl_if_blank:nF {#2} { #2 ~ } - (#3) - } + pdfcolorstackinit ~ + \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int + \c_space_tl + \exp_not:N \tl_if_blank:nF {#2} { #2 ~ } + (#3) } - } - } - \cs_if_exist:cTF { main@pdfcolorstack } - { - \int_set:Nn \l_@@_backend_stack_int - { \int_use:c { main@pdfcolorstack } } - } - { - \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int - { page ~ direct } { 0 ~ g ~ 0 ~ G } - \int_set_eq:NN \l_@@_backend_stack_int - \c_@@_backend_main_stack_int - \int_const:cn { main@pdfcolorstack } { \c_@@_backend_main_stack_int } + } } + } +\cs_if_exist:cTF { main@pdfcolorstack } + { + \int_set:Nn \l_@@_backend_stack_int + { \int_use:c { main@pdfcolorstack } } + } + { + \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int + { page ~ direct } { 0 ~ g ~ 0 ~ G } + \int_set_eq:NN \l_@@_backend_stack_int + \c_@@_backend_main_stack_int + \int_const:cn { main@pdfcolorstack } { \c_@@_backend_main_stack_int } + } % \end{macrocode} % The backend automatically restores the stack color from the \enquote{classical} % approach (\texttt{pdf:bcolor}) after a scope. That will be an issue for us, so % we manually ensure that the one we are using is inserted. % \begin{macrocode} - \cs_gset_protected:Npn \__kernel_backend_scope_end: +\cs_gset_protected:Npn \__kernel_backend_scope_end: + { + \__kernel_backend_literal:n { x:grestore } + \__kernel_backend_literal:x { - \__kernel_backend_literal:n { x:grestore } - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_use:N \g_@@_backend_stack_int \c_space_tl current - } + pdfcolorstack ~ + \int_use:N \g_@@_backend_stack_int \c_space_tl current } } % \end{macrocode} @@ -261,26 +257,23 @@ % \begin{macro}{\__kernel_color_backend_stack_pop:n} % Simple enough but needs a version check. % \begin{macrocode} -\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } +\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2 { - \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2 + \__kernel_backend_literal:x { - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_eval:n {#1} ~ - push ~ (#2) - } + pdfcolorstack ~ + \int_eval:n {#1} ~ + push ~ (#2) } - \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx } - \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1 + } +\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx } +\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1 + { + \__kernel_backend_literal:x { - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_eval:n {#1} ~ - pop - } + pdfcolorstack ~ + \int_eval:n {#1} ~ + pop } } % \end{macrocode} @@ -440,10 +433,6 @@ % % \subsubsection{\texttt{dvipmdfx}/\XeTeX{}} % -% \begin{macrocode} -%<*dvipdfmx|xetex> -% \end{macrocode} -% % These backends have the most possible approaches: it recognises both % \texttt{dvips}-based color specials and it's own format, plus one can % include PDF statements directly. Recent releases also have a color stack @@ -452,32 +441,6 @@ % we have. Thus it is used in preference to the \texttt{dvips}-style interface % or the \enquote{native} color specials (which have only one stack). % -% \begin{macro} -% { -% \@@_backend_select_cmyk:n , -% \@@_backend_select_gray:n , -% \@@_backend_select_rgb:n -% } -% \begin{macro}{\@@_backend_reset:} -% Push the data to the stack. -% \begin{macrocode} -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \@@_backend_select_cmyk:n #1 - { \__kernel_backend_literal:n { pdf: bc ~ [#1] } } - \cs_gset_eq:NN \@@_backend_select_gray:n \@@_backend_select_cmyk:n - \cs_gset_eq:NN \@@_backend_select_rgb:n \@@_backend_select_cmyk:n - \cs_gset_protected:Npn \@@_backend_reset: - { \__kernel_backend_literal:n { pdf: ec } } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macrocode} -%</dvipdfmx|xetex> -% \end{macrocode} -% % \subsection{Separations} % % Here, life gets interesting and we need essentially one approach per @@ -1097,28 +1060,6 @@ %</dvipdfmx|luatex|pdftex|xetex> % \end{macrocode} % -% \begin{macrocode} -%<*dvipdfmx|xetex> -% \end{macrocode} -% -% \begin{macro}{\@@_backend_select_separation:nn, \@@_backend_select_devicen:nn} -% For older \texttt{(x)dvipdfmx}, we \emph{could} support separations using a -% dedicated mechanism, but it was not added that long before the color -% stacks. So instead of having two complex paths, just disable here. -% \begin{macrocode} -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \@@_backend_select_separation:nn #1#2 { } - \cs_gset_eq:NN \@@_backend_select_devicen:nn - \@@_backend_select_separation:nn - } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%</dvipdfmx|xetex> -% \end{macrocode} -% % \subsection{Fill and stroke color} % % Here, \texttt{dvipdfmx}/\XeTeX{} follows \LuaTeX{} and \pdfTeX{}, @@ -1198,52 +1139,6 @@ % \end{macrocode} % % \begin{macrocode} -%<*dvipdfmx|xetex> -% \end{macrocode} -% -% \begin{macro} -% { -% \@@_backend_fill_cmyk:n , -% \@@_backend_fill_gray:n , -% \@@_backend_fill_rgb:n -% } -% \begin{macro}{\@@_backend_reset:} -% \begin{macro}{\@@_backend_stroke:n} -% \begin{macro}{\@@_backend_fill_separation:nn, \@@_backend_stroke_separation:nn} -% Deal with older \texttt{(x)dvipdfmx}. -% \begin{macrocode} -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \@@_backend_fill_cmyk:n #1 - { - \__kernel_backend_literal:n { pdf: bc ~ [#1] } - \group_insert_after:N \@@_backend_reset: - } - \cs_gset_eq:NN \@@_backend_fill_gray:n \@@_backend_fill_cmyk:n - \cs_gset_eq:NN \@@_backend_fill_rgb:n \@@_backend_fill_cmyk:n - \cs_gset_protected:Npn \@@_backend_reset: - { \__kernel_backend_literal:n { pdf: ec } } - \cs_gset_protected:Npn \@@_backend_stroke:n #1 - { \__kernel_backend_literal:n {#1} } - \cs_gset_protected:Npn \@@_backend_fill_separation:nn #1#2 { } - \cs_gset_eq:NN \@@_backend_fill_devicen:nn - \@@_backend_fill_separation:nn - \cs_gset_eq:NN \@@_backend_stroke_separation:nn - \@@_backend_fill_separation:nn - \cs_gset_eq:NN \@@_backend_stroke_devicen:nn - \@@_backend_stroke_separation:nn - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macrocode} -%</dvipdfmx|xetex> -% \end{macrocode} -% -% \begin{macrocode} %<*dvips> % \end{macrocode} % @@ -1414,6 +1309,14 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\@@_backend_devicen_init:nnn, \@@_backend_iccbased_init:nnn} +% No support at present. +% \begin{macrocode} +\cs_new_protected:Npn \@@_backend_devicen_init:nnn #1#2#3 { } +\cs_new_protected:Npn \@@_backend_iccbased_init:nnn #1#2#3 { } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</dvisvgm> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx index 43da62e3946..0f9fcb60081 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx index 37122b9a748..1bd6a7e3362 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -60,20 +60,48 @@ %<@@=graphics> % \end{macrocode} % +% \begin{macro}{\@@_backend_loaded:n} +% To deal with file load ordering. Plain users are on their own. +% \begin{macrocode} +\cs_new_protected:Npn \@@_backend_loaded:n #1 + { + \cs_if_exist:NTF \hook_gput_code:nnn + { + \hook_gput_code:nnn + { file / l3graphics.sty / after } + { backend } + {#1} + } + {#1} + } +% \end{macrocode} +% \end{macro} +% % \subsection{\texttt{dvips} backend} % % \begin{macrocode} %<*dvips> % \end{macrocode} % -% \begin{macro}{\@@_backend_getbb_eps:n} +% \begin{variable}{\l_graphics_search_ext_seq} +% \begin{macrocode} +\@@_backend_loaded:n + { \seq_set_from_clist:Nn \l_graphics_search_ext_seq { .eps , .ps } } +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_backend_getbb_eps:n, \@@_backend_getbb_ps:n} % Simply use the generic function. % \begin{macrocode} -\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n +\@@_backend_loaded:n + { + \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n + \cs_new_eq:NN \@@_backend_getbb_ps:n \@@_read_bb:n + } % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_backend_include_eps:n} +% \begin{macro}{\@@_backend_include_eps:n, \@@_backend_include_ps:n} % The special syntax is relatively clear here: remember we need PostScript % sizes here. % \begin{macrocode} @@ -82,12 +110,20 @@ \__kernel_backend_literal:x { PSfile = #1 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim } } +\cs_new_eq:NN \@@_backend_include_ps:n \@@_backend_include_eps:n +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_backend_get_pagecount:n} +% \begin{macrocode} +\@@_backend_loaded:n + { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n } % \end{macrocode} % \end{macro} % @@ -101,6 +137,17 @@ %<*luatex|pdftex> % \end{macrocode} % +% \begin{variable}{\l_graphics_search_ext_seq} +% \begin{macrocode} +\@@_backend_loaded:n + { + \seq_set_from_clist:Nn + \l_graphics_search_ext_seq + { .pdf , .eps , .png , .jpg , .jpeg } + } +% \end{macrocode} +% \end{variable} +% % \begin{variable}{\l_@@_graphics_attr_tl} % In PDF mode, additional attributes of an graphic (such as page number) are % needed both to obtain the bounding box and when inserting the graphic: this @@ -115,12 +162,18 @@ % % \begin{macro} % { -% \@@_backend_getbb_jpg:n, -% \@@_backend_getbb_pdf:n, +% \@@_backend_getbb_jpg:n , +% \@@_backend_getbb_jpeg:n , +% \@@_backend_getbb_pdf:n , % \@@_backend_getbb_png:n % } % \begin{macro} -% {\@@_backend_getbb_auxi:n, \@@_backend_getbb_auxii:n} +% { +% \@@_backend_getbb_auxi:n , +% \@@_backend_getbb_auxii:n , +% \@@_backend_getbb_auxiii:n +% } +% \begin{macro}[EXP]{\@@_backend_dequote:w} % Getting the bounding box here requires us to box up the graphic and % measure it. To deal with the difference in feature support in bitmap % and vector graphics but keeping the common parts, there is a little work @@ -130,78 +183,88 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl + \int_zero:N \l_@@_page_int + \tl_clear:N \l_@@_pagebox_tl \tl_set:Nx \l_@@_graphics_attr_tl { - \tl_if_empty:NF \l_graphics_decodearray_tl - { :D \l_graphics_decodearray_tl } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l_@@_decodearray_str + { :D \l_@@_decodearray_str } + \bool_if:NT \l_@@_interpolate_bool { :I } } \tl_clear:N \l_@@_graphics_attr_tl \@@_backend_getbb_auxi:n {#1} } +\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool + \tl_clear:N \l_@@_decodearray_str + \bool_set_false:N \l_@@_interpolate_bool \tl_set:Nx \l_@@_graphics_attr_tl { - : \l_graphics_pagebox_tl - \int_compare:nNnT \l_graphics_page_int > 1 - { :P \int_use:N \l_graphics_page_int } + : \l_@@_pagebox_tl + \int_compare:nNnT \l_@@_page_int > 1 + { :P \int_use:N \l_@@_page_int } } \@@_backend_getbb_auxi:n {#1} } \cs_new_protected:Npn \@@_backend_getbb_auxi:n #1 { - \graphics_bb_restore:xF { #1 \l_@@_graphics_attr_tl } + \@@_bb_restore:xF { #1 \l_@@_graphics_attr_tl } { \@@_backend_getbb_auxii:n {#1} } } % \end{macrocode} % Measuring the graphic is done by boxing up: for PDF graphics we could % use |\tex_pdfximagebbox:D|, but if doesn't work for other types. % As the box always starts at $(0,0)$ there is no need to worry about -% the lower-left position. +% the lower-left position. Quotes need to be \emph{removed} as \LuaTeX{} +% does not like them here. % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_auxii:n #1 { + \exp_args:Ne \@@_backend_getbb_auxiii:n + { \@@_backend_dequote:w #1 " #1 " \s_@@_stop } + \int_const:cn { c_@@_ #1 \l_@@_graphics_attr_tl _int } + { \tex_the:D \tex_pdflastximage:D } + \@@_bb_save:x { #1 \l_@@_graphics_attr_tl } + } +\cs_new_protected:Npn \@@_backend_getbb_auxiii:n #1 + { \tex_immediate:D \tex_pdfximage:D \bool_lazy_or:nnT - { \l_graphics_interpolate_bool } - { ! \tl_if_empty_p:N \l_graphics_decodearray_tl } + { \l_@@_interpolate_bool } + { ! \tl_if_empty_p:N \l_@@_decodearray_str } { attr ~ { - \tl_if_empty:NF \l_graphics_decodearray_tl - { /Decode~[ \l_graphics_decodearray_tl ] } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l_@@_decodearray_str + { /Decode~[ \l_@@_decodearray_str ] } + \bool_if:NT \l_@@_interpolate_bool { /Interpolate~true } } } - \int_compare:nNnT \l_graphics_page_int > 0 - { page ~ \int_use:N \l_graphics_page_int } - \tl_if_empty:NF \l_graphics_pagebox_tl - { \l_graphics_pagebox_tl } + \int_compare:nNnT \l_@@_page_int > 0 + { page ~ \int_use:N \l_@@_page_int } + \tl_if_empty:NF \l_@@_pagebox_tl + { \l_@@_pagebox_tl } {#1} \hbox_set:Nn \l_@@_internal_box { \tex_pdfrefximage:D \tex_pdflastximage:D } - \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l_@@_internal_box } - \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l_@@_internal_box } - \int_const:cn { c_@@_graphics_ #1 \l_@@_graphics_attr_tl _int } - { \tex_the:D \tex_pdflastximage:D } - \graphics_bb_save:x { #1 \l_@@_graphics_attr_tl } + \dim_set:Nn \l_@@_urx_dim { \box_wd:N \l_@@_internal_box } + \dim_set:Nn \l_@@_ury_dim { \box_ht:N \l_@@_internal_box } } +\cs_new:Npn \@@_backend_dequote:w #1 " #2 " #3 \s_@@_stop {#2} % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro} % { -% \@@_backend_include_jpg:n, -% \@@_backend_include_pdf:n, +% \@@_backend_include_jpg:n , +% \@@_backend_include_jpeg:n , +% \@@_backend_include_pdf:n , % \@@_backend_include_png:n % } % Images are already loaded for the measurement part of the code, so @@ -211,8 +274,9 @@ \cs_new_protected:Npn \@@_backend_include_jpg:n #1 { \tex_pdfrefximage:D - \int_use:c { c_@@_graphics_ #1 \l_@@_graphics_attr_tl _int } + \int_use:c { c_@@_ #1 \l_@@_graphics_attr_tl _int } } +\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_jpg:n \cs_new_eq:NN \@@_backend_include_pdf:n \@@_backend_include_jpg:n \cs_new_eq:NN \@@_backend_include_png:n \@@_backend_include_jpg:n % \end{macrocode} @@ -241,8 +305,12 @@ \l_@@_backend_ext_str \exp_args:Nx \@@_backend_getbb_eps:nn { - \l_@@_backend_name_str - \str_tail:N \l_@@_backend_ext_str - -converted-to.pdf + \exp_args:Ne \__kernel_file_name_quote:n + { + \l_@@_backend_name_str + - \str_tail:N \l_@@_backend_ext_str + -converted-to.pdf + } } {#1} } @@ -253,7 +321,7 @@ \sys_shell_now:n { repstopdf ~ #2 ~ #1 } } - \tl_set:Nn \l_graphics_name_tl {#1} + \tl_set:Nn \l_@@_final_name_str {#1} \@@_backend_getbb_pdf:n {#1} } \cs_new_protected:Npn \@@_backend_include_eps:n #1 @@ -262,8 +330,12 @@ \l_@@_backend_dir_str \l_@@_backend_name_str \l_@@_backend_ext_str \exp_args:Nx \@@_backend_include_pdf:n { - \l_@@_backend_name_str - \str_tail:N \l_@@_backend_ext_str - -converted-to.pdf + \exp_args:Ne \__kernel_file_name_quote:n + { + \l_@@_backend_name_str + - \str_tail:N \l_@@_backend_ext_str + -converted-to.pdf + } } } } @@ -273,6 +345,18 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\@@_backend_get_pagecount:n} +% Simply load and store. +% \begin{macrocode} +\cs_new_protected:Npn \@@_backend_get_pagecount:n #1 + { + \tex_immediate:D \tex_pdfximage:D {#1} + \int_const:cn { c_@@_ #1 _pages_int } + { \int_use:N \tex_pdflastximagepages:D } + } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</luatex|pdftex> % \end{macrocode} @@ -283,28 +367,46 @@ %<*dvipdfmx|xetex> % \end{macrocode} % +% \begin{variable}{\l_graphics_search_ext_seq} +% \begin{macrocode} +\@@_backend_loaded:n + { + \seq_set_from_clist:Nn \l_graphics_search_ext_seq + { .pdf , .eps , .ps , .png , .jpg ., jpeg , .bmp } + } +% \end{macrocode} +% \end{variable} +% % \begin{macro} % { -% \@@_backend_getbb_eps:n, \@@_backend_getbb_jpg:n, -% \@@_backend_getbb_pdf:n, \@@_backend_getbb_png:n +% \@@_backend_getbb_eps:n , +% \@@_backend_getbb_jpg:n , \@@_backend_getbb_jpeg:n , +% \@@_backend_getbb_pdf:n , \@@_backend_getbb_png:n , +% \@@_backend_getbb_bmp:n % } % Simply use the generic functions: only for \texttt{dvipdfmx} in the % extraction cases. % \begin{macrocode} -\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n +\@@_backend_loaded:n + { + \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n + \cs_new_eq:NN \@@_backend_getbb_ps:n \@@_read_bb:n + } %<*dvipdfmx> \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl - \graphics_extract_bb:n {#1} + \int_zero:N \l_@@_page_int + \tl_clear:N \l_@@_pagebox_tl + \@@_extract_bb:n {#1} } +\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n +\cs_new_eq:NN \@@_backend_getbb_bmp:n \@@_backend_getbb_jpg:n \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool - \graphics_extract_bb:n {#1} + \tl_clear:N \l_@@_decodearray_str + \bool_set_false:N \l_@@_interpolate_bool + \@@_extract_bb:n {#1} } %</dvipdfmx> % \end{macrocode} @@ -319,8 +421,10 @@ % % \begin{macro} % { -% \@@_backend_include_eps:n, \@@_backend_include_jpg:n, -% \@@_backend_include_pdf:n, \@@_backend_include_png:n +% \@@_backend_include_eps:n , \@@_backend_include_ps:n , +% \@@_backend_include_jpg:n , \@@_backend_include_jpseg:n , +% \@@_backend_include_pdf:n , \@@_backend_include_png:n , +% \@@_backend_include_bmp:n , % } % \begin{macro}{\@@_backend_include_auxi:nn} % \begin{macro}{\@@_backend_include_auxii:nnn, \@@_backend_include_auxii:xnn} @@ -335,15 +439,18 @@ \__kernel_backend_literal:x { PSfile = #1 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim } } +\cs_new_eq:NN \@@_backend_include_ps:n \@@_backend_include_eps:n \cs_new_protected:Npn \@@_backend_include_jpg:n #1 { \@@_backend_include_auxi:nn {#1} { image } } +\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_jpg:n \cs_new_eq:NN \@@_backend_include_png:n \@@_backend_include_jpg:n +\cs_new_eq:NN \@@_backend_include_bmp:n \@@_backend_include_jpg:n %<*dvipdfmx> \cs_new_protected:Npn \@@_backend_include_pdf:n #1 { \@@_backend_include_auxi:nn {#1} { epdf } } @@ -358,23 +465,23 @@ { \@@_backend_include_auxii:xnn { - \tl_if_empty:NF \l_graphics_pagebox_tl - { : \l_graphics_pagebox_tl } - \int_compare:nNnT \l_graphics_page_int > 1 - { :P \int_use:N \l_graphics_page_int } - \tl_if_empty:NF \l_graphics_decodearray_tl - { :D \l_graphics_decodearray_tl } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l_@@_pagebox_tl + { : \l_@@_pagebox_tl } + \int_compare:nNnT \l_@@_page_int > 1 + { :P \int_use:N \l_@@_page_int } + \tl_if_empty:NF \l_@@_decodearray_str + { :D \l_@@_decodearray_str } + \bool_if:NT \l_@@_interpolate_bool { :I } } {#1} {#2} } \cs_new_protected:Npn \@@_backend_include_auxii:nnn #1#2#3 { - \int_if_exist:cTF { c_@@_graphics_ #2#1 _int } + \int_if_exist:cTF { c_@@_ #2#1 _int } { \__kernel_backend_literal:x - { pdf:usexobj~@graphic \int_use:c { c_@@_graphics_ #2#1 _int } } + { pdf:usexobj~@graphic \int_use:c { c_@@_ #2#1 _int } } } { \@@_backend_include_auxiii:nnn {#2} {#1} {#3} } } @@ -388,31 +495,31 @@ \cs_new_protected:Npn \@@_backend_include_auxiii:nnn #1#2#3 { \int_gincr:N \g_@@_track_int - \int_const:cn { c_@@_graphics_ #1#2 _int } { \g_@@_track_int } + \int_const:cn { c_@@_ #1#2 _int } { \g_@@_track_int } \__kernel_backend_literal:x { pdf:#3~ - @graphic \int_use:c { c_@@_graphics_ #1#2 _int } ~ - \int_compare:nNnT \l_graphics_page_int > 1 - { page ~ \int_use:N \l_graphics_page_int \c_space_tl } - \tl_if_empty:NF \l_graphics_pagebox_tl + @graphic \int_use:c { c_@@_ #1#2 _int } ~ + \int_compare:nNnT \l_@@_page_int > 1 + { page ~ \int_use:N \l_@@_page_int \c_space_tl } + \tl_if_empty:NF \l_@@_pagebox_tl { - pagebox ~ \l_graphics_pagebox_tl \c_space_tl + pagebox ~ \l_@@_pagebox_tl \c_space_tl bbox ~ - \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_ury_dim \c_space_tl + \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl + \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl + \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl + \dim_to_decimal_in_bp:n \l_@@_ury_dim \c_space_tl } (#1) \bool_lazy_or:nnT - { \l_graphics_interpolate_bool } - { ! \tl_if_empty_p:N \l_graphics_decodearray_tl } + { \l_@@_interpolate_bool } + { ! \tl_if_empty_p:N \l_@@_decodearray_str } { << - \tl_if_empty:NF \l_graphics_decodearray_tl - { /Decode~[ \l_graphics_decodearray_tl ] } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l_@@_decodearray_str + { /Decode~[ \l_@@_decodearray_str ] } + \bool_if:NT \l_@@_interpolate_bool { /Interpolate~true> } >> } @@ -424,6 +531,15 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\@@_backend_get_pagecount:n} +% \begin{macrocode} +%<*dvipdfmx> +\@@_backend_loaded:n + { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n } +%</dvipdfmx> +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</dvipdfmx|xetex> % \end{macrocode} @@ -434,13 +550,13 @@ %<*xetex> % \end{macrocode} % -% \subsubsection{Images} -% % \begin{macro} % { -% \@@_backend_getbb_jpg:n, -% \@@_backend_getbb_pdf:n, -% \@@_backend_getbb_png:n +% \@@_backend_getbb_jpg:n , +% \@@_backend_getbb_jpeg:n , +% \@@_backend_getbb_pdf:n , +% \@@_backend_getbb_png:n , +% \@@_backend_getbb_bmp:n % } % \begin{macro}{\@@_backend_getbb_auxi:nN} % \begin{macro}{\@@_backend_getbb_auxii:nnN, \@@_backend_getbb_auxii:VnN} @@ -456,21 +572,23 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl + \int_zero:N \l_@@_page_int + \tl_clear:N \l_@@_pagebox_tl \@@_backend_getbb_auxi:nN {#1} \tex_XeTeXpicfile:D } +\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n +\cs_new_eq:NN \@@_backend_getbb_bmp:n \@@_backend_getbb_jpg:n \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool + \tl_clear:N \l_@@_decodearray_str + \bool_set_false:N \l_@@_interpolate_bool \@@_backend_getbb_auxi:nN {#1} \tex_XeTeXpdffile:D } \cs_new_protected:Npn \@@_backend_getbb_auxi:nN #1#2 { - \int_compare:nNnTF \l_graphics_page_int > 1 - { \@@_backend_getbb_auxii:VnN \l_graphics_page_int {#1} #2 } + \int_compare:nNnTF \l_@@_page_int > 1 + { \@@_backend_getbb_auxii:VnN \l_@@_page_int {#1} #2 } { \@@_backend_getbb_auxiii:nNnn {#1} #2 { :P 1 } { page 1 } } } \cs_new_protected:Npn \@@_backend_getbb_auxii:nnN #1#2#3 @@ -478,8 +596,8 @@ \cs_generate_variant:Nn \@@_backend_getbb_auxii:nnN { V } \cs_new_protected:Npn \@@_backend_getbb_auxiii:nNnn #1#2#3#4 { - \tl_if_empty:NTF \l_graphics_pagebox_tl - { \@@_backend_getbb_auxiv:VnNnn \l_graphics_pagebox_tl } + \tl_if_empty:NTF \l_@@_pagebox_tl + { \@@_backend_getbb_auxiv:VnNnn \l_@@_pagebox_tl } { \@@_backend_getbb_auxv:nNnn } {#1} #2 {#3} {#4} } @@ -488,21 +606,25 @@ \use:x { \@@_backend_getbb_auxv:nNnn {#2} #3 { : #1 #4 } - { #5 ~ \@@_backend_getbb_pagebox:w #1 } + { + #5 + \tl_if_blank:nF {#1} + { \c_space_tl \@@_backend_getbb_pagebox:w #1 } + } } } \cs_generate_variant:Nn \@@_backend_getbb_auxiv:nnNnn { V } \cs_new_protected:Npn \@@_backend_getbb_auxv:nNnn #1#2#3#4 { - \graphics_bb_restore:nF {#1#3} + \@@_bb_restore:nF {#1#3} { \@@_backend_getbb_auxvi:nNnn {#1} #2 {#3} {#4} } } \cs_new_protected:Npn \@@_backend_getbb_auxvi:nNnn #1#2#3#4 { \hbox_set:Nn \l_@@_internal_box { #2 #1 ~ #4 } - \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l_@@_internal_box } - \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l_@@_internal_box } - \graphics_bb_save:n {#1#3} + \dim_set:Nn \l_@@_urx_dim { \box_wd:N \l_@@_internal_box } + \dim_set:Nn \l_@@_ury_dim { \box_ht:N \l_@@_internal_box } + \@@_bb_save:n {#1#3} } \cs_new:Npn \@@_backend_getbb_pagebox:w #1 box {#1} % \end{macrocode} @@ -515,7 +637,6 @@ % \end{macro} % % \begin{macro}{\@@_backend_include_pdf:n} -% \begin{macro}{\@@_backend_include_bitmap_quote:w} % For PDF graphics, properly supporting the |pagebox| concept in \XeTeX{} % is best done using the |\tex_XeTeXpdffile:D| primitive. The syntax here % is the same as for the graphic measurement part, although we know at this @@ -523,16 +644,27 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_backend_include_pdf:n #1 { - \tex_XeTeXpdffile:D - \@@_backend_include_pdf_quote:w #1 "#1" \s_@@_stop \c_space_tl - \int_compare:nNnT \l_graphics_page_int > 0 - { page ~ \int_use:N \l_graphics_page_int \c_space_tl } - \exp_after:wN \@@_backend_getbb_pagebox:w \l_graphics_pagebox_tl + \tex_XeTeXpdffile:D #1 ~ + \int_compare:nNnT \l_@@_page_int > 0 + { page ~ \int_use:N \l_@@_page_int \c_space_tl } + \exp_after:wN \@@_backend_getbb_pagebox:w \l_@@_pagebox_tl } -\cs_new:Npn \@@_backend_include_pdf_quote:w #1 " #2 " #3 \s_@@_stop - { " #2 " } % \end{macrocode} % \end{macro} +% +% \begin{macro}{\@@_backend_get_pagecount:n} +% Very little to do here other than cover the case of a non-PDF file. +% \begin{macrocode} +\cs_new_protected:Npn \@@_backend_get_pagecount:n #1 + { + \int_const:cn { c_@@_ #1 _pages_int } + { + \int_max:nn + { \int_use:N \tex_XeTeXpdfpagecount:D #1 ~ } + { 1 } + } + } +% \end{macrocode} % \end{macro} % % \begin{macrocode} @@ -545,22 +677,35 @@ %<*dvisvgm> % \end{macrocode} % +% \begin{variable}{\l_graphics_search_ext_seq} +% \begin{macrocode} +\@@_backend_loaded:n + { + \seq_set_from_clist:Nn + \l_graphics_search_ext_seq + { .pdf , .eps , .png , .jpg , .jpeg } + } +% \end{macrocode} +% \end{variable} +% % \begin{macro}{\@@_backend_getbb_eps:n} % Simply use the generic function. % \begin{macrocode} -\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n +\@@_backend_loaded:n + { \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n } % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n} +% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n, \@@_backend_getbb_jpeg:n} % These can be included by extracting the bounding box data. % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl - \graphics_extract_bb:n {#1} + \int_zero:N \l_@@_page_int + \tl_clear:N \l_@@_pagebox_tl + \@@_extract_bb:n {#1} } +\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n % \end{macrocode} % \end{macro} @@ -570,9 +715,9 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool - \graphics_extract_bb:n {#1} + \tl_clear:N \l_@@_decodearray_str + \bool_set_false:N \l_@@_interpolate_bool + \@@_extract_bb:n {#1} } % \end{macrocode} % \end{macro} @@ -583,25 +728,30 @@ % sizes here. (This is the same as the \texttt{dvips} code.) % \begin{macrocode} \cs_new_protected:Npn \@@_backend_include_eps:n #1 - { @@_backend_include:nn { PSfile } {#1} } + { \@@_backend_include:nn { PSfile } {#1} } \cs_new_protected:Npn \@@_backend_include_pdf:n #1 - { @@_backend_include:nn { pdffile } {#1} } + { \@@_backend_include:nn { pdffile } {#1} } \cs_new_protected:Npn \@@_backend_include:nn #1#2 { \__kernel_backend_literal:x { #1 = #2 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim } } % \end{macrocode} % \end{macro} % \end{macro} % -% \begin{macro}{\@@_backend_include_png:n, \@@_backend_include_jpg:n} +% \begin{macro} +% { +% \@@_backend_include_png:n , +% \@@_backend_include_jpg:n , +% \@@_backend_include_jpeg:n +% } % \begin{macro}{\@@_backend_include_bitmap_quote:w} % The backend here has built-in support for basic graphic inclusion (see % \texttt{dvisvgm.def} for a more complex approach, needed if clipping, @@ -615,11 +765,12 @@ \__kernel_backend_literal:x { dvisvgm:img~ - \dim_to_decimal:n { \l_graphics_ury_dim } ~ - \dim_to_decimal:n { \l_graphics_ury_dim } ~ + \dim_to_decimal:n { \l_@@_ury_dim } ~ + \dim_to_decimal:n { \l_@@_ury_dim } ~ \@@_backend_include_bitmap_quote:w #1 " #1 " \s_@@_stop } } +\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_png:n \cs_new_eq:NN \@@_backend_include_jpg:n \@@_backend_include_png:n \cs_new:Npn \@@_backend_include_bitmap_quote:w #1 " #2 " #3 \s_@@_stop { " #2 " } @@ -627,6 +778,13 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\@@_backend_get_pagecount:n} +% \begin{macrocode} +\@@_backend_loaded:n + { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</dvisvgm> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx index fe05e977608..5eacda7b9fe 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx index a38736bc5a1..89d60de0df4 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -239,49 +239,6 @@ % \end{macrocode} % % \begin{macrocode} -%<*dvipdfmx|xdvipdfmx> -% \end{macrocode} -% -% \begin{macro}{\@@_backend_select:n} -% Older backends have no stack support, so everything is done directly. -% \begin{macrocode} -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \@@_backend_select_aux:n #1 - { - \tl_set:Nn \l_@@_backend_fill_tl {#1} - \tl_set:Nn \l_@@_backend_stroke_tl {#1} - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity #1 } - { << /ca ~ #1 /CA ~ #1 >> } - \__kernel_backend_literal_pdf:n { /opacity #1 ~ gs } - } - \cs_gset_protected:Npn \@@_backend_fill_stroke:nn #1#2 - { - \str_if_eq:nnTF {#1} {#2} - { \@@_backend_select_aux:n {#1} } - { - \tl_set:Nn \l_@@_backend_fill_tl {#1} - \tl_set:Nn \l_@@_backend_stroke_tl {#2} - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity.fill #1 } - { << /ca ~ #1 >> } - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity.stroke #1 } - { << /CA ~ #2 >> } - \__kernel_backend_literal_pdf:n - { /opacity.fill #1 ~ gs /opacity.stroke #2 ~ gs } - } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%</dvipdfmx|xdvipdfmx> -% \end{macrocode} -% -% \begin{macrocode} %<*dvisvgm> % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx index 7b642b1a46b..03435b24544 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -1421,19 +1421,13 @@ { \@@_backend_link_begin:n {#1#2} } \cs_new_protected:Npx \@@_backend_link_begin:n #1 { - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \exp_not:N \int_gincr:N \exp_not:N \g_@@_backend_link_int - } + \exp_not:N \int_gincr:N \exp_not:N \g_@@_backend_link_int \@@_backend:x { bann ~ - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - @pdf.lnk - \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int - \c_space_tl - } + @pdf.lnk + \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int + \c_space_tl << /Type /Annot #1 @@ -1451,14 +1445,8 @@ % Available using the backend mechanism with a suitably-recent % version. % \begin{macrocode} -\cs_new:Npx \@@_backend_link_last: - { - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - @pdf.lnk - \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int - } - } +\cs_new:Npn \@@_backend_link_last: + { @pdf.lnk \int_use:N \g_@@_backend_link_int } % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx index e5d50ecf588..0eb34e5c0c7 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 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -122,7 +122,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3benchmark}{2022-02-05}{} +\ProvidesExplPackage{l3benchmark}{2022-04-10}{} {L3 Experimental benchmarking} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx b/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx index 7eba4d03152..3443ca7d25b 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % \begin{documentation} @@ -264,7 +264,7 @@ %<@@=bitset> % \end{macrocode} % \begin{macrocode} -\ProvidesExplPackage{l3bitset}{2022-02-05}{} +\ProvidesExplPackage{l3bitset}{2022-04-10}{} {L3 Experimental bitset support} % \end{macrocode} % A bitset is a string variable. 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 40e6f265aed..926ff3387ea 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 2022-02-05} +% \date{Released 2022-04-10} % % \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 d1612409883..e82e7a1e2a9 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 2022-02-05} +% \date{Released 2022-04-10} % % \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 0c78addf925..024faef3247 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 2022-02-05} +% \date{Released 2022-04-10} % % \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 379dc45e4a2..fe3c28351ea 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 2022-02-05} +% \date{Released 2022-04-10} % % \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 339e7dde97e..2fcc7e8ac0f 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 2022-02-05} +% \date{Released 2022-04-10} % % \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 04a05acc571..53dfd48728f 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 2022-02-05} +% \date{Released 2022-04-10} % % \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 bda3a14ace6..b93f593a7e8 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 2022-02-05} +% \date{Released 2022-04-10} % % \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 6e60b8bddfe..bdc96e0c88d 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 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx index a309d0ffb7b..31ac35f0425 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 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -1173,7 +1173,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3draw}{2022-02-05}{} +\ProvidesExplPackage{l3draw}{2022-04-10}{} {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 8b97a562ed3..cf4a70983d2 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 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -54,140 +54,60 @@ % % \section{\pkg{l3graphics} documentation} % -% \subsection{Driver functions} +% \subsection{Graphics keys} % % Inclusion of graphic files requires a range of low-level data be passed to -% the driver layer. These functions are primarily aimed at supporting this -% work. +% the backend. This is set up using a small number of key--value settings, +% which are stored in the |graphics| tree. % -% \begin{variable}{\l_graphics_decodearray_tl} +% \begin{variable}{decodearray} % Array to decode color in bitmap graphic: when non-empty, this should % be in the form of one, two or three pairs of real numbers in the range % $[0,1]$, separated by spaces. % \end{variable} % -% \begin{variable}{\l_graphics_interpolate_bool} -% Indicates whether interpolation should be applied to bitmap graphic files. +% \begin{variable}{draft} +% Switch to enable draft mode: graphics are read but not included when this is +% true. +% \end{variable} +% +% \begin{variable}{interpolate} +% Switch which indicates whether interpolation should be applied to bitmap +% graphic files. % \end{variable} % -% \begin{variable}{\l_graphics_page_int} +% \begin{variable}{page} % The page to extract from a multi-page graphic file: used for |.pdf| files % which may contain multiple pages. % \end{variable} % -% \begin{variable}{\l_graphics_pagebox_tl} +% \begin{variable}{pagebox} % The nature of the page box setting used to determine the bounding box of % material: used for |.pdf| files which feature multiple page box -% specifications. +% specifications. A choice from |art|, |bleed|, |crop|, |media|, |trim|. +% The standard setting is |crop|. % \end{variable} % -% \begin{variable}{\l_graphics_draft_bool} +% \begin{variable}{draft} % Switch to enable draft mode: graphics are read but not included when this is % true. % \end{variable} % -% \begin{variable} -% {\l_graphics_llx_dim, \l_graphics_lly_dim, \l_graphics_urx_dim, \l_graphics_ury_dim} -% Dimensions which return the points $(\meta{llx},\meta{lly})$ and -% $(\meta{urx},\meta{ury})$ for the graphic. For many graphics only the resulting -% height and width are significant, but this is driver-dependent. -% \end{variable} -% -% \begin{variable}{\l_graphics_name_bool} -% The name of a graphics file being loaded: usually the same as the -% input file name, but may be altered by some drivers. +% \begin{variable}{type} +% The type of graphic file beign included: if this key is not set, the +% \emph{type} is determined from the file extension. % \end{variable} % -% \begin{function} -% { -% \graphics_bb_save:n, \graphics_bb_save:x, -% \graphics_bb_restore:nF, \graphics_bb_restore:xF -% } -% \begin{syntax} -% \cs{graphics_bb_save:n} \Arg{graphic} -% \cs{graphics_bb_restore:nF} \Arg{graphic} \Arg{false code} -% \end{syntax} -% This pair of functions are used to cache the bounding box of an \meta{graphic} -% so that extraction/reading is only required once. The \texttt{save} -% function stores the values from \cs{l_graphics_llx_dim}, -% \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and -% \cs{l_graphics_ury_dim} as constants. The \texttt{restore} function will then -% look up values for the bounding box of an \meta{graphic} and set the four -% dimensions appropriately. For any one \meta{graphic} the bounding box will -% be constant, so the \texttt{save} function should only be called once. Thus -% a typical use case is -% \begin{verbatim} -% \graphics_bb_restore:nF { <name> } -% { -% % Code to read the bb -% \graphics_bb_save:n { <name> } -% } -% \end{verbatim} -% \emph{i.e.}~every use of a bounding box will attempt to restore saved data, -% and saving will only take place where that is not possible. -% -% Note that the \meta{graphic} may not be a simple file name: a multi-page PDF, -% for example, will need to have the bounding box cached for each page used. -% \end{function} +% \subsection{Including graphics} % -% \begin{function}{\graphics_extract_bb:n} +% \begin{function}{\graphics_include:nn, \graphics_include:nV} % \begin{syntax} -% \cs{graphics_extract_bb:n} \Arg{file} +% \cs{graphics_include:nn} \Arg{keys} \Arg{file} % \end{syntax} -% Extracts bounding box data for the graphic \meta{file} using the |extractbb| -% utility, and stores the bounding box of the graphic file in -% \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and -% \cs{l_graphics_ury_dim}. -% -% The \meta{file} name should be fully-qualified and sanitized: no search -% or other manipulation is carried out at this level. No check is made on -% the file \emph{type} at this stage: it is assumed that the driver code -% using this function has made such a check. File types such as |.pdf| and -% |.jpg| are appropriate for parsing using this function. -% -% When \cs{l_graphics_page_int} is positive the appropriate page will be -% queried from the graphic file. -% -% Note that this function requires pipe shell calls to be enabled: this is -% generally true but may require the option |--enable-pipes| to be enabled -% when running the \TeX{} job. -% \end{function} -% -% \begin{function}{\graphics_read_bb:n} -% \begin{syntax} -% \cs{graphics_read_bb:n} \Arg{file} -% \end{syntax} -% Parses the graphic \meta{file} to find a PostScript-style bounding box -% line of the form -% \begin{verbatim} -% %%BoundingBox: llx lly urx urx -% \end{verbatim} -% where \meta{llx}, \meta{lly}, \meta{urx} and \meta{ury} are the corners -% of the bounding box expressed in PostScript (\enquote{big}) points. The -% values are stored in \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim}, -% \cs{l_graphics_urx_dim} and \cs{l_graphics_ury_dim}. -% -% The \meta{file} name should be fully-qualified and sanitized: no search -% or other manipulation is carried out at this level. No check is made on -% the file \emph{type} at this stage: it is assumed that the driver code -% using this function has made such a check. File types such as |.eps| and -% |.bb|/|.xbb| are appropriate for parsing using this function. -% \end{function} -% -% \begin{function}{\graphics_include:n, \graphics_include:nn} -% \begin{syntax} -% \cs{graphics_include:n} \Arg{file} -% \cs{graphics_include:nn} \Arg{file} \Arg{type} -% \end{syntax} -% Horizontal-mode commands which include the \meta{file} as an graphic -% at the current location. The file \meta{type} is given explicitly in -% the two-argument version, or is inferred from the file extension extracted -% in the single-argument form. The exact graphic types supported depend upon -% the driver in use. -% -% Where the \meta{file} is not found and the \meta{type} is \emph{not} -% given, a search for possible graphic files is undertaken using the extensions -% stored in \cs{l_graphics_search_ext_seq}. +% Horizontal-mode command which includes the \meta{file} as an graphic +% at the current location. The file \meta{type} may be given as one of the +% \meta{keys}, or will otherwise be determined from file extension. The +% \meta{keys} is used to pass settings as detailed above. % \end{function} % % \begin{variable}{\l_graphics_ext_type_prop} @@ -200,11 +120,6 @@ % \end{verbatim} % \end{variable} % -% \begin{variable}{\l_graphics_search_ext_seq} -% Extensions to use for graphic searching when the given \meta{file} name is not -% found by \cs{graphics_include:n}. -% \end{variable} -% % \begin{variable}{\l_graphics_search_path_seq} % Each entry is the path to a directory which should be searched when % seeking an graphic file. Each path can be relative or absolute, and should @@ -213,6 +128,36 @@ % variable content. Spaces need not be quoted. % \end{variable} % +% \subsection{Utility functions} +% +% \begin{function}[noTF]{\graphics_get_full_name:nN} +% \begin{syntax} +% \cs{graphics_get_full_name:nN} \Arg{file} \meta{tl~var} +% \cs{graphics_get_full_name:nNTF} \Arg{file} \meta{tl~var} \Arg{true code} \Arg{false code} +% \end{syntax} +% Searches for \meta{file} first as given and then using the extensions +% listed in \cs{l_graphics_search_ext_seq}. The search path used will be +% the entries of \cs{l_graphics_search_path_seq}. If found, the full file +% name including any path and extension will be returned in the +% \meta{tl~var}. In the non-branching version, the \meta{tl var} will be +% set to \cs{q_no_value} in the case that the graphics is not found. +% \end{function} +% +% \begin{variable}{\l_graphics_search_ext_seq} +% Extensions to use for graphic searching when the given \meta{file} name is not +% found by \cs{graphics_get_full_name:nN}. +% \end{variable} +% +% \begin{function}{\graphics_get_pagecount:nN} +% \begin{syntax} +% \cs{graphics_get_pagecount:nn} \Arg{file} \meta{tl~var} +% \end{syntax} +% Reads the graphics \meta{file} and extracts the number of pages, which +% are stored in the \meta{tl~var}. +% \end{function} +% +% \subsection{Showing and logging included graphics} +% % \begin{function}{\graphics_show_list:, \graphics_log_list:} % \begin{syntax} % \cs{graphics_show_list:} @@ -240,15 +185,15 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3graphics}{2022-02-05}{} +\ProvidesExplPackage{l3graphics}{2022-04-10}{} {L3 Experimental graphics inclusion support} % \end{macrocode} % -% \begin{variable}{\l_@@_tmp_ior, \l_@@_tmp_tl} +% \begin{variable}{\l_@@_internal_ior, \l_@@_internal_tl} % Scratch space. % \begin{macrocode} -\ior_new:N \l_@@_tmp_ior -\tl_new:N \l_@@_tmp_tl +\ior_new:N \l_@@_internal_ior +\tl_new:N \l_@@_internal_tl % \end{macrocode} % \end{variable} % @@ -259,24 +204,47 @@ % \end{macrocode} % \end{variable} % -% \subsection{Image feature support} +% \subsection{Graphics keys} % % \begin{macro} % { -% \l_graphics_decodearray_tl , -% \l_graphics_interpolate_bool, -% \l_graphics_page_int , -% \l_graphics_pagebox_tl +% \l_@@_decodearray_str , +% \l__@@_draft_bool , +% \l_@@_interpolate_bool , +% \l_@@_page_int , +% \l_@@_pagebox_tl , +% \l_@@_type_str % } % Keys which control features of graphics. The standard value of |pagebox| -% set up here should match the default for the drivers themselves: in -% the absence of any other setting the |cropbox| should be used. +% set up here should match the default for the backends themselves: in +% the absence of any other setting the |crop| should be used. Note that +% the variable \cs{l_@@_pagebox_str} can be empty internally, as backends +% which do not support |pagebox| are set up to clear it entirely. The +% store for |pagebox| is a |tl| as that makes extracting the data +% easier for some backends. % \begin{macrocode} -\tl_new:N \l_graphics_decodearray_tl -\tl_new:N \l_graphics_pagebox_tl -\bool_new:N \l_graphics_interpolate_bool -\tl_set:Nn \l_graphics_pagebox_tl { cropbox } -\int_new:N \l_graphics_page_int +\tl_new:N \l_@@_pagebox_tl +\keys_define:nn { graphics } + { + decodearray .str_set:N = + \l_@@_decodearray_str , + draft .bool_set:N = + \l_@@_draft_bool , + interpolate .bool_set:N = + \l_@@_interpolate_bool , + pagebox .choices:nn = + { art , bleed , crop , media , trim } + { + \tl_set:Nx \l_@@_pagebox_tl + { \tl_use:N \l_keys_choice_tl box } + } , + pagebox .initial:n = + crop , + page .int_set:N = + \l_@@_page_int , + type . str_set:N = + \l_@@_type_str + } % \end{macrocode} % \end{macro} % @@ -284,60 +252,60 @@ % % \begin{variable} % { -% \l_graphics_llx_dim , \l_graphics_lly_dim, -% \l_graphics_urx_dim , \l_graphics_ury_dim +% \l_@@_llx_dim , \l_@@_lly_dim, +% \l_@@_urx_dim , \l_@@_ury_dim % } % Storage for the return of bounding box. % \begin{macrocode} -\dim_new:N \l_graphics_llx_dim -\dim_new:N \l_graphics_lly_dim -\dim_new:N \l_graphics_urx_dim -\dim_new:N \l_graphics_ury_dim +\dim_new:N \l_@@_llx_dim +\dim_new:N \l_@@_lly_dim +\dim_new:N \l_@@_urx_dim +\dim_new:N \l_@@_ury_dim % \end{macrocode} % \end{variable} % -% \begin{macro}{\graphics_bb_save:n, \graphics_bb_save:x} -% \begin{macro}{\graphics_bb_restore:nF, \graphics_bb_restore:xF} +% \begin{macro}{\@@_bb_save:n, \@@_bb_save:x} +% \begin{macro}{\@@_bb_restore:nF, \@@_bb_restore:xF} % Caching graphic bounding boxes is sensible, and these functions are needed both % here and for drive-specific work. So they are made available as documented % functions. To save on registers, the \enquote{origin} is only saved if it is % not at zero. % \begin{macrocode} -\cs_new_protected:Npn \graphics_bb_save:n #1 +\cs_new_protected:Npn \@@_bb_save:n #1 { \dim_if_exist:cTF { c_@@_ #1 _urx_dim } { \msg_error:nnn { graphic } { bb-already-cached } {#1} } { - \dim_compare:nNnF \l_graphics_llx_dim = { 0pt } - { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_graphics_llx_dim } } - \dim_compare:nNnF \l_graphics_lly_dim = { 0pt } - { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_graphics_lly_dim } } - \dim_const:cn { c_@@_ #1 _urx_dim } { \l_graphics_urx_dim } - \dim_const:cn { c_@@_ #1 _ury_dim } { \l_graphics_ury_dim } + \dim_compare:nNnF \l_@@_llx_dim = { 0pt } + { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_@@_llx_dim } } + \dim_compare:nNnF \l_@@_lly_dim = { 0pt } + { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_@@_lly_dim } } + \dim_const:cn { c_@@_ #1 _urx_dim } { \l_@@_urx_dim } + \dim_const:cn { c_@@_ #1 _ury_dim } { \l_@@_ury_dim } } } -\cs_generate_variant:Nn \graphics_bb_save:n { x } -\cs_new_protected:Npn \graphics_bb_restore:nF #1#2 +\cs_generate_variant:Nn \@@_bb_save:n { x } +\cs_new_protected:Npn \@@_bb_restore:nF #1#2 { \dim_if_exist:cTF { c_@@_ #1 _urx_dim } { - \dim_set_eq:Nc \l_graphics_urx_dim { c_@@_ #1 _urx_dim } - \dim_set_eq:Nc \l_graphics_ury_dim { c_@@_ #1 _ury_dim } + \dim_set_eq:Nc \l_@@_urx_dim { c_@@_ #1 _urx_dim } + \dim_set_eq:Nc \l_@@_ury_dim { c_@@_ #1 _ury_dim } \dim_if_exist:cTF { c_@@_ #1 _llx_dim } - { \dim_set_eq:Nc \l_graphics_llx_dim { c_@@_ #1 _llx_dim } } - { \dim_zero:N \l_graphics_llx_dim } + { \dim_set_eq:Nc \l_@@_llx_dim { c_@@_ #1 _llx_dim } } + { \dim_zero:N \l_@@_llx_dim } \dim_if_exist:cTF { c_@@_ #1 _lly_dim } - { \dim_set_eq:Nc \l_graphics_lly_dim { c_@@_ #1 _lly_dim } } - { \dim_zero:N \l_graphics_lly_dim } + { \dim_set_eq:Nc \l_@@_lly_dim { c_@@_ #1 _lly_dim } } + { \dim_zero:N \l_@@_lly_dim } } {#2} } -\cs_generate_variant:Nn \graphics_bb_restore:nF { x } +\cs_generate_variant:Nn \@@_bb_restore:nF { x } % \end{macrocode} % \end{macro} % \end{macro} % -% \begin{macro}{\graphics_extract_bb:n, \graphics_read_bb:n} +% \begin{macro}{\@@_extract_bb:n, \@@_read_bb:n} % \begin{macro}{\@@_extract_bb_auix:nn, \@@_extract_bb_auix:Vn} % \begin{macro}{\@@_extract_bb_auxii:nnn} % \begin{macro}{\@@_extract_bb_auxiii:nnnn, \@@_extract_bb_auxiii:Vnnn} @@ -357,10 +325,10 @@ % box has to be calculated by |extractbb|, with just the initial phase % different. % \begin{macrocode} -\cs_new_protected:Npn \graphics_extract_bb:n #1 +\cs_new_protected:Npn \@@_extract_bb:n #1 { - \int_compare:nNnTF \l_graphics_page_int > 0 - { \@@_extract_bb_auxi:Vn \l_graphics_page_int {#1} } + \int_compare:nNnTF \l_@@_page_int > 0 + { \@@_extract_bb_auxi:Vn \l_@@_page_int {#1} } { \@@_extract_bb_auxii:nnn {#1} { } { } } } \cs_new_protected:Npn \@@_extract_bb_auxi:nn #1#2 @@ -368,9 +336,9 @@ \cs_generate_variant:Nn \@@_extract_bb_auxi:nn { Vn } \cs_new_protected:Npn \@@_extract_bb_auxii:nnn #1#2#3 { - \tl_if_empty:NTF \l_graphics_pagebox_tl + \tl_if_empty:NTF \l_@@_pagebox_tl { \@@_extract_bb_auxiv:nnn } - { \@@_extract_bb_auxiii:Vnnn \l_graphics_pagebox_tl } + { \@@_extract_bb_auxiii:Vnnn \l_@@_pagebox_tl } {#1} {#2} {#3} } \cs_new_protected:Npn \@@_extract_bb_auxiii:nnnn #1#2#3#4 @@ -379,13 +347,13 @@ \cs_new_protected:Npn \@@_extract_bb_auxiv:nnn #1#2#3 { \@@_read_bb_auxi:nnnn {#1} {#2} - { \ior_shell_open:Nn \l_@@_tmp_ior { extractbb~#3-O~#1 } } + { \ior_shell_open:Nn \l_@@_internal_ior { extractbb~#3-O~#1 } } { pipe-failed } } -\cs_new_protected:Npn \graphics_read_bb:n #1 +\cs_new_protected:Npn \@@_read_bb:n #1 { \@@_read_bb_auxi:nnnn {#1} { } - { \ior_open:Nn \l_@@_tmp_ior {#1} } + { \ior_open:Nn \l_@@_internal_ior {#1} } { graphic-not-found } } % \end{macrocode} @@ -401,31 +369,23 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_read_bb_auxi:nnnn #1#2#3#4 { - \graphics_bb_restore:nF {#1#2} + \@@_bb_restore:nF {#1#2} { \@@_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} } } \cs_new_protected:Npx \@@_read_bb_auxii:nnnn #1#2#3#4 { #1 - \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_tmp_ior + \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_internal_ior { \msg_error:nnn { graphics } {#2} {#3} } { - \ior_str_map_inline:Nn \exp_not:N \l_@@_tmp_ior + \ior_str_map_inline:Nn \exp_not:N \l_@@_internal_ior { \exp_not:N \@@_read_bb_auxiii:w ##1 ~ \c_colon_str \s_@@_stop } + \@@_bb_save:n {#3#4} } - \exp_not:n - { - \ior_close:N \l_@@_tmp_ior - \dim_compare:nNnF \l_graphics_llx_dim = { 0pt } - { \dim_const:cn { c_@@_ #3#4 _llx_dim } { \l_graphics_llx_dim } } - \dim_compare:nNnF \l_graphics_lly_dim = { 0pt } - { \dim_const:cn { c_@@_ #3#4 _lly_dim } { \l_graphics_lly_dim } } - \dim_const:cn { c_@@_ #3#4 _urx_dim } { \l_graphics_urx_dim } - \dim_const:cn { c_@@_ #3#4 _ury_dim } { \l_graphics_ury_dim } - } + \ior_close:N \exp_not:N \l_@@_internal_ior } \use:x { @@ -450,13 +410,13 @@ { \str_if_eq:nnF {#2} { atend } { - \tl_set_rescan:Nnx \l_@@_tmp_tl + \tl_set_rescan:Nnx \l_@@_internal_tl { \char_set_catcode_space:n { 9 } \char_set_catcode_space:n { 32 } } { \use:n #1 } - \exp_after:wN \@@_read_bb_auxv:w \l_@@_tmp_tl \s_@@_stop + \exp_after:wN \@@_read_bb_auxv:w \l_@@_internal_tl \s_@@_stop } } % \end{macrocode} @@ -465,10 +425,10 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_read_bb_auxv:w #1~#2~#3~#4~#5 \s_@@_stop { - \dim_set:Nn \l_graphics_llx_dim { #1 bp } - \dim_set:Nn \l_graphics_lly_dim { #2 bp } - \dim_set:Nn \l_graphics_urx_dim { #3 bp } - \dim_set:Nn \l_graphics_ury_dim { #4 bp } + \dim_set:Nn \l_@@_llx_dim { #1 bp } + \dim_set:Nn \l_@@_lly_dim { #2 bp } + \dim_set:Nn \l_@@_urx_dim { #3 bp } + \dim_set:Nn \l_@@_ury_dim { #4 bp } \ior_map_break: } % \end{macrocode} @@ -480,17 +440,13 @@ % \end{macro} % \end{macro} % -% \begin{variable}{\l_graphics_draft_bool} -% Relevant to including graphics but not to reading them. -% \begin{macrocode} -\bool_new:N \l_graphics_draft_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_graphics_name_tl, \l_@@_name_tl} +% \begin{variable}{\l_@@_final_name_str, \l_@@_full_name_str} +% The full name is as you'd expect the name including path and extension. +% The final name here reflects any conversions carried out by the backend, +% for example if an |.eps| is converted to |.pdf|. % \begin{macrocode} -\tl_new:N \l_graphics_name_tl -\tl_new:N \l_@@_name_tl +\str_new:N \l_@@_final_name_str +\str_new:N \l_@@_full_name_str % \end{macrocode} % \end{variable} % @@ -515,7 +471,7 @@ % \end{variable} % % \begin{variable}{\l_graphics_search_ext_seq} -% Used to specify fall-back extensions: actually set on a per-driver basis. +% Used to specify fall-back extensions: actually set on a per-backend basis. % \begin{macrocode} \seq_new:N \l_graphics_search_ext_seq % \end{macrocode} @@ -536,66 +492,49 @@ % \end{macrocode} % \end{variable} % -% \begin{macro}{\graphics_include:n} +% \begin{macro}{\graphics_include:nn, \graphics_include:nV} % \begin{macro}{\@@_include_search:n} % \begin{macro}{\@@_include:} -% \begin{macro}{\graphics_include:nn} % \begin{macro} % { -% \@@_include_auxi:n, \@@_include_auxii:n, +% \@@_include_auxi:n, \@@_include_auxi:e, \@@_include_auxii:n, % \@@_include_auxiii:n, \@@_include_auxiv:n % } % Actually including an graphic is relatively straight-forward: most of the -% work is done by the driver. We only have to deal with making sure the +% work is done by the backend. We only have to deal with making sure the % box has no apparent depth. Where the first given name is not found, we % search based on extension only if the \meta{type} was not given. The one % wrinkle is that we may have found a \texttt{.tex} file matching the file % name stem: that's not what we want, so we have to filter out. % \begin{macrocode} -\cs_new_protected:Npn \graphics_include:n #1 +\cs_new_protected:Npn \graphics_include:nn #1#2 { \group_begin: + \keys_set:nn { graphics } {#1} \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq - \file_get_full_name:nNTF {#1} \l_@@_name_tl + \file_get_full_name:nNTF {#2} \l_@@_full_name_str { - \str_if_eq:eeTF { \l_@@_name_tl } { #1 .tex } - { \@@_include_search:n {#1} } + \str_if_eq:eeTF { \l_@@_full_name_str } { #2 .tex } + { \msg_error:nnn { graphics } { graphic-not-found } {#2} } { \@@_include: } } - { \@@_include_search:n {#1} } + { \msg_error:nnn { graphics } { graphic-not-found } {#2} } \group_end: } -\cs_new_protected:Npn \@@_include_search:n #1 - { - \seq_map_inline:Nn \l_graphics_search_ext_seq - { - \file_get_full_name:nNT { #1 . ##1 } \l_@@_name_tl - { \seq_map_break:n { \use_i:nnn \@@_include: } } - } - \use:n - { \msg_error:nnn { graphics } { graphic-not-found } {#1} } - } +\cs_generate_variant:Nn \graphics_include:nn { nV } \cs_new_protected:Npn \@@_include: { - \file_parse_full_name:VNNN \l_@@_name_tl - \l_@@_dir_str \l_@@_name_str \l_@@_ext_str - \exp_args:Ne \@@_include_auxi:n + \str_if_empty:NTF \l_@@_type_str { - \exp_args:Ne \str_tail:n - { \str_foldcase:V \l_@@_ext_str } - } - } -\cs_new_protected:Npn \graphics_include:nn #1#2 - { - \group_begin: - \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq - \file_get_full_name:nNTF {#1} \l_@@_name_tl - { - \exp_args:Ne \@@_include_auxi:n - { \str_foldcase:n {#1} } - } - { \msg_error:nnn { graphics } { graphic-not-found } {#1} } - \group_end: + \file_parse_full_name:VNNN \l_@@_full_name_str + \l_@@_dir_str \l_@@_name_str \l_@@_ext_str + \@@_include_auxi:e + { + \exp_args:Ne \str_tail:n + { \str_foldcase:V \l_@@_ext_str } + } + } + { \@@_include_auxi:e { \l_@@_type_str } } } \cs_new_protected:Npn \@@_include_auxi:n #1 { @@ -603,20 +542,21 @@ { \tl_set:Nn \l_@@_internal_tl {#1} } \exp_args:NV \@@_include_auxii:n \l_@@_internal_tl } +\cs_generate_variant:Nn \@@_include_auxi:n { e } \cs_new_protected:Npn \@@_include_auxii:n #1 { \mode_leave_vertical: \cs_if_exist:cTF { @@_backend_include_ #1 :n } { - \tl_set_eq:NN \l_graphics_name_tl \l_@@_name_tl + \tl_set_eq:NN \l_@@_final_name_str \l_@@_full_name_str + \str_set:Nx \l_@@_full_name_str + { \exp_args:NV \__kernel_file_name_quote:n \l_@@_full_name_str } \exp_args:NnV \use:c { @@_backend_getbb_ #1 :n } - \l_@@_name_tl - \seq_gput_right:NV \g_@@_record_seq \l_graphics_name_tl -%<*package> + \l_@@_full_name_str + \seq_gput_right:NV \g_@@_record_seq \l_@@_final_name_str \clist_if_exist:NT \@filelist - { \exp_args:NV \@addtofilelist \l_graphics_name_tl } -%</package> - \bool_if:NTF \l_graphics_draft_bool + { \exp_args:NV \@addtofilelist \l_@@_final_name_str } + \bool_if:NTF \l_@@_draft_bool { \@@_include_auxiii:n } { \@@_include_auxiv:n } {#1} @@ -625,23 +565,21 @@ } \cs_new_protected:Npn \@@_include_auxiii:n #1 { - \hbox_to_wd:nn { \l_graphics_urx_dim - \l_graphics_llx_dim } + \hbox_to_wd:nn { \l_@@_urx_dim - \l_@@_llx_dim } { \tex_vrule:D \tex_hss:D \vbox_to_ht:nn - { \l_graphics_ury_dim - \l_graphics_lly_dim } + { \l_@@_ury_dim - \l_@@_lly_dim } { \tex_hrule:D width - \dim_eval:n { \l_graphics_urx_dim - \l_graphics_llx_dim } + \dim_eval:n { \l_@@_urx_dim - \l_@@_llx_dim } \tex_vss:D \hbox_to_wd:nn - { \l_graphics_urx_dim - \l_graphics_llx_dim } + { \l_@@_urx_dim - \l_@@_llx_dim } { -%<*package> \ttfamily -%</package> - \tex_hss:D \l_@@_name_tl \tex_hss:D + \tex_hss:D \l_@@_full_name_str \tex_hss:D } \tex_vss:D \tex_hrule:D @@ -655,13 +593,13 @@ \hbox_set:Nn \l_@@_internal_box { \exp_args:NnV \use:c { @@_backend_include_ #1 :n } - \l_@@_name_tl + \l_@@_full_name_str } \box_set_dp:Nn \l_@@_internal_box { 0pt } \box_set_ht:Nn \l_@@_internal_box - { \l_graphics_ury_dim - \l_graphics_lly_dim } + { \l_@@_ury_dim - \l_@@_lly_dim } \box_set_wd:Nn \l_@@_internal_box - { \l_graphics_urx_dim - \l_graphics_llx_dim } + { \l_@@_urx_dim - \l_@@_llx_dim } \box_use_drop:N \l_@@_internal_box } % \end{macrocode} @@ -669,7 +607,6 @@ % \end{macro} % \end{macro} % \end{macro} -% \end{macro} % % \begin{macro}{\graphics_show_list:, \graphics_log_list:, \@@_list:N} % \begin{macro}[EXP]{\@@_list_aux:n} @@ -680,7 +617,7 @@ \cs_new_protected:Npn \@@_list:N #1 { \seq_remove_duplicates:N \g_@@_record_seq - #1 { LaTeX/kernel } { file-list } + #1 { kernel } { file-list } { \seq_map_function:NN \g_@@_record_seq \@@_list_aux:n } { } { } { } } @@ -689,14 +626,123 @@ % \end{macro} % \end{macro} % +% \subsection{Utility functions} +% +% \begin{macro}{\graphics_get_full_name:nN} +% \begin{macro}[TF]{\graphics_get_full_name:nN} +% \begin{macro}{\@@_get_full_name:n} +% A simple search. +% \begin{macrocode} +\cs_new_protected:Npn \graphics_get_full_name:nN #1#2 + { + \graphics_get_full_name:nNF {#1} #2 + { \tl_set:Nn #2 { \q_no_value } } + } +\prg_new_protected_conditional:Npnn \graphics_get_full_name:nN #1#2 + { T , F , TF } + { + \group_begin: + \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq + \file_get_full_name:nNTF {#1} \l_@@_full_name_str + { + \str_if_eq:eeT { \l_@@_full_name_str } { #1 .tex } + { \@@_get_full_name:n {#1} } + } + { \@@_get_full_name:n {#1} } + \exp_args:NNNV \group_end: + \tl_set:Nn #2 \l_@@_full_name_str + \tl_if_empty:NTF #2 + { \prg_return_false: } + { \prg_return_true: } + } +\cs_new_protected:Npn \@@_get_full_name:n #1 + { + \str_clear:N \l_@@_full_name_str + \seq_map_inline:Nn \l_graphics_search_ext_seq + { + \file_get_full_name:nNT { #1 ##1 } \l_@@_full_name_str + { \seq_map_break:n { \use_none:nn } } + } + \use:n + { \str_clear:N \l_@@_full_name_str } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\graphics_get_pagecount:nN} +% \begin{macro}{\@@_get_pagecount:n} +% \begin{macro}{\@@_get_pagecount:nw} +% A generic function to read the number of pages in a graphic file. This is +% used by all of the backend where there is not a dedicated primitive. The +% plan is essentially the same as reading the bounding box. To avoid multiple +% calls, the value is cached either here or in the backend. +% \begin{macrocode} +\cs_new_protected:Npn \graphics_get_pagecount:nN #1#2 + { + \group_begin: + \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq + \file_get_full_name:nNTF {#1} \l_@@_full_name_str + { + \int_if_exist:cF { c_@@_ \l_@@_full_name_str _pages_int } + { + \exp_args:NV \@@_backend_get_pagecount:n + \l_@@_full_name_str + } + \tl_set:Nv #2 { c_@@_ \l_@@_full_name_str _pages_int } + } + { + \tl_set:Nn #2 { 0 } + \msg_error:nnn { graphics } { graphic-not-found } {#1} + } + \exp_args:NNNV \group_end: + \tl_set:Nn #2 #2 + } +\cs_new_protected:Npx \@@_get_pagecount:n #1 + { + \ior_shell_open:Nn \exp_not:N \l_@@_internal_ior + { extractbb~-O~#1 } + \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_internal_ior + { \msg_error:nnn { graphics } { pipe-failed } } + { + \ior_str_map_inline:Nn \exp_not:N \l_@@_internal_ior + { + \exp_not:N \@@_get_pagecount:nw {#1} + ##1 ~ \c_colon_str \c_colon_str \s_@@_stop + } + \exp_not:N \int_if_exist:cF { c_@@_ #1 _pages_int } + { \int_const:cn { c_@@_ #1 _pages_int } { 1 } } + } + \ior_close:N \exp_not:N \l_@@_internal_ior + } +\use:x + { + \cs_new_protected:Npn \exp_not:N \@@_get_pagecount:nw + ##1##2 \c_colon_str ##3 \c_colon_str ##4 \s_@@_stop + { + \exp_not:N \str_if_eq:nnT + { \c_percent_str \c_percent_str Pages } + {##2} + { + \int_const:cn { c_@@_ ##1 _pages_int } {##3} + \exp_not:N \ior_map_break: + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% % \subsection{Messages} % % \begin{macrocode} \msg_new:nnnn { graphics } { graphic-not-found } { Image~file~'#1'~not~found. } { - LaTeX~tried~to~open~graphic~file~'#1', - ~but~the~file~could~not~be~read. + LaTeX~tried~to~open~graphic~file~'#1',~ + but~the~file~could~not~be~read. } \msg_new:nnnn { graphics } { pipe-failed } { Cannot~run~piped~system~commands. } diff --git a/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx b/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx index 85de4479aec..192f6b6818d 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -97,7 +97,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3opacity}{2022-02-05}{} +\ProvidesExplPackage{l3opacity}{2022-04-10}{} {L3 Experimental opacity 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 51193487ac6..c84c77c6081 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 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -166,7 +166,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3str-format}{2022-02-05}{} +\ProvidesExplPackage{l3str-format}{2022-04-10}{} {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 cf8ecdf1885..db10bbbf606 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 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -151,7 +151,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3sys-shell}{2022-02-05}{} +\ProvidesExplPackage{l3sys-shell}{2022-04-10}{} {L3 Experimental system shell functions} % \end{macrocode} % @@ -393,6 +393,8 @@ \seq_set_split:NnV #2 { \char_generate:nn { `\^^M } { 12 } } \exp_not:N \l_@@_tmp_tl \seq_pop_right:NN #2 \exp_not:N \l_@@_tmp_tl + \exp_not:N \tl_if_blank:eTF { \exp_not:N \seq_item:Nn #2 { 1 } } + { \seq_clear:N #2 } } } % \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 18e0c0deedb..e7773188c01 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx @@ -53,7 +53,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -672,7 +672,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xcoffins}{2022-02-05}{} +\ProvidesExplPackage{xcoffins}{2022-04-10}{} {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 f52c7fb59c3..5dd9d565eba 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 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -686,7 +686,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3galley}{2022-02-05}{} +\ProvidesExplPackage{l3galley}{2022-04-10}{} {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 dca97d5fb60..2e541d65507 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -731,7 +731,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xgalley}{2022-02-05}{} +\ProvidesExplPackage{xgalley}{2022-04-10}{} {L3 Experimental galley} \RequirePackage{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 51fb5f5e022..34e12e7d550 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> %</driver|generic|package|2ekernel> -\def\ExplFileDate{2022-02-24}% +\def\ExplFileDate{2022-04-10}% %<*driver> \documentclass[full]{l3doc} \usepackage{graphicx} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index 8f94eefe1f8..c945620eced 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -727,13 +727,6 @@ % \meta{control sequence name} must, when fully expanded, consist of % character tokens, typically a mixture of category code $10$ (space), % $11$ (letter) and $12$ (other). -% \begin{texnote} -% Protected macros that appear in a \texttt{c}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % As an example of the \cs{use:c} function, both diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 7afadf6f4b1..5b137477ca3 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index 5a0f8bd8075..7c19e49bfd4 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index 664f4a5306d..d8e01d0d0bf 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -596,7 +596,7 @@ % % \begin{function}[added = 2018-04-01]{\tl_build_get:NN} % \begin{syntax} -% \cs{tl_build_get:N} \meta{tl~var_1} \meta{tl~var_2} +% \cs{tl_build_get:NN} \meta{tl~var_1} \meta{tl~var_2} % \end{syntax} % Stores the contents of the \meta{tl~var_1} in the \meta{tl~var_2}. % The \meta{tl~var_1} must have been set up with \cs{tl_build_begin:N} @@ -1415,7 +1415,7 @@ \tl_if_in:nnTF {#1} { " } { \msg_error:nnx - { ior } { quote-in-shell } {#1} + { kernel } { quote-in-shell } {#1} } { \__kernel_ior_open:Nn #2 { |#1 } } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx index e10527fedd0..69409085fe7 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index 0e3d0de492b..a2e5dd0ec0e 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index 3b9bff45e03..d00fe3918d4 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx index 1a163262197..93f42374efe 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx index 81d3d81c47e..65457cbdeaf 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -1015,7 +1015,7 @@ { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } } } { } - { \@@_cmd_set:nn } + { \@@_cmd_set_direct:nn } %<@@=msg> \__kernel_patch:nnn { } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index b5c495de2b9..4d48f2a0077 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index e3251058b37..0db227edf9d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -85,7 +85,7 @@ and all files in that bundle must be distributed together. % require you to do updates, if the class changes.}} % % \author{\Team} -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % \maketitle % \tableofcontents % @@ -361,69 +361,81 @@ and all files in that bundle must be distributed together. % \subsection{Describing functions in the documentation} % % \DescribeEnv{function} +% \DescribeEnv{variable} +% Two heavily-used environments are defined to describe \pkg{expl3} functions +% and variables. If describing a variable, use the latter environment; it +% behaves identically to the \env{function} environment. % \DescribeEnv{syntax} -% Two heavily-used environments are defined to describe the syntax of -% \pkg{expl3} functions and variables. +% Both of the above environments are typically combined with the \env{syntax} +% environment, to describe their syntax. % \begin{framed} % \vspace{-\baselineskip} % \begin{verbatim} -% \begin{function}{\function_one:, \function_two:} +% \begin{function}{\package_function_one:N, \package_function_two:n} % \begin{syntax} -% |\foo_bar:| \Arg{meta} \meta{test_1} +% \cs{package_function_one:N} \meta{cs} +% \cs{package_function_two:n} \marg{Argument} % \end{syntax} -% \meta{description} +% Descriptive text here ... % \end{function} % \end{verbatim} % \hrulefill % \par % \hspace*{0.25\textwidth} % \begin{minipage}{0.5\textwidth} -% \begin{function}{\function_one:, \function_two:} +% \begin{function}{\package_function_one:N, \package_function_two:n} % \begin{syntax} -% |\foo_bar:| \Arg{meta} \meta{test_1} +% \cs[no-index]{package_function_one:N} \meta{cs} +% \cs[no-index]{package_function_two:n} \marg{Argument} % \end{syntax} -% \meta{description} +% \emph{Descriptive text here …} % \end{function} % \end{minipage} % \end{framed} % % Function environments take an optional argument to indicate whether -% the function(s) it describes are expandable or restricted-expandable -% or defined in conditional forms. Use |EXP|, |rEXP|, |TF|, |pTF|, or |noTF| for -% this; note that |pTF| implies |EXP| since predicates must always be -% expandable, and that |noTF| means that the function without |TF| -% should be documented in addition to |TF|. As an example: +% the function(s) it describes are expandable (use |EXP|) or +% restricted-expandable (use |rEXP|) or defined in conditional forms +% (use |TF|, |pTF|, or |noTF|). Note that |pTF| implies |EXP| since +% predicates must always be expandable, and that |noTF| means that the +% function without |TF| should be documented in addition to |TF|. For +% the conditional forms |TF| and |pTF|, the argument of the +% \env{function} environment is \emph{not} in fact a command that +% exists: in the example below, \cs[no-index]{tl_if_empty:N} does not +% exist, but its conditional forms \cs{tl_if_empty:NT}, +% \cs{tl_if_empty:NF}, \cs{tl_if_empty:NTF} and predicate form +% \cs{tl_if_empty_p:N} exist: % \begin{framed} % \vspace{-\baselineskip} % \begin{verbatim} -% \begin{function}[pTF]{\cs_if_exist:N} +% \begin{function}[pTF]{\tl_if_empty:N, \tl_if_empty:c} % \begin{syntax} -% \cs{cs_if_exist_p:N} \meta{cs} +% \cs{tl_if_empty_p:N} \meta{tl~var} +% \cs{tl_if_empty:NTF} \meta{tl~var} \Arg{true code} \Arg{false code} % \end{syntax} -% \meta{description} +% Tests if the \meta{token list variable} is entirely empty +% (\emph{i.e.}~contains no tokens at all). % \end{function} % \end{verbatim} % \hrulefill % \par % \hspace*{0.25\textwidth} % \begin{minipage}{0.5\textwidth} -% \begin{function}[pTF]{\cs_if_exist:N} +% \begin{function}[pTF]{\tl_if_empty:N, \tl_if_empty:c} % \begin{syntax} -% \cs{cs_if_exist_p:N} \meta{cs} +% \cs{tl_if_empty_p:N} \meta{tl~var} +% \cs{tl_if_empty:NTF} \meta{tl~var} \Arg{true code} \Arg{false code} % \end{syntax} -% \meta{description} +% Tests if the \meta{token list variable} is entirely empty +% (\emph{i.e.}~contains no tokens at all). % \end{function} % \end{minipage} % \end{framed} % -% \DescribeEnv{variable} -% If you are documenting a variable instead of a function, use the -% \env{variable} environment instead; it behaves identically to the -% \env{function} environment above. -% % \DescribeEnv{texnote} % This environment is used to call out sections within \env{function} -% and similar that are only of interest to seasoned \TeX{} developers. +% and similar environments that are only of interest to seasoned +% \TeX{} developers. % % \subsection{Describing functions in the implementation} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index 6dbb029c6d7..9319cd39e51 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index f84a0928dc0..614a73d29e2 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -331,13 +331,6 @@ % % The |:cc| variant constructs the \meta{function} name in the same % manner as described for the \meta{tokens}. -% \begin{texnote} -% Protected macros that appear in a \texttt{c}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % \begin{function}[EXP]{\exp_args:No} @@ -374,13 +367,6 @@ % recovered and placed inside braces into the input stream \emph{after} % reinsertion of the \meta{function}. Thus the \meta{function} may take more % than one argument: all others are left unchanged. -% \begin{texnote} -% Protected macros that appear in a \texttt{v}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % \begin{function}[EXP, added = 2018-05-15]{\exp_args:Ne} @@ -683,13 +669,6 @@ % converts this into a control sequence. % Further expansion of this control sequence is then inhibited using % \cs{exp_not:N}. -% \begin{texnote} -% Protected macros that appear in a \texttt{c}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % \begin{function}[EXP]{\exp_not:n} @@ -736,13 +715,6 @@ % name. % The content of the \meta{variable} is recovered, and further % expansion in |x|-type or \texttt{e}-type arguments is prevented using \cs{exp_not:n}. -% \begin{texnote} -% Protected macros that appear in a \texttt{v}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % \begin{function}[EXP]{\exp_not:e} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 296680046c0..adf73279bc7 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 5e35f1920dd..22fae08ae6d 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index 1558d3015a2..38f6d3ff6ac 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 2022-02-24} +% \date{Released 2022-04-10} % \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 7a441e41615..9ae275ac225 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index 1bd233dbbb8..8cd126989af 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index d3f2ea5613d..6fc2681f561 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index aa6b45f1f38..fdaece8932a 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index f452cf3abb7..d116ce92211 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index dd4c4199687..7c24b0822c9 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index 3b1bd6f1b84..307a848a088 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index 65802f5fbf6..8ad1b848804 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index 2a550195092..8cb45a097bd 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 3cb310052af..6cd2dd1b9b5 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 2022-02-24} +% \date{Released 2022-04-10} % \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 0d10240c4ea..993db8a0b62 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index ed69fe5fc68..c0f2daa4829 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index 0060743cbbb..2b279e18d7c 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index 9d459317a7b..e8dc857816b 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index 8a7434f170a..916cef5db2f 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index 5f810a6bd11..bd62a0dbca6 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 360a008995a..81eb124edd9 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -882,6 +882,18 @@ % group and are thus never set. % \end{function} % +% \section{Digesting keys} +% +% \begin{function}[added = 2022-03-09]{\keys_precompile:nnN} +% \begin{syntax} +% \cs{keys_precompile:nnN} \Arg{module} \Arg{keyval list} \meta{tl} +% \end{syntax} +% Parses the \meta{keyval list} as for \cs{keys_set:nn}, placing the +% resulting code for those which set variables or functions into the +% \meta{tl}. Thus this function \enquote{precompiles} the keyval list into +% a set of results which can be applied rapidly. +% \end{function} +% % \section{Utility functions for keys} % % \begin{function}[EXP, pTF, updated = 2022-01-10] @@ -1661,6 +1673,14 @@ % \end{macrocode} % \end{variable} % +% \begin{variable}{\l_@@_precompile_bool, \l_@@_precompile_tl} +% For digesting keys. +% \begin{macrocode} +\bool_new:N \l_@@_precompile_bool +\tl_new:N \l_@@_precompile_tl +% \end{macrocode} +% \end{variable} +% % \begin{variable}{\l_keys_usage_load_prop, \l_keys_usage_preamble_prop} % Global data for document-level information. % \begin{macrocode} @@ -1694,6 +1714,19 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\@@_precompile:n} +% An auxiliary to allow cleaner showing of code. +% \begin{macrocode} +\cs_new_protected:Npn \@@_precompile:n #1 + { + \bool_if:NTF \l_@@_precompile_bool + { \tl_put_right:Nn \l_@@_precompile_tl } + { \use:n } + {#1} + } +% \end{macrocode} +% \end{macro} +% % \subsection{The key defining mechanism} % % \begin{macro}{\keys_define:nn} @@ -1866,7 +1899,7 @@ { \exp_not:c { bool_ #2 set_ #3 :N } \exp_not:N #1 } \@@_cmd_set:nx { \l_keys_path_str / false } { \exp_not:c { bool_ #2 set_ #4 :N } \exp_not:N #1 } - \@@_cmd_set:nn { \l_keys_path_str / unknown } + \@@_cmd_set_direct:nn { \l_keys_path_str / unknown } { \msg_error:nnx { keys } { boolean-values-only } \l_keys_key_str @@ -1909,8 +1942,8 @@ { \cs_set_nopar:cpn { \c_@@_type_root_str \l_keys_path_str } { choice } - \@@_cmd_set:nn \l_keys_path_str { #1 {##1} } - \@@_cmd_set:nn { \l_keys_path_str / unknown } + \@@_cmd_set_direct:nn \l_keys_path_str { #1 {##1} } + \@@_cmd_set_direct:nn { \l_keys_path_str / unknown } { \msg_error:nnxx { keys } { choice-unknown } \l_keys_path_str {##1} @@ -1952,13 +1985,18 @@ % \end{macro} % % \begin{macro} -% {\@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo} +% { +% \@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo, +% \@@_cmd_set_direct:nn +% } % Setting the code for a key first logs if appropriate that we are % defining a new key, then saves the code. % \begin{macrocode} \cs_new_protected:Npn \@@_cmd_set:nn #1#2 - { \cs_set_protected:cpn { \c_@@_code_root_str #1 } ##1 {#2} } + { \@@_cmd_set_direct:nn {#1} { \@@_precompile:n {#2} } } \cs_generate_variant:Nn \@@_cmd_set:nn { nx , Vn , Vo } +\cs_new_protected:Npn \@@_cmd_set_direct:nn #1#2 + { \cs_set_protected:cpn { \c_@@_code_root_str #1 } ##1 {#2} } % \end{macrocode} % \end{macro} % @@ -1970,7 +2008,10 @@ \cs_new_protected:Npn \@@_cs_set:NNpn #1#2#3# { \cs_set_protected:cpx { \c_@@_code_root_str \l_keys_path_str } ##1 - { #1 \exp_not:N #2 \exp_not:n {#3} {##1} } + { + \@@_precompile:n + { #1 \exp_not:N #2 \exp_not:n {#3} {##1} } + } \use_none:n } \cs_generate_variant:Nn \@@_cs_set:NNpn { Nc } @@ -2089,13 +2130,17 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_meta_make:n #1 { - \@@_cmd_set:Vo \l_keys_path_str + \exp_args:NVo \@@_cmd_set_direct:nn \l_keys_path_str { - \exp_after:wN \keys_set:nn \exp_after:wN { \l_@@_module_str } {#1} + \exp_after:wN \keys_set:nn \exp_after:wN + { \l_@@_module_str } {#1} } } \cs_new_protected:Npn \@@_meta_make:nn #1#2 - { \@@_cmd_set:Vn \l_keys_path_str { \keys_set:nn {#1} {#2} } } + { + \exp_args:NV \@@_cmd_set_direct:nn + \l_keys_path_str { \keys_set:nn {#1} {#2} } + } % \end{macrocode} % \end{macro} % \end{macro} @@ -2895,6 +2940,20 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\keys_precompile:nnN} +% A simple wrapper. +% \begin{macrocode} +\cs_new_protected:Npn \keys_precompile:nnN #1#2#3 + { + \bool_set_true:N \l_@@_precompile_bool + \tl_clear:N \l_@@_precompile_tl + \keys_set:nn {#1} {#2} + \bool_set_false:N \l_@@_precompile_bool + \tl_set_eq:NN #3 \l_@@_precompile_tl + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\@@_set_keyval:n, \@@_set_keyval:nn} % \begin{macro}{\@@_set_keyval:nnn, \@@_set_keyval:onn} % \begin{macro}{\@@_find_key_module:wNN} @@ -3379,7 +3438,11 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\keys_show:nn, \keys_log:nn, \@@_show:Nnn} +% \begin{macro}{\keys_show:nn, \keys_log:nn} +% \begin{macro}{\@@_show:Nnn} +% \begin{macro}{\@@_show:n} +% \begin{macro}{\@@_show:w} +% \begin{macro}{\@@_show:Nw} % To show a key, show its code using a message. % \begin{macrocode} \cs_new_protected:Npn \keys_show:nn @@ -3395,18 +3458,52 @@ { \exp_args:Nnf \msg_show_item_unbraced:nn { code } { - \exp_args:Nc \cs_replacement_spec:N + \exp_args:Ne \@@_show:n { - \c_@@_code_root_str - \@@_trim_spaces:n { #2 / #3 } + \exp_args:Nc \cs_replacement_spec:N + { + \c_@@_code_root_str + \@@_trim_spaces:n { #2 / #3 } + } } } } } { } { } } +\cs_new:Npx \@@_show:n #1 + { + \exp_not:N \@@_show:w + #1 + \tl_to_str:n { \@@_precompile:n } + #1 + \tl_to_str:n { \@@_precompile:n } + \exp_not:N \s_@@_stop + } +\use:x + { + \cs_new:Npn \exp_not:N \@@_show:w + ##1 \tl_to_str:n { \@@_precompile:n } + ##2 \tl_to_str:n { \@@_precompile:n } + ##3 \exp_not:N \s_@@_stop + } + { + \tl_if_blank:nTF {#2} + {#1} + { \@@_show:Nw #2 \s_@@_stop } + } +\use:x + { + \cs_new:Npn \exp_not:N \@@_show:Nw ##1##2 + \c_right_brace_str \exp_not:N \s_@@_stop + } + {#2} % \end{macrocode} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % % \subsection{Messages} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx index fb04de0adfa..534d37be27c 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -100,15 +100,19 @@ % \end{macrocode} % % \begin{macro}[EXP,pTF]{\legacy_if:n} -% A friendly wrapper. +% A friendly wrapper. We need to use the \cs{if:w} approach here, rather than +% testing against \tn{iftrue}/\tn{iffalse} as the latter approach fails for +% primitive conditionals such as \tn{ifmmode}. The \cs{reverse_if:N} here +% means that we get a slightly more useful error if the name is undefined. % \begin{macrocode} \prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF } { - \exp_args:Nc \if_meaning:w { if#1 } \iftrue - \prg_return_true: - \else: + \exp_after:wN \reverse_if:N + \cs:w if#1 \cs_end: \prg_return_false: - \fi: + \else: + \prg_return_true: + \fi: } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 456a02293d7..04786d3c1f5 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -317,6 +317,7 @@ local scan_string = token.scan_string local scan_keyword = token.scan_keyword local put_next = token.put_next local token_create = token.create +local token_new = token.new % \end{macrocode} % % Since token.create only returns useful values after the tokens diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 23add4a7c66..ef95cabf996 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -1854,9 +1854,7 @@ { Cannot~generate~null~char~as~a~space. } \msg_new:nnn { char } { out-of-range } { Charcode~requested~out~of~engine~range. } -\msg_new:nnn { char } { space } - { Cannot~generate~space~chars. } -\msg_new:nnnn { ior } { quote-in-shell } +\msg_new:nnnn { kernel } { quote-in-shell } { Quotes~in~shell~command~'#1'. } { Shell~commands~cannot~contain~quotes~("). } \msg_new:nnnn { keys } { no-property } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index f330647e3f1..50512593c3c 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -1140,12 +1140,14 @@ \@@_primitive:NN \kcatcode \tex_kcatcode:D \@@_primitive:NN \kuten \tex_kuten:D \@@_primitive:NN \lastnodechar \tex_lastnodechar:D + \@@_primitive:NN \lastnodefont \tex_lastnodefont:D \@@_primitive:NN \lastnodesubtype \tex_lastnodesubtype:D \@@_primitive:NN \noautospacing \tex_noautospacing:D \@@_primitive:NN \noautoxspacing \tex_noautoxspacing:D \@@_primitive:NN \pagefistretch \tex_pagefistretch:D \@@_primitive:NN \postbreakpenalty \tex_postbreakpenalty:D \@@_primitive:NN \prebreakpenalty \tex_prebreakpenalty:D + \@@_primitive:NN \ptexlineendmode \tex_lineendmode:D \@@_primitive:NN \ptexminorversion \tex_ptexminorversion:D \@@_primitive:NN \ptexrevision \tex_ptexrevision:D \@@_primitive:NN \ptexversion \tex_ptexversion:D @@ -1161,6 +1163,8 @@ \@@_primitive:NN \textbaselineshiftfactor \tex_textbaselineshiftfactor:D \@@_primitive:NN \tfont \tex_tfont:D + \@@_primitive:NN \toucs \tex_toucs:D + \@@_primitive:NN \ucs \tex_ucs:D \@@_primitive:NN \xkanjiskip \tex_xkanjiskip:D \@@_primitive:NN \xspcode \tex_xspcode:D \@@_primitive:NN \ybaselineshift \tex_ybaselineshift:D @@ -1176,7 +1180,6 @@ \@@_primitive:NN \kchar \tex_kchar:D \@@_primitive:NN \kchardef \tex_kchardef:D \@@_primitive:NN \kuten \tex_kuten:D - \@@_primitive:NN \ucs \tex_ucs:D \@@_primitive:NN \uptexrevision \tex_uptexrevision:D \@@_primitive:NN \uptexversion \tex_uptexversion:D % \end{macrocode} @@ -1195,6 +1198,7 @@ % \begin{macrocode} \@@_primitive:NN \partokencontext \tex_partokencontext:D \@@_primitive:NN \partokenname \tex_partokenname:D + \@@_primitive:NN \showstream \tex_showstream:D \@@_primitive:NN \tracingstacklevels \tex_tracingstacklevels:D % \end{macrocode} % End of the \enquote{just the names} part of the source. @@ -1470,9 +1474,9 @@ % Here \enquote{smaller} refers to codepoint order which does not correspond to % the user expected order for most non-ASCII strings. % \begin{macrocode} -local minus_tok = token.new(string.byte'-', 12) -local zero_tok = token.new(string.byte'0', 12) -local one_tok = token.new(string.byte'1', 12) +local minus_tok = token_new(string.byte'-', 12) +local zero_tok = token_new(string.byte'0', 12) +local one_tok = token_new(string.byte'1', 12) luacmd('tex_strcmp:D', function() local first = scan_string() local second = scan_string() @@ -1487,14 +1491,19 @@ end, 'global') % % \begin{macro}{\tex_Ucharcat:D} % Creating arbitrary chars using |tex.cprint|. -% The alternative approach using |token.put_next(token.create(...))| -% would be about 10\% slower. +% The alternative approach using |token.new(...)| is about 10\% slower +% but needed to create arbitrary space tokens. % \begin{macrocode} +local sprint = tex.sprint local cprint = tex.cprint luacmd('tex_Ucharcat:D', function() local charcode = scan_int() local catcode = scan_int() - cprint(catcode, utf8_char(charcode)) + if catcode == 10 then + sprint(token_new(charcode, 10)) + else + cprint(catcode, utf8_char(charcode)) + end end, 'global') % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx index c6841148de7..b2ed19cb085 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index 1742e7c0a51..98f62111870 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index de14307b84c..1d0694fe6a2 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index a31d8830163..53ea8dfc182 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index 4eb2dacf102..e9c254bb029 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index c6300a84470..bf285df9646 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index d6ba0a90c1b..75e80b0c54f 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 75509e1e546..11604bbf817 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx index f854e3ea2e4..8646c378e52 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 897f4b962be..ddfdd102793 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -222,8 +222,8 @@ % % \section{String conditionals} % -% \begin{function}[EXP,pTF, added = 2015-09-18] -% {\str_if_empty:N, \str_if_empty:c} +% \begin{function}[EXP,pTF, added = 2015-09-18, updated = 2022-03-21] +% {\str_if_empty:N, \str_if_empty:c, \str_if_empty:n} % \begin{syntax} % \cs{str_if_empty_p:N} \meta{str~var} % \cs{str_if_empty:NTF} \meta{str~var} \Arg{true code} \Arg{false code} @@ -282,8 +282,8 @@ % tests whether \meta{string_2} is found inside \meta{string_1}. % \end{function} % -% \begin{function}[added = 2013-07-24, updated = 2015-02-28, EXP, noTF] -% {\str_case:nn, \str_case:Vn, \str_case:on, \str_case:nV, \str_case:nv} +% \begin{function}[added = 2013-07-24, updated = 2022-03-21, EXP, noTF] +% {\str_case:nn, \str_case:Vn, \str_case:Nn, \str_case:on, \str_case:nV, \str_case:nv} % \begin{syntax} % \cs{str_case:nnTF} \Arg{test string} \\ % ~~|{| \\ @@ -747,16 +747,6 @@ % correctly deal with context-dependence and other factors appropriate % to text case changing. % \end{itemize} -% -% \begin{texnote} -% As with all \pkg{expl3} functions, the input supported by -% \cs{str_foldcase:n} is \emph{engine-native} characters which are or -% interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{} -% \emph{only} the Latin alphabet characters A--Z are case-folded -% (\emph{i.e.}~the \textsc{ascii} range which coincides with -% \textsc{utf-8}). Full \textsc{utf-8} support is available with both -% \XeTeX{} and \LuaTeX{}. -% \end{texnote} % \end{function} % % \begin{function}[EXP, added = 2019-11-26] @@ -789,18 +779,6 @@ % a language-insensitive process, there is no special treatment of % Turkic input (\emph{i.e.}~\texttt{I} always folds to \texttt{i} and % not to \texttt{\i}). -% -% \begin{texnote} -% As with all \pkg{expl3} functions, the input supported by -% \cs{str_foldcase:n} is \emph{engine-native} characters which are or -% interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{} -% \emph{only} the Latin alphabet characters A--Z are case-folded -% (\emph{i.e.}~the \textsc{ascii} range which coincides with -% \textsc{utf-8}). Full \textsc{utf-8} support is available with both -% \XeTeX{} and \LuaTeX{}, subject only to the fact that \XeTeX{} in -% particular has issues with characters of code above hexadecimal -% $0\mathrm{xFFFF}$ when interacting with \cs{tl_to_str:n}. -% \end{texnote} % \end{function} % % \section{Viewing strings} @@ -1113,7 +1091,7 @@ % % \begin{macro}[pTF, EXP] % { -% \str_if_empty:N, \str_if_empty:c, +% \str_if_empty:N, \str_if_empty:c, \str_if_empty:n, % \str_if_exist:N, \str_if_exist:c % } % More copy-paste! @@ -1126,6 +1104,8 @@ { p , T , F , TF } \prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c { p , T , F , TF } +\prg_new_eq_conditional:NNn \str_if_empty:n \tl_if_empty:n + { p , T , F , TF } % \end{macrocode} % \end{macro} % @@ -1224,7 +1204,7 @@ % \end{macro} % % \begin{macro}[EXP, noTF] -% {\str_case:nn, \str_case:Vn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_e:nn} +% {\str_case:nn, \str_case:Vn, \str_case:Nn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_e:nn} % \begin{macro}[EXP]{\@@_case:nnTF, \@@_case_e:nnTF} % \begin{macro}[EXP] % {\@@_case:nw, \@@_case_e:nw, \@@_case_end:nw} @@ -1254,6 +1234,10 @@ \cs_new:Npn \@@_case:nnTF #1#2#3#4 { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop } \cs_generate_variant:Nn \str_case:nn { V , o , nV , nv } +\cs_new_eq:NN \str_case:Nn \str_case:Vn +\cs_new_eq:NN \str_case:NnT \str_case:VnT +\cs_new_eq:NN \str_case:NnF \str_case:VnF +\cs_new_eq:NN \str_case:NnTF \str_case:VnTF \prg_generate_conditional_variant:Nnn \str_case:nn { V , o , nV , nv } { T , F , TF } \cs_new:Npn \@@_case:nw #1#2#3 @@ -1918,10 +1902,21 @@ % \begin{macro}[EXP]{\@@_change_case_loop:nw} % \begin{macro}[EXP]{\@@_change_case_space:n} % \begin{macro}[EXP]{\@@_change_case_char:nN} +% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNN} +% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNN} +% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNNN} +% \begin{macro}[EXP] +% { +% \@@_change_case_char_UTFviii:nn , +% \@@_change_case_char_UTFviii_lower:nn , +% \@@_change_case_char_UTFviii_upper:nn , +% \@@_change_case_char_UTFviii_fold:nn +% } % Case changing for programmatic reasons is done by first detokenizing % input then doing a simple loop that only has to worry about spaces % and everything else. The output is detokenized to allow data sharing -% with text-based case changing. +% with text-based case changing. Similarly, for $8$-bit engines the +% multi-byte information is shared. % \begin{macrocode} \cs_new:Npn \str_foldcase:n #1 { \@@_change_case:nn {#1} { fold } } \cs_new:Npn \str_lowercase:n #1 { \@@_change_case:nn {#1} { lower } } @@ -1965,7 +1960,100 @@ { \use:c { char_str_ #1 case:N } #2 } \@@_change_case_loop:nw {#1} } +\if_int_compare:w 0 + \cs_if_exist:NT \tex_XeTeXversion:D { 1 } + \cs_if_exist:NT \tex_luatexversion:D { 1 } + > 0 \exp_stop_f: +\else: + \cs_gset:Npn \@@_change_case_char:nN #1#2 + { + \@@_if_recursion_tail_stop_do:Nn #2 + { \@@_change_case_end:wn } + \int_compare:nNnTF { `#2 } > { "80 } + { + \int_compare:nNnTF { `#2 } < { "E0 } + { \@@_change_case_char_UTFviii:nNN } + { + \int_compare:nNnTF { `#2 } < { "F0 } + { \@@_change_case_char_UTFviii:nNNN } + { \@@_change_case_char_UTFviii:nNNNN } + } + {#1} #2 + } + { + \@@_change_case_output:fw + { \use:c { char_str_ #1 case:N } #2 } + \@@_change_case_loop:nw {#1} + } + } + \cs_new:Npn \@@_change_case_char_UTFviii:nNN #1#2#3 + { \@@_change_case_char_UTFviii:nn {#1} {#2#3} } + \cs_new:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4 + { \@@_change_case_char_UTFviii:nn {#1} {#2#3#4} } + \cs_new:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5 + { \@@_change_case_char_UTFviii:nn {#1} {#2#3#4#5} } % \end{macrocode} +% Skip high chars for the Japanese engines. +% \begin{macrocode} + \cs_if_exist:NF \tex_pdftexversion:D + { + \cs_gset:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4 + { + \@@_change_case_output:nw {#2#3#4} + \@@_change_case_loop:nw {#1} + } + \cs_gset:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5 + { + \@@_change_case_output:nw {#2#3#4#5} + \@@_change_case_loop:nw {#1} + } + } + \cs_new:Npn \@@_change_case_char_UTFviii:nn #1#2 + { + \use:c { @@_change_case_char_UTFviii_ #1 :nn } {#1} {#2} + } + \cs_new:Npn \@@_change_case_char_UTFviii_upper:nn #1#2 + { + \@@_change_case_output:fw + { + \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl } + { + \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: } + } + {#2} + } + \@@_change_case_loop:nw {#1} + } + \cs_new_eq:NN \@@_change_case_char_UTFviii_lower:nn + \@@_change_case_char_UTFviii_upper:nn + \cs_new:Npn \@@_change_case_char_UTFviii_fold:nn #1#2 + { + \@@_change_case_output:fw + { + \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl } + { + \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: } + } + { + \cs_if_exist:cTF { c__kernel_lowercase_ #2 _tl } + { + \__kernel_tl_to_str:w + \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_lowercase_ #2 _tl \cs_end: } + } + {#2} + } + } + \@@_change_case_loop:nw {#1} + } +\fi: +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % \end{macro} % \end{macro} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 4134831b8ba..a211af619bd 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx index 61681108e26..faa9960f790 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -670,10 +670,10 @@ { \@@_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6#7} } \cs_new:Npn \@@_change_case_char_UTFviii:nnnn #1#2#3#4 { - \cs_if_exist:cTF { c_@@_ #1 case_ \tl_to_str:n {#4} _tl } + \cs_if_exist:cTF { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl } { \@@_change_case_store:v - { c_@@_ #1 case_ \tl_to_str:n {#4} _tl } + { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl } } { \@@_change_case_store:n {#4} } \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3} @@ -1536,11 +1536,11 @@ % % For $8$-bit engines we now need to define the case-change data for % the multi-octet mappings. This data is here not in the \pkg{char} module -% as the multi-byte nature means they are never |N|-type. -% These need a list of what code points are -% doable in |T1| so the list is hard coded (there's no saving in loading -% the mappings dynamically). All of the straight-forward ones have two -% octets, so that is taken as read. +% as the multi-byte nature means they are never |N|-type. As this data is +% needed both for text and string work, it is stored as |kernel|: it remains +% internal as it is not really suitable for wider exposure. +% +% The first set of codepoints are those in |T1|: all of these are two bytes. % \begin{macrocode} \group_begin: \bool_lazy_or:nnF @@ -1562,7 +1562,7 @@ { \tl_const:cx { - c_@@_ #1 case_ + c__kernel_ #1 case_ \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } _tl @@ -1578,7 +1578,7 @@ { \tl_const:cx { - c_@@_lowercase_ + c__kernel_lowercase_ \char_generate:nn {#1} { 12 } \char_generate:nn {#2} { 12 } _tl @@ -1694,8 +1694,7 @@ { 0218 } { 0219 } { 021A } { 021B } % \end{macrocode} -% Add |T2| (Cyrillic) as this is doable using a classical \tn{MakeUppercase} -% approach. +% Add |T2| (Cyrillic) : again two bytes. % \begin{macrocode} { 0400 } { 0450 } { 0401 } { 0451 } @@ -1818,7 +1817,7 @@ { \tl_const:cx { - c_@@_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } _tl @@ -1859,7 +1858,7 @@ { \tl_const:cn { - c_@@_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } _tl @@ -1880,7 +1879,7 @@ { \tl_const:cx { - c_@@_ #1 case_ + c__kernel_ #1 case_ \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } \char_generate:nn {#4} { 12 } @@ -1899,7 +1898,7 @@ { \tl_const:cx { - c_@@_lowercase_ + c__kernel_lowercase_ \char_generate:nn {#1} { 12 } \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } @@ -2025,7 +2024,7 @@ { \tl_const:cx { - c_@@_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } \char_generate:nn {##3} { 12 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx index 922a371d333..a055aec838d 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx index 0d1365c8d2b..3cb5795a5df 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -562,11 +562,45 @@ % \end{variable} % % \begin{variable}{\l_text_expand_exclude_tl} -% Commands which need not to expand. +% Commands which need not to expand. We start with a somewhat historical +% list, and tidy up if possible. % \begin{macrocode} \tl_new:N \l_text_expand_exclude_tl \tl_set:Nn \l_text_expand_exclude_tl { \begin \cite \end \label \ref } +\bool_lazy_and:nnT + { \str_if_eq_p:Vn \fmtname { LaTeX2e } } + { \tl_if_exist_p:N \@expl@finalise@setup@@@@ } + { + \tl_gput_right:Nn \@expl@finalise@setup@@@@ + { + \tl_gput_right:Nn \@kernel@after@begindocument + { + \group_begin: + \cs_set_protected:Npn \@@_tmp:w #1 + { + \tl_clear:N \l_text_expand_exclude_tl + \tl_map_inline:nn {#1} + { + \bool_lazy_any:nF + { + { \token_if_protected_macro_p:N ##1 } + { \token_if_protected_long_macro_p:N ##1 } + { + \str_if_eq_p:ee + { \cs_replacement_spec:N ##1 } + { \exp_not:n { \protect ##1 } \c_space_tl } + } + } + { \tl_put_right:Nn \l_text_expand_exclude_tl {##1} } + } + } + \exp_args:NV \@@_tmp:w \l_text_expand_exclude_tl + \exp_args:NNNV \group_end: + \tl_set:Nn \l_text_expand_exclude_tl \l_text_expand_exclude_tl + } + } + } % \end{macrocode} % \end{variable} % @@ -632,13 +666,14 @@ % \begin{macro}[EXP]{\@@_expand_accent:NN} % \begin{macro}[EXP]{\@@_expand_letterlike:N} % \begin{macro}[EXP]{\@@_expand_letterlike:NN} -% \begin{macro}[EXP]{\@@_expand_cs:N, \@@_expand_encoding:N} -% \begin{macro}[EXP]{\@@_expand_encoding_escape:N} +% \begin{macro}[EXP]{\@@_expand_cs:N} +% \begin{macro}[EXP]{\@@_expand_protect:w} % \begin{macro}[EXP]{\@@_expand_protect:N} % \begin{macro}[EXP]{\@@_expand_protect:nN} % \begin{macro}[EXP]{\@@_expand_protect:Nw} % \begin{macro}[EXP]{\@@_expand_testopt:N} % \begin{macro}[EXP]{\@@_expand_testopt:NNn} +% \begin{macro}[EXP]{\@@_expand_encoding:N, \@@_expand_encoding_escape:N} % \begin{macro}[EXP]{\@@_expand_replace:N} % \begin{macro}[EXP]{\@@_expand_replace:n} % \begin{macro}[EXP]{\@@_expand_cs_expand:N} @@ -947,14 +982,15 @@ % \end{macrocode} % \LaTeXe{}'s \cs{protect} makes life interesting. Where possible, we % simply remove it and replace with the \enquote{parent} command; of course, -% the \cs{protect} might be explicit, in which case we need to leave it alone -% if it's required. There is also the case of a straight \tn{@protected@testopt} -% to cover. +% the \cs{protect} might be explicit, in which case we need to leave it alone. +% That includes the case where it's not even followed by an \texttt{N}-type +% token. There is also the case of a straight \tn{@protected@testopt} to +% cover. % \begin{macrocode} \cs_new:Npx \@@_expand_cs:N #1 { \exp_not:N \str_if_eq:nnTF {#1} { \exp_not:N \protect } - { \exp_not:N \@@_expand_protect:N } + { \exp_not:N \@@_expand_protect:w } { \bool_lazy_and:nnTF { \cs_if_exist_p:N \fmtname } @@ -963,8 +999,23 @@ { \exp_not:N \@@_expand_replace:N #1 } } } +\cs_new:Npn \@@_expand_protect:w #1 \q_@@_recursion_stop + { + \tl_if_head_is_N_type:nTF {#1} + { \@@_expand_protect:N } + { + \@@_expand_store:n { \protect } + \@@_expand_loop:w + } + #1 \q_@@_recursion_stop + } \cs_new:Npn \@@_expand_protect:N #1 { + \@@_if_recursion_tail_stop_do:Nn #1 + { + \@@_expand_store:n { \protect } + \@@_expand_end:w + } \exp_args:Ne \@@_expand_protect:nN { \cs_to_str:N #1 } #1 } @@ -1122,6 +1173,7 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro} % { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index 9f6527b505f..0db5f15d7ab 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -90,7 +90,7 @@ % characters, and the value of registers. % \end{function} % -% \begin{function}[added = 2018-04-09] +% \begin{function}[added = 2018-04-09, updated = 2022-03-26] % {\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn} % \begin{syntax} % \cs{tl_analysis_map_inline:nn} \Arg{token list} \Arg{inline function} @@ -935,47 +935,46 @@ % % \subsection{Mapping through the analysis} % -% \begin{macro}{\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn} -% \begin{macro}{\@@_analysis_map_inline_aux:Nn} -% \begin{macro}{\@@_analysis_map_inline_aux:nnn} +% \begin{macro}{\tl_analysis_map_inline:Nn, \tl_analysis_map_inline:nn} +% \begin{macro}{\@@_analysis_map:Nn} +% \begin{macro}{\@@_analysis_map:NwNw} % First obtain the analysis of the token list into % \cs{g_@@_analysis_result_tl}. To allow nested mappings, increase the -% nesting depth \cs{g__kernel_prg_map_int} (shared between all modules), then -% define the looping macro, which has a name specific to that nesting -% depth. That looping grabs the \meta{tokens}, \meta{catcode} and -% \meta{char code}; it checks for the end of the loop with -% \cs{use_none:n} |##2|, normally empty, but which becomes -% \cs{tl_map_break:} at the end; it then performs the user's code -% |#2|, and loops by calling itself. When the loop ends, remember to -% decrease the nesting depth. +% nesting depth \cs{g__kernel_prg_map_int} (shared between all +% modules), then define the payload macro, which runs the user code +% and has a name specific to that nesting depth. The looping macro +% grabs the \meta{tokens}, \meta{catcode} and \meta{char code}; it +% checks for the end of the loop with \cs{use_none:n} |##2|, normally +% empty, but which becomes \cs{tl_map_break:} at the end; it then +% calls the payload macro with the arguments in the correct order +% (this is the reason why we cannot directly use the same macro for +% looping and payload), and loops by calling itself. When the loop +% ends, remember to decrease the nesting depth. % \begin{macrocode} +\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1 + { \exp_args:No \tl_analysis_map_inline:nn #1 } \cs_new_protected:Npn \tl_analysis_map_inline:nn #1 { \@@_analysis:n {#1} \int_gincr:N \g__kernel_prg_map_int - \exp_args:Nc \@@_analysis_map_inline_aux:Nn + \exp_args:Nc \@@_analysis_map:Nn { @@_analysis_map_inline_ \int_use:N \g__kernel_prg_map_int :wNw } } -\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1 - { \exp_args:No \tl_analysis_map_inline:nn #1 } -\cs_new_protected:Npn \@@_analysis_map_inline_aux:Nn #1#2 +\cs_new_protected:Npn \@@_analysis_map:Nn #1#2 { - \cs_gset_protected:Npn #1 ##1 \s_@@ ##2 ##3 \s_@@ - { - \use_none:n ##2 - \@@_analysis_map_inline_aux:nnn {##1} {##3} {##2} - } - \cs_gset_protected:Npn \@@_analysis_map_inline_aux:nnn ##1##2##3 - { - #2 - #1 - } - \exp_after:wN #1 + \cs_gset_protected:Npn #1 ##1##2##3 {#2} + \exp_after:wN \@@_analysis_map:NwNw \exp_after:wN #1 \g_@@_analysis_result_tl \s_@@ { ? \tl_map_break: } \s_@@ \prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__kernel_prg_map_int } } +\cs_new_protected:Npn \@@_analysis_map:NwNw #1 #2 \s_@@ #3 #4 \s_@@ + { + \use_none:n #3 + #1 {#2} {#4} {#3} + \@@_analysis_map:NwNw #1 + } % \end{macrocode} % \end{macro} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index bd78c69bde6..68d2cdaf8a5 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index 909dff2b7e8..3d5858a37ad 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -139,12 +139,14 @@ % \item $6$ (parameter) % \item $7$ (math superscript) % \item $8$ (math subscript) +% \item $10$ (space) % \item $11$ (letter) % \item $12$ (other) % \item $13$ (active) % \end{itemize} % and other values raise an error. The \meta{charcode} may be any one valid -% for the engine in use. +% for the engine in use, except that for \meta{catcode} $10$, \meta{charcode} +% $0$ is not allowed. % Active characters cannot be generated in older versions of \XeTeX{}. % Another way to build token lists with unusual category codes is % \cs{regex_replace:nnN} |{.*}| \Arg{replacement} \meta{tl~var}. @@ -1527,26 +1529,22 @@ % \begin{macrocode} \cs_new:Npn \@@_generate_aux:w #1 ; #2 ; { - \if_int_compare:w #2 = 10 \exp_stop_f: - \if_int_compare:w #1 = \c_zero_int - \msg_expandable_error:nn { char } { null-space } - \else: - \msg_expandable_error:nn { char } { space } - \fi: + \if_int_odd:w 0 + \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f: + \msg_expandable_error:nn { char } + { invalid-catcode } \else: \if_int_odd:w 0 - \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f: + \if_int_compare:w #1 < \c_zero_int 1 \fi: + \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f: \msg_expandable_error:nn { char } - { invalid-catcode } + { out-of-range } \else: - \if_int_odd:w 0 - \if_int_compare:w #1 < \c_zero_int 1 \fi: - \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f: - \msg_expandable_error:nn { char } - { out-of-range } + \if_int_compare:w #2#1 = 100 \exp_stop_f: + \msg_expandable_error:nn { char } { null-space } \else: \@@_generate_aux:nnw {#1} {#2} \fi: diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index 317630568df..db57bd0f386 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 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % |