[latex3-commits] [git/LaTeX3-latex3-latex2e] develop: Update l3backend and l3kernel to 2023-04-19 (a03c0a84)

Joseph Wright joseph.wright at morningstar2.co.uk
Wed Apr 19 09:58:10 CEST 2023


Repository : https://github.com/latex3/latex2e
On branch  : develop
Link       : https://github.com/latex3/latex2e/commit/a03c0a84e2be2c097c1f4e98e0777ad6b8b33880

>---------------------------------------------------------------

commit a03c0a84e2be2c097c1f4e98e0777ad6b8b33880
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Wed Apr 19 08:53:59 2023 +0100

    Update l3backend and l3kernel to 2023-04-19


>---------------------------------------------------------------

a03c0a84e2be2c097c1f4e98e0777ad6b8b33880
 base/testfiles/github-0944.tlg                   |   2 +-
 texmf/tex/latex/l3backend/l3backend-dvipdfmx.def |   6 +-
 texmf/tex/latex/l3backend/l3backend-dvips.def    |   4 +-
 texmf/tex/latex/l3backend/l3backend-dvisvgm.def  |   5 +-
 texmf/tex/latex/l3backend/l3backend-luatex.def   |  33 ++-
 texmf/tex/latex/l3backend/l3backend-pdftex.def   |  33 ++-
 texmf/tex/latex/l3backend/l3backend-xetex.def    |   6 +-
 texmf/tex/latex/l3kernel/expl3-code.tex          | 299 ++++++++++++++---------
 texmf/tex/latex/l3kernel/expl3-generic.tex       |   2 +-
 texmf/tex/latex/l3kernel/expl3.ltx               |   2 +-
 texmf/tex/latex/l3kernel/expl3.sty               |   2 +-
 11 files changed, 240 insertions(+), 154 deletions(-)

diff --git a/base/testfiles/github-0944.tlg b/base/testfiles/github-0944.tlg
index e1d1e169..c49aa72b 100644
--- a/base/testfiles/github-0944.tlg
+++ b/base/testfiles/github-0944.tlg
@@ -22,7 +22,7 @@ LaTeX Warning: Reference `unknown' on page 1 undefined on input line ....
 ] (github-0944.aux)
  ***********
 -formatname- <-formatversion-> pre-release-2 (-release-version-test- branch)
-L3 programming layer <2023-03-30>
+L3 programming layer <2023-04-19>
  ***********
  *File List*
  -show the file list here-
diff --git a/texmf/tex/latex/l3backend/l3backend-dvipdfmx.def b/texmf/tex/latex/l3backend/l3backend-dvipdfmx.def
index 36a61dec..e986d264 100644
--- a/texmf/tex/latex/l3backend/l3backend-dvipdfmx.def
+++ b/texmf/tex/latex/l3backend/l3backend-dvipdfmx.def
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvipdfmx.def}{2023-01-16}{}
+  {l3backend-dvipdfmx.def}{2023-04-19}{}
   {L3 backend support: dvipdfmx}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -503,7 +503,7 @@
     \cs_if_exist:NTF \hook_gput_code:nnn
       {
         \hook_gput_code:nnn
-          { file / l3graphics.sty / after }
+          { package / l3graphics / after }
           { backend }
           {#1}
       }
@@ -607,7 +607,7 @@
               \tl_if_empty:NF \l__graphics_decodearray_str
                 { /Decode~[ \l__graphics_decodearray_str ] }
               \bool_if:NT \l__graphics_interpolate_bool
-                { /Interpolate~true> }
+                { /Interpolate~true }
             >>
           }
       }
diff --git a/texmf/tex/latex/l3backend/l3backend-dvips.def b/texmf/tex/latex/l3backend/l3backend-dvips.def
index ff1c6cd5..49325030 100644
--- a/texmf/tex/latex/l3backend/l3backend-dvips.def
+++ b/texmf/tex/latex/l3backend/l3backend-dvips.def
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvips.def}{2023-01-16}{}
+  {l3backend-dvips.def}{2023-04-19}{}
   {L3 backend support: dvips}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -599,7 +599,7 @@
     \cs_if_exist:NTF \hook_gput_code:nnn
       {
         \hook_gput_code:nnn
-          { file / l3graphics.sty / after }
+          { package / l3graphics / after }
           { backend }
           {#1}
       }
diff --git a/texmf/tex/latex/l3backend/l3backend-dvisvgm.def b/texmf/tex/latex/l3backend/l3backend-dvisvgm.def
index 4d83257e..27398561 100644
--- a/texmf/tex/latex/l3backend/l3backend-dvisvgm.def
+++ b/texmf/tex/latex/l3backend/l3backend-dvisvgm.def
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvisvgm.def}{2023-01-16}{}
+  {l3backend-dvisvgm.def}{2023-04-19}{}
   {L3 backend support: dvisvgm}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -494,7 +494,7 @@
     \cs_if_exist:NTF \hook_gput_code:nnn
       {
         \hook_gput_code:nnn
-          { file / l3graphics.sty / after }
+          { package / l3graphics / after }
           { backend }
           {#1}
       }
@@ -644,7 +644,6 @@
 \__graphics_backend_loaded:n
   { \cs_new_eq:NN \__graphics_backend_get_pagecount:n \__graphics_get_pagecount:n }
 %% File: l3backend-pdf.dtx
-\box_new:N \l__pdf_internal_box
 \cs_new_protected:Npn \__pdf_backend_annotation:nnnn #1#2#3#4 { }
 \cs_new:Npn \__pdf_backend_annotation_last: { }
 \cs_new_protected:Npn \__pdf_backend_link_begin_goto:nnw #1#2 { }
diff --git a/texmf/tex/latex/l3backend/l3backend-luatex.def b/texmf/tex/latex/l3backend/l3backend-luatex.def
index e5b62586..9342d7cd 100644
--- a/texmf/tex/latex/l3backend/l3backend-luatex.def
+++ b/texmf/tex/latex/l3backend/l3backend-luatex.def
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-luatex.def}{2023-01-16}{}
+  {l3backend-luatex.def}{2023-04-19}{}
   {L3 backend support: PDF output (LuaTeX)}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -514,7 +514,7 @@
     \cs_if_exist:NTF \hook_gput_code:nnn
       {
         \hook_gput_code:nnn
-          { file / l3graphics.sty / after }
+          { package / l3graphics / after }
           { backend }
           {#1}
       }
@@ -526,19 +526,20 @@
       \l_graphics_search_ext_seq
       { .pdf , .eps , .ps , .png , .jpg , .jpeg  }
   }
-\tl_new:N \l__graphics_graphics_attr_tl
+\tl_new:N \l__graphics_attr_tl
 \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1
   {
     \int_zero:N \l__graphics_page_int
     \tl_clear:N \l__graphics_pagebox_tl
-    \tl_set:Nx \l__graphics_graphics_attr_tl
+    \tl_set:Nx \l__graphics_attr_tl
       {
         \tl_if_empty:NF \l__graphics_decodearray_str
           { :D \l__graphics_decodearray_str }
         \bool_if:NT \l__graphics_interpolate_bool
           { :I }
+        \str_if_empty:NF \l__graphics_pdf_str
+          { :X \l__graphics_pdf_str }
       }
-    \tl_clear:N \l__graphics_graphics_attr_tl
     \__graphics_backend_getbb_auxi:n {#1}
   }
 \cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n
@@ -547,33 +548,38 @@
   {
     \tl_clear:N \l__graphics_decodearray_str
     \bool_set_false:N \l__graphics_interpolate_bool
-    \tl_set:Nx \l__graphics_graphics_attr_tl
+    \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 }
+        \str_if_empty:NF \l__graphics_pdf_str
+          { :X \l__graphics_pdf_str }
       }
     \__graphics_backend_getbb_auxi:n {#1}
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxi:n #1
   {
-    \__graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl }
+    \__graphics_bb_restore:xF { #1 \l__graphics_attr_tl }
       { \__graphics_backend_getbb_auxii:n {#1} }
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxii:n #1
   {
     \exp_args:Ne \__graphics_backend_getbb_auxiii:n
       { \__graphics_backend_dequote:w #1 " #1 " \s__graphics_stop }
-    \int_const:cn { c__graphics_ #1 \l__graphics_graphics_attr_tl _int }
+    \int_const:cn { c__graphics_ #1 \l__graphics_attr_tl _int }
       { \tex_the:D \tex_pdflastximage:D }
-    \__graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl }
+    \__graphics_bb_save:x { #1 \l__graphics_attr_tl }
   }
 \cs_new_protected:Npn \__graphics_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_str }
+      \bool_lazy_any:nT
+        {
+          { \l__graphics_interpolate_bool }
+          { ! \tl_if_empty_p:N \l__graphics_decodearray_str }
+          { ! \str_if_empty_p:N \l__graphics_pdf_str }
+        }
         {
           attr ~
             {
@@ -581,6 +587,7 @@
                 { /Decode~[ \l__graphics_decodearray_str ] }
               \bool_if:NT \l__graphics_interpolate_bool
                 { /Interpolate~true }
+              \l__graphics_pdf_str
             }
         }
       \int_compare:nNnT \l__graphics_page_int > 0
@@ -597,7 +604,7 @@
 \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1
   {
     \tex_pdfrefximage:D
-      \int_use:c { c__graphics_ #1 \l__graphics_graphics_attr_tl _int }
+      \int_use:c { c__graphics_ #1 \l__graphics_attr_tl _int }
   }
 \cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n
 \cs_new_eq:NN \__graphics_backend_include_pdf:n \__graphics_backend_include_jpg:n
diff --git a/texmf/tex/latex/l3backend/l3backend-pdftex.def b/texmf/tex/latex/l3backend/l3backend-pdftex.def
index 174146e2..830e165b 100644
--- a/texmf/tex/latex/l3backend/l3backend-pdftex.def
+++ b/texmf/tex/latex/l3backend/l3backend-pdftex.def
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-pdftex.def}{2023-01-16}{}
+  {l3backend-pdftex.def}{2023-04-19}{}
   {L3 backend support: PDF output (pdfTeX)}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -514,7 +514,7 @@
     \cs_if_exist:NTF \hook_gput_code:nnn
       {
         \hook_gput_code:nnn
-          { file / l3graphics.sty / after }
+          { package / l3graphics / after }
           { backend }
           {#1}
       }
@@ -526,19 +526,20 @@
       \l_graphics_search_ext_seq
       { .pdf , .eps , .ps , .png , .jpg , .jpeg  }
   }
-\tl_new:N \l__graphics_graphics_attr_tl
+\tl_new:N \l__graphics_attr_tl
 \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1
   {
     \int_zero:N \l__graphics_page_int
     \tl_clear:N \l__graphics_pagebox_tl
-    \tl_set:Nx \l__graphics_graphics_attr_tl
+    \tl_set:Nx \l__graphics_attr_tl
       {
         \tl_if_empty:NF \l__graphics_decodearray_str
           { :D \l__graphics_decodearray_str }
         \bool_if:NT \l__graphics_interpolate_bool
           { :I }
+        \str_if_empty:NF \l__graphics_pdf_str
+          { :X \l__graphics_pdf_str }
       }
-    \tl_clear:N \l__graphics_graphics_attr_tl
     \__graphics_backend_getbb_auxi:n {#1}
   }
 \cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n
@@ -547,33 +548,38 @@
   {
     \tl_clear:N \l__graphics_decodearray_str
     \bool_set_false:N \l__graphics_interpolate_bool
-    \tl_set:Nx \l__graphics_graphics_attr_tl
+    \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 }
+        \str_if_empty:NF \l__graphics_pdf_str
+          { :X \l__graphics_pdf_str }
       }
     \__graphics_backend_getbb_auxi:n {#1}
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxi:n #1
   {
-    \__graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl }
+    \__graphics_bb_restore:xF { #1 \l__graphics_attr_tl }
       { \__graphics_backend_getbb_auxii:n {#1} }
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxii:n #1
   {
     \exp_args:Ne \__graphics_backend_getbb_auxiii:n
       { \__graphics_backend_dequote:w #1 " #1 " \s__graphics_stop }
-    \int_const:cn { c__graphics_ #1 \l__graphics_graphics_attr_tl _int }
+    \int_const:cn { c__graphics_ #1 \l__graphics_attr_tl _int }
       { \tex_the:D \tex_pdflastximage:D }
-    \__graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl }
+    \__graphics_bb_save:x { #1 \l__graphics_attr_tl }
   }
 \cs_new_protected:Npn \__graphics_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_str }
+      \bool_lazy_any:nT
+        {
+          { \l__graphics_interpolate_bool }
+          { ! \tl_if_empty_p:N \l__graphics_decodearray_str }
+          { ! \str_if_empty_p:N \l__graphics_pdf_str }
+        }
         {
           attr ~
             {
@@ -581,6 +587,7 @@
                 { /Decode~[ \l__graphics_decodearray_str ] }
               \bool_if:NT \l__graphics_interpolate_bool
                 { /Interpolate~true }
+              \l__graphics_pdf_str
             }
         }
       \int_compare:nNnT \l__graphics_page_int > 0
@@ -597,7 +604,7 @@
 \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1
   {
     \tex_pdfrefximage:D
-      \int_use:c { c__graphics_ #1 \l__graphics_graphics_attr_tl _int }
+      \int_use:c { c__graphics_ #1 \l__graphics_attr_tl _int }
   }
 \cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n
 \cs_new_eq:NN \__graphics_backend_include_pdf:n \__graphics_backend_include_jpg:n
diff --git a/texmf/tex/latex/l3backend/l3backend-xetex.def b/texmf/tex/latex/l3backend/l3backend-xetex.def
index 3a37d457..afc37e66 100644
--- a/texmf/tex/latex/l3backend/l3backend-xetex.def
+++ b/texmf/tex/latex/l3backend/l3backend-xetex.def
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-xetex.def}{2023-01-16}{}
+  {l3backend-xetex.def}{2023-04-19}{}
   {L3 backend support: XeTeX}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -503,7 +503,7 @@
     \cs_if_exist:NTF \hook_gput_code:nnn
       {
         \hook_gput_code:nnn
-          { file / l3graphics.sty / after }
+          { package / l3graphics / after }
           { backend }
           {#1}
       }
@@ -590,7 +590,7 @@
               \tl_if_empty:NF \l__graphics_decodearray_str
                 { /Decode~[ \l__graphics_decodearray_str ] }
               \bool_if:NT \l__graphics_interpolate_bool
-                { /Interpolate~true> }
+                { /Interpolate~true }
             >>
           }
       }
diff --git a/texmf/tex/latex/l3kernel/expl3-code.tex b/texmf/tex/latex/l3kernel/expl3-code.tex
index a163950e..58d68175 100644
--- a/texmf/tex/latex/l3kernel/expl3-code.tex
+++ b/texmf/tex/latex/l3kernel/expl3-code.tex
@@ -71,7 +71,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-03-30}%
+\def\ExplFileDate{2023-04-19}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -28466,6 +28466,116 @@ Type  H <return>  for immediate help}\def~{\errmessage{%
           }
       }
   }
+\cs_new_protected:Npn \box_set_clipped:N #1
+  { \hbox_set:Nn #1 { \__box_backend_clip:N #1 } }
+\cs_generate_variant:Nn \box_set_clipped:N { c }
+\cs_new_protected:Npn \box_gset_clipped:N #1
+  { \hbox_gset:Nn #1 { \__box_backend_clip:N #1 } }
+\cs_generate_variant:Nn \box_gset_clipped:N { c }
+\cs_new_protected:Npn \box_set_trim:Nnnnn #1#2#3#4#5
+  { \__box_set_trim:NnnnnN #1 {#2} {#3} {#4} {#5} \box_set_eq:NN }
+\cs_generate_variant:Nn \box_set_trim:Nnnnn { c }
+\cs_new_protected:Npn \box_gset_trim:Nnnnn #1#2#3#4#5
+  { \__box_set_trim:NnnnnN #1 {#2} {#3} {#4} {#5} \box_gset_eq:NN }
+\cs_generate_variant:Nn \box_gset_trim:Nnnnn { c }
+\cs_new_protected:Npn \__box_set_trim:NnnnnN #1#2#3#4#5#6
+  {
+    \hbox_set:Nn \l__box_internal_box
+      {
+        \__kernel_kern:n { -#2 }
+        \box_use:N #1
+        \__kernel_kern:n { -#4 }
+      }
+    \dim_compare:nNnTF { \box_dp:N #1 } > {#3}
+      {
+        \hbox_set:Nn \l__box_internal_box
+          {
+            \box_move_down:nn \c_zero_dim
+              { \box_use_drop:N \l__box_internal_box }
+          }
+        \box_set_dp:Nn \l__box_internal_box { \box_dp:N #1 - (#3) }
+      }
+      {
+        \hbox_set:Nn \l__box_internal_box
+          {
+            \box_move_down:nn { (#3) - \box_dp:N #1 }
+              { \box_use_drop:N \l__box_internal_box }
+          }
+        \box_set_dp:Nn \l__box_internal_box \c_zero_dim
+      }
+    \dim_compare:nNnTF { \box_ht:N \l__box_internal_box } > {#5}
+      {
+        \hbox_set:Nn \l__box_internal_box
+          {
+            \box_move_up:nn \c_zero_dim
+              { \box_use_drop:N \l__box_internal_box }
+          }
+        \box_set_ht:Nn \l__box_internal_box
+          { \box_ht:N \l__box_internal_box - (#5) }
+      }
+      {
+        \hbox_set:Nn \l__box_internal_box
+          {
+            \box_move_up:nn { (#5) - \box_ht:N \l__box_internal_box }
+              { \box_use_drop:N \l__box_internal_box }
+          }
+        \box_set_ht:Nn \l__box_internal_box \c_zero_dim
+      }
+    #6 #1 \l__box_internal_box
+  }
+\cs_new_protected:Npn \box_set_viewport:Nnnnn #1#2#3#4#5
+  { \__box_set_viewport:NnnnnN #1 {#2} {#3} {#4} {#5} \box_set_eq:NN }
+\cs_generate_variant:Nn \box_set_viewport:Nnnnn { c }
+\cs_new_protected:Npn \box_gset_viewport:Nnnnn #1#2#3#4#5
+  { \__box_set_viewport:NnnnnN #1 {#2} {#3} {#4} {#5} \box_gset_eq:NN }
+\cs_generate_variant:Nn \box_gset_viewport:Nnnnn { c }
+\cs_new_protected:Npn \__box_set_viewport:NnnnnN #1#2#3#4#5#6
+  {
+    \hbox_set:Nn \l__box_internal_box
+      {
+        \__kernel_kern:n { -#2 }
+        \box_use:N #1
+        \__kernel_kern:n { #4 - \box_wd:N #1 }
+      }
+    \dim_compare:nNnTF {#3} < \c_zero_dim
+      {
+        \hbox_set:Nn \l__box_internal_box
+          {
+            \box_move_down:nn \c_zero_dim
+              { \box_use_drop:N \l__box_internal_box }
+          }
+        \box_set_dp:Nn \l__box_internal_box { - \__box_dim_eval:n {#3} }
+      }
+      {
+        \hbox_set:Nn \l__box_internal_box
+          { \box_move_down:nn {#3} { \box_use_drop:N \l__box_internal_box } }
+        \box_set_dp:Nn \l__box_internal_box \c_zero_dim
+      }
+    \dim_compare:nNnTF {#5} > \c_zero_dim
+      {
+        \hbox_set:Nn \l__box_internal_box
+          {
+            \box_move_up:nn \c_zero_dim
+              { \box_use_drop:N \l__box_internal_box }
+          }
+        \box_set_ht:Nn \l__box_internal_box
+          {
+            (#5)
+            \dim_compare:nNnT {#3} > \c_zero_dim
+              { - (#3) }
+          }
+      }
+      {
+        \hbox_set:Nn \l__box_internal_box
+          {
+            \box_move_up:nn { - \__box_dim_eval:n {#5} }
+              { \box_use_drop:N \l__box_internal_box }
+          }
+        \box_set_ht:Nn \l__box_internal_box \c_zero_dim
+      }
+    #6 #1 \l__box_internal_box
+  }
+
 %% File: l3color.dtx
 \cs_new_eq:NN \color_group_begin: \group_begin:
 \cs_new_eq:NN \color_group_end:   \group_end:
@@ -30316,7 +30426,7 @@ Type  H <return>  for immediate help}\def~{\errmessage{%
 \cs_new:Npn \pdf_version_major: { \__pdf_backend_version_major: }
 \cs_new:Npn \pdf_version_minor: { \__pdf_backend_version_minor: }
 \cs_new_protected:Npn \pdf_pagesize_gset:nn #1#2
-  { \__pdf_pagesize_gset:nn {#1} {#2} }
+  { \__pdf_backend_pagesize_gset:nn {#1} {#2} }
 \cs_new_protected:Npn \pdf_destination:nn #1#2
   { \__pdf_backend_destination:nn {#1} {#2} }
 \cs_new_protected:Npn \pdf_destination:nnnn #1#2#3#4
@@ -33215,7 +33325,7 @@ Type  H <return>  for immediate help}\def~{\errmessage{%
       { \__text_change_case_exclude:nnN {#1} {#2} }
       {
         \__text_codepoint_process:nN
-          { \use:c { __text_change_case_codepoint_ #1 :nnn } {#1} {#2} }
+          { \use:c { __text_change_case_custom_ #1 :nnn } {#1} {#2} }
       }
         #3
   }
@@ -33264,13 +33374,14 @@ Type  H <return>  for immediate help}\def~{\errmessage{%
   {
     \cs_if_exist:cTF { l__text_case_ \token_to_str:N #3 _tl }
       {
-        \exp_args:Nv \__text_change_case_replace:nnn
+        \__text_change_case_replace:vnn
           { l__text_case_ \token_to_str:N #3 _tl } {#1} {#2}
       }
       { \__text_change_case_switch:nnN {#1} {#2} #3 }
   }
 \cs_new:Npn \__text_change_case_replace:nnn #1#2#3
   { \__text_change_case_loop:nnw {#2} {#3} #1 }
+\cs_generate_variant:Nn \__text_change_case_replace:nnn { v }
 \cs_new:Npn \__text_change_case_switch:nnN #1#2#3
   {
     \cs_if_eq:NNTF #3 \text_case_switch:nnnn
@@ -33326,6 +33437,39 @@ Type  H <return>  for immediate help}\def~{\errmessage{%
           { \__text_change_case_loop:nnw {#3} {#4} }
       }
   }
+\cs_new:Npn \__text_change_case_custom_lower:nnn #1#2#3
+  {
+    \__text_change_case_custom:nnnnn {#1} {#2} {#3} {#1}
+      { \use:c { __text_change_case_codepoint_ #1 :nnn } {#1} {#2} {#3} }
+  }
+\cs_new_eq:NN \__text_change_case_custom_upper:nnn
+  \__text_change_case_custom_lower:nnn
+\cs_new:Npn \__text_change_case_custom_title:nnn #1#2#3
+  {
+    \__text_change_case_custom:nnnnn { title } {#2} {#3} {#1}
+      {
+        \__text_change_case_custom:nnnnn { upper } {#2} {#3} {#1}
+          { \use:c { __text_change_case_codepoint_ #1 :nnn } {#1} {#2} {#3} }
+      }
+  }
+\cs_new_eq:NN \__text_change_case_custom_titleonly:nnn
+  \__text_change_case_custom_title:nnn
+\cs_new:Npn \__text_change_case_custom:nnnnn #1#2#3#4#5
+  {
+    \tl_if_exist:cTF { l__text_ #1 case _ \tl_to_str:n {#3} _ #2 _tl }
+      {
+        \__text_change_case_replace:vnn
+          { l__text_ #1 case _ \tl_to_str:n {#3} _ #2 _tl } {#4} {#2}
+      }
+      {
+        \tl_if_exist:cTF { l__text_ #1 case _ \tl_to_str:n {#3} _tl }
+          {
+            \__text_change_case_replace:vnn
+              { l__text_ #1 case _ \tl_to_str:n {#3} _tl } {#4} {#2}
+          }
+          {#5}
+      }
+  }
 \cs_new:Npn \__text_change_case_codepoint_lower:nnn #1#2#3
   {
     \cs_if_exist_use:cF { __text_change_case_lower_ #2 :nnnn }
@@ -33499,6 +33643,38 @@ Type  H <return>  for immediate help}\def~{\errmessage{%
     \tl_clear_new:c { l__text_case_ \token_to_str:N #1 _tl }
     \tl_set:cn { l__text_case_ \token_to_str:N #1 _tl } {#2}
   }
+\cs_new_protected:Npn \text_declare_lowercase_mapping:nn #1#2
+  { \__text_declare_case_mapping:nnn { lower } {#1} {#2} }
+\cs_new_protected:Npn \text_declare_titlecase_mapping:nn #1#2
+  { \__text_declare_case_mapping:nnn { title } {#1} {#2} }
+\cs_new_protected:Npn \text_declare_uppercase_mapping:nn #1#2
+  { \__text_declare_case_mapping:nnn { upper } {#1} {#2} }
+\cs_new_protected:Npn \__text_declare_case_mapping:nnn #1#2#3
+  {
+    \exp_args:Ne \__text_declare_case_mapping_aux:nnn
+      { \codepoint_str_generate:n {#2} } {#1} {#3}
+  }
+\cs_new_protected:Npn \__text_declare_case_mapping_aux:nnn #1#2#3
+  {
+    \tl_clear_new:c { l__text_ #2 case _ #1 _tl }
+    \tl_set:cn { l__text_ #2 case _ #1 _ tl } {#3}
+  }
+\cs_new_protected:Npn \text_declare_lowercase_mapping:nnn #1#2#3
+  { \__text_declare_case_mapping:nnnn { lower } {#1} {#2} {#3} }
+\cs_new_protected:Npn \text_declare_titlecase_mapping:nnn #1#2#3
+  { \__text_declare_case_mapping:nnnn { title } {#1} {#2} {#3} }
+\cs_new_protected:Npn \text_declare_uppercase_mapping:nnn #1#2#3
+  { \__text_declare_case_mapping:nnnn { upper } {#1} {#2} {#3} }
+\cs_new_protected:Npn \__text_declare_case_mapping:nnnn #1#2#3#4
+  {
+    \exp_args:Ne \__text_declare_case_mapping_aux:nnnn
+      { \codepoint_str_generate:n {#2} } {#1} {#3} {#4}
+  }
+\cs_new_protected:Npn \__text_declare_case_mapping_aux:nnnn #1#2#3#4
+  {
+    \tl_clear_new:c { l__text_ #2 case _ #1 _ #3 _tl }
+    \tl_set:cn { l__text_ #2 case _ #1 _ #3 _ tl } {#4}
+  }
 \cs_new:Npn \text_case_switch:nnnn #1#2#3#4
   {
     \__text_case_switch_marker:
@@ -34440,6 +34616,12 @@ Type  H <return>  for immediate help}\def~{\errmessage{%
           }
       }
   }
+\bool_lazy_or:nnF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+   \text_declare_uppercase_mapping:nn { "01F0 } { \v { J } }
+ }
 %% File: l3text-map.dtx
 \cs_new:Npn \text_map_function:nN #1#2
   { \exp_args:Ne \__text_map_function:nN { \text_expand:n {#1} } #2 }
@@ -35358,115 +35540,6 @@ Type  H <return>  for immediate help}\def~{\errmessage{%
     \q_recursion_stop
 \group_end:
 %% File: l3candidates.dtx
-\cs_new_protected:Npn \box_clip:N #1
-  { \hbox_set:Nn #1 { \__box_backend_clip:N #1 } }
-\cs_generate_variant:Nn \box_clip:N { c }
-\cs_new_protected:Npn \box_gclip:N #1
-  { \hbox_gset:Nn #1 { \__box_backend_clip:N #1 } }
-\cs_generate_variant:Nn \box_gclip:N { c }
-\cs_new_protected:Npn \box_set_trim:Nnnnn #1#2#3#4#5
-  { \__box_set_trim:NnnnnN #1 {#2} {#3} {#4} {#5} \box_set_eq:NN }
-\cs_generate_variant:Nn \box_set_trim:Nnnnn { c }
-\cs_new_protected:Npn \box_gset_trim:Nnnnn #1#2#3#4#5
-  { \__box_set_trim:NnnnnN #1 {#2} {#3} {#4} {#5} \box_gset_eq:NN }
-\cs_generate_variant:Nn \box_gset_trim:Nnnnn { c }
-\cs_new_protected:Npn \__box_set_trim:NnnnnN #1#2#3#4#5#6
-  {
-    \hbox_set:Nn \l__box_internal_box
-      {
-        \__kernel_kern:n { -#2 }
-        \box_use:N #1
-        \__kernel_kern:n { -#4 }
-      }
-    \dim_compare:nNnTF { \box_dp:N #1 } > {#3}
-      {
-        \hbox_set:Nn \l__box_internal_box
-          {
-            \box_move_down:nn \c_zero_dim
-              { \box_use_drop:N \l__box_internal_box }
-          }
-        \box_set_dp:Nn \l__box_internal_box { \box_dp:N #1 - (#3) }
-      }
-      {
-        \hbox_set:Nn \l__box_internal_box
-          {
-            \box_move_down:nn { (#3) - \box_dp:N #1 }
-              { \box_use_drop:N \l__box_internal_box }
-          }
-        \box_set_dp:Nn \l__box_internal_box \c_zero_dim
-      }
-    \dim_compare:nNnTF { \box_ht:N \l__box_internal_box } > {#5}
-      {
-        \hbox_set:Nn \l__box_internal_box
-          {
-            \box_move_up:nn \c_zero_dim
-              { \box_use_drop:N \l__box_internal_box }
-          }
-        \box_set_ht:Nn \l__box_internal_box
-          { \box_ht:N \l__box_internal_box - (#5) }
-      }
-      {
-        \hbox_set:Nn \l__box_internal_box
-          {
-            \box_move_up:nn { (#5) - \box_ht:N \l__box_internal_box }
-              { \box_use_drop:N \l__box_internal_box }
-          }
-        \box_set_ht:Nn \l__box_internal_box \c_zero_dim
-      }
-    #6 #1 \l__box_internal_box
-  }
-\cs_new_protected:Npn \box_set_viewport:Nnnnn #1#2#3#4#5
-  { \__box_set_viewport:NnnnnN #1 {#2} {#3} {#4} {#5} \box_set_eq:NN }
-\cs_generate_variant:Nn \box_set_viewport:Nnnnn { c }
-\cs_new_protected:Npn \box_gset_viewport:Nnnnn #1#2#3#4#5
-  { \__box_set_viewport:NnnnnN #1 {#2} {#3} {#4} {#5} \box_gset_eq:NN }
-\cs_generate_variant:Nn \box_gset_viewport:Nnnnn { c }
-\cs_new_protected:Npn \__box_set_viewport:NnnnnN #1#2#3#4#5#6
-  {
-    \hbox_set:Nn \l__box_internal_box
-      {
-        \__kernel_kern:n { -#2 }
-        \box_use:N #1
-        \__kernel_kern:n { #4 - \box_wd:N #1 }
-      }
-    \dim_compare:nNnTF {#3} < \c_zero_dim
-      {
-        \hbox_set:Nn \l__box_internal_box
-          {
-            \box_move_down:nn \c_zero_dim
-              { \box_use_drop:N \l__box_internal_box }
-          }
-        \box_set_dp:Nn \l__box_internal_box { - \__box_dim_eval:n {#3} }
-      }
-      {
-        \hbox_set:Nn \l__box_internal_box
-          { \box_move_down:nn {#3} { \box_use_drop:N \l__box_internal_box } }
-        \box_set_dp:Nn \l__box_internal_box \c_zero_dim
-      }
-    \dim_compare:nNnTF {#5} > \c_zero_dim
-      {
-        \hbox_set:Nn \l__box_internal_box
-          {
-            \box_move_up:nn \c_zero_dim
-              { \box_use_drop:N \l__box_internal_box }
-          }
-        \box_set_ht:Nn \l__box_internal_box
-          {
-            (#5)
-            \dim_compare:nNnT {#3} > \c_zero_dim
-              { - (#3) }
-          }
-      }
-      {
-        \hbox_set:Nn \l__box_internal_box
-          {
-            \box_move_up:nn { - \__box_dim_eval:n {#5} }
-              { \box_use_drop:N \l__box_internal_box }
-          }
-        \box_set_ht:Nn \l__box_internal_box \c_zero_dim
-      }
-    #6 #1 \l__box_internal_box
-  }
 \cs_new:Npn \flag_raise_if_clear:n #1
   {
     \if_cs_exist:w flag~#1~0 \cs_end:
diff --git a/texmf/tex/latex/l3kernel/expl3-generic.tex b/texmf/tex/latex/l3kernel/expl3-generic.tex
index 198d834f..21e73fab 100644
--- a/texmf/tex/latex/l3kernel/expl3-generic.tex
+++ b/texmf/tex/latex/l3kernel/expl3-generic.tex
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-03-30}%
+\def\ExplFileDate{2023-04-19}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11
diff --git a/texmf/tex/latex/l3kernel/expl3.ltx b/texmf/tex/latex/l3kernel/expl3.ltx
index 2dd58eeb..294451fd 100644
--- a/texmf/tex/latex/l3kernel/expl3.ltx
+++ b/texmf/tex/latex/l3kernel/expl3.ltx
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-03-30}%
+\def\ExplFileDate{2023-04-19}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11
diff --git a/texmf/tex/latex/l3kernel/expl3.sty b/texmf/tex/latex/l3kernel/expl3.sty
index 787ffb31..b5e40bc1 100644
--- a/texmf/tex/latex/l3kernel/expl3.sty
+++ b/texmf/tex/latex/l3kernel/expl3.sty
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-03-30}%
+\def\ExplFileDate{2023-04-19}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%





More information about the latex3-commits mailing list.