summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx43
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx205
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx412
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx45
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx26
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx546
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/expl3.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3basics.dtx9
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3box.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3clist.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3color.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3debug.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3doc.dtx64
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3expan.dtx30
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3file.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3flag.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3int.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3keys.dtx125
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx16
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx3
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3msg.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3names.dtx25
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prg.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prop.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3quark.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3regex.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3seq.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3skip.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sort.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str.dtx148
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sys.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx33
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text.dtx68
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx55
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3token.dtx34
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx2
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
%