% \iffalse meta-comment
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Copyright (C) Martin Schröder, 1994–2001
% 				Marei Peischl (peiTeX)  <marei@peitex.de>, 2021
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% 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.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is
%   Marei Peischl <marei@peitex.de>.
%
% This work consists of the files
%    README.md
%    everysel.dtx
%    everysel.ins
% and the derived files
%    everysel.sty
%    everysel-2011/10/28.sty
%    everysel.pdf
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \fi
% \iffalse
%<package|fallback>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%<package>\ProvidesPackage{everysel}
%<package>         [2021/01/20 v2.1 EverySelectfont Package (MS)]
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{url}
\usepackage[toc]{multitoc}
\usepackage{lmodern,microtype}
\usepackage{geometry}
\usepackage{everysel}
\GetFileInfo{everysel.sty}
\RecordChanges    % Gather update information
\EnableCrossrefs
%%\DisableCrossrefs% Say \DisableCrossrefs if index is ready
\CodelineIndex    % Index code by line number
%\OnlyDescription  % comment out for implementation details
%%\OldMakeIndex    % use if your MakeIndex is pre-v2.9
\setcounter{IndexColumns}{1}
% onecolumn glossary
%% \makeatletter
%%   \renewenvironment{theglossary}{%
%%   \glossary@prologue
%%   \setlength\emergencystretch{5em}
%%   \GlossaryParms \let\item\@idxitem \ignorespaces}{}
%% \makeatother
\setlength{\IndexMin}{40ex}
\setlength{\columnseprule}{.4pt}
\addtolength{\oddsidemargin}{2cm}
\addtolength{\textwidth}{-2cm}
\raggedright   % otherwise we get over/underfull hboxes
\begin{document}
   \DocInput{everysel.dtx}
   \PrintChanges
   %  Make sure that the index is not printed twice
   %  (ltxdoc.cfg might have a second \PrintIndex command)
   \let\PrintChanges\relax
\end{document}
%</driver>
% \fi
% \CheckSum{189}
%% \CharacterTable
%% {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%  Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%  Digits        \0\1\2\3\4\5\6\7\8\9
%%  Exclamation   \!     Double quote  \"     Hash (number) \#
%%  Dollar        \$     Percent       \%     Ampersand     \&
%%  Acute accent  \'     Left paren    \(     Right paren   \)
%%  Asterisk      \*     Plus          \+     Comma         \,
%%  Minus         \-     Point         \.     Solidus       \/
%%  Colon         \:     Semicolon     \;     Less than     \<
%%  Equals        \=     Greater than  \>     Question mark \?
%%  Commercial at \@     Left bracket  \[     Backslash     \\
%%  Right bracket \]     Circumflex    \^     Underscore    \_
%%  Grave accent  \`     Left brace    \{     Vertical bar  \|
%%  Right brace   \}     Tilde         \~}
%
%  \changes{v1.00}{1996-05-24}{New}
%  \changes{v1.02}{1998-04-11}{Minor documentation enhancements}
%  \changes{v1.02}{1998-08-09}{Minor documentation enhancements}
%  \changes{v1.03}{1999/06/08}{Moved to LPPL}
%  \changes{v1.1}{2009/05/30}{New address, LPPL 1.3}
%
%
% ^^A -----------------------------
%
%  \pagestyle{headings}
%
%  \newcommand*{\file}[1]{\texttt{#1}}
%  \newcommand*{\package}[1]{\textsf{#1}}
%  \hyphenation{every-select-font}
%
%
% ^^A -----------------------------
%
%  \changes{v1.01}{1997-03-09}{Fixed use of \cs{newline} in title.}
%  \title{\unskip
%   The obsolete \package{EverySel} package^^A
%   \thanks{^^A
%     The version umber of this file is \fileversion.\protect\newline
%     The name \textsf{EverySel} is a tribute to the $8+3$ file-naming
%     convention of certain ``operating systems'' and their ``file systems'';
%     strictly speaking it should be \textsf{EverySelectfont}.}^^A
%        }
%  \author{Martin Schröder\thanks{maintained by Marei Peischl}}
%  \maketitle
%
%
% ^^A -----------------------------
% \changes{v2.0}{2021/01/17}{Information on new kernel methods}
%  \renewcommand*{\abstractname}{Why you should no longer use this package:}
%  \begin{abstract}
%     This packages provides hooks into the NFSS-command 
%     \cs{selectfont} called \cs{EverySelectfont} and
%     \cs{AtNextSelectfont} analogous to \cs{AtBeginDocument}.
%     In January 2021 the hook management \LaTeX{} provides since autumn 2020 the kernel directly contains these hooks. Information on their usage can be found in the the corresponding documentation for
%     \package{lthooks}\cite{lthooks-doc} and look for Hooks provided in NFSS command.
%     We only provide this package to allow backwards compatibility.
%     For current versions of \LaTeX{} it's only mapping the hooks to the original \package{everysel} macros.
%     In case you use an older \LaTeX{} format, \package{everysel} will automatically fallback to its' old implementation by loading \package{everysel-2011/10/28.sty}.
%  \end{abstract}
%
%  \pagestyle{headings}
%
%
% ^^A -----------------------------
%
%  \tableofcontents
%
%
% ^^A -----------------------------
%
%  \section{Introduction}
%  ^^A
%  This package provides the hooks \cs{EverySelectfont} and
%  \cs{AtNextSelectfont} whose arguments are executed just after 
%  \LaTeX{} has loaded a new font using \cs{selectfont} (which means
%  that it will be executed after \emph{every} font loaded via NFSS).
%
%  An example application would be a package for setting ragged text 
%  which needs to distiguinsh between monospaced and proportional 
%  fonts.
%  Such a package exists: \package{ragged2e}\cite{package:ragged2e}.
%
%
% ^^A -----------------------------
%
%  \section{Usage}
%  ^^A
%  \DescribeMacro{\EverySelectfont}
%  \cs{EverySelectfont}\marg{code} declares
%  \mbox{$\langle$\emph{code}$\rangle$} that is saved internally
%  and executed just after \emph{each} \cs{selectfont}.
%
%  \emph{Warning:} The \mbox{$\langle$\emph{code}$\rangle$} is saved 
%  globally; there is currently no way to remove it.
%
%  \DescribeMacro{\AtNextSelectfont}
%  \cs{AtNextSelectfont}\marg{code} declares
%  \mbox{$\langle$\emph{code}$\rangle$} that is saved internally
%  and executed just after \emph{and only the next} \cs{selectfont}.
%
%  Repeated use of the commands is permitted: the code in their
%  argument is stored (and executed) in the order of their
%  declarations.
%
%  The argument of \cs{AtNextSelectfont} is executed \emph{after}
%  the argument of \cs{EverySelectfont}.
%
%
% ^^A -----------------------------
%
%  \section{Options}
%  ^^A
%  The package has no options.
%
%
% ^^A -----------------------------
%
%  \section{Required packages}
%  ^^A
%  The package requires no further packages.
%
%
% ^^A -----------------------------
%
%  \StopEventually{^^A
%
%
% ^^A -----------------------------
%
%  \section{Acknowledgements}
%  ^^A
%  David Carlisle provided the solution for my problems with \cs{CheckCommand}.
%
%  Thanks to the \LaTeX-Project-Team for creating solutions which made this an obsolete package. Special thanks to Ulrike Fischer to keep the maintainer up to date.
%
%
% ^^A -----------------------------
%
%  \begin{thebibliography}{1}
%     \raggedright
%     \bibitem{lthooks-doc}
%        Frank Mittelbach.
%        \newblock The \package{ltshipout} package.
%        \newblock \url{http://mirrors.ctan.org/macros/latex/base/lthooks-doc.pdf}
%     \bibitem{package:tracefnt}
%        Frank Mittelbach and Rainer Sch\"opf.
%        \newblock The \package{tracefnt} package for use with the new 
%              font selection scheme.
%        \newblock \url{http://mirrors.ctan.org/macros/latex/base/ltfsstrc.dtx}.
%        \newblock \LaTeXe{} package.
%     \bibitem{package:ragged2e}
%        Martin Schr\"oder.
%        \newblock The \package{ragged2e} package.
%        \newblock \url{http://mirrors.ctan.org/macros/latex/contrib/supported/ms/ragged2e.dtx}.
%        \newblock \LaTeXe{} package.
%  \end{thebibliography}
%
%  }
%
%
% ^^A -----------------------------
%
%  \section{The Implementation}
%  ^^A
%  \changes{v2.0}{2021/01/17}{Emulate everysel if the kernel is new enough.}
% \iffalse
%<*package>
% \fi
%    \begin{macrocode}
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
\IfFormatAtLeastTF{2021/01/05}{}{\input{everysel-2011-10-28.sty}}
\IfFormatAtLeastTF{2021/01/05}{}{\endinput}
\newcommand*{\EverySelectfont}[1]{\AddToHook{selectfont}{#1}}
\newcommand*{\AtNextSelectfont}[1]{\AddToHookNext{selectfont}{#1}}
%    \end{macrocode}
%     \changes{v2.1}{2021-01-20}{Add \textbackslash{}@EverySelectfont@Legacy + conditional warning}
%     Some packages are using the intial hook of everysel internally (see also  \url{https://github.com/latex3/latex2e/issues/474}).
%     So Version 2.1 provides these macros to ensure compatibility.
%     In case someone is changing the inital hook everysel will now show a warning to inform package authors to switch to lthooks instead.
%     A future release is planned to always trigger this warning.
%     \begin{macrocode}
\newcommand*\@EverySelectfont@Legacy{\let\@EverySelectfont@Init\undefined}
\newcommand*{\@EverySelectfont@Init}{\@EverySelectfont@Legacy}
\AddToHook{begindocument}{%
	\expandafter\ifx\@EverySelectfont@Init\@EverySelectfont@Legacy\else
	\PackageWarningNoLine{everysel}{%
		Everysel is no longer required.,\MessageBreak
		The LaTeX kernel is now providing the same functionality itself.,\MessageBreak
		See the package documentation or lthooks-doc for further information.
	}%
	\fi
	\@EverySelectfont@Init
}
%    \end{macrocode}
% \iffalse
%</package>
% \fi 
% ^^A -----------------------------
%  \subsection{The original implementation by Martin Schröder}
%  To provide compatibility for older \LaTeX{} formats we wrap the
%  original implementation of \package{everysel} version 1.2 into
%  the fallback package \package{everyshi-2011-01-10}.
% \iffalse
%<*fallback>
% \fi
%  \subsubsection{Allocations}
%  ^^A
%  First we allocate the hooks
%  \begin{macro}{\@EverySelectfont@EveryHook}
%  The code to be executed just after the normal \cs{selectfont}.
%    \begin{macrocode}
\newcommand{\@EverySelectfont@EveryHook}{}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\@EverySelectfont@AtNextHook}
%  The code to be executed just after the normal \cs{selectfont}
%  and \cs{@EverySelectfont@EveryHook}.
%    \begin{macrocode}
\newcommand{\@EverySelectfont@AtNextHook}{}
%    \end{macrocode}
%  \end{macro}
%
%
% ^^A -----------------------------
%
%  \subsubsection{The user-visible commands}
%  ^^A
%  \begin{macro}{\EverySelectfont}
%  \begin{macro}{\AtNextSelectfont}
%  These commands are modeled after \cs{AtBeginDocument}.
%    \begin{macrocode}
\newcommand*{\EverySelectfont}[1]
   {\g@addto@macro\@EverySelectfont@EveryHook{#1}}
\newcommand*{\AtNextSelectfont}[1]
   {\g@addto@macro\@EverySelectfont@AtNextHook{#1}}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
%
% ^^A -----------------------------
%
%  \subsubsection{Inserting the hooks}
%  ^^A
%  The hooks are placed \emph{inside} \cs{selectfont}.
%  Unfortunately for us there are \emph{two} versions of 
%  \cs{selectfont} in normal \LaTeX: One is defined in the kernel and
%  the other by the package \package{tracefnt}\cite{package:tracefnt}.
%  The \package{CJK} also redefines \cs{selectfont}.
%
%  So we have to check for three versions.
%  \begin{macro}{\@EverySelectfont@Init}
%  We do this in the macro \cs{@EverySelectfont@Init}, which is 
%  executed just after \cs{begin\{document\}} (with the aid of 
%  \cs{AtBeginDocument}), when we know for sure which version of
%  \cs{selectfont} we have to overload.
%    \begin{macrocode}
\newcommand*{\@EverySelectfont@Init}{%
  \message{ABD: EverySelectfont initializing macros}%
%    \end{macrocode}
%  We have to distinguish three cases: \package{tracefnt},
%  \package{CJK} and everything else.
%    \begin{macrocode}
   \@ifpackageloaded{tracefnt}{%
%    \end{macrocode}
%  And we have a problem: \cs{selectfont} is defined using 
%  \cs{DeclareRobustCommand}, which really defines 
%  \cs{selectfont\textvisiblespace}.
%  So instead of simply using \cs{CheckCommand} we also have to use 
%  \cs{expandafter} and \cs{csname}\ldots\cs{endcsname}.
%    \begin{macrocode}
      \expandafter\CheckCommand\csname selectfont \endcsname{%
         \ifx\f@linespread\baselinestretch \else
            \set@fontsize\baselinestretch\f@size\f@baselineskip \fi
         \xdef\font@name{%
            \csname\curr@fontshape/\f@size\endcsname}%
         \pickup@font
         \font@name
         \ifnum \tracingfonts>\tw@
            \@font@info{Switching to \font@name}\fi
         \size@update
         \enc@update
         }%
      }{%
%    \end{macrocode}
% The case with \package{CJK}
%  \changes{v1.2}{2011-10-27}{Check for \package{CJK}.}
%    \begin{macrocode}
    \@ifpackageloaded{CJK}{%
      \expandafter\CheckCommand\csname selectfont \endcsname{%
        \ifx\f@linespread\baselinestretch \else
          \set@fontsize\baselinestretch\f@size\f@baselineskip \fi
        \xdef\font@name{%
          \csname\curr@fontshape/\f@size\endcsname}%
        \pickup@font
        \font@name
        \expandafter\ifx\csname CJK@\curr@fontshape\endcsname \relax
        \else
          \CJK@bold@false
          \csname CJK@\curr@fontshape\endcsname
        \fi
        \size@update
        \enc@update}%
    }{%
%    \end{macrocode}
% Now the default (no \package{tracefnt} and no \package{CJK}).
%    \begin{macrocode}
      \expandafter\CheckCommand\csname selectfont \endcsname{%
         \ifx\f@linespread\baselinestretch \else
            \set@fontsize\baselinestretch\f@size\f@baselineskip \fi
         \xdef\font@name{%
            \csname\curr@fontshape/\f@size\endcsname}%
         \pickup@font
         \font@name
         \size@update
         \enc@update
         }%
      }%
  }%
%    \end{macrocode}
%  After the checks we can be sure we have the correct version of
%  \cs{selectfont}, so we redefine it with our hooks.
%    \begin{macrocode}
   \DeclareRobustCommand{\selectfont}%
      {%
      \ifx\f@linespread\baselinestretch \else
         \set@fontsize\baselinestretch\f@size\f@baselineskip \fi
      \xdef\font@name{%
         \csname\curr@fontshape/\f@size\endcsname}%
      \pickup@font
      \font@name
      \@EverySelectfont@EveryHook
      \@EverySelectfont@AtNextHook
%    \end{macrocode}
%  We have to reset \cs{@EverySelectfont@AtNextHook} after each use.
%    \begin{macrocode}
      \gdef\@EverySelectfont@AtNextHook{}%
      \size@update
      \enc@update
      }%
%    \end{macrocode}
%  The additions of \package{tracefnt} to \cs{selectfont} can be 
%  implemented using \cs{EverySelectfont}.
%    \begin{macrocode}
   \@ifpackageloaded{tracefnt}{%
      \EverySelectfont{%
         \ifnum \tracingfonts>\tw@
            \@font@info{Switching to \font@name}\fi}%
      }{}%
%    \end{macrocode}
%  The additions of \package{CJK} to \cs{selectfont} can be 
%  implemented using \cs{EverySelectfont}.
%  \changes{v1.2}{2011-10-27}{Check for \package{CJK}.}
%    \begin{macrocode}
   \@ifpackageloaded{CJK}{%
      \EverySelectfont{%
        \expandafter\ifx\csname CJK@\curr@fontshape\endcsname \relax
        \else
          \CJK@bold@false
          \csname CJK@\curr@fontshape\endcsname
        \fi}%
      }{}%
%    \end{macrocode}
%  Since \cs{@EverySelectfont@Init} should only be used once it is
%  self-destructing.
%    \begin{macrocode}
   \let\@EverySelectfont@Init\undefined
   }
%    \end{macrocode}
%  Finally we insert \cs{EverySelectfont@Init} into \cs{begin\{document\}}.
%    \begin{macrocode}
\AtBeginDocument{\@EverySelectfont@Init}
%    \end{macrocode}
%  \end{macro}
%
%
% ^^A -----------------------------
% \iffalse
%</fallback>
% \fi
%
%
% ^^A -----------------------------
%
%  \Finale
% ^^A
