[latex3-commits] [git/LaTeX3-latex3-latex2e] versioning: added class/package rollback ... general docu still missing (ff055ce)
Frank Mittelbach
frank.mittelbach at latex-project.org
Mon Feb 19 18:29:39 CET 2018
Repository : https://github.com/latex3/latex2e
On branch : versioning
Link : https://github.com/latex3/latex2e/commit/ff055ce7741009aa9e45eca13acbd187bab8d548
>---------------------------------------------------------------
commit ff055ce7741009aa9e45eca13acbd187bab8d548
Author: Frank Mittelbach <frank.mittelbach at latex-project.org>
Date: Mon Feb 19 18:29:39 2018 +0100
added class/package rollback ... general docu still missing
>---------------------------------------------------------------
ff055ce7741009aa9e45eca13acbd187bab8d548
base/ltclass.dtx | 596 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 587 insertions(+), 9 deletions(-)
diff --git a/base/ltclass.dtx b/base/ltclass.dtx
index 95b7895..f23520e 100644
--- a/base/ltclass.dtx
+++ b/base/ltclass.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright 1993-2018
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltclass.dtx}
- [2018/01/08 v1.2d LaTeX Kernel (Class & Package Interface)]
+ [2018/02/18 v1.2d LaTeX Kernel (Class & Package Interface)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltclass.dtx}
@@ -56,11 +56,16 @@
% \fi
%
%
+% \changes{v0.2f}{1993/11/22}
+% {\cs{@unknownversion} removed}
+% \changes{v1.0j}{1994/10/18}
+% {Move \cs{listfiles} to ltfiles.dtx}
% \changes{v1.0f}{1994/05/22}{Use new warning and error commands}
% \changes{v1.0l}{1994/11/17}{\cs{@tempa} to \cs{reserved at a}}
% \changes{v1.0z}{1998/03/21}{Added to documentation of filecontents}
% \changes{v1.1c}{1998/08/17}{(RmS) Minor documentation fixes.}
%
+%
% \section{Introduction}
%
% This file implements the following declarations, which replace
@@ -618,14 +623,35 @@
% This internal macro is also used in |\NeedsTeXFormat|.
% \changes{v0.2f}{1993/11/22}
% {Added //00 so parsing never produces a runaway argument.}
+% \changes{v1.2d}{2018/02/18}
+% {Added 0 up front to make bad data come out as 0.}
% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2018/03/01}%
+%<latexrelease> {\@ifl at t@r}{Guard against bad input}%
+%<*2ekernel|latexrelease>
\def\@ifl at t@r#1#2{%
- \ifnum\expandafter\@parse at version#1//00\@nil<%
- \expandafter\@parse at version#2//00\@nil
+ \ifnum\expandafter\@parse at version\expandafter0#1//00\@nil<%
+ \expandafter\@parse at version\expandafter0#2//00\@nil
\expandafter\@secondoftwo
\else
\expandafter\@firstoftwo
\fi}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@ifl at t@r}{Guard against bad input}%
+%<latexrelease>\def\@ifl at t@r#1#2{%
+%<latexrelease> \ifnum\expandafter\@parse at version#1//00\@nil<%
+%<latexrelease> \expandafter\@parse at version#2//00\@nil
+%<latexrelease> \expandafter\@secondoftwo
+%<latexrelease> \else
+%<latexrelease> \expandafter\@firstoftwo
+%<latexrelease> \fi}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
\@onlypreamble\@ifl at t@r
% \end{macrocode}
%
@@ -1440,7 +1466,7 @@
\csname\@currname.\@currext-h@@k\endcsname
\expandafter\let\csname\@currname.\@currext-h@@k\endcsname
\@undefined
- \@unprocessedoptions}
+ \@unprocessedoptions}%
% \end{macrocode}
%
% \begin{macrocode}
@@ -1810,15 +1836,567 @@
% \end{macro}
%
%
-% \changes{v0.2f}{1993/11/22}
-% {\cs{@unknownversion} removed}
-% \changes{v1.0j}{1994/10/18}
-% {Move \cs{listfiles} to ltfiles.dtx}
+%
+%
+%
+% \section{Package/class rollback mechanism}
+%
+
+% \begin{macro}{\pkgcls at debug}
+% For testing we have a few extra lines of code that by default do
+% nothing but one can set |\pkgcls at debug| to |\typeout| to get
+% extra info. Sometime in the future this will be dropped.
+% \begin{macrocode}
+%<*tracerollback>
+%\let\pkgcls at debug\typeout
+\let\pkgcls at debug\@gobble
+%</tracerollback>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\requestedLaTeXdate}
+% The macro (!) |\requestedLaTeXdate| holds the globally requested
+% rollback date (via \texttt{latexrelease}) or zero if no such
+% request was made.
+% \begin{macrocode}
+\def\requestedLaTeXdate{0}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\pkgcls at targetdate}
+% \begin{macro}{\pkgcls at targetlabel}
+%
+% If a rollback for a package or class is requested then
+% |\pkgcls at targetdate| holds the requested date as a number
+% YYYYMMDD (if there was one, otherwise the value of
+% |\requestedLaTeXdate|) and |\pkgcls at targetlabel| will be
+% empty. If there was a request for a named version then
+% |\pkgcls at targetlabel| holds the verion name and
+% |\pkgcls at targetdate| is set to \texttt{1}.
+%
+% |\pkgcls at targetdate=0| is used to indicate that there was no
+% rollback request.
+%
+% \begin{macrocode}
+\newcount\pkgcls at targetdate
+\let\pkgcls at targetlabel\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+% \begin{macro}{\pkgcls at candidate}
+% \begin{macro}{\pkgcls at releasedate}
+% When looping through the |\DeclareOldRelease| declarations we
+% record if the release is the best candidate we have seen so far.
+% This is recorded in |\pkgcls at candidate| and we update it whenever
+% we see a better one.
+%
+% In |\pkgcls at releasedate| we keep track of the release date of
+% that candidate.
+% \begin{macrocode}
+\let\pkgcls at candidate\@empty
+\let\pkgcls at releasedate\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+
+
+% \begin{macro}{\load at onefilewithoptions}
+% \begin{macro}{\@onefilewithoptions}
+% the best place to add the rollback code is at the point where
+% |\@onefilewithoptions| is called to load a single class or
+% package.
+%
+% To make things easy we save the old definition as
+% |\load at onefilewithoptions| and then provide a new interface.
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2018/03/01}%
+%<latexrelease> {\@onefilewithoptions}{Rollback}%
+\let\load at onefilewithoptions\@onefilewithoptions
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@onefilewithoptions#1[#2][#3]#4{%
+% \end{macrocode}
+% First a bit of tracing normally disabled.
+% \begin{macrocode}
+%<*tracerollback>
+ \pkgcls at debug{--- File loaded request (\noexpand\usepackage or ...)}%
+ \pkgcls at debug{\@spaces 1: #1}%
+ \pkgcls at debug{\@spaces 2: #2}%
+ \pkgcls at debug{\@spaces 3: #3}%
+ \pkgcls at debug{\@spaces 4: #4}%
+%</tracerollback>
+% \end{macrocode}
+% Two of the arguments are needed later on in error/warning
+% messages so we save them.
+% \begin{macrocode}
+ \def\pkgcls at name{#1}% % for info message
+ \def\pkgcls at arg {#3}% % for info message
+% \end{macrocode}
+% then we parse the final optional argument to determine if there
+% is a specific rollback request for the current file. This will
+% set |\pkgcls at targetdate|, |\pkgcls at targetlabel| and
+% |\pkgcls at mindate|.
+% \begin{macrocode}
+ \pkgcls at parse@date at arg{#3}%
+% \end{macrocode}
+% When determining the correct release to load we keep track of
+% candiates in |\pkgcls at candidate| and initially we don't have any:
+% \begin{macrocode}
+ \let\pkgcls at candidate\@empty
+% \end{macrocode}
+% If we had a rollback request then |#3| may contain data but not
+% necessarily a ``minimal date'' so instead of passing it on we
+% pass on |\pkgcls at mindate|.
+% \begin{macrocode}
+ \load at onefilewithoptions#1[#2][\pkgcls at mindate]#4%
+}
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\pkgcls at parse@date at arg}
+% The |\pkgcls at parse@date at arg| command parses the second optional
+% argument of |\usepackage|, |\RequirePackage| or |\documentclass|
+% for a rollback request setting the values of |\pkgcls at targetdate|
+% and |\pkgcls at targetlabel|.
+%
+% This optional argument has a dual purpose: If it just contains a
+% date string then this means that the package should have at least
+% that date (to ensure that a certain feature is actually available,
+% or a certain bug has been fixed). When the package gets loaded the
+% information in |\Provides...| will then be checked against this
+% request.
+%
+% But if it starts with an equal sign followed by a date string or
+% followed by a version name then this means that we should roll
+% back to the state of the package at tht date or to the version
+% with the requested name.
+%
+% If there was no optional argument or the optional argument
+% does not start with ``\texttt{=}'' then the |\pkgcls at targetdate|
+% is set to the date of the overall rollback request (via
+% \texttt{latexrelease}) or if that was not given it is set to
+% \texttt{0}.
+% In either case |\pkgcls at targetlabel| will be made empty.
+%
+% If the argument doesn't start with ``\texttt{=}'' then it is
+% supposed to be a ``minimal date'' and we therefore save the value
+% in |\pkgcls at mindate|, otherwise this macro is made empty.
+%
+% So in summary we have:
+% \begin{flushleft}
+% \hspace*{-1in}\begin{tabular}{ccccc}
+% Input & & \cs{pkgcls at targetdate}
+% & \cs{pkgcls at targetlabel}
+% & \cs{pkgcls at mindate}\\[3pt]
+% \meta{empty} & $\to$ & \meta{global-rollbackdate-as-number}
+% & \meta{empty} & \meta{empty}
+% \\
+% \meta{date} & $\to$ & \meta{global-rollbackdate-as-number}
+% & \meta{empty} & \meta{date}
+% \\
+% \texttt{=}\meta{date} & $\to$ & \meta{date-as-number}
+% & \meta{empty} & \meta{empty}
+% \\
+% \texttt{=}\meta{version}& $\to$ & \texttt{1}
+% & \meta{version} & \meta{empty}
+% \\
+% \meta{other} & $\to$ & \meta{global-rollbackdate-as-number}
+% & \meta{empty} & \meta{other}
+% \\
+% \end{tabular}
+% \end{flushleft}
+% where \meta{global-rollbackdate-as-number} is a date request given
+% via \texttt{latexrelease} or if there wasn't one \texttt{0}.
+%
+% \begin{macrocode}
+\def\pkgcls at parse@date at arg #1{%
+% \end{macrocode}
+% If the argument is empty we use the rollback date from
+% \texttt{latexrelease} which has the value of zero if there was no
+% rollback request. The label and the minimal date is made empty in that case.
+% \begin{macrocode}
+ \ifx\@nil#1\@nil
+ \pkgcls at targetdate\requestedLaTeXdate\relax
+ \let\pkgcls at targetlabel\@empty
+ \let\pkgcls at mindate\@empty
+% \end{macrocode}
+% Otherwise we parse the argument further, checking for a \texttt{=}
+% as the first character. We append a \texttt{=} at the end so that
+% there is at least one such character in the argument.
+% \begin{macrocode}
+ \else
+ \pkgcls at parse@date at arg@#1=\@nil\relax
+ \fi
+ }
+% \end{macrocode}
+% The actual parsing work then happens in |\pkgcls at parse@date at arg@|:
+% \begin{macrocode}
+\def\pkgcls at parse@date at arg@#1=#2\@nil{%
+% \end{macrocode}
+% We set |\pkgcls at targetdate| depending on the parsing result; the
+% code is expandable so we can do the parsing as part of the assignment.
+% \begin{macrocode}
+ \pkgcls at targetdate
+% \end{macrocode}
+% If a \texttt{=} was in first position then |#1| will be empty. In
+% that case |#2| will be the original argument with a \texttt{=}
+% appended.
+%
+% This can be parsed with |\@parse at version|, the trailing character
+% is simply ignored. This macro returns the parsed date as a number
+% (or zero if it wasn't a date) and accepts both YYYY/MM/DD and YYYY-MM-DD
+% formats.
+% \begin{macrocode}
+ \ifx\@nil#1\@nil
+ \@parse at version0#2//00\@nil\relax
+% \end{macrocode}
+% Whatever is returned is thus assigned to |\pkgcls at targetdate|
+% and therefore we can now test its value. If the value is zero we
+% assume that the remaining argument string represents a version
+% and change |\pkgcls at targetdate| and set |\pkgcls at targetlabel| to
+% the version name (after stripping off the trailing \texttt{=}.
+% \begin{macrocode}
+ \ifnum \pkgcls at targetdate=\z@
+ \pkgcls at targetdate\@ne
+ \pkgcls at parse@date at arg@version#2%
+ \fi
+ \let\pkgcls at mindate\@empty
+ \else
+% \end{macrocode}
+% If |#1| was not empty then there wasn't a \texttt{=} character in
+% first position so we we are dealing either with a ``minimum
+% date'' or with some incorrect data. We assume the former and make
+% the following assignments (the first one finishing the assignment
+% of |\pkgcls at targetdate|):
+% \begin{macrocode}
+ \requestedLaTeXdate\relax
+ \let\pkgcls at targetlabel\@empty
+ \def\pkgcls at mindate{#1}%
+% \end{macrocode}
+% If the min-date is after the requested rollback date (if there is
+% any, i.e., if it is not zero) then we have a conflict and
+% therefore issue an error.
+% \begin{macrocode}
+ \ifnum \pkgcls at targetdate > \z@
+ \ifnum \@parse at version0#1//00\@nil > \pkgcls at targetdate
+ \@latex at error{Suspicious rollback/min-date date given}%
+ {There is a minimal date of #1 specified for
+ \@cls at pkg\space'\pkgcls at name'.\MessageBreak
+ But this is in conflict
+ with a rollback request to \requestedpatchdate,
+ so something\MessageBreak
+ is wrong here. Continue and I
+ ignore the minimal date request.}%
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% Strip off te trailing \texttt{=} and assign the version name to
+% |\pkgcls at targetlabel|.
+% \begin{macrocode}
+\def\pkgcls at parse@date at arg@version#1={%
+ \def\pkgcls at targetlabel{#1}}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\DeclareOldRelease}
+% First argument is the ``name'' of the release and it is optional
+% as that is the exceptional case.
+% The second argument is that from which on this release was
+% available (or should be used in case of minor updates).
+% The final argument is the external file name of this release, by
+% convention this should be
+% \meta{pkg/cls-name}\texttt{-}\meta{date}\texttt{.}\meta{extension}
+% but this is not enforced and through this argument one can
+% overwrite it.
+% \begin{macrocode}
+\newcommand\DeclareOldRelease[3][]{%
+ \ifnum\pkgcls at targetdate>\z@ % some sort of rollback request
+%<*tracerollback>
+ \pkgcls at debug{---\string\DeclareOldRelease:}%
+ \pkgcls at debug{\@spaces 1: #1}%
+ \pkgcls at debug{\@spaces 2: #2}%
+ \pkgcls at debug{\@spaces 3: #3}%
+%</tracerollback>
+% \end{macrocode}
+% If the value of |\pkgcls at targetdate| is greater than 1 (or in
+% reality greater than something like 19930101) we are dealing with a
+% rollback request to a specific date.
+% \begin{macrocode}
+ \ifnum\pkgcls at targetdate>\@ne % a real request
+% \end{macrocode}
+% So we parse the date of this release to check if it is before or
+% after the request date.
+% \begin{macrocode}
+ \ifnum\@parse at version#2//00\@nil
+ >\pkgcls at targetdate
+% \end{macrocode}
+% If it is after we have to distinguish between two cases: If there
+% was an earlier candidate we use that one because the other is too
+% late, but if there wasn't one (i.e., if current release is the
+% oldest that exists) we use it as the best choice. However in
+% that case something is wrong (as there shouldn't be a rollback to
+% a date where a package used doesn't yet exists. So we make a
+% complained to the user.
+% \begin{macrocode}
+ \ifx\pkgcls at candidate\@empty
+ \pkgcls at rollbackdate@error{#2}%
+ \pkgcls at use@this at release{#3}{#2}%
+ \else
+ \pkgcls at use@this at release\pkgcls at candidate
+ \pkgcls at releasedate
+ \fi
+ \else
+% \end{macrocode}
+% Otherwise, if the release date of this version is before the
+% target rollback and we record it as a candidate. But we don't use
+% it yet as there may be another release which is still before the
+% target rollback.
+% \begin{macrocode}
+ \def\pkgcls at candidate{#3}%
+ \def\pkgcls at releasedate{#2}%
+%<*tracerollback>
+ \pkgcls at debug{New candidate: #3}%
+%</tracerollback>
+ \fi
+ \else
+% \end{macrocode}
+% If we end up in this branch we have a named version request. So
+% we check if |\pkgcls at targetlabel| matches the current name and if
+% yes we use this release immediately, otherwise we do nothing as a
+% later declaration may match it.
+% \begin{macrocode}
+ \def\reserved at a{#1}%
+ \ifx\pkgcls at targetlabel\reserved at a
+ \pkgcls at use@this at release{#3}{#2}%
+%<*tracerollback>
+ \else
+ \pkgcls at debug{Label doesn't match}%
+%</tracerollback>
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\pkgcls at use@this at release}
+% If a certain release has been selected (stored in the external
+% file given in \verb=#1=) we need to input it and afterwards stop
+% reading the current file.
+% \begin{macrocode}
+\def\pkgcls at use@this at release#1#2{%
+% \end{macrocode}
+% Before that we record the selection made inside the transcript.
+% \begin{macrocode}
+ \pkgcls at show@selection{#1}{#2}%
+% \end{macrocode}
+% We then set the |\pkgcls at targetdate| to zero so that any
+% |\DeclareOldRelease| or |\DeclareCurrentRelease| in the file we
+% now load are bypassed\footnote{The older release may also have
+% such declarations inside if it was a simply copy od the
+% \texttt{.sty} or \texttt{.cls} file current at that
+% date. Removing these declarations would make the file load a tiny
+% bit faster, but this way it works in any case.} and then we
+% finally load the correct release.
+%
+% After loading that file we need to stop reading the current file
+% so we issue |\endinput|. Note that the |\relax| before that is
+% essential to ensure that the |\endinput| is only happening after
+% the file has been fully processed, otherwise it would act after the
+% first line of the |\@@input|!
+% \begin{macrocode}
+ \pkgcls at targetdate\z@
+ \@@input #1.\@currext\relax
+ \endinput
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\pkgcls at show@selection}
+% This command records what selection was made. As that is needed
+% in two places (and it is rather lengthly) it was placed in a
+% separate command. The first argument is the name of the external
+% file that is being loaded and is only needed for debugging. The
+% second argument is the date that corresponds to this file and it
+% is used as part of the message.
+% \begin{macrocode}
+\def\pkgcls at show@selection#1#2{%
+%<*tracerollback>
+ \pkgcls at debug{Result: use #1}%
+%</tracerollback>
+ \GenericInfo
+ {\@spaces\@spaces\space}{Rollback for
+ \@cls at pkg\space'\@currname' requested ->
+ \ifx\pkgcls at targetlabel\@empty
+ date
+ \ifnum\requestedLaTeXdate=\pkgcls at targetdate
+ \requestedpatchdate
+ \else
+ \expandafter\@gobble\pkgcls at arg
+ \fi.\MessageBreak
+% \end{macrocode}
+% Instead of ``best approximation'' we could say that we have been
+% able to exactly match the date (if it is exact), but that would
+% mean extra tests without much gain, so not done.
+% \begin{macrocode}
+ Best approximation is
+ \else
+ version '\pkgcls at targetlabel'.\MessageBreak
+ This corresponds to
+ \fi
+ the release introduced on #2\@gobble}%
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\pkgcls at rollbackdate@error}
+% This is called if the requested rollback date is earlier than the
+% earliest known release of a package or class.
+%
+% A similar error is given if global rollback date and min-date on
+% a specific package conflict with each other, but that case is
+% happens only once so it is is inlined.
+% \begin{macrocode}
+\def\pkgcls at rollbackdate@error#1{%
+ \@latex at error{Suspicious rollback date given}%
+ {The \@cls at pkg\space'\@currname' claims that it
+ came into existence on #1 which\MessageBreak
+ is after your requested rollback date --- so
+ something is wrong here.\MessageBreak
+ Continue and we use the earliest known release.}}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\DeclareCurrentRelease}
+% This declares the date (and possible name) of the current version
+% of a package or class.
+% \begin{macrocode}
+\newcommand\DeclareCurrentRelease[2][]{%
+% \end{macrocode}
+% First we test if |\pkgcls at targetdate| is greater than zero,
+% otherwise this code is bypassed (as there is no rollback request).
+% \begin{macrocode}
+ \ifnum\pkgcls at targetdate>\z@ % some sort of rollback request
+%<*tracerollback>
+ \pkgcls at debug{---DeclareCurrentRelease}%
+ \pkgcls at debug{ 1: #1}%
+ \pkgcls at debug{ 2: #2}%
+%</tracerollback>
+% \end{macrocode}
+% If the value is greater than 1 we have to deal with a date
+% request, so we parse |#2| as a date and compare it with
+% |\pkgcls at targetdate|.
+% \begin{macrocode}
+ \ifnum\pkgcls at targetdate>\@ne % a date request
+ \ifnum\@parse at version#2//00\@nil
+ >\pkgcls at targetdate
+% \end{macrocode}
+% If it is greater that means the release date if this file is
+% later than the requested rollback date. Again we have two cases:
+% If there was a previous candidate release we use that one as the
+% current release is too young, but if there wasn't we have to use
+% this release nevertheless as there isn't any alternative.
+%
+% However this case can only happen if there is a
+% |\DeclareCurrentRelease| but no declared older releases (so
+% basically the use of the declaration is a bit dubious).
+% \begin{macrocode}
+
+ \ifx\pkgcls at candidate\@empty
+ \pkgcls at rollbackdate@error{#2}%
+ \else
+ \pkgcls at use@this at release\pkgcls at candidate
+ \pkgcls at releasedate
+ \fi
+ \fi
+ \else % a label request
+% \end{macrocode}
+% Otherwise we have a rollback request to a named version so we
+% check if that fits the current name and if not give an error as
+% this was the last possible opportunity.
+% \begin{macrocode}
+ \def\reserved at a{#1}%
+ \ifx\pkgcls at targetlabel\reserved at a
+ \pkgcls at show@selection{current version}{#2}%
+ \else
+ \@latex at error{Requested version '\pkgcls at targetlabel' for
+ \@cls at pkg\space'\@currname' is unknown}\@ehc
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
%
% \begin{macrocode}
%</2ekernel>
% \end{macrocode}
%
+% Undo the above definition and changes:
+% \begin{macrocode}
+%<*latexrelease>
+\IncludeInRelease{0000/00/00}%
+ {\@onefilewithoptions}{Rollback}%
+
+\let\@onefilewithoptions\load at onefilewithoptions
+\let\load at onefilewithoptions\@undefined
+
+\pkgcls at debug
+\requestedLaTeXdate
+\pkgcls at targetdate
+\pkgcls at targetlabel
+\pkgcls at candidate
+\pkgcls at releasedate
+\pkgcls at parse@date at arg
+\pkgcls at parse@date at arg@
+\DeclareOldRelease
+\pkgcls at use@this at release
+\pkgcls at show@selection
+\pkgcls at rollbackdate@error
+\DeclareCurrentRelease
+
+\EndIncludeInRelease
+%</latexrelease>
+% \end{macrocode}
+
+
+
+
+
+
+
+
+
+
+
+
+%
% \section{After Preamble}
% Finally we declare a package that allows all the commands declared
% above to be |\@onlypreamble| to be used after |\begin{document}|.
More information about the latex3-commits
mailing list