% \iffalse
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%<package>\ProvidesPackage{everysel}
%<package>         [1999/06/08 v1.03 EverySelectfont Package (MS)]
%
%<*driver>
\ProvidesFile{everysel.drv}
      [1999/06/08 v1.03 Driver for EverySelectfont Package (MS)]
\documentclass{ltxdoc}
\usepackage{url}
\usepackage[toc]{multitoc}
\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}{2}
\setlength{\IndexMin}{40ex}
\setlength{\columnseprule}{.4pt}
\addtolength{\oddsidemargin}{1cm}
\addtolength{\textwidth}{-1cm}
\raggedright   % otherwise we get over/underfull hboxes
\begin{document}
   \DocInput{everysel.dtx}
\end{document}
%</driver>
%
% Copyright (C) [1996..1999] by Martin Schr\"oder.  All rights reserved.
%
% This program may be redistributed and/or modified under the terms
% of the LaTeX Project Public License, either version 1.0 of this
% license, or (at your option) any later version.
% The latest version of this license is in
%   CTAN:macros/latex/base/lppl.txt.
%
% Happy users are requested to send me a postcard. :-)
%
% For error reports in case of UNCHANGED versions see everysel.ins
%
% \fi
%
% \CheckSum{105}
%
%% \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         \~}
%%
% \iffalse meta-comment
%% ====================================================================
%%  @LaTeX-style-file{
%%     author          = {Martin Schr\"oder},
%%     version         = "1.03",
%%     date            = "8 June 1999",
%%     filename        = "everysel.sty",
%%     address         = {Martin Schr\"oder
%%                        Cr\"usemannallee 3
%%                        D-28213 Bremen},
%%     telephone       = "+49-421-2239425",
%%     email           = "Martin.Schroeder@ACM.org",
%%     pgp-Key         = "2048 bit / KeyID 292814E5",
%%     pgp-fingerprint = "7E86 6EC8 97FA 2995 82C3  FEA5 2719 090E",
%      checksum        = "06457 414 1509 13717",
%      codetable       = "ISO/ASCII",
%      keywords        = "LaTeX, NFSS",
%      supported       = "yes",
%%     docstring       = "LaTeX package which provides hooks into
%%                        \cs{selectfont}.
%
%                         The checksum field above contains a CRC-16
%                         checksum as the first value, followed by
%                         the equivalent of the standard UNIX wc
%                         (word count) utility output of lines,
%                         words, and characters.  This is produced
%                         by Robert Solovay's checksum utility."
%%  }
%% ====================================================================
%\fi
%
%  \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}
%
%
% ^^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 \package{EverySel} package^^A
%           \thanks{^^A
%              The version number of this file is \fileversion,
%              last revised \filedate.\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\"oder\\[0.5ex]
%          \normalsize  Cr\"usemannallee 3\\
%          \normalsize  D-28213 Bremen\\
%          \normalsize  Martin.Schroeder@ACM.org\\
%          \scriptsize \texttt{PGP-Key: 2048 bit / KeyID 292814E5}\\[-0.5em]
%          \scriptsize \texttt{7E86 6EC8 97FA 2995~~82C3 FEA5 2719 090E}}
%  \date{\filedate}
%  \maketitle
%
%
% ^^A -----------------------------
%
%
%  \begin{abstract}
%     This packages provides hooks into the NFSS-command 
%     \cs{selectfont} called \cs{EverySelectfont} and
%     \cs{AtNextSelectfont} analogous to \cs{AtBeginDocument}.
%  \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}.
%
%
% ^^A -----------------------------
%
%  \begin{thebibliography}{1}
%     \raggedright
%     \bibitem{package:tracefnt}
%        Frank Mittelbach and Rainer Sch\"opf.
%        \newblock The \package{tracefnt} package for use with the new 
%              font selection scheme.
%        \newblock \url{CTAN: tex-archive/macros/latex/base/ltfsstrc.dtx}.
%        \newblock \LaTeXe{} package.
%     \bibitem{package:ragged2e}
%        Martin Schr\"oder.
%        \newblock The \package{ragged2e} package.
%        \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/ms/ragged2e.dtx}.
%        \newblock \LaTeXe{} package.
%  \end{thebibliography}
%
%  }
%
%
% ^^A -----------------------------
%
%  \section{The implementation}
%  ^^A
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%
% ^^A -----------------------------
%
%  \subsection{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 -----------------------------
%
%  \subsection{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 -----------------------------
%
%  \subsection{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}.
%  So we have to check for two 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}{%
%    \end{macrocode}
%  We have to distinguish two cases: \package{tracefnt} and 
%  no \package{tracefnt}.
%    \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}
%  Now the case without \package{tracefnt}.
%    \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}
%  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 -----------------------------
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
%
% ^^A -----------------------------
%
%  \Finale
%
% ^^A Print the indices but make sure that they are not printed twice
% ^^A (ltxdoc.cfg might have a second \PrintIndex command)
%  \PrintIndex\PrintChanges\let\PrintChanges\relax\let\PrintIndex\relax
%
