% \iffalse
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%<package>\ProvidesPackage{everysel}
%<package>         [2011/10/28 v1.2 EverySelectfont Package (MS)]
%
%<*driver>
\ProvidesFile{everysel.drv}
      [2009/05/30 v1.1 Driver for EverySelectfont Package (MS)]
\documentclass[a4paper]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{url}
\usepackage[toc]{multitoc}
\usepackage{lmodern,microtype,svn}
\usepackage{hypdoc}
\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}{2}
% 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}
   \PrintIndex\PrintChanges
   %  Make sure that the index is not printed twice
   %  (ltxdoc.cfg might have a second \PrintIndex command)
   \let\PrintChanges\relax
\end{document}
%</driver>
%
% Copyright (C) [1996..2011] by Martin Schr\"oder.
%
% This work may be distributed and/or modified under the conditions of the
% LaTeX Project Public License, either version 1.3 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.3 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 Martin Schröder
%
% This work consists of the files everysel.dtx and everysel.ins
% and the derived files everysel.sty
%
% \fi
%
% \CheckSum{156}
%
%% \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         \~}
%
% \SVN $Rev: 1712 $
% \SVNdate $Date: 2011-10-28 23:10:13 +0200 (Fr, 28. Okt 2011) $
%
%  \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 \package{EverySel} package^^A
%   \thanks{^^A
%     The version number of this file is \fileversion, subversion
%     revision~\#\SVNRev, last revised \protect\SVNDate.\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  Unterstra\ss{}e 31\\
%          \normalsize  47051 Duisburg\\
%          \normalsize  Germany\\
%          \normalsize  \href{mailto:martin@oneiros.de}{\texttt{martin@oneiros.de}}}
%  \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}.
%  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 -----------------------------
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
%
% ^^A -----------------------------
%
%  \Finale
% ^^A vim:tw=70:ts=2
