texlive[74759] Master/texmf-dist: l3kernel-dev (26mar25)

commits+karl at tug.org commits+karl at tug.org
Wed Mar 26 21:04:38 CET 2025


Revision: 74759
          https://tug.org/svn/texlive?view=revision&revision=74759
Author:   karl
Date:     2025-03-26 21:04:37 +0100 (Wed, 26 Mar 2025)
Log Message:
-----------
l3kernel-dev (26mar25)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3doc.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news01.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news02.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news03.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news04.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news05.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news06.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news07.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news08.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news09.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news10.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news11.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news12.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3prefixes.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3body.tex
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3.ins
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bitset.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3cctab.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3color.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3debug.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-functions.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-symbolic.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-types.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fparray.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3legacy.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3pdf.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-case.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-map.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-purify.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-build.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.ltx
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3debug.def
    trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3doc.cls

Added Paths:
-----------
    trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/CHANGELOG.md	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/CHANGELOG.md	2025-03-26 20:04:37 UTC (rev 74759)
@@ -7,6 +7,14 @@
 
 ## [Unreleased]
 
+## [2025-03-26]
+
+### Added
+- Module `l3graphics`, moved from `l3experimental` to stable status
+
+### Fixed
+- Correct scope for `\prg_gset_conditional:Nnn`
+
 ## [2025-03-10]
 
 ### Added
@@ -1865,7 +1873,8 @@
 - Step functions have been added for dim variables,
   e.g. `\dim_step_inline:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2025-03-10...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2025-03-26...HEAD
+[2025-03-26]: https://github.com/latex3/latex3/compare/2025-03-10...2025-03-26
 [2025-03-10]: https://github.com/latex3/latex3/compare/2025-01-18...2025-03-10
 [2025-01-18]: https://github.com/latex3/latex3/compare/2025-01-14...2025-01-18
 [2025-01-14]: https://github.com/latex3/latex3/compare/2024-12-25...2025-01-14

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/README.md	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/README.md	2025-03-26 20:04:37 UTC (rev 74759)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2025-03-10
+Release 2025-03-26
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/expl3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.tex	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/interface3.tex	2025-03-26 20:04:37 UTC (rev 74759)
@@ -58,7 +58,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2025-03-10}
+\date{Released 2025-03-26}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news01.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news02.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news03.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news04.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news05.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news06.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news07.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news08.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news09.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news10.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news11.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3news12.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3prefixes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.tex	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3styleguide.tex	2025-03-26 20:04:37 UTC (rev 74759)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2025-03-10}
+\date{Released 2025-03-26}
 
 \begin{document}
 

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.tex	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3syntax-changes.tex	2025-03-26 20:04:37 UTC (rev 74759)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2025-03-10}
+\date{Released 2025-03-26}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.tex	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/l3term-glossary.tex	2025-03-26 20:04:37 UTC (rev 74759)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2025-03-10}
+\date{Released 2025-03-26}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.tex	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3.tex	2025-03-26 20:04:37 UTC (rev 74759)
@@ -57,7 +57,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2025-03-10}
+\date{Released 2025-03-26}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3body.tex	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/doc/latex-dev/l3kernel/source3body.tex	2025-03-26 20:04:37 UTC (rev 74759)
@@ -637,6 +637,7 @@
 \DocInput{l3box.dtx}
 \DocInput{l3coffins.dtx}
 \DocInput{l3color.dtx}
+\DocInput{l3graphics.dtx}
 \DocInput{l3pdf.dtx}
 
 % implementation part only

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/expl3.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/expl3.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2025-03-10}%
+\def\ExplFileDate{2025-03-26}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %
@@ -543,9 +543,8 @@
 %     documented in \href{interface3.pdf}{interface3.pdf}%^^A
 %     \footnote{If a primitive offers a functionality not yet in the
 %       kernel, programmers and users are encouraged to write to the
-%       \texttt{LaTeX-L} mailing list
-%       (\url{mailto:LATEX-L at listserv.uni-heidelberg.de}) describing
-%       their use-case and intended behaviour, so that a possible
+%       team describing
+%       their use-case and intended behavior, so that a possible
 %       interface can be discussed.  Temporarily, while an interface is
 %       not provided, programmers may use the procedure described in the
 %       \href{l3styleguide.pdf}{l3styleguide.pdf}.}.
@@ -896,8 +895,7 @@
 %   \item Use long, descriptive names for functions and variables,
 %     and for auxiliary functions use the parent function name plus
 %     |aux|, |auxi|, |auxii| and so on.
-%   \item If in doubt, ask the team via the LaTeX-L list: someone will
-%     soon get back to you!
+%   \item If in doubt, ask the team: someone will soon get back to you!
 % \end{itemize}
 %
 % \section{Load-time options for \pkg{expl3}}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3.ins	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3.ins	2025-03-26 20:04:37 UTC (rev 74759)
@@ -105,6 +105,7 @@
         \from{l3regex.dtx}      {package}
         \from{l3box.dtx}        {package}
         \from{l3color.dtx}      {package}
+        \from{l3graphics.dtx}   {package}
         \from{l3pdf.dtx}        {package,tex}
         \from{l3coffins.dtx}    {package}
         \from{l3luatex.dtx}     {package,tex}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3basics.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3basics.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %
@@ -2014,7 +2014,7 @@
 \cs_gset_protected:Npn \prg_set_conditional:Nnn
   { \@@_generate_conditional_count:NNNnn \cs_set:Npn e }
 \cs_gset_protected:Npn \prg_gset_conditional:Nnn
-  { \@@_generate_conditional_count:NNNnn \cs_set:Npn e }
+  { \@@_generate_conditional_count:NNNnn \cs_gset:Npn e }
 \cs_gset_protected:Npn \prg_new_conditional:Nnn
   { \@@_generate_conditional_count:NNNnn \cs_new:Npn e }
 \cs_gset_protected:Npn \prg_set_protected_conditional:Nnn

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bitset.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bitset.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bitset.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bootstrap.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3bootstrap.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3box.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3box.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3cctab.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3cctab.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3clist.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3clist.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3coffins.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3coffins.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3color.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3color.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3debug.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3debug.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %
@@ -69,7 +69,7 @@
 %
 % Standard file identification.
 %    \begin{macrocode}
-\ProvidesExplFile{l3debug.def}{2025-03-10}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2025-03-26}{}{L3 Debugging support}
 %    \end{macrocode}
 %
 % \begin{variable}{\s_@@_stop}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3deprecation.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3deprecation.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3doc.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3doc.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -71,7 +71,7 @@
 % This isn't included in the typeset documentation because it's a bit
 % ugly:
 %<*class>
-\ProvidesExplClass{l3doc}{2025-03-10}{}
+\ProvidesExplClass{l3doc}{2025-03-26}{}
   {L3 Experimental documentation class}
 %</class>
 % \fi
@@ -84,7 +84,7 @@
 %    require you to do updates, if the class changes.}}
 %
 % \author{\Team}
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 % \maketitle
 % \tableofcontents
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3docstrip.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3docstrip.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3expan.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3expan.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3file.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3file.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3flag.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3flag.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-assign.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-assign.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-aux.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-aux.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-basics.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-basics.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-convert.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-convert.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-expo.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-expo.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-extended.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-extended.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-functions.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-functions.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-logic.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-logic.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-parse.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-parse.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-random.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-random.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-round.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-round.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-symbolic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-symbolic.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-symbolic.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-traps.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-traps.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-trig.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-trig.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-types.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-types.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp-types.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fp.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fparray.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3fparray.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Added: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -0,0 +1,786 @@
+% \iffalse meta-comment
+%
+%% File: l3graphics.dtx
+%
+% Copyright (C) 2017-2025 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{l3graphics} module\\ Graphics inclusion support^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX{} Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2025-03-26}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{Graphics keys}
+%
+% Inclusion of graphic files requires a range of low-level data be passed to
+% the backend. This is set up using a small number of key--value settings,
+% which are stored in the |graphics| tree.
+%
+% \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}{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}{page}
+%   The page to extract from a multi-page graphic file: used for |.pdf| files
+%   which may contain multiple pages.
+% \end{variable}
+%
+% \begin{variable}{pdf-attr}
+%   Additional PDF-focussed attributes: available to allow control of
+%   extended |.pdf| structures beyond those needed for graphic inclusion.
+%   Due to backend restrictions, this key is only functional with direct
+%   PDF mode (pdf\TeX{} and Lua\TeX{}).
+% \end{variable}
+%
+% \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. A choice from |art|, |bleed|, |crop|, |media|, |trim|.
+%   The standard setting is |crop|.
+% \end{variable}
+%
+% \begin{variable}{type}
+%   The type of graphic file being included: if this key is not set, the
+%   \emph{type} is determined from the file extension.
+% \end{variable}
+%
+% \section{Including graphics}
+%
+% \begin{function}[added = 2025-03-14]
+%   {\graphics_include:nn, \graphics_include:nV}
+%   \begin{syntax}
+%     \cs{graphics_include:nn} \Arg{keys} \Arg{file}
+%   \end{syntax}
+%   Horizontal-mode command which includes the \meta{file} as a 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}[added = 2025-03-14]{\l_graphics_ext_type_prop}
+%   Defines mapping between file extensions and file types; where there is
+%   no entry for an extension, the type is assumed to be the extension
+%   with the leading |.| removed. Entries should be made in lower case, and
+%   the key should be an extension including the leading |.|, for example
+%   \begin{verbatim}
+%     \prop_put:Nnn \l_graphics_ext_type_prop { .ps } { eps }
+%   \end{verbatim}
+% \end{variable}
+%
+% \begin{variable}[added = 2025-03-14]{\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{variable}[added = 2025-03-14]{\l_graphics_search_path_seq}
+%   Each entry is the path to a directory which should be searched when
+%   seeking a graphic file. Each path can be relative or absolute, and should
+%   not include the trailing slash. The entries are not expanded when
+%   used so may contain active characters but should not feature any
+%   variable content. Spaces need not be quoted.
+% \end{variable}
+%
+% \section{Utility functions}
+%
+% \begin{function}[noTF, added = 2025-03-14]{\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{function}[added = 2025-03-14]{\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}
+%
+% \section{Showing and logging included graphics}
+%
+% \begin{function}[added = 2025-03-14]
+%   {\graphics_show_list:, \graphics_log_list:}
+%   \begin{syntax}
+%     \cs{graphics_show_list:}
+%     \cs{graphics_log_list:}
+%   \end{syntax}
+%   These functions list all graphic files loaded in a similar manner to
+%   \cs{file_show_list:} and \cs{file_log_list:}. While
+%   \cs{graphics_show_list:} displays the list in the terminal,
+%   \cs{graphics_log_list:} outputs it to the log file only. In both cases, only
+%   graphics loaded by \pkg{l3graphics} are listed.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3graphics} implementation}
+%
+%    \begin{macrocode}
+%<*package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=graphics>
+%    \end{macrocode}
+%
+% Transitional support.
+%    \begin{macrocode}
+\cs_if_exist:NT \@expl at finalise@setup@@@@
+  {
+    \tl_gput_right:Nn \@expl at finalise@setup@@@@
+      { \declare at file@substitution { l3graphics.sty } { null.tex } }
+  }
+%    \end{macrocode}
+%
+% \begin{variable}{\l_@@_internal_dim, \l_@@_internal_ior, \l_@@_internal_tl}
+%   Scratch space.
+%    \begin{macrocode}
+\dim_new:N \l_@@_internal_dim
+\ior_new:N \l_@@_internal_ior
+\tl_new:N  \l_@@_internal_tl
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\s_@@_stop}
+%   Internal scan marks.
+%    \begin{macrocode}
+\scan_new:N \s_@@_stop
+%    \end{macrocode}
+% \end{variable}
+%
+% \subsection{Graphics keys}
+%
+% \begin{macro}
+%   {
+%     \l_@@_decodearray_str  ,
+%     \l__@@_draft_bool      ,
+%     \l_@@_interpolate_bool ,
+%     \l_@@_page_int         ,
+%     \l_@@_pagebox_tl       ,
+%     \l_@@_pdf_str          ,
+%     \l_@@_type_str
+%   }
+%   Keys which control features of graphics. The standard value of |pagebox|
+%   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_@@_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:Ne \l_@@_pagebox_tl
+          { \l_keys_choice_tl box }
+      } ,
+    pagebox .initial:n =
+      crop ,
+    page .int_set:N =
+      \l_@@_page_int ,
+    pdf-attr .str_set:N =
+      \l_@@_pdf_str ,
+    type . str_set:N =
+      \l_@@_type_str
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Obtaining bounding box data}
+%
+% \begin{variable}
+%   {
+%     \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_@@_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}{\@@_bb_save:n, \@@_bb_save:e}
+% \begin{macro}{\@@_bb_restore:nF, \@@_bb_restore:eF}
+%   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 \@@_bb_save:n #1
+  {
+    \dim_if_exist:cTF { c_@@_ #1 _urx_dim }
+      { \msg_error:nnn { graphic } { bb-already-cached } {#1} }
+      {
+        \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 \@@_bb_save:n { e }
+\cs_new_protected:Npn \@@_bb_restore:nF #1#2
+  {
+    \dim_if_exist:cTF { c_@@_ #1 _urx_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_@@_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_@@_lly_dim { c_@@_ #1 _lly_dim } }
+          { \dim_zero:N \l_@@_lly_dim }
+      }
+      {#2}
+  }
+\cs_generate_variant:Nn \@@_bb_restore:nF { e }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \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}
+% \begin{macro}{\@@_extract_bb_auxiv:nnn}
+% \begin{macro}{\@@_read_bb_auxi:nnnn, \@@_read_bb_auxii:Vnnn}
+% \begin{macro}
+%   {
+%     \@@_read_bb_auxii:w ,
+%     \@@_read_bb_auxiv:w ,
+%     \@@_read_bb_auxv:w
+%   }
+%  Extracting the bounding box from an |.eps| or |.bb| file is done by
+%  reading each line and searching for the marker text |%%BoundingBox:|.
+%  The data is read as a string with a mapping over
+%  the lines: as there is a colon involved, a little bit of work is needed to
+%  get the matching correct. The same approach covers cases where the bounding
+%  box has to be calculated by |extractbb|, with just the initial phase
+%  different.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_extract_bb:n #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
+  { \@@_extract_bb_auxii:nnn {#2} { :P #1 } { -p~#1~ } }
+\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_@@_pagebox_tl
+      { \@@_extract_bb_auxiv:nnn }
+      { \@@_extract_bb_auxiii:Vnnn \l_@@_pagebox_tl }
+      {#1} {#2} {#3}
+  }
+\cs_new_protected:Npn \@@_extract_bb_auxiii:nnnn #1#2#3#4
+  { \@@_extract_bb_auxiv:nnn {#2} { : #1 #3 } { #4 -B~#1~ } }
+\cs_generate_variant:Nn \@@_extract_bb_auxiii:nnnn { V }
+\cs_new_protected:Npn \@@_extract_bb_auxiv:nnn #1#2#3
+  {
+    \@@_read_bb_auxi:nnnn {#1} {#2}
+      { \ior_shell_open:Nn \l_@@_internal_ior { extractbb~#3-O~#1 } }
+      { pipe-failed }
+  }
+\cs_new_protected:Npn \@@_read_bb:n #1
+  {
+    \@@_read_bb_auxi:nnnn {#1} { }
+      { \ior_open:Nn \l_@@_internal_ior {#1} }
+      { graphic-not-found }
+  }
+%   \end{macrocode}
+%  Before any real searching, a check to see if there are cached values
+%  available. The name of each graphic will be unique and so it's sensible to
+%  store the bounding box data in \TeX{}: this avoids multiple file operations.
+%  As bounding boxes here start away from the lower-left origin, we need to
+%  store all four values (contrast with for example the \texttt{pdfmode}
+%  driver). Here |#2| is a potential page identifier: used to allow caching of
+%  individual pages in a multi-page document. Caching is applied to the
+%  upper-right position in all cases, but as the lower-left will often be
+%  $(0,0)$ it is only cached if required.
+%   \begin{macrocode}
+\cs_new_protected:Npn \@@_read_bb_auxi:nnnn #1#2#3#4
+  {
+    \@@_bb_restore:nF {#1#2}
+      { \@@_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} }
+  }
+\cs_new_protected:Npe \@@_read_bb_auxii:nnnn #1#2#3#4
+  {
+    #1
+    \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_@@_internal_ior
+          {
+            \exp_not:N \@@_read_bb_auxiii:w
+              ##1 ~ \c_colon_str \s_@@_stop
+          }
+        \@@_bb_save:n {#3#4}
+      }
+    \ior_close:N \exp_not:N \l_@@_internal_ior
+  }
+\use:e
+  {
+    \cs_new_protected:Npn \exp_not:N \@@_read_bb_auxiii:w
+      #1 \c_colon_str #2 \s_@@_stop
+      {
+        \exp_not:N \str_if_eq:nnT
+          { \c_percent_str \c_percent_str BoundingBox }
+          {#1}
+          { \exp_not:N \@@_read_bb_auxiv:w #2 ( ) \s_@@_stop }
+      }
+  }
+%    \end{macrocode}
+%   If the bounding box is |atend|, just ignore the current one and keep going.
+%   Otherwise, we need to allow for tabs and multiple spaces (as the line has
+%   been read as a string). The easiest way to deal with that is to scan the
+%   tokens: at this stage the line fragment should be just numbers and
+%   whitespace. \TeX{} will then tidy up for us, with just a leading space to
+%   worry about: that is taken out by the |\use:n| here.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_read_bb_auxiv:w #1 ( #2 ) #3 \s_@@_stop
+  {
+    \str_if_eq:nnF {#2} { atend }
+      {
+        \tl_set_rescan:Nne \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_@@_internal_tl \s_@@_stop
+      }
+  }
+%    \end{macrocode}
+%   A trailing space was deliberately added earlier so we know that the final
+%   data point is terminated by a space.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_read_bb_auxv:w #1~#2~#3~#4~#5 \s_@@_stop
+  {
+    \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}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \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}
+\str_new:N \l_@@_final_name_str
+\str_new:N \l_@@_full_name_str
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_internal_box}
+%    \begin{macrocode}
+\box_new:N \l_@@_internal_box
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_dir_str \l_@@_name_str \l_@@_ext_str}
+%    \begin{macrocode}
+\str_new:N \l_@@_dir_str
+\str_new:N \l_@@_name_str
+\str_new:N \l_@@_ext_str
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_search_path_seq}
+%    \begin{macrocode}
+\seq_new:N \l_graphics_search_path_seq
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_search_ext_seq}
+%   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}
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_ext_type_prop}
+%   Mapping between extensions and types for non-standard mappings
+%    \begin{macrocode}
+\prop_new:N \l_graphics_ext_type_prop
+\prop_put:Nnn \l_graphics_ext_type_prop { .ps } { eps }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_record_seq}
+%   A list of graphic files used.
+%    \begin{macrocode}
+\seq_new:N \g_@@_record_seq
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\graphics_include:nn, \graphics_include:nV}
+% \begin{macro}{\@@_include_search:n}
+% \begin{macro}{\@@_include:}
+% \begin{macro}
+%   {
+%     \@@_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 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: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 {#2} \l_@@_full_name_str
+        {
+          \str_if_eq:eeTF { \l_@@_full_name_str } { #2 .tex }
+            { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
+            { \@@_include: }
+        }
+        { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
+    \group_end:
+  }
+\cs_generate_variant:Nn \graphics_include:nn { nV }
+\cs_new_protected:Npn \@@_include:
+  {
+    \str_if_empty:NTF \l_@@_type_str
+      {
+        \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_casefold:V \l_@@_ext_str }
+          }
+      }
+      { \@@_include_auxi:e { \l_@@_type_str } }
+  }
+\cs_new_protected:Npn \@@_include_auxi:n #1
+  {
+    \prop_get:NnNF \l_graphics_ext_type_prop { .#1 } \l_@@_internal_tl
+      { \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_@@_final_name_str \l_@@_full_name_str
+        \str_set:Ne \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_@@_full_name_str
+        \seq_gput_right:NV \g_@@_record_seq \l_@@_final_name_str
+        \clist_if_exist:NT \@filelist
+          { \exp_args:NV \@addtofilelist \l_@@_final_name_str }
+        \bool_if:NTF \l_@@_draft_bool
+          { \@@_include_auxiii:n }
+          { \@@_include_auxiv:n }
+            {#1}
+      }
+      { \msg_error:nnn { graphics } { unsupported-graphic-type } {#1} }
+  }
+\cs_new_protected:Npn \@@_include_auxiii:n #1
+  {
+    \hbox_to_wd:nn { \l_@@_urx_dim - \l_@@_llx_dim }
+      {
+        \tex_vrule:D
+        \tex_hss:D
+        \vbox_to_ht:nn
+          { \l_@@_ury_dim - \l_@@_lly_dim }
+          {
+            \tex_hrule:D width
+              \dim_eval:n { \l_@@_urx_dim - \l_@@_llx_dim }
+            \tex_vss:D
+            \hbox_to_wd:nn
+              { \l_@@_urx_dim - \l_@@_llx_dim }
+              {
+                \ttfamily
+                \tex_hss:D \l_@@_full_name_str \tex_hss:D
+              }
+            \tex_vss:D
+            \tex_hrule:D
+          }
+        \tex_hss:D
+        \tex_vrule:D
+      }
+  }
+\cs_new_protected:Npn \@@_include_auxiv:n #1
+  {
+    \hbox_set:Nn \l_@@_internal_box
+      {
+        \exp_args:NnV \use:c { @@_backend_include_ #1 :n }
+          \l_@@_full_name_str
+      }
+    \box_set_dp:Nn \l_@@_internal_box { 0pt }
+    \box_set_ht:Nn \l_@@_internal_box
+      { \l_@@_ury_dim - \l_@@_lly_dim }
+    \box_set_wd:Nn \l_@@_internal_box
+      { \l_@@_urx_dim - \l_@@_llx_dim }
+    \box_use_drop:N \l_@@_internal_box
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\graphics_show_list:, \graphics_log_list:, \@@_list:N}
+% \begin{macro}[EXP]{\@@_list_aux:n}
+%   A function to list all graphic files used.
+%    \begin{macrocode}
+\cs_new_protected:Npn \graphics_show_list: { \@@_list:N \msg_show:nneeee }
+\cs_new_protected:Npn \graphics_log_list: { \@@_list:N \msg_log:nneeee }
+\cs_new_protected:Npn \@@_list:N #1
+  {
+    \seq_remove_duplicates:N \g_@@_record_seq
+    #1 { kernel } { file-list }
+      { \seq_map_function:NN \g_@@_record_seq \@@_list_aux:n }
+        { } { } { }
+  }
+\cs_new:Npn \@@_list_aux:n #1 { \iow_newline: #1 }
+%    \end{macrocode}
+% \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}
+%   As well as searching by path, etc., there is a need here to check that
+%   we do not trip over |foo.bar| if |.bar| is not a known extension for
+%   the current backend.
+%    \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:eeTF { \l_@@_full_name_str } { #1 .tex }
+            { \@@_get_full_name:n {#1} }
+            {
+              \file_parse_full_name:VNNN \l_@@_full_name_str
+                \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+              \seq_map_inline:Nn \l_graphics_search_ext_seq
+                {
+                  \str_if_eq:nVT {##1} \l_@@_ext_str
+                    { \seq_map_break:n { \use_none:nn } }
+                }
+                  \@@_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:Npe \@@_get_pagecount:n #1
+  {
+    \exp_not:N \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:e
+  {
+    \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.
+  }
+\msg_new:nnnn { graphics } { pipe-failed }
+  { Cannot~run~piped~system~commands. }
+  {
+    LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
+    Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
+  }
+\msg_new:nnnn { graphics } { unsupported-graphic-type }
+  { Image~type~'#1'~not~supported~by~current~driver. }
+  {
+    LaTeX~was~asked~to~include~an~graphic~of~type~'#1',~
+    but~this~is~not~supported~by~the~current~driver~(production~route).
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%</package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3graphics.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3int.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3int.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3intarray.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3intarray.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3kernel-functions.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3kernel-functions.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3keys.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3keys.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3legacy.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3legacy.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3luatex.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3luatex.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3msg.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3msg.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3names.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3names.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3pdf.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3pdf.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prg.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prg.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prop.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3prop.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3quark.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3quark.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3regex.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3regex.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3seq.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3seq.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3skip.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3skip.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sort.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sort.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str-convert.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str-convert.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3str.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sys.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3sys.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-case.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-case.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-map.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-map.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-map.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-purify.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text-purify.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3text.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-analysis.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-analysis.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-build.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-build.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl-build.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3tl.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3token.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3token.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3unicode.dtx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/source/latex-dev/l3kernel/l3unicode.dtx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2025-03-10}
+% \date{Released 2025-03-26}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-code.tex	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-code.tex	2025-03-26 20:04:37 UTC (rev 74759)
@@ -51,6 +51,7 @@
 %% l3regex.dtx  (with options: `package')
 %% l3box.dtx  (with options: `package')
 %% l3color.dtx  (with options: `package')
+%% l3graphics.dtx  (with options: `package')
 %% l3pdf.dtx  (with options: `package,tex')
 %% l3coffins.dtx  (with options: `package')
 %% l3luatex.dtx  (with options: `package,tex')
@@ -75,7 +76,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2025-03-10}%
+\def\ExplFileDate{2025-03-26}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -1673,7 +1674,7 @@
 \cs_gset_protected:Npn \prg_set_conditional:Nnn
   { \__prg_generate_conditional_count:NNNnn \cs_set:Npn e }
 \cs_gset_protected:Npn \prg_gset_conditional:Nnn
-  { \__prg_generate_conditional_count:NNNnn \cs_set:Npn e }
+  { \__prg_generate_conditional_count:NNNnn \cs_gset:Npn e }
 \cs_gset_protected:Npn \prg_new_conditional:Nnn
   { \__prg_generate_conditional_count:NNNnn \cs_new:Npn e }
 \cs_gset_protected:Npn \prg_set_protected_conditional:Nnn
@@ -32136,6 +32137,385 @@
       { is~undefined. }
       { has~the~properties: #2 }
   }
+%% File: l3graphics.dtx
+\cs_if_exist:NT \@expl at finalise@setup@@
+  {
+    \tl_gput_right:Nn \@expl at finalise@setup@@
+      { \declare at file@substitution { l3graphics.sty } { null.tex } }
+  }
+\dim_new:N \l__graphics_internal_dim
+\ior_new:N \l__graphics_internal_ior
+\tl_new:N  \l__graphics_internal_tl
+\scan_new:N \s__graphics_stop
+\tl_new:N \l__graphics_pagebox_tl
+\keys_define:nn { graphics }
+  {
+    decodearray .str_set:N =
+      \l__graphics_decodearray_str ,
+    draft .bool_set:N =
+      \l__graphics_draft_bool ,
+    interpolate .bool_set:N =
+      \l__graphics_interpolate_bool ,
+    pagebox .choices:nn =
+      { art , bleed , crop , media , trim }
+      {
+        \tl_set:Ne \l__graphics_pagebox_tl
+          { \l_keys_choice_tl box }
+      } ,
+    pagebox .initial:n =
+      crop ,
+    page .int_set:N =
+      \l__graphics_page_int ,
+    pdf-attr .str_set:N =
+      \l__graphics_pdf_str ,
+    type . str_set:N =
+      \l__graphics_type_str
+  }
+\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
+\cs_new_protected:Npn \__graphics_bb_save:n #1
+  {
+    \dim_if_exist:cTF { c__graphics_ #1 _urx_dim }
+      { \msg_error:nnn { graphic } { bb-already-cached } {#1} }
+      {
+        \dim_compare:nNnF \l__graphics_llx_dim = { 0pt }
+          { \dim_const:cn { c__graphics_ #1 _llx_dim } { \l__graphics_llx_dim } }
+        \dim_compare:nNnF \l__graphics_lly_dim = { 0pt }
+          { \dim_const:cn { c__graphics_ #1 _lly_dim } { \l__graphics_lly_dim } }
+        \dim_const:cn { c__graphics_ #1 _urx_dim } { \l__graphics_urx_dim }
+        \dim_const:cn { c__graphics_ #1 _ury_dim } { \l__graphics_ury_dim }
+      }
+  }
+\cs_generate_variant:Nn \__graphics_bb_save:n { e }
+\cs_new_protected:Npn \__graphics_bb_restore:nF #1#2
+  {
+    \dim_if_exist:cTF { c__graphics_ #1 _urx_dim }
+      {
+        \dim_set_eq:Nc \l__graphics_urx_dim { c__graphics_ #1 _urx_dim }
+        \dim_set_eq:Nc \l__graphics_ury_dim { c__graphics_ #1 _ury_dim }
+        \dim_if_exist:cTF { c__graphics_ #1 _llx_dim }
+          { \dim_set_eq:Nc \l__graphics_llx_dim { c__graphics_ #1 _llx_dim } }
+          { \dim_zero:N \l__graphics_llx_dim }
+        \dim_if_exist:cTF { c__graphics_ #1 _lly_dim }
+          { \dim_set_eq:Nc \l__graphics_lly_dim { c__graphics_ #1 _lly_dim } }
+          { \dim_zero:N \l__graphics_lly_dim }
+      }
+      {#2}
+  }
+\cs_generate_variant:Nn \__graphics_bb_restore:nF { e }
+\cs_new_protected:Npn \__graphics_extract_bb:n #1
+  {
+    \int_compare:nNnTF \l__graphics_page_int > 0
+      { \__graphics_extract_bb_auxi:Vn \l__graphics_page_int {#1} }
+      { \__graphics_extract_bb_auxii:nnn {#1} { } { } }
+  }
+\cs_new_protected:Npn \__graphics_extract_bb_auxi:nn #1#2
+  { \__graphics_extract_bb_auxii:nnn {#2} { :P #1 } { -p~#1~ } }
+\cs_generate_variant:Nn \__graphics_extract_bb_auxi:nn { Vn }
+\cs_new_protected:Npn \__graphics_extract_bb_auxii:nnn #1#2#3
+  {
+    \tl_if_empty:NTF \l__graphics_pagebox_tl
+      { \__graphics_extract_bb_auxiv:nnn }
+      { \__graphics_extract_bb_auxiii:Vnnn \l__graphics_pagebox_tl }
+      {#1} {#2} {#3}
+  }
+\cs_new_protected:Npn \__graphics_extract_bb_auxiii:nnnn #1#2#3#4
+  { \__graphics_extract_bb_auxiv:nnn {#2} { : #1 #3 } { #4 -B~#1~ } }
+\cs_generate_variant:Nn \__graphics_extract_bb_auxiii:nnnn { V }
+\cs_new_protected:Npn \__graphics_extract_bb_auxiv:nnn #1#2#3
+  {
+    \__graphics_read_bb_auxi:nnnn {#1} {#2}
+      { \ior_shell_open:Nn \l__graphics_internal_ior { extractbb~#3-O~#1 } }
+      { pipe-failed }
+  }
+\cs_new_protected:Npn \__graphics_read_bb:n #1
+  {
+    \__graphics_read_bb_auxi:nnnn {#1} { }
+      { \ior_open:Nn \l__graphics_internal_ior {#1} }
+      { graphic-not-found }
+  }
+\cs_new_protected:Npn \__graphics_read_bb_auxi:nnnn #1#2#3#4
+  {
+    \__graphics_bb_restore:nF {#1#2}
+      { \__graphics_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} }
+  }
+\cs_new_protected:Npe \__graphics_read_bb_auxii:nnnn #1#2#3#4
+  {
+    #1
+    \exp_not:N \ior_if_eof:NTF \exp_not:N \l__graphics_internal_ior
+      { \msg_error:nnn { graphics } {#2} {#3} }
+      {
+        \ior_str_map_inline:Nn \exp_not:N \l__graphics_internal_ior
+          {
+            \exp_not:N \__graphics_read_bb_auxiii:w
+              ##1 ~ \c_colon_str \s__graphics_stop
+          }
+        \__graphics_bb_save:n {#3#4}
+      }
+    \ior_close:N \exp_not:N \l__graphics_internal_ior
+  }
+\use:e
+  {
+    \cs_new_protected:Npn \exp_not:N \__graphics_read_bb_auxiii:w
+      #1 \c_colon_str #2 \s__graphics_stop
+      {
+        \exp_not:N \str_if_eq:nnT
+          { \c_percent_str \c_percent_str BoundingBox }
+          {#1}
+          { \exp_not:N \__graphics_read_bb_auxiv:w #2 ( ) \s__graphics_stop }
+      }
+  }
+\cs_new_protected:Npn \__graphics_read_bb_auxiv:w #1 ( #2 ) #3 \s__graphics_stop
+  {
+    \str_if_eq:nnF {#2} { atend }
+      {
+        \tl_set_rescan:Nne \l__graphics_internal_tl
+          {
+            \char_set_catcode_space:n {  9 }
+            \char_set_catcode_space:n { 32 }
+          }
+          { \use:n #1 }
+        \exp_after:wN \__graphics_read_bb_auxv:w \l__graphics_internal_tl \s__graphics_stop
+      }
+  }
+\cs_new_protected:Npn \__graphics_read_bb_auxv:w #1~#2~#3~#4~#5 \s__graphics_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 }
+    \ior_map_break:
+  }
+\str_new:N \l__graphics_final_name_str
+\str_new:N \l__graphics_full_name_str
+\box_new:N \l__graphics_internal_box
+\str_new:N \l__graphics_dir_str
+\str_new:N \l__graphics_name_str
+\str_new:N \l__graphics_ext_str
+\seq_new:N \l_graphics_search_path_seq
+\seq_new:N \l_graphics_search_ext_seq
+\prop_new:N \l_graphics_ext_type_prop
+\prop_put:Nnn \l_graphics_ext_type_prop { .ps } { eps }
+\seq_new:N \g__graphics_record_seq
+\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 {#2} \l__graphics_full_name_str
+        {
+          \str_if_eq:eeTF { \l__graphics_full_name_str } { #2 .tex }
+            { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
+            { \__graphics_include: }
+        }
+        { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
+    \group_end:
+  }
+\cs_generate_variant:Nn \graphics_include:nn { nV }
+\cs_new_protected:Npn \__graphics_include:
+  {
+    \str_if_empty:NTF \l__graphics_type_str
+      {
+        \file_parse_full_name:VNNN \l__graphics_full_name_str
+          \l__graphics_dir_str \l__graphics_name_str \l__graphics_ext_str
+        \__graphics_include_auxi:e
+          {
+            \exp_args:Ne \str_tail:n
+              { \str_casefold:V \l__graphics_ext_str }
+          }
+      }
+      { \__graphics_include_auxi:e { \l__graphics_type_str } }
+  }
+\cs_new_protected:Npn \__graphics_include_auxi:n #1
+  {
+    \prop_get:NnNF \l_graphics_ext_type_prop { .#1 } \l__graphics_internal_tl
+      { \tl_set:Nn \l__graphics_internal_tl {#1} }
+    \exp_args:NV \__graphics_include_auxii:n \l__graphics_internal_tl
+  }
+\cs_generate_variant:Nn \__graphics_include_auxi:n { e }
+\cs_new_protected:Npn \__graphics_include_auxii:n #1
+  {
+    \mode_leave_vertical:
+    \cs_if_exist:cTF { __graphics_backend_include_ #1 :n }
+      {
+        \tl_set_eq:NN \l__graphics_final_name_str \l__graphics_full_name_str
+        \str_set:Ne \l__graphics_full_name_str
+          { \exp_args:NV \__kernel_file_name_quote:n \l__graphics_full_name_str }
+        \exp_args:NnV \use:c { __graphics_backend_getbb_ #1 :n }
+          \l__graphics_full_name_str
+        \seq_gput_right:NV \g__graphics_record_seq \l__graphics_final_name_str
+        \clist_if_exist:NT \@filelist
+          { \exp_args:NV \@addtofilelist \l__graphics_final_name_str }
+        \bool_if:NTF \l__graphics_draft_bool
+          { \__graphics_include_auxiii:n }
+          { \__graphics_include_auxiv:n }
+            {#1}
+      }
+      { \msg_error:nnn { graphics } { unsupported-graphic-type } {#1} }
+  }
+\cs_new_protected:Npn \__graphics_include_auxiii:n #1
+  {
+    \hbox_to_wd:nn { \l__graphics_urx_dim - \l__graphics_llx_dim }
+      {
+        \tex_vrule:D
+        \tex_hss:D
+        \vbox_to_ht:nn
+          { \l__graphics_ury_dim - \l__graphics_lly_dim }
+          {
+            \tex_hrule:D width
+              \dim_eval:n { \l__graphics_urx_dim - \l__graphics_llx_dim }
+            \tex_vss:D
+            \hbox_to_wd:nn
+              { \l__graphics_urx_dim - \l__graphics_llx_dim }
+              {
+                \ttfamily
+                \tex_hss:D \l__graphics_full_name_str \tex_hss:D
+              }
+            \tex_vss:D
+            \tex_hrule:D
+          }
+        \tex_hss:D
+        \tex_vrule:D
+      }
+  }
+\cs_new_protected:Npn \__graphics_include_auxiv:n #1
+  {
+    \hbox_set:Nn \l__graphics_internal_box
+      {
+        \exp_args:NnV \use:c { __graphics_backend_include_ #1 :n }
+          \l__graphics_full_name_str
+      }
+    \box_set_dp:Nn \l__graphics_internal_box { 0pt }
+    \box_set_ht:Nn \l__graphics_internal_box
+      { \l__graphics_ury_dim - \l__graphics_lly_dim }
+    \box_set_wd:Nn \l__graphics_internal_box
+      { \l__graphics_urx_dim - \l__graphics_llx_dim }
+    \box_use_drop:N \l__graphics_internal_box
+  }
+\cs_new_protected:Npn \graphics_show_list: { \__graphics_list:N \msg_show:nneeee }
+\cs_new_protected:Npn \graphics_log_list: { \__graphics_list:N \msg_log:nneeee }
+\cs_new_protected:Npn \__graphics_list:N #1
+  {
+    \seq_remove_duplicates:N \g__graphics_record_seq
+    #1 { kernel } { file-list }
+      { \seq_map_function:NN \g__graphics_record_seq \__graphics_list_aux:n }
+        { } { } { }
+  }
+\cs_new:Npn \__graphics_list_aux:n #1 { \iow_newline: #1 }
+\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__graphics_full_name_str
+        {
+          \str_if_eq:eeTF { \l__graphics_full_name_str } { #1 .tex }
+            { \__graphics_get_full_name:n {#1} }
+            {
+              \file_parse_full_name:VNNN \l__graphics_full_name_str
+                \l__graphics_dir_str \l__graphics_name_str \l__graphics_ext_str
+              \seq_map_inline:Nn \l_graphics_search_ext_seq
+                {
+                  \str_if_eq:nVT {##1} \l__graphics_ext_str
+                    { \seq_map_break:n { \use_none:nn } }
+                }
+                  \__graphics_get_full_name:n {#1}
+            }
+        }
+        { \__graphics_get_full_name:n {#1} }
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #2 \l__graphics_full_name_str
+    \tl_if_empty:NTF #2
+      { \prg_return_false: }
+      { \prg_return_true: }
+  }
+\cs_new_protected:Npn \__graphics_get_full_name:n #1
+  {
+    \str_clear:N \l__graphics_full_name_str
+    \seq_map_inline:Nn \l_graphics_search_ext_seq
+      {
+        \file_get_full_name:nNT { #1 ##1 } \l__graphics_full_name_str
+          { \seq_map_break:n { \use_none:nn } }
+      }
+    \use:n
+      { \str_clear:N \l__graphics_full_name_str }
+  }
+\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__graphics_full_name_str
+        {
+          \int_if_exist:cF { c__graphics_ \l__graphics_full_name_str _pages_int }
+            {
+              \exp_args:NV \__graphics_backend_get_pagecount:n
+                \l__graphics_full_name_str
+            }
+          \tl_set:Nv #2 { c__graphics_ \l__graphics_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:Npe \__graphics_get_pagecount:n #1
+  {
+    \exp_not:N \ior_shell_open:Nn \exp_not:N \l__graphics_internal_ior
+      { extractbb~-O~#1 }
+    \exp_not:N \ior_if_eof:NTF \exp_not:N \l__graphics_internal_ior
+      { \msg_error:nnn { graphics } { pipe-failed } }
+      {
+        \ior_str_map_inline:Nn \exp_not:N \l__graphics_internal_ior
+          {
+            \exp_not:N \__graphics_get_pagecount:nw {#1}
+              ##1 ~ \c_colon_str \c_colon_str \s__graphics_stop
+          }
+        \exp_not:N \int_if_exist:cF { c__graphics_ #1 _pages_int }
+          { \int_const:cn { c__graphics_ #1 _pages_int } { 1 } }
+      }
+    \ior_close:N \exp_not:N \l__graphics_internal_ior
+  }
+\use:e
+  {
+    \cs_new_protected:Npn \exp_not:N \__graphics_get_pagecount:nw
+      #1#2 \c_colon_str #3 \c_colon_str #4 \s__graphics_stop
+      {
+        \exp_not:N \str_if_eq:nnT
+          { \c_percent_str \c_percent_str Pages }
+          {#2}
+          {
+            \int_const:cn { c__graphics_ #1 _pages_int } {#3}
+            \exp_not:N \ior_map_break:
+          }
+      }
+  }
+\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.
+  }
+\msg_new:nnnn { graphics } { pipe-failed }
+  { Cannot~run~piped~system~commands. }
+  {
+    LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
+    Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
+  }
+\msg_new:nnnn { graphics } { unsupported-graphic-type }
+  { Image~type~'#1'~not~supported~by~current~driver. }
+  {
+    LaTeX~was~asked~to~include~an~graphic~of~type~'#1',~
+    but~this~is~not~supported~by~the~current~driver~(production~route).
+  }
 %% File: l3pdf.dtx
 \scan_new:N \s__pdf_stop
 \bool_new:N \g__pdf_init_bool

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-generic.tex	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3-generic.tex	2025-03-26 20:04:37 UTC (rev 74759)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2025-03-10}%
+\def\ExplFileDate{2025-03-26}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.ltx	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.ltx	2025-03-26 20:04:37 UTC (rev 74759)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2025-03-10}%
+\def\ExplFileDate{2025-03-26}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.sty	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/expl3.sty	2025-03-26 20:04:37 UTC (rev 74759)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2025-03-10}%
+\def\ExplFileDate{2025-03-26}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3debug.def	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3debug.def	2025-03-26 20:04:37 UTC (rev 74759)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3debug.dtx
-\ProvidesExplFile{l3debug.def}{2025-03-10}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2025-03-26}{}{L3 Debugging support}
 \scan_new:N \s__debug_stop
 \cs_new:Npn \__debug_use_i_delimit_by_s_stop:nw #1 #2 \s__debug_stop {#1}
 \quark_new:N \q__debug_recursion_tail

Modified: trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3doc.cls	2025-03-26 20:04:02 UTC (rev 74758)
+++ trunk/Master/texmf-dist/tex/latex-dev/l3kernel/l3doc.cls	2025-03-26 20:04:37 UTC (rev 74759)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3doc.dtx
 \RequirePackage{calc}
-\ProvidesExplClass{l3doc}{2025-03-10}{}
+\ProvidesExplClass{l3doc}{2025-03-26}{}
   {L3 Experimental documentation class}
 \clist_new:N \g_docinput_clist
 \seq_new:N \g_doc_functions_seq



More information about the tex-live-commits mailing list.