texlive[51962] Master/texmf-dist: l3 (26aug19)

commits+karl at tug.org commits+karl at tug.org
Mon Aug 26 23:05:47 CEST 2019


Revision: 51962
          http://tug.org/svn/texlive?view=revision&revision=51962
Author:   karl
Date:     2019-08-26 23:05:47 +0200 (Mon, 26 Aug 2019)
Log Message:
-----------
l3 (26aug19)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3backend/README.md
    trunk/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3cctab/l3cctab.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xdvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3cctab/l3cctab.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty

Modified: trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md	2019-08-26 21:05:47 UTC (rev 51962)
@@ -6,6 +6,13 @@
 
 ## [Unreleased]
 
+## [2019-08-25]
+
+### Fixed
+
+- Setting for PDF version in `dvipdfmx` route
+- Support for PDF objects with XeTeX
+
 ## [2019-07-01]
 
 ### Added
@@ -18,5 +25,6 @@
 - Include `l3backend` in file names
 - Moved backend code to internal for each 'parent' module
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2019-07-01...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2019-08-25...HEAD
+[2019-08-25]: https://github.com/latex3/latex3/compare/2019-07-01...2019-08-25
 [2019-07-01]: https://github.com/latex3/latex3/compare/2019-05-28...2019-07-01

Modified: trunk/Master/texmf-dist/doc/latex/l3backend/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3backend/README.md	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3backend/README.md	2019-08-26 21:05:47 UTC (rev 51962)
@@ -1,7 +1,7 @@
 LaTeX3 Backend Drivers
 ======================
 
-Release 2019-07-01
+Release 2019-08-25
 
 This package forms parts of `expl3`, and contains the code used to interface
 with backends (drivers) across the `expl3` codebase. The functions here are

Modified: trunk/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2019-08-26 21:05:47 UTC (rev 51962)
@@ -7,6 +7,19 @@
 
 ## [Unreleased]
 
+## [2019-08-25]
+
+### Changed
+
+- `\draw_unit_vector:n` returns a vertical vector when the length is
+  zero (see #609)
+- Collect `pwd` data with no `\endlinechar` (see #613)
+- Default precision in `\fp_format:nn` when no style is specified
+
+### Fixed
+
+- Corrected behaviour of catcode tables (see #610)
+
 ## [2019-07-01]
 
 ### Added
@@ -13,6 +26,10 @@
 
 - New module `l3pdf`
 
+### Changed
+
+- Re-order arguments for polar points (`l3draw`)
+
 ### Removed
 
 - `l3str-convert` module: moved to `l3kernel` (`expl3` core)
@@ -95,7 +112,8 @@
 - 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/2019-07-01...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2019-08-25...HEAD
+[2019-08-25]: https://github.com/latex3/latex3/compare/2019-07-01...2019-08-25
 [2019-07-01]: https://github.com/latex3/latex3/compare/2019-05-28...2019-07-01
 [2019-05-28]: https://github.com/latex3/latex3/compare/2019-05-03...2019-05-28
 [2019-05-03]: https://github.com/latex3/latex3/compare/2019-03-05...2019-05-03

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2019-08-26 21:05:47 UTC (rev 51962)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2019-07-01
+Release 2019-08-25
 
 Overview
 --------
@@ -134,28 +134,8 @@
 ------------------
 
 Development of LaTeX3 is carried out by
-[The LaTeX3 Project](http://www.latex-project.org/latex3.html). Currently,
-the team members are
+[The LaTeX3 Project](https://www.latex-project.org/latex3/). 
 
-* Johannes Braams
-* David Carlisle
-* Robin Fairbairns
-* Morten Høgholm
-* Bruno Le Floch
-* Thomas Lotze
-* Frank Mittelbach
-* Will Robertson
-* Chris Rowley
-* Rainer Schöpf
-* Joseph Wright
-
-Former members of The LaTeX3 Project team were
-
-* Michael Downes
-* Denys Duchier
-* Alan Jeffrey
-* Martin Schröder
-
 The development team can be contacted
 by e-mail: <latex-team at latex-project.org>; for general LaTeX3 discussion
 the [LaTeX-L list](#Discussion) should be used.

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3cctab/l3cctab.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2019-08-26 21:05:47 UTC (rev 51962)
@@ -7,6 +7,24 @@
 
 ## [Unreleased]
 
+## [2019-08-25]
+
+### Added
+
+- `\fp_if_nan:nTF`
+
+### Changed
+
+- Make round(.,nan)=nan with no "Invalid operation" error
+
+### Fixed
+
+- `\tl_rescan:nn` and `\tl_(g)set_rescan:Nnn` when single-line input
+  contains a comment character (see #607)
+- Final value of the variable in `\tl_map_variable:NNn` and
+  `\clist_map_variable:NNn`.
+- Remove duplicate keys in `\prop_set_from_keyval:Nn` (see #572)
+
 ## [2019-08-14]
 
 ### Deprecated
@@ -450,7 +468,8 @@
 - Step func­tions have been added for dim vari­ables,
   e.g. `\dim_step_in­line:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2019-08-14...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2019-08-25...HEAD
+[2019-08-25]: https://github.com/latex3/latex3/compare/2019-08-14...2019-08-25
 [2019-08-14]: https://github.com/latex3/latex3/compare/2019-07-25...2019-08-14
 [2019-07-25]: https://github.com/latex3/latex3/compare/2019-07-01...2019-07-25
 [2019-07-01]: https://github.com/latex3/latex3/compare/2019-05-28...2019-07-01

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2019-08-26 21:05:47 UTC (rev 51962)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2019-08-14
+Release 2019-08-25
 
 Overview
 --------

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2019-08-26 21:05:47 UTC (rev 51962)
@@ -54,7 +54,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2019-08-14}
+\date{Released 2019-08-25}
 
 \pagenumbering{roman}
 \maketitle

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

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

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2019-08-26 21:05:47 UTC (rev 51962)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2019-08-14}
+\date{Released 2019-08-25}
 
 \begin{document}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2019-08-26 21:05:47 UTC (rev 51962)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2019-08-14}
+\date{Released 2019-08-25}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2019-08-26 21:05:47 UTC (rev 51962)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2019-08-14}
+\date{Released 2019-08-25}
 
 \newcommand{\TF}{\textit{(TF)}}
 

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

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2019-08-26 21:05:47 UTC (rev 51962)
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2019-08-14}
+\date{Released 2019-08-25}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -271,7 +271,7 @@
 \__kernel_backend_postscript_header:n
   {
     /pdf.linkmargin { 1 ~ pdf.pt.dvi } def
-    /pdf.linkdp.pad { 0 } def 
+    /pdf.linkdp.pad { 0 } def
     /pdf.linkht.pad { 0 } def
   }
 %    \end{macrocode}
@@ -597,7 +597,7 @@
                      3 ~ exch ~ put ~
                    dup ~
                      pdf.outerbox ~ 2 ~ get ~
-                     pdf.linkmargin ~ add ~ 
+                     pdf.linkmargin ~ add ~
                      2 ~ exch ~ put ~
                    dup ~ dup ~
                      3 ~ get ~
@@ -799,7 +799,7 @@
     \int_gset_eq:NN \g_@@_backend_annotation_int \g_@@_backend_object_int
     \@@_backend_pdfmark:x
       {
-      
+
         /_objdef { pdf.obj \int_use:N \g_@@_backend_object_int }
         pdf.rect ~
         #4 ~
@@ -1057,7 +1057,7 @@
           \dim_to_decimal:n { \tex_baselineskip:D } ~ dup ~ 0 ~ gt
             { pdf.pt.dvi ~ def }
             { pop ~ pop }
-          ifelse 
+          ifelse
       }
   }
 \cs_new_protected:Npn \@@_backend_link_sf_save:
@@ -1197,7 +1197,7 @@
           /Dest ( #1 ) cvn
           /DEST
         }
-    \group_end:    
+    \group_end:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1321,7 +1321,7 @@
 %    \begin{macrocode}
 \cs_new:Npx \@@_backend_link_last:
   {
-    \exp_not:N \int_value:w 
+    \exp_not:N \int_value:w
     \cs_if_exist:NTF \tex_pdffeedback:D
       { \exp_not:N \tex_pdffeedback:D lastlink ~ }
       { \exp_not:N \tex_pdflastlink:D }
@@ -1374,14 +1374,14 @@
       \hbox_set:Nn \l_@@_internal_box {#2}
      \cs_if_exist:NTF \tex_pdfextension:D
       { \exp_not:N \tex_pdfextension:D dest ~ }
-      { \exp_not:N \tex_pdfdest:D }  
+      { \exp_not:N \tex_pdfdest:D }
       name {#1}
       fitr ~
         width  \exp_not:N \box_wd:N \l_@@_internal_box
         height \exp_not:N \box_ht:N \l_@@_internal_box
-        depth  \exp_not:N \box_dp:N \l_@@_internal_box 
+        depth  \exp_not:N \box_dp:N \l_@@_internal_box
       \box_use:N \l_@@_internal_box
-    \group_end:    
+    \group_end:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1472,7 +1472,7 @@
                   }
                 { stream }
                   {
-                    stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~ 
+                    stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~
                       { \@@_exp_not_ii:nn ##2 }
                   }
               }
@@ -1510,7 +1510,7 @@
                   }
                 { stream }
                   {
-                    stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~ 
+                    stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~
                       { \@@_exp_not_ii:nn ##2 }
                   }
               }
@@ -1702,7 +1702,7 @@
     \prop_gput:Nnn \g_@@_backend_object_prop {#1} {#2}
   }
 \cs_new:Npn \@@_backend_object_ref:n #1
-  { @pdf.obj \int_use:c { g_@@_backend_object_ \tl_to_str:n {#1} _int } }
+  { @pdf.obj \int_use:c { c_@@_backend_object_ \tl_to_str:n {#1} _int } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1949,7 +1949,7 @@
                 }
             }
         }
-    \group_end:    
+    \group_end:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1975,15 +1975,15 @@
 %   {\@@_backend_version_major_gset:n, \@@_backend_version_minor_gset:n}
 %   We start with the assumption that the default is active.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_version_major:n #1
+\cs_new_protected:Npn \@@_backend_version_major_gset:n #1
   {
     \cs_gset:Npx \@@_backend_version_major: { \int_eval:n {#1} }
-    \__kernel_backend_literal:x { pdf:majorversion \@@_backend_version_major: }
+    \__kernel_backend_literal:x { pdf:majorversion~ \@@_backend_version_major: }
   }
-\cs_new_protected:Npn \@@_backend_version_minor:n #1
+\cs_new_protected:Npn \@@_backend_version_minor_gset:n #1
   {
     \cs_gset:Npx \@@_backend_version_minor: { \int_eval:n {#1} }
-    \__kernel_backend_literal:x { pdf:minorversion \@@_backend_version_minor: }
+    \__kernel_backend_literal:x { pdf:minorversion~ \@@_backend_version_minor: }
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -130,7 +130,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3benchmark}{2019-07-01}{}
+\ProvidesExplPackage{l3benchmark}{2019-08-25}{}
   {L3 Experimental benchmarking}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -150,7 +150,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3cctab}{2019-07-01}{}
+\ProvidesExplPackage{l3cctab}{2019-08-25}{}
   {L3 Experimental category code tables}
 %</package>
 %    \end{macrocode}
@@ -276,7 +276,7 @@
 %    \begin{macrocode}
     \cs_new_protected:Npn \cctab_new:N #1
       {
-        \int_gadd:Nn \g_@@_allocate_int { 1 }
+        \int_gadd:Nn \g_@@_allocate_int { 2 }
         \int_const:Nn #1 { \g_@@_allocate_int }
         \intarray_new:cn { g_@@_ \int_use:N #1 _cctab } { 256 }
         \int_step_inline:nn { 256 }
@@ -297,7 +297,7 @@
       }
     \cs_new_protected:Npn \cctab_begin:N #1
       {
-        \int_gadd:Nn \g_@@_stack_int { 1 }
+        \int_gadd:Nn \g_@@_stack_int { 2 }
         \int_compare:nNnT \g_@@_stack_int > \c_max_register_int
           { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
         \cs_if_exist:cF { g_@@_ \int_use:N \g_@@_stack_int _cctab }

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -265,7 +265,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3color}{2019-07-01}{}
+\ProvidesExplPackage{l3color}{2019-08-25}{}
   {L3 Experimental color support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -505,23 +505,23 @@
       { \@@_path_arc_auxiii:nn }
       {
         \@@_point_transform_noshift:n
-          { \draw_point_polar:nnn { #1 #4 90 } {#7} {#8} }
+          { \draw_point_polar:nnn {#7} {#8} { #1 #4 90 } }
       }
     \@@_point_process:nnn
       { \@@_path_arc_auxiv:nnnn }
       {
         \draw_point_transform:n
-          { \draw_point_polar:nnn {#1} {#5} {#6} }
+          { \draw_point_polar:nnn {#5} {#6} {#1} }
       }
       {
         \draw_point_transform:n
-          { \draw_point_polar:nnn {#2} {#5} {#6} }
+          { \draw_point_polar:nnn {#5} {#6} {#2} }
       }
     \@@_point_process:nn
       { \@@_path_arc_auxv:nn }
       {
         \@@_point_transform_noshift:n
-          { \draw_point_polar:nnn { #2 #4 -90 } {#7} {#8} }
+          { \draw_point_polar:nnn {#7} {#8} { #2 #4 -90 } }
       }
     \exp_after:wN \@@_path_curveto:nnnnnn \l_@@_path_tmp_tl
     \fp_set:Nn \l_@@_path_arc_delta_fp { abs ( #2 - #3 ) }

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -199,9 +199,9 @@
 %   save on any expression evaluation there and force expansion.
 %    \begin{macrocode}
 \cs_new:Npn \draw_point_polar:nn #1#2
-  { \draw_point_polar:nnn {#1} {#2} {#2} }
+  { \draw_point_polar:nnn {#1} {#1} {#2} }
 \cs_new:Npn \draw_point_polar:nnn #1#2#3
-  { \@@_draw_polar:fnn { \fp_eval:n {#1} } {#2} {#3} }
+  { \@@_draw_polar:fnn { \fp_eval:n {#3} } {#1} {#2} }
 \cs_new:Npn \@@_draw_polar:nnn #1#2#3
   { \@@_point_to_dim:n { cosd(#1) * (#2) , sind(#1) * (#3) } }
 \cs_generate_variant:Nn \@@_draw_polar:nnn { f }
@@ -216,24 +216,37 @@
 %
 % \begin{macro}[EXP]{\draw_point_unit_vector:n}
 % \begin{macro}[EXP]{\@@_point_unit_vector:nn}
-%   Only a single point expression so the expansion is done here. The
-%   outcome is the normalised vector from $(0,0)$ in the direction of
+% \begin{macro}[EXP]{\@@_point_unit_vector:nnn}
+%   The outcome is the normalised vector from $(0,0)$ in the direction of
 %   the point, \emph{i.e.}
 %   \[
 %     P_{x} = \frac{x}{\sqrt{x^{2} + y^{2}}} \quad
 %     P_{y} = \frac{y}{\sqrt{x^{2} + y^{2}}}
 %   \]
+%   except where the length is zero, in which case a vertical vector is
+%   returned.
 %    \begin{macrocode}
 \cs_new:Npn \draw_point_unit_vector:n #1
   { \@@_point_process:nn { \@@_point_unit_vector:nn } {#1} }
 \cs_new:Npn \@@_point_unit_vector:nn #1#2
   {
-    \@@_point_to_dim:n
-      { ( #1 , #2 ) / (sqrt(#1 * #1 + #2 * #2)) }
+    \exp_args:Nf \@@_point_unit_vector:nnn
+      { \fp_eval:n { (sqrt(#1 * #1 + #2 * #2)) } }
+      {#1} {#2}
   }
+\cs_new:Npn \@@_point_unit_vector:nnn #1#2#3
+  {
+    \fp_compare:nNnTF {#1} = \c_zero_fp
+      { 0pt, 1pt }
+      {
+        \@@_point_to_dim:n
+          { ( #2 , #3 ) / #1 }
+      }
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \subsection{Intersection calculations}
 %
@@ -856,9 +869,9 @@
 %   Much the same as the core polar approach.
 %    \begin{macrocode}
 \cs_new:Npn \draw_point_vec_polar:nn #1#2
-  { \draw_point_vec_polar:nnn {#1} {#2} {#2} }
+  { \draw_point_vec_polar:nnn {#1} {#1} {#2} }
 \cs_new:Npn \draw_point_vec_polar:nnn #1#2#3
-  { \@@_draw_vec_polar:fnn { \fp_eval:n {#1} } {#2} {#3} }
+  { \@@_draw_vec_polar:fnn { \fp_eval:n {#3} } {#1} {#2} }
 \cs_new:Npn \@@_draw_vec_polar:nnn #1#2#3
   {
     \@@_point_to_dim:n

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -300,7 +300,7 @@
 % \begin{macro}{\@@_softpath_round_action_close:}
 % \begin{macro}{\@@_softpath_round_lookahead:NnnNnn}
 % \begin{macro}{\@@_softpath_round_roundpoint:NnnNnnNnn}
-% \begin{macro}{\@@_softpath_round_calc:nnnNnn}
+% \begin{macro}{\@@_softpath_round_calc:NnnNnn}
 % \begin{macro}[EXP]
 %   {\@@_softpath_round_calc:nnnnnn, \@@_softpath_round_calc:fVnnnn}
 % \begin{macro}[EXP]{\@@_softpath_round_calc:nnnnw}
@@ -436,8 +436,9 @@
         { \token_if_eq_meaning_p:NN #4 \@@_softpath_close_op:nn }
       }
       {
-        \@@_softpath_round_calc:nnnNnn
-          \@@_softpath_round_loop:Nnn {#5} {#6}
+        \@@_softpath_round_calc:NnnNnn
+          \@@_softpath_round_loop:Nnn
+          {#5} {#6}
       }
       {
         \token_if_eq_meaning:NNTF #4 \@@_softpath_roundpoint_op:nn
@@ -450,16 +451,17 @@
 \cs_new_protected:Npn \@@_softpath_round_roundpoint:NnnNnnNnn
   #1#2#3#4#5#6#7#8#9
   {
-    \@@_softpath_round_calc:nnnNnn
+    \@@_softpath_round_calc:NnnNnn
       \@@_softpath_round_loop:Nnn
-      {#8} {#9} #1 {#2} {#3}
+      {#8} {#9}
+      #1 {#2} {#3}
     #4 {#5} {#6} #7 {#8} {#9}
   }
 %    \end{macrocode}
 %   We now have all of the data needed to construct a rounded corner: all that
 %   is left to do is to work out the detail! At this stage, we have details
-%   of where the corner itself is (|#4|, |#5|), and where the next point is
-%   (|#1|, |#2|). There are two types of calculations to do. First, we
+%   of where the corner itself is (|#5|, |#6|), and where the next point is
+%   (|#2|, |#3|). There are two types of calculations to do. First, we
 %   need to interpolate from those two points in the direction of the
 %   corner, in order to work out where the curve we are adding will start
 %   and end. From those, plus the points we already have, we work out where
@@ -468,7 +470,7 @@
 %   is worked out up-front and saved: we need that if dealing with a
 %   close-path operation.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_softpath_round_calc:nnnNnn #1#2#3#4#5#6
+\cs_new_protected:Npn \@@_softpath_round_calc:NnnNnn #1#2#3#4#5#6
   {
     \tl_set:Nx \l_@@_softpath_curve_end_tl
       {
@@ -546,7 +548,7 @@
   {
     \use:x
       {
-        \@@_softpath_round_calc:nnnNnn
+        \@@_softpath_round_calc:NnnNnn
           {
             \tl_set:Nx \exp_not:N \l_@@_softpath_move_tl
               {

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -110,7 +110,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -404,8 +404,8 @@
 %
 % \begin{function}[EXP]{\draw_point_polar:nn, \draw_point_polar:nnn}
 %   \begin{syntax}
-%     \cs{draw_point_polar:nn} \Arg{angle} \Arg{radius}
-%     \cs{draw_point_polar:nnn} \Arg{angle} \Arg{radius-a} \Arg{radius-b}
+%     \cs{draw_point_polar:nn} \Arg{radius} \Arg{angle}
+%     \cs{draw_point_polar:nnn} \Arg{radius-a} \Arg{radius-b} \Arg{angle}
 %   \end{syntax}
 %   Gives the co-ordinates of the point at \meta{angle} (an \meta{fp expr} in
 %   \emph{degrees}) and \meta{radius}. The three-argument version accepts
@@ -421,7 +421,8 @@
 %     \cs{draw_point_unit_vector:n} \Arg{point}
 %   \end{syntax}
 %   Expands to the co-ordinates of a unit vector in the direction of the
-%   \meta{point} from the origin.
+%   \meta{point} from the origin. If the \meta{point} is at the origin,
+%   a vertical unit vector is returned
 % \end{function}
 %
 % \begin{function}[EXP]{\draw_point_transform:n}
@@ -462,8 +463,8 @@
 %
 % \begin{function}[EXP]{\draw_point_vec_polar:nn, \draw_point_vec_polar:nnn}
 %   \begin{syntax}
-%     \cs{draw_point_vec_polar:nn} \Arg{angle} \Arg{radius}
-%     \cs{draw_point_vec_polar:nnn} \Arg{angle} \Arg{radius-a} \Arg{radius-b}
+%     \cs{draw_point_vec_polar:nn} \Arg{radius} \Arg{angle}
+%     \cs{draw_point_vec_polar:nnn} \Arg{radius-a} \Arg{radius-b} \Arg{angle}
 %   \end{syntax}
 %   Gives the co-ordinates of the point at \meta{angle} (an \meta{fp expr} in
 %   \emph{degrees}) and \meta{radius}, relative to the prevailing
@@ -580,11 +581,11 @@
 %     \draw_begin:
 %       \draw_path_corner_arc:nn { 4pt } { 4pt }
 %       \draw_path_moveto:n
-%         { \draw_point_polar:nn { 0 } { 1cm } }
+%         { \draw_point_polar:nn { 1cm } { 0 } }
 %       \int_step_inline:nnnn { 72 } { 72 } { 359 }
 %         {
 %           \draw_path_lineto:n
-%             { \draw_point_polar:nn { #1 } { 1cm } }
+%             { \draw_point_polar:nn { 1cm } { #1 } }
 %         }
 %        \draw_path_close:
 %       \draw_path_use_clear:n { stroke }
@@ -1145,7 +1146,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3draw}{2019-07-01}{}
+\ProvidesExplPackage{l3draw}{2019-08-25}{}
   {L3 Experimental core drawing support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -241,7 +241,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3graphics}{2019-07-01}{}
+\ProvidesExplPackage{l3graphics}{2019-08-25}{}
   {L3 Experimental graphics inclusion support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -185,7 +185,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3pdf}{2019-07-01}{}
+\ProvidesExplPackage{l3pdf}{2019-08-25}{}
   {L3 Experimental core PDF support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -48,7 +48,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -127,7 +127,7 @@
 %   \end{syntax}
 %   Evaluates the \meta{floating point expression} and converts the
 %   result to a string according to the \meta{format specification}.
-%   The \meta{precision} defaults to $6$.  The \meta{style} can be
+%   The \meta{style} can be
 %   \begin{itemize}
 %     \item |e| for scientific notation, with one digit before and
 %       \meta{precision} digits after the decimal separator, and an
@@ -138,6 +138,9 @@
 %       in the range $[10^{-4}, 10^{\meta{precision}})$ and style |e|
 %       otherwise.
 %   \end{itemize}
+%   When there is no \meta{style} specifier nor \meta{precision} the
+%   number is displayed without rounding.  Otherwise the
+%   \meta{precision} defaults to~$6$.
 % \end{function}
 %
 % \section{Possibilities, and things to do}
@@ -164,7 +167,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3str-format}{2019-07-01}{}
+\ProvidesExplPackage{l3str-format}{2019-08-25}{}
   {L3 Experimental string formatting}
 %</package>
 %    \end{macrocode}
@@ -692,11 +695,13 @@
 % \subsection{Formatting floating points}
 %
 % \begin{macro}[EXP]{\fp_format:nn}
-%   Evaluate the first argument to an internal floating point number, and
-%   feed it to \cs{@@_format_fp:nn}.
+%   Evaluate the first argument to a floating point number, and feed it
+%   to \cs{@@_format_fp:nn}.  It would be more efficient to use internal
+%   floating point numbers but efficiency is not essential and the code
+%   is cleaner this way.
 %    \begin{macrocode}
 \cs_new:Npn \fp_format:nn #1
-  { \exp_args:Nf \@@_format_fp:nn { \__fp_parse:n {#1} } }
+  { \exp_args:Nf \@@_format_fp:nn { \fp_to_tl:n {#1} } }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -708,20 +713,19 @@
   {
     \tl_to_str:f
       {
-        \exp_last_unbraced:Nf \@@_format_fp:NNNnnNw
+        \exp_last_unbraced:Nf \@@_format_fp:NNNnnNn
           { \@@_format_parse:n {#2} }
-          #1
+          {#1}
       }
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_format_fp:NNNnnNw}
+% \begin{macro}[EXP]{\@@_format_fp:NNNnnNn}
 %   \begin{quote}
-%     \cs{@@_format_fp:NNNnnNw} \meta{fill} \meta{alignment}
+%     \cs{@@_format_fp:NNNnnNn} \meta{fill} \meta{alignment}
 %     \meta{format sign} \Arg{width} \Arg{precision} \meta{style}
-%     \cs{s__fp} \cs{__fp_chk:w} \meta{fp type} \meta{fp sign} \meta{fp
-%       body} |;|
+%     \Arg{floating point}
 %   \end{quote}
 %   First set the default alignment |?| to |>|.  Place the modified
 %   information after a trailing \cs{s_stop} for later retrieval.  Then
@@ -732,16 +736,17 @@
 %   (default), put nothing, represented as a brace group.  The width
 %   |#4| will be useful later, store it after \cs{s_stop}.  Afterwards,
 %   check the \meta{precision}: if it was not given, replace it by $6$
-%   (default precision).  Finally, dispatch depending on the
-%   \meta{style}.
+%   (default precision) unless no \meta{style} was given: in that case
+%   we want to use whatever precision is needed to fully describe the
+%   number.  Finally, dispatch depending on the \meta{style}.
 %    \begin{macrocode}
-\cs_new:Npn \@@_format_fp:NNNnnNw
-    #1#2#3#4#5#6 \s__fp \__fp_chk:w #7 #8
+\cs_new:Npn \@@_format_fp:NNNnnNn
+    #1#2#3#4#5#6#7
   {
     \token_if_eq_charcode:NNTF #2 ?
       { \@@_format_put:nw { #1 > } }
       { \@@_format_put:nw { #1 #2 } }
-    \token_if_eq_meaning:NNTF 2 #8
+    \tl_if_head_eq_charcode:nNTF {#7} -
       { \@@_format_put:nw { - } }
       {
         \str_case:nnF {#3}
@@ -753,40 +758,42 @@
       }
     \@@_format_put:nw { {#4} }
     \tl_if_empty:nTF {#5}
-      { \@@_format_put:nw { { 6} } }
+      {
+        \token_if_eq_meaning:NNTF #6 ?
+          { \@@_format_put:nw { {  } } }
+          { \@@_format_put:nw { { 6} } }
+      }
       { \@@_format_put:nw { {#5} } }
     \str_case:nnF {#6}
       {
-        { e } { \@@_format_fp:wnnnNNw \@@_format_fp_e:wn }
-        { f } { \@@_format_fp:wnnnNNw \@@_format_fp_f:wn }
-        { g } { \@@_format_fp:wnnnNNw \@@_format_fp_g:wn }
-        { ? } { \@@_format_fp:wnnnNNw \@@_format_fp_g:wn }
+        { e } { \@@_format_fp:wnnnNNn \@@_format_fp_e:nn }
+        { f } { \@@_format_fp:wnnnNNn \@@_format_fp_f:nn }
+        { g } { \@@_format_fp:wnnnNNn \@@_format_fp_g:nn }
+        { ? } { \@@_format_fp:wnnnNNn \@@_format_fp_g:nn }
       }
       {
         \__kernel_msg_expandable_error:nnnn
           { str } { invalid-style-format } {#6} { fp }
-        \@@_format_fp:wnnnNNw \@@_format_fp_g:wn
+        \@@_format_fp:wnnnNNn \@@_format_fp_g:nn
       }
-    \s_stop
-    \s__fp \__fp_chk:w #7 #8
+    \s_stop {#7}
   }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_format_fp:wnnnNNw}
+% \begin{macro}[EXP]{\@@_format_fp:wnnnNNn}
 %   \begin{quote}
-%     \cs{@@_format_fp:wnnnNNw} \meta{formatting function} \cs{s_stop}
+%     \cs{@@_format_fp:wnnnNNn} \meta{formatting function} \cs{s_stop}
 %     \Arg{precision} \Arg{width} \Arg{sign} \meta{fill}
-%     \meta{alignment} \cs{s__fp} \cs{__fp_chk:w} \meta{fp type}
-%     \meta{fp sign} \meta{fp body} |;|
+%     \meta{alignment} \Arg{floating point}
 %   \end{quote}
 %    \begin{macrocode}
-\cs_new:Npn \@@_format_fp:wnnnNNw
-    #1 \s_stop #2 #3 #4 #5#6 #7 ;
+\cs_new:Npn \@@_format_fp:wnnnNNn
+    #1 \s_stop #2 #3 #4 #5#6 #7
   {
     \exp_args:Nc \exp_args:Nf
       { @@_format_align_#6:nnnN }
-      { #1 #7 ; {#2} }
+      { #1 {#7} {#2} }
       {#4}
       {#3} #5
   }
@@ -793,50 +800,56 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_format_fp_round:wn}
-%   Round the given floating point (not its absolute value, to play
-%   nicely with unusual rounding modes).
+% \begin{macro}[EXP]{\@@_format_fp_round:nn}
+%   Round the given floating point and take the absolute value (in this
+%   order, to play nicely with unusual rounding modes if we ever
+%   implement these).
 %    \begin{macrocode}
-\cs_new:Npn \@@_format_fp_round:wn #1 ; #2
-  { \__fp_parse:n { round ( #1; , #2 - \__fp_exponent:w #1; ) } }
+\cs_new:Npn \@@_format_fp_round:nn #1 #2
+  { \fp_to_tl:n { abs ( round ( #1 , #2 - logb(#1) - 1 ) ) } }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_format_fp_e:wn}
-% \begin{macro}[EXP]{\@@_format_fp_e_aux:wn}
-%   With the |e| type, first filter out special cases.  In the normal
-%   case, round to |#4+1| significant figures (one before the decimal
-%   separator, |#4| after).
+% \begin{macro}[EXP]{\@@_format_fp_e:nn}
+% \begin{macro}[EXP]{\@@_format_fp_e_aux:nn, \@@_format_fp_e_aux:wwn}
+%   With the |e| type, first round to |#4+1| significant figures (one
+%   before the decimal separator, |#4| after), then filter out special
+%   cases, then convert to scientific notations.  This order is
+%   important because rounding can produce infinities or zeros and
+%   because \cs{fp_to_scientific:n} does not accept |nan| nor |inf|.
 %    \begin{macrocode}
-\cs_new:Npn \@@_format_fp_e:wn \s__fp \__fp_chk:w #1#2#3 ; #4
+\cs_new:Npn \@@_format_fp_e:nn #1#2
   {
-    \int_case:nnF {#1}
+    \exp_args:Nf \@@_format_fp_e_aux:nn
+      { \@@_format_fp_round:nn {#1} { #2 + 1 } }
+      {#2}
+  }
+\cs_new:Npn \@@_format_fp_e_aux:nn #1#2
+  {
+    \str_case:nnF {#1}
       {
-        { 0 } { \use:nf { 0 . } { \prg_replicate:nn {#4} { 0 } } e 0 }
-        { 2 } { inf }
-        { 3 } { nan }
+        {  inf } { inf }
+        {  nan } { nan }
       }
       {
-        \exp_last_unbraced:Nf \@@_format_fp_e_aux:wn
-          { \@@_format_fp_round:wn \s__fp \__fp_chk:w #1#2#3 ; { #4 + 1 } }
-          {#4}
+        \exp_last_unbraced:Nf \@@_format_fp_e_aux:wwn
+          { \fp_to_scientific:n {#1} } ;
+          {#2}
       }
   }
-\cs_new:Npn \@@_format_fp_e_aux:wn
-    \s__fp \__fp_chk:w #1#2 #3 #4#5#6#7 ; #8
+\cs_new:Npn \@@_format_fp_e_aux:wwn #1 . #2 e #3 ; #4
   {
-    \@@_format_put:fw { \int_eval:n { #3 - 1 } }
-    \@@_format_put:nw { e }
-    \int_compare:nNnTF {#8} > \c__fp_prec_int
+    \@@_format_put:nw { e #3 }
+    \int_compare:nNnTF {#4} < \c__fp_prec_int
       {
-        \@@_format_put:fw { \prg_replicate:nn { #8 - \c__fp_prec_int + 1 } {0} }
-        \@@_format_put:fw { \use_none:n #4#5#6#7 }
+        \@@_format_put:fw { \str_range:nnn { #2 } { 1 } { #4 } }
+        \@@_format_put:nw { #1 . }
       }
       {
         \@@_format_put:fw
-          { \str_range:nnn { #4#5#6#7 0 } { 2 } { #8 + 1 } }
+          { \prg_replicate:nn { #4 - \c__fp_prec_int + 1 } { 0 } }
+        \@@_format_put:nw { #1 . #2 }
       }
-    \@@_format_put:fw { \use_i:nnnn #4 . }
     \use_none:n \s_stop
   }
 %    \end{macrocode}
@@ -843,33 +856,32 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_format_fp_f:wn}
+% \begin{macro}[EXP]{\@@_format_fp_f:nn}
 % \begin{macro}[EXP]{\@@_format_fp_f_aux:wwwn}
-%   With the |f| type, first filter out special cases.  In the normal
-%   case, round to |#4| (absolute) decimal places.
+%   With the |f| type, first round to |#4| (absolute) decimal places
+%   then filter out special cases, then in normal cases pad with zeros.
 %    \begin{macrocode}
-\cs_new:Npn \@@_format_fp_f:wn \s__fp \__fp_chk:w #1#2#3 ; #4
+\cs_new:Npn \@@_format_fp_f:nn #1#2
   {
-    \int_case:nnF {#1}
+    \exp_args:Nf \@@_format_fp_f_aux:nn
+      { \fp_to_tl:n { abs ( round ( #1 , #2 ) ) } }
+      {#2}
+  }
+\cs_new:Npn \@@_format_fp_f_aux:nn #1#2
+  {
+    \str_case:nnF {#1}
       {
-        {0} { \use:nf { 0 . } { \prg_replicate:nn {#4} { 0 } } }
-        {2} { inf }
-        {3} { nan }
+        { inf } { inf }
+        { nan } { nan }
       }
       {
         \exp_last_unbraced:Nf \@@_format_fp_f_aux:wwwn
-          {
-            \fp_to_decimal:n
-              { abs ( round ( \s__fp \__fp_chk:w #1#2#3 ; , #4 ) ) }
-          }
-          . . ;
-          {#4}
+          { \fp_to_decimal:n {#1} } . . ; {#2}
       }
   }
 \cs_new:Npn \@@_format_fp_f_aux:wwwn #1 . #2 . #3 ; #4
   {
-    \use:nf
-      { #1 . #2 }
+    \use:nf { #1 . #2 }
       { \prg_replicate:nn { #4 - \@@_count:n {#2} } {0} }
   }
 %    \end{macrocode}
@@ -876,53 +888,70 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_format_fp_g:wn}
+% \begin{macro}[EXP]{\@@_format_fp_g:nn}
 % \begin{macro}[EXP]{\@@_format_fp_g_aux:wn}
 % \begin{macro}[EXP]{\@@_format_fp_to_scientific:n, \@@_format_fp_trim:w}
-%   With the |g| type, first filter out special cases.  In the normal
-%   case, round to |#4| significant figures, then test the exponent: if
-%   $-4\leq \meta{exponent} < \meta{precision}$, use the presentation
-%   type |f|, otherwise use the presentation type |e|.  Also, a
-%   \meta{precision} of $0$ is treated like a precision of $1$.
-%   Actually, we don't reuse the |e| and |f| auxiliaries, because we
-%   want to trim trailing zeros.  Thankfully, this is done by
-%   \cs{fp_to_decimal:n} and \cs{fp_to_scientific:n}, acting on the
-%   (absolute value of the) rounded value.
+%   With the |g| type, a special case is when |#2| is empty (no style
+%   nor precision in the original specification): then we output the
+%   number without rounding (and without its sign).  Otherwise round to
+%   |#2| significant figures before filtering out special cases.  (A
+%   \meta{precision} of $0$ is treated like a precision of $1$.)
+%   Distinguish exponents $-4\leq \meta{exponent} < \meta{precision}$
+%   from others and use essentially the |f| or |e| presentations in
+%   these two cases, but trimming trailing zeros.  Because we don't need
+%   to keep a fixed number of digits after the decimal point we can
+%   simply use \cs{fp_to_decimal:n} and \cs{fp_to_scientific:n}, and in
+%   the second case post-process the result by trimming zeros and a
+%   period.
 %    \begin{macrocode}
-\cs_new:Npn \@@_format_fp_g:wn \s__fp \__fp_chk:w #1#2 ; #3
+\cs_new:Npn \@@_format_fp_g:nn #1#2
   {
-    \int_case:nnF {#1}
+    \tl_if_empty:nTF {#2} { \fp_to_tl:n { abs(#1) } }
       {
-        {0} { 0 }
-        {2} { inf }
-        {3} { nan }
+        \exp_args:Nf \@@_format_fp_g_aux:nn
+          { \@@_format_fp_round:nn {#1} { \int_max:nn {1} {#2} } }
+          { \int_max:nn {1} {#2} }
       }
+  }
+\cs_new:Npn \@@_format_fp_g_aux:nn #1#2
+  {
+    \str_case:nnF {#1}
       {
-        \exp_last_unbraced:Nf \@@_format_fp_g_aux:wn
+        { 0 } { 0 }
+        { inf } { inf }
+        { nan } { nan }
+      }
+      {
+        \fp_compare:nTF { 1e-4 <= #1 < 1e#2 }
+          { \fp_to_decimal:n {#1} }
           {
-            \@@_format_fp_round:wn \s__fp \__fp_chk:w #1#2 ;
-              { \int_max:nn {1} {#3} }
+            \exp_last_unbraced:Nf \@@_format_fp_trim:w
+              { \fp_to_scientific:n {#1} }
           }
-          { \int_max:nn {1} {#3} }
       }
   }
-\cs_new:Npn \@@_format_fp_g_aux:wn #1; #2
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_format_fp_trim:w}
+% \begin{macro}[EXP]
+%   {\@@_format_fp_trim_loop:w, \@@_format_fp_trim_dot:w, \@@_format_fp_trim_end:w}
+%   If |#1| ends with a $0$, the \texttt{loop} auxiliary takes that zero
+%   as an end-delimiter for its first argument, and the second argument
+%   is the same \texttt{loop} auxiliary.  Once the last trailing zero is
+%   reached, the second argument is the \texttt{dot} auxiliary,
+%   which removes a trailing dot if any.  We then clean-up with the
+%   \texttt{end} auxiliary, keeping only the number.
+%    \begin{macrocode}
+\cs_new:Npn \@@_format_fp_trim:w #1 e
   {
-    \int_compare:nNnTF { \__fp_exponent:w #1; } < { -3 }
-      { \@@_format_to_scientific:n }
-      {
-        \int_compare:nNnTF { \__fp_exponent:w #1; } > {#2}
-          { \@@_format_to_scientific:n }
-          { \fp_to_decimal:n }
-      }
-    { \__fp_set_sign_o:w 0 #1; @ \prg_do_nothing: }
+    \@@_format_fp_trim_loop:w #1
+      ; \@@_format_fp_trim_loop:w 0; \@@_format_fp_trim_dot:w .; \s_stop e
   }
-\cs_new:Npn \@@_format_to_scientific:n
-  {
-    \exp_after:wN \@@_format_fp_trim:w
-    \exp:w \exp_end_continue_f:w \fp_to_scientific:n
-  }
-\cs_new:Npn \@@_format_fp_trim:w #1 e { \__fp_trim_zeros:w #1 ; e }
+\cs_new:Npn \@@_format_fp_trim_loop:w #1 0; #2 { #2 #1 ; #2 }
+\cs_new:Npn \@@_format_fp_trim_dot:w #1 .; { \@@_format_fp_trim_end:w #1 ; }
+\cs_new:Npn \@@_format_fp_trim_end:w #1 ; #2 \s_stop { #1 }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -944,14 +973,6 @@
   { Invalid~style~'#1'~for~type~'#2'. }
 %    \end{macrocode}
 %
-% \subsection{Todos}
-%
-% \begin{itemize}
-%   \item Check what happens during floating point formatting when a
-%     number is rounded to $0$ or $\infty$.  I think the |e| and |f|
-%     types break horribly.
-% \end{itemize}
-%
 %    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -136,7 +136,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3sys-shell}{2019-07-01}{}
+\ProvidesExplPackage{l3sys-shell}{2019-08-25}{}
   {L3 Experimental system shell functions}
 %</package>
 %    \end{macrocode}
@@ -321,6 +321,7 @@
             \char_set_catcode_other:N \exp_not:N \~
             \char_set_catcode_other:N \exp_not:N \%
             \char_set_catcode_space:N \exp_not:N \ %
+            \tex_endlinechar:D -1 \scan_stop:
           }
         \exp_not:N \l_@@_tmp_tl
         \str_set:NV #1 \exp_not:N \l_@@_tmp_tl

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -56,7 +56,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -675,7 +675,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2019-07-01}{}
+\ProvidesExplPackage{xcoffins}{2019-08-25}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -687,7 +687,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3galley}{2019-07-01}{}
+\ProvidesExplPackage{l3galley}{2019-08-25}{}
   {L3 Experimental galley code}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-07-01}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -734,7 +734,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2019-07-01}{}
+\ProvidesExplPackage{xgalley}{2019-08-25}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -23,7 +23,7 @@
 % for those people who are interested.
 %
 %<*driver|generic|package>
-\def\ExplFileDate{2019-08-14}%
+\def\ExplFileDate{2019-08-25}%
 %</driver|generic|package>
 %<*driver>
 \documentclass[full]{l3doc}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -246,6 +246,15 @@
 %   is~$0$.
 % \end{function}
 %
+% \begin{function}[pTF, added = 2019-08-25]{\fp_if_nan:n}
+%   \begin{syntax}
+%     \cs{fp_if_nan:n} \Arg{fpexpr}
+%   \end{syntax}
+%   Evaluates the \meta{fpexpr} and tests whether the result is exactly
+%   \nan{}.  The test returns \texttt{false} for any other result, even
+%   a tuple containing \nan{}.
+% \end{function}
+%
 % \section{Additions to \pkg{l3fparray}}
 %
 % \begin{function}[added = 2018-05-05]{\fparray_new:Nn}
@@ -326,7 +335,9 @@
 %   until reaching the end of the file, stores the \meta{lines} in the
 %   \meta{tl~var} then applies the \meta{code}.  The \meta{code} will
 %   usually make use of the \meta{variable}, but this is not enforced.
-%   The assignments to the \meta{variable} are local.  \TeX{} ignores
+%   The assignments to the \meta{variable} are local.
+%   Its value after the loop is the last set of \meta{lines}, or its
+%   original value if the \meta{stream} is empty.  \TeX{} ignores
 %   any trailing new-line marker from the file it reads.
 %   This function is typically faster than \cs{ior_map_inline:Nn}.
 % \end{function}
@@ -333,15 +344,17 @@
 %
 % \begin{function}[added = 2019-01-13]{\ior_str_map_variable:NNn}
 %   \begin{syntax}
-%     \cs{ior_str_map_variable:NNn} \meta{stream} \meta{tl~var} \Arg{code}
+%     \cs{ior_str_map_variable:NNn} \meta{stream} \meta{variable} \Arg{code}
 %   \end{syntax}
 %   For each \meta{line} in the \meta{stream}, stores the \meta{line} in
-%   the \meta{tl~var} then applies the \meta{code}.  The material is
+%   the \meta{variable} then applies the \meta{code}.  The material is
 %   read from the \meta{stream} as a series of tokens with category code
 %   $12$ (other), with the exception of space characters which are given
 %   category code $10$ (space).  The \meta{code} will usually make use
 %   of the \meta{variable}, but this is not enforced.  The assignments
-%   to the \meta{variable} are local.  Note that \TeX{} removes trailing
+%   to the \meta{variable} are local.  Its value after the loop is the
+%   last \meta{line}, or its original value if the \meta{stream} is
+%   empty.  Note that \TeX{} removes trailing
 %   space and tab characters (character codes 32 and 9) from every line
 %   upon input.  \TeX{} also ignores any trailing new-line marker from
 %   the file it reads.
@@ -611,7 +624,7 @@
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[added = 2017-11-28]
+% \begin{function}[added = 2017-11-28, updated = 2019-08-25]
 %   {
 %     \prop_set_from_keyval:Nn, \prop_set_from_keyval:cn,
 %     \prop_gset_from_keyval:Nn, \prop_gset_from_keyval:cn,
@@ -624,10 +637,10 @@
 %       \}
 %   \end{syntax}
 %   Sets \meta{prop~var} to contain key--value pairs given in the second
-%   argument.
+%   argument.  If duplicate keys appear only one of the values is kept.
 % \end{function}
 %
-% \begin{function}[added = 2017-11-28]
+% \begin{function}[added = 2017-11-28, updated = 2019-08-25]
 %   {\prop_const_from_keyval:Nn, \prop_const_from_keyval:cn}
 %   \begin{syntax}
 %     \cs{prop_const_from_keyval:Nn} \meta{prop~var}
@@ -639,6 +652,7 @@
 %   Creates a new constant \meta{prop~var} or raises an error if the
 %   name is already taken. The \meta{prop~var} is set globally to
 %   contain key--value pairs given in the second argument.
+%   If duplicate keys appear only one of the values is kept.
 % \end{function}
 %
 % \section{Additions to \pkg{l3seq}}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -401,6 +401,9 @@
 %
 % The functions described in this section apply a specified function
 % to each item of a comma list.
+% All mappings are done at the current group level, \emph{i.e.}~any
+% local assignments made by the \meta{function} or \meta{code} discussed
+% below remain in effect after the loop.
 %
 % When the comma list is given explicitly, as an \texttt{n}-type argument,
 % spaces are trimmed around each item.
@@ -448,7 +451,9 @@
 %   (token list) \meta{variable} and applies the \meta{code}.  The
 %   \meta{code} will usually make use of the \meta{variable}, but this
 %   is not enforced.  The assignments to the \meta{variable} are local.
-%   The \meta{items} are returned from left to right.
+%   Its value after the loop is the last \meta{item} in the \meta{comma
+%   list}, or its original value if there were no \meta{item}.  The
+%   \meta{items} are returned from left to right.
 % \end{function}
 %
 % \begin{function}[rEXP, updated = 2012-06-29]{\clist_map_break:}
@@ -1694,6 +1699,8 @@
 %   additionally we store each item in the given variable.
 %   As for inline mappings, space trimming for the \texttt{n}
 %   variant is done by storing the comma list in a variable.
+%   The quark test is done before assigning the item to the variable:
+%   this avoids storing a quark which the user wouldn't expect.
 %   The strange \cs{use:n} avoids unlikely problems when |#2| would
 %   contain \cs{q_recursion_stop}.
 %    \begin{macrocode}
@@ -1715,8 +1722,8 @@
   }
 \cs_new_protected:Npn \@@_map_variable:Nnw #1#2#3,
   {
+    \quark_if_recursion_tail_stop:n {#3}
     \tl_set:Nn #1 {#3}
-    \quark_if_recursion_tail_stop:N #1
     \use:n {#2}
     \@@_map_variable:Nnw #1 {#2}
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -79,7 +79,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 % \maketitle
 % \tableofcontents
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -241,6 +241,10 @@
 %   \end{texnote}
 % \end{function}
 %
+% All mappings are done at the current group level, \emph{i.e.}~any
+% local assignments made by the \meta{function} or \meta{code} discussed
+% below remain in effect after the loop.
+%
 % \begin{function}[added = 2012-02-11]{\ior_map_inline:Nn}
 %   \begin{syntax}
 %     \cs{ior_map_inline:Nn} \meta{stream} \Arg{inline function}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -369,6 +369,20 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\@@_kind:w}
+%   Expands to $0$ for zeros, $1$ for normal floating point numbers, $2$
+%   for infinities, $3$ for \nan{}, $4$ for tuples.
+%    \begin{macrocode}
+\cs_new:Npn \@@_kind:w #1
+  {
+    \@@_if_type_fp:NTwFw
+      #1 \@@_use_ii_until_s:nnw
+      \s_@@ { \@@_use_i_until_s:nw 4 }
+      \q_stop
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Overflow, underflow, and exact zero}
 %
 %^^A todo: the sign of exact zeros should depend on the rounding mode.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -83,7 +83,7 @@
 %     \cs{@@_ternary_auxii:NwwN} have to be understood.
 % \end{itemize}
 %
-% \subsection{Existence test}
+% \subsection{Tests}
 %
 % \begin{macro}[pTF]{\fp_if_exist:N, \fp_if_exist:c}
 %   Copies of the \texttt{cs} functions defined in \pkg{l3basics}.
@@ -93,6 +93,21 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[pTF]{\fp_if_nan:n}
+%   Evaluate and check if the result is a floating point of the same
+%   kind as \nan{}.
+%    \begin{macrocode}
+\prg_new_conditional:Npnn \fp_if_nan:n #1 { TF , T , F , p }
+  {
+    \if:w 3 \exp_last_unbraced:Nf \@@_kind:w { \@@_parse:n {#1} }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Comparison}
 %
 % \begin{macro}[pTF, EXP]{\fp_compare:n}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -483,14 +483,26 @@
 %     \@@_round_special:NwwNnn ,
 %     \@@_round_special_aux:Nw
 %   }
+%   If the number of digits to round to is an integer or infinity all is
+%   good; if it is \texttt{nan} then just produce a \texttt{nan};
+%   otherwise invalid as we have something like |round(1,3.14)| where
+%   the number of digits is not an integer.
 %    \begin{macrocode}
 \cs_new:Npn \@@_round:Nww #1#2 ; #3 ;
   {
     \@@_small_int:wTF #3; { \@@_round:Nwn #1#2; }
       {
-        \@@_invalid_operation_tl_o:ff
-          { \@@_round_name_from_cs:N #1 }
-          { \@@_array_to_clist:n { #2; #3; } }
+        \if:w 3 \@@_kind:w #3 ;
+          \exp_after:wN \use_i:nn
+        \else:
+          \exp_after:wN \use_ii:nn
+        \fi:
+        { \exp_after:wN \c_nan_fp }
+        {
+          \@@_invalid_operation_tl_o:ff
+            { \@@_round_name_from_cs:N #1 }
+            { \@@_array_to_clist:n { #2; #3; } }
+        }
       }
   }
 \cs_new:Npn \@@_round:Nwn #1 \s_@@ \@@_chk:w #2#3#4; #5

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -1089,6 +1089,7 @@
 %   $x$~to $n$~places.  If $n$~is an integer, this rounds~$x$ to a
 %   multiple of~$10^{-n}$; if $n=+\infty$, this always yields~$x$; if
 %   $n=-\infty$, this yields one of $\pm 0$, $\pm\infty$, or~\nan{}; if
+%   $n=\nan{}$, this yields \nan{}; if
 %   $n$~is neither $\pm\infty$ nor an integer, then an \enquote{invalid
 %     operation} exception is raised.  When \meta{fpexpr_2} is omitted,
 %   $n=0$, \emph{i.e.}, \meta{fpexpr_1} is rounded to an integer.  The
@@ -1096,7 +1097,7 @@
 %   \begin{itemize}
 %     \item |round| yields the multiple of~$10^{-n}$ closest to~$x$,
 %       with ties ($x$ half-way between two such multiples) rounded
-%       as follows.  If $t$ is \texttt{nan} or not given the even
+%       as follows.  If $t$ is \texttt{nan} (or not given) the even
 %       multiple is chosen (\enquote{ties to even}), if $t=\pm 0$ the
 %       multiple closest to $0$ is chosen (\enquote{ties to zero}),
 %       if $t$ is positive/negative the multiple closest to $\infty$/$-\infty$ is chosen
@@ -1370,9 +1371,10 @@
 %   \end{syntax}
 %   Evaluates the \meta{floating point expression} as described for
 %   \cs{fp_eval:n} and leaves the absolute value of the result in the
-%   input stream.  If the argument is a tuple, \enquote{invalid
-%   operation} occurs, but no other case raises exceptions.  Within
-%   floating point expressions, |abs()| can be used.
+%   input stream.  If the argument is $\pm\infty$, \nan{} or a tuple,
+%   \enquote{invalid operation} occurs.  Within floating point
+%   expressions, |abs()| can be used; it accepts $\pm\infty$ and \nan{}
+%   as arguments.
 % \end{function}
 %
 % \begin{function}[EXP, added = 2012-09-26, tested = m3fp-convert003]
@@ -1418,7 +1420,7 @@
 %   \item Add an |array(1,2,3)| and |i=complex(0,1)|.
 %   \item Provide an experimental |map| function?  Perhaps easier to
 %     implement if it is a single character, |@sin(1,2)|?
-%   \item Provide \cs{fp_if_nan:nTF}, and an |isnan| function?
+%   \item Provide an |isnan| function analogue of \cs{fp_if_nan:nTF}?
 %   \item Support keyword arguments?
 % \end{itemize}
 % \pkg{Pgfmath} also provides box-measurements (depth, height, width), but

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -339,6 +339,10 @@
 %
 % \section{Mapping to property lists}
 %
+% All mappings are done at the current group level, \emph{i.e.}~any
+% local assignments made by the \meta{function} or \meta{code} discussed
+% below remain in effect after the loop.
+%
 % \begin{function}[updated = 2013-01-08, rEXP]
 %   {\prop_map_function:NN, \prop_map_function:cN}
 %   \begin{syntax}
@@ -634,6 +638,13 @@
 % \end{variable}
 % \end{variable}
 %
+% \begin{variable}{\l_@@_internal_prop}
+%   Property list used by \cs{prop_set_from_keyval:Nn} and others.
+%    \begin{macrocode}
+\prop_new:N \l_@@_internal_prop
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}{\prop_set_from_keyval:Nn, \prop_set_from_keyval:cn}
 % \begin{macro}{\prop_gset_from_keyval:Nn, \prop_gset_from_keyval:cn}
 % \begin{macro}{\prop_const_from_keyval:Nn, \prop_const_from_keyval:cn}
@@ -647,70 +658,81 @@
 %     \@@_from_keyval_value:n,
 %     \@@_from_keyval_value:w
 %   }
-%   Loop through items separated by commas, with \cs{q_mark} to avoid
-%   losing braces.  After checking for termination, split the item at
-%   the first then at the second |=| (which ought to be the first of the
-%   trailing~|=|).  At both splits, trim spaces and
-%   call \cs{@@_from_keyval_key:w}, then \cs{@@_from_keyval_value:w},
-%   followed by the trimmed material, \cs{q_nil}, the subsequent part of
-%   the item, and the trailing |=|'s and \cs{q_stop}.  After finding the
-%   \meta{key} just store it after \cs{q_stop}.  After finding the
-%   \meta{value} ignore completely empty items (both trailing~|=| were
-%   used as delimiters and all parts are empty); if the remaining
-%   part~|#2| consists exactly of the second trailing~|=| (namely there
-%   was exactly one |=|~in the item) then output one key--value pair for
-%   the property list; otherwise complain about a missing or extra~|=|.
+%   To avoid tracking throughout the loop the variable name and whether
+%   the assignment is local/global, do everything in a scratch variable
+%   and empty it afterwards to avoid wasting memory.  Loop through items
+%   separated by commas, with \cs{prg_do_nothing:} to avoid losing
+%   braces.  After checking for termination, split the item at the first
+%   and then at the second |=| (which ought to be the first of the
+%   trailing~|=| that we added).  For both splits trim spaces and call a
+%   function (first \cs{@@_from_keyval_key:w} then
+%   \cs{@@_from_keyval_value:w}), followed by the trimmed material,
+%   \cs{q_nil}, the subsequent part of the item, and the trailing |=|'s
+%   and \cs{q_stop}.  After finding the \meta{key} just store it after
+%   \cs{q_stop}.  After finding the \meta{value} ignore completely empty
+%   items (both trailing~|=| were used as delimiters and all parts are
+%   empty); if the remaining part~|#2| consists exactly of the second
+%   trailing~|=| (namely there was exactly one |=|~in the item) then
+%   output one key--value pair for the property list; otherwise complain
+%   about a missing or extra~|=|.
 %    \begin{macrocode}
 \cs_new_protected:Npn \prop_set_from_keyval:Nn #1#2
-  { \tl_set:Nx #1 { \@@_from_keyval:n {#2} } }
+  {
+    \prop_clear:N \l_@@_internal_prop
+    \@@_from_keyval:n {#2}
+    \prop_set_eq:NN #1 \l_@@_internal_prop
+    \prop_clear:N \l_@@_internal_prop
+  }
 \cs_generate_variant:Nn \prop_set_from_keyval:Nn { c }
 \cs_new_protected:Npn \prop_gset_from_keyval:Nn #1#2
-  { \tl_gset:Nx #1 { \@@_from_keyval:n {#2} } }
+  {
+    \prop_clear:N \l_@@_internal_prop
+    \@@_from_keyval:n {#2}
+    \prop_gset_eq:NN #1 \l_@@_internal_prop
+    \prop_clear:N \l_@@_internal_prop
+  }
 \cs_generate_variant:Nn \prop_gset_from_keyval:Nn { c }
 \cs_new_protected:Npn \prop_const_from_keyval:Nn #1#2
-  { \tl_const:Nx #1 { \@@_from_keyval:n {#2} } }
+  {
+    \prop_clear:N \l_@@_internal_prop
+    \@@_from_keyval:n {#2}
+    \tl_const:Nx #1 { \exp_not:o \l_@@_internal_prop }
+    \prop_clear:N \l_@@_internal_prop
+  }
 \cs_generate_variant:Nn \prop_const_from_keyval:Nn { c }
-\cs_new:Npn \@@_from_keyval:n #1
+\cs_new_protected:Npn \@@_from_keyval:n #1
   {
-    \s_@@
-    \@@_from_keyval_loop:w \q_mark #1 ,
+    \@@_from_keyval_loop:w \prg_do_nothing: #1 ,
       \q_recursion_tail , \q_recursion_stop
   }
-\cs_new:Npn \@@_from_keyval_loop:w #1 ,
+\cs_new_protected:Npn \@@_from_keyval_loop:w #1 ,
   {
-    \quark_if_recursion_tail_stop:o { \use_none:n #1 }
+    \quark_if_recursion_tail_stop:o {#1}
     \@@_from_keyval_split:Nw \@@_from_keyval_key:n
-      #1 = = \q_stop { \use_none:n #1 }
-    \@@_from_keyval_loop:w \q_mark
+      #1 = = \q_stop {#1}
+    \@@_from_keyval_loop:w \prg_do_nothing:
   }
-\cs_new:Npn \@@_from_keyval_split:Nw #1#2 =
+\cs_new_protected:Npn \@@_from_keyval_split:Nw #1#2 =
+  { \tl_trim_spaces_apply:oN {#2} #1 }
+\cs_new_protected:Npn \@@_from_keyval_key:n #1
+  { \@@_from_keyval_key:w #1 \q_nil }
+\cs_new_protected:Npn \@@_from_keyval_key:w #1 \q_nil #2 \q_stop
   {
-    \tl_trim_spaces_apply:oN { \use_none:n #2 } #1
-      \q_nil
-  }
-\cs_new:Npn \@@_from_keyval_key:n #1
-  { \@@_from_keyval_key:w #1 }
-\cs_new:Npn \@@_from_keyval_key:w #1 \q_nil #2 \q_stop
-  {
     \@@_from_keyval_split:Nw \@@_from_keyval_value:n
-      \q_mark #2 \q_stop {#1}
+      \prg_do_nothing: #2 \q_stop {#1}
   }
-\cs_new:Npn \@@_from_keyval_value:n #1
-  { \@@_from_keyval_value:w #1 }
-\cs_new:Npn \@@_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4
+\cs_new_protected:Npn \@@_from_keyval_value:n #1
+  { \@@_from_keyval_value:w #1 \q_nil }
+\cs_new_protected:Npn \@@_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4
   {
     \tl_if_empty:nF { #3 #1 #2 }
       {
         \str_if_eq:nnTF {#2} { = }
+          { \prop_put:Nnn \l_@@_internal_prop {#3} {#1} }
           {
-            \exp_not:N \@@_pair:wn \tl_to_str:n {#3}
-            \s_@@ { \exp_not:n {#1} }
+            \__kernel_msg_error:nnx { kernel } { prop-keyval }
+              { \exp_not:o {#4} }
           }
-          {
-            \__kernel_msg_expandable_error:nnf
-              { kernel } { prop-keyval }
-              { \exp_after:wN \exp_stop_f: #4 }
-          }
       }
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -486,6 +486,10 @@
 %
 % \section{Mapping to sequences}
 %
+% All mappings are done at the current group level, \emph{i.e.}~any
+% local assignments made by the \meta{function} or \meta{code} discussed
+% below remain in effect after the loop.
+%
 % \begin{function}[rEXP, updated = 2012-06-29]
 %   {\seq_map_function:NN, \seq_map_function:cN}
 %   \begin{syntax}
@@ -521,7 +525,9 @@
 %   Stores each \meta{item} of the \meta{sequence} in turn in the (token
 %   list) \meta{variable} and applies the \meta{code}.  The \meta{code}
 %   will usually make use of the \meta{variable}, but this is not
-%   enforced.  The assignments to the \meta{variable} are local.  The
+%   enforced.  The assignments to the \meta{variable} are local.  Its
+%   value after the loop is the last \meta{item} in the \meta{sequence},
+%   or its original value if the \meta{sequence} is empty.  The
 %   \meta{items} are returned from left to right.
 % \end{function}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -401,6 +401,10 @@
 %
 % \section{Mapping to strings}
 %
+% All mappings are done at the current group level, \emph{i.e.}~any
+% local assignments made by the \meta{function} or \meta{code} discussed
+% below remain in effect after the loop.
+%
 % \begin{function}[added = 2017-11-14, rEXP]
 %   {\str_map_function:NN, \str_map_function:cN}
 %   \begin{syntax}
@@ -454,7 +458,9 @@
 %   in turn in the (string or token list) \meta{variable} and applies
 %   the \meta{code}.  The \meta{code} will usually make use of the
 %   \meta{variable}, but this is not enforced.  The assignments to the
-%   \meta{variable} are local.  See also \cs{str_map_inline:Nn}.
+%   \meta{variable} are local.  Its value after the loop is the last
+%   \meta{character} in the \meta{string}, or its original value if the
+%   \meta{string} is empty.  See also \cs{str_map_inline:Nn}.
 % \end{function}
 %
 % \begin{function}[added = 2017-11-14]
@@ -467,7 +473,9 @@
 %   the (string or token list) \meta{variable} and applies the
 %   \meta{code}.  The \meta{code} will usually make use of the
 %   \meta{variable}, but this is not enforced.  The assignments to the
-%   \meta{variable} are local.  See also \cs{str_map_inline:Nn}.
+%   \meta{variable} are local.  Its value after the loop is the last
+%   \meta{character} in the \meta{string}, or its original value if the
+%   \meta{string} is empty.  See also \cs{str_map_inline:Nn}.
 % \end{function}
 %
 % \begin{function}[added = 2017-10-08, rEXP]{\str_map_break:}
@@ -1275,6 +1283,10 @@
 %   times speed up by testing only every $9$-th character for whether it
 %   is \cs{q_recursion_tail} (also by converting $9$ spaces at a time in
 %   the \cs{str_map_function:nN} case).
+%
+%   For the \texttt{map_variable} functions we use a string assignment
+%   to store each character because spaces are made catcode~$12$ before
+%   the loop.
 %    \begin{macrocode}
 \cs_new:Npn \str_map_function:nN #1#2
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -88,6 +88,9 @@
 %       parameter, 7: superscript, 8: subscript, A: space, B: letter,
 %       C:other, D:active).
 %   \end{itemize}
+%   As all other mappings the mapping is done at the current group
+%   level, \emph{i.e.}~any local assignments made by the \meta{inline
+%   function} remain in effect after the loop.
 % \end{function}
 %
 % \end{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %
@@ -505,6 +505,10 @@
 %
 % \section{Mapping to token lists}
 %
+% All mappings are done at the current group level, \emph{i.e.}~any
+% local assignments made by the \meta{function} or \meta{code} discussed
+% below remain in effect after the loop.
+%
 % \begin{function}[updated = 2012-06-29, rEXP]
 %   {\tl_map_function:NN, \tl_map_function:cN}
 %   \begin{syntax}
@@ -555,8 +559,10 @@
 %   Stores each \meta{item} of the \meta{tl~var} in turn in the (token
 %   list) \meta{variable} and applies the \meta{code}.  The \meta{code}
 %   will usually make use of the \meta{variable}, but this is not
-%   enforced.  The assignments to the \meta{variable} are local.  See
-%   also \cs{tl_map_inline:Nn}.
+%   enforced.  The assignments to the \meta{variable} are local.  Its
+%   value after the loop is the last \meta{item} in the \meta{tl~var},
+%   or its original value if the \meta{tl~var} is blank.  See also
+%   \cs{tl_map_inline:Nn}.
 % \end{function}
 %
 % \begin{function}[updated = 2012-06-29]{\tl_map_variable:nNn}
@@ -567,6 +573,8 @@
 %   (token list) \meta{variable} and applies the \meta{code}.  The
 %   \meta{code} will usually make use of the \meta{variable}, but this
 %   is not enforced.  The assignments to the \meta{variable} are local.
+%   Its value after the loop is the last \meta{item} in the
+%   \meta{tl~var}, or its original value if the \meta{tl~var} is blank.
 %   See also \cs{tl_map_inline:nn}.
 % \end{function}
 %
@@ -1558,12 +1566,12 @@
 % \begin{macro}[EXP]{\@@_rescan:NNw}
 %   In a group, after some initial setup explained below and the user
 %   setup~|#3| (followed by \cs{scan_stop:} to be safe), there is a call
-%   to \cs{@@_set_rescan:nNN}.  This shared auxiliary distinguishes
-%   single-line and multi-line files as explained below.  In the
-%   simplest case of multi-line files it calls (with the same arguments)
+%   to \cs{@@_set_rescan:nNN}.  This shared auxiliary defined later
+%   distinguishes single-line and multi-line ``files''.  In the simplest
+%   case of multi-line files, it calls (with the same arguments)
 %   \cs{@@_set_rescan_multi:nNN}, whose code is included here to help
-%   understand the approach: it rescans its argument |#1|, closes the
-%   group, and performs the assignment.
+%   understand the approach.  This function rescans its argument |#1|,
+%   closes the group, and performs the assignment.
 %
 %   One difficulty when rescanning is that \tn{scantokens} treats the
 %   argument as a file, and without the correct settings a \TeX{} error
@@ -1575,9 +1583,9 @@
 %   \tn{scantokens} and closing it inside that temporary file; we avoid
 %   that by setting \tn{tracingnesting}.  The standard solution to the
 %   ``File ended'' error is to grab the rescanned tokens as a delimited
-%   argument of an auxiliary, here \cs{@@_set_rescan:NNw}, that performs
-%   the assignment, then let \TeX{} ``execute'' the end of file marker.
-%   As usual in delimited arguments we use \cs{prg_do_nothing:} to avoid
+%   argument of an auxiliary, here \cs{@@_rescan:NNw}, that performs the
+%   assignment, then let \TeX{} ``execute'' the end of file marker.  As
+%   usual in delimited arguments we use \cs{prg_do_nothing:} to avoid
 %   stripping an outer set braces: this is removed by using
 %   \texttt{o}-expanding assignments.  The delimiter cannot appear
 %   within the rescanned token list because it contains twice the same
@@ -1589,6 +1597,19 @@
 %   rescanned result is code that looks further in the input stream for
 %   arguments, it would break.
 %
+%   For multi-line files the only subtlety is that \tn{newlinechar}
+%   should be equal to \tn{endlinechar} because \tn{newlinechar}
+%   characters become new lines and then become \tn{endlinechar}
+%   characters when writing to an abstract file and reading back.  This
+%   equality is ensured by setting \tn{newlinechar} equal to
+%   \tn{endlinechar}.  Prior to this, \tn{endlinechar} is set to $-1$ if
+%   it was $32$ (in particular true after \cs{ExplSyntaxOn}) to avoid
+%   unreasonable line-breaks at every space for instance in error
+%   messages triggered by the user setup.  Another side effect of
+%   reading back from the file is that spaces (catcode $10$) are ignored
+%   at the beginning of lines, and spaces and tabs (character code $32$
+%   and $9$) are ignored at the end of lines.
+%
 %   The two \cs{if_false:} \ldots{} \cs{fi:} are there to prevent
 %   alignment tabs to cause a change of tabular cell while rescanning.
 %   We put the \enquote{opening} one after \cs{group_begin:} so that if
@@ -1596,10 +1617,6 @@
 %   remain balanced.  This is essential in \texttt{e}-type arguments
 %   when \tn{expanded} is not available.
 %    \begin{macrocode}
-\cs_new_protected:Npn \tl_set_rescan:Nnn
-  { \@@_set_rescan:NNnn \tl_set:No }
-\cs_new_protected:Npn \tl_gset_rescan:Nnn
-  { \@@_set_rescan:NNnn \tl_gset:No }
 \cs_new_protected:Npn \tl_rescan:nn #1#2
   {
     \tl_set_rescan:Nnn \l_@@_internal_a_tl {#1} {#2}
@@ -1606,12 +1623,15 @@
     \exp_after:wN \tl_clear:N \exp_after:wN \l_@@_internal_a_tl
     \l_@@_internal_a_tl
   }
+\cs_new_protected:Npn \tl_set_rescan:Nnn
+  { \@@_set_rescan:NNnn \tl_set:No }
+\cs_new_protected:Npn \tl_gset_rescan:Nnn
+  { \@@_set_rescan:NNnn \tl_gset:No }
 \cs_new_protected:Npn \@@_set_rescan:NNnn #1#2#3#4
   {
     \group_begin:
       \if_false: { \fi:
       \int_set_eq:NN \tex_tracingnesting:D \c_zero_int
-      \exp_args:No \tex_everyeof:D { \c_@@_rescan_marker_tl }
       \int_compare:nNnT \tex_endlinechar:D = { 32 }
         { \int_set:Nn \tex_endlinechar:D { -1 } }
       \int_set_eq:NN \tex_newlinechar:D \tex_endlinechar:D
@@ -1621,6 +1641,7 @@
   }
 \cs_new_protected:Npn \@@_set_rescan_multi:nNN #1#2#3
   {
+    \exp_args:No \tex_everyeof:D { \c_@@_rescan_marker_tl }
     \exp_after:wN \@@_rescan:NNw
     \exp_after:wN #2
     \exp_after:wN #3
@@ -1645,28 +1666,15 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_set_rescan:nNN}
-% \begin{macro}{\@@_set_rescan_single:nnNN, \@@_set_rescan_single_aux:nnNN}
-%   This function calls \cs{@@_set_rescan_multi:nNN} or
-%   \cs{@@_set_rescan_single:nnNN} |{ ' }| depending on whether its
-%   argument is a single-line fragment of code/data or is made of
-%   multiple lines by testing for the presence of a \tn{newlinechar}
-%   character.  If \tn{newlinechar} is out of range, the argument is
-%   assumed to be a single line.
+% \begin{macro}{\@@_set_rescan_single:nnNN, \@@_set_rescan_single_aux:nnnNN}
+% \begin{macro}[rEXP]{\@@_set_rescan_single_aux:w}
+%   The function \cs{@@_set_rescan:nNN} calls \cs{@@_set_rescan_multi:nNN} or
+%   \cs{@@_set_rescan_single:nnNN} |{ ' }| depending on whether its argument
+%   is a single-line fragment of code/data or is made of multiple lines
+%   by testing for the presence of a \tn{newlinechar} character.  If
+%   \tn{newlinechar} is out of range, the argument is assumed to be a
+%   single line.
 %
-%   The case of multiple lines is a straightforward application of
-%   \tn{scantokens} as described above.  The only subtlety is that
-%   \tn{newlinechar} should be equal to \tn{endlinechar} because
-%   \tn{newlinechar} characters become new lines and then become
-%   \tn{endlinechar} characters when writing to an abstract file and
-%   reading back.  This equality is ensured by setting \tn{newlinechar}
-%   equal to \tn{endlinechar}.  Prior to this, \tn{endlinechar} is set
-%   to $-1$ if it was $32$ (in particular true after \cs{ExplSyntaxOn})
-%   to avoid unreasonable line-breaks at every space for instance in
-%   error messages triggered by the user setup.  Another side effect of
-%   reading back from the file is that spaces (catcode $10$) are
-%   ignored at the beginning of lines, and spaces and tabs (character
-%   code $32$ and $9$) are ignored at the end of lines.
-%
 %   For a single line, no \tn{endlinechar} should be added, so it is
 %   set to $-1$, and spaces should not be removed.
 %   Trailing spaces and tabs are a difficult matter, as \TeX{} removes
@@ -1682,13 +1690,27 @@
 %   of starting point was made because this is the start of a very long
 %   range of characters whose standard category is letter or other,
 %   thus minimizing the number of steps needed by the loop (most often
-%   just a single one).  Once a valid character is found, run some code
-%   very similar to \cs{@@_set_rescan_multi:nNN} but with that character
-%   put at the start and end.  The auxiliary \cs{@@_rescan:NNw} must be
-%   redefined to also remove the additional character (with the
-%   appropriate catcode thanks to \cs{char_generate:nn}).  If no valid
-%   character is found (very rare), fall-back on
-%   \cs{@@_set_rescan_multi:nNN}.
+%   just a single one).  If no valid character is found (very rare),
+%   fall-back on \cs{@@_set_rescan_multi:nNN}.
+%
+%   Otherwise, once a valid character is found (let us use |'| in this
+%   explanation) run some code very similar to \cs{@@_set_rescan_multi:nNN}
+%   but with |'| added at both ends of the input.  Of course, we need to
+%   define the auxiliary \cs{@@_set_rescan_single:NNww} on the fly to remove
+%   the additional~|'| that is just before |::| (by which we mean
+%   \cs{c_@@_rescan_marker_tl}).  Note that the argument must be
+%   delimited by |'| with the current catcode; this is done thanks to
+%   \cs{char_generate:nn}.  Yet another issue is that the rescanned
+%   token list may contain a comment character, in which case the |'| we
+%   expected is not there.  We fix this as follows: rather than just
+%   |::| we set \tn{everyeof} to |::|\Arg{code1} |'::|\Arg{code2}
+%   \cs{q_stop}.  The auxiliary \cs{@@_set_rescan_single:NNww} runs the
+%   \texttt{o}-expanding assignment, expanding either \meta{code1} or
+%   \meta{code2} before its the main argument~|#3|.  In the typical case
+%   without comment character, \meta{code1} is expanded, removing the
+%   leading~|'|.  In the rarer case with comment character, \meta{code2}
+%   is expanded, calling \cs{@@_set_rescan_single_aux:w}, which removes the
+%   trailing |::|\Arg{code1} and the leading~|'|.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_set_rescan:nNN #1
   {
@@ -1710,7 +1732,8 @@
     \int_compare:nNnTF
       { \char_value_catcode:n {#1} / 2 } = 6
       {
-        \exp_args:Nf \@@_set_rescan_single_aux:nnNN
+        \exp_args:Nof \@@_set_rescan_single_aux:nnnNN
+          \c_@@_rescan_marker_tl
           { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
       }
       {
@@ -1722,23 +1745,32 @@
           { \@@_set_rescan_multi:nNN }
       }
   }
-\cs_new_protected:Npn \@@_set_rescan_single_aux:nnNN #1#2#3#4
+\cs_new_protected:Npn \@@_set_rescan_single_aux:nnnNN #1#2#3#4#5
   {
-    \exp_args:Nno \use:nn
-      { \cs_set:Npn \@@_rescan:NNw ##1##2##3 #1 }
-      \c_@@_rescan_marker_tl
+    \tex_everyeof:D
       {
+        #1 \use_none:n
+        #2 #1 { \exp:w \@@_set_rescan_single_aux:w }
+        \q_stop
+      }
+    \cs_set:Npn \@@_rescan:NNw ##1##2##3 #2 #1 ##4 ##5 \q_stop
+      {
         \group_end:
-        ##1 ##2 { \use_none:n ##3 }
+        ##1 ##2 { ##4 ##3 }
       }
     \exp_after:wN \@@_rescan:NNw
-    \exp_after:wN #3
     \exp_after:wN #4
-    \tex_scantokens:D { #1 #2 #1 }
+    \exp_after:wN #5
+    \tex_scantokens:D { #2 #3 #2 }
   }
+\exp_args:Nno \use:nn
+  { \cs_new:Npn \@@_set_rescan_single_aux:w #1 }
+  \c_@@_rescan_marker_tl #2
+  { \use_i:nn \exp_end: #1 }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \subsection{Modifying token list variables}
 %
@@ -2379,9 +2411,10 @@
 % \begin{macro}{\tl_map_variable:nNn}
 % \begin{macro}{\tl_map_variable:NNn, \tl_map_variable:cNn}
 % \begin{macro}{\@@_map_variable:Nnn}
-%   \cs{tl_map_variable:nNn} \meta{token list} \meta{temp} \meta{action}
-%   assigns
-%   \meta{temp} to each element and executes \meta{action}.
+%   \cs{tl_map_variable:nNn} \meta{token list} \meta{tl~var}
+%   \meta{action} assigns \meta{tl~var} to each element and executes
+%   \meta{action}.  The assignment to \meta{tl~var} is done after the
+%   quark test so that this variable does not get set to a quark.
 %    \begin{macrocode}
 \cs_new_protected:Npn \tl_map_variable:nNn #1#2#3
   {
@@ -2393,8 +2426,8 @@
   { \exp_args:No \tl_map_variable:nNn }
 \cs_new_protected:Npn \@@_map_variable:Nnn #1#2#3
   {
+    \quark_if_recursion_tail_break:nN {#3} \tl_map_break:
     \tl_set:Nn #1 {#3}
-    \quark_if_recursion_tail_break:NN #1 \tl_map_break:
     \use:n {#2}
     \@@_map_variable:Nnn #1 {#2}
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2019-08-26 21:05:47 UTC (rev 51962)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2019-08-14}
+% \date{Released 2019-08-25}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def	2019-08-26 21:05:47 UTC (rev 51962)
@@ -462,7 +462,7 @@
     \prop_gput:Nnn \g__pdf_backend_object_prop {#1} {#2}
   }
 \cs_new:Npn \__pdf_backend_object_ref:n #1
-  { @pdf.obj \int_use:c { g__pdf_backend_object_ \tl_to_str:n {#1} _int } }
+  { @pdf.obj \int_use:c { c__pdf_backend_object_ \tl_to_str:n {#1} _int } }
 \cs_new_protected:Npn \__pdf_backend_object_write:nn #1#2
   {
     \exp_args:Nx \__pdf_backend_object_write:nnn
@@ -627,15 +627,15 @@
     \bool_if:nF {#1}
       { \__kernel_backend_literal:n { dvipdfmx:config~C~0x40 } }
   }
-\cs_new_protected:Npn \__pdf_backend_version_major:n #1
+\cs_new_protected:Npn \__pdf_backend_version_major_gset:n #1
   {
     \cs_gset:Npx \__pdf_backend_version_major: { \int_eval:n {#1} }
-    \__kernel_backend_literal:x { pdf:majorversion \__pdf_backend_version_major: }
+    \__kernel_backend_literal:x { pdf:majorversion~ \__pdf_backend_version_major: }
   }
-\cs_new_protected:Npn \__pdf_backend_version_minor:n #1
+\cs_new_protected:Npn \__pdf_backend_version_minor_gset:n #1
   {
     \cs_gset:Npx \__pdf_backend_version_minor: { \int_eval:n {#1} }
-    \__kernel_backend_literal:x { pdf:minorversion \__pdf_backend_version_minor: }
+    \__kernel_backend_literal:x { pdf:minorversion~ \__pdf_backend_version_minor: }
   }
 \cs_new:Npn \__pdf_backend_version_major: { 1 }
 \cs_new:Npn \__pdf_backend_version_minor: { 5 }

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xdvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xdvipdfmx.def	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xdvipdfmx.def	2019-08-26 21:05:47 UTC (rev 51962)
@@ -508,7 +508,7 @@
     \prop_gput:Nnn \g__pdf_backend_object_prop {#1} {#2}
   }
 \cs_new:Npn \__pdf_backend_object_ref:n #1
-  { @pdf.obj \int_use:c { g__pdf_backend_object_ \tl_to_str:n {#1} _int } }
+  { @pdf.obj \int_use:c { c__pdf_backend_object_ \tl_to_str:n {#1} _int } }
 \cs_new_protected:Npn \__pdf_backend_object_write:nn #1#2
   {
     \exp_args:Nx \__pdf_backend_object_write:nnn
@@ -673,15 +673,15 @@
     \bool_if:nF {#1}
       { \__kernel_backend_literal:n { dvipdfmx:config~C~0x40 } }
   }
-\cs_new_protected:Npn \__pdf_backend_version_major:n #1
+\cs_new_protected:Npn \__pdf_backend_version_major_gset:n #1
   {
     \cs_gset:Npx \__pdf_backend_version_major: { \int_eval:n {#1} }
-    \__kernel_backend_literal:x { pdf:majorversion \__pdf_backend_version_major: }
+    \__kernel_backend_literal:x { pdf:majorversion~ \__pdf_backend_version_major: }
   }
-\cs_new_protected:Npn \__pdf_backend_version_minor:n #1
+\cs_new_protected:Npn \__pdf_backend_version_minor_gset:n #1
   {
     \cs_gset:Npx \__pdf_backend_version_minor: { \int_eval:n {#1} }
-    \__kernel_backend_literal:x { pdf:minorversion \__pdf_backend_version_minor: }
+    \__kernel_backend_literal:x { pdf:minorversion~ \__pdf_backend_version_minor: }
   }
 \cs_new:Npn \__pdf_backend_version_major: { 1 }
 \cs_new:Npn \__pdf_backend_version_minor: { 5 }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3benchmark.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3benchmark}{2019-07-01}{}
+\ProvidesExplPackage{l3benchmark}{2019-08-25}{}
   {L3 Experimental benchmarking}
 \sys_if_engine_luatex:TF
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3cctab/l3cctab.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3cctab/l3cctab.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3cctab/l3cctab.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3cctab.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3cctab}{2019-07-01}{}
+\ProvidesExplPackage{l3cctab}{2019-08-25}{}
   {L3 Experimental category code tables}
 \int_new:N  \g__cctab_allocate_int
 \int_gset:Nn \g__cctab_allocate_int { -1 }
@@ -68,7 +68,7 @@
       }
     \cs_new_protected:Npn \cctab_new:N #1
       {
-        \int_gadd:Nn \g__cctab_allocate_int { 1 }
+        \int_gadd:Nn \g__cctab_allocate_int { 2 }
         \int_const:Nn #1 { \g__cctab_allocate_int }
         \intarray_new:cn { g__cctab_ \int_use:N #1 _cctab } { 256 }
         \int_step_inline:nn { 256 }
@@ -89,7 +89,7 @@
       }
     \cs_new_protected:Npn \cctab_begin:N #1
       {
-        \int_gadd:Nn \g__cctab_stack_int { 1 }
+        \int_gadd:Nn \g__cctab_stack_int { 2 }
         \int_compare:nNnT \g__cctab_stack_int > \c_max_register_int
           { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
         \cs_if_exist:cF { g__cctab_ \int_use:N \g__cctab_stack_int _cctab }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3color.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3color}{2019-07-01}{}
+\ProvidesExplPackage{l3color}{2019-08-25}{}
   {L3 Experimental color support}
 \tl_new:N \l__color_internal_tl
 \prg_new_conditional:Npnn \__color_if_defined:n #1 { T, F, TF }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -28,7 +28,7 @@
 %% 
 %% File: l3draw.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3draw}{2019-07-01}{}
+\ProvidesExplPackage{l3draw}{2019-08-25}{}
   {L3 Experimental core drawing support}
 \RequirePackage { l3color }
 %% File: l3draw-boxes.dtx
@@ -440,23 +440,23 @@
       { \__draw_path_arc_auxiii:nn }
       {
         \__draw_point_transform_noshift:n
-          { \draw_point_polar:nnn { #1 #4 90 } {#7} {#8} }
+          { \draw_point_polar:nnn {#7} {#8} { #1 #4 90 } }
       }
     \__draw_point_process:nnn
       { \__draw_path_arc_auxiv:nnnn }
       {
         \draw_point_transform:n
-          { \draw_point_polar:nnn {#1} {#5} {#6} }
+          { \draw_point_polar:nnn {#5} {#6} {#1} }
       }
       {
         \draw_point_transform:n
-          { \draw_point_polar:nnn {#2} {#5} {#6} }
+          { \draw_point_polar:nnn {#5} {#6} {#2} }
       }
     \__draw_point_process:nn
       { \__draw_path_arc_auxv:nn }
       {
         \__draw_point_transform_noshift:n
-          { \draw_point_polar:nnn { #2 #4 -90 } {#7} {#8} }
+          { \draw_point_polar:nnn {#7} {#8} { #2 #4 -90 } }
       }
     \exp_after:wN \__draw_path_curveto:nnnnnn \l__draw_path_tmp_tl
     \fp_set:Nn \l__draw_path_arc_delta_fp { abs ( #2 - #3 ) }
@@ -854,9 +854,9 @@
 \cs_generate_variant:Nn \__draw_point_to_dim_aux:n { f }
 \cs_new:Npn \__draw_point_to_dim_aux:w ( #1 , ~ #2 ) { #1pt , #2pt }
 \cs_new:Npn \draw_point_polar:nn #1#2
-  { \draw_point_polar:nnn {#1} {#2} {#2} }
+  { \draw_point_polar:nnn {#1} {#1} {#2} }
 \cs_new:Npn \draw_point_polar:nnn #1#2#3
-  { \__draw_draw_polar:fnn { \fp_eval:n {#1} } {#2} {#3} }
+  { \__draw_draw_polar:fnn { \fp_eval:n {#3} } {#1} {#2} }
 \cs_new:Npn \__draw_draw_polar:nnn #1#2#3
   { \__draw_point_to_dim:n { cosd(#1) * (#2) , sind(#1) * (#3) } }
 \cs_generate_variant:Nn \__draw_draw_polar:nnn { f }
@@ -864,9 +864,19 @@
   { \__draw_point_process:nn { \__draw_point_unit_vector:nn } {#1} }
 \cs_new:Npn \__draw_point_unit_vector:nn #1#2
   {
-    \__draw_point_to_dim:n
-      { ( #1 , #2 ) / (sqrt(#1 * #1 + #2 * #2)) }
+    \exp_args:Nf \__draw_point_unit_vector:nnn
+      { \fp_eval:n { (sqrt(#1 * #1 + #2 * #2)) } }
+      {#1} {#2}
   }
+\cs_new:Npn \__draw_point_unit_vector:nnn #1#2#3
+  {
+    \fp_compare:nNnTF {#1} = \c_zero_fp
+      { 0pt, 1pt }
+      {
+        \__draw_point_to_dim:n
+          { ( #2 , #3 ) / #1 }
+      }
+  }
 \cs_new:Npn \draw_point_intersect_lines:nnnn #1#2#3#4
   {
     \__draw_point_process:nnnnn
@@ -1129,9 +1139,9 @@
   }
 \cs_generate_variant:Nn \__draw_point_vec:nnn { fff }
 \cs_new:Npn \draw_point_vec_polar:nn #1#2
-  { \draw_point_vec_polar:nnn {#1} {#2} {#2} }
+  { \draw_point_vec_polar:nnn {#1} {#1} {#2} }
 \cs_new:Npn \draw_point_vec_polar:nnn #1#2#3
-  { \__draw_draw_vec_polar:fnn { \fp_eval:n {#1} } {#2} {#3} }
+  { \__draw_draw_vec_polar:fnn { \fp_eval:n {#3} } {#1} {#2} }
 \cs_new:Npn \__draw_draw_vec_polar:nnn #1#2#3
   {
     \__draw_point_to_dim:n
@@ -1514,8 +1524,9 @@
         { \token_if_eq_meaning_p:NN #4 \__draw_softpath_close_op:nn }
       }
       {
-        \__draw_softpath_round_calc:nnnNnn
-          \__draw_softpath_round_loop:Nnn {#5} {#6}
+        \__draw_softpath_round_calc:NnnNnn
+          \__draw_softpath_round_loop:Nnn
+          {#5} {#6}
       }
       {
         \token_if_eq_meaning:NNTF #4 \__draw_softpath_roundpoint_op:nn
@@ -1528,12 +1539,13 @@
 \cs_new_protected:Npn \__draw_softpath_round_roundpoint:NnnNnnNnn
   #1#2#3#4#5#6#7#8#9
   {
-    \__draw_softpath_round_calc:nnnNnn
+    \__draw_softpath_round_calc:NnnNnn
       \__draw_softpath_round_loop:Nnn
-      {#8} {#9} #1 {#2} {#3}
+      {#8} {#9}
+      #1 {#2} {#3}
     #4 {#5} {#6} #7 {#8} {#9}
   }
-\cs_new_protected:Npn \__draw_softpath_round_calc:nnnNnn #1#2#3#4#5#6
+\cs_new_protected:Npn \__draw_softpath_round_calc:NnnNnn #1#2#3#4#5#6
   {
     \tl_set:Nx \l__draw_softpath_curve_end_tl
       {
@@ -1596,7 +1608,7 @@
   {
     \use:x
       {
-        \__draw_softpath_round_calc:nnnNnn
+        \__draw_softpath_round_calc:NnnNnn
           {
             \tl_set:Nx \exp_not:N \l__draw_softpath_move_tl
               {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3graphics.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3graphics}{2019-07-01}{}
+\ProvidesExplPackage{l3graphics}{2019-08-25}{}
   {L3 Experimental graphics inclusion support}
 \ior_new:N \l__graphics_tmp_ior
 \tl_new:N  \l__graphics_tmp_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3pdf.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3pdf}{2019-07-01}{}
+\ProvidesExplPackage{l3pdf}{2019-08-25}{}
   {L3 Experimental core PDF support}
 \bool_new:N \g__pdf_init_bool
 \cs_if_exist:NT \documentclass

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2019-07-01}{}
+\ProvidesExplPackage{l3str-format}{2019-08-25}{}
   {L3 Experimental string formatting}
 \cs_generate_variant:Nn \use:nn { nf }
 \cs_generate_variant:Nn \use:nnn { fnf }
@@ -286,23 +286,23 @@
       {#3} #5
   }
 \cs_new:Npn \fp_format:nn #1
-  { \exp_args:Nf \__str_format_fp:nn { \__fp_parse:n {#1} } }
+  { \exp_args:Nf \__str_format_fp:nn { \fp_to_tl:n {#1} } }
 \cs_new:Npn \__str_format_fp:nn #1#2
   {
     \tl_to_str:f
       {
-        \exp_last_unbraced:Nf \__str_format_fp:NNNnnNw
+        \exp_last_unbraced:Nf \__str_format_fp:NNNnnNn
           { \__str_format_parse:n {#2} }
-          #1
+          {#1}
       }
   }
-\cs_new:Npn \__str_format_fp:NNNnnNw
-    #1#2#3#4#5#6 \s__fp \__fp_chk:w #7 #8
+\cs_new:Npn \__str_format_fp:NNNnnNn
+    #1#2#3#4#5#6#7
   {
     \token_if_eq_charcode:NNTF #2 ?
       { \__str_format_put:nw { #1 > } }
       { \__str_format_put:nw { #1 #2 } }
-    \token_if_eq_meaning:NNTF 2 #8
+    \tl_if_head_eq_charcode:nNTF {#7} -
       { \__str_format_put:nw { - } }
       {
         \str_case:nnF {#3}
@@ -314,123 +314,128 @@
       }
     \__str_format_put:nw { {#4} }
     \tl_if_empty:nTF {#5}
-      { \__str_format_put:nw { { 6} } }
+      {
+        \token_if_eq_meaning:NNTF #6 ?
+          { \__str_format_put:nw { {  } } }
+          { \__str_format_put:nw { { 6} } }
+      }
       { \__str_format_put:nw { {#5} } }
     \str_case:nnF {#6}
       {
-        { e } { \__str_format_fp:wnnnNNw \__str_format_fp_e:wn }
-        { f } { \__str_format_fp:wnnnNNw \__str_format_fp_f:wn }
-        { g } { \__str_format_fp:wnnnNNw \__str_format_fp_g:wn }
-        { ? } { \__str_format_fp:wnnnNNw \__str_format_fp_g:wn }
+        { e } { \__str_format_fp:wnnnNNn \__str_format_fp_e:nn }
+        { f } { \__str_format_fp:wnnnNNn \__str_format_fp_f:nn }
+        { g } { \__str_format_fp:wnnnNNn \__str_format_fp_g:nn }
+        { ? } { \__str_format_fp:wnnnNNn \__str_format_fp_g:nn }
       }
       {
         \__kernel_msg_expandable_error:nnnn
           { str } { invalid-style-format } {#6} { fp }
-        \__str_format_fp:wnnnNNw \__str_format_fp_g:wn
+        \__str_format_fp:wnnnNNn \__str_format_fp_g:nn
       }
-    \s_stop
-    \s__fp \__fp_chk:w #7 #8
+    \s_stop {#7}
   }
-\cs_new:Npn \__str_format_fp:wnnnNNw
-    #1 \s_stop #2 #3 #4 #5#6 #7 ;
+\cs_new:Npn \__str_format_fp:wnnnNNn
+    #1 \s_stop #2 #3 #4 #5#6 #7
   {
     \exp_args:Nc \exp_args:Nf
       { __str_format_align_#6:nnnN }
-      { #1 #7 ; {#2} }
+      { #1 {#7} {#2} }
       {#4}
       {#3} #5
   }
-\cs_new:Npn \__str_format_fp_round:wn #1 ; #2
-  { \__fp_parse:n { round ( #1; , #2 - \__fp_exponent:w #1; ) } }
-\cs_new:Npn \__str_format_fp_e:wn \s__fp \__fp_chk:w #1#2#3 ; #4
+\cs_new:Npn \__str_format_fp_round:nn #1 #2
+  { \fp_to_tl:n { abs ( round ( #1 , #2 - logb(#1) - 1 ) ) } }
+\cs_new:Npn \__str_format_fp_e:nn #1#2
   {
-    \int_case:nnF {#1}
+    \exp_args:Nf \__str_format_fp_e_aux:nn
+      { \__str_format_fp_round:nn {#1} { #2 + 1 } }
+      {#2}
+  }
+\cs_new:Npn \__str_format_fp_e_aux:nn #1#2
+  {
+    \str_case:nnF {#1}
       {
-        { 0 } { \use:nf { 0 . } { \prg_replicate:nn {#4} { 0 } } e 0 }
-        { 2 } { inf }
-        { 3 } { nan }
+        {  inf } { inf }
+        {  nan } { nan }
       }
       {
-        \exp_last_unbraced:Nf \__str_format_fp_e_aux:wn
-          { \__str_format_fp_round:wn \s__fp \__fp_chk:w #1#2#3 ; { #4 + 1 } }
-          {#4}
+        \exp_last_unbraced:Nf \__str_format_fp_e_aux:wwn
+          { \fp_to_scientific:n {#1} } ;
+          {#2}
       }
   }
-\cs_new:Npn \__str_format_fp_e_aux:wn
-    \s__fp \__fp_chk:w #1#2 #3 #4#5#6#7 ; #8
+\cs_new:Npn \__str_format_fp_e_aux:wwn #1 . #2 e #3 ; #4
   {
-    \__str_format_put:fw { \int_eval:n { #3 - 1 } }
-    \__str_format_put:nw { e }
-    \int_compare:nNnTF {#8} > \c__fp_prec_int
+    \__str_format_put:nw { e #3 }
+    \int_compare:nNnTF {#4} < \c__fp_prec_int
       {
-        \__str_format_put:fw { \prg_replicate:nn { #8 - \c__fp_prec_int + 1 } {0} }
-        \__str_format_put:fw { \use_none:n #4#5#6#7 }
+        \__str_format_put:fw { \str_range:nnn { #2 } { 1 } { #4 } }
+        \__str_format_put:nw { #1 . }
       }
       {
         \__str_format_put:fw
-          { \str_range:nnn { #4#5#6#7 0 } { 2 } { #8 + 1 } }
+          { \prg_replicate:nn { #4 - \c__fp_prec_int + 1 } { 0 } }
+        \__str_format_put:nw { #1 . #2 }
       }
-    \__str_format_put:fw { \use_i:nnnn #4 . }
     \use_none:n \s_stop
   }
-\cs_new:Npn \__str_format_fp_f:wn \s__fp \__fp_chk:w #1#2#3 ; #4
+\cs_new:Npn \__str_format_fp_f:nn #1#2
   {
-    \int_case:nnF {#1}
+    \exp_args:Nf \__str_format_fp_f_aux:nn
+      { \fp_to_tl:n { abs ( round ( #1 , #2 ) ) } }
+      {#2}
+  }
+\cs_new:Npn \__str_format_fp_f_aux:nn #1#2
+  {
+    \str_case:nnF {#1}
       {
-        {0} { \use:nf { 0 . } { \prg_replicate:nn {#4} { 0 } } }
-        {2} { inf }
-        {3} { nan }
+        { inf } { inf }
+        { nan } { nan }
       }
       {
         \exp_last_unbraced:Nf \__str_format_fp_f_aux:wwwn
-          {
-            \fp_to_decimal:n
-              { abs ( round ( \s__fp \__fp_chk:w #1#2#3 ; , #4 ) ) }
-          }
-          . . ;
-          {#4}
+          { \fp_to_decimal:n {#1} } . . ; {#2}
       }
   }
 \cs_new:Npn \__str_format_fp_f_aux:wwwn #1 . #2 . #3 ; #4
   {
-    \use:nf
-      { #1 . #2 }
+    \use:nf { #1 . #2 }
       { \prg_replicate:nn { #4 - \__str_count:n {#2} } {0} }
   }
-\cs_new:Npn \__str_format_fp_g:wn \s__fp \__fp_chk:w #1#2 ; #3
+\cs_new:Npn \__str_format_fp_g:nn #1#2
   {
-    \int_case:nnF {#1}
+    \tl_if_empty:nTF {#2} { \fp_to_tl:n { abs(#1) } }
       {
-        {0} { 0 }
-        {2} { inf }
-        {3} { nan }
+        \exp_args:Nf \__str_format_fp_g_aux:nn
+          { \__str_format_fp_round:nn {#1} { \int_max:nn {1} {#2} } }
+          { \int_max:nn {1} {#2} }
       }
+  }
+\cs_new:Npn \__str_format_fp_g_aux:nn #1#2
+  {
+    \str_case:nnF {#1}
       {
-        \exp_last_unbraced:Nf \__str_format_fp_g_aux:wn
+        { 0 } { 0 }
+        { inf } { inf }
+        { nan } { nan }
+      }
+      {
+        \fp_compare:nTF { 1e-4 <= #1 < 1e#2 }
+          { \fp_to_decimal:n {#1} }
           {
-            \__str_format_fp_round:wn \s__fp \__fp_chk:w #1#2 ;
-              { \int_max:nn {1} {#3} }
+            \exp_last_unbraced:Nf \__str_format_fp_trim:w
+              { \fp_to_scientific:n {#1} }
           }
-          { \int_max:nn {1} {#3} }
       }
   }
-\cs_new:Npn \__str_format_fp_g_aux:wn #1; #2
+\cs_new:Npn \__str_format_fp_trim:w #1 e
   {
-    \int_compare:nNnTF { \__fp_exponent:w #1; } < { -3 }
-      { \__str_format_to_scientific:n }
-      {
-        \int_compare:nNnTF { \__fp_exponent:w #1; } > {#2}
-          { \__str_format_to_scientific:n }
-          { \fp_to_decimal:n }
-      }
-    { \__fp_set_sign_o:w 0 #1; @ \prg_do_nothing: }
+    \__str_format_fp_trim_loop:w #1
+      ; \__str_format_fp_trim_loop:w 0; \__str_format_fp_trim_dot:w .; \s_stop e
   }
-\cs_new:Npn \__str_format_to_scientific:n
-  {
-    \exp_after:wN \__str_format_fp_trim:w
-    \exp:w \exp_end_continue_f:w \fp_to_scientific:n
-  }
-\cs_new:Npn \__str_format_fp_trim:w #1 e { \__fp_trim_zeros:w #1 ; e }
+\cs_new:Npn \__str_format_fp_trim_loop:w #1 0; #2 { #2 #1 ; #2 }
+\cs_new:Npn \__str_format_fp_trim_dot:w #1 .; { \__str_format_fp_trim_end:w #1 ; }
+\cs_new:Npn \__str_format_fp_trim_end:w #1 ; #2 \s_stop { #1 }
 \__kernel_msg_new:nnn { str } { invalid-format }
   { Invalid~format~'#1'. }
 \__kernel_msg_new:nnn { str } { invalid-align-format }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3sys-shell.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3sys-shell}{2019-07-01}{}
+\ProvidesExplPackage{l3sys-shell}{2019-08-25}{}
   {L3 Experimental system shell functions}
 \cs_new:Npn \__sys_path_to_win:n #1
   {
@@ -145,6 +145,7 @@
             \char_set_catcode_other:N \exp_not:N \~
             \char_set_catcode_other:N \exp_not:N \%
             \char_set_catcode_space:N \exp_not:N \ %
+            \tex_endlinechar:D -1 \scan_stop:
           }
         \exp_not:N \l__sys_tmp_tl
         \str_set:NV #1 \exp_not:N \l__sys_tmp_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: xcoffins.dtx
 \RequirePackage{xparse}
-\ProvidesExplPackage{xcoffins}{2019-07-01}{}
+\ProvidesExplPackage{xcoffins}{2019-08-25}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2019-07-01}{}
+\ProvidesExplPackage{l3galley}{2019-08-25}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -20,7 +20,7 @@
 %% 
 %% File: xgalley.dtx
 \RequirePackage{xparse}
-\ProvidesExplPackage{xgalley}{2019-07-01}{}
+\ProvidesExplPackage{xgalley}{2019-08-25}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2019-08-26 21:05:47 UTC (rev 51962)
@@ -65,7 +65,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2019-08-14}%
+\def\ExplFileDate{2019-08-25}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -4264,10 +4264,6 @@
 \cs_generate_variant:Nn \tl_gput_right:No { c }
 \cs_generate_variant:Nn \tl_gput_right:Nx { c }
 \tl_const:Nx \c__tl_rescan_marker_tl { : \token_to_str:N : }
-\cs_new_protected:Npn \tl_set_rescan:Nnn
-  { \__tl_set_rescan:NNnn \tl_set:No }
-\cs_new_protected:Npn \tl_gset_rescan:Nnn
-  { \__tl_set_rescan:NNnn \tl_gset:No }
 \cs_new_protected:Npn \tl_rescan:nn #1#2
   {
     \tl_set_rescan:Nnn \l__tl_internal_a_tl {#1} {#2}
@@ -4274,12 +4270,15 @@
     \exp_after:wN \tl_clear:N \exp_after:wN \l__tl_internal_a_tl
     \l__tl_internal_a_tl
   }
+\cs_new_protected:Npn \tl_set_rescan:Nnn
+  { \__tl_set_rescan:NNnn \tl_set:No }
+\cs_new_protected:Npn \tl_gset_rescan:Nnn
+  { \__tl_set_rescan:NNnn \tl_gset:No }
 \cs_new_protected:Npn \__tl_set_rescan:NNnn #1#2#3#4
   {
     \group_begin:
       \if_false: { \fi:
       \int_set_eq:NN \tex_tracingnesting:D \c_zero_int
-      \exp_args:No \tex_everyeof:D { \c__tl_rescan_marker_tl }
       \int_compare:nNnT \tex_endlinechar:D = { 32 }
         { \int_set:Nn \tex_endlinechar:D { -1 } }
       \int_set_eq:NN \tex_newlinechar:D \tex_endlinechar:D
@@ -4289,6 +4288,7 @@
   }
 \cs_new_protected:Npn \__tl_set_rescan_multi:nNN #1#2#3
   {
+    \exp_args:No \tex_everyeof:D { \c__tl_rescan_marker_tl }
     \exp_after:wN \__tl_rescan:NNw
     \exp_after:wN #2
     \exp_after:wN #3
@@ -4325,7 +4325,8 @@
     \int_compare:nNnTF
       { \char_value_catcode:n {#1} / 2 } = 6
       {
-        \exp_args:Nf \__tl_set_rescan_single_aux:nnNN
+        \exp_args:Nof \__tl_set_rescan_single_aux:nnnNN
+          \c__tl_rescan_marker_tl
           { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
       }
       {
@@ -4337,20 +4338,28 @@
           { \__tl_set_rescan_multi:nNN }
       }
   }
-\cs_new_protected:Npn \__tl_set_rescan_single_aux:nnNN #1#2#3#4
+\cs_new_protected:Npn \__tl_set_rescan_single_aux:nnnNN #1#2#3#4#5
   {
-    \exp_args:Nno \use:nn
-      { \cs_set:Npn \__tl_rescan:NNw ##1##2##3 #1 }
-      \c__tl_rescan_marker_tl
+    \tex_everyeof:D
       {
+        #1 \use_none:n
+        #2 #1 { \exp:w \__tl_set_rescan_single_aux:w }
+        \q_stop
+      }
+    \cs_set:Npn \__tl_rescan:NNw ##1##2##3 #2 #1 ##4 ##5 \q_stop
+      {
         \group_end:
-        ##1 ##2 { \use_none:n ##3 }
+        ##1 ##2 { ##4 ##3 }
       }
     \exp_after:wN \__tl_rescan:NNw
-    \exp_after:wN #3
     \exp_after:wN #4
-    \tex_scantokens:D { #1 #2 #1 }
+    \exp_after:wN #5
+    \tex_scantokens:D { #2 #3 #2 }
   }
+\exp_args:Nno \use:nn
+  { \cs_new:Npn \__tl_set_rescan_single_aux:w #1 }
+  \c__tl_rescan_marker_tl #2
+  { \use_i:nn \exp_end: #1 }
 \cs_new_protected:Npn \tl_replace_once:Nnn
   { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_set:Nx  }
 \cs_new_protected:Npn \tl_greplace_once:Nnn
@@ -4631,8 +4640,8 @@
   { \exp_args:No \tl_map_variable:nNn }
 \cs_new_protected:Npn \__tl_map_variable:Nnn #1#2#3
   {
+    \quark_if_recursion_tail_break:nN {#3} \tl_map_break:
     \tl_set:Nn #1 {#3}
-    \quark_if_recursion_tail_break:NN #1 \tl_map_break:
     \use:n {#2}
     \__tl_map_variable:Nnn #1 {#2}
   }
@@ -8166,8 +8175,8 @@
   }
 \cs_new_protected:Npn \__clist_map_variable:Nnw #1#2#3,
   {
+    \quark_if_recursion_tail_stop:n {#3}
     \tl_set:Nn #1 {#3}
-    \quark_if_recursion_tail_stop:N #1
     \use:n {#2}
     \__clist_map_variable:Nnw #1 {#2}
   }
@@ -9062,56 +9071,64 @@
 \prop_new:N \l_tmpb_prop
 \prop_new:N \g_tmpa_prop
 \prop_new:N \g_tmpb_prop
+\prop_new:N \l__prop_internal_prop
 \cs_new_protected:Npn \prop_set_from_keyval:Nn #1#2
-  { \tl_set:Nx #1 { \__prop_from_keyval:n {#2} } }
+  {
+    \prop_clear:N \l__prop_internal_prop
+    \__prop_from_keyval:n {#2}
+    \prop_set_eq:NN #1 \l__prop_internal_prop
+    \prop_clear:N \l__prop_internal_prop
+  }
 \cs_generate_variant:Nn \prop_set_from_keyval:Nn { c }
 \cs_new_protected:Npn \prop_gset_from_keyval:Nn #1#2
-  { \tl_gset:Nx #1 { \__prop_from_keyval:n {#2} } }
+  {
+    \prop_clear:N \l__prop_internal_prop
+    \__prop_from_keyval:n {#2}
+    \prop_gset_eq:NN #1 \l__prop_internal_prop
+    \prop_clear:N \l__prop_internal_prop
+  }
 \cs_generate_variant:Nn \prop_gset_from_keyval:Nn { c }
 \cs_new_protected:Npn \prop_const_from_keyval:Nn #1#2
-  { \tl_const:Nx #1 { \__prop_from_keyval:n {#2} } }
+  {
+    \prop_clear:N \l__prop_internal_prop
+    \__prop_from_keyval:n {#2}
+    \tl_const:Nx #1 { \exp_not:o \l__prop_internal_prop }
+    \prop_clear:N \l__prop_internal_prop
+  }
 \cs_generate_variant:Nn \prop_const_from_keyval:Nn { c }
-\cs_new:Npn \__prop_from_keyval:n #1
+\cs_new_protected:Npn \__prop_from_keyval:n #1
   {
-    \s__prop
-    \__prop_from_keyval_loop:w \q_mark #1 ,
+    \__prop_from_keyval_loop:w \prg_do_nothing: #1 ,
       \q_recursion_tail , \q_recursion_stop
   }
-\cs_new:Npn \__prop_from_keyval_loop:w #1 ,
+\cs_new_protected:Npn \__prop_from_keyval_loop:w #1 ,
   {
-    \quark_if_recursion_tail_stop:o { \use_none:n #1 }
+    \quark_if_recursion_tail_stop:o {#1}
     \__prop_from_keyval_split:Nw \__prop_from_keyval_key:n
-      #1 = = \q_stop { \use_none:n #1 }
-    \__prop_from_keyval_loop:w \q_mark
+      #1 = = \q_stop {#1}
+    \__prop_from_keyval_loop:w \prg_do_nothing:
   }
-\cs_new:Npn \__prop_from_keyval_split:Nw #1#2 =
+\cs_new_protected:Npn \__prop_from_keyval_split:Nw #1#2 =
+  { \tl_trim_spaces_apply:oN {#2} #1 }
+\cs_new_protected:Npn \__prop_from_keyval_key:n #1
+  { \__prop_from_keyval_key:w #1 \q_nil }
+\cs_new_protected:Npn \__prop_from_keyval_key:w #1 \q_nil #2 \q_stop
   {
-    \tl_trim_spaces_apply:oN { \use_none:n #2 } #1
-      \q_nil
-  }
-\cs_new:Npn \__prop_from_keyval_key:n #1
-  { \__prop_from_keyval_key:w #1 }
-\cs_new:Npn \__prop_from_keyval_key:w #1 \q_nil #2 \q_stop
-  {
     \__prop_from_keyval_split:Nw \__prop_from_keyval_value:n
-      \q_mark #2 \q_stop {#1}
+      \prg_do_nothing: #2 \q_stop {#1}
   }
-\cs_new:Npn \__prop_from_keyval_value:n #1
-  { \__prop_from_keyval_value:w #1 }
-\cs_new:Npn \__prop_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4
+\cs_new_protected:Npn \__prop_from_keyval_value:n #1
+  { \__prop_from_keyval_value:w #1 \q_nil }
+\cs_new_protected:Npn \__prop_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4
   {
     \tl_if_empty:nF { #3 #1 #2 }
       {
         \str_if_eq:nnTF {#2} { = }
+          { \prop_put:Nnn \l__prop_internal_prop {#3} {#1} }
           {
-            \exp_not:N \__prop_pair:wn \tl_to_str:n {#3}
-            \s__prop { \exp_not:n {#1} }
+            \__kernel_msg_error:nnx { kernel } { prop-keyval }
+              { \exp_not:o {#4} }
           }
-          {
-            \__kernel_msg_expandable_error:nnf
-              { kernel } { prop-keyval }
-              { \exp_after:wN \exp_stop_f: #4 }
-          }
       }
   }
 \cs_new_protected:Npn \__prop_split:NnTF #1#2
@@ -13393,6 +13410,13 @@
   }
 \cs_new:Npn \__fp_neg_sign:N #1
   { \__fp_int_eval:w 2 - #1 \__fp_int_eval_end: }
+\cs_new:Npn \__fp_kind:w #1
+  {
+    \__fp_if_type_fp:NTwFw
+      #1 \__fp_use_ii_until_s:nnw
+      \s__fp { \__fp_use_i_until_s:nw 4 }
+      \q_stop
+  }
 \cs_new:Npn \__fp_sanitize:Nw #1 #2;
   {
     \if_case:w
@@ -14102,9 +14126,17 @@
   {
     \__fp_small_int:wTF #3; { \__fp_round:Nwn #1#2; }
       {
-        \__fp_invalid_operation_tl_o:ff
-          { \__fp_round_name_from_cs:N #1 }
-          { \__fp_array_to_clist:n { #2; #3; } }
+        \if:w 3 \__fp_kind:w #3 ;
+          \exp_after:wN \use_i:nn
+        \else:
+          \exp_after:wN \use_ii:nn
+        \fi:
+        { \exp_after:wN \c_nan_fp }
+        {
+          \__fp_invalid_operation_tl_o:ff
+            { \__fp_round_name_from_cs:N #1 }
+            { \__fp_array_to_clist:n { #2; #3; } }
+        }
       }
   }
 \cs_new:Npn \__fp_round:Nwn #1 \s__fp \__fp_chk:w #2#3#4; #5
@@ -15606,6 +15638,14 @@
   { \__fp_parse_function:NNN \__fp_minmax_o:Nw 0 }
 \prg_new_eq_conditional:NNn \fp_if_exist:N \cs_if_exist:N { TF , T , F , p }
 \prg_new_eq_conditional:NNn \fp_if_exist:c \cs_if_exist:c { TF , T , F , p }
+\prg_new_conditional:Npnn \fp_if_nan:n #1 { TF , T , F , p }
+  {
+    \if:w 3 \exp_last_unbraced:Nf \__fp_kind:w { \__fp_parse:n {#1} }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
 \prg_new_conditional:Npnn \fp_compare:n #1 { p , T , F , TF }
   {
     \exp_after:wN \__fp_compare_return:w

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2019-08-26 21:05:47 UTC (rev 51962)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2019-08-14}%
+\def\ExplFileDate{2019-08-25}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \def\tempa{LaTeX2e}%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2019-08-25 23:53:32 UTC (rev 51961)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2019-08-26 21:05:47 UTC (rev 51962)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2019-08-14}%
+\def\ExplFileDate{2019-08-25}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%



More information about the tex-live-commits mailing list