% \iffalse^^A meta-comment
% ======================================================================
% scrlfile.dtx
% Copyright (c) Markus Kohm, 2002-2022
%
% This file is part of the work `scrlfile' which is part of the LaTeX2e
% KOMA-Script bundle.
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c of the license.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX 
% version 2005/12/01 or later and of this work.
%
% This work has the LPPL maintenance status "author-maintained".
%
% The Current Maintainer and author of this work is Markus Kohm.
%
% This work consists of all files listed in MANIFEST.md.
% ======================================================================
%%% From File: $Id: scrlfile.dtx 3874 2022-06-05 10:38:02Z kohm $
%<*dtx>
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
  \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
  \filedate$Date: 2022-06-05 12:38:02 +0200 (So, 05. Jun 2022) $
  \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
  \filerevision$Revision: 3874 $
  \edef\reserved@a{%
    \noexpand\endgroup
    \noexpand\ProvidesFile{scrlfile.dtx}%
                          [\filedate\space\filerevision\space
                           KOMA-Script package source
  }%
\reserved@a
%</dtx>
%<package>\ProvidesPackage{scrlfile}[%
%!KOMAScriptVersion
%<package>  package 
  (file load hooks)]
%<*dtx>
\ifx\documentclass\undefined
  \input scrdocstrip.tex
  \@@input scrkernel-version.dtx
  \@@input scrstrip.inc
  \KOMAdefVariable{COPYRIGHTFROM}{2002}
  \generate{\usepreamble\defaultpreamble
    \file{scrlfile.sty}{%
      \from{scrlfile.dtx}{package}%
      \from{scrlogo.dtx}{logo}%
    }%
  }
  \batchinput{scrlfile-hook.dtx}
  \batchinput{scrlfile-patcholdlatex.dtx}
  \@@input scrstrop.inc
\else
  \let\endbatchfile\relax
\fi
\endbatchfile
\documentclass[USenglish]{koma-script-source-doc}
\usepackage{babel}
\setcounter{StandardModuleDepth}{1}
\begin{document}
  \DocInput{scrlfile.dtx}
\end{document}
%</dtx>
% \fi^^A meta-comment
%
% \changes{v2.95}{2002/06/11}{First version split from hugh scrclass.dtx}
% \changes{v3.24}{2017/05/06}{standalone manual removed}
% \changes{v3.32}{2020/09/11}{new implementation based on
%   \pkg*{scrlfile-hook} and \pkg*{scrlfile-patcholdlatex}}
% \changes{v3.36}{2022/02/03}{switch over from \cls*{scrdoc} to
%   \cls*{koma-script-source-doc}}
% \changes{v3.36}{2022/02/03}{using \file{scrlogo.dtx} to define the logo}
%
% \GetFileInfo{scrlfile.dtx}
% \title{File Loading Hooks with \href{https://komascript.de}{\KOMAScript}
%   Package \pkg*{scrlfile}}
% \author{\href{mailto:komascript@gmx.info}{Markus Kohm}}
% \date{Revision \fileversion{} of \filedate}
% \maketitle
% \begin{abstract}
%   This package is the compatibility layer over \texttt{scrlfile-hook} and
%   \texttt{scrlfile-patcholdlatex}. It provides package and class hook
%   handling independent from the used \LaTeX{} release.
% \end{abstract}
% \tableofcontents
%
%
% \section{User Manual}
%
% You can find the user manual of \pkg*{scrlfile} in the \KOMAScript{} manual,
% either the German \file{scrguide} or the English \file{scrguien}.
% Here you can find interim documentation only (before it is added to the
% \KOMAScript{} manual).
%
% \DescribeOption{withdeprecated}
% Package option \opt{withdeprecated} enables the definition of deprecated
% commands \cs{AfterClass+}, \cs{AfterPackage+}, \cs{AfterClass!} and
% \cs{AfterPackage!}. All of them will be emulated by \cs{AfterAtEndOClass*}
% and \cs{AfterAtEndOfPackage*} so they are not completely compatible with the
% original deprecated commands.
%
% Users of classes or package, that use such deprecated commands can load
% \pkg*{scrlfile} already before the class using:
%\begin{verbatim}
% \RequirePackage[withdeprecated]{scrlfile}
%\end{verbatim}%
% or adding option \opt{withdeprecated} to the global options of
% \cs{documentclass}. Note, this is not a key-value option. It cannot be
% changed after loading \pkg*{scrlfile}.
%
% \MaybeStop{\PrintIndex}
%
% \section{Implementation of \pkg*{scrlfile}}
%
% We need to load one of the packages \pkg*{scrlfile-hook},
% \pkg*{scrlfile-kook-3.34}, \pkg*{scrlfile-patcholdlatex}.
% \changes{v3.33}{2021/02/09}{do not test for existence of \cs{AddToHook} any
% longer, but \cs{IfFormatAtLeastTF} and the format version}%
% We cannot do the decision by testing the existence of macro \cs{AddToHook},
% because package \pkg{latexrelease} does not rollback to prior format
% versions good enough. Instead of undefining the macro and so really
% reverting to the definition of \LaTeX{} kernels prior to 2020/10/01 it only
% redefines it to a do-nothing macro. Because of this and similar issues with
% \pkg{latexrelease} cannot (or only with provision) be used to simulate a
% real old \LaTeX{} kernel, i.e. for testing. So the only valid test for the
% existence of the wanted \cs{AddToHook} would be to test the definite
% definition of \cs{AddToHook} and the existence of the hooks we are
% using. But, because this is to much effort, we simply test the format
% version. Nevertheless, we know, this may fail!
%    \begin{macrocode}
\@ifundefined{IfFormatAtLeastTF}{%
  \RequirePackage{scrlfile-patcholdlatex}%
  \RequirePackage{xparse}%
%    \end{macrocode}
% \changes{v3.33}{2021/02/16}{workaround for \pkg{latexrelease} bug}
% Explicitly switch of \pkg{expl3} syntax because of a
% \pkg{latexrelease} bug related to the usage of \pkg{xparse-2020-10-01} in
% version 2020-02-02.
% \changes{v3.35}{2021/10/31}{new variant because of \LaTeX{} kernel change}
%    \begin{macrocode}
  \ExplSyntaxOff
}{%
  \IfFormatAtLeastTF{2020/10/01}{%
    \IfFormatAtLeastTF{2021/11/15}{%
      \RequirePackage{scrlfile-hook}%
    }{%
      \RequirePackage{scrlfile-hook-3.34}%
    }%
  }{%
    \RequirePackage{scrlfile-patcholdlatex}%
    \RequirePackage{xparse}%
%    \end{macrocode}
% Explicitly switch of \pkg{expl3} syntax because of a
% \pkg{latexrelease} bug in version 2020-02-02.
%    \begin{macrocode}
    \ExplSyntaxOff
  }%
}
%    \end{macrocode}
%
% \begin{option}{withdeprecated}
% \changes{v3.32}{2020/09/11}{added}
% Depending on this option we implement addition deprecated commands.
%    \begin{macrocode}
\DeclareOption{withdeprecated}{%
%    \end{macrocode}
%
% \begin{command}[noindex]{\AfterClass+,\AfterClass!}
% \cs{scrlfile@AfterClass} is used in the sub-packages to store the original
% \cs{AfterClass} and can be used to redefine \cs{AfterClass} to handle the
% plus and the exclamation mark variant.
%    \begin{macrocode}
  \RenewDocumentCommand\AfterClass{}{%
%    \end{macrocode}
%^^A Hack for correct line numbers in the index:
%^^A - end environment,
%^^A - do index entries
%^^A - fix vertical spaces
%^^A - restart environment without printing and indexing
% \end{command}
% \SpecialMainCommandIndex{\AfterClass+}
% \SpecialMainCommandIndex{\AfterClass\quotechar!}
% \vskip-\dimexpr 2.2\baselineskip+\parskip\relax
% \begin{command}[noindex,noprint]{\AfterClass+,\AfterClass!}
%    \begin{macrocode}
    \kernel@ifnextchar +%
      {\scrlfile@emulatedeprecated{Class}}%
      {%
        \kernel@ifnextchar !%
          {\scrlfile@emulatedeprecated{Class}}%
          \scrlfile@AfterClass
      }%
  }
%    \end{macrocode}
% \end{command}
%
% \begin{command}[noindex]{\AfterPackage+,\AfterPackage!}
% \cs{scrlfile@AfterPackage} is used in the sub-packages to store the original
% \cs{AfterPackage} and can be used to redefine \cs{AfterPackage} to handle
% the plus and the exclamation mark variant.
%    \begin{macrocode}
  \RenewDocumentCommand\AfterPackage{}{%
%    \end{macrocode}
%^^A Hack for correct line numbers in the index:
%^^A - end environment,
%^^A - do index entries
%^^A - fix vertical spaces
%^^A - restart environment without printing and indexing
% \end{command}
% \SpecialMainCommandIndex{\AfterPackage+}
% \SpecialMainCommandIndex{\AfterPackage\quotechar!}
% \vskip-\dimexpr 2.2\baselineskip+\parskip\relax
% \begin{command}[noindex,noprint]{\AfterPackage+,\AfterPackage!}
%    \begin{macrocode}
    \kernel@ifnextchar +%
      {\scrlfile@emulatedeprecated{Package}}%
      {%
        \kernel@ifnextchar !%
          {\scrlfile@emulatedeprecated{Package}}%
          \scrlfile@AfterPackage
      }%
  }
%    \end{macrocode}
% \end{command}
%
% \begin{macro}{\scrlfile@emulatedeprecated}
% \changes{v3.32}{2020/09/11}{added}
% This emulates \cs{AfterClass+}, \cs{AfterPackage+}, \cs{AfterClass!} and
% \cs{AfterPackage!} using \cs{AfterAtEndOfClass} or
% \cs{AfterAtEndOfPackage}. Note, that both, the plus and the exclamation mark
% variants, are emulated by the star variant of \cs{AfterAtEndOfClass}
% resp. \cs{AfterAtEndOfPackage}. So the emulation is not perfect.
%    \begin{macrocode}
  \newcommand*{\scrlfile@emulatedeprecated}[2]{%
    \PackageWarning{scrlfile}{%
      emulating deprecated \expandafter\string\csname After#1#2\endcsname
      \space by\MessageBreak
      \expandafter\string\csname AfterAtEndOf#1*\endcsname.\MessageBreak
      Note, this may fail, so you should not use\MessageBreak
      \expandafter\string\csname After#1#2\endcsname
    }%
    \csname AfterAtEndOf#1\endcsname*%
  }
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
}
%    \end{macrocode}
% \end{option}
%
% Now, we just have to execute and process the options.
%    \begin{macrocode}
\ExecuteOptions{}
\ProcessOptions\relax
%    \end{macrocode}
%
% \Finale
% \PrintChanges
% 
% \endinput
% Local Variables:
% mode: doctex
% ispell-local-dictionary: "en_US"
% eval: (flyspell-mode 1)
% TeX-master: t
% TeX-engine: luatex-dev
% eval: (setcar (or (cl-member "Index" (setq-local TeX-command-list (copy-alist TeX-command-list)) :key #'car :test #'string-equal) (setq-local TeX-command-list (cons nil TeX-command-list))) '("Index" "mkindex %s" TeX-run-index nil t :help "makeindex for dtx"))
% End:
