% UNIT MACROS for LaTeX2e, version 1.02,
% written by Herman Haverkort, 16 february 1995
% See end of file for information on warranty, distribution etc.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{hhunits}[1995/02/16 Units system]
\RequirePackage{hhqueue}[1995/02/14]

% =============================================================================
% \unit UNITNAME:DIMENSION returns the largest of the specified DIMENSION
% and the current value of the specified unit. Furthermore the value of the
% specified unit is set to the returned value.
% Thus the value of the unit will eventually reach the maximum value which
% is passed to it during the processing of the document. That value is
% saved after processing the document, and reloaded before processing it
% a second time. During the second run the same value will be used throughout
% the entire document, and that value will be large enough to fit all
% dimensions which are specified for the unit.
% =============================================================================

\def\unit#1:#2{%
  \@ifundefined{unit@#1}%
    {#2\h@newunit #1:{#2}{#2}}%
    {\ifdim\@nameuse{unit@#1}<#2%
       #2\h@setunit #1:{#2}%
     \else
       \@nameuse{unit@#1}%
     \fi
     \ifdim\@nameuse{newunit@#1}<#2%
       \global\csname newunit@#1\endcsname #2%
     \fi}}
% The unit macro keeps track of the current unit value and a new
% unit value. The current unit value is initialized by reading the
% file jobname.aux. The initial value is based on a previous run.
% If no extra action were undertaken, the unit value would not drop
% down to a reasonable value anymore if a previous run on the document
% drove it far up. Therefore a new unit value is maintained; it is
% initialized to zero in the beginning of every compiling session.
% The current unit value is used for type-setting, but when the end
% of the document is reached the new unit value is saved.

\def\h@presetunit#1:#2{\h@newunit #1:{#2}{#2}}
% \h@presetunit is meant to be used in style files to initalize unit values.
% It sets both the current and the new unit value. This prevents
% the unit value from dropping below its preset value if it is not used.
% Such dropping could cause problems, because the dropped value would be
% reloaded the next time the document is processed. The reloading of the
% unit values takes place after the reading of the style files which
% contain the presettings, so if the new unit value was not initialized,
% the presetting would lose its effect after compiling the document once.

\def\h@resetunit#1:#2{%
  \@ifundefined{unit@#1}%
    {\h@newunit #1:{#2}{\z@}}
    {\global\csname unit@#1\endcsname #2}}
% Designed to be used in jobname.aux. Do not use this macro directly.

\def\h@newunit#1:#2#3{%
  \expandafter\newdimen\csname unit@#1\endcsname
  \global\csname unit@#1\endcsname #2%
  \expandafter\newdimen\csname newunit@#1\endcsname
  \global\csname newunit@#1\endcsname #3%
  \edef\@@@unt{#1}\h@enqueue{@@@unt}{@units}}

\def\h@setunit#1:#2{%
  \global\csname unit@#1\endcsname #2%
  \global\@unitschangedtrue}

\AtEndDocument{%
  \clearpage
  \if@filesw\h@writeunits\immediate\closeout\@unitsfile\fi}

\def\h@writeunits{%
  {\def\\{\h@writeunit}\h@processq{@units}}%
  \if@unitschanged
    \PackageWarningNoLine{hhunits}{Unit values may have changed.\MessageBreak
                                   Rerun to get them right}\fi}

\def\h@writeunit#1{%
  \ifdim\@nameuse{newunit@#1}<\@nameuse{unit@#1}%
    \global\csname unit@#1\endcsname \@nameuse{newunit@#1}%
    \global\@unitschangedtrue
  \fi
  \immediate\write\@unitsfile{%
    \string\h@resetunit \space #1:{\the\@nameuse{unit@#1}}}}

% **********************
% *   INITIALIZATION   *
% **********************

\h@initqueue{@units}{}
\newif\if@unitschanged
\newwrite\@unitsfile
\@input{\jobname.uni}
\if@filesw
  \immediate\openout\@unitsfile=\jobname.uni
  \immediate\write\@unitsfile{\relax}\fi

\endinput% **********************
% * WARRANTY, DISTRIBUTION ETC. *
% *******************************
%
% This is a TeX style file by Herman Haverkort. This file is distributed
% in the hope that it will be useful, but without any warranty; without
% even the implied warranty of merchantability or fitness for a particular
% purpose. The author does not accept any responsability for any damage,
% loss, injury, psychosis, annoyance, marital problems, murders etc. which
% are caused by this file.
%
% This style file has not been tested systematically, so there are
% probably undiscoverd errors in it. If you find one, if you have
% trouble using this file, if you have a suggestion for an extension or
% another modification, or if you are just a happy user, please report
% it to:
%                       Herman Haverkort
%                       Heyenoordseweg 40
%                      NL-6813 GA  Arnhem
%                      herman@fgbbs.iaf.nl
%
% You are allowed to change this file, but you are not allowed to distribute
% the changed version unless you obey the following:
% -  give the changed file another name than the original one;
% -  record clearly in the changed file:
%    -  the original name of the file;
%    -  its original author;
%    -  that it is a changed version;
% -  do not remove the restrictions on distributing the file.
%
% You are not allowed to take money for the distribution or use of either
% this file or a changed version, except for a nominal charge for copying
% etc.
%
% Have fun!