summaryrefslogtreecommitdiff
path: root/macros/latex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-07 03:00:49 +0000
committerNorbert Preining <norbert@preining.info>2019-09-07 03:00:49 +0000
commit7345b8683c7cbeaedf53e992fda0b3fa6141084e (patch)
tree3246f6574e0921c2111b93b76720f54034238185 /macros/latex
parentbd3ecfd29a422ad4d7f8f1e119ddc518494e567a (diff)
CTAN sync 201909070300
Diffstat (limited to 'macros/latex')
-rw-r--r--macros/latex/contrib/l3backend/CHANGELOG.md13
-rw-r--r--macros/latex/contrib/l3backend/README.md2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-basics.dtx16
-rw-r--r--macros/latex/contrib/l3backend/l3backend-box.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-code.pdfbin722426 -> 725631 bytes
-rw-r--r--macros/latex/contrib/l3backend/l3backend-color.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-draw.dtx4
-rw-r--r--macros/latex/contrib/l3backend/l3backend-graphics.dtx56
-rw-r--r--macros/latex/contrib/l3backend/l3backend-pdf.dtx36
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md16
-rw-r--r--macros/latex/contrib/l3kernel/README.md2
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin585792 -> 585523 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1528124 -> 1530298 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3alloc.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3candidates.dtx139
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3color-base.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx7
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin263863 -> 263578 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx615
-rw-r--r--macros/latex/contrib/l3kernel/l3final.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.csv1
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin59016 -> 59020 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx50
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx16
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx46
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin280597 -> 280320 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin228302 -> 228039 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin187099 -> 186831 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx67
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin5707450 -> 5729381 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex2
-rw-r--r--macros/latex/contrib/mismath/mismath.dtx48
-rw-r--r--macros/latex/contrib/mismath/mismath.pdfbin529110 -> 527141 bytes
-rw-r--r--macros/latex/contrib/spacingtricks/spacingtricks.dtx39
-rw-r--r--macros/latex/contrib/spacingtricks/spacingtricks.pdfbin123502 -> 125130 bytes
81 files changed, 896 insertions, 397 deletions
diff --git a/macros/latex/contrib/l3backend/CHANGELOG.md b/macros/latex/contrib/l3backend/CHANGELOG.md
index 9094a090ba..77ad3215ea 100644
--- a/macros/latex/contrib/l3backend/CHANGELOG.md
+++ b/macros/latex/contrib/l3backend/CHANGELOG.md
@@ -6,6 +6,16 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2019-09-05]
+
+### Added
+
+- Support for EPS and PDF files with `dvisvgm` backend
+
+### Fixed
+
+- Some primitive use in the `dvips` backend
+
## [2019-08-25]
### Fixed
@@ -25,6 +35,7 @@ this project uses date-based 'snapshot' version identifiers.
- Include `l3backend` in file names
- Moved backend code to internal for each 'parent' module
-[Unreleased]: https://github.com/latex3/latex3/compare/2019-08-25...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2019-09-05...HEAD
+[2019-09-05]: https://github.com/latex3/latex3/compare/2019-08-25...2019-09-05
[2019-08-25]: https://github.com/latex3/latex3/compare/2019-07-01...2019-08-25
[2019-07-01]: https://github.com/latex3/latex3/compare/2019-05-28...2019-07-01
diff --git a/macros/latex/contrib/l3backend/README.md b/macros/latex/contrib/l3backend/README.md
index 62e5ee93cf..d9d9d4b8d2 100644
--- a/macros/latex/contrib/l3backend/README.md
+++ b/macros/latex/contrib/l3backend/README.md
@@ -1,7 +1,7 @@
LaTeX3 Backend Drivers
======================
-Release 2019-08-25
+Release 2019-09-05
This package forms parts of `expl3`, and contains the code used to interface
with backends (drivers) across the `expl3` codebase. The functions here are
diff --git a/macros/latex/contrib/l3backend/l3backend-basics.dtx b/macros/latex/contrib/l3backend/l3backend-basics.dtx
index 930d011cff..b80972ffc5 100644
--- a/macros/latex/contrib/l3backend/l3backend-basics.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -62,7 +62,7 @@
% Whilst there is a reasonable amount of code overlap between backends,
% it is much clearer to have the blocks more-or-less separated than run
% in together and DocStripped out in parts. As such, most of the following
-% is set up on a per-backed basis, though there is some common code (again
+% is set up on a per-backend basis, though there is some common code (again
% given in blocks not interspersed with other material).
%
% All the file identifiers are up-front so that they come out in the right
@@ -72,23 +72,23 @@
\ProvidesExplFile
%<*dvipdfmx>
{l3backend-dvipdfmx.def}{2019-04-06}{}
- {L3 Experimental backend support: dvipdfmx}
+ {L3 backend support: dvipdfmx}
%</dvipdfmx>
%<*dvips>
{l3backend-dvips.def}{2019-04-06}{}
- {L3 Experimental backend support: dvips}
+ {L3 backend support: dvips}
%</dvips>
%<*dvisvgm>
{l3backend-dvisvgm.def}{2019-04-06}{}
- {L3 Experimental backend support: dvisvgm}
+ {L3 backend support: dvisvgm}
%</dvisvgm>
%<*pdfmode>
{l3backend-pdfmode.def}{2019-04-06}{}
- {L3 Experimental backend support: PDF mode}
+ {L3 backend support: PDF mode}
%</pdfmode>
%<*xdvipdfmx>
{l3backend-xdvipdfmx.def}{2019-04-06}{}
- {L3 Experimental backend support: xdvipdfmx}
+ {L3 backend support: xdvipdfmx}
%</xdvipdfmx>
%</package>
% \end{macrocode}
@@ -176,7 +176,7 @@
% \__kernel_backend_align_begin:,
% \__kernel_backend_align_end:
% }
-% In \texttt{dvips} there is no build-in saving of the current
+% In \texttt{dvips} there is no built-in saving of the current
% position, and so some additional PostScript is required to set up the
% transformation matrix and also to restore it afterwards. Notice the use
% of the stack to save the current position \enquote{up front} and to
diff --git a/macros/latex/contrib/l3backend/l3backend-box.dtx b/macros/latex/contrib/l3backend/l3backend-box.dtx
index bb224d62e0..630bc99140 100644
--- a/macros/latex/contrib/l3backend/l3backend-box.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-code.pdf b/macros/latex/contrib/l3backend/l3backend-code.pdf
index 701b9dfbbf..be9d752b51 100644
--- a/macros/latex/contrib/l3backend/l3backend-code.pdf
+++ b/macros/latex/contrib/l3backend/l3backend-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3backend/l3backend-color.dtx b/macros/latex/contrib/l3backend/l3backend-color.dtx
index c67528515f..e11e68a5d2 100644
--- a/macros/latex/contrib/l3backend/l3backend-color.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-draw.dtx b/macros/latex/contrib/l3backend/l3backend-draw.dtx
index 276e1aee9f..28e7f90d1c 100644
--- a/macros/latex/contrib/l3backend/l3backend-draw.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-draw.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -393,7 +393,7 @@
\cs_new_protected:Npn \@@_backend_color_fill:n #1
{
\__kernel_backend_postscript:n
- { SDict ~ begin ~ /color.fc ~ { #1 } ~ def ~ end }
+ { /color.fc ~ { #1 } ~ def }
}
\cs_generate_variant:Nn \@@_backend_color_fill:n { x }
\cs_new_protected:Npn \@@_backend_color_stroke:n #1
diff --git a/macros/latex/contrib/l3backend/l3backend-graphics.dtx b/macros/latex/contrib/l3backend/l3backend-graphics.dtx
index 1dda6b33ca..4993de4e56 100644
--- a/macros/latex/contrib/l3backend/l3backend-graphics.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-graphics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -557,8 +557,8 @@
%<*dvisvgm>
% \end{macrocode}
%
-% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n}
-% These can be included by extracting the bounding box data.
+% \begin{macro}{\@@_backend_getbb_eps:n}
+% Simply use the generic function.
% \begin{macrocode}
%<*initex>
\use:n
@@ -566,13 +566,59 @@
%<*package>
\AtBeginDocument
%</package>
+ { \cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n}
+% These can be included by extracting the bounding box data.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
+ {
+ \int_zero:N \l_graphics_page_int
+ \tl_clear:N \l_graphics_pagebox_tl
+ \graphics_extract_bb:n {#1}
+ }
+\cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_backend_getbb_pdf:n}
+% Same as for \texttt{dvipdfmx}: use the generic function
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
{
- \cs_new_eq:NN \@@_backend_getbb_png:n \graphics_extract_bb:n
- \cs_new_eq:NN \@@_backend_getbb_jpg:n \graphics_extract_bb:n
+ \tl_clear:N \l_graphics_decodearray_tl
+ \bool_set_false:N \l_graphics_interpolate_bool
+ \graphics_extract_bb:n {#1}
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_backend_include_eps:n, \@@_backend_include_pdf:n}
+% \begin{macro}{\@@_backend_include:nn}
+% The special syntax is relatively clear here: remember we need PostScript
+% sizes here. (This is the same as the \texttt{dvips} code.)
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_include_eps:n #1
+ { @@_backend_include:nn { PSfile } {#1} }
+\cs_new_protected:Npn \@@_backend_include_pdf:n #1
+ { @@_backend_include:nn { pdffile } {#1} }
+\cs_new_protected:Npn \@@_backend_include:nn #1#2
+ {
+ \__kernel_backend_literal:x
+ {
+ #1 = #2 \c_space_tl
+ llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
+ lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
+ urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
+ ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\@@_backend_include_png:n, \@@_backend_include_jpg:n}
% \begin{macro}{\@@_backend_include_bitmap_quote:w}
% The backend here has built-in support for basic graphic inclusion (see
diff --git a/macros/latex/contrib/l3backend/l3backend-pdf.dtx b/macros/latex/contrib/l3backend/l3backend-pdf.dtx
index fc75aae39b..1f8f3591fb 100644
--- a/macros/latex/contrib/l3backend/l3backend-pdf.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -180,7 +180,7 @@
}
\cs_new_protected:Npn \@@_backend_object_write_stream:nnn #1#2#3
{
- \@@_postscript:n
+ \__kernel_backend_postscript:n
{
[nobreak]
mark ~ #1 ~ ( #3 ) /PUT ~ pdfmark ~
@@ -809,14 +809,14 @@
\cs_new_protected:Npn \@@_backend_annotation_aux:nnnn #1#2#3#4
{
\box_move_down:nn {#3}
- { \hbox:n { \@@_postscript:n { pdf.save.ll } } }
+ { \hbox:n { \__kernel_backend_postscript:n { pdf.save.ll } } }
\hbox:n {#4}
\box_move_up:nn {#2}
{
\hbox:n
{
\tex_kern:D \dim_eval:n {#1} \scan_stop:
- \@@_postscript:n { pdf.save.ur }
+ \__kernel_backend_postscript:n { pdf.save.ur }
}
}
\int_gincr:N \g_@@_backend_object_int
@@ -948,7 +948,7 @@
\cs_new_protected:Npn \@@_backend_link_begin_aux:nw #1
{
\bool_gset_true:N \g_@@_backend_link_bool
- \@@_postscript:n
+ \__kernel_backend_postscript:n
{ /pdf.link.dict ( #1 ) def }
\tl_gset:Nn \g_@@_backend_link_dict_tl {#1}
\@@_backend_link_sf_save:
@@ -985,18 +985,18 @@
%</package>
}
\box_move_down:nn { \box_dp:N \l_@@_backend_content_box }
- { \hbox:n { \@@_postscript:n { pdf.save.linkll } } }
+ { \hbox:n { \__kernel_backend_postscript:n { pdf.save.linkll } } }
\@@_breaklink_postscript:n { pdf.bordertracking.begin }
\@@_breaklink_usebox:N \l_@@_backend_content_box
\@@_breaklink_postscript:n { pdf.bordertracking.end }
\box_move_up:nn { \box_ht:N \l_@@_backend_content_box }
{
\hbox:n
- { \@@_postscript:n { pdf.save.linkur } }
+ { \__kernel_backend_postscript:n { pdf.save.linkur } }
}
\int_gincr:N \g_@@_backend_object_int
\int_gset_eq:NN \g_@@_backend_link_int \g_@@_backend_object_int
- \@@_postscript:x
+ \__kernel_backend_postscript:x
{
mark
/_objdef { pdf.obj \int_use:N \g_@@_backend_link_int }
@@ -1010,7 +1010,7 @@
\cs_new_protected:Npn \@@_backend_link_minima:
{
\hbox_set:Nn \l_@@_backend_model_box { Gg }
- \@@_postscript:x
+ \__kernel_backend_postscript:x
{
/pdf.linkdp.pad ~
\dim_to_decimal:n
@@ -1038,7 +1038,7 @@
}
\cs_new_protected:Npn \@@_backend_link_outerbox:n #1
{
- \@@_postscript:x
+ \__kernel_backend_postscript:x
{
/pdf.outerbox
[
@@ -1103,20 +1103,20 @@
{
\vbox_set:Nn \@cclv
{
- \@@_postscript:n
+ \__kernel_backend_postscript:n
{
pdf.globaldict /pdf.brokenlink.rect ~ known
{ pdf.bordertracking.continue }
if
}
\vbox_unpack_drop:N \@cclv
- \@@_postscript:n
+ \__kernel_backend_postscript:n
{ pdf.bordertracking.endpage }
}
}
}
\tl_set:Nn \l_@@_breaklink_pdfmark_tl { pdf.pdfmark }
- \cs_set_eq:NN \@@_breaklink_postscript:n \@@_postscript:n
+ \cs_set_eq:NN \@@_breaklink_postscript:n \__kernel_backend_postscript:n
\cs_set_eq:NN \@@_breaklink_usebox:N \hbox_unpack:N
}
}
@@ -1137,7 +1137,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_link_margin:n #1
{
- \@@_postscript:x
+ \__kernel_backend_postscript:x
{
/pdf.linkmargin { \dim_to_decimal:n {#1} ~ pdf.pt.dvi } def
}
@@ -1152,7 +1152,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_destination:nn #1#2
{
- \@@_postscript:n { pdf.dest.anchor }
+ \__kernel_backend_postscript:n { pdf.dest.anchor }
\@@_backend_pdfmark:x
{
/View
@@ -1181,11 +1181,11 @@
\hbox_set:Nn \l_@@_internal_box {#2}
\box_move_down:nn
{ \box_dp:N \l_@@_internal_box }
- { \hbox:n { \@@_postscript:n { pdf.save.ll } } }
+ { \hbox:n { \__kernel_backend_postscript:n { pdf.save.ll } } }
\box_use:N \l_@@_internal_box
\box_move_up:nn
{ \box_ht:N \l_@@_internal_box }
- { \hbox:n { \@@_postscript:n { pdf.save.ur } } }
+ { \hbox:n { \__kernel_backend_postscript:n { pdf.save.ur } } }
\@@_backend_pdfmark:n
{
/View
@@ -1838,7 +1838,7 @@
width ~ \dim_eval:n {#1} ~
height ~ \dim_eval:n {#2} ~
depth ~ \dim_eval:n {#3} ~
- << #4 >>
+ <</Type/Annot #4 >>
}
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index 406ef7bdc1..f1429e88df 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,19 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [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
@@ -468,7 +481,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-08-25...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2019-09-05...HEAD
+[2019-09-05]: https://github.com/latex3/latex3/compare/2019-08-25...2019-09-05
[2019-08-25]: https://github.com/latex3/latex3/compare/2019-08-14...2019-08-25
[2019-08-14]: https://github.com/latex3/latex3/compare/2019-07-25...2019-08-14
[2019-07-25]: https://github.com/latex3/latex3/compare/2019-07-01...2019-07-25
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index 1323b1293f..ecf837be4d 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2019-08-25
+Release 2019-09-05
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 7733d54a7a..b6a56617e7 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -23,7 +23,7 @@
% for those people who are interested.
%
%<*driver|generic|package>
-\def\ExplFileDate{2019-08-25}%
+\def\ExplFileDate{2019-09-05}%
%</driver|generic|package>
%<*driver>
\documentclass[full]{l3doc}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 85c664166d..1b1a37091a 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index 70ff745abf..99ffdc4729 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index d073bc8574..cb6ec390e9 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -54,7 +54,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-08-25}
+\date{Released 2019-09-05}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3alloc.dtx b/macros/latex/contrib/l3kernel/l3alloc.dtx
index 1c74174aeb..e0d20718ca 100644
--- a/macros/latex/contrib/l3kernel/l3alloc.dtx
+++ b/macros/latex/contrib/l3kernel/l3alloc.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index 8bd1bd8e6c..88dba0cf3a 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -992,7 +992,7 @@
%
% \begin{function}[EXP, added = 2019-06-02]{\use_ii_i:nn}
% \begin{syntax}
-% \cs{use_ii_i:nnn} \Arg{arg_1} \Arg{arg_2}
+% \cs{use_ii_i:nn} \Arg{arg_1} \Arg{arg_2}
% \end{syntax}
% This function absorbs two arguments and leaves the content of the
% second and first in the input stream. The category code of
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index 35ab971e15..68a668e732 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index 8067a6ca6a..dd33e0dd17 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index a92db3ebed..116d1e83ef 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -589,24 +589,6 @@
%
% \section{Additions to \pkg{l3prop}}
%
-% \begin{function}[rEXP]
-% {\prop_map_tokens:Nn, \prop_map_tokens:cn}
-% \begin{syntax}
-% \cs{prop_map_tokens:Nn} \meta{property list} \Arg{code}
-% \end{syntax}
-% Analogue of \cs{prop_map_function:NN} which maps several tokens
-% instead of a single function. The \meta{code} receives each
-% key--value pair in the \meta{property list} as two trailing brace
-% groups. For instance,
-% \begin{verbatim}
-% \prop_map_tokens:Nn \l_my_prop { \str_if_eq:nnT { mykey } }
-% \end{verbatim}
-% expands to the value corresponding to \texttt{mykey}: for each
-% pair in |\l_my_prop| the function \cs{str_if_eq:nnT} receives
-% \texttt{mykey}, the \meta{key} and the \meta{value} as its three
-% arguments. For that specific task, \cs{prop_item:Nn} is faster.
-% \end{function}
-%
% \begin{function}[EXP, added = 2016-12-06]
% {\prop_rand_key_value:N, \prop_rand_key_value:c}
% \begin{syntax}
@@ -1751,33 +1733,6 @@
%<@@=prop>
% \end{macrocode}
%
-% \begin{macro}[rEXP]{\prop_map_tokens:Nn, \prop_map_tokens:cn}
-% \begin{macro}{\@@_map_tokens:nwwn}
-% The mapping is very similar to \cs{prop_map_function:NN}. The
-% \cs{use_i:nn} removes the leading \cs{s_@@}. The odd construction
-% |\use:n {#1}| allows |#1| to contain any token without interfering
-% with \cs{prop_map_break:}. The loop stops when the argument
-% delimited by \cs{@@_pair:wn} is \cs{prg_break:} instead of being
-% empty.
-% \begin{macrocode}
-\cs_new:Npn \prop_map_tokens:Nn #1#2
- {
- \exp_last_unbraced:Nno
- \use_i:nn { \@@_map_tokens:nwwn {#2} } #1
- \prg_break: \@@_pair:wn \s_@@ { } \prg_break_point:
- \prg_break_point:Nn \prop_map_break: { }
- }
-\cs_new:Npn \@@_map_tokens:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
- {
- #2
- \use:n {#1} {#3} {#4}
- \@@_map_tokens:nwwn {#1}
- }
-\cs_generate_variant:Nn \prop_map_tokens:Nn { c }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}[EXP]
% {\prop_rand_key_value:N, \prop_rand_key_value:c}
% \begin{macro}[EXP]{\@@_rand_item:w}
@@ -2531,11 +2486,12 @@
% }
% \begin{macro}[EXP]{\@@_change_case:nNN}
% \begin{macro}[EXP]{\@@_change_case:nN}
-% \begin{macro}[EXP]{\@@_change_case_multi:n, \@@_change_case_multi:v}
-% \begin{macro}[EXP]{\@@_change_case_multi:NNNw}
-% \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:N}
+% \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,
@@ -2566,8 +2522,8 @@
{
\tl_if_exist:cTF { c_@@_mixed_case_ \token_to_str:N #1 _tl }
{
- \@@_change_case_multi:v
- { 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 }
}
@@ -2577,48 +2533,76 @@
{
\tl_if_exist:cTF { c_@@_ #1 _case_ \token_to_str:N #3 _tl }
{
- \@@_change_case_multi:v
- { 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
- { \@@_change_case:N #2 }
- { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
+ { #2 }
+ { \char_generate:nn {#1} { \@@_change_case_catcode:N #2 } }
}
-\cs_new:Npn \@@_change_case_multi:n #1
- { \@@_change_case_multi:NNNw #1 \q_no_value \q_no_value \q_stop }
-\cs_new:Npn \@@_change_case_multi:NNNw #1#2#3#4 \q_stop
+\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 #3
+ \quark_if_no_value:NTF #4
{
- \quark_if_no_value:NTF #2
- { \@@_change_case:N #1 }
- { \@@_change_case:NN #1#2 }
+ \quark_if_no_value:NTF #3
+ { \@@_change_case:NN #1 #2 }
+ { \@@_change_case:NNN #1 #2#3 }
}
- { \@@_change_case:NNN #1#2#3 }
+ { \@@_change_case:NNNN #1 #2#3#4 }
}
-\cs_generate_variant:Nn \@@_change_case_multi:n { v }
-\cs_new:Npn \@@_change_case:NN #1#2
+\cs_new:Npn \@@_change_case:NNN #1#2#3
{
\exp_args:Nnf \use:nn
- { \@@_change_case:N #1 }
- { \@@_change_case:N #2 }
+ { \@@_change_case:NN #1 #2 }
+ { \@@_change_case:NN #1 #3 }
}
-\cs_new:Npn \@@_change_case:NNN #1#2#3
+\cs_new:Npn \@@_change_case:NNNN #1#2#3#4
{
\exp_args:Nnff \use:nnn
- { \@@_change_case:N #1 }
- { \@@_change_case:N #2 }
- { \@@_change_case:N #3 }
+ { \@@_change_case:NN #1 #2 }
+ { \@@_change_case:NN #1 #3 }
+ { \@@_change_case:NN #1 #4 }
}
-\cs_new:Npn \@@_change_case:N #1
- { \char_generate:nn { `#1 } { \char_value_catcode:n { `#1 } } }
-\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: }
+\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
{
- \cs_set_eq:NN \@@_change_case:nN \use_ii:nn
+ \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
@@ -2648,7 +2632,7 @@
{ \tl_to_str:n {#2} }
{ \char_generate:nn {#1} { 12 } }
}
-\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: }
+\cs_if_exist:NF \tex_Uchar:D
{
\cs_set:Npn \@@_str_change_case:nN #1#2
{ \tl_to_str:n {#2} }
@@ -2665,6 +2649,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}[EXP]{\char_codepoint_to_bytes:n}
% \begin{macro}[EXP]{\@@_codepoint_to_bytes_auxi:n}
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index fa743396b7..f52f55d989 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index fa54e31825..1bc708f406 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3color-base.dtx b/macros/latex/contrib/l3kernel/l3color-base.dtx
index 4881aae53e..95128d0760 100644
--- a/macros/latex/contrib/l3kernel/l3color-base.dtx
+++ b/macros/latex/contrib/l3kernel/l3color-base.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index 50219502b0..ad33b60f38 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index 9c00e79283..0a43f3feac 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -79,7 +79,7 @@ and all files in that bundle must be distributed together.
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
% \maketitle
% \tableofcontents
%
@@ -1153,6 +1153,7 @@ and all files in that bundle must be distributed together.
{ n } { n }
{ o } { n }
{ f } { n }
+ { e } { n }
{ x } { n }
{ V } { n }
{ v } { n }
@@ -1258,7 +1259,9 @@ and all files in that bundle must be distributed together.
\bool_if:NT #3
{
\token_to_str:N :
- \str_if_eq:nnTF { #1 ~ } { \exp_args }
+ \bool_lazy_or:nnTF
+ { \str_if_eq_p:nn { #1 ~ } { \exp_args } }
+ { \str_if_eq_p:nn { #1 ~ } { \exp_last_unbraced } }
{ \exp_not:n {#2} }
{ \@@_signature_base_form:n {#2} }
}
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index 722ed3f484..d05845abce 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index 0327b773d4..2c369e42ae 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index a8101b0f6c..05e9064a47 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index 017c9954f7..dce560e4f6 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -625,6 +625,19 @@
% \cs{q_no_value} in the case that the file does not exist.
% \end{function}
%
+% \begin{function}[added = 2019-09-03, rEXP]{\file_full_name:n, \file_full_name:V}
+% \begin{syntax}
+% \cs{file_full_name:n} \Arg{file name}
+% \end{syntax}
+% Searches for \meta{file name} in the path as detailed for
+% \cs{file_if_exist:nTF}, and if found leaves the
+% fully-qualified name of the file, \emph{i.e.}~the path and file name,
+% in the input stream.
+% This includes an extension |.tex| when the given \meta{file name}
+% has no extension but the file found has that extension.
+% If the file is not found on the path, the expansion is empty.
+% \end{function}
+%
% \begin{function}[added = 2017-06-23, updated = 2017-06-26]
% {\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
% \begin{syntax}
@@ -650,21 +663,39 @@
% quote (|"|) characters or is surrounded by a pair of quotes.
% \end{function}
%
-% \begin{function}[noTF, added = 2017-07-11, updated = 2019-02-16]
-% {\file_get_mdfive_hash:nN}
+% \begin{function}[rEXP, added = 2019-09-03]{\file_mdfive_hash:n}
% \begin{syntax}
-% \cs{file_get_mdfive_hash:nN} \Arg{file name} \meta{tl var}
+% \cs{file_mdfive_hash:nN} \Arg{file name}
% \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}.
-% If found, sets the \meta{tl var} to the MD5 sum generated from the
-% content of the file. The file is read as bytes, which means that in
+% It then expands to leave the MD5 sum generated from the contents of
+% the file 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.
-% Where the file is not found, the \meta{tl var} will set to
-% \cs{q_no_value}.
+% is the same in all cases. When the file is not found, the result of
+% expansion is empty.
+% \end{function}
+%
+% \begin{function}[noTF, added = 2017-07-11, updated = 2019-02-16]
+% {\file_get_mdfive_hash:nN}
+% \begin{syntax}
+% \cs{file_get_mdfive_hash:nN} \Arg{file name} \meta{tl var}
+% \end{syntax}
+% Sets the \meta{tl var} to the result of applying
+% \cs{file_mdfive_hash:n} 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_size:n}
+% \begin{syntax}
+% \cs{file_size:n} \Arg{file name}
+% \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 size of the file in bytes in the input stream.
+% When the file is not found, the result of expansion is empty.
% \end{function}
%
% \begin{function}[noTF, added = 2017-07-09, updated = 2019-02-16]
@@ -672,10 +703,24 @@
% \begin{syntax}
% \cs{file_get_size:nN} \Arg{file name} \meta{tl var}
% \end{syntax}
+% Sets the \meta{tl var} to the result of applying
+% \cs{file_size:n} to the \meta{file}. If the file is not found,
+% the \meta{tl var} will be set to \cs{q_no_value}.
+% This is not available in older versions of \XeTeX{}.
+% \end{function}
+%
+% \begin{function}[rEXP, added = 2019-09-03]{\file_timestamp:n}
+% \begin{syntax}
+% \cs{file_timestamp:n} \Arg{file name}
+% \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}.
-% If found, sets the \meta{tl var} to the size of the file in bytes.
-% Where the file is not found, the \meta{tl var} will set to \cs{q_no_value}.
+% It then expands to leave the modification timestamp of
+% the file in the input stream. The timestamp is of the form
+% |D:|\meta{year}\meta{month}\meta{day}\meta{hour}^^A
+% \meta{minute}\meta{second}\meta{offset}, where the latter may be |Z|
+% (UTC) or \meta{plus-minus}\meta{hours}|'|\meta{minutes}|'|.
+% When the file is not found, the result of expansion is empty.
% This is not available in older versions of \XeTeX{}.
% \end{function}
%
@@ -684,14 +729,9 @@
% \begin{syntax}
% \cs{file_get_timestamp:nN} \Arg{file name} \meta{tl var}
% \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}.
-% If found, sets the \meta{tl var} to the modification timestamp of
-% the file in the form |D:|\meta{year}\meta{month}\meta{day}\meta{hour}^^A
-% \meta{minute}\meta{second}\meta{offset}, where the latter may be |Z|
-% (UTC) or \meta{plus-minus}\meta{hours}|'|\meta{minutes}|'|.
-% Where the file is not found, the \meta{tl var} will be set to
-% \cs{q_no_value}.
+% Sets the \meta{tl var} to the result of applying
+% \cs{file_timestamp:n} to the \meta{file}. If the file is not found,
+% the \meta{tl var} will be set to \cs{q_no_value}.
% This is not available in older versions of \XeTeX{}.
% \end{function}
%
@@ -1327,7 +1367,11 @@
% \begin{macrocode}
\cs_new_protected:Npn \iow_open:Nn #1#2
{
- \__kernel_file_name_sanitize:nN {#2} \l_@@_file_name_tl
+ \tl_set:Nx \l_@@_file_name_tl
+ {
+ \exp_args:Ne \__kernel_file_name_quote:n
+ { \__kernel_file_name_sanitize:n {#2} }
+ }
\iow_close:N #1
\seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
{ \@@_open_stream:NV #1 \l_@@_file_name_tl }
@@ -2145,13 +2189,6 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\g_@@_internal_ior}
-% A reserved stream to test for file existence.
-% \begin{macrocode}
-\ior_new:N \g_@@_internal_ior
-% \end{macrocode}
-% \end{variable}
-%
% \begin{variable}
% {
% \g_file_curr_dir_str ,
@@ -2266,46 +2303,113 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\__kernel_file_name_sanitize:nN}
-% \begin{macro}{\@@_name_quote:nN}
-% \begin{macro}{\@@_name_sanitize_aux:n}
-% For converting a token list to a string where active characters are treated
-% as strings from the start. The logic to the quoting normalisation is the
-% same as used by \texttt{lualatexquotejobname}: check for balanced |"|, and
-% assuming they balance strip all of them out before quoting the entire name
-% if it contains spaces.
+% \begin{macro}[rEXP]{\__kernel_file_name_sanitize:n}
+% \begin{macro}[rEXP]{\__kernel_file_name_expand_loop:w}
+% \begin{macro}[rEXP]{\__kernel_file_name_expand_N_type:Nw}
+% \begin{macro}[rEXP]{\__kernel_file_name_expand_group:nw}
+% \begin{macro}[rEXP]{\__kernel_file_name_expand_space:w}
+% Expanding the file name without expanding active characters is done
+% using the same token-by-token approach as for example case changing.
+% The finale outcome only need be \texttt{e}-type expandable, so there
+% is no need for the shuffling that is seen in other locations.
% \begin{macrocode}
-\cs_new_protected:Npn \__kernel_file_name_sanitize:nN #1#2
+\cs_new:Npn \__kernel_file_name_sanitize:n #1
{
- \group_begin:
- \seq_map_inline:Nn \l_char_active_seq
- {
- \tl_set:Nx \l_@@_internal_tl { \iow_char:N ##1 }
- \char_set_active_eq:NN ##1 \l_@@_internal_tl
- }
- \tl_set:Nx \l_@@_internal_tl {#1}
- \exp_args:NNNV \group_end:
- \str_set:Nn #2 \l_@@_internal_tl
+ \__kernel_file_name_expand_loop:w #1
+ \q_recursion_tail \q_recursion_stop
}
-\cs_new_protected:Npn \@@_name_quote:nN #1#2
+\cs_new:Npn \__kernel_file_name_expand_loop:w #1 \q_recursion_stop
{
- \str_set:Nx #2 {#1}
- \int_if_even:nF
- { 0 \tl_map_function:NN #2 \@@_name_quote_aux:n }
+ \tl_if_head_is_N_type:nTF {#1}
+ { \__kernel_file_name_expand_N_type:Nw }
{
- \__kernel_msg_error:nnx
- { kernel } { unbalanced-quote-in-filename } {#2}
+ \tl_if_head_is_group:nTF {#1}
+ { \__kernel_file_name_expand_group:nw }
+ { \__kernel_file_name_expand_space:w }
+ }
+ #1 \q_recursion_stop
+ }
+\cs_new:Npn \__kernel_file_name_expand_N_type:Nw #1
+ {
+ \quark_if_recursion_tail_stop:N #1
+ \bool_lazy_and:nnTF
+ { \token_if_expandable_p:N #1 }
+ {
+ \bool_not_p:n
+ {
+ \bool_lazy_any_p:n
+ {
+ { \token_if_protected_macro_p:N #1 }
+ { \token_if_protected_long_macro_p:N #1 }
+ { \token_if_active_p:N #1 }
+ }
+ }
+ }
+ { \exp_after:wN \__kernel_file_name_expand_loop:w #1 }
+ {
+ \token_to_str:N #1
+ \__kernel_file_name_expand_loop:w
+ }
+ }
+\cs_new:Npx \__kernel_file_name_expand_group:nw #1
+ {
+ \c_left_brace_str
+ \exp_not:N \__kernel_file_name_expand_loop:w
+ #1
+ \c_right_brace_str
+ }
+\exp_last_unbraced:NNo
+ \cs_new:Npx \__kernel_file_name_expand_space:w \c_space_tl
+ {
+ \c_space_tl
+ \exp_not:N \__kernel_file_name_expand_loop:w
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[rEXP]{\__kernel_file_name_quote:n}
+% \begin{macro}[rEXP]{\__kernel_file_name_quote_auxi:nnnw}
+% \begin{macro}[rEXP]{\__kernel_file_name_quote_auxii:nnn}
+% \begin{macro}[rEXP]{\__kernel_file_name_quote_auxiii:nw}
+% Quoting file name uses basically the same approach as for
+% \texttt{luaquotejobname}: count the |"| tokens, remove them then
+% re-add at the extremities.
+% \begin{macrocode}
+\cs_new:Npn \__kernel_file_name_quote:n #1
+ {
+ \__kernel_file_name_quote_auxi:nnnw {#1} { 0 } { }
+ #1 " \q_recursion_tail " \q_recursion_stop
+ }
+\cs_new:Npn \__kernel_file_name_quote_auxi:nnnw #1#2#3#4 "
+ {
+ \quark_if_recursion_tail_stop_do:nn {#4}
+ { \__kernel_file_name_quote_auxii:nnn {#1} {#2} {#3} }
+ \__kernel_file_name_quote_auxi:nnnw {#1} { #2 + 1 } { #3#4 }
+ }
+\cs_new:Npn \__kernel_file_name_quote_auxii:nnn #1#2#3
+ {
+ \int_if_even:nT {#2}
+ {
+ \__kernel_msg_expandable_error:nnn
+ { kernel } { unbalanced-quote-in-filename } {#1}
}
- \tl_remove_all:Nn #2 { " }
- \tl_if_in:NnT #2 { ~ }
- { \str_set:Nx #2 { " \exp_not:V #2 " } }
+ \__kernel_file_name_quote_auxiii:nw {#3} #3 ~ \q_nil \q_stop
+ }
+\cs_new:Npn \__kernel_file_name_quote_auxiii:nw #1 #2 ~ #3 \q_stop
+ {
+ \quark_if_nil:nTF {#3}
+ { #1 }
+ { "#1" }
}
-\cs_new:Npn \@@_name_quote_aux:n #1
- { \token_if_eq_charcode:NNT #1 " { + 1 } }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{variable}{\c_@@_marker_tl}
% The same idea as the marker for rescanning token lists: this pair of
@@ -2365,10 +2469,182 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@@_file_size:n}
+% A copy of the primitive where it's available, or the \LuaTeX{}
+% equivalent if relevant.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_file_size:n \tex_filesize:D
+\sys_if_engine_luatex:T
+ {
+ \cs_gset:Npn \@@_file_size:n #1
+ {
+ \lua_now:e
+ {
+ l3kernel.filesize
+ ( " \lua_escape:e {#1} " )
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[rEXP]{\file_full_name:n, \@@_full_name:n}
+% \begin{macro}[rEXP]{\@@_full_name:nn}
+% \begin{macro}[rEXP]{\@@_full_name_aux:nn}
+% \begin{macro}[rEXP]{\@@_full_name_aux:n}
+% \begin{macro}[rEXP]{\@@_file_name_cleanup:w}
+% \begin{macro}[rEXP]{\@@_file_name_end:}
+% \begin{macro}[rEXP]{\@@_file_name_ext_check:n}
+% \begin{macro}[rEXP]
+% {
+% \@@_file_name_ext_check_auxi:nw ,
+% \@@_file_name_ext_check_auxii:nw ,
+% \@@_file_name_ext_check_auxiii:nw
+% }
+% File searching can be carried out if the \tn{pdffilesize} primitive
+% or an equivalent is available. That of course means we need to
+% arrange for everything else to here to be done by expansion too.
+% We start off by sanitizing the name and quoting if required: we
+% may need to remove those quotes, so the raw name is passed too.
+% \begin{macrocode}
+\cs_new:Npn \file_full_name:n #1
+ {
+ \exp_args:Ne \@@_full_name:n
+ { \__kernel_file_name_sanitize:n {#1} }
+ }
+\cs_new:Npn \@@_full_name:n #1
+ {
+ \exp_args:Ne \@@_full_name:nn
+ { \__kernel_file_name_quote:n {#1} } {#1}
+ }
+% \end{macrocode}
+% First, we check of the file is just here: no mapping so we do not
+% need the break part of the broader auxiliary. We are using the fact
+% that the primitive here returns nothing if the file is entirely absent.
+% For package mode, \tn{input@path} is a token list not a sequence.
+% \begin{macrocode}
+\cs_new:Npn \@@_full_name:nn #1#2
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \tl_if_blank:eTF { \@@_file_size:n {#1} }
+ {
+ \seq_map_tokens:Nn \l_file_search_path_seq
+ { \@@_full_name_aux:nn {#2} }
+%<*package>
+ \cs_if_exist:NT \input@path
+ {
+ \tl_map_tokens:Nn \input@path
+ { \@@_full_name_aux:nn {#2} }
+ }
+%</package>
+ \@@_file_name_end:
+ }
+ { \@@_file_ext_check:n {#1} }
+ }
+ }
+% \end{macrocode}
+% Two pars to the auxiliary here so we can avoid doing quoting
+% twice in the event we find the right file.
+% \begin{macrocode}
+\cs_new:Npn \@@_full_name_aux:nn #1#2
+ {
+ \exp_args:Ne \@@_full_name_aux:n
+ { \__kernel_file_name_quote:e { \tl_to_str:n {#2} #1 } }
+ }
+\cs_new:Npn \@@_full_name_aux:n #1
+ {
+ \tl_if_blank:eF { \@@_file_size:n {#1} }
+ {
+ \seq_map_break:n
+ {
+ \@@_file_ext_check:n {#1}
+ \@@_file_name_cleanup:w
+ }
+ }
+ }
+\cs_new:Npn \@@_file_name_cleanup:w #1 \@@_file_name_end:n #2 { }
+\cs_new:Npn \@@_file_name_end: { }
+% \end{macrocode}
+% As \TeX{} automatically adds |.tex| if there is no extension,
+% there is a little clean up to do here. First, find the file
+% extension if present, ignoring any quotes and avoiding dots in
+% the path.(The quoted name is retained for the common case that
+% there is no additional work to do.)
+% \begin{macrocode}
+\cs_new:Npn \@@_file_ext_check:n #1
+ { \@@_file_ext_check_auxi:nw {#1} #1 " #1 " \q_stop }
+\cs_new:Npn \@@_file_ext_check_auxi:nw #1#2 " #3 " #4 \q_stop
+ { \@@_file_ext_check_auxii:nw {#1} #3 / \q_nil / \q_stop }
+\cs_new:Npn \@@_file_ext_check_auxii:nw #1#2 / #3 / #4 \q_stop
+ {
+ \quark_if_nil:nTF {#3}
+ { \@@_file_ext_check_auxiii:nw {#1} #2 . \q_nil . \q_stop }
+ { \@@_file_ext_check_auxii:nw {#1} #3 / #4 \q_stop }
+ }
+\cs_new:Npx \@@_file_ext_check_auxiii:nw #1#2 . #3 . #4 \q_stop
+ {
+ \exp_not:N \quark_if_nil:nTF {#3}
+ { \exp_not:N \__kernel_file_name_quote:n { #1 \tl_to_str:n { .tex } } }
+ {#1}
+ }
+% \end{macrocode}
+% Deal with the fact that the primitive might not be available.
+% \begin{macrocode}
+\bool_lazy_or:nnF
+ { \cs_if_exist_p:N \tex_filesize:D }
+ { \sys_if_engine_luatex_p: }
+ {
+ \cs_gset:Npn \file_full_name:n #1
+ {
+ \__kernel_msg_expandable_error:nnn
+ { kernel } { primitive-not-available }
+ { \(pdf)filesize }
+ }
+ }
+\__kernel_msg_new:nnnn { kernel } { primitive-not-available }
+ { Primitive~\token_to_str:N #1 not~available }
+ {
+ The~version~of~your~TeX~engine~does~not~provide~functionality~equivalent~to~
+ the~#1~primitive.
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\file_get_full_name:nN, \file_get_full_name:VN}
% \begin{macro}[TF]{\file_get_full_name:nN, \file_get_full_name:VN}
% \begin{macro}{\@@_get_full_name_search:nN}
-% The way to test if a file exists is to try to open it: if it does
+% These functions pre-date using \cs{tex_filesize:D} for file searching,
+% so are |get| functions with protection. To avoid having different
+% search set ups, they are simply wrappers around the code above.
+% \begin{macrocode}
+\cs_new_protected:Npn \file_get_full_name:nN #1#2
+ {
+ \file_get_full_name:nNF {#1} #2
+ { \tl_set:Nn #2 { \q_no_value } }
+ }
+\cs_generate_variant:Nn \file_get_full_name:nN { V }
+\prg_new_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
+ {
+ \tl_set:Nx #2
+ { \file_full_name:n {#1} }
+ \tl_if_empty:NTF #2
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+\cs_generate_variant:Nn \file_get_full_name:nNT { V }
+\cs_generate_variant:Nn \file_get_full_name:nNF { V }
+\cs_generate_variant:Nn \file_get_full_name:nNTF { V }
+% \end{macrocode}
+% If \cs{tex_filesize:D} is not available, the
+% way to test if a file exists is to try to open it: if it does
% not exist then \TeX{} reports end-of-file. A search is made
% looking at each potential path in turn (starting from the current
% directory). The first location is of course treated as the correct
@@ -2378,55 +2654,52 @@
% existence of the file with |.tex| extension in that directory, and
% if it exists we include the |.tex| extension in the result.
% \begin{macrocode}
-\cs_new_protected:Npn \file_get_full_name:nN #1#2
- {
- \file_get_full_name:nNF {#1} #2
- { \tl_set:Nn #2 { \q_no_value } }
- }
-\cs_generate_variant:Nn \file_get_full_name:nN { V }
-\prg_new_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
+\bool_lazy_or:nnF
+ { \cs_if_exist_p:N \tex_filesize:D }
+ { \sys_if_engine_luatex_p: }
{
- \__kernel_file_name_sanitize:nN {#1} \l_@@_base_name_tl
- \@@_get_full_name_search:nN { } \use:n
- \seq_map_inline:Nn \l_file_search_path_seq
- { \@@_get_full_name_search:nN { ##1 / } \seq_map_break:n }
-%<*package>
- \cs_if_exist:NT \input@path
+ \prg_set_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
{
- \tl_map_inline:Nn \input@path
- { \@@_get_full_name_search:nN { ##1 } \tl_map_break:n }
- }
+ \@@_get_full_name_search:nN { } \use:n
+ \seq_map_inline:Nn \l_file_search_path_seq
+ { \@@_get_full_name_search:nN { ##1 / } \seq_map_break:n }
+%<*package>
+ \cs_if_exist:NT \input@path
+ {
+ \tl_map_inline:Nn \input@path
+ { \@@_get_full_name_search:nN { ##1 } \tl_map_break:n }
+ }
%</package>
- \tl_set:Nn \l_@@_full_name_tl { \q_no_value }
- \prg_break_point:
- \quark_if_no_value:NTF \l_@@_full_name_tl
- {
- \ior_close:N \g_@@_internal_ior
- \prg_return_false:
- }
- {
- \file_parse_full_name:VNNN \l_@@_full_name_tl
- \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
- \str_if_empty:NT \l_@@_ext_str
+ \tl_set:Nn \l_@@_full_name_tl { \q_no_value }
+ \prg_break_point:
+ \quark_if_no_value:NTF \l_@@_full_name_tl
{
- \__kernel_ior_open:No \g_@@_internal_ior
- { \l_@@_full_name_tl .tex }
- \ior_if_eof:NF \g_@@_internal_ior
- { \tl_put_right:Nn \l_@@_full_name_tl { .tex } }
+ \ior_close:N \g_@@_internal_ior
+ \prg_return_false:
+ }
+ {
+ \file_parse_full_name:VNNN \l_@@_full_name_tl
+ \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+ \str_if_empty:NT \l_@@_ext_str
+ {
+ \__kernel_ior_open:No \g_@@_internal_ior
+ { \l_@@_full_name_tl .tex }
+ \ior_if_eof:NF \g_@@_internal_ior
+ { \tl_put_right:Nn \l_@@_full_name_tl { .tex } }
+ }
+ \ior_close:N \g_@@_internal_ior
+ \tl_set_eq:NN #2 \l_@@_full_name_tl
+ \prg_return_true:
}
- \ior_close:N \g_@@_internal_ior
- \tl_set_eq:NN #2 \l_@@_full_name_tl
- \prg_return_true:
}
}
-\cs_generate_variant:Nn \file_get_full_name:nNT { V }
-\cs_generate_variant:Nn \file_get_full_name:nNF { V }
-\cs_generate_variant:Nn \file_get_full_name:nNTF { V }
\cs_new_protected:Npn \@@_get_full_name_search:nN #1#2
{
- \@@_name_quote:nN
- { \tl_to_str:n {#1} \l_@@_base_name_tl }
- \l_@@_full_name_tl
+ \tl_set:Nx \l_@@_full_name_tl
+ {
+ \exp_args:Ne \__kernel_file_name_quote:n
+ { \tl_to_str:n {#1} \l_@@_base_name_tl }
+ }
\__kernel_ior_open:No \g_@@_internal_ior \l_@@_full_name_tl
\ior_if_eof:NF \g_@@_internal_ior { #2 { \prg_break: } }
}
@@ -2434,17 +2707,63 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \begin{variable}{\g_@@_internal_ior}
+% A reserved stream to test for file existence, if required.
+% \begin{macrocode}
+\bool_lazy_or:nnF
+ { \cs_if_exist_p:N \tex_filesize:D }
+ { \sys_if_engine_luatex_p: }
+ { \ior_new:N \g_@@_internal_ior }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[rEXP]{\file_mdfive_hash:n, \file_size:n, \file_timestamp:n}
+% \begin{macro}[rEXP]{\@@_details:nn, \@@_details_aux:nn}
+% \begin{macro}[rEXP]{\@@_mdfive_hash:n}
+% Getting file details by expansion is relatively easy if a bit repetitive.
+% As the MD5 function has a slightly different syntax from the other commands,
+% there is a little cleaning up to do.
+% \begin{macrocode}
+\cs_new:Npn \file_mdfive_hash:n #1
+ { \@@_details:nn {#1} { mdfivesum } }
+\cs_new:Npn \file_size:n #1
+ { \@@_details:nn {#1} { size } }
+\cs_new:Npn \file_timestamp:n #1
+ { \@@_details:nn {#1} { moddate } }
+\cs_new:Npn \@@_details:nn #1#2
+ {
+ \exp_args:Ne \@@_details_aux:nn
+ { \file_full_name:n {#1} } {#2}
+ }
+\cs_new:Npn \@@_details_aux:nn #1#2
+ {
+ \tl_if_blank:nF {#1}
+ { \use:c { tex_file #2 :D } {#1} }
+ }
+\sys_if_engine_luatex:TF
+ {
+ \cs_gset:Npn \@@_details_aux:nn #1#2
+ {
+ \lua_now:e
+ { l3kernel.file#2 ( " \lua_escape:e { #1 } " ) }
+ }
+ }
+ {
+ \cs_gset:Npn \file_mdfive_hash:n #1
+ { \exp_args:Ne \@@_mdfive_hash:n { \file_full_name:n {#1} } }
+ \cs_new:Npn \@@_mdfive_hash:n #1
+ { \tex_mdfivesum:D file {#1} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {\file_get_mdfive_hash:nN, \file_get_size:nN, \file_get_timestamp:nN}
% \begin{macro}{\@@_get_details:nnN}
-% These are all wrappers around the \pdfTeX{} primitives doing the same
-% jobs: as we want consistent file paths to be found, they are all set up
-% using \cs{file_get_full_name:nN} and so are non-expandable \texttt{get}
-% functions. Much of the code is repetitive but we need to branch for
-% \LuaTeX{} (emulation in Lua), for the slightly different syntax
-% needed for \tn{tex_mdfivesum:D} and for the fact that primitive
-% coverage varies in other engines.
+% Non-expandable wrappers around the above in the case where appropriate
+% primitive support exists.
% \begin{macrocode}
\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 } } }
@@ -2453,76 +2772,44 @@
\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_mdfive_hash:nN #1#2 { T , F , TF }
- { \@@_get_details:nnN {#1} { mdfivesum } {#2} }
+ { \@@_get_details:nnN {#1} { mdfive_hash } #2 }
\prg_new_protected_conditional:Npnn \file_get_size:nN #1#2 { T , F , TF }
- { \@@_get_details:nnN {#1} { size } {#2} }
+ { \@@_get_details:nnN {#1} { size } #2 }
\prg_new_protected_conditional:Npnn \file_get_timestamp:nN #1#2 { T , F , TF }
- { \@@_get_details:nnN {#1} { moddate } {#2} }
+ { \@@_get_details:nnN {#1} { timestamp } #2 }
\cs_new_protected:Npn \@@_get_details:nnN #1#2#3
{
- \file_get_full_name:nNTF {#1} \l_@@_full_name_tl
- {
- \tl_set:Nx #3
- {
- \use:c { tex_file #2 :D } \exp_after:wN
- { \l_@@_full_name_tl }
- }
- \prg_return_true:
- }
+ \tl_set:Nx #3
+ { \use:c { file_ #2 :n } {#1} }
+ \tl_if_empty:NTF #3
{ \prg_return_false: }
+ { \prg_return_true: }
}
-\sys_if_engine_luatex:TF
+% \end{macrocode}
+% Where the primitive is not available, issue an error: this is a little
+% more conservative than absolutely needed, but does work.
+% \begin{macrocode}
+\bool_lazy_or:nnF
+ { \cs_if_exist_p:N \tex_filesize:D }
+ { \sys_if_engine_luatex_p: }
{
\cs_set_protected:Npn \@@_get_details:nnN #1#2#3
- {
- \file_get_full_name:nNTF {#1} \l_@@_full_name_tl
- {
- \tl_set:Nx #3
- {
- \lua_now:e
- {
- l3kernel.file#2
- ( " \lua_escape:e { \l_@@_full_name_tl } " )
- }
- }
- \prg_return_true:
- }
- { \prg_return_false: }
- }
- }
- {
- \prg_set_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2
- { T , F , TF }
- {
- \file_get_full_name:nNTF {#1} \l_@@_full_name_tl
+ {
+ \tl_clear:N #3
+ \__kernel_msg_error:nnx
+ { kernel } { primitive-not-available }
{
- \tl_set:Nx #2
+ \token_to_str:N \(pdf)file
+ \str_case:nn {#2}
{
- \tex_mdfivesum:D file \exp_after:wN
- { \l_@@_full_name_tl }
+ { mdfive_hash } { mdfivesum }
+ { timestamp } { moddate }
+ { size } { size }
}
- \prg_return_true:
- }
- { \prg_return_false: }
- }
- \cs_if_exist:NF \tex_filesize:D
- {
- \cs_set_protected:Npn \@@_get_details:nnN #1#2#3
- {
- \tl_clear:N #3
- \__kernel_msg_error:nnx
- { kernel } { primitive-not-available }
- { \exp_not:c { (pdf)file #2 } }
- \prg_return_false:
}
+ \prg_return_false:
}
}
-\__kernel_msg_new:nnnn { kernel } { primitive-not-available }
- { Primitive~\token_to_str:N #1 not~available }
- {
- The~version~of~XeTeX~in~use~does~not~provide~functionality~equivalent~to~
- the~\token_to_str:N #1 primitive.
- }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2573,9 +2860,8 @@
% \begin{macrocode}
\cs_new_protected:Npn \__kernel_file_missing:n #1
{
- \__kernel_file_name_sanitize:nN {#1} \l_@@_base_name_tl
\__kernel_msg_error:nnx { kernel } { file-not-found }
- { \l_@@_base_name_tl }
+ { \__kernel_file_name_sanitize:n {#1} }
}
% \end{macrocode}
% \end{macro}
@@ -2778,6 +3064,11 @@
% \begin{macrocode}
\cs_new_protected:Npn \GetIdInfo
{
+ \tl_clear_new:N \ExplFileDescription
+ \tl_clear_new:N \ExplFileDate
+ \tl_clear_new:N \ExplFileName
+ \tl_clear_new:N \ExplFileExtension
+ \tl_clear_new:N \ExplFileVersion
\group_begin:
\char_set_catcode_space:n { 32 }
\exp_after:wN
diff --git a/macros/latex/contrib/l3kernel/l3final.dtx b/macros/latex/contrib/l3kernel/l3final.dtx
index 13ad327dbc..03dafcd76f 100644
--- a/macros/latex/contrib/l3kernel/l3final.dtx
+++ b/macros/latex/contrib/l3kernel/l3final.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index 7b829b4418..28bfba42a0 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index 0245f807f7..4be91184e4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index 616cce45f3..3e540bce70 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index 4c0e12ffcf..cb86fc8367 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index cd545aec51..144000e440 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index 72c4020d6c..d39e587462 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index d78a029038..09351e062c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index c0584cde42..bbe64af191 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index b3d7b32bc8..22e3d4f3ed 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 9c74c70774..9cde69190c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index 9bedd90aab..5638c5fa7b 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index aad063f831..b79ee0deeb 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index 085641bafd..f3ac40570c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index a74b27f900..89c24f80cd 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index 5a80f4cfe0..3ef4928572 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index 7c0dd3caec..865c4629f2 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index a371b6ee63..9a2dc16f36 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index e8d675eeba..c315f69ee9 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index 074ca85b6e..abb636a365 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index 90ca8c5d0e..bee9d5ff9c 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index 9557fc8a08..acee969aee 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index d005a8131f..1bcd3418ea 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index 9f0bc82400..ee129a9c1f 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv
index 1e28ce8fbf..479d4adc5f 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/contrib/l3kernel/l3prefixes.csv
@@ -38,6 +38,7 @@ ctex,ctex,Qing Lee,https://github.com/CTeX-org/ctex-kit,https://github.com/CTeX-
ctuthesis,ctuthesis,Tom Hejda,https://github.com/tohecz/ctuthesis,https://github.com/tohecz/ctuthesis.git,https://github.com/tohecz/ctuthesis/issues,2015-07-26,2015-07-26,
debug,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2017-07-15,2017-07-15,
deriv,derivative,Simon Jensen,,,,2019-07-24,2019-07-24,
+diffcoeff,diffcoeff,Andrew Parsloe,,,,2019-08-26,2019-08-26,
dim,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,
document,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
dollar,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,
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index e74cb29e43..ae0df11080 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index 5e4fa7732c..df8726d1f1 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index d79073065d..cd2f51c998 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -353,6 +353,8 @@
% each iteration: the \meta{key} and associated \meta{value}.
% The order in which \meta{entries} are returned is not defined and
% should not be relied upon.
+% To pass further arguments to the \meta{function}, see
+% \cs{prop_map_tokens:Nn}.
% \end{function}
%
% \begin{function}[updated = 2013-01-08]
@@ -368,6 +370,24 @@
% should not be relied upon.
% \end{function}
%
+% \begin{function}[rEXP]
+% {\prop_map_tokens:Nn, \prop_map_tokens:cn}
+% \begin{syntax}
+% \cs{prop_map_tokens:Nn} \meta{property list} \Arg{code}
+% \end{syntax}
+% Analogue of \cs{prop_map_function:NN} which maps several tokens
+% instead of a single function. The \meta{code} receives each
+% key--value pair in the \meta{property list} as two trailing brace
+% groups. For instance,
+% \begin{verbatim}
+% \prop_map_tokens:Nn \l_my_prop { \str_if_eq:nnT { mykey } }
+% \end{verbatim}
+% expands to the value corresponding to \texttt{mykey}: for each
+% pair in |\l_my_prop| the function \cs{str_if_eq:nnT} receives
+% \texttt{mykey}, the \meta{key} and the \meta{value} as its three
+% arguments. For that specific task, \cs{prop_item:Nn} is faster.
+% \end{function}
+%
% \begin{function}[updated = 2012-06-29, rEXP]{\prop_map_break:}
% \begin{syntax}
% \cs{prop_map_break:}
@@ -1215,6 +1235,34 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[rEXP]{\prop_map_tokens:Nn, \prop_map_tokens:cn}
+% \begin{macro}{\@@_map_tokens:nwwn}
+% The mapping is very similar to \cs{prop_map_function:NN}. The
+% \cs{use_i:nn} removes the leading \cs{s_@@}. The odd construction
+% |\use:n {#1}| allows |#1| to contain any token without interfering
+% with \cs{prop_map_break:}. The loop stops when the argument
+% delimited by \cs{@@_pair:wn} is \cs{prg_break:} instead of being
+% empty.
+% \begin{macrocode}
+\cs_new:Npn \prop_map_tokens:Nn #1#2
+ {
+ \exp_last_unbraced:Nno
+ \use_i:nn { \@@_map_tokens:nwwn {#2} } #1
+ \prg_break: \@@_pair:wn \s_@@ { } \prg_break_point:
+ \prg_break_point:Nn \prop_map_break: { }
+ }
+\cs_new:Npn \@@_map_tokens:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
+ {
+ #2
+ \use:n {#1} {#3} {#4}
+ \@@_map_tokens:nwwn {#1}
+ }
+\cs_generate_variant:Nn \prop_map_tokens:Nn { c }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
% \begin{macro}[tested = m3prop003]{\prop_map_break:}
% \begin{macro}[tested = m3prop003]{\prop_map_break:n}
% The break statements are based on the general \cs{prg_map_break:Nn}.
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index 9ef207f346..a3a3ab9bc8 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index f4f3fb1ddd..3a44b40ce0 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -656,7 +656,7 @@
% \cs{regex_replace_all:nnN} \Arg{regular expression} \Arg{replacement} \meta{tl~var}
% \cs{regex_replace_all:nnNTF} \Arg{regular expression} \Arg{replacement} \meta{tl~var} \Arg{true code} \Arg{false code}
% \end{syntax}
-% Replaces all occurrences of the \cs{regular expression} in the
+% Replaces all occurrences of the \meta{regular expression} in the
% \meta{token list} by the \meta{replacement}, where |\0| represents
% the full match, |\1| represent the contents of the first capturing
% group, |\2| of the second, \emph{etc.} Every match is treated
@@ -697,7 +697,7 @@
% non-implemented syntax.
% \item Test for the maximum register \cs{c_max_register_int}.
% \item Find out whether the fact that |\W| and friends match the
-% end-marker leads to bugs. Possibly update \cs{__regex_item_reverse:n}.
+% end-marker leads to bugs. Possibly update \cs[no-index]{__regex_item_reverse:n}.
% \item The empty cs should be matched by |\c{}|, not by
% |\c{csname.?endcsname\s?}|.
% \end{itemize}
@@ -709,21 +709,21 @@
% \item Only build |\c{...}| once.
% \item Use arrays for the left and right state stacks when
% compiling a regex.
-% \item Should \cs{__regex_action_free_group:n} only be used for greedy
+% \item Should \cs[no-index]{__regex_action_free_group:n} only be used for greedy
% |{n,}| quantifier? (I think not.)
% \item Quantifiers for |\u| and assertions.
% \item When matching, keep track of an explicit stack of
% \texttt{current_state} and \texttt{current_submatches}.
% \item If possible, when a state is reused by the same thread, kill
% other subthreads.
-% \item Use an array rather than \cs{l__regex_balance_tl}
-% to build the function \cs{__regex_replacement_balance_one_match:n}.
+% \item Use an array rather than \cs[no-index]{l__regex_balance_tl}
+% to build the function \cs[no-index]{__regex_replacement_balance_one_match:n}.
% \item Reduce the number of epsilon-transitions in alternatives.
% \item Optimize simple strings: use less states (|abcade| should give
% two states, for |abc| and |ade|). [Does that really make sense?]
% \item Optimize groups with no alternative.
-% \item Optimize states with a single \cs{__regex_action_free:n}.
-% \item Optimize the use of \cs{__regex_action_success:} by inserting it
+% \item Optimize states with a single \cs[no-index]{__regex_action_free:n}.
+% \item Optimize the use of \cs[no-index]{__regex_action_success:} by inserting it
% in state $2$ directly instead of having an extra transition.
% \item Optimize the use of \cs{int_step_...} functions.
% \item Groups don't capture within regexes for csnames; optimize and
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index 2a0083bd6a..91bb0784fa 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -498,6 +498,8 @@
% Applies \meta{function} to every \meta{item} stored in the
% \meta{sequence}. The \meta{function} will receive one argument for
% each iteration. The \meta{items} are returned from left to right.
+% To pass further arguments to the \meta{function}, see
+% \cs{seq_map_tokens:Nn}.
% The function \cs{seq_map_inline:Nn} is faster than
% \cs{seq_map_function:NN} for sequences with more than about~$10$
% items.
@@ -514,6 +516,23 @@
% The \meta{items} are returned from left to right.
% \end{function}
%
+% \begin{function}[rEXP, added = 2019-08-30]
+% {\seq_map_tokens:Nn, \seq_map_tokens:cn}
+% \begin{syntax}
+% \cs{seq_map_tokens:Nn} \meta{sequence} \Arg{code}
+% \end{syntax}
+% Analogue of \cs{seq_map_function:NN} which maps several tokens
+% instead of a single function. The \meta{code} receives each item in
+% the \meta{sequence} as two trailing brace groups. For instance,
+% \begin{verbatim}
+% \seq_map_tokens:Nn \l_my_seq { \prg_replicate:nn { 2 } }
+% \end{verbatim}
+% expands to twice each item in the \meta{sequence}: for each item in
+% |\l_my_seq| the function \cs{prg_replicate:nn} receives |2| and
+% \meta{item} as its two arguments. The function
+% \cs{seq_map_inline:Nn} is typically faster but is not expandable.
+% \end{function}
+%
% \begin{function}[updated = 2012-06-29]
% {
% \seq_map_variable:NNn, \seq_map_variable:Ncn,
@@ -1835,6 +1854,31 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\seq_map_tokens:Nn, \seq_map_tokens:cn}
+% \begin{macro}{\@@_map_tokens:nw}
+% This is based on the function mapping but using the same tricks as
+% described for \cs{prop_map_tokens:Nn}. The idea is to remove the leading
+% \cs{s_@@} and apply the tokens such that they are safe with the
+% break points, hence the \cs{use:n}.
+% \begin{macrocode}
+\cs_new:Npn \seq_map_tokens:Nn #1#2
+ {
+ \exp_last_unbraced:Nno
+ \use_i:nn { \@@_map_tokens:nw {#2} } #1
+ \prg_break: \@@_item:n { } \prg_break_point:
+ \prg_break_point:Nn \seq_map_break: { }
+ }
+\cs_generate_variant:Nn \seq_map_tokens:Nn { c }
+\cs_new:Npn \@@_map_tokens:nw #1#2 \@@_item:n #3
+ {
+ #2
+ \use:n {#1} {#3}
+ \@@_map_tokens:nw {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}
% {
% \seq_map_variable:NNn, \seq_map_variable:Ncn,
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index 7f08680583..3985d09297 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index ddff3a8583..8e8ca964aa 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index 1343955f7a..90ed9bcc75 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -186,7 +186,7 @@
% encoding. Instead, the \meta{false code} is performed.
% \end{function}
%
-% \section{Creating $8$-bit mappings}
+% \section[Creating 8-bit mappings]{Creating $8$-bit mappings}
%
% \begin{function}{\str_declare_eight_bit_encoding:nnn}
% \begin{syntax}
@@ -218,8 +218,8 @@
% \item The \texttt{hex} unescaping should raise an error for
% odd-token count strings.
% \item Decide what bytes should be escaped in the \texttt{url}
-% escaping. Perhaps |!'()*-./0123456789_| are safe, and all other
-% characters should be escaped?
+% escaping. Perhaps the characters |!'()*-./0123456789_| are safe,
+% and all other characters should be escaped?
% \item Automate generation of 8-bit mapping files.
% \item Change the framework for 8-bit encodings: for decoding from
% 8-bit to Unicode, use $256$ integer registers; for encoding, use a
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index 32dd203cfc..453d341acb 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -656,7 +656,11 @@
% \iow_term:x { \str_range:nnn { abcdef } { -1 } { -4 } }
% \end{verbatim}
% both yield empty strings.
+% \end{function}
%
+% ^^A If this stays in the same {function} environment, we get a really
+% ^^A awful page break. Perhaps we should add a way to allow a page break
+% ^^A in a function environment...
% The behavior of \cs{str_range_ignore_spaces:nnn} is similar, but spaces
% are removed before starting the job. The input
% \begin{verbatim}
@@ -682,7 +686,7 @@
% \end{verbatim}
% will print four instances of |bcde|, four instances of |bc e| and eight
% instances of |bcde|.
-% \end{function}
+% ^^A\end{function}
%
% \section{String manipulation}
%
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index 44fc265426..7496e9ab9d 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex
index c7221fc0b2..71ae29811f 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/contrib/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-08-25}
+\date{Released 2019-09-05}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index d1b0806fac..7cf935391f 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
index 321657dfb7..a6e1d79168 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-08-25}
+\date{Released 2019-09-05}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 149c577188..01deeba0be 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index eab36989e0..9e71294b76 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex
index ac68e5e525..20594bac35 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-08-25}
+\date{Released 2019-09-05}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index 02e08827b4..d5803a0bc4 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index 77444e6d13..d0325848e3 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
@@ -353,7 +353,8 @@
%
% \section{Token list conditionals}
%
-% \begin{function}[EXP,pTF]{\tl_if_blank:n, \tl_if_blank:V, \tl_if_blank:o}
+% \begin{function}[EXP,pTF, updated = 2019-09-04]
+% {\tl_if_blank:n, \tl_if_blank:e, \tl_if_blank:V, \tl_if_blank:o}
% \begin{syntax}
% \cs{tl_if_blank_p:n} \Arg{token list}
% \cs{tl_if_blank:nTF} \Arg{token list} \Arg{true code} \Arg{false code}
@@ -551,6 +552,25 @@
% receives the \meta{item} as |#1|. See also \cs{tl_map_function:nN}.
% \end{function}
%
+% \begin{function}[rEXP, added = 2019-09-02]
+% {\tl_map_tokens:Nn, \tl_map_tokens:cn, \tl_map_tokens:nn}
+% \begin{syntax}
+% \cs{tl_map_tokens:Nn} \meta{tl~var} \Arg{code}
+% \cs{tl_map_tokens:nn} \meta{tokens} \Arg{code}
+% \end{syntax}
+% Analogue of \cs{tl_map_function:NN} which maps several tokens
+% instead of a single function. The \meta{code} receives each item in
+% the \meta{tl~var} or \meta{tokens} as two trailing brace groups. For
+% instance,
+% \begin{verbatim}
+% \tl_map_tokens:Nn \l_my_tl { \prg_replicate:nn { 2 } }
+% \end{verbatim}
+% expands to twice each item in the \meta{sequence}: for each item in
+% |\l_my_tl| the function \cs{prg_replicate:nn} receives |2| and
+% \meta{item} as its two arguments. The function
+% \cs{tl_map_inline:Nn} is typically faster but is not expandable.
+% \end{function}
+%
% \begin{function}[updated = 2012-06-29]
% {\tl_map_variable:NNn, \tl_map_variable:cNn}
% \begin{syntax}
@@ -1065,12 +1085,11 @@
% Leaves in the input stream the items from the \meta{start index} to the
% \meta{end index} inclusive. Spaces and braces are preserved between
% the items returned (but never at either end of the list).
-%
% Here \meta{start index} and \meta{end index} should be integer denotations.
% For describing in detail the functions' behavior, let $m$ and $n$ be the start
% and end index respectively. If either is $0$, the result is empty. A positive
-% index means `start counting from the left end', a negative index means
-% `start counting from the right end'. Let $l$ be the count of the token list.
+% index means `start counting from the left end', and a negative index means
+% `from the right end'. Let $l$ be the count of the token list.
%
% The \emph{actual start point} is determined as $M=m$ if~$m>0$ and as $M=l+m+1$
% if~$m<0$. Similarly the \emph{actual end point} is $N=n$ if~$n>0$ and $N=l+n+1$
@@ -1110,16 +1129,17 @@
% \begin{verbatim}
% \tl_range:nnn { abcd~{e{}}f } { 2 } { 4 }
% \end{verbatim}
-% will discard the space after `d`.
+% will discard the space after `d'.
%
-% If we want to get the items from the third to the last, the call
+% If we want to get the items from, say, the third to the last in a token
+% list |<tl>|, the call
% is |\tl_range:nnn { <tl> } { 3 } { -1 }|. Similarly, for discarding
% the last item, we can do |\tl_range:nnn { <tl> } { 1 } { -2 }|.
%
-% The behavior of \cs{tl_range:Nnn} is exactly the same, acting on the
-% contents of the tl variable.
+%^^A The behavior of \cs{tl_range:Nnn} is exactly the same, acting on the
+%^^A contents of the tl variable.
%
-% For improved performance, see \cs{tl_range_braced:nnn} and
+% For better performance, see \cs{tl_range_braced:nnn} and
% \cs{tl_range_unbraced:nnn}.
% \begin{texnote}
% The result is returned within the \tn{unexpanded}
@@ -2033,7 +2053,7 @@
\fi:
}
\prg_generate_conditional_variant:Nnn \tl_if_blank:n
- { V , o } { p , T , F , TF }
+ { e , V , o } { p , T , F , TF }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2408,6 +2428,31 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\tl_map_tokens:nn}
+% \begin{macro}{\tl_map_tokens:Nn, \tl_map_tokens:cn}
+% \begin{macro}{\@@_map_tokens:nn}
+% Much like the function mapping.
+% \begin{macrocode}
+\cs_new:Npn \tl_map_tokens:nn #1#2
+ {
+ \@@_map_tokens:nn {#2} #1
+ \q_recursion_tail
+ \prg_break_point:Nn \tl_map_break: { }
+ }
+\cs_new:Npn \tl_map_tokens:Nn
+ { \exp_args:No \tl_map_tokens:nn }
+\cs_generate_variant:Nn \tl_map_tokens:Nn { c }
+\cs_new:Npn \@@_map_tokens:nn #1#2
+ {
+ \quark_if_recursion_tail_break:nN {#2} \tl_map_break:
+ \use:n {#1} {#2}
+ \@@_map_tokens:nn {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\tl_map_variable:nNn}
% \begin{macro}{\tl_map_variable:NNn, \tl_map_variable:cNn}
% \begin{macro}{\@@_map_variable:Nnn}
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index 9b9946a4f8..489baa08e3 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index fbaa465935..55845d7645 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-08-25}
+% \date{Released 2019-09-05}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index 35d62f49f4..81896b51b8 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex
index 021b8111cf..92910abacb 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/contrib/l3kernel/source3.tex
@@ -53,7 +53,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2019-08-25}
+\date{Released 2019-09-05}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/mismath/mismath.dtx b/macros/latex/contrib/mismath/mismath.dtx
index 5ec076d17a..022117487b 100644
--- a/macros/latex/contrib/mismath/mismath.dtx
+++ b/macros/latex/contrib/mismath/mismath.dtx
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{mismath}
- [2019/06/22 v1.5 .dtx mismath file]
+ [2019/09/06 v1.6 .dtx mismath file]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -85,12 +85,13 @@
% creating general @moperator macro, using mathup instead of mathrm}
% \changes{v1.2}{2019/04/27}{Added mathtools package, font definition Roman -> up,
% changes in documentation, removing the PEroman macro}
-% \changes{v1.3}{2019/05/05}{Using bslash in the internal @mwarning macro}
+% \changes{v1.3}{2019/05/05}{Using bslash in the internal @mwarning macro, loading of mathfixs package}
% \changes{v1.3}{2019/05/08}{Many corrections in documentation}
% \changes{v1.4}{2019/05/22}{Changing font definition up -> UpSh,
% due to incompatibility with unicode-math}
-% \changes{v1.5}{2019/05/30}{A solution for using mul with frac, adding paren macro}
+% \changes{v1.5}{2019/05/30}{A solution for using mul with frac, addition of paren macro}
% \changes{v1.5}{2019/06/22}{small corrections in documentation}
+% \changes{v1.6}{2019/09/06}{Removing mathfixs package}
%
% \GetFileInfo{mismath.sty}
%
@@ -98,7 +99,7 @@
% corresponds to \textsf{mismath}~\fileversion, dated \filedate.
% Thanks to François Bastouil for help in English translation.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{June 22, 2019}
+% \date{September 6, 2019}
% \maketitle
%
% \section{Introduction}
@@ -150,16 +151,15 @@
% \textsf{amsmath} has to be loaded
% with the required options before \textsf{mismath}.
%
-% Two other usefull packages are loaded:
+% Another package,
% \textsf{mathtools} by Morten Høgholm and Lars Madsen~\cite{TOOL}
-% and \textsf{mathfixs} by Niklas Beiser with \texttt{frac} and \texttt{root} options~\cite{MFIX}.
+% is also loaded. It provides many usefull macros.
%
% \medskip
% A recommendation, seldom observed, is to typeset uppercase Greek letters in italic shape
% like other variables~\cite{ICTNS}. This is automatically done with the \textsf{fixmath} package
-% by Walter Schmidt~\cite{FIXM} or \textsf{isomath} by Günter Milde~\cite{ISOM}
-% or you can do |\ProvideMathFix{greekcaps}| in the preamble, thanks to the \textsf{mathfixs} package.
-% But this feature is not implemented in \textsf{mismath} because this rule is conflicting
+% by Walter Schmidt~\cite{FIXM},
+% but this feature is not implemented in \textsf{mismath} because this rule is conflicting
% to the one used for instance in France where all mathematics capitals
% have to be typeset in upright shape\footnote{The \textsf{frenchmath} package~\cite{FR}
% takes this rule into account.}.
@@ -273,9 +273,7 @@
% from \textsf{amsbsy} package, loaded by \textsf{amsmath}.
% But other packages producing bold italic can be preferred, e.g.\@
% \texttt{\bslash bm} from \textsf{bm} package or |\mathbold| from \textsf{fixmath}
-% package (also implemented in \textsf{mathfixs}\footnote{To activate a feature
-% of \textsf{mathfix} like \texttt{mathbold}, do \texttt{\bslash ProvideMathFix\{mathbold\}}.})
-% or |\mathbfit| from \textsf{isomath}.
+% package or |\mathbfit| from \textsf{isomath}.
% For that, redefine |\boldvectcommand|:
% for instance |\renewcommand\boldvectcommand{\mathbold}|.
%
@@ -334,9 +332,8 @@
% italic, to make it different from variables
% (as mentioned in \cite{TYPMA}~\cite{NIST}~\cite{ICTNS}~\cite{LSHORT}).
% For this, we provide the |\di| command.
-% In the first following example, notice the thin spaces before the d,
-% as for classic function's names; in the second one,
-% spaces before fractions have been enlarged by the \textsf{mathfixs} package: \\
+% See the following examples (notice the thin spaces before the d,
+% as for classic function's names): \\
% \begin{minipage}[t]{7cm}
% \begin{verbatim}
%\[ \iint xy\di x\di y \]
@@ -540,16 +537,13 @@
% is less than $\lambda+\alpha \mul b-\beta \mul c$, obtained with |\mul|.
% \end{center}
%
-% When using |\mul| with fractions, irregular spacing may occur due to the \texttt{frac}
-% feature of the \textsf{mathfixs} package. As explained in the \textsf{mathfixs}
-% documentation~\cite{MFIX}, a solution to eliminate spaces around a fraction, is
-% to enclose the fraction with brackets:
-% |{\frac|\marg{num}\marg{denom}|}|\footnote{We have the same problem
-% and the same solution when using \texttt{\bslash mul} before an operator name
-% or a \texttt{\bslash left...\bslash right} structure.}.
+% When using |\mul| before an operator name
+% or a |\left...\right| structure, additionnal spacing occur on the right side of |\mul|.
+% A solution to get the same amount of space on the two sides of |\mul|, is to
+% enclose the operator name (or the structure) with brackets:
% \begin{center}
-% $x\mul\dfrac{1}{x}$ is less than $x\mul{\dfrac{1}{x}}$
-% obtained with |x\mul{\dfrac{1}{x}}|.
+% Compare $x\mul\sin x$ with $x\mul{\sin x}$
+% obtained with |x\mul{\sin x}|.
% \end{center}
%
% \DescribeMacro{\then}
@@ -568,7 +562,7 @@
% Spaces around parenthesis produced by |\left(...\right)| may be too large, for example
% after a function name or a point name with coordinates.
% A solution is to add a thin negative space |\!| before the opening (or after the closing)
-% parenthesis or to enclose the
+% parenthesis, or to enclose the
% |\left(...\right)| structure by brackets, or to use the |\paren| macro:
% \begin{center}
% $\sin\left(\frac{\pi}{3}\right)\mul 2$ is less than $\sin\paren{\frac{\pi}{3}}\mul 2$
@@ -729,7 +723,7 @@
% as shown in the following example.
% But you have to load the \textsf{multicol} package in the preamble.
% \begin{mathcols}
-% & \frac{1}{2 \mul \pow{\frac{1}{4}}{n} + 1} \geq 0.999 \\
+% & \frac{1}{2 \mul {\pow{\frac{1}{4}}{n}} + 1} \geq 0.999 \\
% \iff\ & 1 \geq 1.998 \pow{\frac{1}{4}}{n} + 0.999 \\
% \iff\ & 0.001 \geq \frac{1.998}{4^n} \\
% \changecol
@@ -767,7 +761,6 @@
\RequirePackage{ifthen}
\RequirePackage{xspace}
\RequirePackage{mathtools}
-\RequirePackage[frac,root]{mathfixs}
% \end{macrocode}
% The above conditional packages loading avoids ``option clash'' errors if the packages
% have been previously loaded with (other) options.
@@ -994,7 +987,6 @@
% Michael Downes, Davis M.~Jones, David Carlisle, CTAN, v2.17b 2018/12/01.
% \bibitem{TOOL} \emph{The \textsf{mathtool} package}. Morten Høgholm, Lars Madsen, CTAN,
% v1.21 2018/01/08.
-% \bibitem{MFIX} \emph{The \textsf{mathfixs} Package}. Niklas Beisert, CTAN, v1.01 2018/12/30.
% \bibitem{VECT} \emph{Typesetting vectors with beautiful arrow with \LaTeXe}.
% \textsf{esvect} package by Eddie Saudrais, CTAN, v1.3 2013/07/11.
% \bibitem{GREEK} \emph{The \textsf{upgreek} package for \LaTeXe}, Walter Schmidt,
diff --git a/macros/latex/contrib/mismath/mismath.pdf b/macros/latex/contrib/mismath/mismath.pdf
index b547a190c3..28ee611b50 100644
--- a/macros/latex/contrib/mismath/mismath.pdf
+++ b/macros/latex/contrib/mismath/mismath.pdf
Binary files differ
diff --git a/macros/latex/contrib/spacingtricks/spacingtricks.dtx b/macros/latex/contrib/spacingtricks/spacingtricks.dtx
index cfc25cb650..fcd0222f47 100644
--- a/macros/latex/contrib/spacingtricks/spacingtricks.dtx
+++ b/macros/latex/contrib/spacingtricks/spacingtricks.dtx
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{spacingtricks}
- [2019/06/26 v1.0 .dtx spacingtricks file]
+ [2019/09/06 v1.1 .dtx spacingtricks file]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -54,7 +54,7 @@
%</driver>
% \fi
%
-% \CheckSum{882}
+% \CheckSum{905}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -76,13 +76,15 @@
% \changes{v0.1}{2011/12/27}{Initial version}
% \changes{v1.0}{2019/05/04}{dtx and ins files, added the footnote command}
% \changes{v1.0}{2019/06/16}{English translation of the documentation}
+% \changes{v1.1}{2019/09/06}{No automatic line breaking at the end of the centered command,
+% new length compactitemlist}
%
% \GetFileInfo{spacingtricks.sty}
%
% \title{The \texttt{spacingtricks} package\thanks{This document
-% corresponds to \textsf{spacingtricks}~\fileversion, initial version \filedate.}}
+% corresponds to \textsf{spacingtricks}~\fileversion, dated \filedate.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{June 26, 2019}
+% \date{September 06, 2019}
% \maketitle
%
% \section{Introduction}
@@ -122,7 +124,7 @@
% The "\centered"\marg{text} command yields a centered line without vertical spacing.
% It acts like "\centerline" except in lists or tables where its behavior is much better
% (see the following examples).
-% Moreover, the line break before and after the macro is automatic.
+% Moreover, the line break before (but not after) the macro is automatic.
%
% Here is a comparative example of the centering commands inside a list:
% \begin{enumerate}
@@ -140,7 +142,7 @@
% the (general) column alignment
% \footnote{In tables, we can also use the powerful \texttt{\bslash makecell} command
% of the \textsf{makecell} package~\cite{MKCELL}, on the other hand
-% the \texttt{\bslash centerline} command doesn't work at all.
+% the \texttt{\bslash centerline} command doesn't work for a single line in a cell.
% Let us also mention the \texttt{\bslash centeredline} command, from the package
% \textsf{centeredline}~\cite{CENTER}, which allows to use \texttt{\bslash verb}
% commands inside the text to center; but it doesn't work in tables either.}.
@@ -148,11 +150,11 @@
% \begin{center}
% \begin{tabular}{|l|r|}
% \hline
-% left aligned column & right aligned column \\
+% left aligned column & right aligned column \\
% \hline
% another cell & \centered{centered cell} \\
% \hline
-% \centered{centered cell} & the last cell right aligned \\
+% \centered{centered line} & the last cell right aligned \\
% \hline
% \end{tabular}
% \end{center}
@@ -376,6 +378,13 @@
% macro \texttt{xspace} from the \textsf{xspace} package~\cite{XSP}).
%
% \medskip
+% \DescribeMacro{\compactlistindent}
+% This length (fixed at 1\,em by default) can be modified with "\setlength" to increase
+% or decrease the indentation of the \texttt{compactlist} environment.
+% Notice that there are several other ways to construct a compact list in particular
+% with the \texttt{noitemsep} key of the \textsf{enumitem} package~\cite{ENUM}.
+%
+% \medskip
% \DescribeMacro{\ie} \DescribeMacro{\eg}
% In English, at the end of a sentence, the point is followed by an em space
% which is larger than an interword space.
@@ -524,14 +533,18 @@
\item[]
}{\end{list}}
+\newlength{\compactlistindent}
+\setlength{\compactlistindent}{1em}
\newenvironment*{compactlist}[1][\textbullet]{
\begin{list}{#1\unskip}{% \unskip suppresses the space created by \xspace
- \setlength{\labelwidth}{1em}
- %\setlength{\leftmargin}{\labelwidth} % indentation
\setlength{\itemsep}{0pt}
\setlength{\parsep}{0pt}
\setlength{\topsep}{0ex}
\setlength{\partopsep}{0pt}
+ \setlength{\labelwidth}{1em}
+ \setlength{\leftmargin}{\labelwidth}
+ \addtolength{\leftmargin}{\labelsep}
+ \addtolength{\leftmargin}{\compactlistindent}
}
}{\end{list}}
@@ -565,16 +578,18 @@
% \end{macrocode}
%
% \medskip
-% \begin{thebibliography}{8}
+% \begin{thebibliography}{9}
% \bibitem{XSP} \emph{The \textsf{xspace} package}, David Carlisle, Morten Høgholm,
% CTAN v1.13 2014/10/28.
% \bibitem{MKCELL} \emph{The \textsf{makecell} package}, Olga Lapko, CTAN, v0.1e 2009/08/03.
% \bibitem{CENTER} \emph{\textsf{centeredline} -- A macro for centering lines}, Jean-François
% Burnol, CTAN, v1.1 2019/05/03.
% \bibitem{CELLSP} \emph{The \textsf{cellspace} package}, Josselin Noirel, CTAN, v1.8 2019/03/11.
+% \bibitem{ENUM} \emph{Customizing lists with the \textsf{enumitem} package}, Javier Bezos,
+% CTAN, v3.9 2019/06/20.
% \bibitem{ARCOL} \emph{The \textsf{arraycols} package}, Antoine Missier, CTAN, v1.0 2019/06/26.
% \bibitem{MSMATH} \emph{\textsf{mismath} -- Miscellaneous mathematical macros}, Antoine Missier,
-% CTAN, v1.5 2019/06/22.
+% CTAN, v1.6 2019/09/06.
% \bibitem{PICINS} \emph{Bilder in \LaTeX -Dokumenten -- PicIns-Benutzerhandbuch},
% Joachim Bleser, Edmund Lang, CTAN, v3.0 sept. 1992.
% \bibitem{COMP} \emph{The \LaTeX\ Companion}. Frank Mittelbach, Michel Goossens,
diff --git a/macros/latex/contrib/spacingtricks/spacingtricks.pdf b/macros/latex/contrib/spacingtricks/spacingtricks.pdf
index dbeb4464f9..814c057cae 100644
--- a/macros/latex/contrib/spacingtricks/spacingtricks.pdf
+++ b/macros/latex/contrib/spacingtricks/spacingtricks.pdf
Binary files differ