% \iffalse
\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{count1to}
%<package>        [1999/06/08 v1.22 Count1to9 Package (MS)]
%
%<*driver>
\ProvidesFile{count1to.drv}
      [1999/06/08 v1.22 Driver for Count1to9 Package (MS)]
\documentclass{ltxdoc}
\usepackage{booktabs}
\usepackage{url}
\usepackage{count1to}
\usepackage[toc]{multitoc}
\GetFileInfo{count1to.sty}
\setcounter{IndexColumns}{2}
\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}{30ex}
\setlength{\premulticols}{\IndexMin}
\begin{document}
   \DocInput{count1to.dtx}
\end{document}
%</driver>
%
% Copyright (c) [1994..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 count1to.ins
%
% \fi
%
% \CheckSum{121}
%
%% \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.22",
%%     date            = "8 June 1999",
%%     filename        = "count1to.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        = "17059 511 2330 19695",
%      codetable       = "ISO/ASCII",
%      keywords        = "LaTeX, pages",
%      supported       = "yes",
%%     docstring       = "LaTeX package which sets count1 to count9,
%%                        which can be used to select certain pages
%%                        with a driver.
%%                        Also provides access to the number of pages
%%                        of the document.
%%                        Uses the everyshi package.
%
%                         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}{1994/12/07}{New}
%  \changes{v1.01}{1994/12/09}{Documentation improved}
%  \changes{v1.02}{1996/12/29}{Documentation improved}
%  \changes{v1.20}{1998/08/09}{Documentation improved}
%  \changes{v1.22}{1999/06/08}{Moved to LPPL}
%
%  \newcommand*{\Count}[1]{\texttt{\symbol{92}count#1}}
%  \newcommand*{\package}[1]{\textnormal{\sffamily#1}}
%  \newcommand*{\NEWfeature}[1]{%
%     \hskip 1sp \marginpar{\small\sffamily\raggedright
%     New feature\\#1}}
%
%  ^^A We need to document a label -- we do this by using the macros for 
%  ^^A environments and changing the macros for the index entries.
%  \makeatletter
%  \renewcommand*{\SpecialEnvIndex}[1]{^^A
%     \@bsphack\index{\string#1^^A
%     \actualchar\string\verb\quotechar*\verbatimchar
%     \string#1\verbatimchar
%     \encapchar usage}\@esphack}
%  \renewcommand*{\SpecialMainEnvIndex}[1]{^^A
%     \@bsphack\special@index{\string#1\actualchar
%     \string\verb\quotechar*\verbatimchar
%     \string#1\verbatimchar\encapchar main}%
%     \@esphack}
%  \makeatother
%
% ^^A -----------------------------
%
%  \changes{v1.03}{1997-03-09}{Fixed use of \cs{newline} in title.}
%  \title{\unskip
%         The \package{count1to} package^^A
%           \thanks{^^A
%              The version umber of this file is \fileversion,
%              last revised \filedate.\protect\newline
%              The name \textsf{count1to} is a tribute to the $8+3$ 
%              file-naming convention of certain ``operating 
%              systems''; strictly speaking it should be
%              \textsf{count1to9}.}
%           \thanks{^^A
%              This document has \ref{TotalPages} pages.}^^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 package sets \Count{1} to \Count{8} with the values
%     of \texttt{page} to \texttt{subparagraph}.
%     \Count{9} is used to flag odd pages.
%     The values of these counters are displayed and written in the
%     \textsf{.dvi} file by \TeX{} and can later be used to select
%     the pages of certain parts of the document for printing if the
%     device driver supports this.
%
%     It also gives access to the total number of pages of the 
%     document via the label \texttt{TotalPages}.
%  \end{abstract}
%
%  \pagestyle{headings}
%
% ^^A -----------------------------
%
%  \tableofcontents
%
% ^^A -----------------------------
%
%  \section{Introduction}
%  ^^A
%  Most of the time users want to print only certain parts of a 
%  document; but these can only be selected by using the page numbers
%  of these parts with most device drivers.
%  This can be dif\/ficult or impossible if pages in dif\/ferent 
%  parts of the document have the same number---e.\,g. in the 
%  frontmatter and the first text pages (iii vs. 3).
%
%  \TeX{} provides an easy solution to this problem: whenever a page
%  is completed by the output routine and shipped out via 
%  \cs{shipout}, it displayes the values of \Count{0} to \Count{9}
%  on the display (e.\,g. \texttt{[1]}) \emph{and writes them to the
%  \textsf{.dvi} file}.
%
%  \changes{v1.02}{1996/12/29}{fixed typos}
%  \begin{quote}
%     ``The first ten \Count{} registers, \Count{0} to \Count{9},
%     are reserved for a special purpose: \TeX{} displays these ten
%     counts on your terminal whenever ouputting a page, and it 
%     transmits them to the output file as an identification of that
%     page.
%     The counts are separated by decimal points on your terminal, 
%     with trailing `\texttt{.0}' patterns suppressed.
%     Thus, for example, if \Count{0=5} and \Count{2=7} when a
%     page is shipped out to the \texttt{dvi} file, and if the other
%     counters are zero, \TeX{} will type `\texttt{[5.0.7]}'.
%     Plain \TeX{} uses \Count{0} for the page number, and it keeps
%     \Count{1} through~\Count{9} equal to zero; that is why you
%     see `\texttt{[1]}' when page~1 is being output.
%     In more complex applications the page numbers can have further
%     structure; ten counts are shipped out so that there will be
%     plenty of identification.''\cite[p\@. 119]{KnuthTeXa}
%  \end{quote}
%
%  \noindent
%  Surprinsingly, until recently there existed no package for 
%  \LaTeX{} that used these \Count{}ers although some drivers allow 
%  the selection of pages based on other \Count{}s then \Count{0} 
%  (e.\,g. em\TeX).
%
%  This package is the solution: It uses the \package{everyshi}
%  package\cite{package:everyshi} to set \Count{1} to \Count{9} before 
%  each \cs{shipout} with these values:
%
%  \begin{center}
%  \begin{tabular}{cl}\toprule
%  \Count{} & value  \\ \midrule
%  0        & relative page number (set by \LaTeX)\\
%  1        & absolute page number\\
%  2        & number of current \cs{part} \\
%  3        & number of current \cs{chapter} (0 with article class)\\
%  4        & number of current \cs{section} \\
%  5        & number of current \cs{subsection} \\
%  6        & number of current \cs{subsubsection} \\
%  7        & number of current \cs{paragraph} \\
%  8        & number of current \cs{subparagraph} \\
%  9        & 1 on odd pages, 0 on even pages\footnotemark\\ 
%  \bottomrule
%  \end{tabular}
%  \end{center}
%  \footnotetext{^^A
%     If you have a better application for \Count{9}, let me know.}
%
%  \noindent
%  \textsf{count1to} also works with classes that do not define some
%  or all of the sectioning commands and their counters, like 
%  \textsf{letter}.
%  Although it is of somewhat little use then \texttt{:-)}.
%
%  A note for users of this package: When you select the pages of
%  some part of your document with a lower structure than 
%  \cs{chapter}, remember that only \cs{part}s and \cs{chapter}s
%  start on a new page; if you want to print a complete
%  \cs{section}, you should also select the first page of the next
%  \cs{section}.
%  Also note that \TeX{} ships out the values of the counters instead
%  of their visual representation (produced with 
%  \cs{the}\emph{counter}), so appendix A sets \Count{4} to 1 in the
%  article class.
%
%  A note for developers of device drivers: Please add support for
%  \Count{1} to~\texttt{9} to your programs.
%  It would also be nice if users could easily select the next 
%  page(s) after a certain count (something like 
%  ``\texttt{*.*.*.*.2+1.*}'' should be possible for selecting all
%  pages with $\Count{4}\mapsto\mathrm{section}=2$ plus the first
%  page of section~3).
%
%  \DescribeEnv{TotalPages}
%  \NEWfeature{1997/11/01}
%  The setting of \Count{1} with the absolute page number makes it
%  possible to provide the \emph{total} number of pages of the 
%  document (as opposed to the ``number'' on the last page provided
%  by the \textsf{lastpage} package\cite{package:lastpage}).
%  By referencing the label |TotalPages| (e.\,g. by |\ref{TotalPages}|)
%  you get the total number of pages the document had at the last run 
%  of \LaTeX.
%  If you want to use this feature, you should load \textsf{count1to}
%  as the \emph{last} package in your document because \textsf{count1to} 
%  executes some code at |\end{document}| and has to be sure that its 
%  code is the \emph{last} code executed there.
%
%
% ^^A -----------------------------
%
%  \section{Options}
%  ^^A
%  The package has no options.
%
%
% ^^A -----------------------------
%
%  \section{Required packages}
%  ^^A
%  The package requires the \package{everyshi} 
%  package\cite{package:everyshi}.
%
%
% ^^A -----------------------------
%
%  \StopEventually{^^A
%
% ^^A -----------------------------
%
%  \section{Acknowledgements}
%  ^^A
%  As usual Rebecca Stiels improved the quality of this documentation.
%  Rolf Niepraschk (\texttt{niepraschk@ptb.de}) provided the idea and 
%  the first implementation of the \texttt{TotalPages} label.
%
%
% ^^A -----------------------------
%
%  \begin{thebibliography}{1}
%     \raggedright
%     \bibitem{package:lastpage}
%        Jeff Goldberg.
%        \newblock The \package{lastpage}-package.
%        \newblock \url{CTAN: tex-archive/macros/latex/contrib/other/lastpage}.
%        \newblock \LaTeXe{} package.
%     \bibitem{KnuthTeXa}
%        Donald~E.\ Knuth.
%        \newblock \emph{The {\TeX}Book}, volume~A of \emph{Computers
%           and Typesetting}.
%        \newblock Addison-Wes\-ley, 1986.
%        \newblock Eleventh printing, revised, May 1991.
%     \bibitem{package:everyshi}
%        Martin Schr\"oder.
%        \newblock The \package{everyshi} package.
%        \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/ms/everyshi.dtx}.
%        \newblock \LaTeXe{} package.
%  \end{thebibliography}
%
%     }
%
%
% ^^A -----------------------------
%
%  \section{The implementation}
%  ^^A
%  \setlength{\parindent}{0pt}
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%  We need the \package{everyshi} package.
%  \changes{v1.20}{1998/04/10}{don't require \textsf{ifthen}}
%  \changes{v1.10}{1997/11/01}{require \textsf{ifthen}}
%    \begin{macrocode}
\RequirePackage{everyshi}[1994/12/09]
%    \end{macrocode}
%
%  We need various \cs{if}s to check if the used counters
%  are defined.
%  \changes{v1.20}{1998/04/10}{\cs{newif} again}
%  \changes{v1.10}{1997/11/01}{\cs{newboolean}}
%    \begin{macrocode}
\newif\if@have@part
\newif\if@have@chapter
\newif\if@have@section
\newif\if@have@subsection
\newif\if@have@subsubsection
\newif\if@have@paragraph
\newif\if@have@subparagraph
%    \end{macrocode}
%
%  \begin{macro}{\@countItoIX@ifs}
%  \cs{@countItoIX@ifs} is used to set all these \cs{if}s at
%  |\begin{document}|.
%  It is undefined after use to save some space.
%  \changes{v1.20}{1998/04/10}{don't use \textsf{ifthen}}
%  \changes{v1.10}{1997/11/01}{\cs{setboolean}}
%  \changes{v1.02}{1996/12/29}{destruct after usage}
%    \begin{macrocode}
\newcommand*{\@countItoIX@ifs}{
   \@ifundefined{c@part}           {}{\@have@parttrue}
   \@ifundefined{c@chapter}        {}{\@have@chaptertrue}
   \@ifundefined{c@section}        {}{\@have@sectiontrue}
   \@ifundefined{c@subsection}     {}{\@have@subsectiontrue}
   \@ifundefined{c@subsubsection}  {}{\@have@subsubsectiontrue}
   \@ifundefined{c@paragraph}      {}{\@have@paragraphtrue}
   \@ifundefined{c@subparagraph}   {}{\@have@subparagraphtrue}
   }
\AtBeginDocument{\@countItoIX@ifs\let\@countItoIX@ifs\undefined}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\@countItoIX@bugfix}
%  The current version of \LaTeX{} has the ``feature'' that only the
%  first level of counters associated with a counter via the optional
%  argument of \cs{newcounter} is reset when the counter is stepped;
%  so when you start a new chapter, the number for the subsection is
%  not reset.
%  This is normally no problem, but with this package, it is: If this
%  bug is not fixed or worked-around, then whenever you use
%  \cs{subparagraph} or some other lower sectioning command, and 
%  after that a sectioning command that is at least two levels higher 
%  (e.\,g. \cs{subsubsection}), the value of \texttt{subparagraph} 
%  would not be reset and would still be displayed and shipped out.
%  So we have to associate \emph{all} lower-level sectioning commands
%  with the higher levels.
%  This is done via \cs{@addtoreset} at \cs{begin\{document\}}.
%  \cs{@countItoIX@bugfix} is undefined after use to save some space.
%  \changes{v1.20}{1998/04/10}{don't use \textsf{ifthen}}
%  \changes{v1.10}{1997/11/01}{\cs{ifthenelse}}
%  \changes{v1.02}{1996/12/29}{destruct after usage}
%    \begin{macrocode}
\newcommand*{\@countItoIX@bugfix}{
   \if@have@part
      \@addtoreset{section}      {part}
      \@addtoreset{subsection}   {part}
      \@addtoreset{subsubsection}{part}
      \@addtoreset{paragraph}    {part}
      \@addtoreset{subparagraph} {part}
   \fi
   \if@have@chapter
      \@addtoreset{subsection}   {chapter}
      \@addtoreset{subsubsection}{chapter}
      \@addtoreset{paragraph}    {chapter}
      \@addtoreset{subparagraph} {chapter}
   \fi
   \if@have@section
      \@addtoreset{subsubsection}{section}
      \@addtoreset{paragraph}    {section}
      \@addtoreset{subparagraph} {section}
   \fi
   \if@have@subsection
      \@addtoreset{paragraph}    {subsection}
      \@addtoreset{subparagraph} {subsection}
   \fi
   \if@have@subsubsection
      \@addtoreset{subparagraph} {subsubsection}
   \fi
   }
\AtBeginDocument{\@countItoIX@bugfix\let\@countItoIX@bugfix\undefined}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{macro}{\@countItoIX@shipout}
%  \cs{@countItoIX@shipout} is used for setting \Count{1} to 
%  \Count{9} at each \cs{shipout}.
%    \begin{macrocode}
\newcommand*{\@countItoIX@shipout}{
%    \end{macrocode}
%  \Count{1} is the absolute page number, which we have to maintain
%  by ourselves.
%    \begin{macrocode}
   \global\advance \count1 by 1
%    \end{macrocode}
%  \Count{2} to \Count{8} are set with the values of
%  \cs{part} to \cs{subparagraph}, if these commands are defined.^^A
%     \footnote{We should probably also check the value of 
%        \texttt{secnumdepth}, but I don't think this is necessary.}
%  \changes{v1.20}{1998/04/10}{don't use \textsf{ifthen}}
%  \changes{v1.10}{1997/11/01}{\cs{ifthenelse}}
%    \begin{macrocode}
   \if@have@part              \count2\value{part}           \fi
   \if@have@chapter           \count3\value{chapter}        \fi
   \if@have@section           \count4\value{section}        \fi
   \if@have@subsection        \count5\value{subsection}     \fi
   \if@have@subsubsection     \count6\value{subsubsection}  \fi
   \if@have@paragraph         \count7\value{paragraph}      \fi
   \if@have@subparagraph      \count8\value{subparagraph}   \fi
%    \end{macrocode}
%  \Count{9} is set to~1 on odd pages and to~0 on even pages.
%    \begin{macrocode}
   \ifodd\count1\count9=1     \else\count9=0                \fi
   }
\EveryShipout{\@countItoIX@shipout}
%    \end{macrocode}
%  \end{macro}
%
%  \begin{environment}{TotalPages}
%  The label \texttt{TotalPages} is set on the \emph{absolut} last page
%  of the document and holds the \emph{total} number of pages of the 
%  document, i.\,e. the value of \Count{1}.
%  But before we write the value to the auxfile we call a \cs{clearpage}
%  to force all pending floats to be output.
%  To do this we have to be sure to be the \emph{last} macro called by
%  \cs{AtEndDocument}---but this is nearly impossible to assure (see
%  the troubles the \package{lastpage} package\cite{package:lastpage} goes 
%  through to achieve this), so we try to do our very best and set our 
%  entry for \cs{AtEndDocument} at |\begin{document}| by using 
%  \cs{AtBeginDocument}.
%  \changes{v1.10}{1997/11/01}{new}
%  \changes{v1.21}{1998/10/24}{write to \cs{@mainaux} instead of \cs{@auxout}}
%    \begin{macrocode}
\AtBeginDocument{%
   \AtEndDocument{%
      \clearpage
      \immediate\write\@mainaux{\string\newlabel{TotalPages}{{\the\count1}{\the\count1}}}
      }%
   }
%    \end{macrocode}
%  \end{environment}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% ^^A -----------------------------
%
%  \Finale
%
%   \PrintIndex\PrintChanges
%   ^^A Make sure that the index is not printed twice
%   ^^A (ltxdoc.cfg might have a second \PrintIndex command)
%   \let\PrintChanges\relax
%   \let\PrintIndex\relax
