[latex3-commits] [git/LaTeX3-latex3-latex2e] gh239: Merge branch 'develop' into gh239 (3c2fc7c8)
PhelypeOleinik
tex.phelype at gmail.com
Fri Jul 31 14:33:42 CEST 2020
Repository : https://github.com/latex3/latex2e
On branch : gh239
Link : https://github.com/latex3/latex2e/commit/3c2fc7c82c6c49407a0b0134d4bef08763bc6d6b
>---------------------------------------------------------------
commit 3c2fc7c82c6c49407a0b0134d4bef08763bc6d6b
Merge: 49bd81a8 a91ede24
Author: PhelypeOleinik <tex.phelype at gmail.com>
Date: Fri Jul 31 09:33:42 2020 -0300
Merge branch 'develop' into gh239
>---------------------------------------------------------------
3c2fc7c82c6c49407a0b0134d4bef08763bc6d6b
README.md | 20 +-
base/README.md | 2 +-
base/build.lua | 15 +-
base/changes.txt | 109 +-
base/config-broken.lua | 3 +
base/config-lthooks.lua | 12 +
base/config-lthooks2.lua | 12 +
base/doc.dtx | 17 +-
base/doc/fntguide.tex | 312 +-
base/doc/ltfilehook-code.tex | 10 +
base/doc/ltfilehook-doc.tex | 12 +
base/doc/lthooks-code.tex | 10 +
base/doc/lthooks-doc.tex | 12 +
base/doc/ltnews32.tex | 292 +-
base/doc/ltshipout-code.tex | 10 +
base/doc/ltshipout-doc.tex | 12 +
base/doc/source2e.tex | 4 +-
base/doc/usrguide.tex | 8 +-
base/docstrip.dtx | 182 +-
base/format.ins | 2 +-
base/ltclass.dtx | 42 +-
base/ltdefns.dtx | 92 +-
base/ltexpl.dtx | 225 +-
base/ltfilehook.dtx | 1161 ++++++
base/ltfiles.dtx | 191 +-
base/ltfinal.dtx | 251 +-
base/ltfssaxes.dtx | 13 +-
base/ltfssini.dtx | 159 +-
base/lthooks.dtx | 3925 +++++++++++++++++++
base/lthooks.ins | 76 +
base/ltluatex.dtx | 19 +-
base/ltmiscen.dtx | 29 +-
base/ltnews.cls | 4 +
base/ltoutenc.dtx | 72 +-
base/ltpictur.dtx | 10 +-
base/ltshipout.dtx | 1425 +++++++
base/ltspace.dtx | 14 +-
base/ltvers.dtx | 2 +-
base/ltxdoc.dtx | 13 +-
base/ltxref.dtx | 18 +-
base/testfiles-TU/github-0332.luatex.tlg | 5 -
base/testfiles-TU/github-0332.tlg | 5 -
base/testfiles-TU/tu-asciiquotes01.luatex.tlg | 12 +-
base/testfiles-TU/tu-textcomp-003.luatex.tlg | 4 +-
base/testfiles-TU/tu-textcomp-004.luatex.tlg | 4 +-
base/testfiles-disabled/filehook-ext.lvt | 103 +
base/testfiles-disabled/filehook-ext.tlg | 53 +
base/testfiles-disabled/lthooks-014.lvt | 143 +
base/testfiles-disabled/lthooks-014.tlg | 70 +
base/testfiles-disabled/lthooks-015.lvt | 48 +
base/testfiles-disabled/lthooks-015.tlg | 38 +
base/testfiles-disabled/lthooks2-001.lvt | 32 +
base/testfiles-disabled/lthooks2-001.tlg | 299 ++
base/testfiles-disabled/lthooks2-003.lvt | 22 +
base/testfiles-disabled/lthooks2-003.tlg | 19 +
base/testfiles-disabled/lthooks2-007.lvt | 336 ++
base/testfiles-disabled/lthooks2-007.tlg | 24 +
base/testfiles-disabled/shipout-001.lvt | 61 +
base/testfiles-disabled/shipout-001.tlg | 341 ++
base/testfiles-disabled/shipout-003.lvt | 36 +
base/testfiles-disabled/shipout-003.tlg | 89 +
base/testfiles-disabled/tlb-early-expl3.lvt | 140 +
base/testfiles-disabled/tlb-early-expl3.tlg | 33 +
base/testfiles-legacy/utf8-test-001.tlg | 4 +-
base/testfiles-lthooks/filehook-001.lvt | 134 +
base/testfiles-lthooks/filehook-001.tlg | 105 +
base/testfiles-lthooks/filehook-002.lvt | 18 +
base/testfiles-lthooks/filehook-002.tlg | 77 +
base/testfiles-lthooks/filehook-003.lvt | 30 +
base/testfiles-lthooks/filehook-003.tlg | 77 +
base/testfiles-lthooks/filehook-004.lvt | 32 +
base/testfiles-lthooks/filehook-004.tlg | 19 +
base/testfiles-lthooks/filehook-005.lvt | 93 +
base/testfiles-lthooks/filehook-005.tlg | 91 +
base/testfiles-lthooks/filehook-006.lvt | 67 +
base/testfiles-lthooks/filehook-006.tlg | 150 +
base/testfiles-lthooks/helpers/blub.tex | 1 +
base/testfiles-lthooks/helpers/no sympathy.tex | 1 +
base/testfiles-lthooks/helpers/test | 1 +
base/testfiles-lthooks/helpers/test.dtx | 1 +
base/testfiles-lthooks/helpers/test.tex | 1 +
base/testfiles-lthooks/helpers/testpath/deep.tex | 1 +
base/testfiles-lthooks/helpers/zzzz | 1 +
base/testfiles-lthooks/lthooks-000.lvt | 21 +
base/testfiles-lthooks/lthooks-000.tlg | 65 +
base/testfiles-lthooks/lthooks-001.lvt | 45 +
base/testfiles-lthooks/lthooks-001.tlg | 142 +
base/testfiles-lthooks/lthooks-002.lvt | 54 +
base/testfiles-lthooks/lthooks-002.tlg | 146 +
base/testfiles-lthooks/lthooks-003.lvt | 67 +
base/testfiles-lthooks/lthooks-003.tlg | 136 +
base/testfiles-lthooks/lthooks-004.lvt | 45 +
base/testfiles-lthooks/lthooks-004.tlg | 108 +
base/testfiles-lthooks/lthooks-005.lvt | 63 +
base/testfiles-lthooks/lthooks-005.tlg | 136 +
base/testfiles-lthooks/lthooks-006.lvt | 40 +
base/testfiles-lthooks/lthooks-006.tlg | 96 +
base/testfiles-lthooks/lthooks-007.lvt | 51 +
base/testfiles-lthooks/lthooks-007.tlg | 154 +
base/testfiles-lthooks/lthooks-008.lvt | 53 +
base/testfiles-lthooks/lthooks-008.tlg | 121 +
base/testfiles-lthooks/lthooks-009.lvt | 41 +
base/testfiles-lthooks/lthooks-009.tlg | 80 +
base/testfiles-lthooks/lthooks-010.lvt | 70 +
base/testfiles-lthooks/lthooks-010.tlg | 122 +
base/testfiles-lthooks/lthooks-011.lvt | 40 +
base/testfiles-lthooks/lthooks-011.tlg | 226 ++
base/testfiles-lthooks/lthooks-012.lvt | 76 +
base/testfiles-lthooks/lthooks-012.tlg | 56 +
base/testfiles-lthooks/lthooks-013.lvt | 53 +
base/testfiles-lthooks/lthooks-013.tlg | 219 ++
base/testfiles-lthooks/lthooks-016.lvt | 44 +
base/testfiles-lthooks/lthooks-016.tlg | 44 +
base/testfiles-lthooks/lthooks-017.lvt | 33 +
base/testfiles-lthooks/lthooks-017.tlg | 24 +
base/testfiles-lthooks/lthooks-018.lvt | 22 +
base/testfiles-lthooks/lthooks-018.tlg | 18 +
base/testfiles-lthooks/lthooks-019.lvt | 154 +
base/testfiles-lthooks/lthooks-019.tlg | 339 ++
base/testfiles-lthooks/lthooks-020.lvt | 112 +
base/testfiles-lthooks/lthooks-020.tlg | 142 +
base/testfiles-lthooks/lthooks-021.lvt | 34 +
.../lthooks-021.tlg} | 0
base/testfiles-lthooks/lthooks-022.lvt | 38 +
base/testfiles-lthooks/lthooks-022.tlg | 60 +
base/testfiles-lthooks/lthooks-023.lvt | 37 +
base/testfiles-lthooks/lthooks-023.tlg | 30 +
base/testfiles-lthooks/lthooks-024.lvt | 96 +
base/testfiles-lthooks/lthooks-024.tlg | 220 ++
base/testfiles-lthooks/shipout-000.lvt | 18 +
base/testfiles-lthooks/shipout-000.tlg | 2 +
base/testfiles-lthooks/shipout-002.lvt | 27 +
base/testfiles-lthooks/shipout-002.tlg | 532 +++
base/testfiles-lthooks/shipout-004.lvt | 29 +
base/testfiles-lthooks/shipout-004.tlg | 87 +
base/testfiles-lthooks/shipout-005.lvt | 29 +
base/testfiles-lthooks/shipout-005.tlg | 113 +
base/testfiles-lthooks2/lthooks2-002.lvt | 36 +
base/testfiles-lthooks2/lthooks2-002.tlg | 139 +
base/testfiles-lthooks2/lthooks2-004.lvt | 40 +
base/testfiles-lthooks2/lthooks2-004.tlg | 15 +
base/testfiles-lthooks2/lthooks2-005.lvt | 28 +
base/testfiles-lthooks2/lthooks2-005.tlg | 79 +
base/testfiles-lthooks2/lthooks2-006.lvt | 52 +
base/testfiles-lthooks2/lthooks2-006.tlg | 130 +
base/testfiles-lthooks2/shipout2-004.lvt | 29 +
base/testfiles-lthooks2/shipout2-004.tlg | 87 +
base/testfiles-lthooks2/shipout2-006.lvt | 24 +
base/testfiles-lthooks2/shipout2-006.tlg | 113 +
base/testfiles/github-0073.luatex.tlg | 1 +
base/testfiles/github-0073.tlg | 1 +
base/testfiles/github-0217-base.lvt | 46 +
base/testfiles/github-0217-base.tlg | 18 +
base/testfiles/github-0217-io-base.luatex.tlg | 21 +
base/testfiles/github-0217-io-base.lvt | 174 +
base/testfiles/github-0217-io-base.tlg | 20 +
base/testfiles/github-0217-io-space.luatex.tlg | 20 +
base/testfiles/github-0217-io-space.lvt | 182 +
base/testfiles/github-0217-io-space.tlg | 20 +
base/testfiles/github-0217-space.luatex.tlg | 18 +
base/testfiles/github-0217-space.lvt | 45 +
base/testfiles/github-0217-space.tlg | 18 +
base/testfiles/github-0218.luatex.tlg | 9 +
base/testfiles/github-0218.lvt | 20 +
base/testfiles/github-0218.tlg | 9 +
base/testfiles/github-0247.lvt | 37 +
base/testfiles/github-0247.tlg | 5 +
base/testfiles/github-0300-currentcounter.lvt | 10 +
base/testfiles/github-0300-currentcounter.tlg | 6 +
base/testfiles/github-0300-rollback.lvt | 12 +
base/testfiles/github-0300-rollback.tlg | 5 +
base/testfiles/github-0335.lvt | 17 +
base/testfiles/github-0335.tlg | 5 +
base/testfiles/github-0336.lvt | 41 +
base/testfiles/github-0336.tlg | 28 +
base/testfiles/github-0344.lvt | 37 +
base/testfiles/github-0344.tlg | 28 +
base/testfiles/github-0354.lvt | 21 +
base/testfiles/github-0354.tlg | 13 +
base/testfiles/github-robust-0123.luatex.tlg | 16 +-
base/testfiles/github-robust-0123.lvt | 2 +-
base/testfiles/github-robust-0123.tlg | 16 +-
base/testfiles/github-robust-0123.xetex.tlg | 16 +-
base/testfiles/tlb-latexrelease-rollback-002.tlg | 13 +
.../tlb-latexrelease-rollback-003-often.luatex.tlg | 74 +
.../tlb-latexrelease-rollback-003-often.tlg | 74 +
.../tlb-latexrelease-rollback-003-often.xetex.tlg | 74 +
base/testfiles/tlb-rollback-004-often.luatex.tlg | 39 +-
base/testfiles/tlb-rollback-004-often.tlg | 39 +-
base/testfiles/tlb-rollback-004-often.xetex.tlg | 39 +-
base/testfiles/tlb2140.luatex.tlg | 521 ++-
base/testfiles/tlb2140.tlg | 480 ++-
base/testfiles/tlb3855-20170101.luatex.tlg | 38 +-
base/testfiles/tlb3855-20170101.lvt | 6 +-
base/testfiles/tlb3855.luatex.tlg | 46 +-
base/testfiles/tlb3855.lvt | 6 +-
base/testfiles/tlcs01b.luatex.tlg | 4 +-
base/testfiles/tlcs01b.tlg | 4 +-
base/testfiles/tlcs01r.tlg | 4 +-
base/testfiles/tltc001.luatex.tlg | 19 +-
base/testfiles/tltc001.tlg | 19 +-
base/testfiles/tltx001.luatex.tlg | 1 +
base/testfiles/tltx001.tlg | 1 +
base/testfiles/tltx001.xetex.tlg | 1 +
base/testfiles/tltx003.lvt | 1 +
base/testfiles/tlxs01b.tlg | 4 +-
base/testfiles/tlxs01r.tlg | 4 +-
base/unpack.ins | 1 +
build-config.lua | 1 +
required/amsmath/README.md | 2 +-
required/graphics/README.md | 2 +-
required/graphics/changes.txt | 4 +
required/graphics/lscape.dtx | 7 +-
required/tools/README.md | 2 +-
required/tools/array.dtx | 52 +-
required/tools/changes.txt | 23 +
required/tools/config-broken.lua | 3 +
required/tools/testfiles-TU/github-0352.luatex.tlg | 230 ++
required/tools/testfiles-TU/github-0352.lvt | 39 +
required/tools/testfiles-TU/github-0352.tlg | 140 +
.../tools/testfiles-search/tlb-varioref-003.tlg | 5 -
.../tools/testfiles-search/tlb-varioref-004.tlg | 5 -
required/tools/testfiles/github-0222-input.lvt | 43 +
required/tools/testfiles/github-0222-input.tlg | 10 +
required/tools/testfiles/github-0223.lvt | 59 +
required/tools/testfiles/github-0223.tlg | 12 +
required/tools/testfiles/github-0322.lvt | 63 +
required/tools/testfiles/github-0322.tlg | 8 +
required/tools/testfiles/tlb-multicol-004.tlg | 1127 +-----
...multicol-004.tlg => tlb-multicol-004.xetex.tlg} | 446 +++
required/tools/varioref.dtx | 87 +-
required/tools/verbatim.dtx | 29 +-
required/tools/xr.dtx | 13 +-
support/regression-test.tex | 180 +
support/texlive.sh | 6 +
texmf/tex/latex/l3backend/l3backend-dvipdfmx.def | 90 +-
texmf/tex/latex/l3backend/l3backend-dvips.def | 138 +-
texmf/tex/latex/l3backend/l3backend-dvisvgm.def | 84 +-
texmf/tex/latex/l3backend/l3backend-pdfmode.def | 113 +-
texmf/tex/latex/l3backend/l3backend-xdvipdfmx.def | 94 +-
texmf/tex/latex/l3kernel/expl3-code.tex | 4104 ++++++++++++--------
texmf/tex/latex/l3kernel/expl3-generic.tex | 2 +-
texmf/tex/latex/l3kernel/expl3.ltx | 80 +-
texmf/tex/latex/l3kernel/expl3.sty | 88 +-
texmf/tex/latex/l3kernel/l3debug.def | 31 +-
texmf/tex/latex/l3kernel/l3deprecation.def | 167 +-
texmf/tex/latex/l3kernel/l3doc.cls | 2 +-
.../tex/latex/l3packages/xparse/xparse-generic.tex | 2283 +++++++++++
texmf/tex/latex/l3packages/xparse/xparse.ltx | 30 +
texmf/tex/latex/l3packages/xparse/xparse.sty | 172 +
250 files changed, 26055 insertions(+), 3670 deletions(-)
diff --cc base/changes.txt
index bf00058f,1ef6f2cd..7b3eab37
--- a/base/changes.txt
+++ b/base/changes.txt
@@@ -6,11 -6,113 +6,118 @@@ completeness or accuracy and it contain
are not part of the distribution.
================================================================================
+2020-05-09 Phelype Oleinik <phelype.oleinik at latex-project.org>
+
+ * ltdefns.dtx (subsection{Robust commands and protect}):
+ Added \DeclareCommandCopy et al. to the kernel (gh/239)
+
+ 2020-07-16 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
+
+ * ltmiscen.dtx: \begin should not be long for better
+ error recovery (gh/354)
+
+ 2020-07-09 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
+
+ * lthooks.dtx, ltshipout.dtx, ltfilehook.dtx:
+ Integrate hook management into the kernel
+
+ 2020-07-08 Joseph Wright <joseph.wright at latex-project.org>
+
+ * ltexpl.dtx:
+ Add hook \@expl at finalise@setup@@
+
+ * ltfinal.dtx:
+ Execute hook \@expl at finalise@setup@@
+
+ 2020-07-07 Johannes Braams <Johannes.Braams at latex-project.org>
+
+ * docstrip.dtx: Merge the @@-module functionality of
+ l3docstrip.dtx into docstrip.dtx (gh/337)
+
+ 2020-07-04 Marcel Krüger <Marcel.Krueger at latex-project.org>
+
+ * ltoutenc.dtx:
+ Suppress tlig ligatures in LuaTeX without font reloading (gh/165)
+
+ 2020-06-15 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
+
+ * doc.dtx (subsection{Macros surrounding the `definition parts'}):
+ Void \@labels for vertical typesetting (gh/344)
+
+ 2020-06-05 Phelype Oleinik <phelype.oleinik at latex-project.org>
+
+ * ltdefns.dtx (subsection{Loading further extensions}):
+ Moved loading of ltexpl.ltx earlier (from ltfinal.dtx) to ltdefns to
+ allow usage of expl3 extensions while loading the kernel. Further
+ changes to support this one listed below:
+
+ * ltfinal.dtx:
+ Removed loading of ltexpl.ltx
+
+ * ltclass.dtx:
+ Added \@expl at push@filename@@ and \@expl at push@filename at aux@@ to
+ \@pushfilename and \@expl at pop@filename@@ to \@popfilename.
+
+ * ltfiles.dtx (section{File Handling}):
+ Added \@expl at sys@load at backend@@ in \document.
+
+ * ltexpl.dtx:
+ - Added blank definitions for \@expl at sys@load at backend@@,
+ \@expl at push@filename@@, \@expl at push@filename at aux@@, and
+ \@expl at pop@filename@@.
+ - Added temporary definitions for some kernel commands.
+
+ 2020-06-04 Marcel Krüger <Marcel.Krueger at latex-project.org>
+
+ * format.ins: Load ltluatex.dtx before ltdefns.dtx
+
+ 2020-05-31 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
+
+ * ltmiscen.dtx (subsection{Center, Flushright, Flushleft}):
+ % Added \finalhyphendemerits=0 to avoid extra line in
+ \centering, \raggedleft or \raggedright (gh/247)
+
+ 2020-05-19 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
+
+ * ltfssini.dtx (section{Custom series settings for main document families}):
+ Added \IfFontSeriesContextTF so that it is possible to reliably
+ detect the current font series context (gh/335)
+
+ 2020-05-17 Johannes Braams <Johannes.Braams at latex-project.org>
+
+ * ltxdoc.dtx: Support spaces within filenames (gh/218)
+
+ 2020-05-15 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
+
+ * ltdefns.dtx (subsection{Initex initialisations}):
+ Allow \par in the argument of \typeout and turn it into an empty line
+ if expanded, if not it remains \par (gh/335)
+
+ 2020-05-11 Marcel Krüger <Marcel.Krueger at latex-project.org>
+
+ * ltdefns.dtx:
+ Use primitive \- with LuaTeX
+
+ 2020-05-07 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
+
+ * ltxref.dtx:
+ added \@currentcounter to \refstepcounter (gh/300)
+
+ 2020-05-06 Marcel Krüger <Marcel.Krueger at latex-project.org>
+
+ * ltspace.dtx:
+ Make Unicode softhyphen U+00AD active and defined as \-.
+
+ 2020-05-02 Johannes Braams <Johannes.Braams at latex-project.org>
+
+ * ltexpl.dtx: Created aliases for two expl3 macros in order to use
+ them to remove leading and trailing spaces from filenames (gh/217)
+
+ 2020-05-02 Johannes Braams <Johannes.Braams at latex-project.org>
+
+ * ltfiles.dtx: Modified \include and \includeony to support
+ filenames with spaces in them (gh/217)
+
2020-04-29 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
* lttextcomp.dtx (subsection{Sub-encoding 2}):
diff --cc base/doc/ltnews32.tex
index ef35c7bc,fdea39b6..808f5f81
--- a/base/doc/ltnews32.tex
+++ b/base/doc/ltnews32.tex
@@@ -386,31 -506,95 +506,119 @@@ are ignored as elsewhere
\githubissue{327}
+\subsection{Provide a way to copy commands}
+
+With the previous \LaTeXe{} release, several user-level commands were
+made robust, so the need for a way to create copies of these commands
+(often to redefine them) increased, and the \LaTeXe{} kernel didn't have
+a way to do so. Previously this functionality was provided in part by
+Heiko Oberdiek's \pkg{letltxmacro} package, which allows a robust
+command \verb=\foo= to be copied to \verb=\bar= with
+\verb=\LetLtxMacro\bar\foo=.
+
+From this release onwards, the \LaTeXe{} kernel provides
+\cs{NewCommandCopy} (and \verb=\Renew...=, \verb=\Declare...=, and
+\verb=\Provide...= variants) which functions almost like
+\verb=\LetLtxMacro=. To the end user, both should work the same way,
+and one shouldn't need to worry about the definition of the command:
+\cs{NewCommandCopy} should do the hard work.
+
+\cs{NewCommandCopy} knows about the different types of definitions from
+the \LaTeXe{} kernel, and also from other packages, such as
+\pkg{xparse}'s command declarations like \cs{NewDocumentCommand}, and
+\pkg{etoolbox}'s \cs{newrobustcmd}, and it can be extended to cover
+further packages.
+
+\githubissue{239}
+ \subsection{Merge \pkg{l3docstrip} into \pkg{docstrip}}
+
+ The file \pkg{l3docstrip.tex} offered a small extension over the
+ original \pkg{docstrip.tex} file supporting the
+ \texttt{\%\string<@@=\meta{module}\string>} syntax of \pkg{expl3}.
+ This has now been merged into \pkg{docstrip} so that it can now be
+ used both for traditional \texttt{.dtx} files and those containing
+ code written in the L3 programming layer language.
+ %
+ \githubissue{337}
+
+
+ \subsection{Support vertical typesetting with \pkg{doc}}
+
+ The \texttt{macrocode} environment uses a \texttt{trivlist} internally
+ and as part of this sets up the \cs{@labels} box to contain some
+ horizontal skips, but that box is never used. As a result this
+ generates an issue in some circumstances if the typesetting direction
+ is vertical. This has now been corrected to support such use cases as
+ well.
+ %
+ \githubissue{344}
+
+
+ \subsection{Record the counter name stepped by \cs{refstepcounter}}
+
+ \cs{refstepcounter} now stores the name of counter in \cs{@currentcounter}.
+ This allows packages like \pkg{zref} and \pkg{hyperref} to store the name without
+ having to patch \cs{refstepcounter}.
+ %
+ \githubissue{300}
+
+
+ \subsection{Native Lua\TeX\ behaviour for \cs{-}}
+
+ \LaTeX\ changes \cs{-} to add a discretionary hyphen even if \cs{hyphenchar}
+ is set to $-1$. This change is not necessary under Lua\TeX\ because in there
+ \cs{-} is not affected by \cs{hyphenchar} in the first place. Therefore this
+ behaviour has been changed to ensure that Lua\TeX's (language specific)
+ hyphenation characters are respected by \cs{-}.
+
+
+
+ \subsection{Allow \cs{par} commands inside \cs{typeout}}
+
+ \cs{typeout} used to choke when seeing an empty line or a \cs{par}
+ command in its argument. However, sometimes it is used to display
+ arbitrary user input or code (wrapped, for example, in
+ \cs{unexpanded}) which may contain explicit \cs{par} commands. This is
+ now allowed.
+ %
+ \githubissue{335}
+
+ \subsection{Spacing commands moved from \pkg{amsmath} to the kernel}
+ Originally \LaTeX{} only provided a small set of spacing commands
+ for use in text and math, some of the commands like \cs{;} were
+ only supported in math mode. \texttt{amsmath} normalized and
+ provided all of them in text and math. This code has now been
+ moved to the kernel so that it is generally available.
+ %
+ \githubissue{303}
+
+ \begin{tabular}{lll}
+ command name(s) & math & text\\\hline
+ \cs{,} \cs{thinspace} & $x\,x$ & x\,x\\
+ \cs{!} \cs{negthinspace} & $x\!x$ & x\!x\\
+ \cs{:} \cs{>} \cs{medspace} & $x\:x$ & x\:x\\
+ \cs{negmedspace} & $x\negmedspace x$ & x\negmedspace x\\
+ \cs{;} \cs{thickspace} & $x\;x$ & x\;x\\
+ \cs{negthickspace} & $x\negthickspace x$ & x\negthickspace x\\
+ \end{tabular}
+
+
+
+ \subsection{Access raw glyphs in \LuaTeX\ without reloading fonts}
+
+ \LaTeX's definitions for \cs{textquotesingle}, \cs{textasciigrave}, and
+ \cs{textquotedbl} for the TU encoding in \LuaTeX\ need special handling to
+ stop the shaper from replacing these characters with curly quotes.
+ This used to be done by reloading the current font without the \texttt{tlig}
+ feature, but that came with multiple disadvantages: It behaves different
+ than the corresponding \XeTeX\ code and it is not very efficient.
+ This code has now been replaced with a implementation which injects a
+ protected glyph nodes which is not affected by font shaping.
+ %
+ \githubissue{165}
+
+
\section{Changes to packages in the \pkg{graphics} category}
diff --cc base/ltdefns.dtx
index 77c4ee64,3abd251e..5abe0387
--- a/base/ltdefns.dtx
+++ b/base/ltdefns.dtx
@@@ -32,7 -32,7 +32,7 @@@
%<*driver>
% \fi
\ProvidesFile{ltdefns.dtx}
- [2020/05/09 v1.5h LaTeX Kernel (definition commands)]
- [2020/06/04 v1.5i LaTeX Kernel (definition commands)]
++ [2020/07/31 v1.5j LaTeX Kernel (definition commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdefns.dtx}
@@@ -1261,353 -1287,8 +1287,353 @@@
% \end{macro}
%
%
+% \begin{macro}{\NewCommandCopy}
+% \begin{macro}{\RenewCommandCopy}
+% \begin{macro}{\DeclareCommandCopy}
- % \changes{v1.5h}{2020/05/09}{Added \cs{DeclareCommandCopy} (gh/239)}
++% \changes{v1.5j}{2020/05/09}{Added \cs{DeclareCommandCopy} (gh/239)}
+%
+% With most document level commands being robust now there is more of a
+% requirement to have a standard way of aliasing (or copying) a command to a
+% new name, for example to save an original definition before changing a
+% command. \cs{DeclareCommandCopy} is analogous to \TeX's \cs{let}, except
+% that it copes with the different types of robust commands defined by
+% \LaTeX's mechanisms.
+%
+% A couple of ``types of robustness'' are defined by the \LaTeXe{} kernel,
+% namely robust commands defined with \cs{DeclareRobustCommand} and commands
+% with optional arguments defined with \cs{newcommand}. However there are
+% other types of robust commands that are frequently used, which are not
+% defined in the \LaTeXe{} kernel, like commands defined with
+% \textsf{xparse}'s \cs{NewDocumentCommand} and \textsf{etoolbox}'s
+% \cs{newrobustcmd}. Here we will define a generic \cs{DeclareCommandCopy}
+% that will check \LaTeXe's robust types out of the box, but that can be
+% extended to work with other packages' robust commands.
+%
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020-10-01}{\DeclareCommandCopy}
+%<latexrelease> {Add \NewCommandCopy, \RenewCommandCopy, and \DeclareCommandCopy}%
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \cs{DeclareCommandCopy} just calls \cs{declare at command@copy} with \cs{relax},
+% which serves as a prefix for definitions. Heiko Oberdiek's
+% \textsf{letltxmacro} defines a global variant of \cs{LetLtxMacro}, but since
+% none of our definition commands have a global version, this one won't either,
+% for consistency.
+%
+% \cs{NewCommandCopy} checks if \verb=#1= is already defined, and raises an
+% error if so, otherwise the definition is carried out.
+% \cs{RenewCommandCopy} does (almost) the opposite. If the command is
+% \emph{not} defined, then an error is raised. But the definition is carried
+% out anyhow, so the behaviour is consistent with \cs{renewcommand}.
+%
+% A \cs{ProvideCommandCopy} isn't defined because it's not reasonably useful.
+% \verb=\provide...= commands mean ``define this if there's no other
+% definition'', but copying a command (usually) implies that the command being
+% copied is defined, so \cs{ProvideCommandCopy} doesn't make a lot of sense.
+% But more importantly, the most common use case of copying a command is to
+% redefine it later, while preserving the old definition, as in:
+% \begin{verbatim}
+% \ProvideComandCopy \A \B
+% \renewcommand \B { ... \A ...}
+% \end{verbatim}
+% then, if \verb=\A= is already defined the first line is skipped, an in this
+% case \verb=\B= won't work as expected.
+% \begin{macrocode}
+\def\NewCommandCopy{%
+ \declare at commandcopy%
+ {\@firstofone}%
+ {\@firstoftwo\@notdefinable}}
+\def\RenewCommandCopy{%
+ \declare at commandcopy%
+ {\@latex at error{Command \@backslashchar\reserved at a\space undefined}\@ehc
+ \@firstofone}%
+ {\@firstofone}}
+\def\DeclareCommandCopy{%
+ \declare at commandcopy%
+ {\@firstofone}%
+ {\@firstofone}}
+% \end{macrocode}
+%
+% \begin{macro}{\declare at commandcopy}
+% Start by checking if the command is already defined. The proper action is
+% taken by each specific command above. If all's good, then
+% \cs{declare at command@copy} is called with the command being defined and the
+% command being copied.
+% \begin{macrocode}
+\def\declare at commandcopy#1#2#3#4{%
+ \edef\reserved at a{\@expl at cs@to at str@@N#3}%
+ \@ifundefined\reserved at a{#1}{#2}%
+ {\declare at command@copy#3#4}}
+% \end{macrocode}
+%
+% \begin{macro}{\declare at command@copy}
+% \begin{macro}{\declare at command@copy at loop}
+% \begin{macro}{\declare at command@copy at loop@aux}
+% \begin{macro}{\declare at command@copy at do}
+% \begin{macro}{\declare at command@copy at let}
+% \begin{macro}{\declare at command@copy at chk@args}
+% \begin{macro}{\@declarecommandcopylisthook}
+% \cs{declare at command@copy at loop} will start by using
+% \cs{declare at command@copy at chk@args} to check if the macro being copied
+% (\verb=#2=) is a parameterless (\cs{protected}) macro. If it is not, a
+% simple \cs{let} is used to copy the definition and we're done. This is so
+% because the high-level commands that are in the scope of this macro are
+% always defined so that the top-level macro doesn't take any argument. This
+% first test is necessary because later on we need to be able to expand the
+% \verb=#2= without the risk of it Breaking Badly, and as a bonus, this speeds
+% up the process in case we used \cs{NewCommandCopy} in a ``normal'' macro.
+%
+% If \cs{declare at command@copy at chk@args} branched to false, then
+% \cs{declare at command@copy at loop} will loop over the list of items in the
+% \cs{@declarecommandcopylisthook} token list, and process each item with
+% \verb=#1= (the command being defined) and \verb=#2= (the command being
+% copied to \verb=#1=). The token list \cs{@declarecommandcopylisthook}
+% should be of the form
+% \begin{verbatim}
+% {\IfTypeCommand \CopyTypeCommand}
+% {\IfAnotherCommand \CopyAnotherCommand}
+% ...
+% \end{verbatim}
+% where each braced group represents one type of command, and within each
+% the first token is a conditional which takes a command as argument, and
+% tests that command, branching to true or false. If this macro branched to
+% true, then the second macro is used with the two macros (the one being
+% copied to, and the one being copied from) to perform the assignment.
+% If none of the tests in the \cs{@declarecommandcopylisthook} token list
+% resulted true, then both macros are just \cs{let} to one another.
+% \begin{macrocode}
+\def\declare at command@copy#1#2{%
+ \expandafter\declare at command@copy at chk@args\meaning#2:->\@nil
+ {\expandafter\declare at command@copy at loop\expandafter#2%
+ \@declarecommandcopylisthook{\@nnil\@nnil}%
+ \@declare at command@end}%
+ {\declare at command@copy at let}%
+ #1#2}%
+\def\declare at command@copy at loop#1#2{\declare at command@copy at loop@aux#1#2}
+\def\declare at command@copy at loop@aux#1#2#3{%
+ \ifx\@nnil#2%
+ \declare at command@copy at do\declare at command@copy at let
+ \else
+ #2{#1}%
+ {\declare at command@copy at do{#3}}%
+ {\expandafter\declare at command@copy at loop\expandafter#1}%
+ \fi}
+\def\declare at command@copy at do#1#2%
+ \fi#3%
+ \@declare at command@end#4#5{%
+ \fi
+ #1#4#5}
+\def\declare at command@copy at let#1#2{\let#1=#2\relax}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\declare at command@copy at chk@args#1:->#2\@nil{%
+ \@expl at str@if at eq@@nnTF{#1}{macro}%
+ {\@firstoftwo}%
+ {\@expl at str@if at eq@@nnTF{#1}{\protected macro}%
+ {\@firstoftwo}%
+ {\@secondoftwo}}}
+% \end{macrocode}
+%
+% The initial definition of \cs{@declarecommandcopylisthook} contains the
+% tests for the two types of robust command in the kernel.
+% \begin{macrocode}
+\def\@declarecommandcopylisthook{%
+ {\@if at DeclareRobustCommand \@copy at DeclareRobustCommand}%
+ {\@if at newcommand \@copy at newcommand}}
+% \end{macrocode}
+%
+% Now the rollback code.
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000-00-00}{\DeclareCommandCopy}
+%<latexrelease> {Undefine \NewCommandCopy, \RenewCommandCopy, and \DeclareCommandCopy}%
+%<latexrelease>\let\NewCommandCopy\@undefined
+%<latexrelease>\let\RenewCommandCopy\@undefined
+%<latexrelease>\let\DeclareCommandCopy\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@if at DeclareRobustCommand}
+% \begin{macro}{\@copy at DeclareRobustCommand}
+% \begin{macro}{\copy at kernel@robust at command}
- % \changes{v1.5h}{2020/05/09}{Added \cs{DeclareCommandCopy} (gh/239)}
++% \changes{v1.5j}{2020/05/09}{Added \cs{DeclareCommandCopy} (gh/239)}
+%
+% Now that we provided a generic way to copy one macro to another, we need to
+% define a way to check if a command is one of \LaTeXe's robust types. These
+% tests are heavily based on Heiko's \cs{LetLtxMacro}, but chopped into
+% separate macros.
+%
+% \cs{@if at DeclareRobustCommand} checks if a command \verb=\cmd= was defined by
+% \cs{DeclareRobustCommand}. The test returns true if the expansion of
+% \verb=\cmd= is exactly \verb*=\protect\cmd =.
+%
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020-10-01}{\@if at DeclareRobustCommand}
+%<latexrelease> {Add \@if at DeclareRobustCommand, \@copy at DeclareRobustCommand,
+%<latexrelease> \@if at newcommand, and \@copy at newcommand}%
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@if at DeclareRobustCommand#1{%
+ \begingroup
+ \escapechar=`\\
+ \edef\reserved at a{\string#1}%
+ \edef\reserved at b{\detokenize{#1}}%
+ \xdef\@gtempa{%
+ \ifx\reserved at a\reserved at b
+ \noexpand\x at protect
+ \noexpand#1%
+ \fi
+ \noexpand\protect
+ \expandafter\noexpand\csname\@expl at cs@to at str@@N#1 \endcsname}%
+ \endgroup
+ \ifx\@gtempa#1\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+% \end{macrocode}
+%
+% If a command was defined by \cs{DeclareRobustCommand} (that is,
+% \cs{@if at DeclareRobustCommand} returns true), then to make a copy of \verb=\cmd=
+% into \verb=\foo= we define the latter such that it expands to
+% \verb*=\protect\foo =, then make \verb*=\foo = equal to \verb*=\cmd =.
+%
+% There is one detail we need to take care of: if a command was defined with
+% \cs{DeclareRobustCommand} it may still have an optional argument, in which
+% case there is one more macro layer before the actual definition of the
+% command. We use \cs{@if at newcommand} to check that and
+% \cs{@copy at newcommand} to do the copying.
+% \begin{macrocode}
+\def\@copy at DeclareRobustCommand#1#2{%
+ \begingroup
+ \escapechar=`\\
+ \edef\reserved at a{\string#1}%
+ \edef\reserved at b{\detokenize{#1}}%
+ \edef\reserved at a{%
+ \endgroup
+ \def\noexpand#1{%
+ \ifx\reserved at a\reserved at b
+ \noexpand\x at protect
+ \noexpand#1%
+ \fi
+ \noexpand\protect
+ \expandafter\noexpand\csname\@expl at cs@to at str@@N#1 \endcsname}%
+ \noexpand\copy at kernel@robust at command
+ \expandafter\noexpand\csname\@expl at cs@to at str@@N#1 \endcsname
+ \expandafter\noexpand\csname\@expl at cs@to at str@@N#2 \endcsname}%
+ \reserved at a}
+\def\copy at kernel@robust at command#1#2{%
+ \@if at newcommand#2%
+ {\@copy at newcommand#1#2}%
+ {\declare at command@copy at let#1#2}}
+% \end{macrocode}
+%
+% \begin{macro}{\@if at newcommand}
+% \begin{macro}{\@copy at newcommand}
+%
+% A command \verb=\cmd= (or \verb*=\cmd =, if it was defined with
+% \cs{DeclareRobustCommand}) with an optional argument will expand to
+% \verb*=\@protected at testopt\cmd\\cmd{<opt>}=. To check that we look at the
+% first three tokens in the expansion of \verb=\cmd=, and return true or false
+% accordingly.
+% \begin{macrocode}
+\def\@if at newcommand#1{%
+ \edef\reserved at a{%
+ \noexpand\@protected at testopt
+ \noexpand#1%
+ \expandafter\noexpand\csname\@backslashchar\@expl at cs@to at str@@N#1\endcsname}%
+ \edef\reserved at b{%
+ \unexpanded\expandafter\expandafter\expandafter
+ {\expandafter\@carcube#1{}{}{}\@nil}}%
+ \ifx\reserved at a\reserved at b
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+% \end{macrocode}
+%
+% Then, if a command \verb=\cmd= takes an optional argument, we copy it to
+% \verb=\foo= by defining the latter to expand to
+% \verb=\@protected at testopt\foo\\foo{<opt>}=.
+% \begin{macrocode}
+\def\@copy at newcommand#1#2{%
+ \edef#1{\noexpand\@protected at testopt
+ \noexpand#1%
+ \expandafter\noexpand\csname\@backslashchar\@expl at cs@to at str@@N#1\endcsname
+ \unexpanded\expandafter\expandafter\expandafter
+ {\expandafter\@gobblethree#2}}%
+ \expandafter
+ \let\csname\@backslashchar\@expl at cs@to at str@@N#1\expandafter\endcsname
+ \csname\@backslashchar\@expl at cs@to at str@@N#2\endcsname}
+% \end{macrocode}
+%
+% Steal the definition of \textsf{expl3}'s \cs{cs\string_to\string_str:N} for
+% a while. This should disappear as soon as this macro is defined in
+% \texttt{ltexpl.dtx} as a copy of \cs{cs\string_to\string_str:N}.
+% \begin{macrocode}
+\def\@expl at cs@to at str@@N{%
+ \romannumeral\if\string\ \@@expl at cs@to at str@@w\fi
+ \expandafter\@@expl at cs@to at str@@N\string}
+\def\@@expl at cs@to at str@@N#1{\z@}
+\def\@@expl at cs@to at str@@w#1\@@expl at cs@to at str@@N{-\number\fi\expandafter\z@}
+% \end{macrocode}
+%
+% Define a poorman's (not expandable) \cs{str\string_if\string_eq:nnTF} for a
+% while. This should disappear as soon as this macro is defined in
+% \texttt{ltexpl.dtx} as a copy of \cs{str\string_if\string_eq:nnTF}.
+% \begin{macrocode}
+\def\@expl at str@if at eq@@nnTF#1#2{%
+ \begingroup
+ \edef\x{\detokenize{#1}}%
+ \edef\y{\detokenize{#2}}%
+ \expandafter\endgroup
+ \ifx\x\y
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+% \end{macrocode}
+%
+% Now the rollback code.
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000-00-00}{\@if at DeclareRobustCommand}
+%<latexrelease> {Undefine \@if at DeclareRobustCommand, \@copy at DeclareRobustCommand,
+%<latexrelease> \@if at newcommand, and \@copy at newcommand}%
+%<latexrelease>\let\@if at DeclareRobustCommand\@undefined
+%<latexrelease>\let\@copy at DeclareRobustCommand\@undefined
+%<latexrelease>\let\@if at newcommand\@undefined
+%<latexrelease>\let\@copy at newcommand\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
-
% \begin{macro}{\kernel at make@fragile}
% The opposite of |\MakeRobust| execpt that it doesn't do many
% checks as it is internal to the kernel. Why does one want such a
@@@ -1905,6 -1586,7 +1931,7 @@@
% \changes{v1.0g}{1994/04/12}
% {Define \cs{@dischyph}, was previously in ltboxes.dtx}
% \changes{v1.5b}{2017/03/27}{Define \cs{@dischyph} after \cs{-}}
-% \changes{v1.5h}{2020/05/11}{Do not overwrite \cs{-} under Lua\TeX}
++% \changes{v1.5j}{2020/05/11}{Do not overwrite \cs{-} under Lua\TeX}
% \end{macro}
% Moved here to be after the definition of |\DeclareRobustCommand|.
%
More information about the latex3-commits
mailing list.