diff options
author | Karl Berry <karl@freefriends.org> | 2022-04-11 20:14:43 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-04-11 20:14:43 +0000 |
commit | 9dc9eb0cc555a34fc566da8be3a89891f9e12898 (patch) | |
tree | 6f5790ed1de99f6b4c6cb30b34ad2b3e983f90f5 /Master/texmf-dist | |
parent | 81d082bcfbaee9189138d6ff85256e047409a769 (diff) |
l3 (11apr22)
git-svn-id: svn://tug.org/texlive/trunk@63007 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
151 files changed, 2134 insertions, 1538 deletions
diff --git a/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md index 68a0f8e377c..e94dbb881d5 100644 --- a/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md @@ -6,6 +6,19 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2022-04-10] + +### Added +- Support for graphics (PDF) page count extraction + +### Fixed +- Setup for graphics extension searching +- Various internal issues in graphics inclusion +- Some missing functions for `dvisvgm` color support added + +### Removed +- Support for pre-2020-11-11 `dvipdfmx` + ## [2022-02-07] ### Fixed @@ -217,7 +230,8 @@ this project uses date-based 'snapshot' version identifiers. - Include `l3backend` in file names - Moved backend code to internal for each 'parent' module -[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-07...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD +[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-07...2022-04-10 [2022-02-07]: https://github.com/latex3/latex3/compare/2022-01-12...2022-02-07 [2022-01-12]: https://github.com/latex3/latex3/compare/2021-12-14...2022-01-12 [2021-12-14]: https://github.com/latex3/latex3/compare/2021-10-17...2021-12-14 diff --git a/Master/texmf-dist/doc/latex/l3backend/README.md b/Master/texmf-dist/doc/latex/l3backend/README.md index 31dccaaa602..470d6914a00 100644 --- a/Master/texmf-dist/doc/latex/l3backend/README.md +++ b/Master/texmf-dist/doc/latex/l3backend/README.md @@ -1,7 +1,7 @@ LaTeX3 Backend Drivers ====================== -Release 2022-02-07 +Release 2022-04-10 This package forms parts of `expl3`, and contains the code used to interface with backends (drivers) across the `expl3` codebase. The functions here are diff --git a/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf b/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf Binary files differindex a3f052df2c2..960a45053cb 100644 --- a/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf +++ b/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md index adb32cd3b1f..eb5896536a1 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md @@ -7,6 +7,16 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2022-04-10] + +### Added +- `\graphics_get_pagecount:nN(TF)` + +### Changed +- Return an empty `seq` when `\sys_shell_split_ls:nN` is applied with a + glob which matched no entries +- Heavily revise `l3graphics` to provide only necessary public interfaces + ## [2022-02-05] ### Changed @@ -236,7 +246,8 @@ this project uses date-based 'snapshot' version identifiers. - New `l3color` module using `xcolor`-like expression syntax - New `l3draw` module, based on `pgf` layer of the TikZ system -[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-05...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD +[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-05...2022-04-10 [2022-02-05]: https://github.com/latex3/latex3/compare/2021-11-12...2022-02-05 [2021-11-12]: https://github.com/latex3/latex3/compare/2021-08-27...2021-11-12 [2021-08-27]: https://github.com/latex3/latex3/compare/2021-08-04...2021-08-27 diff --git a/Master/texmf-dist/doc/latex/l3experimental/README.md b/Master/texmf-dist/doc/latex/l3experimental/README.md index 279ce505628..8d02dbf001e 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/README.md +++ b/Master/texmf-dist/doc/latex/l3experimental/README.md @@ -1,7 +1,7 @@ Experimental LaTeX3 Concepts ============================ -Release 2022-02-05 +Release 2022-04-10 Overview -------- diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf Binary files differindex 951852e5012..e5f7ea9bc15 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3bitset/l3bitset.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3bitset/l3bitset.pdf Binary files differindex 410e5313acc..47e6e50d2b1 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3bitset/l3bitset.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3bitset/l3bitset.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf Binary files differindex b8cb75e0077..31b8834d68e 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf Binary files differindex bf801c35936..d58318d5d3a 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf Binary files differindex 9827216d8f7..3d5ce27457e 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3opacity/l3opacity.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3opacity/l3opacity.pdf Binary files differindex 01bca12cc72..ffdc6588468 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3opacity/l3opacity.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3opacity/l3opacity.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf Binary files differindex 7b9c5ab087c..74e1f21ef0c 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf Binary files differindex 610ff8e175a..8baa8395b8c 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf Binary files differindex eb412538c9b..269b1c2ffa6 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf Binary files differindex 1bcda6a650a..af4ba00c962 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf Binary files differindex 1b2a990971f..7addf4afe80 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md index ba245c3c958..81af951ced4 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md @@ -7,6 +7,26 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2022-04-10] + +### Added +- `\keys_precompile:nnN` for conversion of keyvals to fast-to-apply token + lists +- Missing `\str_if_empty:n(TF)` (see issue \#1071) +- Missing `\str_case:Nn(TF)` (see issue \#1071) +- `\tex_...:D` names for primitives added in TeX Live 2022 + +### Changed +- Definition of `\legacy_if:n(TF)` to support primitive conditionals +- `\str_<type>case:n` now case changes codepoints above 127 with all engines +- `\char_generate:nn` now also allows to generate category 10 tokens (spaces) + except for char code 0 + +### Fixed +- Handling of 'misplaced' `\protect` by `\text_expand:n` +- Nesting of `\tl_analysis_map_inline:nn` +- Naming of an error message + ## [2022-02-24] ### Changed @@ -1053,7 +1073,8 @@ this project uses date-based 'snapshot' version identifiers. - Step functions have been added for dim variables, e.g. `\dim_step_inline:nnnn` -[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-24...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD +[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-24...2022-04-10 [2022-02-24]: https://github.com/latex3/latex3/compare/2022-02-21...2022-02-24 [2022-02-21]: https://github.com/latex3/latex3/compare/2022-02-05...2022-02-21 [2022-02-05]: https://github.com/latex3/latex3/compare/2022-01-21...2022-02-05 diff --git a/Master/texmf-dist/doc/latex/l3kernel/README.md b/Master/texmf-dist/doc/latex/l3kernel/README.md index cc869f47ab1..c3054ed481f 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/README.md +++ b/Master/texmf-dist/doc/latex/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2022-02-24 +Release 2022-04-10 Overview -------- diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf Binary files differindex 250532d701b..17f1287430e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf Binary files differindex 0fbf0fe2463..fa6f1230619 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex index 24a3861ab85..9274fe46c33 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex @@ -54,7 +54,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2022-02-24} +\date{Released 2022-04-10} \pagenumbering{roman} \maketitle diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf Binary files differindex 57f82896e7c..1577ec2375d 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf Binary files differindex a2b49464e9b..c4ccf582496 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf Binary files differindex 41629c69b09..9ca06a0a682 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf Binary files differindex db35f561cc6..1976dbbfc50 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf Binary files differindex 9a55490e566..96c2a091579 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf Binary files differindex 8af2efbdcd4..68b424976f7 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf Binary files differindex 3732cec9c7a..4337d21355e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf Binary files differindex 79a1463cf84..6a23c7d8bbc 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf Binary files differindex 40f1de1db68..07b0787506f 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf Binary files differindex 7ae558a9165..221fdc815a0 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf Binary files differindex b9b64ff4a20..88dce292213 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf Binary files differindex 2029fe30fbc..0e81abd0933 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf Binary files differindex aaad79b8ab6..96bbed22455 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf Binary files differindex 127719deb28..39754d32c5c 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf Binary files differindex 3fce91c6945..9035265fc7e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv index d9786a1a1e2..2648b9b874b 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv +++ b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv @@ -40,6 +40,7 @@ clist,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https cmd,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2021-01-20,2021-03-03, code,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2021-04-23,2021-04-23, codedoc,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,Somewhat experimental: may change +codehigh,codehigh,Jianrui Lyu,https://github.com/lvjr/codehigh,https://github.com/lvjr/codehigh.git,https://github.com/lvjr/codehigh/issues,2022-04-02,2022-04-02, coffin,"l3kernel,xcoffins",The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, colon,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, color,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, @@ -89,6 +90,7 @@ fnpct,fnpct,Clemens Niederberger,https://github.com/cgnieder/fnpct/,https://gith fontsizes,fontsizes,Julien Rivaud,,,,,2018-06-13, fontspec,fontspec,Will Robertson,https://github.com/wspr/fontspec,https://github.com/wspr/fontspec.git,https://github.com/wspr/fontspec/issues,2013-03-16,2013-03-16, fp,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, +fun,functional,Jianrui Lyu,https://github.com/lvjr/functional,https://github.com/lvjr/functional.git,https://github.com/lvjr/functional/issues,2022-04-02,2022-04-02, galley,l3galley,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, gatherenum,gatherenum,Julien Rivaud,,,,2018-06-13,2018-06-14, getree,genealogytree,Thomas F. Sturm,https://github.com/T-F-S/genealogytree,https://github.com/T-F-S/genealogytree.git,https://github.com/T-F-S/genealogytree/issues,2020-02-19,2020-02-19, @@ -125,6 +127,7 @@ lltxmath,lualatex-math,Philipp Stephani,https://github.com/phst/lualatex-math,ht log,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, lua,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, luatex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, +lwc,lua-widow-control,Max Chernoff,https://github.com/gucci-on-fleek/lua-widow-control,https://github.com/gucci-on-fleek/lua-widow-control.git,https://github.com/gucci-on-fleek/lua-widow-control/issues,2022-02-24,2022-02-24, mark,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, markdown,markdown,VÃt Novotný,https://ctan.org/pkg/markdown,https://github.com/witiko/markdown.git,https://github.com/witiko/markdown/issues,2021-09-08,2021-09-08, marks,l3kernel/xmarks,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2020-02-17,2020-02-17, @@ -149,6 +152,7 @@ namedef,namedef,Phelype Oleinik,https://github.com/PhelypeOleinik/namedef,https: nan,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, nicematrix,nicematrix,François Pantigny,,,,2019-12-19,2019-12-19, nil,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, +ninecolors,ninecolors,Jianrui Lyu,https://github.com/lvjr/ninecolors,https://github.com/lvjr/ninecolors.git,https://github.com/lvjr/ninecolors/issues,2022-04-02,2022-04-02, nmc,numerica,Andrew Parsloe,,,,2021-06-30,2021-06-30, no,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, notestobib,notes2bib,Joseph Wright,https://github.com/josephwright/notes2bib,https://github.com/josephwright/notes2bib.git,https://github.com/josephwright/notes2bib/issues,2012-11-07,2012-11-07, @@ -218,6 +222,7 @@ substances,substances,Clemens Niederberger,https://github.com/cgnieder/substance sys,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-09-07,2015-09-08, tag,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02, tasks,tasks,Clemens Niederberger,https://github.com/cgnieder/tasks/,https://github.com/cgnieder/tasks.git,https://github.com/cgnieder/cgnieder/tasks/issues,2013-03-16,2020-04-14, +tblr,tabularray,Jianrui Lyu,https://github.com/lvjr/tabularray,https://github.com/lvjr/tabularray.git,https://github.com/lvjr/tabularray/issues,2022-04-02,2022-04-02 tcobox,tcolorbox,Thomas F. Sturm,https://github.com/T-F-S/tcolorbox,https://github.com/T-F-S/tcolorbox.git,https://github.com/T-F-S/tcolorbox/issues,2020-02-19,2020-02-19, term,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, tex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf Binary files differindex 7724db3c3b3..433569b9b2b 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf Binary files differindex 63989dbdbf9..21449e7b02e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex index 86f5230696e..6fd43ce8019 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2022-02-24} +\date{Released 2022-04-10} \begin{document} diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf Binary files differindex 3d449d05379..587c0c8b36d 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex index 430b3cb056d..722a90977aa 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2022-02-24} +\date{Released 2022-04-10} \newcommand{\TF}{\textit{(TF)}} diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf Binary files differindex 4cf56475bb5..d200cd3e0c7 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex index bd10abf6f2f..90b3a71af2e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2022-02-24} +\date{Released 2022-04-10} \newcommand{\TF}{\textit{(TF)}} diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf Binary files differindex abe5195e410..c00c8648b57 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.tex b/Master/texmf-dist/doc/latex/l3kernel/source3.tex index 774083a4a87..3defa4b47ae 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.tex @@ -53,7 +53,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2022-02-24} +\date{Released 2022-04-10} \pagenumbering{roman} \maketitle diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3body.tex b/Master/texmf-dist/doc/latex/l3kernel/source3body.tex index a2e87856bd7..20e1875361e 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3body.tex +++ b/Master/texmf-dist/doc/latex/l3kernel/source3body.tex @@ -207,7 +207,9 @@ following argument specifiers: \item[\texttt{c}] This means \emph{csname}, and indicates that the argument will be turned into a csname before being used. So |\foo:c| |{ArgumentOne}| will act in the same way as |\foo:N| - |\ArgumentOne|. + |\ArgumentOne|. All macros that appear in the argument are expanded. + An internal error will occur if the result of expansion inside + a \texttt{c}-type argument is not a series of character tokens. \item[\texttt{V} and \texttt{v}] These mean \emph{value of variable}. The \texttt{V} and \texttt{v} specifiers are used to get the content of a variable without needing to worry about the diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx index d7c3c6e4c38..f4bf61fe70b 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -70,27 +70,27 @@ % \begin{macrocode} \ProvidesExplFile %<*dvipdfmx> - {l3backend-dvipdfmx.def}{2022-02-07}{} + {l3backend-dvipdfmx.def}{2022-04-10}{} {L3 backend support: dvipdfmx} %</dvipdfmx> %<*dvips> - {l3backend-dvips.def}{2022-02-07}{} + {l3backend-dvips.def}{2022-04-10}{} {L3 backend support: dvips} %</dvips> %<*dvisvgm> - {l3backend-dvisvgm.def}{2022-02-07}{} + {l3backend-dvisvgm.def}{2022-04-10}{} {L3 backend support: dvisvgm} %</dvisvgm> %<*luatex> - {l3backend-luatex.def}{2022-02-07}{} + {l3backend-luatex.def}{2022-04-10}{} {L3 backend support: PDF output (LuaTeX)} %</luatex> %<*pdftex> - {l3backend-pdftex.def}{2022-02-07}{} + {l3backend-pdftex.def}{2022-04-10}{} {L3 backend support: PDF output (pdfTeX)} %</pdftex> %<*xetex> - {l3backend-xetex.def}{2022-02-07}{} + {l3backend-xetex.def}{2022-04-10}{} {L3 backend support: XeTeX} %</xetex> % \end{macrocode} @@ -395,35 +395,6 @@ % \end{macro} % % \begin{macrocode} -%<@@=sys> -% \end{macrocode} -% -% \begin{macro}{\c__kernel_sys_dvipdfmx_version_int} -% A short excursion into the |sys| module to set up the backend version -% information. -% \begin{macrocode} -\group_begin: - \cs_set:Npn \@@_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2} - \sys_get_shell:nnNTF { extractbb~--version } - { \char_set_catcode_space:n { `\ } } - \l_@@_internal_tl - { - \int_const:Nn \c__kernel_sys_dvipdfmx_version_int - { - \exp_after:wN \@@_tmp:w \l_@@_internal_tl - \q_stop - } - } - { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } } -\group_end: -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%<@@=> -% \end{macrocode} -% -% \begin{macrocode} %</dvipdfmx|xetex> % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx index 1d3450c78ca..a732d605641 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx index 064c55fa606..815b41302a5 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -203,54 +203,50 @@ % In \texttt{(x)dvipdfmx}, the base color stack is not set up, so we have to % force that, as well as providing a mechanism more generally. % \begin{macrocode} -\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } } +\int_new:N \g_@@_backend_stack_int +\cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3 { - \int_new:N \g_@@_backend_stack_int - \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3 + \int_gincr:N \exp_not:N \g_@@_backend_stack_int + \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int } + \use:x { - \int_gincr:N \exp_not:N \g_@@_backend_stack_int - \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int } - \use:x + \__kernel_backend_first_shipout:n { - \__kernel_backend_first_shipout:n + \__kernel_backend_literal:n { - \__kernel_backend_literal:n - { - pdfcolorstackinit ~ - \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int - \c_space_tl - \exp_not:N \tl_if_blank:nF {#2} { #2 ~ } - (#3) - } + pdfcolorstackinit ~ + \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int + \c_space_tl + \exp_not:N \tl_if_blank:nF {#2} { #2 ~ } + (#3) } - } - } - \cs_if_exist:cTF { main@pdfcolorstack } - { - \int_set:Nn \l_@@_backend_stack_int - { \int_use:c { main@pdfcolorstack } } - } - { - \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int - { page ~ direct } { 0 ~ g ~ 0 ~ G } - \int_set_eq:NN \l_@@_backend_stack_int - \c_@@_backend_main_stack_int - \int_const:cn { main@pdfcolorstack } { \c_@@_backend_main_stack_int } + } } + } +\cs_if_exist:cTF { main@pdfcolorstack } + { + \int_set:Nn \l_@@_backend_stack_int + { \int_use:c { main@pdfcolorstack } } + } + { + \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int + { page ~ direct } { 0 ~ g ~ 0 ~ G } + \int_set_eq:NN \l_@@_backend_stack_int + \c_@@_backend_main_stack_int + \int_const:cn { main@pdfcolorstack } { \c_@@_backend_main_stack_int } + } % \end{macrocode} % The backend automatically restores the stack color from the \enquote{classical} % approach (\texttt{pdf:bcolor}) after a scope. That will be an issue for us, so % we manually ensure that the one we are using is inserted. % \begin{macrocode} - \cs_gset_protected:Npn \__kernel_backend_scope_end: +\cs_gset_protected:Npn \__kernel_backend_scope_end: + { + \__kernel_backend_literal:n { x:grestore } + \__kernel_backend_literal:x { - \__kernel_backend_literal:n { x:grestore } - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_use:N \g_@@_backend_stack_int \c_space_tl current - } + pdfcolorstack ~ + \int_use:N \g_@@_backend_stack_int \c_space_tl current } } % \end{macrocode} @@ -261,26 +257,23 @@ % \begin{macro}{\__kernel_color_backend_stack_pop:n} % Simple enough but needs a version check. % \begin{macrocode} -\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } +\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2 { - \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2 + \__kernel_backend_literal:x { - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_eval:n {#1} ~ - push ~ (#2) - } + pdfcolorstack ~ + \int_eval:n {#1} ~ + push ~ (#2) } - \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx } - \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1 + } +\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx } +\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1 + { + \__kernel_backend_literal:x { - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_eval:n {#1} ~ - pop - } + pdfcolorstack ~ + \int_eval:n {#1} ~ + pop } } % \end{macrocode} @@ -440,10 +433,6 @@ % % \subsubsection{\texttt{dvipmdfx}/\XeTeX{}} % -% \begin{macrocode} -%<*dvipdfmx|xetex> -% \end{macrocode} -% % These backends have the most possible approaches: it recognises both % \texttt{dvips}-based color specials and it's own format, plus one can % include PDF statements directly. Recent releases also have a color stack @@ -452,32 +441,6 @@ % we have. Thus it is used in preference to the \texttt{dvips}-style interface % or the \enquote{native} color specials (which have only one stack). % -% \begin{macro} -% { -% \@@_backend_select_cmyk:n , -% \@@_backend_select_gray:n , -% \@@_backend_select_rgb:n -% } -% \begin{macro}{\@@_backend_reset:} -% Push the data to the stack. -% \begin{macrocode} -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \@@_backend_select_cmyk:n #1 - { \__kernel_backend_literal:n { pdf: bc ~ [#1] } } - \cs_gset_eq:NN \@@_backend_select_gray:n \@@_backend_select_cmyk:n - \cs_gset_eq:NN \@@_backend_select_rgb:n \@@_backend_select_cmyk:n - \cs_gset_protected:Npn \@@_backend_reset: - { \__kernel_backend_literal:n { pdf: ec } } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macrocode} -%</dvipdfmx|xetex> -% \end{macrocode} -% % \subsection{Separations} % % Here, life gets interesting and we need essentially one approach per @@ -1097,28 +1060,6 @@ %</dvipdfmx|luatex|pdftex|xetex> % \end{macrocode} % -% \begin{macrocode} -%<*dvipdfmx|xetex> -% \end{macrocode} -% -% \begin{macro}{\@@_backend_select_separation:nn, \@@_backend_select_devicen:nn} -% For older \texttt{(x)dvipdfmx}, we \emph{could} support separations using a -% dedicated mechanism, but it was not added that long before the color -% stacks. So instead of having two complex paths, just disable here. -% \begin{macrocode} -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \@@_backend_select_separation:nn #1#2 { } - \cs_gset_eq:NN \@@_backend_select_devicen:nn - \@@_backend_select_separation:nn - } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%</dvipdfmx|xetex> -% \end{macrocode} -% % \subsection{Fill and stroke color} % % Here, \texttt{dvipdfmx}/\XeTeX{} follows \LuaTeX{} and \pdfTeX{}, @@ -1198,52 +1139,6 @@ % \end{macrocode} % % \begin{macrocode} -%<*dvipdfmx|xetex> -% \end{macrocode} -% -% \begin{macro} -% { -% \@@_backend_fill_cmyk:n , -% \@@_backend_fill_gray:n , -% \@@_backend_fill_rgb:n -% } -% \begin{macro}{\@@_backend_reset:} -% \begin{macro}{\@@_backend_stroke:n} -% \begin{macro}{\@@_backend_fill_separation:nn, \@@_backend_stroke_separation:nn} -% Deal with older \texttt{(x)dvipdfmx}. -% \begin{macrocode} -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \@@_backend_fill_cmyk:n #1 - { - \__kernel_backend_literal:n { pdf: bc ~ [#1] } - \group_insert_after:N \@@_backend_reset: - } - \cs_gset_eq:NN \@@_backend_fill_gray:n \@@_backend_fill_cmyk:n - \cs_gset_eq:NN \@@_backend_fill_rgb:n \@@_backend_fill_cmyk:n - \cs_gset_protected:Npn \@@_backend_reset: - { \__kernel_backend_literal:n { pdf: ec } } - \cs_gset_protected:Npn \@@_backend_stroke:n #1 - { \__kernel_backend_literal:n {#1} } - \cs_gset_protected:Npn \@@_backend_fill_separation:nn #1#2 { } - \cs_gset_eq:NN \@@_backend_fill_devicen:nn - \@@_backend_fill_separation:nn - \cs_gset_eq:NN \@@_backend_stroke_separation:nn - \@@_backend_fill_separation:nn - \cs_gset_eq:NN \@@_backend_stroke_devicen:nn - \@@_backend_stroke_separation:nn - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macrocode} -%</dvipdfmx|xetex> -% \end{macrocode} -% -% \begin{macrocode} %<*dvips> % \end{macrocode} % @@ -1414,6 +1309,14 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\@@_backend_devicen_init:nnn, \@@_backend_iccbased_init:nnn} +% No support at present. +% \begin{macrocode} +\cs_new_protected:Npn \@@_backend_devicen_init:nnn #1#2#3 { } +\cs_new_protected:Npn \@@_backend_iccbased_init:nnn #1#2#3 { } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</dvisvgm> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx index 43da62e3946..0f9fcb60081 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx index 37122b9a748..1bd6a7e3362 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -60,20 +60,48 @@ %<@@=graphics> % \end{macrocode} % +% \begin{macro}{\@@_backend_loaded:n} +% To deal with file load ordering. Plain users are on their own. +% \begin{macrocode} +\cs_new_protected:Npn \@@_backend_loaded:n #1 + { + \cs_if_exist:NTF \hook_gput_code:nnn + { + \hook_gput_code:nnn + { file / l3graphics.sty / after } + { backend } + {#1} + } + {#1} + } +% \end{macrocode} +% \end{macro} +% % \subsection{\texttt{dvips} backend} % % \begin{macrocode} %<*dvips> % \end{macrocode} % -% \begin{macro}{\@@_backend_getbb_eps:n} +% \begin{variable}{\l_graphics_search_ext_seq} +% \begin{macrocode} +\@@_backend_loaded:n + { \seq_set_from_clist:Nn \l_graphics_search_ext_seq { .eps , .ps } } +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_backend_getbb_eps:n, \@@_backend_getbb_ps:n} % Simply use the generic function. % \begin{macrocode} -\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n +\@@_backend_loaded:n + { + \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n + \cs_new_eq:NN \@@_backend_getbb_ps:n \@@_read_bb:n + } % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_backend_include_eps:n} +% \begin{macro}{\@@_backend_include_eps:n, \@@_backend_include_ps:n} % The special syntax is relatively clear here: remember we need PostScript % sizes here. % \begin{macrocode} @@ -82,12 +110,20 @@ \__kernel_backend_literal:x { PSfile = #1 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim } } +\cs_new_eq:NN \@@_backend_include_ps:n \@@_backend_include_eps:n +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_backend_get_pagecount:n} +% \begin{macrocode} +\@@_backend_loaded:n + { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n } % \end{macrocode} % \end{macro} % @@ -101,6 +137,17 @@ %<*luatex|pdftex> % \end{macrocode} % +% \begin{variable}{\l_graphics_search_ext_seq} +% \begin{macrocode} +\@@_backend_loaded:n + { + \seq_set_from_clist:Nn + \l_graphics_search_ext_seq + { .pdf , .eps , .png , .jpg , .jpeg } + } +% \end{macrocode} +% \end{variable} +% % \begin{variable}{\l_@@_graphics_attr_tl} % In PDF mode, additional attributes of an graphic (such as page number) are % needed both to obtain the bounding box and when inserting the graphic: this @@ -115,12 +162,18 @@ % % \begin{macro} % { -% \@@_backend_getbb_jpg:n, -% \@@_backend_getbb_pdf:n, +% \@@_backend_getbb_jpg:n , +% \@@_backend_getbb_jpeg:n , +% \@@_backend_getbb_pdf:n , % \@@_backend_getbb_png:n % } % \begin{macro} -% {\@@_backend_getbb_auxi:n, \@@_backend_getbb_auxii:n} +% { +% \@@_backend_getbb_auxi:n , +% \@@_backend_getbb_auxii:n , +% \@@_backend_getbb_auxiii:n +% } +% \begin{macro}[EXP]{\@@_backend_dequote:w} % Getting the bounding box here requires us to box up the graphic and % measure it. To deal with the difference in feature support in bitmap % and vector graphics but keeping the common parts, there is a little work @@ -130,78 +183,88 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl + \int_zero:N \l_@@_page_int + \tl_clear:N \l_@@_pagebox_tl \tl_set:Nx \l_@@_graphics_attr_tl { - \tl_if_empty:NF \l_graphics_decodearray_tl - { :D \l_graphics_decodearray_tl } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l_@@_decodearray_str + { :D \l_@@_decodearray_str } + \bool_if:NT \l_@@_interpolate_bool { :I } } \tl_clear:N \l_@@_graphics_attr_tl \@@_backend_getbb_auxi:n {#1} } +\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool + \tl_clear:N \l_@@_decodearray_str + \bool_set_false:N \l_@@_interpolate_bool \tl_set:Nx \l_@@_graphics_attr_tl { - : \l_graphics_pagebox_tl - \int_compare:nNnT \l_graphics_page_int > 1 - { :P \int_use:N \l_graphics_page_int } + : \l_@@_pagebox_tl + \int_compare:nNnT \l_@@_page_int > 1 + { :P \int_use:N \l_@@_page_int } } \@@_backend_getbb_auxi:n {#1} } \cs_new_protected:Npn \@@_backend_getbb_auxi:n #1 { - \graphics_bb_restore:xF { #1 \l_@@_graphics_attr_tl } + \@@_bb_restore:xF { #1 \l_@@_graphics_attr_tl } { \@@_backend_getbb_auxii:n {#1} } } % \end{macrocode} % Measuring the graphic is done by boxing up: for PDF graphics we could % use |\tex_pdfximagebbox:D|, but if doesn't work for other types. % As the box always starts at $(0,0)$ there is no need to worry about -% the lower-left position. +% the lower-left position. Quotes need to be \emph{removed} as \LuaTeX{} +% does not like them here. % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_auxii:n #1 { + \exp_args:Ne \@@_backend_getbb_auxiii:n + { \@@_backend_dequote:w #1 " #1 " \s_@@_stop } + \int_const:cn { c_@@_ #1 \l_@@_graphics_attr_tl _int } + { \tex_the:D \tex_pdflastximage:D } + \@@_bb_save:x { #1 \l_@@_graphics_attr_tl } + } +\cs_new_protected:Npn \@@_backend_getbb_auxiii:n #1 + { \tex_immediate:D \tex_pdfximage:D \bool_lazy_or:nnT - { \l_graphics_interpolate_bool } - { ! \tl_if_empty_p:N \l_graphics_decodearray_tl } + { \l_@@_interpolate_bool } + { ! \tl_if_empty_p:N \l_@@_decodearray_str } { attr ~ { - \tl_if_empty:NF \l_graphics_decodearray_tl - { /Decode~[ \l_graphics_decodearray_tl ] } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l_@@_decodearray_str + { /Decode~[ \l_@@_decodearray_str ] } + \bool_if:NT \l_@@_interpolate_bool { /Interpolate~true } } } - \int_compare:nNnT \l_graphics_page_int > 0 - { page ~ \int_use:N \l_graphics_page_int } - \tl_if_empty:NF \l_graphics_pagebox_tl - { \l_graphics_pagebox_tl } + \int_compare:nNnT \l_@@_page_int > 0 + { page ~ \int_use:N \l_@@_page_int } + \tl_if_empty:NF \l_@@_pagebox_tl + { \l_@@_pagebox_tl } {#1} \hbox_set:Nn \l_@@_internal_box { \tex_pdfrefximage:D \tex_pdflastximage:D } - \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l_@@_internal_box } - \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l_@@_internal_box } - \int_const:cn { c_@@_graphics_ #1 \l_@@_graphics_attr_tl _int } - { \tex_the:D \tex_pdflastximage:D } - \graphics_bb_save:x { #1 \l_@@_graphics_attr_tl } + \dim_set:Nn \l_@@_urx_dim { \box_wd:N \l_@@_internal_box } + \dim_set:Nn \l_@@_ury_dim { \box_ht:N \l_@@_internal_box } } +\cs_new:Npn \@@_backend_dequote:w #1 " #2 " #3 \s_@@_stop {#2} % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro} % { -% \@@_backend_include_jpg:n, -% \@@_backend_include_pdf:n, +% \@@_backend_include_jpg:n , +% \@@_backend_include_jpeg:n , +% \@@_backend_include_pdf:n , % \@@_backend_include_png:n % } % Images are already loaded for the measurement part of the code, so @@ -211,8 +274,9 @@ \cs_new_protected:Npn \@@_backend_include_jpg:n #1 { \tex_pdfrefximage:D - \int_use:c { c_@@_graphics_ #1 \l_@@_graphics_attr_tl _int } + \int_use:c { c_@@_ #1 \l_@@_graphics_attr_tl _int } } +\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_jpg:n \cs_new_eq:NN \@@_backend_include_pdf:n \@@_backend_include_jpg:n \cs_new_eq:NN \@@_backend_include_png:n \@@_backend_include_jpg:n % \end{macrocode} @@ -241,8 +305,12 @@ \l_@@_backend_ext_str \exp_args:Nx \@@_backend_getbb_eps:nn { - \l_@@_backend_name_str - \str_tail:N \l_@@_backend_ext_str - -converted-to.pdf + \exp_args:Ne \__kernel_file_name_quote:n + { + \l_@@_backend_name_str + - \str_tail:N \l_@@_backend_ext_str + -converted-to.pdf + } } {#1} } @@ -253,7 +321,7 @@ \sys_shell_now:n { repstopdf ~ #2 ~ #1 } } - \tl_set:Nn \l_graphics_name_tl {#1} + \tl_set:Nn \l_@@_final_name_str {#1} \@@_backend_getbb_pdf:n {#1} } \cs_new_protected:Npn \@@_backend_include_eps:n #1 @@ -262,8 +330,12 @@ \l_@@_backend_dir_str \l_@@_backend_name_str \l_@@_backend_ext_str \exp_args:Nx \@@_backend_include_pdf:n { - \l_@@_backend_name_str - \str_tail:N \l_@@_backend_ext_str - -converted-to.pdf + \exp_args:Ne \__kernel_file_name_quote:n + { + \l_@@_backend_name_str + - \str_tail:N \l_@@_backend_ext_str + -converted-to.pdf + } } } } @@ -273,6 +345,18 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\@@_backend_get_pagecount:n} +% Simply load and store. +% \begin{macrocode} +\cs_new_protected:Npn \@@_backend_get_pagecount:n #1 + { + \tex_immediate:D \tex_pdfximage:D {#1} + \int_const:cn { c_@@_ #1 _pages_int } + { \int_use:N \tex_pdflastximagepages:D } + } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</luatex|pdftex> % \end{macrocode} @@ -283,28 +367,46 @@ %<*dvipdfmx|xetex> % \end{macrocode} % +% \begin{variable}{\l_graphics_search_ext_seq} +% \begin{macrocode} +\@@_backend_loaded:n + { + \seq_set_from_clist:Nn \l_graphics_search_ext_seq + { .pdf , .eps , .ps , .png , .jpg ., jpeg , .bmp } + } +% \end{macrocode} +% \end{variable} +% % \begin{macro} % { -% \@@_backend_getbb_eps:n, \@@_backend_getbb_jpg:n, -% \@@_backend_getbb_pdf:n, \@@_backend_getbb_png:n +% \@@_backend_getbb_eps:n , +% \@@_backend_getbb_jpg:n , \@@_backend_getbb_jpeg:n , +% \@@_backend_getbb_pdf:n , \@@_backend_getbb_png:n , +% \@@_backend_getbb_bmp:n % } % Simply use the generic functions: only for \texttt{dvipdfmx} in the % extraction cases. % \begin{macrocode} -\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n +\@@_backend_loaded:n + { + \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n + \cs_new_eq:NN \@@_backend_getbb_ps:n \@@_read_bb:n + } %<*dvipdfmx> \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl - \graphics_extract_bb:n {#1} + \int_zero:N \l_@@_page_int + \tl_clear:N \l_@@_pagebox_tl + \@@_extract_bb:n {#1} } +\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n +\cs_new_eq:NN \@@_backend_getbb_bmp:n \@@_backend_getbb_jpg:n \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool - \graphics_extract_bb:n {#1} + \tl_clear:N \l_@@_decodearray_str + \bool_set_false:N \l_@@_interpolate_bool + \@@_extract_bb:n {#1} } %</dvipdfmx> % \end{macrocode} @@ -319,8 +421,10 @@ % % \begin{macro} % { -% \@@_backend_include_eps:n, \@@_backend_include_jpg:n, -% \@@_backend_include_pdf:n, \@@_backend_include_png:n +% \@@_backend_include_eps:n , \@@_backend_include_ps:n , +% \@@_backend_include_jpg:n , \@@_backend_include_jpseg:n , +% \@@_backend_include_pdf:n , \@@_backend_include_png:n , +% \@@_backend_include_bmp:n , % } % \begin{macro}{\@@_backend_include_auxi:nn} % \begin{macro}{\@@_backend_include_auxii:nnn, \@@_backend_include_auxii:xnn} @@ -335,15 +439,18 @@ \__kernel_backend_literal:x { PSfile = #1 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim } } +\cs_new_eq:NN \@@_backend_include_ps:n \@@_backend_include_eps:n \cs_new_protected:Npn \@@_backend_include_jpg:n #1 { \@@_backend_include_auxi:nn {#1} { image } } +\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_jpg:n \cs_new_eq:NN \@@_backend_include_png:n \@@_backend_include_jpg:n +\cs_new_eq:NN \@@_backend_include_bmp:n \@@_backend_include_jpg:n %<*dvipdfmx> \cs_new_protected:Npn \@@_backend_include_pdf:n #1 { \@@_backend_include_auxi:nn {#1} { epdf } } @@ -358,23 +465,23 @@ { \@@_backend_include_auxii:xnn { - \tl_if_empty:NF \l_graphics_pagebox_tl - { : \l_graphics_pagebox_tl } - \int_compare:nNnT \l_graphics_page_int > 1 - { :P \int_use:N \l_graphics_page_int } - \tl_if_empty:NF \l_graphics_decodearray_tl - { :D \l_graphics_decodearray_tl } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l_@@_pagebox_tl + { : \l_@@_pagebox_tl } + \int_compare:nNnT \l_@@_page_int > 1 + { :P \int_use:N \l_@@_page_int } + \tl_if_empty:NF \l_@@_decodearray_str + { :D \l_@@_decodearray_str } + \bool_if:NT \l_@@_interpolate_bool { :I } } {#1} {#2} } \cs_new_protected:Npn \@@_backend_include_auxii:nnn #1#2#3 { - \int_if_exist:cTF { c_@@_graphics_ #2#1 _int } + \int_if_exist:cTF { c_@@_ #2#1 _int } { \__kernel_backend_literal:x - { pdf:usexobj~@graphic \int_use:c { c_@@_graphics_ #2#1 _int } } + { pdf:usexobj~@graphic \int_use:c { c_@@_ #2#1 _int } } } { \@@_backend_include_auxiii:nnn {#2} {#1} {#3} } } @@ -388,31 +495,31 @@ \cs_new_protected:Npn \@@_backend_include_auxiii:nnn #1#2#3 { \int_gincr:N \g_@@_track_int - \int_const:cn { c_@@_graphics_ #1#2 _int } { \g_@@_track_int } + \int_const:cn { c_@@_ #1#2 _int } { \g_@@_track_int } \__kernel_backend_literal:x { pdf:#3~ - @graphic \int_use:c { c_@@_graphics_ #1#2 _int } ~ - \int_compare:nNnT \l_graphics_page_int > 1 - { page ~ \int_use:N \l_graphics_page_int \c_space_tl } - \tl_if_empty:NF \l_graphics_pagebox_tl + @graphic \int_use:c { c_@@_ #1#2 _int } ~ + \int_compare:nNnT \l_@@_page_int > 1 + { page ~ \int_use:N \l_@@_page_int \c_space_tl } + \tl_if_empty:NF \l_@@_pagebox_tl { - pagebox ~ \l_graphics_pagebox_tl \c_space_tl + pagebox ~ \l_@@_pagebox_tl \c_space_tl bbox ~ - \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_ury_dim \c_space_tl + \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl + \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl + \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl + \dim_to_decimal_in_bp:n \l_@@_ury_dim \c_space_tl } (#1) \bool_lazy_or:nnT - { \l_graphics_interpolate_bool } - { ! \tl_if_empty_p:N \l_graphics_decodearray_tl } + { \l_@@_interpolate_bool } + { ! \tl_if_empty_p:N \l_@@_decodearray_str } { << - \tl_if_empty:NF \l_graphics_decodearray_tl - { /Decode~[ \l_graphics_decodearray_tl ] } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l_@@_decodearray_str + { /Decode~[ \l_@@_decodearray_str ] } + \bool_if:NT \l_@@_interpolate_bool { /Interpolate~true> } >> } @@ -424,6 +531,15 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\@@_backend_get_pagecount:n} +% \begin{macrocode} +%<*dvipdfmx> +\@@_backend_loaded:n + { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n } +%</dvipdfmx> +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</dvipdfmx|xetex> % \end{macrocode} @@ -434,13 +550,13 @@ %<*xetex> % \end{macrocode} % -% \subsubsection{Images} -% % \begin{macro} % { -% \@@_backend_getbb_jpg:n, -% \@@_backend_getbb_pdf:n, -% \@@_backend_getbb_png:n +% \@@_backend_getbb_jpg:n , +% \@@_backend_getbb_jpeg:n , +% \@@_backend_getbb_pdf:n , +% \@@_backend_getbb_png:n , +% \@@_backend_getbb_bmp:n % } % \begin{macro}{\@@_backend_getbb_auxi:nN} % \begin{macro}{\@@_backend_getbb_auxii:nnN, \@@_backend_getbb_auxii:VnN} @@ -456,21 +572,23 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl + \int_zero:N \l_@@_page_int + \tl_clear:N \l_@@_pagebox_tl \@@_backend_getbb_auxi:nN {#1} \tex_XeTeXpicfile:D } +\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n +\cs_new_eq:NN \@@_backend_getbb_bmp:n \@@_backend_getbb_jpg:n \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool + \tl_clear:N \l_@@_decodearray_str + \bool_set_false:N \l_@@_interpolate_bool \@@_backend_getbb_auxi:nN {#1} \tex_XeTeXpdffile:D } \cs_new_protected:Npn \@@_backend_getbb_auxi:nN #1#2 { - \int_compare:nNnTF \l_graphics_page_int > 1 - { \@@_backend_getbb_auxii:VnN \l_graphics_page_int {#1} #2 } + \int_compare:nNnTF \l_@@_page_int > 1 + { \@@_backend_getbb_auxii:VnN \l_@@_page_int {#1} #2 } { \@@_backend_getbb_auxiii:nNnn {#1} #2 { :P 1 } { page 1 } } } \cs_new_protected:Npn \@@_backend_getbb_auxii:nnN #1#2#3 @@ -478,8 +596,8 @@ \cs_generate_variant:Nn \@@_backend_getbb_auxii:nnN { V } \cs_new_protected:Npn \@@_backend_getbb_auxiii:nNnn #1#2#3#4 { - \tl_if_empty:NTF \l_graphics_pagebox_tl - { \@@_backend_getbb_auxiv:VnNnn \l_graphics_pagebox_tl } + \tl_if_empty:NTF \l_@@_pagebox_tl + { \@@_backend_getbb_auxiv:VnNnn \l_@@_pagebox_tl } { \@@_backend_getbb_auxv:nNnn } {#1} #2 {#3} {#4} } @@ -488,21 +606,25 @@ \use:x { \@@_backend_getbb_auxv:nNnn {#2} #3 { : #1 #4 } - { #5 ~ \@@_backend_getbb_pagebox:w #1 } + { + #5 + \tl_if_blank:nF {#1} + { \c_space_tl \@@_backend_getbb_pagebox:w #1 } + } } } \cs_generate_variant:Nn \@@_backend_getbb_auxiv:nnNnn { V } \cs_new_protected:Npn \@@_backend_getbb_auxv:nNnn #1#2#3#4 { - \graphics_bb_restore:nF {#1#3} + \@@_bb_restore:nF {#1#3} { \@@_backend_getbb_auxvi:nNnn {#1} #2 {#3} {#4} } } \cs_new_protected:Npn \@@_backend_getbb_auxvi:nNnn #1#2#3#4 { \hbox_set:Nn \l_@@_internal_box { #2 #1 ~ #4 } - \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l_@@_internal_box } - \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l_@@_internal_box } - \graphics_bb_save:n {#1#3} + \dim_set:Nn \l_@@_urx_dim { \box_wd:N \l_@@_internal_box } + \dim_set:Nn \l_@@_ury_dim { \box_ht:N \l_@@_internal_box } + \@@_bb_save:n {#1#3} } \cs_new:Npn \@@_backend_getbb_pagebox:w #1 box {#1} % \end{macrocode} @@ -515,7 +637,6 @@ % \end{macro} % % \begin{macro}{\@@_backend_include_pdf:n} -% \begin{macro}{\@@_backend_include_bitmap_quote:w} % For PDF graphics, properly supporting the |pagebox| concept in \XeTeX{} % is best done using the |\tex_XeTeXpdffile:D| primitive. The syntax here % is the same as for the graphic measurement part, although we know at this @@ -523,16 +644,27 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_backend_include_pdf:n #1 { - \tex_XeTeXpdffile:D - \@@_backend_include_pdf_quote:w #1 "#1" \s_@@_stop \c_space_tl - \int_compare:nNnT \l_graphics_page_int > 0 - { page ~ \int_use:N \l_graphics_page_int \c_space_tl } - \exp_after:wN \@@_backend_getbb_pagebox:w \l_graphics_pagebox_tl + \tex_XeTeXpdffile:D #1 ~ + \int_compare:nNnT \l_@@_page_int > 0 + { page ~ \int_use:N \l_@@_page_int \c_space_tl } + \exp_after:wN \@@_backend_getbb_pagebox:w \l_@@_pagebox_tl } -\cs_new:Npn \@@_backend_include_pdf_quote:w #1 " #2 " #3 \s_@@_stop - { " #2 " } % \end{macrocode} % \end{macro} +% +% \begin{macro}{\@@_backend_get_pagecount:n} +% Very little to do here other than cover the case of a non-PDF file. +% \begin{macrocode} +\cs_new_protected:Npn \@@_backend_get_pagecount:n #1 + { + \int_const:cn { c_@@_ #1 _pages_int } + { + \int_max:nn + { \int_use:N \tex_XeTeXpdfpagecount:D #1 ~ } + { 1 } + } + } +% \end{macrocode} % \end{macro} % % \begin{macrocode} @@ -545,22 +677,35 @@ %<*dvisvgm> % \end{macrocode} % +% \begin{variable}{\l_graphics_search_ext_seq} +% \begin{macrocode} +\@@_backend_loaded:n + { + \seq_set_from_clist:Nn + \l_graphics_search_ext_seq + { .pdf , .eps , .png , .jpg , .jpeg } + } +% \end{macrocode} +% \end{variable} +% % \begin{macro}{\@@_backend_getbb_eps:n} % Simply use the generic function. % \begin{macrocode} -\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n +\@@_backend_loaded:n + { \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n } % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n} +% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n, \@@_backend_getbb_jpeg:n} % These can be included by extracting the bounding box data. % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl - \graphics_extract_bb:n {#1} + \int_zero:N \l_@@_page_int + \tl_clear:N \l_@@_pagebox_tl + \@@_extract_bb:n {#1} } +\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n % \end{macrocode} % \end{macro} @@ -570,9 +715,9 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool - \graphics_extract_bb:n {#1} + \tl_clear:N \l_@@_decodearray_str + \bool_set_false:N \l_@@_interpolate_bool + \@@_extract_bb:n {#1} } % \end{macrocode} % \end{macro} @@ -583,25 +728,30 @@ % sizes here. (This is the same as the \texttt{dvips} code.) % \begin{macrocode} \cs_new_protected:Npn \@@_backend_include_eps:n #1 - { @@_backend_include:nn { PSfile } {#1} } + { \@@_backend_include:nn { PSfile } {#1} } \cs_new_protected:Npn \@@_backend_include_pdf:n #1 - { @@_backend_include:nn { pdffile } {#1} } + { \@@_backend_include:nn { pdffile } {#1} } \cs_new_protected:Npn \@@_backend_include:nn #1#2 { \__kernel_backend_literal:x { #1 = #2 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim } } % \end{macrocode} % \end{macro} % \end{macro} % -% \begin{macro}{\@@_backend_include_png:n, \@@_backend_include_jpg:n} +% \begin{macro} +% { +% \@@_backend_include_png:n , +% \@@_backend_include_jpg:n , +% \@@_backend_include_jpeg:n +% } % \begin{macro}{\@@_backend_include_bitmap_quote:w} % The backend here has built-in support for basic graphic inclusion (see % \texttt{dvisvgm.def} for a more complex approach, needed if clipping, @@ -615,11 +765,12 @@ \__kernel_backend_literal:x { dvisvgm:img~ - \dim_to_decimal:n { \l_graphics_ury_dim } ~ - \dim_to_decimal:n { \l_graphics_ury_dim } ~ + \dim_to_decimal:n { \l_@@_ury_dim } ~ + \dim_to_decimal:n { \l_@@_ury_dim } ~ \@@_backend_include_bitmap_quote:w #1 " #1 " \s_@@_stop } } +\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_png:n \cs_new_eq:NN \@@_backend_include_jpg:n \@@_backend_include_png:n \cs_new:Npn \@@_backend_include_bitmap_quote:w #1 " #2 " #3 \s_@@_stop { " #2 " } @@ -627,6 +778,13 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\@@_backend_get_pagecount:n} +% \begin{macrocode} +\@@_backend_loaded:n + { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</dvisvgm> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx index fe05e977608..5eacda7b9fe 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx index a38736bc5a1..89d60de0df4 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -239,49 +239,6 @@ % \end{macrocode} % % \begin{macrocode} -%<*dvipdfmx|xdvipdfmx> -% \end{macrocode} -% -% \begin{macro}{\@@_backend_select:n} -% Older backends have no stack support, so everything is done directly. -% \begin{macrocode} -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \@@_backend_select_aux:n #1 - { - \tl_set:Nn \l_@@_backend_fill_tl {#1} - \tl_set:Nn \l_@@_backend_stroke_tl {#1} - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity #1 } - { << /ca ~ #1 /CA ~ #1 >> } - \__kernel_backend_literal_pdf:n { /opacity #1 ~ gs } - } - \cs_gset_protected:Npn \@@_backend_fill_stroke:nn #1#2 - { - \str_if_eq:nnTF {#1} {#2} - { \@@_backend_select_aux:n {#1} } - { - \tl_set:Nn \l_@@_backend_fill_tl {#1} - \tl_set:Nn \l_@@_backend_stroke_tl {#2} - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity.fill #1 } - { << /ca ~ #1 >> } - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity.stroke #1 } - { << /CA ~ #2 >> } - \__kernel_backend_literal_pdf:n - { /opacity.fill #1 ~ gs /opacity.stroke #2 ~ gs } - } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -%</dvipdfmx|xdvipdfmx> -% \end{macrocode} -% -% \begin{macrocode} %<*dvisvgm> % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx index 7b642b1a46b..03435b24544 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-07} +% \date{Released 2022-04-10} % % \maketitle % @@ -1421,19 +1421,13 @@ { \@@_backend_link_begin:n {#1#2} } \cs_new_protected:Npx \@@_backend_link_begin:n #1 { - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \exp_not:N \int_gincr:N \exp_not:N \g_@@_backend_link_int - } + \exp_not:N \int_gincr:N \exp_not:N \g_@@_backend_link_int \@@_backend:x { bann ~ - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - @pdf.lnk - \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int - \c_space_tl - } + @pdf.lnk + \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int + \c_space_tl << /Type /Annot #1 @@ -1451,14 +1445,8 @@ % Available using the backend mechanism with a suitably-recent % version. % \begin{macrocode} -\cs_new:Npx \@@_backend_link_last: - { - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - @pdf.lnk - \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int - } - } +\cs_new:Npn \@@_backend_link_last: + { @pdf.lnk \int_use:N \g_@@_backend_link_int } % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx index e5d50ecf588..0eb34e5c0c7 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -122,7 +122,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3benchmark}{2022-02-05}{} +\ProvidesExplPackage{l3benchmark}{2022-04-10}{} {L3 Experimental benchmarking} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx b/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx index 7eba4d03152..3443ca7d25b 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % \begin{documentation} @@ -264,7 +264,7 @@ %<@@=bitset> % \end{macrocode} % \begin{macrocode} -\ProvidesExplPackage{l3bitset}{2022-02-05}{} +\ProvidesExplPackage{l3bitset}{2022-04-10}{} {L3 Experimental bitset support} % \end{macrocode} % A bitset is a string variable. diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx index 40e6f265aed..926ff3387ea 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx index d1612409883..e82e7a1e2a9 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx index 0c78addf925..024faef3247 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx index 379dc45e4a2..fe3c28351ea 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx index 339e7dde97e..2fcc7e8ac0f 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx index 04a05acc571..53dfd48728f 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx index bda3a14ace6..b93f593a7e8 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx index 6e60b8bddfe..bdc96e0c88d 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx index a309d0ffb7b..31ac35f0425 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx @@ -110,7 +110,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -1173,7 +1173,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3draw}{2022-02-05}{} +\ProvidesExplPackage{l3draw}{2022-04-10}{} {L3 Experimental core drawing support} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx index 8b97a562ed3..cf4a70983d2 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -54,140 +54,60 @@ % % \section{\pkg{l3graphics} documentation} % -% \subsection{Driver functions} +% \subsection{Graphics keys} % % Inclusion of graphic files requires a range of low-level data be passed to -% the driver layer. These functions are primarily aimed at supporting this -% work. +% the backend. This is set up using a small number of key--value settings, +% which are stored in the |graphics| tree. % -% \begin{variable}{\l_graphics_decodearray_tl} +% \begin{variable}{decodearray} % Array to decode color in bitmap graphic: when non-empty, this should % be in the form of one, two or three pairs of real numbers in the range % $[0,1]$, separated by spaces. % \end{variable} % -% \begin{variable}{\l_graphics_interpolate_bool} -% Indicates whether interpolation should be applied to bitmap graphic files. +% \begin{variable}{draft} +% Switch to enable draft mode: graphics are read but not included when this is +% true. +% \end{variable} +% +% \begin{variable}{interpolate} +% Switch which indicates whether interpolation should be applied to bitmap +% graphic files. % \end{variable} % -% \begin{variable}{\l_graphics_page_int} +% \begin{variable}{page} % The page to extract from a multi-page graphic file: used for |.pdf| files % which may contain multiple pages. % \end{variable} % -% \begin{variable}{\l_graphics_pagebox_tl} +% \begin{variable}{pagebox} % The nature of the page box setting used to determine the bounding box of % material: used for |.pdf| files which feature multiple page box -% specifications. +% specifications. A choice from |art|, |bleed|, |crop|, |media|, |trim|. +% The standard setting is |crop|. % \end{variable} % -% \begin{variable}{\l_graphics_draft_bool} +% \begin{variable}{draft} % Switch to enable draft mode: graphics are read but not included when this is % true. % \end{variable} % -% \begin{variable} -% {\l_graphics_llx_dim, \l_graphics_lly_dim, \l_graphics_urx_dim, \l_graphics_ury_dim} -% Dimensions which return the points $(\meta{llx},\meta{lly})$ and -% $(\meta{urx},\meta{ury})$ for the graphic. For many graphics only the resulting -% height and width are significant, but this is driver-dependent. -% \end{variable} -% -% \begin{variable}{\l_graphics_name_bool} -% The name of a graphics file being loaded: usually the same as the -% input file name, but may be altered by some drivers. +% \begin{variable}{type} +% The type of graphic file beign included: if this key is not set, the +% \emph{type} is determined from the file extension. % \end{variable} % -% \begin{function} -% { -% \graphics_bb_save:n, \graphics_bb_save:x, -% \graphics_bb_restore:nF, \graphics_bb_restore:xF -% } -% \begin{syntax} -% \cs{graphics_bb_save:n} \Arg{graphic} -% \cs{graphics_bb_restore:nF} \Arg{graphic} \Arg{false code} -% \end{syntax} -% This pair of functions are used to cache the bounding box of an \meta{graphic} -% so that extraction/reading is only required once. The \texttt{save} -% function stores the values from \cs{l_graphics_llx_dim}, -% \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and -% \cs{l_graphics_ury_dim} as constants. The \texttt{restore} function will then -% look up values for the bounding box of an \meta{graphic} and set the four -% dimensions appropriately. For any one \meta{graphic} the bounding box will -% be constant, so the \texttt{save} function should only be called once. Thus -% a typical use case is -% \begin{verbatim} -% \graphics_bb_restore:nF { <name> } -% { -% % Code to read the bb -% \graphics_bb_save:n { <name> } -% } -% \end{verbatim} -% \emph{i.e.}~every use of a bounding box will attempt to restore saved data, -% and saving will only take place where that is not possible. -% -% Note that the \meta{graphic} may not be a simple file name: a multi-page PDF, -% for example, will need to have the bounding box cached for each page used. -% \end{function} +% \subsection{Including graphics} % -% \begin{function}{\graphics_extract_bb:n} +% \begin{function}{\graphics_include:nn, \graphics_include:nV} % \begin{syntax} -% \cs{graphics_extract_bb:n} \Arg{file} +% \cs{graphics_include:nn} \Arg{keys} \Arg{file} % \end{syntax} -% Extracts bounding box data for the graphic \meta{file} using the |extractbb| -% utility, and stores the bounding box of the graphic file in -% \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and -% \cs{l_graphics_ury_dim}. -% -% The \meta{file} name should be fully-qualified and sanitized: no search -% or other manipulation is carried out at this level. No check is made on -% the file \emph{type} at this stage: it is assumed that the driver code -% using this function has made such a check. File types such as |.pdf| and -% |.jpg| are appropriate for parsing using this function. -% -% When \cs{l_graphics_page_int} is positive the appropriate page will be -% queried from the graphic file. -% -% Note that this function requires pipe shell calls to be enabled: this is -% generally true but may require the option |--enable-pipes| to be enabled -% when running the \TeX{} job. -% \end{function} -% -% \begin{function}{\graphics_read_bb:n} -% \begin{syntax} -% \cs{graphics_read_bb:n} \Arg{file} -% \end{syntax} -% Parses the graphic \meta{file} to find a PostScript-style bounding box -% line of the form -% \begin{verbatim} -% %%BoundingBox: llx lly urx urx -% \end{verbatim} -% where \meta{llx}, \meta{lly}, \meta{urx} and \meta{ury} are the corners -% of the bounding box expressed in PostScript (\enquote{big}) points. The -% values are stored in \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim}, -% \cs{l_graphics_urx_dim} and \cs{l_graphics_ury_dim}. -% -% The \meta{file} name should be fully-qualified and sanitized: no search -% or other manipulation is carried out at this level. No check is made on -% the file \emph{type} at this stage: it is assumed that the driver code -% using this function has made such a check. File types such as |.eps| and -% |.bb|/|.xbb| are appropriate for parsing using this function. -% \end{function} -% -% \begin{function}{\graphics_include:n, \graphics_include:nn} -% \begin{syntax} -% \cs{graphics_include:n} \Arg{file} -% \cs{graphics_include:nn} \Arg{file} \Arg{type} -% \end{syntax} -% Horizontal-mode commands which include the \meta{file} as an graphic -% at the current location. The file \meta{type} is given explicitly in -% the two-argument version, or is inferred from the file extension extracted -% in the single-argument form. The exact graphic types supported depend upon -% the driver in use. -% -% Where the \meta{file} is not found and the \meta{type} is \emph{not} -% given, a search for possible graphic files is undertaken using the extensions -% stored in \cs{l_graphics_search_ext_seq}. +% Horizontal-mode command which includes the \meta{file} as an graphic +% at the current location. The file \meta{type} may be given as one of the +% \meta{keys}, or will otherwise be determined from file extension. The +% \meta{keys} is used to pass settings as detailed above. % \end{function} % % \begin{variable}{\l_graphics_ext_type_prop} @@ -200,11 +120,6 @@ % \end{verbatim} % \end{variable} % -% \begin{variable}{\l_graphics_search_ext_seq} -% Extensions to use for graphic searching when the given \meta{file} name is not -% found by \cs{graphics_include:n}. -% \end{variable} -% % \begin{variable}{\l_graphics_search_path_seq} % Each entry is the path to a directory which should be searched when % seeking an graphic file. Each path can be relative or absolute, and should @@ -213,6 +128,36 @@ % variable content. Spaces need not be quoted. % \end{variable} % +% \subsection{Utility functions} +% +% \begin{function}[noTF]{\graphics_get_full_name:nN} +% \begin{syntax} +% \cs{graphics_get_full_name:nN} \Arg{file} \meta{tl~var} +% \cs{graphics_get_full_name:nNTF} \Arg{file} \meta{tl~var} \Arg{true code} \Arg{false code} +% \end{syntax} +% Searches for \meta{file} first as given and then using the extensions +% listed in \cs{l_graphics_search_ext_seq}. The search path used will be +% the entries of \cs{l_graphics_search_path_seq}. If found, the full file +% name including any path and extension will be returned in the +% \meta{tl~var}. In the non-branching version, the \meta{tl var} will be +% set to \cs{q_no_value} in the case that the graphics is not found. +% \end{function} +% +% \begin{variable}{\l_graphics_search_ext_seq} +% Extensions to use for graphic searching when the given \meta{file} name is not +% found by \cs{graphics_get_full_name:nN}. +% \end{variable} +% +% \begin{function}{\graphics_get_pagecount:nN} +% \begin{syntax} +% \cs{graphics_get_pagecount:nn} \Arg{file} \meta{tl~var} +% \end{syntax} +% Reads the graphics \meta{file} and extracts the number of pages, which +% are stored in the \meta{tl~var}. +% \end{function} +% +% \subsection{Showing and logging included graphics} +% % \begin{function}{\graphics_show_list:, \graphics_log_list:} % \begin{syntax} % \cs{graphics_show_list:} @@ -240,15 +185,15 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3graphics}{2022-02-05}{} +\ProvidesExplPackage{l3graphics}{2022-04-10}{} {L3 Experimental graphics inclusion support} % \end{macrocode} % -% \begin{variable}{\l_@@_tmp_ior, \l_@@_tmp_tl} +% \begin{variable}{\l_@@_internal_ior, \l_@@_internal_tl} % Scratch space. % \begin{macrocode} -\ior_new:N \l_@@_tmp_ior -\tl_new:N \l_@@_tmp_tl +\ior_new:N \l_@@_internal_ior +\tl_new:N \l_@@_internal_tl % \end{macrocode} % \end{variable} % @@ -259,24 +204,47 @@ % \end{macrocode} % \end{variable} % -% \subsection{Image feature support} +% \subsection{Graphics keys} % % \begin{macro} % { -% \l_graphics_decodearray_tl , -% \l_graphics_interpolate_bool, -% \l_graphics_page_int , -% \l_graphics_pagebox_tl +% \l_@@_decodearray_str , +% \l__@@_draft_bool , +% \l_@@_interpolate_bool , +% \l_@@_page_int , +% \l_@@_pagebox_tl , +% \l_@@_type_str % } % Keys which control features of graphics. The standard value of |pagebox| -% set up here should match the default for the drivers themselves: in -% the absence of any other setting the |cropbox| should be used. +% set up here should match the default for the backends themselves: in +% the absence of any other setting the |crop| should be used. Note that +% the variable \cs{l_@@_pagebox_str} can be empty internally, as backends +% which do not support |pagebox| are set up to clear it entirely. The +% store for |pagebox| is a |tl| as that makes extracting the data +% easier for some backends. % \begin{macrocode} -\tl_new:N \l_graphics_decodearray_tl -\tl_new:N \l_graphics_pagebox_tl -\bool_new:N \l_graphics_interpolate_bool -\tl_set:Nn \l_graphics_pagebox_tl { cropbox } -\int_new:N \l_graphics_page_int +\tl_new:N \l_@@_pagebox_tl +\keys_define:nn { graphics } + { + decodearray .str_set:N = + \l_@@_decodearray_str , + draft .bool_set:N = + \l_@@_draft_bool , + interpolate .bool_set:N = + \l_@@_interpolate_bool , + pagebox .choices:nn = + { art , bleed , crop , media , trim } + { + \tl_set:Nx \l_@@_pagebox_tl + { \tl_use:N \l_keys_choice_tl box } + } , + pagebox .initial:n = + crop , + page .int_set:N = + \l_@@_page_int , + type . str_set:N = + \l_@@_type_str + } % \end{macrocode} % \end{macro} % @@ -284,60 +252,60 @@ % % \begin{variable} % { -% \l_graphics_llx_dim , \l_graphics_lly_dim, -% \l_graphics_urx_dim , \l_graphics_ury_dim +% \l_@@_llx_dim , \l_@@_lly_dim, +% \l_@@_urx_dim , \l_@@_ury_dim % } % Storage for the return of bounding box. % \begin{macrocode} -\dim_new:N \l_graphics_llx_dim -\dim_new:N \l_graphics_lly_dim -\dim_new:N \l_graphics_urx_dim -\dim_new:N \l_graphics_ury_dim +\dim_new:N \l_@@_llx_dim +\dim_new:N \l_@@_lly_dim +\dim_new:N \l_@@_urx_dim +\dim_new:N \l_@@_ury_dim % \end{macrocode} % \end{variable} % -% \begin{macro}{\graphics_bb_save:n, \graphics_bb_save:x} -% \begin{macro}{\graphics_bb_restore:nF, \graphics_bb_restore:xF} +% \begin{macro}{\@@_bb_save:n, \@@_bb_save:x} +% \begin{macro}{\@@_bb_restore:nF, \@@_bb_restore:xF} % Caching graphic bounding boxes is sensible, and these functions are needed both % here and for drive-specific work. So they are made available as documented % functions. To save on registers, the \enquote{origin} is only saved if it is % not at zero. % \begin{macrocode} -\cs_new_protected:Npn \graphics_bb_save:n #1 +\cs_new_protected:Npn \@@_bb_save:n #1 { \dim_if_exist:cTF { c_@@_ #1 _urx_dim } { \msg_error:nnn { graphic } { bb-already-cached } {#1} } { - \dim_compare:nNnF \l_graphics_llx_dim = { 0pt } - { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_graphics_llx_dim } } - \dim_compare:nNnF \l_graphics_lly_dim = { 0pt } - { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_graphics_lly_dim } } - \dim_const:cn { c_@@_ #1 _urx_dim } { \l_graphics_urx_dim } - \dim_const:cn { c_@@_ #1 _ury_dim } { \l_graphics_ury_dim } + \dim_compare:nNnF \l_@@_llx_dim = { 0pt } + { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_@@_llx_dim } } + \dim_compare:nNnF \l_@@_lly_dim = { 0pt } + { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_@@_lly_dim } } + \dim_const:cn { c_@@_ #1 _urx_dim } { \l_@@_urx_dim } + \dim_const:cn { c_@@_ #1 _ury_dim } { \l_@@_ury_dim } } } -\cs_generate_variant:Nn \graphics_bb_save:n { x } -\cs_new_protected:Npn \graphics_bb_restore:nF #1#2 +\cs_generate_variant:Nn \@@_bb_save:n { x } +\cs_new_protected:Npn \@@_bb_restore:nF #1#2 { \dim_if_exist:cTF { c_@@_ #1 _urx_dim } { - \dim_set_eq:Nc \l_graphics_urx_dim { c_@@_ #1 _urx_dim } - \dim_set_eq:Nc \l_graphics_ury_dim { c_@@_ #1 _ury_dim } + \dim_set_eq:Nc \l_@@_urx_dim { c_@@_ #1 _urx_dim } + \dim_set_eq:Nc \l_@@_ury_dim { c_@@_ #1 _ury_dim } \dim_if_exist:cTF { c_@@_ #1 _llx_dim } - { \dim_set_eq:Nc \l_graphics_llx_dim { c_@@_ #1 _llx_dim } } - { \dim_zero:N \l_graphics_llx_dim } + { \dim_set_eq:Nc \l_@@_llx_dim { c_@@_ #1 _llx_dim } } + { \dim_zero:N \l_@@_llx_dim } \dim_if_exist:cTF { c_@@_ #1 _lly_dim } - { \dim_set_eq:Nc \l_graphics_lly_dim { c_@@_ #1 _lly_dim } } - { \dim_zero:N \l_graphics_lly_dim } + { \dim_set_eq:Nc \l_@@_lly_dim { c_@@_ #1 _lly_dim } } + { \dim_zero:N \l_@@_lly_dim } } {#2} } -\cs_generate_variant:Nn \graphics_bb_restore:nF { x } +\cs_generate_variant:Nn \@@_bb_restore:nF { x } % \end{macrocode} % \end{macro} % \end{macro} % -% \begin{macro}{\graphics_extract_bb:n, \graphics_read_bb:n} +% \begin{macro}{\@@_extract_bb:n, \@@_read_bb:n} % \begin{macro}{\@@_extract_bb_auix:nn, \@@_extract_bb_auix:Vn} % \begin{macro}{\@@_extract_bb_auxii:nnn} % \begin{macro}{\@@_extract_bb_auxiii:nnnn, \@@_extract_bb_auxiii:Vnnn} @@ -357,10 +325,10 @@ % box has to be calculated by |extractbb|, with just the initial phase % different. % \begin{macrocode} -\cs_new_protected:Npn \graphics_extract_bb:n #1 +\cs_new_protected:Npn \@@_extract_bb:n #1 { - \int_compare:nNnTF \l_graphics_page_int > 0 - { \@@_extract_bb_auxi:Vn \l_graphics_page_int {#1} } + \int_compare:nNnTF \l_@@_page_int > 0 + { \@@_extract_bb_auxi:Vn \l_@@_page_int {#1} } { \@@_extract_bb_auxii:nnn {#1} { } { } } } \cs_new_protected:Npn \@@_extract_bb_auxi:nn #1#2 @@ -368,9 +336,9 @@ \cs_generate_variant:Nn \@@_extract_bb_auxi:nn { Vn } \cs_new_protected:Npn \@@_extract_bb_auxii:nnn #1#2#3 { - \tl_if_empty:NTF \l_graphics_pagebox_tl + \tl_if_empty:NTF \l_@@_pagebox_tl { \@@_extract_bb_auxiv:nnn } - { \@@_extract_bb_auxiii:Vnnn \l_graphics_pagebox_tl } + { \@@_extract_bb_auxiii:Vnnn \l_@@_pagebox_tl } {#1} {#2} {#3} } \cs_new_protected:Npn \@@_extract_bb_auxiii:nnnn #1#2#3#4 @@ -379,13 +347,13 @@ \cs_new_protected:Npn \@@_extract_bb_auxiv:nnn #1#2#3 { \@@_read_bb_auxi:nnnn {#1} {#2} - { \ior_shell_open:Nn \l_@@_tmp_ior { extractbb~#3-O~#1 } } + { \ior_shell_open:Nn \l_@@_internal_ior { extractbb~#3-O~#1 } } { pipe-failed } } -\cs_new_protected:Npn \graphics_read_bb:n #1 +\cs_new_protected:Npn \@@_read_bb:n #1 { \@@_read_bb_auxi:nnnn {#1} { } - { \ior_open:Nn \l_@@_tmp_ior {#1} } + { \ior_open:Nn \l_@@_internal_ior {#1} } { graphic-not-found } } % \end{macrocode} @@ -401,31 +369,23 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_read_bb_auxi:nnnn #1#2#3#4 { - \graphics_bb_restore:nF {#1#2} + \@@_bb_restore:nF {#1#2} { \@@_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} } } \cs_new_protected:Npx \@@_read_bb_auxii:nnnn #1#2#3#4 { #1 - \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_tmp_ior + \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_internal_ior { \msg_error:nnn { graphics } {#2} {#3} } { - \ior_str_map_inline:Nn \exp_not:N \l_@@_tmp_ior + \ior_str_map_inline:Nn \exp_not:N \l_@@_internal_ior { \exp_not:N \@@_read_bb_auxiii:w ##1 ~ \c_colon_str \s_@@_stop } + \@@_bb_save:n {#3#4} } - \exp_not:n - { - \ior_close:N \l_@@_tmp_ior - \dim_compare:nNnF \l_graphics_llx_dim = { 0pt } - { \dim_const:cn { c_@@_ #3#4 _llx_dim } { \l_graphics_llx_dim } } - \dim_compare:nNnF \l_graphics_lly_dim = { 0pt } - { \dim_const:cn { c_@@_ #3#4 _lly_dim } { \l_graphics_lly_dim } } - \dim_const:cn { c_@@_ #3#4 _urx_dim } { \l_graphics_urx_dim } - \dim_const:cn { c_@@_ #3#4 _ury_dim } { \l_graphics_ury_dim } - } + \ior_close:N \exp_not:N \l_@@_internal_ior } \use:x { @@ -450,13 +410,13 @@ { \str_if_eq:nnF {#2} { atend } { - \tl_set_rescan:Nnx \l_@@_tmp_tl + \tl_set_rescan:Nnx \l_@@_internal_tl { \char_set_catcode_space:n { 9 } \char_set_catcode_space:n { 32 } } { \use:n #1 } - \exp_after:wN \@@_read_bb_auxv:w \l_@@_tmp_tl \s_@@_stop + \exp_after:wN \@@_read_bb_auxv:w \l_@@_internal_tl \s_@@_stop } } % \end{macrocode} @@ -465,10 +425,10 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_read_bb_auxv:w #1~#2~#3~#4~#5 \s_@@_stop { - \dim_set:Nn \l_graphics_llx_dim { #1 bp } - \dim_set:Nn \l_graphics_lly_dim { #2 bp } - \dim_set:Nn \l_graphics_urx_dim { #3 bp } - \dim_set:Nn \l_graphics_ury_dim { #4 bp } + \dim_set:Nn \l_@@_llx_dim { #1 bp } + \dim_set:Nn \l_@@_lly_dim { #2 bp } + \dim_set:Nn \l_@@_urx_dim { #3 bp } + \dim_set:Nn \l_@@_ury_dim { #4 bp } \ior_map_break: } % \end{macrocode} @@ -480,17 +440,13 @@ % \end{macro} % \end{macro} % -% \begin{variable}{\l_graphics_draft_bool} -% Relevant to including graphics but not to reading them. -% \begin{macrocode} -\bool_new:N \l_graphics_draft_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_graphics_name_tl, \l_@@_name_tl} +% \begin{variable}{\l_@@_final_name_str, \l_@@_full_name_str} +% The full name is as you'd expect the name including path and extension. +% The final name here reflects any conversions carried out by the backend, +% for example if an |.eps| is converted to |.pdf|. % \begin{macrocode} -\tl_new:N \l_graphics_name_tl -\tl_new:N \l_@@_name_tl +\str_new:N \l_@@_final_name_str +\str_new:N \l_@@_full_name_str % \end{macrocode} % \end{variable} % @@ -515,7 +471,7 @@ % \end{variable} % % \begin{variable}{\l_graphics_search_ext_seq} -% Used to specify fall-back extensions: actually set on a per-driver basis. +% Used to specify fall-back extensions: actually set on a per-backend basis. % \begin{macrocode} \seq_new:N \l_graphics_search_ext_seq % \end{macrocode} @@ -536,66 +492,49 @@ % \end{macrocode} % \end{variable} % -% \begin{macro}{\graphics_include:n} +% \begin{macro}{\graphics_include:nn, \graphics_include:nV} % \begin{macro}{\@@_include_search:n} % \begin{macro}{\@@_include:} -% \begin{macro}{\graphics_include:nn} % \begin{macro} % { -% \@@_include_auxi:n, \@@_include_auxii:n, +% \@@_include_auxi:n, \@@_include_auxi:e, \@@_include_auxii:n, % \@@_include_auxiii:n, \@@_include_auxiv:n % } % Actually including an graphic is relatively straight-forward: most of the -% work is done by the driver. We only have to deal with making sure the +% work is done by the backend. We only have to deal with making sure the % box has no apparent depth. Where the first given name is not found, we % search based on extension only if the \meta{type} was not given. The one % wrinkle is that we may have found a \texttt{.tex} file matching the file % name stem: that's not what we want, so we have to filter out. % \begin{macrocode} -\cs_new_protected:Npn \graphics_include:n #1 +\cs_new_protected:Npn \graphics_include:nn #1#2 { \group_begin: + \keys_set:nn { graphics } {#1} \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq - \file_get_full_name:nNTF {#1} \l_@@_name_tl + \file_get_full_name:nNTF {#2} \l_@@_full_name_str { - \str_if_eq:eeTF { \l_@@_name_tl } { #1 .tex } - { \@@_include_search:n {#1} } + \str_if_eq:eeTF { \l_@@_full_name_str } { #2 .tex } + { \msg_error:nnn { graphics } { graphic-not-found } {#2} } { \@@_include: } } - { \@@_include_search:n {#1} } + { \msg_error:nnn { graphics } { graphic-not-found } {#2} } \group_end: } -\cs_new_protected:Npn \@@_include_search:n #1 - { - \seq_map_inline:Nn \l_graphics_search_ext_seq - { - \file_get_full_name:nNT { #1 . ##1 } \l_@@_name_tl - { \seq_map_break:n { \use_i:nnn \@@_include: } } - } - \use:n - { \msg_error:nnn { graphics } { graphic-not-found } {#1} } - } +\cs_generate_variant:Nn \graphics_include:nn { nV } \cs_new_protected:Npn \@@_include: { - \file_parse_full_name:VNNN \l_@@_name_tl - \l_@@_dir_str \l_@@_name_str \l_@@_ext_str - \exp_args:Ne \@@_include_auxi:n + \str_if_empty:NTF \l_@@_type_str { - \exp_args:Ne \str_tail:n - { \str_foldcase:V \l_@@_ext_str } - } - } -\cs_new_protected:Npn \graphics_include:nn #1#2 - { - \group_begin: - \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq - \file_get_full_name:nNTF {#1} \l_@@_name_tl - { - \exp_args:Ne \@@_include_auxi:n - { \str_foldcase:n {#1} } - } - { \msg_error:nnn { graphics } { graphic-not-found } {#1} } - \group_end: + \file_parse_full_name:VNNN \l_@@_full_name_str + \l_@@_dir_str \l_@@_name_str \l_@@_ext_str + \@@_include_auxi:e + { + \exp_args:Ne \str_tail:n + { \str_foldcase:V \l_@@_ext_str } + } + } + { \@@_include_auxi:e { \l_@@_type_str } } } \cs_new_protected:Npn \@@_include_auxi:n #1 { @@ -603,20 +542,21 @@ { \tl_set:Nn \l_@@_internal_tl {#1} } \exp_args:NV \@@_include_auxii:n \l_@@_internal_tl } +\cs_generate_variant:Nn \@@_include_auxi:n { e } \cs_new_protected:Npn \@@_include_auxii:n #1 { \mode_leave_vertical: \cs_if_exist:cTF { @@_backend_include_ #1 :n } { - \tl_set_eq:NN \l_graphics_name_tl \l_@@_name_tl + \tl_set_eq:NN \l_@@_final_name_str \l_@@_full_name_str + \str_set:Nx \l_@@_full_name_str + { \exp_args:NV \__kernel_file_name_quote:n \l_@@_full_name_str } \exp_args:NnV \use:c { @@_backend_getbb_ #1 :n } - \l_@@_name_tl - \seq_gput_right:NV \g_@@_record_seq \l_graphics_name_tl -%<*package> + \l_@@_full_name_str + \seq_gput_right:NV \g_@@_record_seq \l_@@_final_name_str \clist_if_exist:NT \@filelist - { \exp_args:NV \@addtofilelist \l_graphics_name_tl } -%</package> - \bool_if:NTF \l_graphics_draft_bool + { \exp_args:NV \@addtofilelist \l_@@_final_name_str } + \bool_if:NTF \l_@@_draft_bool { \@@_include_auxiii:n } { \@@_include_auxiv:n } {#1} @@ -625,23 +565,21 @@ } \cs_new_protected:Npn \@@_include_auxiii:n #1 { - \hbox_to_wd:nn { \l_graphics_urx_dim - \l_graphics_llx_dim } + \hbox_to_wd:nn { \l_@@_urx_dim - \l_@@_llx_dim } { \tex_vrule:D \tex_hss:D \vbox_to_ht:nn - { \l_graphics_ury_dim - \l_graphics_lly_dim } + { \l_@@_ury_dim - \l_@@_lly_dim } { \tex_hrule:D width - \dim_eval:n { \l_graphics_urx_dim - \l_graphics_llx_dim } + \dim_eval:n { \l_@@_urx_dim - \l_@@_llx_dim } \tex_vss:D \hbox_to_wd:nn - { \l_graphics_urx_dim - \l_graphics_llx_dim } + { \l_@@_urx_dim - \l_@@_llx_dim } { -%<*package> \ttfamily -%</package> - \tex_hss:D \l_@@_name_tl \tex_hss:D + \tex_hss:D \l_@@_full_name_str \tex_hss:D } \tex_vss:D \tex_hrule:D @@ -655,13 +593,13 @@ \hbox_set:Nn \l_@@_internal_box { \exp_args:NnV \use:c { @@_backend_include_ #1 :n } - \l_@@_name_tl + \l_@@_full_name_str } \box_set_dp:Nn \l_@@_internal_box { 0pt } \box_set_ht:Nn \l_@@_internal_box - { \l_graphics_ury_dim - \l_graphics_lly_dim } + { \l_@@_ury_dim - \l_@@_lly_dim } \box_set_wd:Nn \l_@@_internal_box - { \l_graphics_urx_dim - \l_graphics_llx_dim } + { \l_@@_urx_dim - \l_@@_llx_dim } \box_use_drop:N \l_@@_internal_box } % \end{macrocode} @@ -669,7 +607,6 @@ % \end{macro} % \end{macro} % \end{macro} -% \end{macro} % % \begin{macro}{\graphics_show_list:, \graphics_log_list:, \@@_list:N} % \begin{macro}[EXP]{\@@_list_aux:n} @@ -680,7 +617,7 @@ \cs_new_protected:Npn \@@_list:N #1 { \seq_remove_duplicates:N \g_@@_record_seq - #1 { LaTeX/kernel } { file-list } + #1 { kernel } { file-list } { \seq_map_function:NN \g_@@_record_seq \@@_list_aux:n } { } { } { } } @@ -689,14 +626,123 @@ % \end{macro} % \end{macro} % +% \subsection{Utility functions} +% +% \begin{macro}{\graphics_get_full_name:nN} +% \begin{macro}[TF]{\graphics_get_full_name:nN} +% \begin{macro}{\@@_get_full_name:n} +% A simple search. +% \begin{macrocode} +\cs_new_protected:Npn \graphics_get_full_name:nN #1#2 + { + \graphics_get_full_name:nNF {#1} #2 + { \tl_set:Nn #2 { \q_no_value } } + } +\prg_new_protected_conditional:Npnn \graphics_get_full_name:nN #1#2 + { T , F , TF } + { + \group_begin: + \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq + \file_get_full_name:nNTF {#1} \l_@@_full_name_str + { + \str_if_eq:eeT { \l_@@_full_name_str } { #1 .tex } + { \@@_get_full_name:n {#1} } + } + { \@@_get_full_name:n {#1} } + \exp_args:NNNV \group_end: + \tl_set:Nn #2 \l_@@_full_name_str + \tl_if_empty:NTF #2 + { \prg_return_false: } + { \prg_return_true: } + } +\cs_new_protected:Npn \@@_get_full_name:n #1 + { + \str_clear:N \l_@@_full_name_str + \seq_map_inline:Nn \l_graphics_search_ext_seq + { + \file_get_full_name:nNT { #1 ##1 } \l_@@_full_name_str + { \seq_map_break:n { \use_none:nn } } + } + \use:n + { \str_clear:N \l_@@_full_name_str } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\graphics_get_pagecount:nN} +% \begin{macro}{\@@_get_pagecount:n} +% \begin{macro}{\@@_get_pagecount:nw} +% A generic function to read the number of pages in a graphic file. This is +% used by all of the backend where there is not a dedicated primitive. The +% plan is essentially the same as reading the bounding box. To avoid multiple +% calls, the value is cached either here or in the backend. +% \begin{macrocode} +\cs_new_protected:Npn \graphics_get_pagecount:nN #1#2 + { + \group_begin: + \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq + \file_get_full_name:nNTF {#1} \l_@@_full_name_str + { + \int_if_exist:cF { c_@@_ \l_@@_full_name_str _pages_int } + { + \exp_args:NV \@@_backend_get_pagecount:n + \l_@@_full_name_str + } + \tl_set:Nv #2 { c_@@_ \l_@@_full_name_str _pages_int } + } + { + \tl_set:Nn #2 { 0 } + \msg_error:nnn { graphics } { graphic-not-found } {#1} + } + \exp_args:NNNV \group_end: + \tl_set:Nn #2 #2 + } +\cs_new_protected:Npx \@@_get_pagecount:n #1 + { + \ior_shell_open:Nn \exp_not:N \l_@@_internal_ior + { extractbb~-O~#1 } + \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_internal_ior + { \msg_error:nnn { graphics } { pipe-failed } } + { + \ior_str_map_inline:Nn \exp_not:N \l_@@_internal_ior + { + \exp_not:N \@@_get_pagecount:nw {#1} + ##1 ~ \c_colon_str \c_colon_str \s_@@_stop + } + \exp_not:N \int_if_exist:cF { c_@@_ #1 _pages_int } + { \int_const:cn { c_@@_ #1 _pages_int } { 1 } } + } + \ior_close:N \exp_not:N \l_@@_internal_ior + } +\use:x + { + \cs_new_protected:Npn \exp_not:N \@@_get_pagecount:nw + ##1##2 \c_colon_str ##3 \c_colon_str ##4 \s_@@_stop + { + \exp_not:N \str_if_eq:nnT + { \c_percent_str \c_percent_str Pages } + {##2} + { + \int_const:cn { c_@@_ ##1 _pages_int } {##3} + \exp_not:N \ior_map_break: + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% % \subsection{Messages} % % \begin{macrocode} \msg_new:nnnn { graphics } { graphic-not-found } { Image~file~'#1'~not~found. } { - LaTeX~tried~to~open~graphic~file~'#1', - ~but~the~file~could~not~be~read. + LaTeX~tried~to~open~graphic~file~'#1',~ + but~the~file~could~not~be~read. } \msg_new:nnnn { graphics } { pipe-failed } { Cannot~run~piped~system~commands. } diff --git a/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx b/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx index 85de4479aec..192f6b6818d 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -97,7 +97,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3opacity}{2022-02-05}{} +\ProvidesExplPackage{l3opacity}{2022-04-10}{} {L3 Experimental opacity support} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx index 51193487ac6..c84c77c6081 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -166,7 +166,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3str-format}{2022-02-05}{} +\ProvidesExplPackage{l3str-format}{2022-04-10}{} {L3 Experimental string formatting} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx index cf8ecdf1885..db10bbbf606 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -151,7 +151,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3sys-shell}{2022-02-05}{} +\ProvidesExplPackage{l3sys-shell}{2022-04-10}{} {L3 Experimental system shell functions} % \end{macrocode} % @@ -393,6 +393,8 @@ \seq_set_split:NnV #2 { \char_generate:nn { `\^^M } { 12 } } \exp_not:N \l_@@_tmp_tl \seq_pop_right:NN #2 \exp_not:N \l_@@_tmp_tl + \exp_not:N \tl_if_blank:eTF { \exp_not:N \seq_item:Nn #2 { 1 } } + { \seq_clear:N #2 } } } % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx index 18e0c0deedb..e7773188c01 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx @@ -53,7 +53,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -672,7 +672,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xcoffins}{2022-02-05}{} +\ProvidesExplPackage{xcoffins}{2022-04-10}{} {L3 Experimental design level coffins} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx index f52c7fb59c3..5dd9d565eba 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx @@ -61,7 +61,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -686,7 +686,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3galley}{2022-02-05}{} +\ProvidesExplPackage{l3galley}{2022-04-10}{} {L3 Experimental galley code} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx index dca97d5fb60..2e541d65507 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-05} +% \date{Released 2022-04-10} % % \maketitle % @@ -731,7 +731,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xgalley}{2022-02-05}{} +\ProvidesExplPackage{xgalley}{2022-04-10}{} {L3 Experimental galley} \RequirePackage{xtemplate,l3galley} % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 51fb5f5e022..34e12e7d550 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -24,7 +24,7 @@ % %<*driver|generic|package|2ekernel> %</driver|generic|package|2ekernel> -\def\ExplFileDate{2022-02-24}% +\def\ExplFileDate{2022-04-10}% %<*driver> \documentclass[full]{l3doc} \usepackage{graphicx} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index 8f94eefe1f8..c945620eced 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -727,13 +727,6 @@ % \meta{control sequence name} must, when fully expanded, consist of % character tokens, typically a mixture of category code $10$ (space), % $11$ (letter) and $12$ (other). -% \begin{texnote} -% Protected macros that appear in a \texttt{c}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % As an example of the \cs{use:c} function, both diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 7afadf6f4b1..5b137477ca3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index 5a0f8bd8075..7c19e49bfd4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index 664f4a5306d..d8e01d0d0bf 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -596,7 +596,7 @@ % % \begin{function}[added = 2018-04-01]{\tl_build_get:NN} % \begin{syntax} -% \cs{tl_build_get:N} \meta{tl~var_1} \meta{tl~var_2} +% \cs{tl_build_get:NN} \meta{tl~var_1} \meta{tl~var_2} % \end{syntax} % Stores the contents of the \meta{tl~var_1} in the \meta{tl~var_2}. % The \meta{tl~var_1} must have been set up with \cs{tl_build_begin:N} @@ -1415,7 +1415,7 @@ \tl_if_in:nnTF {#1} { " } { \msg_error:nnx - { ior } { quote-in-shell } {#1} + { kernel } { quote-in-shell } {#1} } { \__kernel_ior_open:Nn #2 { |#1 } } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx index e10527fedd0..69409085fe7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index 0e3d0de492b..a2e5dd0ec0e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index 3b9bff45e03..d00fe3918d4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx index 1a163262197..93f42374efe 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx index 81d3d81c47e..65457cbdeaf 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -1015,7 +1015,7 @@ { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } } } { } - { \@@_cmd_set:nn } + { \@@_cmd_set_direct:nn } %<@@=msg> \__kernel_patch:nnn { } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index b5c495de2b9..4d48f2a0077 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index e3251058b37..0db227edf9d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -85,7 +85,7 @@ and all files in that bundle must be distributed together. % require you to do updates, if the class changes.}} % % \author{\Team} -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % \maketitle % \tableofcontents % @@ -361,69 +361,81 @@ and all files in that bundle must be distributed together. % \subsection{Describing functions in the documentation} % % \DescribeEnv{function} +% \DescribeEnv{variable} +% Two heavily-used environments are defined to describe \pkg{expl3} functions +% and variables. If describing a variable, use the latter environment; it +% behaves identically to the \env{function} environment. % \DescribeEnv{syntax} -% Two heavily-used environments are defined to describe the syntax of -% \pkg{expl3} functions and variables. +% Both of the above environments are typically combined with the \env{syntax} +% environment, to describe their syntax. % \begin{framed} % \vspace{-\baselineskip} % \begin{verbatim} -% \begin{function}{\function_one:, \function_two:} +% \begin{function}{\package_function_one:N, \package_function_two:n} % \begin{syntax} -% |\foo_bar:| \Arg{meta} \meta{test_1} +% \cs{package_function_one:N} \meta{cs} +% \cs{package_function_two:n} \marg{Argument} % \end{syntax} -% \meta{description} +% Descriptive text here ... % \end{function} % \end{verbatim} % \hrulefill % \par % \hspace*{0.25\textwidth} % \begin{minipage}{0.5\textwidth} -% \begin{function}{\function_one:, \function_two:} +% \begin{function}{\package_function_one:N, \package_function_two:n} % \begin{syntax} -% |\foo_bar:| \Arg{meta} \meta{test_1} +% \cs[no-index]{package_function_one:N} \meta{cs} +% \cs[no-index]{package_function_two:n} \marg{Argument} % \end{syntax} -% \meta{description} +% \emph{Descriptive text here …} % \end{function} % \end{minipage} % \end{framed} % % Function environments take an optional argument to indicate whether -% the function(s) it describes are expandable or restricted-expandable -% or defined in conditional forms. Use |EXP|, |rEXP|, |TF|, |pTF|, or |noTF| for -% this; note that |pTF| implies |EXP| since predicates must always be -% expandable, and that |noTF| means that the function without |TF| -% should be documented in addition to |TF|. As an example: +% the function(s) it describes are expandable (use |EXP|) or +% restricted-expandable (use |rEXP|) or defined in conditional forms +% (use |TF|, |pTF|, or |noTF|). Note that |pTF| implies |EXP| since +% predicates must always be expandable, and that |noTF| means that the +% function without |TF| should be documented in addition to |TF|. For +% the conditional forms |TF| and |pTF|, the argument of the +% \env{function} environment is \emph{not} in fact a command that +% exists: in the example below, \cs[no-index]{tl_if_empty:N} does not +% exist, but its conditional forms \cs{tl_if_empty:NT}, +% \cs{tl_if_empty:NF}, \cs{tl_if_empty:NTF} and predicate form +% \cs{tl_if_empty_p:N} exist: % \begin{framed} % \vspace{-\baselineskip} % \begin{verbatim} -% \begin{function}[pTF]{\cs_if_exist:N} +% \begin{function}[pTF]{\tl_if_empty:N, \tl_if_empty:c} % \begin{syntax} -% \cs{cs_if_exist_p:N} \meta{cs} +% \cs{tl_if_empty_p:N} \meta{tl~var} +% \cs{tl_if_empty:NTF} \meta{tl~var} \Arg{true code} \Arg{false code} % \end{syntax} -% \meta{description} +% Tests if the \meta{token list variable} is entirely empty +% (\emph{i.e.}~contains no tokens at all). % \end{function} % \end{verbatim} % \hrulefill % \par % \hspace*{0.25\textwidth} % \begin{minipage}{0.5\textwidth} -% \begin{function}[pTF]{\cs_if_exist:N} +% \begin{function}[pTF]{\tl_if_empty:N, \tl_if_empty:c} % \begin{syntax} -% \cs{cs_if_exist_p:N} \meta{cs} +% \cs{tl_if_empty_p:N} \meta{tl~var} +% \cs{tl_if_empty:NTF} \meta{tl~var} \Arg{true code} \Arg{false code} % \end{syntax} -% \meta{description} +% Tests if the \meta{token list variable} is entirely empty +% (\emph{i.e.}~contains no tokens at all). % \end{function} % \end{minipage} % \end{framed} % -% \DescribeEnv{variable} -% If you are documenting a variable instead of a function, use the -% \env{variable} environment instead; it behaves identically to the -% \env{function} environment above. -% % \DescribeEnv{texnote} % This environment is used to call out sections within \env{function} -% and similar that are only of interest to seasoned \TeX{} developers. +% and similar environments that are only of interest to seasoned +% \TeX{} developers. % % \subsection{Describing functions in the implementation} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index 6dbb029c6d7..9319cd39e51 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index f84a0928dc0..614a73d29e2 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -331,13 +331,6 @@ % % The |:cc| variant constructs the \meta{function} name in the same % manner as described for the \meta{tokens}. -% \begin{texnote} -% Protected macros that appear in a \texttt{c}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % \begin{function}[EXP]{\exp_args:No} @@ -374,13 +367,6 @@ % recovered and placed inside braces into the input stream \emph{after} % reinsertion of the \meta{function}. Thus the \meta{function} may take more % than one argument: all others are left unchanged. -% \begin{texnote} -% Protected macros that appear in a \texttt{v}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % \begin{function}[EXP, added = 2018-05-15]{\exp_args:Ne} @@ -683,13 +669,6 @@ % converts this into a control sequence. % Further expansion of this control sequence is then inhibited using % \cs{exp_not:N}. -% \begin{texnote} -% Protected macros that appear in a \texttt{c}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % \begin{function}[EXP]{\exp_not:n} @@ -736,13 +715,6 @@ % name. % The content of the \meta{variable} is recovered, and further % expansion in |x|-type or \texttt{e}-type arguments is prevented using \cs{exp_not:n}. -% \begin{texnote} -% Protected macros that appear in a \texttt{v}-type argument are -% expanded despite being protected; \cs{exp_not:n} also has no -% effect. An internal error occurs if non-characters or active -% characters remain after full expansion, as the conversion to a -% control sequence is not possible. -% \end{texnote} % \end{function} % % \begin{function}[EXP]{\exp_not:e} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 296680046c0..adf73279bc7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 5e35f1920dd..22fae08ae6d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index 1558d3015a2..38f6d3ff6ac 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index 7a441e41615..9ae275ac225 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index 1bd233dbbb8..8cd126989af 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index d3f2ea5613d..6fc2681f561 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index aa6b45f1f38..fdaece8932a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index f452cf3abb7..d116ce92211 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index dd4c4199687..7c24b0822c9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index 3b1bd6f1b84..307a848a088 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index 65802f5fbf6..8ad1b848804 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index 2a550195092..8cb45a097bd 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 3cb310052af..6cd2dd1b9b5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index 0d10240c4ea..993db8a0b62 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index ed69fe5fc68..c0f2daa4829 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index 0060743cbbb..2b279e18d7c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index 9d459317a7b..e8dc857816b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index 8a7434f170a..916cef5db2f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index 5f810a6bd11..bd62a0dbca6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 360a008995a..81eb124edd9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -882,6 +882,18 @@ % group and are thus never set. % \end{function} % +% \section{Digesting keys} +% +% \begin{function}[added = 2022-03-09]{\keys_precompile:nnN} +% \begin{syntax} +% \cs{keys_precompile:nnN} \Arg{module} \Arg{keyval list} \meta{tl} +% \end{syntax} +% Parses the \meta{keyval list} as for \cs{keys_set:nn}, placing the +% resulting code for those which set variables or functions into the +% \meta{tl}. Thus this function \enquote{precompiles} the keyval list into +% a set of results which can be applied rapidly. +% \end{function} +% % \section{Utility functions for keys} % % \begin{function}[EXP, pTF, updated = 2022-01-10] @@ -1661,6 +1673,14 @@ % \end{macrocode} % \end{variable} % +% \begin{variable}{\l_@@_precompile_bool, \l_@@_precompile_tl} +% For digesting keys. +% \begin{macrocode} +\bool_new:N \l_@@_precompile_bool +\tl_new:N \l_@@_precompile_tl +% \end{macrocode} +% \end{variable} +% % \begin{variable}{\l_keys_usage_load_prop, \l_keys_usage_preamble_prop} % Global data for document-level information. % \begin{macrocode} @@ -1694,6 +1714,19 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\@@_precompile:n} +% An auxiliary to allow cleaner showing of code. +% \begin{macrocode} +\cs_new_protected:Npn \@@_precompile:n #1 + { + \bool_if:NTF \l_@@_precompile_bool + { \tl_put_right:Nn \l_@@_precompile_tl } + { \use:n } + {#1} + } +% \end{macrocode} +% \end{macro} +% % \subsection{The key defining mechanism} % % \begin{macro}{\keys_define:nn} @@ -1866,7 +1899,7 @@ { \exp_not:c { bool_ #2 set_ #3 :N } \exp_not:N #1 } \@@_cmd_set:nx { \l_keys_path_str / false } { \exp_not:c { bool_ #2 set_ #4 :N } \exp_not:N #1 } - \@@_cmd_set:nn { \l_keys_path_str / unknown } + \@@_cmd_set_direct:nn { \l_keys_path_str / unknown } { \msg_error:nnx { keys } { boolean-values-only } \l_keys_key_str @@ -1909,8 +1942,8 @@ { \cs_set_nopar:cpn { \c_@@_type_root_str \l_keys_path_str } { choice } - \@@_cmd_set:nn \l_keys_path_str { #1 {##1} } - \@@_cmd_set:nn { \l_keys_path_str / unknown } + \@@_cmd_set_direct:nn \l_keys_path_str { #1 {##1} } + \@@_cmd_set_direct:nn { \l_keys_path_str / unknown } { \msg_error:nnxx { keys } { choice-unknown } \l_keys_path_str {##1} @@ -1952,13 +1985,18 @@ % \end{macro} % % \begin{macro} -% {\@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo} +% { +% \@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo, +% \@@_cmd_set_direct:nn +% } % Setting the code for a key first logs if appropriate that we are % defining a new key, then saves the code. % \begin{macrocode} \cs_new_protected:Npn \@@_cmd_set:nn #1#2 - { \cs_set_protected:cpn { \c_@@_code_root_str #1 } ##1 {#2} } + { \@@_cmd_set_direct:nn {#1} { \@@_precompile:n {#2} } } \cs_generate_variant:Nn \@@_cmd_set:nn { nx , Vn , Vo } +\cs_new_protected:Npn \@@_cmd_set_direct:nn #1#2 + { \cs_set_protected:cpn { \c_@@_code_root_str #1 } ##1 {#2} } % \end{macrocode} % \end{macro} % @@ -1970,7 +2008,10 @@ \cs_new_protected:Npn \@@_cs_set:NNpn #1#2#3# { \cs_set_protected:cpx { \c_@@_code_root_str \l_keys_path_str } ##1 - { #1 \exp_not:N #2 \exp_not:n {#3} {##1} } + { + \@@_precompile:n + { #1 \exp_not:N #2 \exp_not:n {#3} {##1} } + } \use_none:n } \cs_generate_variant:Nn \@@_cs_set:NNpn { Nc } @@ -2089,13 +2130,17 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_meta_make:n #1 { - \@@_cmd_set:Vo \l_keys_path_str + \exp_args:NVo \@@_cmd_set_direct:nn \l_keys_path_str { - \exp_after:wN \keys_set:nn \exp_after:wN { \l_@@_module_str } {#1} + \exp_after:wN \keys_set:nn \exp_after:wN + { \l_@@_module_str } {#1} } } \cs_new_protected:Npn \@@_meta_make:nn #1#2 - { \@@_cmd_set:Vn \l_keys_path_str { \keys_set:nn {#1} {#2} } } + { + \exp_args:NV \@@_cmd_set_direct:nn + \l_keys_path_str { \keys_set:nn {#1} {#2} } + } % \end{macrocode} % \end{macro} % \end{macro} @@ -2895,6 +2940,20 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\keys_precompile:nnN} +% A simple wrapper. +% \begin{macrocode} +\cs_new_protected:Npn \keys_precompile:nnN #1#2#3 + { + \bool_set_true:N \l_@@_precompile_bool + \tl_clear:N \l_@@_precompile_tl + \keys_set:nn {#1} {#2} + \bool_set_false:N \l_@@_precompile_bool + \tl_set_eq:NN #3 \l_@@_precompile_tl + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\@@_set_keyval:n, \@@_set_keyval:nn} % \begin{macro}{\@@_set_keyval:nnn, \@@_set_keyval:onn} % \begin{macro}{\@@_find_key_module:wNN} @@ -3379,7 +3438,11 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\keys_show:nn, \keys_log:nn, \@@_show:Nnn} +% \begin{macro}{\keys_show:nn, \keys_log:nn} +% \begin{macro}{\@@_show:Nnn} +% \begin{macro}{\@@_show:n} +% \begin{macro}{\@@_show:w} +% \begin{macro}{\@@_show:Nw} % To show a key, show its code using a message. % \begin{macrocode} \cs_new_protected:Npn \keys_show:nn @@ -3395,18 +3458,52 @@ { \exp_args:Nnf \msg_show_item_unbraced:nn { code } { - \exp_args:Nc \cs_replacement_spec:N + \exp_args:Ne \@@_show:n { - \c_@@_code_root_str - \@@_trim_spaces:n { #2 / #3 } + \exp_args:Nc \cs_replacement_spec:N + { + \c_@@_code_root_str + \@@_trim_spaces:n { #2 / #3 } + } } } } } { } { } } +\cs_new:Npx \@@_show:n #1 + { + \exp_not:N \@@_show:w + #1 + \tl_to_str:n { \@@_precompile:n } + #1 + \tl_to_str:n { \@@_precompile:n } + \exp_not:N \s_@@_stop + } +\use:x + { + \cs_new:Npn \exp_not:N \@@_show:w + ##1 \tl_to_str:n { \@@_precompile:n } + ##2 \tl_to_str:n { \@@_precompile:n } + ##3 \exp_not:N \s_@@_stop + } + { + \tl_if_blank:nTF {#2} + {#1} + { \@@_show:Nw #2 \s_@@_stop } + } +\use:x + { + \cs_new:Npn \exp_not:N \@@_show:Nw ##1##2 + \c_right_brace_str \exp_not:N \s_@@_stop + } + {#2} % \end{macrocode} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % % \subsection{Messages} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx index fb04de0adfa..534d37be27c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -100,15 +100,19 @@ % \end{macrocode} % % \begin{macro}[EXP,pTF]{\legacy_if:n} -% A friendly wrapper. +% A friendly wrapper. We need to use the \cs{if:w} approach here, rather than +% testing against \tn{iftrue}/\tn{iffalse} as the latter approach fails for +% primitive conditionals such as \tn{ifmmode}. The \cs{reverse_if:N} here +% means that we get a slightly more useful error if the name is undefined. % \begin{macrocode} \prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF } { - \exp_args:Nc \if_meaning:w { if#1 } \iftrue - \prg_return_true: - \else: + \exp_after:wN \reverse_if:N + \cs:w if#1 \cs_end: \prg_return_false: - \fi: + \else: + \prg_return_true: + \fi: } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 456a02293d7..04786d3c1f5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -317,6 +317,7 @@ local scan_string = token.scan_string local scan_keyword = token.scan_keyword local put_next = token.put_next local token_create = token.create +local token_new = token.new % \end{macrocode} % % Since token.create only returns useful values after the tokens diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 23add4a7c66..ef95cabf996 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -1854,9 +1854,7 @@ { Cannot~generate~null~char~as~a~space. } \msg_new:nnn { char } { out-of-range } { Charcode~requested~out~of~engine~range. } -\msg_new:nnn { char } { space } - { Cannot~generate~space~chars. } -\msg_new:nnnn { ior } { quote-in-shell } +\msg_new:nnnn { kernel } { quote-in-shell } { Quotes~in~shell~command~'#1'. } { Shell~commands~cannot~contain~quotes~("). } \msg_new:nnnn { keys } { no-property } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index f330647e3f1..50512593c3c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -1140,12 +1140,14 @@ \@@_primitive:NN \kcatcode \tex_kcatcode:D \@@_primitive:NN \kuten \tex_kuten:D \@@_primitive:NN \lastnodechar \tex_lastnodechar:D + \@@_primitive:NN \lastnodefont \tex_lastnodefont:D \@@_primitive:NN \lastnodesubtype \tex_lastnodesubtype:D \@@_primitive:NN \noautospacing \tex_noautospacing:D \@@_primitive:NN \noautoxspacing \tex_noautoxspacing:D \@@_primitive:NN \pagefistretch \tex_pagefistretch:D \@@_primitive:NN \postbreakpenalty \tex_postbreakpenalty:D \@@_primitive:NN \prebreakpenalty \tex_prebreakpenalty:D + \@@_primitive:NN \ptexlineendmode \tex_lineendmode:D \@@_primitive:NN \ptexminorversion \tex_ptexminorversion:D \@@_primitive:NN \ptexrevision \tex_ptexrevision:D \@@_primitive:NN \ptexversion \tex_ptexversion:D @@ -1161,6 +1163,8 @@ \@@_primitive:NN \textbaselineshiftfactor \tex_textbaselineshiftfactor:D \@@_primitive:NN \tfont \tex_tfont:D + \@@_primitive:NN \toucs \tex_toucs:D + \@@_primitive:NN \ucs \tex_ucs:D \@@_primitive:NN \xkanjiskip \tex_xkanjiskip:D \@@_primitive:NN \xspcode \tex_xspcode:D \@@_primitive:NN \ybaselineshift \tex_ybaselineshift:D @@ -1176,7 +1180,6 @@ \@@_primitive:NN \kchar \tex_kchar:D \@@_primitive:NN \kchardef \tex_kchardef:D \@@_primitive:NN \kuten \tex_kuten:D - \@@_primitive:NN \ucs \tex_ucs:D \@@_primitive:NN \uptexrevision \tex_uptexrevision:D \@@_primitive:NN \uptexversion \tex_uptexversion:D % \end{macrocode} @@ -1195,6 +1198,7 @@ % \begin{macrocode} \@@_primitive:NN \partokencontext \tex_partokencontext:D \@@_primitive:NN \partokenname \tex_partokenname:D + \@@_primitive:NN \showstream \tex_showstream:D \@@_primitive:NN \tracingstacklevels \tex_tracingstacklevels:D % \end{macrocode} % End of the \enquote{just the names} part of the source. @@ -1470,9 +1474,9 @@ % Here \enquote{smaller} refers to codepoint order which does not correspond to % the user expected order for most non-ASCII strings. % \begin{macrocode} -local minus_tok = token.new(string.byte'-', 12) -local zero_tok = token.new(string.byte'0', 12) -local one_tok = token.new(string.byte'1', 12) +local minus_tok = token_new(string.byte'-', 12) +local zero_tok = token_new(string.byte'0', 12) +local one_tok = token_new(string.byte'1', 12) luacmd('tex_strcmp:D', function() local first = scan_string() local second = scan_string() @@ -1487,14 +1491,19 @@ end, 'global') % % \begin{macro}{\tex_Ucharcat:D} % Creating arbitrary chars using |tex.cprint|. -% The alternative approach using |token.put_next(token.create(...))| -% would be about 10\% slower. +% The alternative approach using |token.new(...)| is about 10\% slower +% but needed to create arbitrary space tokens. % \begin{macrocode} +local sprint = tex.sprint local cprint = tex.cprint luacmd('tex_Ucharcat:D', function() local charcode = scan_int() local catcode = scan_int() - cprint(catcode, utf8_char(charcode)) + if catcode == 10 then + sprint(token_new(charcode, 10)) + else + cprint(catcode, utf8_char(charcode)) + end end, 'global') % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx index c6841148de7..b2ed19cb085 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index 1742e7c0a51..98f62111870 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index de14307b84c..1d0694fe6a2 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index a31d8830163..53ea8dfc182 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index 4eb2dacf102..e9c254bb029 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index c6300a84470..bf285df9646 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index d6ba0a90c1b..75e80b0c54f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 75509e1e546..11604bbf817 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx index f854e3ea2e4..8646c378e52 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 897f4b962be..ddfdd102793 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -222,8 +222,8 @@ % % \section{String conditionals} % -% \begin{function}[EXP,pTF, added = 2015-09-18] -% {\str_if_empty:N, \str_if_empty:c} +% \begin{function}[EXP,pTF, added = 2015-09-18, updated = 2022-03-21] +% {\str_if_empty:N, \str_if_empty:c, \str_if_empty:n} % \begin{syntax} % \cs{str_if_empty_p:N} \meta{str~var} % \cs{str_if_empty:NTF} \meta{str~var} \Arg{true code} \Arg{false code} @@ -282,8 +282,8 @@ % tests whether \meta{string_2} is found inside \meta{string_1}. % \end{function} % -% \begin{function}[added = 2013-07-24, updated = 2015-02-28, EXP, noTF] -% {\str_case:nn, \str_case:Vn, \str_case:on, \str_case:nV, \str_case:nv} +% \begin{function}[added = 2013-07-24, updated = 2022-03-21, EXP, noTF] +% {\str_case:nn, \str_case:Vn, \str_case:Nn, \str_case:on, \str_case:nV, \str_case:nv} % \begin{syntax} % \cs{str_case:nnTF} \Arg{test string} \\ % ~~|{| \\ @@ -747,16 +747,6 @@ % correctly deal with context-dependence and other factors appropriate % to text case changing. % \end{itemize} -% -% \begin{texnote} -% As with all \pkg{expl3} functions, the input supported by -% \cs{str_foldcase:n} is \emph{engine-native} characters which are or -% interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{} -% \emph{only} the Latin alphabet characters A--Z are case-folded -% (\emph{i.e.}~the \textsc{ascii} range which coincides with -% \textsc{utf-8}). Full \textsc{utf-8} support is available with both -% \XeTeX{} and \LuaTeX{}. -% \end{texnote} % \end{function} % % \begin{function}[EXP, added = 2019-11-26] @@ -789,18 +779,6 @@ % a language-insensitive process, there is no special treatment of % Turkic input (\emph{i.e.}~\texttt{I} always folds to \texttt{i} and % not to \texttt{\i}). -% -% \begin{texnote} -% As with all \pkg{expl3} functions, the input supported by -% \cs{str_foldcase:n} is \emph{engine-native} characters which are or -% interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{} -% \emph{only} the Latin alphabet characters A--Z are case-folded -% (\emph{i.e.}~the \textsc{ascii} range which coincides with -% \textsc{utf-8}). Full \textsc{utf-8} support is available with both -% \XeTeX{} and \LuaTeX{}, subject only to the fact that \XeTeX{} in -% particular has issues with characters of code above hexadecimal -% $0\mathrm{xFFFF}$ when interacting with \cs{tl_to_str:n}. -% \end{texnote} % \end{function} % % \section{Viewing strings} @@ -1113,7 +1091,7 @@ % % \begin{macro}[pTF, EXP] % { -% \str_if_empty:N, \str_if_empty:c, +% \str_if_empty:N, \str_if_empty:c, \str_if_empty:n, % \str_if_exist:N, \str_if_exist:c % } % More copy-paste! @@ -1126,6 +1104,8 @@ { p , T , F , TF } \prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c { p , T , F , TF } +\prg_new_eq_conditional:NNn \str_if_empty:n \tl_if_empty:n + { p , T , F , TF } % \end{macrocode} % \end{macro} % @@ -1224,7 +1204,7 @@ % \end{macro} % % \begin{macro}[EXP, noTF] -% {\str_case:nn, \str_case:Vn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_e:nn} +% {\str_case:nn, \str_case:Vn, \str_case:Nn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_e:nn} % \begin{macro}[EXP]{\@@_case:nnTF, \@@_case_e:nnTF} % \begin{macro}[EXP] % {\@@_case:nw, \@@_case_e:nw, \@@_case_end:nw} @@ -1254,6 +1234,10 @@ \cs_new:Npn \@@_case:nnTF #1#2#3#4 { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop } \cs_generate_variant:Nn \str_case:nn { V , o , nV , nv } +\cs_new_eq:NN \str_case:Nn \str_case:Vn +\cs_new_eq:NN \str_case:NnT \str_case:VnT +\cs_new_eq:NN \str_case:NnF \str_case:VnF +\cs_new_eq:NN \str_case:NnTF \str_case:VnTF \prg_generate_conditional_variant:Nnn \str_case:nn { V , o , nV , nv } { T , F , TF } \cs_new:Npn \@@_case:nw #1#2#3 @@ -1918,10 +1902,21 @@ % \begin{macro}[EXP]{\@@_change_case_loop:nw} % \begin{macro}[EXP]{\@@_change_case_space:n} % \begin{macro}[EXP]{\@@_change_case_char:nN} +% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNN} +% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNN} +% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNNN} +% \begin{macro}[EXP] +% { +% \@@_change_case_char_UTFviii:nn , +% \@@_change_case_char_UTFviii_lower:nn , +% \@@_change_case_char_UTFviii_upper:nn , +% \@@_change_case_char_UTFviii_fold:nn +% } % Case changing for programmatic reasons is done by first detokenizing % input then doing a simple loop that only has to worry about spaces % and everything else. The output is detokenized to allow data sharing -% with text-based case changing. +% with text-based case changing. Similarly, for $8$-bit engines the +% multi-byte information is shared. % \begin{macrocode} \cs_new:Npn \str_foldcase:n #1 { \@@_change_case:nn {#1} { fold } } \cs_new:Npn \str_lowercase:n #1 { \@@_change_case:nn {#1} { lower } } @@ -1965,7 +1960,100 @@ { \use:c { char_str_ #1 case:N } #2 } \@@_change_case_loop:nw {#1} } +\if_int_compare:w 0 + \cs_if_exist:NT \tex_XeTeXversion:D { 1 } + \cs_if_exist:NT \tex_luatexversion:D { 1 } + > 0 \exp_stop_f: +\else: + \cs_gset:Npn \@@_change_case_char:nN #1#2 + { + \@@_if_recursion_tail_stop_do:Nn #2 + { \@@_change_case_end:wn } + \int_compare:nNnTF { `#2 } > { "80 } + { + \int_compare:nNnTF { `#2 } < { "E0 } + { \@@_change_case_char_UTFviii:nNN } + { + \int_compare:nNnTF { `#2 } < { "F0 } + { \@@_change_case_char_UTFviii:nNNN } + { \@@_change_case_char_UTFviii:nNNNN } + } + {#1} #2 + } + { + \@@_change_case_output:fw + { \use:c { char_str_ #1 case:N } #2 } + \@@_change_case_loop:nw {#1} + } + } + \cs_new:Npn \@@_change_case_char_UTFviii:nNN #1#2#3 + { \@@_change_case_char_UTFviii:nn {#1} {#2#3} } + \cs_new:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4 + { \@@_change_case_char_UTFviii:nn {#1} {#2#3#4} } + \cs_new:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5 + { \@@_change_case_char_UTFviii:nn {#1} {#2#3#4#5} } % \end{macrocode} +% Skip high chars for the Japanese engines. +% \begin{macrocode} + \cs_if_exist:NF \tex_pdftexversion:D + { + \cs_gset:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4 + { + \@@_change_case_output:nw {#2#3#4} + \@@_change_case_loop:nw {#1} + } + \cs_gset:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5 + { + \@@_change_case_output:nw {#2#3#4#5} + \@@_change_case_loop:nw {#1} + } + } + \cs_new:Npn \@@_change_case_char_UTFviii:nn #1#2 + { + \use:c { @@_change_case_char_UTFviii_ #1 :nn } {#1} {#2} + } + \cs_new:Npn \@@_change_case_char_UTFviii_upper:nn #1#2 + { + \@@_change_case_output:fw + { + \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl } + { + \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: } + } + {#2} + } + \@@_change_case_loop:nw {#1} + } + \cs_new_eq:NN \@@_change_case_char_UTFviii_lower:nn + \@@_change_case_char_UTFviii_upper:nn + \cs_new:Npn \@@_change_case_char_UTFviii_fold:nn #1#2 + { + \@@_change_case_output:fw + { + \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl } + { + \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: } + } + { + \cs_if_exist:cTF { c__kernel_lowercase_ #2 _tl } + { + \__kernel_tl_to_str:w + \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_lowercase_ #2 _tl \cs_end: } + } + {#2} + } + } + \@@_change_case_loop:nw {#1} + } +\fi: +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % \end{macro} % \end{macro} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 4134831b8ba..a211af619bd 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx index 61681108e26..faa9960f790 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -670,10 +670,10 @@ { \@@_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6#7} } \cs_new:Npn \@@_change_case_char_UTFviii:nnnn #1#2#3#4 { - \cs_if_exist:cTF { c_@@_ #1 case_ \tl_to_str:n {#4} _tl } + \cs_if_exist:cTF { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl } { \@@_change_case_store:v - { c_@@_ #1 case_ \tl_to_str:n {#4} _tl } + { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl } } { \@@_change_case_store:n {#4} } \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3} @@ -1536,11 +1536,11 @@ % % For $8$-bit engines we now need to define the case-change data for % the multi-octet mappings. This data is here not in the \pkg{char} module -% as the multi-byte nature means they are never |N|-type. -% These need a list of what code points are -% doable in |T1| so the list is hard coded (there's no saving in loading -% the mappings dynamically). All of the straight-forward ones have two -% octets, so that is taken as read. +% as the multi-byte nature means they are never |N|-type. As this data is +% needed both for text and string work, it is stored as |kernel|: it remains +% internal as it is not really suitable for wider exposure. +% +% The first set of codepoints are those in |T1|: all of these are two bytes. % \begin{macrocode} \group_begin: \bool_lazy_or:nnF @@ -1562,7 +1562,7 @@ { \tl_const:cx { - c_@@_ #1 case_ + c__kernel_ #1 case_ \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } _tl @@ -1578,7 +1578,7 @@ { \tl_const:cx { - c_@@_lowercase_ + c__kernel_lowercase_ \char_generate:nn {#1} { 12 } \char_generate:nn {#2} { 12 } _tl @@ -1694,8 +1694,7 @@ { 0218 } { 0219 } { 021A } { 021B } % \end{macrocode} -% Add |T2| (Cyrillic) as this is doable using a classical \tn{MakeUppercase} -% approach. +% Add |T2| (Cyrillic) : again two bytes. % \begin{macrocode} { 0400 } { 0450 } { 0401 } { 0451 } @@ -1818,7 +1817,7 @@ { \tl_const:cx { - c_@@_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } _tl @@ -1859,7 +1858,7 @@ { \tl_const:cn { - c_@@_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } _tl @@ -1880,7 +1879,7 @@ { \tl_const:cx { - c_@@_ #1 case_ + c__kernel_ #1 case_ \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } \char_generate:nn {#4} { 12 } @@ -1899,7 +1898,7 @@ { \tl_const:cx { - c_@@_lowercase_ + c__kernel_lowercase_ \char_generate:nn {#1} { 12 } \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } @@ -2025,7 +2024,7 @@ { \tl_const:cx { - c_@@_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } \char_generate:nn {##3} { 12 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx index 922a371d333..a055aec838d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx index 0d1365c8d2b..3cb5795a5df 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -562,11 +562,45 @@ % \end{variable} % % \begin{variable}{\l_text_expand_exclude_tl} -% Commands which need not to expand. +% Commands which need not to expand. We start with a somewhat historical +% list, and tidy up if possible. % \begin{macrocode} \tl_new:N \l_text_expand_exclude_tl \tl_set:Nn \l_text_expand_exclude_tl { \begin \cite \end \label \ref } +\bool_lazy_and:nnT + { \str_if_eq_p:Vn \fmtname { LaTeX2e } } + { \tl_if_exist_p:N \@expl@finalise@setup@@@@ } + { + \tl_gput_right:Nn \@expl@finalise@setup@@@@ + { + \tl_gput_right:Nn \@kernel@after@begindocument + { + \group_begin: + \cs_set_protected:Npn \@@_tmp:w #1 + { + \tl_clear:N \l_text_expand_exclude_tl + \tl_map_inline:nn {#1} + { + \bool_lazy_any:nF + { + { \token_if_protected_macro_p:N ##1 } + { \token_if_protected_long_macro_p:N ##1 } + { + \str_if_eq_p:ee + { \cs_replacement_spec:N ##1 } + { \exp_not:n { \protect ##1 } \c_space_tl } + } + } + { \tl_put_right:Nn \l_text_expand_exclude_tl {##1} } + } + } + \exp_args:NV \@@_tmp:w \l_text_expand_exclude_tl + \exp_args:NNNV \group_end: + \tl_set:Nn \l_text_expand_exclude_tl \l_text_expand_exclude_tl + } + } + } % \end{macrocode} % \end{variable} % @@ -632,13 +666,14 @@ % \begin{macro}[EXP]{\@@_expand_accent:NN} % \begin{macro}[EXP]{\@@_expand_letterlike:N} % \begin{macro}[EXP]{\@@_expand_letterlike:NN} -% \begin{macro}[EXP]{\@@_expand_cs:N, \@@_expand_encoding:N} -% \begin{macro}[EXP]{\@@_expand_encoding_escape:N} +% \begin{macro}[EXP]{\@@_expand_cs:N} +% \begin{macro}[EXP]{\@@_expand_protect:w} % \begin{macro}[EXP]{\@@_expand_protect:N} % \begin{macro}[EXP]{\@@_expand_protect:nN} % \begin{macro}[EXP]{\@@_expand_protect:Nw} % \begin{macro}[EXP]{\@@_expand_testopt:N} % \begin{macro}[EXP]{\@@_expand_testopt:NNn} +% \begin{macro}[EXP]{\@@_expand_encoding:N, \@@_expand_encoding_escape:N} % \begin{macro}[EXP]{\@@_expand_replace:N} % \begin{macro}[EXP]{\@@_expand_replace:n} % \begin{macro}[EXP]{\@@_expand_cs_expand:N} @@ -947,14 +982,15 @@ % \end{macrocode} % \LaTeXe{}'s \cs{protect} makes life interesting. Where possible, we % simply remove it and replace with the \enquote{parent} command; of course, -% the \cs{protect} might be explicit, in which case we need to leave it alone -% if it's required. There is also the case of a straight \tn{@protected@testopt} -% to cover. +% the \cs{protect} might be explicit, in which case we need to leave it alone. +% That includes the case where it's not even followed by an \texttt{N}-type +% token. There is also the case of a straight \tn{@protected@testopt} to +% cover. % \begin{macrocode} \cs_new:Npx \@@_expand_cs:N #1 { \exp_not:N \str_if_eq:nnTF {#1} { \exp_not:N \protect } - { \exp_not:N \@@_expand_protect:N } + { \exp_not:N \@@_expand_protect:w } { \bool_lazy_and:nnTF { \cs_if_exist_p:N \fmtname } @@ -963,8 +999,23 @@ { \exp_not:N \@@_expand_replace:N #1 } } } +\cs_new:Npn \@@_expand_protect:w #1 \q_@@_recursion_stop + { + \tl_if_head_is_N_type:nTF {#1} + { \@@_expand_protect:N } + { + \@@_expand_store:n { \protect } + \@@_expand_loop:w + } + #1 \q_@@_recursion_stop + } \cs_new:Npn \@@_expand_protect:N #1 { + \@@_if_recursion_tail_stop_do:Nn #1 + { + \@@_expand_store:n { \protect } + \@@_expand_end:w + } \exp_args:Ne \@@_expand_protect:nN { \cs_to_str:N #1 } #1 } @@ -1122,6 +1173,7 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro} % { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index 9f6527b505f..0db5f15d7ab 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -90,7 +90,7 @@ % characters, and the value of registers. % \end{function} % -% \begin{function}[added = 2018-04-09] +% \begin{function}[added = 2018-04-09, updated = 2022-03-26] % {\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn} % \begin{syntax} % \cs{tl_analysis_map_inline:nn} \Arg{token list} \Arg{inline function} @@ -935,47 +935,46 @@ % % \subsection{Mapping through the analysis} % -% \begin{macro}{\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn} -% \begin{macro}{\@@_analysis_map_inline_aux:Nn} -% \begin{macro}{\@@_analysis_map_inline_aux:nnn} +% \begin{macro}{\tl_analysis_map_inline:Nn, \tl_analysis_map_inline:nn} +% \begin{macro}{\@@_analysis_map:Nn} +% \begin{macro}{\@@_analysis_map:NwNw} % First obtain the analysis of the token list into % \cs{g_@@_analysis_result_tl}. To allow nested mappings, increase the -% nesting depth \cs{g__kernel_prg_map_int} (shared between all modules), then -% define the looping macro, which has a name specific to that nesting -% depth. That looping grabs the \meta{tokens}, \meta{catcode} and -% \meta{char code}; it checks for the end of the loop with -% \cs{use_none:n} |##2|, normally empty, but which becomes -% \cs{tl_map_break:} at the end; it then performs the user's code -% |#2|, and loops by calling itself. When the loop ends, remember to -% decrease the nesting depth. +% nesting depth \cs{g__kernel_prg_map_int} (shared between all +% modules), then define the payload macro, which runs the user code +% and has a name specific to that nesting depth. The looping macro +% grabs the \meta{tokens}, \meta{catcode} and \meta{char code}; it +% checks for the end of the loop with \cs{use_none:n} |##2|, normally +% empty, but which becomes \cs{tl_map_break:} at the end; it then +% calls the payload macro with the arguments in the correct order +% (this is the reason why we cannot directly use the same macro for +% looping and payload), and loops by calling itself. When the loop +% ends, remember to decrease the nesting depth. % \begin{macrocode} +\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1 + { \exp_args:No \tl_analysis_map_inline:nn #1 } \cs_new_protected:Npn \tl_analysis_map_inline:nn #1 { \@@_analysis:n {#1} \int_gincr:N \g__kernel_prg_map_int - \exp_args:Nc \@@_analysis_map_inline_aux:Nn + \exp_args:Nc \@@_analysis_map:Nn { @@_analysis_map_inline_ \int_use:N \g__kernel_prg_map_int :wNw } } -\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1 - { \exp_args:No \tl_analysis_map_inline:nn #1 } -\cs_new_protected:Npn \@@_analysis_map_inline_aux:Nn #1#2 +\cs_new_protected:Npn \@@_analysis_map:Nn #1#2 { - \cs_gset_protected:Npn #1 ##1 \s_@@ ##2 ##3 \s_@@ - { - \use_none:n ##2 - \@@_analysis_map_inline_aux:nnn {##1} {##3} {##2} - } - \cs_gset_protected:Npn \@@_analysis_map_inline_aux:nnn ##1##2##3 - { - #2 - #1 - } - \exp_after:wN #1 + \cs_gset_protected:Npn #1 ##1##2##3 {#2} + \exp_after:wN \@@_analysis_map:NwNw \exp_after:wN #1 \g_@@_analysis_result_tl \s_@@ { ? \tl_map_break: } \s_@@ \prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__kernel_prg_map_int } } +\cs_new_protected:Npn \@@_analysis_map:NwNw #1 #2 \s_@@ #3 #4 \s_@@ + { + \use_none:n #3 + #1 {#2} {#4} {#3} + \@@_analysis_map:NwNw #1 + } % \end{macrocode} % \end{macro} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index bd78c69bde6..68d2cdaf8a5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index 909dff2b7e8..3d5858a37ad 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % @@ -139,12 +139,14 @@ % \item $6$ (parameter) % \item $7$ (math superscript) % \item $8$ (math subscript) +% \item $10$ (space) % \item $11$ (letter) % \item $12$ (other) % \item $13$ (active) % \end{itemize} % and other values raise an error. The \meta{charcode} may be any one valid -% for the engine in use. +% for the engine in use, except that for \meta{catcode} $10$, \meta{charcode} +% $0$ is not allowed. % Active characters cannot be generated in older versions of \XeTeX{}. % Another way to build token lists with unusual category codes is % \cs{regex_replace:nnN} |{.*}| \Arg{replacement} \meta{tl~var}. @@ -1527,26 +1529,22 @@ % \begin{macrocode} \cs_new:Npn \@@_generate_aux:w #1 ; #2 ; { - \if_int_compare:w #2 = 10 \exp_stop_f: - \if_int_compare:w #1 = \c_zero_int - \msg_expandable_error:nn { char } { null-space } - \else: - \msg_expandable_error:nn { char } { space } - \fi: + \if_int_odd:w 0 + \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f: + \msg_expandable_error:nn { char } + { invalid-catcode } \else: \if_int_odd:w 0 - \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f: + \if_int_compare:w #1 < \c_zero_int 1 \fi: + \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f: \msg_expandable_error:nn { char } - { invalid-catcode } + { out-of-range } \else: - \if_int_odd:w 0 - \if_int_compare:w #1 < \c_zero_int 1 \fi: - \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f: - \msg_expandable_error:nn { char } - { out-of-range } + \if_int_compare:w #2#1 = 100 \exp_stop_f: + \msg_expandable_error:nn { char } { null-space } \else: \@@_generate_aux:nnw {#1} {#2} \fi: diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index 317630568df..db57bd0f386 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2022-02-24} +% \date{Released 2022-04-10} % % \maketitle % diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def index 9ae3d70b015..4d45954567f 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def @@ -26,7 +26,7 @@ %% %% File: l3backend-basics.dtx \ProvidesExplFile - {l3backend-dvipdfmx.def}{2022-02-07}{} + {l3backend-dvipdfmx.def}{2022-04-10}{} {L3 backend support: dvipdfmx} \cs_if_exist:NTF \__kernel_dependency_version_check:nn { @@ -65,20 +65,6 @@ { \__kernel_backend_literal:n { x:gsave } } \cs_new_protected:Npn \__kernel_backend_scope_end: { \__kernel_backend_literal:n { x:grestore } } -\group_begin: - \cs_set:Npn \__sys_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2} - \sys_get_shell:nnNTF { extractbb~--version } - { \char_set_catcode_space:n { `\ } } - \l__sys_internal_tl - { - \int_const:Nn \c__kernel_sys_dvipdfmx_version_int - { - \exp_after:wN \__sys_tmp:w \l__sys_internal_tl - \q_stop - } - } - { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } } -\group_end: %% File: l3backend-color.dtx \cs_new_protected:Npn \__color_backend_pickup:N #1 { } \cs_if_exist:cT { ver@color.sty } @@ -102,71 +88,64 @@ { \tl_set:Nn #3 { {#1} {#2} } } } \int_new:N \l__color_backend_stack_int -\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } } +\int_new:N \g__color_backend_stack_int +\cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3 { - \int_new:N \g__color_backend_stack_int - \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3 + \int_gincr:N \exp_not:N \g__color_backend_stack_int + \int_const:Nn #1 { \exp_not:N \g__color_backend_stack_int } + \use:x { - \int_gincr:N \exp_not:N \g__color_backend_stack_int - \int_const:Nn #1 { \exp_not:N \g__color_backend_stack_int } - \use:x + \__kernel_backend_first_shipout:n { - \__kernel_backend_first_shipout:n + \__kernel_backend_literal:n { - \__kernel_backend_literal:n - { - pdfcolorstackinit ~ - \exp_not:N \int_use:N \exp_not:N \g__color_backend_stack_int - \c_space_tl - \exp_not:N \tl_if_blank:nF {#2} { #2 ~ } - (#3) - } + pdfcolorstackinit ~ + \exp_not:N \int_use:N \exp_not:N \g__color_backend_stack_int + \c_space_tl + \exp_not:N \tl_if_blank:nF {#2} { #2 ~ } + (#3) } - } - } - \cs_if_exist:cTF { main@pdfcolorstack } - { - \int_set:Nn \l__color_backend_stack_int - { \int_use:c { main@pdfcolorstack } } - } - { - \__kernel_color_backend_stack_init:Nnn \c__color_backend_main_stack_int - { page ~ direct } { 0 ~ g ~ 0 ~ G } - \int_set_eq:NN \l__color_backend_stack_int - \c__color_backend_main_stack_int - \int_const:cn { main@pdfcolorstack } { \c__color_backend_main_stack_int } + } } - \cs_gset_protected:Npn \__kernel_backend_scope_end: + } +\cs_if_exist:cTF { main@pdfcolorstack } + { + \int_set:Nn \l__color_backend_stack_int + { \int_use:c { main@pdfcolorstack } } + } + { + \__kernel_color_backend_stack_init:Nnn \c__color_backend_main_stack_int + { page ~ direct } { 0 ~ g ~ 0 ~ G } + \int_set_eq:NN \l__color_backend_stack_int + \c__color_backend_main_stack_int + \int_const:cn { main@pdfcolorstack } { \c__color_backend_main_stack_int } + } +\cs_gset_protected:Npn \__kernel_backend_scope_end: + { + \__kernel_backend_literal:n { x:grestore } + \__kernel_backend_literal:x { - \__kernel_backend_literal:n { x:grestore } - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_use:N \g__color_backend_stack_int \c_space_tl current - } + pdfcolorstack ~ + \int_use:N \g__color_backend_stack_int \c_space_tl current } } -\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } +\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2 { - \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2 + \__kernel_backend_literal:x { - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_eval:n {#1} ~ - push ~ (#2) - } + pdfcolorstack ~ + \int_eval:n {#1} ~ + push ~ (#2) } - \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx } - \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1 + } +\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx } +\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1 + { + \__kernel_backend_literal:x { - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_eval:n {#1} ~ - pop - } + pdfcolorstack ~ + \int_eval:n {#1} ~ + pop } } \tl_new:N \l__color_backend_fill_tl @@ -185,15 +164,6 @@ } \cs_new_protected:Npn \__color_backend_reset: { \__kernel_color_backend_stack_pop:n \l__color_backend_stack_int } -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \__color_backend_select_cmyk:n #1 - { \__kernel_backend_literal:n { pdf: bc ~ [#1] } } - \cs_gset_eq:NN \__color_backend_select_gray:n \__color_backend_select_cmyk:n - \cs_gset_eq:NN \__color_backend_select_rgb:n \__color_backend_select_cmyk:n - \cs_gset_protected:Npn \__color_backend_reset: - { \__kernel_backend_literal:n { pdf: ec } } - } \prop_new:N \g__color_backend_colorant_prop \cs_new:Npx \__color_backend_devicen_colorants:n #1 { @@ -380,12 +350,6 @@ } } } -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \__color_backend_select_separation:nn #1#2 { } - \cs_gset_eq:NN \__color_backend_select_devicen:nn - \__color_backend_select_separation:nn - } \cs_new_protected:Npn \__color_backend_fill_cmyk:n #1 { \__color_backend_fill:n { #1 ~ k } } \cs_new_protected:Npn \__color_backend_fill_gray:n #1 @@ -418,27 +382,6 @@ { \__color_backend_stroke:n { /#1 ~ CS ~ #2 ~ SCN } } \cs_new_eq:NN \__color_backend_fill_devicen:nn \__color_backend_fill_separation:nn \cs_new_eq:NN \__color_backend_stroke_devicen:nn \__color_backend_stroke_separation:nn -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \__color_backend_fill_cmyk:n #1 - { - \__kernel_backend_literal:n { pdf: bc ~ [#1] } - \group_insert_after:N \__color_backend_reset: - } - \cs_gset_eq:NN \__color_backend_fill_gray:n \__color_backend_fill_cmyk:n - \cs_gset_eq:NN \__color_backend_fill_rgb:n \__color_backend_fill_cmyk:n - \cs_gset_protected:Npn \__color_backend_reset: - { \__kernel_backend_literal:n { pdf: ec } } - \cs_gset_protected:Npn \__color_backend_stroke:n #1 - { \__kernel_backend_literal:n {#1} } - \cs_gset_protected:Npn \__color_backend_fill_separation:nn #1#2 { } - \cs_gset_eq:NN \__color_backend_fill_devicen:nn - \__color_backend_fill_separation:nn - \cs_gset_eq:NN \__color_backend_stroke_separation:nn - \__color_backend_fill_separation:nn - \cs_gset_eq:NN \__color_backend_stroke_devicen:nn - \__color_backend_stroke_separation:nn - } %% File: l3backend-box.dtx \cs_new_protected:Npn \__box_backend_clip:N #1 { @@ -660,19 +603,41 @@ \__kernel_backend_scope_end: } %% File: l3backend-graphics.dtx -\cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n +\cs_new_protected:Npn \__graphics_backend_loaded:n #1 + { + \cs_if_exist:NTF \hook_gput_code:nnn + { + \hook_gput_code:nnn + { file / l3graphics.sty / after } + { backend } + {#1} + } + {#1} + } +\__graphics_backend_loaded:n + { + \seq_set_from_clist:Nn \l_graphics_search_ext_seq + { .pdf , .eps , .ps , .png , .jpg ., jpeg , .bmp } + } +\__graphics_backend_loaded:n + { + \cs_new_eq:NN \__graphics_backend_getbb_eps:n \__graphics_read_bb:n + \cs_new_eq:NN \__graphics_backend_getbb_ps:n \__graphics_read_bb:n + } \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl - \graphics_extract_bb:n {#1} + \int_zero:N \l__graphics_page_int + \tl_clear:N \l__graphics_pagebox_tl + \__graphics_extract_bb:n {#1} } +\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n +\cs_new_eq:NN \__graphics_backend_getbb_bmp:n \__graphics_backend_getbb_jpg:n \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool - \graphics_extract_bb:n {#1} + \tl_clear:N \l__graphics_decodearray_str + \bool_set_false:N \l__graphics_interpolate_bool + \__graphics_extract_bb:n {#1} } \int_new:N \g__graphics_track_int \cs_new_protected:Npn \__graphics_backend_include_eps:n #1 @@ -680,38 +645,41 @@ \__kernel_backend_literal:x { PSfile = #1 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l__graphics_ury_dim } } +\cs_new_eq:NN \__graphics_backend_include_ps:n \__graphics_backend_include_eps:n \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1 { \__graphics_backend_include_auxi:nn {#1} { image } } +\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n \cs_new_eq:NN \__graphics_backend_include_png:n \__graphics_backend_include_jpg:n +\cs_new_eq:NN \__graphics_backend_include_bmp:n \__graphics_backend_include_jpg:n \cs_new_protected:Npn \__graphics_backend_include_pdf:n #1 { \__graphics_backend_include_auxi:nn {#1} { epdf } } \cs_new_protected:Npn \__graphics_backend_include_auxi:nn #1#2 { \__graphics_backend_include_auxii:xnn { - \tl_if_empty:NF \l_graphics_pagebox_tl - { : \l_graphics_pagebox_tl } - \int_compare:nNnT \l_graphics_page_int > 1 - { :P \int_use:N \l_graphics_page_int } - \tl_if_empty:NF \l_graphics_decodearray_tl - { :D \l_graphics_decodearray_tl } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l__graphics_pagebox_tl + { : \l__graphics_pagebox_tl } + \int_compare:nNnT \l__graphics_page_int > 1 + { :P \int_use:N \l__graphics_page_int } + \tl_if_empty:NF \l__graphics_decodearray_str + { :D \l__graphics_decodearray_str } + \bool_if:NT \l__graphics_interpolate_bool { :I } } {#1} {#2} } \cs_new_protected:Npn \__graphics_backend_include_auxii:nnn #1#2#3 { - \int_if_exist:cTF { c__graphics_graphics_ #2#1 _int } + \int_if_exist:cTF { c__graphics_ #2#1 _int } { \__kernel_backend_literal:x - { pdf:usexobj~@graphic \int_use:c { c__graphics_graphics_ #2#1 _int } } + { pdf:usexobj~@graphic \int_use:c { c__graphics_ #2#1 _int } } } { \__graphics_backend_include_auxiii:nnn {#2} {#1} {#3} } } @@ -719,36 +687,38 @@ \cs_new_protected:Npn \__graphics_backend_include_auxiii:nnn #1#2#3 { \int_gincr:N \g__graphics_track_int - \int_const:cn { c__graphics_graphics_ #1#2 _int } { \g__graphics_track_int } + \int_const:cn { c__graphics_ #1#2 _int } { \g__graphics_track_int } \__kernel_backend_literal:x { pdf:#3~ - @graphic \int_use:c { c__graphics_graphics_ #1#2 _int } ~ - \int_compare:nNnT \l_graphics_page_int > 1 - { page ~ \int_use:N \l_graphics_page_int \c_space_tl } - \tl_if_empty:NF \l_graphics_pagebox_tl + @graphic \int_use:c { c__graphics_ #1#2 _int } ~ + \int_compare:nNnT \l__graphics_page_int > 1 + { page ~ \int_use:N \l__graphics_page_int \c_space_tl } + \tl_if_empty:NF \l__graphics_pagebox_tl { - pagebox ~ \l_graphics_pagebox_tl \c_space_tl + pagebox ~ \l__graphics_pagebox_tl \c_space_tl bbox ~ - \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_ury_dim \c_space_tl + \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl + \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl + \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl + \dim_to_decimal_in_bp:n \l__graphics_ury_dim \c_space_tl } (#1) \bool_lazy_or:nnT - { \l_graphics_interpolate_bool } - { ! \tl_if_empty_p:N \l_graphics_decodearray_tl } + { \l__graphics_interpolate_bool } + { ! \tl_if_empty_p:N \l__graphics_decodearray_str } { << - \tl_if_empty:NF \l_graphics_decodearray_tl - { /Decode~[ \l_graphics_decodearray_tl ] } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l__graphics_decodearray_str + { /Decode~[ \l__graphics_decodearray_str ] } + \bool_if:NT \l__graphics_interpolate_bool { /Interpolate~true> } >> } } } +\__graphics_backend_loaded:n + { \cs_new_eq:NN \__graphics_backend_get_pagecount:n \__graphics_get_pagecount:n } %% File: l3backend-pdf.dtx \box_new:N \l__pdf_internal_box \cs_new_protected:Npx \__pdf_backend:n #1 @@ -838,19 +808,13 @@ { \__pdf_backend_link_begin:n {#1#2} } \cs_new_protected:Npx \__pdf_backend_link_begin:n #1 { - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \exp_not:N \int_gincr:N \exp_not:N \g__pdf_backend_link_int - } + \exp_not:N \int_gincr:N \exp_not:N \g__pdf_backend_link_int \__pdf_backend:x { bann ~ - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - @pdf.lnk - \exp_not:N \int_use:N \exp_not:N \g__pdf_backend_link_int - \c_space_tl - } + @pdf.lnk + \exp_not:N \int_use:N \exp_not:N \g__pdf_backend_link_int + \c_space_tl << /Type /Annot #1 @@ -859,14 +823,8 @@ } \cs_new_protected:Npn \__pdf_backend_link_end: { \__pdf_backend:n { eann } } -\cs_new:Npx \__pdf_backend_link_last: - { - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - @pdf.lnk - \exp_not:N \int_use:N \exp_not:N \g__pdf_backend_link_int - } - } +\cs_new:Npn \__pdf_backend_link_last: + { @pdf.lnk \int_use:N \g__pdf_backend_link_int } \cs_new_protected:Npn \__pdf_backend_link_margin:n #1 { \__kernel_backend_literal:x { dvipdfmx:config~g~ \dim_eval:n {#1} } } \cs_new_protected:Npn \__pdf_backend_destination:nn #1#2 @@ -1019,35 +977,6 @@ } } \cs_generate_variant:Nn \__opacity_backend_fill_stroke:nn { xx } -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \__opacity_backend_select_aux:n #1 - { - \tl_set:Nn \l__opacity_backend_fill_tl {#1} - \tl_set:Nn \l__opacity_backend_stroke_tl {#1} - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity #1 } - { << /ca ~ #1 /CA ~ #1 >> } - \__kernel_backend_literal_pdf:n { /opacity #1 ~ gs } - } - \cs_gset_protected:Npn \__opacity_backend_fill_stroke:nn #1#2 - { - \str_if_eq:nnTF {#1} {#2} - { \__opacity_backend_select_aux:n {#1} } - { - \tl_set:Nn \l__opacity_backend_fill_tl {#1} - \tl_set:Nn \l__opacity_backend_stroke_tl {#2} - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity.fill #1 } - { << /ca ~ #1 >> } - \pdfmanagement_add:nnn { Page / Resources / ExtGState } - { opacity.stroke #1 } - { << /CA ~ #2 >> } - \__kernel_backend_literal_pdf:n - { /opacity.fill #1 ~ gs /opacity.stroke #2 ~ gs } - } - } - } %% %% %% End of file `l3backend-dvipdfmx.def'. diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def index b391ee739f1..e63d882e34b 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def @@ -26,7 +26,7 @@ %% %% File: l3backend-basics.dtx \ProvidesExplFile - {l3backend-dvips.def}{2022-02-07}{} + {l3backend-dvips.def}{2022-04-10}{} {L3 backend support: dvips} \cs_if_exist:NTF \__kernel_dependency_version_check:nn { @@ -597,18 +597,38 @@ \__draw_backend_literal:n { @beginspecial } } %% File: l3backend-graphics.dtx -\cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n +\cs_new_protected:Npn \__graphics_backend_loaded:n #1 + { + \cs_if_exist:NTF \hook_gput_code:nnn + { + \hook_gput_code:nnn + { file / l3graphics.sty / after } + { backend } + {#1} + } + {#1} + } +\__graphics_backend_loaded:n + { \seq_set_from_clist:Nn \l_graphics_search_ext_seq { .eps , .ps } } +\__graphics_backend_loaded:n + { + \cs_new_eq:NN \__graphics_backend_getbb_eps:n \__graphics_read_bb:n + \cs_new_eq:NN \__graphics_backend_getbb_ps:n \__graphics_read_bb:n + } \cs_new_protected:Npn \__graphics_backend_include_eps:n #1 { \__kernel_backend_literal:x { PSfile = #1 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l__graphics_ury_dim } } +\cs_new_eq:NN \__graphics_backend_include_ps:n \__graphics_backend_include_eps:n +\__graphics_backend_loaded:n + { \cs_new_eq:NN \__graphics_backend_get_pagecount:n \__graphics_get_pagecount:n } %% File: l3backend-pdf.dtx \box_new:N \l__pdf_internal_box \cs_new_protected:Npn \__pdf_backend_pdfmark:n #1 diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def index b50af595321..61c275d697b 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def @@ -26,7 +26,7 @@ %% %% File: l3backend-basics.dtx \ProvidesExplFile - {l3backend-dvisvgm.def}{2022-02-07}{} + {l3backend-dvisvgm.def}{2022-04-10}{} {L3 backend support: dvisvgm} \cs_if_exist:NTF \__kernel_dependency_version_check:nn { @@ -216,6 +216,8 @@ \cs_new_protected:Npn \__color_backend_stroke_separation:nn #1#2 { } \cs_new_eq:NN \__color_backend_fill_devicen:nn \__color_backend_fill_separation:nn \cs_new_eq:NN \__color_backend_stroke_devicen:nn \__color_backend_stroke_separation:nn +\cs_new_protected:Npn \__color_backend_devicen_init:nnn #1#2#3 { } +\cs_new_protected:Npn \__color_backend_iccbased_init:nnn #1#2#3 { } %% File: l3backend-box.dtx \cs_new_protected:Npn \__box_backend_clip:N #1 { @@ -490,33 +492,52 @@ \__kernel_backend_scope_end: } %% File: l3backend-graphics.dtx -\cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n +\cs_new_protected:Npn \__graphics_backend_loaded:n #1 + { + \cs_if_exist:NTF \hook_gput_code:nnn + { + \hook_gput_code:nnn + { file / l3graphics.sty / after } + { backend } + {#1} + } + {#1} + } +\__graphics_backend_loaded:n + { + \seq_set_from_clist:Nn + \l_graphics_search_ext_seq + { .pdf , .eps , .png , .jpg , .jpeg } + } +\__graphics_backend_loaded:n + { \cs_new_eq:NN \__graphics_backend_getbb_eps:n \__graphics_read_bb:n } \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl - \graphics_extract_bb:n {#1} + \int_zero:N \l__graphics_page_int + \tl_clear:N \l__graphics_pagebox_tl + \__graphics_extract_bb:n {#1} } +\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool - \graphics_extract_bb:n {#1} + \tl_clear:N \l__graphics_decodearray_str + \bool_set_false:N \l__graphics_interpolate_bool + \__graphics_extract_bb:n {#1} } \cs_new_protected:Npn \__graphics_backend_include_eps:n #1 - { __graphics_backend_include:nn { PSfile } {#1} } + { \__graphics_backend_include:nn { PSfile } {#1} } \cs_new_protected:Npn \__graphics_backend_include_pdf:n #1 - { __graphics_backend_include:nn { pdffile } {#1} } + { \__graphics_backend_include:nn { pdffile } {#1} } \cs_new_protected:Npn \__graphics_backend_include:nn #1#2 { \__kernel_backend_literal:x { #1 = #2 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l__graphics_ury_dim } } \cs_new_protected:Npn \__graphics_backend_include_png:n #1 @@ -524,14 +545,17 @@ \__kernel_backend_literal:x { dvisvgm:img~ - \dim_to_decimal:n { \l_graphics_ury_dim } ~ - \dim_to_decimal:n { \l_graphics_ury_dim } ~ + \dim_to_decimal:n { \l__graphics_ury_dim } ~ + \dim_to_decimal:n { \l__graphics_ury_dim } ~ \__graphics_backend_include_bitmap_quote:w #1 " #1 " \s__graphics_stop } } +\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_png:n \cs_new_eq:NN \__graphics_backend_include_jpg:n \__graphics_backend_include_png:n \cs_new:Npn \__graphics_backend_include_bitmap_quote:w #1 " #2 " #3 \s__graphics_stop { " #2 " } +\__graphics_backend_loaded:n + { \cs_new_eq:NN \__graphics_backend_get_pagecount:n \__graphics_get_pagecount:n } %% File: l3backend-pdf.dtx \box_new:N \l__pdf_internal_box \cs_new_protected:Npn \__pdf_backend_catalog_gput:nn #1#2 { } diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def index 9ef6db2e4ef..c98a097818a 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def @@ -26,7 +26,7 @@ %% %% File: l3backend-basics.dtx \ProvidesExplFile - {l3backend-luatex.def}{2022-02-07}{} + {l3backend-luatex.def}{2022-04-10}{} {L3 backend support: PDF output (LuaTeX)} \cs_if_exist:NTF \__kernel_dependency_version_check:nn { @@ -535,72 +535,97 @@ \__kernel_backend_scope_end: } %% File: l3backend-graphics.dtx +\cs_new_protected:Npn \__graphics_backend_loaded:n #1 + { + \cs_if_exist:NTF \hook_gput_code:nnn + { + \hook_gput_code:nnn + { file / l3graphics.sty / after } + { backend } + {#1} + } + {#1} + } +\__graphics_backend_loaded:n + { + \seq_set_from_clist:Nn + \l_graphics_search_ext_seq + { .pdf , .eps , .png , .jpg , .jpeg } + } \tl_new:N \l__graphics_graphics_attr_tl \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl + \int_zero:N \l__graphics_page_int + \tl_clear:N \l__graphics_pagebox_tl \tl_set:Nx \l__graphics_graphics_attr_tl { - \tl_if_empty:NF \l_graphics_decodearray_tl - { :D \l_graphics_decodearray_tl } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l__graphics_decodearray_str + { :D \l__graphics_decodearray_str } + \bool_if:NT \l__graphics_interpolate_bool { :I } } \tl_clear:N \l__graphics_graphics_attr_tl \__graphics_backend_getbb_auxi:n {#1} } +\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool + \tl_clear:N \l__graphics_decodearray_str + \bool_set_false:N \l__graphics_interpolate_bool \tl_set:Nx \l__graphics_graphics_attr_tl { - : \l_graphics_pagebox_tl - \int_compare:nNnT \l_graphics_page_int > 1 - { :P \int_use:N \l_graphics_page_int } + : \l__graphics_pagebox_tl + \int_compare:nNnT \l__graphics_page_int > 1 + { :P \int_use:N \l__graphics_page_int } } \__graphics_backend_getbb_auxi:n {#1} } \cs_new_protected:Npn \__graphics_backend_getbb_auxi:n #1 { - \graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl } + \__graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl } { \__graphics_backend_getbb_auxii:n {#1} } } \cs_new_protected:Npn \__graphics_backend_getbb_auxii:n #1 { + \exp_args:Ne \__graphics_backend_getbb_auxiii:n + { \__graphics_backend_dequote:w #1 " #1 " \s__graphics_stop } + \int_const:cn { c__graphics_ #1 \l__graphics_graphics_attr_tl _int } + { \tex_the:D \tex_pdflastximage:D } + \__graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl } + } +\cs_new_protected:Npn \__graphics_backend_getbb_auxiii:n #1 + { \tex_immediate:D \tex_pdfximage:D \bool_lazy_or:nnT - { \l_graphics_interpolate_bool } - { ! \tl_if_empty_p:N \l_graphics_decodearray_tl } + { \l__graphics_interpolate_bool } + { ! \tl_if_empty_p:N \l__graphics_decodearray_str } { attr ~ { - \tl_if_empty:NF \l_graphics_decodearray_tl - { /Decode~[ \l_graphics_decodearray_tl ] } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l__graphics_decodearray_str + { /Decode~[ \l__graphics_decodearray_str ] } + \bool_if:NT \l__graphics_interpolate_bool { /Interpolate~true } } } - \int_compare:nNnT \l_graphics_page_int > 0 - { page ~ \int_use:N \l_graphics_page_int } - \tl_if_empty:NF \l_graphics_pagebox_tl - { \l_graphics_pagebox_tl } + \int_compare:nNnT \l__graphics_page_int > 0 + { page ~ \int_use:N \l__graphics_page_int } + \tl_if_empty:NF \l__graphics_pagebox_tl + { \l__graphics_pagebox_tl } {#1} \hbox_set:Nn \l__graphics_internal_box { \tex_pdfrefximage:D \tex_pdflastximage:D } - \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l__graphics_internal_box } - \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l__graphics_internal_box } - \int_const:cn { c__graphics_graphics_ #1 \l__graphics_graphics_attr_tl _int } - { \tex_the:D \tex_pdflastximage:D } - \graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl } + \dim_set:Nn \l__graphics_urx_dim { \box_wd:N \l__graphics_internal_box } + \dim_set:Nn \l__graphics_ury_dim { \box_ht:N \l__graphics_internal_box } } +\cs_new:Npn \__graphics_backend_dequote:w #1 " #2 " #3 \s__graphics_stop {#2} \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1 { \tex_pdfrefximage:D - \int_use:c { c__graphics_graphics_ #1 \l__graphics_graphics_attr_tl _int } + \int_use:c { c__graphics_ #1 \l__graphics_graphics_attr_tl _int } } +\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n \cs_new_eq:NN \__graphics_backend_include_pdf:n \__graphics_backend_include_jpg:n \cs_new_eq:NN \__graphics_backend_include_png:n \__graphics_backend_include_jpg:n \sys_if_shell:T @@ -616,8 +641,12 @@ \l__graphics_backend_ext_str \exp_args:Nx \__graphics_backend_getbb_eps:nn { - \l__graphics_backend_name_str - \str_tail:N \l__graphics_backend_ext_str - -converted-to.pdf + \exp_args:Ne \__kernel_file_name_quote:n + { + \l__graphics_backend_name_str + - \str_tail:N \l__graphics_backend_ext_str + -converted-to.pdf + } } {#1} } @@ -628,7 +657,7 @@ \sys_shell_now:n { repstopdf ~ #2 ~ #1 } } - \tl_set:Nn \l_graphics_name_tl {#1} + \tl_set:Nn \l__graphics_final_name_str {#1} \__graphics_backend_getbb_pdf:n {#1} } \cs_new_protected:Npn \__graphics_backend_include_eps:n #1 @@ -637,11 +666,21 @@ \l__graphics_backend_dir_str \l__graphics_backend_name_str \l__graphics_backend_ext_str \exp_args:Nx \__graphics_backend_include_pdf:n { - \l__graphics_backend_name_str - \str_tail:N \l__graphics_backend_ext_str - -converted-to.pdf + \exp_args:Ne \__kernel_file_name_quote:n + { + \l__graphics_backend_name_str + - \str_tail:N \l__graphics_backend_ext_str + -converted-to.pdf + } } } } +\cs_new_protected:Npn \__graphics_backend_get_pagecount:n #1 + { + \tex_immediate:D \tex_pdfximage:D {#1} + \int_const:cn { c__graphics_ #1 _pages_int } + { \int_use:N \tex_pdflastximagepages:D } + } %% File: l3backend-pdf.dtx \box_new:N \l__pdf_internal_box \cs_new_protected:Npn \__pdf_backend_annotation:nnnn #1#2#3#4 diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def index 15552593892..17d944aeb09 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def @@ -26,7 +26,7 @@ %% %% File: l3backend-basics.dtx \ProvidesExplFile - {l3backend-pdftex.def}{2022-02-07}{} + {l3backend-pdftex.def}{2022-04-10}{} {L3 backend support: PDF output (pdfTeX)} \cs_if_exist:NTF \__kernel_dependency_version_check:nn { @@ -535,72 +535,97 @@ \__kernel_backend_scope_end: } %% File: l3backend-graphics.dtx +\cs_new_protected:Npn \__graphics_backend_loaded:n #1 + { + \cs_if_exist:NTF \hook_gput_code:nnn + { + \hook_gput_code:nnn + { file / l3graphics.sty / after } + { backend } + {#1} + } + {#1} + } +\__graphics_backend_loaded:n + { + \seq_set_from_clist:Nn + \l_graphics_search_ext_seq + { .pdf , .eps , .png , .jpg , .jpeg } + } \tl_new:N \l__graphics_graphics_attr_tl \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl + \int_zero:N \l__graphics_page_int + \tl_clear:N \l__graphics_pagebox_tl \tl_set:Nx \l__graphics_graphics_attr_tl { - \tl_if_empty:NF \l_graphics_decodearray_tl - { :D \l_graphics_decodearray_tl } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l__graphics_decodearray_str + { :D \l__graphics_decodearray_str } + \bool_if:NT \l__graphics_interpolate_bool { :I } } \tl_clear:N \l__graphics_graphics_attr_tl \__graphics_backend_getbb_auxi:n {#1} } +\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool + \tl_clear:N \l__graphics_decodearray_str + \bool_set_false:N \l__graphics_interpolate_bool \tl_set:Nx \l__graphics_graphics_attr_tl { - : \l_graphics_pagebox_tl - \int_compare:nNnT \l_graphics_page_int > 1 - { :P \int_use:N \l_graphics_page_int } + : \l__graphics_pagebox_tl + \int_compare:nNnT \l__graphics_page_int > 1 + { :P \int_use:N \l__graphics_page_int } } \__graphics_backend_getbb_auxi:n {#1} } \cs_new_protected:Npn \__graphics_backend_getbb_auxi:n #1 { - \graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl } + \__graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl } { \__graphics_backend_getbb_auxii:n {#1} } } \cs_new_protected:Npn \__graphics_backend_getbb_auxii:n #1 { + \exp_args:Ne \__graphics_backend_getbb_auxiii:n + { \__graphics_backend_dequote:w #1 " #1 " \s__graphics_stop } + \int_const:cn { c__graphics_ #1 \l__graphics_graphics_attr_tl _int } + { \tex_the:D \tex_pdflastximage:D } + \__graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl } + } +\cs_new_protected:Npn \__graphics_backend_getbb_auxiii:n #1 + { \tex_immediate:D \tex_pdfximage:D \bool_lazy_or:nnT - { \l_graphics_interpolate_bool } - { ! \tl_if_empty_p:N \l_graphics_decodearray_tl } + { \l__graphics_interpolate_bool } + { ! \tl_if_empty_p:N \l__graphics_decodearray_str } { attr ~ { - \tl_if_empty:NF \l_graphics_decodearray_tl - { /Decode~[ \l_graphics_decodearray_tl ] } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l__graphics_decodearray_str + { /Decode~[ \l__graphics_decodearray_str ] } + \bool_if:NT \l__graphics_interpolate_bool { /Interpolate~true } } } - \int_compare:nNnT \l_graphics_page_int > 0 - { page ~ \int_use:N \l_graphics_page_int } - \tl_if_empty:NF \l_graphics_pagebox_tl - { \l_graphics_pagebox_tl } + \int_compare:nNnT \l__graphics_page_int > 0 + { page ~ \int_use:N \l__graphics_page_int } + \tl_if_empty:NF \l__graphics_pagebox_tl + { \l__graphics_pagebox_tl } {#1} \hbox_set:Nn \l__graphics_internal_box { \tex_pdfrefximage:D \tex_pdflastximage:D } - \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l__graphics_internal_box } - \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l__graphics_internal_box } - \int_const:cn { c__graphics_graphics_ #1 \l__graphics_graphics_attr_tl _int } - { \tex_the:D \tex_pdflastximage:D } - \graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl } + \dim_set:Nn \l__graphics_urx_dim { \box_wd:N \l__graphics_internal_box } + \dim_set:Nn \l__graphics_ury_dim { \box_ht:N \l__graphics_internal_box } } +\cs_new:Npn \__graphics_backend_dequote:w #1 " #2 " #3 \s__graphics_stop {#2} \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1 { \tex_pdfrefximage:D - \int_use:c { c__graphics_graphics_ #1 \l__graphics_graphics_attr_tl _int } + \int_use:c { c__graphics_ #1 \l__graphics_graphics_attr_tl _int } } +\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n \cs_new_eq:NN \__graphics_backend_include_pdf:n \__graphics_backend_include_jpg:n \cs_new_eq:NN \__graphics_backend_include_png:n \__graphics_backend_include_jpg:n \sys_if_shell:T @@ -616,8 +641,12 @@ \l__graphics_backend_ext_str \exp_args:Nx \__graphics_backend_getbb_eps:nn { - \l__graphics_backend_name_str - \str_tail:N \l__graphics_backend_ext_str - -converted-to.pdf + \exp_args:Ne \__kernel_file_name_quote:n + { + \l__graphics_backend_name_str + - \str_tail:N \l__graphics_backend_ext_str + -converted-to.pdf + } } {#1} } @@ -628,7 +657,7 @@ \sys_shell_now:n { repstopdf ~ #2 ~ #1 } } - \tl_set:Nn \l_graphics_name_tl {#1} + \tl_set:Nn \l__graphics_final_name_str {#1} \__graphics_backend_getbb_pdf:n {#1} } \cs_new_protected:Npn \__graphics_backend_include_eps:n #1 @@ -637,11 +666,21 @@ \l__graphics_backend_dir_str \l__graphics_backend_name_str \l__graphics_backend_ext_str \exp_args:Nx \__graphics_backend_include_pdf:n { - \l__graphics_backend_name_str - \str_tail:N \l__graphics_backend_ext_str - -converted-to.pdf + \exp_args:Ne \__kernel_file_name_quote:n + { + \l__graphics_backend_name_str + - \str_tail:N \l__graphics_backend_ext_str + -converted-to.pdf + } } } } +\cs_new_protected:Npn \__graphics_backend_get_pagecount:n #1 + { + \tex_immediate:D \tex_pdfximage:D {#1} + \int_const:cn { c__graphics_ #1 _pages_int } + { \int_use:N \tex_pdflastximagepages:D } + } %% File: l3backend-pdf.dtx \box_new:N \l__pdf_internal_box \cs_new_protected:Npn \__pdf_backend_annotation:nnnn #1#2#3#4 diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def index d6de9539313..dd69cc589db 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def @@ -26,7 +26,7 @@ %% %% File: l3backend-basics.dtx \ProvidesExplFile - {l3backend-xetex.def}{2022-02-07}{} + {l3backend-xetex.def}{2022-04-10}{} {L3 backend support: XeTeX} \cs_if_exist:NTF \__kernel_dependency_version_check:nn { @@ -65,20 +65,6 @@ { \__kernel_backend_literal:n { x:gsave } } \cs_new_protected:Npn \__kernel_backend_scope_end: { \__kernel_backend_literal:n { x:grestore } } -\group_begin: - \cs_set:Npn \__sys_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2} - \sys_get_shell:nnNTF { extractbb~--version } - { \char_set_catcode_space:n { `\ } } - \l__sys_internal_tl - { - \int_const:Nn \c__kernel_sys_dvipdfmx_version_int - { - \exp_after:wN \__sys_tmp:w \l__sys_internal_tl - \q_stop - } - } - { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } } -\group_end: %% File: l3backend-color.dtx \cs_new_protected:Npn \__color_backend_pickup:N #1 { } \cs_if_exist:cT { ver@color.sty } @@ -102,71 +88,64 @@ { \tl_set:Nn #3 { {#1} {#2} } } } \int_new:N \l__color_backend_stack_int -\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } } +\int_new:N \g__color_backend_stack_int +\cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3 { - \int_new:N \g__color_backend_stack_int - \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3 + \int_gincr:N \exp_not:N \g__color_backend_stack_int + \int_const:Nn #1 { \exp_not:N \g__color_backend_stack_int } + \use:x { - \int_gincr:N \exp_not:N \g__color_backend_stack_int - \int_const:Nn #1 { \exp_not:N \g__color_backend_stack_int } - \use:x + \__kernel_backend_first_shipout:n { - \__kernel_backend_first_shipout:n + \__kernel_backend_literal:n { - \__kernel_backend_literal:n - { - pdfcolorstackinit ~ - \exp_not:N \int_use:N \exp_not:N \g__color_backend_stack_int - \c_space_tl - \exp_not:N \tl_if_blank:nF {#2} { #2 ~ } - (#3) - } + pdfcolorstackinit ~ + \exp_not:N \int_use:N \exp_not:N \g__color_backend_stack_int + \c_space_tl + \exp_not:N \tl_if_blank:nF {#2} { #2 ~ } + (#3) } - } - } - \cs_if_exist:cTF { main@pdfcolorstack } - { - \int_set:Nn \l__color_backend_stack_int - { \int_use:c { main@pdfcolorstack } } + } } + } +\cs_if_exist:cTF { main@pdfcolorstack } + { + \int_set:Nn \l__color_backend_stack_int + { \int_use:c { main@pdfcolorstack } } + } + { + \__kernel_color_backend_stack_init:Nnn \c__color_backend_main_stack_int + { page ~ direct } { 0 ~ g ~ 0 ~ G } + \int_set_eq:NN \l__color_backend_stack_int + \c__color_backend_main_stack_int + \int_const:cn { main@pdfcolorstack } { \c__color_backend_main_stack_int } + } +\cs_gset_protected:Npn \__kernel_backend_scope_end: + { + \__kernel_backend_literal:n { x:grestore } + \__kernel_backend_literal:x { - \__kernel_color_backend_stack_init:Nnn \c__color_backend_main_stack_int - { page ~ direct } { 0 ~ g ~ 0 ~ G } - \int_set_eq:NN \l__color_backend_stack_int - \c__color_backend_main_stack_int - \int_const:cn { main@pdfcolorstack } { \c__color_backend_main_stack_int } + pdfcolorstack ~ + \int_use:N \g__color_backend_stack_int \c_space_tl current } - \cs_gset_protected:Npn \__kernel_backend_scope_end: + } +\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2 + { + \__kernel_backend_literal:x { - \__kernel_backend_literal:n { x:grestore } - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_use:N \g__color_backend_stack_int \c_space_tl current - } + pdfcolorstack ~ + \int_eval:n {#1} ~ + push ~ (#2) } } -\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } +\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx } +\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1 { - \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2 + \__kernel_backend_literal:x { - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_eval:n {#1} ~ - push ~ (#2) - } - } - \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx } - \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1 - { - \__kernel_backend_literal:x - { - pdfcolorstack ~ - \int_eval:n {#1} ~ - pop - } + pdfcolorstack ~ + \int_eval:n {#1} ~ + pop } } \tl_new:N \l__color_backend_fill_tl @@ -185,15 +164,6 @@ } \cs_new_protected:Npn \__color_backend_reset: { \__kernel_color_backend_stack_pop:n \l__color_backend_stack_int } -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \__color_backend_select_cmyk:n #1 - { \__kernel_backend_literal:n { pdf: bc ~ [#1] } } - \cs_gset_eq:NN \__color_backend_select_gray:n \__color_backend_select_cmyk:n - \cs_gset_eq:NN \__color_backend_select_rgb:n \__color_backend_select_cmyk:n - \cs_gset_protected:Npn \__color_backend_reset: - { \__kernel_backend_literal:n { pdf: ec } } - } \prop_new:N \g__color_backend_colorant_prop \cs_new:Npx \__color_backend_devicen_colorants:n #1 { @@ -380,12 +350,6 @@ } } } -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \__color_backend_select_separation:nn #1#2 { } - \cs_gset_eq:NN \__color_backend_select_devicen:nn - \__color_backend_select_separation:nn - } \cs_new_protected:Npn \__color_backend_fill_cmyk:n #1 { \__color_backend_fill:n { #1 ~ k } } \cs_new_protected:Npn \__color_backend_fill_gray:n #1 @@ -418,27 +382,6 @@ { \__color_backend_stroke:n { /#1 ~ CS ~ #2 ~ SCN } } \cs_new_eq:NN \__color_backend_fill_devicen:nn \__color_backend_fill_separation:nn \cs_new_eq:NN \__color_backend_stroke_devicen:nn \__color_backend_stroke_separation:nn -\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \cs_gset_protected:Npn \__color_backend_fill_cmyk:n #1 - { - \__kernel_backend_literal:n { pdf: bc ~ [#1] } - \group_insert_after:N \__color_backend_reset: - } - \cs_gset_eq:NN \__color_backend_fill_gray:n \__color_backend_fill_cmyk:n - \cs_gset_eq:NN \__color_backend_fill_rgb:n \__color_backend_fill_cmyk:n - \cs_gset_protected:Npn \__color_backend_reset: - { \__kernel_backend_literal:n { pdf: ec } } - \cs_gset_protected:Npn \__color_backend_stroke:n #1 - { \__kernel_backend_literal:n {#1} } - \cs_gset_protected:Npn \__color_backend_fill_separation:nn #1#2 { } - \cs_gset_eq:NN \__color_backend_fill_devicen:nn - \__color_backend_fill_separation:nn - \cs_gset_eq:NN \__color_backend_stroke_separation:nn - \__color_backend_fill_separation:nn - \cs_gset_eq:NN \__color_backend_stroke_devicen:nn - \__color_backend_stroke_separation:nn - } %% File: l3backend-box.dtx \cs_new_protected:Npn \__box_backend_clip:N #1 { @@ -660,43 +603,66 @@ \__kernel_backend_scope_end: } %% File: l3backend-graphics.dtx -\cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n +\cs_new_protected:Npn \__graphics_backend_loaded:n #1 + { + \cs_if_exist:NTF \hook_gput_code:nnn + { + \hook_gput_code:nnn + { file / l3graphics.sty / after } + { backend } + {#1} + } + {#1} + } +\__graphics_backend_loaded:n + { + \seq_set_from_clist:Nn \l_graphics_search_ext_seq + { .pdf , .eps , .ps , .png , .jpg ., jpeg , .bmp } + } +\__graphics_backend_loaded:n + { + \cs_new_eq:NN \__graphics_backend_getbb_eps:n \__graphics_read_bb:n + \cs_new_eq:NN \__graphics_backend_getbb_ps:n \__graphics_read_bb:n + } \int_new:N \g__graphics_track_int \cs_new_protected:Npn \__graphics_backend_include_eps:n #1 { \__kernel_backend_literal:x { PSfile = #1 \c_space_tl - llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + llx = \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l__graphics_ury_dim } } +\cs_new_eq:NN \__graphics_backend_include_ps:n \__graphics_backend_include_eps:n \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1 { \__graphics_backend_include_auxi:nn {#1} { image } } +\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n \cs_new_eq:NN \__graphics_backend_include_png:n \__graphics_backend_include_jpg:n +\cs_new_eq:NN \__graphics_backend_include_bmp:n \__graphics_backend_include_jpg:n \cs_new_protected:Npn \__graphics_backend_include_auxi:nn #1#2 { \__graphics_backend_include_auxii:xnn { - \tl_if_empty:NF \l_graphics_pagebox_tl - { : \l_graphics_pagebox_tl } - \int_compare:nNnT \l_graphics_page_int > 1 - { :P \int_use:N \l_graphics_page_int } - \tl_if_empty:NF \l_graphics_decodearray_tl - { :D \l_graphics_decodearray_tl } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l__graphics_pagebox_tl + { : \l__graphics_pagebox_tl } + \int_compare:nNnT \l__graphics_page_int > 1 + { :P \int_use:N \l__graphics_page_int } + \tl_if_empty:NF \l__graphics_decodearray_str + { :D \l__graphics_decodearray_str } + \bool_if:NT \l__graphics_interpolate_bool { :I } } {#1} {#2} } \cs_new_protected:Npn \__graphics_backend_include_auxii:nnn #1#2#3 { - \int_if_exist:cTF { c__graphics_graphics_ #2#1 _int } + \int_if_exist:cTF { c__graphics_ #2#1 _int } { \__kernel_backend_literal:x - { pdf:usexobj~@graphic \int_use:c { c__graphics_graphics_ #2#1 _int } } + { pdf:usexobj~@graphic \int_use:c { c__graphics_ #2#1 _int } } } { \__graphics_backend_include_auxiii:nnn {#2} {#1} {#3} } } @@ -704,31 +670,31 @@ \cs_new_protected:Npn \__graphics_backend_include_auxiii:nnn #1#2#3 { \int_gincr:N \g__graphics_track_int - \int_const:cn { c__graphics_graphics_ #1#2 _int } { \g__graphics_track_int } + \int_const:cn { c__graphics_ #1#2 _int } { \g__graphics_track_int } \__kernel_backend_literal:x { pdf:#3~ - @graphic \int_use:c { c__graphics_graphics_ #1#2 _int } ~ - \int_compare:nNnT \l_graphics_page_int > 1 - { page ~ \int_use:N \l_graphics_page_int \c_space_tl } - \tl_if_empty:NF \l_graphics_pagebox_tl + @graphic \int_use:c { c__graphics_ #1#2 _int } ~ + \int_compare:nNnT \l__graphics_page_int > 1 + { page ~ \int_use:N \l__graphics_page_int \c_space_tl } + \tl_if_empty:NF \l__graphics_pagebox_tl { - pagebox ~ \l_graphics_pagebox_tl \c_space_tl + pagebox ~ \l__graphics_pagebox_tl \c_space_tl bbox ~ - \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl - \dim_to_decimal_in_bp:n \l_graphics_ury_dim \c_space_tl + \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl + \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl + \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl + \dim_to_decimal_in_bp:n \l__graphics_ury_dim \c_space_tl } (#1) \bool_lazy_or:nnT - { \l_graphics_interpolate_bool } - { ! \tl_if_empty_p:N \l_graphics_decodearray_tl } + { \l__graphics_interpolate_bool } + { ! \tl_if_empty_p:N \l__graphics_decodearray_str } { << - \tl_if_empty:NF \l_graphics_decodearray_tl - { /Decode~[ \l_graphics_decodearray_tl ] } - \bool_if:NT \l_graphics_interpolate_bool + \tl_if_empty:NF \l__graphics_decodearray_str + { /Decode~[ \l__graphics_decodearray_str ] } + \bool_if:NT \l__graphics_interpolate_bool { /Interpolate~true> } >> } @@ -736,21 +702,23 @@ } \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1 { - \int_zero:N \l_graphics_page_int - \tl_clear:N \l_graphics_pagebox_tl + \int_zero:N \l__graphics_page_int + \tl_clear:N \l__graphics_pagebox_tl \__graphics_backend_getbb_auxi:nN {#1} \tex_XeTeXpicfile:D } +\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n +\cs_new_eq:NN \__graphics_backend_getbb_bmp:n \__graphics_backend_getbb_jpg:n \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1 { - \tl_clear:N \l_graphics_decodearray_tl - \bool_set_false:N \l_graphics_interpolate_bool + \tl_clear:N \l__graphics_decodearray_str + \bool_set_false:N \l__graphics_interpolate_bool \__graphics_backend_getbb_auxi:nN {#1} \tex_XeTeXpdffile:D } \cs_new_protected:Npn \__graphics_backend_getbb_auxi:nN #1#2 { - \int_compare:nNnTF \l_graphics_page_int > 1 - { \__graphics_backend_getbb_auxii:VnN \l_graphics_page_int {#1} #2 } + \int_compare:nNnTF \l__graphics_page_int > 1 + { \__graphics_backend_getbb_auxii:VnN \l__graphics_page_int {#1} #2 } { \__graphics_backend_getbb_auxiii:nNnn {#1} #2 { :P 1 } { page 1 } } } \cs_new_protected:Npn \__graphics_backend_getbb_auxii:nnN #1#2#3 @@ -758,8 +726,8 @@ \cs_generate_variant:Nn \__graphics_backend_getbb_auxii:nnN { V } \cs_new_protected:Npn \__graphics_backend_getbb_auxiii:nNnn #1#2#3#4 { - \tl_if_empty:NTF \l_graphics_pagebox_tl - { \__graphics_backend_getbb_auxiv:VnNnn \l_graphics_pagebox_tl } + \tl_if_empty:NTF \l__graphics_pagebox_tl + { \__graphics_backend_getbb_auxiv:VnNnn \l__graphics_pagebox_tl } { \__graphics_backend_getbb_auxv:nNnn } {#1} #2 {#3} {#4} } @@ -768,33 +736,43 @@ \use:x { \__graphics_backend_getbb_auxv:nNnn {#2} #3 { : #1 #4 } - { #5 ~ \__graphics_backend_getbb_pagebox:w #1 } + { + #5 + \tl_if_blank:nF {#1} + { \c_space_tl \__graphics_backend_getbb_pagebox:w #1 } + } } } \cs_generate_variant:Nn \__graphics_backend_getbb_auxiv:nnNnn { V } \cs_new_protected:Npn \__graphics_backend_getbb_auxv:nNnn #1#2#3#4 { - \graphics_bb_restore:nF {#1#3} + \__graphics_bb_restore:nF {#1#3} { \__graphics_backend_getbb_auxvi:nNnn {#1} #2 {#3} {#4} } } \cs_new_protected:Npn \__graphics_backend_getbb_auxvi:nNnn #1#2#3#4 { \hbox_set:Nn \l__graphics_internal_box { #2 #1 ~ #4 } - \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l__graphics_internal_box } - \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l__graphics_internal_box } - \graphics_bb_save:n {#1#3} + \dim_set:Nn \l__graphics_urx_dim { \box_wd:N \l__graphics_internal_box } + \dim_set:Nn \l__graphics_ury_dim { \box_ht:N \l__graphics_internal_box } + \__graphics_bb_save:n {#1#3} } \cs_new:Npn \__graphics_backend_getbb_pagebox:w #1 box {#1} \cs_new_protected:Npn \__graphics_backend_include_pdf:n #1 { - \tex_XeTeXpdffile:D - \__graphics_backend_include_pdf_quote:w #1 "#1" \s__graphics_stop \c_space_tl - \int_compare:nNnT \l_graphics_page_int > 0 - { page ~ \int_use:N \l_graphics_page_int \c_space_tl } - \exp_after:wN \__graphics_backend_getbb_pagebox:w \l_graphics_pagebox_tl + \tex_XeTeXpdffile:D #1 ~ + \int_compare:nNnT \l__graphics_page_int > 0 + { page ~ \int_use:N \l__graphics_page_int \c_space_tl } + \exp_after:wN \__graphics_backend_getbb_pagebox:w \l__graphics_pagebox_tl + } +\cs_new_protected:Npn \__graphics_backend_get_pagecount:n #1 + { + \int_const:cn { c__graphics_ #1 _pages_int } + { + \int_max:nn + { \int_use:N \tex_XeTeXpdfpagecount:D #1 ~ } + { 1 } + } } -\cs_new:Npn \__graphics_backend_include_pdf_quote:w #1 " #2 " #3 \s__graphics_stop - { " #2 " } %% File: l3backend-pdf.dtx \box_new:N \l__pdf_internal_box \cs_new_protected:Npx \__pdf_backend:n #1 @@ -884,19 +862,13 @@ { \__pdf_backend_link_begin:n {#1#2} } \cs_new_protected:Npx \__pdf_backend_link_begin:n #1 { - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - \exp_not:N \int_gincr:N \exp_not:N \g__pdf_backend_link_int - } + \exp_not:N \int_gincr:N \exp_not:N \g__pdf_backend_link_int \__pdf_backend:x { bann ~ - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - @pdf.lnk - \exp_not:N \int_use:N \exp_not:N \g__pdf_backend_link_int - \c_space_tl - } + @pdf.lnk + \exp_not:N \int_use:N \exp_not:N \g__pdf_backend_link_int + \c_space_tl << /Type /Annot #1 @@ -905,14 +877,8 @@ } \cs_new_protected:Npn \__pdf_backend_link_end: { \__pdf_backend:n { eann } } -\cs_new:Npx \__pdf_backend_link_last: - { - \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 } - { - @pdf.lnk - \exp_not:N \int_use:N \exp_not:N \g__pdf_backend_link_int - } - } +\cs_new:Npn \__pdf_backend_link_last: + { @pdf.lnk \int_use:N \g__pdf_backend_link_int } \cs_new_protected:Npn \__pdf_backend_link_margin:n #1 { \__kernel_backend_literal:x { dvipdfmx:config~g~ \dim_eval:n {#1} } } \cs_new_protected:Npn \__pdf_backend_destination:nn #1#2 diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty b/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty index 7b54fcc0c1f..4c7b9e96214 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty @@ -20,7 +20,7 @@ %% %% File: l3benchmark.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3benchmark}{2022-02-05}{} +\ProvidesExplPackage{l3benchmark}{2022-04-10}{} {L3 Experimental benchmarking} \fp_new:N \g_benchmark_duration_target_fp \fp_gset:Nn \g_benchmark_duration_target_fp { 1 } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty b/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty index 4432b33d208..4fa73bedaa7 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: l3bitset.dtx -\ProvidesExplPackage{l3bitset}{2022-02-05}{} +\ProvidesExplPackage{l3bitset}{2022-04-10}{} {L3 Experimental bitset support} \cs_new_protected:Npn \bitset_new:N #1 { diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty b/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty index fbfe2908518..58e1769f88d 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty @@ -28,7 +28,7 @@ %% %% File: l3draw.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3draw}{2022-02-05}{} +\ProvidesExplPackage{l3draw}{2022-04-10}{} {L3 Experimental core drawing support} \scan_new:N \s__draw_mark \scan_new:N \s__draw_stop diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty b/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty index a052de7518d..3b4f473f480 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty @@ -20,54 +20,71 @@ %% %% File: l3graphics.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3graphics}{2022-02-05}{} +\ProvidesExplPackage{l3graphics}{2022-04-10}{} {L3 Experimental graphics inclusion support} -\ior_new:N \l__graphics_tmp_ior -\tl_new:N \l__graphics_tmp_tl +\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_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 -\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 +\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:Nx \l__graphics_pagebox_tl + { \tl_use:N \l_keys_choice_tl box } + } , + pagebox .initial:n = + crop , + page .int_set:N = + \l__graphics_page_int , + 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 } + \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 { x } -\cs_new_protected:Npn \graphics_bb_restore:nF #1#2 +\cs_generate_variant:Nn \__graphics_bb_save:n { x } +\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_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_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 } + { \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 { x } -\cs_new_protected:Npn \graphics_extract_bb:n #1 +\cs_generate_variant:Nn \__graphics_bb_restore:nF { x } +\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} } + \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 @@ -75,9 +92,9 @@ \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 + \tl_if_empty:NTF \l__graphics_pagebox_tl { \__graphics_extract_bb_auxiv:nnn } - { \__graphics_extract_bb_auxiii:Vnnn \l_graphics_pagebox_tl } + { \__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 @@ -86,42 +103,34 @@ \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_tmp_ior { extractbb~#3-O~#1 } } + { \ior_shell_open:Nn \l__graphics_internal_ior { extractbb~#3-O~#1 } } { pipe-failed } } -\cs_new_protected:Npn \graphics_read_bb:n #1 +\cs_new_protected:Npn \__graphics_read_bb:n #1 { \__graphics_read_bb_auxi:nnnn {#1} { } - { \ior_open:Nn \l__graphics_tmp_ior {#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_bb_restore:nF {#1#2} { \__graphics_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} } } \cs_new_protected:Npx \__graphics_read_bb_auxii:nnnn #1#2#3#4 { #1 - \exp_not:N \ior_if_eof:NTF \exp_not:N \l__graphics_tmp_ior + \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_tmp_ior + \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} } - \exp_not:n - { - \ior_close:N \l__graphics_tmp_ior - \dim_compare:nNnF \l_graphics_llx_dim = { 0pt } - { \dim_const:cn { c__graphics_ #3#4 _llx_dim } { \l_graphics_llx_dim } } - \dim_compare:nNnF \l_graphics_lly_dim = { 0pt } - { \dim_const:cn { c__graphics_ #3#4 _lly_dim } { \l_graphics_lly_dim } } - \dim_const:cn { c__graphics_ #3#4 _urx_dim } { \l_graphics_urx_dim } - \dim_const:cn { c__graphics_ #3#4 _ury_dim } { \l_graphics_ury_dim } - } + \ior_close:N \exp_not:N \l__graphics_internal_ior } \use:x { @@ -138,26 +147,25 @@ { \str_if_eq:nnF {#2} { atend } { - \tl_set_rescan:Nnx \l__graphics_tmp_tl + \tl_set_rescan:Nnx \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_tmp_tl \s__graphics_stop + \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 } + \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: } -\bool_new:N \l_graphics_draft_bool -\tl_new:N \l_graphics_name_tl -\tl_new:N \l__graphics_name_tl +\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 @@ -167,50 +175,34 @@ \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:n #1 +\cs_new_protected:Npn \graphics_include:nn #1#2 { \group_begin: + \keys_set:nn { graphics } {#1} \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq - \file_get_full_name:nNTF {#1} \l__graphics_name_tl + \file_get_full_name:nNTF {#2} \l__graphics_full_name_str { - \str_if_eq:eeTF { \l__graphics_name_tl } { #1 .tex } - { \__graphics_include_search:n {#1} } + \str_if_eq:eeTF { \l__graphics_full_name_str } { #2 .tex } + { \msg_error:nnn { graphics } { graphic-not-found } {#2} } { \__graphics_include: } } - { \__graphics_include_search:n {#1} } + { \msg_error:nnn { graphics } { graphic-not-found } {#2} } \group_end: } -\cs_new_protected:Npn \__graphics_include_search:n #1 - { - \seq_map_inline:Nn \l_graphics_search_ext_seq - { - \file_get_full_name:nNT { #1 . ##1 } \l__graphics_name_tl - { \seq_map_break:n { \use_i:nnn \__graphics_include: } } - } - \use:n - { \msg_error:nnn { graphics } { graphic-not-found } {#1} } - } +\cs_generate_variant:Nn \graphics_include:nn { nV } \cs_new_protected:Npn \__graphics_include: { - \file_parse_full_name:VNNN \l__graphics_name_tl - \l__graphics_dir_str \l__graphics_name_str \l__graphics_ext_str - \exp_args:Ne \__graphics_include_auxi:n + \str_if_empty:NTF \l__graphics_type_str { - \exp_args:Ne \str_tail:n - { \str_foldcase:V \l__graphics_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__graphics_name_tl - { - \exp_args:Ne \__graphics_include_auxi:n - { \str_foldcase:n {#1} } - } - { \msg_error:nnn { graphics } { graphic-not-found } {#1} } - \group_end: + \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_foldcase:V \l__graphics_ext_str } + } + } + { \__graphics_include_auxi:e { \l__graphics_type_str } } } \cs_new_protected:Npn \__graphics_include_auxi:n #1 { @@ -218,18 +210,21 @@ { \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_name_tl \l__graphics_name_tl + \tl_set_eq:NN \l__graphics_final_name_str \l__graphics_full_name_str + \str_set:Nx \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_name_tl - \seq_gput_right:NV \g__graphics_record_seq \l_graphics_name_tl + \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_name_tl } - \bool_if:NTF \l_graphics_draft_bool + { \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} @@ -238,21 +233,21 @@ } \cs_new_protected:Npn \__graphics_include_auxiii:n #1 { - \hbox_to_wd:nn { \l_graphics_urx_dim - \l_graphics_llx_dim } + \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 } + { \l__graphics_ury_dim - \l__graphics_lly_dim } { \tex_hrule:D width - \dim_eval:n { \l_graphics_urx_dim - \l_graphics_llx_dim } + \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 } + { \l__graphics_urx_dim - \l__graphics_llx_dim } { \ttfamily - \tex_hss:D \l__graphics_name_tl \tex_hss:D + \tex_hss:D \l__graphics_full_name_str \tex_hss:D } \tex_vss:D \tex_hrule:D @@ -266,13 +261,13 @@ \hbox_set:Nn \l__graphics_internal_box { \exp_args:NnV \use:c { __graphics_backend_include_ #1 :n } - \l__graphics_name_tl + \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 } + { \l__graphics_ury_dim - \l__graphics_lly_dim } \box_set_wd:Nn \l__graphics_internal_box - { \l_graphics_urx_dim - \l_graphics_llx_dim } + { \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:nnxxxx } @@ -280,16 +275,100 @@ \cs_new_protected:Npn \__graphics_list:N #1 { \seq_remove_duplicates:N \g__graphics_record_seq - #1 { LaTeX/kernel } { file-list } + #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:eeT { \l__graphics_full_name_str } { #1 .tex } + { \__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:Npx \__graphics_get_pagecount:n #1 + { + \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:x + { + \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. + LaTeX~tried~to~open~graphic~file~'#1',~ + but~the~file~could~not~be~read. } \msg_new:nnnn { graphics } { pipe-failed } { Cannot~run~piped~system~commands. } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty b/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty index df90c3478c3..2bc5ff3b45d 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty @@ -20,7 +20,7 @@ %% %% File: l3opacity.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3opacity}{2022-02-05}{} +\ProvidesExplPackage{l3opacity}{2022-04-10}{} {L3 Experimental opacity support} \cs_new_protected:Npn \opacity_select:n #1 { \__opacity_select:nN {#1} \__opacity_backend_select:n } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty index 9ca33411af2..9d3a1cec381 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty @@ -20,7 +20,7 @@ %% %% File: l3str-format.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3str-format}{2022-02-05}{} +\ProvidesExplPackage{l3str-format}{2022-04-10}{} {L3 Experimental string formatting} \cs_generate_variant:Nn \use:nn { nf } \cs_generate_variant:Nn \use:nnn { fnf } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty b/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty index 3584a776156..82c3e44bad9 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty @@ -20,7 +20,7 @@ %% %% File: l3sys-shell.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3sys-shell}{2022-02-05}{} +\ProvidesExplPackage{l3sys-shell}{2022-04-10}{} {L3 Experimental system shell functions} \scan_new:N \s__sys_stop \quark_new:N \q__sys_nil @@ -176,6 +176,8 @@ \seq_set_split:NnV #2 { \char_generate:nn { `\^^M } { 12 } } \exp_not:N \l__sys_tmp_tl \seq_pop_right:NN #2 \exp_not:N \l__sys_tmp_tl + \exp_not:N \tl_if_blank:eTF { \exp_not:N \seq_item:Nn #2 { 1 } } + { \seq_clear:N #2 } } } %% diff --git a/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty b/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty index f3ccc5818ce..4c3d6d531a0 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: xcoffins.dtx -\ProvidesExplPackage{xcoffins}{2022-02-05}{} +\ProvidesExplPackage{xcoffins}{2022-04-10}{} {L3 Experimental design level coffins} \keys_define:nn { coffin } { diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty index 20faae1e90f..8d52f950685 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty @@ -32,7 +32,7 @@ }% \endinput } -\ProvidesExplPackage{l3galley}{2022-02-05}{} +\ProvidesExplPackage{l3galley}{2022-04-10}{} {L3 Experimental galley code} \int_new:N \l__galley_tmp_int \seq_new:N \g__galley_tmpa_seq diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty index a741b024460..d65e9bf4ece 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: xgalley.dtx -\ProvidesExplPackage{xgalley}{2022-02-05}{} +\ProvidesExplPackage{xgalley}{2022-04-10}{} {L3 Experimental galley} \RequirePackage{xtemplate,l3galley} \clist_new:N \l__galley_tmpa_clist diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex index 3904ec54d93..8d286c95e9a 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex @@ -70,7 +70,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2022-02-24}% +\def\ExplFileDate{2022-04-10}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -1256,12 +1256,14 @@ Type H <return> for immediate help}\def~{\errmessage{% \__kernel_primitive:NN \kcatcode \tex_kcatcode:D \__kernel_primitive:NN \kuten \tex_kuten:D \__kernel_primitive:NN \lastnodechar \tex_lastnodechar:D + \__kernel_primitive:NN \lastnodefont \tex_lastnodefont:D \__kernel_primitive:NN \lastnodesubtype \tex_lastnodesubtype:D \__kernel_primitive:NN \noautospacing \tex_noautospacing:D \__kernel_primitive:NN \noautoxspacing \tex_noautoxspacing:D \__kernel_primitive:NN \pagefistretch \tex_pagefistretch:D \__kernel_primitive:NN \postbreakpenalty \tex_postbreakpenalty:D \__kernel_primitive:NN \prebreakpenalty \tex_prebreakpenalty:D + \__kernel_primitive:NN \ptexlineendmode \tex_lineendmode:D \__kernel_primitive:NN \ptexminorversion \tex_ptexminorversion:D \__kernel_primitive:NN \ptexrevision \tex_ptexrevision:D \__kernel_primitive:NN \ptexversion \tex_ptexversion:D @@ -1277,6 +1279,8 @@ Type H <return> for immediate help}\def~{\errmessage{% \__kernel_primitive:NN \textbaselineshiftfactor \tex_textbaselineshiftfactor:D \__kernel_primitive:NN \tfont \tex_tfont:D + \__kernel_primitive:NN \toucs \tex_toucs:D + \__kernel_primitive:NN \ucs \tex_ucs:D \__kernel_primitive:NN \xkanjiskip \tex_xkanjiskip:D \__kernel_primitive:NN \xspcode \tex_xspcode:D \__kernel_primitive:NN \ybaselineshift \tex_ybaselineshift:D @@ -1289,7 +1293,6 @@ Type H <return> for immediate help}\def~{\errmessage{% \__kernel_primitive:NN \kchar \tex_kchar:D \__kernel_primitive:NN \kchardef \tex_kchardef:D \__kernel_primitive:NN \kuten \tex_kuten:D - \__kernel_primitive:NN \ucs \tex_ucs:D \__kernel_primitive:NN \uptexrevision \tex_uptexrevision:D \__kernel_primitive:NN \uptexversion \tex_uptexversion:D \__kernel_primitive:NN \odelcode \tex_odelcode:D @@ -1301,6 +1304,7 @@ Type H <return> for immediate help}\def~{\errmessage{% \__kernel_primitive:NN \oradical \tex_oradical:D \__kernel_primitive:NN \partokencontext \tex_partokencontext:D \__kernel_primitive:NN \partokenname \tex_partokenname:D + \__kernel_primitive:NN \showstream \tex_showstream:D \__kernel_primitive:NN \tracingstacklevels \tex_tracingstacklevels:D \tex_endgroup:D \tex_ifdefined:D \@@end @@ -4943,6 +4947,8 @@ Type H <return> for immediate help}\def~{\errmessage{% { p , T , F , TF } \prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c { p , T , F , TF } +\prg_new_eq_conditional:NNn \str_if_empty:n \tl_if_empty:n + { p , T , F , TF } \cs_new_eq:NN \__str_if_eq:nn \tex_strcmp:D \prg_new_conditional:Npnn \str_compare:nNn #1#2#3 { p , T , F , TF } { @@ -5012,6 +5018,10 @@ Type H <return> for immediate help}\def~{\errmessage{% \cs_new:Npn \__str_case:nnTF #1#2#3#4 { \__str_case:nw {#1} #2 {#1} { } \s__str_mark {#3} \s__str_mark {#4} \s__str_stop } \cs_generate_variant:Nn \str_case:nn { V , o , nV , nv } +\cs_new_eq:NN \str_case:Nn \str_case:Vn +\cs_new_eq:NN \str_case:NnT \str_case:VnT +\cs_new_eq:NN \str_case:NnF \str_case:VnF +\cs_new_eq:NN \str_case:NnTF \str_case:VnTF \prg_generate_conditional_variant:Nnn \str_case:nn { V , o , nV , nv } { T , F , TF } \cs_new:Npn \__str_case:nw #1#2#3 @@ -5441,6 +5451,92 @@ Type H <return> for immediate help}\def~{\errmessage{% { \use:c { char_str_ #1 case:N } #2 } \__str_change_case_loop:nw {#1} } +\if_int_compare:w 0 + \cs_if_exist:NT \tex_XeTeXversion:D { 1 } + \cs_if_exist:NT \tex_luatexversion:D { 1 } + > 0 \exp_stop_f: +\else: + \cs_gset:Npn \__str_change_case_char:nN #1#2 + { + \__str_if_recursion_tail_stop_do:Nn #2 + { \__str_change_case_end:wn } + \int_compare:nNnTF { `#2 } > { "80 } + { + \int_compare:nNnTF { `#2 } < { "E0 } + { \__str_change_case_char_UTFviii:nNN } + { + \int_compare:nNnTF { `#2 } < { "F0 } + { \__str_change_case_char_UTFviii:nNNN } + { \__str_change_case_char_UTFviii:nNNNN } + } + {#1} #2 + } + { + \__str_change_case_output:fw + { \use:c { char_str_ #1 case:N } #2 } + \__str_change_case_loop:nw {#1} + } + } + \cs_new:Npn \__str_change_case_char_UTFviii:nNN #1#2#3 + { \__str_change_case_char_UTFviii:nn {#1} {#2#3} } + \cs_new:Npn \__str_change_case_char_UTFviii:nNNN #1#2#3#4 + { \__str_change_case_char_UTFviii:nn {#1} {#2#3#4} } + \cs_new:Npn \__str_change_case_char_UTFviii:nNNNN #1#2#3#4#5 + { \__str_change_case_char_UTFviii:nn {#1} {#2#3#4#5} } + \cs_if_exist:NF \tex_pdftexversion:D + { + \cs_gset:Npn \__str_change_case_char_UTFviii:nNNN #1#2#3#4 + { + \__str_change_case_output:nw {#2#3#4} + \__str_change_case_loop:nw {#1} + } + \cs_gset:Npn \__str_change_case_char_UTFviii:nNNNN #1#2#3#4#5 + { + \__str_change_case_output:nw {#2#3#4#5} + \__str_change_case_loop:nw {#1} + } + } + \cs_new:Npn \__str_change_case_char_UTFviii:nn #1#2 + { + \use:c { __str_change_case_char_UTFviii_ #1 :nn } {#1} {#2} + } + \cs_new:Npn \__str_change_case_char_UTFviii_upper:nn #1#2 + { + \__str_change_case_output:fw + { + \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl } + { + \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: } + } + {#2} + } + \__str_change_case_loop:nw {#1} + } + \cs_new_eq:NN \__str_change_case_char_UTFviii_lower:nn + \__str_change_case_char_UTFviii_upper:nn + \cs_new:Npn \__str_change_case_char_UTFviii_fold:nn #1#2 + { + \__str_change_case_output:fw + { + \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl } + { + \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: } + } + { + \cs_if_exist:cTF { c__kernel_lowercase_ #2 _tl } + { + \__kernel_tl_to_str:w + \exp_after:wN \exp_after:wN \exp_after:wN + { \cs:w c__kernel_lowercase_ #2 _tl \cs_end: } + } + {#2} + } + } + \__str_change_case_loop:nw {#1} + } +\fi: \str_const:Nx \c_ampersand_str { \cs_to_str:N \& } \str_const:Nx \c_atsign_str { \cs_to_str:N \@ } \str_const:Nx \c_backslash_str { \cs_to_str:N \\ } @@ -8598,26 +8694,22 @@ Type H <return> for immediate help}\def~{\errmessage{% } \cs_new:Npn \__char_generate_aux:w #1 ; #2 ; { - \if_int_compare:w #2 = 10 \exp_stop_f: - \if_int_compare:w #1 = \c_zero_int - \msg_expandable_error:nn { char } { null-space } - \else: - \msg_expandable_error:nn { char } { space } - \fi: + \if_int_odd:w 0 + \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi: + \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f: + \msg_expandable_error:nn { char } + { invalid-catcode } \else: \if_int_odd:w 0 - \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi: - \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f: + \if_int_compare:w #1 < \c_zero_int 1 \fi: + \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f: \msg_expandable_error:nn { char } - { invalid-catcode } + { out-of-range } \else: - \if_int_odd:w 0 - \if_int_compare:w #1 < \c_zero_int 1 \fi: - \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f: - \msg_expandable_error:nn { char } - { out-of-range } + \if_int_compare:w #2#1 = 100 \exp_stop_f: + \msg_expandable_error:nn { char } { null-space } \else: \__char_generate_aux:nnw {#1} {#2} \fi: @@ -10533,9 +10625,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { Cannot~generate~null~char~as~a~space. } \msg_new:nnn { char } { out-of-range } { Charcode~requested~out~of~engine~range. } -\msg_new:nnn { char } { space } - { Cannot~generate~space~chars. } -\msg_new:nnnn { ior } { quote-in-shell } +\msg_new:nnnn { kernel } { quote-in-shell } { Quotes~in~shell~command~'#1'. } { Shell~commands~cannot~contain~quotes~("). } \msg_new:nnnn { keys } { no-property } @@ -13036,6 +13126,8 @@ Type H <return> for immediate help}\def~{\errmessage{% \bool_new:N \l__keys_tmp_bool \tl_new:N \l__keys_tmpa_tl \tl_new:N \l__keys_tmpb_tl +\bool_new:N \l__keys_precompile_bool +\tl_new:N \l__keys_precompile_tl \prop_new:N \l_keys_usage_load_prop \prop_new:N \l_keys_usage_preamble_prop \scan_new:N \s__keys_nil @@ -13043,6 +13135,13 @@ Type H <return> for immediate help}\def~{\errmessage{% \scan_new:N \s__keys_stop \quark_new:N \q__keys_no_value \__kernel_quark_new_conditional:Nn \__keys_quark_if_no_value:N { TF } +\cs_new_protected:Npn \__keys_precompile:n #1 + { + \bool_if:NTF \l__keys_precompile_bool + { \tl_put_right:Nn \l__keys_precompile_tl } + { \use:n } + {#1} + } \cs_new_protected:Npn \keys_define:nn { \__keys_define:onn \l__keys_module_str } \cs_new_protected:Npn \__keys_define:nnn #1#2#3 @@ -13146,7 +13245,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \exp_not:c { bool_ #2 set_ #3 :N } \exp_not:N #1 } \__keys_cmd_set:nx { \l_keys_path_str / false } { \exp_not:c { bool_ #2 set_ #4 :N } \exp_not:N #1 } - \__keys_cmd_set:nn { \l_keys_path_str / unknown } + \__keys_cmd_set_direct:nn { \l_keys_path_str / unknown } { \msg_error:nnx { keys } { boolean-values-only } \l_keys_key_str @@ -13178,8 +13277,8 @@ Type H <return> for immediate help}\def~{\errmessage{% { \cs_set_nopar:cpn { \c__keys_type_root_str \l_keys_path_str } { choice } - \__keys_cmd_set:nn \l_keys_path_str { #1 {##1} } - \__keys_cmd_set:nn { \l_keys_path_str / unknown } + \__keys_cmd_set_direct:nn \l_keys_path_str { #1 {##1} } + \__keys_cmd_set_direct:nn { \l_keys_path_str / unknown } { \msg_error:nnxx { keys } { choice-unknown } \l_keys_path_str {##1} @@ -13207,12 +13306,17 @@ Type H <return> for immediate help}\def~{\errmessage{% } } \cs_new_protected:Npn \__keys_cmd_set:nn #1#2 - { \cs_set_protected:cpn { \c__keys_code_root_str #1 } ##1 {#2} } + { \__keys_cmd_set_direct:nn {#1} { \__keys_precompile:n {#2} } } \cs_generate_variant:Nn \__keys_cmd_set:nn { nx , Vn , Vo } +\cs_new_protected:Npn \__keys_cmd_set_direct:nn #1#2 + { \cs_set_protected:cpn { \c__keys_code_root_str #1 } ##1 {#2} } \cs_new_protected:Npn \__keys_cs_set:NNpn #1#2#3# { \cs_set_protected:cpx { \c__keys_code_root_str \l_keys_path_str } ##1 - { #1 \exp_not:N #2 \exp_not:n {#3} {##1} } + { + \__keys_precompile:n + { #1 \exp_not:N #2 \exp_not:n {#3} {##1} } + } \use_none:n } \cs_generate_variant:Nn \__keys_cs_set:NNpn { Nc } @@ -13285,13 +13389,17 @@ Type H <return> for immediate help}\def~{\errmessage{% } \cs_new_protected:Npn \__keys_meta_make:n #1 { - \__keys_cmd_set:Vo \l_keys_path_str + \exp_args:NVo \__keys_cmd_set_direct:nn \l_keys_path_str { - \exp_after:wN \keys_set:nn \exp_after:wN { \l__keys_module_str } {#1} + \exp_after:wN \keys_set:nn \exp_after:wN + { \l__keys_module_str } {#1} } } \cs_new_protected:Npn \__keys_meta_make:nn #1#2 - { \__keys_cmd_set:Vn \l_keys_path_str { \keys_set:nn {#1} {#2} } } + { + \exp_args:NV \__keys_cmd_set_direct:nn + \l_keys_path_str { \keys_set:nn {#1} {#2} } + } \cs_new_protected:Npn \__keys_prop_put:Nn #1#2 { \prop_if_exist:NF #1 { \prop_new:N #1 } @@ -13748,6 +13856,14 @@ Type H <return> for immediate help}\def~{\errmessage{% \__keys_set:nn {#2} {#4} \tl_set:Nn \l__keys_selective_seq {#1} } +\cs_new_protected:Npn \keys_precompile:nnN #1#2#3 + { + \bool_set_true:N \l__keys_precompile_bool + \tl_clear:N \l__keys_precompile_tl + \keys_set:nn {#1} {#2} + \bool_set_false:N \l__keys_precompile_bool + \tl_set_eq:NN #3 \l__keys_precompile_tl + } \cs_new_protected:Npn \__keys_set_keyval:n #1 { \bool_set_true:N \l__keys_no_value_bool @@ -14088,16 +14204,46 @@ Type H <return> for immediate help}\def~{\errmessage{% { \exp_args:Nnf \msg_show_item_unbraced:nn { code } { - \exp_args:Nc \cs_replacement_spec:N + \exp_args:Ne \__keys_show:n { - \c__keys_code_root_str - \__keys_trim_spaces:n { #2 / #3 } + \exp_args:Nc \cs_replacement_spec:N + { + \c__keys_code_root_str + \__keys_trim_spaces:n { #2 / #3 } + } } } } } { } { } } +\cs_new:Npx \__keys_show:n #1 + { + \exp_not:N \__keys_show:w + #1 + \tl_to_str:n { \__keys_precompile:n } + #1 + \tl_to_str:n { \__keys_precompile:n } + \exp_not:N \s__keys_stop + } +\use:x + { + \cs_new:Npn \exp_not:N \__keys_show:w + ##1 \tl_to_str:n { \__keys_precompile:n } + ##2 \tl_to_str:n { \__keys_precompile:n } + ##3 \exp_not:N \s__keys_stop + } + { + \tl_if_blank:nTF {#2} + {#1} + { \__keys_show:Nw #2 \s__keys_stop } + } +\use:x + { + \cs_new:Npn \exp_not:N \__keys_show:Nw ##1##2 + \c_right_brace_str \exp_not:N \s__keys_stop + } + {#2} \msg_new:nnnn { keys } { bad-relative-key-path } { The~key~'#1'~is~not~inside~the~'#2'~path. } { The~key~'#1'~cannot~be~expressed~relative~to~path~'#2'. } @@ -23296,33 +23442,30 @@ Type H <return> for immediate help}\def~{\errmessage{% 32 \s__tl \__tl_analysis_b_loop:w #1 ; } +\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1 + { \exp_args:No \tl_analysis_map_inline:nn #1 } \cs_new_protected:Npn \tl_analysis_map_inline:nn #1 { \__tl_analysis:n {#1} \int_gincr:N \g__kernel_prg_map_int - \exp_args:Nc \__tl_analysis_map_inline_aux:Nn + \exp_args:Nc \__tl_analysis_map:Nn { __tl_analysis_map_inline_ \int_use:N \g__kernel_prg_map_int :wNw } } -\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1 - { \exp_args:No \tl_analysis_map_inline:nn #1 } -\cs_new_protected:Npn \__tl_analysis_map_inline_aux:Nn #1#2 +\cs_new_protected:Npn \__tl_analysis_map:Nn #1#2 { - \cs_gset_protected:Npn #1 ##1 \s__tl ##2 ##3 \s__tl - { - \use_none:n ##2 - \__tl_analysis_map_inline_aux:nnn {##1} {##3} {##2} - } - \cs_gset_protected:Npn \__tl_analysis_map_inline_aux:nnn ##1##2##3 - { - #2 - #1 - } - \exp_after:wN #1 + \cs_gset_protected:Npn #1 ##1##2##3 {#2} + \exp_after:wN \__tl_analysis_map:NwNw \exp_after:wN #1 \g__tl_analysis_result_tl \s__tl { ? \tl_map_break: } \s__tl \prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__kernel_prg_map_int } } +\cs_new_protected:Npn \__tl_analysis_map:NwNw #1 #2 \s__tl #3 #4 \s__tl + { + \use_none:n #3 + #1 {#2} {#4} {#3} + \__tl_analysis_map:NwNw #1 + } \cs_new_protected:Npn \tl_analysis_show:N { \__tl_analysis_show:NNN \msg_show:nnxxxx \tl_show:N } \cs_new_protected:Npn \tl_analysis_log:N @@ -31694,6 +31837,39 @@ Type H <return> for immediate help}\def~{\errmessage{% \tl_new:N \l_text_expand_exclude_tl \tl_set:Nn \l_text_expand_exclude_tl { \begin \cite \end \label \ref } +\bool_lazy_and:nnT + { \str_if_eq_p:Vn \fmtname { LaTeX2e } } + { \tl_if_exist_p:N \@expl@finalise@setup@@ } + { + \tl_gput_right:Nn \@expl@finalise@setup@@ + { + \tl_gput_right:Nn \@kernel@after@begindocument + { + \group_begin: + \cs_set_protected:Npn \__text_tmp:w #1 + { + \tl_clear:N \l_text_expand_exclude_tl + \tl_map_inline:nn {#1} + { + \bool_lazy_any:nF + { + { \token_if_protected_macro_p:N ##1 } + { \token_if_protected_long_macro_p:N ##1 } + { + \str_if_eq_p:ee + { \cs_replacement_spec:N ##1 } + { \exp_not:n { \protect ##1 } \c_space_tl } + } + } + { \tl_put_right:Nn \l_text_expand_exclude_tl {##1} } + } + } + \exp_args:NV \__text_tmp:w \l_text_expand_exclude_tl + \exp_args:NNNV \group_end: + \tl_set:Nn \l_text_expand_exclude_tl \l_text_expand_exclude_tl + } + } + } \tl_new:N \l__text_math_mode_tl \tex_chardef:D \c__text_chardef_space_token = `\ % \tex_mathchardef:D \c__text_mathchardef_space_token = `\ % @@ -31946,7 +32122,7 @@ Type H <return> for immediate help}\def~{\errmessage{% \cs_new:Npx \__text_expand_cs:N #1 { \exp_not:N \str_if_eq:nnTF {#1} { \exp_not:N \protect } - { \exp_not:N \__text_expand_protect:N } + { \exp_not:N \__text_expand_protect:w } { \bool_lazy_and:nnTF { \cs_if_exist_p:N \fmtname } @@ -31955,8 +32131,23 @@ Type H <return> for immediate help}\def~{\errmessage{% { \exp_not:N \__text_expand_replace:N #1 } } } +\cs_new:Npn \__text_expand_protect:w #1 \q__text_recursion_stop + { + \tl_if_head_is_N_type:nTF {#1} + { \__text_expand_protect:N } + { + \__text_expand_store:n { \protect } + \__text_expand_loop:w + } + #1 \q__text_recursion_stop + } \cs_new:Npn \__text_expand_protect:N #1 { + \__text_if_recursion_tail_stop_do:Nn #1 + { + \__text_expand_store:n { \protect } + \__text_expand_end:w + } \exp_args:Ne \__text_expand_protect:nN { \cs_to_str:N #1 } #1 } @@ -32466,10 +32657,10 @@ Type H <return> for immediate help}\def~{\errmessage{% { \__text_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6#7} } \cs_new:Npn \__text_change_case_char_UTFviii:nnnn #1#2#3#4 { - \cs_if_exist:cTF { c__text_ #1 case_ \tl_to_str:n {#4} _tl } + \cs_if_exist:cTF { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl } { \__text_change_case_store:v - { c__text_ #1 case_ \tl_to_str:n {#4} _tl } + { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl } } { \__text_change_case_store:n {#4} } \use:c { __text_change_case_char_next_ #2 :nn } {#2} {#3} @@ -33094,7 +33285,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \tl_const:cx { - c__text_ #1 case_ + c__kernel_ #1 case_ \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } _tl @@ -33110,7 +33301,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \tl_const:cx { - c__text_lowercase_ + c__kernel_lowercase_ \char_generate:nn {#1} { 12 } \char_generate:nn {#2} { 12 } _tl @@ -33338,7 +33529,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \tl_const:cx { - c__text_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } _tl @@ -33375,7 +33566,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \tl_const:cn { - c__text_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } _tl @@ -33393,7 +33584,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \tl_const:cx { - c__text_ #1 case_ + c__kernel_ #1 case_ \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } \char_generate:nn {#4} { 12 } @@ -33412,7 +33603,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \tl_const:cx { - c__text_lowercase_ + c__kernel_lowercase_ \char_generate:nn {#1} { 12 } \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } @@ -33535,7 +33726,7 @@ Type H <return> for immediate help}\def~{\errmessage{% { \tl_const:cx { - c__text_ #3 case_ + c__kernel_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } \char_generate:nn {##3} { 12 } @@ -34658,7 +34849,7 @@ Type H <return> for immediate help}\def~{\errmessage{% \tl_if_in:nnTF {#1} { " } { \msg_error:nnx - { ior } { quote-in-shell } {#1} + { kernel } { quote-in-shell } {#1} } { \__kernel_ior_open:Nn #2 { |#1 } } } @@ -34857,10 +35048,11 @@ Type H <return> for immediate help}\def~{\errmessage{% %% File: l3legacy.dtx \prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF } { - \exp_args:Nc \if_meaning:w { if#1 } \iftrue - \prg_return_true: - \else: + \exp_after:wN \reverse_if:N + \cs:w if#1 \cs_end: \prg_return_false: + \else: + \prg_return_true: \fi: } \cs_new_protected:Npn \legacy_if_set_true:n #1 diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex index 20618550113..a7a2ac6dbfd 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2022-02-24}% +\def\ExplFileDate{2022-04-10}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \catcode`\_=11 diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx b/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx index 6a41fe6b6dc..08875b5a725 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2022-02-24}% +\def\ExplFileDate{2022-04-10}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \catcode`\_=11 diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.lua b/Master/texmf-dist/tex/latex/l3kernel/expl3.lua index 773079c944b..10cec935888 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.lua +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.lua @@ -56,6 +56,7 @@ local scan_string = token.scan_string local scan_keyword = token.scan_keyword local put_next = token.put_next local token_create = token.create +local token_new = token.new local token_create_safe do local is_defined = token.is_defined @@ -255,9 +256,9 @@ if luatexbase then end end -- File: l3names.dtx -local minus_tok = token.new(string.byte'-', 12) -local zero_tok = token.new(string.byte'0', 12) -local one_tok = token.new(string.byte'1', 12) +local minus_tok = token_new(string.byte'-', 12) +local zero_tok = token_new(string.byte'0', 12) +local one_tok = token_new(string.byte'1', 12) luacmd('tex_strcmp:D', function() local first = scan_string() local second = scan_string() @@ -267,11 +268,16 @@ luacmd('tex_strcmp:D', function() put_next(first == second and zero_tok or one_tok) end end, 'global') +local sprint = tex.sprint local cprint = tex.cprint luacmd('tex_Ucharcat:D', function() local charcode = scan_int() local catcode = scan_int() - cprint(catcode, utf8_char(charcode)) + if catcode == 10 then + sprint(token_new(charcode, 10)) + else + cprint(catcode, utf8_char(charcode)) + end end, 'global') luacmd('tex_filesize:D', function() local size = filesize(scan_string()) diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty index 9bd22f958f6..b4b85ce414d 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2022-02-24}% +\def\ExplFileDate{2022-04-10}% \let\ExplLoaderFileDate\ExplFileDate \ProvidesPackage{expl3} [% diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3debug.def b/Master/texmf-dist/tex/latex/l3kernel/l3debug.def index 7f90a7f9940..864ce5a0952 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3debug.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3debug.def @@ -624,7 +624,7 @@ { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } } } { } - { \__keys_cmd_set:nn } + { \__keys_cmd_set_direct:nn } \__kernel_patch:nnn { } { |