[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