diff options
author | Karl Berry <karl@freefriends.org> | 2020-01-13 21:30:36 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-01-13 21:30:36 +0000 |
commit | ce9eb3564e7376e4452732aef5229a8461f52a09 (patch) | |
tree | 421c616b3d0f26ddc6e20e28345c9bd680028708 /Master | |
parent | a61c6cf82707ad0e3aab14106179ce8d199284ce (diff) |
l3 (13jan20)
git-svn-id: svn://tug.org/texlive/trunk@53394 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
202 files changed, 8646 insertions, 3385 deletions
diff --git a/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md index aa89134c6f4..ccdcd90dfe4 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md @@ -7,59 +7,57 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] -## [2019-10-11] +## [2020-01-12] + +### Changed +- Track `l3kernel` changes ### Fixed +- Bounding box for clipped paths (see #660) +## [2019-10-11] + +### Fixed - Error message for unknown colors (see #640) ## [2019-09-28] ### Changed - - `\sys_shell_get_pwd:N` renamed as `\sys_get_shell_pwd:N` ## [2019-09-19] ### Changed - - Various improvements to `l3cctab` ## [2019-08-25] ### Changed - - `\draw_unit_vector:n` returns a vertical vector when the length is zero (see #609) - Collect `pwd` data with no `\endlinechar` (see #613) - Default precision in `\fp_format:nn` when no style is specified ### Fixed - - Corrected behaviour of catcode tables (see #610) ## [2019-07-01] ### Added - - New module `l3pdf` ### Changed - - Re-order arguments for polar points (`l3draw`) ### Removed - - `l3str-convert` module: moved to `l3kernel` (`expl3` core) ## [2019-05-28] ### Added - - New `l3graphics` module ### Fixed - - Missing `\scan_stop:` in benchmark code (fixes #577) ## [2019-05-03] @@ -71,35 +69,29 @@ this project uses date-based 'snapshot' version identifiers. ## [2019-03-05] ### Added - - Support for drawing layers ### Changed - - Update `l3draw` transformation names ## [2019-01-28] ### Changed - - Track `expl3` changes ## [2018-10-31] ### Added - - New module `l3cctab` ## [2018-10-26] ### Added - - New module `l3benchmark` ## [2018-08-24] ### Fixed - - Actually distribute `l3sys-shell` ## [2018-08-23] @@ -130,7 +122,8 @@ this project uses date-based 'snapshot' version identifiers. - New `l3color` module using `xcolor`-like expression syntax - New `l3draw` module, based on `pgf` layer of the TikZ system -[Unreleased]: https://github.com/latex3/latex3/compare/2019-10-11...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2020-01-12...HEAD +[2020-01-12]: https://github.com/latex3/latex3/compare/2019-10-11...2020-01-12 [2019-10-11]: https://github.com/latex3/latex3/compare/2019-09-28...2019-10-11 [2019-09-28]: https://github.com/latex3/latex3/compare/2019-09-19...2019-09-28 [2019-09-19]: https://github.com/latex3/latex3/compare/2019-08-25...2019-09-19 diff --git a/Master/texmf-dist/doc/latex/l3experimental/README.md b/Master/texmf-dist/doc/latex/l3experimental/README.md index e0c3412ce34..4202fb71e68 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/README.md +++ b/Master/texmf-dist/doc/latex/l3experimental/README.md @@ -1,7 +1,7 @@ Experimental LaTeX3 Concepts ============================ -Release 2019-10-11 +Release 2020-01-12 Overview -------- @@ -142,6 +142,6 @@ the [LaTeX-L list](#Discussion) should be used. ----- -<p>Copyright (C) 1998-2011,2015-2019 The LaTeX3 Project <br /> +<p>Copyright (C) 1998-2011,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/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf Binary files differindex 4ca0a1f13e4..1fd8c716f38 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3cctab/l3cctab.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3cctab/l3cctab.pdf Binary files differindex be1aa485231..00a402e93e4 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3cctab/l3cctab.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3cctab/l3cctab.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf Binary files differindex c6c42016e8b..1c7f8f31538 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf Binary files differindex 3f44b3e82c4..296561bb057 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf Binary files differindex 949c82acbf2..ed46ba5f7f3 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf Binary files differindex d3c36505fe5..91fd6d81c43 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf Binary files differindex fcbbc8883d3..7f232d74e57 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf-code.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf Binary files differindex fefcea1f743..c223f4db7c6 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3pdf/l3pdf.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf Binary files differindex 3b22a08fd4e..b84115d4b9b 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf Binary files differindex 271d03ab3ea..59880cbf58b 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf Binary files differindex 343b91a3c66..adf53b40ea1 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf Binary files differindex 8de12d7da86..83e56ffd2c3 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf Binary files differindex 287b12301d2..fd0cb034f0d 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md index 9aa72250fd5..00a7689a9ac 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/README.md b/Master/texmf-dist/doc/latex/l3kernel/README.md index df7311fe84e..d42a602ff81 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/README.md +++ b/Master/texmf-dist/doc/latex/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 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/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf Binary files differindex 5ff3ded9e77..2cb019c335d 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf Binary files differindex 872a46e97c0..e1ad66bb50b 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex b/Master/texmf-dist/doc/latex/l3kernel/interface3.tex index 5b08ade5dc9..c8daecbd24a 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf Binary files differindex dacf0e35d62..5f2bda13ce5 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf Binary files differnew file mode 100644 index 00000000000..404b6e0e826 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news.tex new file mode 100644 index 00000000000..1c1b9eed797 --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf Binary files differnew file mode 100644 index 00000000000..580bd304a12 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news01.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news01.tex new file mode 100644 index 00000000000..717f12ddbb7 --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf Binary files differnew file mode 100644 index 00000000000..7b184b9e94e --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news02.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news02.tex new file mode 100644 index 00000000000..a3d5467c8ef --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf Binary files differnew file mode 100644 index 00000000000..801fed29171 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news03.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news03.tex new file mode 100644 index 00000000000..e3e245f051f --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf Binary files differnew file mode 100644 index 00000000000..28a8779ab64 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news04.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news04.tex new file mode 100644 index 00000000000..a0fc82f3ded --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf Binary files differnew file mode 100644 index 00000000000..3fa6010bab6 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news05.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news05.tex new file mode 100644 index 00000000000..43ec2a8d193 --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf Binary files differnew file mode 100644 index 00000000000..a3c20b9140f --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news06.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news06.tex new file mode 100644 index 00000000000..50484e6142d --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf Binary files differnew file mode 100644 index 00000000000..7904107be8c --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news07.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news07.tex new file mode 100644 index 00000000000..9889d5f094f --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf Binary files differnew file mode 100644 index 00000000000..7a076e7bef8 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news08.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news08.tex new file mode 100644 index 00000000000..17107f83602 --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf Binary files differnew file mode 100644 index 00000000000..4f6b2ca8f35 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news09.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news09.tex new file mode 100644 index 00000000000..c0982a94a67 --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf Binary files differnew file mode 100644 index 00000000000..5f866c8906d --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news10.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news10.tex new file mode 100644 index 00000000000..c8ac0dffbe3 --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf Binary files differnew file mode 100644 index 00000000000..2094a11805b --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news11.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news11.tex new file mode 100644 index 00000000000..b88e7d2420f --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf Binary files differnew file mode 100644 index 00000000000..c64dcda56c7 --- /dev/null +++ b/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3news12.tex b/Master/texmf-dist/doc/latex/l3kernel/l3news12.tex new file mode 100644 index 00000000000..05c89a608d4 --- /dev/null +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt b/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt index 8706c0aba36..e8eebb356be 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt +++ b/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt @@ -47,6 +47,14 @@ Function Expires end \c_one_thousand 2019 \c_ten_thousand 2019 \c_term_ior 2020 +\char_fold_case:N 2021 +\char_lower_case:N 2021 +\char_mixed_case:N 2021 +\char_upper_case:N 2021 +\char_str_fold_case:N 2021 +\char_str_lower_case:N 2021 +\char_str_mixed_case:N 2021 +\char_str_upper_case:N 2021 \etex_....:D 2019 \hbox_unpack_clear:c 2020 \hbox_unpack_clear:N 2020 @@ -63,10 +71,16 @@ Function Expires end \str_case_x:nnF 2019 \str_case_x:nnT 2019 \str_case_x:nnTF 2019 +\str_fold_case:n 2021 +\str_fold_case:V 2021 \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 +\str_lower_case:f 2021 +\str_lower_case:n 2021 +\str_upper_case:f 2021 +\str_upper_case:n 2021 \tl_gset_from_file:cnn 2020 \tl_gset_from_file:Nnn 2020 \tl_gset_from_file_x:cnn 2020 diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv index 0054b22ed29..c43913c2837 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf Binary files differindex cbb3f893046..8117582c19d 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf Binary files differindex d00c3f06017..c8be7049658 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex index 28948cc82c3..9b48213e4ad 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf Binary files differindex e6b56c46997..5d9e1b70538 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex index a27fb842d0c..26c5850c23b 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf Binary files differindex 062c6794b90..60440afea35 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex b/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex index 0f7ed542b37..e982eb57618 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf Binary files differindex a40463b4d97..d630d86daf4 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.tex b/Master/texmf-dist/doc/latex/l3kernel/source3.tex index 45de4218f6d..76a9c01fea8 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.tex +++ b/Master/texmf-dist/doc/latex/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/Master/texmf-dist/doc/latex/l3kernel/source3body.tex b/Master/texmf-dist/doc/latex/l3kernel/source3body.tex index 620ac44f849..f985c0d1474 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3body.tex +++ b/Master/texmf-dist/doc/latex/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} diff --git a/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md index cf63a73ebf7..f4e843f2ed6 100644 --- a/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/l3packages/CHANGELOG.md @@ -7,18 +7,24 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2020-01-12] + +### Changed +- Track `l3kernel` changes + ## [2019-10-11] +### Fixed - `xparse`: Allow processors to depend on other arguments (fixes #629) ## [2019-05-28] +### Fixed - `xparse`: Remove stray spaces in processor information ## [2019-05-03] ### Added - - `xparse`: Support for `trace` package ## [2019-03-05] @@ -54,7 +60,8 @@ this project uses date-based 'snapshot' version identifiers. - Switch to ISO date format - Improve cross-module use of internal functions -[Unreleased]: https://github.com/latex3/latex3/compare/2019-10-11...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2020-01-12...HEAD +[2020-01-12]: https://github.com/latex3/latex3/compare/2019-10-11...2020-01-12 [2019-10-11]: https://github.com/latex3/latex3/compare/2019-05-28...2019-10-11 [2019-05-28]: https://github.com/latex3/latex3/compare/2019-05-03...2019-05-28 [2019-05-03]: https://github.com/latex3/latex3/compare/2019-03-05...2019-05-03 diff --git a/Master/texmf-dist/doc/latex/l3packages/README.md b/Master/texmf-dist/doc/latex/l3packages/README.md index cfe6b5f904a..966f05f2415 100644 --- a/Master/texmf-dist/doc/latex/l3packages/README.md +++ b/Master/texmf-dist/doc/latex/l3packages/README.md @@ -1,12 +1,12 @@ LaTeX3 High-Level Concepts ========================== -Release 2019-10-11 +Release 2020-01-12 Overview -------- -The `l3packages` collection is contains implementations for aspects of the +The `l3packages` collection contains implementations for aspects of the LaTeX3 kernel, dealing with higher-level ideas such as the Designer Interface. The packages here are considered broadly stable (The LaTeX3 Project does not expect the interfaces to alter radically). These packages are build on LaTeX2e @@ -102,6 +102,6 @@ the [LaTeX-L list](#Discussion) should be used. ----- -<p>Copyright (C) 1998-2011,2015-2019 The LaTeX3 Project <br /> +<p>Copyright (C) 1998-2011,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/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf b/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf Binary files differindex 661b4171c7d..9c2d19eebf9 100644 --- a/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf diff --git a/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf b/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf Binary files differindex 35921ed1620..4b09a7d910a 100644 --- a/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf diff --git a/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf b/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf Binary files differindex 06f7ea363a8..e8df898dbc0 100644 --- a/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf diff --git a/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf b/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf Binary files differindex b6822014f4d..b0988846cb2 100644 --- a/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf diff --git a/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf b/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf Binary files differindex 4d4258f8d04..8661c698403 100644 --- a/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx index e66d06bdcbd..5383ac46247 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx @@ -2,7 +2,7 @@ % %% File: l3benchmark.dtx % -% 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 @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -130,7 +130,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3benchmark}{2019-10-11}{} +\ProvidesExplPackage{l3benchmark}{2020-01-12}{} {L3 Experimental benchmarking} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins index d925b01b148..ca4c280f820 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins +++ b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins @@ -2,7 +2,7 @@ File: l3benchmark.ins -Copyright (C) 2011,2018,2019 The LaTeX3 Project +Copyright (C) 2011,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 @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx index 3d6aadc98da..f7418e117f6 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx @@ -2,7 +2,7 @@ % %% File: l3cctab.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 @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -171,7 +171,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3cctab}{2019-10-11}{} +\ProvidesExplPackage{l3cctab}{2020-01-12}{} {L3 Experimental category code tables} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins index 3c7a9b05ae1..e968f1bf838 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins +++ b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins @@ -2,7 +2,7 @@ File: l3cctab.ins -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 @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx index 16147a3fb2e..de6616acf3d 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx @@ -2,7 +2,7 @@ % %% File: l3color.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 @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -267,7 +267,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3color}{2019-10-11}{} +\ProvidesExplPackage{l3color}{2020-01-12}{} {L3 Experimental color support} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins index ae12ed89b60..a2601a4fde1 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins +++ b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins @@ -2,7 +2,7 @@ File: l3color.ins -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 @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx index 6424fbe6a16..572b4f2192a 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx @@ -2,7 +2,7 @@ % %% File: l3draw-boxes.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-10-11} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx index e9b86fd30e0..53c221d69e2 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx @@ -2,7 +2,7 @@ % %% File: l3draw-layers.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 @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx index 442b158fbc0..846043faa45 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx @@ -2,7 +2,7 @@ % %% File: l3draw-paths.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-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -892,6 +892,7 @@ \bool_if:NT \l_@@_path_use_clip_bool { \@@_backend_clip: + \bool_set_false:N \l_draw_bb_update_bool \bool_lazy_or:nnF { \l_@@_path_use_fill_bool } { \l_@@_path_use_stroke_bool } diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx index 7c3749a956e..dccb1fb6772 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx @@ -2,7 +2,7 @@ % %% File: l3draw-points.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-10-11} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx index de1036ef526..704d80652ff 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx @@ -2,7 +2,7 @@ % %% File: l3draw-scopes.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-10-11} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx index 0b51687b9f5..ce3b8b1ac80 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx @@ -2,7 +2,7 @@ % %% File: l3draw-softpath.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-10-11} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx index 4bea6a4943c..658982a49b9 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx @@ -2,7 +2,7 @@ % %% File: l3draw-state.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-10-11} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx index 39873b59a22..bcfed707879 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx @@ -2,7 +2,7 @@ % %% File: l3draw-transforms.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-10-11} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx index 66b7b73f35e..0ce74688f42 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx @@ -2,7 +2,7 @@ % %% File: l3draw.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 @@ -110,7 +110,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -1146,7 +1146,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3draw}{2019-10-11}{} +\ProvidesExplPackage{l3draw}{2020-01-12}{} {L3 Experimental core drawing support} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins index 836d9a32d67..9b72ca17fd6 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins @@ -2,7 +2,7 @@ File: l3draw.ins -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 @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx index 8deb2335ed9..e877b69ca5f 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx @@ -2,7 +2,7 @@ % %% File: l3graphics.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 @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -241,7 +241,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3graphics}{2019-10-11}{} +\ProvidesExplPackage{l3graphics}{2020-01-12}{} {L3 Experimental graphics inclusion support} %</package> % \end{macrocode} @@ -577,7 +577,7 @@ \exp_args:Ne \@@_include_auxi:n { \exp_args:Ne \str_tail:n - { \str_fold_case:V \l_@@_ext_str } + { \str_foldcase:V \l_@@_ext_str } } } \cs_new_protected:Npn \graphics_include:nn #1#2 @@ -587,7 +587,7 @@ \file_get_full_name:nNTF {#1} \l_@@_name_tl { \exp_args:Ne \@@_include_auxi:n - { \str_fold_case:n {#1} } + { \str_foldcase:n {#1} } } { \__kernel_msg_error:nnn { graphics } { graphic-not-found } {#1} } \group_end: diff --git a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins index 815535a352c..ef345b5969d 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins +++ b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins @@ -1,6 +1,6 @@ \iffalse meta-comment -File l3graphics.ins Copyright (C) 2017,2019 The LaTeX3 Project +File l3graphics.ins Copyright (C) 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 this @@ -32,7 +32,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx b/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx index 61ac10ef896..dc36f172faa 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx @@ -2,7 +2,7 @@ % %% File: l3pdf.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 @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -185,7 +185,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3pdf}{2019-10-11}{} +\ProvidesExplPackage{l3pdf}{2020-01-12}{} {L3 Experimental core PDF support} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.ins b/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.ins index d39eefa1140..e325be4520a 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.ins +++ b/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.ins @@ -2,7 +2,7 @@ File: l3pdf.ins -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 @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx index 03fd22c5ea7..af34128e5b7 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx @@ -2,7 +2,7 @@ % %% File: l3str-format.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 @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -167,7 +167,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3str-format}{2019-10-11}{} +\ProvidesExplPackage{l3str-format}{2020-01-12}{} {L3 Experimental string formatting} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins index d3f00364e1c..76fc36a116c 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins @@ -2,7 +2,7 @@ File l3str.ins -Copyright (C) 2011-2017,2019 The LaTeX3 Project +Copyright (C) 2011-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 this @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx index f1aaa56c933..c166811e114 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx @@ -2,7 +2,7 @@ % %% File: l3sys-shell.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 @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -136,7 +136,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3sys-shell}{2019-10-11}{} +\ProvidesExplPackage{l3sys-shell}{2020-01-12}{} {L3 Experimental system shell functions} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins index acf3c1d7102..9ee35460cbd 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins +++ b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins @@ -2,7 +2,7 @@ File: l3sys-shell.ins -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 @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx index 7e3d89e7c2d..9f4aec0bcd9 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx @@ -2,7 +2,7 @@ % %% File: xcoffins.dtx % -% Copyright (C) 2010-2012,2014,2016-2019 The LaTeX3 Project +% Copyright (C) 2010-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 @@ -56,7 +56,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -675,7 +675,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xcoffins}{2019-10-11}{} +\ProvidesExplPackage{xcoffins}{2020-01-12}{} {L3 Experimental design level coffins} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins index 065cb5eae7f..52d5c24a449 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins +++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins @@ -2,7 +2,7 @@ File: xcoffins.ins -Copyright (C) 2010,2011,2012,2016,2017,2019 The LaTeX3 Project +Copyright (C) 2010,2011,2012,2016,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 this @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx index a4d768b05eb..14d9fc9e099 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx @@ -3,7 +3,7 @@ %% File: l3galley.dtx % % Copyright (C) 1999-2001,2004-2009 Frank Mittelbach -% (C) 2010-2019 The LaTeX3 Project +% (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 @@ -61,7 +61,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -687,7 +687,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3galley}{2019-10-11}{} +\ProvidesExplPackage{l3galley}{2020-01-12}{} {L3 Experimental galley code} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx index a0c9d83c802..5cd043a5e61 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx @@ -3,7 +3,7 @@ %% File: xgalley.dtx % % Copyright (C) 1999-2001,2004-2009 Frank Mittelbach -% (C) 2010-2012,2014,2016-2019 The LaTeX3 Project +% (C) 2010-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 @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -734,7 +734,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xgalley}{2019-10-11}{} +\ProvidesExplPackage{xgalley}{2020-01-12}{} {L3 Experimental galley} \RequirePackage{xparse,xtemplate,l3galley} % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins index 13388c46d8c..d0c89bcd2c9 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins @@ -2,7 +2,7 @@ File: xgalley.ins -Copyright (C) 2010-2012,2016,2017,2019 The LaTeX3 Project +Copyright (C) 2010-2012,2016,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 this @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 89d18df2987..7295b770db3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins index d9c7f2e6cf2..b509a2478f3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3.ins +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx index 86076bb8f0b..e3f88dfc947 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index aea1d1fbadb..7814fd30898 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-11-07} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 7066d5132eb..c503774a49a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-11-07} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index 55915ae8592..16f74edd990 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index 4e859699e05..adb399f9da1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index 9529c15070d..ab7cc6cca48 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index 92203d5d8c9..0b27eddfdbd 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx index 9361db0b98f..f4fc3498f46 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx index cb1eb81fd8c..337fddffd7b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index 410f6891a97..32c5050d87e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index 7ddc695d4d7..c2949444822 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index 8c626f91f95..3f64b98edf6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index 7f3ea57e68d..a2767d96921 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 2b6c86f8f89..274d5da8ecc 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx index 853220d68a1..a8677aeb684 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index 742e3da3a44..2f8b6dcc770 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3format.ins b/Master/texmf-dist/source/latex/l3kernel/l3format.ins index bdc5516701f..6e0c98cb819 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3format.ins +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index a09616c3079..ee6abd5f551 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-11-07} +% \date{Released 2020-01-12} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index 1d3faad8431..f306cc12c1d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index 776192abc7c..bf0afbf7c4b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index c1443a3eaf8..b6b9e0d7c9a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index 394fe63f4c4..d830b74036d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index 8c28335acc6..961655d05ad 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index 0b853df3ce9..e6aab8c3945 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index a8641905355..4c4c31c95e1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index 7c6d18bc3c5..e56642bd6d2 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index 7c4e5b0b0fc..672bfd9c8a4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index f4e047b462b..74809e63859 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index d89f0477517..fced52d7593 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index 85214140856..44530a1518b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index 35cdb6353c8..e7f0675fc95 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index 4459cc56b1e..bc68230b3f2 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index f26e7416aa9..6fc43aad658 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index 5ad373b5cc3..98f588a53e5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-11-07} +% \date{Released 2020-01-12} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index c8d5f714318..54167b15c25 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx index c49ac91e7f6..21d6fe5146b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 22780b77fd9..a9f1f0c0a3d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 969738d3aab..3b52246c27d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index b0edf9235dc..cce95b98661 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 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/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index 63b2f5845b8..6a503a97f6c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index 62cd9ba7859..445695ac0f8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index 401b66dfc13..d3ee404a2f8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index bf7b19ccdef..f096c3e65de 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 811ac0a7d74..bc21d02688a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index 901595ae0da..cbb2345e78f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 49686a77ab6..1cb084742bb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx index 05531a1e933..07343492cd0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 09dde6a4eb6..9947592862c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 24e79512c77..12ebc542a50 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx new file mode 100644 index 00000000000..3c608eacb9e --- /dev/null +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx new file mode 100644 index 00000000000..0efc072cf89 --- /dev/null +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index e4e8b791e9b..e9f36e03b8f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index a3c39d9df95..a564e6eca3e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index 36ca7200714..93b1e6ffc55 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index 9eb3d9747a1..383826eaeb4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx +++ b/Master/texmf-dist/source/latex/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/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx index 9a10f7ef791..a570701cf43 100644 --- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx +++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx @@ -2,7 +2,7 @@ % %% File: l3keys2e.dtx % -% Copyright (C) 2009,2011-2019 The LaTeX3 Project +% Copyright (C) 2009,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 @@ -62,7 +62,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -133,7 +133,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3keys2e}{2019-10-11}{} +\ProvidesExplPackage{l3keys2e}{2020-01-12}{} {LaTeX2e option processing using LaTeX3 keys} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins index df9e88b7e99..a5d2f4e3017 100644 --- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins +++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins @@ -2,7 +2,7 @@ File: l3keys2e.ins -Copyright (C) 2009,2011,2012,2016,2017,2019 The LaTeX3 Project +Copyright (C) 2009,2011,2012,2016,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 this @@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx index 33f66c6589d..5eeb3e2aefb 100644 --- a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx @@ -2,7 +2,7 @@ % %% File: xfp.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 @@ -64,7 +64,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -167,7 +167,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfp}{2019-10-11}{} +\ProvidesExplPackage{xfp}{2020-01-12}{} {L3 Floating point unit} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins index 6a2a26d1257..2439b0aae10 100644 --- a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins +++ b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins @@ -2,7 +2,7 @@ File: xfp.ins -Copyright (C) 2017,2019 The LaTeX3 Project +Copyright (C) 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 this @@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx index 62600c37be0..59262e81ad9 100644 --- a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx @@ -3,7 +3,7 @@ %% File: xfrac.dtx % % Copyright (C) 2004,2008-2010 Morten Hoegholm -% (C) 2011,2012,2014-2019 The LaTeX3 Project +% (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 @@ -65,7 +65,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -535,7 +535,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfrac}{2019-10-11}{} +\ProvidesExplPackage{xfrac}{2020-01-12}{} {L3 Experimental split-level fractions} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins index 39ecdd34b37..1b02e49b54c 100644 --- a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins +++ b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins @@ -3,7 +3,7 @@ File: xfrac.ins Copyright (C) 2004,2008-2010 Morten Hoegholm - (C) 2011,2012,2016,2017,2019 The LaTeX3 Project + (C) 2011,2012,2016,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 this @@ -24,7 +24,7 @@ The released version of this bundle is available from CTAN. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx index 2a0b842fbb9..8e088957188 100644 --- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx @@ -4,7 +4,7 @@ % % Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle % (C) 2004-2008 Frank Mittelbach, The LaTeX3 Project -% (C) 2009-2019 The LaTeX3 Project +% (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 @@ -67,7 +67,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -916,7 +916,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xparse}{2019-10-11}{} +\ProvidesExplPackage{xparse}{2020-01-12}{} {L3 Experimental document command parser} % \end{macrocode} % @@ -4551,7 +4551,7 @@ LaTeX~did~not~find~it,~and~will~insert~a~default~value~to~be~processed. } \__kernel_msg_new:nnnn { xparse } { non-xparse } - { \str_upper_case:n #1~not~defined~using~xparse. } + { \str_uppercase:n #1~not~defined~using~xparse. } { You~have~asked~for~the~argument~specification~for~the~#1,~ but~this~was~not~defined~using~xparse. diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins index 0fcc01351dd..e65d2547097 100644 --- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins +++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins @@ -2,7 +2,7 @@ File: xparse.ins -Copyright (C) 2000-2012,2016,2017,2019 The LaTeX3 Project +Copyright (C) 2000-2012,2016,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 this @@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN. \preamble -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 diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx index c12297b4edd..211a461a61b 100644 --- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx @@ -4,7 +4,7 @@ % % Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle % (C) 2004-2010 Frank Mittelbach, The LaTeX3 Project -% (C) 2011-2019 The LaTeX3 Project +% (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 @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2020-01-12} % % \maketitle % @@ -682,7 +682,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xtemplate}{2019-10-11}{} +\ProvidesExplPackage{xtemplate}{2020-01-12}{} {L3 Experimental prototype document functions} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins index dc7f7e5bea5..43dfb266206 100644 --- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins +++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins @@ -2,7 +2,7 @@ File: xtemplate.ins -Copyright (C) 2000-2012,2016,2017,2019 The LaTeX3 Project +Copyright (C) 2000-2012,2016,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 this @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -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 diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty b/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty index eb568089f31..5d5864c8cdb 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty @@ -6,7 +6,7 @@ %% %% l3benchmark.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: l3benchmark.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3benchmark}{2019-10-11}{} +\ProvidesExplPackage{l3benchmark}{2020-01-12}{} {L3 Experimental benchmarking} \sys_if_engine_luatex:TF { diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3cctab/l3cctab.sty b/Master/texmf-dist/tex/latex/l3experimental/l3cctab/l3cctab.sty index 62db595f6a9..392ef2ba12a 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3cctab/l3cctab.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3cctab/l3cctab.sty @@ -6,7 +6,7 @@ %% %% l3cctab.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: l3cctab.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3cctab}{2019-10-11}{} +\ProvidesExplPackage{l3cctab}{2020-01-12}{} {L3 Experimental category code tables} \int_new:N \g__cctab_allocate_int \int_gset:Nn \g__cctab_allocate_int { -1 } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty b/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty index 519151e0057..2b56c1dfd57 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty @@ -6,7 +6,7 @@ %% %% l3color.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: l3color.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3color}{2019-10-11}{} +\ProvidesExplPackage{l3color}{2020-01-12}{} {L3 Experimental color support} \tl_new:N \l__color_internal_tl \prg_new_conditional:Npnn \__color_if_defined:n #1 { T, F, TF } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty b/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty index cdd870cc8d2..b29c727f902 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty @@ -14,7 +14,7 @@ %% l3draw-state.dtx (with options: `package') %% l3draw-transforms.dtx (with options: `package') %% -%% 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 @@ -28,7 +28,7 @@ %% %% File: l3draw.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3draw}{2019-10-11}{} +\ProvidesExplPackage{l3draw}{2020-01-12}{} {L3 Experimental core drawing support} \RequirePackage { l3color } %% File: l3draw-boxes.dtx @@ -697,6 +697,7 @@ \bool_if:NT \l__draw_path_use_clip_bool { \__draw_backend_clip: + \bool_set_false:N \l_draw_bb_update_bool \bool_lazy_or:nnF { \l__draw_path_use_fill_bool } { \l__draw_path_use_stroke_bool } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty b/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty index 1aff5007f6d..5853a577cb5 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty @@ -6,7 +6,7 @@ %% %% l3graphics.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: l3graphics.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3graphics}{2019-10-11}{} +\ProvidesExplPackage{l3graphics}{2020-01-12}{} {L3 Experimental graphics inclusion support} \ior_new:N \l__graphics_tmp_ior \tl_new:N \l__graphics_tmp_tl @@ -196,7 +196,7 @@ \exp_args:Ne \__graphics_include_auxi:n { \exp_args:Ne \str_tail:n - { \str_fold_case:V \l__graphics_ext_str } + { \str_foldcase:V \l__graphics_ext_str } } } \cs_new_protected:Npn \graphics_include:nn #1#2 @@ -206,7 +206,7 @@ \file_get_full_name:nNTF {#1} \l__graphics_name_tl { \exp_args:Ne \__graphics_include_auxi:n - { \str_fold_case:n {#1} } + { \str_foldcase:n {#1} } } { \__kernel_msg_error:nnn { graphics } { graphic-not-found } {#1} } \group_end: diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty b/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty index aa46e4d56a3..5341cb87805 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3pdf/l3pdf.sty @@ -6,7 +6,7 @@ %% %% l3pdf.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: l3pdf.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3pdf}{2019-10-11}{} +\ProvidesExplPackage{l3pdf}{2020-01-12}{} {L3 Experimental core PDF support} \bool_new:N \g__pdf_init_bool \cs_if_exist:NT \documentclass diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty index 63b8e57edf9..2d974506bf6 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty @@ -6,7 +6,7 @@ %% %% l3str-format.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: l3str-format.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3str-format}{2019-10-11}{} +\ProvidesExplPackage{l3str-format}{2020-01-12}{} {L3 Experimental string formatting} \cs_generate_variant:Nn \use:nn { nf } \cs_generate_variant:Nn \use:nnn { fnf } diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty b/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty index 4e8d868d796..3bbd279c109 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty @@ -6,7 +6,7 @@ %% %% l3sys-shell.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: l3sys-shell.dtx \RequirePackage{expl3} -\ProvidesExplPackage{l3sys-shell}{2019-10-11}{} +\ProvidesExplPackage{l3sys-shell}{2020-01-12}{} {L3 Experimental system shell functions} \cs_new:Npn \__sys_path_to_win:n #1 { diff --git a/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty b/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty index b5b8d6b633b..92485efab50 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty @@ -6,7 +6,7 @@ %% %% xcoffins.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: xcoffins.dtx \RequirePackage{xparse} -\ProvidesExplPackage{xcoffins}{2019-10-11}{} +\ProvidesExplPackage{xcoffins}{2020-01-12}{} {L3 Experimental design level coffins} \keys_define:nn { coffin } { diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty index 09ad53f47d6..dbedd8ac3d9 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty @@ -6,7 +6,7 @@ %% %% l3galley.dtx (with options: `package') %% -%% 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 @@ -32,7 +32,7 @@ }% \endinput } -\ProvidesExplPackage{l3galley}{2019-10-11}{} +\ProvidesExplPackage{l3galley}{2020-01-12}{} {L3 Experimental galley code} \int_new:N \l__galley_tmp_int \seq_new:N \g__galley_tmpa_seq diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty index eadda7c0ef0..e025cc69497 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty @@ -6,7 +6,7 @@ %% %% xgalley.dtx (with options: `package') %% -%% 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 @@ -20,7 +20,7 @@ %% %% File: xgalley.dtx \RequirePackage{xparse} -\ProvidesExplPackage{xgalley}{2019-10-11}{} +\ProvidesExplPackage{xgalley}{2020-01-12}{} {L3 Experimental galley} \RequirePackage{xparse,xtemplate,l3galley} \clist_new:N \l__galley_tmpa_clist diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex index 8cb4cc08109..4e722fd3bee 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex @@ -48,11 +48,13 @@ %% l3coffins.dtx (with options: `package') %% l3luatex.dtx (with options: `package,tex') %% l3unicode.dtx (with options: `package') +%% l3text.dtx (with options: `package') +%% l3text-case.dtx (with options: `package') %% l3candidates.dtx (with options: `package') %% l3legacy.dtx (with options: `package') %% l3deprecation.dtx (with options: `package,kernel') %% -%% 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 @@ -65,7 +67,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2019-11-07}% +\def\ExplFileDate{2020-01-12}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -1223,6 +1225,9 @@ \__kernel_primitive:NN \Uvextensible \tex_Uvextensible:D \__kernel_primitive:NN \autospacing \tex_autospacing:D \__kernel_primitive:NN \autoxspacing \tex_autoxspacing:D + \__kernel_primitive:NN \currentcjktoken \tex_currentcjktoken:D + \__kernel_primitive:NN \currentspacingmode \tex_currentspacingmode:D + \__kernel_primitive:NN \currentxspacingmode \tex_currentxspacingmode:D \__kernel_primitive:NN \disinhibitglue \tex_disinhibitglue:D \__kernel_primitive:NN \dtou \tex_dtou:D \__kernel_primitive:NN \epTeXinputencoding \tex_epTeXinputencoding:D @@ -3917,6 +3922,7 @@ \__cs_tmp:w { ooo } \__cs_tmp:w { oof } \__cs_tmp:w { ffo } +\__cs_tmp:w { eee } \__cs_tmp:w { NNx } \__cs_tmp:w { Nnx } \__cs_tmp:w { Nox } @@ -5502,12 +5508,12 @@ \tl_to_str:n {#1} \q_mark \q_mark \q_stop } \cs_new:Npn \__str_tail_auxii:w #1 #2 \q_mark #3 \q_stop { #2 } -\cs_new:Npn \str_fold_case:n #1 { \__str_change_case:nn {#1} { fold } } -\cs_new:Npn \str_lower_case:n #1 { \__str_change_case:nn {#1} { lower } } -\cs_new:Npn \str_upper_case:n #1 { \__str_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 { \__str_change_case:nn {#1} { fold } } +\cs_new:Npn \str_lowercase:n #1 { \__str_change_case:nn {#1} { lower } } +\cs_new:Npn \str_uppercase:n #1 { \__str_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 \__str_change_case:nn #1 { \exp_after:wN \__str_change_case_aux:nn \exp_after:wN @@ -5541,7 +5547,7 @@ \quark_if_recursion_tail_stop_do:Nn #2 { \__str_change_case_end:wn } \__str_change_case_output:fw - { \use:c { char_str_ #1 _case:N } #2 } + { \use:c { char_str_ #1 case:N } #2 } \__str_change_case_loop:nw {#1} } \str_const:Nx \c_ampersand_str { \cs_to_str:N \& } @@ -8632,6 +8638,225 @@ } \fi: \group_end: +\cs_new:Npn \char_to_utfviii_bytes:n #1 + { + \exp_args:Nf \__char_to_utfviii_bytes_auxi:n + { \int_eval:n {#1} } + } +\cs_new:Npn \__char_to_utfviii_bytes_auxi:n #1 + { + \if_int_compare:w #1 > "80 \exp_stop_f: + \if_int_compare:w #1 < "800 \exp_stop_f: + \__char_to_utfviii_bytes_outputi:nw + { \__char_to_utfviii_bytes_auxii:Nnn C {#1} { 64 } } + \__char_to_utfviii_bytes_outputii:nw + { \__char_to_utfviii_bytes_auxiii:n {#1} } + \else: + \if_int_compare:w #1 < "10000 \exp_stop_f: + \__char_to_utfviii_bytes_outputi:nw + { \__char_to_utfviii_bytes_auxii:Nnn E {#1} { 64 * 64 } } + \__char_to_utfviii_bytes_outputii:nw + { + \__char_to_utfviii_bytes_auxiii:n + { \int_div_truncate:nn {#1} { 64 } } + } + \__char_to_utfviii_bytes_outputiii:nw + { \__char_to_utfviii_bytes_auxiii:n {#1} } + \else: + \__char_to_utfviii_bytes_outputi:nw + { + \__char_to_utfviii_bytes_auxii:Nnn F + {#1} { 64 * 64 * 64 } + } + \__char_to_utfviii_bytes_outputii:nw + { + \__char_to_utfviii_bytes_auxiii:n + { \int_div_truncate:nn {#1} { 64 * 64 } } + } + \__char_to_utfviii_bytes_outputiii:nw + { + \__char_to_utfviii_bytes_auxiii:n + { \int_div_truncate:nn {#1} { 64 } } + } + \__char_to_utfviii_bytes_outputiv:nw + { \__char_to_utfviii_bytes_auxiii:n {#1} } + \fi: + \fi: + \else: + \__char_to_utfviii_bytes_outputi:nw {#1} + \fi: + \__char_to_utfviii_bytes_end: { } { } { } { } + } +\cs_new:Npn \__char_to_utfviii_bytes_auxii:Nnn #1#2#3 + { "#10 + \int_div_truncate:nn {#2} {#3} } +\cs_new:Npn \__char_to_utfviii_bytes_auxiii:n #1 + { \int_mod:nn {#1} { 64 } + 128 } +\cs_new:Npn \__char_to_utfviii_bytes_outputi:nw + #1 #2 \__char_to_utfviii_bytes_end: #3 + { \__char_to_utfviii_bytes_output:fnn { \int_eval:n {#1} } { } {#2} } +\cs_new:Npn \__char_to_utfviii_bytes_outputii:nw + #1 #2 \__char_to_utfviii_bytes_end: #3#4 + { \__char_to_utfviii_bytes_output:fnn { \int_eval:n {#1} } { {#3} } {#2} } +\cs_new:Npn \__char_to_utfviii_bytes_outputiii:nw + #1 #2 \__char_to_utfviii_bytes_end: #3#4#5 + { + \__char_to_utfviii_bytes_output:fnn + { \int_eval:n {#1} } { {#3} {#4} } {#2} + } +\cs_new:Npn \__char_to_utfviii_bytes_outputiv:nw + #1 #2 \__char_to_utfviii_bytes_end: #3#4#5#6 + { + \__char_to_utfviii_bytes_output:fnn + { \int_eval:n {#1} } { {#3} {#4} {#5} } {#2} + } +\cs_new:Npn \__char_to_utfviii_bytes_output:nnn #1#2#3 + { + #3 + \__char_to_utfviii_bytes_end: #2 {#1} + } +\cs_generate_variant:Nn \__char_to_utfviii_bytes_output:nnn { f } +\cs_new:Npn \__char_to_utfviii_bytes_end: { } +\cs_new:Npn \char_to_nfd:N #1 + { + \cs_if_exist:cTF { c__char_nfd_ \token_to_str:N #1 _ tl } + { + \exp_after:wN \exp_after:wN \exp_after:wN \__char_to_nfd:Nw + \exp_after:wN \exp_after:wN \exp_after:wN #1 + \cs:w c__char_nfd_ \token_to_str:N #1 _ tl \cs_end: + \q_stop + } + { \exp_not:n {#1} } + } +\cs_set_eq:NN \__char_to_nfd:n \char_to_nfd:N +\cs_new:Npn \__char_to_nfd:Nw #1#2#3 \q_stop + { + \exp_args:Ne \__char_to_nfd:n + { \char_generate:nn { `#2 } { \__char_change_case_catcode:N #1 } } + \tl_if_blank:nF {#3} + { + \exp_args:Ne \__char_to_nfd:n + { \char_generate:nn { `#3 } { \char_value_catcode:n { `#3 } } } + } + } +\cs_new:Npn \char_lowercase:N #1 + { \__char_change_case:nNN { lower } \char_value_lccode:n #1 } +\cs_new:Npn \char_uppercase:N #1 + { \__char_change_case:nNN { upper } \char_value_uccode:n #1 } +\cs_new:Npn \char_titlecase:N #1 + { + \tl_if_exist:cTF { c__char_titlecase_ \token_to_str:N #1 _tl } + { + \__char_change_case_multi:vN + { c__char_titlecase_ \token_to_str:N #1 _tl } #1 + } + { \char_uppercase:N #1 } + } +\cs_new:Npn \char_foldcase:N #1 + { \__char_change_case:nNN { fold } \char_value_lccode:n #1 } +\cs_new:Npn \__char_change_case:nNN #1#2#3 + { + \tl_if_exist:cTF { c__char_ #1 case_ \token_to_str:N #3 _tl } + { + \__char_change_case_multi:vN + { c__char_ #1 case_ \token_to_str:N #3 _tl } #3 + } + { \exp_args:Nf \__char_change_case:nN { #2 { `#3 } } #3 } + } +\cs_new:Npn \__char_change_case:nN #1#2 + { + \int_compare:nNnTF {#1} = 0 + { #2 } + { \char_generate:nn {#1} { \__char_change_case_catcode:N #2 } } + } +\cs_new:Npn \__char_change_case_multi:nN #1#2 + { \__char_change_case_multi:NNNNw #2 #1 \q_no_value \q_no_value \q_stop } +\cs_generate_variant:Nn \__char_change_case_multi:nN { v } +\cs_new:Npn \__char_change_case_multi:NNNNw #1#2#3#4#5 \q_stop + { + \quark_if_no_value:NTF #4 + { + \quark_if_no_value:NTF #3 + { \__char_change_case:NN #1 #2 } + { \__char_change_case:NNN #1 #2#3 } + } + { \__char_change_case:NNNN #1 #2#3#4 } + } +\cs_new:Npn \__char_change_case:NNN #1#2#3 + { + \exp_args:Nnf \use:nn + { \__char_change_case:NN #1 #2 } + { \__char_change_case:NN #1 #3 } + } +\cs_new:Npn \__char_change_case:NNNN #1#2#3#4 + { + \exp_args:Nnff \use:nnn + { \__char_change_case:NN #1 #2 } + { \__char_change_case:NN #1 #3 } + { \__char_change_case:NN #1 #4 } + } +\cs_new:Npn \__char_change_case:NN #1#2 + { \char_generate:nn { `#2 } { \__char_change_case_catcode:N #1 } } +\cs_new:Npn \__char_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: + } +\cs_new:Npn \char_str_lowercase:N #1 + { \__char_str_change_case:nNN { lower } \char_value_lccode:n #1 } +\cs_new:Npn \char_str_uppercase:N #1 + { \__char_str_change_case:nNN { upper } \char_value_uccode:n #1 } +\cs_new:Npn \char_str_titlecase:N #1 + { + \tl_if_exist:cTF { c__char_titlecase_ \token_to_str:N #1 _tl } + { \tl_to_str:c { c__char_titlecase_ \token_to_str:N #1 _tl } } + { \char_str_uppercase:N #1 } + } +\cs_new:Npn \char_str_foldcase:N #1 + { \__char_str_change_case:nNN { fold } \char_value_lccode:n #1 } +\cs_new:Npn \__char_str_change_case:nNN #1#2#3 + { + \tl_if_exist:cTF { c__char_ #1 case_ \token_to_str:N #3 _tl } + { \tl_to_str:c { c__char_ #1 case_ \token_to_str:N #3 _tl } } + { \exp_args:Nf \__char_str_change_case:nN { #2 { `#3 } } #3 } + } +\cs_new:Npn \__char_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 \__char_str_change_case:nN #1#2 + { \tl_to_str:n {#2} } + } \tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\ } { 12 } } \group_begin: \__kernel_chk_if_free_cs:N \c_group_begin_token @@ -11335,12 +11560,94 @@ \cs_new:Npn \__file_mdfive_hash:n #1 { \tex_mdfivesum:D file {#1} } } +\cs_new:Npn \file_hex_dump:nnn #1#2#3 + { + \exp_args:Neee \__file_hex_dump_auxi:nnn + { \file_full_name:n {#1} } + { \int_eval:n {#2} } + { \int_eval:n {#3} } + } +\cs_new:Npn \__file_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 \__file_hex_dump_auxii:nnnn + { \__file_details_aux:nn {#1} { size } } + {#1} {#2} {#3} + } + } +\cs_new:Npn \__file_hex_dump_auxii:nnnn #1#2#3#4 + { + \int_compare:nNnTF {#3} > 0 + { \__file_hex_dump_auxiii:nnnn {#3} } + { + \exp_args:Ne \__file_hex_dump_auxiii:nnnn + { \int_eval:n { #1 + #3 } } + } + {#1} {#2} {#4} + } +\cs_new:Npn \__file_hex_dump_auxiii:nnnn #1#2#3#4 + { + \int_compare:nNnTF {#4} > 0 + { \__file_hex_dump_auxiv:nnn {#4} } + { + \exp_args:Ne \__file_hex_dump_auxiv:nnn + { \int_eval:n { #2 + #4 } } + } + {#1} {#3} + } +\cs_new:Npn \__file_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 \__file_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 \__file_hex_dump:n { \file_full_name:n {#1} } } +\cs_new:Npn \__file_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 \__file_hex_dump:n #1 + { + \lua_now:e + { l3kernel.filedump ( " \lua_escape:e { #1 } " ) } + } + } +\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 } + { \__file_get_details:nnN {#1} { hex_dump } #2 } \prg_new_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2 { T , F , TF } { \__file_get_details:nnN {#1} { mdfive_hash } #2 } \prg_new_protected_conditional:Npnn \file_get_size:nN #1#2 { T , F , TF } @@ -11368,6 +11675,7 @@ \token_to_str:N \(pdf)file \str_case:nn {#2} { + { hex_dump } { dump } { mdfive_hash } { mdfivesum } { timestamp } { moddate } { size } { size } @@ -11376,6 +11684,20 @@ \prg_return_false: } } +\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: } + } \cs_new:Npn \__file_str_cmp:nn #1#2 { \tex_strcmp:D {#1} {#2} } \sys_if_engine_luatex:T { @@ -13104,6 +13426,7 @@ { \c__keys_code_root_tl ##1 / \l_keys_key_tl } { \tl_set:Nn \l__keys_inherit_tl {##1} + \cs_if_exist_use:c { \c__keys_validate_root_tl ##1 / \l_keys_key_tl } \cs:w \c__keys_code_root_tl ##1 / \l_keys_key_tl \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl } @@ -14662,7 +14985,7 @@ \cs_if_exist_use:cF { __fp_parse_word_#2:N } { \cs_if_exist_use:cF - { __fp_parse_caseless_ \str_fold_case:n {#2} :N } + { __fp_parse_caseless_ \str_foldcase:n {#2} :N } { \__kernel_msg_expandable_error:nnn { kernel } { unknown-fp-word } {#2} @@ -27252,27 +27575,47 @@ \ior_open:Nn \g__char_data_ior { UnicodeData.txt } \cs_set_protected:Npn \__char_data_auxi:w #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ; - { \__char_data_auxii:w #1 ; } - \cs_set_protected:Npn \__char_data_auxii:w - #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 \q_stop + { + \tl_if_blank:nF {#6} + { + \tl_if_head_eq_charcode:nNF {#6} < % > + { \__char_data_auxii:w #1 ; #6 ~ \q_stop } + } + \__char_data_auxiii:w #1 ; + } + \cs_set_protected:Npn \__char_data_auxii:w #1 ; #2 ~ #3 \q_stop + { + \tl_const:cx + { c__char_nfd_ \__char_generate_char:n {#1} _tl } + { + \__char_generate:n { "#2 } + \tl_if_blank:nF {#3} + { \__char_generate:n { "#3 } } + } + } + \cs_set_protected:Npn \__char_data_auxiii:w + #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ~ \q_stop { \cs_set_nopar:Npn \l__char_tmpa_tl {#7} \reverse_if:N \if_meaning:w \l__char_tmpa_tl \c_empty_tl \cs_set_nopar:Npn \l__char_tmpb_tl {#5} \reverse_if:N \if_meaning:w \l__char_tmpa_tl \l__char_tmpb_tl \tl_const:cx - { c__char_mixed_case_ \__char_generate_char:n {#1} _tl } + { c__char_titlecase_ \__char_generate_char:n {#1} _tl } { \__char_generate:n { "#7 } } \fi: \fi: } - \ior_map_variable:NNn \g__char_data_ior \l__char_tmpa_tl - { - \if_meaning:w \l__char_tmpa_tl \c_space_tl - \exp_after:wN \ior_map_break: - \fi: - \exp_after:wN \__char_data_auxi:w \l__char_tmpa_tl \q_stop - } + \group_begin: + \char_set_catcode_space:n { `\ }% + \ior_map_variable:NNn \g__char_data_ior \l__char_tmpa_tl + {% + \if_meaning:w \l__char_tmpa_tl \c_space_tl + \exp_after:wN \ior_map_break: + \fi: + \exp_after:wN \__char_data_auxi:w \l__char_tmpa_tl \q_stop + }% + \group_end: \ior_close:N \g__char_data_ior \ior_open:Nn \g__char_data_ior { CaseFolding.txt } \cs_set_protected:Npn \__char_data_auxi:w #1 ;~ #2 ;~ #3 ; #4 \q_stop @@ -27281,7 +27624,7 @@ \reverse_if:N \if_int_compare:w \char_value_lccode:n {"#1} = "#3 ~ \tl_const:cx - { c__char_fold_case_ \__char_generate_char:n {#1} _tl } + { c__char_foldcase_ \__char_generate_char:n {#1} _tl } { \__char_generate:n { "#3 } } \fi: \else: @@ -27292,7 +27635,7 @@ } \cs_set_protected:Npn \__char_data_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop { - \tl_const:cx { c__char_fold_case_ \__char_generate_char:n {#1} _tl } + \tl_const:cx { c__char_foldcase_ \__char_generate_char:n {#1} _tl } { \__char_generate:n { "#2 } \__char_generate:n { "#3 } @@ -27314,14 +27657,14 @@ \use:n { \__char_data_auxii:w #1 ~ lower ~ #2 ~ } ~ \q_stop \use:n { \__char_data_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop \str_if_eq:nnF {#3} {#4} - { \use:n { \__char_data_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop } + { \use:n { \__char_data_auxii:w #1 ~ title ~ #3 ~ } ~ \q_stop } } \cs_set_protected:Npn \__char_data_auxii:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop { \tl_if_empty:nF {#4} { - \tl_const:cx { c__char_ #2 _case_ \__char_generate_char:n {#1} _tl } + \tl_const:cx { c__char_ #2 case_ \__char_generate_char:n {#1} _tl } { \__char_generate:n { "#3 } \__char_generate:n { "#4 } @@ -27351,9 +27694,9 @@ \cs_set_protected:Npn \__char_tmp:NN #1#2 { \quark_if_recursion_tail_stop:N #2 - \tl_const:cn { c__char_upper_case_ #2 _tl } {#1} - \tl_const:cn { c__char_lower_case_ #1 _tl } {#2} - \tl_const:cn { c__char_fold_case_ #1 _tl } {#2} + \tl_const:cn { c__char_uppercase_ #2 _tl } {#1} + \tl_const:cn { c__char_lowercase_ #1 _tl } {#2} + \tl_const:cn { c__char_foldcase_ #1 _tl } {#2} \__char_tmp:NN } \__char_tmp:NN @@ -27363,1182 +27706,1188 @@ \ior_close:N \g__char_data_ior \group_end: } -%% File: l3candidates.dtx -\cs_new_protected:Npn \box_clip:N #1 - { \hbox_set:Nn #1 { \__box_backend_clip:N #1 } } -\cs_generate_variant:Nn \box_clip:N { c } -\cs_new_protected:Npn \box_gclip:N #1 - { \hbox_gset:Nn #1 { \__box_backend_clip:N #1 } } -\cs_generate_variant:Nn \box_gclip:N { c } -\cs_new_protected:Npn \box_set_trim:Nnnnn #1#2#3#4#5 - { \__box_set_trim:NnnnnN #1 {#2} {#3} {#4} {#5} \box_set_eq:NN } -\cs_generate_variant:Nn \box_set_trim:Nnnnn { c } -\cs_new_protected:Npn \box_gset_trim:Nnnnn #1#2#3#4#5 - { \__box_set_trim:NnnnnN #1 {#2} {#3} {#4} {#5} \box_gset_eq:NN } -\cs_generate_variant:Nn \box_gset_trim:Nnnnn { c } -\cs_new_protected:Npn \__box_set_trim:NnnnnN #1#2#3#4#5#6 - { - \hbox_set:Nn \l__box_internal_box - { - \tex_kern:D - \__box_dim_eval:n {#2} - \box_use:N #1 - \tex_kern:D - \__box_dim_eval:n {#4} - } - \dim_compare:nNnTF { \box_dp:N #1 } > {#3} - { - \hbox_set:Nn \l__box_internal_box - { - \box_move_down:nn \c_zero_dim - { \box_use_drop:N \l__box_internal_box } - } - \box_set_dp:Nn \l__box_internal_box { \box_dp:N #1 - (#3) } - } - { - \hbox_set:Nn \l__box_internal_box - { - \box_move_down:nn { (#3) - \box_dp:N #1 } - { \box_use_drop:N \l__box_internal_box } - } - \box_set_dp:Nn \l__box_internal_box \c_zero_dim - } - \dim_compare:nNnTF { \box_ht:N \l__box_internal_box } > {#5} - { - \hbox_set:Nn \l__box_internal_box - { - \box_move_up:nn \c_zero_dim - { \box_use_drop:N \l__box_internal_box } - } - \box_set_ht:Nn \l__box_internal_box - { \box_ht:N \l__box_internal_box - (#5) } - } - { - \hbox_set:Nn \l__box_internal_box - { - \box_move_up:nn { (#5) - \box_ht:N \l__box_internal_box } - { \box_use_drop:N \l__box_internal_box } - } - \box_set_ht:Nn \l__box_internal_box \c_zero_dim - } - #6 #1 \l__box_internal_box - } -\cs_new_protected:Npn \box_set_viewport:Nnnnn #1#2#3#4#5 - { \__box_set_viewport:NnnnnN #1 {#2} {#3} {#4} {#5} \box_set_eq:NN } -\cs_generate_variant:Nn \box_set_viewport:Nnnnn { c } -\cs_new_protected:Npn \box_gset_viewport:Nnnnn #1#2#3#4#5 - { \__box_set_viewport:NnnnnN #1 {#2} {#3} {#4} {#5} \box_gset_eq:NN } -\cs_generate_variant:Nn \box_gset_viewport:Nnnnn { c } -\cs_new_protected:Npn \__box_set_viewport:NnnnnN #1#2#3#4#5#6 - { - \hbox_set:Nn \l__box_internal_box - { - \tex_kern:D - \__box_dim_eval:n {#2} - \box_use:N #1 - \tex_kern:D \__box_dim_eval:n { #4 - \box_wd:N #1 } - } - \dim_compare:nNnTF {#3} < \c_zero_dim - { - \hbox_set:Nn \l__box_internal_box - { - \box_move_down:nn \c_zero_dim - { \box_use_drop:N \l__box_internal_box } - } - \box_set_dp:Nn \l__box_internal_box { - \__box_dim_eval:n {#3} } - } - { - \hbox_set:Nn \l__box_internal_box - { \box_move_down:nn {#3} { \box_use_drop:N \l__box_internal_box } } - \box_set_dp:Nn \l__box_internal_box \c_zero_dim - } - \dim_compare:nNnTF {#5} > \c_zero_dim - { - \hbox_set:Nn \l__box_internal_box - { - \box_move_up:nn \c_zero_dim - { \box_use_drop:N \l__box_internal_box } - } - \box_set_ht:Nn \l__box_internal_box - { - (#5) - \dim_compare:nNnT {#3} > \c_zero_dim - { - (#3) } - } - } - { - \hbox_set:Nn \l__box_internal_box - { - \box_move_up:nn { - \__box_dim_eval:n {#5} } - { \box_use_drop:N \l__box_internal_box } - } - \box_set_ht:Nn \l__box_internal_box \c_zero_dim - } - #6 #1 \l__box_internal_box - } -\cs_new:Npn \flag_raise_if_clear:n #1 +%% File: l3text.dtx +\group_begin: + \char_set_catcode_active:n { 0 } + \cs_new:Npn \__text_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 \__text_token_to_explicit_cs:N + \else: + \exp_after:wN \__text_token_to_explicit_char:N + \fi: + #1 + } +\group_end: +\cs_new:Npn \__text_token_to_explicit_cs:N #1 { - \if_cs_exist:w flag~#1~0 \cs_end: + \exp_after:wN \if_meaning:w \exp_not:N #1 #1 + \exp_after:wN \use:nn \exp_after:wN + \__text_token_to_explicit_cs_aux:N \else: - \cs:w flag~#1 \cs_end: 0 ; + \exp_after:wN \exp_not:n \fi: + {#1} } -\cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6 +\cs_new:Npn \__text_token_to_explicit_cs_aux:N #1 { - \exp_args:Ne \__msg_expandable_error_module:nn + \bool_lazy_or:nnTF + { \token_if_chardef_p:N #1 } + { \token_if_mathchardef_p:N #1 } { - \exp_args:Nc \exp_args:Noooo - { \c__msg_text_prefix_tl #1 / #2 } - { \tl_to_str:n {#3} } - { \tl_to_str:n {#4} } - { \tl_to_str:n {#5} } - { \tl_to_str:n {#6} } + \char_generate:nn {#1} + { \char_value_catcode:n {#1} } } {#1} } -\cs_new:Npn \msg_expandable_error:nnnnn #1#2#3#4#5 - { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } } -\cs_new:Npn \msg_expandable_error:nnnn #1#2#3#4 - { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } } -\cs_new:Npn \msg_expandable_error:nnn #1#2#3 - { \msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } } -\cs_new:Npn \msg_expandable_error:nn #1#2 - { \msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } } -\cs_generate_variant:Nn \msg_expandable_error:nnnnnn { nnffff } -\cs_generate_variant:Nn \msg_expandable_error:nnnnn { nnfff } -\cs_generate_variant:Nn \msg_expandable_error:nnnn { nnff } -\cs_generate_variant:Nn \msg_expandable_error:nnn { nnf } -\cs_new:Npn \__msg_expandable_error_module:nn #1#2 - { - \exp_after:wN \exp_after:wN - \exp_after:wN \use_none_delimit_by_q_stop:w - \use:n { \::error ! ~ #2 : ~ #1 } \q_stop - } -\cs_new_protected:Npn \msg_show_eval:Nn #1#2 - { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_show:n } -\cs_new_protected:Npn \msg_log_eval:Nn #1#2 - { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_log:n } -\cs_new_protected:Npn \__msg_show_eval:nnN #1#2#3 { #3 { #2 = #1 } } -\cs_new:Npx \msg_show_item:n #1 - { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } } -\cs_new:Npx \msg_show_item_unbraced:n #1 - { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} } -\cs_new:Npx \msg_show_item:nn #1#2 +\cs_new:Npn \__text_token_to_explicit_char:N #1 { - \iow_newline: > \use:nn { ~ } { ~ } - \exp_not:N \tl_to_str:n { {#1} } - \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ } - \exp_not:N \tl_to_str:n { {#2} } + \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 \__text_token_to_explicit:n + \fi: + {#1} } -\cs_new:Npx \msg_show_item_unbraced:nn #1#2 +\cs_new:Npn \__text_token_to_explicit:n #1 { - \iow_newline: > \use:nn { ~ } { ~ } - \exp_not:N \tl_to_str:n {#1} - \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ } - \exp_not:N \tl_to_str:n {#2} + \exp_after:wN \__text_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_protected:Npn \bool_set_inverse:N #1 - { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 } -\cs_generate_variant:Nn \bool_set_inverse:N { c } -\cs_new_protected:Npn \bool_gset_inverse:N #1 - { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 } -\cs_generate_variant:Nn \bool_gset_inverse:N { c } -\cs_new:Npn \prop_rand_key_value:N #1 +\cs_new:Npn \__text_token_to_explicit_auxi:w #1 ; #2 \q_stop { - \prop_if_empty:NF #1 + \char_generate:nn { - \exp_after:wN \__prop_rand_item:w - \int_value:w \int_rand:nn { 1 } { \prop_count:N #1 } - #1 \q_stop + \if_int_compare:w #1 < 9 \exp_stop_f: + \exp_after:wN \__text_token_to_explicit_auxii:w + \else: + \exp_after:wN \__text_token_to_explicit_auxiii:w + \fi: + #2 } + {#1} } -\cs_generate_variant:Nn \prop_rand_key_value:N { c } -\cs_new:Npn \__prop_rand_item:w #1 \s__prop \__prop_pair:wn #2 \s__prop #3 - { - \int_compare:nNnF {#1} > 1 - { \use_i_delimit_by_q_stop:nw { \exp_not:n { {#2} {#3} } } } - \exp_after:wN \__prop_rand_item:w - \int_value:w \int_eval:n { #1 - 1 } \s__prop - } -\cs_new:Npn \seq_mapthread_function:NNN #1#2#3 - { \exp_after:wN \__seq_mapthread_function:wNN #2 \q_stop #1 #3 } -\cs_new:Npn \__seq_mapthread_function:wNN \s__seq #1 \q_stop #2#3 - { - \exp_after:wN \__seq_mapthread_function:wNw #2 \q_stop #3 - #1 { ? \prg_break: } { } - \prg_break_point: - } -\cs_new:Npn \__seq_mapthread_function:wNw \s__seq #1 \q_stop #2 +\exp_last_unbraced:NNNNo \cs_new:Npn \__text_token_to_explicit_auxii:w + #1 { \tl_to_str:n { character ~ } } { ` } +\cs_new:Npn \__text_token_to_explicit_auxiii:w #1 ~ #2 ~ { ` } +\cs_new:Npn \__text_char_catcode:N #1 { - \__seq_mapthread_function:Nnnwnn #2 - #1 { ? \prg_break: } { } - \q_stop + \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: } -\cs_new:Npn \__seq_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6 +\prg_new_conditional:Npnn \__text_if_expandable:N #1 { T , F , TF } { - \use_none:n #2 - \use_none:n #5 - #1 {#3} {#6} - \__seq_mapthread_function:Nnnwnn #1 #4 \q_stop + \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: } } -\cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc } -\cs_new_protected:Npn \seq_set_filter:NNn - { \__seq_set_filter:NNNn \tl_set:Nx } -\cs_new_protected:Npn \seq_gset_filter:NNn - { \__seq_set_filter:NNNn \tl_gset:Nx } -\cs_new_protected:Npn \__seq_set_filter:NNNn #1#2#3#4 +\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 + } +\tl_new:N \l_text_case_exclude_arg_tl +\tl_set:Nn \l_text_case_exclude_arg_tl { \cite \label \ref } +\tl_new:N \l_text_math_arg_tl +\tl_set:Nn \l_text_math_arg_tl { \ensuremath } +\tl_new:N \l_text_math_delims_tl +\tl_set:Nn \l_text_math_delims_tl { $ $ \( \) } +\tl_new:N \l_text_expand_exclude_tl +\tl_set:Nn \l_text_expand_exclude_tl + { \cite \label \ref } +\tl_new:N \l__text_math_mode_tl +\tex_chardef:D \c__text_chardef_space_token = `\ % +\tex_mathchardef:D \c__text_mathchardef_space_token = `\ % +\tex_chardef:D \c__text_chardef_group_begin_token = `\{ % `\} +\tex_mathchardef:D \c__text_mathchardef_group_begin_token = `\{ % `\} `\{ +\tex_chardef:D \c__text_chardef_group_end_token = `\} % `\{ +\tex_mathchardef:D \c__text_mathchardef_group_end_token = `\} % +\cs_new:Npn \text_expand:n #1 { - \__seq_push_item_def:n { \bool_if:nT {#4} { \__seq_wrap_item:n {##1} } } - #1 #2 { #3 } - \__seq_pop_item_def: + \__kernel_exp_not:w \exp_after:wN + { + \exp:w + \__text_expand:n {#1} + } } -\cs_new_protected:Npn \seq_set_map:NNn - { \__seq_set_map:NNNn \tl_set:Nx } -\cs_new_protected:Npn \seq_gset_map:NNn - { \__seq_set_map:NNNn \tl_gset:Nx } -\cs_new_protected:Npn \__seq_set_map:NNNn #1#2#3#4 +\cs_new:Npn \__text_expand:n #1 { - \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} } - #1 #2 { #3 } - \__seq_pop_item_def: + \group_align_safe_begin: + \__text_expand_loop:w #1 + \q_recursion_tail \q_recursion_stop + \__text_expand_result:n { } } -\cs_new_protected:Npn \seq_set_from_inline_x:Nnn - { \__seq_set_from_inline_x:NNnn \tl_set:Nx } -\cs_new_protected:Npn \seq_gset_from_inline_x:Nnn - { \__seq_set_from_inline_x:NNnn \tl_gset:Nx } -\cs_new_protected:Npn \__seq_set_from_inline_x:NNnn #1#2#3#4 +\cs_new:Npn \__text_expand_store:n #1 + { \__text_expand_store:nw {#1} } +\cs_generate_variant:Nn \__text_expand_store:n { o } +\cs_new:Npn \__text_expand_store:nw #1#2 \__text_expand_result:n #3 + { #2 \__text_expand_result:n { #3 #1 } } +\cs_new:Npn \__text_expand_end:w #1 \__text_expand_result:n #2 { - \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} } - #1 #2 { \s__seq #3 \__seq_item:n } - \__seq_pop_item_def: + \group_align_safe_end: + \exp_end: + #2 } -\cs_new_protected:Npn \seq_set_from_function:NnN #1#2#3 - { \seq_set_from_inline_x:Nnn #1 {#2} { #3 {##1} } } -\cs_new_protected:Npn \seq_gset_from_function:NnN #1#2#3 - { \seq_gset_from_inline_x:Nnn #1 {#2} { #3 {##1} } } -\cs_new:Npn \seq_indexed_map_function:NN #1#2 +\cs_new:Npn \__text_expand_loop:w #1 \q_recursion_stop { - \__seq_indexed_map:NN #1#2 - \prg_break_point:Nn \seq_map_break: { } + \tl_if_head_is_N_type:nTF {#1} + { \__text_expand_N_type:N } + { + \tl_if_head_is_group:nTF {#1} + { \__text_expand_group:n } + { \__text_expand_space:w } + } + #1 \q_recursion_stop } -\cs_new_protected:Npn \seq_indexed_map_inline:Nn #1#2 +\cs_new:Npn \__text_expand_group:n #1 { - \int_gincr:N \g__kernel_prg_map_int - \cs_gset_protected:cpn - { __seq_map_ \int_use:N \g__kernel_prg_map_int :w } ##1##2 {#2} - \exp_args:NNc \__seq_indexed_map:NN #1 - { __seq_map_ \int_use:N \g__kernel_prg_map_int :w } - \prg_break_point:Nn \seq_map_break: - { \int_gdecr:N \g__kernel_prg_map_int } + \__text_expand_store:o + { + \exp_after:wN + { + \exp:w + \__text_expand:n {#1} + } + } + \__text_expand_loop:w } -\cs_new:Npn \__seq_indexed_map:NN #1#2 +\exp_last_unbraced:NNo \cs_new:Npn \__text_expand_space:w \c_space_tl { - \exp_after:wN \__seq_indexed_map:Nw - \exp_after:wN #2 - \int_value:w 1 - \exp_after:wN \use_i:nn - \exp_after:wN ; - #1 - \prg_break: \__seq_item:n { } \prg_break_point: + \__text_expand_store:n { ~ } + \__text_expand_loop:w } -\cs_new:Npn \__seq_indexed_map:Nw #1#2 ; #3 \__seq_item:n #4 +\cs_new:Npx \__text_expand_N_type:N #1 { - #3 - #1 {#2} {#4} - \exp_after:wN \__seq_indexed_map:Nw - \exp_after:wN #1 - \int_value:w \int_eval:w 1 + #2 ; + \exp_not:N \quark_if_recursion_tail_stop_do:Nn #1 + { \exp_not:N \__text_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__text_chardef_space_token + } + { + \exp_not:N \token_if_eq_meaning_p:NN #1 + \c__text_mathchardef_space_token + } + } + { \exp_not:N \__text_expand_space:w \c_space_tl } + { \exp_not:N \__text_expand_N_type_auxi:N #1 } } -\str_const:Nx \c_sys_engine_version_str +\cs_new:Npn \__text_expand_N_type_auxi:N #1 { - \str_case:on \c_sys_engine_str + \bool_lazy_or:nnTF + { \token_if_eq_meaning_p:NN #1 \c__text_chardef_group_begin_token } + { \token_if_eq_meaning_p:NN #1 \c__text_mathchardef_group_begin_token } { - { pdftex } - { - \fp_eval:n { round(\int_use:N \tex_pdftexversion:D / 100 , 2) } - . - \tex_pdftexrevision:D - } - { ptex } - { - \cs_if_exist:NT \tex_ptexversion:D - { - p - \int_use:N \tex_ptexversion:D - . - \int_use:N \tex_ptexminorversion:D - \tex_ptexrevision:D - - - \int_use:N \tex_epTeXversion:D - } - } - { luatex } - { - \fp_eval:n { round(\int_use:N \tex_luatexversion:D / 100, 2) } - . - \tex_luatexrevision:D - } - { uptex } - { - \cs_if_exist:NT \tex_ptexversion:D - { - p - \int_use:N \tex_ptexversion:D - . - \int_use:N \tex_ptexminorversion:D - \tex_ptexrevision:D - - - u - \int_use:N \tex_uptexversion:D - \tex_uptexrevision:D - - - \int_use:N \tex_epTeXversion:D - } - } - { xetex } + \__text_expand_store:o \c_left_brace_str + \__text_expand_loop:w + } + { + \bool_lazy_or:nnTF + { \token_if_eq_meaning_p:NN #1 \c__text_chardef_group_end_token } + { \token_if_eq_meaning_p:NN #1 \c__text_mathchardef_group_end_token } { - \int_use:N \tex_XeTeXversion:D - \tex_XeTeXrevision:D + \__text_expand_store:o \c_right_brace_str + \__text_expand_loop:w } + { \__text_expand_N_type_auxii:N #1 } } } -\cs_new_protected:Npn \ior_shell_open:Nn #1#2 - { - \sys_if_shell:TF - { \exp_args:No \__ior_shell_open:nN { \tl_to_str:n {#2} } #1 } - { \__kernel_msg_error:nn { kernel } { pipe-failed } } - } -\cs_new_protected:Npn \__ior_shell_open:nN #1#2 +\cs_new:Npn \__text_expand_N_type_auxii:N #1 { - \tl_if_in:nnTF {#1} { " } + \token_if_eq_meaning:NNTF #1 \c_group_begin_token { - \__kernel_msg_error:nnx - { kernel } { quote-in-shell } {#1} + { \if_false: } \fi: + \__text_expand_loop:w + } + { + \token_if_eq_meaning:NNTF #1 \c_group_end_token + { + \if_false: { \fi: } + \__text_expand_loop:w + } + { \__text_expand_N_type_auxiii:N #1 } } - { \__kernel_ior_open:Nn #2 { "|#1" } } } -\__kernel_msg_new:nnnn { kernel } { pipe-failed } - { Cannot~run~piped~system~commands. } +\cs_new:Npn \__text_expand_N_type_auxiii:N #1 { - LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\ - Try~the~"--shell-escape"~(or~"--enable-pipes")~option. + \exp_after:wN \__text_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 \char_lower_case:N #1 - { \__char_change_case:nNN { lower } \char_value_lccode:n #1 } -\cs_new:Npn \char_upper_case:N #1 - { \__char_change_case:nNN { upper } \char_value_uccode:n #1 } -\cs_new:Npn \char_mixed_case:N #1 +\cs_new:Npn \__text_expand_math_search:NNN #1#2#3 { - \tl_if_exist:cTF { c__char_mixed_case_ \token_to_str:N #1 _tl } + \quark_if_recursion_tail_stop_do:Nn #2 + { \__text_expand_implicit:N #1 } + \token_if_eq_meaning:NNTF #1 #2 { - \__char_change_case_multi:vN - { c__char_mixed_case_ \token_to_str:N #1 _tl } #1 + \use_i_delimit_by_q_recursion_stop:nw + { + \__text_expand_store:n {#1} + \__text_expand_math_loop:Nw #3 + } } - { \char_upper_case:N #1 } + { \__text_expand_math_search:NNN #1 } } -\cs_new:Npn \char_fold_case:N #1 - { \__char_change_case:nNN { fold } \char_value_lccode:n #1 } -\cs_new:Npn \__char_change_case:nNN #1#2#3 +\cs_new:Npn \__text_expand_math_loop:Nw #1#2 \q_recursion_stop { - \tl_if_exist:cTF { c__char_ #1 _case_ \token_to_str:N #3 _tl } + \tl_if_head_is_N_type:nTF {#2} + { \__text_expand_math_N_type:NN } { - \__char_change_case_multi:vN - { c__char_ #1 _case_ \token_to_str:N #3 _tl } #3 + \tl_if_head_is_group:nTF {#2} + { \__text_expand_math_group:Nn } + { \__text_expand_math_space:Nw } } - { \exp_args:Nf \__char_change_case:nN { #2 { `#3 } } #3 } + #1#2 \q_recursion_stop } -\cs_new:Npn \__char_change_case:nN #1#2 +\cs_new:Npn \__text_expand_math_N_type:NN #1#2 { - \int_compare:nNnTF {#1} = 0 - { #2 } - { \char_generate:nn {#1} { \__char_change_case_catcode:N #2 } } + \quark_if_recursion_tail_stop_do:Nn #2 + { \__text_expand_end:w } + \__text_expand_store:n {#2} + \token_if_eq_meaning:NNTF #2 #1 + { \__text_expand_loop:w } + { \__text_expand_math_loop:Nw #1 } } -\cs_new:Npn \__char_change_case_multi:nN #1#2 - { \__char_change_case_multi:NNNNw #2 #1 \q_no_value \q_no_value \q_stop } -\cs_generate_variant:Nn \__char_change_case_multi:nN { v } -\cs_new:Npn \__char_change_case_multi:NNNNw #1#2#3#4#5 \q_stop +\cs_new:Npn \__text_expand_math_group:Nn #1#2 { - \quark_if_no_value:NTF #4 - { - \quark_if_no_value:NTF #3 - { \__char_change_case:NN #1 #2 } - { \__char_change_case:NNN #1 #2#3 } - } - { \__char_change_case:NNNN #1 #2#3#4 } + \__text_expand_store:n { {#2} } + \__text_expand_math_loop:Nw #1 } -\cs_new:Npn \__char_change_case:NNN #1#2#3 +\exp_after:wN \cs_new:Npn \exp_after:wN \__text_expand_math_space:Nw + \exp_after:wN # \exp_after:wN 1 \c_space_tl { - \exp_args:Nnf \use:nn - { \__char_change_case:NN #1 #2 } - { \__char_change_case:NN #1 #3 } + \__text_expand_store:n { ~ } + \__text_expand_math_loop:Nw #1 } -\cs_new:Npn \__char_change_case:NNNN #1#2#3#4 +\cs_new:Npn \__text_expand_implicit:N #1 { - \exp_args:Nnff \use:nnn - { \__char_change_case:NN #1 #2 } - { \__char_change_case:NN #1 #3 } - { \__char_change_case:NN #1 #4 } + \exp_args:NNe \use:nn \__text_expand_explicit:N + { \__text_token_to_explicit:N #1 } } -\cs_new:Npn \__char_change_case:NN #1#2 - { \char_generate:nn { `#2 } { \__char_change_case_catcode:N #1 } } -\cs_new:Npn \__char_change_case_catcode:N #1 +\cs_new:Npn \__text_expand_explicit: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: + \token_if_cs:NTF #1 + { \__text_expand_exclude:N #1 } + { + \__text_expand_store:n {#1} + \__text_expand_loop:w + } } -\cs_new:Npn \char_str_lower_case:N #1 - { \__char_str_change_case:nNN { lower } \char_value_lccode:n #1 } -\cs_new:Npn \char_str_upper_case:N #1 - { \__char_str_change_case:nNN { upper } \char_value_uccode:n #1 } -\cs_new:Npn \char_str_mixed_case:N #1 +\cs_new:Npn \__text_expand_exclude:N #1 { - \tl_if_exist:cTF { c__char_mixed_case_ \token_to_str:N #1 _tl } - { \tl_to_str:c { c__char_mixed_case_ \token_to_str:N #1 _tl } } - { \char_str_upper_case:N #1 } + \exp_args:Ne \__text_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 } -\cs_new:Npn \char_str_fold_case:N #1 - { \__char_str_change_case:nNN { fold } \char_value_lccode:n #1 } -\cs_new:Npn \__char_str_change_case:nNN #1#2#3 +\cs_new:Npn \__text_expand_exclude:nN #1#2 { - \tl_if_exist:cTF { c__char_ #1 _case_ \token_to_str:N #3 _tl } - { \tl_to_str:c { c__char_ #1 _case_ \token_to_str:N #3 _tl } } - { \exp_args:Nf \__char_str_change_case:nN { #2 { `#3 } } #3 } + \__text_expand_exclude:NN #2 #1 + \q_recursion_tail \q_recursion_stop } -\cs_new:Npn \__char_str_change_case:nN #1#2 +\cs_new:Npn \__text_expand_exclude:NN #1#2 { - \int_compare:nNnTF {#1} = 0 - { \tl_to_str:n {#2} } - { \char_generate:nn {#1} { 12 } } + \quark_if_recursion_tail_stop_do:Nn #2 + { \__text_expand_letterlike:N #1 } + \cs_if_eq:NNTF #2 #1 + { + \use_i_delimit_by_q_recursion_stop:nw + { \__text_expand_exclude:Nn #1 } + } + { \__text_expand_exclude:NN #1 } } -\cs_if_exist:NF \tex_Uchar:D +\cs_new:Npn \__text_expand_exclude:Nn #1#2 { - \cs_set:Npn \__char_str_change_case:nN #1#2 - { \tl_to_str:n {#2} } + \__text_expand_store:n { #1 {#2} } + \__text_expand_loop:w } -\cs_new:Npn \char_codepoint_to_bytes:n #1 +\cs_new:Npn \__text_expand_letterlike:N #1 { - \exp_args:Nf \__char_codepoint_to_bytes_auxi:n - { \int_eval:n {#1} } + \exp_after:wN \__text_expand_letterlike:NN \exp_after:wN + #1 \l_text_letterlike_tl + \q_recursion_tail \q_recursion_stop } -\cs_new:Npn \__char_codepoint_to_bytes_auxi:n #1 +\cs_new:Npn \__text_expand_letterlike:NN #1#2 { - \if_int_compare:w #1 > "80 \exp_stop_f: - \if_int_compare:w #1 < "800 \exp_stop_f: - \__char_codepoint_to_bytes_outputi:nw - { \__char_codepoint_to_bytes_auxii:Nnn C {#1} { 64 } } - \__char_codepoint_to_bytes_outputii:nw - { \__char_codepoint_to_bytes_auxiii:n {#1} } - \else: - \if_int_compare:w #1 < "10000 \exp_stop_f: - \__char_codepoint_to_bytes_outputi:nw - { \__char_codepoint_to_bytes_auxii:Nnn E {#1} { 64 * 64 } } - \__char_codepoint_to_bytes_outputii:nw - { - \__char_codepoint_to_bytes_auxiii:n - { \int_div_truncate:nn {#1} { 64 } } - } - \__char_codepoint_to_bytes_outputiii:nw - { \__char_codepoint_to_bytes_auxiii:n {#1} } - \else: - \__char_codepoint_to_bytes_outputi:nw - { - \__char_codepoint_to_bytes_auxii:Nnn F - {#1} { 64 * 64 * 64 } - } - \__char_codepoint_to_bytes_outputii:nw - { - \__char_codepoint_to_bytes_auxiii:n - { \int_div_truncate:nn {#1} { 64 * 64 } } - } - \__char_codepoint_to_bytes_outputiii:nw - { - \__char_codepoint_to_bytes_auxiii:n - { \int_div_truncate:nn {#1} { 64 } } - } - \__char_codepoint_to_bytes_outputiv:nw - { \__char_codepoint_to_bytes_auxiii:n {#1} } - \fi: - \fi: - \else: - \__char_codepoint_to_bytes_outputi:nw {#1} - \fi: - \__char_codepoint_to_bytes_end: { } { } { } { } - } -\cs_new:Npn \__char_codepoint_to_bytes_auxii:Nnn #1#2#3 - { "#10 + \int_div_truncate:nn {#2} {#3} } -\cs_new:Npn \__char_codepoint_to_bytes_auxiii:n #1 - { \int_mod:nn {#1} { 64 } + 128 } -\cs_new:Npn \__char_codepoint_to_bytes_outputi:nw - #1 #2 \__char_codepoint_to_bytes_end: #3 - { \__char_codepoint_to_bytes_output:fnn { \int_eval:n {#1} } { } {#2} } -\cs_new:Npn \__char_codepoint_to_bytes_outputii:nw - #1 #2 \__char_codepoint_to_bytes_end: #3#4 - { \__char_codepoint_to_bytes_output:fnn { \int_eval:n {#1} } { {#3} } {#2} } -\cs_new:Npn \__char_codepoint_to_bytes_outputiii:nw - #1 #2 \__char_codepoint_to_bytes_end: #3#4#5 - { - \__char_codepoint_to_bytes_output:fnn - { \int_eval:n {#1} } { {#3} {#4} } {#2} + \quark_if_recursion_tail_stop_do:Nn #2 + { \__text_expand_cs:N #1 } + \cs_if_eq:NNTF #2 #1 + { + \use_i_delimit_by_q_recursion_stop:nw + { + \__text_expand_store:n {#1} + \__text_expand_loop:w + } + } + { \__text_expand_letterlike:NN #1 } } -\cs_new:Npn \__char_codepoint_to_bytes_outputiv:nw - #1 #2 \__char_codepoint_to_bytes_end: #3#4#5#6 +\cs_new:Npn \__text_expand_cs:N #1 { - \__char_codepoint_to_bytes_output:fnn - { \int_eval:n {#1} } { {#3} {#4} {#5} } {#2} + \str_if_eq:nnTF {#1} { \protect } + { \__text_expand_protect:N } + { \__text_expand_cs_expand:N #1 } } -\cs_new:Npn \__char_codepoint_to_bytes_output:nnn #1#2#3 +\cs_new:Npn \__text_expand_protect:N #1 { - #3 - \__char_codepoint_to_bytes_end: #2 {#1} - } -\cs_generate_variant:Nn \__char_codepoint_to_bytes_output:nnn { f } -\cs_new:Npn \__char_codepoint_to_bytes_end: { } -\cs_new:Npn \tl_lower_case:n { \__tl_change_case:nnn { lower } { } } -\cs_new:Npn \tl_upper_case:n { \__tl_change_case:nnn { upper } { } } -\cs_new:Npn \tl_mixed_case:n { \__tl_change_case:nnn { mixed } { } } -\cs_new:Npn \tl_lower_case:nn { \__tl_change_case:nnn { lower } } -\cs_new:Npn \tl_upper_case:nn { \__tl_change_case:nnn { upper } } -\cs_new:Npn \tl_mixed_case:nn { \__tl_change_case:nnn { mixed } } -\cs_new:Npn \__tl_change_case:nnn #1#2#3 + \exp_args:Ne \__text_expand_protect:nN + { \cs_to_str:N #1 } #1 + } +\cs_new:Npn \__text_expand_protect:nN #1#2 + { \__text_expand_protect:Nw #2 #1 \q_nil #1 ~ \q_nil \q_nil \q_stop } +\cs_new:Npn \__text_expand_protect:Nw #1 #2 ~ \q_nil #3 \q_nil #4 \q_stop { - \__kernel_exp_not:w \exp_after:wN + \quark_if_nil:nTF {#4} { - \exp:w - \__tl_change_case_aux:nnn {#1} {#2} {#3} + \cs_if_exist:cTF {#2} + { \exp_args:Ne \__text_expand_store:n { \exp_not:c {#2} } } + { \__text_expand_store:n { \protect #1 } } } + { \__text_expand_store:n { \protect #1 } } + \__text_expand_loop:w } -\cs_new:Npn \__tl_change_case_aux:nnn #1#2#3 +\cs_new:Npn \__text_expand_cs_expand:N #1 { - \group_align_safe_begin: - \__tl_change_case_loop:wnn - #3 \q_recursion_tail \q_recursion_stop {#1} {#2} - \__tl_change_case_result:n { } + \__text_if_expandable:NTF #1 + { \exp_after:wN \__text_expand_loop:w #1 } + { + \__text_expand_store:n {#1} + \__text_expand_loop:w + } } -\cs_new:Npn \__tl_change_case_loop:wnn #1 \q_recursion_stop +%% File: l3text-case.dtx +\cs_new:Npn \text_lowercase:n #1 + { \__text_change_case:nnn { lower } { } {#1} } +\cs_new:Npn \text_uppercase:n #1 + { \__text_change_case:nnn { upper } { } {#1} } +\cs_new:Npn \text_titlecase:n #1 + { \__text_change_case:nnn { title } { } {#1} } +\cs_new:Npn \text_titlecase_first:n #1 + { \__text_change_case:nnn { titleonly } { } {#1} } +\cs_new:Npn \text_lowercase:nn #1#2 + { \__text_change_case:nnn { lower } {#1} {#2} } +\cs_new:Npn \text_uppercase:nn #1#2 + { \__text_change_case:nnn { upper } {#1} {#2} } +\cs_new:Npn \text_titlecase:nn #1#2 + { \__text_change_case:nnn { title } {#1} {#2} } +\cs_new:Npn \text_titlecase_first:nn #1#2 + { \__text_change_case:nnn { titleonly } {#1} {#2} } +\cs_new:Npn \__text_change_case:nnn #1#2#3 { - \tl_if_head_is_N_type:nTF {#1} - { \__tl_change_case_N_type:Nwnn } + \__kernel_exp_not:w \exp_after:wN { - \tl_if_head_is_group:nTF {#1} - { \__tl_change_case_group:nwnn } - { \__tl_change_case_space:wnn } + \exp:w + \exp_args:Ne \__text_change_case_aux:nnn + { \text_expand:n {#3} } + {#1} {#2} } - #1 \q_recursion_stop } -\cs_new:Npn \__tl_change_case_output:nwn #1#2 \__tl_change_case_result:n #3 - { #2 \__tl_change_case_result:n { #3 #1 } } -\cs_generate_variant:Nn \__tl_change_case_output:nwn { V , o , v , f } -\cs_new:Npn \__tl_change_case_end:wn #1 \__tl_change_case_result:n #2 +\cs_new:Npn \__text_change_case_aux:nnn #1#2#3 + { + \group_align_safe_begin: + \__text_change_case_loop:nnw {#2} {#3} #1 + \q_recursion_tail \q_recursion_stop + \__text_change_case_result:n { } + } +\cs_new:Npn \__text_change_case_store:n #1 + { \__text_change_case_store:nw {#1} } +\cs_generate_variant:Nn \__text_change_case_store:n { o , e , V , v } +\cs_new:Npn \__text_change_case_store:nw #1#2 \__text_change_case_result:n #3 + { #2 \__text_change_case_result:n { #3 #1 } } +\cs_new:Npn \__text_change_case_end:w #1 \__text_change_case_result:n #2 { \group_align_safe_end: \exp_end: #2 } -\cs_new:Npn \__tl_change_case_group:nwnn #1#2 \q_recursion_stop #3#4 +\cs_new:Npn \__text_change_case_loop:nnw #1#2#3 \q_recursion_stop + { + \tl_if_head_is_N_type:nTF {#3} + { \__text_change_case_N_type:nnN } + { + \tl_if_head_is_group:nTF {#3} + { \use:c { __text_change_case_group_ #1 :nnn } } + { \__text_change_case_space:nnw } + } + {#1} {#2} #3 \q_recursion_stop + } +\cs_new:Npn \__text_change_case_break:w #1 \q_recursion_tail \q_recursion_stop { - \use:c { __tl_change_case_group_ #3 : nnnn } {#1} {#2} {#3} {#4} + \__text_change_case_store:n {#1} + \__text_change_case_end:w + } +\cs_new:Npn \__text_change_case_group_lower:nnn #1#2#3 + { + \__text_change_case_store:o + { + \exp_after:wN + { + \exp:w + \__text_change_case_aux:nnn {#3} {#1} {#2} + } + } + \__text_change_case_loop:nnw {#1} {#2} } -\cs_new:Npn \__tl_change_case_group_lower:nnnn #1#2#3#4 +\cs_new_eq:NN \__text_change_case_group_upper:nnn + \__text_change_case_group_lower:nnn +\cs_new:Npn \__text_change_case_group_title:nnn #1#2#3 { - \__tl_change_case_output:own + \__text_change_case_store:o { \exp_after:wN { \exp:w - \__tl_change_case_aux:nnn {#3} {#4} {#1} + \__text_change_case_aux:nnn {#3} {#1} {#2} } } - \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4} + \__text_change_case_loop:nnw { lower } {#2} } -\cs_new_eq:NN \__tl_change_case_group_upper:nnnn - \__tl_change_case_group_lower:nnnn -\cs_new:Npn \__tl_change_case_group_mixed:nnnn #1#2#3#4 +\cs_new:Npn \__text_change_case_group_titleonly:nnn #1#2#3 { - \__tl_change_case_output:own + \__text_change_case_store:o { \exp_after:wN { \exp:w - \__tl_change_case_aux:nnn {#3} {#4} {#1} + \__text_change_case_aux:nnn {#3} {#1} {#2} } } - \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#4} + \__text_change_case_break:w } -\exp_last_unbraced:NNo \cs_new:Npn \__tl_change_case_space:wnn \c_space_tl +\use:x { - \__tl_change_case_output:nwn { ~ } - \__tl_change_case_loop:wnn + \cs_new:Npn \exp_not:N \__text_change_case_space:nnw ##1##2 \c_space_tl } -\cs_new:Npn \__tl_change_case_N_type:Nwnn #1#2 \q_recursion_stop { - \quark_if_recursion_tail_stop_do:Nn #1 - { \__tl_change_case_end:wn } - \exp_after:wN \__tl_change_case_N_type:NNNnnn - \exp_after:wN #1 \l_tl_case_change_math_tl - \q_recursion_tail ? \q_recursion_stop {#2} + \__text_change_case_store:n { ~ } + \__text_change_case_loop:nnw {#1} {#2} } -\cs_new:Npn \__tl_change_case_N_type:NNNnnn #1#2#3 +\cs_new:Npn \__text_change_case_N_type:nnN #1#2#3 { - \quark_if_recursion_tail_stop_do:Nn #2 - { \__tl_change_case_N_type:Nnnn #1 } - \token_if_eq_meaning:NNTF #1 #2 + \quark_if_recursion_tail_stop_do:Nn #3 + { \__text_change_case_end:w } + \__text_change_case_N_type_aux:nnN {#1} {#2} #3 + } +\cs_new:Npn \__text_change_case_N_type_aux:nnN #1#2#3 + { + \exp_args:NV \__text_change_case_N_type:nnnN + \l_text_math_delims_tl {#1} {#2} #3 + } +\cs_new:Npn \__text_change_case_N_type:nnnN #1#2#3#4 + { + \__text_change_case_math_search:nnNNN {#2} {#3} #4 #1 + \q_recursion_tail \q_recursion_tail + \q_recursion_stop + } +\cs_new:Npn \__text_change_case_math_search:nnNNN #1#2#3#4#5 + { + \quark_if_recursion_tail_stop_do:Nn #4 + { \__text_change_case_cs_check:nnN {#1} {#2} #3 } + \token_if_eq_meaning:NNTF #3 #4 { \use_i_delimit_by_q_recursion_stop:nw { - \__tl_change_case_math:NNNnnn - #1 #3 \__tl_change_case_loop:wnn + \__text_change_case_store:n {#3} + \__text_change_case_math_loop:nnNw {#1} {#2} #5 } } - { \__tl_change_case_N_type:NNNnnn #1 } - } -\cs_new:Npn \__tl_change_case_math:NNNnnn #1#2#3#4 - { - \__tl_change_case_output:nwn {#1} - \__tl_change_case_math_loop:wNNnn #4 \q_recursion_stop #2 #3 + { \__text_change_case_math_search:nnNNN {#1} {#2} #3 } } -\cs_new:Npn \__tl_change_case_math_loop:wNNnn #1 \q_recursion_stop +\cs_new:Npn \__text_change_case_math_loop:nnNw #1#2#3#4 \q_recursion_stop { - \tl_if_head_is_N_type:nTF {#1} - { \__tl_change_case_math:NwNNnn } + \tl_if_head_is_N_type:nTF {#4} + { \__text_change_case_math_N_type:nnNN } { - \tl_if_head_is_group:nTF {#1} - { \__tl_change_case_math_group:nwNNnn } - { \__tl_change_case_math_space:wNNnn } + \tl_if_head_is_group:nTF {#4} + { \__text_change_case_math_group:nnNn } + { \__text_change_case_math_space:nnNw } } - #1 \q_recursion_stop + {#1} {#2} #3 #4 \q_recursion_stop } -\cs_new:Npn \__tl_change_case_math:NwNNnn #1#2 \q_recursion_stop #3#4 +\cs_new:Npn \__text_change_case_math_N_type:nnNN #1#2#3#4 { - \token_if_eq_meaning:NNTF \q_recursion_tail #1 - { \__tl_change_case_end:wn } - { - \__tl_change_case_output:nwn {#1} - \token_if_eq_meaning:NNTF #1 #3 - { #4 #2 \q_recursion_stop } - { \__tl_change_case_math_loop:wNNnn #2 \q_recursion_stop #3#4 } - } + \quark_if_recursion_tail_stop_do:Nn #4 + { \__text_change_case_end:w } + \__text_change_case_store:n {#4} + \token_if_eq_meaning:NNTF #4 #3 + { \__text_change_case_loop:nnw {#1} {#2} } + { \__text_change_case_math_loop:nnNw {#1} {#2} #3 } } -\cs_new:Npn \__tl_change_case_math_group:nwNNnn #1#2 \q_recursion_stop +\cs_new:Npn \__text_change_case_math_group:nnNn #1#2#3#4 { - \__tl_change_case_output:nwn { {#1} } - \__tl_change_case_math_loop:wNNnn #2 \q_recursion_stop + \__text_change_case_store:n { {#4} } + \__text_change_case_math_loop:nnNw {#1} {#2} #3 } -\exp_last_unbraced:NNo - \cs_new:Npn \__tl_change_case_math_space:wNNnn \c_space_tl +\use:x { - \__tl_change_case_output:nwn { ~ } - \__tl_change_case_math_loop:wNNnn + \cs_new:Npn \exp_not:N \__text_change_case_math_space:nnNw ##1##2##3 + \c_space_tl } -\cs_new:Npn \__tl_change_case_N_type:Nnnn #1#2#3#4 { - \token_if_cs:NTF #1 - { \__tl_change_case_cs_letterlike:Nn #1 {#3} } - { \use:c { __tl_change_case_char_ #3 :Nnn } #1 {#3} {#4} } - \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4} + \__text_change_case_store:n { ~ } + \__text_change_case_math_loop:nnNw {#1} {#2} #3 } -\cs_new:Npn \__tl_change_case_char_lower:Nnn #1#2#3 +\cs_new:Npn \__text_change_case_cs_check:nnN #1#2#3 { - \cs_if_exist_use:cF { __tl_change_case_ #2 _ #3 :Nnw } - { \use_ii:nn } - #1 - { - \use:c { __tl_change_case_ #2 _ sigma:Nnw } #1 - { \__tl_change_case_char:nN {#2} #1 } - } + \token_if_cs:NTF #3 + { \__text_change_case_exclude:nnN } + { \use:c { __text_change_case_char_ #1 :nnN } } + {#1} {#2} #3 } -\cs_new_eq:NN \__tl_change_case_char_upper:Nnn - \__tl_change_case_char_lower:Nnn -\cs_new:Npn \__tl_change_case_char_mixed:Nnn #1#2#3 +\cs_new:Npn \__text_change_case_exclude:nnN #1#2#3 { - \__tl_change_case_mixed_switch:w - \cs_if_exist_use:cF { __tl_change_case_mixed_ #3 :Nnw } + \exp_args:Ne \__text_change_case_exclude:nnnN { - \cs_if_exist_use:cF { __tl_change_case_upper_ #3 :Nnw } - { \use_ii:nn } + \exp_not:V \l_text_math_arg_tl + \exp_not:V \l_text_case_exclude_arg_tl } - #1 - { \__tl_change_case_mixed_skip:N #1 } + {#1} {#2} #3 } -\bool_lazy_or:nnTF - { \sys_if_engine_luatex_p: } - { \sys_if_engine_xetex_p: } +\cs_new:Npn \__text_change_case_exclude:nnnN #1#2#3#4 + { + \__text_change_case_exclude:nnNN {#2} {#3} #4 #1 + \q_recursion_tail \q_recursion_stop + } +\cs_new:Npn \__text_change_case_exclude:nnNN #1#2#3#4 { - \cs_new:Npn \__tl_change_case_char:nN #1#2 + \quark_if_recursion_tail_stop_do:Nn #4 + { \use:c { __text_change_case_letterlike_ #1 :nnN } {#1} {#2} #3 } + \cs_if_eq:NNTF #3 #4 { - \__tl_change_case_output:fwn - { \use:c { char_ #1 _case:N } #2 } + \use_i_delimit_by_q_recursion_stop:nw + { \__text_change_case_exclude:nnNn {#1} {#2} #3 } } + { \__text_change_case_exclude:nnNN {#1} {#2} #3 } } +\cs_new:Npn \__text_change_case_exclude:nnNn #1#2#3#4 { - \cs_new:Npn \__tl_change_case_char:nN #1#2 - { - \int_compare:nNnTF { `#2 } > { "80 } - { - \int_compare:nNnTF { `#2 } < { "E0 } - { \__tl_change_case_char_UTFviii:nNNN {#1} #2 } - { - \int_compare:nNnTF { `#2 } < { "F0 } - { \__tl_change_case_char_UTFviii:nNNNN {#1} #2 } - { \__tl_change_case_char_UTFviii:nNNNNN {#1} #2 } - } - } - { - \__tl_change_case_output:fwn - { \use:c { char_ #1 _case:N } #2 } - } - } + \__text_change_case_store:n { #3 {#4} } + \__text_change_case_loop:nnw {#1} {#2} } -\bool_lazy_or:nnF - { \sys_if_engine_luatex_p: } - { \sys_if_engine_xetex_p: } +\cs_new:Npn \__text_change_case_letterlike_lower:nnN #1#2#3 + { \__text_change_case_letterlike:nnnnN {#1} {#1} {#1} {#2} #3 } +\cs_new_eq:NN \__text_change_case_letterlike_upper:nnN + \__text_change_case_letterlike_lower:nnN +\cs_new:Npn \__text_change_case_letterlike_title:nnN #1#2#3 + { \__text_change_case_letterlike:nnnnN { upper } { lower } {#1} {#2} #3 } +\cs_new:Npn \__text_change_case_letterlike_titleonly:nnN #1#2#3 + { \__text_change_case_letterlike:nnnnN { upper } { end } {#1} {#2} #3 } +\cs_new:Npn \__text_change_case_letterlike:nnnnN #1#2#3#4#5 { - \cs_new:Npn \__tl_change_case_char_UTFviii:nNNN #1#2#3#4 - { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4} #3 } - \cs_new:Npn \__tl_change_case_char_UTFviii:nNNNN #1#2#3#4#5 - { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4#5} #3 } - \cs_new:Npn \__tl_change_case_char_UTFviii:nNNNNN #1#2#3#4#5#6 - { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4#5#6} #3 } - \cs_new:Npn \__tl_change_case_char_UTFviii:nnN #1#2#3 + \cs_if_exist:cTF { c__text_ #1 case_ \token_to_str:N #5 _tl } { - \cs_if_exist:cTF { c__tl_ #1 _case_ \tl_to_str:n {#2} _tl } + \__text_change_case_store:v + { c__text_ #1 case_ \token_to_str:N #5 _tl } + \use:c { __text_change_case_char_next_ #2 :nn } {#2} {#4} + } + { + \__text_change_case_store:n {#5} + \cs_if_exist:cTF { - \__tl_change_case_output:vwn - { c__tl_ #1 _case_ \tl_to_str:n {#2} _tl } + c__text_ + \str_if_eq:nnTF {#1} { lower } { upper } { lower } + case_ \token_to_str:N #5 _tl } - { \__tl_change_case_output:nwn {#2} } - #3 + { \use:c { __text_change_case_char_next_ #2 :nn } {#2} {#4} } + { \__text_change_case_loop:nnw {#3} {#4} } } } -\cs_new:Npn \__tl_change_case_cs_letterlike:Nn #1#2 +\cs_new:Npx \__text_change_case_char_lower:nnN #1#2#3 { - \str_if_eq:nnTF {#2} { mixed } + \exp_not:N \cs_if_exist_use:cF { __text_change_case_lower_ #2 :nnnN } { - \__tl_change_case_cs_letterlike:NnN #1 { upper } - \__tl_change_case_mixed_switch:w - } - { \__tl_change_case_cs_letterlike:NnN #1 {#2} \prg_do_nothing: } + \bool_lazy_or:nnTF + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } + { \exp_not:N \__text_change_case_lower_sigma:nnnN } + { \exp_not:N \__text_change_case_char:nnnN } + } + {#1} {#1} {#2} #3 } -\cs_new:Npn \__tl_change_case_cs_letterlike:NnN #1#2#3 +\cs_new:Npn \__text_change_case_char_upper:nnN #1#2#3 { - \cs_if_exist:cTF { c__tl_change_case_ #2 _ \token_to_str:N #1 _tl } + \cs_if_exist_use:cF { __text_change_case_upper_ #2 :nnnN } + { \__text_change_case_char:nnnN } + {#1} {#1} {#2} #3 + } +\bool_lazy_or:nnT + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } + { + \cs_new:Npn \__text_change_case_lower_sigma:nnnN #1#2#3#4 { - \__tl_change_case_output:vwn - { c__tl_change_case_ #2 _ \token_to_str:N #1 _tl } - #3 + \int_compare:nNnTF { `#4 } = { "03A3 } + { \__text_change_case_lower_sigma:nnNw {#2} {#3} #4 } + { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } } + \cs_new:Npn \__text_change_case_lower_sigma:nnNw #1#2#3#4 \q_recursion_stop { - \cs_if_exist:cTF + \tl_if_head_is_N_type:nTF {#4} + { \__text_change_case_lower_sigma:NnnN #3 } { - c__tl_change_case_ - \str_if_eq:nnTF {#2} { lower } { upper } { lower } - _ \token_to_str:N #1 _tl - } - { - \__tl_change_case_output:nwn {#1} - #3 + \__text_change_case_store:e + { \char_generate:nn { "03C2 } { \__text_char_catcode:N #3 } } + \__text_change_case_loop:nnw } + {#1} {#2} #4 \q_recursion_stop + } + \cs_new:Npn \__text_change_case_lower_sigma:NnnN #1#2#3#4 + { + \__text_change_case_store:e { - \exp_after:wN \__tl_change_case_cs_accents:NN - \exp_after:wN #1 \l_tl_case_change_accents_tl - \q_recursion_tail \q_recursion_stop + \token_if_letter:NTF #4 + { \char_generate:nn { "03C3 } { \__text_char_catcode:N #1 } } + { \char_generate:nn { "03C2 } { \__text_char_catcode:N #1 } } } + \__text_change_case_loop:nnw {#2} {#3} #4 } } -\cs_new:Npn \__tl_change_case_cs_accents:NN #1#2 +\cs_new:Npx \__text_change_case_char_title:nnN #1#2#3 { - \quark_if_recursion_tail_stop_do:Nn #2 - { \__tl_change_case_cs:N #1 } - \str_if_eq:nnTF {#1} {#2} + \bool_lazy_or:nnTF + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } + { \exp_not:N \token_if_letter:NTF #3 } { - \use_i_delimit_by_q_recursion_stop:nw - { \__tl_change_case_output:nwn {#1} } + \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 } } - { \__tl_change_case_cs_accents:NN #1 } + { \exp_not:N \use:c { __text_change_case_char_ #1 :nN } } + { \exp_not:N \__text_change_case_char_title:nnnN { title } {#1} } + {#2} #3 } -\cs_new:Npn \__tl_change_case_cs:N #1 +\cs_new_eq:NN \__text_change_case_char_titleonly:nnN + \__text_change_case_char_title:nnN +\cs_new:Npn \__text_change_case_char_title:nN #1#2 + { \__text_change_case_char_title:nnnN { title } { lower } {#1} #2 } +\cs_new:Npn \__text_change_case_char_titleonly:nN #1#2 + { \__text_change_case_char_title:nnnN { title } { end } {#1} #2 } +\cs_new:Npn \__text_change_case_char_title:nnnN #1#2#3#4 { - \str_if_eq:nnTF {#1} { \protect } { \__tl_change_case_protect:wNN } - \exp_after:wN \__tl_change_case_cs:NN - \exp_after:wN #1 \l_tl_case_change_exclude_tl - \q_recursion_tail \q_recursion_stop - } -\cs_new:Npn \__tl_change_case_cs:NN #1#2 - { - \quark_if_recursion_tail_stop_do:Nn #2 + \cs_if_exist_use:cF { __text_change_case_title_ #3 :nnnN } { - \__tl_change_case_cs_expand:Nnw #1 - { \__tl_change_case_output:nwn {#1} } + \cs_if_exist_use:cF { __text_change_case_upper_ #3 :nnnN } + { \__text_change_case_char:nnnN } } - \str_if_eq:nnTF {#1} {#2} + {#1} {#2} {#3} #4 + } +\bool_lazy_or:nnTF + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } + { + \cs_new:Npn \__text_change_case_char:nnnN #1#2#3#4 { - \use_i_delimit_by_q_recursion_stop:nw - { \__tl_change_case_cs:NNn #1 } + \__text_change_case_store:e + { \use:c { char_ #1 case :N } #4 } + \use:c { __text_change_case_char_next_ #2 :nn } {#2} {#3} } - { \__tl_change_case_cs:NN #1 } } -\cs_new:Npn \__tl_change_case_cs:NNn #1#2#3 { - \__tl_change_case_output:nwn { #1 {#3} } - #2 - } -\cs_new:Npn \__tl_change_case_protect:wNN #1 \q_recursion_stop #2 #3 - { \__tl_change_case_output:nwn { \protect #3 } #2 } -\cs_new:Npn \__tl_change_case_if_expandable:NTF #1 + \cs_new:Npn \__text_change_case_char:nnnN #1#2#3#4 + { + \int_compare:nNnTF { `#4 } > { "80 } + { + \int_compare:nNnTF { `#4 } < { "E0 } + { \__text_change_case_char_UTFviii:nnnNN } + { + \int_compare:nNnTF { `#4 } < { "F0 } + { \__text_change_case_char_UTFviii:nnnNNN } + { \__text_change_case_char_UTFviii:nnnNNNN } + } + {#1} {#2} {#3} #4 + } + { + \__text_change_case_store:e{ \use:c { char_ #1 case :N } #4 } + \use:c { __text_change_case_char_next_ #2 :nn } {#2} {#3} + } + } + \cs_new:Npn \__text_change_case_char_UTFviii:nnnNN #1#2#3#4#5 + { \__text_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5} } + \cs_new:Npn \__text_change_case_char_UTFviii:nnnNNN #1#2#3#4#5#6 + { \__text_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6} } + \cs_new:Npn \__text_change_case_char_UTFviii:nnnNNNNN #1#2#3#4#5#6#7 + { \__text_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6#7} } + \cs_new:Npn \__text_change_case_char_UTFviii:nnnn #1#2#3#4 + { + \cs_if_exist:cTF { c__text_ #1 case_ \tl_to_str:n {#4} _tl } + { + \__text_change_case_store:v + { c__text_ #1 case_ \tl_to_str:n {#4} _tl } + } + { \__text_change_case_store:n {#4} } + \use:c { __text_change_case_char_next_ #2 :nn } {#2} {#3} + } + } +\cs_new:Npn \__text_change_case_char_next_lower:nn #1#2 + { \__text_change_case_loop:nnw {#1} {#2} } +\cs_new_eq:NN \__text_change_case_char_next_upper:nn + \__text_change_case_char_next_lower:nn +\cs_new_eq:NN \__text_change_case_char_next_title:nn + \__text_change_case_char_next_lower:nn +\cs_new_eq:NN \__text_change_case_char_next_titleonly:nn + \__text_change_case_char_next_lower:nn +\cs_new:Npn \__text_change_case_char_next_end:nn #1#2 + { \__text_change_case_break:w } +\bool_lazy_or:nnT + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } { - \token_if_expandable:NTF #1 + \cs_new:cpn { __text_change_case_upper_de-alt:nnnN } #1#2#3#4 { - \bool_lazy_any:nTF + \int_compare:nNnTF { `#4 } = { "00DF } { - { \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 } + \__text_change_case_store:e + { \char_generate:nn { "1E9E } { \__text_char_catcode:N #4 } } + \use:c { __text_change_case_char_next_ #2 :nn } + {#2} {#3} } - { \use_ii:nn } - { \use_i:nn } + { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } } - { \use_ii:nn } } -\cs_new:Npn \__tl_change_case_cs_expand:Nnw #1#2 - { - \__tl_change_case_if_expandable:NTF #1 - { \__tl_change_case_cs_expand:NN #1 } - { #2 } - } -\cs_new:Npn \__tl_change_case_cs_expand:NN #1#2 - { \exp_after:wN #2 #1 } -\cs_new:Npn \__tl_change_case_mixed_skip:N #1 - { - \exp_after:wN \__tl_change_case_mixed_skip:NN - \exp_after:wN #1 \l_tl_mixed_case_ignore_tl - \q_recursion_tail \q_recursion_stop - } -\cs_new:Npn \__tl_change_case_mixed_skip:NN #1#2 +\bool_lazy_or:nnT + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } { - \quark_if_recursion_tail_stop_do:nn {#2} - { \__tl_change_case_char:nN { mixed } #1 } - \int_compare:nNnT { `#1 } = { `#2 } + \cs_new:Npn \__text_change_case_upper_el:nnnN #1#2#3#4 { - \use_i_delimit_by_q_recursion_stop:nw + \__text_change_case_if_greek:nTF { `#4 } { - \__tl_change_case_output:nwn {#1} - \__tl_change_case_mixed_skip_tidy:Nwn + \exp_args:Ne \__text_change_case_upper_el:nnnn + { \char_to_nfd:N #4 } {#1} {#2} {#3} } + { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } } - \__tl_change_case_mixed_skip:NN #1 - } -\cs_new:Npn \__tl_change_case_mixed_skip_tidy:Nwn #1#2 \q_recursion_stop #3 - { - \__tl_change_case_loop:wnn #2 \q_recursion_stop { mixed } - } -\cs_new:Npn \__tl_change_case_mixed_switch:w - #1 \__tl_change_case_loop:wnn #2 \q_recursion_stop #3 - { - #1 - \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } - } -\cs_new:Npn \__tl_change_case_lower_sigma:Nnw #1#2#3#4 \q_recursion_stop - { - \int_compare:nNnTF { `#1 } = { "03A3 } + \cs_new:Npn \__text_change_case_upper_el:nnnn #1#2#3#4 + { \__text_change_case_upper_el_aux:nnnN {#2} {#3} {#4} #1 } + \cs_new:Npn \__text_change_case_upper_el_aux:nnnN #1#2#3#4 { - \__tl_change_case_output:fwn - { \__tl_change_case_lower_sigma:w #4 \q_recursion_stop } + \__text_change_case_store:e { \use:c { char_ #1 case:N } #4 } + \__text_change_case_upper_el_loop:nnw {#2} {#3} } - {#2} - #3 #4 \q_recursion_stop - } -\cs_new:Npn \__tl_change_case_lower_sigma:w #1 \q_recursion_stop - { - \tl_if_head_is_N_type:nTF {#1} - { \__tl_change_case_lower_sigma:Nw #1 \q_recursion_stop } - { \c__tl_final_sigma_tl } - } -\cs_new:Npn \__tl_change_case_lower_sigma:Nw #1#2 \q_recursion_stop - { - \__tl_change_case_if_expandable:NTF #1 + \cs_new:Npn \__text_change_case_upper_el_loop:nnw + #1#2#3 \q_recursion_stop { - \exp_after:wN \__tl_change_case_lower_sigma:w #1 - #2 \q_recursion_stop + \tl_if_head_is_N_type:nTF {#3} + { \__text_change_case_upper_el:nnN } + { \__text_change_case_loop:nnw } + {#1} {#2} #3 \q_recursion_stop } + \cs_new:Npn \__text_change_case_upper_el:nnN #1#2#3 { - \token_if_letter:NTF #1 - { \c__tl_std_sigma_tl } - { \c__tl_final_sigma_tl } + \token_if_cs:NTF #3 + { \__text_change_case_loop:nnw {#1} {#2} #3 } + { + \int_compare:nNnTF { `#3 } = { "0308 } + { + \__text_change_case_store:n {#3} + \__text_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 } } + } + { \__text_change_case_upper_el_loop:nnw {#1} {#2} } + { + \int_compare:nNnTF { `#3 } = { "0344 } + { + \__text_change_case_store:e + { + \char_generate:nn { "0308 } + { \__text_char_catcode:N #3 } + } + \__text_change_case_upper_el_loop:nnw {#1} {#2} + } + { + \int_compare:nNnTF { `#3 } = { "0345 } + { \__text_change_case_loop:nnw {#1} {#2} } + { \__text_change_case_loop:nnw {#1} {#2} #3 } + } + } + } + } + } + \prg_new_conditional:Npnn \__text_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: } } -\cs_new_eq:NN \__tl_change_case_upper_sigma:Nnw \use_ii:nn -\bool_lazy_or:nnTF +\bool_lazy_or:nnT { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { - \cs_new:Npn \__tl_change_case_lower_tr:Nnw #1#2 - { - \int_compare:nNnTF { `#1 } = { "0049 } - { \__tl_change_case_lower_tr_auxi:Nw } + \cs_new:Npn \__text_change_case_title_el:nnnN #1#2#3#4 + { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } + } +\bool_lazy_or:nnT + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } + { + \cs_new:Npn \__text_change_case_lower_lt:nnnN #1#2#3#4 + { + \exp_args:Ne \__text_change_case_lower_lt_auxi:nnnN { - \int_compare:nNnTF { `#1 } = { "0130 } - { \__tl_change_case_output:nwn { i } } - {#2} + \int_case:nn { `#4 } + { + { "00CC } { "0300 } + { "00CD } { "0301 } + { "0128 } { "0303 } + } } + {#2} {#3} #4 } - \cs_new:Npn \__tl_change_case_lower_tr_auxi:Nw #1#2 \q_recursion_stop - { - \tl_if_head_is_N_type:nTF {#2} - { \__tl_change_case_lower_tr_auxii:Nw #2 \q_recursion_stop } - { \__tl_change_case_output:Vwn \c__tl_dotless_i_tl } - #1 #2 \q_recursion_stop - } - \cs_new:Npn \__tl_change_case_lower_tr_auxii:Nw #1#2 \q_recursion_stop + \cs_new:Npn \__text_change_case_lower_lt_auxi:nnnN #1#2#3#4 { - \__tl_change_case_if_expandable:NTF #1 + \tl_if_blank:nTF {#1} { - \exp_after:wN \__tl_change_case_lower_tr_auxi:Nw #1 - #2 \q_recursion_stop + \exp_args:Ne \__text_change_case_lower_lt_auxii:nnnN + { + \int_case:nn { `#4 } + { + { "0049 } { "0069 } + { "004A } { "006A } + { "012E } { "012F } + } + } + {#2} {#3} #4 } { - \bool_lazy_or:nnTF - { \token_if_cs_p:N #1 } - { ! \int_compare_p:nNn { `#1 } = { "0307 } } - { \__tl_change_case_output:Vwn \c__tl_dotless_i_tl } + \__text_change_case_store:e { - \__tl_change_case_output:nwn { i } - \use_i:nn + \char_generate:nn { "0069 } { \__text_char_catcode:N #4 } + \char_generate:nn { "0307 } { \__text_char_catcode:N #4 } + \char_generate:nn {#1} { \__text_char_catcode:N #4 } } + \__text_change_case_loop:nnw {#2} {#3} } } - } - { - \cs_new:Npn \__tl_change_case_lower_tr:Nnw #1#2 + \cs_new:Npn \__text_change_case_lower_lt_auxii:nnnN #1#2#3#4 { - \int_compare:nNnTF { `#1 } = { "0049 } - { \__tl_change_case_output:Vwn \c__tl_dotless_i_tl } + \tl_if_blank:nTF {#1} + { \__text_change_case_lower_sigma:nnnN {#2} {#2} {#3} #4 } { - \int_compare:nNnTF { `#1 } = { 196 } - { \__tl_change_case_lower_tr_auxi:Nw #1 {#2} } - {#2} + \__text_change_case_store:e + { \char_generate:nn {#1} { \__text_char_catcode:N #4 } } + \__text_change_case_lower_lt:nnw {#2} {#3} } } - \cs_new:Npn \__tl_change_case_lower_tr_auxi:Nw #1#2#3#4 + \cs_new:Npn \__text_change_case_lower_lt:nnw #1#2#3 \q_recursion_stop + { + \tl_if_head_is_N_type:nTF {#3} + { \__text_change_case_lower_lt:nnN } + { \__text_change_case_loop:nnw } + {#1} {#2} #3 \q_recursion_stop + } + \cs_new:Npn \__text_change_case_lower_lt:nnN #1#2#3 { - \int_compare:nNnTF { `#4 } = { 176 } + \bool_lazy_and:nnT + { ! \token_if_cs_p:N #3 } { - \__tl_change_case_output:nwn { i } - #3 + \bool_lazy_any_p:n + { + { \int_compare_p:nNn { `#3 } = { "0300 } } + { \int_compare_p:nNn { `#3 } = { "0301 } } + { \int_compare_p:nNn { `#3 } = { "0303 } } + } } { - #2 - #3 #4 + \__text_change_case_store:e + { \char_generate:nn { "0307 } { \__text_char_catcode:N #3 } } } + \__text_change_case_loop:nnw {#1} {#2} #3 } } -\cs_new:Npn \__tl_change_case_upper_tr:Nnw #1#2 - { - \int_compare:nNnTF { `#1 } = { "0069 } - { \__tl_change_case_output:Vwn \c__tl_dotted_I_tl } - {#2} - } -\cs_new_eq:NN \__tl_change_case_lower_az:Nnw \__tl_change_case_lower_tr:Nnw -\cs_new_eq:NN \__tl_change_case_upper_az:Nnw \__tl_change_case_upper_tr:Nnw -\cs_new:Npn \__tl_change_case_lower_lt:Nnw #1 - { - \exp_args:Nf \__tl_change_case_lower_lt:nNnw - { \str_case:nVF #1 \c__tl_accents_lt_tl \exp_stop_f: } - #1 - } -\cs_new:Npn \__tl_change_case_lower_lt:nNnw #1#2 +\bool_lazy_or:nnT + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } { - \tl_if_blank:nTF {#1} - { - \exp_args:Nf \__tl_change_case_lower_lt:nnw + \cs_new:Npn \__text_change_case_upper_lt:nnnN #1#2#3#4 + { + \exp_args:Ne \__text_change_case_upper_lt_aux:nnnN { - \int_case:nnF {`#2} + \int_case:nn { `#4 } { - { "0049 } i - { "004A } j - { "012E } \c__tl_i_ogonek_tl + { "0069 } { "0049 } + { "006A } { "004A } + { "012F } { "012E } } - \exp_stop_f: } + {#2} {#3} #4 + } + \cs_new:Npn \__text_change_case_upper_lt_aux:nnnN #1#2#3#4 + { + \tl_if_blank:nTF {#1} + { \__text_change_case_char:nnnN { upper } {#2} {#3} #4 } + { + \__text_change_case_store:e + { \char_generate:nn {#1} { \__text_char_catcode:N #4 } } + \__text_change_case_upper_lt:nnw {#2} {#3} + } + } + \cs_new:Npn \__text_change_case_upper_lt:nnw #1#2#3 \q_recursion_stop + { + \tl_if_head_is_N_type:nTF {#3} + { \__text_change_case_upper_lt:nnN } + { \use:c { __text_change_case_char_next_ #1 :nn } } + {#1} {#2} #3 \q_recursion_stop } + \cs_new:Npn \__text_change_case_upper_lt:nnN #1#2#3 { - \__tl_change_case_output:nwn {#1} - \use_none:n + \bool_lazy_and:nnTF + { ! \token_if_cs_p:N #3 } + { \int_compare_p:nNn { `#3 } = { "0307 } } + { \use:c { __text_change_case_char_next_ #1 :nn } {#1} {#2} } + { \use:c { __text_change_case_char_next_ #1 :nn } {#1} {#2} #3 } } } -\cs_new:Npn \__tl_change_case_lower_lt:nnw #1#2 +\cs_new:Npn \__text_change_case_title_nl:nnnN #1#2#3#4 { - \tl_if_blank:nTF {#1} - {#2} + \bool_lazy_or:nnTF + { \int_compare_p:nNn { `#4 } = { "0049 } } + { \int_compare_p:nNn { `#4 } = { "0069 } } { - \__tl_change_case_output:nwn {#1} - \__tl_change_case_lower_lt:Nw + \__text_change_case_store:e + { \char_generate:nn { "0049 } { \__text_char_catcode:N #4 } } + \__text_change_case_title_nl:nnw {#2} {#3} } + { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } } -\cs_new:Npn \__tl_change_case_lower_lt:Nw #1#2 \q_recursion_stop +\cs_new:Npn \__text_change_case_title_nl:nnw #1#2#3 \q_recursion_stop { - \tl_if_head_is_N_type:nT {#2} - { \__tl_change_case_lower_lt:NNw } - #1 #2 \q_recursion_stop + \tl_if_head_is_N_type:nTF {#3} + { \__text_change_case_title_nl:nnN } + { \use:c { __text_change_case_char_next_ #1 :nn } } + {#1} {#2} #3 \q_recursion_stop } -\cs_new:Npn \__tl_change_case_lower_lt:NNw #1#2#3 \q_recursion_stop +\cs_new:Npn \__text_change_case_title_nl:nnN #1#2#3 { - \__tl_change_case_if_expandable:NTF #2 + \bool_lazy_and:nnTF + { ! \token_if_cs_p:N #3 } { - \exp_after:wN \__tl_change_case_lower_lt:Nw \exp_after:wN #1 #2 - #3 \q_recursion_stop + \bool_lazy_or_p:nn + { \int_compare_p:nNn { `#3 } = { "004A } } + { \int_compare_p:nNn { `#3 } = { "006A } } } { - \bool_lazy_and:nnT - { ! \token_if_cs_p:N #2 } + \__text_change_case_store:e + { \char_generate:nn { "004A } { \__text_char_catcode:N #3 } } + \use:c { __text_change_case_char_next_ #1 :nn } {#1} {#2} + } + { \use:c { __text_change_case_char_next_ #1 :nn } {#1} {#2} #3 } + } +\bool_lazy_or:nnTF + { \sys_if_engine_luatex_p: } + { \sys_if_engine_xetex_p: } + { + \cs_new:Npn \__text_change_case_lower_tr:nnnN #1#2#3#4 + { + \int_compare:nNnTF { `#4 } = { "0049 } + { \__text_change_case_lower_tr:nnNw {#1} {#3} #4 } { - \bool_lazy_any_p:n + \int_compare:nNnTF { `#4 } = { "0130 } { - { \int_compare_p:nNn { `#2 } = { "0300 } } - { \int_compare_p:nNn { `#2 } = { "0301 } } - { \int_compare_p:nNn { `#2 } = { "0303 } } + \__text_change_case_store:e + { \char_generate:nn { "0069 } { \__text_char_catcode:N #4 } } + \__text_change_case_loop:nnw {#1} {#3} } + { \__text_change_case_lower_sigma:nnnN {#1} {#2} {#3} #4 } } - { \__tl_change_case_output:Vwn \c__tl_dot_above_tl } - #1 #2#3 \q_recursion_stop } - } -\cs_new:Npn \__tl_change_case_upper_lt:Nnw #1 - { - \exp_args:Nf \__tl_change_case_upper_lt:nnw + \cs_new:Npn \__text_change_case_lower_tr:nnNw #1#2#3#4 \q_recursion_stop { - \int_case:nnF {`#1} + \tl_if_head_is_N_type:nTF {#4} + { \__text_change_case_lower_tr:nnN } { - { "0069 } I - { "006A } J - { "012F } \c__tl_I_ogonek_tl + \__text_change_case_store:e + { \char_generate:nn { "0131 } { \__text_char_catcode:N #3 } } + \__text_change_case_loop:nnw } - \exp_stop_f: + {#1} {#2} #4 \q_recursion_stop } - } -\cs_new:Npn \__tl_change_case_upper_lt:nnw #1#2 - { - \tl_if_blank:nTF {#1} - {#2} + \cs_new:Npn \__text_change_case_lower_tr:nnN #1#2#3 { - \__tl_change_case_output:nwn {#1} - \__tl_change_case_upper_lt:Nw + \bool_lazy_or:nnTF + { \token_if_cs_p:N #3 } + { ! \int_compare_p:nNn { `#3 } = { "0307 } } + { + \__text_change_case_store:e + { \char_generate:nn { "0131 } { \__text_char_catcode:N #3 } } + \__text_change_case_loop:nnw {#1} {#2} #3 + } + { + \__text_change_case_store:e + { \char_generate:nn { "0069 } { \__text_char_catcode:N #3 } } + \__text_change_case_loop:nnw {#1} {#2} + } } } -\cs_new:Npn \__tl_change_case_upper_lt:Nw #1#2 \q_recursion_stop - { - \tl_if_head_is_N_type:nT {#2} - { \__tl_change_case_upper_lt:NNw } - #1 #2 \q_recursion_stop - } -\cs_new:Npn \__tl_change_case_upper_lt:NNw #1#2#3 \q_recursion_stop { - \__tl_change_case_if_expandable:NTF #2 + \cs_new:Npn \__text_change_case_lower_tr:nnnN #1#2#3#4 { - \exp_after:wN \__tl_change_case_upper_lt:Nw \exp_after:wN #1 #2 - #3 \q_recursion_stop + \int_compare:nNnTF { `#4 } = { "0049 } + { + \__text_change_case_store:V \c__text_dotless_i_tl + \__text_change_case_loop:nnw {#1} {#3} + } + { + \int_compare:nNnTF { `#4 } = { "00C4 } + { \__text_change_case_lower_tr:nnnNN {#1} {#2} {#3} #4 } + { \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } + } } + \cs_new:Npn \__text_change_case_lower_tr:nnnNN #1#2#3#4#5 { - \bool_lazy_and:nnTF - { ! \token_if_cs_p:N #2 } - { \int_compare_p:nNn { `#2 } = { "0307 } } - { #1 } - { #1 #2 } - #3 \q_recursion_stop + \int_compare:nNnTF { `#5 } = { "00B0 } + { + \__text_change_case_store:e + { + \char_generate:nn { "0069 } + { \char_value_catcode:n { "0069 } } + } + \__text_change_case_loop:nnw {#1} {#3} + } + { \__text_change_case_char:nnnN {#1} {#2} {#3} #4#5 } } } -\cs_new:cpn { __tl_change_case_upper_de-alt:Nnw } #1#2 - { - \int_compare:nNnTF { `#1 } = { 223 } - { \__tl_change_case_output:Vwn \c__tl_upper_Eszett_tl } - {#2} - } -\bool_lazy_or:nnTF - { \sys_if_engine_luatex_p: } - { \sys_if_engine_xetex_p: } +\cs_new:Npx \__text_change_case_upper_tr:nnnN #1#2#3#4 { - \group_begin: - \cs_set:Npn \__tl_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__tl_std_sigma_tl { \__tl_tmp:n { "03C3 } } - \tl_const:Nx \c__tl_final_sigma_tl { \__tl_tmp:n { "03C2 } } - \tl_const:Nx \c__tl_accents_lt_tl - { - \__tl_tmp:n { "00CC } - { - \__tl_tmp:n { "0069 } - \__tl_tmp:n { "0307 } - \__tl_tmp:n { "0300 } - } - \__tl_tmp:n { "00CD } - { - \__tl_tmp:n { "0069 } - \__tl_tmp:n { "0307 } - \__tl_tmp:n { "0301 } - } - \__tl_tmp:n { "0128 } - { - \__tl_tmp:n { "0069 } - \__tl_tmp:n { "0307 } - \__tl_tmp:n { "0303 } - } - } - \tl_const:Nx \c__tl_dot_above_tl { \__tl_tmp:n { "0307 } } - \tl_const:Nx \c__tl_upper_Eszett_tl { \__tl_tmp:n { "1E9E } } - \group_end: - } - { - \tl_const:Nn \c__tl_std_sigma_tl { } - \tl_const:Nn \c__tl_final_sigma_tl { } - \tl_const:Nn \c__tl_accents_lt_tl { } - \tl_const:Nn \c__tl_dot_above_tl { } - \tl_const:Nn \c__tl_upper_Eszett_tl { } + \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 \__text_change_case_store:e + { + \exp_not:N \char_generate:nn { "0130 } + { \exp_not:N \__text_char_catcode:N #4 } + } + } + { + \exp_not:N \__text_change_case_store:V + \exp_not:N \c__text_dotted_I_tl + } + \exp_not:N \use:c { __text_change_case_char_next_ #2 :nn } {#2} {#3} + } + { \exp_not:N \__text_change_case_char:nnnN {#1} {#2} {#3} #4 } } +\cs_new_eq:NN \__text_change_case_lower_az:nnnN + \__text_change_case_lower_tr:nnnN +\cs_new_eq:NN \__text_change_case_upper_az:nnnN + \__text_change_case_upper_tr:nnnN \group_begin: - \bool_lazy_or:nnTF + \bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { - \cs_set_protected:Npn \__tl_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 \__tl_tmp:w #1#2 + \cs_set_protected:Npn \__text_tmp:w #1#2 { \group_begin: - \cs_set_protected:Npn \__tl_tmp:w ##1##2##3##4 + \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4 { \tl_const:Nx #1 { @@ -28548,38 +28897,37 @@ \exp_not:N \char_generate:nn {##2} { 13 } } } - \tl_set:Nx \l__tl_internal_a_tl - { \char_codepoint_to_bytes:n {"#2} } - \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl + \use:x + { \__text_tmp:w \char_to_utfviii_bytes:n { "#2 } } \group_end: } + \__text_tmp:w \c__text_dotless_i_tl { 0131 } + \__text_tmp:w \c__text_dotted_I_tl { 0130 } + \__text_tmp:w \c__text_i_ogonek_tl { 012F } + \__text_tmp:w \c__text_I_ogonek_tl { 012E } } - \__tl_tmp:w \c__tl_dotless_i_tl { 0131 } - \__tl_tmp:w \c__tl_dotted_I_tl { 0130 } - \__tl_tmp:w \c__tl_i_ogonek_tl { 012F } - \__tl_tmp:w \c__tl_I_ogonek_tl { 012E } \group_end: \group_begin: \bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { - \cs_set_protected:Npn \__tl_loop:nn #1#2 + \cs_set_protected:Npn \__text_loop:nn #1#2 { \quark_if_recursion_tail_stop:n {#1} - \tl_set:Nx \l__tl_internal_a_tl + \use:x { - \char_codepoint_to_bytes:n {"#1} - \char_codepoint_to_bytes:n {"#2} + \__text_tmp:w + \char_to_utfviii_bytes:n { "#1 } + \char_to_utfviii_bytes:n { "#2 } } - \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl - \__tl_loop:nn + \__text_loop:nn } - \cs_set_protected:Npn \__tl_tmp:nnnn #1#2#3#4#5 + \cs_set_protected:Npn \__text_tmp:nnnn #1#2#3#4#5 { \tl_const:cx { - c__tl_ #1 _case_ + c__text_ #1 case_ \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } _tl @@ -28591,11 +28939,11 @@ \exp_not:N \char_generate:nn {#5} { 13 } } } - \cs_set_protected:Npn \__tl_tmp:w #1#2#3#4#5#6#7#8 + \cs_set_protected:Npn \__text_tmp:w #1#2#3#4#5#6#7#8 { \tl_const:cx { - c__tl_lower_case_ + c__text_lowercase_ \char_generate:nn {#1} { 12 } \char_generate:nn {#2} { 12 } _tl @@ -28606,11 +28954,12 @@ \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \char_generate:nn {#6} { 13 } } - \__tl_tmp:nnnn { upper } {#5} {#6} {#1} {#2} - \__tl_tmp:nnnn { mixed } {#5} {#6} {#1} {#2} + \__text_tmp:nnnn { upper } {#5} {#6} {#1} {#2} + \__text_tmp:nnnn { title } {#5} {#6} {#1} {#2} } - \__tl_loop:nn + \__text_loop:nn { 00C0 } { 00E0 } + { 00C1 } { 00E1 } { 00C2 } { 00E2 } { 00C3 } { 00E3 } { 00C4 } { 00E4 } @@ -28711,41 +29060,40 @@ { 021A } { 021B } \q_recursion_tail ? \q_recursion_stop - \cs_set_protected:Npn \__tl_tmp:w #1#2#3 + \cs_set_protected:Npn \__text_tmp:w #1#2#3 { \group_begin: - \cs_set_protected:Npn \__tl_tmp:w ##1##2##3##4 + \cs_set_protected:Npn \__text_tmp:w ##1##2##3##4 { \tl_const:cx { - c__tl_ #3 _case_ + c__text_ #3 case_ \char_generate:nn {##1} { 12 } \char_generate:nn {##2} { 12 } _tl } {#2} } - \tl_set:Nx \l__tl_internal_a_tl - { \char_codepoint_to_bytes:n { "#1 } } - \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl + \use:x + { \__text_tmp:w \char_to_utfviii_bytes:n { "#1 } } \group_end: } - \__tl_tmp:w { 00DF } { SS } { upper } - \__tl_tmp:w { 00DF } { Ss } { mixed } - \__tl_tmp:w { 0131 } { I } { upper } + \__text_tmp:w { 00DF } { SS } { upper } + \__text_tmp:w { 00DF } { Ss } { title } + \__text_tmp:w { 0131 } { I } { upper } } \group_end: \group_begin: - \cs_set_protected:Npn \__tl_change_case_setup:NN #1#2 + \cs_set_protected:Npn \__text_change_case_setup:NN #1#2 { \quark_if_recursion_tail_stop:N #1 - \tl_const:cn { c__tl_change_case_lower_ \token_to_str:N #1 _tl } + \tl_const:cn { c__text_lowercase_ \token_to_str:N #1 _tl } { #2 } - \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N #2 _tl } + \tl_const:cn { c__text_uppercase_ \token_to_str:N #2 _tl } { #1 } - \__tl_change_case_setup:NN + \__text_change_case_setup:NN } - \__tl_change_case_setup:NN + \__text_change_case_setup:NN \AA \aa \AE \ae \DH \dh @@ -28759,65 +29107,400 @@ \TH \th \q_recursion_tail ? \q_recursion_stop - \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N \i _tl } { I } - \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N \j _tl } { J } + \tl_const:cn { c__text_uppercase_ \token_to_str:N \i _tl } { I } + \tl_const:cn { c__text_uppercase_ \token_to_str:N \j _tl } { J } \group_end: -\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 } -\cs_new:Npn \__tl_change_case_mixed_nl:Nnw #1 +%% File: l3candidates.dtx +\cs_new_protected:Npn \box_clip:N #1 + { \hbox_set:Nn #1 { \__box_backend_clip:N #1 } } +\cs_generate_variant:Nn \box_clip:N { c } +\cs_new_protected:Npn \box_gclip:N #1 + { \hbox_gset:Nn #1 { \__box_backend_clip:N #1 } } +\cs_generate_variant:Nn \box_gclip:N { c } +\cs_new_protected:Npn \box_set_trim:Nnnnn #1#2#3#4#5 + { \__box_set_trim:NnnnnN #1 {#2} {#3} {#4} {#5} \box_set_eq:NN } +\cs_generate_variant:Nn \box_set_trim:Nnnnn { c } +\cs_new_protected:Npn \box_gset_trim:Nnnnn #1#2#3#4#5 + { \__box_set_trim:NnnnnN #1 {#2} {#3} {#4} {#5} \box_gset_eq:NN } +\cs_generate_variant:Nn \box_gset_trim:Nnnnn { c } +\cs_new_protected:Npn \__box_set_trim:NnnnnN #1#2#3#4#5#6 { - \bool_lazy_or:nnTF - { \int_compare_p:nNn { `#1 } = { `i } } - { \int_compare_p:nNn { `#1 } = { `I } } + \hbox_set:Nn \l__box_internal_box + { + \tex_kern:D - \__box_dim_eval:n {#2} + \box_use:N #1 + \tex_kern:D - \__box_dim_eval:n {#4} + } + \dim_compare:nNnTF { \box_dp:N #1 } > {#3} + { + \hbox_set:Nn \l__box_internal_box + { + \box_move_down:nn \c_zero_dim + { \box_use_drop:N \l__box_internal_box } + } + \box_set_dp:Nn \l__box_internal_box { \box_dp:N #1 - (#3) } + } + { + \hbox_set:Nn \l__box_internal_box + { + \box_move_down:nn { (#3) - \box_dp:N #1 } + { \box_use_drop:N \l__box_internal_box } + } + \box_set_dp:Nn \l__box_internal_box \c_zero_dim + } + \dim_compare:nNnTF { \box_ht:N \l__box_internal_box } > {#5} { - \__tl_change_case_output:nwn { I } - \__tl_change_case_mixed_nl:Nw + \hbox_set:Nn \l__box_internal_box + { + \box_move_up:nn \c_zero_dim + { \box_use_drop:N \l__box_internal_box } + } + \box_set_ht:Nn \l__box_internal_box + { \box_ht:N \l__box_internal_box - (#5) } + } + { + \hbox_set:Nn \l__box_internal_box + { + \box_move_up:nn { (#5) - \box_ht:N \l__box_internal_box } + { \box_use_drop:N \l__box_internal_box } + } + \box_set_ht:Nn \l__box_internal_box \c_zero_dim } + #6 #1 \l__box_internal_box } -\cs_new:Npn \__tl_change_case_mixed_nl:Nw #1#2 \q_recursion_stop +\cs_new_protected:Npn \box_set_viewport:Nnnnn #1#2#3#4#5 + { \__box_set_viewport:NnnnnN #1 {#2} {#3} {#4} {#5} \box_set_eq:NN } +\cs_generate_variant:Nn \box_set_viewport:Nnnnn { c } +\cs_new_protected:Npn \box_gset_viewport:Nnnnn #1#2#3#4#5 + { \__box_set_viewport:NnnnnN #1 {#2} {#3} {#4} {#5} \box_gset_eq:NN } +\cs_generate_variant:Nn \box_gset_viewport:Nnnnn { c } +\cs_new_protected:Npn \__box_set_viewport:NnnnnN #1#2#3#4#5#6 { - \tl_if_head_is_N_type:nT {#2} - { \__tl_change_case_mixed_nl:NNw } - #1 #2 \q_recursion_stop + \hbox_set:Nn \l__box_internal_box + { + \tex_kern:D - \__box_dim_eval:n {#2} + \box_use:N #1 + \tex_kern:D \__box_dim_eval:n { #4 - \box_wd:N #1 } + } + \dim_compare:nNnTF {#3} < \c_zero_dim + { + \hbox_set:Nn \l__box_internal_box + { + \box_move_down:nn \c_zero_dim + { \box_use_drop:N \l__box_internal_box } + } + \box_set_dp:Nn \l__box_internal_box { - \__box_dim_eval:n {#3} } + } + { + \hbox_set:Nn \l__box_internal_box + { \box_move_down:nn {#3} { \box_use_drop:N \l__box_internal_box } } + \box_set_dp:Nn \l__box_internal_box \c_zero_dim + } + \dim_compare:nNnTF {#5} > \c_zero_dim + { + \hbox_set:Nn \l__box_internal_box + { + \box_move_up:nn \c_zero_dim + { \box_use_drop:N \l__box_internal_box } + } + \box_set_ht:Nn \l__box_internal_box + { + (#5) + \dim_compare:nNnT {#3} > \c_zero_dim + { - (#3) } + } + } + { + \hbox_set:Nn \l__box_internal_box + { + \box_move_up:nn { - \__box_dim_eval:n {#5} } + { \box_use_drop:N \l__box_internal_box } + } + \box_set_ht:Nn \l__box_internal_box \c_zero_dim + } + #6 #1 \l__box_internal_box } -\cs_new:Npn \__tl_change_case_mixed_nl:NNw #1#2#3 \q_recursion_stop +\cs_new:Npn \flag_raise_if_clear:n #1 { - \__tl_change_case_if_expandable:NTF #2 + \if_cs_exist:w flag~#1~0 \cs_end: + \else: + \cs:w flag~#1 \cs_end: 0 ; + \fi: + } +\cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6 + { + \exp_args:Ne \__msg_expandable_error_module:nn { - \exp_after:wN \__tl_change_case_mixed_nl:Nw \exp_after:wN #1 #2 - #3 \q_recursion_stop + \exp_args:Nc \exp_args:Noooo + { \c__msg_text_prefix_tl #1 / #2 } + { \tl_to_str:n {#3} } + { \tl_to_str:n {#4} } + { \tl_to_str:n {#5} } + { \tl_to_str:n {#6} } } + {#1} + } +\cs_new:Npn \msg_expandable_error:nnnnn #1#2#3#4#5 + { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } } +\cs_new:Npn \msg_expandable_error:nnnn #1#2#3#4 + { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } } +\cs_new:Npn \msg_expandable_error:nnn #1#2#3 + { \msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } } +\cs_new:Npn \msg_expandable_error:nn #1#2 + { \msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } } +\cs_generate_variant:Nn \msg_expandable_error:nnnnnn { nnffff } +\cs_generate_variant:Nn \msg_expandable_error:nnnnn { nnfff } +\cs_generate_variant:Nn \msg_expandable_error:nnnn { nnff } +\cs_generate_variant:Nn \msg_expandable_error:nnn { nnf } +\cs_new:Npn \__msg_expandable_error_module:nn #1#2 + { + \exp_after:wN \exp_after:wN + \exp_after:wN \use_none_delimit_by_q_stop:w + \use:n { \::error ! ~ #2 : ~ #1 } \q_stop + } +\cs_new_protected:Npn \msg_show_eval:Nn #1#2 + { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_show:n } +\cs_new_protected:Npn \msg_log_eval:Nn #1#2 + { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_log:n } +\cs_new_protected:Npn \__msg_show_eval:nnN #1#2#3 { #3 { #2 = #1 } } +\cs_new:Npx \msg_show_item:n #1 + { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } } +\cs_new:Npx \msg_show_item_unbraced:n #1 + { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} } +\cs_new:Npx \msg_show_item:nn #1#2 + { + \iow_newline: > \use:nn { ~ } { ~ } + \exp_not:N \tl_to_str:n { {#1} } + \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ } + \exp_not:N \tl_to_str:n { {#2} } + } +\cs_new:Npx \msg_show_item_unbraced:nn #1#2 + { + \iow_newline: > \use:nn { ~ } { ~ } + \exp_not:N \tl_to_str:n {#1} + \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ } + \exp_not:N \tl_to_str:n {#2} + } +\cs_new_protected:Npn \bool_set_inverse:N #1 + { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 } +\cs_generate_variant:Nn \bool_set_inverse:N { c } +\cs_new_protected:Npn \bool_gset_inverse:N #1 + { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 } +\cs_generate_variant:Nn \bool_gset_inverse:N { c } +\cs_new:Npn \bool_case_true:nTF + { \exp:w \__msg_case:NnTF \c_true_bool } +\cs_new:Npn \bool_case_true:nT #1#2 + { \exp:w \__msg_case:NnTF \c_true_bool {#1} {#2} { } } +\cs_new:Npn \bool_case_true:nF #1 + { \exp:w \__msg_case:NnTF \c_true_bool {#1} { } } +\cs_new:Npn \bool_case_true:n #1 + { \exp:w \__msg_case:NnTF \c_true_bool {#1} { } { } } +\cs_new:Npn \bool_case_false:nTF + { \exp:w \__msg_case:NnTF \c_false_bool } +\cs_new:Npn \bool_case_false:nT #1#2 + { \exp:w \__msg_case:NnTF \c_false_bool {#1} {#2} { } } +\cs_new:Npn \bool_case_false:nF #1 + { \exp:w \__msg_case:NnTF \c_false_bool {#1} { } } +\cs_new:Npn \bool_case_false:n #1 + { \exp:w \__msg_case:NnTF \c_false_bool {#1} { } { } } +\cs_new:Npn \__msg_case:NnTF #1#2#3#4 + { + \bool_if:NTF #1 \__msg_case_true:w \__msg_case_false:w + #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop + } +\cs_new:Npn \__msg_case_true:w #1#2 + { + \bool_if:nTF {#1} + { \__msg_case_end:nw {#2} } + { \__msg_case_true:w } + } +\cs_new:Npn \__msg_case_false:w #1#2 + { + \bool_if:nTF {#1} + { \__msg_case_false:w } + { \__msg_case_end:nw {#2} } + } +\cs_new:Npn \__msg_case_end:nw #1#2#3 \q_mark #4#5 \q_stop + { \exp_end: #1 #4 } +\cs_new:Npn \prop_rand_key_value:N #1 + { + \prop_if_empty:NF #1 { - \bool_lazy_and:nnTF - { ! ( \token_if_cs_p:N #2 ) } + \exp_after:wN \__prop_rand_item:w + \int_value:w \int_rand:nn { 1 } { \prop_count:N #1 } + #1 \q_stop + } + } +\cs_generate_variant:Nn \prop_rand_key_value:N { c } +\cs_new:Npn \__prop_rand_item:w #1 \s__prop \__prop_pair:wn #2 \s__prop #3 + { + \int_compare:nNnF {#1} > 1 + { \use_i_delimit_by_q_stop:nw { \exp_not:n { {#2} {#3} } } } + \exp_after:wN \__prop_rand_item:w + \int_value:w \int_eval:n { #1 - 1 } \s__prop + } +\cs_new:Npn \seq_mapthread_function:NNN #1#2#3 + { \exp_after:wN \__seq_mapthread_function:wNN #2 \q_stop #1 #3 } +\cs_new:Npn \__seq_mapthread_function:wNN \s__seq #1 \q_stop #2#3 + { + \exp_after:wN \__seq_mapthread_function:wNw #2 \q_stop #3 + #1 { ? \prg_break: } { } + \prg_break_point: + } +\cs_new:Npn \__seq_mapthread_function:wNw \s__seq #1 \q_stop #2 + { + \__seq_mapthread_function:Nnnwnn #2 + #1 { ? \prg_break: } { } + \q_stop + } +\cs_new:Npn \__seq_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6 + { + \use_none:n #2 + \use_none:n #5 + #1 {#3} {#6} + \__seq_mapthread_function:Nnnwnn #1 #4 \q_stop + } +\cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc } +\cs_new_protected:Npn \seq_set_filter:NNn + { \__seq_set_filter:NNNn \tl_set:Nx } +\cs_new_protected:Npn \seq_gset_filter:NNn + { \__seq_set_filter:NNNn \tl_gset:Nx } +\cs_new_protected:Npn \__seq_set_filter:NNNn #1#2#3#4 + { + \__seq_push_item_def:n { \bool_if:nT {#4} { \__seq_wrap_item:n {##1} } } + #1 #2 { #3 } + \__seq_pop_item_def: + } +\cs_new_protected:Npn \seq_set_map:NNn + { \__seq_set_map:NNNn \tl_set:Nx } +\cs_new_protected:Npn \seq_gset_map:NNn + { \__seq_set_map:NNNn \tl_gset:Nx } +\cs_new_protected:Npn \__seq_set_map:NNNn #1#2#3#4 + { + \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} } + #1 #2 { #3 } + \__seq_pop_item_def: + } +\cs_new_protected:Npn \seq_set_from_inline_x:Nnn + { \__seq_set_from_inline_x:NNnn \tl_set:Nx } +\cs_new_protected:Npn \seq_gset_from_inline_x:Nnn + { \__seq_set_from_inline_x:NNnn \tl_gset:Nx } +\cs_new_protected:Npn \__seq_set_from_inline_x:NNnn #1#2#3#4 + { + \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} } + #1 #2 { \s__seq #3 \__seq_item:n } + \__seq_pop_item_def: + } +\cs_new_protected:Npn \seq_set_from_function:NnN #1#2#3 + { \seq_set_from_inline_x:Nnn #1 {#2} { #3 {##1} } } +\cs_new_protected:Npn \seq_gset_from_function:NnN #1#2#3 + { \seq_gset_from_inline_x:Nnn #1 {#2} { #3 {##1} } } +\cs_new:Npn \seq_indexed_map_function:NN #1#2 + { + \__seq_indexed_map:NN #1#2 + \prg_break_point:Nn \seq_map_break: { } + } +\cs_new_protected:Npn \seq_indexed_map_inline:Nn #1#2 + { + \int_gincr:N \g__kernel_prg_map_int + \cs_gset_protected:cpn + { __seq_map_ \int_use:N \g__kernel_prg_map_int :w } ##1##2 {#2} + \exp_args:NNc \__seq_indexed_map:NN #1 + { __seq_map_ \int_use:N \g__kernel_prg_map_int :w } + \prg_break_point:Nn \seq_map_break: + { \int_gdecr:N \g__kernel_prg_map_int } + } +\cs_new:Npn \__seq_indexed_map:NN #1#2 + { + \exp_after:wN \__seq_indexed_map:Nw + \exp_after:wN #2 + \int_value:w 1 + \exp_after:wN \use_i:nn + \exp_after:wN ; + #1 + \prg_break: \__seq_item:n { } \prg_break_point: + } +\cs_new:Npn \__seq_indexed_map:Nw #1#2 ; #3 \__seq_item:n #4 + { + #3 + #1 {#2} {#4} + \exp_after:wN \__seq_indexed_map:Nw + \exp_after:wN #1 + \int_value:w \int_eval:w 1 + #2 ; + } +\str_const:Nx \c_sys_engine_version_str + { + \str_case:on \c_sys_engine_str + { + { pdftex } { - \bool_lazy_or_p:nn - { \int_compare_p:nNn { `#2 } = { `j } } - { \int_compare_p:nNn { `#2 } = { `J } } + \fp_eval:n { round(\int_use:N \tex_pdftexversion:D / 100 , 2) } + . + \tex_pdftexrevision:D } + { ptex } { - \__tl_change_case_output:nwn { J } - #1 + \cs_if_exist:NT \tex_ptexversion:D + { + p + \int_use:N \tex_ptexversion:D + . + \int_use:N \tex_ptexminorversion:D + \tex_ptexrevision:D + - + \int_use:N \tex_epTeXversion:D + } + } + { luatex } + { + \fp_eval:n { round(\int_use:N \tex_luatexversion:D / 100, 2) } + . + \tex_luatexrevision:D + } + { uptex } + { + \cs_if_exist:NT \tex_ptexversion:D + { + p + \int_use:N \tex_ptexversion:D + . + \int_use:N \tex_ptexminorversion:D + \tex_ptexrevision:D + - + u + \int_use:N \tex_uptexversion:D + \tex_uptexrevision:D + - + \int_use:N \tex_epTeXversion:D + } + } + { xetex } + { + \int_use:N \tex_XeTeXversion:D + \tex_XeTeXrevision:D } - { #1 #2 } - #3 \q_recursion_stop } } -\tl_new:N \l_tl_case_change_math_tl -\tl_set:Nn \l_tl_case_change_math_tl - { $ $ \( \) } -\tl_new:N \l_tl_case_change_exclude_tl -\tl_set:Nn \l_tl_case_change_exclude_tl - { \cite \ensuremath \label \ref } -\tl_new:N \l_tl_mixed_case_ignore_tl -\tl_set:Nx \l_tl_mixed_case_ignore_tl +\cs_new_protected:Npn \ior_shell_open:Nn #1#2 { - ( % ) - [ % ] - \cs_to_str:N \{ % \} - ` - - + \sys_if_shell:TF + { \exp_args:No \__ior_shell_open:nN { \tl_to_str:n {#2} } #1 } + { \__kernel_msg_error:nn { kernel } { pipe-failed } } + } +\cs_new_protected:Npn \__ior_shell_open:nN #1#2 + { + \tl_if_in:nnTF {#1} { " } + { + \__kernel_msg_error:nnx + { kernel } { quote-in-shell } {#1} + } + { \__kernel_ior_open:Nn #2 { "|#1" } } + } +\__kernel_msg_new:nnnn { kernel } { pipe-failed } + { Cannot~run~piped~system~commands. } + { + LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\ + Try~the~"--shell-escape"~(or~"--enable-pipes")~option. } \cs_new_protected:Npn \tl_build_begin:N #1 { \__tl_build_begin:NN \cs_set_nopar:Npx #1 } diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex index 6a994e64486..72090ccc347 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex @@ -6,7 +6,7 @@ %% %% expl3.dtx (with options: `generic,loader') %% -%% 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 @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2019-11-07}% +\def\ExplFileDate{2020-01-12}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \def\tempa{LaTeX2e}% diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx b/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx index 0f6709a6f31..80baec9c93b 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx @@ -6,7 +6,7 @@ %% %% expl3.dtx (with options: `2ekernel,loader') %% -%% 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 @@ -19,10 +19,10 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2019-11-07}% +\def\ExplFileDate{2020-01-12}% \let\ExplLoaderFileDate\ExplFileDate \everyjob\expandafter{\the\everyjob - \message{expl3 <\ExplFileDate> L3 programming layer}% + \message{L3 programming layer <\ExplFileDate>}% } \protected\def\ProvidesExplPackage#1#2#3#4% {% @@ -82,10 +82,12 @@ \bool_gset_true:N \g__kernel_deprecation_undo_recent_bool } } -\AtBeginDocument +\tl_put_left:Nn \document { + \endgroup \str_if_exist:NF \c_sys_backend_str { \sys_load_backend:n { } } + \begingroup } \cs_if_free:cTF { ver@expl3.sty } { diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.lua b/Master/texmf-dist/tex/latex/l3kernel/expl3.lua index eeafb132f55..35c757a6049 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.lua +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.lua @@ -6,7 +6,7 @@ -- -- l3luatex.dtx (with options: `package,lua') -- --- 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 @@ -20,16 +20,17 @@ -- -- File: l3luatex.dtx l3kernel = l3kernel or { } -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 local abs = math.abs local byte = string.byte local floor = math.floor @@ -70,6 +71,23 @@ local function resettimer() base_time = os_clock() end l3kernel.resettimer = resettimer +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 local function filemdfivesum(name) local file = kpse_find(name, "tex", true) if file then diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty index 375597d0188..355a6b941f1 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty @@ -6,7 +6,7 @@ %% %% expl3.dtx (with options: `package,loader') %% -%% 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 @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2019-11-07}% +\def\ExplFileDate{2020-01-12}% \let\ExplLoaderFileDate\ExplFileDate \ProvidesPackage{expl3} [% diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3debug.def b/Master/texmf-dist/tex/latex/l3kernel/l3debug.def index 329247a56e5..1a009cd48b7 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3debug.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3debug.def @@ -6,7 +6,7 @@ %% %% l3debug.dtx (with options: `package') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def b/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def index 7a8dd68b2f6..5623aaa6117 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3deprecation.def @@ -6,7 +6,7 @@ %% %% l3deprecation.dtx (with options: `package,patches') %% -%% 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 @@ -179,6 +179,18 @@ \cs_gset:Npn \__prg_break: #1 \__prg_break_point: { } \__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break:n } \cs_gset:Npn \__prg_break:n #1#2 \__prg_break_point: {#1} +\__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 } \__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nn } \cs_gset:Npn \str_case_x:nn { \str_case_e:nn } \__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnT } @@ -229,6 +241,24 @@ \group_end: } \cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c } +\__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} } \__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:N } \cs_gset_protected:Npn \tl_show_analysis:N { \tl_analysis_show:N } \__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:n } @@ -239,6 +269,22 @@ \cs_gset:Npn \token_get_arg_spec:N { \cs_argument_spec:N } \__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { \cs_replacement_spec:N } \cs_gset:Npn \token_get_replacement_spec:N { \cs_replacement_spec:N } +\__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 } \__kernel_patch_deprecation:nnNNpn { 2021-01-01 } { -1 } \cs_new_protected:Npn \c_term_ior { -1 \scan_stop: } %% diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls index 4d1b512227b..5ffd3862e04 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls +++ b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls @@ -6,7 +6,7 @@ %% %% l3doc.dtx (with options: `class') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex b/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex index a7978ddf13e..376e7325765 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/l3docstrip.tex @@ -6,7 +6,7 @@ %% %% l3docstrip.dtx (with options: `program') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88591.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88591.def index a70bc9f6fe8..b8afbc41f0f 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88591.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88591.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88591') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885910.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885910.def index c24d358a553..e05851bea25 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885910.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885910.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso885910') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885911.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885911.def index f6b39e6d096..68edb51da3e 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885911.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885911.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso885911') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885913.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885913.def index 24ed74b1c31..cb5df1eadd0 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885913.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885913.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso885913') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885914.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885914.def index e51b8534a99..3ba5aff3579 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885914.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885914.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso885914') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885915.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885915.def index 5776213ff39..1c021c5be93 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885915.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885915.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso885915') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885916.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885916.def index b7376b0b252..67ba3cb920a 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885916.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso885916.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso885916') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88592.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88592.def index ef2cd5ab200..cdd7d72cfba 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88592.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88592.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88592') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88593.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88593.def index dc7cc7a88fd..9f0b8cb57e9 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88593.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88593.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88593') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88594.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88594.def index 2ac8afb3b32..62d0f99a57a 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88594.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88594.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88594') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88595.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88595.def index e8361b2b6fd..5b8e4a52a0a 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88595.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88595.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88595') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88596.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88596.def index 912fb1067f7..95461e2fdcf 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88596.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88596.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88596') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88597.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88597.def index e3486353f1f..6fa05a311f1 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88597.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88597.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88597') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88598.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88598.def index 414212db091..a4eb5245b17 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88598.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88598.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88598') %% -%% 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/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88599.def b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88599.def index 946ab0b41bf..9c005e3e0cb 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88599.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3str-enc-iso88599.def @@ -6,7 +6,7 @@ %% %% l3str-convert.dtx (with options: `iso88599') %% -%% 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/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty b/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty index caa9f140b04..6936d538565 100644 --- a/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty +++ b/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty @@ -6,7 +6,7 @@ %% %% l3keys2e.dtx (with options: `package') %% -%% 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 @@ -32,7 +32,7 @@ }% \endinput } -\ProvidesExplPackage{l3keys2e}{2019-10-11}{} +\ProvidesExplPackage{l3keys2e}{2020-01-12}{} {LaTeX2e option processing using LaTeX3 keys} \cs_generate_variant:Nn \clist_put_right:Nn { Nv } \cs_generate_variant:Nn \keys_if_exist:nnT { nx } diff --git a/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty b/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty index 1c07dc0e4b5..b08e2b461a9 100644 --- a/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty +++ b/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty @@ -6,7 +6,7 @@ %% %% xfp.dtx (with options: `package') %% -%% 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 @@ -33,7 +33,7 @@ \endinput } \RequirePackage{xparse} -\ProvidesExplPackage{xfp}{2019-10-11}{} +\ProvidesExplPackage{xfp}{2020-01-12}{} {L3 Floating point unit} \NewExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} } \NewExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} } diff --git a/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty b/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty index 959ceb14c75..167d8e9c995 100644 --- a/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty +++ b/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty @@ -6,7 +6,7 @@ %% %% xfrac.dtx (with options: `package') %% -%% 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 @@ -33,7 +33,7 @@ \endinput } \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate} -\ProvidesExplPackage{xfrac}{2019-10-11}{} +\ProvidesExplPackage{xfrac}{2020-01-12}{} {L3 Experimental split-level fractions} \keys_define:nn { xfrac } { diff --git a/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty b/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty index 23b13604691..265cd0c9f38 100644 --- a/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty +++ b/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty @@ -6,7 +6,7 @@ %% %% xparse.dtx (with options: `package') %% -%% 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 @@ -32,7 +32,7 @@ }% \endinput } -\ProvidesExplPackage{xparse}{2019-10-11}{} +\ProvidesExplPackage{xparse}{2020-01-12}{} {L3 Experimental document command parser} \tl_new:N \l__xparse_arg_spec_tl \tl_new:N \l__xparse_args_tl @@ -2100,7 +2100,7 @@ LaTeX~did~not~find~it,~and~will~insert~a~default~value~to~be~processed. } \__kernel_msg_new:nnnn { xparse } { non-xparse } - { \str_upper_case:n #1~not~defined~using~xparse. } + { \str_uppercase:n #1~not~defined~using~xparse. } { You~have~asked~for~the~argument~specification~for~the~#1,~ but~this~was~not~defined~using~xparse. diff --git a/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty b/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty index 80b85276d37..fb6a361b965 100644 --- a/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty +++ b/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty @@ -6,7 +6,7 @@ %% %% xtemplate.dtx (with options: `package') %% -%% 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 @@ -32,7 +32,7 @@ }% \endinput } -\ProvidesExplPackage{xtemplate}{2019-10-11}{} +\ProvidesExplPackage{xtemplate}{2020-01-12}{} {L3 Experimental prototype document functions} \tl_const:Nn \c__xtemplate_code_root_tl { template~code~>~ } \tl_const:Nn \c__xtemplate_defaults_root_tl { template~defaults~>~ } |