summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/l3kernel
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-01-14 03:00:43 +0000
committerNorbert Preining <norbert@preining.info>2020-01-14 03:00:43 +0000
commitb3225c4301e7724de481f410444fef5463799b9d (patch)
tree537c4ee5a5bda1ac7ea14c96cb3fcc453061ecd6 /macros/latex/contrib/l3kernel
parentd8d4c8c20f235a6610baf22bea580063cc19e9a6 (diff)
CTAN sync 202001140300
Diffstat (limited to 'macros/latex/contrib/l3kernel')
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md103
-rw-r--r--macros/latex/contrib/l3kernel/README.md4
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx136
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin585033 -> 584331 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1534997 -> 1538470 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex4
-rw-r--r--macros/latex/contrib/l3kernel/l3.ins8
-rw-r--r--macros/latex/contrib/l3kernel/l3alloc.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3candidates.dtx1927
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3color-base.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx81
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin263406 -> 263041 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx157
-rw-r--r--macros/latex/contrib/l3kernel/l3final.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3format.ins9
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx5
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx60
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx5
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin0 -> 413933 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news.tex157
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin0 -> 113527 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.tex102
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin0 -> 140776 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.tex153
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin0 -> 144780 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.tex128
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin0 -> 107119 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.tex123
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin0 -> 105092 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.tex64
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin0 -> 140796 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.tex141
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin0 -> 118976 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.tex111
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin0 -> 152413 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.tex170
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin0 -> 235323 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.tex1433
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin0 -> 147099 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.tex220
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin0 -> 174241 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.tex206
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin0 -> 244282 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.tex352
-rw-r--r--macros/latex/contrib/l3kernel/l3obsolete.txt639
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.csv3
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin59064 -> 59384 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx60
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin280166 -> 279782 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex4
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin227888 -> 227512 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.tex4
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin186679 -> 186295 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex4
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx1421
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx903
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx332
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx71
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin5694617 -> 5757322 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex4
-rw-r--r--macros/latex/contrib/l3kernel/source3body.tex7
101 files changed, 6674 insertions, 2817 deletions
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index 9aa72250fd..00a7689a9a 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,63 +7,75 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
-## [2019-11-07]
+## [2020-01-12]
+
+### Added
+- `bool_case_true:n(TF)` and `\bool_case_false:n(TF)`
+- `\file_hex_dump:n(nn)` and `\file_get_hex_dump:n(nn)N(TF)`
+- `\str_<type>case:n`
+- `\text_<type>case:n(n)`
+- `\text_expand:n` and supporting data structures
+
+### Changed
+- Distribute LaTeX3 News
+- Moved `\char_<type>case:N` to stable
+- Documentation improvements
### Fixed
+- Inherit key required/forbidden properties (see #653)
+- Set backend at the beginning of `\document` (see #657)
+### Deprecated
+- `\str_<type>_case:n`
+- `\tl_<type>_case:n(n)`
+
+## [2019-11-07]
+
+### Fixed
- Handling of repeated loading of a backend (issue #646)
-- Hanlding of repeated loading of deprecated functions
+- Handling of repeated loading of deprecated functions
## [2019-10-28]
### Fixed
-
- File searching when `\(pdf)filesize` is not available (fixes #644)
## [2019-10-27]
### Changed
-
- Internal structure of `\c_sys_jobname_str` altered
- Update upTeX test to follow guidance from developers
## [2019-10-24]
### Changed
-
- File names are now returned without quotes by `\file_full_name:n`
### Fixed
-
- `\file_if_exist:n(TF)`, etc., when dealing with file names containing
spaces (see #642)
## [2019-10-21]
### Added
-
- Lua function `l3kernel.shellescape()`
### Changed
-
- Better coverage of (u)pTeX primitives following publication of
pTeX manual in English
- Trim spaces surrounding file names
### Removed
-
- HarfTeX primitives
## [2019-10-14]
### Fixed
-
- Correct handling of 'traditional' class options for backend
## [2019-10-11]
### Changed
-
- Standard backend for (u)pTeX is now `dvips`
- Minimum LuaTeX version now v0.95
- Moved `\debug_on:`, `\debug_off:`, `\debug_suspend:` and `\debug_resume:`
@@ -72,7 +84,6 @@ this project uses date-based 'snapshot' version identifiers.
- Performance enhancements when loading `expl3`
### Fixed
-
- Handling of files with no extension
- Behaviour of Lua function `l3kernel.charcat` in some circumstances
- Loading under ConTeXt
@@ -80,19 +91,16 @@ this project uses date-based 'snapshot' version identifiers.
## [2019-10-02]
### Fixed
-
- Variants using `\exp_args` functions with more than 9 arguments (see #636)
## [2019-09-30]
### Fixed
-
- File searching using `\file_full_name:n` (see #634)
## [2019-09-28]
### Changed
-
- Speed up variants and reduce their \tracingall output
- Debug and deprecation code are now loaded independently of expl3 core
- `\file_compare_timestamp:nNn(TF)` now usable in expansion contexts
@@ -120,46 +128,38 @@ this project uses date-based 'snapshot' version identifiers.
- Shell access functions
### Fixed
-
- Key `.initial:n` property when combined with inherited keys (see #631)
## [2019-09-19]
### Fixed
-
- Loading Unicode data when some chars may be active (see #627)
## [2019-09-08]
### Fixed
-
- Missing internal variant (fixes #624)
## [2019-09-05]
### Added
-
- `\file_full_name:n`, `\file_mdfive_hash:n`, `\file_size:n`,
`\file_timestamp:n`
- `\seq_map_tokens:Nn`, `\tl_map_tokens:nn`, `\tl_map_tokens:Nn`
### Changed
-
- Moved `\prop_map_tokens:Nn` to stable
- Generate chars with catcode as-supplied when case changing
## [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
@@ -169,76 +169,62 @@ this project uses date-based 'snapshot' version identifiers.
## [2019-08-14]
### Deprecated
-
- `\c_term_ior`
### Fixed
-
- Coffin pole intersection in some cases (see #605)
## [2019-07-25]
### Fixed
-
- Loading for `expl3` with plain TeX
## [2019-07-01]
### Added
-
- Moved `l3str-convert` module to `l3kernel`
### Changed
-
- Ensure `\msg_fatal:nn` ends the TeX run if used inside an
hbox (see #587)
- Moved backend code to a separate release schedule
### Fixed
-
- Handling of control sequences in key names (see #594)
## [2019-05-28]
### Added
-
- Experimental `\file_compare_timestamp:nNn(TF)`
### Changed
-
-- Precedence of juxtaposition (implicit multiplication) in l3fp
+- Precedence of juxtaposition (implicit multiplication) in `l3fp`
now different for keywords/variables and factors in parentheses
## [2019-05-09]
### Added
-
- Experimental driver-level interfaces for image inclusion
- Experimental `\ior_shell_open:Nn`
### Fixed
-
- Some issues in `dvisvgm` driver
## [2019-05-07]
### Added
-
- `.muskip_set:N` property
### Changed
-
- Experimental `\driver_pdf_compress_objects:n` replaces
`\driver_pdf_objects_(en|dis)able:`
## [2019-05-05]
### Added
-
- `\char_str_<target>_case:N`
### Fixed
-
- Infinite loop in some cases in DVI mode due to link-breaking code
(see #570)
- Category code of output from `\char_<target>_case:N`, and
@@ -247,12 +233,10 @@ this project uses date-based 'snapshot' version identifiers.
## [2019-05-03]
### Added
-
- New `l3legacy` module containing
- `\legacy_if:n(TF)`
### Changed
-
- Moved `\file_get_mdfive_hash:nN(TF)`, `\file_get_size:nN(TF)`
and `\file_get_timestamp:nN(TF)` to stable
- Moved `\file_if_exist_input:n` and `\file_if_exist_input:nF` to stable
@@ -262,30 +246,25 @@ this project uses date-based 'snapshot' version identifiers.
## [2019-04-21]
### Added
-
- Experimental support for a range of PDF concepts at the lowest
(driver abstraction) level
## [2019-04-06]
### Changed
-
- Moved `\tl_if_single_token:n(TF)` to stable
### Fixed
-
- Support for ConTeXt from mid-December 2018
## [2019-03-26]
### Fixed
-
- Loading when pre-TL'18 XeTeX is in use (see #555)
## [2019-03-05]
### Added
-
- `\str_log:n`, `\str_log:N`
- `TF` versions for `\file_get_...:nN` and `\ior_(str_)get:NN` functions
- `\cs_prefix_spec:N`, `\cs_argument_spec:N`, `\cs_replacement_spec:N`
@@ -293,7 +272,6 @@ this project uses date-based 'snapshot' version identifiers.
- `factorial` function in `l3fp`
### Changed
-
- Return values from `\file_get:nnN`, `\file_get_...:nN`, `\ior_get:NN`,
`\sys_shell_get:nnN`
- Moved coffin affine transformations to stable
@@ -310,22 +288,18 @@ this project uses date-based 'snapshot' version identifiers.
`\cs_argument_spec:N`, `\cs_replacement_spec:N`, respectively
### Fixed
-
- Treatment of inherited keys when setting only known keys (see #548)
### Removed
-
- Experimental `\skip_split_finite_else_action:nnNN`
- Experimental `\tl_reverse_tokens:n`
## [2019-02-15]
### Changed
-
- Defensive code for redefinition of `\time`, `\day`, `\month` and `\year`
### Fixed
-
- Resetting of key inheritance (see #535)
- Issue in deprecated command `\tl_set_from_file:Nnn`
(see https://tex.stackexchange.com/q/474813/)
@@ -333,20 +307,17 @@ this project uses date-based 'snapshot' version identifiers.
## [2019-02-03]
### Added
-
- Support for return of whole path by `\keys_set_known:nnN`-like
function `\keys_set_known:nnnN` (see #508)
- `.prop_(g)put:N` key property (see #444)
### Fixed
-
- Handling of nested key setting when filtering, _etc._ (see #526)
- Inheritance of default values (see #504)
## [2019-01-28]
### Added
-
- Global versions of box affine functions, e.g. `\box_grotate:Nn`
- Global versions of box size adjustment functions
- `\box_(g)set_eq_drop:NN`, `\(h|v)box_unpack_drop:N`
@@ -354,63 +325,52 @@ this project uses date-based 'snapshot' version identifiers.
- Experimental functions `\sys_shell_get:nnN` and `\sys_shell_get:nnNTF`
### Changed
-
- `\char_generate:nn` now always takes exactly two expansions
- Move `\prg_generate_conditional_variant:Nnn` to stable
- Renamed experimental `\box_trim:Nnnnn` and `\box_viewport:Nnnnn` as
`\box_set_trim:Nnnnn` and `\box_set_viewport:Nnnnn`, respectively
### Deprecated
-
- `\box_(g)set_eq_clear:NN`, replaced by `\box_(g)set_eq_drop:NN`
- `\(h|v)box_unpack_clear:N`, replaced by `\(h|v)box_unpack_drop:N
- `\tl_(g)set_from_file(_x):Nnn`, replaced by `\file_get:nnN`
### Fixed
-
- Scope treatment of `\box_set_dp:N`, _etc._
- In (u)platex: detection of spaces in `\tl_rescan:nn` and related functions
### Removed
-
- Experimental function family `\tl_(g)set_from_shell:(N|c)nn`
(replaced by `\sys_shell_get:nnN`)
## [2019-01-13]
### Added
-
- `\ior_map_variable:NNn` and `\ior_str_map_variable:NNn`
### Fixed
-
- Unclosed conditional with Unicode engines
## [2019-01-12]
### Changed
-
- Improved `expl3` loading time with LuaTeX and XeTeX
- Improved performance of `\ior_map_inline:Nn` and related functions
### Fixed
-
- Handling of accented characters under mixed case changing in 8-bit engines
(see #514)
## [2019-01-01]
### Added
-
- `\iow_allow_break:`
### Fixed
-
- Correct fp randint with zero argument (see #507)
- Handling of `\current@color` with (x)dvipdfmx` (see #510)
### Removed
-
- Support for stand-alone `l3regex`, `l3sort`, `l3srt`, `l3tl-analysis`,
`l3tl-build`
- `\box_resize:Nnn`
@@ -427,61 +387,50 @@ this project uses date-based 'snapshot' version identifiers.
## [2018-12-12]
### Changed
-
- Move `\tl_range:nnn` to stable
### Fixed
-
- Loading in ConTeXt MkIV
## [2018-12-11]
### Changed
-
- Enable `\char_generate:nn` to create active tokens with XeTeX
## [2018-12-06]
### Changed
-
- Apply `\par` only at the end of vertical boxes
- Move `\int_rand:n` to stable
- Move `\<var>_rand_item:N` to stable
### Fixed
-
- Typo in `\lua_shipout_e:n` (see #503)
## [2018-11-19]
### Added
-
- Support for cross-compatibility primitives in XeTeX
- `\int_sign:n`, `\dim_sign:n` and `\fp_sign:n`
## [2018-10-19]
### Fixed
-
- Wrapping of text in messages, etc., for some line lengths (fixes #491)
## [2018-10-17]
### Added
-
- `\g_msg_module_documentation_prop` (see #471)
- `\peek_remove_spaces:n`
### Changed
-
- Formatting of messages: now follows LaTeX2e closely
### Deprecated
-
- `\msg_interrupt:nn`, `\msg_log:n` and `\msg_term:n`
### Fixed
-
- Handling of inheritance for choice keys (fixes #483)
## [2018-09-24]
@@ -552,7 +501,6 @@ this project uses date-based 'snapshot' version identifiers.
- Several internal optimisations
### Fixed
-
- Ex­pand boolean ex­pres­sion be­fore call­ing `\chardef` (fixes #461)
### Removed
@@ -609,7 +557,8 @@ this project uses date-based 'snapshot' version identifiers.
- 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-11-07...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-01-12...HEAD
+[2020-01-12]: https://github.com/latex3/latex3/compare/2019-11-07...2020-01-12
[2019-11-07]: https://github.com/latex3/latex3/compare/2019-10-28...2019-11-07
[2019-10-28]: https://github.com/latex3/latex3/compare/2019-10-27...2019-10-28
[2019-10-27]: https://github.com/latex3/latex3/compare/2019-10-24...2019-10-27
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index df7311fe84..d42a602ff8 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2019-11-07
+Release 2020-01-12
Overview
--------
@@ -80,6 +80,6 @@ the [LaTeX-L list](#Discussion) should be used.
-----
-<p>Copyright (C) 1998-2012,2015-2019 The LaTeX3 Project <br />
+<p>Copyright (C) 1998-2012,2015-2020 The LaTeX3 Project <br />
<a href="http://latex-project.org/">http://latex-project.org/</a> <br />
All rights reserved.</p>
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 89d18df298..7295b770db 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -2,7 +2,7 @@
%
%% File: expl3.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2019-11-07}%
+\def\ExplFileDate{2020-01-12}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -365,6 +365,23 @@
% distinguish variables from functions in the source when the |@@|
% convention is used.
%
+% \subsubsection{Variables: declaration}
+%
+% In well-formed \pkg{expl3} code, variables should always be declared before
+% assignment is attempted. This is true even for variable types where the
+% underlying \TeX{} implementation will allow direct assignment. This applies
+% both to setting directly (\cs{tl_set:Nn}, etc.) and to setting equal
+% (\cs{tl_set_eq:NN}, etc.).
+%
+% To help programmers to adhere to this approach, the debugging option
+% |check-declarations| may be given
+% \begin{verbatim}
+% \debug_on:n { check-declarations }
+% \end{verbatim}
+% and will issue an error whenever an assignment is made to a non-declared
+% variable. There is a performance implication, so this option should only
+% be used for testing.
+%
% \subsubsection{Variables: scope and type}
%
% The \meta{scope} part of the name describes how the variable can be
@@ -774,9 +791,8 @@
% \section{The distribution}
%
% At present, the \pkg{expl3} modules are designed to be loaded on top
-% of \LaTeXe{}. In time, a \LaTeX3 format will be produced based on this
-% code. This allows the code to be used in \LaTeXe{} packages \emph{now}
-% while a stand-alone \LaTeX3 is developed.
+% of \LaTeXe{}. In time, a \LaTeX3 format may be produced based on this
+% code.
%
% \begin{bfseries}
% While \pkg{expl3} is still experimental, the bundle is now regarded
@@ -786,87 +802,29 @@
% \pkg{expl3}.
% \end{bfseries}
%
-% New modules will be added to the distributed version of \pkg{expl3}
-% as they reach maturity. At present, the \pkg{expl3} bundle consists
-% of a number of modules, most of which are loaded by including the
-% line:
+% The distribution of \pkg{expl3} is split up into three packages on
+% CTAN: \pkg{l3kernel}, \pkg{l3packages} and \pkg{l3experimental}.
+% For historical reasons,
% \begin{verbatim}
% \RequirePackage{expl3}
% \end{verbatim}
-% in a \LaTeXe{} package, class or other file. The \pkg{expl3} modules
-% regarded as stable, and therefore suitable for basing real code on,
-% are as follows:
-%
-% \begin{description}
-% \providecommand\explpkg[2]{\item[#1]#2}
-% \explpkg{l3basics}{
-% This contains the basic definition modules used
-% by the other packages.
-% }
-% \explpkg{l3box}{
-% Primitives for dealing with boxes.
-% }
-% \explpkg{l3clist}{
-% Methods for manipulating comma-separated token lists.
-% }
-% \explpkg{l3coffins}{
-% Augmented box constructs for alignment operations.
-% }
-% \explpkg{l3expan}{
-% This is the argument expansion module discussed earlier in this
-% document.
-% }
-% \explpkg{l3int}{
-% This implements the integer data-type \texttt{int}.
-% }
-% \explpkg{l3keys}{
-% For processing lists of the form
-% \texttt{\{ key1=val1 , key2=val2 \}}, intended to work
-% as a \LaTeX3 version of \pkg{xkeyval}/\pkg{kvoptions}, although
-% with input syntax more like that of \pkg{pgfkeys}.
-% }
-% \explpkg{l3msg}{
-% Communicating with the user: includes low-level hooks to allow
-% messages to be filtered (higher-level interface for filtering
-% to be written!).
-% }
-% \explpkg{l3names}{
-% This sets up the basic naming scheme and renames all
-% the \TeX{} primitives.
-% }
-% \explpkg{l3prg}{
-% Program control structures such as boolean data type |bool|, generic
-% do-while loops, and conditional flow.
-% }
-% \explpkg{l3prop}{
-% This implements the data-type for \enquote{property lists} that are used, in
-% particular, for storing key/value pairs.
-% }
-% \explpkg{l3quark}{
-% A \enquote{quark} is a command that is defined to expand to
-% itself! Therefore they must never be expanded as this would generate an
-% infinite recursion; they do however have many uses, \emph{e.g.}~as
-% special markers and delimiters within code.
-% }
-% \explpkg{l3seq}{
-% This implements data-types such as queues and stacks.
-% }
-% \explpkg{l3skip}{
-% Implements the \enquote{rubber length} datatype \texttt{skip}, the
-% \enquote{rigid length} datatype |dim|, and the math mode
-% \enquote{rubber length} datatype \texttt{muskip}.
-% }
-% \explpkg{l3tl}{
-% This implements a basic data-type, called a \textit{token-list
-% variable} (|tl var.|), used for storing named token lists: these are
-% \TeX{} macros with no arguments.
-% }
-% \explpkg{l3token}{
-% Analysing token lists and token streams, including peeking ahead to
-% see what's coming next and inspecting tokens to detect which kind
-% they are.
-% }
-% \end{description}
+% loads the code now distributed as \pkg{l3kernel}. This monolithic
+% package contains all of the modules regarded by the team as stable,
+% and any changes in this code are very limited. This material is
+% therefore suitable for use in third-party packages without concern
+% about changes in support. All of this code is documented in
+% \texttt{interface3.pdf}.
+%
+% The material in \pkg{l3packages} is also stable, but is not always
+% at a programming level: most notably, \pkg{xparse} is stable and
+% suitable for wider use.
+%
+% Finally, \pkg{l3experimental} contains modules ready for public use
+% but not yet integrated into \pkg{l3kernel}. These modules have to
+% be loaded explicitly. The team anticipate that all of these modules
+% will move to stable status over time, but they may be more flexible
+% in terms of interface and functionality detail. Feedback on these
+% modules is extremely valuable.
%
% \section{Moving from \LaTeXe{} to \LaTeX3}
%
@@ -1171,7 +1129,7 @@
% \begin{macrocode}
%<*2ekernel>
\everyjob\expandafter{\the\everyjob
- \message{expl3 <\ExplFileDate> L3 programming layer}%
+ \message{L3 programming layer <\ExplFileDate>}%
}
%</2ekernel>
%<*!2ekernel>
@@ -1322,13 +1280,17 @@
}
% \end{macrocode}
%
-% A backend has to be in place by the start of the document.
+% A backend has to be in place by the start of the document: this has to be
+% before global options are checked for use. The odd group stuff avoids
+% needing to actually patch \tn{document}.
% \begin{macrocode}
%<*2ekernel>
-\AtBeginDocument
+\tl_put_left:Nn \document
{
+ \endgroup
\str_if_exist:NF \c_sys_backend_str
{ \sys_load_backend:n { } }
+ \begingroup
}
%</2ekernel>
%<*!2ekernel>
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 5ff3ded9e7..2cb019c335 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index 872a46e97c..e1ad66bb50 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index 5b08ade5dc..c8daecbd24 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -2,7 +2,7 @@
File: interfaces3.tex
-Copyright (C) 1990-2011,2017-2019 The LaTeX3 Project
+Copyright (C) 1990-2011,2017-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -54,7 +54,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-11-07}
+\date{Released 2020-01-12}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3.ins b/macros/latex/contrib/l3kernel/l3.ins
index d9c7f2e6cf..b509a2478f 100644
--- a/macros/latex/contrib/l3kernel/l3.ins
+++ b/macros/latex/contrib/l3kernel/l3.ins
@@ -2,7 +2,7 @@
File l3.ins
-Copyright (C) 2011,2012,2014-2019 The LaTeX3 Project
+Copyright (C) 2011,2012,2014-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 1990-2019 The LaTeX3 Project
+Copyright (C) 1990-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -104,6 +104,8 @@ and all files in that bundle must be distributed together.
\from{l3coffins.dtx} {package}
\from{l3luatex.dtx} {package,tex}
\from{l3unicode.dtx} {package}
+ \from{l3text.dtx} {package}
+ \from{l3text-case.dtx} {package}
\from{l3candidates.dtx} {package}
\from{l3legacy.dtx} {package}
\from{l3deprecation.dtx}{package,kernel}
@@ -149,7 +151,7 @@ and all files in that bundle must be distributed together.
\def\MetaPrefix{--}
\preamble
-Copyright (C) 1990-2019 The LaTeX3 Project
+Copyright (C) 1990-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3kernel/l3alloc.dtx b/macros/latex/contrib/l3kernel/l3alloc.dtx
index 86076bb8f0..e3f88dfc94 100644
--- a/macros/latex/contrib/l3kernel/l3alloc.dtx
+++ b/macros/latex/contrib/l3kernel/l3alloc.dtx
@@ -2,7 +2,7 @@
%
%% File: l3alloc.dtx
%
-% Copyright (C) 1990-2012,2014-2019 The LaTeX3 Project
+% Copyright (C) 1990-2012,2014-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index aea1d1fbad..7814fd3089 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index 7066d5132e..c503774a49 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index 55915ae859..16f74edd99 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -2,7 +2,7 @@
%
%% File: l3box.dtx
%
-% Copyright (C) 2005-2019 The LaTeX3 Project
+% Copyright (C) 2005-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index 4e859699e0..adb399f9da 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -2,7 +2,7 @@
%
%% File: l3candidates.dtx
%
-% Copyright (C) 2012-2019 The LaTeX3 Project
+% Copyright (C) 2012-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -369,6 +369,47 @@
% conversely: sets it to the inverse of its current value.
% \end{function}
%
+% \begin{function}[added = 2019-02-10, EXP, noTF]
+% {\bool_case_true:n, \bool_case_false:n}
+% \begin{syntax}
+% \cs{bool_case_true:nTF} \\
+% ~~|{| \\
+% ~~~~\Arg{boolexpr case_1} \Arg{code case_1} \\
+% ~~~~\Arg{boolexpr case_2} \Arg{code case_2} \\
+% ~~~~\ldots \\
+% ~~~~\Arg{boolexpr case_n} \Arg{code case_n} \\
+% ~~|}| \\
+% ~~\Arg{true code}
+% ~~\Arg{false code}
+% \end{syntax}
+% Evaluates in turn each of the \meta{boolean expression cases} until
+% the first one that evaluates to \texttt{true} or to \texttt{false},
+% for \cs{bool_case_true:n} and \cs{bool_case_false:n}, respectively.
+% The \meta{code} associated to this first case is left in the input
+% stream, followed by the \meta{true code}, and other cases are
+% discarded. If none of the cases match then only the \meta{false
+% code} is inserted. The functions \cs{bool_case_true:n} and
+% \cs{bool_case_false:n}, which do nothing if there is no match, are
+% also available. For example
+% \begin{verbatim}
+% \bool_case_true:nF
+% {
+% { \dim_compare_p:n { \l__mypkg_wd_dim <= 10pt } }
+% { Fits }
+% { \int_compare_p:n { \l__mypkg_total_int >= 10 } }
+% { Many }
+% { \l__mypkg_special_bool }
+% { Special }
+% }
+% { No idea! }
+% \end{verbatim}
+% leaves \enquote{\texttt{Fits}} or \enquote{\texttt{Many}} or
+% \enquote{\texttt{Special}} or \enquote{\texttt{No idea!}} in the
+% input stream, in a way similar to some other language's
+% \enquote{\texttt{if} \ldots\ \texttt{elseif} \ldots\ \texttt{elseif} \ldots\
+% \texttt{else} \ldots}.
+% \end{function}
+%
% \section{Additions to \pkg{l3prop}}
%
% \begin{function}[EXP, added = 2016-12-06]
@@ -534,200 +575,6 @@
%
% \section{Additions to \pkg{l3tl}}
%
-% \begin{function}[EXP, added = 2014-06-30, updated = 2016-01-12]
-% {
-% \tl_lower_case:n, \tl_upper_case:n, \tl_mixed_case:n,
-% \tl_lower_case:nn, \tl_upper_case:nn, \tl_mixed_case:nn
-% }
-% \begin{syntax}
-% \cs{tl_upper_case:n} \Arg{tokens}
-% \cs{tl_upper_case:nn} \Arg{language} \Arg{tokens}
-% \end{syntax}
-% These functions are intended to be applied to input which may be
-% regarded broadly as \enquote{text}. They traverse the \meta{tokens} and
-% change the case of characters as discussed below. The character code of
-% the characters replaced may be arbitrary: the replacement characters
-% have standard document-level category codes ($11$ for letters, $12$ for
-% letter-like characters which can also be case-changed). Begin-group and
-% end-group characters in the \meta{tokens} are normalized and become |{|
-% and |}|, respectively.
-%
-% Importantly, notice that these functions are intended for working with
-% user text for typesetting. For case changing programmatic data see the
-% \pkg{l3str} module and discussion there of \cs{str_lower_case:n},
-% \cs{str_upper_case:n} and \cs{str_fold_case:n}.
-% \end{function}
-%
-% The functions perform expansion on the input in most cases. In particular,
-% input in the form of token lists or expandable functions is expanded
-% \emph{unless} it falls within one of the special handling classes described
-% below. This expansion approach means that in general the result of case
-% changing matches the \enquote{natural} outcome expected from a
-% \enquote{functional} approach to case modification. For example
-% \begin{verbatim}
-% \tl_set:Nn \l_tmpa_tl { hello }
-% \tl_upper_case:n { \l_tmpa_tl \c_space_tl world }
-% \end{verbatim}
-% produces
-% \begin{verbatim}
-% HELLO WORLD
-% \end{verbatim}
-% The expansion approach taken means that in package mode any \LaTeXe{}
-% \enquote{robust} commands which may appear in the input should be converted
-% to engine-protected versions using for example the \tn{robustify} command
-% from the \pkg{etoolbox} package.
-%
-% \begin{variable}{\l_tl_case_change_math_tl}
-% Case changing does not take place within math mode material so for example
-% \begin{verbatim}
-% \tl_upper_case:n { Some~text~$y = mx + c$~with~{Braces} }
-% \end{verbatim}
-% becomes
-% \begin{verbatim}
-% SOME TEXT $y = mx + c$ WITH {BRACES}
-% \end{verbatim}
-% Material inside math mode is left entirely unchanged: in particular, no
-% expansion is undertaken.
-%
-% Detection of math mode is controlled by the list of tokens in
-% \cs{l_tl_case_change_math_tl}, which should be in open--close pairs. In
-% package mode the standard settings is
-% \begin{verbatim}
-% $ $ \( \)
-% \end{verbatim}
-%
-% Note that while expansion occurs when searching the text it does not
-% apply to math mode material (which should be unaffected by case changing).
-% As such, whilst the opening token for math mode may be \enquote{hidden}
-% inside a command/macro, the closing one cannot be as this is being
-% searched for in math mode. Typically, in the types of \enquote{text}
-% the case changing functions are intended to apply to this should not be
-% an issue.
-% \end{variable}
-%
-% \begin{variable}{\l_tl_case_change_exclude_tl}
-% Case changing can be prevented by using any command on the list
-% \cs{l_tl_case_change_exclude_tl}. Each entry should be a function
-% to be followed by one argument: the latter will be preserved as-is
-% with no expansion. Thus for example following
-% \begin{verbatim}
-% \tl_put_right:Nn \l_tl_case_change_exclude_tl { \NoChangeCase }
-% \end{verbatim}
-% the input
-% \begin{verbatim}
-% \tl_upper_case:n
-% { Some~text~$y = mx + c$~with~\NoChangeCase {Protection} }
-% \end{verbatim}
-% will result in
-% \begin{verbatim}
-% SOME TEXT $y = mx + c$ WITH \NoChangeCase {Protection}
-% \end{verbatim}
-% Notice that the case changing mapping preserves the inclusion of
-% the escape functions: it is left to other code to provide suitable
-% definitions (typically equivalent to \cs{use:n}). In particular, the
-% result of case changing is returned protected by \cs{exp_not:n}.
-%
-% When used with \LaTeXe{} the commands |\cite|, |\ensuremath|, |\label|
-% and |\ref| are automatically included in the list for exclusion from
-% case changing.
-% \end{variable}
-%
-% \begin{variable}{\l_tl_case_change_accents_tl}
-% This list specifies accent commands which should be left unexpanded
-% in the output. This allows for example
-% \begin{verbatim}
-% \tl_upper_case:n { \" { a } }
-% \end{verbatim}
-% to yield
-% \begin{verbatim}
-% \" { A }
-% \end{verbatim}
-% irrespective of the expandability of |\"|.
-%
-% The standard contents of this variable is |\"|, |\'|, |\.|, |\^|, |\`|,
-% |\~|, |\c|, |\H|, |\k|, |\r|, |\t|, |\u| and |\v|.
-% \end{variable}
-%
-% \enquote{Mixed} case conversion may be regarded informally as converting the
-% first character of the \meta{tokens} to upper case and the rest to lower
-% case. However, the process is more complex than this as there are some
-% situations where a single lower case character maps to a special form, for
-% example \texttt{ij} in Dutch which becomes \texttt{IJ}. As such,
-% \cs[index=tl_mixed_case:n]{tl_mixed_case:n(n)}
-% implement a more sophisticated mapping which accounts
-% for this and for modifying accents on the first letter. Spaces at the start
-% of the \meta{tokens} are ignored when finding the first \enquote{letter} for
-% conversion.
-% \begin{verbatim}
-% \tl_mixed_case:n { hello~WORLD } % => "Hello world"
-% \tl_mixed_case:n { ~hello~WORLD } % => " Hello world"
-% \tl_mixed_case:n { {hello}~WORLD } % => "{Hello} world"
-% \end{verbatim}
-% When finding the first \enquote{letter} for this process, any content in
-% math mode or covered by \cs{l_tl_case_change_exclude_tl} is ignored.
-%
-% (Note that the Unicode Consortium describe this as \enquote{title case}, but
-% that in English title case applies on a word-by-word basis. The
-% \enquote{mixed} case implemented here is a lower level concept needed for
-% both \enquote{title} and \enquote{sentence} casing of text.)
-%
-% \begin{variable}{\l_tl_mixed_case_ignore_tl}
-% The list of characters to ignore when searching for the first
-% \enquote{letter} in mixed-casing is determined by
-% \cs{l_tl_mixed_change_ignore_tl}. This has the standard setting
-% \begin{verbatim}
-% ( [ { ` -
-% \end{verbatim}
-% where comparisons are made on a character basis.
-% \end{variable}
-%
-% As is generally true for \pkg{expl3}, these functions are designed to
-% work with Unicode input only. As such, UTF-8 input is assumed for
-% \emph{all} engines. When used with \XeTeX{} or \LuaTeX{} a full range of
-% Unicode transformations are enabled. Specifically, the standard mappings
-% here follow those defined by the \href{http://www.unicode.org}^^A
-% {Unicode Consortium} in \texttt{UnicodeData.txt} and
-% \texttt{SpecialCasing.txt}. In the case of $8$-bit engines, mappings
-% are provided for characters which can be represented in output typeset
-% using the |T1| font encoding. Thus for example |ä| can be case-changed
-% using \pdfTeX{}. For \pTeX{} only the ASCII range is covered as the
-% engine treats input outside of this range as east Asian.
-%
-% Context-sensitive mappings are enabled: language-dependent cases are
-% discussed below. Context detection expands input but treats any
-% unexpandable control sequences as \enquote{failures} to match a context.
-%
-% Language-sensitive conversions are enabled using the \meta{language}
-% argument, and follow Unicode Consortium guidelines. Currently, the
-% languages recognised for special handling are as follows.
-% \begin{itemize}
-% \item Azeri and Turkish (\texttt{az} and \texttt{tr}).
-% The case pairs I/i-dotless and I-dot/i are activated for these
-% languages. The combining dot mark is removed when lower
-% casing I-dot and introduced when upper casing i-dotless.
-% \item German (\texttt{de-alt}).
-% An alternative mapping for German in which the lower case
-% \emph{Eszett} maps to a \emph{gro\ss{}es Eszett}.
-% \item Lithuanian (\texttt{lt}).
-% The lower case letters i and j should retain a dot above when the
-% accents grave, acute or tilde are present. This is implemented for
-% lower casing of the relevant upper case letters both when input as
-% single Unicode codepoints and when using combining accents. The
-% combining dot is removed when upper casing in these cases. Note that
-% \emph{only} the accents used in Lithuanian are covered: the behaviour
-% of other accents are not modified.
-% \item Dutch (\texttt{nl}).
-% Capitalisation of \texttt{ij} at the beginning of mixed cased
-% input produces \texttt{IJ} rather than \texttt{Ij}. The output
-% retains two separate letters, thus this transformation \emph{is}
-% available using \pdfTeX{}.
-% \end{itemize}
-%
-% Creating additional context-sensitive mappings requires knowledge
-% of the underlying mapping implementation used here. The team are happy
-% to add these to the kernel where they are well-documented
-% (\emph{e.g.}~in Unicode Consortium or relevant government publications).
-%
% \begin{function}[EXP, added = 2017-07-15]
% {
% \tl_range_braced:Nnn, \tl_range_braced:cnn, \tl_range_braced:nnn,
@@ -848,38 +695,28 @@
% (\enquote{active}), and character code $32$ (space).
% \end{variable}
%
-% \begin{function}[added = 2018-04-06, updated = 2019-05-03, EXP]
-% {
-% \char_lower_case:N, \char_upper_case:N,
-% \char_mixed_case:N, \char_fold_case:N,
-% \char_str_lower_case:N, \char_str_upper_case:N,
-% \char_str_mixed_case:N, \char_str_fold_case:N,
-% }
+% \begin{function}[added = 2020-01-09, EXP]{\char_to_utfviii_bytes:n}
% \begin{syntax}
-% \cs{char_lower_case:N} \meta{char}
-% \end{syntax}
-% Converts the \meta{char} to the equivalent case-changed character
-% as detailed by the function name (see \cs{str_fold_case:n}
-% and \cs{tl_mixed_case:n} for details of these terms). The case mapping
-% is carried out with no context-dependence (\emph{cf.}~\cs{tl_upper_case:n},
-% \emph{etc.}) The \texttt{str} versions always generate \enquote{other}
-% (category code $12$) characters, whilst the standard versions generate
-% characters with the currently-active category code (\emph{i.e.}~as if
-% the character had been read directly here).
-% \end{function}
-%
-% \begin{function}[added = 2018-06-01, EXP]{\char_codepoint_to_bytes:n}
-% \begin{syntax}
-% \cs{char_codepoint_to_bytes:n} \Arg{codepoint}
+% \cs{char_to_utfviii_bytes:n} \Arg{codepoint}
% \end{syntax}
% Converts the (Unicode) \meta{codepoint} to UTF-8 bytes. The expansion
% of this function comprises four brace groups, each of which will contain
% a hexadecimal value: the appropriate byte. As UTF-8 is a variable-length,
-% one or more of the grouos may be empty: the bytes read in the logical order,
+% one or more of the groups may be empty: the bytes read in the logical order,
% such that a two-byte codepoint will have groups |#1| and |#2| filled
% and |#3| and |#4| empty.
% \end{function}
%
+% \begin{function}[added = 2020-01-02, rEXP]{\char_to_nfd:N}
+% \begin{syntax}
+% \cs{char_to_nfd:N} \meta{char}
+% \end{syntax}
+% Converts the \meta{char} to the Unicode Normalization Form Canonical
+% Decomposition. The category code of the generated character is the
+% same as the \meta{char}. With $8$-bit engines, no change is made to the
+% character.
+% \end{function}
+%
% \begin{function}[added = 2018-09-23]
% {
% \peek_catcode_collect_inline:Nn,
@@ -1238,6 +1075,52 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP, noTF]{\bool_case_true:n, \bool_case_false:n}
+% \begin{macro}{\@@_case:NnTF}
+% \begin{macro}{\@@_case_true:w, \@@_case_false:w, \@@_case_end:nw}
+% For boolean cases the overall idea is the same as for
+% \cs{tl_case:nn(TF)} as described in \pkg{l3tl}.
+% \begin{macrocode}
+\cs_new:Npn \bool_case_true:nTF
+ { \exp:w \@@_case:NnTF \c_true_bool }
+\cs_new:Npn \bool_case_true:nT #1#2
+ { \exp:w \@@_case:NnTF \c_true_bool {#1} {#2} { } }
+\cs_new:Npn \bool_case_true:nF #1
+ { \exp:w \@@_case:NnTF \c_true_bool {#1} { } }
+\cs_new:Npn \bool_case_true:n #1
+ { \exp:w \@@_case:NnTF \c_true_bool {#1} { } { } }
+\cs_new:Npn \bool_case_false:nTF
+ { \exp:w \@@_case:NnTF \c_false_bool }
+\cs_new:Npn \bool_case_false:nT #1#2
+ { \exp:w \@@_case:NnTF \c_false_bool {#1} {#2} { } }
+\cs_new:Npn \bool_case_false:nF #1
+ { \exp:w \@@_case:NnTF \c_false_bool {#1} { } }
+\cs_new:Npn \bool_case_false:n #1
+ { \exp:w \@@_case:NnTF \c_false_bool {#1} { } { } }
+\cs_new:Npn \@@_case:NnTF #1#2#3#4
+ {
+ \bool_if:NTF #1 \@@_case_true:w \@@_case_false:w
+ #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop
+ }
+\cs_new:Npn \@@_case_true:w #1#2
+ {
+ \bool_if:nTF {#1}
+ { \@@_case_end:nw {#2} }
+ { \@@_case_true:w }
+ }
+\cs_new:Npn \@@_case_false:w #1#2
+ {
+ \bool_if:nTF {#1}
+ { \@@_case_false:w }
+ { \@@_case_end:nw {#2} }
+ }
+\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+ { \exp_end: #1 #4 }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Additions to \pkg{l3prop}}
%
% \begin{macrocode}
@@ -1544,1616 +1427,12 @@
% \end{macro}
% \end{macro}
%
-% \subsection{Additions to \pkg{l3tl}}
-%
-% \subsubsection{Unicode case changing}
-%
-% The mechanisms needed for case changing are somewhat involved, particularly
-% to allow for all of the special cases. These functions also require the
-% appropriate data extracted from the Unicode documentation (either manually
-% or automatically).
-%
-% First, some code which \enquote{belongs} in \pkg{l3tokens} but has to come
-% here.
-% \begin{macrocode}
-%<@@=char>
-% \end{macrocode}
-%
-% \begin{macro}[EXP]
-% {
-% \char_lower_case:N, \char_upper_case:N,
-% \char_mixed_case:N, \char_fold_case:N
-% }
-% \begin{macro}[EXP]{\@@_change_case:nNN}
-% \begin{macro}[EXP]{\@@_change_case:nN}
-% \begin{macro}[EXP]{\@@_change_case_multi:nN, \@@_change_case_multi:vN}
-% \begin{macro}[EXP]{\@@_change_case_multi:NNNNw}
-% \begin{macro}[EXP]{\@@_change_case:NNN}
-% \begin{macro}[EXP]{\@@_change_case:NNNN}
-% \begin{macro}[EXP]{\@@_change_case:NN}
-% \begin{macro}[EXP]{\@@_change_case_catcode:N}
-% \begin{macro}[EXP]
-% {
-% \char_str_lower_case:N, \char_str_upper_case:N,
-% \char_str_mixed_case:N, \char_str_fold_case:N
-% }
-% \begin{macro}[EXP]{\@@_str_change_case:nNN}
-% \begin{macro}[EXP]{\@@_str_change_case:nN}
-% Expandable character generation is done using a two-part approach.
-% First, see if the current character has a special mapping for the current
-% transformation. If it does, insert that. Otherwise, use the \TeX{} data
-% to look up the one-to-one mapping, and generate the appropriate character
-% with the appropriate category code. Mixed case needs an extra step as it
-% may be special-cased or might be a special upper case outcome. The internal
-% when using non-Unicode engines has to be set up to only do anything
-% with ASCII characters.
-%
-% To ensure that the category codes produced are predictable, every character
-% is re-generated even if it is otherwise unchanged. This makes life a little
-% interesting when we might have multiple output characters: we have to
-% grab each of them and case change them in reverse order to maintain
-% \texttt{f}-type expandability.
-% \begin{macrocode}
-\cs_new:Npn \char_lower_case:N #1
- { \@@_change_case:nNN { lower } \char_value_lccode:n #1 }
-\cs_new:Npn \char_upper_case:N #1
- { \@@_change_case:nNN { upper } \char_value_uccode:n #1 }
-\cs_new:Npn \char_mixed_case:N #1
- {
- \tl_if_exist:cTF { c_@@_mixed_case_ \token_to_str:N #1 _tl }
- {
- \@@_change_case_multi:vN
- { c_@@_mixed_case_ \token_to_str:N #1 _tl } #1
- }
- { \char_upper_case:N #1 }
- }
-\cs_new:Npn \char_fold_case:N #1
- { \@@_change_case:nNN { fold } \char_value_lccode:n #1 }
-\cs_new:Npn \@@_change_case:nNN #1#2#3
- {
- \tl_if_exist:cTF { c_@@_ #1 _case_ \token_to_str:N #3 _tl }
- {
- \@@_change_case_multi:vN
- { c_@@_ #1 _case_ \token_to_str:N #3 _tl } #3
- }
- { \exp_args:Nf \@@_change_case:nN { #2 { `#3 } } #3 }
- }
-\cs_new:Npn \@@_change_case:nN #1#2
- {
- \int_compare:nNnTF {#1} = 0
- { #2 }
- { \char_generate:nn {#1} { \@@_change_case_catcode:N #2 } }
- }
-\cs_new:Npn \@@_change_case_multi:nN #1#2
- { \@@_change_case_multi:NNNNw #2 #1 \q_no_value \q_no_value \q_stop }
-\cs_generate_variant:Nn \@@_change_case_multi:nN { v }
-\cs_new:Npn \@@_change_case_multi:NNNNw #1#2#3#4#5 \q_stop
- {
- \quark_if_no_value:NTF #4
- {
- \quark_if_no_value:NTF #3
- { \@@_change_case:NN #1 #2 }
- { \@@_change_case:NNN #1 #2#3 }
- }
- { \@@_change_case:NNNN #1 #2#3#4 }
- }
-\cs_new:Npn \@@_change_case:NNN #1#2#3
- {
- \exp_args:Nnf \use:nn
- { \@@_change_case:NN #1 #2 }
- { \@@_change_case:NN #1 #3 }
- }
-\cs_new:Npn \@@_change_case:NNNN #1#2#3#4
- {
- \exp_args:Nnff \use:nnn
- { \@@_change_case:NN #1 #2 }
- { \@@_change_case:NN #1 #3 }
- { \@@_change_case:NN #1 #4 }
- }
-\cs_new:Npn \@@_change_case:NN #1#2
- { \char_generate:nn { `#2 } { \@@_change_case_catcode:N #1 } }
-\cs_new:Npn \@@_change_case_catcode:N #1
- {
- \if_catcode:w \exp_not:N #1 \c_math_toggle_token
- 3
- \else:
- \if_catcode:w \exp_not:N #1 \c_alignment_token
- 4
- \else:
- \if_catcode:w \exp_not:N #1 \c_math_superscript_token
- 7
- \else:
- \if_catcode:w \exp_not:N #1 \c_math_subscript_token
- 8
- \else:
- \if_catcode:w \exp_not:N #1 \c_space_token
- 10
- \else:
- \if_catcode:w \exp_not:N #1 \c_catcode_letter_token
- 11
- \else:
- \if_catcode:w \exp_not:N #1 \c_catcode_other_token
- 12
- \else:
- 13
- \fi:
- \fi:
- \fi:
- \fi:
- \fi:
- \fi:
- \fi:
- }
-% \end{macrocode}
-% Same story for the string version, except category code is easier
-% to follow. This of course makes this version significantly faster.
-% \begin{macrocode}
-\cs_new:Npn \char_str_lower_case:N #1
- { \@@_str_change_case:nNN { lower } \char_value_lccode:n #1 }
-\cs_new:Npn \char_str_upper_case:N #1
- { \@@_str_change_case:nNN { upper } \char_value_uccode:n #1 }
-\cs_new:Npn \char_str_mixed_case:N #1
- {
- \tl_if_exist:cTF { c_@@_mixed_case_ \token_to_str:N #1 _tl }
- { \tl_to_str:c { c_@@_mixed_case_ \token_to_str:N #1 _tl } }
- { \char_str_upper_case:N #1 }
- }
-\cs_new:Npn \char_str_fold_case:N #1
- { \@@_str_change_case:nNN { fold } \char_value_lccode:n #1 }
-\cs_new:Npn \@@_str_change_case:nNN #1#2#3
- {
- \tl_if_exist:cTF { c_@@_ #1 _case_ \token_to_str:N #3 _tl }
- { \tl_to_str:c { c_@@_ #1 _case_ \token_to_str:N #3 _tl } }
- { \exp_args:Nf \@@_str_change_case:nN { #2 { `#3 } } #3 }
- }
-\cs_new:Npn \@@_str_change_case:nN #1#2
- {
- \int_compare:nNnTF {#1} = 0
- { \tl_to_str:n {#2} }
- { \char_generate:nn {#1} { 12 } }
- }
-\cs_if_exist:NF \tex_Uchar:D
- {
- \cs_set:Npn \@@_str_change_case:nN #1#2
- { \tl_to_str:n {#2} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\char_codepoint_to_bytes:n}
-% \begin{macro}[EXP]{\@@_codepoint_to_bytes_auxi:n}
-% \begin{macro}[EXP]{\@@_codepoint_to_bytes_auxii:Nnn}
-% \begin{macro}[EXP]{\@@_codepoint_to_bytes_auxiii:n}
-% \begin{macro}[EXP]
-% {
-% \@@_codepoint_to_bytes_outputi:nw ,
-% \@@_codepoint_to_bytes_outputii:nw ,
-% \@@_codepoint_to_bytes_outputiii:nw ,
-% \@@_codepoint_to_bytes_outputiv:nw
-% }
-% \begin{macro}[EXP]
-% {\@@_codepoint_to_bytes_output:nnn, \@@_codepoint_to_bytes_output:fnn}
-% \begin{macro}[EXP]{\@@_codepoint_to_bytes_end:}
-% This code converts a codepoint into the correct UTF-8 representation.
-% In terms of the algorithm itself, see
-% \url{https://en.wikipedia.org/wiki/UTF-8} for the octet pattern.
-% \begin{macrocode}
-\cs_new:Npn \char_codepoint_to_bytes:n #1
- {
- \exp_args:Nf \@@_codepoint_to_bytes_auxi:n
- { \int_eval:n {#1} }
- }
-\cs_new:Npn \@@_codepoint_to_bytes_auxi:n #1
- {
- \if_int_compare:w #1 > "80 \exp_stop_f:
- \if_int_compare:w #1 < "800 \exp_stop_f:
- \@@_codepoint_to_bytes_outputi:nw
- { \@@_codepoint_to_bytes_auxii:Nnn C {#1} { 64 } }
- \@@_codepoint_to_bytes_outputii:nw
- { \@@_codepoint_to_bytes_auxiii:n {#1} }
- \else:
- \if_int_compare:w #1 < "10000 \exp_stop_f:
- \@@_codepoint_to_bytes_outputi:nw
- { \@@_codepoint_to_bytes_auxii:Nnn E {#1} { 64 * 64 } }
- \@@_codepoint_to_bytes_outputii:nw
- {
- \@@_codepoint_to_bytes_auxiii:n
- { \int_div_truncate:nn {#1} { 64 } }
- }
- \@@_codepoint_to_bytes_outputiii:nw
- { \@@_codepoint_to_bytes_auxiii:n {#1} }
- \else:
- \@@_codepoint_to_bytes_outputi:nw
- {
- \@@_codepoint_to_bytes_auxii:Nnn F
- {#1} { 64 * 64 * 64 }
- }
- \@@_codepoint_to_bytes_outputii:nw
- {
- \@@_codepoint_to_bytes_auxiii:n
- { \int_div_truncate:nn {#1} { 64 * 64 } }
- }
- \@@_codepoint_to_bytes_outputiii:nw
- {
- \@@_codepoint_to_bytes_auxiii:n
- { \int_div_truncate:nn {#1} { 64 } }
- }
- \@@_codepoint_to_bytes_outputiv:nw
- { \@@_codepoint_to_bytes_auxiii:n {#1} }
- \fi:
- \fi:
- \else:
- \@@_codepoint_to_bytes_outputi:nw {#1}
- \fi:
- \@@_codepoint_to_bytes_end: { } { } { } { }
- }
-\cs_new:Npn \@@_codepoint_to_bytes_auxii:Nnn #1#2#3
- { "#10 + \int_div_truncate:nn {#2} {#3} }
-\cs_new:Npn \@@_codepoint_to_bytes_auxiii:n #1
- { \int_mod:nn {#1} { 64 } + 128 }
-\cs_new:Npn \@@_codepoint_to_bytes_outputi:nw
- #1 #2 \@@_codepoint_to_bytes_end: #3
- { \@@_codepoint_to_bytes_output:fnn { \int_eval:n {#1} } { } {#2} }
-\cs_new:Npn \@@_codepoint_to_bytes_outputii:nw
- #1 #2 \@@_codepoint_to_bytes_end: #3#4
- { \@@_codepoint_to_bytes_output:fnn { \int_eval:n {#1} } { {#3} } {#2} }
-\cs_new:Npn \@@_codepoint_to_bytes_outputiii:nw
- #1 #2 \@@_codepoint_to_bytes_end: #3#4#5
- {
- \@@_codepoint_to_bytes_output:fnn
- { \int_eval:n {#1} } { {#3} {#4} } {#2}
- }
-\cs_new:Npn \@@_codepoint_to_bytes_outputiv:nw
- #1 #2 \@@_codepoint_to_bytes_end: #3#4#5#6
- {
- \@@_codepoint_to_bytes_output:fnn
- { \int_eval:n {#1} } { {#3} {#4} {#5} } {#2}
- }
-\cs_new:Npn \@@_codepoint_to_bytes_output:nnn #1#2#3
- {
- #3
- \@@_codepoint_to_bytes_end: #2 {#1}
- }
-\cs_generate_variant:Nn \@@_codepoint_to_bytes_output:nnn { f }
-\cs_new:Npn \@@_codepoint_to_bytes_end: { }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
+% \subsubsection{Building a token list}
%
% \begin{macrocode}
%<@@=tl>
% \end{macrocode}
%
-% \begin{macro}[EXP]{\tl_lower_case:n, \tl_upper_case:n, \tl_mixed_case:n}
-% \begin{macro}[EXP]{\tl_lower_case:nn, \tl_upper_case:nn, \tl_mixed_case:nn}
-% The user level functions here are all wrappers around the internal
-% functions for case changing.
-% \begin{macrocode}
-\cs_new:Npn \tl_lower_case:n { \@@_change_case:nnn { lower } { } }
-\cs_new:Npn \tl_upper_case:n { \@@_change_case:nnn { upper } { } }
-\cs_new:Npn \tl_mixed_case:n { \@@_change_case:nnn { mixed } { } }
-\cs_new:Npn \tl_lower_case:nn { \@@_change_case:nnn { lower } }
-\cs_new:Npn \tl_upper_case:nn { \@@_change_case:nnn { upper } }
-\cs_new:Npn \tl_mixed_case:nn { \@@_change_case:nnn { mixed } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_change_case:nnn}
-% \begin{macro}[EXP]{\@@_change_case_aux:nnn}
-% \begin{macro}[EXP]{\@@_change_case_loop:wnn}
-% \begin{macro}[EXP]
-% {
-% \@@_change_case_output:nwn ,
-% \@@_change_case_output:Vwn ,
-% \@@_change_case_output:own ,
-% \@@_change_case_output:vwn ,
-% \@@_change_case_output:fwn ,
-% }
-% \begin{macro}[EXP]{\@@_change_case_end:wn}
-% \begin{macro}[EXP]{\@@_change_case_group:nwnn}
-% \begin{macro}[EXP]
-% {
-% \@@_change_case_group_lower:nnnn ,
-% \@@_change_case_group_upper:nnnn ,
-% \@@_change_case_group_mixed:nnnn
-% }
-% \begin{macro}[EXP]{\@@_change_case_space:wnn}
-% \begin{macro}[EXP]{\@@_change_case_N_type:Nwnn}
-% \begin{macro}[EXP]{\@@_change_case_N_type:NNNnnn}
-% \begin{macro}[EXP]{\@@_change_case_math:NNNnnn}
-% \begin{macro}[EXP]{\@@_change_case_math_loop:wNNnn}
-% \begin{macro}[EXP]{\@@_change_case_math:NwNNnn}
-% \begin{macro}[EXP]{\@@_change_case_math_group:nwNNnn}
-% \begin{macro}[EXP]{\@@_change_case_math_space:wNNnn}
-% \begin{macro}[EXP]{\@@_change_case_N_type:Nnnn}
-% \begin{macro}[EXP]
-% {
-% \@@_change_case_char_lower:Nnn ,
-% \@@_change_case_char_upper:Nnn ,
-% \@@_change_case_char_mixed:Nnn
-% }
-% \begin{macro}[EXP]{\@@_change_case_char:nN}
-% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNN}
-% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNN}
-% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNNN}
-% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nn}
-% \begin{macro}[EXP]{\@@_change_case_cs_letterlike:Nn}
-% \begin{macro}[EXP]{\@@_change_case_cs_letterlike:NnN}
-% \begin{macro}[EXP]{\@@_change_case_cs_accents:NN}
-% \begin{macro}[EXP]{\@@_change_case_cs:N}
-% \begin{macro}[EXP]{\@@_change_case_cs:NN}
-% \begin{macro}[EXP]{\@@_change_case_cs:NNn}
-% \begin{macro}[EXP]{\@@_change_case_protect:wNN}
-% \begin{macro}[EXP]{\@@_change_case_if_expandable:NTF}
-% \begin{macro}[EXP]{\@@_change_case_cs_expand:Nnw}
-% \begin{macro}[EXP]{\@@_change_case_cs_expand:NN}
-% \begin{macro}[EXP]{\@@_change_case_mixed_skip:N}
-% \begin{macro}[EXP]{\@@_change_case_mixed_skip:NN}
-% \begin{macro}[EXP]{\@@_change_case_mixed_skip_tidy:Nwn}
-% \begin{macro}[EXP]{\@@_change_case_mixed_switch:w}
-% The mechanism for the core conversion of case is based on the idea that
-% we can use a loop to grab the entire token list plus a quark: the latter is
-% used as an end marker and to avoid any brace stripping. Depending on the
-% nature of the first item in the grabbed argument, it can either processed
-% as a single token, treated as a group or treated as a space. These
-% different cases all work by re-reading |#1| in the appropriate way, hence
-% the repetition of |#1 \q_recursion_stop|.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case:nnn #1#2#3
- {
- \__kernel_exp_not:w \exp_after:wN
- {
- \exp:w
- \@@_change_case_aux:nnn {#1} {#2} {#3}
- }
- }
-\cs_new:Npn \@@_change_case_aux:nnn #1#2#3
- {
- \group_align_safe_begin:
- \@@_change_case_loop:wnn
- #3 \q_recursion_tail \q_recursion_stop {#1} {#2}
- \@@_change_case_result:n { }
- }
-\cs_new:Npn \@@_change_case_loop:wnn #1 \q_recursion_stop
- {
- \tl_if_head_is_N_type:nTF {#1}
- { \@@_change_case_N_type:Nwnn }
- {
- \tl_if_head_is_group:nTF {#1}
- { \@@_change_case_group:nwnn }
- { \@@_change_case_space:wnn }
- }
- #1 \q_recursion_stop
- }
-% \end{macrocode}
-% Earlier versions of the code where only \texttt{x}-type expandable rather
-% than \texttt{f}-type: this causes issues with nesting and so the slight
-% performance hit is taken for a better outcome in usability terms. Setting
-% up for \texttt{f}-type expandability has two requirements: a marker
-% token after the main loop (see above) and a mechanism to \enquote{load}
-% and finalise the result. That is handled in the code below, which includes
-% the necessary material to end the \cs{exp:w} expansion.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_output:nwn #1#2 \@@_change_case_result:n #3
- { #2 \@@_change_case_result:n { #3 #1 } }
-\cs_generate_variant:Nn \@@_change_case_output:nwn { V , o , v , f }
-\cs_new:Npn \@@_change_case_end:wn #1 \@@_change_case_result:n #2
- {
- \group_align_safe_end:
- \exp_end:
- #2
- }
-% \end{macrocode}
-% Handling for the cases where the current argument is a brace group or
-% a space is relatively easy. For the brace case, the routine works
-% recursively, using the expandability of the mechanism to ensure that the
-% result is finalised before storage. For the space case it is simply a
-% question of removing the space in the input and storing it in the output.
-% In both cases, and indeed for the \texttt{N}-type grabber, after removing
-% the current item from the input \cs{@@_change_case_loop:wnn} is inserted
-% in front of the remaining tokens.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_group:nwnn #1#2 \q_recursion_stop #3#4
- {
- \use:c { @@_change_case_group_ #3 : nnnn } {#1} {#2} {#3} {#4}
- }
-\cs_new:Npn \@@_change_case_group_lower:nnnn #1#2#3#4
- {
- \@@_change_case_output:own
- {
- \exp_after:wN
- {
- \exp:w
- \@@_change_case_aux:nnn {#3} {#4} {#1}
- }
- }
- \@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
- }
-\cs_new_eq:NN \@@_change_case_group_upper:nnnn
- \@@_change_case_group_lower:nnnn
-% \end{macrocode}
-% For the \enquote{mixed} case, a group is taken as forcing a switch to lower
-% casing. That means we need a separate auxiliary. (Tracking whether we have
-% found a first character inside a group and transferring the information out
-% looks pretty horrible.)
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_group_mixed:nnnn #1#2#3#4
- {
- \@@_change_case_output:own
- {
- \exp_after:wN
- {
- \exp:w
- \@@_change_case_aux:nnn {#3} {#4} {#1}
- }
- }
- \@@_change_case_loop:wnn #2 \q_recursion_stop { lower } {#4}
- }
-\exp_last_unbraced:NNo \cs_new:Npn \@@_change_case_space:wnn \c_space_tl
- {
- \@@_change_case_output:nwn { ~ }
- \@@_change_case_loop:wnn
- }
-% \end{macrocode}
-% For \texttt{N}-type arguments there are several stages to the approach.
-% First, a simply check for the end-of-input marker, which if found triggers
-% the final clean up and output step. Assuming that is not the case, the
-% first check is for math-mode escaping: this test can encompass control
-% sequences or other \texttt{N}-type tokens so is handled up front.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_N_type:Nwnn #1#2 \q_recursion_stop
- {
- \quark_if_recursion_tail_stop_do:Nn #1
- { \@@_change_case_end:wn }
- \exp_after:wN \@@_change_case_N_type:NNNnnn
- \exp_after:wN #1 \l_tl_case_change_math_tl
- \q_recursion_tail ? \q_recursion_stop {#2}
- }
-% \end{macrocode}
-% Looking for math mode escape first requires a loop over the possible
-% token pairs to see if the current input (|#1|) matches an open-math case
-% (|#2|). If if does then this test loop is ended and a new input-gathering
-% one is begun. The latter simply transfers material from the input to the
-% output without any expansion, testing each \texttt{N}-type token to see
-% if it matches the close-math case required. If that is the situation then
-% the \enquote{math loop} stops and resumes the main loop: as that might
-% be either the standard case-changing one or the mixed-case alternative,
-% it is not hard-coded into the math loop but is rather passed as argument
-% |#3| to \cs{@@_change_case_math:NNNnnn}. If no close-math token is found
-% then the final clean-up is forced (\emph{i.e.}~there is no assumption
-% of \enquote{well-behaved} input in terms of math mode).
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_N_type:NNNnnn #1#2#3
- {
- \quark_if_recursion_tail_stop_do:Nn #2
- { \@@_change_case_N_type:Nnnn #1 }
- \token_if_eq_meaning:NNTF #1 #2
- {
- \use_i_delimit_by_q_recursion_stop:nw
- {
- \@@_change_case_math:NNNnnn
- #1 #3 \@@_change_case_loop:wnn
- }
- }
- { \@@_change_case_N_type:NNNnnn #1 }
- }
-\cs_new:Npn \@@_change_case_math:NNNnnn #1#2#3#4
- {
- \@@_change_case_output:nwn {#1}
- \@@_change_case_math_loop:wNNnn #4 \q_recursion_stop #2 #3
- }
-\cs_new:Npn \@@_change_case_math_loop:wNNnn #1 \q_recursion_stop
- {
- \tl_if_head_is_N_type:nTF {#1}
- { \@@_change_case_math:NwNNnn }
- {
- \tl_if_head_is_group:nTF {#1}
- { \@@_change_case_math_group:nwNNnn }
- { \@@_change_case_math_space:wNNnn }
- }
- #1 \q_recursion_stop
- }
-\cs_new:Npn \@@_change_case_math:NwNNnn #1#2 \q_recursion_stop #3#4
- {
- \token_if_eq_meaning:NNTF \q_recursion_tail #1
- { \@@_change_case_end:wn }
- {
- \@@_change_case_output:nwn {#1}
- \token_if_eq_meaning:NNTF #1 #3
- { #4 #2 \q_recursion_stop }
- { \@@_change_case_math_loop:wNNnn #2 \q_recursion_stop #3#4 }
- }
- }
-\cs_new:Npn \@@_change_case_math_group:nwNNnn #1#2 \q_recursion_stop
- {
- \@@_change_case_output:nwn { {#1} }
- \@@_change_case_math_loop:wNNnn #2 \q_recursion_stop
- }
-\exp_last_unbraced:NNo
- \cs_new:Npn \@@_change_case_math_space:wNNnn \c_space_tl
- {
- \@@_change_case_output:nwn { ~ }
- \@@_change_case_math_loop:wNNnn
- }
-% \end{macrocode}
-% Once potential math-mode cases are filtered out the next stage is to
-% test if the token grabbed is a control sequence: they cannot be used in
-% the lookup table and also may require expansion. At this stage the loop
-% code starting \cs{@@_change_case_loop:wnn} is inserted: all subsequent
-% steps in the code which need a look-ahead are coded to rely on this and
-% thus have \texttt{w}-type arguments if they may do a look-ahead.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_N_type:Nnnn #1#2#3#4
- {
- \token_if_cs:NTF #1
- { \@@_change_case_cs_letterlike:Nn #1 {#3} }
- { \use:c { @@_change_case_char_ #3 :Nnn } #1 {#3} {#4} }
- \@@_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
- }
-% \end{macrocode}
-% For character tokens there are some special cases to deal with then
-% the majority of changes are covered by using the \TeX{} data as a lookup
-% along with expandable character generation. This avoids needing a very
-% large number of macros or (as seen in earlier versions) a somewhat tricky
-% split of the characters into various blocks. Notice that the special case
-% code may do a look-ahead so requires a final \texttt{w}-type argument
-% whereas the core lookup table does not and also guarantees an output so
-% \texttt{f}-type expansion may be used to obtain the case-changed result.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_char_lower:Nnn #1#2#3
- {
- \cs_if_exist_use:cF { @@_change_case_ #2 _ #3 :Nnw }
- { \use_ii:nn }
- #1
- {
- \use:c { @@_change_case_ #2 _ sigma:Nnw } #1
- { \@@_change_case_char:nN {#2} #1 }
- }
- }
-\cs_new_eq:NN \@@_change_case_char_upper:Nnn
- \@@_change_case_char_lower:Nnn
-% \end{macrocode}
-% For mixed case, the code is somewhat different: there is a need to
-% look up both mixed and upper case chars and we have to cover the
-% situation where there is a character to skip over.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_char_mixed:Nnn #1#2#3
- {
- \@@_change_case_mixed_switch:w
- \cs_if_exist_use:cF { @@_change_case_mixed_ #3 :Nnw }
- {
- \cs_if_exist_use:cF { @@_change_case_upper_ #3 :Nnw }
- { \use_ii:nn }
- }
- #1
- { \@@_change_case_mixed_skip:N #1 }
- }
-% \end{macrocode}
-% For Unicode engines we can handle all characters directly. However, for
-% the $8$-bit engines the aim is to deal with (a subset of) Unicode (UTF-8)
-% input. They deal with that by making the upper half of the range active,
-% so we look for that and if found work out how many UTF-8 octets there
-% are to deal with. Those can then be grabbed to reconstruct the full
-% Unicode character, which is then used in a lookup. (As will become
-% obvious below, there is no intention here of covering all of Unicode.)
-% \begin{macrocode}
-\bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- {
- \cs_new:Npn \@@_change_case_char:nN #1#2
- {
- \@@_change_case_output:fwn
- { \use:c { char_ #1 _case:N } #2 }
- }
- }
- {
- \cs_new:Npn \@@_change_case_char:nN #1#2
- {
- \int_compare:nNnTF { `#2 } > { "80 }
- {
- \int_compare:nNnTF { `#2 } < { "E0 }
- { \@@_change_case_char_UTFviii:nNNN {#1} #2 }
- {
- \int_compare:nNnTF { `#2 } < { "F0 }
- { \@@_change_case_char_UTFviii:nNNNN {#1} #2 }
- { \@@_change_case_char_UTFviii:nNNNNN {#1} #2 }
- }
- }
- {
- \@@_change_case_output:fwn
- { \use:c { char_ #1 _case:N } #2 }
- }
- }
- }
-% \end{macrocode}
-% To allow for the special case of mixed case, we insert here a
-% action-dependent auxiliary.
-% \begin{macrocode}
-\bool_lazy_or:nnF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- {
- \cs_new:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4
- { \@@_change_case_char_UTFviii:nnN {#1} {#2#4} #3 }
- \cs_new:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5
- { \@@_change_case_char_UTFviii:nnN {#1} {#2#4#5} #3 }
- \cs_new:Npn \@@_change_case_char_UTFviii:nNNNNN #1#2#3#4#5#6
- { \@@_change_case_char_UTFviii:nnN {#1} {#2#4#5#6} #3 }
- \cs_new:Npn \@@_change_case_char_UTFviii:nnN #1#2#3
- {
- \cs_if_exist:cTF { c_@@_ #1 _case_ \tl_to_str:n {#2} _tl }
- {
- \@@_change_case_output:vwn
- { c_@@_ #1 _case_ \tl_to_str:n {#2} _tl }
- }
- { \@@_change_case_output:nwn {#2} }
- #3
- }
- }
-% \end{macrocode}
-% Before dealing with general control sequences there are the special
-% ones to deal with. Letter-like control sequences are a simple look-up,
-% while for accents the loop is much as done elsewhere. Notice that
-% we have a no-op test to make sure there is no unexpected expansion of
-% letter-like input. The split into two parts here allows us to insert
-% the \enquote{switch} code for mixed casing.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_cs_letterlike:Nn #1#2
- {
- \str_if_eq:nnTF {#2} { mixed }
- {
- \@@_change_case_cs_letterlike:NnN #1 { upper }
- \@@_change_case_mixed_switch:w
- }
- { \@@_change_case_cs_letterlike:NnN #1 {#2} \prg_do_nothing: }
- }
-\cs_new:Npn \@@_change_case_cs_letterlike:NnN #1#2#3
- {
- \cs_if_exist:cTF { c_@@_change_case_ #2 _ \token_to_str:N #1 _tl }
- {
- \@@_change_case_output:vwn
- { c_@@_change_case_ #2 _ \token_to_str:N #1 _tl }
- #3
- }
- {
- \cs_if_exist:cTF
- {
- c_@@_change_case_
- \str_if_eq:nnTF {#2} { lower } { upper } { lower }
- _ \token_to_str:N #1 _tl
- }
- {
- \@@_change_case_output:nwn {#1}
- #3
- }
- {
- \exp_after:wN \@@_change_case_cs_accents:NN
- \exp_after:wN #1 \l_tl_case_change_accents_tl
- \q_recursion_tail \q_recursion_stop
- }
- }
- }
-\cs_new:Npn \@@_change_case_cs_accents:NN #1#2
- {
- \quark_if_recursion_tail_stop_do:Nn #2
- { \@@_change_case_cs:N #1 }
- \str_if_eq:nnTF {#1} {#2}
- {
- \use_i_delimit_by_q_recursion_stop:nw
- { \@@_change_case_output:nwn {#1} }
- }
- { \@@_change_case_cs_accents:NN #1 }
- }
-% \end{macrocode}
-% To deal with a control sequence there is first a need to test if it is
-% on the list which indicate that case changing should be skipped. That's
-% done using a loop as for the other special cases. If a hit is found then
-% the argument is grabbed: that comes \emph{after} the loop function which
-% is therefore rearranged. In a \LaTeXe{} context, \tn{protect} needs
-% to be treated specially, to prevent expansion of the next token but
-% output it without braces.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_cs:N #1
- {
-%<*package>
- \str_if_eq:nnTF {#1} { \protect } { \@@_change_case_protect:wNN }
-%</package>
- \exp_after:wN \@@_change_case_cs:NN
- \exp_after:wN #1 \l_tl_case_change_exclude_tl
- \q_recursion_tail \q_recursion_stop
- }
-\cs_new:Npn \@@_change_case_cs:NN #1#2
- {
- \quark_if_recursion_tail_stop_do:Nn #2
- {
- \@@_change_case_cs_expand:Nnw #1
- { \@@_change_case_output:nwn {#1} }
- }
- \str_if_eq:nnTF {#1} {#2}
- {
- \use_i_delimit_by_q_recursion_stop:nw
- { \@@_change_case_cs:NNn #1 }
- }
- { \@@_change_case_cs:NN #1 }
- }
-\cs_new:Npn \@@_change_case_cs:NNn #1#2#3
- {
- \@@_change_case_output:nwn { #1 {#3} }
- #2
- }
-%<*package>
-\cs_new:Npn \@@_change_case_protect:wNN #1 \q_recursion_stop #2 #3
- { \@@_change_case_output:nwn { \protect #3 } #2 }
-%</package>
-% \end{macrocode}
-% When a control sequence is not on the exclude list the other test if
-% to see if it is expandable. Once again, if there is a hit then the loop
-% function is grabbed as part of the clean-up and reinserted before the
-% now expanded material. The test for expandability has to check for
-% end-of-recursion as it is needed by the look-ahead code which might hit
-% the end of the input. The test is done in two parts as \cs{bool_if:nTF}
-% would choke if |#1| was |(|!
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_if_expandable:NTF #1
- {
- \token_if_expandable:NTF #1
- {
- \bool_lazy_any:nTF
- {
- { \token_if_eq_meaning_p:NN \q_recursion_tail #1 }
- { \token_if_protected_macro_p:N #1 }
- { \token_if_protected_long_macro_p:N #1 }
- }
- { \use_ii:nn }
- { \use_i:nn }
- }
- { \use_ii:nn }
- }
-\cs_new:Npn \@@_change_case_cs_expand:Nnw #1#2
- {
- \@@_change_case_if_expandable:NTF #1
- { \@@_change_case_cs_expand:NN #1 }
- { #2 }
- }
-\cs_new:Npn \@@_change_case_cs_expand:NN #1#2
- { \exp_after:wN #2 #1 }
-% \end{macrocode}
-% For mixed case, there is an additional list of exceptions to deal with:
-% once that is sorted, we can move on back to the main loop.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_mixed_skip:N #1
- {
- \exp_after:wN \@@_change_case_mixed_skip:NN
- \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
- \q_recursion_tail \q_recursion_stop
- }
-\cs_new:Npn \@@_change_case_mixed_skip:NN #1#2
- {
- \quark_if_recursion_tail_stop_do:nn {#2}
- { \@@_change_case_char:nN { mixed } #1 }
- \int_compare:nNnT { `#1 } = { `#2 }
- {
- \use_i_delimit_by_q_recursion_stop:nw
- {
- \@@_change_case_output:nwn {#1}
- \@@_change_case_mixed_skip_tidy:Nwn
- }
- }
- \@@_change_case_mixed_skip:NN #1
- }
-\cs_new:Npn \@@_change_case_mixed_skip_tidy:Nwn #1#2 \q_recursion_stop #3
- {
- \@@_change_case_loop:wnn #2 \q_recursion_stop { mixed }
- }
-% \end{macrocode}
-% Needed to switch from mixed to lower casing when we have found a
-% first character in the former mode.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_mixed_switch:w
- #1 \@@_change_case_loop:wnn #2 \q_recursion_stop #3
- {
- #1
- \@@_change_case_loop:wnn #2 \q_recursion_stop { lower }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_change_case_lower_sigma:Nnw}
-% \begin{macro}[EXP]{\@@_change_case_lower_sigma:w}
-% \begin{macro}[EXP]{\@@_change_case_lower_sigma:Nw}
-% \begin{macro}[EXP]{\@@_change_case_upper_sigma:Nnw}
-% If the current char is an upper case sigma, the a check is made on the next
-% item in the input. If it is \texttt{N}-type and not a control sequence
-% then there is a look-ahead phase.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_lower_sigma:Nnw #1#2#3#4 \q_recursion_stop
- {
- \int_compare:nNnTF { `#1 } = { "03A3 }
- {
- \@@_change_case_output:fwn
- { \@@_change_case_lower_sigma:w #4 \q_recursion_stop }
- }
- {#2}
- #3 #4 \q_recursion_stop
- }
-\cs_new:Npn \@@_change_case_lower_sigma:w #1 \q_recursion_stop
- {
- \tl_if_head_is_N_type:nTF {#1}
- { \@@_change_case_lower_sigma:Nw #1 \q_recursion_stop }
- { \c_@@_final_sigma_tl }
- }
-\cs_new:Npn \@@_change_case_lower_sigma:Nw #1#2 \q_recursion_stop
- {
- \@@_change_case_if_expandable:NTF #1
- {
- \exp_after:wN \@@_change_case_lower_sigma:w #1
- #2 \q_recursion_stop
- }
- {
- \token_if_letter:NTF #1
- { \c_@@_std_sigma_tl }
- { \c_@@_final_sigma_tl }
- }
- }
-% \end{macrocode}
-% Simply skip to the final step for upper casing.
-% \begin{macrocode}
-\cs_new_eq:NN \@@_change_case_upper_sigma:Nnw \use_ii:nn
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_change_case_lower_tr:Nnw}
-% \begin{macro}[EXP]{\@@_change_case_lower_tr_auxi:Nw}
-% \begin{macro}[EXP]{\@@_change_case_lower_tr_auxii:Nw}
-% \begin{macro}[EXP]{\@@_change_case_upper_tr:Nnw}
-% \begin{macro}[EXP]{\@@_change_case_lower_az:Nnw}
-% \begin{macro}[EXP]{\@@_change_case_upper_az:Nnw}
-% The Turkic languages need special treatment for dotted-i and dotless-i.
-% The lower casing rule can be expressed in terms of searching first for
-% either a dotless-I or a dotted-I. In the latter case the mapping is
-% easy, but in the former there is a second stage search.
-% \begin{macrocode}
-\bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- {
- \cs_new:Npn \@@_change_case_lower_tr:Nnw #1#2
- {
- \int_compare:nNnTF { `#1 } = { "0049 }
- { \@@_change_case_lower_tr_auxi:Nw }
- {
- \int_compare:nNnTF { `#1 } = { "0130 }
- { \@@_change_case_output:nwn { i } }
- {#2}
- }
- }
-% \end{macrocode}
-% After a dotless-I there may be a dot-above character. If there is then
-% a dotted-i should be produced, otherwise output a dotless-i. When the
-% combination is found both the dotless-I and the dot-above char have to
-% be removed from the input, which is done by the \cs{use_i:nn}
-% (it grabs \cs{@@_change_case_loop:wn} and the dot-above char and
-% discards the latter).
-% \begin{macrocode}
- \cs_new:Npn \@@_change_case_lower_tr_auxi:Nw #1#2 \q_recursion_stop
- {
- \tl_if_head_is_N_type:nTF {#2}
- { \@@_change_case_lower_tr_auxii:Nw #2 \q_recursion_stop }
- { \@@_change_case_output:Vwn \c_@@_dotless_i_tl }
- #1 #2 \q_recursion_stop
- }
- \cs_new:Npn \@@_change_case_lower_tr_auxii:Nw #1#2 \q_recursion_stop
- {
- \@@_change_case_if_expandable:NTF #1
- {
- \exp_after:wN \@@_change_case_lower_tr_auxi:Nw #1
- #2 \q_recursion_stop
- }
- {
- \bool_lazy_or:nnTF
- { \token_if_cs_p:N #1 }
- { ! \int_compare_p:nNn { `#1 } = { "0307 } }
- { \@@_change_case_output:Vwn \c_@@_dotless_i_tl }
- {
- \@@_change_case_output:nwn { i }
- \use_i:nn
- }
- }
- }
- }
-% \end{macrocode}
-% For $8$-bit engines, dot-above is not available so there is a simple
-% test for an upper-case I. Then we can look for the UTF-8 representation of
-% an upper case dotted-I without the combining char. If it's not there,
-% preserve the UTF-8 sequence as-is.
-% \begin{macrocode}
- {
- \cs_new:Npn \@@_change_case_lower_tr:Nnw #1#2
- {
- \int_compare:nNnTF { `#1 } = { "0049 }
- { \@@_change_case_output:Vwn \c_@@_dotless_i_tl }
- {
- \int_compare:nNnTF { `#1 } = { 196 }
- { \@@_change_case_lower_tr_auxi:Nw #1 {#2} }
- {#2}
- }
- }
- \cs_new:Npn \@@_change_case_lower_tr_auxi:Nw #1#2#3#4
- {
- \int_compare:nNnTF { `#4 } = { 176 }
- {
- \@@_change_case_output:nwn { i }
- #3
- }
- {
- #2
- #3 #4
- }
- }
- }
-% \end{macrocode}
-% Upper casing is easier: just one exception with no context.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_upper_tr:Nnw #1#2
- {
- \int_compare:nNnTF { `#1 } = { "0069 }
- { \@@_change_case_output:Vwn \c_@@_dotted_I_tl }
- {#2}
- }
-% \end{macrocode}
-% Straight copies.
-% \begin{macrocode}
-\cs_new_eq:NN \@@_change_case_lower_az:Nnw \@@_change_case_lower_tr:Nnw
-\cs_new_eq:NN \@@_change_case_upper_az:Nnw \@@_change_case_upper_tr:Nnw
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_change_case_lower_lt:Nnw}
-% \begin{macro}[EXP]{\@@_change_case_lower_lt:nNnw}
-% \begin{macro}[EXP]{\@@_change_case_lower_lt:nnw}
-% \begin{macro}[EXP]{\@@_change_case_lower_lt:Nw}
-% \begin{macro}[EXP]{\@@_change_case_lower_lt:NNw}
-% \begin{macro}[EXP]{\@@_change_case_upper_lt:Nnw}
-% \begin{macro}[EXP]{\@@_change_case_upper_lt:nnw}
-% \begin{macro}[EXP]{\@@_change_case_upper_lt:Nw}
-% \begin{macro}[EXP]{\@@_change_case_upper_lt:NNw}
-% For Lithuanian, the issue to be dealt with is dots over lower case
-% letters: these should be present if there is another accent. That means
-% that there is some work to do when lower casing I and J. The first step
-% is a simple match attempt: \cs{c_@@_accents_lt_tl} contains
-% accented upper case letters which should gain a dot-above char in their
-% lower case form. This is done using \texttt{f}-type expansion so only one
-% pass is needed to find if it works or not. If there was no hit, the second
-% stage is to check for I, J and I-ogonek, and if the current char is a
-% match to look for a following accent.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_lower_lt:Nnw #1
- {
- \exp_args:Nf \@@_change_case_lower_lt:nNnw
- { \str_case:nVF #1 \c_@@_accents_lt_tl \exp_stop_f: }
- #1
- }
-\cs_new:Npn \@@_change_case_lower_lt:nNnw #1#2
- {
- \tl_if_blank:nTF {#1}
- {
- \exp_args:Nf \@@_change_case_lower_lt:nnw
- {
- \int_case:nnF {`#2}
- {
- { "0049 } i
- { "004A } j
- { "012E } \c_@@_i_ogonek_tl
- }
- \exp_stop_f:
- }
- }
- {
- \@@_change_case_output:nwn {#1}
- \use_none:n
- }
- }
-\cs_new:Npn \@@_change_case_lower_lt:nnw #1#2
- {
- \tl_if_blank:nTF {#1}
- {#2}
- {
- \@@_change_case_output:nwn {#1}
- \@@_change_case_lower_lt:Nw
- }
- }
-% \end{macrocode}
-% Grab the next char and see if it is one of the accents used in Lithuanian:
-% if it is, add the dot-above char into the output.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_lower_lt:Nw #1#2 \q_recursion_stop
- {
- \tl_if_head_is_N_type:nT {#2}
- { \@@_change_case_lower_lt:NNw }
- #1 #2 \q_recursion_stop
- }
-\cs_new:Npn \@@_change_case_lower_lt:NNw #1#2#3 \q_recursion_stop
- {
- \@@_change_case_if_expandable:NTF #2
- {
- \exp_after:wN \@@_change_case_lower_lt:Nw \exp_after:wN #1 #2
- #3 \q_recursion_stop
- }
- {
- \bool_lazy_and:nnT
- { ! \token_if_cs_p:N #2 }
- {
- \bool_lazy_any_p:n
- {
- { \int_compare_p:nNn { `#2 } = { "0300 } }
- { \int_compare_p:nNn { `#2 } = { "0301 } }
- { \int_compare_p:nNn { `#2 } = { "0303 } }
- }
- }
- { \@@_change_case_output:Vwn \c_@@_dot_above_tl }
- #1 #2#3 \q_recursion_stop
- }
- }
-% \end{macrocode}
-% For upper casing, the test required is for a dot-above char after an I,
-% J or I-ogonek. First a test for the appropriate letter, and if found a
-% look-ahead and potentially one token dropped.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_upper_lt:Nnw #1
- {
- \exp_args:Nf \@@_change_case_upper_lt:nnw
- {
- \int_case:nnF {`#1}
- {
- { "0069 } I
- { "006A } J
- { "012F } \c_@@_I_ogonek_tl
- }
- \exp_stop_f:
- }
- }
-\cs_new:Npn \@@_change_case_upper_lt:nnw #1#2
- {
- \tl_if_blank:nTF {#1}
- {#2}
- {
- \@@_change_case_output:nwn {#1}
- \@@_change_case_upper_lt:Nw
- }
- }
-\cs_new:Npn \@@_change_case_upper_lt:Nw #1#2 \q_recursion_stop
- {
- \tl_if_head_is_N_type:nT {#2}
- { \@@_change_case_upper_lt:NNw }
- #1 #2 \q_recursion_stop
- }
-\cs_new:Npn \@@_change_case_upper_lt:NNw #1#2#3 \q_recursion_stop
- {
- \@@_change_case_if_expandable:NTF #2
- {
- \exp_after:wN \@@_change_case_upper_lt:Nw \exp_after:wN #1 #2
- #3 \q_recursion_stop
- }
- {
- \bool_lazy_and:nnTF
- { ! \token_if_cs_p:N #2 }
- { \int_compare_p:nNn { `#2 } = { "0307 } }
- { #1 }
- { #1 #2 }
- #3 \q_recursion_stop
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_change_case_upper_de-alt:Nnw}
-% A simple alternative version for German.
-% \begin{macrocode}
-\cs_new:cpn { @@_change_case_upper_de-alt:Nnw } #1#2
- {
- \int_compare:nNnTF { `#1 } = { 223 }
- { \@@_change_case_output:Vwn \c_@@_upper_Eszett_tl }
- {#2}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}
-% {
-% \c_@@_std_sigma_tl ,
-% \c_@@_final_sigma_tl ,
-% \c_@@_accents_lt_tl ,
-% \c_@@_dot_above_tl ,
-% \c_@@_upper_Eszett_tl
-% }
-% The above needs various special token lists containing pre-formed characters.
-% This set are only available in Unicode engines, with no-op definitions
-% for $8$-bit use.
-% \begin{macrocode}
-\bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- {
- \group_begin:
- \cs_set:Npn \@@_tmp:n #1
- {
- \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N
- \char_generate:nn {#1} { \char_value_catcode:n {#1} }
- }
- \tl_const:Nx \c_@@_std_sigma_tl { \@@_tmp:n { "03C3 } }
- \tl_const:Nx \c_@@_final_sigma_tl { \@@_tmp:n { "03C2 } }
- \tl_const:Nx \c_@@_accents_lt_tl
- {
- \@@_tmp:n { "00CC }
- {
- \@@_tmp:n { "0069 }
- \@@_tmp:n { "0307 }
- \@@_tmp:n { "0300 }
- }
- \@@_tmp:n { "00CD }
- {
- \@@_tmp:n { "0069 }
- \@@_tmp:n { "0307 }
- \@@_tmp:n { "0301 }
- }
- \@@_tmp:n { "0128 }
- {
- \@@_tmp:n { "0069 }
- \@@_tmp:n { "0307 }
- \@@_tmp:n { "0303 }
- }
- }
- \tl_const:Nx \c_@@_dot_above_tl { \@@_tmp:n { "0307 } }
- \tl_const:Nx \c_@@_upper_Eszett_tl { \@@_tmp:n { "1E9E } }
- \group_end:
- }
- {
- \tl_const:Nn \c_@@_std_sigma_tl { }
- \tl_const:Nn \c_@@_final_sigma_tl { }
- \tl_const:Nn \c_@@_accents_lt_tl { }
- \tl_const:Nn \c_@@_dot_above_tl { }
- \tl_const:Nn \c_@@_upper_Eszett_tl { }
- }
-% \end{macrocode}
-% \end{variable}
-% \begin{variable}
-% {
-% \c_@@_dotless_i_tl ,
-% \c_@@_dotted_I_tl ,
-% \c_@@_i_ogonek_tl ,
-% \c_@@_I_ogonek_tl ,
-% }
-% For cases where there is an $8$-bit option in the |T1| font set up,
-% a variant is provided in both cases.
-% \begin{macrocode}
-\group_begin:
- \bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- {
- \cs_set_protected:Npn \@@_tmp:w #1#2
- {
- \tl_const:Nx #1
- {
- \exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \char_generate:nn
- {"#2} { \char_value_catcode:n {"#2} }
- }
- }
- }
- {
- \cs_set_protected:Npn \@@_tmp:w #1#2
- {
- \group_begin:
- \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4
- {
- \tl_const:Nx #1
- {
- \exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \char_generate:nn {##1} { 13 }
- \exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \char_generate:nn {##2} { 13 }
- }
- }
- \tl_set:Nx \l_@@_internal_a_tl
- { \char_codepoint_to_bytes:n {"#2} }
- \exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
- \group_end:
- }
- }
- \@@_tmp:w \c_@@_dotless_i_tl { 0131 }
- \@@_tmp:w \c_@@_dotted_I_tl { 0130 }
- \@@_tmp:w \c_@@_i_ogonek_tl { 012F }
- \@@_tmp:w \c_@@_I_ogonek_tl { 012E }
-\group_end:
-% \end{macrocode}
-% \end{variable}
-%
-% For $8$-bit engines we now need to define the case-change data for
-% the multi-octet mappings. These need a list of what code points are
-% doable in |T1| so the list is hard coded (there's no saving in loading
-% the mappings dynamically). All of the straight-forward ones have two
-% octets, so that is taken as read.
-% \begin{macrocode}
-\group_begin:
- \bool_lazy_or:nnF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- {
- \cs_set_protected:Npn \@@_loop:nn #1#2
- {
- \quark_if_recursion_tail_stop:n {#1}
- \tl_set:Nx \l_@@_internal_a_tl
- {
- \char_codepoint_to_bytes:n {"#1}
- \char_codepoint_to_bytes:n {"#2}
- }
- \exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
- \@@_loop:nn
- }
- \cs_set_protected:Npn \@@_tmp:nnnn #1#2#3#4#5
- {
- \tl_const:cx
- {
- c_@@_ #1 _case_
- \char_generate:nn {#2} { 12 }
- \char_generate:nn {#3} { 12 }
- _tl
- }
- {
- \exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \char_generate:nn {#4} { 13 }
- \exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \char_generate:nn {#5} { 13 }
- }
- }
- \cs_set_protected:Npn \@@_tmp:w #1#2#3#4#5#6#7#8
- {
- \tl_const:cx
- {
- c_@@_lower_case_
- \char_generate:nn {#1} { 12 }
- \char_generate:nn {#2} { 12 }
- _tl
- }
- {
- \exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \char_generate:nn {#5} { 13 }
- \exp_after:wN \exp_after:wN \exp_after:wN
- \exp_not:N \char_generate:nn {#6} { 13 }
- }
- \@@_tmp:nnnn { upper } {#5} {#6} {#1} {#2}
- \@@_tmp:nnnn { mixed } {#5} {#6} {#1} {#2}
- }
- \@@_loop:nn
- { 00C0 } { 00E0 }
- { 00C2 } { 00E2 }
- { 00C3 } { 00E3 }
- { 00C4 } { 00E4 }
- { 00C5 } { 00E5 }
- { 00C6 } { 00E6 }
- { 00C7 } { 00E7 }
- { 00C8 } { 00E8 }
- { 00C9 } { 00E9 }
- { 00CA } { 00EA }
- { 00CB } { 00EB }
- { 00CC } { 00EC }
- { 00CD } { 00ED }
- { 00CE } { 00EE }
- { 00CF } { 00EF }
- { 00D0 } { 00F0 }
- { 00D1 } { 00F1 }
- { 00D2 } { 00F2 }
- { 00D3 } { 00F3 }
- { 00D4 } { 00F4 }
- { 00D5 } { 00F5 }
- { 00D6 } { 00F6 }
- { 00D8 } { 00F8 }
- { 00D9 } { 00F9 }
- { 00DA } { 00FA }
- { 00DB } { 00FB }
- { 00DC } { 00FC }
- { 00DD } { 00FD }
- { 00DE } { 00FE }
- { 0100 } { 0101 }
- { 0102 } { 0103 }
- { 0104 } { 0105 }
- { 0106 } { 0107 }
- { 0108 } { 0109 }
- { 010A } { 010B }
- { 010C } { 010D }
- { 010E } { 010F }
- { 0110 } { 0111 }
- { 0112 } { 0113 }
- { 0114 } { 0115 }
- { 0116 } { 0117 }
- { 0118 } { 0119 }
- { 011A } { 011B }
- { 011C } { 011D }
- { 011E } { 011F }
- { 0120 } { 0121 }
- { 0122 } { 0123 }
- { 0124 } { 0125 }
- { 0128 } { 0129 }
- { 012A } { 012B }
- { 012C } { 012D }
- { 012E } { 012F }
- { 0132 } { 0133 }
- { 0134 } { 0135 }
- { 0136 } { 0137 }
- { 0139 } { 013A }
- { 013B } { 013C }
- { 013E } { 013F }
- { 0141 } { 0142 }
- { 0143 } { 0144 }
- { 0145 } { 0146 }
- { 0147 } { 0148 }
- { 014A } { 014B }
- { 014C } { 014D }
- { 014E } { 014F }
- { 0150 } { 0151 }
- { 0152 } { 0153 }
- { 0154 } { 0155 }
- { 0156 } { 0157 }
- { 0158 } { 0159 }
- { 015A } { 015B }
- { 015C } { 015D }
- { 015E } { 015F }
- { 0160 } { 0161 }
- { 0162 } { 0163 }
- { 0164 } { 0165 }
- { 0168 } { 0169 }
- { 016A } { 016B }
- { 016C } { 016D }
- { 016E } { 016F }
- { 0170 } { 0171 }
- { 0172 } { 0173 }
- { 0174 } { 0175 }
- { 0176 } { 0177 }
- { 0178 } { 00FF }
- { 0179 } { 017A }
- { 017B } { 017C }
- { 017D } { 017E }
- { 01CD } { 01CE }
- { 01CF } { 01D0 }
- { 01D1 } { 01D2 }
- { 01D3 } { 01D4 }
- { 01E2 } { 01E3 }
- { 01E6 } { 01E7 }
- { 01E8 } { 01E9 }
- { 01EA } { 01EB }
- { 01F4 } { 01F5 }
- { 0218 } { 0219 }
- { 021A } { 021B }
- \q_recursion_tail ?
- \q_recursion_stop
- \cs_set_protected:Npn \@@_tmp:w #1#2#3
- {
- \group_begin:
- \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4
- {
- \tl_const:cx
- {
- c_@@_ #3 _case_
- \char_generate:nn {##1} { 12 }
- \char_generate:nn {##2} { 12 }
- _tl
- }
- {#2}
- }
- \tl_set:Nx \l_@@_internal_a_tl
- { \char_codepoint_to_bytes:n { "#1 } }
- \exp_after:wN \@@_tmp:w \l_@@_internal_a_tl
- \group_end:
- }
- \@@_tmp:w { 00DF } { SS } { upper }
- \@@_tmp:w { 00DF } { Ss } { mixed }
- \@@_tmp:w { 0131 } { I } { upper }
- }
- \group_end:
-% \end{macrocode}
-%
-% The (fixed) look-up mappings for letter-like control sequences.
-% \begin{macrocode}
-\group_begin:
- \cs_set_protected:Npn \@@_change_case_setup:NN #1#2
- {
- \quark_if_recursion_tail_stop:N #1
- \tl_const:cn { c_@@_change_case_lower_ \token_to_str:N #1 _tl }
- { #2 }
- \tl_const:cn { c_@@_change_case_upper_ \token_to_str:N #2 _tl }
- { #1 }
- \@@_change_case_setup:NN
- }
- \@@_change_case_setup:NN
- \AA \aa
- \AE \ae
- \DH \dh
- \DJ \dj
- \IJ \ij
- \L \l
- \NG \ng
- \O \o
- \OE \oe
- \SS \ss
- \TH \th
- \q_recursion_tail ?
- \q_recursion_stop
- \tl_const:cn { c_@@_change_case_upper_ \token_to_str:N \i _tl } { I }
- \tl_const:cn { c_@@_change_case_upper_ \token_to_str:N \j _tl } { J }
-\group_end:
-% \end{macrocode}
-%
-% \begin{variable}{\l_tl_case_change_accents_tl}
-% A list of accents to leave alone.
-% \begin{macrocode}
-\tl_new:N \l_tl_case_change_accents_tl
-\tl_set:Nn \l_tl_case_change_accents_tl
- { \" \' \. \^ \` \~ \c \H \k \r \t \u \v }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP]{\@@_change_case_mixed_nl:Nnw}
-% \begin{macro}[EXP]{\@@_change_case_mixed_nl:Nw}
-% \begin{macro}[EXP]{\@@_change_case_mixed_nl:NNw}
-% For Dutch, there is a single look-ahead test for \texttt{ij} when
-% title casing. If the appropriate letters are found, produce \texttt{IJ}
-% and gobble the \texttt{j}/\texttt{J}.
-% \begin{macrocode}
-\cs_new:Npn \@@_change_case_mixed_nl:Nnw #1
- {
- \bool_lazy_or:nnTF
- { \int_compare_p:nNn { `#1 } = { `i } }
- { \int_compare_p:nNn { `#1 } = { `I } }
- {
- \@@_change_case_output:nwn { I }
- \@@_change_case_mixed_nl:Nw
- }
- }
-\cs_new:Npn \@@_change_case_mixed_nl:Nw #1#2 \q_recursion_stop
- {
- \tl_if_head_is_N_type:nT {#2}
- { \@@_change_case_mixed_nl:NNw }
- #1 #2 \q_recursion_stop
- }
-\cs_new:Npn \@@_change_case_mixed_nl:NNw #1#2#3 \q_recursion_stop
- {
- \@@_change_case_if_expandable:NTF #2
- {
- \exp_after:wN \@@_change_case_mixed_nl:Nw \exp_after:wN #1 #2
- #3 \q_recursion_stop
- }
- {
- \bool_lazy_and:nnTF
- { ! ( \token_if_cs_p:N #2 ) }
- {
- \bool_lazy_or_p:nn
- { \int_compare_p:nNn { `#2 } = { `j } }
- { \int_compare_p:nNn { `#2 } = { `J } }
- }
- {
- \@@_change_case_output:nwn { J }
- #1
- }
- { #1 #2 }
- #3 \q_recursion_stop
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{variable}{\l_tl_case_change_math_tl}
-% The list of token pairs which are treated as math mode and so
-% not case changed.
-% \begin{macrocode}
-\tl_new:N \l_tl_case_change_math_tl
-%<*package>
-\tl_set:Nn \l_tl_case_change_math_tl
- { $ $ \( \) }
-%</package>
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_tl_case_change_exclude_tl}
-% The list of commands for which an argument is not case changed.
-% \begin{macrocode}
-\tl_new:N \l_tl_case_change_exclude_tl
-%<*package>
-\tl_set:Nn \l_tl_case_change_exclude_tl
- { \cite \ensuremath \label \ref }
-%</package>
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_tl_mixed_case_ignore_tl}
-% Characters to skip over when finding the first letter in a word to be
-% mixed cased.
-% \begin{macrocode}
-\tl_new:N \l_tl_mixed_case_ignore_tl
-\tl_set:Nx \l_tl_mixed_case_ignore_tl
- {
- ( % )
- [ % ]
- \cs_to_str:N \{ % \}
- `
- -
- }
-% \end{macrocode}
-% \end{variable}
-%
-% \subsubsection{Building a token list}
-%
% Between \cs{tl_build_begin:N} \meta{tl~var} and \cs{tl_build_end:N}
% \meta{tl~var}, the \meta{tl~var} has the structure
% \begin{quote}
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index 9529c15070..ab7cc6cca4 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -3,7 +3,7 @@
%% File: l3clist.dtx
%
% Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
-% (C) 2012-2019 The LaTeX3 Project
+% (C) 2012-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index 92203d5d8c..0b27eddfdb 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -2,7 +2,7 @@
%
%% File: l3coffins.dtx
%
-% Copyright (C) 2010-2019 The LaTeX3 Project
+% Copyright (C) 2010-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3color-base.dtx b/macros/latex/contrib/l3kernel/l3color-base.dtx
index 9361db0b98..f4fc3498f4 100644
--- a/macros/latex/contrib/l3kernel/l3color-base.dtx
+++ b/macros/latex/contrib/l3kernel/l3color-base.dtx
@@ -2,7 +2,7 @@
%
%% File: l3color-base.dtx
%
-% Copyright (C) 2011,2012,2014,2016-2019 The LaTeX3 Project
+% Copyright (C) 2011,2012,2014,2016-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index cb1eb81fd8..337fddffd7 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -2,7 +2,7 @@
%
%% File: l3debug.dtx
%
-% Copyright (C) 2019 The LaTeX3 Project
+% Copyright (C) 2019,2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index 410f6891a9..32c5050d87 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -2,7 +2,7 @@
%
%% File: l3deprecation.dtx
%
-% Copyright (C) 2017-2019 The LaTeX3 Project
+% Copyright (C) 2017-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -873,6 +873,28 @@
%
% \subsection{Deprecated \pkg{l3str} functions}
%
+% \begin{macro}[EXP, deprecated = 2021-07-01]
+% {
+% \str_lower_case:n, \str_lower_case:f,
+% \str_upper_case:n, \str_upper_case:f,
+% \str_fold_case:n, \str_fold_case:V
+% }
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \str_lower_case:n }
+\cs_gset:Npn \str_lower_case:n { \str_lowercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \str_lower_case:f }
+\cs_gset:Npn \str_lower_case:f { \str_lowercase:f }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \str_upper_case:n }
+\cs_gset:Npn \str_upper_case:n { \str_uppercase:n }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \str_upper_case:f }
+\cs_gset:Npn \str_upper_case:f { \str_uppercase:f }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \str_fold_case:n }
+\cs_gset:Npn \str_fold_case:n { \str_foldcase:n }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \str_fold_case:V }
+\cs_gset:Npn \str_fold_case:V { \str_foldcase:V }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP, deprecated = 2020-07-01, noTF]{\str_case_x:nn}
% \begin{macro}[EXP, deprecated = 2020-07-01, pTF]{\str_if_eq_x:nn}
% \begin{macrocode}
@@ -947,6 +969,34 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[deprecated = 2022-07-01]
+% {
+% \tl_lower_case:n, \tl_lower_case:nn,
+% \tl_upper_case:n, \tl_upper_case:nn,
+% \tl_mixed_case:n, \tl_mixed_case:nn,
+% }
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_lowercase:n }
+\cs_gset:Npn \tl_lower_case:n #1
+ { \text_lowercase:n {#1} }
+\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_lowercase:nn }
+\cs_gset:Npn \tl_lower_case:nn #1#2
+ { \text_lowercase:nn {#1} {#2} }
+\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_uppercase:n }
+\cs_gset:Npn \tl_upper_case:n #1
+ { \text_uppercase:n {#1} }
+\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_uppercase:nn }
+\cs_gset:Npn \tl_upper_case:nn #1#2
+ { \text_uppercase:nn {#1} {#2} }
+\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_titlecase:n }
+\cs_gset:Npn \tl_mixed_case:n #1
+ { \text_titlecase:n {#1} }
+\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { \text_titlecase:nn }
+\cs_gset:Npn \tl_mixed_case:nn #1#2
+ { \text_titlecase:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Deprecated \pkg{l3tl-analysis} functions}
%
% \begin{macro}[deprecated = 2020-07-01]
@@ -978,6 +1028,33 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP, deprecated = 2021-07-01]
+% {
+% \char_lower_case:N, \char_upper_case:N,
+% \char_mixed_case:Nn, \char_fold_case:N,
+% \char_str_lower_case:N, \char_str_upper_case:N,
+% \char_str_mixed_case:Nn, \char_str_fold_case:N,
+% }
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \char_lower_case:N }
+\cs_gset:Npn \char_lower_case:N { \char_lowercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \char_upper_case:N }
+\cs_gset:Npn \char_upper_case:N { \char_uppercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \char_mixed_case:N }
+\cs_gset:Npn \char_mixed_case:N { \char_titlecase:N }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \char_fold_case:N }
+\cs_gset:Npn \char_fold_case:N { \char_foldcase:N }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \char_str_lower_case:N }
+\cs_gset:Npn \char_str_lower_case:N { \char_str_lowercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \char_str_upper_case:N }
+\cs_gset:Npn \char_str_upper_case:N { \char_str_uppercase:N }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \char_str_mixed_case:N }
+\cs_gset:Npn \char_str_mixed_case:N { \char_str_titlecase:N }
+\__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \char_str_fold_case:N }
+\cs_gset:Npn \char_str_fold_case:N { \char_str_foldcase:N }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Deprecated \pkg{l3file} functions}
%
% \begin{macro}[EXP, deprecated = 2021-07-01]{\c_term_ior}
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index 7ddc695d4d..c294944482 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -2,7 +2,7 @@
%
%% File: l3doc.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -31,7 +31,7 @@
\askforoverwritefalse
\preamble
-Copyright (C) 1990-2017,2019 The LaTeX3 Project
+Copyright (C) 1990-2017,2019,2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -79,7 +79,7 @@ and all files in that bundle must be distributed together.
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
% \maketitle
% \tableofcontents
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index 8c626f91f9..3f64b98edf 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -2,7 +2,7 @@
%
%% File l3dosctrip.dtx
%
-% Copyright (C) 2012,2014-2019 The LaTeX3 Project
+% Copyright (C) 2012,2014-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index dacf0e35d6..5f2bda13ce 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index 7f3ea57e68..a2767d9692 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -2,7 +2,7 @@
%
%% File: l3expan.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -536,6 +536,7 @@
% \exp_args:Nooo,
% \exp_args:Noof,
% \exp_args:Nffo,
+% \exp_args:Neee
% }
% \begin{syntax}
% \cs{exp_args:NNoo} \meta{token_1} \meta{token_2} \Arg{token_3} \Arg{tokens}
@@ -2841,7 +2842,7 @@
% \exp_args:NNno, \exp_args:NNnV, \exp_args:NNoo, \exp_args:NNVV,
% \exp_args:Ncno, \exp_args:NcnV, \exp_args:Ncoo, \exp_args:NcVV,
% \exp_args:Nnnc, \exp_args:Nnno, \exp_args:Nnnf, \exp_args:Nnff,
-% \exp_args:Nooo, \exp_args:Noof, \exp_args:Nffo,
+% \exp_args:Nooo, \exp_args:Noof, \exp_args:Nffo, \exp_args:Neee
% }
% \begin{macro}
% {
@@ -2866,6 +2867,7 @@
\@@_tmp:w { ooo }
\@@_tmp:w { oof }
\@@_tmp:w { ffo }
+\@@_tmp:w { eee }
\@@_tmp:w { NNx }
\@@_tmp:w { Nnx }
\@@_tmp:w { Nox }
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index 2b6c86f8f8..274d5da8ec 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -2,7 +2,7 @@
%
%% File: l3file.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -702,6 +702,35 @@
% quote (|"|) characters or is surrounded by a pair of quotes.
% \end{function}
%
+% \begin{function}[rEXP, added = 2019-11-19]
+% {\file_hex_dump:n, \file_hex_dump:nnn}
+% \begin{syntax}
+% \cs{file_hex_dump:n} \Arg{file name}
+% \cs{file_hex_dump:nnn} \Arg{file name} \Arg{start index} \Arg{end index}
+% \end{syntax}
+% Searches for \meta{file name} using the current \TeX{} search
+% path and the additional paths controlled by \cs{l_file_search_path_seq}.
+% It then expands to leave the hexadecimal dump of the file content in the
+% input stream. The file is read as bytes, which means that in
+% contrast to most \TeX{} behaviour there will be a difference in result
+% depending on the line endings used in text files. The same file will
+% produce the same result between different engines: the algorithm used
+% is the same in all cases. When the file is not found, the result of
+% expansion is empty. The \Arg{start index} and \Arg{end index} values
+% work as described for \cs{str_range:nnn}.
+% \end{function}
+%
+% \begin{function}[noTF, added = 2019-11-19]
+% {\file_get_hex_dump:nN, \file_get_hex_dump:nnnN}
+% \begin{syntax}
+% \cs{file_get_hex_dump:nN} \Arg{file name} \meta{tl var}
+% \cs{file_get_hex_dump:nnnN} \Arg{file name} \Arg{start index} \Arg{end index} \meta{tl var}
+% \end{syntax}
+% Sets the \meta{tl var} to the result of applying
+% \cs{file_hex_dump:n}/\cs{file_hex_dump:nnn} to the \meta{file}.
+% If the file is not found, the \meta{tl var} will be set to \cs{q_no_value}.
+% \end{function}
+%
% \begin{function}[rEXP, added = 2019-09-03]{\file_mdfive_hash:n}
% \begin{syntax}
% \cs{file_mdfive_hash:n} \Arg{file name}
@@ -2858,18 +2887,119 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}[rEXP]{\file_hex_dump:nnn, \@@_hex_dump_auxi:nnn}
+% \begin{macro}[rEXP]{\@@_hex_dump_auxii:nnnn, \@@_hex_dump_auxiii:nnnn}
+% \begin{macro}[rEXP]{\@@_hex_dump_auxiiv:nnn}
+% \begin{macro}[rEXP]{\file_hex_dump:n, \@@_hex_dump:n}
+% These are separate as they need multiple arguments \emph{or} the
+% file size. For \LuaTeX{}, the emulation does not need the file
+% size so we save a little on expansion.
+% \begin{macrocode}
+\cs_new:Npn \file_hex_dump:nnn #1#2#3
+ {
+ \exp_args:Neee \@@_hex_dump_auxi:nnn
+ { \file_full_name:n {#1} }
+ { \int_eval:n {#2} }
+ { \int_eval:n {#3} }
+ }
+\cs_new:Npn \@@_hex_dump_auxi:nnn #1#2#3
+ {
+ \bool_lazy_any:nF
+ {
+ { \tl_if_blank_p:n {#1} }
+ { \int_compare_p:nNn {#2} = 0 }
+ { \int_compare_p:nNn {#3} = 0 }
+ }
+ {
+ \exp_args:Ne \@@_hex_dump_auxii:nnnn
+ { \@@_details_aux:nn {#1} { size } }
+ {#1} {#2} {#3}
+ }
+ }
+\cs_new:Npn \@@_hex_dump_auxii:nnnn #1#2#3#4
+ {
+ \int_compare:nNnTF {#3} > 0
+ { \@@_hex_dump_auxiii:nnnn {#3} }
+ {
+ \exp_args:Ne \@@_hex_dump_auxiii:nnnn
+ { \int_eval:n { #1 + #3 } }
+ }
+ {#1} {#2} {#4}
+ }
+\cs_new:Npn \@@_hex_dump_auxiii:nnnn #1#2#3#4
+ {
+ \int_compare:nNnTF {#4} > 0
+ { \@@_hex_dump_auxiv:nnn {#4} }
+ {
+ \exp_args:Ne \@@_hex_dump_auxiv:nnn
+ { \int_eval:n { #2 + #4 } }
+ }
+ {#1} {#3}
+ }
+\cs_new:Npn \@@_hex_dump_auxiv:nnn #1#2#3
+ {
+ \tex_filedump:D
+ offset ~ \int_eval:n { #2 - 1 } ~
+ length ~ \int_eval:n { #1 - #2 + 1 }
+ {#3}
+ }
+\sys_if_engine_luatex:T
+ {
+ \cs_gset:Npn \@@_hex_dump_auxiv:nnn #1#2#3
+ {
+ \lua_now:e
+ {
+ l3kernel.filedump
+ (
+ " \lua_escape:e {#3} " ,
+ \int_eval:n { #2 - 1 } ,
+ \int_eval:n { #1 - #2 + 1 }
+ )
+ }
+ }
+ }
+\cs_new:Npn \file_hex_dump:n #1
+ { \exp_args:Ne \@@_hex_dump:n { \file_full_name:n {#1} } }
+\cs_new:Npn \@@_hex_dump:n #1
+ {
+ \tl_if_blank:nF {#1}
+ { \tex_filedump:D length \tex_filesize:D {#1} {#1} }
+ }
+\sys_if_engine_luatex:T
+ {
+ \cs_gset:Npn \@@_hex_dump:n #1
+ {
+ \lua_now:e
+ { l3kernel.filedump ( " \lua_escape:e { #1 } " ) }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}[noTF]
-% {\file_get_mdfive_hash:nN, \file_get_size:nN, \file_get_timestamp:nN}
+% {
+% \file_get_hex_dump:nN,
+% \file_get_mdfive_hash:nN
+% \file_get_size:nN,
+% \file_get_timestamp:nN
+% }
% \begin{macro}{\@@_get_details:nnN}
% Non-expandable wrappers around the above in the case where appropriate
% primitive support exists.
% \begin{macrocode}
+\cs_new_protected:Npn \file_get_hex_dump:nN #1#2
+ { \file_get_hex_dump:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } }
\cs_new_protected:Npn \file_get_mdfive_hash:nN #1#2
{ \file_get_mdfive_hash:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } }
\cs_new_protected:Npn \file_get_size:nN #1#2
{ \file_get_size:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } }
\cs_new_protected:Npn \file_get_timestamp:nN #1#2
{ \file_get_timestamp:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } }
+\prg_new_protected_conditional:Npnn \file_get_hex_dump:nN #1#2 { T , F , TF }
+ { \@@_get_details:nnN {#1} { hex_dump } #2 }
\prg_new_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2 { T , F , TF }
{ \@@_get_details:nnN {#1} { mdfive_hash } #2 }
\prg_new_protected_conditional:Npnn \file_get_size:nN #1#2 { T , F , TF }
@@ -2901,6 +3031,7 @@
\token_to_str:N \(pdf)file
\str_case:nn {#2}
{
+ { hex_dump } { dump }
{ mdfive_hash } { mdfivesum }
{ timestamp } { moddate }
{ size } { size }
@@ -2913,6 +3044,26 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}[noTF]{\file_get_hex_dump:nnnN}
+% Custom code due to the additional arguments.
+% \begin{macrocode}
+\cs_new_protected:Npn \file_get_hex_dump:nnnN #1#2#3#4
+ {
+ \file_get_hex_dump:nnnNF {#1} {#2} {#3} #4
+ { \tl_set:Nn #4 { \q_no_value } }
+ }
+\prg_new_protected_conditional:Npnn \file_get_hex_dump:nnnN #1#2#3#4
+ { T , F , TF }
+ {
+ \tl_set:Nx #4
+ { \file_hex_dump:nnn {#1} {#2} {#3} }
+ \tl_if_empty:NTF #4
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP]{\@@_str_cmp:nn}
% \begin{macro}[EXP]{\@@_str_escape:n}
% As we are doing a fixed-length \enquote{big} integer comparison, it
diff --git a/macros/latex/contrib/l3kernel/l3final.dtx b/macros/latex/contrib/l3kernel/l3final.dtx
index 853220d68a..a8677aeb68 100644
--- a/macros/latex/contrib/l3kernel/l3final.dtx
+++ b/macros/latex/contrib/l3kernel/l3final.dtx
@@ -2,7 +2,7 @@
%
%% File: l3final.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index 742e3da3a4..2f8b6dcc77 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -2,7 +2,7 @@
%
%% File: l3flag.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3format.ins b/macros/latex/contrib/l3kernel/l3format.ins
index bdc5516701..6e0c98cb81 100644
--- a/macros/latex/contrib/l3kernel/l3format.ins
+++ b/macros/latex/contrib/l3kernel/l3format.ins
@@ -2,7 +2,7 @@
File l3format.ins
-Copyright (C) 2011,2012,2014-2019 The LaTeX3 Project
+Copyright (C) 2011,2012,2014-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 1990-2019 The LaTeX3 Project
+Copyright (C) 1990-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -104,8 +104,9 @@ and all files in that bundle must be distributed together.
\from{l3coffins.dtx} {initex}
\from{l3luatex.dtx} {initex,tex}
\from{l3unicode.dtx} {initex}
+ \from{l3text.dtx} {initex}
+ \from{l3text-case.dtx} {initex}
\from{l3candidates.dtx} {initex}
- \from{l3deprecation.dtx}{initex,kernel}
% ======== FORMAT ONLY =========
\from{l3final.dtx} {initex}
% ==============================
@@ -141,7 +142,7 @@ and all files in that bundle must be distributed together.
\def\MetaPrefix{--}
\preamble
-Copyright (C) 1990-2019 The LaTeX3 Project
+Copyright (C) 1990-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index a09616c307..ee6abd5f55 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index 1d3faad843..f306cc12c1 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-aux.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index 776192abc7..bf0afbf7c4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-basics.dtx
%
-% Copyright (C) 2011-2014,2016-2019 The LaTeX3 Project
+% Copyright (C) 2011-2014,2016-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index c1443a3eaf..b6b9e0d7c9 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-convert.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index 394fe63f4c..d830b74036 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-expo.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index 8c28335acc..961655d05a 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-extended.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index 0b853df3ce..e6aab8c394 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-logic.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index a864190535..4c4c31c95e 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-parse.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -1025,7 +1025,7 @@
\cs_if_exist_use:cF { @@_parse_word_#2:N }
{
\cs_if_exist_use:cF
- { @@_parse_caseless_ \str_fold_case:n {#2} :N }
+ { @@_parse_caseless_ \str_foldcase:n {#2} :N }
{
\__kernel_msg_expandable_error:nnn
{ kernel } { unknown-fp-word } {#2}
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 7c6d18bc3c..e56642bd6d 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-random.dtx
%
-% Copyright (C) 2016-2019 The LaTeX3 Project
+% Copyright (C) 2016-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index 7c4e5b0b0f..672bfd9c8a 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-round.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index f4e047b462..74809e6385 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-traps.dtx
%
-% Copyright (C) 2011-2014,2016-2019 The LaTeX3 Project
+% Copyright (C) 2011-2014,2016-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index d89f047751..fced52d759 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-trig.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index 8521414085..44530a1518 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -887,7 +887,7 @@
% \mathtt{1/2pi(pi+pi)} & = (2\pi)^{-1}(\pi+\pi) \simeq 1, \\
% \mathtt{sin 2pi} & = \sin(2)\pi \neq 0, \\
% \mathtt{2\char`\^2max(3,5)} & = 2^2 \max(3,5) = 20, \\
-% \mathtt{1in/1cm} & = (1in)/(1cm) = 2.54 .
+% \mathtt{1in/1cm} & = (1\mathrm{in})/(1\mathrm{cm}) = 2.54 .
% \end{align*}
% Functions are called on the value of their argument, contrarily to
% \TeX{} macros.
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index 35cdb6353c..e7f0675fc9 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fparray.dtx
%
-% Copyright (C) 2018-2019 The LaTeX3 Project
+% Copyright (C) 2018-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index 4459cc56b1..bc68230b3f 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -2,7 +2,7 @@
%
%% File: l3int.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -420,8 +420,8 @@
% { -2 * 10 } { Negative }
% }
% { No idea! }
-% \end{verbatim}
-% leaves \enquote{\texttt{Medium}} in the input stream.
+% \end{verbatim}
+% leaves \enquote{\texttt{Medium}} in the input stream.
% \end{function}
%
% \begin{function}[EXP,pTF]{\int_if_even:n, \int_if_odd:n}
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index f26e7416aa..6fc43aad65 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -2,7 +2,7 @@
%
%% File: l3intarray.dtx
%
-% Copyright (C) 2017-2019 The LaTeX3 Project
+% Copyright (C) 2017-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index 5ad373b5cc..98f588a53e 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index c8d5f71431..54167b15c2 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -2,7 +2,7 @@
%
%% File: l3keys.dtx
%
-% Copyright (C) 2006-2019 The LaTeX3 Project
+% Copyright (C) 2006-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -2523,6 +2523,7 @@
{ \c_@@_code_root_tl ##1 / \l_keys_key_tl }
{
\tl_set:Nn \l_@@_inherit_tl {##1}
+ \cs_if_exist_use:c { \c_@@_validate_root_tl ##1 / \l_keys_key_tl }
\cs:w \c_@@_code_root_tl ##1 / \l_keys_key_tl
\exp_after:wN \cs_end: \exp_after:wN
{ \l_keys_value_tl }
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index c49ac91e7f..21d6fe5146 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -2,7 +2,7 @@
%
%% File: l3legacy.dtx
%
-% Copyright (C) 2019 The LaTeX3 Project
+% Copyright (C) 2019,2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index 22780b77fd..a9f1f0c0a3 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -2,7 +2,7 @@
%
%% File: l3luatex.dtx
%
-% Copyright (C) 2010-2019 The LaTeX3 Project
+% Copyright (C) 2010-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -143,6 +143,17 @@
% for user input.
% \end{function}
%
+% \begin{function}{l3kernel.filedump}
+% \begin{syntax}
+% |l3kernel.filedump(|\meta{file}|,|\meta{offset}|,|\meta{length}|)|
+% \end{syntax}
+% Returns the uppercase hexadecimal representation of the content of the
+% \meta{file} read as bytes. If the \meta{length} is given, only this part
+% of the file is returned; similarly, one may specify the \meta{offset} from
+% the start of the file. If the \meta{length} is not given, the entire file
+% is read starting at the \meta{offset}.
+% \end{function}
+%
% \begin{function}{l3kernel.filemdfivesum}
% \begin{syntax}
% |l3kernel.filemdfivesum(|\meta{file}|)|
@@ -310,16 +321,17 @@ l3kernel = l3kernel or { }
%
% Local copies of global tables.
% \begin{macrocode}
-local io = io
-local kpse = kpse
-local lfs = lfs
-local math = math
-local md5 = md5
-local os = os
-local string = string
-local tex = tex
-local texio = texio
-local unicode = unicode
+local io = io
+local kpse = kpse
+local lfs = lfs
+local math = math
+local md5 = md5
+local os = os
+local string = string
+local tex = tex
+local texio = texio
+local tonumber = tonumber
+local unicode = unicode
% \end{macrocode}
%
% Local copies of standard functions.
@@ -395,6 +407,30 @@ l3kernel.resettimer = resettimer
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{l3kernel.filedump}
+% Similar comments here to the next function: read the file in binary mode
+% to avoid any line-end weirdness.
+% \begin{macrocode}
+local function filedump(name,offset,length)
+ local file = kpse_find(name,"tex",true)
+ if file then
+ local length = tonumber(length) or lfs_attr(file,"size")
+ local offset = tonumber(offset) or 0
+ local f = open(file,"rb")
+ if f then
+ if offset > 0 then
+ f:seek("set",offset)
+ end
+ local data = f:read(length)
+ escapehex(data)
+ f:close()
+ end
+ end
+end
+l3kernel.filedump = filedump
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{l3kernel.filemdfivesum}
% Read an entire file and hash it: the hash function itself is a built-in.
% As Lua is byte-based there is no work needed here in terms of UTF-8
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index 969738d3aa..3b52246c27 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -2,7 +2,7 @@
%
%% File: l3msg.dtx
%
-% Copyright (C) 2009-2019 The LaTeX3 Project
+% Copyright (C) 2009-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index b0edf9235d..cce95b9866 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -1113,6 +1113,9 @@
% \begin{macrocode}
\@@_primitive:NN \autospacing \tex_autospacing:D
\@@_primitive:NN \autoxspacing \tex_autoxspacing:D
+ \@@_primitive:NN \currentcjktoken \tex_currentcjktoken:D
+ \@@_primitive:NN \currentspacingmode \tex_currentspacingmode:D
+ \@@_primitive:NN \currentxspacingmode \tex_currentxspacingmode:D
\@@_primitive:NN \disinhibitglue \tex_disinhibitglue:D
\@@_primitive:NN \dtou \tex_dtou:D
\@@_primitive:NN \epTeXinputencoding \tex_epTeXinputencoding:D
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
new file mode 100644
index 0000000000..404b6e0e82
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news.tex b/macros/latex/contrib/l3kernel/l3news.tex
new file mode 100644
index 0000000000..1c1b9eed79
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news.tex
@@ -0,0 +1,157 @@
+% Copyright 2019 The LaTeX3 Project
+
+\providecommand*{\lastissue}{12}
+
+\documentclass{ltnews}
+
+\AtBeginDocument{%
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}%
+ \RaggedRight
+ \setlength\parindent{1em}%
+}
+\usepackage{catchfile}
+\usepackage{csquotes}
+\usepackage{enumitem}
+\usepackage{fancyvrb}
+\usepackage{hologo}
+\usepackage{metalogo}
+\usepackage{multicol}
+\usepackage{ragged2e}
+\usepackage{siunitx}
+\usepackage{tikz}
+\usepackage{underscore}
+\usepackage{xparse}
+\usepackage{hyperref}
+\hypersetup{colorlinks}
+\usepackage{bookmark}
+
+\makeatletter
+\newcounter{issue}
+\renewcommand*{\theissue}{%
+ \ifnum\value{issue}<10 0\fi
+ \number\value{issue}%
+}
+\newcommand*{\MonthJanuary}{01}
+\newcommand*{\MonthFebruary}{02}
+\newcommand*{\MonthMarch}{03}
+\newcommand*{\MonthApril}{04}
+\newcommand*{\MonthMay}{05}
+\newcommand*{\MonthJune}{06}
+\newcommand*{\MonthJuly}{07}
+\newcommand*{\MonthAugust}{08}
+\newcommand*{\MonthSeptember}{09}
+\newcommand*{\MonthOctober}{10}
+\newcommand*{\MonthNovember}{11}
+\newcommand*{\MonthDecember}{12}
+\newcommand*{\printissue}{%
+ Issue %
+ \texorpdfstring{\number\value{issue}}{\theissue}, %
+ \texorpdfstring{\@month\space\@year}{\@year/\@nameuse{Month\@month}}%
+}
+\let\l@part\l@section
+\let\l@section\l@subsection
+\let\l@subsection\l@subsubsection
+\let\l@subsubsection\l@paragraph
+\let\l@paragraph\l@subparagraph
+\newcommand*{\makefirsttitle}{%
+ \twocolumn[{%
+ \parbox[t][4\baselineskip]{\textwidth}{%
+ \@titlefont\@title, Issues 1--\lastissue
+ }%
+ }]%
+}
+\makeatother
+
+\begin{document}
+
+%%% Title and Table of Contents
+
+\makefirsttitle
+\pdfbookmark[0]{\contentsname}{toc}
+\tableofcontents
+\clearpage
+
+\begingroup
+ \renewcommand*{\AtBeginDocument}[1]{#1}%
+ \renewcommand*{\PassOptionsToPackage}[2]{}%
+ \renewcommand*{\usepackage}[2][]{}%
+ \renewcommand*{\RequirePackage}[2][]{}%
+ \renewcommand*{\documentclass}[2][]{%
+ \setcounter{footnote}{0}%
+ \gobbleopt
+ }%
+ \newcommand*{\gobbleopt}[1][]{}%
+ \makeatletter
+ \let\org@twocolumn\twocolumn
+ \renewenvironment{document}{%
+ \clearpage
+ \ifnum\@issue=20 %
+ \addtocontents{toc}{\protect\setcounter{tocdepth}{5}}%
+ \addtocontents{toc}{%
+ \protect\makeatletter
+ }%
+ \addtocontents{toc}{%
+ \let\protect\saved@l@paragraph\protect\l@paragraph
+ }%
+ \addtocontents{toc}{%
+ \let\protect\l@paragraph\protect\l@subsection
+ }%
+ \fi
+ \ifnum\@issue=\lastissue\space
+ \addtocontents{toc}{%
+ \let\protect\l@paragraph\protect\saved@l@paragraph
+ }%
+ \def\toclevel@subsection{1}%
+ \def\toclevel@subsubsection{2}%
+ \addtocontents{toc}{\protect\setcounter{tocdepth}{4}}%
+ \renewcommand*{\tableofcontents}{%
+ \section*{\contentsname}%
+ \@starttoc{toc\lastissue}%
+ }%
+ \let\saved@addtocontents\addtocontents
+ \renewcommand*{\addtocontents}[2]{%
+ \saved@addtocontents{##1}{##2}%
+ \def\temp@toc{toc}%
+ \def\temp@param{##1}%
+ \ifx\temp@toc\temp@param
+ \saved@addtocontents{toc\lastissue}{##2}%
+ \fi
+ }%
+ \let\l@subsubsection\l@subsection
+ \let\l@subsection\l@section
+ \let\l@section\l@part
+ \let\l@part\@gobbletwo
+ \fi
+ \def\twocolumn[{%
+ \let\twocolumn\org@twocolumn
+ \org@twocolumn[%
+ {% because of optional argument of \twocolumn
+ \pdfbookmark[0]{\printissue}{issue\theissue}%
+ }%
+ \begingroup
+ \let\WriteBookmarks\relax
+ \@firstofone{% inside opt. arg. of \twocolumn: protect "]"
+ \renewcommand*{\Hy@writebookmark}[5]{}%
+ }%
+ \phantomsection
+ \addcontentsline{toc}{part}{\printissue}%
+ \endgroup
+ }%
+ }{%
+ \clearpage
+ }%
+ \makeatother
+ \loop
+ \ifnum\value{issue}<\lastissue
+ \stepcounter{issue}%
+ \input{l3news\theissue}%
+ \repeat
+ \stepcounter{issue}%
+ \IfFileExists{l3news\theissue}{%
+ \@latex@error{\jobname.tex is out of date,\MessageBreak
+ there is `l3news\theissue.tex'%
+ }\@ehc
+ }{}%
+\endgroup
+
+\end{document}
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf
new file mode 100644
index 0000000000..580bd304a1
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.tex b/macros/latex/contrib/l3kernel/l3news01.tex
new file mode 100644
index 0000000000..717f12ddbb
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news01.tex
@@ -0,0 +1,102 @@
+% Copyright 2009 The LaTeX Project
+\documentclass{ltnews}
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+}
+
+\publicationmonth{February}
+\publicationyear{2009}
+\publicationissue{1}
+
+\begin{document}
+\maketitle
+
+\section{Welcome to \LaTeX3}
+
+Momentum is again starting to build behind the \LaTeX3 project. For the
+last few releases of \TeX~Live, the experimental programming foundation for
+\LaTeX3 has been available under the name \package{expl3}. Despite large
+warnings that the code would probably change in the future, we wanted to show
+that there was progress being made, no matter how slowly. Since then, some
+people have looked at the code, provided feedback, and~--- most
+importantly~--- actually tried using it. Although it is yet early days, we
+believe that the ideas behind the code are sound and there are only `cosmetic
+improvements' that need to be made before \package{expl3} is ready for the
+\LaTeX~package author masses.
+
+\section{What currently exists}
+
+The current \LaTeX3 code consists of two main branches: the
+\package{expl3} modules that define the underlying programming environment,
+and the `\package{xpackage}s', which are a suite of packages that are written
+with the \package{expl3} programming interface and provide some higher-level
+functionality for what will one day become \LaTeX3 proper. Both \package{expl3} and
+parts of the \package{xpackages} are designed to be used \emph{on top} of
+\LaTeXe, so new packages can take advantage of the new features while still
+allowing to be used alongside many of the vast number of \LaTeXe\ packages on
+\textsc{ctan}.
+
+\section{What's happening now}
+
+In preparation for a minor overhaul of the \package{expl3} code, we are
+writing a comprehensive test suite for each module. These tests allow us to
+make implementation changes and then test if the code still works as before.
+They are also highlighting any minor shortcomings or omissions in the code.
+As the tests are being written, our assumptions about what should be called
+what and the underlying naming conventions for the functions and datatypes are
+being questioned, challenged, and noted for further rumination.
+
+At the time of writing, we are approximately half-way through writing the test
+suite. Once this task is complete, which we plan for the first
+half of 2009, we will be ready to make changes without worrying about breaking
+anything.
+
+\section{What's happening soon}
+
+So what do we want to change? The current \package{expl3} codebase has
+portions that date to the pre-\LaTeXe\ days, while other modules have been
+more recently conceived. It is quite apparent when reading through the sources
+that some unification and tidying up would improve the simplicity and
+consistency of the code. In many cases, such changes will mean nothing more
+than a tweak or a rename.
+
+Beyond these minor changes, we are also re-thinking the exact notation behind
+the way functions are defined. There are currently a handful of different
+types of arguments that functions may be passed (from an untouched single
+token to a complete expansion of a token list) and we're not entirely happy
+with how the original choices have evolved now that the system has grown
+somewhat. We have received good feedback from several people on ways that we
+could improve the argument syntax, and as part of the upcoming changes to the
+\package{expl3} packages we hope to address the problems that we currently
+perceive in the present syntax.
+
+\section{What's happening later}
+
+After the changes discussed above are finished, we will begin freezing the core
+interface of the \package{expl3} modules, and we hope that more package
+authors will be interested in using the new ideas to write their own code.
+While the core functions will then remain unchanged, more features and new
+modules will be added as \LaTeX3 starts to grow.
+
+Some new and/or experimental packages will be changing to use the
+\package{expl3} programming interface, including \package{breqn},
+\package{mathtools}, \package{empheq}, \package{fontspec}, and
+\package{unicode-math}. (Which is one reason for the lack of progress in
+these latter two in recent times.) There will also be a version of the
+\package{siunitx} package written in \package{expl3}, in parallel to the
+current \LaTeXe\ version. These developments will provide improvements to
+everyday \LaTeX\ users who haven't even heard of the \LaTeX3 Project.
+
+Looking towards the long term, \LaTeX3 as a document preparation system needs
+to be written almost from scratch. A high-level user syntax needs to be
+designed and scores of packages will be used as inspiration for the
+`out-of-the-box' default document templates. \LaTeXe\ has stood up to the test
+of time~--- some fifteen years and still going strong~--- and it is now time
+to write a successor that will survive another score.
+
+\end{document}
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf
new file mode 100644
index 0000000000..7b184b9e94
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.tex b/macros/latex/contrib/l3kernel/l3news02.tex
new file mode 100644
index 0000000000..a3d5467c8e
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news02.tex
@@ -0,0 +1,153 @@
+% Copyright 2009 The LaTeX Project
+\documentclass{ltnews}
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+}
+
+\usepackage{url}
+\newcommand\TUG[1]{\textsc{tug}~#1}
+
+\publicationmonth{June}
+\publicationyear{2009}
+\publicationissue{2}
+
+\begin{document}
+\maketitle
+
+\section{\TeX~Live and the \textsf{expl3} code}
+
+\TeX~Live 2009 is almost upon us, and the \LaTeX3 team have been
+readying a new release of the experimental \LaTeX3 code for this.
+Very dramatic changes have occurred since the
+last public release of the code in \TeX~Live~2008; no backwards compatibility has been
+maintained (as warned in the beginning of the documentation) but we
+believe the changes made are all much for the better. Almost every
+single part of \textsf{expl3} has been scrutinized, resulting in a far
+more coherent code base.
+
+The \textsf{expl3} code is now considered to be much more stable than
+it was before; a comprehensive test suite has been written that helps
+to ensure that we don't make any mistakes as we change things in the
+future. In the process of writing the test
+suite, many minor bugs were fixed; we recommend such test suites for
+all similar developmental projects!
+Some small underlying changes are still expected in the
+\textsf{expl3} code, but major, disruptive, changes aren't planned.
+
+\section{Planned updates}
+
+Until now, the last update to \textsc{ctan} of the \textsf{expl3}
+bundle was for \TeX~Live~2008. Now that work on the code is happening
+on a semi-steady basis, we plan to keep updates rolling out to
+\textsc{ctan} more frequently. This will allow anyone who wishes to
+experiment with the new code to use the \TeX~Live or MiK\TeX\
+updaters to install a recent version without having to `check out' the
+\textsc{svn} repository and install the packages manually.
+
+\section{New members}
+
+We didn't say anything about it in the last status update, but Joseph
+Wright and Will Robertson are now members of the \LaTeX\ Team. They
+have been working fairly exclusively on the \textsf{expl3} code.
+
+It's worth repeating that \LaTeXe\ is essentially frozen in order to
+prevent any backwards compatibility problems. As desirable as it is
+to benefit from the new features offered by new engines \XeTeX\ and
+Lua\TeX, we cannot risk the stability of production servers running
+older versions of \LaTeXe\ which will inevitably end up processing
+documents written into the future.
+
+\LaTeX3 will not be inheriting the same restraints, so stay tuned.
+
+\newpage
+
+\section{Some specifics}
+
+Morten H\o gholm will be presenting the recent changes in much more detail at
+\TUG{2009}. Here are some quick specifics for those interested. New code written
+and broad changes made to the \textsf{expl3} modules:
+\begin{description}
+\item [More logical function names]
+ Many function names that were hold-outs from the \TeX\ naming system
+ have been changed to fit into the more logical scheme of \textsf{expl3}; e.g.,
+ \verb|\def:Npn| and \verb|\let:NN| are now \verb|\cs_set:Npn| and
+ \verb|\cs_set_eq:NN|.
+
+\item [Defining functions and conditionals]
+ Much thought was put into new ways to define
+ functions and conditionals with a minimum of code.
+ See \verb|\cs_set:Nn| and \verb|\prg_set_conditional:Nnn|.
+
+\item [Smart comparisons]
+ Comparisons can be made much more easily now, with familiar notation such as
+ \verb|\intexpr_compare_p:n{ #1+3 != \l_tmpa_int }|.
+
+\item [Data from variables] A new function argument specifier \texttt{V} has
+ been added for extracting information from variables of different types,
+ without needing to know the underlying variable structure. Some other
+ tidy-ups on the argument specifiers offered, partially as a result of the
+ addition of this new one.
+
+\item [l3msg] New module to deal with communication between \LaTeX3 code
+ and the user (info messages, warnings, and errors), including message
+ filtering partially inspired by the \textsf{silence} package.
+ \end{description}
+
+\section{The next six months}
+
+Having overhauled the \textsf{expl3} code, we now plan to perform an
+analogous process with the foundations of the
+\textsf{xpackages}. These are the higher-level packages that will
+provide the basic needs such as control of the page layout and rich
+document-level interaction with the user. As the groundwork for this
+layer of the document processing matures, we will be able to start
+building more packages for a \LaTeX3 kernel; these packages will also
+be usable on top of \LaTeXe\ and serve as broadly customisable
+templates for future document design.
+
+As gaps in the functionality offered by \textsf{expl3} are found (in
+some cases, we know that they exist already), the programming layer
+will be extended to support our needs. In other cases, wrappers around
+\TeX\ functions that can be more usefully handled at a higher level
+will be written.
+
+In terms of what we're planning to work on next, three \textsf{xpackage}s
+will take the focus of our attention.
+\begin{description}
+\item [xbase]
+ `\textsf{xbase}' is actually two packages: \textsf{xparse} and
+ \textsf{template}. These contain code for, respectively, defining new
+ document commands (such that a user would use; e.g., \verb|\section|,
+ \verb|\makebox|, \dots) and for handling keyval lists for user input and
+ document specification. \textsf{xparse} was presented at \TUG{1999}%
+ \footnote{\url{http://www.latex-project.org/papers/tug99.pdf}}
+ and Lars Hellstr\"om wrote some notes on \textsf{template} in 2000%
+ \footnote{\url{http://www.latex-project.org/papers/template-notes.pdf}}.
+ Functionality coverage for these packages is good but concepts need a good
+ ``airing''. There are various approaches taken for keyval input, some more
+ recent than the \textsf{template} code, so there are some alternatives to
+ evaluate.
+\item [galley2] Sophisticated handling for \mbox{constructing} paragraphs and
+ other document elements. Morten spoke on this at \TUG{2008}%
+ \footnote{\url{http://river-valley.tv/the-galley-module/}}.
+ Design needs to be revisited after some stress testing.
+\item [xor] This is the \LaTeX3 output routine for splitting the galley into
+ page and sub-page sized chunks. Ideas and code need work to move to
+ ``production ready'' status. Early developments with this package were
+ published by Frank in 2000%
+ \footnote{\url{http://www.latex-project.org/papers/xo-pfloat.pdf}}.
+\end{description}
+
+Expect to hear again from us at Christmas. If you'd like to discuss any
+of these ideas, please join us on the \textsc{latex-l} mailing list%
+\footnote{\url{http://www.latex-project.org/code.html}}.
+
+\end{document}
+
+
+
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf
new file mode 100644
index 0000000000..801fed2917
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.tex b/macros/latex/contrib/l3kernel/l3news03.tex
new file mode 100644
index 0000000000..e3e245f051
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news03.tex
@@ -0,0 +1,128 @@
+% Copyright 2009,2010 The LaTeX Project
+\documentclass{ltnews}
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+}
+
+\usepackage{url}
+
+\publicationmonth{January}
+\publicationyear{2010}
+\publicationissue{3}
+
+\begin{document}
+\maketitle
+\raisefirstsection
+
+\section{Happy New Year}
+
+Welcome to the holiday season edition of `news of our activities' for
+the \LaTeX3 team.
+
+\section{Recent developments}
+
+The last six months has seen two significant releases in the \LaTeX3 code.
+In the \textsc{ctan} repository for the \pkg{xpackages},\footnote{\url{http://mirror.ctan.org/tex-archive/macros/latex/contrib/xpackages/}} you'll find two items of interest:
+\begin{itemize}
+\item A revised version of \textsf{xparse}; and
+\item The new package \textsf{xtemplate}, a re-implementation of \textsf{template} with a new syntax.
+\end{itemize}
+Special thanks to Joseph Wright who handled the implementations above almost single-handedly (with lots of input and feedback from other members of the team and members of the \textsc{latex-l} mailing list).
+
+These two packages are designed for the \LaTeX\ package author who wishes to define document commands and designer interfaces in a high-level manner.
+
+\paragraph{\textsf{xparse}}
+This package allows complex document commands to be constructed with all sorts of optional arguments and flags. Think of how \verb|\newcommand| allows you to create a command with a single optional argument and \textsf{xparse} is a generalisation of that idea.
+
+\paragraph{\textsf{xtemplate}}
+This package requires more explanation.
+\textsf{Xtemplate} is designed to separate the logical information in a
+document from its visual representation. `Templates' are constructed to fulfil
+individual typesetting requirements for each set of arguments; to change
+the look of a certain part of a document, instantiations of templates can be
+swapped out for another without (a) having to change the markup of the source
+document, or (b) having to edit some internal \LaTeX\ macro.
+
+
+\LaTeXe{} packages, such as \textsf{geometry} or \textsf{titlesec}, already provide
+parameterized interfaces to specific document elements. For example,
+one may use \textsf{titlesec} to change the
+layout of a \verb|\section|: one modifies its layout parameters via \verb|\titleformat| and \verb|\titlespacing|.
+In a way, such packages define a template for a specific document element and
+some manipulation commands to instantiate it.
+\pagebreak
+However, the moment the intended
+layout is not achievable with one package you are on your own: either you have
+to resort to low-level programming or find some other high-level package which, of course, comes with its own set of conventions and manipulation commands.
+
+The \textsf{xtemplate} package can be thought of a generalization of such
+ideas. It provides a uniform interface for defining and managing templates for
+any kind of document element and most importantly provides a uniform interface
+for instantiating the layout.
+
+Thus the designer activity of defining or modifying a document class is
+limited to selecting the document elements that should be provided by the
+class (e.g., \verb|\chapter|, \verb|\section| \verb|\footnote|, lists, \ldots), selecting
+appropriate ``named'' templates for each of them, and instantiating these
+templates by specifying values for their layout parameters. If a desired
+layout can't be achieved with a given template a different template for the
+same document element can be selected.
+
+Programming is only necessary
+if no suitable template for the intended layout is available.
+It is then that a \LaTeX{} programmer has to build a new template
+that supports the layout requirements. Once this task is complete, the
+template may be
+added to the selection of templates that designers and users may choose from
+to define or adjust document layouts seamlessly.
+
+This is a slight gloss over the complexities of the package itself, which you can read about in the documentation. We've tried to document \textsf{xtemplate} clearly but we'd love feedback on whether the ideas make sense to you.
+
+As an addendum to the introduction of \textsf{xtemplate}, the older \textsf{template} package will be retired in the near future. To our knowledge there is only a single package on \textsc{ctan} that uses \textsf{template}, namely \textsf{xfrac}, and members of the \LaTeX\ team are in the process of switching this package over to \textsf{xtemplate}. If you have any private code that uses \textsf{template}, please let us know!
+
+
+\section{Upcoming plans}
+
+Having announced the updated \textsf{xparse} and the new \textsf{xtemplate}, the next stage of development will revolve around using these two systems in the other components of the \textsf{xpackages}, feeding back our experience in practise with the original ideas behind the designs and evaluating if the packages are meeting our expectations.
+
+\subsection{Packages to tackle}
+
+\paragraph{\textsf{xhead}}
+The first work will be to create a new \textsf{xpackage} (probably called \textsf{xhead}), for typesetting section headings and other document divisions.
+Section headings are one of the more complex areas to work with, so
+the work should stress \textsf{xtemplate} enough to know if its
+current design is sufficient for most needs. Nothing has been
+released yet, but we'll announce further developments on the
+\textsc{latex-l} mailing
+list\footnote{For details, see
+ \url{http://www.latex-project.org/code.html}} in the
+mean time.
+
+
+\paragraph{\textsf{galley}}
+We also need to give \textsf{galley} the same treatment as
+\textsf{xparse} and \textsf{xtemplate} have already had. That is, we have an
+older implementation (in fact two) that needs some work before we're ready to release it to \textsc{ctan}.
+
+The \textsf{galley} package is used to place material into the
+vertical list while typesetting but before page breaks occur. Since it
+works at such a low level, it is important to solidify this package
+before writing higher level design templates.
+
+An issue we have to face is that to achieve best results,
+\textsf{galley} cannot be used in concert with \LaTeXe\ code. This
+could limit its usefulness, and we may decide that it's better to
+scale back the features we're attempting, to allow better
+interoperability for existing packages and documents. More work
+remains before we can decide between these options.
+
+
+\end{document}
+
+
+
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf
new file mode 100644
index 0000000000..28a8779ab6
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.tex b/macros/latex/contrib/l3kernel/l3news04.tex
new file mode 100644
index 0000000000..a0fc82f3de
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news04.tex
@@ -0,0 +1,123 @@
+% Copyright 2009,2010 The LaTeX Project
+\documentclass{ltnews}
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+}
+
+\usepackage{url,hologo}
+
+\publicationmonth{July}
+\publicationyear{2010}
+\publicationissue{4}
+
+\begin{document}
+\maketitle
+
+\noindent
+Now that we're back from the \TeX\ Users Group conference in San
+Francisco, it's time to discuss what's been going on over the last six months.
+Due to some extra travel plans after the conference, this issue is slightly
+late in coming out.
+
+
+\section{\textsf{expl3} in practice}
+
+Joseph Wright and Will Robertson have both released significant new versions
+of their packages, resp., \textsf{siunitx} and \textsf{fontspec}. These have
+been re-written in the \LaTeX3 programming language \textsf{expl3}, which we
+have discussed here previously. Using \textsf{expl3} for production code has
+been very successful, both in demonstrating that the concepts are sound and
+highlighting areas that still need some attention.
+% The \textsf{expl3}
+% code will continue to evolve as more people use it for their work.
+
+In the case of \textsf{fontspec}, \textsf{expl3} programming is being used to
+target \LaTeX\ running on either \XeTeX\ and \hologo{LuaTeX}. In the latter
+case, the package is a mixture of Lua code and \pkg{expl3} code; Will
+presented the \pkg{unicode-math} package at TUG~2010, which is developed in
+the same style.
+
+
+\section{New \textsf{xpackages}}
+
+Frank Mittelbach has started to work on a new experimental \LaTeX3 package
+\textsf{xhead} that provides templates for one of the most complex areas of
+document design: section headings and document divisions. This
+is the beginning of an ambitious idea to map out the requirements for
+typesetting most documents currently processed with \LaTeX.
+
+One of the challenges here is providing a ``natural'' design language for
+describing the two-dimensional spatial relationships of objects participating
+in the design, e.g., the placement of a heading number in relation to the
+heading title, a possible sub-title, etc. In answer to this challenge Frank
+developed the \textsf{xcoffin} package, which he presented at TUG~2010. It is
+designed as a high-level interface for placing and aligning boxes on a page,
+allowing a `designer's approach' for indicating the positional relationship
+between boxes. (A `coffin' is a box with handles.) As an example, it is
+possible to represent ideas such as `align the lower-left corner of box A with
+the upper-right corner of box B after rotating it ninety degrees', without
+having to calculate the intermediate positions.
+
+We expect a future version of \textsf{xcoffin} (after some further work on its
+interface layer and its internal implementation) to play a major role in all
+packages providing layout templates for higher-level document objects, such as
+table of contents designs, floats, etc.
+
+Finally,
+Joseph Wright has begun work with the current `galley' packages, producing the
+new, minimal, \textsf{xgalley} based on \textsf{xfm-galley} as a testbed for
+what we need and what will work.
+
+
+\section{Developments with \textsf{expl3}}
+
+Meanwhile, Joseph's \emph{also} been writing a new floating-point calculation
+module, called \textsf{l3fp}, for \pkg{expl3}. This module allows manipulation
+and calculation of numbers with a much larger range than \TeX\ allows
+naturally. The \textsf{l3fp} module has already been utilised in the
+\pkg{xcoffin} code for calculatations such as coordinate rotations and
+intersection points of vectors.
+
+The modules \pkg{l3io} and \pkg{l3file} have been revised, rethinking the way
+that read and write streams are dealt with. \TeX\ has a hard limit of sixteen
+input and output streams open at any one time, and the new implementation for
+\pkg{expl3} provides more flexibility in how they are allocated; there's now
+much less chance of running into a `\verb|No room for a new \read|' (or
+\verb|\write|) error.
+
+Sometimes we discuss ideas for \textsf{expl3} that \emph{don't} end up making
+it into the final code. One example of this is the concept of having `local
+registers' for integers, boxes, and so on, that do not survive outside of the
+group they are defined in (in contrast to Plain \TeX\ and \LaTeX, where
+allocators such as \verb|\newcount| and \verb|\newbox| are always global).
+Despite the scope for some small benefit, we decided that the extra complexity
+that the additional functions required, in both syntax and documentation, was
+not justified.
+
+
+\section{TUG 2010 reflections}
+
+% added most of it back in: -fmi
+
+%% Most of the active \LaTeX3 Project team were able to attend the TUG~2010
+%% conference and (for Will) meet everyone in person for the first time.
+
+Our interpretation of the broad themes discussed at the conference are that
+\TeX-based systems are still thriving and there are some big problems to solve
+with robust solutions to transform \LaTeX\ source, including mathematics, into
+a form such as HTML. While there are big pushes for standardising various aspects
+of the \LaTeX\ syntax, we also believe that it is \LaTeX's very
+flexibility---its inherently non-standardised markup---that has allowed it to
+survive for so many years. There is a delicate trade-off here between moving
+forward into more standards-based territory while also retaining the
+extensibility of the third-party package system.
+
+\end{document}
+
+
+
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf
new file mode 100644
index 0000000000..3fa6010bab
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.tex b/macros/latex/contrib/l3kernel/l3news05.tex
new file mode 100644
index 0000000000..43ec2a8d19
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news05.tex
@@ -0,0 +1,64 @@
+% Copyright 2011 The LaTeX Project
+\documentclass{ltnews}
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+}
+
+\usepackage{hologo}
+
+\publicationmonth{January}
+\publicationyear{2011}
+\publicationissue{5}
+
+\begin{document}
+\maketitle
+
+
+\section{Happy new year}
+
+Seasons greetings for 2011!
+As the previous news issue was released late, this season's issue will be shorter than usual.
+
+\section{The LPPL is now OSI-approved}
+
+We are happy to report that earlier this year the \LaTeX\ Project Public License (LPPL) has been approved by the OSI as an open source licence.\footnote{\url{http://www.opensource.org/licenses/lppl}} Frank Mittelbach will be publishing further details on this news in a retrospective on the LPPL in an upcoming TUGboat article.
+
+\section{Reflections on 2010}
+
+We are pleased to see the continued development and discussion in the \TeX\ world.
+The \LaTeX\ ecosystem continues to see new developments and a selection of notable news from the second half of last year include:
+\begin{itemize}
+\item[June] The TUG~2010 conference was held very successfully in San
+Francisco; videos, slides, and papers from \LaTeX3 Project members are available from our website.\footnote{\url{http://www.latex-project.org/papers/}}
+\item[Aug.]
+The \TeX\ Stack Exchange\footnote{\url{http://tex.stackexchange.com}} question\,\&\,answer website was created and has since grown quickly. At time of writing, some 2800 people have asked 2600 questions with 5600 answers total, and 2200 users are currently visiting daily.
+\item[Sept.] \TeX\ Live 2010 was released: each year the shipping date is earlier; the production process is becoming more streamlined and we congratulate all involved for their hard work. One of the most notable new components of \TeX\ Live 2010 includes the `restricted shell escape' feature to allow, among other things, automatic EPS figure conversion for pdf\LaTeX\ documents.
+\item[Oct.] TLContrib\footnote{\url{http://tlcontrib.metatex.org/}} was opened by Taco Hoekwater as a way to update a \TeX~Live installation with material that is not distributable through \verb|tlmgr| itself. Such material includes executables (e.g., new versions of Lua\TeX), non-free code, or test versions of packages.
+\item[Nov.] Philipp Lehman released the first stable version of \textsf{biblatex}. One of the most ambitious \LaTeX\ packages in recent memory, \textsf{biblatex} is a highly flexible package for managing citation cross-referencing and bibliography typesetting. In `beta' status for some years now, reaching this point is a great milestone.
+\item[Dec.] Lua\TeX\ 0.65. We are happy to see Lua\TeX\ development steadily continuing. \LaTeX\ users may use Lua\TeX\ with the \verb|lualatex| program. Like \verb|xelatex|, this allows \LaTeX\ documents to use multilingual OpenType fonts and Unicode text input.
+\end{itemize}
+
+\section{Current progress}
+
+The \textsf{expl3} programming modules continue to see revision and expansion; we have added a Lua\TeX\ module, but \textsf{expl3} continues to support all three of pdf\LaTeX, \XeLaTeX, and Lua\LaTeX\ equally.
+
+The \textsf{l3fp} module for performing floating-point arithmetic has been extended and improved. Floating point maths is important for some of the calculations required for complex box typesetting performed in the new `coffins' code.
+The \textsf{l3coffin} module has been added based on the original \textsf{xcoffins} package introduced at TUG~2010 as reported in the last news issue; this code is now available from CTAN for testing and feedback.
+
+We have consolidated the \textsf{l3int} and \textsf{l3intexpr} modules (which were separate for historical purposes); all integer/count-related functions are now contained within the `\textsf{int}' code and have prefix \verb|\int_|. Backwards compatibility is provided for, but eventually we will drop support for the older \verb|\intexpr_| function names.
+
+\section{Plans for 2011}
+
+In the following year, we plan to use the current \LaTeX3 infrastructure to continue work in building high-level code for designing \LaTeX\ documents using the \textsf{xtemplate} package. Our first priority is to look at section headings and document divisions, as we see this area as one of the most difficult, design-wise, of the areas to address. From there we will broaden our scope to more document elements.
+
+We will also do some low-level work on the `galley', which is the code that \LaTeX3 uses to build material for constructing pages, and we will continue to extend \textsf{expl3} into a more complete system from which we can, one day, create a pure \LaTeX3 format.
+
+\end{document}
+
+
+
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf
new file mode 100644
index 0000000000..a3c20b9140
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.tex b/macros/latex/contrib/l3kernel/l3news06.tex
new file mode 100644
index 0000000000..50484e6142
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news06.tex
@@ -0,0 +1,141 @@
+% Copyright 2011 The LaTeX Project
+\documentclass{ltnews}
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+}
+
+\usepackage{hologo}
+
+\publicationmonth{June}
+\publicationyear{2011}
+\publicationissue{6}
+
+\begin{document}
+\maketitle
+
+\noindent
+A key aim of releasing `stable' \LaTeX3 material to CTAN is to allow users to
+benefit from new ideas \emph{now}, and also to raise the profile of usable
+\LaTeX3 ideas. This is clearly being successful, with \pkg{xparse} being of
+particular utility to end users. This increase in interest has been
+particularly notable on the new
+\href{http://tex.stackexchange.com/}{TeX.SX Q\&A site}.
+
+\section{The \LaTeX3 Team expands}
+
+Raising interest in \LaTeX3 developments has inevitably led to feedback on
+cases where the code base has required attention. It has also attracted new
+programmers to using \LaTeX3 ideas, some more than others! Bruno Le Floch has
+over the past few months made many useful contributions to \LaTeX3, and we are
+very pleased that he has recently joined the \LaTeX3 Project.
+
+Bruno has taken a particular interest in improving the performance and
+reliability of the \pkg{expl3} language. This has already resulted in new
+implementations for the \texttt{prop} and \texttt{seq} data types. At the same
+time, he has identified and fixed several edge-case issues in core \pkg{expl3}
+macros.
+
+\section{The `Big Bang'}
+
+In parallel to Bruno's improvements, Joseph Wright initiated a series of `Big
+Bang' improvements to \LaTeX3. The aim of the Big Bang was to address a number
+of long-standing issues with the \LaTeX3 code base. Development has taken place
+over many years, with the status of some of the resulting code being less
+than clear, even to members of The \LaTeX3 Project! At the same time, different
+conventions had been applied to different parts of the code, which made reading
+some of the code rather `interesting'. A key part of the Big Bang has been to
+address these issues, cleaning up the existing code and ensuring that the
+status of each part is clear.
+
+The arrangement of \LaTeX3 code is now the same in the development
+repository and on CTAN, and splits the code into three parts.
+\begin{description}
+ \item[\pkg{l3kernel}] The core of \LaTeX3, code which
+ is expected to be used in a \LaTeX3 kernel in more or less the
+ current form. Currently, this part is made up of the \LaTeX3
+ programming layer, \pkg{expl3}.
+ \item[\pkg{l3packages}] \LaTeXe{} packages making use of \LaTeX3
+ concepts and with stable interfaces. The \pkg{xparse} and
+ \pkg{xtemplate} packages are the core of this area. While many of
+ the \emph{ideas} explored here may eventually appear in a \LaTeX3
+ kernel, the interfaces here are tied to \LaTeXe{}.
+ \item[\pkg{l3experimental}] \LaTeXe{} packages which explore more
+ experimental \LaTeX3 ideas, and which may see interface changes as
+ development continues. Over time, we expect code to move from this area
+ to either \pkg{l3kernel} or \pkg{l3packages}, as appropriate.
+\end{description}
+
+In addition to these release areas, the development code also features a
+\pkg{l3trial} section for exploring code ideas. Code in \pkg{l3trial} may be
+used to improve or replace other parts of \LaTeX3, or may simply be dropped!
+
+As well as these improvements to the \emph{code} used in \LaTeX3, much of the
+documentation for \pkg{expl3} has been made more precise as part of the Big
+Bang. This means that \texttt{source3.pdf} is now rather longer than it was
+previously, but also should mean that many of the inaccuracies in earlier
+versions have been removed. Of course, we are very pleased to receive
+suggestions for further improvement.
+
+\section{\LaTeX3 on GitHub}
+
+The core development repository for \LaTeX3 is held in an SVN repository, which
+is \href{http://www.latex-project.org/code.html}{publicly viewable \emph{via}
+the Project website}. However, this interface misses out on some of the `bells
+and whistles' of newer code-hosting sites such as
+\href{http://gitbug.com/}{GitHub} and \href{http://bitbucket.org/}{BitBucket}.
+We have therefore established a mirror of the master repository on GitHub%
+\footnote{\url{http://github.com/latex3/svn-mirror}}. This is kept in
+synchronisation with the main SVN repository by Will Robertson (or at least
+by his laptop!).
+
+The GitHub mirror offers several useful features for people who wish to
+follow the \LaTeX3 code changes. GitHub offers facilities such as highlighted
+differences and notification of changes. It also makes it possible for
+non-Team members to submit patches for \LaTeX3 as `pull requests' on
+GitHub.
+
+As well as offering a convenient interface to the \LaTeX3 code, the GitHub
+site also includes an issue database\footnote{%
+\url{http://github.com/latex3/svn-mirror/issues}}. Given the very
+active nature of \LaTeX3 development, and the transitory nature of many
+of the issues, this provides a better approach to tracking issues than
+the main \LaTeX{} bug database\footnote{\url{http://www.latex-project.org/bugs.html}}.
+Developers and users are
+therefore asked to report any issues with \LaTeX3 code \emph{via} the GitHub
+database, rather than on the main Project homepage.
+Discussion on the \href{http://www.latex-project.org/code.html}{\mbox{LaTeX-L} mailing list}
+is also encouraged.
+
+\section{Next steps}
+
+The `Big Bang' involves making a number of changes to \pkg{expl3} function
+names, and is likely to break at least some third-party code. As a result,
+the updates will not appear on the \TeX{} Live 2011 DVD release, but will
+instead be added to \TeX{} Live once regular updates restart (probably
+August).
+
+Bruno is working on a significant overhaul of the \pkg{l3fp} floating-point
+unit for \LaTeX3. He has developed an approach which allows expandable
+parsing of floating-point expressions, which will eventually allow syntax
+such as
+\begin{verbatim}
+ \fp_parse:n { 3 * 4 ( ln(5) + 1 ) }
+\end{verbatim}
+This will result in some changes in the interface for floating-point numbers, but
+we feel that the long-term benefit is worth a small amount of recoding in other
+areas.
+
+Joseph has completed documentation of the \pkg{xgalley} module, and this is
+currently being discussed. Joseph is hoping to move on to implement other
+more visible ideas based on the \pkg{xtemplate} concept over the next few
+months.
+
+\end{document}
+
+
+
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf
new file mode 100644
index 0000000000..7904107be8
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.tex b/macros/latex/contrib/l3kernel/l3news07.tex
new file mode 100644
index 0000000000..9889d5f094
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news07.tex
@@ -0,0 +1,111 @@
+% Copyright 2012 The LaTeX3 Project
+\documentclass{ltnews}
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+}
+
+\publicationmonth{February}
+\publicationyear{2012}
+\publicationissue{7}
+
+\begin{document}
+\maketitle
+
+\section{After the `Big Bang'}
+
+The last \LaTeX3 News gave details of the `Big Bang', in which the team have
+revised the layout and coverage of the \LaTeX3 codebase. This process has
+made the status of different modules clearer, so that both the team themselves
+and everyone else know what is going on.
+
+The `Big Bang' changes were not shipped to \textsc{ctan} until after the \TeX{}
+Live 2011 freeze, as we did not want to end up with a \textsc{dvd} containing
+badly broken code. The update went to \textsc{ctan} soon after \TeX{} Live 2011
+shipped, and has now propagated around the world. The new package naming
+(\pkg{l3kernel}, \pkg{l3packages} and \pkg{l3experimental}) has caused some
+surprises for a small number of users, but there have not been any major
+issues with the changes at the code level.
+
+The `Big Bang' has attracted attention from programmers outside of the
+\LaTeX3 team, with useful feedback arriving on the
+\texttt{LaTeX-L} list and TeX.sx, in particular. One area that this has
+highlighted is the need to document carefully when changes to the `stable'
+parts of the \LaTeX3 codebase occur. All changes to \pkg{l3kernel} now
+come with an explicit date for the change in the documentation, which means
+that programmers can check exactly when the features they want were introduced.
+
+Another key part of supporting \LaTeX3 use beyond the team is making it easy
+to check on the version of \LaTeX3 installed. To support that, the file date
+of the main \pkg{expl3} package is now set each time there is a release of the
+\LaTeX3 material to \textsc{ctan}. This means that the \LaTeXe{}
+\cs{@ifpackagelater} test can be used reliably to detect if the installed
+version of \LaTeX3 is going to supply the functions that a programmer is
+using.
+
+\section{Deforming boxes}
+
+Additions to both the \LaTeX3 stable material and more experimental modules
+continue. Joseph Wright has been working on adding `native' drivers for
+\LaTeX3 to support box transformations. These allow box rotation, clipping
+and scaling with the drivers \texttt{dvips}, \texttt{xdvipdfmx} and direct
+\textsc{pdf} output.
+
+The development of clipping support for the \texttt{xdvipdfmx} driver has also allowed
+us to suggest improvements to the \LaTeXe{} graphics drivers, enabling clipping
+with the \XeTeX{} engine.
+
+\section{A TeX-based regex engine}
+
+Bruno Le Floch has been %working across the codebase, %% omitted to avoid page break
+improving the efficiency
+and robustness of a number of \LaTeX3 functions. Most notably, he has
+created a purely \TeX{}-based regular expression (regex) system for \LaTeX3.
+This is currently experimental, but is already proving useful and will
+hopefully stabilise over the coming months.
+
+Bruno's regex system works with all of the supported engines (pdf\TeX{},
+\XeTeX{} and \LuaTeX{}). He has implemented the core ideas of standard
+regex systems, along with some \TeX{}-specifics to allow matching and
+replacing
+the content of token lists % correct?
+by category code.
+
+\section{\pkg{xparse} improves}
+
+The \pkg{xparse} module has been overhauled, making the internal code
+more efficient and adding additional argument types. This has also allowed
+us to deal with a number of internal bugs, meaning that argument grabbing
+is now more reliable.
+
+The argument grabbers themselves have been reworked so that in the event of an error,
+the user will normally get a meaningful message from \TeX{} rather than
+one pointing to \pkg{xparse} internal function names. This should help
+in tracking down erroneous input in real documents.
+
+\section{The galley}
+
+As detailed in the last issue, work on the galley module has been continuing.
+Discussion of Joseph's reimplementation of the galley concepts highlighted
+some important areas to work on, with the nature of the template concept
+being particularly significant.
+
+More work is still needed to finalise the galley concepts, but it is clear that
+some of this will require feedback from other areas. Joseph therefore hopes
+to finish work on the current round of galley improvements by the end of
+February, and to return to them once some other areas have been addressed.
+
+\section{Relationships between document items}
+
+The \textsc{tug}2011 meeting took place in October in India. Frank Mittelbach
+spoke there about ideas for describing the design relationship between document elements.
+% omit calling it "ldb" here because that name will likely change (last I heard?)
+These ideas allow a document designer to specify the design of a document element
+based on its context within a document, and progress in this area will likely
+lead to an extension in the \pkg{xtemplate} system.
+
+\end{document}
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf
new file mode 100644
index 0000000000..7a076e7bef
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.tex b/macros/latex/contrib/l3kernel/l3news08.tex
new file mode 100644
index 0000000000..17107f8360
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news08.tex
@@ -0,0 +1,170 @@
+% Copyright 2012 The LaTeX3 Project
+\documentclass{ltnews}
+
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+}
+
+\usepackage{expl3,siunitx,catchfile}
+\usepackage{hologo}
+\usepackage{verbatim}% avoid ltnews' "special" verbatim processing
+
+\publicationmonth{July}
+\publicationyear{2012}
+\publicationissue{8}
+
+\def\DTX{\texttt{.dtx}}
+\def\STY{\texttt{.sty}}
+
+\ExplSyntaxOn
+\NewDocumentCommand { \calcnum } { m }
+ { \num { \fp_to_scientific:n {#1} } }
+\ExplSyntaxOff
+
+\begin{document}
+\maketitle
+
+\raisefirstsection
+\section{Extended floating point support}
+
+Bruno Le Floch has been re-writing the floating point module to function in an `expandable' manner. This allows floating point calculations to be computed far more flexibly and efficiently than before.
+The expandable nature of the new code allows its use inside operations such as writing to external files, for which previously any such calculations would have to be pre-calculated before any of the writing operations began.
+
+Bruno's work on the floating point module has been officially released into the main \textsc{svn} repository for \texttt{l3kernel}; \TeX\ Live 2012 will contain the `old' code for stability while this year is spent testing the new code in production environments and ironing out any wrinkles.
+
+Here's a neat example as suggested in the documentation, which produces `\calcnum { round ( 200 pi * sin ( 2.3 ^ 5 ) , 2 ) }':
+
+\begin{verbatim}
+\usepackage{xparse, siunitx}
+\ExplSyntaxOn
+\NewDocumentCommand { \calcnum } { m }
+ { \num { \fp_to_scientific:n {#1} } }
+\ExplSyntaxOff
+
+\calcnum {
+ round ( 200 pi * sin ( 2.3 ^ 5 ) , 2 )
+}
+\end{verbatim}
+
+This feature is invaluable for simple (and not-so-simple) calculations in document and package authoring, and has been lacking a robust solution for many years.
+While \hologo{LuaLaTeX} can perform similar tasks within its Lua environment, the floating point support is written using the \texttt{expl3} programming language only, and is thus available in \hologo{pdfLaTeX} and \hologo{XeLaTeX} as well.
+
+\section{Regular expressions in \TeX}
+
+As if expandable floating point support wasn't enough, Bruno has also written a complete regular expression engine in \texttt{expl3} as well.
+% [Ed: Consider my mind blown.]
+Many reading this will be familiar with the quote attributed to Jamie Zawinski:
+\begin{quote}\itshape
+Some people, when confronted with a problem, think
+``I know, I'll use regular expressions.''
+Now they have two problems.
+\end{quote}
+And as humorous as the saying is, it's still fair to say that regular expressions are a great tool for manipulating streams of text.
+We desperately hope that people will \emph{not} start using the regex code to do things like parse \textsc{xml} documents; however, for general search--replace duties, there's never been anything like \texttt{l3regex} for the \LaTeX\ world.
+As a trivial example, there are
+\CatchFileDef\thisfile{\jobname.tex}{}%
+\ExplSyntaxOn
+\exp_args:Nno \regex_count:nnN { \b (?i) W e \b } {\thisfile} \l_tmpa_int
+\int_use:N \l_tmpa_int
+\ExplSyntaxOff
+~instances of the word `We' or `we' in this document (including those two).
+This value is counted automatically in two lines of code.
+
+And again, it is available for \hologo{pdfLaTeX} and \hologo{XeLaTeX} users as well as \hologo{LuaLaTeX} ones; it also bears noting that this provides an easy solution for applying regular expression processing to \LaTeX\ documents and text data even on the Windows operating system that does not have native support for such things.
+
+
+\section{Separating internal and external code}
+
+\LaTeX\ packages are written by a wide range of package authors and consist of code and commands for various purposes.
+Some of these commands will be intended for use by document authors (such as \verb|\pbox| from the \textsf{pbox} package); others are intended for use by other package writers (such as \verb|\@ifmtarg| from the \textsf{ifmtarg} package).
+
+However, a large portion of them are internal, i.e., are intended to
+be used only within the package or within the \LaTeX{} kernel and
+should not be used elsewhere. For example, \verb|\@float| is the
+\LaTeX{} kernel interface for floats to be used in class files, but
+the actual work is done by a command called \verb|\@xfloat| which
+should not be used directly. Unfortunately the \LaTeXe{} language
+makes no clear distinction between the two, so it is tempting for
+programmers to directly call the latter to save some ``unnecessary''
+parsing activity.
+
+The downside of this is that the ``internal'' commands suddenly act as
+interfaces and a reimplementation or fix in any of them would then
+break add-on packages as they rely on internal behavior. Over the
+course of the last twenty years probably 80\% of such ``internal''
+commands have found their way into one or another package. The
+consequences of this is that nowadays it is next to impossible to
+change anything in the \LaTeXe{} kernel (even if it is clearly just an
+internal command) without breaking something.
+
+
+In \LaTeX3 we hope to improve this situation drastically by
+clearly separating public interfaces (that extension packages can use
+and rely on) and private functions and variables (that should not
+appear outside of their module). There is (nearly) no way to enforce
+this without severe computing overhead, so we implement it only
+through a naming convention, and some support mechanisms. However, we
+think that this naming convention is easy to understand and to follow,
+so that we are confident that this will be adopted and provides the
+desired results.
+
+\subsection{Naming convention for internals}
+
+We've been throwing around some ideas for this for a number of years but nothing quite fit; the issue comes down to the fact that \TeX\ does not have a `name-spacing' mechanism so any internal command needs to have a specific prefix to avoid clashing with other packages' commands.
+The prefix we have finally decided on for \textsf{expl3} code is a double underscore, such that functions like \verb|\seq_count:N| are intended for external use and \verb|\__seq_item:n| is an internal command that should not be used or relied upon by others.
+
+All this is well and good, but it can be inconvenient to type long prefixes such as \verb|\__seq_| before all command names, especially in a package for which nearly \emph{all} package functions are internal.
+
+We therefore also extended \textsf{DocStrip} slightly by adding a `shorthand' for internal package prefixes.
+Commands and variables in \DTX\ code may now contain \texttt{@@} which is expanded to the function prefix when the \STY\ file is extracted.
+As an example, writing
+\begin{verbatim}
+ %<@@=seq>
+ \cs_new:Npn \@@_item:n
+ ...
+\end{verbatim}
+is equivalent to
+\begin{verbatim}
+ \cs_new:Npn \__seq_item:n
+ ...
+\end{verbatim}
+There are clear advantages to this syntax.
+Function names are shorter and therefore easier to type, and code can still be prototyped using the \texttt{@@} syntax
+(e.g., pasting code between a \DTX\ file and a regular \texttt{.tex} document).
+Most importantly, it is explicitly clear from the code source which commands are intended to be used externally and which should be avoided.
+
+We hope that this syntax will prove popular; in our initial experiments we think it works very well. In fact we found a good number of smaller errors when being forced to think about what is internal and what is an external function.
+
+\section{Continual revolution---the `small bang'}
+
+In addition to the major additions introduced above, Frank Mittelbach has been examining \texttt{expl3} with a fresh eye to resolve any outstanding issues in the consistency or logic of the names of functions.
+
+We are very mindful of the fact that for people to find \texttt{expl3} a useful tool, it must have a stable interface.
+This said, there are still some musty corners that we can show where people simply haven't been using certain functions.
+In select cases, we're re-assessing whether all of the (sometimes esoteric) odds and ends that have been added to \texttt{expl3} really belong; in other cases, it's now clear that some naming or behaviour choices weren't correct the first time around.
+
+To address this tarnish, we're carefully making some minor changes to parts of the \texttt{expl3} interface and we'd like to allay any fears that \texttt{expl3} isn't stable.
+The \texttt{expl3} language now offers a wide range of functions plus their variants, and we're talking about changing but a very small percentage of these, and not common ones at that.
+We don't want it to become a mess, so we think it's better to tidy things up as we go.
+Follow the \texttt{LaTeX-L} mailing list for such details as they arise.
+
+\end{document}
+
+
+dropped/replaced:
+
+The \LaTeX3 codebases ranges between these two extremes; the packages
+in \texttt{l3packages} are largely the former while the modules
+composing \textsf{expl3} are largely the latter type. In both cases,
+the `external' commands (whether for document author or package
+writer) are usually defined in terms of other internal package
+commands that should not be used by anyone else, but often when
+reading the internal package code it's not always clear which is
+which.
+
+For \LaTeX3 we are experimenting with an extension to the \textsf{DocStrip} mechanism to provide a clear distinction between internal and external package commands.
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf
new file mode 100644
index 0000000000..4f6b2ca8f3
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.tex b/macros/latex/contrib/l3kernel/l3news09.tex
new file mode 100644
index 0000000000..c0982a94a6
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news09.tex
@@ -0,0 +1,1433 @@
+% Copyright 2014 The LaTeX3 Project
+\documentclass{ltnews}
+
+\PassOptionsToPackage{colorlinks}{hyperref}
+\usepackage{metalogo,ragged2e}
+
+\AtBeginDocument{
+ \renewcommand{\LaTeXNews}{\LaTeX3~News}
+ \RaggedRight
+ \setlength\parindent{1em}
+}
+
+\hbadness=10000
+\def\Dash{\,---\,}
+
+\providecommand\LuaLaTeX{Lua\LaTeX}
+\setcounter{tocdepth}{2}
+
+\usepackage{enumitem,csquotes}
+\MakeOuterQuote{"}
+\usepackage{fancyvrb}% to allow \Verb"<ul>" to typeset properly since ltnews patches \verb
+
+\makeatletter
+\renewcommand{\@subheadingfont}{%
+ \sffamily\slshape
+ \let\LaTeX\cmssLaTeX\let\TeX\cmssTeX
+}
+\renewcommand{\subsection}{%
+ \@startsection
+ {subsection}{2}{\z@}{-1.3ex \@plus -1ex \@minus -.2ex}%
+ {0.8ex \@plus.2ex}{\@subheadingfont}%
+}
+\makeatother
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{tikz}
+\definecolor{basecolor}{RGB}{0,128,128}
+\definecolor{maincolor}{RGB}{55,200,113}
+
+
+\newcommand \explbanner{%
+\begin{tikzpicture}[y=0.80pt,x=0.80pt,yscale=-1, inner sep=0pt, outer sep=0pt]
+ \path[fill=basecolor,rounded corners=0.0000cm] (248.7785,295.7529) rectangle
+ (465.3586,478.5802);
+ \path[fill=white,rounded corners=0.0000cm] (257.9199,304.5427) rectangle
+ (456.2172,469.7905);
+ \path[fill=basecolor] (283.2386,478.5760) -- (289.5259,453.4125) .. controls
+ (302.2770,439.6121) and (314.0060,425.3008) .. (319.5695,407.9067) .. controls
+ (355.0759,401.0374) and (383.7853,403.5174) .. (413.7371,404.2858) .. controls
+ (411.0072,403.8309) and (322.2852,388.7992) .. (322.2852,388.7992) .. controls
+ (298.7181,356.5528) and (264.6380,373.5409) .. (249.0663,403.2205) --
+ (248.7470,478.6397) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=1.253pt]
+ (288.4249,394.4251) -- (288.2061,394.8313) .. controls (287.2860,396.5455) and
+ (285.7381,397.6863) .. (283.5499,398.3938) .. controls (281.3616,399.1013) and
+ (278.5647,399.3476) .. (275.2999,399.2063) -- (273.2374,399.1126) --
+ (274.7061,400.5501) .. controls (275.4640,401.2791) and (275.6960,401.8541) ..
+ (275.7061,402.3626) .. controls (275.7162,402.8712) and (275.5103,403.4284) ..
+ (275.0186,404.0501) .. controls (274.0353,405.2935) and (272.0593,406.6472) ..
+ (270.2374,408.0189) -- (269.6749,408.4564) -- (270.0499,409.0501) .. controls
+ (271.5698,411.3818) and (272.2617,413.2035) .. (272.4249,414.5814) .. controls
+ (272.5880,415.9592) and (272.2796,416.9162) .. (271.6436,417.7689) .. controls
+ (270.3717,419.4743) and (267.6257,420.6198) .. (265.1124,422.0501) --
+ (264.6124,422.3314) -- (264.7061,422.8626) .. controls (264.9221,424.1742) and
+ (264.5793,425.2316) .. (263.6436,426.3001) .. controls (262.7079,427.3687) and
+ (261.1571,428.4020) .. (259.0498,429.3001) -- (258.4873,429.5189) --
+ (258.5810,430.1126) .. controls (259.0013,432.9207) and (259.8134,435.3978) ..
+ (261.5810,436.9564) .. controls (263.1945,438.3790) and (265.6272,438.7418) ..
+ (268.7373,438.1126) .. controls (269.2811,441.1124) and (270.0885,443.8463) ..
+ (271.8935,445.6439) .. controls (273.7365,447.4793) and (276.5967,448.0631) ..
+ (280.5185,447.0189) .. controls (281.3879,449.0885) and (282.6104,450.5771) ..
+ (284.0498,451.5501) .. controls (285.6426,452.6269) and (287.4312,453.1746) ..
+ (289.1435,453.7064) -- (289.5810,452.2376) .. controls (287.8816,451.7099) and
+ (286.2778,451.1522) .. (284.9248,450.2376) .. controls (283.5718,449.3230) and
+ (282.4412,448.0628) .. (281.6748,445.8939) -- (281.4248,445.1751) --
+ (280.7060,445.3939) .. controls (276.7309,446.6155) and (274.5047,446.0613) ..
+ (272.9873,444.5501) .. controls (271.4699,443.0389) and (270.6337,440.3179) ..
+ (270.1123,437.1439) -- (269.9873,436.3001) -- (269.1435,436.5189) .. controls
+ (265.8672,437.3737) and (263.9323,436.9328) .. (262.6123,435.7689) .. controls
+ (261.3919,434.6928) and (260.6559,432.7860) .. (260.2373,430.4251) .. controls
+ (262.1657,429.5404) and (263.7732,428.5395) .. (264.8310,427.3314) .. controls
+ (265.8589,426.1576) and (266.3097,424.7444) .. (266.2373,423.2376) .. controls
+ (268.5457,421.9725) and (271.2938,420.8514) .. (272.8935,418.7064) .. controls
+ (273.7344,417.5788) and (274.1920,416.1226) .. (273.9873,414.3939) .. controls
+ (273.8023,412.8317) and (273.0178,411.0042) .. (271.7060,408.8626) .. controls
+ (273.3411,407.6578) and (275.1128,406.4408) .. (276.2373,405.0189) .. controls
+ (276.8610,404.2302) and (277.3196,403.3287) .. (277.2998,402.3314) .. controls
+ (277.2890,401.7896) and (277.0912,401.2653) .. (276.7998,400.7376) .. controls
+ (279.5102,400.7514) and (281.9952,400.5582) .. (284.0498,399.8939) .. controls
+ (286.3053,399.1646) and (288.0426,397.8495) .. (289.2060,396.0189) .. controls
+ (292.5635,396.0371) and (296.0636,396.7806) .. (299.5810,397.2376) .. controls
+ (303.1955,397.7073) and (306.8484,397.8601) .. (310.3310,396.3314) --
+ (309.7060,394.8939) .. controls (306.6247,396.2464) and (303.2846,396.1632) ..
+ (299.7685,395.7064) .. controls (296.2524,395.2495) and (292.5819,394.3984) ..
+ (288.8935,394.4251) -- (288.4248,394.4251) -- cycle;
+ \path[fill=white] (301.5159,393.8637) .. controls (301.5159,397.5244) and
+ (298.5484,400.4920) .. (294.8877,400.4920) .. controls (291.2270,400.4920) and
+ (288.2595,397.5244) .. (288.2595,393.8637) .. controls (288.2595,390.2031) and
+ (291.2270,387.2355) .. (294.8877,387.2355) .. controls (298.5484,387.2355) and
+ (301.5159,390.2031) .. (301.5159,393.8637) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=1.253pt]
+ (321.0186,387.9251) .. controls (315.0680,395.6662) and (313.8600,393.4088) ..
+ (310.2374,394.7063) -- (309.6124,394.9251) -- (309.7374,395.5813) .. controls
+ (311.1321,403.3566) and (315.5160,405.7238) .. (319.1124,408.5501) --
+ (320.0811,407.3313) .. controls (316.4798,404.5012) and (312.9249,402.6094) ..
+ (311.4874,396.0188) .. controls (314.1361,395.3813) and (316.6278,396.2007) ..
+ (322.2686,388.8626) -- (321.0186,387.9251) -- cycle;
+ \path[fill=maincolor] (301.5159,393.8637) .. controls (301.5159,397.5244) and
+ (298.5484,400.4920) .. (294.8877,400.4920) .. controls (291.2270,400.4920) and
+ (288.2595,397.5244) .. (288.2595,393.8637) .. controls (288.2595,390.2031) and
+ (291.2270,387.2355) .. (294.8877,387.2355) .. controls (298.5484,387.2355) and
+ (301.5159,390.2031) .. (301.5159,393.8637) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=1.253pt]
+ (294.8936,386.4563) .. controls (290.8098,386.4563) and (287.4874,389.7788) ..
+ (287.4874,393.8626) .. controls (287.4874,397.9464) and (290.8098,401.2688) ..
+ (294.8936,401.2688) .. controls (298.9774,401.2688) and (302.2999,397.9464) ..
+ (302.2999,393.8626) .. controls (302.2999,389.7788) and (298.9774,386.4563) ..
+ (294.8936,386.4563) -- cycle(294.8936,388.0188) .. controls
+ (298.1312,388.0188) and (300.7374,390.6250) .. (300.7374,393.8626) .. controls
+ (300.7374,397.1002) and (298.1312,399.7063) .. (294.8936,399.7063) .. controls
+ (291.6560,399.7063) and (289.0499,397.1002) .. (289.0499,393.8626) .. controls
+ (289.0499,390.6250) and (291.6560,388.0188) .. (294.8936,388.0188) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=1.253pt]
+ (291.5499,370.7063) .. controls (288.4841,370.7722) and (285.4193,371.2673) ..
+ (282.4249,372.1438) .. controls (269.6164,375.8932) and (256.6677,387.2311) ..
+ (248.7622,400.8596) -- (248.7662,404.0176) .. controls (256.4832,389.5161) and
+ (269.8419,377.4553) .. (282.8625,373.6438) .. controls (286.1465,372.6825) and
+ (289.4914,372.1880) .. (292.8312,372.2376) .. controls (302.8507,372.3862) and
+ (312.9146,377.4187) .. (321.6437,389.3626) -- (321.8312,389.6126) --
+ (322.1437,389.6751) .. controls (322.1437,389.6751) and (383.4924,400.0668) ..
+ (402.2375,403.2376) .. controls (376.3035,402.3430) and (350.4290,401.2333) ..
+ (319.3937,407.2376) -- (318.9250,407.3313) -- (318.8000,407.7688) .. controls
+ (313.2958,424.9775) and (301.6553,439.2096) .. (288.9250,452.9875) --
+ (288.8000,453.1125) -- (288.7375,453.3313) -- (282.4611,478.5810) --
+ (283.9307,478.5810) -- (290.2375,453.8937) .. controls (302.8375,440.2444) and
+ (314.4843,426.0036) .. (320.1437,408.7062) .. controls (355.3332,401.9651) and
+ (383.8501,404.4090) .. (413.7062,405.1750) -- (413.8312,403.6125) .. controls
+ (413.8282,403.6120) and (413.7403,403.6129) .. (413.7375,403.6125) .. controls
+ (410.8928,403.1379) and (323.2219,388.2676) .. (322.6750,388.1750) .. controls
+ (313.7728,376.1342) and (303.2902,370.9006) .. (292.8625,370.7062) .. controls
+ (292.4247,370.6982) and (291.9880,370.6972) .. (291.5500,370.7062) -- cycle;
+ \path[fill=maincolor,miter limit=4.00,line width=0.977pt] (370.0353,433.6332) --
+ (333.5033,433.6332) -- (333.5033,428.6205) .. controls (334.6678,428.5193) and
+ (335.9083,428.4180) .. (337.2248,428.3167) .. controls (338.5413,428.1648) and
+ (339.6299,427.9623) .. (340.4907,427.7091) .. controls (341.9084,427.2534) and
+ (342.9717,426.4686) .. (343.6806,425.3547) .. controls (344.3895,424.1901) and
+ (344.7439,422.6964) .. (344.7439,420.8736) -- (344.7439,334.1385) .. controls
+ (344.7439,332.3158) and (344.3388,330.6195) .. (343.5287,329.0498) .. controls
+ (342.7692,327.4296) and (341.7565,326.1638) .. (340.4907,325.2523) .. controls
+ (339.5793,324.6448) and (337.9084,324.0878) .. (335.4780,323.5814) .. controls
+ (333.0476,323.0752) and (331.0982,322.7714) .. (329.6298,322.6700) --
+ (329.6298,317.8092) -- (357.8073,316.0623) -- (358.8706,317.2016) --
+ (358.8706,419.9622) .. controls (358.8706,421.7344) and (359.1997,423.2028) ..
+ (359.8580,424.3673) .. controls (360.5162,425.4813) and (361.5795,426.3420) ..
+ (363.0479,426.9496) .. controls (364.1618,427.4560) and (365.2504,427.8357) ..
+ (366.3138,428.0889) .. controls (367.4277,428.3420) and (368.6682,428.5193) ..
+ (370.0353,428.6205) -- (370.0353,433.6332);
+ \path[color=black,fill=white,nonzero rule,line width=0.977pt]
+ (357.7812,315.4375) -- (329.5938,317.1875) -- (329.0312,317.2500) --
+ (329.0312,317.8125) -- (329.0312,322.6562) -- (329.0312,323.2500) --
+ (329.5938,323.2813) .. controls (331.0155,323.3795) and (332.9294,323.6847) ..
+ (335.3438,324.1875) .. controls (337.7273,324.6842) and (339.3512,325.2404) ..
+ (340.1250,325.7500) .. controls (340.1300,325.7530) and (340.1517,325.7471) ..
+ (340.1563,325.7500) .. controls (341.3216,326.5942) and (342.2496,327.7784) ..
+ (342.9688,329.3125) -- (343.0001,329.3438) .. controls (343.7660,330.8280) and
+ (344.1251,332.3928) .. (344.1251,334.1251) -- (344.1251,420.8751) .. controls
+ (344.1251,422.6188) and (343.7916,423.9876) .. (343.1563,425.0313) .. controls
+ (342.5262,426.0216) and (341.6206,426.7047) .. (340.3126,427.1251) .. controls
+ (339.5087,427.3615) and (338.4639,427.5701) .. (337.1876,427.7188) .. controls
+ (337.1753,427.7198) and (337.1687,427.7178) .. (337.1563,427.7188) .. controls
+ (335.8502,427.8194) and (334.5947,427.8995) .. (333.4375,428.0001) --
+ (332.9063,428.0626) -- (332.9063,428.6251) -- (332.9063,433.6251) --
+ (332.9063,434.2501) -- (333.5000,434.2501) -- (370.0313,434.2501) --
+ (370.0313,433.6251) -- (370.6563,433.6251) -- (370.6563,428.6251) --
+ (370.6563,428.0626) -- (370.0938,428.0001) .. controls (368.7631,427.9015) and
+ (367.5404,427.7420) .. (366.4688,427.5001) .. controls (366.4598,427.4981) and
+ (366.4466,427.5021) .. (366.4375,427.5001) .. controls (365.4251,427.2570) and
+ (364.3851,426.8939) .. (363.3125,426.4063) -- (363.2812,426.3750) .. controls
+ (361.9048,425.8055) and (360.9567,425.0472) .. (360.3750,424.0625) .. controls
+ (359.7820,423.0135) and (359.4687,421.6654) .. (359.4687,419.9688) --
+ (359.4687,317.1875) -- (359.4687,316.9688) -- (359.3125,316.7813) --
+ (358.2500,315.6563) -- (358.0625,315.4375) -- (357.7812,315.4375) --
+ cycle(357.5625,316.6875) -- (358.2500,317.4062) -- (358.2500,419.9688) ..
+ controls (358.2500,421.8165) and (358.5889,423.3762) .. (359.3125,424.6562) --
+ (359.3438,424.6875) .. controls (360.0742,425.9238) and (361.2340,426.8546) ..
+ (362.7813,427.5000) .. controls (362.7903,427.5041) and (362.8037,427.4960) ..
+ (362.8126,427.5000) .. controls (363.9485,428.0145) and (365.0908,428.4264) ..
+ (366.1876,428.6875) .. controls (367.1668,428.9101) and (368.2823,429.0175) ..
+ (369.4376,429.1250) -- (369.4376,433.0313) -- (334.1251,433.0313) --
+ (334.1251,429.1875) .. controls (335.1314,429.1017) and (336.1652,429.0234) ..
+ (337.2813,428.9375) .. controls (338.6211,428.7830) and (339.7464,428.5489) ..
+ (340.6563,428.2813) -- (340.6876,428.2813) .. controls (342.2151,427.7903) and
+ (343.4000,426.9252) .. (344.1876,425.6875) .. controls (344.9701,424.4021) and
+ (345.3439,422.7770) .. (345.3439,420.8750) -- (345.3439,334.1250) .. controls
+ (345.3439,332.2119) and (344.9169,330.4366) .. (344.0626,328.7813) --
+ (344.0939,328.7813) .. controls (343.2978,327.0829) and (342.2020,325.7280) ..
+ (340.8439,324.7500) .. controls (339.7893,324.0471) and (338.0571,323.4821) ..
+ (335.5939,322.9688) .. controls (333.3923,322.5102) and (331.6955,322.2871) ..
+ (330.2502,322.1563) -- (330.2502,318.3750) -- (357.5627,316.6875) -- cycle;
+ \path[fill=basecolor,miter limit=4.00,line width=0.977pt] (411.1244,461.3551) ..
+ controls (406.3648,461.3550) and (402.0103,460.7474) .. (398.0609,459.5323) ..
+ controls (394.1115,458.3677) and (390.7191,456.7727) .. (387.8836,454.7474) ..
+ controls (385.0481,452.7220) and (382.8456,450.3929) .. (381.2759,447.7600) ..
+ controls (379.7569,445.1270) and (378.9974,442.4181) .. (378.9974,439.6333) ..
+ controls (378.9974,437.1523) and (379.6050,434.9244) .. (380.8202,432.9497) ..
+ controls (382.0354,430.9244) and (383.9848,429.9117) .. (386.6684,429.9117) ..
+ controls (389.7064,429.9117) and (392.0102,430.6712) .. (393.5799,432.1902) ..
+ controls (395.2001,433.6586) and (396.0103,435.3548) .. (396.0103,437.2789) ..
+ controls (396.0103,438.8991) and (395.7318,440.9498) .. (395.1748,443.4308) ..
+ controls (394.6685,445.9118) and (394.2634,447.6840) .. (393.9596,448.7473) ..
+ controls (394.3140,449.2030) and (394.9470,449.8106) .. (395.8584,450.5701) ..
+ controls (396.8204,451.3296) and (397.9850,452.0132) .. (399.3521,452.6208) ..
+ controls (400.9723,453.3803) and (402.6686,453.9879) .. (404.4408,454.4436) ..
+ controls (406.2129,454.8993) and (408.7192,455.1271) .. (411.9598,455.1272) ..
+ controls (414.9978,455.1271) and (417.9092,454.6208) .. (420.6941,453.6081) ..
+ controls (423.5295,452.5955) and (426.0106,450.9752) .. (428.1372,448.7473) ..
+ controls (430.3650,446.4182) and (432.0866,443.6840) .. (433.3018,440.5447) ..
+ controls (434.5676,437.4561) and (435.2005,433.3801) .. (435.2006,428.3167) ..
+ controls (435.2005,425.5825) and (434.8967,422.8736) .. (434.2892,420.1901) ..
+ controls (433.7322,417.5065) and (432.6689,415.1774) .. (431.0993,413.2026) ..
+ controls (429.5296,411.2280) and (427.3777,409.7090) .. (424.6435,408.6456) ..
+ controls (421.9599,407.5317) and (418.5421,406.9747) .. (414.3902,406.9747) --
+ (404.4408,406.9747) -- (404.4408,398.2404) -- (411.0484,398.2404) .. controls
+ (418.0358,398.2405) and (423.0738,396.3164) .. (426.1625,392.4682) .. controls
+ (429.2511,388.6201) and (430.7954,382.8226) .. (430.7955,375.0756) .. controls
+ (430.7954,368.7465) and (429.3017,363.9870) .. (426.3144,360.7970) .. controls
+ (423.3270,357.5565) and (419.0991,355.9363) .. (413.6307,355.9362) .. controls
+ (410.9978,355.9363) and (408.8205,356.2654) .. (407.0990,356.9235) .. controls
+ (405.4281,357.5312) and (404.0610,358.1388) .. (402.9977,358.7463) .. controls
+ (401.7318,359.4553) and (400.6939,360.2401) .. (399.8838,361.1008) .. controls
+ (399.0736,361.9616) and (398.4660,362.5946) .. (398.0609,362.9995) .. controls
+ (398.4153,364.6199) and (398.8457,366.6199) .. (399.3521,368.9996) .. controls
+ (399.8584,371.3288) and (400.1116,373.5567) .. (400.1116,375.6832) .. controls
+ (400.1116,377.5567) and (399.3014,379.2529) .. (397.6812,380.7719) .. controls
+ (396.1115,382.2403) and (393.7824,382.9745) .. (390.6938,382.9744) .. controls
+ (388.0102,382.9745) and (386.0355,382.0125) .. (384.7697,380.0883) .. controls
+ (383.5544,378.1643) and (382.9468,375.9365) .. (382.9469,373.4047) .. controls
+ (382.9468,370.7718) and (383.6810,368.0883) .. (385.1494,365.3540) .. controls
+ (386.6178,362.6199) and (388.7950,360.0629) .. (391.6811,357.6830) .. controls
+ (394.5672,355.3033) and (398.0862,353.3793) .. (402.2382,351.9108) .. controls
+ (406.3901,350.4425) and (411.1750,349.7083) .. (416.5928,349.7083) .. controls
+ (422.8207,349.7083) and (427.9599,350.6451) .. (432.0107,352.5184) .. controls
+ (436.1119,354.3413) and (439.3271,356.5692) .. (441.6564,359.2020) .. controls
+ (443.9348,361.7844) and (445.5044,364.4933) .. (446.3653,367.3287) .. controls
+ (447.2260,370.1642) and (447.6564,372.5947) .. (447.6564,374.6199) .. controls
+ (447.6563,377.1517) and (447.3019,379.7087) .. (446.5931,382.2909) .. controls
+ (445.8842,384.8226) and (444.7196,387.1771) .. (443.0994,389.3543) .. controls
+ (441.3272,391.7341) and (438.9727,393.9113) .. (436.0360,395.8860) .. controls
+ (433.1499,397.8101) and (429.5043,399.3797) .. (425.0992,400.5949) --
+ (425.0992,401.8101) .. controls (427.9346,402.0633) and (430.9473,402.6962) ..
+ (434.1373,403.7089) .. controls (437.3778,404.7216) and (440.2892,406.2152) ..
+ (442.8716,408.1899) .. controls (445.5551,410.2659) and (447.7576,412.9495) ..
+ (449.4792,416.2406) .. controls (451.2007,419.4812) and (452.0615,423.6078) ..
+ (452.0615,428.6205) .. controls (452.0615,438.3422) and (448.1627,446.2156) ..
+ (440.3652,452.2410) .. controls (432.5676,458.3170) and (422.8207,461.3550) ..
+ (411.1244,461.3551);
+ \path[color=black,fill=white,nonzero rule,line width=0.977pt]
+ (416.5938,349.0938) .. controls (411.1208,349.0938) and (406.2619,349.8476) ..
+ (402.0312,351.3438) .. controls (397.8235,352.8319) and (394.2307,354.7869) ..
+ (391.2812,357.2188) .. controls (388.3458,359.6393) and (386.1373,362.2465) ..
+ (384.6250,365.0625) .. controls (383.1180,367.8687) and (382.3437,370.6599) ..
+ (382.3438,373.4062) .. controls (382.3437,376.0357) and (382.9702,378.3800) ..
+ (384.2500,380.4062) -- (384.2500,380.4375) .. controls (385.6247,382.5272) and
+ (387.8580,383.5938) .. (390.6875,383.5938) .. controls (393.8729,383.5938) and
+ (396.3782,382.8237) .. (398.0938,381.2188) .. controls (399.8054,379.6142) and
+ (400.7187,377.7371) .. (400.7188,375.6875) .. controls (400.7187,373.5126) and
+ (400.4520,371.2419) .. (399.9375,368.8750) .. controls (399.4598,366.6301) and
+ (399.0615,364.7892) .. (398.7188,363.2188) .. controls (399.1249,362.8074) and
+ (399.6263,362.2937) .. (400.3438,361.5313) .. controls (401.1024,360.7253) and
+ (402.0588,359.9659) .. (403.2812,359.2813) -- (403.3125,359.2813) .. controls
+ (404.3323,358.6986) and (405.6639,358.0996) .. (407.3125,357.5000) .. controls
+ (408.9371,356.8790) and (411.0429,356.5314) .. (413.6250,356.5313) .. controls
+ (418.9728,356.5314) and (423.0134,358.1148) .. (425.8750,361.2188) .. controls
+ (428.7247,364.2617) and (430.1875,368.8295) .. (430.1875,375.0625) .. controls
+ (430.1875,382.7284) and (428.6509,388.4017) .. (425.6875,392.0938) .. controls
+ (422.7395,395.7667) and (417.9378,397.6251) .. (411.0625,397.6250) --
+ (404.4375,397.6250) -- (403.8438,397.6250) -- (403.8438,398.2500) --
+ (403.8438,406.9688) -- (403.8438,407.5938) -- (404.4375,407.5938) --
+ (414.3750,407.5938) .. controls (418.4724,407.5938) and (421.8256,408.1476) ..
+ (424.4063,409.2188) -- (424.4376,409.2188) .. controls (427.0895,410.2502) and
+ (429.1296,411.7125) .. (430.6251,413.5938) .. controls (432.1327,415.4906) and
+ (433.1477,417.7115) .. (433.6876,420.3125) .. controls (434.2853,422.9526) and
+ (434.5938,425.6236) .. (434.5938,428.3125) .. controls (434.5938,433.3250) and
+ (433.9715,437.3322) .. (432.7501,440.3125) -- (432.7188,440.3125) .. controls
+ (431.5305,443.3821) and (429.8590,446.0423) .. (427.6875,448.3125) .. controls
+ (425.6226,450.4758) and (423.2475,452.0501) .. (420.5000,453.0313) .. controls
+ (417.7822,454.0196) and (414.9389,454.5313) .. (411.9688,454.5313) .. controls
+ (408.7568,454.5313) and (406.2790,454.2771) .. (404.5938,453.8438) .. controls
+ (402.8574,453.3973) and (401.2103,452.8056) .. (399.6250,452.0625) --
+ (399.5938,452.0625) .. controls (398.2643,451.4717) and (397.1638,450.8152) ..
+ (396.2500,450.0938) .. controls (395.4421,449.4205) and (394.9503,448.9158) ..
+ (394.6250,448.5313) .. controls (394.9285,447.4218) and (395.3093,445.8751) ..
+ (395.7812,443.5625) .. controls (396.3444,441.0538) and (396.6250,438.9715) ..
+ (396.6250,437.2813) .. controls (396.6250,435.1859) and (395.7186,433.3075) ..
+ (394.0000,431.7500) .. controls (392.2889,430.0942) and (389.7960,429.3125) ..
+ (386.6562,429.3125) .. controls (383.8191,429.3125) and (381.5985,430.4297) ..
+ (380.2812,432.6250) -- (380.3125,432.6250) .. controls (379.0375,434.6970) and
+ (378.3750,437.0443) .. (378.3750,439.6250) .. controls (378.3750,442.5209) and
+ (379.1845,445.3489) .. (380.7500,448.0625) .. controls (382.3672,450.7752) and
+ (384.6374,453.1829) .. (387.5313,455.2500) .. controls (390.4308,457.3211) and
+ (393.8715,458.9445) .. (397.8750,460.1250) .. controls (401.8903,461.3605) and
+ (406.3135,461.9688) .. (411.1250,461.9688) .. controls (422.9271,461.9688) and
+ (432.8357,458.8858) .. (440.7500,452.7188) .. controls (448.6732,446.5963) and
+ (452.6875,438.5099) .. (452.6875,428.6250) .. controls (452.6875,423.5424) and
+ (451.8139,419.3245) .. (450.0313,415.9688) .. controls (448.2737,412.6089) and
+ (446.0071,409.8517) .. (443.2500,407.7188) .. controls (440.6098,405.6999) and
+ (437.6168,404.1577) .. (434.3125,403.1250) .. controls (431.2903,402.1656) and
+ (428.4437,401.5684) .. (425.7188,401.2813) -- (425.7188,401.0313) .. controls
+ (429.9462,399.8234) and (433.5316,398.3019) .. (436.3750,396.4063) .. controls
+ (439.3588,394.4000) and (441.7734,392.1633) .. (443.5938,389.7188) .. controls
+ (445.2562,387.4849) and (446.4583,385.0731) .. (447.1875,382.4688) --
+ (447.1875,382.4375) .. controls (447.9098,379.8061) and (448.2812,377.2137) ..
+ (448.2813,374.6250) .. controls (448.2812,372.5132) and (447.8100,370.0304) ..
+ (446.9375,367.1562) .. controls (446.0482,364.2269) and (444.4516,361.4494) ..
+ (442.1250,358.8125) .. controls (439.7295,356.1046) and (436.4304,353.8164) ..
+ (432.2813,351.9688) .. controls (432.2733,351.9647) and (432.2585,351.9728) ..
+ (432.2500,351.9688) .. controls (428.0952,350.0532) and (422.8701,349.0938) ..
+ (416.5938,349.0938) -- cycle(416.5938,350.3125) .. controls
+ (422.7604,350.3126) and (427.8075,351.2392) .. (431.7500,353.0625) .. controls
+ (435.7908,354.8585) and (438.9298,357.0417) .. (441.1875,359.5938) .. controls
+ (443.4178,362.1216) and (444.9489,364.7586) .. (445.7812,367.5000) .. controls
+ (446.6302,370.2969) and (447.0312,372.6862) .. (447.0312,374.6250) .. controls
+ (447.0312,377.0998) and (446.6953,379.5919) .. (446.0000,382.1250) .. controls
+ (445.3114,384.5842) and (444.2030,386.8795) .. (442.6250,389.0000) .. controls
+ (440.9009,391.3151) and (438.5771,393.4320) .. (435.6875,395.3750) .. controls
+ (432.8713,397.2525) and (429.2959,398.7977) .. (424.9375,400.0000) --
+ (424.5000,400.1250) -- (424.5000,400.5938) -- (424.5000,401.8125) --
+ (424.5000,402.3750) -- (425.0312,402.4063) .. controls (427.8151,402.6549) and
+ (430.7833,403.2800) .. (433.9375,404.2813) -- (433.9688,404.2813) .. controls
+ (437.1455,405.2741) and (439.9756,406.7571) .. (442.5000,408.6875) .. controls
+ (445.1100,410.7067) and (447.2519,413.3089) .. (448.9375,416.5313) .. controls
+ (450.5978,419.6567) and (451.4375,423.6822) .. (451.4375,428.6250) .. controls
+ (451.4375,438.1834) and (447.6718,445.8218) .. (440.0000,451.7500) .. controls
+ (432.3192,457.7351) and (422.7156,460.7500) .. (411.1250,460.7500) .. controls
+ (406.4174,460.7500) and (402.1335,460.1325) .. (398.2500,458.9375) --
+ (398.2188,458.9375) .. controls (394.3234,457.7889) and (391.0214,456.2296) ..
+ (388.2500,454.2500) .. controls (385.4806,452.2719) and (383.3338,450.0134) ..
+ (381.8125,447.4688) .. controls (381.8075,447.4598) and (381.8175,447.4462) ..
+ (381.8125,447.4375) .. controls (380.3501,444.8937) and (379.5938,442.2897) ..
+ (379.5938,439.6250) .. controls (379.5938,437.2436) and (380.1884,435.1587) ..
+ (381.3438,433.2812) -- (381.3438,433.2500) .. controls (382.4569,431.3946) and
+ (384.1263,430.5312) .. (386.6562,430.5312) .. controls (389.5925,430.5312) and
+ (391.7280,431.2428) .. (393.1562,432.6250) -- (393.1562,432.6562) .. controls
+ (394.6782,434.0355) and (395.4062,435.5285) .. (395.4062,437.2812) .. controls
+ (395.4062,438.8316) and (395.1445,440.8592) .. (394.5938,443.3125) --
+ (394.5625,443.3125) .. controls (394.0575,445.7868) and (393.6689,447.5649) ..
+ (393.3750,448.5938) -- (393.2812,448.8750) -- (393.4688,449.1250) .. controls
+ (393.8779,449.6511) and (394.5411,450.2582) .. (395.4688,451.0312) --
+ (395.4688,451.0625) .. controls (396.4790,451.8601) and (397.6889,452.5632) ..
+ (399.0938,453.1875) .. controls (400.7490,453.9634) and (402.4733,454.5664) ..
+ (404.2812,455.0313) .. controls (406.1403,455.5093) and (408.6995,455.7500) ..
+ (411.9688,455.7500) .. controls (415.0746,455.7500) and (418.0544,455.2246) ..
+ (420.9062,454.1875) .. controls (423.8297,453.1434) and (426.4054,451.4488) ..
+ (428.5938,449.1563) .. controls (430.8716,446.7748) and (432.6333,443.9792) ..
+ (433.8750,440.7813) .. controls (433.8780,440.7723) and (433.8720,440.7589) ..
+ (433.8750,440.7500) .. controls (435.1781,437.5565) and (435.8124,433.4132) ..
+ (435.8125,428.3125) .. controls (435.8124,425.5331) and (435.4924,422.7896) ..
+ (434.8750,420.0625) .. controls (434.3008,417.2964) and (433.1940,414.8651) ..
+ (431.5625,412.8125) .. controls (429.9186,410.7444) and (427.6914,409.1578) ..
+ (424.8750,408.0625) -- (424.8750,408.0938) .. controls (422.0884,406.9371) and
+ (418.5815,406.3751) .. (414.3750,406.3750) -- (405.0625,406.3750) --
+ (405.0625,398.8438) -- (411.0625,398.8438) .. controls (418.1619,398.8438) and
+ (423.3956,396.8673) .. (426.6250,392.8438) .. controls (429.8388,388.8397) and
+ (431.4062,382.8907) .. (431.4062,375.0625) .. controls (431.4062,368.6374) and
+ (429.8750,363.7121) .. (426.7500,360.3750) .. controls (423.6367,356.9981) and
+ (419.2140,355.3126) .. (413.6250,355.3125) .. controls (410.9412,355.3126) and
+ (408.6935,355.6486) .. (406.8750,356.3438) .. controls (405.1817,356.9596) and
+ (403.7942,357.5864) .. (402.6875,358.2188) .. controls (401.3782,358.9521) and
+ (400.2991,359.7722) .. (399.4375,360.6875) .. controls (398.6294,361.5462) and
+ (398.0210,362.1666) .. (397.6250,362.5625) -- (397.4062,362.8125) --
+ (397.4688,363.1250) .. controls (397.8228,364.7437) and (398.2438,366.7461) ..
+ (398.7500,369.1250) .. controls (399.2481,371.4166) and (399.5000,373.6095) ..
+ (399.5000,375.6875) .. controls (399.5000,377.3850) and (398.7789,378.8793) ..
+ (397.2500,380.3125) .. controls (395.8262,381.6445) and (393.6794,382.3751) ..
+ (390.6875,382.3750) .. controls (388.1498,382.3751) and (386.4382,381.5087) ..
+ (385.2812,379.7500) .. controls (384.1306,377.9283) and (383.5625,375.8403) ..
+ (383.5625,373.4063) .. controls (383.5625,370.8869) and (384.2578,368.3186) ..
+ (385.6875,365.6563) .. controls (387.1119,363.0040) and (389.2257,360.4955) ..
+ (392.0625,358.1563) .. controls (394.8853,355.8288) and (398.3413,353.9488) ..
+ (402.4375,352.5000) .. controls (406.5107,351.0596) and (411.2311,350.3126) ..
+ (416.5938,350.3125) -- cycle;
+\end{tikzpicture}
+}
+
+
+
+\newcommand \explogo{%
+\begin{tikzpicture}[y=0.45pt,x=0.45pt,yscale=-1, inner sep=0pt, outer sep=0pt]
+ \path[fill=black] (188.1546,427.4287) .. controls (190.5345,431.7164) and
+ (193.0099,435.4077) .. (195.5921,438.5850) -- (195.6233,438.6163) .. controls
+ (195.6323,438.6274) and (195.6455,438.6365) .. (195.6545,438.6476) .. controls
+ (194.4650,438.4740) and (193.2397,438.3529) .. (191.9670,438.3663) .. controls
+ (189.4530,438.3928) and (186.7534,438.8247) .. (183.8420,439.7413) .. controls
+ (188.8419,443.9283) and (193.0993,446.9893) .. (196.8420,449.3663) .. controls
+ (196.7505,449.3362) and (196.6520,449.3022) .. (196.5607,449.2726) --
+ (196.8420,449.4289) .. controls (191.0442,447.6143) and (184.7895,447.3923) ..
+ (177.4670,450.8664) .. controls (182.7247,454.1565) and (187.1369,456.5570) ..
+ (191.0295,458.3664) .. controls (190.9155,458.3495) and (190.7995,458.3198) ..
+ (190.6857,458.3039) -- (190.9670,458.4601) .. controls (184.8999,457.4153) and
+ (178.6035,458.0026) .. (171.7482,462.5226) .. controls (176.2179,464.5144) and
+ (180.1011,466.0179) .. (183.5607,467.1789) -- (183.5919,467.1789) --
+ (183.8107,467.3039) .. controls (178.0253,467.5288) and (172.2917,469.3302) ..
+ (166.6857,474.6476) .. controls (171.5829,475.8624) and (175.7757,476.6736) ..
+ (179.4669,477.2101) .. controls (179.3633,477.2310) and (179.2580,477.2503) ..
+ (179.1544,477.2726) .. controls (179.0103,477.2696) and (178.8604,477.2746) ..
+ (178.7169,477.2726) -- (178.8732,477.3351) .. controls (174.5605,478.3144) and
+ (170.3552,480.4767) .. (166.2482,484.6164) .. controls (169.5756,485.3353) and
+ (172.5696,485.8937) .. (175.3107,486.3039) .. controls (171.9361,487.9351) and
+ (168.7309,490.4629) .. (165.8107,494.3351) .. controls (169.6449,494.6328) and
+ (173.0419,494.7600) .. (176.0919,494.7726) .. controls (172.4017,496.4801) and
+ (168.9244,499.1610) .. (165.8419,503.4914) .. controls (171.3184,503.7651) and
+ (175.8960,503.7533) .. (179.8419,503.5226) .. controls (179.7681,503.5528) and
+ (179.6968,503.5855) .. (179.6232,503.6163) .. controls (179.3834,503.6377) and
+ (179.1427,503.6531) .. (178.9044,503.6788) -- (179.2482,503.8038) .. controls
+ (175.1462,505.6048) and (171.3495,508.5232) .. (168.0919,513.4600) .. controls
+ (174.8980,513.5594) and (180.2892,513.2381) .. (184.8107,512.6788) .. controls
+ (184.6730,512.7162) and (184.5417,512.7645) .. (184.4044,512.8038) .. controls
+ (184.2299,512.8144) and (184.0455,512.8223) .. (183.8732,512.8350) --
+ (184.0919,512.8975) .. controls (178.7598,514.4860) and (173.8363,517.5457) ..
+ (169.7482,523.7412) .. controls (175.2461,523.8214) and (179.8367,523.6133) ..
+ (183.7794,523.2412) .. controls (183.6938,523.2879) and (183.6146,523.3500) ..
+ (183.5294,523.3975) .. controls (178.8190,526.0253) and (174.7697,529.9721) ..
+ (172.0919,536.6475) .. controls (176.9272,535.7317) and (180.9801,534.7653) ..
+ (184.4982,533.7412) .. controls (184.4398,533.7875) and (184.3686,533.8191) ..
+ (184.3107,533.8662) -- (184.5294,533.8350) .. controls (180.9081,536.5374) and
+ (177.8636,540.3240) .. (175.8107,545.9288) .. controls (179.1397,545.1929) and
+ (182.1140,544.4194) .. (184.7794,543.6475) .. controls (182.3867,546.5404) and
+ (180.5386,550.1515) .. (179.4982,554.8975) .. controls (183.1131,553.5663) and
+ (186.2487,552.2854) .. (189.0294,551.0225) .. controls (188.9958,551.0619) and
+ (188.9691,551.1079) .. (188.9357,551.1475) .. controls (188.8789,551.1923) and
+ (188.8034,551.2277) .. (188.7482,551.2725) -- (188.8419,551.2413) .. controls
+ (186.2910,554.2981) and (184.3447,558.1421) .. (183.3732,563.2413) .. controls
+ (188.4628,561.2062) and (192.6027,559.2529) .. (196.0919,557.3976) .. controls
+ (195.9933,557.4930) and (195.8722,557.5825) .. (195.7794,557.6788) --
+ (195.8731,557.6476) .. controls (192.7873,561.0321) and (190.4833,565.3800) ..
+ (189.5606,571.3664) .. controls (195.5682,568.7142) and (200.1972,566.2494) ..
+ (203.9981,563.9289) .. controls (203.9580,563.9700) and (203.9127,564.0127) ..
+ (203.8731,564.0539) -- (204.1231,563.9289) .. controls (199.8075,567.6248) and
+ (196.4969,572.5288) .. (195.3419,580.0226) .. controls (203.4387,576.4482) and
+ (209.1016,573.2112) .. (213.4981,570.2101) .. controls (211.6101,574.0286) and
+ (210.6125,578.4777) .. (211.0919,584.0539) .. controls (218.9172,578.0502) and
+ (223.8713,573.2098) .. (227.5606,568.9289) .. controls (227.5546,568.9906) and
+ (227.5656,569.0545) .. (227.5606,569.1164) .. controls (227.3369,571.8296) and
+ (227.5060,574.7714) .. (228.3106,578.0226) .. controls (232.9500,570.0520) and
+ (237.5899,566.7480) .. (242.3106,564.0226) .. controls (236.4069,567.8493) and
+ (237.4669,570.9503) .. (237.4669,574.4914) .. controls (244.4870,567.0983) and
+ (254.2537,559.2459) .. (257.2481,554.3351) .. controls (253.2445,560.3478) and
+ (251.6457,566.0579) .. (250.5919,571.0851) .. controls (230.1065,581.9187) and
+ (217.6060,584.7541) .. (203.6231,589.0851) .. controls (209.0471,591.0745) and
+ (214.8691,593.0070) .. (212.4669,595.7726) -- (206.0606,602.1789) .. controls
+ (210.1567,600.9056) and (214.3405,599.0697) .. (217.9669,601.5539) .. controls
+ (217.6110,604.9137) and (213.3733,606.6264) .. (209.7481,608.5851) .. controls
+ (216.1304,606.2854) and (217.5075,606.8270) .. (219.1856,607.3664) .. controls
+ (220.0240,611.3923) and (217.1123,613.5511) .. (215.2169,616.2101) .. controls
+ (231.2927,603.9867) and (252.2574,594.3357) .. (267.0294,590.3039) .. controls
+ (287.8076,583.3065) and (314.6175,576.0122) .. (321.9044,558.2726) --
+ (329.1856,529.0226) .. controls (337.7280,519.7775) and (345.5838,510.2065) ..
+ (349.3108,498.5539) .. controls (373.0973,493.9520) and (392.3393,495.6016) ..
+ (412.4046,496.1164) .. controls (410.5758,495.8116) and (351.1546,485.7414) ..
+ (351.1546,485.7414) .. controls (333.7856,461.9756) and (307.8721,478.1391) ..
+ (299.3421,501.6164) .. controls (297.1891,507.5420) and (284.9022,507.5289) ..
+ (281.3421,501.5852) .. controls (267.2670,471.2820) and (224.5286,439.2367) ..
+ (188.1546,427.4289) -- cycle;
+ \path[fill=basecolor] (187.7346,425.7215) .. controls (190.1312,430.0392) and
+ (192.6231,433.7232) .. (195.2248,436.9158) .. controls (194.0353,436.7423) and
+ (192.8098,436.6402) .. (191.5371,436.6536) .. controls (189.0231,436.6801) and
+ (186.3356,437.0974) .. (183.4241,438.0140) .. controls (188.5047,442.2685) and
+ (192.7982,445.3733) .. (196.5852,447.7660) .. controls (190.7343,445.8972) and
+ (184.4338,445.6311) .. (177.0321,449.1427) .. controls (182.4382,452.5257) and
+ (186.9760,454.9705) .. (190.9471,456.7968) .. controls (184.7555,455.6556) and
+ (178.3356,456.1756) .. (171.3284,460.7959) .. controls (175.9548,462.8576) and
+ (179.9558,464.4054) .. (183.5061,465.5818) .. controls (177.6784,465.7855) and
+ (171.9101,467.5854) .. (166.2639,472.9408) .. controls (171.1611,474.1557) and
+ (175.3568,474.9612) .. (179.0480,475.4977) .. controls (174.5307,476.4104) and
+ (170.0996,478.5772) .. (165.8050,482.9059) .. controls (169.1324,483.6248) and
+ (172.1275,484.1674) .. (174.8686,484.5777) .. controls (171.4940,486.2088) and
+ (168.2990,488.7365) .. (165.3788,492.6087) .. controls (169.2130,492.9064) and
+ (172.6053,493.0386) .. (175.6553,493.0512) .. controls (171.9650,494.7587) and
+ (168.5104,497.4567) .. (165.4280,501.7871) .. controls (170.9044,502.0608) and
+ (175.4790,502.0342) .. (179.4250,501.8034) .. controls (175.0884,503.5763) and
+ (171.0915,506.5720) .. (167.6734,511.7521) .. controls (174.4795,511.8515) and
+ (179.8697,511.5247) .. (184.3911,510.9654) .. controls (178.7800,512.4888) and
+ (173.5859,515.5521) .. (169.3124,522.0286) .. controls (174.8103,522.1088) and
+ (179.3994,521.9089) .. (183.3421,521.5369) .. controls (178.5221,524.1635) and
+ (174.3823,528.1477) .. (171.6562,534.9438) .. controls (176.6186,534.0040) and
+ (180.7774,532.9979) .. (184.3583,531.9445) .. controls (180.6281,534.6591) and
+ (177.4926,538.4719) .. (175.3930,544.2041) .. controls (178.7220,543.4682) and
+ (181.6765,542.6978) .. (184.3419,541.9259) .. controls (181.9491,544.8188) and
+ (180.1048,548.4397) .. (179.0644,553.1858) .. controls (182.6793,551.8545) and
+ (185.8062,550.5643) .. (188.5869,549.3014) .. controls (185.9451,552.3928) and
+ (183.9273,556.3063) .. (182.9324,561.5282) .. controls (188.0220,559.4931) and
+ (192.1617,557.5487) .. (195.6510,555.6934) .. controls (192.4524,559.1128) and
+ (190.0726,563.5113) .. (189.1278,569.6412) .. controls (195.3243,566.9057) and
+ (200.0785,564.3715) .. (203.9442,561.9871) .. controls (199.5047,565.7077) and
+ (196.0910,570.6550) .. (194.9134,578.2951) .. controls (203.0102,574.7206) and
+ (208.6604,571.4786) .. (213.0570,568.4775) .. controls (211.1690,572.2961) and
+ (210.1683,576.7672) .. (210.6477,582.3434) .. controls (218.4730,576.3397) and
+ (223.4302,571.4800) .. (227.1195,567.1991) .. controls (226.8707,569.9634) and
+ (227.0669,572.9701) .. (227.8899,576.2955) .. controls (233.5078,566.6437) and
+ (239.0905,563.8256) .. (244.8678,560.6045) .. controls (235.6654,565.2375) and
+ (237.0296,568.7253) .. (237.0296,572.7723) .. controls (244.0497,565.3793) and
+ (253.8400,557.5393) .. (256.8344,552.6285) .. controls (252.8308,558.6412) and
+ (251.2011,564.3353) .. (250.1474,569.3626) .. controls (229.6620,580.1962) and
+ (217.1896,583.0276) .. (203.2067,587.3587) .. controls (208.6306,589.3481) and
+ (214.4431,591.2965) .. (212.0409,594.0622) -- (205.6324,600.4542) .. controls
+ (209.7285,599.1810) and (213.9051,597.3636) .. (217.5315,599.8478) .. controls
+ (217.1756,603.2077) and (212.9289,604.9040) .. (209.3037,606.8627) .. controls
+ (215.6860,604.5630) and (217.0662,605.0941) .. (218.7443,605.6335) .. controls
+ (219.5827,609.6594) and (216.6733,611.8250) .. (214.7780,614.4840) .. controls
+ (230.8537,602.2606) and (251.8308,592.6034) .. (266.6028,588.5716) .. controls
+ (287.3810,581.5741) and (314.1729,574.3016) .. (321.4598,556.5621) --
+ (328.7697,527.3061) .. controls (337.3119,518.0610) and (345.1694,508.4736) ..
+ (348.8965,496.8210) .. controls (372.6829,492.2191) and (391.9159,493.8805) ..
+ (411.9812,494.3952) .. controls (410.1524,494.0905) and (350.7157,484.0204) ..
+ (350.7157,484.0204) .. controls (333.3467,460.2547) and (307.4537,476.4086) ..
+ (298.9237,499.8859) .. controls (296.7707,505.8115) and (284.4877,505.8133) ..
+ (280.9276,499.8695) .. controls (266.8525,469.5663) and (224.1086,437.5293) ..
+ (187.7346,425.7216) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (328.0690,487.7425) -- (327.9127,487.9925) .. controls (327.2963,489.1409) and
+ (326.2537,489.9248) .. (324.7877,490.3988) .. controls (323.3218,490.8728) and
+ (321.4437,491.0247) .. (319.2565,490.9300) -- (317.8815,490.8675) --
+ (318.8815,491.8363) .. controls (319.3892,492.3246) and (319.5310,492.7144) ..
+ (319.5377,493.0550) .. controls (319.5447,493.3957) and (319.3983,493.7636) ..
+ (319.0690,494.1800) .. controls (318.4103,495.0130) and (317.1020,495.9174) ..
+ (315.8815,496.8363) -- (315.4752,497.1175) -- (315.7565,497.5238) .. controls
+ (316.7747,499.0858) and (317.2409,500.2883) .. (317.3502,501.2113) .. controls
+ (317.4595,502.1343) and (317.2450,502.7963) .. (316.8190,503.3675) .. controls
+ (315.9669,504.5101) and (314.0965,505.2843) .. (312.4127,506.2425) --
+ (312.1002,506.3988) -- (312.1627,506.7738) .. controls (312.3075,507.6524) and
+ (312.0708,508.3704) .. (311.4440,509.0863) .. controls (310.8171,509.8021) and
+ (309.7619,510.4847) .. (308.3502,511.0863) -- (307.9752,511.2425) --
+ (308.0377,511.6488) .. controls (308.3193,513.5300) and (308.8848,515.1671) ..
+ (310.0690,516.2113) .. controls (311.1523,517.1665) and (312.7911,517.4184) ..
+ (314.8815,516.9925) .. controls (315.2459,518.9979) and (315.7682,520.8217) ..
+ (316.9752,522.0238) .. controls (318.1986,523.2421) and (320.1355,523.6024) ..
+ (322.7252,522.9300) .. controls (323.3080,524.3346) and (324.1596,525.3355) ..
+ (325.1315,525.9925) .. controls (326.1986,526.7139) and (327.5930,527.0049) ..
+ (328.7401,527.3612) -- (329.4197,526.6303) .. controls (328.2812,526.2767) and
+ (326.6004,525.7302) .. (325.6940,525.1175) .. controls (324.7876,524.5048) and
+ (324.0512,523.6643) .. (323.5377,522.2113) -- (323.3815,521.7113) --
+ (322.8815,521.8675) .. controls (320.2185,522.6859) and (318.7418,522.3174) ..
+ (317.7252,521.3050) .. controls (316.7087,520.2927) and (316.1370,518.4626) ..
+ (315.7877,516.3363) -- (315.6940,515.7738) -- (315.1315,515.9300) .. controls
+ (312.9366,516.5027) and (311.6408,516.2098) .. (310.7565,515.4300) .. controls
+ (309.9304,514.7016) and (309.4415,513.4103) .. (309.1628,511.8050) .. controls
+ (310.4344,511.2171) and (311.5245,510.5741) .. (312.2253,509.7738) .. controls
+ (312.9099,508.9919) and (313.2063,508.0267) .. (313.1628,507.0238) .. controls
+ (314.7142,506.1705) and (316.5854,505.4372) .. (317.6628,503.9925) .. controls
+ (318.2261,503.2372) and (318.5187,502.2444) .. (318.3815,501.0863) .. controls
+ (318.2568,500.0326) and (317.7408,498.8152) .. (316.8503,497.3675) .. controls
+ (317.9434,496.5623) and (319.1300,495.7554) .. (319.8815,494.8050) .. controls
+ (320.2994,494.2767) and (320.6136,493.6919) .. (320.6003,493.0238) .. controls
+ (320.5933,492.6554) and (320.2387,492.3198) .. (320.0378,491.9613) .. controls
+ (321.9389,491.9861) and (323.6709,491.8609) .. (325.1003,491.3988) .. controls
+ (326.6062,490.9119) and (327.7892,490.0245) .. (328.5690,488.8050) .. controls
+ (330.8191,488.8168) and (333.1492,489.3112) .. (335.5065,489.6175) .. controls
+ (337.9280,489.9322) and (340.3922,490.0166) .. (342.7253,488.9925) --
+ (342.2878,488.0238) .. controls (340.2235,488.9299) and (338.0183,488.8923) ..
+ (335.6628,488.5863) .. controls (333.3073,488.2802) and (330.8524,487.7246) ..
+ (328.3815,487.7425) -- cycle;
+ \path[draw=white,fill=white,miter limit=4.00,line width=0.839pt]
+ (336.8186,487.3469) .. controls (336.8186,489.7993) and (334.8306,491.7873) ..
+ (332.3782,491.7873) .. controls (329.9259,491.7873) and (327.9379,489.7993) ..
+ (327.9379,487.3469) .. controls (327.9379,484.8946) and (329.9259,482.9065) ..
+ (332.3782,482.9065) .. controls (334.8306,482.9065) and (336.8186,484.8945) ..
+ (336.8186,487.3469) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (350.0784,483.1829) .. controls (346.0920,488.3688) and (345.0896,487.0295) ..
+ (342.6627,487.8988) -- (342.2565,488.0550) -- (342.3190,488.4925) .. controls
+ (343.2534,493.7013) and (346.3404,495.3564) .. (348.7497,497.2498) --
+ (348.8842,496.8285) -- (349.5255,496.7063) .. controls (347.1103,494.8083) and
+ (344.4675,493.2007) .. (343.5065,488.7738) .. controls (345.2738,488.3557) and
+ (346.9603,488.8903) .. (350.7252,483.9925) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (196.5832,447.7548) .. controls (204.1159,452.4256) and (216.5138,457.2421) ..
+ (224.4752,462.2738) .. controls (228.8554,465.0628) and (232.7896,467.8418) ..
+ (235.8502,470.2425) .. controls (238.9108,472.6433) and (241.1740,475.1236) ..
+ (242.0065,475.9300) .. controls (242.8390,476.7364) and (243.4041,476.3554) ..
+ (242.8502,475.3050) .. controls (242.2964,474.2547) and (239.5701,471.8264) ..
+ (236.4752,469.3988) .. controls (233.3804,466.9712) and (229.4438,464.2043) ..
+ (225.0377,461.3988) .. controls (216.2255,455.7878) and (205.8833,450.7708) ..
+ (196.5832,447.7548) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (195.2242,436.9074) .. controls (198.3819,437.6366) and (203.0426,440.3298) ..
+ (208.2252,443.2113) .. controls (213.4079,446.0928) and (219.0564,449.6386) ..
+ (224.2252,453.0863) .. controls (229.3940,456.5340) and (233.3791,459.5515) ..
+ (236.5649,461.9823) .. controls (239.5902,464.5711) and (241.0838,466.2475) ..
+ (241.6627,466.2425) .. controls (241.7421,466.2585) and (241.8203,466.2597) ..
+ (241.9440,466.2425) .. controls (242.0677,466.2253) and (242.2764,466.1299) ..
+ (242.3815,465.9300) .. controls (242.4865,465.7302) and (242.4459,465.5623) ..
+ (242.4128,465.4613) .. controls (242.3796,465.3603) and (242.3618,465.3067) ..
+ (242.3191,465.2425) .. controls (242.1482,464.9858) and (241.8873,464.7454) ..
+ (241.5066,464.3988) .. controls (240.7451,463.7056) and (239.4870,462.6862) ..
+ (237.8816,461.4613) .. controls (234.6708,459.0114) and (230.0051,455.6705) ..
+ (224.8191,452.2113) .. controls (219.6331,448.7521) and (213.9447,445.1757) ..
+ (208.7253,442.2738) .. controls (206.8700,441.5863) and (197.7714,436.7746) ..
+ (195.2243,436.9074) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (190.9046,456.7968) .. controls (200.5728,460.7431) and (214.3261,465.3785) ..
+ (223.5065,471.1488) .. controls (228.4392,474.2811) and (232.7356,477.4014) ..
+ (235.9440,479.9613) .. controls (237.5482,481.2412) and (238.8881,482.3917) ..
+ (239.8815,483.3050) .. controls (240.8749,484.2184) and (241.4352,485.0475) ..
+ (241.7565,485.2738) .. controls (242.4289,485.7475) and (242.9436,485.4328) ..
+ (242.6315,484.6800) .. controls (242.3958,484.1116) and (241.6181,483.4596) ..
+ (240.6002,482.5238) .. controls (239.5823,481.5880) and (238.2198,480.4410) ..
+ (236.6002,479.1488) .. controls (233.3611,476.5644) and (229.0363,473.3968) ..
+ (224.0690,470.2425) .. controls (214.1344,463.9341) and (202.2573,458.3877) ..
+ (190.9046,456.7968) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (183.4711,465.5716) .. controls (191.0060,465.5766) and (206.5713,472.4735) ..
+ (213.1315,475.9300) .. controls (223.7689,481.6031) and (233.4415,488.8954) ..
+ (238.7877,493.9925) .. controls (239.3805,494.5577) and (240.2465,494.0588) ..
+ (239.5690,493.2738) .. controls (234.6033,487.5198) and (224.3477,480.7388) ..
+ (213.6315,475.0238) .. controls (202.9153,469.3087) and (191.8189,465.5632) ..
+ (183.4711,465.5716) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (179.1133,475.4956) .. controls (190.4411,477.1531) and (204.0196,481.7255) ..
+ (213.9127,486.6800) .. controls (219.4336,489.4832) and (224.3566,492.4856) ..
+ (228.1315,495.1488) .. controls (231.9064,497.8120) and (234.6937,500.8104) ..
+ (235.3815,501.5863) .. controls (236.0693,502.3622) and (236.8886,502.3945) ..
+ (236.2565,501.0238) .. controls (235.6244,499.6531) and (232.5499,496.9721) ..
+ (228.7252,494.2738) .. controls (224.9006,491.5755) and (219.9456,488.5676) ..
+ (214.3815,485.7425) .. controls (203.2533,480.0924) and (190.5800,475.6473) ..
+ (179.1133,475.4956) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (182.8502,483.9300) .. controls (180.0362,483.6845) and (177.5032,484.2615) ..
+ (174.9224,484.5841) .. controls (184.9876,483.6409) and (199.0622,488.2631) ..
+ (208.4440,492.5863) .. controls (219.4960,497.7676) and (228.6734,504.8810) ..
+ (233.0690,509.3988) .. controls (233.7572,510.1061) and (234.2435,509.2048) ..
+ (233.8815,508.7425) .. controls (229.7881,503.5164) and (220.0397,496.8487) ..
+ (208.8815,491.6175) .. controls (200.5128,487.6942) and (191.2924,484.6668) ..
+ (182.8502,483.9300) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (175.7074,492.9973) .. controls (185.6124,493.7315) and (198.8738,496.1032) ..
+ (208.1627,500.3675) .. controls (217.5053,504.7372) and (224.5953,510.4032) ..
+ (228.1627,513.6175) .. controls (228.7116,514.1121) and (229.6823,513.7617) ..
+ (228.9127,512.8675) .. controls (225.6572,509.0849) and (218.0877,503.8529) ..
+ (208.6315,499.4300) .. controls (199.1753,495.0072) and (187.6892,492.1744) ..
+ (175.7074,492.9973) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (184.6002,501.2425) .. controls (182.5105,501.1718) and (181.5301,501.5628) ..
+ (179.5141,501.7805) .. controls (186.2367,502.0768) and (196.9195,503.8647) ..
+ (202.8190,505.8675) .. controls (210.4747,508.5236) and (216.7699,512.5245) ..
+ (220.3502,515.6488) .. controls (221.0416,516.2521) and (221.5570,515.4427) ..
+ (221.1002,514.9300) .. controls (217.7467,511.1667) and (210.9312,507.5627) ..
+ (203.1627,504.8675) .. controls (197.3364,502.8461) and (190.8693,501.4545) ..
+ (184.6002,501.2425) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (184.3157,510.9926) .. controls (198.6871,511.9623) and (207.3770,514.4944) ..
+ (214.0377,520.4613) .. controls (214.5368,520.9084) and (215.3247,520.2930) ..
+ (214.7877,519.7113) .. controls (207.9520,512.3054) and (194.4933,510.2417) ..
+ (184.3157,510.9926) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (195.3815,519.6175) .. controls (191.0251,519.2671) and (187.3797,520.2191) ..
+ (183.4094,521.5412) .. controls (195.0282,519.6893) and (199.8590,520.5773) ..
+ (208.6627,524.7113) .. controls (209.6662,525.1825) and (209.6073,524.0723) ..
+ (209.1627,523.8050) .. controls (204.4864,520.9942) and (199.7378,519.9679) ..
+ (195.3815,519.6175) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (194.9584,527.7065) .. controls (190.8394,528.0717) and (187.3420,529.4861) ..
+ (184.4584,531.8315) .. controls (195.9645,527.3967) and (199.1447,528.2791) ..
+ (207.9440,530.7738) .. controls (209.1013,531.1019) and (208.7417,529.9871) ..
+ (208.2877,529.8050) .. controls (203.0183,527.6924) and (199.0774,527.3413) ..
+ (194.9584,527.7065) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (217.7565,534.8363) .. controls (211.6177,534.1725) and (204.7011,534.9170) ..
+ (198.6315,536.0238) .. controls (192.5618,537.1306) and (187.3415,539.3794) ..
+ (184.3947,541.7762) .. controls (194.4866,537.5140) and (196.3258,537.5231) ..
+ (198.8190,537.0550) .. controls (204.7989,535.9646) and (210.7264,535.5394) ..
+ (217.6940,535.8675) .. controls (218.3258,535.8973) and (218.2935,534.8944) ..
+ (217.7565,534.8363) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (221.3190,539.8050) .. controls (214.6662,539.5537) and (207.7944,541.2000) ..
+ (201.8502,542.8988) .. controls (195.9061,544.5976) and (191.4940,546.9158) ..
+ (188.5846,549.2822) .. controls (194.4716,546.4504) and (199.9499,544.5335) ..
+ (202.1315,543.8988) .. controls (207.9926,542.2237) and (213.9052,540.7736) ..
+ (221.3815,540.8675) .. controls (221.9623,540.8745) and (222.3377,539.8435) ..
+ (221.3190,539.8050) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (226.7565,543.8988) .. controls (220.4907,544.8239) and (213.9208,546.6745) ..
+ (208.1940,548.6175) .. controls (202.4671,550.5606) and (198.3906,552.8682) ..
+ (195.7313,555.6308) .. controls (202.5433,551.7206) and (206.2895,550.3495) ..
+ (208.5065,549.5863) .. controls (214.1631,547.6670) and (219.4450,546.3315) ..
+ (226.9440,544.9300) .. controls (227.8440,544.7618) and (227.1212,543.8449) ..
+ (226.7565,543.8988) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (229.9440,549.1175) .. controls (217.3782,551.1190) and (209.2362,556.5404) ..
+ (204.0606,561.9168) .. controls (212.0814,555.8737) and (217.6610,552.6260) ..
+ (230.1627,550.1488) .. controls (230.9540,549.9920) and (230.7150,548.9947) ..
+ (229.9440,549.1175) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (236.0690,553.7113) .. controls (223.4309,555.6581) and (216.1430,563.3408) ..
+ (213.1075,568.4120) .. controls (221.1036,560.4242) and (227.3269,556.0769) ..
+ (236.2877,554.7425) .. controls (237.1946,554.6075) and (236.9632,553.5735) ..
+ (236.0690,553.7113) -- cycle;
+ \path[color=black,fill=white,nonzero rule,line width=0.839pt]
+ (239.8815,557.7113) .. controls (237.9104,557.9574) and (235.2282,559.3533) ..
+ (232.6940,560.9613) .. controls (230.1598,562.5693) and (228.2477,564.5258) ..
+ (227.1075,567.0466) .. controls (230.1601,563.8962) and (231.3821,563.0437) ..
+ (233.2565,561.8363) .. controls (235.6896,560.2924) and (238.1414,559.3201) ..
+ (240.1315,558.7425) .. controls (241.0644,558.4718) and (240.3594,557.6516) ..
+ (239.8815,557.7113) -- cycle;
+ \path[draw=white,fill=white,miter limit=4.00,line width=0.839pt]
+ (336.8186,487.3469) .. controls (336.8186,489.7993) and (334.8306,491.7873) ..
+ (332.3782,491.7873) .. controls (329.9259,491.7873) and (327.9379,489.7993) ..
+ (327.9379,487.3469) .. controls (327.9379,484.8946) and (329.9259,482.9065) ..
+ (332.3782,482.9065) .. controls (334.8306,482.9065) and (336.8186,484.8945) ..
+ (336.8186,487.3469) -- cycle;
+ \path[draw=white,fill=maincolor,miter limit=4.00,line width=0.839pt]
+ (336.8186,487.3469) .. controls (336.8186,489.7993) and (334.8306,491.7873) ..
+ (332.3782,491.7873) .. controls (329.9259,491.7873) and (327.9379,489.7993) ..
+ (327.9379,487.3469) .. controls (327.9379,484.8946) and (329.9259,482.9065) ..
+ (332.3782,482.9065) .. controls (334.8306,482.9065) and (336.8186,484.8945) ..
+ (336.8186,487.3469) -- cycle;
+ \path[fill=black] (240.9977,587.6605) .. controls (237.8583,593.6353) and
+ (233.6558,598.3948) .. (228.3899,601.9391) .. controls (223.1240,605.4835) and
+ (217.0733,607.2556) .. (210.2379,607.2556) .. controls (204.2124,607.2556) and
+ (198.9212,606.1923) .. (194.3643,604.0657) .. controls (189.8579,601.9391) and
+ (186.1363,599.0530) .. (183.1996,595.4074) .. controls (180.2628,591.7618) and
+ (178.0603,587.5086) .. (176.5919,582.6478) .. controls (175.1742,577.7870) and
+ (174.4653,572.6477) .. (174.4653,567.2299) .. controls (174.4653,562.3691) and
+ (175.2248,557.6096) .. (176.7438,552.9512) .. controls (178.3134,548.2424) and
+ (180.5919,544.0145) .. (183.5793,540.2676) .. controls (186.4654,536.6727) and
+ (190.0351,533.7866) .. (194.2883,531.6092) .. controls (198.5921,529.3814) and
+ (203.4023,528.2675) .. (208.7188,528.2674) .. controls (214.1872,528.2675) and
+ (218.8708,529.1283) .. (222.7696,530.8497) .. controls (226.6684,532.5713) and
+ (229.8329,534.9258) .. (232.2634,537.9131) .. controls (234.5925,540.7486) and
+ (236.3140,544.0905) .. (237.4280,547.9385) .. controls (238.5925,551.7867) and
+ (239.1748,555.9640) .. (239.1749,560.4703) -- (239.1749,565.4830) --
+ (189.5794,565.4830) .. controls (189.5794,570.3945) and (190.0351,574.8503) ..
+ (190.9465,578.8503) .. controls (191.9085,582.8503) and (193.4022,586.3694) ..
+ (195.4276,589.4073) .. controls (197.4022,592.3441) and (199.9845,594.6732) ..
+ (203.1745,596.3948) .. controls (206.3644,598.0657) and (210.1619,598.9011) ..
+ (214.5670,598.9011) .. controls (219.0733,598.9011) and (222.9468,597.8631) ..
+ (226.1874,595.7872) .. controls (229.4785,593.6606) and (232.6431,589.8631) ..
+ (235.6812,584.3946) -- (240.9977,587.6605)(224.2127,559.1032) .. controls
+ (224.2126,556.2678) and (223.9595,553.2298) .. (223.4532,549.9892) .. controls
+ (222.9974,546.7487) and (222.2379,544.0398) .. (221.1747,541.8625) .. controls
+ (220.0101,539.5334) and (218.4151,537.6347) .. (216.3898,536.1663) .. controls
+ (214.3644,534.6980) and (211.7568,533.9638) .. (208.5669,533.9637) .. controls
+ (203.2504,533.9638) and (198.8200,536.1916) .. (195.2757,540.6473) .. controls
+ (191.7819,545.0525) and (189.8832,551.2044) .. (189.5794,559.1032) --
+ (224.2127,559.1032);
+ \path[fill=black] (321.9606,605.2809) -- (287.6311,605.2809) --
+ (287.6311,600.2682) .. controls (289.9096,600.0151) and (291.8336,599.7619) ..
+ (293.4033,599.5087) .. controls (295.0236,599.2556) and (295.8337,598.5973) ..
+ (295.8337,597.5340) .. controls (295.8337,597.0783) and (295.5805,596.3695) ..
+ (295.0742,595.4074) .. controls (294.5679,594.4454) and (294.0615,593.5593) ..
+ (293.5552,592.7492) .. controls (292.2893,590.7745) and (290.5425,588.1415) ..
+ (288.3147,584.8503) .. controls (286.1374,581.5086) and (283.4538,577.5338) ..
+ (280.2639,572.9262) .. controls (277.6310,576.2174) and (275.2006,579.4326) ..
+ (272.9727,582.5718) .. controls (270.7448,585.6605) and (268.4157,588.9517) ..
+ (265.9853,592.4454) .. controls (265.6309,592.9517) and (265.2511,593.5846) ..
+ (264.8460,594.3441) .. controls (264.4916,595.1036) and (264.3144,595.7112) ..
+ (264.3144,596.1669) .. controls (264.3144,597.2809) and (265.0232,598.2176) ..
+ (266.4410,598.9771) .. controls (267.9093,599.6860) and (270.0866,600.1670) ..
+ (272.9727,600.4201) -- (272.9727,605.2809) -- (245.2509,605.2809) --
+ (245.2509,600.5720) .. controls (248.6940,599.5594) and (251.4535,598.3442) ..
+ (253.5295,596.9264) .. controls (255.6561,595.4581) and (257.6054,593.6606) ..
+ (259.3776,591.5340) .. controls (260.9472,589.5086) and (263.1245,586.7238) ..
+ (265.9093,583.1794) .. controls (268.7448,579.6351) and (272.3904,574.8249) ..
+ (276.8462,568.7489) .. controls (274.2638,565.0527) and (271.0993,560.5463) ..
+ (267.3524,555.2298) .. controls (263.6561,549.8627) and (260.5928,545.4069) ..
+ (258.1624,541.8625) .. controls (256.8459,539.9385) and (255.3269,538.3942) ..
+ (253.6054,537.2296) .. controls (251.9345,536.0144) and (249.5547,535.4068) ..
+ (246.4661,535.4068) -- (246.4661,530.3940) -- (279.0487,530.3940) --
+ (279.0487,535.4068) .. controls (277.4284,535.4068) and (275.8335,535.5081) ..
+ (274.2639,535.7106) .. controls (272.6942,535.9132) and (271.9094,536.3689) ..
+ (271.9094,537.0777) .. controls (271.9094,537.5334) and (272.0613,538.0398) ..
+ (272.3651,538.5967) .. controls (272.6689,539.1537) and (273.0486,539.7613) ..
+ (273.5044,540.4195) .. controls (274.6183,542.1411) and (276.3398,544.7993) ..
+ (278.6690,548.3942) .. controls (281.0487,551.9893) and (283.6057,555.7868) ..
+ (286.3400,559.7868) .. controls (288.1121,557.3564) and (290.1627,554.5209) ..
+ (292.4919,551.2803) .. controls (294.8716,548.0399) and (297.0489,544.9512) ..
+ (299.0236,542.0144) .. controls (299.2261,541.6600) and (299.4286,541.2297) ..
+ (299.6312,540.7233) .. controls (299.8337,540.1664) and (299.9350,539.6347) ..
+ (299.9350,539.1283) .. controls (299.9350,538.0651) and (299.0489,537.2296) ..
+ (297.2768,536.6220) .. controls (295.5552,535.9638) and (293.9096,535.5081) ..
+ (292.3400,535.2549) -- (292.3400,530.3940) -- (319.9859,530.3940) --
+ (319.9859,535.1030) .. controls (316.0870,536.1157) and (313.0490,537.3309) ..
+ (310.8719,538.7486) .. controls (308.6946,540.1157) and (306.8464,541.7107) ..
+ (305.3275,543.5334) .. controls (303.6565,545.6095) and (301.6565,548.1664) ..
+ (299.3274,551.2044) .. controls (297.0489,554.2425) and (293.8337,558.4957) ..
+ (289.6818,563.9640) .. controls (294.2894,570.4451) and (298.0362,575.7617) ..
+ (300.9224,579.9136) .. controls (303.8084,584.0655) and (306.7199,588.3441) ..
+ (309.6567,592.7492) .. controls (311.1250,594.9770) and (312.7452,596.7492) ..
+ (314.5175,598.0657) .. controls (316.3402,599.3315) and (318.8212,600.0657) ..
+ (321.9606,600.2682) -- (321.9606,605.2809);
+ \path[fill=black] (396.9235,539.2802) .. controls (399.9107,542.8246) and
+ (402.2146,546.9512) .. (403.8349,551.6601) .. controls (405.5057,556.3184) and
+ (406.3412,561.6602) .. (406.3413,567.6856) .. controls (406.3412,573.6097) and
+ (405.3538,579.0275) .. (403.3792,583.9389) .. controls (401.4044,588.7998) and
+ (398.7968,592.9517) .. (395.5563,596.3948) .. controls (392.1638,599.8885) and
+ (388.3916,602.5721) .. (384.2398,604.4455) .. controls (380.0878,606.3189) and
+ (375.6826,607.2556) .. (371.0244,607.2556) .. controls (366.5180,607.2556) and
+ (362.8218,606.7493) .. (359.9357,605.7366) .. controls (357.0495,604.7240) and
+ (354.6951,603.5341) .. (352.8723,602.1670) -- (352.2647,602.1670) --
+ (352.2647,624.6482) .. controls (352.2647,626.4710) and (352.6191,627.9900) ..
+ (353.3280,629.2053) .. controls (354.0369,630.4204) and (355.1255,631.3065) ..
+ (356.5939,631.8635) .. controls (357.8090,632.3192) and (359.5306,632.7496) ..
+ (361.7585,633.1547) .. controls (364.0370,633.6103) and (365.9104,633.8635) ..
+ (367.3788,633.9142) -- (367.3788,639.0028) -- (325.5302,639.0028) --
+ (325.5302,633.9142) .. controls (327.0999,633.8129) and (328.6189,633.6863) ..
+ (330.0873,633.5344) .. controls (331.5556,633.3825) and (332.8721,633.1293) ..
+ (334.0367,632.7749) .. controls (335.5557,632.2686) and (336.6190,631.3825) ..
+ (337.2266,630.1167) .. controls (337.8342,628.8508) and (338.1380,627.3571) ..
+ (338.1380,625.6356) -- (338.1380,545.9638) .. controls (338.1380,544.4449) and
+ (337.7582,542.9765) .. (336.9987,541.5587) .. controls (336.2392,540.1410) and
+ (335.2519,539.0018) .. (334.0367,538.1410) .. controls (333.1253,537.5334) and
+ (331.8594,537.0777) .. (330.2392,536.7739) .. controls (328.6189,536.4195) and
+ (327.0492,536.1916) .. (325.5302,536.0903) -- (325.5302,531.1535) --
+ (351.0495,529.4826) -- (352.1128,530.3940) -- (352.1128,538.8245) --
+ (352.7204,538.9764) .. controls (355.3533,535.9385) and (358.6192,533.4068) ..
+ (362.5180,531.3814) .. controls (366.4167,529.3561) and (370.2902,528.3435) ..
+ (374.1384,528.3434) .. controls (378.7966,528.3435) and (383.0498,529.3308) ..
+ (386.8980,531.3054) .. controls (390.7967,533.2802) and (394.1385,535.9385) ..
+ (396.9234,539.2802)(384.5436,593.1289) .. controls (386.5688,589.9896) and
+ (388.0625,586.3440) .. (389.0246,582.1921) .. controls (389.9866,578.0402) and
+ (390.4676,573.4072) .. (390.4677,568.2932) .. controls (390.4676,564.5464) and
+ (390.0625,560.7235) .. (389.2525,556.8247) .. controls (388.4423,552.9260) and
+ (387.1764,549.5335) .. (385.4550,546.6474) .. controls (383.7334,543.7107) and
+ (381.4802,541.3309) .. (378.6954,539.5081) .. controls (375.9105,537.6853) and
+ (372.5687,536.7739) .. (368.6700,536.7739) .. controls (364.9230,536.7739) and
+ (361.7331,537.6094) .. (359.1002,539.2802) .. controls (356.4673,540.9005) and
+ (354.1888,542.8499) .. (352.2647,545.1284) -- (352.2647,589.4073) .. controls
+ (352.7204,590.7745) and (353.4546,592.1922) .. (354.4673,593.6606) .. controls
+ (355.5305,595.1289) and (356.6951,596.3948) .. (357.9610,597.4581) .. controls
+ (359.5306,598.7239) and (361.2268,599.7619) .. (363.0496,600.5720) .. controls
+ (364.8724,601.3315) and (367.1003,601.7113) .. (369.7333,601.7113) .. controls
+ (372.5687,601.7113) and (375.3029,600.9771) .. (377.9359,599.5087) .. controls
+ (380.5688,597.9897) and (382.7713,595.8631) .. (384.5436,593.1289);
+ \path[fill=black] (452.5949,605.2809) -- (416.0629,605.2809) --
+ (416.0629,600.2682) .. controls (417.2275,600.1670) and (418.4680,600.0657) ..
+ (419.7845,599.9644) .. controls (421.1009,599.8125) and (422.1895,599.6100) ..
+ (423.0503,599.3568) .. controls (424.4680,598.9011) and (425.5313,598.1163) ..
+ (426.2402,597.0024) .. controls (426.9491,595.8378) and (427.3035,594.3441) ..
+ (427.3035,592.5213) -- (427.3035,505.7862) .. controls (427.3035,503.9635) and
+ (426.8985,502.2672) .. (426.0883,500.6975) .. controls (425.3288,499.0773) and
+ (424.3161,497.8115) .. (423.0503,496.9000) .. controls (422.1389,496.2925) and
+ (420.4680,495.7355) .. (418.0376,495.2291) .. controls (415.6072,494.7229) and
+ (413.6578,494.4191) .. (412.1894,494.3177) -- (412.1894,489.4569) --
+ (440.3670,487.7100) -- (441.4303,488.8493) -- (441.4303,591.6099) .. controls
+ (441.4302,593.3821) and (441.7593,594.8505) .. (442.4176,596.0150) .. controls
+ (443.0758,597.1290) and (444.1391,597.9897) .. (445.6075,598.5973) .. controls
+ (446.7214,599.1037) and (447.8100,599.4834) .. (448.8734,599.7366) .. controls
+ (449.9873,599.9897) and (451.2278,600.1670) .. (452.5949,600.2682) --
+ (452.5949,605.2809);
+ \path[fill=black] (493.6840,633.0028) .. controls (488.9244,633.0027) and
+ (484.5700,632.3951) .. (480.6206,631.1800) .. controls (476.6711,630.0154) and
+ (473.2787,628.4204) .. (470.4432,626.3951) .. controls (467.6078,624.3697) and
+ (465.4052,622.0406) .. (463.8356,619.4077) .. controls (462.3166,616.7747) and
+ (461.5571,614.0658) .. (461.5571,611.2810) .. controls (461.5571,608.8000) and
+ (462.1647,606.5721) .. (463.3799,604.5974) .. controls (464.5951,602.5721) and
+ (466.5445,601.5594) .. (469.2280,601.5594) .. controls (472.2660,601.5594) and
+ (474.5699,602.3189) .. (476.1395,603.8379) .. controls (477.7598,605.3063) and
+ (478.5699,607.0025) .. (478.5699,608.9266) .. controls (478.5699,610.5468) and
+ (478.2914,612.5975) .. (477.7345,615.0785) .. controls (477.2281,617.5596) and
+ (476.8230,619.3317) .. (476.5193,620.3950) .. controls (476.8737,620.8507) and
+ (477.5066,621.4583) .. (478.4180,622.2178) .. controls (479.3800,622.9773) and
+ (480.5446,623.6609) .. (481.9117,624.2685) .. controls (483.5320,625.0280) and
+ (485.2282,625.6356) .. (487.0004,626.0913) .. controls (488.7725,626.5470) and
+ (491.2789,626.7748) .. (494.5195,626.7749) .. controls (497.5574,626.7748) and
+ (500.4689,626.2685) .. (503.2537,625.2559) .. controls (506.0892,624.2432) and
+ (508.5702,622.6229) .. (510.6969,620.3950) .. controls (512.9247,618.0659) and
+ (514.6462,615.3317) .. (515.8615,612.1924) .. controls (517.1272,609.1038) and
+ (517.7602,605.0278) .. (517.7602,599.9644) .. controls (517.7602,597.2302) and
+ (517.4564,594.5213) .. (516.8488,591.8378) .. controls (516.2918,589.1542) and
+ (515.2285,586.8251) .. (513.6589,584.8503) .. controls (512.0892,582.8757) and
+ (509.9373,581.3566) .. (507.2031,580.2933) .. controls (504.5195,579.1794) and
+ (501.1018,578.6224) .. (496.9499,578.6224) -- (487.0004,578.6224) --
+ (487.0004,569.8881) -- (493.6081,569.8881) .. controls (500.5954,569.8882) and
+ (505.6335,567.9641) .. (508.7221,564.1159) .. controls (511.8107,560.2678) and
+ (513.3551,554.4703) .. (513.3551,546.7233) .. controls (513.3551,540.3942) and
+ (511.8614,535.6347) .. (508.8740,532.4447) .. controls (505.8866,529.2042) and
+ (501.6587,527.5840) .. (496.1904,527.5839) .. controls (493.5574,527.5840) and
+ (491.3801,527.9131) .. (489.6586,528.5712) .. controls (487.9877,529.1789) and
+ (486.6206,529.7865) .. (485.5573,530.3940) .. controls (484.2915,531.1030) and
+ (483.2535,531.8878) .. (482.4434,532.7485) .. controls (481.6332,533.6093) and
+ (481.0256,534.2423) .. (480.6206,534.6472) .. controls (480.9750,536.2676) and
+ (481.4054,538.2676) .. (481.9117,540.6473) .. controls (482.4180,542.9765) and
+ (482.6712,545.2044) .. (482.6712,547.3309) .. controls (482.6712,549.2044) and
+ (481.8611,550.9006) .. (480.2408,552.4196) .. controls (478.6712,553.8880) and
+ (476.3420,554.6222) .. (473.2534,554.6222) .. controls (470.5698,554.6222) and
+ (468.5951,553.6602) .. (467.3293,551.7360) .. controls (466.1141,549.8120) and
+ (465.5065,547.5842) .. (465.5065,545.0524) .. controls (465.5065,542.4195) and
+ (466.2407,539.7360) .. (467.7090,537.0017) .. controls (469.1774,534.2676) and
+ (471.3546,531.7106) .. (474.2408,529.3307) .. controls (477.1268,526.9510) and
+ (480.6459,525.0270) .. (484.7978,523.5585) .. controls (488.9497,522.0902) and
+ (493.7346,521.3560) .. (499.1524,521.3560) .. controls (505.3803,521.3560) and
+ (510.5196,522.2928) .. (514.5703,524.1661) .. controls (518.6716,525.9890) and
+ (521.8868,528.2169) .. (524.2160,530.8497) .. controls (526.4944,533.4321) and
+ (528.0641,536.1410) .. (528.9249,538.9764) .. controls (529.7856,541.8119) and
+ (530.2160,544.2424) .. (530.2161,546.2676) .. controls (530.2160,548.7994) and
+ (529.8615,551.3563) .. (529.1527,553.9386) .. controls (528.4438,556.4703) and
+ (527.2792,558.8248) .. (525.6590,561.0020) .. controls (523.8868,563.3818) and
+ (521.5323,565.5590) .. (518.5957,567.5337) .. controls (515.7095,569.4578) and
+ (512.0639,571.0274) .. (507.6588,572.2426) -- (507.6588,573.4578) .. controls
+ (510.4943,573.7110) and (513.5070,574.3439) .. (516.6969,575.3566) .. controls
+ (519.9374,576.3693) and (522.8488,577.8629) .. (525.4312,579.8376) .. controls
+ (528.1147,581.9136) and (530.3172,584.5972) .. (532.0389,587.8883) .. controls
+ (533.7603,591.1289) and (534.6211,595.2555) .. (534.6212,600.2682) .. controls
+ (534.6211,609.9898) and (530.7223,617.8633) .. (522.9248,623.8887) .. controls
+ (515.1272,629.9647) and (505.3803,633.0027) .. (493.6840,633.0028);
+ \path[fill=maincolor] (239.7096,586.3724) .. controls (236.5703,592.3472) and
+ (232.3677,597.1067) .. (227.1019,600.6510) .. controls (221.8359,604.1954) and
+ (215.7852,605.9676) .. (208.9498,605.9676) .. controls (202.9244,605.9676) and
+ (197.6332,604.9043) .. (193.0762,602.7777) .. controls (188.5698,600.6510) and
+ (184.8482,597.7649) .. (181.9115,594.1193) .. controls (178.9748,590.4737) and
+ (176.7722,586.2205) .. (175.3038,581.3597) .. controls (173.8861,576.4989) and
+ (173.1772,571.3596) .. (173.1772,565.9418) .. controls (173.1772,561.0810) and
+ (173.9367,556.3215) .. (175.4557,551.6632) .. controls (177.0254,546.9543) and
+ (179.3039,542.7264) .. (182.2913,538.9795) .. controls (185.1773,535.3846) and
+ (188.7470,532.4985) .. (193.0002,530.3212) .. controls (197.3040,528.0934) and
+ (202.1142,526.9794) .. (207.4308,526.9794) .. controls (212.8991,526.9794) and
+ (217.5827,527.8402) .. (221.4816,529.5617) .. controls (225.3803,531.2833) and
+ (228.5449,533.6377) .. (230.9753,536.6250) .. controls (233.3044,539.4606) and
+ (235.0259,542.8024) .. (236.1399,546.6505) .. controls (237.3045,550.4987) and
+ (237.8867,554.6759) .. (237.8868,559.1822) -- (237.8868,564.1950) --
+ (188.2913,564.1950) .. controls (188.2913,569.1064) and (188.7470,573.5622) ..
+ (189.6584,577.5622) .. controls (190.6204,581.5623) and (192.1141,585.0813) ..
+ (194.1395,588.1193) .. controls (196.1142,591.0560) and (198.6965,593.3852) ..
+ (201.8864,595.1067) .. controls (205.0763,596.7776) and (208.8738,597.6131) ..
+ (213.2789,597.6130) .. controls (217.7853,597.6131) and (221.6587,596.5751) ..
+ (224.8993,594.4991) .. controls (228.1904,592.3725) and (231.3550,588.5750) ..
+ (234.3931,583.1066) -- (239.7096,586.3724)(222.9246,557.8151) .. controls
+ (222.9246,554.9797) and (222.6714,551.9417) .. (222.1651,548.7011) .. controls
+ (221.7094,545.4606) and (220.9499,542.7517) .. (219.8866,540.5744) .. controls
+ (218.7220,538.2454) and (217.1270,536.3466) .. (215.1017,534.8782) .. controls
+ (213.0764,533.4099) and (210.4687,532.6757) .. (207.2789,532.6756) .. controls
+ (201.9623,532.6757) and (197.5319,534.9036) .. (193.9876,539.3592) .. controls
+ (190.4939,543.7644) and (188.5951,549.9164) .. (188.2913,557.8151) --
+ (222.9246,557.8151);
+ \path[fill=maincolor] (320.6725,603.9929) -- (286.3430,603.9929) --
+ (286.3430,598.9801) .. controls (288.6215,598.7270) and (290.5456,598.4738) ..
+ (292.1152,598.2206) .. controls (293.7355,597.9675) and (294.5456,597.3093) ..
+ (294.5457,596.2459) .. controls (294.5456,595.7902) and (294.2924,595.0814) ..
+ (293.7862,594.1193) .. controls (293.2798,593.1573) and (292.7734,592.2712) ..
+ (292.2672,591.4611) .. controls (291.0013,589.4864) and (289.2544,586.8535) ..
+ (287.0266,583.5623) .. controls (284.8493,580.2205) and (282.1657,576.2457) ..
+ (278.9759,571.6381) .. controls (276.3429,574.9293) and (273.9125,578.1445) ..
+ (271.6846,581.2838) .. controls (269.4567,584.3724) and (267.1276,587.6636) ..
+ (264.6972,591.1573) .. controls (264.3428,591.6636) and (263.9630,592.2965) ..
+ (263.5580,593.0560) .. controls (263.2035,593.8155) and (263.0263,594.4231) ..
+ (263.0263,594.8788) .. controls (263.0263,595.9928) and (263.7352,596.9295) ..
+ (265.1529,597.6890) .. controls (266.6213,598.3979) and (268.7985,598.8789) ..
+ (271.6846,599.1321) -- (271.6846,603.9929) -- (243.9628,603.9929) --
+ (243.9628,599.2840) .. controls (247.4059,598.2713) and (250.1654,597.0561) ..
+ (252.2414,595.6383) .. controls (254.3680,594.1700) and (256.3174,592.3725) ..
+ (258.0896,590.2459) .. controls (259.6592,588.2206) and (261.8364,585.4357) ..
+ (264.6213,581.8914) .. controls (267.4567,578.3470) and (271.1023,573.5369) ..
+ (275.5581,567.4608) .. controls (272.9758,563.7646) and (269.8112,559.2582) ..
+ (266.0643,553.9417) .. controls (262.3681,548.5746) and (259.3047,544.1188) ..
+ (256.8744,540.5744) .. controls (255.5579,538.6504) and (254.0389,537.1061) ..
+ (252.3173,535.9415) .. controls (250.6464,534.7263) and (248.2667,534.1187) ..
+ (245.1780,534.1187) -- (245.1780,529.1060) -- (277.7607,529.1060) --
+ (277.7607,534.1187) .. controls (276.1404,534.1187) and (274.5454,534.2200) ..
+ (272.9758,534.4225) .. controls (271.4061,534.6251) and (270.6213,535.0808) ..
+ (270.6213,535.7896) .. controls (270.6213,536.2453) and (270.7732,536.7517) ..
+ (271.0770,537.3086) .. controls (271.3808,537.8656) and (271.7606,538.4732) ..
+ (272.2163,539.1314) .. controls (273.3302,540.8530) and (275.0517,543.5112) ..
+ (277.3809,547.1062) .. controls (279.7606,550.7012) and (282.3176,554.4987) ..
+ (285.0519,558.4987) .. controls (286.8240,556.0683) and (288.8747,553.2329) ..
+ (291.2038,549.9923) .. controls (293.5836,546.7518) and (295.7608,543.6631) ..
+ (297.7356,540.7263) .. controls (297.9380,540.3720) and (298.1406,539.9416) ..
+ (298.3432,539.4352) .. controls (298.5456,538.8783) and (298.6469,538.3466) ..
+ (298.6470,537.8402) .. controls (298.6469,536.7770) and (297.7608,535.9415) ..
+ (295.9887,535.3339) .. controls (294.2671,534.6757) and (292.6215,534.2200) ..
+ (291.0519,533.9668) -- (291.0519,529.1060) -- (318.6978,529.1060) --
+ (318.6978,533.8149) .. controls (314.7990,534.8276) and (311.7610,536.0428) ..
+ (309.5838,537.4605) .. controls (307.4065,538.8277) and (305.5584,540.4226) ..
+ (304.0394,542.2453) .. controls (302.3685,544.3214) and (300.3684,546.8784) ..
+ (298.0394,549.9163) .. controls (295.7608,552.9544) and (292.5456,557.2076) ..
+ (288.3937,562.6760) .. controls (293.0013,569.1571) and (296.7482,574.4736) ..
+ (299.6343,578.6255) .. controls (302.5204,582.7775) and (305.4318,587.0560) ..
+ (308.3686,591.4611) .. controls (309.8369,593.6890) and (311.4572,595.4611) ..
+ (313.2294,596.7776) .. controls (315.0521,598.0434) and (317.5332,598.7776) ..
+ (320.6725,598.9801) -- (320.6725,603.9929);
+ \path[fill=maincolor] (395.6354,537.9921) .. controls (398.6227,541.5365) and
+ (400.9265,545.6632) .. (402.5468,550.3720) .. controls (404.2177,555.0303) and
+ (405.0531,560.3722) .. (405.0532,566.3975) .. controls (405.0531,572.3216) and
+ (404.0658,577.7394) .. (402.0911,582.6508) .. controls (400.1164,587.5117) and
+ (397.5087,591.6636) .. (394.2683,595.1067) .. controls (390.8758,598.6004) and
+ (387.1036,601.2840) .. (382.9517,603.1574) .. controls (378.7997,605.0308) and
+ (374.3946,605.9676) .. (369.7363,605.9676) .. controls (365.2299,605.9676) and
+ (361.5337,605.4612) .. (358.6476,604.4486) .. controls (355.7615,603.4359) and
+ (353.4070,602.2460) .. (351.5843,600.8789) -- (350.9766,600.8789) --
+ (350.9766,623.3602) .. controls (350.9766,625.1829) and (351.3311,626.7019) ..
+ (352.0400,627.9172) .. controls (352.7488,629.1323) and (353.8374,630.0184) ..
+ (355.3058,630.5754) .. controls (356.5210,631.0311) and (358.2425,631.4615) ..
+ (360.4704,631.8666) .. controls (362.7489,632.3223) and (364.6223,632.5754) ..
+ (366.0907,632.6261) -- (366.0907,637.7147) -- (324.2422,637.7147) --
+ (324.2422,632.6261) .. controls (325.8118,632.5248) and (327.3308,632.3982) ..
+ (328.7992,632.2463) .. controls (330.2676,632.0944) and (331.5840,631.8412) ..
+ (332.7486,631.4868) .. controls (334.2676,630.9805) and (335.3309,630.0944) ..
+ (335.9385,628.8286) .. controls (336.5461,627.5627) and (336.8499,626.0690) ..
+ (336.8499,624.3475) -- (336.8499,544.6758) .. controls (336.8499,543.1568) and
+ (336.4701,541.6884) .. (335.7107,540.2706) .. controls (334.9511,538.8530) and
+ (333.9638,537.7137) .. (332.7486,536.8529) .. controls (331.8372,536.2453) and
+ (330.5714,535.7896) .. (328.9511,535.4858) .. controls (327.3308,535.1314) and
+ (325.7612,534.9036) .. (324.2422,534.8022) -- (324.2422,529.8655) --
+ (349.7614,528.1945) -- (350.8247,529.1060) -- (350.8247,537.5364) --
+ (351.4323,537.6883) .. controls (354.0653,534.6504) and (357.3311,532.1187) ..
+ (361.2299,530.0933) .. controls (365.1287,528.0680) and (369.0021,527.0554) ..
+ (372.8503,527.0553) .. controls (377.5085,527.0554) and (381.7617,528.0427) ..
+ (385.6099,530.0174) .. controls (389.5087,531.9921) and (392.8505,534.6504) ..
+ (395.6354,537.9921)(383.2555,591.8408) .. controls (385.2808,588.7016) and
+ (386.7744,585.0560) .. (387.7365,580.9040) .. controls (388.6985,576.7521) and
+ (389.1795,572.1191) .. (389.1796,567.0051) .. controls (389.1795,563.2583) and
+ (388.7745,559.4354) .. (387.9644,555.5366) .. controls (387.1542,551.6379) and
+ (385.8884,548.2455) .. (384.1669,545.3593) .. controls (382.4453,542.4226) and
+ (380.1921,540.0428) .. (377.4073,538.2200) .. controls (374.6224,536.3972) and
+ (371.2806,535.4858) .. (367.3819,535.4858) .. controls (363.6350,535.4858) and
+ (360.4451,536.3213) .. (357.8122,537.9921) .. controls (355.1792,539.6125) and
+ (352.9007,541.5618) .. (350.9766,543.8403) -- (350.9766,588.1193) .. controls
+ (351.4323,589.4864) and (352.1665,590.9041) .. (353.1792,592.3725) .. controls
+ (354.2425,593.8409) and (355.4070,595.1067) .. (356.6729,596.1700) .. controls
+ (358.2425,597.4358) and (359.9387,598.4738) .. (361.7616,599.2839) .. controls
+ (363.5843,600.0434) and (365.8122,600.4232) .. (368.4452,600.4232) .. controls
+ (371.2806,600.4232) and (374.0148,599.6890) .. (376.6478,598.2206) .. controls
+ (379.2807,596.7016) and (381.4833,594.5750) .. (383.2555,591.8408);
+ \path[fill=basecolor] (451.3069,603.9929) -- (414.7748,603.9929) --
+ (414.7748,598.9801) .. controls (415.9394,598.8789) and (417.1799,598.7776) ..
+ (418.4964,598.6763) .. controls (419.8128,598.5245) and (420.9015,598.3219) ..
+ (421.7622,598.0687) .. controls (423.1800,597.6130) and (424.2433,596.8282) ..
+ (424.9521,595.7143) .. controls (425.6610,594.5497) and (426.0154,593.0560) ..
+ (426.0155,591.2332) -- (426.0155,504.4981) .. controls (426.0154,502.6754) and
+ (425.6104,500.9792) .. (424.8002,499.4094) .. controls (424.0407,497.7893) and
+ (423.0281,496.5234) .. (421.7622,495.6119) .. controls (420.8508,495.0044) and
+ (419.1799,494.4475) .. (416.7495,493.9410) .. controls (414.3191,493.4348) and
+ (412.3697,493.1310) .. (410.9014,493.0296) -- (410.9014,488.1688) --
+ (439.0789,486.4219) -- (440.1422,487.5612) -- (440.1422,590.3218) .. controls
+ (440.1422,592.0940) and (440.4713,593.5624) .. (441.1295,594.7269) .. controls
+ (441.7877,595.8409) and (442.8510,596.7016) .. (444.3195,597.3092) .. controls
+ (445.4334,597.8156) and (446.5220,598.1953) .. (447.5853,598.4485) .. controls
+ (448.6992,598.7017) and (449.9397,598.8789) .. (451.3069,598.9801) --
+ (451.3069,603.9929);
+ \path[fill=basecolor] (492.3959,631.7147) .. controls (487.6364,631.7147) and
+ (483.2819,631.1071) .. (479.3325,629.8919) .. controls (475.3831,628.7273) and
+ (471.9906,627.1323) .. (469.1552,625.1070) .. controls (466.3197,623.0817) and
+ (464.1171,620.7525) .. (462.5475,618.1196) .. controls (461.0285,615.4866) and
+ (460.2690,612.7778) .. (460.2690,609.9929) .. controls (460.2690,607.5119) and
+ (460.8766,605.2840) .. (462.0918,603.3093) .. controls (463.3070,601.2840) and
+ (465.2564,600.2713) .. (467.9400,600.2713) .. controls (470.9780,600.2713) and
+ (473.2818,601.0308) .. (474.8514,602.5498) .. controls (476.4717,604.0182) and
+ (477.2818,605.7144) .. (477.2819,607.6385) .. controls (477.2818,609.2587) and
+ (477.0033,611.3094) .. (476.4464,613.7904) .. controls (475.9400,616.2715) and
+ (475.5350,618.0436) .. (475.2312,619.1069) .. controls (475.5856,619.5626) and
+ (476.2185,620.1702) .. (477.1300,620.9298) .. controls (478.0920,621.6892) and
+ (479.2565,622.3728) .. (480.6237,622.9804) .. controls (482.2439,623.7399) and
+ (483.9401,624.3475) .. (485.7123,624.8032) .. controls (487.4845,625.2589) and
+ (489.9908,625.4868) .. (493.2314,625.4868) .. controls (496.2694,625.4868) and
+ (499.1808,624.9804) .. (501.9657,623.9678) .. controls (504.8011,622.9551) and
+ (507.2821,621.3348) .. (509.4088,619.1069) .. controls (511.6366,616.7778) and
+ (513.3581,614.0436) .. (514.5734,610.9043) .. controls (515.8392,607.8157) and
+ (516.4721,603.7397) .. (516.4721,598.6763) .. controls (516.4721,595.9421) and
+ (516.1683,593.2333) .. (515.5607,590.5497) .. controls (515.0037,587.8661) and
+ (513.9404,585.5370) .. (512.3708,583.5622) .. controls (510.8011,581.5876) and
+ (508.6492,580.0686) .. (505.9151,579.0052) .. controls (503.2314,577.8913) and
+ (499.8137,577.3344) .. (495.6618,577.3343) -- (485.7123,577.3343) --
+ (485.7123,568.6001) -- (492.3200,568.6001) .. controls (499.3074,568.6001) and
+ (504.3454,566.6760) .. (507.4341,562.8279) .. controls (510.5227,558.9797) and
+ (512.0670,553.1822) .. (512.0670,545.4352) .. controls (512.0670,539.1061) and
+ (510.5733,534.3466) .. (507.5860,531.1566) .. controls (504.5985,527.9162) and
+ (500.3707,526.2959) .. (494.9023,526.2958) .. controls (492.2693,526.2959) and
+ (490.0921,526.6250) .. (488.3706,527.2831) .. controls (486.6996,527.8908) and
+ (485.3325,528.4984) .. (484.2693,529.1060) .. controls (483.0034,529.8149) and
+ (481.9654,530.5997) .. (481.1553,531.4604) .. controls (480.3451,532.3213) and
+ (479.7375,532.9542) .. (479.3325,533.3592) .. controls (479.6869,534.9795) and
+ (480.1173,536.9795) .. (480.6237,539.3592) .. controls (481.1300,541.6884) and
+ (481.3831,543.9163) .. (481.3832,546.0429) .. controls (481.3831,547.9164) and
+ (480.5730,549.6126) .. (478.9527,551.1315) .. controls (477.3831,552.5999) and
+ (475.0539,553.3341) .. (471.9653,553.3341) .. controls (469.2817,553.3341) and
+ (467.3070,552.3721) .. (466.0412,550.4480) .. controls (464.8260,548.5240) and
+ (464.2184,546.2961) .. (464.2184,543.7643) .. controls (464.2184,541.1315) and
+ (464.9526,538.4479) .. (466.4210,535.7136) .. controls (467.8893,532.9795) and
+ (470.0666,530.4225) .. (472.9527,528.0426) .. controls (475.8388,525.6630) and
+ (479.3578,523.7389) .. (483.5098,522.2704) .. controls (487.6617,520.8021) and
+ (492.4465,520.0680) .. (497.8643,520.0679) .. controls (504.0922,520.0680) and
+ (509.2315,521.0047) .. (513.2822,522.8780) .. controls (517.3835,524.7009) and
+ (520.5987,526.9288) .. (522.9279,529.5617) .. controls (525.2064,532.1440) and
+ (526.7760,534.8529) .. (527.6368,537.6883) .. controls (528.4975,540.5239) and
+ (528.9279,542.9543) .. (528.9280,544.9795) .. controls (528.9279,547.5113) and
+ (528.5735,550.0683) .. (527.8647,552.6505) .. controls (527.1557,555.1822) and
+ (525.9912,557.5367) .. (524.3710,559.7139) .. controls (522.5987,562.0937) and
+ (520.2443,564.2709) .. (517.3076,566.2456) .. controls (514.4214,568.1697) and
+ (510.7758,569.7393) .. (506.3708,570.9545) -- (506.3708,572.1697) .. controls
+ (509.2062,572.4229) and (512.2189,573.0558) .. (515.4088,574.0685) .. controls
+ (518.6493,575.0812) and (521.5607,576.5749) .. (524.1431,578.5495) .. controls
+ (526.8266,580.6255) and (529.0292,583.3091) .. (530.7508,586.6003) .. controls
+ (532.4722,589.8408) and (533.3330,593.9674) .. (533.3331,598.9801) .. controls
+ (533.3330,608.7018) and (529.4342,616.5753) .. (521.6368,622.6007) .. controls
+ (513.8391,628.6766) and (504.0922,631.7147) .. (492.3959,631.7147);
+\end{tikzpicture}
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\publicationmonth{March}
+\publicationyear{2014}
+\publicationissue{9}
+
+\usepackage{multicol}
+\usepackage{xparse}
+\newcommand\ctanpkg[1]{\href{http://ctan.org/pkg/#1}{\pkg{#1}}}
+
+\begin{document}
+\maketitle
+
+\raisefirstsection
+
+\tableofcontents % could drop this and raise first section instead
+
+\section{Hiatus?}
+
+Well, it's been a busy couple of years.
+Work has slowed on the \LaTeX3 codebase as all active members of the team have been\Dash shall we say\Dash busily occupied with more pressing concerns in their day-to-day activities.
+
+Nonetheless, Joseph and Bruno have continued to fine-tune the \LaTeX3 kernel and add-on packages.
+Browsing through the commit history shows bug fixes and improvements to documentation, test files, and internal code across the entire breadth of the codebase.
+
+Members of the team have presented at two TUG conferences since the last \LaTeX3 news. (Has it really been so long?)
+In July 2012, Frank and Will travelled to Boston; Frank discussed the challenges faced in the past and continuing to the present day due to the limits of the various \TeX\ engines; and, Frank and Will together covered a brief history and recent developments of the \pkg{expl3} code.
+
+In 2013, Joseph and Frank wrote a talk on complex layouts, and the "layers" ideas discussed in \LaTeX3; Frank went to Tokyo in October to present the work.
+Slides of and recordings from these talks are available on the \LaTeX3 website.
+
+These conferences are good opportunities to introduce the \pkg{expl3} language to a wider group of people; in many cases, explaining the rationale behind why \pkg{expl3} looks a little strange at first helps to convince the audience that it's not so weird after all.
+In our experience, anyone that's been exposed to some of the more awkward expansion aspects of \TeX\ programming appreciates how \pkg{expl3} makes life much easier for us.
+
+\section{\pkg{expl3} in the community}
+
+While things have been slightly quieter for the team, more and more people are adopting \pkg{expl3} for their own use.
+A search on the \TeX\ Stack Exchange website for either "\texttt{expl3}" or "\texttt{latex3}" at time of writing yield around one thousand results each.
+
+In order to help standardise the prefixes used in \pkg{expl3} modules, we have developed a registration procedure for package authors (which amounts to little more than notifying us that their package uses a specific prefix, which will often be the name of the package itself).
+Please contact us via the \texttt{latex-l} mailing list to register your module prefixes and package names; we ask that you avoid using package names that begin with \texttt{l3...}\ since \pkg{expl3} packages use this internally.
+Some authors have started using the package prefix \texttt{lt3...}\ as a way of indicating their package builds on \pkg{expl3} in some way but is not maintained by the \LaTeX3 team.
+
+In the prefix database at present, some thirty package prefixes are registered by fifteen separate individuals (unrelated to the \LaTeX3 project\Dash the number of course grows if you include packages by members of the team).
+These packages cover a broad range of functionality:
+\begin{description}
+\item[\ctanpkg{acro}] Interface for creating (classes of) acronyms
+\item[\ctanpkg{hobby}]
+Hobby's algorithm in PGF/TiKZ for drawing optimally smooth curves.
+\item[\ctanpkg{chemmacros}] Typesetting in the field of chemistry.
+\item[\ctanpkg{classics}] Traditional-style citations for the classics.
+\item[\ctanpkg{conteq}] Continued (in)equalities in mathematics.
+\item[\ctanpkg{ctex}] A collection of macro packages and document classes for Chinese typesetting.
+\item[\ctanpkg{endiagram}] Draw potential energy curve diagrams.
+\item[\ctanpkg{enotez}] Support for end-notes.
+\item[\ctanpkg{exsheets}] Question sheets and exams with metadata.
+%(Note to self: remember to use this for teaching this semester!)
+\item[\ctanpkg{lt3graph}] A graph data structure.
+\item[\ctanpkg{newlfm}] The venerable class for memos and letters.
+\item[\ctanpkg{fnpct}] Interaction between footnotes and punctuation.
+\item[\ctanpkg{GS1}] Barcodes and so forth.
+\item[\ctanpkg{hobete}] Beamer theme for the Univ.\ of Hohenheim.
+\item[\ctanpkg{kantlipsum}] Generate sentences in Kant's style.
+\item[\ctanpkg{lualatex-math}] Extended support for mathematics in \LuaLaTeX.
+\item[\ctanpkg{media9}] Multimedia inclusion for Adobe Reader.
+\item[\ctanpkg{pkgloader}] Managing the options and loading order of other packages.
+\item[\ctanpkg{substances}] Lists of chemicals, etc., in a document.
+\item[\ctanpkg{withargs}] Ephemeral macro use.
+\item[\ctanpkg{xecjk}] Support for CJK documents in \XeLaTeX.
+\item[\ctanpkg{xpatch}, \ctanpkg{regexpatch}] Patch command definitions.
+\item[\ctanpkg{xpeek}] Commands that peek ahead in the input stream.
+\item[\ctanpkg{xpinjin}] Automatically add pinyin to Chinese characters
+\item[\ctanpkg{zhnumber}] Typeset Chinese representations of numbers
+\item[\ctanpkg{zxjatype}] Standards-conforming typesetting of Japanese for \XeLaTeX.
+\end{description}
+Some of these packages are marked by their authors as experimental, but it is clear that these packages have been developed to solve specific needs for typesetting and document production.
+
+The \pkg{expl3} language has well and truly gained traction after many years of waiting patiently.
+
+\section[Logo for the \LaTeX3 Programming Language]
+ {A logo for the \LaTeX3 Programming Language}
+
+To show that \pkg{expl3} is ready for general use Paulo Cereda drew up a nice logo for us, showing a \mbox{hummingbird} (agile and fast\Dash but needs huge amounts of energy) picking at "l3". Big thanks to Paulo!
+\begin{center}
+\explogo
+\end{center}
+
+\section{Recent activity}
+
+\LaTeX3 work has only slowed, not ground to a halt.
+While changes have tended to be minor in recent times, there are a number of improvements worth discussing explicitly.
+\begin{enumerate}
+\item
+Bruno has extended the floating point code to cover additional functions such as inverse trigonometric functions.
+These additions round out the functionality well and make it viable for use in most cases needing floating point mathematics.
+\item
+Joseph's refinement of the experimental galley code now allows separation of paragraph shapes from margins/cutouts.
+This still needs some testing!
+\item
+For some time now \pkg{expl3} has provided "native" drivers although they have not been selected by default in most cases.
+These have been revised to improve robustness, which makes them probably ready to enable by default.
+The improvements made to the drivers have also fed back to more "general" \LaTeX\ code.
+\end{enumerate}
+
+
+\section{Work in progress}
+
+We're still actively discussing a variety of areas to tackle next.
+We are aware of various "odds and ends" in \pkg{expl3} that still need sorting out.
+In particular, some experimental functions have been working quite well and it's time to assess moving them into the "stable" modules, in particular the \pkg{l3str} module for dealing with catcode-twelve token lists more commonly known in \pkg{expl3} as \emph{strings}.
+
+Areas of active discussion including issues around uppercasing and lowercasing (and the esoteric ways that this can be achieved in \TeX) and space skipping (or not) in commands and environments with optional arguments.
+These two issues are discussed next.
+
+\subsection{Uppercasing and lowercasing}
+
+The commands \verb"\tl_to_lowercase:n" and \verb"\tl_to_uppercase:n" have long been overdue for a good hard look.
+From a traditional \TeX\ viewpoint, these commands are simply the primitive \verb"\lowercase" and \verb"\uppercase", and in practice it's well known that there are various limitations and peculiarities associated with them.
+We know these commands are good, to one extent or another, for three things:
+\begin{enumerate}
+\item
+Uppercasing text for typesetting purposes such as all-uppercase titles.
+\item
+Lowercasing text for normalisation in sorting and other applications such as filename comparisons.
+\item
+Achieving special effects, in concert with manipulating \verb"\uccode" and the like, such as defining commands that contain characters with different catcodes than usual.
+\end{enumerate}
+We are working on providing a set of commands to achieve all three of these functions in a more direct and easy-to-use fashion, including support for Unicode in \LuaLaTeX\ and \XeLaTeX.
+
+\pagebreak
+
+\subsection{Space-skipping in \pkg{xparse}}
+
+We have also re-considered the behaviour of space-skipping in \pkg{xparse}.
+Consider the following examples:
+\begin{verbatim}
+\begin{dmath} \begin{dmath}[label=foo]
+[x y z] = [1 2 3] x^2 + y^2 = z^2
+\end{dmath} \end{dmath}
+\end{verbatim}
+In the first case, we are typesetting some mathematics that contains square brackets.
+In the second, we are assigning a label to the equation using an optional argument, which also uses brackets.
+The fact that both work correctly is due to behaviour that is specifically programmed into the workings of the \texttt{dmath} environment of \pkg{breqn}: spaces before an optional argument are explicitly forbidden.
+At present, this is also how commands and environments defined using \pkg{xparse} behave.
+But consider a \pkg{pgfplots} environment:
+\begin{verbatim}
+\begin{pgfplot}
+ [
+ % plot options
+ ]
+ \begin{axis}
+ [
+ % axis options
+ ]
+ ...
+ \end{axis}
+\end{pgfplot}
+\end{verbatim}
+This would seem like quite a natural way to write such environments, but with the current state of \pkg{xparse} this syntax would be incorrect. One would have to write either of these instead:
+\begin{multicols}{2}
+\begin{verbatim}
+\begin{pgfplot}%
+ [
+ % plot options
+ ]
+\end{verbatim}
+\begin{verbatim}
+\begin{pgfplot}[
+ % plot options
+ ]
+\end{verbatim}
+\end{multicols}
+Is this an acceptable compromise?
+We're not entirely sure here\Dash we're in a corner because the humble \texttt{[} has ended up being part of both the syntax and semantics of a \LaTeX\ document.
+
+%There is one further matter to consider and that is how "control symbols" such as \verb"\\" behave in such matters.
+%Because \TeX\ does not skip spaces after control symbols, neither does \pkg{xparse}; therefore control symbols are a solution if one desires a command to use in a mathematics context where an optional argument could cause issues.
+%An example for this from \pkg{amsmath} is line breaks in multi-line display equations:
+%\begin{verbatim}
+%\begin{align}
+%a &= b+c \\
+%[x y z] &= [1 2 3]
+%\end{align}
+%\end{verbatim}
+%In \pkg{amsmath} this requires specific measures to be taken to allow \verb"\\" to behave correctly; with \pkg{xparse} this functionality is built in.
+
+Despite the current design covering most regular use-cases, we have considered adding a further option to \pkg{xparse} to define the space-skipping behaviour as desired by a package author.
+But at this very moment we've rejected adding this additional complexity, because environments that change their parsing behaviour based on their intended use make a \LaTeX-based language more difficult to predict; one could imagine such behaviour causing difficulties down the road for automatic syntax checkers and so forth.
+However, we don't make such decisions in a vacuum and we're always happy to continue to discuss such matters.
+
+
+\section{\ldots and for 2014 onwards}
+
+There is one (understandable) misconception that shows up once in a while with people claiming that
+\[
+ \textrm{\pkg{expl3}} = \textrm{\LaTeX3}.
+\]
+However, the correct relation would be a subset,
+\[
+ \textrm{\pkg{expl3}} \subset \textrm{\LaTeX3},
+\]
+with \pkg{expl3} forming the Core Language Layer on which there will eventually be several other layers on top that \mbox{provide}
+\begin{itemize}
+\item higher-level concepts for typesetting (Typesetting Foundation Layer),
+\item a designer interface for specifying document structures and layouts (Designer Layer),
+\item and finally a Document Representation Layer that implements document level syntax.
+\end{itemize}
+Of those four layers, the lowest one\Dash\pkg{expl3}\Dash is available for use and with \pkg{xparse} we have an instance of the Document Representation Layer modeled largely after \LaTeXe{} syntax (there could be others). Both can be successfully used within the current \LaTeXe{} framework and as mentioned above this is increasingly happening.
+
+The middle layers, however, where the rubber meets the road, are still at the level of prototypes and ideas (templates, \pkg{ldb}, galley, \pkg{xor} and all the good stuff) that need to be revised and further developed to arrive at a \LaTeX3 environment that can stand on its own and that is to where we want to return in 2014.
+
+An overview on this can be found in the answer to "What can *I* do to help the \LaTeX3 project?"\ on Stack Exchange,\footnote{\url{http://tex.stackexchange.com/questions/45838}}
+which is reproduced below in slightly abridged form.
+This is of course not the first time that we have discussed such matters, and you can find similar material in other publications such as those at \url{http://latex-project.org}; e.g., the architecture talk given at the TUG 2011 conference.
+
+\bigskip
+
+\begin{center}
+\explbanner
+\end{center}
+
+\newpage
+\section{What can you do for the \LaTeX3 project?}
+\textbf{By Frank Mittelbach}
+
+My vision of \LaTeX3 is really a system with multiple layers that provide interfaces for different kinds of roles. These layers are
+\begin{itemize}
+\item the underlying engine (some \TeX\ variant)
+\item the programming layer (the core language, i.e., \pkg{expl3})
+\item the typesetting foundation layer (providing higher-level concepts for typesetting)
+\item the typesetting element layer (templates for all types of document elements)
+\item the designer interface foundation layer
+\item the class designer layer (where instances of document elements with specific settings are defined)
+\item document representation layer (that provides the input syntax, i.e., how the author uses elements)
+\end{itemize}
+If you look at it from the perspective of user roles then there are at least three or four roles that you can clearly distinguish:
+\begin{itemize}
+\item The Programmer (template and functionality provider)
+\item The Document Type Designer (defines which elements are available; abstract syntax and semantics)
+\item The Designer (typography and layout)
+\item The Author (content)
+\end{itemize}
+As a consequence the \LaTeX3 Project needs different kinds of help depending on what layer or role we are looking at.
+
+The "Author" is using, say, list structures by specifying something like \verb"\begin{itemize} \item" in his documents. Or perhaps by writing \Verb|<ul> ... </ul>| or whatever the UI representation offers to him.
+
+The "Document Type Designer" defines what kind of abstract document elements are available, and what attributes or arguments those elements provide at the author level. E.g., he may specify that a certain class of documents provides the display lists "enumerate", "itemize" and "description".
+
+The "Programmer" on the other hand implements templates (that offer customizations) for such document elements, e.g., for display lists. What kind of customization possibilities should be provided by the "Programmer" is the domain of the "Document Designer"; he drives what kind of flexibility he needs for the design. In most cases the "Document Designer" should be able to simply select templates (already written) from a template library and only focus on the design, i.e., instantiating the templates with values so that the desired layout for "itemize" lists, etc., is created.
+
+In real life a single person may end up playing more than one role, but it is important to recognise that all of them come with different requirements with respect to interfaces and functionality.
+
+\subsection{Programming Layer}
+
+The programming layer consists of a core language layer (called \pkg{expl3} (EXP erimental L aTeX 3) for historical reasons and now we are stuck with it \texttt{:-)}) and two more components: the "Typesetting Foundation Layer" that we are currently working on and the "Typesetting Element Layer" that is going to provide customizable objects for the design layer. While \pkg{expl3} is in many parts already fairly complete and usable the other two are under construction.
+
+Help is needed for the programming layer in
+\begin{itemize}
+\item helping by extending and completing the regression test suite for \pkg{expl3}
+\item helping with providing good or better documentation, including tutorials
+\item possibly helping in coding additional core functionality\Dash but that requires, in contrast to the first two points, a good amount of commitment and experience with the core language as otherwise the danger is too high that the final results will end up being inconsistent
+\end{itemize}
+Once we are a bit further along with the "Typesetting Foundation Layer" we would need help in
+providing higher-level functionality, perhaps rewriting existing packages/code for elements making use of extended possibilities.
+Two steps down the road (once the "\mbox{Designer} Layer" is closer to being finalized) we would need help with developing templates for all kinds of elements.
+
+In summary for this part, we need help from people interested in programming in \TeX\ and \pkg{expl3} and/or interested in providing documentation (but for this a thorough understanding of the programming concepts is necessary too).
+
+\subsection{Design Layer}
+
+The intention of the design layer is to provide interfaces that allow specifying layout and typography styles in a declarative way. On the implementation side there are a number of prototypes (most notably \pkg{xtemplate} and the recent reimplementation of \pkg{ldb}).
+These need to be unified into a common model which requires some more experimentation and probably also some further thoughts.
+
+But the real importance of this layer is not the implementation of its interfaces but the conceptual view of it: provisioning a rich declarative method (or methods) to describe design and layout. I.e., enabling a designer to think not in programs but in visual representations and relationships.
+
+So here is the big area where people who do not feel they can or want to program \TeX's bowels can help. What would be extremely helpful (and in fact not just for \LaTeX3) would be
+\begin{itemize}
+\item collecting and classifying a \emph{huge} set of layouts and designs
+\begin{itemize}[nosep]
+\item designs for individual document elements (such as headings, TOCs, etc)
+\item document designs that include relationships between document elements
+\end{itemize}
+\item thinking about good, declarative ways to specify such designs
+\begin{itemize}[nosep]
+\item what needs to be specified
+\item to what extent and with what flexibility
+\end{itemize}
+\end{itemize}
+I believe that this is a huge task (but rewarding in itself) and already the first part of collecting existing design specifications will be a major undertaking and will need coordination and probably a lot of work. But it will be a huge asset towards testing any implementations and interfaces for this layer later on.
+
+\subsection{Document Interface Layer}
+
+If we get the separation done correctly, then this layer should effectively offer nothing more than a front end for parsing the document syntax and transforming it into an internal standardised form. This means that on this layer one should not see any (or not much) coding or computation.
+
+It is envisioned that alternative document syntax models can be provided.
+At the moment we have a draft solution in \pkg{xparse}.
+This package offers a document syntax in the style of \LaTeXe, that is with \verb|*|-forms, optional arguments in brackets, etc., but with a few more bells and whistles such as a more generalized concept of default values, support for additional delimiters for arguments, verbatim-style arguments, and so on.
+It is fairly conventional though.
+In addition when it was written the clear separation of layers wasn't well-defined and so the package also contains components for conditional programming that I no longer think should be there.
+
+Bottom line on what is needed for this layer is to
+\begin{itemize}
+\item think about good syntax for providing document content from "the author" perspective
+\item think about good syntax for providing document content from an "application to typesetting" perspective, i.e., the syntax and structure for automated typesetting where the content is prepared by a system/application rather than by a human
+\end{itemize}
+These two areas most likely need strict structure (as automation works much better with structures that do not have a lot of alternative possibilities and shortcuts, etc.) and even when just looking at the human author a lot of open questions need answering.
+And these answers may or may not be to painfully stick with existing \LaTeXe\ conventions in all cases (or perhaps with any?).
+
+None of this requires coding or \pkg{expl3} experience. What it requires is familiarity with existing input concepts, a feel for where the pain points currently are and the willingness to think and discuss what alternatives and extensions could look like.
+
+\subsection{In Summary}
+
+Basically help is possible on any level and it doesn't need to involve programming. Thoughts are sprinkled throughout this article, but here are a few more highlights:
+\begin{itemize}
+\item help with developing/improving the core programming layer by
+\begin{itemize}[nosep]
+\item joining the effort to improve the test suite
+\item help improving the existing (or not existing) documentation
+\item joining the effort to produce core or auxiliary code modules
+\end{itemize}
+\item help on the design layer by
+\begin{itemize}[nosep]
+\item collecting and classifying design tasks
+\item thinking and suggesting ways to describe layout requirements in a declarative manner
+\end{itemize}
+\item help on shaping the document interface layer
+\end{itemize}
+These concepts, as well as their implementation, are under discussion on the list \texttt{latex-l}.\footnote{Instructions for joining and browsing archives at:\\ \url{http://latex-project.org/code.html}}
+The list has only a fairly low level of traffic right now as actual implementation and development tasks are typically discussed directly among the few active implementors. But this might change if more people join.
+
+\subsection{And something else \dots}
+
+The people on the \LaTeX3 team are also committed to keeping \LaTeXe\ stable and even while there isn't that much to do these days there remains the need to resolve bug reports (if they concern the 2e core), provide new distributions once in a while, etc. All this is work that takes effort or remains undone or incomplete. Thus here too, it helps the \LaTeX3 efforts if we get help to free up resources.
+
+\end{document}
+
+
+
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf
new file mode 100644
index 0000000000..5f866c8906
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.tex b/macros/latex/contrib/l3kernel/l3news10.tex
new file mode 100644
index 0000000000..c8ac0dffbe
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news10.tex
@@ -0,0 +1,220 @@
+% Copyright 2016 The LaTeX3 Project
+\documentclass{ltnews}
+
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{csquotes}
+\usepackage{hologo}
+\usepackage{ragged2e}
+\usepackage{underscore}
+
+\AtBeginDocument{%
+ \renewcommand*{\LaTeXNews}{\LaTeX3~News}%
+ \RaggedRight
+ \setlength\parindent{1em}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\publicationmonth{November}
+\publicationyear{2016}
+\publicationissue{10}
+
+% Avoid hyphenation of csnames
+\makeatletter
+\protected\edef\cs#1{%
+ \noexpand\path{\@backslashchar#1}%
+}
+\makeatother
+
+\begin{document}
+
+\maketitle
+
+There has been something of a gap since the last \LaTeX3 News, but this does
+not mean that work has not been going on. The Team have been working on a
+number of areas, many of which reflect wider take-up of \pkg{expl3}. There have
+also been a number of significant new developments in the \LaTeX3
+\enquote{sphere} in the last two years.
+
+\section{\pkg{l3build}: Testing \LaTeX{} packages}
+
+Testing has been an important part of the work of the team since they assumed
+maintenance of \LaTeX{} over twenty years ago. Various scripts have been used
+over that time by the team for testing, but these have until recently not been
+set up for wider use.
+
+With the general availability of \hologo{LuaTeX} it is now possible to be sure
+that every \TeX{} user has a powerful general scripting language available:
+Lua. The team have used this to create a new general testing system for \TeX{}
+code, \pkg{l3build}. This \emph{is} designed to be used beyond the team, so is
+now available in \TeX{} Live and \hologo{MiKTeX} and is fully documented.
+Testing using \pkg{l3build} makes use of a normalised version of the
+\texttt{.log} file, so can test any aspect of \TeX{} output (e.g., by using
+\cs{showbox}) or its algorithms (by displaying results in the \texttt{.log}).
+
+Part of the remit for creating \pkg{l3build} was to enable the team to work
+truly cross-platform and to allow testing using multiple \TeX{} engines
+(earlier systems were limited to a single engine, normally \eTeX{}). The new
+testing system means we are in a much stronger position to support a variety of
+engines (see below). It has also enabled us to give useful feedback on
+development of the \hologo{LuaTeX} engine.
+
+As well as the core capability in testing, \pkg{l3build} also provides a
+\enquote{one stop} script for creating release bundles. The script is
+sufficiently flexible that for many common \LaTeX{} package structures, setting
+up for creating releases will require only a few lines of configuration.
+
+In addition to the documentation distributed with \pkg{l3build}, the project
+website~\cite[publications in 2014]{project-publications} contains some
+articles, videos and conference presentations that explain how to use
+\pkg{l3build} to manage and test any type of (\LaTeX{}) package.
+
+\section{Automating \pkg{expl3} testing}
+
+As well as developing \pkg{l3build} for local use, the team have also set up
+integration testing for \pkg{expl3} using the Travis-CI system. This means that
+\emph{every} commit to the \LaTeX3 code base now results in a full set of tests
+being run. This has allowed us to significantly reduce the number of occasions
+where \pkg{expl3} needs attention before being released to CTAN.
+
+Automated testing has also enabled us to check that \pkg{expl3} updates do not
+break a number of key third-party packages which use the programming
+environment.
+
+\section{Refining \pkg{expl3}}
+
+Work continues to improve \pkg{expl3} both in scope and robustness. Increased
+use of the programming environment means that code which has to-date been
+under-explored is being used, and this sometimes requires changes to the code.
+
+The team have extended formal support in \pkg{expl3} to cover the engines
+p\TeX{} and up\TeX{}, principally used by Japanese \TeX{} users. This has been
+possible in part due to the \pkg{l3build} system discussed above.
+Engine-dependent variations between \hologo{pdfTeX}, \hologo{XeTeX},
+\hologo{LuaTeX} and (u)p\TeX{} are now well-understood and documented. As part
+of this process, the \enquote{low-level} part of \pkg{expl3}, which saves all
+primitives, now covers essentially all primitives found in all of these
+engines.
+
+The code in \pkg{expl3} is now entirely self-contained, loading no other
+third-party packages, and can also be loaded as a generic package with plain
+\TeX{}, \emph{etc.} These changes make it much easier to diagnose problems and
+make \pkg{expl3} more useful. In particular it can be used as a programming
+language for generic packages, that then can run without modifications under
+different formats!
+
+The team have made a range of small refinements to both internals and
+\pkg{expl3} interfaces. Internal self-consistency has also been improved, for
+example removing almost all use of \texttt{nopar} functions. Performance
+enhancements to the \pkg{l3keys} part of \pkg{expl3} are ongoing and should
+result in significantly faster key setting. As keyval methods are increasingly
+widely used in defining behaviours, this will have an impact on compile times
+for end users.
+
+\section{Replacing \cs{lowercase} and \cs{uppercase}}
+
+As discussed in the last \LaTeX3 News, the team have for some time been keen to
+provide new interfaces which do not directly expose (or in some cases even use)
+the \TeX{} primitives \cs{lowercase} and \cs{uppercase}. We have now created a
+series of different interfaces that provide support for the different
+conceptual uses which may flow from the primitives:
+\begin{itemize}
+ \item For case changing text, \cs{tl_upper_case:n}, \cs{tl_lower_case:n},
+ \cs{tl_mixed_case:n} and related language-aware functions. These are
+ Unicode-capable and designed for working with text. They also allow for
+ accents, expansion of stored text and leaving math mode unchanged. At
+ present some of the interface decisions are not finalised so they are
+ marked as experimental, but the team expect the core concept to be stable.
+ \item For case changing programming strings, \cs{str_upper_case:n},
+ \cs{str_lower_case:n} and \cs{str_fold_case:n}. Again these are
+ Unicode-aware, but in contrast to the functions for text are not
+ context-dependent. They are intended for caseless comparisons, constructing
+ command names on-the-fly and so forth.
+ \item For creating arbitrary character tokens, \cs{char_generate:nn}. This
+ is based on the \cs{Ucharcat} primitive introduced by \hologo{XeTeX}, but
+ with the ideas extended to other engines. This function can be used to
+ create almost any reasonable token.
+ \item For defining active characters, \cs{char_set_active_eq:NN} and
+ related functions. The concept here is that active characters should be
+ equivalent to some named function, so one does not directly define the
+ active character.
+\end{itemize}
+
+\section{Extending \pkg{xparse}}
+
+After discussions at TUG2015 and some experimentation, the team have added a
+new argument type, \texttt{e} (\enquote{embellishment}), to \pkg{xparse}.
+This allows arguments similar to
+\TeX{} primitive sub- and superscripts to be accepted. Thus
+\begin{verbatim}
+\DeclareDocumentCommand\foo{e{^_}}
+ {\showtokens{"#1"}}
+\foo^{Hello} world
+\end{verbatim}
+will show
+\begin{verbatim}
+"{Hello}{-NoValue-}".
+\end{verbatim}
+
+At present, this argument type is experimental: there are a number of models
+which may make sense for this interface.
+
+\section{A new \cs{parshape} model}
+
+As part of development of \pkg{l3galley}, Joseph Wright has proposed a new
+model for splitting up the functions of the \cs{parshape} primitive into three
+logical elements:
+\begin{itemize}
+ \item Margins between the edges of the galley and the paragraph (for example
+ an indented block);
+ \item Cut-out sections running over a fixed number of lines, to support
+ \enquote{in place} figures and so forth;
+ \item Running or single-paragraph shape.
+\end{itemize}
+
+There are additional elements to consider here, for example whether lines are
+the best way to model the length of shaping, how to handle headings, cut-outs
+at page breaks, \emph{etc.}
+
+
+\section{Globally optimized pagination of documents}
+
+Throughout 2016 Frank Mittelbach has worked on methods and algorithms for
+globally optimizing the pagination of documents including those that contain
+floats. Early research results have been presented at Bacho\TeX{} 2016, TUG
+2016 in Toronto and later in the year at \mbox{DocEng'16}, the ACM Symposium on
+Document Engineering in Vienna. A link to the ACM paper (that allows a download
+free of charge) can be found on the project
+website~\cite{project-publications}. The site also holds the speaker notes from
+Toronto and will host a link to a video of the presentation once it becomes
+available.
+
+The framework developed by Frank is based on the extended functionality
+provided by \hologo{LuaTeX}, in particular its callback functions that allow
+interacting with the typesetting process at various points. The algorithm that
+determines the optimal pagination of a given document is implemented in {Lua}
+and its results are then used to direct the formatting done by the \TeX{}
+engine.
+
+At the current point in time this a working prototype but not yet anywhere near
+a production-ready system. However, the work so far shows great potential and
+Frank is fairly confident that it will eventually become a generally usable
+solution.
+
+\section{Looking forward}
+
+The \hologo{LuaTeX} engine has recently reached version~1.0. This may presage a
+stable \hologo{LuaTeX} and is likely to result in wider use of this engine in
+production documents.If that happens we expect to implement some of the more
+complex functionality (such as complex pagination requirements and models) only
+for \hologo{LuaTeX}.
+
+\begin{thebibliography}{10}
+ \raggedright
+ \bibitem{project-publications}
+ Links to various publications by members of the \LaTeX{} Project Team.
+ \newblock \url{https://www.latex-project.org/publications}.
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf
new file mode 100644
index 0000000000..2094a11805
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.tex b/macros/latex/contrib/l3kernel/l3news11.tex
new file mode 100644
index 0000000000..b88e7d2420
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news11.tex
@@ -0,0 +1,206 @@
+% Copyright 2017 The LaTeX3 Project
+\documentclass{ltnews}
+
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+\usepackage{csquotes}
+\usepackage{hologo}
+\usepackage{ragged2e}
+\usepackage{underscore}
+
+
+%%% wrong in ltnews.cls ... so some tmp fix here at the moment:
+\makeatletter
+\renewcommand{\subsubsection}{%
+ \@startsection
+ {subsubsection}{2}{\leftmargini}{-1.5ex \@plus -1ex \@minus -.2ex}%
+ {1sp}{\@subheadingfont}%
+}
+\makeatother
+
+
+\AtBeginDocument{%
+ \renewcommand*{\LaTeXNews}{\LaTeX3~News}%
+ \RaggedRight
+ \setlength\parindent{1em}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\publicationmonth{February}
+\publicationyear{2018}
+\publicationissue{11}
+
+% Avoid hyphenation of csnames
+\makeatletter
+\protected\edef\cs#1{%
+ \noexpand\path{\@backslashchar#1}%
+}
+\makeatother
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+
+\section{Move of sources from Subversion to Git}
+
+The \LaTeX{} team have used a variety of version control systems over the life
+of the \LaTeX3 sources. For a long time we maintained the \LaTeX3 sources in
+Subversion (\textsc{svn}) but also provided a read-only clone of them on GitHub using
+SubGit from TMate Software~\cite{SubGit} to synchronize the two
+repositories---a solution that worked very well.
+
+We have now retired the Subversion repository and completely moved over to Git,
+with the master \LaTeX3 repository hosted on GitHub:
+\url{https://github.com/latex3/latex3}. This new approach means we are (slowly)
+adopting some new approaches to development, for example branches and accepting
+pull requests.
+
+\subsection{Version identifiers}
+
+Following this change, we have removed Subversion \verb=$Id= lines from the
+\LaTeX3 sources. At present, we will be retaining \cs{GetIdInfo} as there are
+several possible use cases. The \LaTeX3 sources now have only release date
+strings as identifiers. However, the team recommend that package authors
+include version information directly in \cs{ProvidesExplPackage} (or similar)
+lines.
+
+\section{\pkg{expl3} updates and extensions}
+
+Work has continued on the codebase over the last year, with both small
+changes/fixes and more substantial changes taking place. The following sections
+summarise some of the more notable changes.
+
+\subsection{\pkg{l3sort} moves to the kernel}
+
+Sorting is an important ability, and for some time the team have provided a
+stand-alone \pkg{l3sort} to support this. The functionality has seen wide take
+up, and so has now been integrated directly into the kernel. This took place in
+parallel with some interface changes to \enquote{round out} the code.
+
+\subsection{Boolean functions}
+
+For some time, the team have been aware that boolean expressions can fail in
+certain circumstances, leading to low-level errors. This is linked to two
+features of the long-standing \cs{bool_if:n(TF)} function: expandable operation
+and short-circuit evaluation.
+
+Addressing that has meant two changes: altering \cs{bool_if:n(TF)} to
+\emph{always} evaluate each part of the expression, and introducing new
+short-circuit functions without the issue. The latter are |lazy| in \pkg{expl3}
+terms:
+\begin{itemize}
+\item \cs{bool_lazy_all:n(TF)}
+\item \cs{bool_lazy_and:nn(TF)}
+\item \cs{bool_lazy_any:n(TF)}
+\item \cs{bool_lazy_or:nn(TF)}
+\end{itemize}
+These new, stable functions are now the recommended way of handling boolean
+evaluations. Package authors are encouraged to employ these new functions as
+appropriate.
+
+\subsection{Revision of \pkg{l3file}}
+
+Large parts of \pkg{l3file} have been revised to give a better separation of
+path/file/extension. This has resulted in addition of a number of new support
+functions and variables.
+
+At the same time, new experimental functions have been added to utilise a
+number of useful primitives in \hologo{pdfTeX}{}: \cs{file_get_mdfive_hash:nN},
+\cs{file_get_size:nN} and \cs{file_get_timestamp:nN}. Currently, \hologo{XeTeX}
+does not support getting file size/timestamp information: this is available in
+other engines.
+
+Paralleling these changes, we have added (experimental) support for shell
+escape to the \pkg{l3sys} module, most notably \cs{sys_shell_now:n}. A range of
+test booleans are also available to check whether shell escape is enabled.
+
+\subsection{Detection of \cs{cs_generate_variant:Nn} errors}
+
+The ability to generate variants is an important feature of \pkg{expl3}. At
+the same time, there are crucial aspects of this approach that can be
+misunderstood by users. In particular, the requirement that variants map
+correctly to an underlying \verb|N|- or \verb|n|-type base function is sometimes
+misunderstood.
+
+To help detect and correct these cases, \cs{cs_generate_variant:Nn} now
+carries out error checking on it's arguments, and raises a warning where
+it is mis-applied. At present, the team have avoided making this an error
+as it is likely to be seen by end users rather than directly by package
+developers. In time, we are likely to revisit this and tighten up
+further on this key requirement.
+
+\subsection{Accessing random data}
+
+To support randomised data selection, we have introduced a family of
+experimental functions which use underlying engine support for random values,
+and provide one entry at random from the data type.
+
+At the same time, we have addresses some issues with uniformity stemming from
+the random number function used by \hologo{pdfTeX}{} and inherited by other
+engines. This means that \pkg{expl3}'s \textsc{fpu} will generate \emph{pseudo}-random
+values across the range of possible outputs.
+
+\subsection{More powerful debugging}
+
+A new set of debugging functions have been added to the kernel. These allow
+debug code to be enabled locally using the new option \verb|enable-debug| along
+with functions \cs{debug_on:n} and \cs{debug_off:n}. A companying this change, we
+have improved the handling of global/local consistency in variable setting.
+
+\subsection{Mark-up changes in \pkg{l3doc}}
+
+Since the introduction of the \verb|__| syntax to mark internal function, the
+need for explicit mark-up of internal material in sources has been negated.
+As such, we have now dropped the requirement to mark internal material with
+\verb|[aux]| when using \pkg{l3doc}. Instead, the status of functions and
+variables is auto-detected from the presence of \verb|__|. For cases where
+non-standard names are used for internal code, the mark up \verb|[int]| is
+retained, \emph{e.g.}
+\begin{verbatim}
+\begin{macro}[int]{\l@expl@enable@debug@bool}
+\end{verbatim}
+
+\section{\pkg{l3build} updates}
+
+Work on \pkg{l3build} has continued in parallel with \pkg{expl3} work, in
+particular continuing to develop features to allow wider use of the tool.
+
+Paralleling the move of the \LaTeX3 codebase to Git, \pkg{l3build} now has it's
+own separate Git repository: \url{https://github.com/latex3/l3build}. This will
+enable us to involve other developers in the Lua code required for the build
+system. At the same time, we have split the code into a number of small source
+files, again to ease development both for the team ourselves and for potential
+collaborators.
+
+Another major change is that \pkg{l3build} can now retain the structure of
+source repositories when creating a CTAN archive. Whilst the team favor `flat'
+source set ups, other users prefer structures approaches. Most notably, this
+new \pkg{l3build} functionality means that it is now used to carry out
+\pkg{beamer} releases.
+
+The other major new feature is a new approach to multiple test set ups, which
+replaces the older \verb|--testfiledir| option. In the new approach, separate
+configuration files are listed in the main \verb|build.lua| script, and can be
+selected manually using a new \verb|--config| switch. This new approach allows
+complex test set ups to be run in a totally automated fashion, which is
+important for kernel testing.
+
+Some changes to the normalisation routines have been carried out, some to deal
+with upcoming \hologo{LuaTeX} changes, others to address aspects which show up
+only in some tests. This has required \verb|.tlg| updates in some cases: as far
+as possible, we strive to avoid requiring changes to the reference files.
+
+\begin{thebibliography}{10}
+ \raggedright
+ \bibitem{SubGit}
+ \emph{SubGit}, TMate Software, \url{https://subgit.com}
+ \bibitem{project-publications}
+ Links to various publications by members of the \LaTeX{} Project Team.
+ \newblock \url{https://www.latex-project.org/publications}.
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf
new file mode 100644
index 0000000000..c64dcda56c
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.tex b/macros/latex/contrib/l3kernel/l3news12.tex
new file mode 100644
index 0000000000..05c89a608d
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3news12.tex
@@ -0,0 +1,352 @@
+% Copyright 2019 The LaTeX3 Project
+\documentclass{ltnews}
+
+\usepackage{csquotes}
+\usepackage{hologo}
+\usepackage{ragged2e}
+
+\PassOptionsToPackage{colorlinks}{hyperref}
+
+%%% wrong in ltnews.cls ... so some tmp fix here at the moment:
+\makeatletter
+\renewcommand{\subsubsection}{%
+ \@startsection
+ {subsubsection}{2}{\leftmargini}{-1.5ex \@plus -1ex \@minus -.2ex}%
+ {1sp}{\@subheadingfont}%
+}
+\makeatother
+
+\AtBeginDocument{%
+ \renewcommand*{\LaTeXNews}{\LaTeX3~News}%
+ \RaggedRight
+ \setlength\parindent{1em}%
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\publicationmonth{January}
+\publicationyear{2020}
+\publicationissue{12}
+
+% Avoid hyphenation of csnames
+\makeatletter
+\protected\edef\cs#1{%
+ \noexpand\path{\@backslashchar#1}%
+}
+\makeatother
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\section{Introduction}
+
+There has been quite a gap since the last \emph{\LaTeX3 News} (Issue~11,
+February 2018), and so there is quite a bit to cover here. Luckily, one of the
+things there \emph{is} to cover is that we are using a more formalised approach
+for logging changes, so writing up what has happened is a bit easier.
+(By mistake \LaTeX3 News~11 itself did not get \emph{published} when written, but is
+now available: we have kept the information it contains separate as it
+is a good summary of the work that had happened in 2017.)
+
+Work has continued apace across the \LaTeX3 codebase in the last (nearly) two
+years. A lot of this is ultimately focussed on making the core of \pkg{expl3}
+even more stable: \emph{squeezing} out more experimental ideas, refining
+ones we have and making it a serious option for core \LaTeX{} programming.
+
+As a result of these activities, the \LaTeX3 programming layer will be
+available as part of the kernel of \LaTeXe{} from 2020-02-02 onwards, i.e., can
+be used without explicitly loading \pkg{expl3}. See \emph{\LaTeX{}
+ News~31}~\cite{12:site-news} for more details on this.
+
+\section{New features in \pkg{expl3}}
+
+\subsection{A new argument specifier: \texttt{e}-type}
+
+During 2018, the team worked with the \TeX{} Live, \hologo{XeTeX} and
+(u)p\TeX{} developers to add the \cs{expanded} primitive to \hologo{pdfTeX}{},
+\hologo{XeTeX} and (u)p\TeX{}. This primitive was originally suggested for
+\hologo{pdfTeX}{} v1.50 (never released), and was present in \hologo{LuaTeX}{}
+from the start of that project.
+
+Adding \cs{expanded} lets us create a new argument specifier: \texttt{e}-type
+expansion. This is \emph{almost} the same as \texttt{x}-type, but is itself
+expandable. (It also doesn't need doubled \verb|#| tokens.) That's incredibly
+useful for creating function-like macros: you can ensure that \emph{everything}
+is expanded in an argument before you go near it, with not an \cs{expandafter}
+in sight.
+
+\subsection{New functions}
+
+New programming tools have appeared in various places across \pkg{expl3}.
+The highlights are
+\begin{itemize}
+ \item Shuffling of sequences to allow randomization
+ \item Arrays of integers and floating point values; these have constant-time
+ access
+ \item Functions to return values after system shell usage
+ \item Expandable access to file information, including file size, MD5
+ hash and modification date
+\end{itemize}
+
+For the latter, we have revised handling of file names considerably. There is
+now support for finding files in expansion contexts (by using the
+\cs{(pdf)filesize} primitive). Spaces and quotes in file names are now fully
+normalised, in a similar manner to the approach used by the latest \LaTeXe{}
+kernel.
+
+\subsection{String conversion moves to \pkg{expl3}}
+
+In addition to entirely new functions, the team have moved the
+\pkg{l3str-convert} module from the \pkg{l3experimental} bundle into the
+\pkg{expl3} core. This module is essential for dealing with the need to produce
+\textsc{utf}-16 and \textsc{utf}-32 strings in some contexts, and also offers
+built-in escape for \textsc{url}s and \textsc{pdf} strings.
+
+\subsection{Case changing of text}
+
+Within \pkg{expl3}, the team have re-named and reworked the ideas from
+\cs{tl_upper_case:n} and so on, creating a new module \pkg{l3text}. This is a
+\enquote{final} home for functions to manipulate \emph{text}; token lists that
+can reasonably expected to expand to plain text plus limited mark-up, for
+example emphasis and labels/references. Moving these functions, we have also
+made a small number of changes in other modules to give consistent names to
+functions: see the change log for full details.
+
+Over time, we anticipate that functions for other textual manipulation will be
+added to this module.
+
+\section{Notable fixes and changes}
+
+\subsection{File name parsing}
+
+The functions for parsing file names have been entirely re-written, partly as
+this is required for the expandable access to file information mentioned above.
+The new code correctly deals with spaces and quote marks in file names and
+splits the path/name/extension.
+
+\subsection{Message formatting}
+
+The format of messages in \pkg{expl3} was originally quite text-heavy, the idea
+being that they would stand out in the \texttt{.log} file. However, this made
+them hard to find by a regular expression search, and was very different from
+the \LaTeXe{} message approach. The formatting of \pkg{expl3} messages has been
+aligned with that from the \LaTeXe{} kernel, such that \textsc{ide} scripts and
+similar will be able to find and extract them directly.
+
+\subsection{Key inheritance}
+
+A number of changes have been made to the inheritance code for keys,
+to allow inheritance to work \enquote{as expected} in (almost) all
+cases.
+
+\subsection{Floating point juxtaposition}
+
+Implicit multiplication by juxtaposition, such as |2pi|, is now handled
+separately from parenthetic values. Thus for example |1in/1cm| is treated
+as equal to |(1in)/(1cm)| and thus yields |2.54|, and | 1/2(pi+pi)| is
+equal to |pi|.
+
+\subsection{Changing box dimensions}
+
+\TeX{}'s handling of boxes is subtly-different from other registers, and this
+shows up in particular when you want to resize a box. To bring treatment of
+boxes, or rather the grouping behavior of boxes, into line with other
+registers, we have made some internal changes to how functions such as
+\cs{box_set_wd:N} are implemented. This will be transparent for
+\enquote{well-behaved} use cases of these functions.
+
+\subsection{More functions moved to stable}
+
+A large number of functions which were introduced as candidates have been
+evaluated and moved to stable status. The team hopes to move all functions
+in \pkg{expl3} to stable status, or move them out of the core, over the coming
+months.
+
+\subsection{Deprecations}
+
+There have been two notable sets of deprecations over the past 18 months.
+First, we have rationalised all of the \enquote{raw} primitive names to the
+form \cs{tex_<name>:D}. This means that the older names, starting
+\cs{pdftex_...}, \cs{xetex_...}, etc., have been removed.
+
+Secondly, the use of integer constants, which dates back to the earliest days
+of \pkg{expl3}, is today more likely to make the code harder to read than
+anything else. Speed improvements in engines mean that the tiny enhancements in
+reading such constants are no longer required. Thus for example \cs{c_two} is
+deprecated in favour of simply using \texttt{2}.
+
+In parallel with this, a number of older \texttt{.sty} files have been removed.
+These older files provided legacy stubs for files which have now been
+integrated in the \pkg{expl3} core. They have now had sufficient time to allow
+users to update their code.
+
+\section{Internal improvements}
+
+\subsection{Cross-module functions}
+
+The team introduced the idea of internal module functions some time ago. Within
+the kernel, there are places where functions need to be used in multiple
+modules. To make the nature of the kernel interactions clearer, we have worked
+on several aspects
+\begin{itemize}
+ \item Reducing as far as possible cross-module functions
+ \item Making more generally-useful functions public, for example
+ scan marks
+ \item Creating an explicit cross-kernel naming convention for
+ functions which are internal but are essential to use in multiple
+ kernel modules
+\end{itemize}
+
+\subsection{The backend}
+
+Creating graphics, working with color, setting up hyperlinks and so on require
+backend-specific code. Here, backends are for example \texttt{dvips},
+\texttt{xdvipdfmx} and the direct \textsc{pdf} mode in \hologo{pdfTeX} and
+\hologo{LuaTeX}. These functions are needed across the \LaTeX3 codebase and
+have to be updated separate from the \pkg{expl3} core. To facilitate that, we
+have split those sources into a separate bundle, which can then be updated as
+required.
+
+At the same time, the code these files contain is very low-level and is best
+described as internal. We have re-structured how the entire set of functions
+are referred to such that they are now internal for the area they implement,
+for example image inclusion, box affine transformations, etc.
+
+\section{Better support for (u)p\TeX{}}
+
+The developers behind (u)p\TeX{} (Japanese \TeX{}) have recently enhanced their
+English documentation (see \url{https://github.com/texjporg/ptex-manual}).
+Using this new information, we have been able to make internal adjustments to
+\pkg{expl3} to better support these engines.
+
+\section{Options}
+
+A new option \texttt{undo-recent-deprecations} is now available for cases where
+a document (or package) requires some \pkg{expl3} functions that have been
+formally removed after deprecation. This is to allow \emph{temporary}
+work-arounds for documents to be compiled whilst code is begin updated.
+
+The \enquote{classical} options for selecting backends (\texttt{dvips},
+\texttt{pdftex}, etc.) are now recognised in addition to the native key--value
+versions. This should make it much easier to use \pkg{expl3} image and color
+support as it is brought up to fully-workable standards.
+
+\section{Engine requirements}
+
+The minimum engine versions needed to use \pkg{expl3} have been
+incremented a little:
+\begin{itemize}
+ \item \hologo{pdfTeX} v1.40
+ \item \hologo{XeTeX} v0.99992
+ \item \hologo{LuaTeX} v0.95
+ \item $\epsilon$-(u)p\TeX{} mid-2012
+\end{itemize}
+
+The team have also worked with the \hologo{XeTeX} and (u)p\TeX{} developers to
+standardise the set of post-\eTeX{} utility primitives that are available: the
+so-called \enquote{\hologo{pdfTeX} utilities}. These are now available in all
+supported engine, and in time will all be \emph{required}. This primarily
+impacts \hologo{XeTeX}, which gained most of these primitives in the 2019
+\TeX{} Live cycle. (Examples are the random number primitives and expandable
+file data provision.) See \emph{\LaTeX{} News~31}~\cite{12:site-news} for more on this.
+
+\section{Documentation}
+
+\subsection{News}
+
+The \emph{\LaTeX3 News} files were until recently only used to create
+\textsc{pdf} files on the team website~\cite{12:site}. We have now
+integrated those into the \pkg{l3kernel} (\pkg{expl3} core)
+bundle. The news files cover all of \LaTeX3 files, as the core files
+are always available.
+
+\subsection{ChangeLog}
+
+Since the start of 2018, the team have commenced a comprehensive
+change log for each of the bundles which make up the \LaTeX3 code.
+These are simple Markdown text files, which means that they can be displayed
+formatted in web views.
+
+\section{Changes in \pkg{xparse}}
+
+A number of new features have been added to \pkg{xparse}. To allow
+handling of the fact that skipping spaces may be required only in
+some cases when searching for optional arguments, a new modifier
+\texttt{!} is available in argument specifiers. This causes
+\pkg{xparse} to \emph{require} that an optional argument follows
+immediately with no intervening spaces.
+
+There is a new argument type purely for environments: \texttt{b}-type
+for collecting a \cs{begin}/\cs{end} pair, i.e., collecting the body of
+an environment. This is similar in concept to the \pkg{environ} package,
+but is integrated directly into \pkg{xparse}.
+
+Finally, it is now possible to refer to one argument as the
+default for another optional one, for example
+\begin{verbatim}
+\NewDocumentCommand{\caption}{O{#2} m}
+ ...
+\end{verbatim}
+
+\section{New experimental modules}
+
+A number of new experimental modules have been added within the
+\pkg{l3experimental} bundle
+\begin{itemize}
+ \item \pkg{l3benchmark} Performance-testing system using the timing
+ function in modern \TeX{} engines
+ \item \pkg{l3cctab} Category code tables for all engines, not
+ just \hologo{LuaTeX}
+ \item \pkg{l3color} Color support, similar in interface to \pkg{xcolor}
+ \item \pkg{l3draw} Creation of drawings, inspired by \pkg{pgf}, but
+ using the \LaTeX3 \textsc{fpu} for calculations
+ \item \pkg{l3pdf} Support for \textsc{pdf} features such as compression,
+ hyper-links, etc.
+ \item \pkg{l3sys-shell} Shell escape functions for file manipulation
+\end{itemize}
+
+\section{\pkg{l3build} changes}
+
+The \pkg{l3build} tool for testing and releasing \TeX{} packages
+has seen a number of incremental improvements. It is now available directly
+as a script in \TeX{} Live and MiK\TeX{}, meaning you can call it simply
+as
+\begin{verbatim}
+l3build <target>
+\end{verbatim}
+Accompanying this, we have added support for installing scripts and script
+\texttt{man} files.
+
+There is a new \texttt{upload} target that can take a zip file and send it to
+\textsc{ctan}: you just have to fill in release information for \emph{this}
+upload at the prompts.
+
+Testing using \textsc{pdf} files rather than logs has been heavily revised:
+this is vital for work on \textsc{pdf} tagging.
+
+There is also better support for complex directory structures, including the
+ability to manually specify \textsc{tds} location for all installed files. This
+is particularly targeted at package with both generic and format-specific file
+to install.
+
+
+\begin{thebibliography}{9}
+
+\fontsize{9.3}{11.3}\selectfont
+
+
+\bibitem{12:site}
+ \emph{\LaTeX{} Project Website}.
+ \url{https://latex-project.org/}
+
+\bibitem{12:site-news}
+ \emph{\LaTeXe{} release news letters on the \LaTeX{} Project Website}.
+ \url{https://latex-project.org/news/latex2e-news/}
+
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex/contrib/l3kernel/l3obsolete.txt b/macros/latex/contrib/l3kernel/l3obsolete.txt
deleted file mode 100644
index 8706c0aba3..0000000000
--- a/macros/latex/contrib/l3kernel/l3obsolete.txt
+++ /dev/null
@@ -1,639 +0,0 @@
-This file lists functions and variables which were part of l3kernel
-but which are either deprecated or which have been removed entirely.
-The file is split into two parts. The first part lists functions
-which are deprecated but are still currently included in the
-extracted files. The second part lists functions which have been
-removed from the distribution entirely. Functions which were added
-with 'experimental' status only are not listed.
-
-Deprecated functions and variables
-==================================
-
-These functions are deprecated and should be removed from packages.
-They will be removed from the sources at the end of the given year.
-
---------------------------------------
-Function Expires end
---------------------------------------
-\box_gset_eq_clear:cc 2020
-\box_gset_eq_clear:cN 2020
-\box_gset_eq_clear:Nc 2020
-\box_gset_eq_clear:NN 2020
-\box_set_eq_clear:cc 2020
-\box_set_eq_clear:cN 2020
-\box_set_eq_clear:Nc 2020
-\box_set_eq_clear:NN 2020
-\c_zero 2019
-\c_one 2019
-\c_two 2019
-\c_three 2019
-\c_four 2019
-\c_five 2019
-\c_six 2019
-\c_seven 2019
-\c_eight 2019
-\c_nine 2019
-\c_ten 2019
-\c_eleven 2019
-\c_twelve 2019
-\c_thirteen 2019
-\c_fourteen 2019
-\c_fifteen 2019
-\c_sixteen 2019
-\c_thirty_two 2019
-\c_one_hundred 2019
-\c_two_hundred_fifty_five 2019
-\c_two_hundred_fifty_six 2019
-\c_one_thousand 2019
-\c_ten_thousand 2019
-\c_term_ior 2020
-\etex_....:D 2019
-\hbox_unpack_clear:c 2020
-\hbox_unpack_clear:N 2020
-\lua_escape_x:n 2019
-\lua_now_x:n 2019
-\lua_shipout_x:n 2019
-\luatex_...:D 2019
-\msg_interrupt:nn 2019
-\msg_log:n 2019
-\msg_term:n 2019
-\pdftex_...:D 2019
-\ptex_...:D 2019
-\str_case_x:nn 2019
-\str_case_x:nnF 2019
-\str_case_x:nnT 2019
-\str_case_x:nnTF 2019
-\str_if_eq_x:nnF 2019
-\str_if_eq_x:nnT 2019
-\str_if_eq_x:nnTF 2019
-\str_if_eq_x_p:nn 2019
-\tl_gset_from_file:cnn 2020
-\tl_gset_from_file:Nnn 2020
-\tl_gset_from_file_x:cnn 2020
-\tl_gset_from_file_x:Nnn 2020
-\tl_show_analysis:N 2019
-\tl_show_analysis:n 2019
-\tl_set_from_file:cnn 2020
-\tl_set_from_file:Nnn 2020
-\tl_set_from_file_x:cnn 2020
-\tl_set_from_file_x:Nnn 2020
-\token_get_arg_spec:N 2020
-\token_get_prefix_spec:N 2020
-\token_get_replacement_spec:N 2020
-\uptex_...:D 2019
-\utex_...:D 2019
-\vbox_unpack_clear:c 2020
-\vbox_unpack_clear:N 2020
-\xetex_...:D 2019
---------------------------------------
-
-Removed functions and variables
-===============================
-
-The 'Date removed' column details when the functions were
-removed from the sources.
-
-----------------------------------------------------------
-Function Date removed
-----------------------------------------------------------
-\box_resize:cnn 2018-12-27
-\box_resize:Nnn 2018-12-27
-\box_use_clear:c 2018-12-27
-\box_use_clear:N 2018-12-27
-\c_active_char_token 2011-09-08
-\c_alignment_tab_token 2011-09-08
-\c_empty_toks 2011-09-08
-\c_job_name_tl 2017-01-01
-\c_keys_code_root_tl 2013-01-08
-\c_letter_token 2011-09-08
-\c_luatex_is_engine_bool 2011-12-30
-\c_math_shift_token 2011-09-08
-\c_minus_one 2018-12-27
-\c_other_char_token 2011-09-08
-\c_pdftex_is_engine_bool 2011-12-30
-\c_string_cctab 2012-06-30
-\c_undefined_fp 2014-05-28
-\c_xetex_is_engine_bool 2011-12-30
-\char_make_active:N 2011-09-08
-\char_make_active:n 2011-09-08
-\char_make_alignment_tab:N 2011-09-08
-\char_make_alignment_tab:n 2011-09-08
-\char_make_begin_group:N 2011-09-08
-\char_make_begin_group:n 2011-09-08
-\char_make_comment:N 2011-09-08
-\char_make_comment:n 2011-09-08
-\char_make_end_group:N 2011-09-08
-\char_make_end_group:n 2011-09-08
-\char_make_end_line:N 2011-09-08
-\char_make_end_line:n 2011-09-08
-\char_make_escape:N 2011-09-08
-\char_make_escape:n 2011-09-08
-\char_make_ignore:N 2011-09-08
-\char_make_ignore:n 2011-09-08
-\char_make_invalid:N 2011-09-08
-\char_make_invalid:n 2011-09-08
-\char_make_letter:N 2011-09-08
-\char_make_letter:n 2011-09-08
-\char_make_math_shift:N 2011-09-08
-\char_make_math_shift:n 2011-09-08
-\char_make_math_subscript:N 2011-09-08
-\char_make_math_subscript:n 2011-09-08
-\char_make_math_superscript:N 2011-09-08
-\char_make_math_superscript:n 2011-09-08
-\char_make_other:N 2011-09-08
-\char_make_other:n 2011-09-08
-\char_make_parameter:N 2011-09-08
-\char_make_parameter:n 2011-09-08
-\char_make_space:N 2011-09-08
-\char_make_space:n 2011-09-08
-\char_set_catcode:w 2011-09-08
-\char_set_lccode:w 2011-09-08
-\char_set_mathcode:w 2011-09-08
-\char_set_sfcode:w 2011-09-08
-\char_set_uccode:w 2011-09-08
-\char_show_value_catcode:w 2011-09-08
-\char_show_value_lccode:w 2011-09-08
-\char_show_value_mathcode:w 2011-09-08
-\char_show_value_sfcode:w 2011-09-08
-\char_show_value_uccode:w 2011-09-08
-\char_value_catcode:w 2011-09-08
-\char_value_lccode:w 2011-09-08
-\char_value_mathcode:w 2011-09-08
-\char_value_sfcode:w 2011-09-08
-\char_value_uccode:w 2011-09-08
-\chk_if_free_cs:N 2013-01-08
-\clist_display:c 2011-09-08
-\clist_display:N 2011-09-08
-\clist_gremove_element:Nn 2011-09-08
-\clist_gtrim_spaces:c 2011-12-20
-\clist_gtrim_spaces:N 2011-12-20
-\clist_if_eq_p:cc 2013-01-08
-\clist_if_eq:ccF 2013-01-08
-\clist_if_eq:ccT 2013-01-08
-\clist_if_eq:ccTF 2013-01-08
-\clist_if_eq_p:cN 2013-01-08
-\clist_if_eq:cNF 2013-01-08
-\clist_if_eq:cNT 2013-01-08
-\clist_if_eq:cNTF 2013-01-08
-\clist_if_eq_p:Nc 2013-01-08
-\clist_if_eq:NcF 2013-01-08
-\clist_if_eq:NcT 2013-01-08
-\clist_if_eq:NcTF 2013-01-08
-\clist_length:c 2013-01-08
-\clist_length:N 2013-01-08
-\clist_length:n 2013-01-08
-\clist_remove_element:Nn 2011-09-08
-\clist_top:cN 2011-09-08
-\clist_trim_spaces:c 2011-12-20
-\clist_trim_spaces:N 2011-12-20
-\clist_use:c 2013-01-08
-\clist_use:N 2013-01-08
-\cs_gnew_eq:cc 2011-09-08
-\cs_gnew_eq:cN 2011-09-08
-\cs_gnew_eq:Nc 2011-09-08
-\cs_gnew_nopar:cpn 2011-09-08
-\cs_gnew_nopar:cpx 2011-09-08
-\cs_gnew_nopar:Npn 2011-09-08
-\cs_gnew_nopar:Npx 2011-09-08
-\cs_gnew_protected_nopar:cpn 2011-09-08
-\cs_gnew_protected_nopar:cpx 2011-09-08
-\cs_gnew_protected_nopar:Npn 2011-09-08
-\cs_gnew_protected_nopar:Npx 2011-09-08
-\cs_gnew_protected:cpn 2011-09-08
-\cs_gnew_protected:cpx 2011-09-08
-\cs_gnew_protected:Npn 2011-09-08
-\cs_gnew_protected:Npx 2011-09-08
-\cs_gnew:cpn 2011-09-08
-\cs_gnew:cpx 2011-09-08
-\cs_gnew:Npn 2011-09-08
-\cs_gnew:Npx 2011-09-08
-\cs_gundefine:c 2011-09-08
-\cs_gundefine:N 2011-09-08
-\cs_set_eq:NwN 2011-12-30
-\dim_case:nnn 2015-07-14
-\dim_eval:w 2013-01-08
-\dim_eval_end: 2013-01-08
-\dim_gset_max:cn 2013-01-08
-\dim_gset_max:Nn 2013-01-08
-\dim_gset_min:cn 2013-01-08
-\dim_gset_min:Nn 2013-01-08
-\dim_set_max:cn 2013-01-08
-\dim_set_max:Nn 2013-01-08
-\dim_set_min:cn 2013-01-08
-\dim_set_min:Nn 2013-01-08
-\ExplSyntaxNamesOff 2013-01-08
-\ExplSyntaxNamesOn 2013-01-08
-\file_add_path:nN 2018-12-27
-\file_if_exist_input:nT 2018-03-05
-\file_if_exist_input:nTF 2018-03-05
-\file_list: 2018-12-27
-\file_path_include:n 2018-12-27
-\file_path_remove:n 2018-12-27
-\fp_abs:c 2014-05-28
-\fp_abs:N 2014-05-28
-\fp_compare:NNNF 2014-05-28
-\fp_compare:NNNT 2014-05-28
-\fp_compare:NNNTF 2014-05-28
-\fp_cos:cn 2014-05-28
-\fp_cos:Nn 2014-05-28
-\fp_div:cn 2014-05-28
-\fp_div:Nn 2014-05-28
-\fp_exp:cn 2014-05-28
-\fp_exp:Nn 2014-05-28
-\fp_gabs:c 2014-05-28
-\fp_gabs:N 2014-05-28
-\fp_gcos:cn 2014-05-28
-\fp_gcos:Nn 2014-05-28
-\fp_gdiv:cn 2014-05-28
-\fp_gdiv:Nn 2014-05-28
-\fp_gexp:cn 2014-05-28
-\fp_gexp:Nn 2014-05-28
-\fp_gln:cn 2014-05-28
-\fp_gln:Nn 2014-05-28
-\fp_gmul:cn 2014-05-28
-\fp_gmul:Nn 2014-05-28
-\fp_gneg:c 2014-05-28
-\fp_gneg:N 2014-05-28
-\fp_gpow:cn 2014-05-28
-\fp_gpow:Nn 2014-05-28
-\fp_ground_figures:cn 2014-05-28
-\fp_ground_figures:Nn 2014-05-28
-\fp_ground_places:cn 2014-05-28
-\fp_ground_places:Nn 2014-05-28
-\fp_gsin:cn 2014-05-28
-\fp_gsin:Nn 2014-05-28
-\fp_gtan:cn 2014-05-28
-\fp_gtan:Nn 2014-05-28
-\fp_if_undefined_p:N 2014-05-28
-\fp_if_undefined:NF 2014-05-28
-\fp_if_undefined:NT 2014-05-28
-\fp_if_undefined:NTF 2014-05-28
-\fp_if_zero_p:N 2014-05-28
-\fp_if_zero:NF 2014-05-28
-\fp_if_zero:NT 2014-05-28
-\fp_if_zero:NTF 2014-05-28
-\fp_ln:cn 2014-05-28
-\fp_ln:Nn 2014-05-28
-\fp_mul:cn 2014-05-28
-\fp_mul:Nn 2014-05-28
-\fp_neg:c 2014-05-28
-\fp_neg:N 2014-05-28
-\fp_pow:cn 2014-05-28
-\fp_pow:Nn 2014-05-28
-\fp_round_figures:cn 2014-05-28
-\fp_round_figures:Nn 2014-05-28
-\fp_round_places:cn 2014-05-28
-\fp_round_places:Nn 2014-05-28
-\fp_sin:cn 2014-05-28
-\fp_sin:Nn 2014-05-28
-\fp_tan:cn 2014-05-28
-\fp_tan:Nn 2014-05-28
-\g_file_current_name_tl 2018-12-27
-\g_tmpa_toks 2011-09-08
-\g_tmpb_toks 2011-09-08
-\g_tmpc_toks 2011-09-08
-\group_execute_after:N 2011-09-08
-\hbox_gset_inline_begin:c 2014-08-09
-\hbox_gset_inline_begin:N 2014-08-09
-\hbox_gset_inline_end: 2014-08-09
-\hbox_set_inline_begin:c 2014-08-09
-\hbox_set_inline_begin:N 2014-08-09
-\hbox_set_inline_end: 2014-08-09
-\if_num:w 2013-01-08
-\int_case:nnn 2015-07-14
-\int_convert_from_base_ten:nn 2011-11-22
-\int_convert_from_symbols:nn 2011-11-22
-\int_convert_to_base_ten:nn 2011-11-22
-\int_eval:w 2013-01-08
-\int_eval_end: 2013-01-08
-\int_from_binary:n 2016-01-05
-\int_from_hexadecimal:n 2016-01-05
-\int_from_octal:n 2016-01-05
-\int_to_binary:n 2016-01-05
-\int_to_hexadecimal:n 2016-01-05
-\int_to_octal:n 2016-01-05
-\int_to_symbol:n 2011-11-22
-\int_value:w 2013-01-08
-\ior_get_str:NN 2018-03-05
-\ior_gto:NN 2013-07-28
-\ior_list_streams: 2018-12-27
-\ior_log_streams: 2018-12-27
-\ior_open_streams: 2011-09-08
-\ior_str_gto:NN 2013-07-28
-\ior_str_to:NN 2013-07-28
-\ior_to:NN 2013-07-28
-\iow_list_streams: 2018-12-27
-\iow_log_streams: 2018-12-27
-\iow_now_buffer_safe:Nn 2011-09-08
-\iow_now_buffer_safe:Nx 2011-09-08
-\iow_now_when_avail:Nn 2012-06-05
-\iow_now_when_avail:Nx 2012-06-05
-\iow_open_streams: 2011-09-08
-\iow_wrap:xnnnN 2013-01-08
-\KV_process_no_space_removal_no_sanitize:NNn 2011-09-08
-\KV_process_space_removal_no_sanitize:NNn 2011-09-08
-\KV_process_space_removal_sanitize:NNn 2011-09-08
-\l_iow_line_length_int 2013-01-08
-\l_last_box 2012-05-11
-\l_tl_replace_toks 2011-09-08
-\l_tmpa_toks 2011-09-08
-\l_tmpb_toks 2011-09-08
-\l_tmpc_int 2013-01-08
-\l_tmpc_toks 2011-09-08
-\luatex_if_engine_p: 2017-01-01
-\luatex_if_engine:F 2017-01-01
-\luatex_if_engine:T 2017-01-01
-\luatex_if_engine:TF 2017-01-01
-\msg_class_new:nn 2011-09-08
-\msg_class_set:nn 2013-01-08
-\msg_direct_interrupt:xxxxx 2011-09-08
-\msg_direct_log:xx 2011-09-08
-\msg_direct_term:xx 2011-09-08
-\msg_generic_new:nn 2011-09-08
-\msg_generic_new:nnn 2011-09-08
-\msg_generic_set:nn 2011-09-08
-\msg_generic_set:nnn 2011-09-08
-\msg_interrupt:xxx 2013-01-08
-\msg_log:x 2013-01-08
-\msg_newline: 2013-01-08
-\msg_term:x 2013-01-08
-\msg_trace:nn 2011-09-08
-\msg_trace:nnx 2011-09-08
-\msg_trace:nnxx 2011-09-08
-\msg_trace:nnxxx 2011-09-08
-\msg_trace:nnxxxx 2011-09-08
-\msg_two_newlines: 2013-01-08
-\pdftex_if_engine_p: 2017-01-01
-\pdftex_if_engine:F 2017-01-01
-\pdftex_if_engine:T 2017-01-01
-\pdftex_if_engine:TF 2017-01-01
-\peek_after:NN 2011-09-08
-\peek_gafter:NN 2011-09-08
-\prg_case_dim:nnn 2013-01-08
-\prg_case_int:nnn 2013-01-08
-\prg_case_str:nnn 2013-01-08
-\prg_case_str:onn 2013-01-08
-\prg_case_str:xxn 2013-01-08
-\prg_case_tl:cnn 2013-01-08
-\prg_case_tl:Nnn 2013-01-08
-\prg_new_map_functions:Nn 2011-09-08
-\prg_set_map_functions:Nn 2011-09-08
-\prg_stepwise_function:nnnN 2013-01-08
-\prg_stepwise_inline:nnnn 2013-01-08
-\prg_stepwise_variable:nnnNn 2013-01-08
-\prop_del:cn 2013-01-08
-\prop_del:cV 2013-01-08
-\prop_del:Nn 2013-01-08
-\prop_del:NV 2013-01-08
-\prop_display:c 2011-09-08
-\prop_display:N 2011-09-08
-\prop_gdel:cn 2013-01-08
-\prop_gdel:cV 2013-01-08
-\prop_gdel:Nn 2013-01-08
-\prop_gdel:NV 2013-01-08
-\prop_get:cn 2016-01-05
-\prop_get:Nn 2016-01-05
-\prop_get_gdel:NnN 2011-09-08
-\prop_gget:cnN 2011-09-08
-\prop_gget:cVN 2011-09-08
-\prop_gget:NnN 2011-09-08
-\prop_gget:NVN 2011-09-08
-\prop_gput:ccx 2011-09-08
-\prop_if_eq_p:cc 2011-09-08
-\prop_if_eq_p:cN 2011-09-08
-\prop_if_eq_p:Nc 2011-09-08
-\prop_if_eq_p:NN 2011-09-08
-\prop_if_eq:ccF 2011-09-08
-\prop_if_eq:ccT 2011-09-08
-\prop_if_eq:ccTF 2011-09-08
-\prop_if_eq:cNF 2011-09-08
-\prop_if_eq:cNT 2011-09-08
-\prop_if_eq:cNTF 2011-09-08
-\prop_if_eq:NcF 2011-09-08
-\prop_if_eq:NcT 2011-09-08
-\prop_if_eq:NcTF 2011-09-08
-\prop_if_eq:NNF 2011-09-08
-\prop_if_eq:NNT 2011-09-08
-\prop_if_eq:NNTF 2011-09-08
-\prop_if_in:ccF 2011-09-08
-\prop_if_in:ccT 2011-09-08
-\prop_if_in:ccTF 2011-09-08
-\quark_if_recursion_tail_break:N 2015-07-14
-\quark_if_recursion_tail_break:n 2015-07-14
-\scan_align_safe_stop: 2017-01-01
-\seq_display:c 2011-09-08
-\seq_display:N 2011-09-08
-\seq_length:c 2013-01-08
-\seq_length:N 2013-01-08
-\seq_top:cN 2011-09-08
-\seq_top:NN 2011-09-08
-\seq_use:c 2013-01-08
-\seq_use:N 2013-01-08
-\skip_if_infinite_glue_p:n 2013-01-08
-\skip_if_infinite_glue:nF 2013-01-08
-\skip_if_infinite_glue:nT 2013-01-08
-\skip_if_infinite_glue:nTF 2013-01-08
-\sort_ordered: 2018-12-27
-\sort_reversed: 2018-12-27
-\str_case:nnn 2015-07-14
-\str_case:onn 2015-07-14
-\str_case_x:nnn 2015-07-14
-\str_if_eq_p:xx 2013-01-08
-\str_if_eq:xxF 2013-01-08
-\str_if_eq:xxT 2013-01-08
-\str_if_eq:xxTF 2013-01-08
-\tl_case:cnn 2015-07-14
-\tl_case:Nnn 2015-07-14
-\tl_elt_count:c 2011-09-08
-\tl_elt_count:n 2011-09-08
-\tl_elt_count:N 2011-09-08
-\tl_elt_count:o 2011-09-08
-\tl_elt_count:V 2011-09-08
-\tl_gremove_all_in:cn 2011-09-08
-\tl_gremove_all_in:Nn 2011-09-08
-\tl_gremove_in:cn 2011-09-08
-\tl_gremove_in:Nn 2011-09-08
-\tl_greplace_all_in:cnn 2011-09-08
-\tl_greplace_all_in:Nnn 2011-09-08
-\tl_greplace_in:cnn 2011-09-08
-\tl_greplace_in:Nnn 2011-09-08
-\tl_gset:Nc 2011-09-08
-\tl_head_i:n 2011-09-08
-\tl_head_i:w 2011-09-08
-\tl_head_iii:f 2011-09-08
-\tl_head_iii:n 2011-09-08
-\tl_head_iii:w 2011-09-08
-\tl_if_empty:xF 2013-01-08
-\tl_if_empty:xT 2013-01-08
-\tl_if_empty:xTF 2013-01-08
-\tl_if_head_group_p:n 2013-01-08
-\tl_if_head_group:nF 2013-01-08
-\tl_if_head_group:nT 2013-01-08
-\tl_if_head_group:nTF 2013-01-08
-\tl_if_head_N_type_p:n 2013-01-08
-\tl_if_head_N_type:nF 2013-01-08
-\tl_if_head_N_type:nT 2013-01-08
-\tl_if_head_N_type:nTF 2013-01-08
-\tl_if_head_space_p:n 2013-01-08
-\tl_if_head_space:nF 2013-01-08
-\tl_if_head_space:nT 2013-01-08
-\tl_if_head_space:nTF 2013-01-08
-\tl_length:c 2013-01-08
-\tl_length:n 2013-01-08
-\tl_length:N 2013-01-08
-\tl_length:o 2013-01-08
-\tl_length:V 2013-01-08
-\tl_new:cn 2011-09-08
-\tl_new:Nn 2011-09-08
-\tl_new:Nx 2011-09-08
-\tl_remove_all_in:cn 2011-09-08
-\tl_remove_all_in:Nn 2011-09-08
-\tl_remove_in:cn 2011-09-08
-\tl_remove_in:Nn 2011-09-08
-\tl_replace_all_in:cnn 2011-09-08
-\tl_replace_all_in:Nnn 2011-09-08
-\tl_replace_in:cnn 2011-09-08
-\tl_replace_in:Nnn 2011-09-08
-\tl_set:Nc 2011-09-08
-\tl_tail:w 2013-01-08
-\tl_to_lowercase:n 2018-03-05
-\tl_to_uppercase:n 2018-03-05
-\token_if_active_char_p:N 2011-09-08
-\token_if_active_char:NF 2011-09-08
-\token_if_active_char:NT 2011-09-08
-\token_if_active_char:NTF 2011-09-08
-\token_if_alignment_tab_p:N 2011-09-08
-\token_if_alignment_tab:NF 2011-09-08
-\token_if_alignment_tab:NT 2011-09-08
-\token_if_alignment_tab:NTF 2011-09-08
-\token_if_math_shift_p:N 2011-09-08
-\token_if_math_shift:NF 2011-09-08
-\token_if_math_shift:NT 2011-09-08
-\token_if_math_shift:NTF 2011-09-08
-\token_if_other_char_p:N 2011-09-08
-\token_if_other_char:NF 2011-09-08
-\token_if_other_char:NT 2011-09-08
-\token_if_other_char:NTF 2011-09-08
-\token_new:Nn 2018-12-29
-\toks_clear:c 2011-09-08
-\toks_clear:N 2011-09-08
-\toks_gclear:c 2011-09-08
-\toks_gclear:N 2011-09-08
-\toks_gput_left:cn 2011-09-08
-\toks_gput_left:co 2011-09-08
-\toks_gput_left:cV 2011-09-08
-\toks_gput_left:Nn 2011-09-08
-\toks_gput_left:No 2011-09-08
-\toks_gput_left:NV 2011-09-08
-\toks_gput_left:Nx 2011-09-08
-\toks_gput_right:cn 2011-09-08
-\toks_gput_right:co 2011-09-08
-\toks_gput_right:cV 2011-09-08
-\toks_gput_right:Nn 2011-09-08
-\toks_gput_right:No 2011-09-08
-\toks_gput_right:NV 2011-09-08
-\toks_gput_right:Nx 2011-09-08
-\toks_gset_eq:cc 2011-09-08
-\toks_gset_eq:cN 2011-09-08
-\toks_gset_eq:Nc 2011-09-08
-\toks_gset_eq:NN 2011-09-08
-\toks_gset:cn 2011-09-08
-\toks_gset:co 2011-09-08
-\toks_gset:cV 2011-09-08
-\toks_gset:cx 2011-09-08
-\toks_gset:Nn 2011-09-08
-\toks_gset:No 2011-09-08
-\toks_gset:NV 2011-09-08
-\toks_gset:Nx 2011-09-08
-\toks_if_empty_p:c 2011-09-08
-\toks_if_empty_p:N 2011-09-08
-\toks_if_empty:cF 2011-09-08
-\toks_if_empty:cT 2011-09-08
-\toks_if_empty:cTF 2011-09-08
-\toks_if_empty:NF 2011-09-08
-\toks_if_empty:NT 2011-09-08
-\toks_if_empty:NTF 2011-09-08
-\toks_if_eq_p:cc 2011-09-08
-\toks_if_eq_p:cN 2011-09-08
-\toks_if_eq_p:Nc 2011-09-08
-\toks_if_eq_p:NN 2011-09-08
-\toks_if_eq:ccF 2011-09-08
-\toks_if_eq:ccT 2011-09-08
-\toks_if_eq:ccTF 2011-09-08
-\toks_if_eq:cNF 2011-09-08
-\toks_if_eq:cNT 2011-09-08
-\toks_if_eq:cNTF 2011-09-08
-\toks_if_eq:NcF 2011-09-08
-\toks_if_eq:NcT 2011-09-08
-\toks_if_eq:NcTF 2011-09-08
-\toks_if_eq:NNF 2011-09-08
-\toks_if_eq:NNT 2011-09-08
-\toks_if_eq:NNTF 2011-09-08
-\toks_new:c 2011-09-08
-\toks_new:N 2011-09-08
-\toks_put_left:cn 2011-09-08
-\toks_put_left:co 2011-09-08
-\toks_put_left:cV 2011-09-08
-\toks_put_left:Nn 2011-09-08
-\toks_put_left:No 2011-09-08
-\toks_put_left:NV 2011-09-08
-\toks_put_left:Nx 2011-09-08
-\toks_put_right:cn 2011-09-08
-\toks_put_right:co 2011-09-08
-\toks_put_right:cV 2011-09-08
-\toks_put_right:Nf 2011-09-08
-\toks_put_right:Nn 2011-09-08
-\toks_put_right:No 2011-09-08
-\toks_put_right:NV 2011-09-08
-\toks_put_right:Nx 2011-09-08
-\toks_set_eq:cc 2011-09-08
-\toks_set_eq:cN 2011-09-08
-\toks_set_eq:Nc 2011-09-08
-\toks_set_eq:NN 2011-09-08
-\toks_set:cf 2011-09-08
-\toks_set:cn 2011-09-08
-\toks_set:co 2011-09-08
-\toks_set:cV 2011-09-08
-\toks_set:cv 2011-09-08
-\toks_set:cx 2011-09-08
-\toks_set:Nf 2011-09-08
-\toks_set:Nn 2011-09-08
-\toks_set:No 2011-09-08
-\toks_set:NV 2011-09-08
-\toks_set:Nv 2011-09-08
-\toks_set:Nx 2011-09-08
-\toks_show:c 2011-09-08
-\toks_show:N 2011-09-08
-\toks_use_clear:c 2011-09-08
-\toks_use_clear:N 2011-09-08
-\toks_use_gclear:c 2011-09-08
-\toks_use_gclear:N 2011-09-08
-\toks_use:c 2011-09-08
-\toks_use:N 2011-09-08
-\use_i_after_else:nw 2011-12-30
-\use_i_after_fi:nw 2011-12-30
-\use_i_after_or:nw 2011-12-30
-\use_i_after_orelse:nw 2011-12-30
-\vbox_gset_inline_begin:c 2014-08-09
-\vbox_gset_inline_begin:N 2014-08-09
-\vbox_gset_inline_end: 2014-08-09
-\vbox_set_inline_begin:c 2014-08-09
-\vbox_set_inline_begin:N 2014-08-09
-\vbox_set_inline_end: 2014-08-09
-\xetex_if_engine_p: 2017-01-01
-\xetex_if_engine:F 2017-01-01
-\xetex_if_engine:T 2017-01-01
-\xetex_if_engine:TF 2017-01-01
-[fp function] round+ 2018-03-05
-[fp function] round- 2018-03-05
-[fp function] round0 2018-03-05
-[key property] .choice_code:n 2015-07-14
-[key property] .choice_code:x 2015-07-14
-[key property] .code:x 2013-07-10
-[key property] .generate_choices:n 2015-07-14
-[key property] .meta:x 2013-07-10
-[key property] .value_forbidden: 2017-01-01
-[key property] .value_required: 2017-01-01
-Variants of n into N/c 2018-12-27
-Variants of N into n/o/V/v/f/x 2018-12-27
-----------------------------------------------------------
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv
index 0054b22ed2..c43913c283 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/contrib/l3kernel/l3prefixes.csv
@@ -107,6 +107,7 @@ morewrites,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrite
msg,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
muskip,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
nan,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
+nicematrix,nicematrix,François Pantigny,,,,2019-12-19,2019-12-19,
nil,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
no,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
notestobib,notes2bib,Joseph Wright,https://github.com/josephwright/notes2bib,https://github.com/josephwright/notes2bib.git,https://github.com/josephwright/notes2bib/issues,2012-11-07,2012-11-07,
@@ -138,6 +139,7 @@ right,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,http
rivbook,rivbook,Julien Rivaud,,,,2018-06-13,2018-06-14,
rivmath,rivmath,Julien Rivaud,,,,2018-06-13,2018-06-13,
scan,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+scontents,scontents,Pablo González,https://github.com/pablgonz/scontents,git@github.com:pablgonz/scontents.git,https://github.com/pablgonz/scontents/issues,2019-12-05,2019-12-05,
seq,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
siunitx,siunitx,Joseph Wright,https://github.com/josephwright/siunitx,https://github.com/josephwright/siunitx.git,https://github.com/josephwright/siunitx/issues,2012-11-04,2012-11-04,
skip,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
@@ -169,6 +171,7 @@ utex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https
vbox,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
vcoffin,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-28,2012-09-28,
withargs,withargs,Michiel Helvensteijn,,,,2014-02-05,2014-02-05,
+witharrows,witharrows,François Pantigny,,,,2019-12-19,2019-12-19,
xeCJK,xecjk,Qing Lee,https://github.com/CTeX-org/ctex-kit,https://github.com/CTeX-org/ctex-kit.git,https://github.com/CTeX-org/ctex-kit/issues,2013-05-26,2013-05-26,
xetex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
xfrac,xfrac,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index cbb3f89304..8117582c19 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index 63b2f5845b..6a503a97f6 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -2,7 +2,7 @@
%
%% File: l3prg.dtx
%
-% Copyright (C) 2005-2019 The LaTeX3 Project
+% Copyright (C) 2005-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index 62cd9ba785..445695ac0f 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -2,7 +2,7 @@
%
%% File: l3prop.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index 401b66dfc1..d3ee404a2f 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -2,7 +2,7 @@
%
%% File: l3quark.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index bf7b19ccde..f096c3e65d 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -2,7 +2,7 @@
%
%% File: l3regex.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index 811ac0a7d7..bc21d02688 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -2,7 +2,7 @@
%
%% File: l3seq.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index 901595ae0d..cbb2345e78 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -3,7 +3,7 @@
%% File: l3skip.dtx
%
% Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
-% (C) 2012-2019 The LaTeX3 Project
+% (C) 2012-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index 49686a77ab..1cb084742b 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -2,7 +2,7 @@
%
%% File l3sort.dtx
%
-% Copyright (C) 2012-2019 The LaTeX3 Project
+% Copyright (C) 2012-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index 05531a1e93..07343492cd 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -2,7 +2,7 @@
%
%% File: l3str-convert.dtx
%
-% Copyright (C) 2013-2019 The LaTeX3 Project
+% Copyright (C) 2013-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index 09dde6a4eb..9947592862 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -2,7 +2,7 @@
%
%% File: l3str.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -690,14 +690,14 @@
%
% \section{String manipulation}
%
-% \begin{function}[EXP, added = 2015-03-01]
+% \begin{function}[EXP, added = 2019-11-26]
% {
-% \str_lower_case:n, \str_lower_case:f,
-% \str_upper_case:n, \str_upper_case:f
+% \str_lowercase:n, \str_lowercase:f,
+% \str_uppercase:n, \str_uppercase:f
% }
% \begin{syntax}
-% \cs{str_lower_case:n} \Arg{tokens}
-% \cs{str_upper_case:n} \Arg{tokens}
+% \cs{str_lowercase:n} \Arg{tokens}
+% \cs{str_uppercase:n} \Arg{tokens}
% \end{syntax}
% Converts the input \meta{tokens} to their string representation, as
% described for \cs{tl_to_str:n}, and then to the lower or upper
@@ -716,8 +716,8 @@
% \cs_set_protected:cpn
% {
% user
-% \str_upper_case:f { \tl_head:n {#1} }
-% \str_lower_case:f { \tl_tail:n {#1} }
+% \str_uppercase:f { \tl_head:n {#1} }
+% \str_lowercase:f { \tl_tail:n {#1} }
% }
% { #2 }
% }
@@ -728,19 +728,19 @@
%
% These functions should \emph{not} be used for
% \begin{itemize}
-% \item Caseless comparisons: use \cs{str_fold_case:n} for this
+% \item Caseless comparisons: use \cs{str_foldcase:n} for this
% situation (case folding is distinct from lower casing).
% \item Case changing text for typesetting: see the
-% \cs[index=tl_lower_case:n]{tl_lower_case:n(n)},
-% \cs[index=tl_upper_case:n]{tl_upper_case:n(n)} and
-% \cs[index=tl_mixed_case:n]{tl_mixed_case:n(n)} functions which
+% \cs[index=text_lowercase:n]{text_lowercase:n(n)},
+% \cs[index=text_uppercase:n]{text_uppercase:n(n)} and
+% \cs[index=text_titlecase:n]{text_titlecase:n(n)} functions which
% correctly deal with context-dependence and other factors appropriate
% to text case changing.
% \end{itemize}
%
% \begin{texnote}
% As with all \pkg{expl3} functions, the input supported by
-% \cs{str_fold_case:n} is \emph{engine-native} characters which are or
+% \cs{str_foldcase:n} is \emph{engine-native} characters which are or
% interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{}
% \emph{only} the Latin alphabet characters A--Z are case-folded
% (\emph{i.e.}~the \textsc{ascii} range which coincides with
@@ -749,10 +749,10 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[EXP, added = 2014-06-19, updated = 2016-03-07]
-% {\str_fold_case:n, \str_fold_case:V}
+% \begin{function}[EXP, added = 2019-11-26]
+% {\str_foldcase:n, \str_foldcase:V}
% \begin{syntax}
-% \cs{str_fold_case:n} \Arg{tokens}
+% \cs{str_foldcase:n} \Arg{tokens}
% \end{syntax}
% Converts the input \meta{tokens} to their string representation, as
% described for \cs{tl_to_str:n}, and then folds the case of the resulting
@@ -760,7 +760,7 @@
% left in the input stream.
%
% String folding is a process used for material such as identifiers rather
-% than for \enquote{text}. The folding provided by \cs{str_fold_case:n}
+% than for \enquote{text}. The folding provided by \cs{str_foldcase:n}
% follows the mappings provided by the \href{http://www.unicode.org}^^A
% {Unicode Consortium}, who
% \href{http://www.unicode.org/faq/casemap_charprop.html#2}{state}:
@@ -773,7 +773,7 @@
% should be used solely for internal processing and generally should not be
% stored or displayed to the end user.
% \end{quote}
-% The folding approach implemented by \cs{str_fold_case:n} follows the
+% The folding approach implemented by \cs{str_foldcase:n} follows the
% \enquote{full} scheme defined by the Unicode Consortium
% (\emph{e.g.}~\SS folds to \texttt{SS}). As case-folding is
% a language-insensitive process, there is no special treatment of
@@ -782,7 +782,7 @@
%
% \begin{texnote}
% As with all \pkg{expl3} functions, the input supported by
-% \cs{str_fold_case:n} is \emph{engine-native} characters which are or
+% \cs{str_foldcase:n} is \emph{engine-native} characters which are or
% interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{}
% \emph{only} the Latin alphabet characters A--Z are case-folded
% (\emph{i.e.}~the \textsc{ascii} range which coincides with
@@ -1850,9 +1850,9 @@
%
% \begin{macro}[EXP]
% {
-% \str_fold_case:n, \str_fold_case:V,
-% \str_lower_case:n, \str_lower_case:f,
-% \str_upper_case:n, \str_upper_case:f
+% \str_foldcase:n, \str_foldcase:V,
+% \str_lowercase:n, \str_lowercase:f,
+% \str_uppercase:n, \str_uppercase:f
% }
% \begin{macro}[EXP]{\@@_change_case:nn}
% \begin{macro}[EXP]{\@@_change_case_aux:nn}
@@ -1867,12 +1867,12 @@
% and everything else. The output is detokenized to allow data sharing
% with text-based case changing.
% \begin{macrocode}
-\cs_new:Npn \str_fold_case:n #1 { \@@_change_case:nn {#1} { fold } }
-\cs_new:Npn \str_lower_case:n #1 { \@@_change_case:nn {#1} { lower } }
-\cs_new:Npn \str_upper_case:n #1 { \@@_change_case:nn {#1} { upper } }
-\cs_generate_variant:Nn \str_fold_case:n { V }
-\cs_generate_variant:Nn \str_lower_case:n { f }
-\cs_generate_variant:Nn \str_upper_case:n { f }
+\cs_new:Npn \str_foldcase:n #1 { \@@_change_case:nn {#1} { fold } }
+\cs_new:Npn \str_lowercase:n #1 { \@@_change_case:nn {#1} { lower } }
+\cs_new:Npn \str_uppercase:n #1 { \@@_change_case:nn {#1} { upper } }
+\cs_generate_variant:Nn \str_foldcase:n { V }
+\cs_generate_variant:Nn \str_lowercase:n { f }
+\cs_generate_variant:Nn \str_uppercase:n { f }
\cs_new:Npn \@@_change_case:nn #1
{
\exp_after:wN \@@_change_case_aux:nn \exp_after:wN
@@ -1906,7 +1906,7 @@
\quark_if_recursion_tail_stop_do:Nn #2
{ \@@_change_case_end:wn }
\@@_change_case_output:fw
- { \use:c { char_str_ #1 _case:N } #2 }
+ { \use:c { char_str_ #1 case:N } #2 }
\@@_change_case_loop:nw {#1}
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index d00c3f0601..c8be704965 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex
index 28948cc82c..9b48213e4a 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/contrib/l3kernel/l3styleguide.tex
@@ -2,7 +2,7 @@
File: l3styleguide.tex
-Copyright (C) 2011,2012,2014-2019 The LaTeX3 Project
+Copyright (C) 2011,2012,2014-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-11-07}
+\date{Released 2020-01-12}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index e6b56c4699..5d9e1b7053 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
index a27fb842d0..26c5850c23 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
@@ -2,7 +2,7 @@
File: l3syntax-changes.tex
-Copyright (C) 2011-2012,2017-2019 The LaTeX3 Project
+Copyright (C) 2011-2012,2017-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-11-07}
+\date{Released 2020-01-12}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 24e79512c7..12ebc542a5 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -2,7 +2,7 @@
%
%% File: l3sys.dtx
%
-% Copyright (C) 2015-2019 The LaTeX3 Project
+% Copyright (C) 2015-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -837,7 +837,7 @@
}
% \end{macrocode}
% If there is a class option set, and recognised, we pick it up: these
-% will over-ride anything set automatically but will themsevles be
+% will over-ride anything set automatically but will themselves be
% over-written if there is a package option.
% \begin{macrocode}
\@@_finalise:n
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index 062c6794b9..60440afea3 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex
index 0f7ed542b3..e982eb5761 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.tex
@@ -2,7 +2,7 @@
File: l3term-glossary.tex
-Copyright (C) 2018-2019 The LaTeX3 Project
+Copyright (C) 2018-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-11-07}
+\date{Released 2020-01-12}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
new file mode 100644
index 0000000000..3c608eacb9
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -0,0 +1,1421 @@
+% \iffalse meta-comment
+%
+%% File: l3text-case.dtx
+%
+% Copyright (C) 2020 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \textsf{l3text-case} package: text processing (case changing)^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2020-01-12}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3text-case} implementation}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=text>
+% \end{macrocode}
+%
+% \subsection{Case changing}
+%
+% \begin{macro}[EXP]
+% {
+% \text_lowercase:n,
+% \text_uppercase:n,
+% \text_titlecase:n,
+% \text_titlecase_first:n
+% }
+% \begin{macro}[EXP]
+% {
+% \text_lowercase:nn,
+% \text_uppercase:nn,
+% \text_titlecase:nn,
+% \text_titlecase_first:nn
+% }
+% The user level functions here are all wrappers around the internal
+% functions for case changing.
+% \begin{macrocode}
+\cs_new:Npn \text_lowercase:n #1
+ { \@@_change_case:nnn { lower } { } {#1} }
+\cs_new:Npn \text_uppercase:n #1
+ { \@@_change_case:nnn { upper } { } {#1} }
+\cs_new:Npn \text_titlecase:n #1
+ { \@@_change_case:nnn { title } { } {#1} }
+\cs_new:Npn \text_titlecase_first:n #1
+ { \@@_change_case:nnn { titleonly } { } {#1} }
+\cs_new:Npn \text_lowercase:nn #1#2
+ { \@@_change_case:nnn { lower } {#1} {#2} }
+\cs_new:Npn \text_uppercase:nn #1#2
+ { \@@_change_case:nnn { upper } {#1} {#2} }
+\cs_new:Npn \text_titlecase:nn #1#2
+ { \@@_change_case:nnn { title } {#1} {#2} }
+\cs_new:Npn \text_titlecase_first:nn #1#2
+ { \@@_change_case:nnn { titleonly } {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_change_case:nnn, \@@_change_case_aux:nnn}
+% \begin{macro}[EXP]{\@@_change_case_store:n}
+% \begin{macro}[EXP]{\@@_change_case_store:nw}
+% \begin{macro}[EXP]{\@@_change_case_result:n}
+% \begin{macro}[EXP]{\@@_change_case_end:w}
+% \begin{macro}[EXP]{\@@_change_case_loop:nnw}
+% \begin{macro}[EXP]{\@@_change_case_break:w}
+% \begin{macro}[EXP]
+% {
+% \@@_change_case_group_lower:nnn ,
+% \@@_change_case_group_upper:nnn ,
+% \@@_change_case_group_title:nnn ,
+% \@@_change_case_group_titleonly:nnn
+% }
+% \begin{macro}[EXP]{\@@_change_case_space:nnw}
+% \begin{macro}[EXP]{\@@_change_case_N_type:nnN, \@@_change_case_N_type_aux:nnN}
+% \begin{macro}[EXP]{\@@_change_case_N_type:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_math_search:nnNNN}
+% \begin{macro}[EXP]{\@@_change_case_math_loop:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_math_N_type:nnNN}
+% \begin{macro}[EXP]{\@@_change_case_math_group:nnNn}
+% \begin{macro}[EXP]{\@@_change_case_math_space:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_cs_check:nnN}
+% \begin{macro}[EXP]{\@@_change_case_exclude:nnN}
+% \begin{macro}[EXP]{\@@_change_case_exclude:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_exclude:nnNN}
+% \begin{macro}[EXP]{\@@_change_case_exclude:nnNn}
+% \begin{macro}[EXP]
+% {
+% \@@_change_case_letterlike_lower:nnN ,
+% \@@_change_case_letterlike_upper:nnN ,
+% \@@_change_case_letterlike_title:nnN ,
+% \@@_change_case_letterlike_titleonly:nnN
+% }
+% \begin{macro}[EXP]{\@@_change_case_letterlike:nnnnN}
+% \begin{macro}[EXP]
+% {\@@_change_case_char_lower:nnN, \@@_change_case_char_upper:nnN}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:NnnN}
+% \begin{macro}[EXP]
+% {\@@_change_case_char_title:nnN, \@@_change_case_char_titleonly:nnN}
+% \begin{macro}[EXP]
+% {\@@_change_case_char_title:nN, \@@_change_case_char_titleonly:nN}
+% \begin{macro}[EXP]{\@@_change_case_char_title:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_char_char:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nnnNN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nnnNNN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nnnNNNNN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nnnn}
+% \begin{macro}[EXP]
+% {
+% \@@_change_case_char_next_lower:nn ,
+% \@@_change_case_char_next_upper:nn ,
+% \@@_change_case_char_next_title:nn ,
+% \@@_change_case_char_next_titleonly:nn
+% }
+% \begin{macro}[EXP]{\@@_change_case_char_next_end:nn}
+% As for the expansion code, the business end of case changing is the
+% handling of \texttt{N}-type tokens. First, we expand the input fully
+% (so the loops here don't need to worry about awkward look-aheads and the
+% like). Then we split into the different paths.
+%
+% The code here needs to be \texttt{f}-type expandable to deal with the
+% situation where case changing is applied in running text. There, we
+% might have case changing as a document command and the text containing
+% other non-expandable document commands.
+% \begin{verbatim}
+% \cs_set_eq:NN \MakeLowercase \text_lowercase
+% ...
+% \MakeLowercase{\enquote*{A} text}
+% \end{verbatim}
+% If we use an \texttt{e}-type expansion and wrap each token in
+% \cs{exp_not:n}, that would explode: the document command grabs
+% \cs{exp_not:n} as an argument, and things go badly wrong. So we have to
+% wrap the entire result in exactly one \cs{exp_not:n}, or rather in the
+% kernel version.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case:nnn #1#2#3
+ {
+ \__kernel_exp_not:w \exp_after:wN
+ {
+ \exp:w
+ \exp_args:Ne \@@_change_case_aux:nnn
+ { \text_expand:n {#3} }
+ {#1} {#2}
+ }
+ }
+\cs_new:Npn \@@_change_case_aux:nnn #1#2#3
+ {
+ \group_align_safe_begin:
+ \@@_change_case_loop:nnw {#2} {#3} #1
+ \q_recursion_tail \q_recursion_stop
+ \@@_change_case_result:n { }
+ }
+% \end{macrocode}
+% As for expansion, collect up the tokens for future use.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_store:n #1
+ { \@@_change_case_store:nw {#1} }
+\cs_generate_variant:Nn \@@_change_case_store:n { o , e , V , v }
+\cs_new:Npn \@@_change_case_store:nw #1#2 \@@_change_case_result:n #3
+ { #2 \@@_change_case_result:n { #3 #1 } }
+\cs_new:Npn \@@_change_case_end:w #1 \@@_change_case_result:n #2
+ {
+ \group_align_safe_end:
+ \exp_end:
+ #2
+ }
+% \end{macrocode}
+% The main loop is the standard \texttt{tl action} type.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_loop:nnw #1#2#3 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#3}
+ { \@@_change_case_N_type:nnN }
+ {
+ \tl_if_head_is_group:nTF {#3}
+ { \use:c { @@_change_case_group_ #1 :nnn } }
+ { \@@_change_case_space:nnw }
+ }
+ {#1} {#2} #3 \q_recursion_stop
+ }
+\cs_new:Npn \@@_change_case_break:w #1 \q_recursion_tail \q_recursion_stop
+ {
+ \@@_change_case_store:n {#1}
+ \@@_change_case_end:w
+ }
+% \end{macrocode}
+% For a group, we \emph{could} worry about whether this contains a character
+% or not. However, that would make life very complex for little gain: exactly
+% what a first character is is rather weakly-defined anyway. So if there is
+% a group, we simply assume that a character has been seen, and for title
+% case we switch to the \enquote{rest of the tokens} situation. To avoid
+% having too much testing, we use a two-step process here to allow the
+% titlecase functions to be separate.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_group_lower:nnn #1#2#3
+ {
+ \@@_change_case_store:o
+ {
+ \exp_after:wN
+ {
+ \exp:w
+ \@@_change_case_aux:nnn {#3} {#1} {#2}
+ }
+ }
+ \@@_change_case_loop:nnw {#1} {#2}
+ }
+\cs_new_eq:NN \@@_change_case_group_upper:nnn
+ \@@_change_case_group_lower:nnn
+\cs_new:Npn \@@_change_case_group_title:nnn #1#2#3
+ {
+ \@@_change_case_store:o
+ {
+ \exp_after:wN
+ {
+ \exp:w
+ \@@_change_case_aux:nnn {#3} {#1} {#2}
+ }
+ }
+ \@@_change_case_loop:nnw { lower } {#2}
+ }
+\cs_new:Npn \@@_change_case_group_titleonly:nnn #1#2#3
+ {
+ \@@_change_case_store:o
+ {
+ \exp_after:wN
+ {
+ \exp:w
+ \@@_change_case_aux:nnn {#3} {#1} {#2}
+ }
+ }
+ \@@_change_case_break:w
+ }
+\use:x
+ {
+ \cs_new:Npn \exp_not:N \@@_change_case_space:nnw ##1##2 \c_space_tl
+ }
+ {
+ \@@_change_case_store:n { ~ }
+ \@@_change_case_loop:nnw {#1} {#2}
+ }
+% \end{macrocode}
+% The first step of handling \texttt{N}-type tokens is to filter out the
+% end-of-loop. That has to be done separately from the first real step
+% as otherwise we pick up the wrong delimiter. The loop here is the same
+% as the \texttt{expand} one, just passing the additional data long. If no
+% close-math token is found then the final clean-up is forced
+% (i.e.~there is no assumption of \enquote{well-behaved} input in terms of
+% math mode).
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_N_type:nnN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #3
+ { \@@_change_case_end:w }
+ \@@_change_case_N_type_aux:nnN {#1} {#2} #3
+ }
+\cs_new:Npn \@@_change_case_N_type_aux:nnN #1#2#3
+ {
+ \exp_args:NV \@@_change_case_N_type:nnnN
+ \l_text_math_delims_tl {#1} {#2} #3
+ }
+\cs_new:Npn \@@_change_case_N_type:nnnN #1#2#3#4
+ {
+ \@@_change_case_math_search:nnNNN {#2} {#3} #4 #1
+ \q_recursion_tail \q_recursion_tail
+ \q_recursion_stop
+ }
+\cs_new:Npn \@@_change_case_math_search:nnNNN #1#2#3#4#5
+ {
+ \quark_if_recursion_tail_stop_do:Nn #4
+ { \@@_change_case_cs_check:nnN {#1} {#2} #3 }
+ \token_if_eq_meaning:NNTF #3 #4
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ {
+ \@@_change_case_store:n {#3}
+ \@@_change_case_math_loop:nnNw {#1} {#2} #5
+ }
+ }
+ { \@@_change_case_math_search:nnNNN {#1} {#2} #3 }
+ }
+\cs_new:Npn \@@_change_case_math_loop:nnNw #1#2#3#4 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#4}
+ { \@@_change_case_math_N_type:nnNN }
+ {
+ \tl_if_head_is_group:nTF {#4}
+ { \@@_change_case_math_group:nnNn }
+ { \@@_change_case_math_space:nnNw }
+ }
+ {#1} {#2} #3 #4 \q_recursion_stop
+ }
+\cs_new:Npn \@@_change_case_math_N_type:nnNN #1#2#3#4
+ {
+ \quark_if_recursion_tail_stop_do:Nn #4
+ { \@@_change_case_end:w }
+ \@@_change_case_store:n {#4}
+ \token_if_eq_meaning:NNTF #4 #3
+ { \@@_change_case_loop:nnw {#1} {#2} }
+ { \@@_change_case_math_loop:nnNw {#1} {#2} #3 }
+ }
+\cs_new:Npn \@@_change_case_math_group:nnNn #1#2#3#4
+ {
+ \@@_change_case_store:n { {#4} }
+ \@@_change_case_math_loop:nnNw {#1} {#2} #3
+ }
+\use:x
+ {
+ \cs_new:Npn \exp_not:N \@@_change_case_math_space:nnNw ##1##2##3
+ \c_space_tl
+ }
+ {
+ \@@_change_case_store:n { ~ }
+ \@@_change_case_math_loop:nnNw {#1} {#2} #3
+ }
+% \end{macrocode}
+% Once potential math-mode cases are filtered out the next stage is to
+% test if the token grabbed is a control sequence: the two routes the code
+% may take are then very different.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_cs_check:nnN #1#2#3
+ {
+ \token_if_cs:NTF #3
+ { \@@_change_case_exclude:nnN }
+ { \use:c { @@_change_case_char_ #1 :nnN } }
+ {#1} {#2} #3
+ }
+% \end{macrocode}
+% To deal with a control sequence there is first a need to test if it is
+% on the list which indicate that case changing should be skipped. That's
+% done using a loop as for the other special cases. If a hit is found then
+% the argument is grabbed and passed through as-is.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_exclude:nnN #1#2#3
+ {
+ \exp_args:Ne \@@_change_case_exclude:nnnN
+ {
+ \exp_not:V \l_text_math_arg_tl
+ \exp_not:V \l_text_case_exclude_arg_tl
+ }
+ {#1} {#2} #3
+ }
+\cs_new:Npn \@@_change_case_exclude:nnnN #1#2#3#4
+ {
+ \@@_change_case_exclude:nnNN {#2} {#3} #4 #1
+ \q_recursion_tail \q_recursion_stop
+ }
+\cs_new:Npn \@@_change_case_exclude:nnNN #1#2#3#4
+ {
+ \quark_if_recursion_tail_stop_do:Nn #4
+ { \use:c { @@_change_case_letterlike_ #1 :nnN } {#1} {#2} #3 }
+ \cs_if_eq:NNTF #3 #4
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ { \@@_change_case_exclude:nnNn {#1} {#2} #3 }
+ }
+ { \@@_change_case_exclude:nnNN {#1} {#2} #3 }
+ }
+\cs_new:Npn \@@_change_case_exclude:nnNn #1#2#3#4
+ {
+ \@@_change_case_store:n { #3 {#4} }
+ \@@_change_case_loop:nnw {#1} {#2}
+ }
+% \end{macrocode}
+% Letter-like commands may still be present: they are set up using a simple
+% lookup approach, so can easily be handled with no loop. If there is no
+% hit, we are at the end of the process: we loop around. Letter-like chars
+% are all available only in upper- and lowercase, so titlecasing maps to the
+% uppercase version.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_letterlike_lower:nnN #1#2#3
+ { \@@_change_case_letterlike:nnnnN {#1} {#1} {#1} {#2} #3 }
+\cs_new_eq:NN \@@_change_case_letterlike_upper:nnN
+ \@@_change_case_letterlike_lower:nnN
+\cs_new:Npn \@@_change_case_letterlike_title:nnN #1#2#3
+ { \@@_change_case_letterlike:nnnnN { upper } { lower } {#1} {#2} #3 }
+\cs_new:Npn \@@_change_case_letterlike_titleonly:nnN #1#2#3
+ { \@@_change_case_letterlike:nnnnN { upper } { end } {#1} {#2} #3 }
+\cs_new:Npn \@@_change_case_letterlike:nnnnN #1#2#3#4#5
+ {
+ \cs_if_exist:cTF { c_@@_ #1 case_ \token_to_str:N #5 _tl }
+ {
+ \@@_change_case_store:v
+ { c_@@_ #1 case_ \token_to_str:N #5 _tl }
+ \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#4}
+ }
+ {
+ \@@_change_case_store:n {#5}
+ \cs_if_exist:cTF
+ {
+ c_@@_
+ \str_if_eq:nnTF {#1} { lower } { upper } { lower }
+ case_ \token_to_str:N #5 _tl
+ }
+ { \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#4} }
+ { \@@_change_case_loop:nnw {#3} {#4} }
+ }
+ }
+% \end{macrocode}
+% For upper- and lowercase changes, once we get to this stage there are only
+% a couple of questions remaining: is there a language-specific mapping and
+% is there the special case of a terminal sigma. If not, then we pass to
+% a simple character mapping.
+% \begin{macrocode}
+\cs_new:Npx \@@_change_case_char_lower:nnN #1#2#3
+ {
+ \exp_not:N \cs_if_exist_use:cF { @@_change_case_lower_ #2 :nnnN }
+ {
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ { \exp_not:N \@@_change_case_lower_sigma:nnnN }
+ { \exp_not:N \@@_change_case_char:nnnN }
+ }
+ {#1} {#1} {#2} #3
+ }
+\cs_new:Npn \@@_change_case_char_upper:nnN #1#2#3
+ {
+ \cs_if_exist_use:cF { @@_change_case_upper_ #2 :nnnN }
+ { \@@_change_case_char:nnnN }
+ {#1} {#1} {#2} #3
+ }
+% \end{macrocode}
+% If the current character is an uppercase sigma, the a check is made on the
+% next item in the input. If it is \texttt{N}-type and not a control sequence
+% then there is a look-ahead phase: the logic here is simply based on letters.
+% The one exception is Dutch: see below.
+% \begin{macrocode}
+\bool_lazy_or:nnT
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_change_case_lower_sigma:nnnN #1#2#3#4
+ {
+ \int_compare:nNnTF { `#4 } = { "03A3 }
+ { \@@_change_case_lower_sigma:nnNw {#2} {#3} #4 }
+ { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
+ }
+ \cs_new:Npn \@@_change_case_lower_sigma:nnNw #1#2#3#4 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#4}
+ { \@@_change_case_lower_sigma:NnnN #3 }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "03C2 } { \@@_char_catcode:N #3 } }
+ \@@_change_case_loop:nnw
+ }
+ {#1} {#2} #4 \q_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_lower_sigma:NnnN #1#2#3#4
+ {
+ \@@_change_case_store:e
+ {
+ \token_if_letter:NTF #4
+ { \char_generate:nn { "03C3 } { \@@_char_catcode:N #1 } }
+ { \char_generate:nn { "03C2 } { \@@_char_catcode:N #1 } }
+ }
+ \@@_change_case_loop:nnw {#2} {#3} #4
+ }
+ }
+% \end{macrocode}
+% For titlecasing, we need to fully expand the new character to see if it
+% is a letter (or active) But that means looking ahead in the $8$-bit case, so
+% we have to grab the required tokens up-front. Life is a lot easier for Unicode
+% \TeX{}'s, where we just have one token to worry about. The one wrinkle here
+% is that for look-ahead we'd get into trouble: luckily, only Dutch has that
+% issue.
+% \begin{macrocode}
+\cs_new:Npx \@@_change_case_char_title:nnN #1#2#3
+ {
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ { \exp_not:N \token_if_letter:NTF #3 }
+ {
+ \exp_not:N \bool_lazy_or:nnTF
+ { \exp_not:N \token_if_letter_p:N #3 }
+ { \exp_not:N \token_if_active_p:N #3 }
+ }
+ { \exp_not:N \use:c { @@_change_case_char_ #1 :nN } }
+ { \exp_not:N \@@_change_case_char_title:nnnN { title } {#1} }
+ {#2} #3
+ }
+\cs_new_eq:NN \@@_change_case_char_titleonly:nnN
+ \@@_change_case_char_title:nnN
+\cs_new:Npn \@@_change_case_char_title:nN #1#2
+ { \@@_change_case_char_title:nnnN { title } { lower } {#1} #2 }
+\cs_new:Npn \@@_change_case_char_titleonly:nN #1#2
+ { \@@_change_case_char_title:nnnN { title } { end } {#1} #2 }
+\cs_new:Npn \@@_change_case_char_title:nnnN #1#2#3#4
+ {
+ \cs_if_exist_use:cF { @@_change_case_title_ #3 :nnnN }
+ {
+ \cs_if_exist_use:cF { @@_change_case_upper_ #3 :nnnN }
+ { \@@_change_case_char:nnnN }
+ }
+ {#1} {#2} {#3} #4
+ }
+% \end{macrocode}
+% For Unicode engines we can handle all characters directly. However, for
+% the $8$-bit engines the aim is to deal with (a subset of) Unicode (UTF-8)
+% input. They deal with that by making the upper half of the range active,
+% so we look for that and if found work out how many UTF-8 octets there
+% are to deal with. Those can then be grabbed to reconstruct the full
+% Unicode character, which is then used in a lookup. (As will become
+% obvious below, there is no intention here of covering all of Unicode.)
+% \begin{macrocode}
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_change_case_char:nnnN #1#2#3#4
+ {
+ \@@_change_case_store:e
+ { \use:c { char_ #1 case :N } #4 }
+ \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
+ }
+ }
+ {
+ \cs_new:Npn \@@_change_case_char:nnnN #1#2#3#4
+ {
+ \int_compare:nNnTF { `#4 } > { "80 }
+ {
+ \int_compare:nNnTF { `#4 } < { "E0 }
+ { \@@_change_case_char_UTFviii:nnnNN }
+ {
+ \int_compare:nNnTF { `#4 } < { "F0 }
+ { \@@_change_case_char_UTFviii:nnnNNN }
+ { \@@_change_case_char_UTFviii:nnnNNNN }
+ }
+ {#1} {#2} {#3} #4
+ }
+ {
+ \@@_change_case_store:e{ \use:c { char_ #1 case :N } #4 }
+ \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
+ }
+ }
+ \cs_new:Npn \@@_change_case_char_UTFviii:nnnNN #1#2#3#4#5
+ { \@@_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5} }
+ \cs_new:Npn \@@_change_case_char_UTFviii:nnnNNN #1#2#3#4#5#6
+ { \@@_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6} }
+ \cs_new:Npn \@@_change_case_char_UTFviii:nnnNNNNN #1#2#3#4#5#6#7
+ { \@@_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6#7} }
+ \cs_new:Npn \@@_change_case_char_UTFviii:nnnn #1#2#3#4
+ {
+ \cs_if_exist:cTF { c_@@_ #1 case_ \tl_to_str:n {#4} _tl }
+ {
+ \@@_change_case_store:v
+ { c_@@_ #1 case_ \tl_to_str:n {#4} _tl }
+ }
+ { \@@_change_case_store:n {#4} }
+ \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
+ }
+ }
+\cs_new:Npn \@@_change_case_char_next_lower:nn #1#2
+ { \@@_change_case_loop:nnw {#1} {#2} }
+\cs_new_eq:NN \@@_change_case_char_next_upper:nn
+ \@@_change_case_char_next_lower:nn
+\cs_new_eq:NN \@@_change_case_char_next_title:nn
+ \@@_change_case_char_next_lower:nn
+\cs_new_eq:NN \@@_change_case_char_next_titleonly:nn
+ \@@_change_case_char_next_lower:nn
+\cs_new:Npn \@@_change_case_char_next_end:nn #1#2
+ { \@@_change_case_break:w }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_change_case_upper_de-alt:nnnN}
+% A simple alternative version for German.
+% \begin{macrocode}
+\bool_lazy_or:nnT
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:cpn { @@_change_case_upper_de-alt:nnnN } #1#2#3#4
+ {
+ \int_compare:nNnTF { `#4 } = { "00DF }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "1E9E } { \@@_char_catcode:N #4 } }
+ \use:c { @@_change_case_char_next_ #2 :nn }
+ {#2} {#3}
+ }
+ { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnn}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_aux:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_loop:nnw}
+% \begin{macro}[EXP]{\@@_change_case_upper_el:nnN}
+% \begin{macro}[EXP]{\@@_change_case_if_greek:nTF}
+% For Greek uppercasing, we need to know if characters \emph{in the Greek
+% range} have accents. That means doing a \textsc{nfd} conversion first, then
+% starting a search. As described by the Unicode \textsc{cldr}, Greek accents
+% need to be found \emph{after} any U+0308 (diaeresis) and are done in two
+% groups to allow for the canonical ordering.
+% \begin{macrocode}
+\bool_lazy_or:nnT
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_change_case_upper_el:nnnN #1#2#3#4
+ {
+ \@@_change_case_if_greek:nTF { `#4 }
+ {
+ \exp_args:Ne \@@_change_case_upper_el:nnnn
+ { \char_to_nfd:N #4 } {#1} {#2} {#3}
+ }
+ { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
+ }
+ \cs_new:Npn \@@_change_case_upper_el:nnnn #1#2#3#4
+ { \@@_change_case_upper_el_aux:nnnN {#2} {#3} {#4} #1 }
+ \cs_new:Npn \@@_change_case_upper_el_aux:nnnN #1#2#3#4
+ {
+ \@@_change_case_store:e { \use:c { char_ #1 case:N } #4 }
+ \@@_change_case_upper_el_loop:nnw {#2} {#3}
+ }
+ \cs_new:Npn \@@_change_case_upper_el_loop:nnw
+ #1#2#3 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#3}
+ { \@@_change_case_upper_el:nnN }
+ { \@@_change_case_loop:nnw }
+ {#1} {#2} #3 \q_recursion_stop
+ }
+% \end{macrocode}
+% In addition to the Greek accents, we list three cases here where an
+% accent outside the Greek range has a \text{nfd} that would make it
+% equivalent. That includes U+0344, which has to insert U+0308.
+% \begin{macrocode}
+ \cs_new:Npn \@@_change_case_upper_el:nnN #1#2#3
+ {
+ \token_if_cs:NTF #3
+ { \@@_change_case_loop:nnw {#1} {#2} #3 }
+ {
+ \int_compare:nNnTF { `#3 } = { "0308 }
+ {
+ \@@_change_case_store:n {#3}
+ \@@_change_case_upper_el_loop:nnw {#1} {#2}
+ }
+ {
+ \bool_lazy_any:nTF
+ {
+ { \int_compare_p:nNn { `#3 } = { "0300 } }
+ { \int_compare_p:nNn { `#3 } = { "0301 } }
+ { \int_compare_p:nNn { `#3 } = { "0304 } }
+ { \int_compare_p:nNn { `#3 } = { "0306 } }
+ { \int_compare_p:nNn { `#3 } = { "0308 } }
+ { \int_compare_p:nNn { `#3 } = { "0313 } }
+ { \int_compare_p:nNn { `#3 } = { "0314 } }
+ { \int_compare_p:nNn { `#3 } = { "0342 } }
+ { \int_compare_p:nNn { `#3 } = { "0340 } }
+ { \int_compare_p:nNn { `#3 } = { "0341 } }
+ { \int_compare_p:nNn { `#3 } = { "0343 } }
+ }
+ { \@@_change_case_upper_el_loop:nnw {#1} {#2} }
+ {
+ \int_compare:nNnTF { `#3 } = { "0344 }
+ {
+ \@@_change_case_store:e
+ {
+ \char_generate:nn { "0308 }
+ { \@@_char_catcode:N #3 }
+ }
+ \@@_change_case_upper_el_loop:nnw {#1} {#2}
+ }
+ {
+ \int_compare:nNnTF { `#3 } = { "0345 }
+ { \@@_change_case_loop:nnw {#1} {#2} }
+ { \@@_change_case_loop:nnw {#1} {#2} #3 }
+ }
+ }
+ }
+ }
+ }
+ \prg_new_conditional:Npnn \@@_change_case_if_greek:n #1 { TF }
+ {
+ \if_int_compare:w #1 < "0370 \exp_stop_f:
+ \prg_return_false:
+ \else:
+ \if_int_compare:w #1 > "03FF \exp_stop_f:
+ \if_int_compare:w #1 < "1F00 \exp_stop_f:
+ \prg_return_false:
+ \else:
+ \if_int_compare:w #1 > "1FFF \exp_stop_f:
+ \prg_return_false:
+ \else:
+ \prg_return_true:
+ \fi:
+ \fi:
+ \else:
+ \prg_return_true:
+ \fi:
+ \fi:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}[EXP]{\@@_change_case_title_el:nnnN}
+% Titlecasing retains accents, but to prevent the uppercasing code
+% from kicking in, there has to be an explicit function here.
+% \begin{macrocode}
+\bool_lazy_or:nnT
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_change_case_title_el:nnnN #1#2#3#4
+ { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+% {
+% \@@_change_cases_lower_lt:nnnN ,
+% \@@_change_cases_lower_lt_auxi:nnnN ,
+% \@@_change_cases_lower_lt_auxii:nnnN
+% }
+% \begin{macro}[rEXP]{\@@_change_case_lower_lt:nnw}
+% \begin{macro}[rEXP]{\@@_change_case_lower_lt:nnN}
+% For Lithuanian, the issue to be dealt with is dots over lower case
+% letters: these should be present if there is another accent. The first step
+% is a simple match attempt: look for the three uppercase accented letters
+% which should gain a dot-above char in their lowercase form.
+% \begin{macrocode}
+\bool_lazy_or:nnT
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_change_case_lower_lt:nnnN #1#2#3#4
+ {
+ \exp_args:Ne \@@_change_case_lower_lt_auxi:nnnN
+ {
+ \int_case:nn { `#4 }
+ {
+ { "00CC } { "0300 }
+ { "00CD } { "0301 }
+ { "0128 } { "0303 }
+ }
+ }
+ {#2} {#3} #4
+ }
+% \end{macrocode}
+% If there was a hit, output the result with the dot-above and move on.
+% Otherwise, look for one of the three letters that can take a combining
+% accent: I, J and I-ogonek.
+% \begin{macrocode}
+ \cs_new:Npn \@@_change_case_lower_lt_auxi:nnnN #1#2#3#4
+ {
+ \tl_if_blank:nTF {#1}
+ {
+ \exp_args:Ne \@@_change_case_lower_lt_auxii:nnnN
+ {
+ \int_case:nn { `#4 }
+ {
+ { "0049 } { "0069 }
+ { "004A } { "006A }
+ { "012E } { "012F }
+ }
+ }
+ {#2} {#3} #4
+ }
+ {
+ \@@_change_case_store:e
+ {
+ \char_generate:nn { "0069 } { \@@_char_catcode:N #4 }
+ \char_generate:nn { "0307 } { \@@_char_catcode:N #4 }
+ \char_generate:nn {#1} { \@@_char_catcode:N #4 }
+ }
+ \@@_change_case_loop:nnw {#2} {#3}
+ }
+ }
+% \end{macrocode}
+% Again, branch depending on a hit. If there is one, we output the character
+% then need to look for a combining accent: as usual, we need to be aware of
+% the loop situation.
+% \begin{macrocode}
+ \cs_new:Npn \@@_change_case_lower_lt_auxii:nnnN #1#2#3#4
+ {
+ \tl_if_blank:nTF {#1}
+ { \@@_change_case_lower_sigma:nnnN {#2} {#2} {#3} #4 }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn {#1} { \@@_char_catcode:N #4 } }
+ \@@_change_case_lower_lt:nnw {#2} {#3}
+ }
+ }
+ \cs_new:Npn \@@_change_case_lower_lt:nnw #1#2#3 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#3}
+ { \@@_change_case_lower_lt:nnN }
+ { \@@_change_case_loop:nnw }
+ {#1} {#2} #3 \q_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_lower_lt:nnN #1#2#3
+ {
+ \bool_lazy_and:nnT
+ { ! \token_if_cs_p:N #3 }
+ {
+ \bool_lazy_any_p:n
+ {
+ { \int_compare_p:nNn { `#3 } = { "0300 } }
+ { \int_compare_p:nNn { `#3 } = { "0301 } }
+ { \int_compare_p:nNn { `#3 } = { "0303 } }
+ }
+ }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "0307 } { \@@_char_catcode:N #3 } }
+ }
+ \@@_change_case_loop:nnw {#1} {#2} #3
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}[EXP]
+% {
+% \@@_change_cases_upper_lt:nnnN ,
+% \@@_change_cases_upper_lt_aux:nnnN
+% }
+% \begin{macro}[rEXP]{\@@_change_case_upper_lt:nnw}
+% \begin{macro}[rEXP]{\@@_change_case_upper_lt:nnN}
+% The uppercasing version: first find i/j/i-ogonek, then look for the
+% combining char: drop it if present.
+% \begin{macrocode}
+\bool_lazy_or:nnT
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_change_case_upper_lt:nnnN #1#2#3#4
+ {
+ \exp_args:Ne \@@_change_case_upper_lt_aux:nnnN
+ {
+ \int_case:nn { `#4 }
+ {
+ { "0069 } { "0049 }
+ { "006A } { "004A }
+ { "012F } { "012E }
+ }
+ }
+ {#2} {#3} #4
+ }
+ \cs_new:Npn \@@_change_case_upper_lt_aux:nnnN #1#2#3#4
+ {
+ \tl_if_blank:nTF {#1}
+ { \@@_change_case_char:nnnN { upper } {#2} {#3} #4 }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn {#1} { \@@_char_catcode:N #4 } }
+ \@@_change_case_upper_lt:nnw {#2} {#3}
+ }
+ }
+ \cs_new:Npn \@@_change_case_upper_lt:nnw #1#2#3 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#3}
+ { \@@_change_case_upper_lt:nnN }
+ { \use:c { @@_change_case_char_next_ #1 :nn } }
+ {#1} {#2} #3 \q_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_upper_lt:nnN #1#2#3
+ {
+ \bool_lazy_and:nnTF
+ { ! \token_if_cs_p:N #3 }
+ { \int_compare_p:nNn { `#3 } = { "0307 } }
+ { \use:c { @@_change_case_char_next_ #1 :nn } {#1} {#2} }
+ { \use:c { @@_change_case_char_next_ #1 :nn } {#1} {#2} #3 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_change_case_title_nl:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_title_nl:nnw}
+% \begin{macro}[EXP]{\@@_change_case_title_nl:nnN}
+% For Dutch, there is a single look-ahead test for \texttt{ij} when
+% title casing. If the appropriate letters are found, produce \texttt{IJ}
+% and gobble the \texttt{j}/\texttt{J}.
+% \begin{macrocode}
+\cs_new:Npn \@@_change_case_title_nl:nnnN #1#2#3#4
+ {
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn { `#4 } = { "0049 } }
+ { \int_compare_p:nNn { `#4 } = { "0069 } }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "0049 } { \@@_char_catcode:N #4 } }
+ \@@_change_case_title_nl:nnw {#2} {#3}
+ }
+ { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
+ }
+\cs_new:Npn \@@_change_case_title_nl:nnw #1#2#3 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#3}
+ { \@@_change_case_title_nl:nnN }
+ { \use:c { @@_change_case_char_next_ #1 :nn } }
+ {#1} {#2} #3 \q_recursion_stop
+ }
+\cs_new:Npn \@@_change_case_title_nl:nnN #1#2#3
+ {
+ \bool_lazy_and:nnTF
+ { ! \token_if_cs_p:N #3 }
+ {
+ \bool_lazy_or_p:nn
+ { \int_compare_p:nNn { `#3 } = { "004A } }
+ { \int_compare_p:nNn { `#3 } = { "006A } }
+ }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "004A } { \@@_char_catcode:N #3 } }
+ \use:c { @@_change_case_char_next_ #1 :nn } {#1} {#2}
+ }
+ { \use:c { @@_change_case_char_next_ #1 :nn } {#1} {#2} #3 }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_change_case_lower_tr:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_lower_tr:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_lower_tr:nnN}
+% \begin{macro}[EXP]{\@@_change_case_lower_tr:nnnNN}
+% The Turkic languages need special treatment for dotted-i and dotless-i.
+% The lower casing rule can be expressed in terms of searching first for
+% either a dotless-I or a dotted-I. In the latter case the mapping is
+% easy, but in the former there is a second stage search.
+% \begin{macrocode}
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_change_case_lower_tr:nnnN #1#2#3#4
+ {
+ \int_compare:nNnTF { `#4 } = { "0049 }
+ { \@@_change_case_lower_tr:nnNw {#1} {#3} #4 }
+ {
+ \int_compare:nNnTF { `#4 } = { "0130 }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "0069 } { \@@_char_catcode:N #4 } }
+ \@@_change_case_loop:nnw {#1} {#3}
+ }
+ { \@@_change_case_lower_sigma:nnnN {#1} {#2} {#3} #4 }
+ }
+ }
+% \end{macrocode}
+% After a dotless-I there may be a dot-above character. If there is then
+% a dotted-i should be produced, otherwise output a dotless-i. When the
+% combination is found both the dotless-I and the dot-above char have to
+% be removed from the input.
+% \begin{macrocode}
+ \cs_new:Npn \@@_change_case_lower_tr:nnNw #1#2#3#4 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#4}
+ { \@@_change_case_lower_tr:nnN }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "0131 } { \@@_char_catcode:N #3 } }
+ \@@_change_case_loop:nnw
+ }
+ {#1} {#2} #4 \q_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_lower_tr:nnN #1#2#3
+ {
+ \bool_lazy_or:nnTF
+ { \token_if_cs_p:N #3 }
+ { ! \int_compare_p:nNn { `#3 } = { "0307 } }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "0131 } { \@@_char_catcode:N #3 } }
+ \@@_change_case_loop:nnw {#1} {#2} #3
+ }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "0069 } { \@@_char_catcode:N #3 } }
+ \@@_change_case_loop:nnw {#1} {#2}
+ }
+ }
+ }
+% \end{macrocode}
+% For $8$-bit engines, dot-above is not available so there is a simple
+% test for an upper-case I. Then we can look for the UTF-8 representation of
+% an upper case dotted-I without the combining char. If it's not there,
+% preserve the UTF-8 sequence as-is. With $8$bit engines, we cannot
+% completely preserve category codes, so we have to make some assumptions:
+% output a \enquote{normal} \texttt{i} for the dotted case. As the original
+% character here is catcode-$13$, we have to make a choice about handling
+% of |i|: generate a \enquote{normal} one.
+% \begin{macrocode}
+ {
+ \cs_new:Npn \@@_change_case_lower_tr:nnnN #1#2#3#4
+ {
+ \int_compare:nNnTF { `#4 } = { "0049 }
+ {
+ \@@_change_case_store:V \c_@@_dotless_i_tl
+ \@@_change_case_loop:nnw {#1} {#3}
+ }
+ {
+ \int_compare:nNnTF { `#4 } = { "00C4 }
+ { \@@_change_case_lower_tr:nnnNN {#1} {#2} {#3} #4 }
+ { \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
+ }
+ }
+ \cs_new:Npn \@@_change_case_lower_tr:nnnNN #1#2#3#4#5
+ {
+ \int_compare:nNnTF { `#5 } = { "00B0 }
+ {
+ \@@_change_case_store:e
+ {
+ \char_generate:nn { "0069 }
+ { \char_value_catcode:n { "0069 } }
+ }
+ \@@_change_case_loop:nnw {#1} {#3}
+ }
+ { \@@_change_case_char:nnnN {#1} {#2} {#3} #4#5 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}[EXP]{\@@_change_case_upper_tr:nnnN}
+% Uppercasing is easier: just one exception with no context.
+% \begin{macrocode}
+\cs_new:Npx \@@_change_case_upper_tr:nnnN #1#2#3#4
+ {
+ \exp_not:N \int_compare:nNnTF { `#4 } = { "0069 }
+ {
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \exp_not:N \@@_change_case_store:e
+ {
+ \exp_not:N \char_generate:nn { "0130 }
+ { \exp_not:N \@@_char_catcode:N #4 }
+ }
+ }
+ {
+ \exp_not:N \@@_change_case_store:V
+ \exp_not:N \c_@@_dotted_I_tl
+ }
+ \exp_not:N \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
+ }
+ { \exp_not:N \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+% {\@@_change_case_lower_az:nnnN, \@@_change_case_upper_az:nnnN}
+% Straight copies.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_change_case_lower_az:nnnN
+ \@@_change_case_lower_tr:nnnN
+\cs_new_eq:NN \@@_change_case_upper_az:nnnN
+ \@@_change_case_upper_tr:nnnN
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Case changing data for $8$-bit engines}
+%
+% \begin{variable}
+% {
+% \c_@@_dotless_i_tl ,
+% \c_@@_dotted_I_tl ,
+% \c_@@_i_ogonek_tl ,
+% \c_@@_I_ogonek_tl
+% }
+% For cases where there is an $8$-bit option in the |T1| font set up,
+% a variant is provided in both cases.
+% \begin{macrocode}
+\group_begin:
+ \bool_lazy_or:nnF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_set_protected:Npn \@@_tmp:w #1#2
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4
+ {
+ \tl_const:Nx #1
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {##1} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {##2} { 13 }
+ }
+ }
+ \use:x
+ { \@@_tmp:w \char_to_utfviii_bytes:n { "#2 } }
+ \group_end:
+ }
+ \@@_tmp:w \c_@@_dotless_i_tl { 0131 }
+ \@@_tmp:w \c_@@_dotted_I_tl { 0130 }
+ \@@_tmp:w \c_@@_i_ogonek_tl { 012F }
+ \@@_tmp:w \c_@@_I_ogonek_tl { 012E }
+ }
+\group_end:
+% \end{macrocode}
+% \end{variable}
+%
+% For $8$-bit engines we now need to define the case-change data for
+% the multi-octet mappings. These need a list of what code points are
+% doable in |T1| so the list is hard coded (there's no saving in loading
+% the mappings dynamically). All of the straight-forward ones have two
+% octets, so that is taken as read.
+% \begin{macrocode}
+\group_begin:
+ \bool_lazy_or:nnF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_set_protected:Npn \@@_loop:nn #1#2
+ {
+ \quark_if_recursion_tail_stop:n {#1}
+ \use:x
+ {
+ \@@_tmp:w
+ \char_to_utfviii_bytes:n { "#1 }
+ \char_to_utfviii_bytes:n { "#2 }
+ }
+ \@@_loop:nn
+ }
+ \cs_set_protected:Npn \@@_tmp:nnnn #1#2#3#4#5
+ {
+ \tl_const:cx
+ {
+ c_@@_ #1 case_
+ \char_generate:nn {#2} { 12 }
+ \char_generate:nn {#3} { 12 }
+ _tl
+ }
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#4} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#5} { 13 }
+ }
+ }
+ \cs_set_protected:Npn \@@_tmp:w #1#2#3#4#5#6#7#8
+ {
+ \tl_const:cx
+ {
+ c_@@_lowercase_
+ \char_generate:nn {#1} { 12 }
+ \char_generate:nn {#2} { 12 }
+ _tl
+ }
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#5} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#6} { 13 }
+ }
+ \@@_tmp:nnnn { upper } {#5} {#6} {#1} {#2}
+ \@@_tmp:nnnn { title } {#5} {#6} {#1} {#2}
+ }
+ \@@_loop:nn
+ { 00C0 } { 00E0 }
+ { 00C1 } { 00E1 }
+ { 00C2 } { 00E2 }
+ { 00C3 } { 00E3 }
+ { 00C4 } { 00E4 }
+ { 00C5 } { 00E5 }
+ { 00C6 } { 00E6 }
+ { 00C7 } { 00E7 }
+ { 00C8 } { 00E8 }
+ { 00C9 } { 00E9 }
+ { 00CA } { 00EA }
+ { 00CB } { 00EB }
+ { 00CC } { 00EC }
+ { 00CD } { 00ED }
+ { 00CE } { 00EE }
+ { 00CF } { 00EF }
+ { 00D0 } { 00F0 }
+ { 00D1 } { 00F1 }
+ { 00D2 } { 00F2 }
+ { 00D3 } { 00F3 }
+ { 00D4 } { 00F4 }
+ { 00D5 } { 00F5 }
+ { 00D6 } { 00F6 }
+ { 00D8 } { 00F8 }
+ { 00D9 } { 00F9 }
+ { 00DA } { 00FA }
+ { 00DB } { 00FB }
+ { 00DC } { 00FC }
+ { 00DD } { 00FD }
+ { 00DE } { 00FE }
+ { 0100 } { 0101 }
+ { 0102 } { 0103 }
+ { 0104 } { 0105 }
+ { 0106 } { 0107 }
+ { 0108 } { 0109 }
+ { 010A } { 010B }
+ { 010C } { 010D }
+ { 010E } { 010F }
+ { 0110 } { 0111 }
+ { 0112 } { 0113 }
+ { 0114 } { 0115 }
+ { 0116 } { 0117 }
+ { 0118 } { 0119 }
+ { 011A } { 011B }
+ { 011C } { 011D }
+ { 011E } { 011F }
+ { 0120 } { 0121 }
+ { 0122 } { 0123 }
+ { 0124 } { 0125 }
+ { 0128 } { 0129 }
+ { 012A } { 012B }
+ { 012C } { 012D }
+ { 012E } { 012F }
+ { 0132 } { 0133 }
+ { 0134 } { 0135 }
+ { 0136 } { 0137 }
+ { 0139 } { 013A }
+ { 013B } { 013C }
+ { 013E } { 013F }
+ { 0141 } { 0142 }
+ { 0143 } { 0144 }
+ { 0145 } { 0146 }
+ { 0147 } { 0148 }
+ { 014A } { 014B }
+ { 014C } { 014D }
+ { 014E } { 014F }
+ { 0150 } { 0151 }
+ { 0152 } { 0153 }
+ { 0154 } { 0155 }
+ { 0156 } { 0157 }
+ { 0158 } { 0159 }
+ { 015A } { 015B }
+ { 015C } { 015D }
+ { 015E } { 015F }
+ { 0160 } { 0161 }
+ { 0162 } { 0163 }
+ { 0164 } { 0165 }
+ { 0168 } { 0169 }
+ { 016A } { 016B }
+ { 016C } { 016D }
+ { 016E } { 016F }
+ { 0170 } { 0171 }
+ { 0172 } { 0173 }
+ { 0174 } { 0175 }
+ { 0176 } { 0177 }
+ { 0178 } { 00FF }
+ { 0179 } { 017A }
+ { 017B } { 017C }
+ { 017D } { 017E }
+ { 01CD } { 01CE }
+ { 01CF } { 01D0 }
+ { 01D1 } { 01D2 }
+ { 01D3 } { 01D4 }
+ { 01E2 } { 01E3 }
+ { 01E6 } { 01E7 }
+ { 01E8 } { 01E9 }
+ { 01EA } { 01EB }
+ { 01F4 } { 01F5 }
+ { 0218 } { 0219 }
+ { 021A } { 021B }
+ \q_recursion_tail ?
+ \q_recursion_stop
+ \cs_set_protected:Npn \@@_tmp:w #1#2#3
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4
+ {
+ \tl_const:cx
+ {
+ c_@@_ #3 case_
+ \char_generate:nn {##1} { 12 }
+ \char_generate:nn {##2} { 12 }
+ _tl
+ }
+ {#2}
+ }
+ \use:x
+ { \@@_tmp:w \char_to_utfviii_bytes:n { "#1 } }
+ \group_end:
+ }
+ \@@_tmp:w { 00DF } { SS } { upper }
+ \@@_tmp:w { 00DF } { Ss } { title }
+ \@@_tmp:w { 0131 } { I } { upper }
+ }
+ \group_end:
+% \end{macrocode}
+%
+% The (fixed) look-up mappings for letter-like control sequences.
+% \begin{macrocode}
+\group_begin:
+ \cs_set_protected:Npn \@@_change_case_setup:NN #1#2
+ {
+ \quark_if_recursion_tail_stop:N #1
+ \tl_const:cn { c_@@_lowercase_ \token_to_str:N #1 _tl }
+ { #2 }
+ \tl_const:cn { c_@@_uppercase_ \token_to_str:N #2 _tl }
+ { #1 }
+ \@@_change_case_setup:NN
+ }
+ \@@_change_case_setup:NN
+ \AA \aa
+ \AE \ae
+ \DH \dh
+ \DJ \dj
+ \IJ \ij
+ \L \l
+ \NG \ng
+ \O \o
+ \OE \oe
+ \SS \ss
+ \TH \th
+ \q_recursion_tail ?
+ \q_recursion_stop
+ \tl_const:cn { c_@@_uppercase_ \token_to_str:N \i _tl } { I }
+ \tl_const:cn { c_@@_uppercase_ \token_to_str:N \j _tl } { J }
+\group_end:
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</initex|package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
new file mode 100644
index 0000000000..0efc072cf8
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -0,0 +1,903 @@
+% \iffalse meta-comment
+%
+%% File: l3text.dtx
+%
+% Copyright (C) 2020 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \textsf{l3text} package: text processing^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2020-01-12}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{\pkg{l3text} documentation}
+%
+% This module deals with manipulation of (formatted) text; such material is
+% comprised of a restricted set of token list content. The functions provided
+% here concern conversion of textual content for example in case changing,
+% generation of bookmarks and extraction to tags. All of the major functions
+% operate by expansion. Begin-group and end-group tokens in the \meta{text}
+% are normalized and become |{| and |}|, respectively.
+%
+% \subsection{Expanding text}
+%
+% \begin{function}[EXP, added = 2020-01-02]{\text_expand:n}
+% \begin{syntax}
+% \cs{text_expand:n} \Arg{text}
+% \end{syntax}
+% Takes user input \meta{text} and transforms expandable and implicit
+% content to the explicit equivalent. Protected commands (typically
+% formatting) are left in place, and no processing takes place of
+% math mode material (as delimited by pairs given in
+% \cs{l_text_math_delims_tl} or as the argument to commands listed
+% in \cs{l_text_math_arg_tl}). Commands which are neither engine-
+% nor \LaTeX{} protected are expanded exhaustively. Implicit tokens,
+% including implicit groups, are converted to their explicit equivalent.
+% Any commands listed in \cs{l_text_expand_exclude_tl},
+% \cs{l_text_accents_tl} and \cs{l_text_letterlike_tl} are excluded from
+% expansion
+% \end{function}
+%
+% \subsection{Case changing}
+%
+% \begin{function}[EXP, added = 2019-11-20]
+% {
+% \text_lowercase:n, \text_uppercase:n, \text_titlecase:n,
+% \text_titlecase_first:n,
+% \text_lowercase:nn, \text_uppercase:nn, \text_titlecase:nn,
+% \text_titlecase_first:nn
+% }
+% \begin{syntax}
+% \cs{text_uppercase:n} \Arg{tokens}
+% \cs{text_uppercase:nn} \Arg{language} \Arg{tokens}
+% \end{syntax}
+% Takes user input \meta{text} first applies \cs{text_expand}, then
+% transforms the case of character tokens as specified by the
+% function name. The category code of letters are not changed by this
+% process (at least where they can be represented by the engine as a single
+% token: $8$-bit engines may require active characters).
+%
+% Upper- and lowercase have the obvious meanings. Titlecasing may be regarded
+% informally as converting the first character of the \meta{tokens} to
+% uppercase and the rest to lowercase. However, the process is more complex
+% than this as there are some situations where a single lowercase character
+% maps to a special form, for example \texttt{ij} in Dutch which becomes
+% \texttt{IJ}. The \texttt{titlecase_first} variant does not attempt
+% any case changing at all after the first letter has been processed.
+%
+% Importantly, notice that these functions are intended for working with
+% user \emph{text for typesetting}. For case changing programmatic data see
+% the \pkg{l3str} module and discussion there of \cs{str_lowercase:n},
+% \cs{str_uppercase:n} and \cs{str_foldcase:n}.
+%
+% Case changing does not take place within math mode material so for example
+% \begin{verbatim}
+% \text_uppercase:n { Some~text~$y = mx + c$~with~{Braces} }
+% \end{verbatim}
+% becomes
+% \begin{verbatim}
+% SOME TEXT $y = mx + c$ WITH {BRACES}
+% \end{verbatim}
+%
+% The arguments of commands listed in \cs{l_text_case_exclude_arg_tl}
+% are excluded from case changing; the latter are entirely non-textual
+% content (such as labels).
+%
+% As is generally true for \pkg{expl3}, these functions are designed to
+% work with Unicode input only. As such, UTF-8 input is assumed for
+% \emph{all} engines. When used with \XeTeX{} or \LuaTeX{} a full range of
+% Unicode transformations are enabled. Specifically, the standard mappings
+% here follow those defined by the \href{http://www.unicode.org}^^A
+% {Unicode Consortium} in \texttt{UnicodeData.txt} and
+% \texttt{SpecialCasing.txt}. In the case of $8$-bit engines, mappings
+% are provided for characters which can be represented in output typeset
+% using the |T1| font encoding. Thus for example \texttt{ä} can be
+% case-changed using \pdfTeX{}. For \pTeX{} only the ASCII range is
+% covered as the engine treats input outside of this range as east Asian.
+%
+% Language-sensitive conversions are enabled using the \meta{language}
+% argument, and follow Unicode Consortium guidelines. Currently, the
+% languages recognised for special handling are as follows.
+% \begin{itemize}
+% \item Azeri and Turkish (\texttt{az} and \texttt{tr}).
+% The case pairs I/i-dotless and I-dot/i are activated for these
+% languages. The combining dot mark is removed when lowercasing
+% I-dot and introduced when upper casing i-dotless.
+% \item German (\texttt{de-alt}).
+% An alternative mapping for German in which the lowercase
+% \emph{Eszett} maps to a \emph{gro\ss{}es Eszett}.
+% \item Greek (\texttt{el}).
+% Removes accents from Greek letters when uppercasing; titlecasing
+% leaves accents in place.
+% \item Lithuanian (\texttt{lt}).
+% The lowercase letters i and j should retain a dot above when the
+% accents grave, acute or tilde are present. This is implemented for
+% lowercasing of the relevant uppercase letters both when input as
+% single Unicode codepoints and when using combining accents. The
+% combining dot is removed when uppercasing in these cases. Note that
+% \emph{only} the accents used in Lithuanian are covered: the behaviour
+% of other accents are not modified.
+% \item Dutch (\texttt{nl}).
+% Capitalisation of \texttt{ij} at the beginning of titlecased
+% input produces \texttt{IJ} rather than \texttt{Ij}. The output
+% retains two separate letters, thus this transformation \emph{is}
+% available using \pdfTeX{}.
+% \end{itemize}
+% \end{function}
+%
+% \subsection{Control variables}
+%
+% \begin{variable}{\l_text_accents_tl}
+% Lists commands which represent accents, and which are left unchanged
+% by expansion. (Defined only for the \LaTeXe{} package.)
+% \end{variable}
+%
+% \begin{variable}{\l_text_letterlike_tl}
+% Lists commands which represent letters; these are left unchanged by
+% expansion. (Defined only for the \LaTeXe{} package.)
+% \end{variable}
+%
+% \begin{variable}{\l_text_math_arg_tl}
+% Lists commands present in the \meta{text} where the argument of the
+% command should be treated as math mode material. The treatment here is
+% similar to \cs{l_text_math_delims_tl} but for a command rather than
+% paired delimiters.
+% \end{variable}
+%
+% \begin{variable}{\l_text_math_delims_tl}
+% Lists pairs of tokens which delimit (in-line) math mode content; such
+% content \emph{may} be excluded from processing.
+% \end{variable}
+%
+% \begin{variable}{\l_text_expand_exclude_tl}
+% Lists commands which are excluded from expansion. (Defined only for the
+% \LaTeXe{} package.)
+% \end{variable}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3text} implementation}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=text>
+% \end{macrocode}
+%
+% \subsection{Utilities}
+%
+% \begin{macro}[EXP]
+% {
+% \@@_token_to_explicit:N ,
+% \@@_token_to_explicit_char:N ,
+% \@@_token_to_explicit_cs:N ,
+% \@@_token_to_explicit_cs_aux:N
+% }
+% \begin{macro}[EXP]{\@@_token_to_explicit:n}
+% \begin{macro}[EXP]
+% {
+% \@@_token_to_explicit_auxi:w ,
+% \@@_token_to_explicit_auxii:w ,
+% \@@_token_to_explicit_auxiii:w
+% }
+% The idea here is to take a token and ensure that if it's an implicit
+% char, we output the explicit version. Otherwise, the token needs to be
+% unchanged. First, we have to split between control sequences and everything
+% else.
+% \begin{macrocode}
+\group_begin:
+ \char_set_catcode_active:n { 0 }
+ \cs_new:Npn \@@_token_to_explicit:N #1
+ {
+ \if_catcode:w \exp_not:N #1
+ \if_catcode:w \scan_stop: \exp_not:N #1
+ \scan_stop:
+ \else:
+ \exp_not:N ^^@
+ \fi:
+ \exp_after:wN \@@_token_to_explicit_cs:N
+ \else:
+ \exp_after:wN \@@_token_to_explicit_char:N
+ \fi:
+ #1
+ }
+\group_end:
+% \end{macrocode}
+% For control sequences, we can check for macros versus other cases using
+% \cs{if_meaning:w}, then explicitly check for \tn{chardef} and
+% \tn{mathchardef}.
+% \begin{macrocode}
+\cs_new:Npn \@@_token_to_explicit_cs:N #1
+ {
+ \exp_after:wN \if_meaning:w \exp_not:N #1 #1
+ \exp_after:wN \use:nn \exp_after:wN
+ \@@_token_to_explicit_cs_aux:N
+ \else:
+ \exp_after:wN \exp_not:n
+ \fi:
+ {#1}
+ }
+\cs_new:Npn \@@_token_to_explicit_cs_aux:N #1
+ {
+ \bool_lazy_or:nnTF
+ { \token_if_chardef_p:N #1 }
+ { \token_if_mathchardef_p:N #1 }
+ {
+ \char_generate:nn {#1}
+ { \char_value_catcode:n {#1} }
+ }
+ {#1}
+ }
+% \end{macrocode}
+% For character tokens, we need to filter out the implicit characters from
+% those that are explicit. That's done here, then if necessary we work out
+% the category code and generate the char. To avoid issues with alignment
+% tabs, that one is done by elimination rather than looking up the code
+% explicitly. The trick with finding the charcode is that the \TeX{}
+% messages are either \texttt{the \meta{something} character \meta{char}}
+% or \texttt{the \meta{type} \meta{char}}.
+% \begin{macrocode}
+\cs_new:Npn \@@_token_to_explicit_char:N #1
+ {
+ \if:w
+ \if_catcode:w ^ \exp_args:No \str_tail:n { \token_to_str:N #1 } ^
+ \token_to_str:N #1 #1
+ \else:
+ AB
+ \fi:
+ \exp_after:wN \exp_not:n
+ \else:
+ \exp_after:wN \@@_token_to_explicit:n
+ \fi:
+ {#1}
+ }
+\cs_new:Npn \@@_token_to_explicit:n #1
+ {
+ \exp_after:wN \@@_token_to_explicit_auxi:w
+ \int_value:w
+ \if_catcode:w \c_group_begin_token #1 1 \else:
+ \if_catcode:w \c_group_end_token #1 2 \else:
+ \if_catcode:w \c_math_toggle_token #1 3 \else:
+ \if_catcode:w ## #1 6 \else:
+ \if_catcode:w ^ #1 7 \else:
+ \if_catcode:w \c_math_subscript_token #1 8 \else:
+ \if_catcode:w \c_space_token #1 10 \else:
+ \if_catcode:w A #1 11 \else:
+ \if_catcode:w + #1 12 \else:
+ 4 \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
+ \exp_after:wN ;
+ \token_to_meaning:N #1 \q_stop
+ }
+\cs_new:Npn \@@_token_to_explicit_auxi:w #1 ; #2 \q_stop
+ {
+ \char_generate:nn
+ {
+ \if_int_compare:w #1 < 9 \exp_stop_f:
+ \exp_after:wN \@@_token_to_explicit_auxii:w
+ \else:
+ \exp_after:wN \@@_token_to_explicit_auxiii:w
+ \fi:
+ #2
+ }
+ {#1}
+ }
+\exp_last_unbraced:NNNNo \cs_new:Npn \@@_token_to_explicit_auxii:w
+ #1 { \tl_to_str:n { character ~ } } { ` }
+\cs_new:Npn \@@_token_to_explicit_auxiii:w #1 ~ #2 ~ { ` }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_char_catcode:N}
+% An idea from \pkg{l3char}: we need to get the category code of
+% a specific token, not the general case.
+% \begin{macrocode}
+\cs_new:Npn \@@_char_catcode:N #1
+ {
+ \if_catcode:w \exp_not:N #1 \c_math_toggle_token
+ 3
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_alignment_token
+ 4
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_math_superscript_token
+ 7
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_math_subscript_token
+ 8
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_space_token
+ 10
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_catcode_letter_token
+ 11
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_catcode_other_token
+ 12
+ \else:
+ 13
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP, TF]{\@@_if_expandable:N}
+% Test for tokens that make sense to expand here: that is more
+% restrictive than the engine view.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_expandable:N #1 { T , F , TF }
+ {
+ \token_if_expandable:NTF #1
+ {
+ \bool_lazy_any:nTF
+ {
+ { \token_if_protected_macro_p:N #1 }
+ { \token_if_protected_long_macro_p:N #1 }
+ { \token_if_eq_meaning_p:NN \q_recursion_tail #1 }
+ }
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+ { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Configuration variables}
+%
+% \begin{variable}{\l_text_accents_tl, \l_text_letterlike_tl}
+% Special cases for accents and letter-like symbols, which in some cases will
+% need to be converted further.
+% \begin{macrocode}
+%<*package>
+\tl_new:N \l_text_accents_tl
+\tl_set:Nn \l_text_accents_tl
+ { \` \' \^ \~ \= \u \. \" \r \H \v \d \c \k \b \t }
+\tl_new:N \l_text_letterlike_tl
+\tl_set:Nn \l_text_letterlike_tl
+ {
+ \AA \aa
+ \AE \ae
+ \DH \dh
+ \DJ \dj
+ \IJ \ij
+ \L \l
+ \NG \ng
+ \O \o
+ \OE \oe
+ \SS \ss
+ \TH \th
+ }
+%</package>
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_text_case_exclude_arg_tl}
+% Non-text arguments.
+% \begin{macrocode}
+\tl_new:N \l_text_case_exclude_arg_tl
+\tl_set:Nn \l_text_case_exclude_arg_tl { \cite \label \ref }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_text_math_arg_tl}
+% Math mode as arguments.
+% \begin{macrocode}
+\tl_new:N \l_text_math_arg_tl
+\tl_set:Nn \l_text_math_arg_tl { \ensuremath }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_text_math_delims_tl}
+% Paired math mode delimiters.
+% \begin{macrocode}
+\tl_new:N \l_text_math_delims_tl
+\tl_set:Nn \l_text_math_delims_tl { $ $ \( \) }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_text_expand_exclude_tl}
+% Commands which need not to expand.
+% \begin{macrocode}
+%<*package>
+\tl_new:N \l_text_expand_exclude_tl
+\tl_set:Nn \l_text_expand_exclude_tl
+ { \cite \label \ref }
+%</package>
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\l_@@_math_mode_tl}
+% Used to control math mode output: internal as there is a dedicated
+% setter.
+% \begin{macrocode}
+\tl_new:N \l_@@_math_mode_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Expansion to formatted text}
+%
+% \begin{variable}{\c_@@_chardef_space_token, \c_@@_mathchardef_space_token}
+% \begin{variable}
+% {\c_@@_chardef_group_begin_token, \c_@@_mathchardef_group_begin_token}
+% \begin{variable}
+% {\c_@@_chardef_group_end_token, \c_@@_mathchardef_group_end_token}
+% Markers for implict char handling.
+% \begin{macrocode}
+\tex_chardef:D \c_@@_chardef_space_token = `\ %
+\tex_mathchardef:D \c_@@_mathchardef_space_token = `\ %
+\tex_chardef:D \c_@@_chardef_group_begin_token = `\{ % `\}
+\tex_mathchardef:D \c_@@_mathchardef_group_begin_token = `\{ % `\} `\{
+\tex_chardef:D \c_@@_chardef_group_end_token = `\} % `\{
+\tex_mathchardef:D \c_@@_mathchardef_group_end_token = `\} %
+% \end{macrocode}
+% \end{variable}
+% \end{variable}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\text_expand:n, \@@_expand:n}
+% \begin{macro}[EXP]{\@@_expand_result:n}
+% \begin{macro}[EXP]{\@@_expand_store:n, \@@_expand_store:o}
+% \begin{macro}[EXP]{\@@_expand_store:nw}
+% \begin{macro}[EXP]{\@@_expand_end:w}
+% \begin{macro}[EXP]{\@@_expand_loop:w}
+% \begin{macro}[EXP]{\@@_expand_group:n}
+% \begin{macro}[EXP]{\@@_expand_space:w}
+% \begin{macro}[EXP]
+% {
+% \@@_expand_N_type:N ,
+% \@@_expand_N_type_auxi:N ,
+% \@@_expand_N_type_auxii:N ,
+% \@@_expand_N_type_auxiii:N
+% }
+% \begin{macro}[EXP]{\@@_expand_math_search:NNN}
+% \begin{macro}[EXP]{\@@_expand_math_loop:Nw}
+% \begin{macro}[EXP]{\@@_expand_math_N_type:NN}
+% \begin{macro}[EXP]{\@@_expand_math_group:Nn}
+% \begin{macro}[EXP]{\@@_expand_math_space:Nw}
+% \begin{macro}[EXP]
+% {
+% \@@_expand_implicit:N ,
+% \@@_expand_explicit:N ,
+% \@@_expand_exclude:N
+% }
+% \begin{macro}[EXP]{\@@_expand_exclude:nN}
+% \begin{macro}[EXP]{\@@_expand_exclude:NN}
+% \begin{macro}[EXP]{\@@_expand_exclude:Nn}
+% \begin{macro}[EXP]{\@@_expand_letterlike:N}
+% \begin{macro}[EXP]{\@@_expand_letterlike:NN}
+% \begin{macro}[EXP]
+% {
+% \@@_expand_cs:N ,
+% \@@_expand_protect:N
+% }
+% \begin{macro}[EXP]{\@@_expand_protect:nN}
+% \begin{macro}[EXP]{\@@_expand_protect:Nw}
+% \begin{macro}[EXP]{\@@_expand_cs_expand:N}
+% After precautions against |&| tokens, start a simple loop: that of
+% course means that \enquote{text} cannot contain the two recursion
+% quarks. The loop here must be \texttt{f}-type expandable; we have
+% arbitrary user commands which might be protected \emph{and} take
+% arguments, and if the expansion code is used in a typesetting
+% context, that will otherwise explode. (The same issue applies more
+% clearly to case changing: see the example there.)
+% \begin{macrocode}
+\cs_new:Npn \text_expand:n #1
+ {
+ \__kernel_exp_not:w \exp_after:wN
+ {
+ \exp:w
+ \@@_expand:n {#1}
+ }
+ }
+\cs_new:Npn \@@_expand:n #1
+ {
+ \group_align_safe_begin:
+ \@@_expand_loop:w #1
+ \q_recursion_tail \q_recursion_stop
+ \@@_expand_result:n { }
+ }
+% \end{macrocode}
+% The approach to making the code \texttt{f}-type expandable is to usee
+% a marker result token and to shuffle the collected tokens
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_store:n #1
+ { \@@_expand_store:nw {#1} }
+\cs_generate_variant:Nn \@@_expand_store:n { o }
+\cs_new:Npn \@@_expand_store:nw #1#2 \@@_expand_result:n #3
+ { #2 \@@_expand_result:n { #3 #1 } }
+\cs_new:Npn \@@_expand_end:w #1 \@@_expand_result:n #2
+ {
+ \group_align_safe_end:
+ \exp_end:
+ #2
+ }
+% \end{macrocode}
+% The main loop is a standard \enquote{tl action}; groups are handled
+% recursively, while spaces are just passed through. Thus all of the
+% action is in handling \texttt{N}-type tokens.
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_loop:w #1 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#1}
+ { \@@_expand_N_type:N }
+ {
+ \tl_if_head_is_group:nTF {#1}
+ { \@@_expand_group:n }
+ { \@@_expand_space:w }
+ }
+ #1 \q_recursion_stop
+ }
+\cs_new:Npn \@@_expand_group:n #1
+ {
+ \@@_expand_store:o
+ {
+ \exp_after:wN
+ {
+ \exp:w
+ \@@_expand:n {#1}
+ }
+ }
+ \@@_expand_loop:w
+ }
+\exp_last_unbraced:NNo \cs_new:Npn \@@_expand_space:w \c_space_tl
+ {
+ \@@_expand_store:n { ~ }
+ \@@_expand_loop:w
+ }
+% \end{macrocode}
+% Before we get into the real work, we have to watch out for problematic
+% implicit characters: spaces and grouping tokens. Converting these to
+% explicit characters later would lead to real issues as they are \emph{not}
+% \texttt{N}-type. A space is the easy case, so it's dealt with first:
+% just insert the explicit token and continue the loop.
+% \begin{macrocode}
+\cs_new:Npx \@@_expand_N_type:N #1
+ {
+ \exp_not:N \quark_if_recursion_tail_stop_do:Nn #1
+ { \exp_not:N \@@_expand_end:w }
+ \exp_not:N \bool_lazy_any:nTF
+ {
+ { \exp_not:N \token_if_eq_meaning_p:NN #1 \c_space_token }
+ {
+ \exp_not:N \token_if_eq_meaning_p:NN #1
+ \c_@@_chardef_space_token
+ }
+ {
+ \exp_not:N \token_if_eq_meaning_p:NN #1
+ \c_@@_mathchardef_space_token
+ }
+ }
+ { \exp_not:N \@@_expand_space:w \c_space_tl }
+ { \exp_not:N \@@_expand_N_type_auxi:N #1 }
+ }
+% \end{macrocode}
+% Implicit |{|/|}| offer two issues. First, the token could be an implicit
+% brace character: we need to avoid turning that into a brace group, so filter
+% out the cases manually. Then we handle the case where an implicit group is
+% present. That is done in an \enquote{open-ended} way: there's the possibility
+% the closing token is hidden somewhere.
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_N_type_auxi:N #1
+ {
+ \bool_lazy_or:nnTF
+ { \token_if_eq_meaning_p:NN #1 \c_@@_chardef_group_begin_token }
+ { \token_if_eq_meaning_p:NN #1 \c_@@_mathchardef_group_begin_token }
+ {
+ \@@_expand_store:o \c_left_brace_str
+ \@@_expand_loop:w
+ }
+ {
+ \bool_lazy_or:nnTF
+ { \token_if_eq_meaning_p:NN #1 \c_@@_chardef_group_end_token }
+ { \token_if_eq_meaning_p:NN #1 \c_@@_mathchardef_group_end_token }
+ {
+ \@@_expand_store:o \c_right_brace_str
+ \@@_expand_loop:w
+ }
+ { \@@_expand_N_type_auxii:N #1 }
+ }
+ }
+\cs_new:Npn \@@_expand_N_type_auxii:N #1
+ {
+ \token_if_eq_meaning:NNTF #1 \c_group_begin_token
+ {
+ { \if_false: } \fi:
+ \@@_expand_loop:w
+ }
+ {
+ \token_if_eq_meaning:NNTF #1 \c_group_end_token
+ {
+ \if_false: { \fi: }
+ \@@_expand_loop:w
+ }
+ { \@@_expand_N_type_auxiii:N #1 }
+ }
+ }
+% \end{macrocode}
+% The first step in dealing with \texttt{N}-type tokens is to look for
+% math mode material: that needs to be left alone. The starting function
+% has to be split into two as we need \cs{quark_if_recursion_tail_stop:N}
+% first before we can trigger the search. We then look for matching
+% pairs of delimiters, allowing for the case where math mode starts
+% but does not end. Within math mode, we simply pass all the tokens
+% through unchanged, just checking the \texttt{N}-type ones against the
+% end marker.
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_N_type_auxiii:N #1
+ {
+ \exp_after:wN \@@_expand_math_search:NNN
+ \exp_after:wN #1 \l_text_math_delims_tl
+ \q_recursion_tail \q_recursion_tail
+ \q_recursion_stop
+ }
+\cs_new:Npn \@@_expand_math_search:NNN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \@@_expand_implicit:N #1 }
+ \token_if_eq_meaning:NNTF #1 #2
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ {
+ \@@_expand_store:n {#1}
+ \@@_expand_math_loop:Nw #3
+ }
+ }
+ { \@@_expand_math_search:NNN #1 }
+ }
+\cs_new:Npn \@@_expand_math_loop:Nw #1#2 \q_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#2}
+ { \@@_expand_math_N_type:NN }
+ {
+ \tl_if_head_is_group:nTF {#2}
+ { \@@_expand_math_group:Nn }
+ { \@@_expand_math_space:Nw }
+ }
+ #1#2 \q_recursion_stop
+ }
+\cs_new:Npn \@@_expand_math_N_type:NN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \@@_expand_end:w }
+ \@@_expand_store:n {#2}
+ \token_if_eq_meaning:NNTF #2 #1
+ { \@@_expand_loop:w }
+ { \@@_expand_math_loop:Nw #1 }
+ }
+\cs_new:Npn \@@_expand_math_group:Nn #1#2
+ {
+ \@@_expand_store:n { {#2} }
+ \@@_expand_math_loop:Nw #1
+ }
+\exp_after:wN \cs_new:Npn \exp_after:wN \@@_expand_math_space:Nw
+ \exp_after:wN # \exp_after:wN 1 \c_space_tl
+ {
+ \@@_expand_store:n { ~ }
+ \@@_expand_math_loop:Nw #1
+ }
+% \end{macrocode}
+% Conversion of implicit to explicit tokens does not have to account for
+% spaces or brace groups: they are already fixed above. So we can assume that
+% the result of this conversion is still an \texttt{N}-type token.
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_implicit:N #1
+ {
+ \exp_args:NNe \use:nn \@@_expand_explicit:N
+ { \@@_token_to_explicit:N #1 }
+ }
+% \end{macrocode}
+% At this stage, either we have a control sequence or a simple character:
+% split and handle.
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_explicit:N #1
+ {
+ \token_if_cs:NTF #1
+ { \@@_expand_exclude:N #1 }
+ {
+ \@@_expand_store:n {#1}
+ \@@_expand_loop:w
+ }
+ }
+% Next we exclude math commands: this is mainly as there \emph{might} be an
+% \cs{ensuremath}. We also handle accents, which are basically the same issue
+% but are kept separate for semantic reasons.
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_exclude:N #1
+ {
+%<*initex>
+ \exp_after:wN \@@_expand_exclude:NN
+ \l_text_math_arg_tl
+ #1
+ \q_recursion_tail \q_recursion_stop
+%</initex>
+%<*package>
+ \exp_args:Ne \@@_expand_exclude:nN
+ {
+ \exp_not:V \l_text_math_arg_tl
+ \exp_not:V \l_text_accents_tl
+ \exp_not:V \l_text_expand_exclude_tl
+ }
+ #1
+%</package>
+ }
+%<*package>
+\cs_new:Npn \@@_expand_exclude:nN #1#2
+ {
+ \@@_expand_exclude:NN #2 #1
+ \q_recursion_tail \q_recursion_stop
+ }
+%</package>
+\cs_new:Npn \@@_expand_exclude:NN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+%<*initex>
+ { \@@_expand_cs:N #1 }
+%</initex>
+%<*package>
+ { \@@_expand_letterlike:N #1 }
+%</package>
+ \cs_if_eq:NNTF #2 #1
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ { \@@_expand_exclude:Nn #1 }
+ }
+ { \@@_expand_exclude:NN #1 }
+ }
+\cs_new:Npn \@@_expand_exclude:Nn #1#2
+ {
+ \@@_expand_store:n { #1 {#2} }
+ \@@_expand_loop:w
+ }
+% \end{macrocode}
+% Another list of exceptions: these ones take no arguments so are
+% easier to handle.
+% \begin{macrocode}
+%<*package>
+\cs_new:Npn \@@_expand_letterlike:N #1
+ {
+ \exp_after:wN \@@_expand_letterlike:NN \exp_after:wN
+ #1 \l_text_letterlike_tl
+ \q_recursion_tail \q_recursion_stop
+ }
+\cs_new:Npn \@@_expand_letterlike:NN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \@@_expand_cs:N #1 }
+ \cs_if_eq:NNTF #2 #1
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ {
+ \@@_expand_store:n {#1}
+ \@@_expand_loop:w
+ }
+ }
+ { \@@_expand_letterlike:NN #1 }
+ }
+%</package>
+% \end{macrocode}
+% \LaTeXe{}'s \cs{protect} makes life interesting. Where possible, we
+% simply remove it and replace with the \enquote{parent} command; of course,
+% the \cs{protect} might be explicit, in which case we need to leave it alone
+% if it's required.
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_cs:N #1
+ {
+ \str_if_eq:nnTF {#1} { \protect }
+ { \@@_expand_protect:N }
+ { \@@_expand_cs_expand:N #1 }
+ }
+\cs_new:Npn \@@_expand_protect:N #1
+ {
+ \exp_args:Ne \@@_expand_protect:nN
+ { \cs_to_str:N #1 } #1
+ }
+\cs_new:Npn \@@_expand_protect:nN #1#2
+ { \@@_expand_protect:Nw #2 #1 \q_nil #1 ~ \q_nil \q_nil \q_stop }
+\cs_new:Npn \@@_expand_protect:Nw #1 #2 ~ \q_nil #3 \q_nil #4 \q_stop
+ {
+ \quark_if_nil:nTF {#4}
+ {
+ \cs_if_exist:cTF {#2}
+ { \exp_args:Ne \@@_expand_store:n { \exp_not:c {#2} } }
+ { \@@_expand_store:n { \protect #1 } }
+ }
+ { \@@_expand_store:n { \protect #1 } }
+ \@@_expand_loop:w
+ }
+% \end{macrocode}
+% Finally, expand any macros which can be: this then loops back around to
+% deal with what they produce.
+% \begin{macrocode}
+\cs_new:Npn \@@_expand_cs_expand:N #1
+ {
+ \@@_if_expandable:NTF #1
+ { \exp_after:wN \@@_expand_loop:w #1 }
+ {
+ \@@_expand_store:n {#1}
+ \@@_expand_loop:w
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</initex|package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index e4e8b791e9..e9f36e03b8 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -2,7 +2,7 @@
%
%% File: l3tl-analysis.dtx
%
-% Copyright (C) 2011-2019 The LaTeX3 Project
+% Copyright (C) 2011-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index a3c39d9df9..a564e6eca3 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -2,7 +2,7 @@
%
%% File: l3tl.dtx
%
-% Copyright (C) 1990-2019 The LaTeX3 Project
+% Copyright (C) 1990-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index 36ca720071..93b1e6ffc5 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -2,7 +2,7 @@
%
%% File: l3token.dtx
%
-% Copyright (C) 2005-2019 The LaTeX3 Project
+% Copyright (C) 2005-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -151,6 +151,26 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[added = 2020-01-09, EXP]
+% {
+% \char_lowercase:N, \char_uppercase:N,
+% \char_titlecase:N, \char_foldcase:N,
+% \char_str_lowercase:N, \char_str_uppercase:N,
+% \char_str_titlecase:N, \char_str_foldcase:N
+% }
+% \begin{syntax}
+% \cs{char_lowercase:N} \meta{char}
+% \end{syntax}
+% Converts the \meta{char} to the equivalent case-changed character
+% as detailed by the function name (see \cs{str_foldcase:n}
+% and \cs{text_titlecase:n} for details of these terms). The case mapping
+% is carried out with no context-dependence (\emph{cf.}~\cs{text_uppercase:n},
+% \emph{etc.}) The \texttt{str} versions always generate \enquote{other}
+% (category code $12$) characters, whilst the standard versions generate
+% characters with the category code of the \meta{char} (i.e.~only
+% the character code changes).
+% \end{function}
+%
% \begin{variable}[added = 2011-09-05]{\c_catcode_other_space_tl}
% Token list containing one character with category code $12$,
% (\enquote{other}), and character code $32$ (space).
@@ -253,7 +273,7 @@
% \cs{char_set_lccode:nn} \Arg{intexpr_1} \Arg{intexpr_2}
% \end{syntax}
% Sets up the behaviour of the \meta{character} when
-% found inside \cs{tl_lower_case:n}, such that \meta{character_1}
+% found inside \cs{text_lowercase:n}, such that \meta{character_1}
% will be converted into \meta{character_2}. The two \meta{characters}
% may be specified using an \meta{integer expression} for the character code
% concerned. This may include the \TeX{} |`|\meta{character}
@@ -290,7 +310,7 @@
% \cs{char_set_uccode:nn} \Arg{intexpr_1} \Arg{intexpr_2}
% \end{syntax}
% Sets up the behaviour of the \meta{character} when
-% found inside \cs{tl_upper_case:n}, such that \meta{character_1}
+% found inside \cs{text_uppercase:n}, such that \meta{character_1}
% will be converted into \meta{character_2}. The two \meta{characters}
% may be specified using an \meta{integer expression} for the character code
% concerned. This may include the \TeX{} |`|\meta{character}
@@ -1462,9 +1482,7 @@
\tl_put_right:Nn \l_@@_tmp_tl { \or: }
% \end{macrocode}
% For making spaces, there needs to be an |o|-type expansion of a |\use:n|
-% (or some other tokenization) to avoid dropping the space. We also
-% set up active tokens although they are (currently) filtered out by the
-% interface layer (\tn{Ucharcat} cannot make active tokens).
+% (or some other tokenization) to avoid dropping the space.
% \begin{macrocode}
\char_set_catcode_space:n { 0 }
\tl_put_right:No \l_@@_tmp_tl { \use:n { \or: } ^^@ }
@@ -1532,6 +1550,306 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}[EXP]{\char_to_utfviii_bytes:n}
+% \begin{macro}[EXP]{\@@_to_utfviii_bytes_auxi:n}
+% \begin{macro}[EXP]{\@@_to_utfviii_bytes_auxii:Nnn}
+% \begin{macro}[EXP]{\@@_to_utfviii_bytes_auxiii:n}
+% \begin{macro}[EXP]
+% {
+% \@@_to_utfviii_bytes_outputi:nw ,
+% \@@_to_utfviii_bytes_outputii:nw ,
+% \@@_to_utfviii_bytes_outputiii:nw ,
+% \@@_to_utfviii_bytes_outputiv:nw
+% }
+% \begin{macro}[EXP]
+% {\@@_to_utfviii_bytes_output:nnn, \@@_to_utfviii_bytes_output:fnn}
+% \begin{macro}[EXP]{\@@_to_utfviii_bytes_end:}
+% This code converts a codepoint into the correct UTF-8 representation.
+% In terms of the algorithm itself, see
+% \url{https://en.wikipedia.org/wiki/UTF-8} for the octet pattern.
+% \begin{macrocode}
+\cs_new:Npn \char_to_utfviii_bytes:n #1
+ {
+ \exp_args:Nf \@@_to_utfviii_bytes_auxi:n
+ { \int_eval:n {#1} }
+ }
+\cs_new:Npn \@@_to_utfviii_bytes_auxi:n #1
+ {
+ \if_int_compare:w #1 > "80 \exp_stop_f:
+ \if_int_compare:w #1 < "800 \exp_stop_f:
+ \@@_to_utfviii_bytes_outputi:nw
+ { \@@_to_utfviii_bytes_auxii:Nnn C {#1} { 64 } }
+ \@@_to_utfviii_bytes_outputii:nw
+ { \@@_to_utfviii_bytes_auxiii:n {#1} }
+ \else:
+ \if_int_compare:w #1 < "10000 \exp_stop_f:
+ \@@_to_utfviii_bytes_outputi:nw
+ { \@@_to_utfviii_bytes_auxii:Nnn E {#1} { 64 * 64 } }
+ \@@_to_utfviii_bytes_outputii:nw
+ {
+ \@@_to_utfviii_bytes_auxiii:n
+ { \int_div_truncate:nn {#1} { 64 } }
+ }
+ \@@_to_utfviii_bytes_outputiii:nw
+ { \@@_to_utfviii_bytes_auxiii:n {#1} }
+ \else:
+ \@@_to_utfviii_bytes_outputi:nw
+ {
+ \@@_to_utfviii_bytes_auxii:Nnn F
+ {#1} { 64 * 64 * 64 }
+ }
+ \@@_to_utfviii_bytes_outputii:nw
+ {
+ \@@_to_utfviii_bytes_auxiii:n
+ { \int_div_truncate:nn {#1} { 64 * 64 } }
+ }
+ \@@_to_utfviii_bytes_outputiii:nw
+ {
+ \@@_to_utfviii_bytes_auxiii:n
+ { \int_div_truncate:nn {#1} { 64 } }
+ }
+ \@@_to_utfviii_bytes_outputiv:nw
+ { \@@_to_utfviii_bytes_auxiii:n {#1} }
+ \fi:
+ \fi:
+ \else:
+ \@@_to_utfviii_bytes_outputi:nw {#1}
+ \fi:
+ \@@_to_utfviii_bytes_end: { } { } { } { }
+ }
+\cs_new:Npn \@@_to_utfviii_bytes_auxii:Nnn #1#2#3
+ { "#10 + \int_div_truncate:nn {#2} {#3} }
+\cs_new:Npn \@@_to_utfviii_bytes_auxiii:n #1
+ { \int_mod:nn {#1} { 64 } + 128 }
+\cs_new:Npn \@@_to_utfviii_bytes_outputi:nw
+ #1 #2 \@@_to_utfviii_bytes_end: #3
+ { \@@_to_utfviii_bytes_output:fnn { \int_eval:n {#1} } { } {#2} }
+\cs_new:Npn \@@_to_utfviii_bytes_outputii:nw
+ #1 #2 \@@_to_utfviii_bytes_end: #3#4
+ { \@@_to_utfviii_bytes_output:fnn { \int_eval:n {#1} } { {#3} } {#2} }
+\cs_new:Npn \@@_to_utfviii_bytes_outputiii:nw
+ #1 #2 \@@_to_utfviii_bytes_end: #3#4#5
+ {
+ \@@_to_utfviii_bytes_output:fnn
+ { \int_eval:n {#1} } { {#3} {#4} } {#2}
+ }
+\cs_new:Npn \@@_to_utfviii_bytes_outputiv:nw
+ #1 #2 \@@_to_utfviii_bytes_end: #3#4#5#6
+ {
+ \@@_to_utfviii_bytes_output:fnn
+ { \int_eval:n {#1} } { {#3} {#4} {#5} } {#2}
+ }
+\cs_new:Npn \@@_to_utfviii_bytes_output:nnn #1#2#3
+ {
+ #3
+ \@@_to_utfviii_bytes_end: #2 {#1}
+ }
+\cs_generate_variant:Nn \@@_to_utfviii_bytes_output:nnn { f }
+\cs_new:Npn \@@_to_utfviii_bytes_end: { }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[rEXP]{\char_to_nfd:N}
+% \begin{macro}[rEXP]{\@@_to_nfd:n}
+% \begin{macro}[rEXP]{\@@_to_nfd:Nw}
+% Look up any \textsc{nfd} and recursively produce the result.
+% \begin{macrocode}
+\cs_new:Npn \char_to_nfd:N #1
+ {
+ \cs_if_exist:cTF { c_@@_nfd_ \token_to_str:N #1 _ tl }
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN \@@_to_nfd:Nw
+ \exp_after:wN \exp_after:wN \exp_after:wN #1
+ \cs:w c_@@_nfd_ \token_to_str:N #1 _ tl \cs_end:
+ \q_stop
+ }
+ { \exp_not:n {#1} }
+ }
+\cs_set_eq:NN \@@_to_nfd:n \char_to_nfd:N
+\cs_new:Npn \@@_to_nfd:Nw #1#2#3 \q_stop
+ {
+ \exp_args:Ne \@@_to_nfd:n
+ { \char_generate:nn { `#2 } { \@@_change_case_catcode:N #1 } }
+ \tl_if_blank:nF {#3}
+ {
+ \exp_args:Ne \@@_to_nfd:n
+ { \char_generate:nn { `#3 } { \char_value_catcode:n { `#3 } } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+% {
+% \char_lowercase:N, \char_uppercase:N,
+% \char_titlecase:N, \char_foldcase:N
+% }
+% \begin{macro}[EXP]{\@@_change_case:nNN}
+% \begin{macro}[EXP]{\@@_change_case:nN}
+% \begin{macro}[EXP]{\@@_change_case_multi:nN, \@@_change_case_multi:vN}
+% \begin{macro}[EXP]{\@@_change_case_multi:NNNNw}
+% \begin{macro}[EXP]{\@@_change_case:NNN}
+% \begin{macro}[EXP]{\@@_change_case:NNNN}
+% \begin{macro}[EXP]{\@@_change_case:NN}
+% \begin{macro}[EXP]{\@@_change_case_catcode:N}
+% \begin{macro}[EXP]
+% {
+% \char_str_lowercase:N, \char_str_uppercase:N,
+% \char_str_titlecase:N, \char_str_foldcase:N
+% }
+% \begin{macro}[EXP]{\@@_str_change_case:nNN}
+% \begin{macro}[EXP]{\@@_str_change_case:nN}
+% To ensure that the category codes produced are predictable, every character
+% is re-generated even if it is otherwise unchanged. This makes life a little
+% interesting when we might have multiple output characters: we have to
+% grab each of them and case change them in reverse order to maintain
+% \texttt{f}-type expandability.
+% \begin{macrocode}
+\cs_new:Npn \char_lowercase:N #1
+ { \@@_change_case:nNN { lower } \char_value_lccode:n #1 }
+\cs_new:Npn \char_uppercase:N #1
+ { \@@_change_case:nNN { upper } \char_value_uccode:n #1 }
+\cs_new:Npn \char_titlecase:N #1
+ {
+ \tl_if_exist:cTF { c_@@_titlecase_ \token_to_str:N #1 _tl }
+ {
+ \@@_change_case_multi:vN
+ { c_@@_titlecase_ \token_to_str:N #1 _tl } #1
+ }
+ { \char_uppercase:N #1 }
+ }
+\cs_new:Npn \char_foldcase:N #1
+ { \@@_change_case:nNN { fold } \char_value_lccode:n #1 }
+\cs_new:Npn \@@_change_case:nNN #1#2#3
+ {
+ \tl_if_exist:cTF { c_@@_ #1 case_ \token_to_str:N #3 _tl }
+ {
+ \@@_change_case_multi:vN
+ { c_@@_ #1 case_ \token_to_str:N #3 _tl } #3
+ }
+ { \exp_args:Nf \@@_change_case:nN { #2 { `#3 } } #3 }
+ }
+\cs_new:Npn \@@_change_case:nN #1#2
+ {
+ \int_compare:nNnTF {#1} = 0
+ { #2 }
+ { \char_generate:nn {#1} { \@@_change_case_catcode:N #2 } }
+ }
+\cs_new:Npn \@@_change_case_multi:nN #1#2
+ { \@@_change_case_multi:NNNNw #2 #1 \q_no_value \q_no_value \q_stop }
+\cs_generate_variant:Nn \@@_change_case_multi:nN { v }
+\cs_new:Npn \@@_change_case_multi:NNNNw #1#2#3#4#5 \q_stop
+ {
+ \quark_if_no_value:NTF #4
+ {
+ \quark_if_no_value:NTF #3
+ { \@@_change_case:NN #1 #2 }
+ { \@@_change_case:NNN #1 #2#3 }
+ }
+ { \@@_change_case:NNNN #1 #2#3#4 }
+ }
+\cs_new:Npn \@@_change_case:NNN #1#2#3
+ {
+ \exp_args:Nnf \use:nn
+ { \@@_change_case:NN #1 #2 }
+ { \@@_change_case:NN #1 #3 }
+ }
+\cs_new:Npn \@@_change_case:NNNN #1#2#3#4
+ {
+ \exp_args:Nnff \use:nnn
+ { \@@_change_case:NN #1 #2 }
+ { \@@_change_case:NN #1 #3 }
+ { \@@_change_case:NN #1 #4 }
+ }
+\cs_new:Npn \@@_change_case:NN #1#2
+ { \char_generate:nn { `#2 } { \@@_change_case_catcode:N #1 } }
+\cs_new:Npn \@@_change_case_catcode:N #1
+ {
+ \if_catcode:w \exp_not:N #1 \c_math_toggle_token
+ 3
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_alignment_token
+ 4
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_math_superscript_token
+ 7
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_math_subscript_token
+ 8
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_space_token
+ 10
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_catcode_letter_token
+ 11
+ \else:
+ \if_catcode:w \exp_not:N #1 \c_catcode_other_token
+ 12
+ \else:
+ 13
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ }
+% \end{macrocode}
+% Same story for the string version, except category code is easier
+% to follow. This of course makes this version significantly faster.
+% \begin{macrocode}
+\cs_new:Npn \char_str_lowercase:N #1
+ { \@@_str_change_case:nNN { lower } \char_value_lccode:n #1 }
+\cs_new:Npn \char_str_uppercase:N #1
+ { \@@_str_change_case:nNN { upper } \char_value_uccode:n #1 }
+\cs_new:Npn \char_str_titlecase:N #1
+ {
+ \tl_if_exist:cTF { c_@@_titlecase_ \token_to_str:N #1 _tl }
+ { \tl_to_str:c { c_@@_titlecase_ \token_to_str:N #1 _tl } }
+ { \char_str_uppercase:N #1 }
+ }
+\cs_new:Npn \char_str_foldcase:N #1
+ { \@@_str_change_case:nNN { fold } \char_value_lccode:n #1 }
+\cs_new:Npn \@@_str_change_case:nNN #1#2#3
+ {
+ \tl_if_exist:cTF { c_@@_ #1 case_ \token_to_str:N #3 _tl }
+ { \tl_to_str:c { c_@@_ #1 case_ \token_to_str:N #3 _tl } }
+ { \exp_args:Nf \@@_str_change_case:nN { #2 { `#3 } } #3 }
+ }
+\cs_new:Npn \@@_str_change_case:nN #1#2
+ {
+ \int_compare:nNnTF {#1} = 0
+ { \tl_to_str:n {#2} }
+ { \char_generate:nn {#1} { 12 } }
+ }
+\cs_if_exist:NF \tex_Uchar:D
+ {
+ \cs_set:Npn \@@_str_change_case:nN #1#2
+ { \tl_to_str:n {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\c_catcode_other_space_tl}
% Create a space with category code $12$: an \enquote{other} space.
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index 9eb3d9747a..383826eaeb 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -2,7 +2,7 @@
%
%% File: l3unicode.dtx
%
-% Copyright (C) 2018-2019 The LaTeX3 Project
+% Copyright (C) 2018-2020 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-11-07}
+% \date{Released 2020-01-12}
%
% \maketitle
%
@@ -116,35 +116,56 @@
}
}
% \end{macrocode}
-% Parse the main Unicode data file for title case exceptions (the one-to-one
-% lower and upper case mappings it contains are all be covered by the \TeX{}
-% data). There are no comments in the main data file so this can be done using
-% a standard mapping and no checks.
+% Parse the main Unicode data file for two things. First, we want the titlecase
+% exceptions: the one-to-one lower- and uppercase mappings it contains are all
+% be covered by the \TeX{} data. Second, we need normalization data: at present,
+% just the canonical \textsc{nfd} mappings. Those all yield either one or two
+% codepoints, so the split is relatively easy.
% \begin{macrocode}
\ior_open:Nn \g_@@_data_ior { UnicodeData.txt }
\cs_set_protected:Npn \@@_data_auxi:w
#1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ;
- { \@@_data_auxii:w #1 ; }
- \cs_set_protected:Npn \@@_data_auxii:w
- #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 \q_stop
+ {
+ \tl_if_blank:nF {#6}
+ {
+ \tl_if_head_eq_charcode:nNF {#6} < % >
+ { \@@_data_auxii:w #1 ; #6 ~ \q_stop }
+ }
+ \@@_data_auxiii:w #1 ;
+ }
+ \cs_set_protected:Npn \@@_data_auxii:w #1 ; #2 ~ #3 \q_stop
+ {
+ \tl_const:cx
+ { c_@@_nfd_ \@@_generate_char:n {#1} _tl }
+ {
+ \@@_generate:n { "#2 }
+ \tl_if_blank:nF {#3}
+ { \@@_generate:n { "#3 } }
+ }
+ }
+ \cs_set_protected:Npn \@@_data_auxiii:w
+ #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ~ \q_stop
{
\cs_set_nopar:Npn \l_@@_tmpa_tl {#7}
\reverse_if:N \if_meaning:w \l_@@_tmpa_tl \c_empty_tl
\cs_set_nopar:Npn \l_@@_tmpb_tl {#5}
\reverse_if:N \if_meaning:w \l_@@_tmpa_tl \l_@@_tmpb_tl
\tl_const:cx
- { c_@@_mixed_case_ \@@_generate_char:n {#1} _tl }
+ { c_@@_titlecase_ \@@_generate_char:n {#1} _tl }
{ \@@_generate:n { "#7 } }
\fi:
\fi:
}
- \ior_map_variable:NNn \g_@@_data_ior \l_@@_tmpa_tl
- {
- \if_meaning:w \l_@@_tmpa_tl \c_space_tl
- \exp_after:wN \ior_map_break:
- \fi:
- \exp_after:wN \@@_data_auxi:w \l_@@_tmpa_tl \q_stop
- }
+ \group_begin:
+ \char_set_catcode_space:n { `\ }%
+ \ior_map_variable:NNn \g_@@_data_ior \l_@@_tmpa_tl
+ {%
+ \if_meaning:w \l_@@_tmpa_tl \c_space_tl
+ \exp_after:wN \ior_map_break:
+ \fi:
+ \exp_after:wN \@@_data_auxi:w \l_@@_tmpa_tl \q_stop
+ }%
+ \group_end:
\ior_close:N \g_@@_data_ior
% \end{macrocode}
% The other data files all use C-style comments so we have to worry about
@@ -161,7 +182,7 @@
\reverse_if:N \if_int_compare:w
\char_value_lccode:n {"#1} = "#3 ~
\tl_const:cx
- { c_@@_fold_case_ \@@_generate_char:n {#1} _tl }
+ { c_@@_foldcase_ \@@_generate_char:n {#1} _tl }
{ \@@_generate:n { "#3 } }
\fi:
\else:
@@ -172,7 +193,7 @@
}
\cs_set_protected:Npn \@@_data_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop
{
- \tl_const:cx { c_@@_fold_case_ \@@_generate_char:n {#1} _tl }
+ \tl_const:cx { c_@@_foldcase_ \@@_generate_char:n {#1} _tl }
{
\@@_generate:n { "#2 }
\@@_generate:n { "#3 }
@@ -188,7 +209,7 @@
}
\ior_close:N \g_@@_data_ior
% \end{macrocode}
-% For upper and lower casing special situations, there is a bit more to
+% For upper- and lowercasing special situations, there is a bit more to
% do as we also have title casing to consider, plus we need to stop part-way
% through the file.
% \begin{macrocode}
@@ -199,14 +220,14 @@
\use:n { \@@_data_auxii:w #1 ~ lower ~ #2 ~ } ~ \q_stop
\use:n { \@@_data_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop
\str_if_eq:nnF {#3} {#4}
- { \use:n { \@@_data_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop }
+ { \use:n { \@@_data_auxii:w #1 ~ title ~ #3 ~ } ~ \q_stop }
}
\cs_set_protected:Npn \@@_data_auxii:w
#1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
{
\tl_if_empty:nF {#4}
{
- \tl_const:cx { c_@@_ #2 _case_ \@@_generate_char:n {#1} _tl }
+ \tl_const:cx { c_@@_ #2 case_ \@@_generate_char:n {#1} _tl }
{
\@@_generate:n { "#3 }
\@@_generate:n { "#4 }
@@ -244,9 +265,9 @@
\cs_set_protected:Npn \@@_tmp:NN #1#2
{
\quark_if_recursion_tail_stop:N #2
- \tl_const:cn { c_@@_upper_case_ #2 _tl } {#1}
- \tl_const:cn { c_@@_lower_case_ #1 _tl } {#2}
- \tl_const:cn { c_@@_fold_case_ #1 _tl } {#2}
+ \tl_const:cn { c_@@_uppercase_ #2 _tl } {#1}
+ \tl_const:cn { c_@@_lowercase_ #1 _tl } {#2}
+ \tl_const:cn { c_@@_foldcase_ #1 _tl } {#2}
\@@_tmp:NN
}
\@@_tmp:NN
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index a40463b4d9..d630d86daf 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex
index 45de4218f6..76a9c01fea 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/contrib/l3kernel/source3.tex
@@ -2,7 +2,7 @@
File: source3.tex
-Copyright (C) 1990-2012,2017-2019 The LaTeX3 Project
+Copyright (C) 1990-2012,2017-2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -53,7 +53,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-11-07}
+\date{Released 2020-01-12}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex
index 620ac44f84..f985c0d147 100644
--- a/macros/latex/contrib/l3kernel/source3body.tex
+++ b/macros/latex/contrib/l3kernel/source3body.tex
@@ -484,6 +484,13 @@ used on top of \LaTeXe{} if \cs{outer} tokens are used in the arguments.
\DocInput{l3color-base.dtx}
\DocInput{l3luatex.dtx}
\DocInput{l3unicode.dtx}
+\DocInput{l3text.dtx}
+\ExplSyntaxOn
+\clist_gput_right:Nn \g_docinput_clist
+ {
+ l3text-case.dtx
+ }
+\ExplSyntaxOff
\DocInput{l3legacy.dtx}
\DocInput{l3candidates.dtx}