[latex3-commits] [git/LaTeX3-latex3-latex2e] gh239: Make \DeclareCommandCopy extensible from outside the kernel (6c9f57d0)

PhelypeOleinik tex.phelype at gmail.com
Fri May 8 17:54:39 CEST 2020


Repository : https://github.com/latex3/latex2e
On branch  : gh239
Link       : https://github.com/latex3/latex2e/commit/6c9f57d02349844a52d9ed96db0518d0815583bd

>---------------------------------------------------------------

commit 6c9f57d02349844a52d9ed96db0518d0815583bd
Author: PhelypeOleinik <tex.phelype at gmail.com>
Date:   Fri May 8 12:54:39 2020 -0300

    Make \DeclareCommandCopy extensible from outside the kernel


>---------------------------------------------------------------

6c9f57d02349844a52d9ed96db0518d0815583bd
 base/ltdefns.dtx                                   | 400 +++++++++++----------
 base/testfiles/github-0239b.tlg                    |   2 +-
 .../tlb-latexrelease-rollback-003-often.luatex.tlg |   4 +
 .../tlb-latexrelease-rollback-003-often.tlg        |   4 +
 .../tlb-latexrelease-rollback-003-often.xetex.tlg  |   4 +
 base/testfiles/tlb-rollback-004-often.luatex.tlg   |   2 +
 base/testfiles/tlb-rollback-004-often.tlg          |   2 +
 base/testfiles/tlb-rollback-004-often.xetex.tlg    |   2 +
 8 files changed, 224 insertions(+), 196 deletions(-)

diff --git a/base/ltdefns.dtx b/base/ltdefns.dtx
index 3067f03a..ae3a6950 100644
--- a/base/ltdefns.dtx
+++ b/base/ltdefns.dtx
@@ -1272,21 +1272,29 @@
 %   that it copes with the different types of robust commands defined by
 %   \LaTeX's mechanisms.
 %
-%   The current implementation is an almost exact copy of Heiko Oberdiek's
-%   \cs{LetLtxMacro}, with changed names and some simplifications thanks to
-%   $\epsilon$-\TeX.
+%   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,
-%<latexrelease> \ProvideCommandCopy, and \DeclareCommandCopy}%
+%<latexrelease>  {Add \NewCommandCopy, \RenewCommandCopy,
+%<latexrelease>   \ProvideCommandCopy, 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'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.
+%   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.
@@ -1296,230 +1304,233 @@
 %   \cs{ProvideCommandCopy} only carries out the definition if \verb=#1= is not
 %   yet defined, otherwise it does nothing.
 %    \begin{macrocode}
-\def\NewCommandCopy#1{%
-  \declare at commandcopy#1%
+\def\NewCommandCopy{%
+  \declare at commandcopy%
     {\@firstofone}%
     {\@firstoftwo\@notdefinable}}
-\def\RenewCommandCopy#1{%
-  \declare at commandcopy#1%
-    {\@latex at error{Command \string#1 undefined}\@ehc
+\def\RenewCommandCopy{%
+  \declare at commandcopy%
+    {\@latex at error{Command \@backslashchar\reserved at a\space undefined}\@ehc
      \@firstofone}%
     {\@firstofone}}
-\def\ProvideCommandCopy#1{%
-  \declare at commandcopy#1%
+\def\ProvideCommandCopy{%
+  \declare at commandcopy%
     {\@firstofone}%
     {\@gobble}}
-\def\DeclareCommandCopy#1{%
-  \declare at commandcopy#1%
+\def\DeclareCommandCopy{%
+  \declare at commandcopy%
     {\@firstofone}%
     {\@firstofone}}
 %    \end{macrocode}
 %
 % \begin{macro}{\declare at commandcopy}
-%   Start by saving the current value of \cs{escapechar} and setting it to $-1$,
-%   then check if the command is already defined.  The proper action, if the
-%   command is defined or not is taken by each specific command above.
+%   Start by setting \cs{escapechar} to $-1$, then check if the command is
+%   already defined.  The proper action, if the command is defined or not 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{%
-  \@tempcnta=\escapechar
-  \escapechar=\m at ne
-  \edef\reserved at a{\string#1}%
-  \@ifundefined\reserved at a{#2}{#3}%
-    {\declare at command@copy\relax#1#4}%
-  \escapechar=\@tempcnta}
-%    \end{macrocode}
-%   First we do some normalisation, to cover the case where \verb=#3= expands to
-%   \verb*=\protect\#3 =.  This is the case when \verb=#3= is a multi-letter
-%   control sequence defined with \cs{DeclareRobustCommand}.  In this case we
-%   copy \verb*=\#3 = into \verb*=\#2 = and then call the inner
-%   \cs{declare@@command at copy} with \verb*=\#2 = and \verb*=\#3 = rather than
-%   \verb*=\#2= and \verb*=\#3=.
-%    \begin{macrocode}
-\def\declare at command@copy#1#2#3{%
-  \edef\reserved at b{%
-    \noexpand\protect
-    \expandafter\noexpand\csname\string#3 \endcsname
-  }%
-  \ifx\reserved at b#3\relax
-    #1\edef#2{%
-      \noexpand\protect
-      \expandafter\noexpand
-      \csname\string#2 \endcsname
-    }%
-    #1\expandafter\let
-    \csname\string#2 \expandafter\endcsname
-    \csname\string#3 \endcsname
-    \expandafter\declare@@command at copy
-      \csname\string#2 \expandafter\endcsname
-      \csname\string#3 \endcsname{#1}%
-%    \end{macrocode}
-%   Otherwise just call \cs{declare@@command at copy} with \verb*=\#2= and \verb*=\#3=
-%   to do the heavy-lifting.
-%    \begin{macrocode}
+  \begingroup
+    \escapechar=\m at ne
+    \edef\reserved at a{\endgroup
+      \def\noexpand\reserved at a{\string#3}%
+      \noexpand\@ifundefined\noexpand\reserved at a}%
+  \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,\declare at command@copy at loop@aux,
+%     \declare at command@copy at do}
+% \begin{macro}{\@declarecommandcopylisthook}
+%   \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 loop\expandafter#2%
+    \@declarecommandcopylisthook{\@nnil\@nnil}%
+  \@declare at command@end#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\let
   \else
-    \declare@@command at copy{#2}{#3}{#1}%
+    #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}
 %    \end{macrocode}
-%   Check if the \verb=#2= is actually a macro, otherwise just use \cs{let}.
-%    \begin{macrocode}
-\def\declare@@command at copy#1#2#3{%
-  \escapechar=`\\
-  \expandafter\declare at copy@chk at parm\meaning#2:->\@nil{%
-%    \end{macrocode}
-%   Now the real fun begins.  We'll redefine (in a group) some of \LaTeX's
-%   optional argument-processing macros because TODO
-%   Also make \cs{declare at copy@testopt} equal to \cs{@empty} to signal no optional
-%   argument (may change).
-%    \begin{macrocode}
-    \begingroup
-      \def\@protected at testopt{%
-        \expandafter\@testopt\@gobble}%
-      \def\@testopt##1##2{%
-        \toks@={##2}}%
-      \let\declare at copy@testopt\@empty
-%    \end{macrocode}
-%   Define \cs{reserved at c} as \verb=\@protected at testopt\#2\\#2=\ldots
-%    \begin{macrocode}
-      \edef\reserved at c{%
-        \noexpand\@protected at testopt
-        \noexpand#2%
-        \expandafter\noexpand\csname\string#2\endcsname
-      }%
-%    \end{macrocode}
-%   and define \cs{reserved at d} as the first three (or fewer) tokens in the
-%   expansion of \verb=#2=\ldots
-%    \begin{macrocode}
-      \edef\reserved at d{%
-        \unexpanded\expandafter\expandafter\expandafter
-          {\expandafter\declare at copy@CarThree#2{}{}{}\@nil}}
-%    \end{macrocode}
-%   then compare both.  If they are equal, the macro contains a test for an
-%   optional argument, in which case \verb=#2= is executed, so that the default
-%   value of the optional argument is stored in \cs{toks@} and
-%   \cs{declare at copy@testopt} is redefined accordingly.
-%    \begin{macrocode}
-      \ifx\reserved at c\reserved at d
-        #2%
-        \def\declare at copy@testopt{%
-          \noexpand\@protected at testopt
-          \noexpand#1%
-        }%
-%    \end{macrocode}
-%   Otherwise we try again and redefine \cs{reserved at c} as
-%   \verb=\@testopt\\#2=\ldots
-%    \begin{macrocode}
-      \else
-        \edef\reserved at c{%
-          \noexpand\@testopt
-          \expandafter\noexpand
-          \csname\string#2\endcsname
-        }%
-%    \end{macrocode}
-%   and \cs{reserved at d} as the first two (or fewer) tokens in the expansion of
-%   \verb=#2=.  Now if they are equal, execute \verb=#2= so that the default
-%   value of the optional argument of \verb=#2= is stored in \cs{toks@}, and
-%   then reassign \cs{declare at copy@testopt} to be \cs{@testopt}.
-%    \begin{macrocode}
-        \edef\reserved at d{%
-          \unexpanded\expandafter\expandafter\expandafter
-            {\expandafter\declare at copy@CarTwo#2{}{}{}\@nil}}
-        \ifx\reserved at c\reserved at d
-          #2%
-          \def\declare at copy@testopt{%
-            \noexpand\@testopt
-          }%
-        \fi
-      \fi
+%
+%   The initial definition of \cs{@declarecommandcopylisthook} contains the
+%   tests for the two types of robust command in the kernel.
+%    \begin{macrocode}
+\def\@declarecommandcopylisthook{%
+  {\IfKernelRobustCommand \CopyKernelRobustCommand}%
+  {\IfKernelCmdWithOptArg \CopyKernelCmdWithOptArg}}
 %    \end{macrocode}
-%   Now, unless \cs{declare at copy@testopt} is empty (that is, no optional argument)
-%   define \cs{declare at copy@GlobalTemp} to be
-%   \meta{testopt}\cs{\#1}\{\meta{opt-default}\}, where
-%   \meta{testopt} is either \verb=\@protected at testopt\#2=, or \verb=\@testopt=.
+%
+%   Now the rollback code.
 %    \begin{macrocode}
-      \ifx\declare at copy@testopt\@empty
-      \else
-        \declare at copy@protected\xdef\declare at copy@GlobalTemp{%
-          \declare at copy@testopt
-          \expandafter\noexpand
-          \csname\string#1\endcsname
-          {\the\toks@}%
-        }%
-      \fi
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000-00-00}{\DeclareCommandCopy}
+%<latexrelease>  {Undefine \NewCommandCopy, \RenewCommandCopy,
+%<latexrelease>   \ProvideCommandCopy, and \DeclareCommandCopy}%
+%<latexrelease>\let\NewCommandCopy\@undefined
+%<latexrelease>\let\RenewCommandCopy\@undefined
+%<latexrelease>\let\DeclareCommandCopy\@undefined
+%<latexrelease>\let\ProvideCommandCopy\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
 %    \end{macrocode}
-%   We're almost done now.  If \cs{declare at copy@testopt} remained empty all along,
-%   then the macro didn't have an optional argument and we just need to \cs{let}
-%   one to the other.
-%   Otherwise we \cs{let} \verb=\#1=, the top-level macro, to
-%   \cs{declare at copy@GlobalTemp}, and then \cs{let} \verb=\\#1= to \verb=\\#2=,
-%   which is the actual definition of the macro.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\IfKernelRobustCommand,\CopyKernelRobustCommand}
+% \begin{macro}{copy at kernel@robust at command}
+% \changes{v1.5h}{2020/05/01}{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{IfKernelRobustCommand} 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}
-    \expandafter\endgroup\ifx\declare at copy@testopt\@empty
-      #3\let#1=#2\relax
-    \else
-      #3\let#1=\declare at copy@GlobalTemp
-      #3\expandafter\let
-          \csname\string#1\expandafter\endcsname
-          \csname\string#2\endcsname
-    \fi
-  }{%
-    #3\let#1=#2\relax
-  }%
-}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020-10-01}{\IfKernelRobustCommand}
+%<latexrelease>  {Add \IfKernelRobustCommand, \CopyKernelRobustCommand,
+%<latexrelease>   \IfKernelCmdWithOptArg, and \CopyKernelCmdWithOptArg}%
+%<*2ekernel|latexrelease>
 %    \end{macrocode}
-%   This auxiliary detects whether the argument is a macro (otherwise this
-%   entire process boils down to \TeX's \cs{let}), and in case of a
-%   \cs{protected} macro (using \textsf{etoolbox}'s \cs{newrobustcmd}), define
-%   \cs{declare at copy@protected} accordingly.
+%
 %    \begin{macrocode}
-\def\declare at copy@chk at parm#1:->#2\@nil{%
-  \tmp at strifeq{#1}{macro}%
-    {%
-      \def\declare at copy@protected{}%
-      \@firstoftwo
-    }{%
-      \tmp at strifeq{#1}{\protected macro}%
-        {%
-          \def\declare at copy@protected{\protected}%
-          \@firstoftwo%
-        }
-        {\@secondoftwo}%
-    }%
-}
+\def\IfKernelRobustCommand#1{%
+  \begingroup
+    \escapechar\m at ne
+    \xdef\@gtempa{\noexpand\protect
+      \expandafter\noexpand\csname\string#1 \endcsname}%
+  \endgroup
+  \ifx\@gtempa#1\relax
+    \expandafter\@firstoftwo
+  \else
+    \expandafter\@secondoftwo
+  \fi}
 %    \end{macrocode}
-%   This is just a temporary poor-man's string comparison macro to make things
-%   easier.  This should be replaced by \cs{@expl at str@if at eq@nnTF} once that's
-%   defined.
+%
+%   If a command was defined by \cs{DeclareRobustCommand} (that is,
+%   \cs{IfKernelRobustCommand} 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{IfKernelCmdWithOptArg} to check that and
+%   \cs{CopyKernelCmdWithOptArg} to do the copying.
 %    \begin{macrocode}
-\def\tmp at strifeq#1#2{%
+\def\CopyKernelRobustCommand#1#2{%
   \begingroup
-    \edef\reserved at a{\detokenize{#1}}%
-    \edef\reserved at b{\detokenize{#2}}%
-  \expandafter\endgroup
+    \escapechar=\m at ne
+    \edef\reserved at a{%
+  \endgroup
+  \def\noexpand#1{\noexpand\protect
+    \expandafter\noexpand\csname\string#1 \endcsname}%
+  \noexpand\copy at kernel@robust at command
+    \expandafter\noexpand\csname\string#1 \endcsname
+    \expandafter\noexpand\csname\string#2 \endcsname}%
+  \reserved at a}
+\def\copy at kernel@robust at command#1#2{%
+  \IfKernelCmdWithOptArg#2%
+    {\CopyKernelCmdWithOptArg#1#2}%
+    {\let#1#2}}
+%    \end{macrocode}
+%
+% \begin{macro}{\IfKernelCmdWithOptArg,\CopyKernelCmdWithOptArg}
+%
+%   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\IfKernelCmdWithOptArg#1{%
+  \edef\reserved at a{%
+    \noexpand\@protected at testopt
+    \noexpand#1%
+    \expandafter\noexpand\csname\string#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}
-%   Takes the first two or three tokens of the argument.
+%
+%   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\CopyKernelCmdWithOptArg#1#2{%
+  \edef#1{%
+    \noexpand\@protected at testopt
+    \noexpand#1%
+    \expandafter\noexpand\csname\string#1\endcsname
+    \unexpanded\expandafter\expandafter\expandafter
+      {\expandafter\@gobblethree#2}}%
+  \expandafter\let
+    \csname\string#1\expandafter\endcsname
+    \csname\string#2\endcsname}
+%    \end{macrocode}
+%
+%   Now the rollback code.
 %    \begin{macrocode}
-\def\declare at copy@CarTwo#1#2#3\@nil{#1#2}%
-\def\declare at copy@CarThree#1#2#3#4\@nil{#1#2#3}%
 %</2ekernel|latexrelease>
 %<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{0000-00-00}{\DeclareCommandCopy}
-%<latexrelease>{Undefine \NewCommandCopy, \RenewCommandCopy,
-%<latexrelease> \ProvideCommandCopy, and \DeclareCommandCopy}%
-%<latexrelease>\let\NewCommandCopy\@undefined
-%<latexrelease>\let\RenewCommandCopy\@undefined
-%<latexrelease>\let\DeclareCommandCopy\@undefined
-%<latexrelease>\let\ProvideCommandCopy\@undefined
+%<latexrelease>\IncludeInRelease{0000-00-00}{\IfKernelRobustCommand}
+%<latexrelease>  {Undefine \IfKernelRobustCommand, \CopyKernelRobustCommand,
+%<latexrelease>   \IfKernelCmdWithOptArg, and \CopyKernelCmdWithOptArg}%
+%<latexrelease>\let\IfKernelRobustCommand\@undefined
+%<latexrelease>\let\CopyKernelRobustCommand\@undefined
+%<latexrelease>\let\IfKernelCmdWithOptArg\@undefined
+%<latexrelease>\let\CopyKernelCmdWithOptArg\@undefined
 %<latexrelease>\EndIncludeInRelease
 %<*2ekernel>
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
-%
+% \end{macro}
 %
 %  \begin{macro}{\kernel at make@fragile}
 %    The opposite of |\MakeRobust| execpt that it doesn't do many
@@ -1557,7 +1568,6 @@
 %</2ekernel|latexrelease>
 %<*2ekernel>
 %    \end{macrocode}
-%  \end{macro}
 %
 %
 %
diff --git a/base/testfiles/github-0239b.tlg b/base/testfiles/github-0239b.tlg
index 4c181417..9910b408 100644
--- a/base/testfiles/github-0239b.tlg
+++ b/base/testfiles/github-0239b.tlg
@@ -14,7 +14,7 @@ Type  I <command> <return>  to replace it with another command,
 or  <return>  to continue without it.
 \exists =macro:->exists|
 \tmpb =macro:->another| (and an error)
-! LaTeX Error: Command tmpb undefined.
+! LaTeX Error: Command \tmpb undefined.
 See the LaTeX manual or LaTeX Companion for explanation.
 Type  H <return>  for immediate help.
  ...                                              
diff --git a/base/testfiles/tlb-latexrelease-rollback-003-often.luatex.tlg b/base/testfiles/tlb-latexrelease-rollback-003-often.luatex.tlg
index 62bfd0c8..30bfe7bb 100644
--- a/base/testfiles/tlb-latexrelease-rollback-003-often.luatex.tlg
+++ b/base/testfiles/tlb-latexrelease-rollback-003-often.luatex.tlg
@@ -15,6 +15,8 @@ Skipping: [....-..-..] \MakeRobust  on input line ....
 Applying: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Skipping: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
@@ -326,6 +328,8 @@ Already applied: [....-..-..] \MakeRobust  on input line ....
 Already applied: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Already applied: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
diff --git a/base/testfiles/tlb-latexrelease-rollback-003-often.tlg b/base/testfiles/tlb-latexrelease-rollback-003-often.tlg
index ba5f66ee..3fc5b835 100644
--- a/base/testfiles/tlb-latexrelease-rollback-003-often.tlg
+++ b/base/testfiles/tlb-latexrelease-rollback-003-often.tlg
@@ -13,6 +13,8 @@ Skipping: [....-..-..] \MakeRobust  on input line ....
 Applying: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Skipping: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
@@ -318,6 +320,8 @@ Already applied: [....-..-..] \MakeRobust  on input line ....
 Already applied: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Already applied: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
diff --git a/base/testfiles/tlb-latexrelease-rollback-003-often.xetex.tlg b/base/testfiles/tlb-latexrelease-rollback-003-often.xetex.tlg
index 27cc2b1e..6a8d3e3a 100644
--- a/base/testfiles/tlb-latexrelease-rollback-003-often.xetex.tlg
+++ b/base/testfiles/tlb-latexrelease-rollback-003-often.xetex.tlg
@@ -13,6 +13,8 @@ Skipping: [....-..-..] \MakeRobust  on input line ....
 Applying: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Skipping: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
@@ -327,6 +329,8 @@ Already applied: [....-..-..] \MakeRobust  on input line ....
 Already applied: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Already applied: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
diff --git a/base/testfiles/tlb-rollback-004-often.luatex.tlg b/base/testfiles/tlb-rollback-004-often.luatex.tlg
index 053bf6bf..964eaf4f 100644
--- a/base/testfiles/tlb-rollback-004-often.luatex.tlg
+++ b/base/testfiles/tlb-rollback-004-often.luatex.tlg
@@ -12,6 +12,8 @@ Already applied: [....-..-..] \MakeRobust  on input line ...
 Already applied: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Already applied: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
diff --git a/base/testfiles/tlb-rollback-004-often.tlg b/base/testfiles/tlb-rollback-004-often.tlg
index 79879061..b8ade86d 100644
--- a/base/testfiles/tlb-rollback-004-often.tlg
+++ b/base/testfiles/tlb-rollback-004-often.tlg
@@ -10,6 +10,8 @@ Already applied: [....-..-..] \MakeRobust  on input line ...
 Already applied: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Already applied: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
diff --git a/base/testfiles/tlb-rollback-004-often.xetex.tlg b/base/testfiles/tlb-rollback-004-often.xetex.tlg
index 17b880b6..b17402b7 100644
--- a/base/testfiles/tlb-rollback-004-often.xetex.tlg
+++ b/base/testfiles/tlb-rollback-004-often.xetex.tlg
@@ -10,6 +10,8 @@ Already applied: [....-..-..] \MakeRobust  on input line ...
 Already applied: [....-..-..] \MakeRobust  on input line ....
 Skipping: [....-..-..] Add \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
 Applying: [....-..-..] Undefine \NewCommandCopy , \RenewCommandCopy , \ProvideCommandCopy , and \DeclareCommandCopy  on input line ....
+Skipping: [....-..-..] Add \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ...
+Applying: [....-..-..] Undefine \IfKernelRobustCommand , \CopyKernelRobustCommand , \IfKernelCmdWithOptArg , and \CopyKernelCmdWithOptArg  on input line ....
 Applying: [....-..-..] Undo robustness on input line ....
 Applying: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....
 Already applied: [....-..-..] Leave commands undefined in \@ifundefined  on input line ....





More information about the latex3-commits mailing list.