summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/totpages/totpages.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:58:33 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:58:33 +0000
commita768a97c984d7b192caa283f6e7d5711a2bf68e4 (patch)
tree051e4627c9f842a0701faedd7fb7e18cd77c644c /Master/texmf-dist/source/latex/totpages/totpages.dtx
parent8eb89f2adefbbdc3005c34350665a94992d4b300 (diff)
trunk/Master/texmf-dist/source/latex/totpages
git-svn-id: svn://tug.org/texlive/trunk@560 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/totpages/totpages.dtx')
-rw-r--r--Master/texmf-dist/source/latex/totpages/totpages.dtx772
1 files changed, 772 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/totpages/totpages.dtx b/Master/texmf-dist/source/latex/totpages/totpages.dtx
new file mode 100644
index 00000000000..ebbb0078cd7
--- /dev/null
+++ b/Master/texmf-dist/source/latex/totpages/totpages.dtx
@@ -0,0 +1,772 @@
+% \iffalse ^^A -*- mode: latex; -*-
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+%<*driver>
+\ProvidesFile{totpages.drv}
+ [2005/09/19 v2.00 Driver for Totpages Package (muewi)]
+\documentclass{ltxdoc}
+\usepackage{url}
+\usepackage{totpages}
+\usepackage[toc]{multitoc}
+\GetFileInfo{totpages.sty}
+\EnableCrossrefs
+\CodelineIndex % Index code by line number
+\RecordChanges % Changelog to .gls
+%\OnlyDescription % comment out for implementation details
+\setcounter{IndexColumns}{2}
+%\OldMakeIndex % use if your MakeIndex is pre-v2.9
+\begin{document}
+ \setcounter{page}{1234}
+ \DocInput{totpages.dtx}
+\end{document}
+%</driver>
+%
+% Copyright (c) [1999-2005] by Wilhelm M\"uller. All rights reserved.
+%
+% This program may be redistributed and/or modified under the terms
+% of the LaTeX Project Public License, either version 1.1 of this
+% license, or (at your option) any later version.
+% The latest version of this license is in
+% CTAN:macros/latex/base/lppl.txt.
+%
+% For error reports in case of UNCHANGED versions see totpages.ins
+%
+% \fi
+%
+% \CheckSum{286}
+%
+%% \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 = {Wilhelm M\"uller},
+%% version = "2.00",
+%% date = "19 September 2005",
+%% filename = "totpages.sty",
+%% address = {Wilhelm M\"uller
+%% Herbststra\ss{}e 66
+%% D-28215 Bremen
+%% telephone = "+49-421-1692525",
+%% email = "muewi@acm.org",
+%% codetable = "ISO/ASCII",
+%% keywords = "LaTeX, pages",
+%% supported = "yes",
+%% docstring = "LaTeX package which sets count1 to the total
+%% number of pages in the document.
+%% Uses the everyshi and keyval packages."
+%%
+%% }
+%% ===================================================================
+% \fi
+%
+% \newcommand*{\Count}[1]{\texttt{\bslash{}count#1}}
+% \newcommand*{\package}[1]{\textsf{#1}}
+% \newcommand*{\ftype}[1]{\textsl{#1}}
+% \newcommand*{\NEWfeature}[1]{^^A stolen from ltxguide.cls
+% \hskip 1sp \marginpar{\small\sffamily\raggedright
+% New feature\\#1}}
+%
+% ^^A^^A We need to document a label -- we do this by using the macros for
+% ^^A^^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
+%
+% \changes{v1.00}{1999/07/14}{Initial Version}
+% \changes{v1.10}{2003/02/05}{Fixed hook into \package{hyperref}}
+% \changes{v2.00}{2005/09/19}{
+% Incorporated changes by Ido Tal to compute
+% number of sheets needed;
+% changed option processing to use keyval;
+% corrected a problem when we wanted to write to \ftype{aux}
+% although \texttt{\char`\\nofiles} was requested;
+% moved \texttt{\char`\\StopEventually} to correct place
+% }
+%
+% \DoNotIndex{\@empty,\@firstofone,\addtocounter,\arabic}
+% \DoNotIndex{\begingroup,\else,\endgroup}
+% \DoNotIndex{\fi,\ifx,\immediate,\let,\MessageBreak}
+% \DoNotIndex{\ref,\relax,\string,\lowercase,\textlatin}
+% \DoNotIndex{\the,\thepage,\undefined,\do,\divide,\value}
+% \DoNotIndex{\ifHy@pageanchor,\if@filesw,\ifHy@hypertexnames}
+% \DoNotIndex{\ifHy@plainpages,\Hy@temp,\Hy@pagecounter}
+% \DoNotIndex{\end,\documentclass,\ldots,\pageref,\renewcommand}
+% \DoNotIndex{\roman,\setcounter,\usepackage,\begin,\@number}
+% \DoNotIndex{\@currname,\@currext,\noexpand,\gdef,\edef,\def}
+%
+% ^^A -----------------------------
+%
+% \title{\unskip
+% The \package{totpages} package^^A
+% \thanks{^^A
+% The version number of this file is \fileversion,
+% last revised \filedate.}
+% }
+% \author{Wilhelm M\"uller\\[0.5ex]
+% \normalsize Herbststra\ss{}e 66\\
+% \normalsize D-28215 Bremen\\
+% \normalsize muewi@acm.org
+% }
+% \date{\filedate}
+% \maketitle
+%
+% ^^A -----------------------------
+%
+%
+% \begin{abstract}
+% \noindent This package counts the total number of pages shipped
+% out to the \ftype{dvi} file, which
+% allows sentences like
+% ``This document contains \ref{TotPages} pages,
+% the last one being no.~\pageref{TotPages}.'' to be produced
+% automatically.
+% The counter itself may be shipped out to the \ftype{dvi} file, too,
+% allowing page access by absolute page numbers, or it may be just
+% a regular \LaTeX\ counter.
+%
+% It cooperates with the package \package{hyperref}, producing
+% a hyperlink to the last page---though this is not of much use as hypertext
+% readers usually allow direct access to the last page anyway.
+%
+% Optionally, the number of sheets of paper needed to print the document
+% can be computed.
+% \end{abstract}
+%
+% \pagestyle{headings}
+%
+% ^^A -----------------------------
+%
+% \tableofcontents
+%
+% ^^A -----------------------------
+%
+% \section{Introduction}
+% ^^A
+% Printing only part of a \ftype{dvi} file can be difficult or
+% impossible if pages in different
+% parts of the document have the same number---e.\,g., in the
+% front matter and the first text pages (iii vs. 3).
+%
+% \TeX{} provides an easy solution to this problem: whenever a page
+% has been completed by the output routine and is being shipped out to
+% the \ftype{dvi} file,
+% it displays the values of \Count{0} to \Count{9},
+% with trailing zeroes suppressed,
+% (e.\,g., \texttt{[1002.0.3]}) and writes them to the \ftype{log} and
+% \ftype{dvi} files, cf.\ \cite[p.~119]{KnuthTeXa}.
+% So,
+% if you have a \ftype{dvi} driver which allows page selection by other counters
+% than \Count{0}, you will be able to refer to absolute page numbers
+% when you make use of this package.
+%
+% \section{Using \package{totpages}}
+% ^^A
+% \DescribeEnv{TotPages}
+% Keeping a count of 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 \package{lastpage} package, cf.\ \cite{package:lastpage}).
+%
+% References to the counter itself won't make much sense since it is updated
+% asynchronously whenever an actual shipout occurs.
+% But by referencing the label |TotPages| (with |\ref{TotPages}|)
+% you get the total number of pages the document had at the end
+% of the previous run
+% of \LaTeX. If, for some reason, you want to know what page number \LaTeX\
+% actually (would have) printed, you may use |\pageref{TotPages}|.^^A
+% \footnote{Since all references to this label are obviously forward
+% references, you will have to run \LaTeX\ at least twice to get
+% correct results.}
+%
+% \DescribeMacro{\theTotPages}
+% What is actually printed by |\ref{TotPages}| is the result of the
+% macro |\theTotPages|, which normally is simply |\arabic{TotPages}|, but
+% may be redefined to anything (sensible)
+% somewhere before |\end{document}|.
+%
+% If you want to use this package, you should load \package{totpages}
+% as the \emph{last} package in your document because it
+% executes some code at |\end{document}| and has to be sure that its
+% code is the last code to be executed there.\footnote{See
+% \cite{package:lastpage} for a discussion of problems.}
+%
+% You \emph{must not} use \package{count1to} or \package{lastpage}
+% together with this package. Package \package{count1to} provides additional
+% functionality, but will not cooperate with \package{hyperref}, whereas
+% any use of \package{lastpage} is covered by \package{totpages}.^^A
+% \footnote{\package{lastpage} requires less resources, though.}
+% If you try to use one (or both) of these packages together with
+% \package{totpages}, you will receive an error message at
+% |\begin{document}|. I don't think that something really bad will happen
+% if you ignore it (unless you use \package{count1to} together with
+% \package{hyperref}), but I won't guarantee anything, either.
+%
+%
+%
+% ^^A -----------------------------
+%
+% \section{Options}
+% \subsection{Writing absolute page numbers to the \ftype{dvi} file}
+% \DescribeEnv{dvi}
+% \DescribeEnv{nodvi}
+% With option |dvi| (the default), \Count{1} is used for the absolute
+% page counter. This value is put into the \ftype{dvi} file and may be
+% used by the \ftype{dvi} driver.
+%
+% Option |nodvi| uses a regular \LaTeX\ counter which will not
+% show up elsewhere.
+%
+% No matter what kind of counter is used, its name will always be |TotPages|,
+% e.\,g., if you want to change its format to roman. (But who would want
+% to do that?).
+%
+% ^^A\pagebreak[1]
+% \subsection{Computing the number of sheets of paper}
+% \DescribeEnv{pagespersheet}
+% \DescribeEnv{nopagespersheet}
+% The option |pagespersheet=|$n$ allows to compute the number of
+% \NEWfeature{Provide number of sheets needed for printing}
+% physical sheets of paper needed when the document will be
+% printed.\footnote{Thanks
+% to Ido Tal for suggesting this
+% feature, providing an initial realisation, testing it, and
+% proof-reading the documentation.}
+% To compute this value, you have to specify the positive integer,
+% $n$, telling how many pages will be
+% printed on one physical sheet of paper. For example, when you
+% use a duplex printer and let your printer driver scale and
+% rearrange document pages to print two document pages
+% on one physical page, you should specify
+% |pagespersheet=4|. Using |nopagespersheet| (or |pagespersheet=no|)
+% turns this computation off; this is the default setting.
+%
+% \DescribeMacro{\TotPerSheet}
+% When |pagespersheet| is set to valid number,
+% its value is available in the macro |\TotPerSheet| (in exactly the
+% same form as you wrote it),
+% otherwise this macro is undefined.
+%
+% \DescribeMacro{\TotSheets}
+% The number of sheets, as computed at the end of the previous
+% \LaTeX\ run, will be contained (as decimal
+% digits) in the macro |\TotSheets|.\footnote{The value of
+% |pagespersheet| must, of course, coincide with the options you use
+% when you print the document.}
+% When |pagespersheet| is
+% used for the first time, the value of this macro will be set to |0000|
+% (four zeroes), which is still a number but different from the
+% representation of an actual zero. When you say |nopagespersheet|
+% (or never use |pagespersheet| at all), |\TotSheets| will be undefined.
+% When, at the end of the document, the value of |\TotSheets| differs
+% from the one at |\begin{document}| (the initial |0000|, or as read
+% from \ftype{aux}),
+% a warning will be issued similar to the one you get when labels differ.
+%
+% ^^A -----------------------------
+%
+% \section{Required packages}
+% ^^A
+% This package needs the \package{everyshi}
+% \cite{package:everyshi} and \package{keyval} \cite{package:keyval} packages.
+%
+%
+% ^^A -----------------------------
+%
+% \section{Acknowledgements}
+% ^^A
+% This package uses ideas inspired by
+% Martin Schr\"oder's \package{count1to}
+% package \cite{package:count1to}, Jeff Goldberg's \package{lastpage}
+% package \cite{package:lastpage}, and the \package{lastpage} and
+% \package{keyval} support
+% contained in Sebastian Rahtz's \package{hyperref}
+% package \cite{package:hyperref}, and implements options suggested
+% by and based on ideas of Ido Tal \cite{mail:Tal}.
+%
+%
+% ^^A -----------------------------
+%
+% \begin{thebibliography}{HHHHHHHH\,1}
+% \raggedright
+% \bibitem[Carlisle]{package:keyval}
+% David Carlisle.
+% \newblock The \package{keyval} package.
+% \newblock \url{CTAN: tex-archive/macros/latex/required/graphics/keyval.dtx}.
+% \newblock \LaTeXe{} package.
+% \bibitem[Goldberg]{package:lastpage}
+% Jeff Goldberg.
+% \newblock The \package{lastpage}-package.
+% \newblock \url{CTAN: tex-archive/macros/latex/contrib/lastpage/}.
+% \newblock \LaTeXe{} package.
+% \bibitem[Knuth]{KnuthTeXa}
+% Donald~E.\ Knuth.
+% \newblock \emph{The {\TeX}Book}, volume~A of \emph{Computers
+% and Typesetting}.
+% \newblock Addison-Wes\-ley, 1986.
+% \newblock Tenth printing, revised, June 1990.
+% \bibitem[Rahtz]{package:hyperref}
+% Sebastian Rahtz.
+% \newblock Hypertext marks in \LaTeX.
+% \newblock \url{CTAN: tex-archive/macros/latex/contrib/hyperref/}.
+% \newblock \LaTeXe{} package.
+% \bibitem[Schr\"oder\,1]{package:count1to}
+% Martin Schr\"oder.
+% \newblock The \package{count1to} package.
+% \newblock \url{CTAN: tex-archive/macros/latex/contrib/ms/count1to.dtx}.
+% \newblock \LaTeXe{} package.
+% \bibitem[Schr\"oder\,2]{package:everyshi}
+% Martin Schr\"oder.
+% \newblock The \package{everyshi} package.
+% \newblock \url{CTAN: tex-archive/macros/latex/contrib/ms/everyshi.dtx}.
+% \newblock \LaTeXe{} package.
+% \bibitem[Tal]{mail:Tal}
+% Ido Tal.
+% \newblock Private communication.
+% \end{thebibliography}
+%
+%
+%
+% ^^A -----------------------------
+%
+% \StopEventually{}^^A
+%
+% ^^A -----------------------------
+%
+%
+% \section{The implementation}
+% ^^A
+% \setlength{\parindent}{0pt}
+% We need the \package{everyshi} and \package{keyval} packages.
+% \begin{macrocode}
+%<*package>
+\ProvidesPackage{totpages}
+ [2005/09/19 v2.00 Totpages Package (muewi)]
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\RequirePackage{everyshi}[1994/12/09]
+\RequirePackage{keyval}[1998/06/05]
+% \end{macrocode}
+%
+% \begin{macro}{\ifTotPagesToDvi}
+% The user can decide if the absolute page number should
+% go to the \ftype{dvi} file or not, the default being yes:
+% \begin{macrocode}
+\newif\ifTotPagesToDvi\TotPagesToDvitrue
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifPagesPerSheet}
+% \begin{macro}{\TotPerSheet}
+% The user may ask to compute the number of sheets needed for
+% printing.
+% To do this, we need some variables. (The number
+% of pages per sheet is saved in a macro instead of a counter
+% since counters are a scarce resource in some \TeX\ implementations.)
+%
+% \begin{macrocode}
+\newif\ifPagesPerSheet\PagesPerSheetfalse
+\newcommand{\TotPerSheet}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% We want to parse package options with keyval. This code has been
+% stolen (more or less) from \package{hyperref}:
+%
+% \SpecialMainEnvIndex{dvi}
+% \SpecialMainEnvIndex{nodvi}
+% First, we define the keys. In case of the boolean keys, |dvi| and
+% |nodvi|, we ignore any value, just taking into account their presence:
+%
+% \begin{macrocode}
+\define@key{Tot}{dvi}[x]{\TotPagesToDvitrue}
+\define@key{Tot}{nodvi}[x]{\TotPagesToDvifalse}
+% \end{macrocode}
+%
+% \SpecialMainEnvIndex{pagespersheet}
+% \SpecialMainEnvIndex{nopagespersheet}
+% For the numeric key, a value of |no| may be used
+% to disable the feature.
+%
+% \begin{macrocode}
+\define@key{Tot}{nopagespersheet}[x]{\PagesPerSheetfalse}
+\define@key{Tot}{pagespersheet}{%
+ \lowercase{\def\Tot@temp{#1}}%
+ \ifx\Tot@temp\@empty
+ \else
+ \def\Tot@no{no}
+ \ifx\Tot@temp\Tot@no
+ \else
+ \edef\TotPerSheet{#1}
+ \PagesPerSheettrue
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macro}{\Tot@ptionsWithKV}
+% Now comes the actual option processing. We won't use the code from \package{hyperref}
+% literally since it will produce a warning when something like |pagespersheet=2|
+% is specified as a global option (although it's processed correctly!). Nevertheless,
+% this code has been derived from the code in \package{hyperref}, which, in turn,
+% contains the following attribution: ``This section was written by David Carlisle.''
+% \begin{macrocode}
+\def\Tot@ptionsWithKV#1{%
+ \let\@tempc\relax
+ \let\Tot@tempa\@empty
+% \end{macrocode}
+% \begin{macro}{\Tot@tempopt}
+% To cope with global options of the form |key=value|, we have to look for
+% a definition of |key|, but remove |key=value| from the list of unprocessed
+% options. \TeX's argument parser will help us here:
+% \begin{macrocode}
+ \def\Tot@tempopt##1=##2=##3\Tot@tempopt{%
+% \end{macrocode}
+% |\Tot@tempopt| should be called with an option string followed by |==\Tot@tempopt|.
+% |##1| will always contain the keyword, |##2| and |##3| will vary:
+% \begin{center}\small
+% \DeleteShortVerb{\|}
+% \begin{tabular}{l|l|l|l}
+% option string & \verb|##1| & \verb|##2| & \verb|##3| \\\hline
+% \verb|key=value| & \verb|key| & \verb|value| & \verb|=| \\
+% \verb|key=| & \verb|key| & (empty) & \verb|=| \\
+% \verb|key| & \verb|key| & (empty) & (empty)
+% \end{tabular}\\
+% \MakeShortVerb{\|}
+% \end{center}
+% Now we can check the existence of the key\ldots
+% \begin{macrocode}
+ \@ifundefined{KV@#1@##1}%
+ {}%
+ {%
+% \end{macrocode}
+% \ldots{}and, if found, add the complete string to the list
+% of options to be parsed
+% here and remove it from the list of unused options:
+% \begin{macrocode}
+ \edef\Tot@tempa{\Tot@tempa,\CurrentOption,}%
+ \@expandtwoargs\@removeelement\CurrentOption
+ \@unusedoptionlist\@unusedoptionlist
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% Add any global options that are known to KV to the start of the list
+% being built in |\Tot@tempa| and mark them used by removing them from
+% the unused option list.
+% \begin{macrocode}
+ \@for\CurrentOption:=\@classoptionslist\do{%
+ \expandafter\Tot@tempopt\CurrentOption==\Tot@tempopt
+ }%
+% \end{macrocode}
+%
+% Now stick the package options at the end of the list and wrap in a call
+% to |\setkeys|.
+% \begin{macrocode}
+ \edef\Tot@tempa{%
+ \noexpand\setkeys{#1}{%
+ \Tot@tempa\@ptionlist{\@currname.\@currext}%
+ }%
+ }%
+% \end{macrocode}
+%
+% Do it. And drop unused macros
+% \begin{macrocode}
+ \Tot@tempa
+ \let\Tot@no\relax
+ \let\Tot@temp\relax
+ \let\Tot@tempa\relax
+ \let\Tot@tempopt\relax
+ \let\Tot@ptionsWithKV\undefined
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\Tot@ptionsWithKV{Tot}%
+% \end{macrocode}
+%
+% Unknown package options will be flagged as an error by |\setkeys|, so we
+% will turn off \LaTeX's message. (Don't ask me why this has to be
+% wrapped in |\AtEndOfPackage|. If it isn't, the warning will still appear.)
+% \begin{macrocode}
+\AtEndOfPackage{\let\@unprocessedoptions\relax}
+% \end{macrocode}
+%
+% Finally, we check if the value given for |pagespersheet| makes sense.
+% This code is not really perfect since using really strange things for
+% the option value will cause havoc.
+%
+% \begin{macrocode}
+\ifPagesPerSheet
+ \ifnum 1 > \TotPerSheet
+ \PackageError{totpages}{%
+ The number of pages per sheet must be positive.}{%
+ You cannot print less than one TeX page per sheet of paper.\MessageBreak
+ The option pagespersheet has been disabled.}
+ \PagesPerSheetfalse
+ \fi
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\theTotPages}
+% \SpecialMainEnvIndex{TotPages}
+% If the counter is to go to the \ftype{dvi} file, we have to use a
+% fixed count register: \Count{1}. (For this to work, we have to copy
+% a few internals from \ftype{latex.ltx}.) Otherwise, we'll just use a
+% conventional \LaTeX\ counter.
+% \begin{macrocode}
+\ifTotPagesToDvi
+ \countdef\c@TotPages=1 \c@TotPages=0
+ \let\cl@TotPages\@empty
+ \newcommand\theTotPages{\arabic{TotPages}}
+\else
+ \newcounter{TotPages}
+\fi
+% \end{macrocode}
+% \end{macro}
+% To save a bit of space,
+% some control sequences for the options are removed. Some more will be removed
+% at |\begin{document}|.
+% \begin{macrocode}
+\let\ifTotPagesToDvi\undefined
+\let\TotPagesToDvitrue\undefined
+\let\TotPagesToDvifalse\undefined
+% \end{macrocode}
+% When shipout occurs, we step the counter.
+% \begin{macrocode}
+\EveryShipout{\stepcounter{TotPages}}
+% \end{macrocode}
+% Nothing outside this package should mess with that counter, of
+% course.---At the beginning of the document, we should be able to
+% find out
+% what packages are used and warn about some we aren't sure we can
+% cooperate with:
+%
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{count1to}{%
+ \PackageError{totpages}{%
+ Can't use both, count1to and totpages}{%
+ You should read the documentation of these packages and\MessageBreak
+ decide which one is more appropriate for your intentions.}
+ }{}%
+ \@ifpackageloaded{lastpage}{%
+ \PackageError{totpages}{%
+ Can't use both, lastpage and totpages}{%
+ You should read the documentation of these packages and\MessageBreak
+ decide which one is more appropriate for your intentions.}
+ }{}%
+% \end{macrocode}
+% \begin{macro}{\TotPages@putlabel}
+% We define a command which will be executed at the end of the document,
+% but if anybody did it already, we simply hope they did it right.
+% \begin{macrocode}
+ \ifx\undefined\TotPages@putlabel
+% \end{macrocode}
+% If the package \package{hyperref} is used,
+% we think we know what to do to produce a correct hyperlink label.
+% (This code was obtained from the \package{lastpage} support of
+% \package{hyperref} itself.)
+% \begin{macrocode}
+ \@ifpackageloaded{hyperref}{%
+% \end{macrocode}
+% There are two different ways to produce a warning with \package{hyperref}:
+% \begin{macrocode}
+ \ifx\undefined\Hy@WarningNoLine
+ \let\Hy@WarningNoLine\hyper@warn
+ \fi
+ \ifHy@pageanchor
+ \else
+ \Hy@WarningNoLine{%
+ The \string\ref{TotPages} link will not provide hyperlinks\MessageBreak
+ with disabled option `pageanchor'%
+ }%
+ \fi
+% \end{macrocode}
+% When |\nofiles| was requested, we can't do much since no \ftype{aux} is
+% to be written, so we won't define anything.
+% \begin{macrocode}
+ \if@filesw
+ \def\TotPages@putlabel{%
+ \addtocounter{page}{-1}%
+ \begingroup
+ \let\@number\@firstofone
+ \ifHy@pageanchor
+ \ifHy@hypertexnames
+ \ifHy@plainpages
+ \def\Hy@temp{\arabic{page}}%
+ \else
+ \let\textlatin\@firstofone
+ \edef\Hy@temp{\thepage}%
+ \fi
+ \else
+ \def\Hy@temp{\the\Hy@pagecounter}%
+ \fi
+ \fi
+ \immediate\write\@mainaux{%
+ \string\newlabel
+ {TotPages}{{\theTotPages}{\thepage}{}{%
+ \ifHy@pageanchor page.\Hy@temp\fi}{}}%
+ }%
+ \endgroup
+ \addtocounter{page}{1}%
+ }%
+ \fi
+% \end{macrocode}
+% Otherwise, we just put a label here, but |\label| may refer
+% to some random counter just stepped some time ago, so we have to
+% produce it ourselves.
+% \begin{macrocode}
+ }{%
+ \if@filesw
+ \def\TotPages@putlabel{%
+ \addtocounter{page}{-1}%
+ \immediate\write\@mainaux{%
+ \string\newlabel{TotPages}{{\theTotPages}{\thepage}}%
+ }%
+ \addtocounter{page}{1}%
+ }%
+ \fi
+ }%
+ \fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TotSheets}
+% \begin{macro}{\TotPages@putSheets}
+% When |pagespersheet| is disabled, any use of |\TotSheets|
+% will be flagged as an error. Otherwise, the initial value will
+% be |0000|. When the value computed during the previous
+% run has been read from the \ftype{aux} file, we just assume it is right
+% and check at the end of the document if it is still the same.
+% \SpecialEnvIndex{TotPages}
+% \begin{macrocode}
+ \ifPagesPerSheet
+ \ifx\undefined\TotSheets
+ \newcommand{\TotSheets}{0000}
+ \fi
+ \def\TotPages@putSheets{%
+ \addtocounter{TotPages}{\TotPerSheet}
+ \addtocounter{TotPages}{-1}
+ \divide \value{TotPages} by \TotPerSheet
+ \edef\Tot@temp{\arabic{TotPages}}
+ \ifx\Tot@temp\TotSheets \else
+ \PackageWarning{totpages}{%
+ The number of sheets may have changed (\TotSheets => \Tot@temp).\MessageBreak
+ You should run your document through the formatter again.}
+ \fi
+ \if@filesw
+ \immediate\write\@mainaux{%
+ \string\gdef\string\TotSheets{\Tot@temp}}%
+ \fi
+ }%
+ \else
+ \let\TotSheets\undefined
+ \fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Before we write the value to the \ftype{aux} file 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,
+% so we try to do our very best and set our
+% entry for \cs{AtEndDocument} during |\begin{document}| processing.
+%
+% When |\nofiles| is specified, though, we won't have to do anything
+% at the end of the document.
+% \begin{macrocode}
+ \if@filesw
+ \AtEndDocument{%
+% \end{macrocode}
+% The label \texttt{TotPages} is put onto the last page
+% of the document and holds the total number of pages of the
+% document, i.\,e., the value of |TotPages|.
+% \begin{macrocode}
+ \clearpage
+ \TotPages@putlabel
+ }%
+ \fi
+% \end{macrocode}
+%
+% Finally, we may have to compute the number of sheets. This
+% is done even when no files are written to allow checking for changes.
+% \begin{macrocode}
+ \ifPagesPerSheet
+ \AtEndDocument{\TotPages@putSheets}
+ \fi
+ \let\ifPagesPerSheet\undefined
+ \let\PagesPerSheettrue\undefined
+ \let\PagesPerSheetfalse\undefined
+}
+%</package>
+% \end{macrocode}
+%
+% \section{An example file}
+% And, at last, there
+% is a small example file using features of package \package{totpages}.
+%
+% \begin{macrocode}
+%<*example>
+\documentclass[pagespersheet=2]{article}
+\usepackage[dvips]{hyperref}
+%%%%% Replace preceding line by the following one for pdflatex:
+%%\usepackage[pdftex]{hyperref}
+\usepackage[dvi]{totpages}
+\renewcommand{\theTotPages}{\roman{TotPages}}
+\begin{document}
+\setcounter{page}{12345}
+This is the number of pages (in Roman numerals): ``\ref{TotPages}''.
+On the last page, the number ``\pageref{TotPages}'' is printed.
+
+\clearpage
+
+a second page\ldots
+
+\clearpage
+
+and a last one\ldots\ldots
+
+
+When printed on a duplex printer in duplex mode, \TotSheets{} sheets of
+paper will be needed.
+\end{document}
+%</example>
+% \end{macrocode}
+%
+% ^^A -----------------------------
+%
+% \Finale
+%
+% ^^A Run ``makeindex -s gind.ist totpages.idx'' and
+% ^^A ``makeindex -s gglo.ist -o totpages.gls totpages.glo''
+% ^^A to format indexes!
+% \PrintChanges
+% \PrintIndex
+% ^^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