summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/l3experimental
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-05-28 21:24:36 +0000
committerKarl Berry <karl@freefriends.org>2019-05-28 21:24:36 +0000
commit0411921af7908fa9daf388b67db154e9fc51caca (patch)
treef5405f2fef2bc7b0ae9eb9c8809377b88d70c760 /Master/texmf-dist/source/latex/l3experimental
parentc55b67ba30f320ddfc93fbdca08cab7512704011 (diff)
l3 (28may19)
git-svn-id: svn://tug.org/texlive/trunk@51248 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/l3experimental')
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx14
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx61
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx2
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx716
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins56
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx4
20 files changed, 844 insertions, 55 deletions
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
index 1bb701c02ee..218988c8050 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -66,8 +66,10 @@
% \cs{sys_timer:}
% \end{syntax}
% Expands to the current value of the engine's timer clock, a
-% non-negative integer. In engines without clock support this
-% expands to $0$.
+% non-negative integer. In engines without clock support this expands
+% to $0$ after an error. In \LuaTeX{} only the CPU time is measured,
+% while in other engines real time is measured (including time waiting
+% for user input).
% \end{function}
%
% \section{Benchmark}
@@ -128,7 +130,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3benchmark}{2019-05-03}{}
+\ProvidesExplPackage{l3benchmark}{2019-05-28}{}
{L3 Experimental benchmarking}
%</package>
% \end{macrocode}
@@ -148,13 +150,13 @@
\sys_if_engine_luatex:TF
{
\cs_new:Npn \sys_timer:
- { \int_eval:w \lua_now:n { l3kernel.elapsedtime() } \scan_stop: }
+ { \lua_now:n { l3kernel.elapsedtime() } }
}
{
\cs_if_exist:NT \tex_elapsedtime:D
{
\cs_new:Npn \sys_timer:
- { \int_eval:w \tex_elapsedtime:D }
+ { \int_value:w \tex_elapsedtime:D }
}
}
\@@_const:nn { sys_if_timer_exist }
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx
index 70952138e5e..e058c450900 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -150,7 +150,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3cctab}{2019-05-03}{}
+\ProvidesExplPackage{l3cctab}{2019-05-28}{}
{L3 Experimental category code tables}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
index 92ca58363a2..52e60d2b7a2 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -265,7 +265,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3color}{2019-05-03}{}
+\ProvidesExplPackage{l3color}{2019-05-28}{}
{L3 Experimental color support}
%</package>
% \end{macrocode}
@@ -292,9 +292,9 @@
%
% \subsection{Setup}
%
-% \begin{variable}{\l_@@_tmp_tl}
+% \begin{variable}{\l_@@_internal_tl}
% \begin{macrocode}
-\tl_new:N \l_@@_tmp_tl
+\tl_new:N \l_@@_internal_tl
% \end{macrocode}
% \end{variable}
%
@@ -451,15 +451,7 @@
\driver_color_pickup:N \l_@@_current_tl
\tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
%</package>
- \group_begin:
- \seq_map_inline:Nn \l_char_active_seq
- {
- \tl_set:Nx \l_@@_tmp_tl { \cs_to_str:N ##1 }
- \char_set_active_eq:NN ##1 \l_@@_tmp_tl
- }
- \tl_set:Nx \l_@@_tmp_tl {#1}
- \exp_args:NNV \group_end:
- \@@_parse:nN \l_@@_tmp_tl #2
+ \exp_args:Ne \@@_parse:nN { \tl_to_str:n {#1} } #2
}
% \end{macrocode}
% Before going to all of the effort of parsing an expression, these two
@@ -496,10 +488,10 @@
\group_begin:
\@@_extract:nNN {#2} \l_@@_model_tl \l_@@_value_tl
\@@_parse_loop:w #3 ! ! ! ! \q_stop
- \tl_set:Nx \l_@@_tmp_tl
+ \tl_set:Nx \l_@@_internal_tl
{ \l_@@_model_tl \c_space_tl \l_@@_value_tl }
\exp_args:NNNV \group_end:
- \tl_set:Nn #1 \l_@@_tmp_tl
+ \tl_set:Nn #1 \l_@@_internal_tl
}
% \end{macrocode}
% This is the loop proper: there can be an open-ended set of colors to parse,
@@ -633,21 +625,42 @@
% \end{macro}
%
% \begin{macro}[EXP]
-% {\@@_parse_gray:w, \@@_parse_rgb:w, \@@_parse_cmyk:w, \@@_parse_spot:w}
+% {
+% \@@_parse_model_gray:w, \@@_parse_model_rgb:w,
+% \@@_parse_model_cmyk:w, \@@_parse_model_spot:w
+% }
+% \begin{macro}[EXP]{\@@_parse_number:n}
+% \begin{macro}[EXP]{\@@_parse_number:w}
% \begin{macro}[EXP]{\@@_parse_spot_aux:w}
-% Turn the input into internal form.
+% Turn the input into internal form, also tidying up the number quickly.
% \begin{macrocode}
-\cs_new:Npn \@@_parse_gray:w #1 , #2 \q_stop {#1}
-\cs_new:Npn \@@_parse_rgb:w #1 , #2 , #3 , #4 \q_stop { #1 ~ #2 ~ #3 }
-\cs_new:Npn \@@_parse_cmyk:w #1 , #2 , #3 , #4 , #5 \q_stop
- { #1 ~ #2 ~ #3 ~ #4 }
-\cs_new:Npn \@@_parse_spot:w #1 , #2 \q_stop
+\cs_new:Npn \@@_parse_model_gray:w #1 , #2 \q_stop { \@@_parse_number:n {#1} }
+\cs_new:Npn \@@_parse_model_rgb:w #1 , #2 , #3 , #4 \q_stop
+ {
+ \@@_parse_number:n {#1} ~
+ \@@_parse_number:n {#2} ~
+ \@@_parse_number:n {#3}
+ }
+\cs_new:Npn \@@_parse_model_cmyk:w #1 , #2 , #3 , #4 , #5 \q_stop
+ {
+ \@@_parse_number:n {#1} ~
+ \@@_parse_number:n {#2} ~
+ \@@_parse_number:n {#3} ~
+ \@@_parse_number:n {#4}
+ }
+\cs_new:Npn \@@_parse_model_spot:w #1 , #2 \q_stop
{ \@@_parse_spot_aux:w #1 ! 100 ! \q_stop }
\cs_new:Npn \@@_parse_spot_aux:w #1 ! #2 ! #3 \q_stop
{ #1 ~ \fp_eval:n { #2 / 100 } }
+\cs_new:Npn \@@_parse_number:n #1
+ { \@@_parse_number:w #1 . 0 . \q_stop }
+\cs_new:Npn \@@_parse_number:w #1 . #2 . #3 \q_stop
+ { \tl_if_blank:nTF {#1} { 0 } {#1} . #2 }
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \subsection{Selecting colors (and color models)}
%
@@ -725,10 +738,10 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_direct:nnN #1#2#3
{
- \cs_if_exist:cTF { @@_parse_ #1 :w }
+ \cs_if_exist:cTF { @@_parse_model_ #1 :w }
{
\tl_set:Nx #3
- { #1 ~ \use:c { @@_parse_ #1 :w } #2 , 0 , 0 , 0 , 0 \q_stop }
+ { #1 ~ \use:c { @@_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \q_stop }
\@@_check_model:N #3
}
{
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
index 0859e7a2f9d..e3994c49e3c 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
index 7d5ae3948d6..a24b87bb6bd 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
index 874d1910d09..f3c76c0f24e 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
index bda4d40370a..460e8b122d6 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
index d360a1ccba5..3797642b8fe 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
index 13d77d0fdc9..b1cbf83e5e4 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
index 2cf0bf5d500..cbf1eca6768 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
index e8393ec9ee2..77850944890 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
index b4a3ed383bd..d01788b0c80 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
@@ -110,7 +110,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -1145,7 +1145,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3draw}{2019-05-03}{}
+\ProvidesExplPackage{l3draw}{2019-05-28}{}
{L3 Experimental core drawing support}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
new file mode 100644
index 00000000000..b8378682a59
--- /dev/null
+++ b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
@@ -0,0 +1,716 @@
+% \iffalse meta-comment
+%
+%% File: l3graphics.dtx
+%
+% Copyright (C) 2017-2019 The LaTeX3 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 "l3experimental 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|package>
+\RequirePackage{expl3}
+%</driver|package>
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \pkg{l3graphics} package\\ Graphics inclusion support^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2019-05-28}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{\pkg{l3graphics} documentation}
+%
+% \subsection{Driver functions}
+%
+% Inclusion of graphic files requires a range of low-level data be passed to
+% the driver layer. These functions are primarily aimed at supporting this
+% work.
+%
+% \begin{variable}{\l_graphics_decodearray_tl}
+% Array to decode color in bitmap graphic: when non-empty, this should
+% be in the form of one, two or three pairs of real numbers in the range
+% $[0,1]$, separated by spaces.
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_interpolate_bool}
+% Indicates whether interpolation should be applied to bitmap graphic files.
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_page_int}
+% The page to extract from a multi-page graphic file: used for |.pdf| files
+% which may contain multiple pages.
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_pagebox_tl}
+% 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.
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_draft_bool}
+% Switch to enable draft mode: graphics are read but not included when this is
+% true.
+% \end{variable}
+%
+% \begin{variable}
+% {\l_graphics_llx_dim, \l_graphics_lly_dim, \l_graphics_urx_dim, \l_graphics_ury_dim}
+% Dimensions which return the points $(\meta{llx},\meta{lly})$ and
+% $(\meta{urx},\meta{ury})$ for the graphic. For many graphics only the resulting
+% height and width are significant, but this is driver-dependent.
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_name_bool}
+% The name of a graphics file being loaded: usually the same as the
+% input file name, but may be altered by some drivers.
+% \end{variable}
+%
+% \begin{function}
+% {
+% \graphics_bb_save:n, \graphics_bb_save:x,
+% \graphics_bb_restore:nF, \graphics_bb_restore:xF
+% }
+% \begin{syntax}
+% \cs{graphics_bb_save:n} \Arg{graphic}
+% \cs{graphics_bb_restore:nF} \Arg{graphic} \Arg{false code}
+% \end{syntax}
+% This pair of functions are used to cache the bounding box of an \meta{graphic}
+% so that extraction/reading is only required once. The \texttt{save}
+% function stores the values from \cs{l_graphics_llx_dim},
+% \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and
+% \cs{l_graphics_ury_dim} as constants. The \texttt{restore} function will then
+% look up values for the bounding box of an \meta{graphic} and set the four
+% dimensions appropriately. For any one \meta{graphic} the bounding box will
+% be constant, so the \texttt{save} function should only be called once. Thus
+% a typical use case is
+% \begin{verbatim}
+% \graphics_bb_restore:nF { <name> }
+% {
+% % Code to read the bb
+% \graphics_bb_save:n { <name> }
+% }
+% \end{verbatim}
+% \emph{i.e.}~every use of a bounding box will attempt to restore saved data,
+% and saving will only take place where that is not possible.
+%
+% Note that the \meta{graphic} may not be a simple file name: a multi-page PDF,
+% for example, will need to have the bounding box cached for each page used.
+% \end{function}
+%
+% \begin{function}{\graphics_extract_bb:n}
+% \begin{syntax}
+% \cs{graphics_extract_bb:n} \Arg{file}
+% \end{syntax}
+% Extracts bounding box data for the graphic \meta{file} using the |extractbb|
+% utility, and stores the bounding box of the graphic file in
+% \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and
+% \cs{l_graphics_ury_dim}.
+%
+% The \meta{file} name should be fully-qualified and sanitized: no search
+% or other manipulation is carried out at this level. No check is made on
+% the file \emph{type} at this stage: it is assumed that the driver code
+% using this function has made such a check. File types such as |.pdf| and
+% |.jpg| are appropriate for parsing using this function.
+%
+% When \cs{l_graphics_page_int} is positive the appropriate page will be
+% queried from the graphic file.
+%
+% Note that this function requires pipe shell calls to be enabled: this is
+% generally true but may require the option |--enable-pipes| to be enabled
+% when running the \TeX{} job.
+% \end{function}
+%
+% \begin{function}{\graphics_read_bb:n}
+% \begin{syntax}
+% \cs{graphics_read_bb:n} \Arg{file}
+% \end{syntax}
+% Parses the graphic \meta{file} to find a PostScript-style bounding box
+% line of the form
+% \begin{verbatim}
+% %%BoundingBox: llx lly urx urx
+% \end{verbatim}
+% where \meta{llx}, \meta{lly}, \meta{urx} and \meta{ury} are the corners
+% of the bounding box expressed in PostScript (\enquote{big}) points. The
+% values are stored in \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim},
+% \cs{l_graphics_urx_dim} and \cs{l_graphics_ury_dim}.
+%
+% The \meta{file} name should be fully-qualified and sanitized: no search
+% or other manipulation is carried out at this level. No check is made on
+% the file \emph{type} at this stage: it is assumed that the driver code
+% using this function has made such a check. File types such as |.eps| and
+% |.bb|/|.xbb| are appropriate for parsing using this function.
+% \end{function}
+%
+% \begin{function}{\graphics_include:n, \graphics_include:nn}
+% \begin{syntax}
+% \cs{graphics_include:n} \Arg{file}
+% \cs{graphics_include:nn} \Arg{file} \Arg{type}
+% \end{syntax}
+% Horizontal-mode commands which include the \meta{file} as an graphic
+% at the current location. The file \meta{type} is given explicitly in
+% the two-argument version, or is inferred from the file extension extracted
+% in the single-argument form. The exact graphic types supported depend upon
+% the driver in use.
+%
+% Where the \meta{file} is not found and the \meta{type} is \emph{not}
+% given, a search for possible graphic files is undertaken using the extensions
+% stored in \cs{l_graphics_search_ext_seq}.
+% \end{function}
+%
+% \begin{variable}{\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}{\l_graphics_search_ext_seq}
+% Extensions to use for graphic searching when the given \meta{file} name is not
+% found by \cs{graphics_include:n}.
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_search_path_seq}
+% Each entry is the path to a directory which should be searched when
+% seeking an graphic file. Each path can be relative or absolute, and should
+% 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}
+%
+% \begin{function}{\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 by 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}
+%<*initex|package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=graphics>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*package>
+\ProvidesExplPackage{l3graphics}{2019-05-28}{}
+ {L3 Experimental graphics inclusion support}
+%</package>
+% \end{macrocode}
+%
+% \begin{variable}{\l_@@_tmp_ior, \l_@@_tmp_tl}
+% Scratch space.
+% \begin{macrocode}
+\ior_new:N \l_@@_tmp_ior
+\tl_new:N \l_@@_tmp_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Image feature support}
+%
+% \begin{macro}
+% {
+% \l_graphics_decodearray_tl ,
+% \l_graphics_interpolate_bool,
+% \l_graphics_page_int ,
+% \l_graphics_pagebox_tl
+% }
+% Keys which control features of graphics. The standard value of |pagebox|
+% set up here should match the default for the drivers themselves: in
+% the absence of any other setting the |cropbox| should be used.
+% \begin{macrocode}
+\tl_new:N \l_graphics_decodearray_tl
+\tl_new:N \l_graphics_pagebox_tl
+\bool_new:N \l_graphics_interpolate_bool
+\tl_set:Nn \l_graphics_pagebox_tl { cropbox }
+\int_new:N \l_graphics_page_int
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Obtaining bounding box data}
+%
+% \begin{variable}
+% {
+% \l_graphics_llx_dim , \l_graphics_lly_dim,
+% \l_graphics_urx_dim , \l_graphics_ury_dim
+% }
+% Storage for the return of bounding box.
+% \begin{macrocode}
+\dim_new:N \l_graphics_llx_dim
+\dim_new:N \l_graphics_lly_dim
+\dim_new:N \l_graphics_urx_dim
+\dim_new:N \l_graphics_ury_dim
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\graphics_bb_save:n, \graphics_bb_save:x}
+% \begin{macro}{\graphics_bb_restore:nF, \graphics_bb_restore:xF}
+% Caching graphic bounding boxes is sensible, and these functions are needed both
+% here and for drive-specific work. So they are made available as documented
+% functions. To save on registers, the \enquote{origin} is only saved if it is
+% not at zero.
+% \begin{macrocode}
+\cs_new_protected:Npn \graphics_bb_save:n #1
+ {
+ \dim_if_exist:cTF { c_@@_ #1 _urx_dim }
+ { \__kernel_msg_error:nnn { graphic } { bb-already-cached } {#1} }
+ {
+ \dim_compare:nNnF \l_graphics_llx_dim = { 0pt }
+ { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_graphics_llx_dim } }
+ \dim_compare:nNnF \l_graphics_lly_dim = { 0pt }
+ { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_graphics_lly_dim } }
+ \dim_const:cn { c_@@_ #1 _urx_dim } { \l_graphics_urx_dim }
+ \dim_const:cn { c_@@_ #1 _ury_dim } { \l_graphics_ury_dim }
+ }
+ }
+\cs_generate_variant:Nn \graphics_bb_save:n { x }
+\cs_new_protected:Npn \graphics_bb_restore:nF #1#2
+ {
+ \dim_if_exist:cTF { c_@@_ #1 _urx_dim }
+ {
+ \dim_set_eq:Nc \l_graphics_urx_dim { c_@@_ #1 _urx_dim }
+ \dim_set_eq:Nc \l_graphics_ury_dim { c_@@_ #1 _ury_dim }
+ \dim_if_exist:cTF { c_@@_ #1 _llx_dim }
+ { \dim_set_eq:Nc \l_graphics_llx_dim { c_@@_ #1 _llx_dim } }
+ { \dim_zero:N \l_graphics_llx_dim }
+ \dim_if_exist:cTF { c_@@_ #1 _lly_dim }
+ { \dim_set_eq:Nc \l_graphics_lly_dim { c_@@_ #1 _lly_dim } }
+ { \dim_zero:N \l_graphics_lly_dim }
+ }
+ {#2}
+ }
+\cs_generate_variant:Nn \graphics_bb_restore:nF { x }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\graphics_extract_bb:n, \graphics_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 \graphics_extract_bb:n #1
+ {
+ \int_compare:nNnTF \l_graphics_page_int > 0
+ { \@@_extract_bb_auxi:Vn \l_graphics_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_graphics_pagebox_tl
+ { \@@_extract_bb_auxiv:nnn }
+ { \@@_extract_bb_auxiii:Vnnn \l_graphics_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_@@_tmp_ior { extractbb~#3-O~#1 } }
+ { pipe-failed }
+ }
+\cs_new_protected:Npn \graphics_read_bb:n #1
+ {
+ \@@_read_bb_auxi:nnnn {#1} { }
+ { \ior_open:Nn \l_@@_tmp_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
+ {
+ \graphics_bb_restore:nF {#1#2}
+ { \@@_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} }
+ }
+\cs_new_protected:Npx \@@_read_bb_auxii:nnnn #1#2#3#4
+ {
+ #1
+ \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_tmp_ior
+ { \__kernel_msg_error:nnn { graphics } {#2} {#3} }
+ {
+ \ior_str_map_inline:Nn \exp_not:N \l_@@_tmp_ior
+ {
+ \exp_not:N \@@_read_bb_auxiii:w
+ ##1 ~ \c_colon_str \exp_not:N \q_stop
+ }
+ }
+ \exp_not:n
+ {
+ \ior_close:N \l_@@_tmp_ior
+ \dim_compare:nNnF \l_graphics_llx_dim = { 0pt }
+ { \dim_const:cn { c_@@_ #3#4 _llx_dim } { \l_graphics_llx_dim } }
+ \dim_compare:nNnF \l_graphics_lly_dim = { 0pt }
+ { \dim_const:cn { c_@@_ #3#4 _lly_dim } { \l_graphics_lly_dim } }
+ \dim_const:cn { c_@@_ #3#4 _urx_dim } { \l_graphics_urx_dim }
+ \dim_const:cn { c_@@_ #3#4 _ury_dim } { \l_graphics_ury_dim }
+ }
+ }
+\use:x
+ {
+ \cs_new_protected:Npn \exp_not:N \@@_read_bb_auxiii:w
+ ##1 \c_colon_str ##2 \exp_not:N \q_stop
+ {
+ \exp_not:N \str_if_eq:nnT
+ { \c_percent_str \c_percent_str BoundingBox }
+ {##1}
+ { \exp_not:N \@@_read_bb_auxiv:w ##2 ( ) \exp_not:N \q_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 \q_stop
+ {
+ \str_if_eq:nnF {#2} { atend }
+ {
+ \tl_set_rescan:Nnx \l_@@_tmp_tl
+ {
+ \char_set_catcode_space:n { 9 }
+ \char_set_catcode_space:n { 32 }
+ }
+ { \use:n #1 }
+ \exp_after:wN \@@_read_bb_auxv:w \l_@@_tmp_tl \q_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 \q_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:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_graphics_draft_bool}
+% Relevant to including graphics but not to reading them.
+% \begin{macrocode}
+\bool_new:N \l_graphics_draft_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_graphics_name_tl, \l_@@_name_tl}
+% \begin{macrocode}
+\tl_new:N \l_graphics_name_tl
+\tl_new:N \l_@@_name_tl
+% \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-driver 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:n}
+% \begin{macro}{\@@_include_search:n}
+% \begin{macro}{\@@_include:}
+% \begin{macro}{\graphics_include:nn}
+% \begin{macro}
+% {
+% \@@_include_auxi:n, \@@_include_auxii:n,
+% \@@_include_auxiii:n, \@@_include_auxiv:n
+% }
+% Actually including an graphic is relatively straight-forward: most of the
+% work is done by the driver. We only have to deal with making sure the
+% box has no apparent depth. Where the first given name is not found, we
+% search based on extension only if the \meta{type} was not given. The one
+% wrinkle is that we may have found a \texttt{.tex} file matching the file
+% name stem: that's not what we want, so we have to filter out.
+% \begin{macrocode}
+\cs_new_protected:Npn \graphics_include:n #1
+ {
+ \group_begin:
+ \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
+ \file_get_full_name:nNTF {#1} \l_@@_name_tl
+ {
+ \str_if_eq:eeTF { \l_@@_name_tl } { #1 .tex }
+ { \@@_include_search:n {#1} }
+ { \@@_include: }
+ }
+ { \@@_include_search:n {#1} }
+ \group_end:
+ }
+\cs_new_protected:Npn \@@_include_search:n #1
+ {
+ \seq_map_inline:Nn \l_graphics_search_ext_seq
+ {
+ \file_get_full_name:nNT { #1 . ##1 } \l_@@_name_tl
+ { \seq_map_break:n { \use_i:nnn \@@_include: } }
+ }
+ \use:n
+ { \__kernel_msg_error:nnn { graphics } { graphic-not-found } {#1} }
+ }
+\cs_new_protected:Npn \@@_include:
+ {
+ \file_parse_full_name:VNNN \l_@@_name_tl
+ \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+ \exp_args:Ne \@@_include_auxi:n
+ {
+ \exp_args:Ne \str_tail:n
+ { \str_fold_case:V \l_@@_ext_str }
+ }
+ }
+\cs_new_protected:Npn \graphics_include:nn #1#2
+ {
+ \group_begin:
+ \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
+ \file_get_full_name:nNTF {#1} \l_@@_name_tl
+ {
+ \exp_args:Ne \@@_include_auxi:n
+ { \str_fold_case:n {#1} }
+ }
+ { \__kernel_msg_error:nnn { graphics } { graphic-not-found } {#1} }
+ \group_end:
+ }
+\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_new_protected:Npn \@@_include_auxii:n #1
+ {
+ \mode_leave_vertical:
+ \cs_if_exist:cTF { driver_graphics_include_ #1 :n }
+ {
+ \tl_set_eq:NN \l_graphics_name_tl \l_@@_name_tl
+ \exp_args:NnV \use:c { driver_graphics_getbb_ #1 :n }
+ \l_@@_name_tl
+ \seq_gput_right:NV \g_@@_record_seq \l_graphics_name_tl
+%<*package>
+ \clist_if_exist:NT \@filelist
+ { \exp_args:NV \@addtofilelist \l_graphics_name_tl }
+%</package>
+ \bool_if:NTF \l_graphics_draft_bool
+ { \@@_include_auxiii:n }
+ { \@@_include_auxiv:n }
+ {#1}
+ }
+ { \__kernel_msg_error:nnn { graphics } { unsupported-graphic-type } {#1} }
+ }
+\cs_new_protected:Npn \@@_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 }
+ {
+%<*package>
+ \ttfamily
+%</package>
+ \tex_hss:D \l_@@_name_tl \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 { driver_graphics_include_ #1 :n }
+ \l_@@_name_tl
+ }
+ \box_set_dp:Nn \l_@@_internal_box { 0pt }
+ \box_set_ht:Nn \l_@@_internal_box
+ { \l_graphics_ury_dim - \l_graphics_lly_dim }
+ \box_set_wd:Nn \l_@@_internal_box
+ { \l_graphics_urx_dim - \l_graphics_llx_dim }
+ \box_use_drop:N \l_@@_internal_box
+ }
+% \end{macrocode}
+% \end{macro}
+% \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:nnxxxx }
+\cs_new_protected:Npn \graphics_log_list: { \@@_list:N \msg_log:nnxxxx }
+\cs_new_protected:Npn \@@_list:N #1
+ {
+ \seq_remove_duplicates:N \g_@@_record_seq
+ #1 { LaTeX/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{Messages}
+%
+% \begin{macrocode}
+\__kernel_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.
+ }
+\__kernel_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.
+ }
+\__kernel_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}
+%</initex|package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins
new file mode 100644
index 00000000000..815535a352c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins
@@ -0,0 +1,56 @@
+\iffalse meta-comment
+
+File l3graphics.ins Copyright (C) 2017,2019 The LaTeX3 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 "l3experimental 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.
+
+-----------------------------------------------------------------------
+
+Any modification of this file should ensure that the copyright and
+license information is placed in the derived files.
+
+\fi
+
+\input l3docstrip.tex
+\askforoverwritefalse
+
+\preamble
+
+Copyright (C) 2019 The LaTeX3 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 "l3experimental bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+\endpreamble
+% stop docstrip adding \endinput
+\postamble
+\endpostamble
+
+\keepsilent
+
+\generate{\file{l3graphics.sty}{\from{l3graphics.dtx}{package}}}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
index 33c7b8fa7a5..fb218771a5a 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
@@ -1,6 +1,8 @@
% \iffalse meta-comment
%
-%% File: l3str-convert.dtx Copyright (C) 2013-2019 The LaTeX3 Project
+%% File: l3str-convert.dtx
+%
+% Copyright (C) 2013-2019 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +48,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -234,7 +236,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3str-convert}{2019-05-03}{}
+\ProvidesExplPackage{l3str-convert}{2019-05-28}{}
{L3 Experimental string encoding conversions}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
index afb473ccfb9..70448816fb3 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -164,7 +164,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3str-format}{2019-05-03}{}
+\ProvidesExplPackage{l3str-format}{2019-05-28}{}
{L3 Experimental string formatting}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
index 173abde66b4..64ab863d807 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -136,7 +136,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3sys-shell}{2019-05-03}{}
+\ProvidesExplPackage{l3sys-shell}{2019-05-28}{}
{L3 Experimental system shell functions}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
index 803b8188769..59860d70d1d 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
@@ -56,7 +56,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -675,7 +675,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2019-05-03}{}
+\ProvidesExplPackage{xcoffins}{2019-05-28}{}
{L3 Experimental design level coffins}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
index 04ec76c9270..716bea363ab 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -687,7 +687,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3galley}{2019-05-03}{}
+\ProvidesExplPackage{l3galley}{2019-05-28}{}
{L3 Experimental galley code}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
index 556a51a9511..deefd7a4416 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Released 2019-05-03}
+% \date{Released 2019-05-28}
%
% \maketitle
%
@@ -734,7 +734,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2019-05-03}{}
+\ProvidesExplPackage{xgalley}{2019-05-28}{}
{L3 Experimental galley}
\RequirePackage{xparse,xtemplate,l3galley}
% \end{macrocode}