% \iffalse meta-comment
%
% Copyright (C) 2008 by
%    Joseph Wright <joseph.wright@morningstar2.co.uk>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3c 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.3c 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 Joseph Wright.
%
% This work consists of the source file si.dtx
%                 and the derived files si.ins,
%                                       si.sty,
%                                       si.pdf,
%                                       si-SIunits.cfg,
%                                       si-sistyle.cfg,
%                                       si-unitsdef.cfg,
%                                       si-units.cfg,
%                                       si-prefix.cfg,
%                                       si-named.cfg,
%                                       si-prefixed.cfg,
%                                       si-addn.cfg,
%                                       si-abbr.cfg and
%                                       si-accepted.cfg
%
%
% Unpacking:
%    (a) If si.ins is present:
%           tex si.ins
%    (b) Without si.ins:
%           tex si.dtx
%    (c) If you use LaTeX to generate files:
%           latex \let\install=y\input{si.dtx}
%
% Documentation:
%    (a) Without write18 enabled:
%          pdflatex si.dtx
%          bibtex8 --wolfgang si
%          makeindex -s gind.ist si.idx
%          makeindex -s gglo.ist -o si.gls si.glo
%          pdflatex si.dtx
%          makeindex -s gind.ist si.idx
%          makeindex -s gglo.ist -o si.gls si.glo
%          pdflatex si.dtx
%    (b) With write18 enabled:
%          pdflatex si.dtx
%          bibtex8 --wolfgang si
%          pdflatex si.dtx
%          pdflatex si.dtx
%
% Installation:
%     Copy si.sty and the various .cfg files to a location
%     searched by TeX, and if required by your TeX installation,
%     run the appropriate command to build a hash of files
%     (texhash, mpm --update-db, etc.)
%
% Note:
%     The jawltxdoc.sty file is not needed for installation,
%     only for building the documentation; it may be deleted
%     after producing the documentation (if necessary).
%
%<*ignore>
% This is all taken verbatim from Heiko Oberdiek's packages
\begingroup
  \def\x{LaTeX2e}%
\expandafter\endgroup
\ifcase 0\ifx\install y1\fi\expandafter
         \ifx\csname processbatchFile\endcsname\relax\else1\fi
         \ifx\fmtname\x\else 1\fi\relax
\else\csname fi\endcsname
%</ignore>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
 ----------------------------------------------------------------
 The si package --- A comprehensive (SI) units package
 Maintained by Joseph Wright
 E-mail: joseph.wright@morningstar2.co.uk
 Released under the LaTeX Project Public License v1.3c or later
 See http://www.latex-project.org/lppl.txt
 ----------------------------------------------------------------

\endpreamble
\Msg{Generating si files:}
\usedir{tex/latex/contib/si}
\generate{\file{\jobname.ins}{\from{\jobname.dtx}{install}}
          \file{\jobname.sty}{\from{\jobname.dtx}{package}}
          \file{jawltxdoc.sty}{\from{\jobname.dtx}{jawltxdoc}}
}
\usedir{tex/latex/contib/config}
\generate{\file{si-SIunits.cfg}{\from{\jobname.dtx}{SIunits}}
          \file{si-sistyle.cfg}{\from{\jobname.dtx}{sistyle}}
          \file{si-unitsdef.cfg}{\from{\jobname.dtx}{unitsdef}}
          \file{si-units.cfg}{\from{\jobname.dtx}{units}}
}
\generate{\file{si-prefix.cfg}{\from{\jobname.dtx}{prefix}}
          \file{si-named.cfg}{\from{\jobname.dtx}{named}}
          \file{si-prefixed.cfg}{\from{\jobname.dtx}{prefixed}}
          \file{si-addn.cfg}{\from{\jobname.dtx}{addn}}
          \file{si-accepted.cfg}{\from{\jobname.dtx}{accepted}}
          \file{si-physical.cfg}{\from{\jobname.dtx}{physical}}
          \file{si-abbr.cfg}{\from{\jobname.dtx}{abbr}}
}
\generate{\file{si-synchem.cfg}{\from{\jobname.dtx}{synchem}}
          \file{si-hep.cfg}{\from{\jobname.dtx}{hep}}
          \file{si-binary.cfg}{\from{\jobname.dtx}{binary}}
}
\generate{\file{si-UK.cfg}{\from{\jobname.dtx}{UK}}
          \file{si-USA.cfg}{\from{\jobname.dtx}{USA}}
          \file{si-germany.cfg}{\from{\jobname.dtx}{germany}}
          \file{si-south-africa.cfg}{\from{\jobname.dtx}
            {south-africa}}
}
\nopreamble
\usedir{doc/latex/contib/si}
\generate{\file{\jobname.bib}{\from{\jobname.dtx}{refs}}
}
\endbatchfile
%</install>
%<*ignore>
\fi
% Will Robertson's trick
\immediate\write18{makeindex -s gind.ist -o \jobname.ind  \jobname.idx}
\immediate\write18{makeindex -s gglo.ist -o \jobname.gls  \jobname.glo}
%</ignore>
%<*driver>
\PassOptionsToClass{a4paper}{article}
\documentclass{ltxdoc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
%\OnlyDescription
% The various formatting commands used in this file are collected
% together in |jawltxdoc|.
\usepackage{jawltxdoc,textcomp}
\usepackage[latin1]{inputenc}
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
%\CheckSum{6764}
%
% \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         \~}
%
%\GetFileInfo{\jobname.sty}
%
%\DoNotIndex{\@car,\@eha,\@ehc,\@empty,\@firstofone,\@firstoftwo}
%\DoNotIndex{\@for,\@gobble,\@gobbletwo,\@ifl@aded,\@ifnextchar}
%\DoNotIndex{\@ifpackagelater,\@ifpackageloaded,\@ifstar}
%\DoNotIndex{\@ifundefined,\@makeother,\@namedef,\@nameuse,\@ne}
%\DoNotIndex{\@nil,\@secondoftwo,\@temptokena,\@undefined,\AA}
%\DoNotIndex{\active,\addto,\addtolength,\advance,\afterassignment}
%\DoNotIndex{\aftergroup,\AtBeginDocument,\AtEndOfPackage}
%\DoNotIndex{\begingroup,\bfseries,\bgroup,\boldmath,\box}
%\DoNotIndex{\capitalring,\catcode,\cdot,\chardef,\check@mathfonts}
%\DoNotIndex{\circ,\csname,\DeclareFontEncoding,\DeclareFontFamily}
%\DoNotIndex{\DeclareFontShape,\DeclareFontSubstitution}
%\DoNotIndex{\DeclareMathSymbol,\DeclareRobustCommand}
%\DoNotIndex{\DeclareSymbolFont,\DeclareTextSymbol}
%\DoNotIndex{\DeclareTextSymbolDefault,\def,\define@boolkey}
%\DoNotIndex{\define@choicekey,\define@cmdkey,\define@cmdkeys}
%\DoNotIndex{\define@key,\displaystyle,\displaywidth,\divide,\do}
%\DoNotIndex{\edef,\egroup,\else,\encodingdefault,\end,\endcsname}
%\DoNotIndex{\endgroup,\endinput,\endtabular,\ensuremath}
%\DoNotIndex{\expandafter,\f@family,\f@series,\fam,\fi,\font}
%\DoNotIndex{\fontsize,\frac,\gdef,\global,\hbox,\hfil,\hfill,\hskip}
%\DoNotIndex{\hspace,\hss,\ifcsname,\ifdim,\iffalse,\IfFileExists}
%\DoNotIndex{\ifmmode,\ifnum,\ifx,\ignorespaces,\inputencodingname}
%\DoNotIndex{\InputIfFileExists,\key@ifundefine,\let,\long,\m@ne}
%\DoNotIndex{\makeatletter,\math@version,\mathchoice,\mathnormal}
%\DoNotIndex{\mathord,\mathrm,\mathsf,\mathtt,\mdseries}
%\DoNotIndex{\MessageBreak,\mkern,\mp,\NC@find,\NeedsTeXFormat}
%\DoNotIndex{\newbox,\newcolumntype,\newcommand,\newcount,\newdimen}
%\DoNotIndex{\newif,\newlength,\newtoks,\nobreak,\noexpand,\p@}
%\DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\phantom}
%\DoNotIndex{\ProcessOptionsX,\protect,\protected@edef,\ProvidesFile}
%\DoNotIndex{\ProvidesPackage,\Q,\raisebox,\relax,\renewcommand}
%\DoNotIndex{\RequirePackage,\rlap,\sbox,\scantokens}
%\DoNotIndex{\scriptscriptstyle,\scriptstyle,\selectfont,\setbox}
%\DoNotIndex{\setkeys,\setlength,\settoheight,\sf@size,\sfdefault}
%\DoNotIndex{\sfrac,\skewchar,\sp,\space,\string,\strip@pt}
%\DoNotIndex{\tabularnewline,\text,\textdegree,\textmu,\textohm}
%\DoNotIndex{\textsc,\textstyle,\textsuperscript,\the,\thr@@,\times}
%\DoNotIndex{\ttdefault,\uccode,\unboldmath,\unhbox,\upmu,\Upomega}
%\DoNotIndex{\uppercase,\upshape,\wd,\xdef,\xspace,\z@}
%
%\changes{0.6}{2008/02/18}{First public release}
%
%\setkeys{lst}{language=[LaTeX]{TeX},moretexcs={sisetup,num,ang,SI,
%  unitsym,newunit,newpower,newprefix,metre,candela,kelvin,ampere,
%  second,mole,per,kilogram,Square,squared,cubed,cubic,kilo,centi,
%  gram,tothe,toprule,midrule,bottomrule}}
%
%\title{\currpkg\ --- A comprehensive (SI) units package^^A
%  \thanks{This file describes version \fileversion, last revised
%    \filedate.}}
%\author{Joseph Wright^^A
%  \thanks{E-mail: joseph.wright@morningstar2.co.uk}}
%\date{Released \filedate}
%
%\maketitle
%
%\newcommand*{\SIunits}{\pkg{SIunits}\xspace}
%\newcommand*{\sistyle}{\pkg{sistyle}\xspace}
%\newcommand*{\unitsdef}{\pkg{unitsdef}\xspace}
%\newcommand*{\unitspkg}{\pkg{units}\xspace}
%\newcommand*{\numprint}{\pkg{numprint}\xspace}
%\begin{abstract}
% Typesetting values with units requires care to ensure that the
% combined mathematical meaning of the value plus unit combination is
% clear.  In particular, the SI units system lays down a consistent
% set of units with rules on how these are to be used.  However,
% different countries and publishers have differing conventions on
% the exact appearance of numbers (and units).  A number of \LaTeX\
% packages have been developed to provide consistent application of
% the various rules: \SIunits, \sistyle, \unitsdef and \unitspkg are
% the leading examples.  The \numprint package provides a large number
% of number-related functions, while \pkg{dcolumn} and \pkg{rccol}
% provide tools for typesetting tabular numbers.
%
% The \currpkg package takes the best from the existing packages, and
% adds new features and a consistent interface.  A number of new
% ideas have been incorporated, to fill gaps in the existing
% provision.  The package also provides backward-compatibility with
% \SIunits, \sistyle, \unitsdef and \unitspkg. The aim is to have one
% package to handle all of the possible unit-related needs of \LaTeX\
% users.
%\end{abstract}
%
%\begin{multicols}{2}
%  \tableofcontents
%\end{multicols}
%
%\part{Introduction}
%
% The correct application of units of measurement is very important
% in technical applications.  For this reason, carefully-crafted
% definitions of a coherent units system have been laid down by the
% \latin{Conf\'erence G\'en\'erale des Poids et
% Mesures}\footnote{General Conference on Weights and Measures.}
% (CGPM); this has resulted in the \latin{Syst\`eme International
% d'Unit\'es}\footnote{International System of Units.} (SI).  At the
% same time, typographic conventions for correctly displaying both
% numbers and units exist to ensure that no loss of meaning occurs in
% printed matter.
%
% \LaTeX\ support typesetting numbers and units is currently provided
% by a number of packages: \SIunits, \sistyle, \unitspkg, \unitsdef
% and \numprint.  Each package has advantages, and no single package
% has so far displaced use of the others.  The aim of the \currpkg
% package is to learn from the existing implementations to provide a
% coherent and extendable approach to the problem.  The original aim
% of developing \currpkg was to produce a ``version 2'' successor to
% \SIunits or \sistyle.  However, as the package has been developed a
% number of inconsistencies in the interfaces of the existing
% packages have been noted.  Thus by default \currpkg does not follow
% any one of the existing packages; the interface is intended to be
% self-consistent and logical.  As a result, \currpkg is now intended
% as a new package.  The author hopes that by providing a
% comprehensive package here, the other ``unit'' packages will be
% superseded.
%
% Where possible, conventions from the existing solutions have been
% used here.  For example, the macros \cs{num}, \cs{ang} and \cs{SI}
% act in a very similar fashion to those in existing packages.  In
% emulation mode, \currpkg tries hard to work in exactly the same
% manner as the emulated package.  However, in certain places
% inconsistencies exist due to changes in the underlying mechanisms
% used.  These are noted where they are known to the package author.
%
%\section{Existing packages}
% Both the \SIunits an \sistyle package are designed to
% allow typesetting of SI units, with consistent typography and
% following the rules laid down by \textsc{nist}
% \cite{NIST}.\footnote{\sistyle also allows the use of German
% and South African rules ``out of the box''.}  The \sistyle
% package concentrates on typography, whereas the \SIunits
% package is focussed on careful application of SI units in place of
% other systems.  The key strengths of the two packages can be
% summarised as follows:\footnote{Thanks to Stefan Pinnow for the
% excellent summary on \texttt{comp.text.tex}, on which this is
% based.}
%\begin{itemize}
%  \item \sistyle
%    \begin{itemize}
%      \item Easy input for numbers, for example typing
%        |\num{5.8e-7}| and getting ``\num{5.8e-7}'' as output.
%      \item Input of numbers can be with comma or dot as decimal
%        sign and is independent of output.
%      \item Output style can follow particular regional conventions
%        (\latin{via} \cs{sistyle}) or even be dependent on the
%        document language (implemented by \cs{sistyleToLang}).
%    \end{itemize}
%  \item \SIunits
%    \begin{itemize}
%      \item The look of units can be easily be changed in the whole
%        document by redefining the commands.
%      \item New units can be added on a document-specific basis
%        (\cs{addunit}), for example to match journal requirements (
%        \eg\ ``wt.-\%" \latin{versus} ``wt\%'').
%      \item Package aims to enforce use of SI units as far as
%        possible.
%    \end{itemize}
%\end{itemize}
%
% At the same time, the \unitsdef package allows ``trailing'' units,
% so for example |10\metre| to yield ``10\metre'' with a non-breaking
% and definable space.  However, this does not allow control of the
% format of the number.  The \unitsdef package is built on top of
% \unitspkg, which is an even more general. The \numprint package
% provides fine control for printing numbers, with features beyond
% those in \sistyle.  Finally, the \pkg{hepunits} package adds
% various physics units to \SIunits.
%
%\section{The wish-list}
%\newcommand*{\WishlistStatus}[1]{\textbf{#1}}
%\newcommand*{\Todo}{\WishlistStatus{To do}}
%\newcommand*{\Ongoing}{\WishlistStatus{Ongoing}}
%\newcommand*{\Completed}{\WishlistStatus{Completed}}
% The wish-list for the new package has developed as ideas have
% suggested themselves.  This has been both from the package author
% and various contributors on \texttt{comp.text.tex}.  Anything on
% the list is likely to be looked at: nothing is ruled out. Items
% marked \Todo\ are definitely going to be looked at, those marked
% \Ongoing\ have at least some code written.  Items marked
% \Completed\ seem to work properly, and at this stage seem to be
% finished (in the sense that changes are not planned).  However,
% that does not mean they are finalised or bug free!
%\begin{itemize}
%  \item \pkg{keyval} package interface, with modification of
%    settings in document using this system (like \pkg{hyperref}).
%    \Completed
%  \item Remove need for \cs{usk} separator between unit names when
%    using \SIunits-style setup. \Completed
%  \item ``Prefix'' units, such as currency, possibly as an optional
%    argument to \cs{SI}:
%    |\SI[per=slash]{10}[\pounds]{\per\kilo\gram}| $\Rightarrow$
%    ``\SI[per=slash]{10}[\pounds]{\per\kilo\gram}'' (suggested by
%    Allan Ristow). \Completed
%  \item  Stand-alone setting of units, for example
%    |\unitsym{kg.m/s^2}| to give ``\unitsym{kg.m/s^2}'', for use in
%    table headings, \etc\ (suggested by Allan Ristow). \Completed
%  \item \numprint-like handling of numbers (suggested by Allan
%    Ristow). \Completed
%  \item Ability to handle crystallography-style estimated standard
%    deviations, \eg\ |\SI{1.550(2)}{\angstrom}| $\Rightarrow$
%    ``\SI{1.550(2)}{\angstrom}''.\footnote{$(1.550 \pm 0.002) \times
%    10^{-10}$\,m.} \Completed
%  \item Ability to understand and alter negative powers/fractions,
%    and typeset these flexibly; thus |\unitsym{\metre\per\second}|
%    could give ``\unitsym{\metre\per\second}'',
%    ``\unitsym[per=slash]{\metre\per\second}'',
%    ``\unitsym[per=frac]{\metre\per\second}'' or
%    ``\unitsym[per=frac,fraction=nice]{\metre\per\second}''
%    depending on a package setting (suggested by Stefan Pinnow).
%    \Completed
%  \item More logical handling of powers; for example |\deci\cubic\metre|
%    or |\deci\metre\cubed| give ``\unitsym{\deci\metre\cubed}'', but
%    |\deci\cubed\metre| does not even though \cs{deci} \emph{cannot}
%    be cubed (adapted suggestion from Stefan Pinnow). \Completed
%  \item Use of trailing units (as in \unitsdef package, so for
%    example |10\metre| to give ``10\metre'' (suggestion from Lan
%    Thuy Pham). \Completed
%  \item Support use of non-Latin characters where appropriate,
%    for example µ in units as in |\unitsym{µm}| to give
%    ``\unitsym{µm}'' (suggested by Martin Heller). \Completed
%  \item Integrate the core functionality of the
%    \SIunits and \sistyle packages (suggested by Danie
%    Els,\footnote{Current maintainer of \sistyle.} as well as a
%    key point of the review). \Completed
%  \item Modular design, with loadable definitions for different
%    areas and typographic conventions. \Completed
%  \item Emulation of existing packages [\unitspkg (\Completed),
%    \unitsdef (\Completed), \sistyle  (\Completed), \SIunits
%    (\Completed)] to allow easy upgrading. \Completed
%  \item Typesetting angles in ``astronomy'' style, for example
%    |\ang[astroang]{30;5;3.2}| to give \ang[astroang]{30;5;3.2}
%    (suggested by Alok Singhal). \Completed
%\end{itemize}
%
%\section{Road map}
% The existing units packages provide valuable information on the
% problems and pitfalls of designing a package in this area.  They
% have also shown how to solve many of the issues arising.  However,
% in writing a new package, consistent interface design has been
% important.  This is logical to the package author, but may not be
% to anyone else.  The functionality provided also aims to cover
% everything from the existing packages and the suggestions
% contributed at \texttt{comp.text.tex}, but omissions are likely to
% exist.  The current release of \currpkg is therefore regarded as a
% development version, to gain feedback from users and to find
% errors.  The current ``road map'' for future releases is (broadly)
% given here.
%\begin{itemize}
%  \item[v0.6] Seek feedback on implementation to date (current
%    release);
%  \item[v0.7] Add or modify functionality based on feedback,
%    implement new suggestions for wish list;
%  \item[v0.8] Fix bugs from 0.7 release, interface freeze;
%  \item[v0.9] Release-candidate: fix remaining bugs from v0.8,
%    complete remaining documentation;
%  \item[v1.0] First release of completed package.
%\end{itemize}
% Depending on user feedback, the gap between these releases will
% vary. However, to finalise all of the potential issues will take
% some months (to allow time for proper testing).
%
%\part{Using the \currpkg package}
%\section{Requirements}
% \currpkg requires a reasonably up to date \TeX\ system.  The
% package requires \eTeX-extensions, which should be available on
% most systems.\footnote{If you have an old \LaTeX\, try
% ``\texttt{elatex}'' rather than ``\texttt{latex}''.}  The following
% packages are also needed:
%\begin{itemize}
%  \item \pkg{array} and \pkg{xspace} from the \pkg{tools} bundle,
%    which should be available to everyone;
%  \item \pkg{xkeyval} This processes the option handling, and needs
%    to be at least v2.5;
%  \item \pkg{amstext} From the \AMS\TeX\ support bundle --- the
%    \AMS\ fonts are also needed to provide the default upright
%    \unitsym{\micro};
%\end{itemize}
% Hopefully most people using the package will have access to all of
% those items.
%
% To use the \opt{fraction=sfrac} option, the \pkg{xfrac} package is
% needed.  This needs various experimental \LaTeX3 packages.  As a
% result, \currpkg does not load \pkg{xfrac}.  If you want to use
% \opt{fraction=sfrac}, \emph{you} need to load \pkg{xfrac} in your
% preamble.  If the package is not loaded, \opt{fraction=sfrac} falls
% back on a \pkg{nicefrac}-like method.  The interested user should
% look at the \pkg{xfrac} documentation for reasons this might not be
% ideal.\footnote{On the other hand, some fractional units will look
% really bad with \cs{sfrac}.  Use this option with caution.}
%
%\section{Loading the package}
% \currpkg is loaded by the usual \LaTeX\ method.
%\begin{LaTeXexample}[\typesetcodeonly]
%  \usepackage{si}\\
%  \usepackage[key=option]{si}
%\end{LaTeXexample}
% As is shown in the example, the package can be loaded with one or
% more options, using the \pkg{keyval} system.  The full range of
% package options are described in Section~\ref{sec:options}; some
% options are described in the along with the appropriate user
% macros.  Most of the user macros accept the same \pkg{keyval}
% settings as an optional argument.
%
%\section{Numbers}
%\DescribeMacro{\num}
% Numbers are automatically formatted by the \cs{num} macro.  This
% takes one optional and one mandatory argument:
% \cs{num}\oarg{options}\marg{number}.  The contents of \meta{number}
% are automatically formatted, in a similar method to that used by
% \numprint.  The formatter removes ``hard'' spaces (\cs{,} and |~|),
% automatically identifies exponents (by default marked using |e| or
% |d|) and adds the appropriate spacing of large numbers.  A leading
% zero is added before a decimal marker, if needed; both |.| and |,|
% are recognised as decimal marker.
%\begin{LaTeXexample}
%  \num{1}    \num{123}     \num{12345}  \num{123456}\\
%  \num{0.1}  \num{0.123}   \num{0,1234} \num{.12345}\\
%  \num{1e10} \num{3.45d-4} \num{-e10}\\
%\end{LaTeXexample}
% Various error-checking systems are built into the package, so
% that if \meta{number} does not contain any numeric characters, a
% warning is issued.  Isolated signs are also detected.  The package
% recognises |(| and |)| as ``extra'' characters, which can be used to
% indicate the error in a number.\footnote{This is common in chemical
% crystallography.}
%\begin{LaTeXexample}
%  $\num{1.234(5)} = \num{1.234} \pm \num{0.005}$
%\end{LaTeXexample}
%
% A number of effects are available as options.  These are fully
% explained in Section~\ref{sec:options}.  Some of the more useful
% options are illustrated here.  By default, the output of the
% package is typeset in maths mode.  However, the use of the current
% text font can be forced.\footnote{This document is typeset using
% lowercase numbers in text mode, which emphasises the effect here.}
%\begin{LaTeXexample}
%  \num{1234567890} \num[mode=text]{1234567890}
%\end{LaTeXexample}
% \currpkg can automatically add zeros and signs to numbers.  This
% can be altered as desired.
%\begin{LaTeXexample}
%  \num{1.}  \num[padnumber=all]{1.}\\
%  \num{2}   \num[addsign=all]{2}\\
%  \num{3e4} \num[addsign=mant]{3e4} \num[addsign=all]{3e4}\\
%  \num{.5}  \num[padnumber=none]{.5}
%\end{LaTeXexample}
% The separation of digits can be turned on and off, and the output
% changed.
%\begin{LaTeXexample}
%  \num{1234}  \num[sepfour=true]{1234}\\
%  \num{12345} \num[digitsep=comma]{12345}\\
%  \num[digitsep=none]{12345}
%\end{LaTeXexample}
% The formatting of exponents is also customisable.
%\begin{LaTeXexample}
%  \num{1e10} \num[expproduct=cdot]{1e10}\\
%  \num{2e20} \num[exppower=5]{1e10}
%\end{LaTeXexample}
%
%\section{Tabular material}
% Centring numbers in tabular content is handled by a new column
% type, the |s| column.  This is based closely on the \pkg{dcolumn}
% method for centring numbers in columns, but adds the functionality
% of the \cs{num} macro.\footnote{The approach used is actually a
% combination of \pkg{dcolumn} for centring the material and
% \numprint for processing it.  It will therefore give rather
% different results than the \texttt{n} and \texttt{N} column types
% in \numprint.}
%
% By default, the decimal marker of the contents is placed at the
% centre of the column (Table~\ref{tbl:default}).  This is achieved
% by having a negative value for the key \opt{tabformat}.  The second
% method for centring content is to specify a number of digits before
% and after the decimal sign to be reserved by the package.  Thus in
% the example, \opt{tabformat=2.4} provides space for two digits
% before the decimal marker and four after.\footnote{The separator
% for the number of digits before and after the decimal mark may be
% essentially any non-numeric character. Thus \opt{tabformat=2.4},
% \opt{tabformat=2,4} and \opt{tabformat=2a4} all give the same
% result.}  If an integer is given as the argument of
% \opt{tabformat}, equal space is reserved before and after the
% decimal marker for numerals, and the column is typeset flush right.
% As is shown in the fourth column, any other options may also be set
% on a column-by-column basis.
%\begin{LaTeXexample}[\typesetfloatexample]
%  \begin{table}
%    \caption{Behaviour of \texttt{s} column type
%      \label{tbl:default}}
%    \centering
%    \begin{tabular}{ss[tabformat=2.4]s[tabformat=4]%
%      s[tabformat=2.4,decimalsign=comma]}
%    \toprule
%    {Some Values} & {Some Values} & {Some Values} & {Some Values} \\
%    \midrule
%     2.3456  &  2.3456  &  2.3456 &  2.3456 \\
%    34.2345  & 34.2345  & 34.2345 & 34.2345 \\
%    56.7835  & 56.7835  & 56.7835 & 56.7835 \\
%    90.473   & 90.473   & 90.473  & 90.473  \\
%    \bottomrule
%    \end{tabular}
%  \end{table}
%\end{LaTeXexample}
%
% Data not to be processed as a number should be protected by
% wrapping it in braces; this is most likely to be true for column
% headers (again as illustrated).  The contents of non-numeric cells
% are centred; this can be altered by using the standard
% \cs{multicolumn} macro. The use of digit separators in table
% columns is accounted for: extra space is reserved if digit
% separators will be added.
%
% The use of exponents in the body of tables is not recommended;
% unlike \numprint, \currpkg does not provide additional alignment of
% exponents.  Certain strange effects can also result from the
% exponent marker letters (by default |dDeE|) being picked up by the
% package in text in columns.  For example, using |<{after}| after a
% |s| column will add ``aftr'' at the end of each value.  To avoid
% this, wrap any problematic text in \emph{two} sets of braces (so
% for example, put |<{{after}}|). Alternatively, as part of the
% beginning of the table issue the command
%\begin{LaTeXexample}[\typesetcodeonly]
%  \sisetup{numexp={}}
%\end{LaTeXexample}
% after \cs{begin}|{table}|.
%
%\section{Angles}
%\DescribeMacro{\ang}
% Angles can be typeset using the \cs{ang} command.  This takes two
% arguments, \cs{ang}\oarg{options}\marg{angle}, where \meta{options}
% can be any of the package options to apply only to this value.
% \meta{angle} can be given either as a decimal number or as a
% semi-colon separated list of degrees, minutes and seconds, \ie\
% \cs{ang}\marg{decimal angle} or
% \cs{ang}|{|\meta{degrees}|;|\meta{minutes}|;|\meta{seconds}|}|. By
% default, no space is introduced between angles and the degrees,
% minutes and seconds markers.
%\begin{LaTeXexample}
%  \ang{10} \ang{12.3} \ang{4,5}\\
%  \ang{1;2;3} \ang{;;1}\\
%  \ang{+10;;} \ang{-0;1;}
%\end{LaTeXexample}
%
% By default, angles with no degrees (or minutes) are zero-filled;
% angles with degrees but no minutes or seconds are not filled.  This
% behaviour can be altered using the package options.
%\begin{LaTeXexample}
%  \ang{;;1} \ang[padangle=none]{;;1}\\
%  \ang{2;;} \ang[padangle=all]{2;;}\\
%  \sisetup{padangle=all} \ang{;3;} \ang{4;;} \ang{;;5}
%\end{LaTeXexample}
% The \cs{num} macro is used to typeset each number of the angle, so
% the options for \cs{num} also apply here.  The \opt{anglesep} value
% can be used to separate degrees, minutes and seconds.
%\begin{LaTeXexample}
%  \ang{1.05}   \ang[decimalsign=comma]{1.05}\\
%  \ang{3.6789} \ang[digitsep=comma]{3.6789}\\
%  \ang{9;8;7}  \ang[anglesep=thin]{9;8;7}
%\end{LaTeXexample}
% The degrees, minutes and seconds signs can be placed over the
% decimal sign using the \opt{astroang} option.  This is designed on
% the assumption that only the last number given has a decimal
% part.\footnote{The exact positioning of the symbols over the
% decimal marker is currently something of a guess.  Some feedback on
% the ``correct'' result would be very welcome.}
%\begin{LaTeXexample}
%  \ang{1;2;3.4}\\
%  \ang[astroang]{1;2;3.4}
%\end{LaTeXexample}
%
%\section{Units and values}
%\DescribeMacro{\SI}
% The core aim of \currpkg is correctly typesetting values which have
% units. The main output macro here is \cs{SI}, which has the same
% syntax as the equivalent macro in \sistyle and \unitsdef.  The
% \cs{SI} macro takes two mandatory arguments, in addition to the
% optional set up argument, and a second optional argument:
% \cs{SI}\oarg{options}\marg{number}\oarg{preunit}\marg{unit}.  The
% \meta{number} argument operates in exactly the same manner as the
% equivalent argument of the \cs{num} macro.  \meta{unit} will be
% typeset with a non-breakable space between it and the preceding
% number, with font control as outlined earlier.  Finally,
% \meta{preunit} is a unit to be typeset \emph{before} the numerical
% value (most likely to be a currency).  Some examples illustrate the
% general power of the macro.
%\begin{LaTeXexample}
%  \SI[mode=text]{1.23}{J.mol^{-1}.K^{-1}}\\
%  \SI{.23e7}{\candela}\\
%  \SI[per=slash]{1.99}[\pounds]{\per\kilogram}\\
%  \SI{70}{\metre\per\second}\\
%  \SI[per=frac,fraction=nice]{1,345}{\ampere\per\mole}\\
%\end{LaTeXexample}
% The use of unit macros outside of the \cs{SI} macro is described later
%
%\subsection{Literal units}
% Units can be input in two ways, inspired by \sistyle and \SIunits.
% The \sistyle-like method uses literal input.  Four characters have
% a special meaning:
%\begin{itemize}
%  \item |^| The superscript character is used without the usual
%    need for surrounding maths characters (|$|);
%  \item |.| and |,| The fullstop (point) symbol and comma are made
%    active, and produce the current contents of the \opt{unitsep}
%    option;
%  \item |~| The contents of the \opt{unitspace} option are typeset
%    by a tilde.
%\end{itemize}
% This allows ready input of units.
%\begin{LaTeXexample}
%  \SI{10}{kg.m.s^{-2}}\\
%  \SI{1.453}{g/cm^3}\\
%  \SI{33.562}{cd~s}\\
%  \SI[unitsep=cdot]{100}{m.s^{-2}}
%\end{LaTeXexample}
%
%\subsection{The unit interpreter}
% The second operation mode for the \cs{SI} macro is based on the
% behaviour of \SIunits.  Here, each unit, SI multiple prefixes and
% power is given a macro name.  These are entered in a method very
% similar to the reading of the unit name in English.
%\begin{LaTeXexample}
%  \SI{10}{\kilo\gram\metre\per\second\squared}\\
%  \SI{1.453}{\gram\per\cubic\centi\metre}\\
%  \SI{33.562}{\candela\second}\\
%  \SI[unitsep=cdot]{100}{\metre\per\Square\second}\\
%  \SI[prefix=power]{4.56}{\kilo\metre\per\second}
%\end{LaTeXexample}
% On its own, this is very similar to \SIunits, and is less
% convenient than the direct input method.\footnote{Users of \SIunits
% should note the lack of need for a \cs{usk}-type macro.}  However,
% the package allows you to define new unit macros; a large number of
% pre-defined abbreviations are also supplied.  More importantly, by
% defining macros for units, instead of literal values, new
% functionality is made available.  Units may be re-defined to give
% different output, and handling of reciprocal values can be altered.
%\begin{LaTeXexample}
%  \SI[per=frac,fraction=frac]{10}{\gram\metre\per\second\squared}\\
%  \SI[per=slash]{1.453}{\gram\per\cubic\centi\metre}\\
%  \SI{33.562}{\candela\second}\\
%  \SI[per=frac,fraction=nice]{100}{\metre\per\Square\second}
%\end{LaTeXexample}
% The unit processor will trap \emph{some} errors in the input and
% give the ``best guess'' result.  However, it is down to the user to
% check the output.
%
%\subsection{Powers of units}
%\DescribeMacro{\Square}
%\DescribeMacro{\squared}
%\DescribeMacro{\cubic}
%\DescribeMacro{cubed}
% Including powers in units is handled using a ``natural language''
% method.  Thus preceding a unit by \cs{Square} or \cs{cubic} with
% raise the unit to the appropriate power, while \cs{squared} or
% \cs{cubed} follow the unit they apply to.\footnote{The \cs{Square}
% macro is capitalised to avoid a name clash with \pkg{pstricks}.}
%\begin{LaTeXexample}
%  \SI{10}{\metre\squared}\\
%  \SI{20}{\Square\metre}\\
%  \SI{30}{\metre\cubed}\\
%  \SI{40}{\cubic\metre}
%\end{LaTeXexample}
%
%\DescribeMacro{\per}
% The \cs{per} macro intelligently creates reciprocal powers, and
% also adds the power $-1$ when appropriate.
%\begin{LaTeXexample}
%  \SI{10}{\per\second\squared}\\
%  \SI{20}{\per\Square\second}\\
%  \SI[per=frac,fraction=nice]{30}{\per\second\cubed}\\
%  \SI[per=slash]{40}{\per\cubic\second}\\
%  \SI{50}{\per\second}
%\end{LaTeXexample}
%
%\DescribeMacro{\tothe}
% For powers not defined above or with \cs{newpower}, the \cs{tothe}
% macro can be used ``in line'' to produce a power.  As follows from
% standard English usage, this comes after the
% unit.\footnote{Suggestions for a macro name for before the unit for
% the same job are welcome!}
%\begin{LaTeXexample}
%  \SI{16.86}{\metre\tothe{4}}\\
%  \SI{7.895}{\candela\tothe{0.5}}\\
%  \SI{7.895}{\newton\tothe{-6}}\\
%  \SI{1.34}{\per\kelvin\tothe{7}}
%\end{LaTeXexample}
%
%
%\subsection{Units with no values}
%\DescribeMacro{\unitsym}
% For typesetting the symbol for a unit on its own, with the full
% font control and without extra spaces, the \cs{unitsym} macro is
% provided.\footnote{The same effect can be achieved using the
% \cs{SI} macro with an empty numerical argument.}  The macro name
% avoids a clash with the functionality of the earlier packages, but
% is similar to \cs{ilu} from the \unitsdef package.
%\begin{LaTeXexample}
%  \SI{}{kg.m/s^2}\\
%  \unitsym{kg.m/s^2}\\
%  \unitsym[mode=text,unitsep=cdot]{\mole\per\cubic\deci\metre}
%\end{LaTeXexample}
%
%\subsection{Free-standing units}
% Users of the \unitsdef package will be a accustomed to using unit
% macros on their own (following a value) or with an optional
% argument containing a number.  In both cases, only a single unit
% macro could be used. \currpkg supports both operation modes, with
% the limitation that units trailing values loose font control of the
% value.
%\begin{LaTeXexample}
%  123\metre\\
%  \kelvin[123]\\
%  \sisetup{mode=text} \ampere[234]\\
%  6\second
%\end{LaTeXexample}
% When used in this way, the units \emph{do not} take an optional
% \pkg{keyval} argument.
%
%\subsection{Pre-defined units, prefixes and powers}
%\newcommand*{\csindex}[1]{%
%  \cs{#1}%
%  \expandafter\SpecialUsageIndex\csname#1\endcsname}
%\newcommand{\unitinfo}[1]{%
%  #1 & \csindex{#1} &
%  \expandafter\unitsym\expandafter{\csname#1\endcsname}}
%\begin{table}
%  \centering
%  \begin{tabular}{lll}
%    \toprule
%      \multicolumn{1}{c}{Unit} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Symbol} \\
%    \midrule
%    \unitinfo{kilogram}\\
%    \unitinfo{metre}\\
%    \unitinfo{second}\\
%    \unitinfo{mole}\\
%    \unitinfo{kelvin}\\
%    \unitinfo{ampere}\\
%    \unitinfo{candela}\\
%    \bottomrule
%  \end{tabular}
%  \caption{The seven base SI units}
%  \label{tbl:baseunits}
%\end{table}
% The package always defines the seven base SI units, irrespective of
% any package options given (Table~\ref{tbl:baseunits}). The kilogram
% is notable as by default it is a \emph{base} unit with a prefix.
% Thus, when the package is loaded with the option \opt{load=\{\}},
% \cs{kilo} and \cs{gram} \emph{are not defined}.
%
% By default, a number of additional definitions are created by the
% package.  These are controlled by the \opt{load} and \opt{noload}
% options. Unless specifically requested with the option
% \opt{noload=prefix}, \currpkg also defines the standard prefixes
% for powers of ten (Table~\ref{tbl:prefix}).  This leads to the
% redefinition of \cs{kilogram} as \cs{kilo}\cs{gram}.  The macro
% \cs{deka} is provided, as this is used as an alias for \cs{deca}
% in some places.
%\newcommand*{\prefixunitsym}[1]{\unitsym[prefix=number]{#1}}
%\newcommand*{\prefixinfo}[1]{%
%  #1 & \csindex{#1} &
%    \expandafter\prefixunitsym\expandafter{\csname#1\endcsname} &
%    \expandafter\unitsym\expandafter{\csname#1\endcsname}}
%\begin{table}
%  \centering
%  \begin{tabular}{lllclllc}
%    \toprule
%    \multicolumn{1}{c}{Prefix} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Power} &
%      Symbol &
%      \multicolumn{1}{c}{Prefix} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Power} &
%      Symbol \\
%    \midrule
%    \prefixinfo{yocto}&
%    \prefixinfo{atto}\\
%    \prefixinfo{femto}&
%    \prefixinfo{pico}\\
%    \prefixinfo{nano}&
%    \prefixinfo{micro}\\
%    \prefixinfo{milli}&
%    \prefixinfo{centi}\\
%    \prefixinfo{deci}&
%    \prefixinfo{deca}\\
%    \prefixinfo{hecto}&
%    \prefixinfo{kilo}\\
%    \prefixinfo{mega}&
%    \prefixinfo{giga}\\
%    \prefixinfo{tera}&
%    \prefixinfo{peta}\\
%    \prefixinfo{exa}&
%    \prefixinfo{zetta}\\
%    \prefixinfo{yotta}\\
%    \bottomrule
%  \end{tabular}
%  \caption{The SI prefixes (\opt{load=prefix})}
%  \label{tbl:prefix}
%\end{table}
% The package also defines a number of derived SI units which have
% assigned names and symbols (Table~\ref{tbl:derived}).  Note that
% \cs{Gray} is capitalised to avoid a name clash with the
% \pkg{pstricks} package.\footnote{The macros \cs{ohm} and
% \cs{celsius} are not defined by \currpkg if the \pkg{gensymb}
% package is loaded.}
%\begin{table}
%  \centering
%  \begin{tabular}{llllll}
%    \toprule
%      \multicolumn{1}{c}{Unit} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Symbol} &
%      \multicolumn{1}{c}{Unit} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Symbol} \\
%    \midrule
%    \unitinfo{becquerel} &
%    \unitinfo{celsius} \\
%    \unitinfo{coulomb} &
%    \unitinfo{farad} \\
%    \unitinfo{Gray} &
%    \unitinfo{hertz} \\
%    \unitinfo{henry} &
%    \unitinfo{joule} \\
%    \unitinfo{katal} &
%    \unitinfo{lumen} \\
%    \unitinfo{lux} &
%    \unitinfo{newton} \\
%    \unitinfo{ohm} &
%    \unitinfo{pascal} \\
%    \unitinfo{radian} &
%    \unitinfo{siemens} \\
%    \unitinfo{sievert} &
%    \unitinfo{steradian}\\
%    \unitinfo{tesla} &
%    \unitinfo{volt} \\
%    \unitinfo{watt} &
%    \unitinfo{weber} \\
%    \bottomrule
%  \end{tabular}
%  \caption{The derived SI units with defined names
%    (\opt{load=derived})}
%  \label{tbl:derived}
%\end{table}
% In addition to these units, there are three other groups of units
% for use with the SI system which do not fit into the above.  These
% are those derived from physical measurements
% (Table~\ref{tbl:experimental}), those considered ``accepted''
% (Table~\ref{tbl:accepted}), and those accepted temporarily
% (Table~\ref{tbl:addn}).\footnote{These are supposed to be replaced
% over time by SI units.}
%\begin{table}
%  \centering
%  \begin{tabular}{lll}
%    \toprule
%      \multicolumn{1}{c}{Unit} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Symbol} \\
%    \midrule
%    electron volt & \csindex{electronvolt} & \electronvolt \\
%    atomic mass unit
%      & \csindex{atomicmassunit} & \atomicmassunit \\
%      & \csindex{atomicmass} & \atomicmass \\
%    \unitinfo{dalton} \\
%    \bottomrule
%  \end{tabular}
%  \caption{Units derived from experiments
%    (\opt{load=physical})}.
%  \label{tbl:experimental}
%\end{table}
%\begin{table}
%  \centering
%  \begin{tabular}{lll}
%    \toprule
%      \multicolumn{1}{c}{Unit} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Symbol} \\
%    \midrule
%    \unitinfo{minute} \\
%    \unitinfo{hour} \\
%    day & \csindex{Day} & \Day \\
%    \unitinfo{degree} \\
%    minute (arc) & \csindex{arcmin} & \arcmin \\
%    second (arc) & \csindex{arcsec} & \arcsec \\
%    \unitinfo{litre} \\
%    \unitinfo{tonne} \\
%    \unitinfo{neper} \\
%    \unitinfo{bel} \\
%    \unitinfo{percent} \\
%    \bottomrule
%  \end{tabular}
%  \caption{Units accepted for use with SI
%    (\opt{load=accepted})}.
%  \label{tbl:accepted}
%\end{table}
%\begin{table}
%  \centering
%  \begin{tabular}{lll}
%    \toprule
%      \multicolumn{1}{c}{Unit} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Symbol} \\
%    \midrule
%    {\aa}nstr{\"o}m & \csindex{angstrom} & \angstrom \\
%    \unitinfo{are} \\
%    \unitinfo{hectare} \\
%    \unitinfo{barn} \\
%    bar & \csindex{BAR} & \BAR \\
%    \unitinfo{millibar} \\
%    \unitinfo{gal} \\
%    \unitinfo{curie} \\
%    \unitinfo{roentgen} \\
%    \unitinfo{rad} \\
%    \unitinfo{rem} \\
%    \bottomrule
%  \end{tabular}
%  \caption{Additional (temporary) SI units
%    (\opt{load=addn})}
%  \label{tbl:addn}
%\end{table}
%
%\subsection{Prefixed and abbreviated units}
% Many basic units have prefixes which are commonly used with the
% unit, such as centimetre or megahertz.  The package therefore
% defines a number of common prefixed units (\opt{load=prefixed}).
% Several of these also have obvious abbreviations (such as \cs{MHz}
% for \cs{megahertz}).  These are available by loading the
% \file{si-abbr.cfg} file (\ie\ \opt{load=abbr}).  In common with the
% units discussed above, the prefixed and abbreviated unit
% definitions are loaded by default.
%\begin{longtable}{llll}
%    \caption{Prefixed (\opt{load=prefixed}) and abbreviated
%      (\opt{load=abbr}) units\label{tbl:abbr} }\\
%    \toprule
%    Unit & Macro & Symbol & Abbreviation \\
%    \midrule
%  \endfirsthead
%    \toprule
%    Unit & Macro & Symbol & Abbreviation \\
%    \midrule
%  \endhead
%    \bottomrule
%    \multicolumn{4}{r}{\emph{Continued on next page}}
%  \endfoot
%    \bottomrule
%  \endlastfoot
%  \emph{Masses} \\
%  \unitinfo{kilogram} & \csindex{kg} \\
%  \unitinfo{femtogram} & \csindex{fg} \\
%  \unitinfo{picogram} & \csindex{pg} \\
%  \unitinfo{nanogram} & \csindex{nanog} \\
%  \unitinfo{microgram} & \csindex{micg} \\
%  \unitinfo{milligram} & \csindex{mg} \\
%  atomic mass & \csindex{atomicmass} & \amu & \csindex{amu} \\
%  \\ \emph{Lengths} \\
%  \unitinfo{picometre} & \csindex{picom} \\
%  \unitinfo{nanometre} & \csindex{nm} \\
%  \unitinfo{micrometre} & \csindex{micm} \\
%  \unitinfo{millimetre} & \csindex{mm} \\
%  \unitinfo{centimetre} & \csindex{cm} \\
%  \unitinfo{decimetre} & \csindex{dm} \\
%  \unitinfo{kilometre} & \csindex{km} \\
%  \\ \emph{Times} \\
%  \unitinfo{second} & \csindex{Sec} \\
%  \unitinfo{attosecond} & \csindex{as} \\
%  \unitinfo{femtosecond} & \csindex{fs} \\
%  \unitinfo{picosecond} & \csindex{ps} \\
%  \unitinfo{nanosecond} & \csindex{ns} \\
%  \unitinfo{microsecond} & \csindex{mics} \\
%  \unitinfo{millisecond} & \csindex{ms} \\
%  \\ \emph{Moles} \\
%  \unitinfo{femtomole} & \csindex{fmol} \\
%  \unitinfo{picomole} & \csindex{pmol} \\
%  \unitinfo{nanomole} & \csindex{nmol} \\
%  \unitinfo{micromole} & \csindex{micmol} \\
%  \unitinfo{millimole} & \csindex{mmol} \\
%  \\ \emph{Currents} \\
%  \unitinfo{picoampere} & \csindex{pA} \\
%  \unitinfo{nanoampere} & \csindex{nA} \\
%  \unitinfo{microampere} & \csindex{micA} \\
%  \unitinfo{milliampere} & \csindex{mA} \\
%  \unitinfo{kiloampere} & \csindex{kA} \\
%  \\ \emph{Areas} \\
%  \unitinfo{squaremetre} \\
%  \unitinfo{squarecentimetre} \\
%  \unitinfo{squarekilometre} \\
%  \\ \emph{Volumes} \\
%  \unitinfo{millilitre} & \csindex{ml} \\
%  \unitinfo{microlitre} & \csindex{micl} \\
%  \unitinfo{centimetrecubed} & \csindex{cmc} \\
%    & \csindex{centimetrecubed} & \cmc & \csindex{cmc} \\
%  \unitinfo{cubicdecimetre} & \csindex{dmc} \\
%  \\ \emph{Frequencies} \\
%  \unitinfo{hertz} & \csindex{Hz} \\
%  \unitinfo{millihertz} & \csindex{mHz} \\
%  \unitinfo{kilohertz} & \csindex{kHz} \\
%  \unitinfo{megahertz} & \csindex{MHz} \\
%  \unitinfo{gigahertz} & \csindex{GHz} \\
%  \unitinfo{terahertz} & \csindex{THz} \\
%  \\ \emph{Potentials} \\
%  \unitinfo{millivolt} & \csindex{mV} \\
%  \unitinfo{kilovolt} & \csindex{kV} \\
%  \\ \emph{Energies} \\
%  \unitinfo{kilojoule}  & \csindex{kJ}\\
%  \unitinfo{electronvolt} & \csindex{eV} \\
%  \unitinfo{millielectronvolt} & \csindex{meV} \\
%  \unitinfo{kiloelectronvolt} & \csindex{keV} \\
%  \unitinfo{megaelectronvolt} & \csindex{MeV} \\
%  \unitinfo{gigaelectronvolt} & \csindex{GeV} \\
%  \unitinfo{teraelectronvolt} & \csindex{TeV} \\
%  \\ \emph{Powers} \\
%  \unitinfo{milliwatt} \\
%  \unitinfo{kilowatt} \\
%  \unitinfo{megawatt} \\
%  \\ \emph{Capacitance} \\
%  \unitinfo{femtofarad} \\
%  \unitinfo{picofarad} \\
%  \unitinfo{nanofarad} \\
%  \unitinfo{microfarad} \\
%  \unitinfo{millifarad} \\
%  \\ \emph{Resistance} \\
%  \unitinfo{kiloohm} \\
%  \unitinfo{megaohm} \\
%  \unitinfo{gigaohm} \\
%  \unitinfo{millisiemens} \\
%  \\ \emph{Forces} \\
%  \unitinfo{millinewton} \\
%  \unitinfo{kilonewton} \\
%  \\ \emph{Other units} \\
%  \unitinfo{hectopascal} \\
%  \unitinfo{megabecquerel} \\
%  \unitinfo{millisievert} \\
%\end{longtable}
%
%\subsection{Specialist units}
%\DescribeMacro{\mmHg}
%\DescribeMacro{\molar}
%\DescribeMacro{\molar}
% In some subject area, there are units which are in common use even
% though they are outside of the SI system.  Unlike the units
% discussed earlier, these specialist units are not loaded by default.
%  \currpkg comes with the predefined files \opt{alsoload=chemistry}
% and \opt{alsoload=hep}. The later defines the units from the
% \pkg{hepunits} package not provided elsewhere here.  The former
% adds the common chemistry units \cs{mmHg}, \cs{molar} and
% \cs{Molar}.  The \cs{Molar} macro is somewhat awkward, as it can be
% given as either ``\textsc{m}'' or ``M''.  The later is obviously
% easily confused with the sign for the prefix mega.
%
%\DescribeMacro{\bit}
%\DescribeMacro{\byte}
% The package also comes with equipped for \opt{alsoload=binary}.
% This provides the binary units and prefixes.  The extra units
% are \cs{bit} and \cs{byte}, with the new prefixes listed in
% Table~\ref{tbl:binary}.
%\begin{table}
%  \centering
%  \begin{tabular}{ll>{$}c<{$}}
%    \toprule
%      \multicolumn{1}{c}{Prefix} &
%      \multicolumn{1}{c}{Macro} &
%      \multicolumn{1}{c}{Power} \\
%    \midrule
%    kibi & \csindex{kibi} & 2^{10} \\
%    mebi & \csindex{mebi} & 2^{20} \\
%    gibi & \csindex{gibi} & 2^{30} \\
%    tebi & \csindex{tebi} & 2^{40} \\
%    pebi & \csindex{pebi} & 2^{50} \\
%    exbi & \csindex{exbi} & 2^{60} \\
%    \bottomrule
%  \end{tabular}
%  \caption{Binary prefixes
%    (\opt{alsoload=binary})}.
%  \label{tbl:binary}
%\end{table}
%
%\subsection{Defining new units}
%\DescribeMacro{\newunit}
%\DescribeMacro{\renewunit}
%\DescribeMacro{\provideunit}
% New units are produced using the \cs{newunit} macro.  This works as
% might be expected:
% \cs{newunit}\oarg{options}\marg{unit}\marg{symbol}, where
% \meta{symbol} can contain literal values, other units, multiple
% prefixes, powers and \cs{per}.  The \meta{options} argument can be
% any suitable options, and applies to this unit only The most
% obvious example for using this macro is the \cs{degree}
% unit.\footnote{Although the \cs{ang} macro is preferred for this
% job.}  The (first) optional argument to \cs{SI} and \cs{unitsym}
% can be used to override the settings for the unit.
%\begin{LaTeXexample}
%  \SI{3.1415}{\degree}\\
%  \newunit[valuesep=none]{\oddunit}{XXX}\\
%  \SI{12345}{\oddunit}
%  \SI[valuesep=thick]{67890}{\oddunit}
%\end{LaTeXexample}
%
% Output that is only safe in maths mode should be protected with
% \cs{ensuremath}; text-only input requires \cs{text}.  In the
% example below, \cs{mathnormal} is used to force the font choice
% only for the single character.\footnote{The \cs{mathrm} font used
% for this document has an ``\ss'' at the $\pi$ position.}
%\begin{LaTeXexample}
%  \newunit{\SIpi}{\ensuremath{\mathnormal{\pi}}}
%  \SI{10}{\metre\per\SIpi\squared}
%\end{LaTeXexample}
%
%\DescribeMacro{\newpower}
%\DescribeMacro{\renewpower}
%\DescribeMacro{\providepower}
% Powers are defined: \cs{newpower}\oarg{post}\marg{power}\marg{num}.
% \meta{power} is the name of the power macro, an \meta{num} is the
% (positive) number it represents.  The later argument is always
% processed internally by \cs{num}, but \emph{must} be a number.
% Giving the optional argument \opt{post} indicates to the package
% that the power will come after the unit it applies to; by default
% it is assumed that it will come before.
%\begin{LaTeXexample}
%  \newpower{\quartic}{4}
%  \newpower[post]{\totheforth}{4}\\
%  \unitsym{\kilogram\totheforth}\\
%  \unitsym{\quartic\metre}
%\end{LaTeXexample}
%
%\DescribeMacro{\newprefix}
%\DescribeMacro{\renewprefix}
%\DescribeMacro{\provideprefix}
% The standard SI powers of ten are defined by the package, and are
% described above.  However, the user can define new prefixes with
% \cs{newprefix}.  This has syntax
% \cs{newunit}\marg{prefix}\marg{symbol}\marg{powers-ten}, where
% \meta{powers-ten} is the number of powers of ten the prefix
% represents.  For example, \cs{kilo} is defined:
%\begin{LaTeXexample}[\typesetcodeonly]
%  \newprefix{\kilo}{k}{3}
%\end{LaTeXexample}
%
%\section{Font control}
% Following the lead of \sistyle, \currpkg provides control over the
% font used to typeset output.  By default, all text is typeset using
% the current upright serif maths font, whether the macros are given
% in text or maths mode.  Some examples will show the effect.
%\begin{LaTeXexample}
%  \num{10} $\num{10}$ \\
%  \sffamily \ang{20} $\ang{20}$ \\
%  \textbf{\SI{30}{\kilo\gram}}\\
%  \boldmath $\SI{30}{\kilo\gram}$ \\
%  \[ \num{50} \]
%\end{LaTeXexample}
%
% By giving the \opt{obeyfamily} option, the surrounding font family
% (serif, sans serif, fixed width) is used for inline materials.
% Inside the display maths environments, the currently active maths
% font is used.  The \opt{obeybold} option causes the bold setting to
% be obeyed in the same way.
%\begin{LaTeXexample}
%  \sisetup{obeyfamily,obeybold,obeyitalic} \\
%  \ang{1;1;1} $\ang{1;1;1}$ \\
%  \sffamily \ang{2;2;2} $\ang{2;2;2}$ \\
%  \textbf{\ang{3;3;3}} \boldmath $\ang{3;3;3}$ \\
%  \sisetup{mode=text} \emph{\ang{4;4;4}} $\ang{4;4;4}$ \\
%  \[ \ang{5;5;5} \]
%\end{LaTeXexample}
%
%\section{Package options\label{sec:options}}
%\DescribeMacro{\sisetup}
% The ``native'' options for the package are all given using the
% \pkg{keyval} methods. Most of the package options can be given both
% when loading the package and at any point in the document.  This is
% achieved using the \cs{sisetup} macro.
%
%\newcommand*{\choiceopt}[1][option]{\opt{#1=\meta{choice}}\xspace}
%\newcommand*{\boolopt}[1][option]{\opt{#1=\meta{bool}}\xspace}
%\newcommand*{\litopt}[1][option]{\opt{#1=\meta{literal}}\xspace}
%\newcommand*{\choicelitopt}[1][option]
%  {\opt{#1=\meta{choice,literal}}\xspace}
%\newcommand*{\macopt}[1][option]{\opt{#1=\meta{macro}}\xspace}
%\newcommand*{\numopt}[1][option]{\opt{#1=\meta{number}}\xspace}
%\newcommand*{\listopt}[1][option]{\opt{#1=\meta{list}}\xspace}
%\newcommand*{\lenopt}[1][option]{\opt{#1=\meta{length}}\xspace}
% The package options take a number of different forms.
%\begin{itemize}
%  \item \boolopt Simple true/false values.  These macros all default
%    to \opt{true}, so giving the option name alone sets the flag to
%    true.
%  \item \choiceopt Take a single item from a pre-determined list.
%    Depending on the value, one or more internal states will be
%    altered.  Values not on the list are ignored.  The default value
%    is given in bold.
%  \item \choicelitopt If the given value is a \meta{choice}, then
%    the internal settings for that choice are used.  Any other value
%    is used directly.  As with simple choice options, the default is
%    given in bold.
%  \item \litopt The given value is used as a literal by the package.
%  \item \macopt These options expect a macro name as a value; the
%    macro name is then used by the package.  Note that the name does
%    \emph{not} include the leading \textbackslash.
%  \item \lenopt Requires a \TeX\ lengths, for example
%    \opt{0.5ex}.
%  \item \listopt Takes a list of one or more items, which are not
%    determined in advance.
%\end{itemize}
%
% The package has a large range of options, to allow full control of
% the various features of the package.  These control differing
% aspects of the package, and are given below in groups based on
% function.
%
%\subsection{Font family and style}
% The font used when typesetting material can be tightly controlled
% using \currpkg.  A number of options affect how the package matches
% the surrounding font, and the font families used to achieve this.
%\begin{itemize}
%  \item \boolopt[obeyfamily] By default, the font family used for
%    typesetting does \emph{not} match the surroundings.  This is
%    altered using the \opt{obeyfamily} switch; when active, serif
%    (Roman), sans serif and typewriter fonts are detected.
%  \item \choiceopt[mode] The output of \currpkg can be typeset
%    using either text or maths fonts.  By default, maths mode is
%    used, but this can be altered setting the \opt{mode} option
%    to \opt{text}.
%  \item \boolopt[textmode] A shortcut for \opt[mode=text].
%  \item \boolopt[obeymode] The package can detect and use the
%    surrounding maths or text mode, if requested.  Default is
%    \opt{false}.
%  \item \boolopt[obeybold] If the typeset text should obey the local
%    value of the bold setting, then this option should be set: the
%    default is false.
%  \item \choiceopt[inlinebold] For inline maths, the package
%    can check either the surrounding maths or the surrounding text.
%    The options here are \textbf{\opt{text}} and\opt{maths} (or
%    \opt{math}).
%  \item \boolopt[obeyitalic] Italic \latin{versus} upright shape
%    is handled slightly differently to bold.  The option works in
%    text mode, but has no effect in maths mode.  This is because
%    font changes plus italic is not possible in maths mode (for
%    example, see the result of |$\mathit{\mathrr{10}}$|.
%  \item \macopt[mathdefault] The default shape used for text printed
%    in maths mode. The default is the value stored in \opt{mathrm}.
%  \item \macopt[textdefault] The default shape used for text printed
%    in text mode. The default is the value stored in \opt{mathrm}.
%  \item \macopt[mathnumdefault] The default shape used for numbers
%    printed in maths mode. The default is the value stored in
%    \opt{mathrm}.
%  \item \macopt[textnumdefault] The default shape used for numbers
%    printed in text mode. The default is the value stored in
%    \opt{mathrm}.
%  \item \macopt[mathrm]  The font command used in maths mode when
%    the surrounding text is serif. The default is \opt{mathrm}; the
%    other maths font defaults follow the same pattern.
%  \item \macopt[mathsf]  The font command used in maths mode when
%    the surrounding text is sans serif.
%  \item \macopt[mathrm]  The font command used in maths mode when
%    the surrounding text is fixed width.
%  \item \macopt[textrm] The font command used in text mode when
%    the surrounding text is serif.  The default is \opt{rmfamily};
%    the other text font defaults follow the same pattern.
%  \item \macopt[textsf] The font command used in text mode when
%    the surrounding text is sans serif.
%  \item \macopt[texttt] The font command used in text mode when
%    the surrounding text is fixed width.
%\end{itemize}
%
%\subsection{Spacing and separators}
% The spacings used between items are all user-definable.  This is
% also true for the separators used for decimals, \etc.
%\begin{itemize}
%  \item \choicelitopt[unitsep] This defines the separation of
%    different unit symbols.  The \meta{list} takes values
%    \opt{\textbf{thin}}, \opt{medium} (alias \opt{med}), \opt{thick}
%    (all maths spacings), \opt{space} (a full space), \opt{cdot} (a
%    centred dot) and \opt{times}. \meta{literal} values are typeset
%    in maths mode.
%  \item \choicelitopt[unitspace] The spacing represented by an
%    explicit hard space (|~|) inside a unit macro.  Takes the same
%    list as \opt{valuesep}.
%  \item \choicelitopt[valuesep] Defines the separation between a
%    value and the associated unit.  Valid \meta{list} values are
%    \opt{\textbf{thin}}, \opt{medium} (alias \opt{med}),
%    \opt{thick}, \opt{space} and \opt{none}.
%  \item \choicelitopt[digitsep] The separation (if any) between
%    groups of digits in large numbers. Valid \meta{list} values are
%    \opt{\textbf{thin}}, \opt{medium} (alias \opt{med}),
%    \opt{thick}, \opt{space}, \opt{comma}, \opt{fullstop} (aliases
%    \opt{stop} and \opt{period}) and \opt{none}.
%  \item \choicelitopt[decimalsign] The decimal sign, either
%    \opt{comma} or \opt{\textbf{fullstop}} (also aliased as
%    \opt{stop} and \opt{period}).
%  \item \choicelitopt[anglesep] The separator between degrees,
%    minutes and seconds in an angle.  The options are \opt{thin},
%    \opt{medium} (alias \opt{med}), \opt{thick} and
%    \opt{\textbf{none}}.
%\end{itemize}
%
%\subsection{Number formatting}
% There are two types of option for numbers.  The first set are
% concerned with parsing numbers, and are very similar to the
% settings in \numprint.  These all begin \opt{num}, and take literal
% values.  Notice that the literals are \emph{not} separated in any
% way in the input.
%\begin{itemize}
%  \item \litopt[numlist] The characters which are numbers:
%    \opt{\textbf{01234567890}}.
%  \item \litopt[numdecimal] Decimal markers: \opt{\textbf{.,}}
%  \item \litopt[numexp] Exponent markers: \opt{\textbf{edED}}
%  \item \litopt[numgobble] Characters to be gobbled when processing
%    numbers: no default
%  \item \litopt[numsign] Signs (which must be at the start of a
%    number): \opt{\textbf{+-\cs{pm}\cs{mp}}}
%  \item \litopt[numextra] ``Extra'' characters, to be carried
%    through directly to the output: \opt{\textbf{()}}
%\end{itemize}
%
% The second type of option for numbers controls the output.
%\begin{itemize}
%  \item \choiceopt[addsign] Sets whether a sign is added to numbers
%    without an explicit sign given.  Valid choices are
%    \opt{mantissa} (or \opt{mant}), \opt{exponent} (or \opt{exp}),
%    \opt{both} (or \opt{all}) and \opt{\textbf{none}}.The option
%    will also act as a Boolean, taking \opt{true} and opt{false},
%    with \opt{addsign} alone equal to giving the \opt{true} (=
%    \opt{all}) value.
%  \item \choicelitopt[sign] The sign used by the above.  Choices are
%    \opt{\textbf{plus}}, \opt{minus}, \opt{pm} and \opt {mp} ($\pm$
%    and $\mp$, respectively).  The sign will always be typeset in
%    maths mode.
%  \item \boolopt[sepfour] When separating out numbers (using
%    \opt{digitsep}), four-digit numbers can be skipped.  This is
%    the default.
%  \item \choicelitopt[expproduct]  The symbol used to indicate a
%    product for exponents (\ie\ the $\times$ in \num{2e2}).  The
%    choices are \opt{\textbf{times}} and \opt{cdot}.
%  \item \choicelitopt[exppower] Slightly esoterically, the power
%    used for exponents can be altered.  The ``choice'' list here
%    only recognises \opt{ten}; anything else is used literally.
%  \item \choiceopt[padnumber] This sets where zeros are added. The
%   choices are \opt{\textbf{leading}} (a leading zero added to
%   |.1|), \opt{trailing} (converts |1.| to \num{1.0}), \opt{all}
%   (\opt{leading} and \opt{trailing}, also available as \opt{both})
%   and \opt{none} (no zeros added).  The option will also act as a
%   Boolean, taking \opt{true} and opt{false}, with \opt{padnumber}
%   alone equal to giving the \opt{true} (= \opt{all}) value.
%\end{itemize}
%
%\subsection{Angle formatting}
% The angle formatter uses \cs{num} to format numbers; any options
% for numbers are therefore applicable here. When typesetting an
% angle using \cs{ang}, the following extra option is also relevant.
%\begin{itemize}
%  \item \choiceopt[padangle] Determines whether small and large
%    angles are padded.  The choices are \opt{none} (no additional
%    zeros are added), \opt{\textbf{small}} (angles with no degrees
%    have \ang{0;;} added), \opt{large} (angles with no seconds have
%    \ang[padangle=none]{;;0} added) and \opt{all} (\opt{small} and
%    \opt{large} combined).  The option also recognises \opt{true}
%    and \opt{false} as choices, which are equal to \opt{all} and
%    \opt{none}, respectively.  If no value is given, \opt{padangle}
%    acts a Boolean choice.
%  \item \boolopt[astroang] Astronomers place the signs for angles
%    over decimal signs; this is handled here.
%\end{itemize}
%
%\subsection{Tabular material}
% The formatting of data in |s| columns is controlled by a single
% package option.
%\begin{itemize}
%  \item \numopt[tabformat] The number here determines how to centre
%    decimal numbers in a column.  If \opt{number} is zero or
%    negative, then the decimal marker is placed at the centre of the
%    column with the number symmetrically placed around it.  If
%    \opt{number} is positive, it is interpreted
%    |\meta{pre}.\meta{post}|, where \meta{pre} is the number of
%    digits before the decimal marker and \meta{post} is the number
%    after.  Appropriate space is reserved to centre a number of
%    total length \meta{pre} $+$ \meta{post} (plus the decimal
%    marker).  If the digits supplied are too long, overfull boxes
%    will result.  If only \meta{pre} is given, an equal amount of
%    space is reserved before and after the decimal marker, and the
%    number is typeset flush right.
%\end{itemize}
%
%\subsection{Units}
% The output of units (as opposed to the numerical argument of the
% unit) takes only a few options.
%\begin{itemize}
%  \item \boolopt[xspace] Determines whether to use \pkg{xspace} at
%    the end of unit macros when not given inside \cs{SI}, for
%    example |10\metre away| will give \sisetup{xspace} ``10\metre
%    away'' with \opt{xspace} turned on, but \sisetup{xspace=false}
%    ``10\metre away'' with it turned off.\sisetup{xspace}
%  \item \choiceopt[per] Affects how \cs{per} is interpreted in
%    units.  The options available are \textbf{\opt{reciprocal}}
%    (also available as \opt{rp} and \opt{power}), \opt{slash}  and
%    \opt{fraction} (or \opt{frac}).
%  \item \choiceopt[fraction] When using \opt{per=frac}, further control
%    of the appearance of the fraction is provided.  The options
%    available are \opt{frac} (uses \LaTeX\ \cs{frac} operation),
%    \opt{nice} (also available as \opt{nicefrac}; uses a
%    \pkg{nicefrac}-like system), \opt{ugly} (also \opt{uglyfrac};
%    the same as loading \pkg{nicefrac} with the \opt{ugly} option:
%    uses \cs{frac} for material in maths mode and a slash for
%    material in text mode) and \opt{sfrac} (uses the \cs{sfrac}
%    macro from the \pkg{xfrac} package.\footnote{\pkg{xfrac} is part
%    of the experimental system for \LaTeX3.  As it requires a number
%    of additional packages to work, \currpkg does not load
%    \pkg{xfrac}.  If it is unavailable, the \opt{sfrac} setting will
%    fall back to using \cs{nicefrac}.  See the \pkg{xfrac}
%    documentation for reasons to prefer \cs{sfrac} to
%    \cs{nicefrac}.}
%  \item \litopt[denlbrac] and \litopt[denrbrac] When using
%    \opt{per=slash}, using two or more units in the denominator
%    gives an ambiguous fraction.  The package therefore adds
%    \opt{denlbrac} and \opt{denrbrac} in such cases.
%  \item \choiceopt[prefix] Controls how prefixes to units
%    are handled, with options \textbf{\opt{symbol}} (or
%    \opt{letter}) and \opt{number} (or \opt{power}).
%  \item \choicelitopt[prefixpower] and \choiceopt[prefixproduct]
%    Works in the same way as the general exponent equivalents, but
%    only for prefix modifiers.
%\end{itemize}
%
%\subsection{Symbols}
% User access to control the symbols used for \unitsym{\micro},
% \unitsym{\ohm}, \unitsym{\angstrom}, \unitsym{\degree} and
% \unitsym{\celsius} is provided here. These are all literal options,
% which are available in text and maths mode variants.  For example,
% \opt{textmicro} is the code used for the \unitsym{\micro} symbol in
% text mode.  The text mode macros should be safe when forced into
% text, and the maths ones when forced into maths.
%\begin{itemize}
%  \item \opt{textOmega}
%  \item \opt{mathsOmega}
%  \item \opt{textmu}
%  \item \opt{mathsmu}
%  \item \opt{textdegree}
%  \item \opt{mathsdegree}
%  \item \opt{textminute}
%  \item \opt{mathsminute}
%  \item \opt{textsecond}
%  \item \opt{mathssecond}
%  \item \opt{textringA}
%  \item \opt{mathsringA}
%  \item \opt{textcelsius}
%  \item \opt{mathscelsius}
%\end{itemize}
%
% When \currpkg is loaded, it can check for the presence of the
% \pkg{textcomp} and \pkg{upgreek} packages, to provide better
% symbols for certain items. To prevent this, us the
% \opt{redefsymbols=false} option.
%
% The \unitsym{\electronvolt} symbol requires some fine-tuning, and
% so has two options of its own.
%\begin{itemize}
%  \item \lenopt[eVcorra] The correction applied to the gap between
%    ``e'' and ``V'' of the unit.  The default is \opt{0.3ex}.
%  \item \lenopt[eVcorrb] The correction applied to the gap between
%    ``V'' of the unit and whatever follows.  The default is
%    \opt{0ex}; a change is needed for example in
%    |\unitsym[per=slash]{\electronvolt\per\metre}|, which gives
%    \unitsym[per=slash]{\electronvolt\per\metre} by default, but
%    \unitsym[per=slash,eVcorrb=0.7ex]{\electronvolt\per\metre} by
%    setting \opt{eVcorrb=0.7ex}.  The value needed will depend
%    on the use of the unit and the font metrics used.
%\end{itemize}
%
%\subsection{Package control}
% These macros alter the overall behaviour of the package.
%\begin{itemize}
%  \item \listopt[load] Sets which additional configuration files are
%    loaded.  These all have names of the form
%    \file{si-\meta{option}.cfg}, where \meta{option} should be given
%    in the \opt{load} list.  The package recognises the
%    \opt{load=default} option, which is expanded to the standard list
%    of loaded files.  This is to allow easy addition of one or more
%    files without needing to know the default list.
%  \item \listopt[noload] Excludes files from the above from being
%    loaded, so that a single file can be omitted without needing to
%    type a long list of those to be used.
%  \item \listopt[alsoload] Adds an item to the list to be loaded,
%    without needing to specify all of the existing list.
%  \item \choiceopt[log] Sets the amount of information written to
%    the log by \currpkg.  The \meta{list} is \opt{none},
%    \opt{errors}, \textbf{\opt{normal}} and \opt{debug}.  The last
%    option is also available as a Boolean, and gives \emph{lots} of
%    information in the log.
%  \item \choiceopt[emulate] Causes \currpkg to emulate the
%    given package. The \meta{list} takes values \opt{SIunits},
%    \opt{sistyle}, \opt{units} and \opt{unitsdef}.
%    This option can only be used when loading the package.
%\end{itemize}
%
%\subsection{Back-compatibility options}
% As well as the options outlined above, at load time a number of
% options are available to allow \currpkg to be used as a direct
% replacement for other unit-management packages.  These are the same
% options as are available in \SIunits, \sistyle, \unitspkg, and
% \unitsdef. Using a legacy option will cause the package to load the
% appropriate emulation code
%
%\section{Emulation of other packages}
% \currpkg has been designed as a replacement for \SIunits, \sistyle,
% \unitspkg and \unitsdef. It therefore provides options a hooks to
% reproduce the functions of all of these packages.  In this way,
% \currpkg should be usable as a straight replacement for the older
% packages.  All of the user macros of \meta{package} are (hopefully)
% available when using the
% \opt{emulate=\meta{package}}.\footnote{User macros means that they
% are described in the package documentation; simply not containing
% an \texttt{@} does not mean they will have been emulated.}  This
% means for example that the \cs{num} macro takes an optional star
% when emulating \sistyle.  However, there are some points that
% should be remembered.  In particular, \currpkg validates numerical
% input, meaning that places where a number is expected in the older
% packages \emph{require} a number when emulated by \currpkg.
%
% The \numprint package has provided many useful ideas for the code
% used here for number formatting. The basic use of the \cs{numprint}
% (or \cs{np}) macro can be reproduced using \currpkg.  However,
% \numprint is large and complex, with its own backward-compatibility
% options.  As a result, emulation of \numprint is not provided here.
% To use an \numprint document with \currpkg, the cs{numprint} macro
% could be provided using the following code.
%^^A Need to deal with \cs{numprint} being defined.
%\let\numprint\relax
%\begin{LaTeXexample}
%  \newcommand*{\numprint}[2][]{\SI[obeymode]{#2}{#1}}\\
%  \numprint{-123456} \numprint[N/mm^2]{-123456}
%\end{LaTeXexample}
%^^A Back to the normal - with \cs{newcommand}
%\newcommand*{\numprint}{\pkg{numprint}\xspace}
%
% \currpkg can be used more-or-less directly to replace both
% \pkg{dcolumn} and \pkg{rccol}.  As is explained in the code
% section, much of the column-alignment system here is taken from
% \pkg{dcolumn}, while \pkg{rccol} provided a model for an
% customisable system.  However, neither package has been directly
% emulated here.  The |s| column type can be used to replace both |D|
% and |R| columns by setting the appropriate package options.
%
%\section{Tricks and known issues}
%
% Due to the possibility of output in either maths or text mode, any
% input which requires a particular mode needs to be protected.  You
% cannot use |$|\ldots|$|, as this can get ``caught out'', but also
% as it may give hard-to-follow errors.  Always use \cs{ensuremath}
% to force maths processing, and \cs{text} (from the \AMS\TeX\
% bundle) to ensure text mode.
%
% The package uses the \cs{mathrm} font family by default to typeset
% output in maths mode.  This however has a few side-effects.  For
% example, the Greek alphabet can give odd results.\footnote{This
% depends on your font setup; this document uses T1 encoding, which
% shows the issue, whereas using OT1 does not.}  The use of the
% \cs{mathnormal} font may get around this issue.
%\begin{LaTeXexample}
%  \num[numextra=\pi]{4\pi e-7}\\
%  \num[numextra=\pi,mathnumdefault=mathnormal]{4\pi e-7}\\
%\end{LaTeXexample}
% On the other hand, you may want to use text mode.  There,
% \cs{ensuremath} is needed.
%\begin{LaTeXexample}
%  \newcommand*{\numpi}{\ensuremath{\pi}}
%  \num[numextra=\numpi,mode=text]{4\numpi e-7}
%\end{LaTeXexample}
% There are several potential pitfalls in this area; experimentation
% may well be needed.\footnote{Any suggestions for the code that runs
% this are welcome; the issue is how to deal with active characters
% in the input while not expanding macros.}
%
%\section{Reporting a problem}
% \currpkg is quite long and complicated, and works hard to cover all
% possible eventualities.  However, there will be bugs in the code
% and unexpected interactions with other packages.  If you think you
% have found a bug, please report it.  A short test-case
% demonstrating the problem would be very welcome.  The following is
% a suitable template, and is available as \file{si-bug.ltx}, by
% running \file{si.dtx} through (pdf)\LaTeX.
%^^A Change the output file name for the temporary file, so that
%^^A this one is available to readers.
%\edef\LaTeXexamplefile{si-bug.ltx}
%\begin{LaTeXexample}[\typesetcodeonly]
%  \listfiles
%  \documentclass{article}
%  % Add other packages here.
%  % Add options need for si package, retain the debug option.
%  \usepackage[debug]{si}
%  \begin{document}
%  This is the bug test-case document for the \textsf{si}
%  package.\\
%  Please put your demonstration here, and e-mail to the
%  package author.
%  \begin{center}
%    \texttt{joseph.wright@morningtar2.co.uk}
%  \end{center}
%  \end{document}
%\end{LaTeXexample}
%^^A Back to normal, so that this is not forgotten
%\edef\LaTeXexamplefile{\jobname.tmp}
%
%\section{Acknowledgements}
% The package author has learned \LaTeX\ tricks from far too many
% people to thank all of them.  However, for this package specific
% thanks must go to the authors of the existing ``unit'' packages:
% Danie Els (\sistyle), Marcel Heldoorn (\SIunits), Patrick
% Happel (\unitsdef), Axel Reichert (\unitspkg) and Harald
% Harders (\numprint).  Philip Lehmann, Will Robertson and Heiko
% Oberdiek deserve much credit for demonstrating \LaTeX\ coding best
% practice.  Thanks to the various contributors of ideas for the
% package: Donald Arseneau, Michele Dondi, Paul Gans, Ben Morrow, Lan
% Thuy Pham, Stefan Pinnow, Allan Ristow and Patrick Steegstra.
%
%\part{Correct application of (SI) units}
%TO DO!
%
%\bibliographystyle{unsrt}
%\StopEventually{%
%  \part{Notes}
%  \PrintChanges
%  \PrintIndex
%  \bibliography{si}}
%
% \iffalse
%<*package>
% \fi
%
%\part{Implementation}
%\section{Main package}
% Much of the code here is taken, with little or no modification,
% from the existing packages.  These are all released under the LPPL,
% and so this use is entirely allowed.  Rather than confuse the
% source here with repeated references, note that code here could be
% copied from \sistyle, \SIunits, \numprint, \unitsdef or \unitspkg.
% Some ideas have also been borrowed from \pkg{biblatex}; again these
% will not be specifically noted. Code from other packages will be
% marked when used.
%
% User-space commands (those not containing |@|) defined here should
% give the same result as macros with the same name in the older
% packages.  However, internal package macros may behave differently;
% if the user has redefined internal macros, then compatibility may
% be impaired.
%
% The code used here uses \LaTeX\ rather than \TeX\ commands where
% possible.\footnote{This applies to \LaTeX\ kernel commands only;
% for example, \pkg{ifthenelse} is not used.}  For example,
% \cs{newcommand*} is used in place of \cs{def}, unless custom
% parameters are needed.  Hopefully, this will aid future
% maintenance.  Grouping is used where possible to limit the scope of
% temporary assignments.
%
%\subsection{Setup code}
% As always, the package starts with identification.  A warning is then
% printed about possible changes.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{si}%
  [2008/02/20 v.06a A comprehensive (SI) units package]
\PackageInfo{si}
  {This package is experimental. \MessageBreak The interface and
   functionality is subject to review \MessageBreak and may be changed
   in later releases}
%    \end{macrocode}
% The package requires \eTeX, so the usual test is made.
%    \begin{macrocode}
\begingroup
  \@ifundefined{eTeXversion}
    {\PackageError{si}
       {Not running under e-TeX}
       {This package requires e-TeX. Try compiling the document
        with\MessageBreak `elatex' instead of `latex'. When using
        pdfTeX, try `pdfelatex'\MessageBreak instead of `pdflatex'}%
     \endgroup\endinput}
    {\endgroup}
%    \end{macrocode}
% Packages needed for functionality are loaded.  \pkg{xkeyval}
% handles the package options, while \pkg{amstext} from the \AMS\
% bundle is needed for \cs{text}.  \pkg{array} is needed for the new
% column type for tabular material.  \pkg{xspace} provides ``magic''
% spacing after macros, if requested.  \pkg{xkeyval} has to be at
% least v2.5, as earlier versions do not have the correct macros
% available.  As this will lead to serious errors later, \currpkg
% aborts if \pkg{xkeyval} is too old.
%    \begin{macrocode}
\RequirePackage{xkeyval}
\@ifpackagelater{xkeyval}{2005/05/07}
  {}
  {\PackageError{si}
     {xkeyval >= 2.5 required}
     {si requires the `xkeyval' package, version 2.5 or
       later.\MessageBreak The version loaded is:
       `\@nameuse{ver@xkeyval.sty}'.\MessageBreak
        This is a fatal error; the package will abort.}%
   \endinput}
\RequirePackage{amstext,array,xspace}
%    \end{macrocode}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
%\begin{macro}{\si@tempc}
% Some scratch commands are defined; apart from where a known value
% is carried through, these could contain anything.
%    \begin{macrocode}
\newcommand*{\si@tempa}{}
\newcommand*{\si@tempb}{}
\newcommand*{\si@tempc}{}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@switch}
% Various items will need a switch.  To avoid name pollution, a
% single switch is defined here; grouping will keep the definition
% local.
%    \begin{macrocode}
\newif\ifsi@switch
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@packagecheck}
%\begin{macro}{\si@tempa}
% As \currpkg is intended to replace the other unit-management
% packages, these are tested for before any further processing.  If
% any are loaded, the package halts compilation; name clashes or
% unexpected results could occur if this is not tested.  Notice that
% \SIunits and \sistyle could be loaded with variable capitalisation
% (at least on Windows); both possibilities are tested.  Also notice
% that \unitsdef must be tested before \unitspkg, so that users of
% the former get an intelligible message.
%    \begin{macrocode}
\newcommand*{\si@packagecheck}{%
  \begingroup
  \@for\si@tempa:=SIunits,siunits,sistyle,SIstyle,unitsdef\do{%
    \@ifpackageloaded{\si@tempa}
      {\PackageError{si}
         {Package `\si@tempa' incompatible}
         {The `\si@tempa' package and `si' are
          incompatible.\MessageBreak Use the
          `emulate=\si@tempa' package option when loading si.}}
      {}}
%    \end{macrocode}
% Some packages should not cause a clash, but are emulated and would
% be better handled that way.
%    \begin{macrocode}
  \@for\si@tempa:=units\do{%
    \@ifpackageloaded{\si@tempa}
      {\PackageWarning{si}
         {Consider loading the si package with\MessageBreak
          option `emulate=\si@tempa', rather than\MessageBreak
          loading both \si@tempa and si}}
      {}}
  \endgroup}
%    \end{macrocode}
%\end{macro}
% The check is carried out on loading and at the beginning of the
% document, so that packages loaded both before and after
% \currpkg are caught.
%    \begin{macrocode}
\si@packagecheck
\AtBeginDocument{\si@packagecheck}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@ifdefinable}
% Using \cs{@ifdefinable} to check macro definitions gives a generic
% error.  To give something more helpful, \cs{@ifundefined} is used,
% but this needs some \cs{expandafter} work.  This way it can also be
% used as a form of \cs{@ifundefined} for macro names.\\
%\cs{si@ifdefinable}\marg{macro}
%    \begin{macrocode}
\newcommand*{\si@ifdefinable}[1]{%
  \expandafter\expandafter\expandafter\@ifundefined%
    \expandafter\expandafter\expandafter%
      {\expandafter\@gobble\string#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@addtolist}
% It is quite useful to be able to add to a comma-separated list
% of expandable items.\\
%\cs{si@addtolist}\marg{macro}\marg{items}
%    \begin{macrocode}
\newcommand*{\si@addtolist}[2]{%
  \ifx\@empty#1\@empty
    \edef#1{#2}%
  \else
    \edef#1{#1,#2}%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@addtocsname}
%\begin{macro}{\si@temptoks}
% A second item to add to a is macro.\\
%\cs{si@addtomacro}\marg{macro}\marg{tokens}\\
%\cs{si@addtocsname}\marg{csname}\marg{tokens}
%    \begin{macrocode}
\newtoks{\si@temptoks}
\newcommand*{\si@addtocsname}[2]{%
  \@ifundefined{#1}
    {\@namedef{#1}{#2}}
    {\si@temptoks\expandafter\expandafter\expandafter{%
       \csname #1\endcsname#2}%
     \expandafter\edef\csname #1\endcsname{\the\si@temptoks}}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@xifmtarg}
%\begin{macro}{\si@ifnotmtarg}
% To keep down dependance on other packages, the very short code
% block from \pkg{ifmtarg} is copied here with an internal name.
%    \begin{macrocode}
\begingroup
  \catcode`\Q=3
  \long\gdef\si@xifmtarg#1#2Q#3#4#5\@nil{#4}
  \long\gdef\si@ifnotmtarg#1{%
    \si@xifmtarg#1QQ\@firstofone\@gobble\@nil}
\endgroup
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\subsection{Logging}
%\begin{macro}{\ifsi@debug}
%\begin{macro}{\ifsi@logmin}
%\begin{macro}{\ifsi@lognone}
% To control logging, some new switches are declared.
%    \begin{macrocode}
\newif\ifsi@debug
\newif\ifsi@logmin
\newif\ifsi@lognone
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@log@err}
%\begin{macro}{\si@log@warn}
%\begin{macro}{\si@log@inf}
% Some handy re-usable macros are defined here.  These all take names
% beginning  These pop up in various places.  First errors, warnings
% and information are handled.  Package options are used to control
% how much output is given.\\
%\cs{si@log@err}\marg{error}\marg{explanation}\\
%\cs{si@log@warn}\marg{warning}\\
%\cs{si@log@inf}\marg{information}
%    \begin{macrocode}
\newcommand*{\si@log@err}[2]{%
  \ifsi@lognone\else
    \ifsi@logmin
      \PackageWarning{si}{#1}%
    \else
      \PackageError{si}{#1}{#2}%
    \fi
  \fi}
\newcommand*{\si@log@warn}[1]{%
  \ifsi@lognone\else
    \ifsi@logmin\else
      \PackageWarning{si}{#1}%
    \fi
  \fi}
\newcommand*{\si@log@inf}[1]{%
  \ifsi@lognone\else
    \ifsi@logmin\else
      \PackageInfo{si}{#1}%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@log@debug}
% The debug macro only gives output if the appropriate package option
% is set.\\
%\cs{si@log@debug}\marg{debug-information}
%    \begin{macrocode}
\newcommand*{\si@log@debug}[1]{%
  \ifsi@lognone\else
    \ifsi@debug
      \PackageInfo{si}{#1}%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsection{Option handling}
%\begin{macro}{\sisetup}
% To allow modification of options at run time, a setup macro is
% provided.  The run of strange tests are to prevent problems in
% arrays and the like.\\
%\cs{sisetup}\marg{keyval-options}
%    \begin{macrocode}
\newcommand*{\sisetup}[1]{%
  \iffalse{\fi\ifnum0=`}\fi
  \setkeys[si]{opt}{#1}%
  \ifnum0=`{\fi\iffalse}\fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@opt@key}
% To aid maintenance, some shortcuts are defined for generating keys.
% These also allow the debugging messages to be added automatically
% to every key.  First of all the basic key definition.\\
%\cs{si@opt@key}\marg{keyname}\marg{code}
%    \begin{macrocode}
\newcommand*{\si@opt@key}[2]{%
  \define@key[si]{opt}{#1}
  {#2\si@log@debug{Option #1 set to ##1}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@opt@cmdkey}
%\begin{macro}{\si@opt@cmdkeys}
% The command versions of the above.\\
%\cs{si@opt@cmdkey}\oarg{default}\marg{keyname}\marg{function}\\
%\cs{si@opt@cmdkeys}\oarg{default}\marg{keynames}
%    \begin{macrocode}
\newcommand*{\si@opt@cmdkey}[3][]{%
  \define@cmdkey[si]{opt}[si@]{#2}[#1]{#3}}
\newcommand*{\si@opt@cmdkeys}[2][]{%
  \define@cmdkeys[si]{opt}[si@]{#2}[#1]}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@opt@boolkey}
% Keys which only take switch values; anything other than \opt{true}
% or \opt{false} will generate a warning from \pkg{xkeyval}.
%\cs{si@opt@boolkey}\oarg{optional-processing}\marg{keyname}
%    \begin{macrocode}
\newcommand*{\si@opt@boolkey}[2][]{%
  \define@boolkey[si]{opt}[si@]{#2}[true]
  {#1\si@log@debug{Option #2 set to ##1}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@opt@choicekey}
% A ``fill in the blanks'' choice key.  In all cases, \cs{si@tempa}
% is used to hold the value given to the key, so that \cs{ifx}
% testing can occur.\\
%\cs{si@opt@choicekey}\oarg{default}\marg{keyname}\marg{choices}^^A
%\marg{in-list}\marg{not-in-list}
%    \begin{macrocode}
\newcommand*{\si@opt@choicekey}[5][]{%
  \define@choicekey*+[si]{opt}{#2}[\si@tempa]{#3}[#1]
    {#4\si@log@debug{Option #2 set to ##1}}
    {#5\si@log@debug{Option #2 set to ##1}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@opt@xchoicekey}
% Several of the package options can take either a choice from a list
% of known options, or a value to be interpreted literally.  To aid
% maintenance, the necessary code can be set up here.  These keys all
% define a new macro, which must exist.  The \cs{si@opt@xchoicekey}
% macro therefore ensures that this is defined, as well as setting up
% the \pkg{xkeyval} key.\\
%\cs{si@opt@xchoicekey}\marg{keyname}\marg{choices}\marg{initial}
%    \begin{macrocode}
\newcommand*{\si@opt@xchoicekey}[3]{%
  \si@opt@choicekey[#3]{#1}{#2}
%    \end{macrocode}
% This code will execute if the option is on the list.  There will be
% a ``fixed'' macro with a matching name, which is used for this.
%    \begin{macrocode}
    {\expandafter\renewcommand\expandafter*%
      \csname si@#1\endcsname{\@nameuse{si@fix@##1}}}
%    \end{macrocode}
% The user has given something that is not on the list as an
% argument.  It is used literally.
%    \begin{macrocode}
    {\expandafter\renewcommand\expandafter*%
      \csname si@#1\endcsname{##1}}
%    \end{macrocode}
% Finally, the initial value of the macro is set up.
%    \begin{macrocode}
  \expandafter\newcommand\expandafter*\csname si@#1\endcsname%
    {\@nameuse{si@fix@#3}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@opt@compatkey}
% An all-in-one definition for a back-compatibility key.  These
% should only be used at load time, so are automatically disabled
% once the package is loaded.  Emulation is also automatically turned
% on.\\
%\cs{si@opt@compatkey}\marg{package}\marg{keyname}.
%    \begin{macrocode}
\newcommand*{\si@opt@compatkey}[2]{%
  \define@boolkey[si]{opt}[si@old@]{#2}[true]
  {\si@log@debug{Emulating #1 package option\MessageBreak #2}%
   \sisetup{emulate=#1}%
   \si@log@debug{Option #2 set to ##1}}
   \AtEndOfPackage{\si@opt@disablekey{#2}
     {Compatibility option #2 only\MessageBreak
        available when loading si package}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@opt@disablekey}
% The ability to disable a key with a meaningful message is a must;
% the warning will come from \currpkg, and not from \pkg{xkeyval}\\
%\cs{si@opt@disablekey}\marg{keyname}\marg{warning}
%    \begin{macrocode}
\newcommand*{\si@opt@disablekey}[2]{%
  \key@ifundefined[si]{opt}{#1}
    {}
    {\si@log@debug{Disabling key #1}%
     \si@opt@key{#1}{\si@log@warn{#2}}}}
%    \end{macrocode}
%\end{macro}
%
% The \pkg{xkeyval} package option for logging is declared. This is
% then processed to set the switches correctly.
%    \begin{macrocode}
\si@opt@choicekey[normal]{log}{debug,verbose,normal,errors,none}
%    \end{macrocode}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% A series of comparisons are made to assign the logging mode.  The
% \opt{normal} option is not tested, as executing the option sets the
% switches appropriately.
%    \begin{macrocode}
  {\si@debugfalse
   \si@logminfalse
   \si@lognonefalse
   \renewcommand*{\si@tempb}{none}%
   \ifx\si@tempa\si@tempb
     \si@lognonetrue
   \fi
   \renewcommand*{\si@tempb}{minimal}%
   \ifx\si@tempa\si@tempb
     \si@logmintrue
   \fi
   \renewcommand*{\si@tempb}{debug}%
   \ifx\si@tempa\si@tempb
     \si@debugtrue
   \fi
   \renewcommand*{\si@tempb}{verbose}%
   \ifx\si@tempa\si@tempb
     \si@debugtrue
   \fi}
%    \end{macrocode}
% The option has not been recognised: give a warning (if
% appropriate).
%    \begin{macrocode}
   {\si@log@warn{Unrecognised value `#1' for option log}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
% A quick method to set \opt{log=debug}.
%    \begin{macrocode}
\si@opt@boolkey{debug}
%    \end{macrocode}
%\begin{macro}{\si@emulate}
% The \opt{emulate} option is used for back-compatibility mode; if
% the keyword is given with no value, emulation of \SIunits is
% assumed.
%    \begin{macrocode}
\newcommand*{\si@emulate}{}
\si@opt@choicekey[SIunits]{emulate}
  {SIunits,sistyle,numprint,units,unitsdef}
  {\si@log@debug{Found emulation request for #1 package}%
   \si@addtolist{\si@emulate}{#1}}
  {\si@log@warn{Unknown value `#1' for option emulate
   \MessageBreak No emulation will occur}}
%    \end{macrocode}
%\end{macro}
% The \opt{emulate} option is no longer valid once the package has
% been loaded.
%    \begin{macrocode}
\AtEndOfPackage{%
  \si@opt@disablekey{emulate}
    {emulate option only available when\MessageBreak
     loading package}}
%    \end{macrocode}
%\begin{macro}{\si@unitsep}
%\begin{macro}{\si@unitspace}
%\begin{macro}{\si@valuesep}
% The two \opt{\dots space} options control the size of spaces
% between the number and the unit (\cs{si@valuesep}), and that used
% to represent a product (\cs{si@unitsep}).  Known values here are
% \opt{thin}, \opt{med}, \opt{medium}, \opt{thick},
% \opt{cdot}\footnote{only valid for \opt{unitsep}.} and
% \opt{none};\footnote{Only valid for \opt{valuesep.}} other entries
% will be treated as custom spaces.
%    \begin{macrocode}
\si@opt@xchoicekey{unitsep}{thin,med,medium,thick,space,none,cdot,
  times}{thin}
\si@opt@xchoicekey{unitspace}{space,thin,med,medium,thick,none}
  {thin}
\si@opt@xchoicekey{valuesep}{space,thin,med,medium,thick,none}
  {thin}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@digitsep}
% Separation of digits in large numbers is controlled by the
% \opt{digitsep} option.  As with the other \opt{sep} values, this
% one has a choice of possible values.  The list is quite long, so
% that a range of options are handled automatically.  Notice that
% \opt{digitsep=none} will be used for no separation at all.
%    \begin{macrocode}
\si@opt@xchoicekey{digitsep}
  {thin,med,medium,thick,none,comma,stop,fullstop,period}{thin}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@decimalsign}
% The symbol used for the decimal position is varied here.  There are
% only two real options, but options are given for the name of a full
% stop.
%    \begin{macrocode}
\si@opt@xchoicekey{decimalsign}{comma,stop,fullstop,period,cdot}
  {fullstop}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@anglesep}
% The separator between degrees and minutes, and between minutes and
% seconds, when using \cs{ang}.
%    \begin{macrocode}
\si@opt@xchoicekey{anglesep}{thin,med,medium,thick,none}{none}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@obeymode}
% The first test for the font control is whether to respect the
% surrounding maths or text mode.
%    \begin{macrocode}
\si@opt@boolkey{obeymode}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@textmode}
% The output of the package can be typeset using either text or maths
% mode fonts.  This is controlled using the \opt{mode} option and the
% \cs{ifsi@textmode} switch.
%    \begin{macrocode}
\newif\ifsi@textmode
\si@opt@boolkey{textmode}
\si@opt@choicekey{mode}{math,maths,text}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% \cs{si@tempb} used to for the expansion tests.  The default is
% \opt{none}, as the choice key will not allow other values to get
% here.
%    \begin{macrocode}
  {\si@textmodefalse
   \renewcommand*{\si@tempb}{text}%
   \ifx\si@tempa\si@tempb
     \si@textmodetrue
   \fi}
  {\si@log@warn{Unknown value `#1' for option mode}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@obeyfamily}
% The package can work to match the font family (serif, sans serif,
% typewriter) of the surrounding text.  This is controlled by a
% Boolean option.
%    \begin{macrocode}
\si@opt@boolkey{obeyfamily}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@obeybold}
% The package can attempt to respect bold, or may ignore it.
%    \begin{macrocode}
\si@opt@boolkey{obeybold}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@inlinebtext}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% For inline maths, two options for checking what is bold are
% available, the maths environment (\ie \cs{boldmath}) and the
% surrounding text (\cs{textbf} or \cs{bffamily}).
%    \begin{macrocode}
\newif\ifsi@inlinebtext
\si@opt@choicekey{inlinebold}{text,maths,math}
  {\si@inlinebtextfalse
   \renewcommand*{\si@tempb}{text}%
   \ifx\si@tempa\si@tempb
     \si@inlinebtexttrue
   \fi}
  {\si@log@warn{Unknown value `#1' for option inlinebold}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@obeyitalic}
% Italic is slightly different to bold, as there is no convenient
% switch for maths.
%    \begin{macrocode}
\si@opt@boolkey{obeyitalic}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@mathsdefault}
%\begin{macro}{\si@mathsrm}
%\begin{macro}{\si@mathssf}
%\begin{macro}{\si@mathstt}
% The fonts used by the package default to the obvious \LaTeX\ ones;
% however, this needs to be exposed to user modification.  First the
% maths mode fonts are sorted out.
%    \begin{macrocode}
\si@opt@cmdkeys{mathsdefault,mathsrm,mathssf,mathstt}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
% To make life easier for the user, UK spellings are provided for the
% maths keys.
%    \begin{macrocode}
\si@opt@key{mathdefault}{\sisetup{mathsdefault=#1}}
\si@opt@key{mathrm}{\sisetup{mathsrm=#1}}
\si@opt@key{mathsf}{\sisetup{mathssf=#1}}
\si@opt@key{mathtt}{\sisetup{mathstt=#1}}
%    \end{macrocode}
%\begin{macro}{\si@textdefault}
%\begin{macro}{\si@textrm}
%\begin{macro}{\si@textsf}
%\begin{macro}{\si@texttt}
% The same thing for text mode fonts.  Once again the default values
% are pretty obvious.
%    \begin{macrocode}
\si@opt@cmdkeys{textdefault,textrm,textsf,texttt}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@mathnumdefault}
%\begin{macro}{\si@textnumdefault}
% To allow numbers to be set in a different font to text, additional
% options are set up.
%    \begin{macrocode}
\si@opt@cmdkeys{mathnumdefault,textnumdefault}
\si@opt@key{mathsnumdefault}{\sisetup{mathnumdefault=#1}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@numlist}
%\begin{macro}{\si@numdecimal}
%\begin{macro}{\si@numexp}
%\begin{macro}{\si@numgobble}
%\begin{macro}{\si@numsign}
%\begin{macro}{\si@numextra}
% The list of possible valid characters for parsing numbers is set
% up.  This is similar to \numprint, but with the \opt{extra} class,
% and with characters ignored with no output renamed as \opt{gobble}.
%    \begin{macrocode}
\si@opt@cmdkeys{numlist,numdecimal,numexp,numgobble,numsign,numextra}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@numvalid}
% The various valid characters are collected together in a single
% macro for later.  In common with the above macros, this one starts
% \cs{si@num\ldots}.  The order here is the order the values are
% tested later on.
%    \begin{macrocode}
\newcommand*{\si@numvalid}{\si@numgobble\si@numexp\si@numsign%
  \si@numdecimal\si@numlist\si@numextra}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@sepfour}
% With four digits in a number, separating may or may not be desired.
% Note that this option is the same as one for \numprint.
%    \begin{macrocode}
\si@opt@boolkey{sepfour}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@expproduct}
% The marker for multiplication in exponential numbers is set up.
%    \begin{macrocode}
\si@opt@xchoicekey{expproduct}{times,cdot}{times}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@exppower}
% In the same area, the power for exponents is variable.  Only one
% choice is given.
%    \begin{macrocode}
\si@opt@xchoicekey{exppower}{ten}{ten}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@prefixproduct}
% The marker for multiplication in prefixes.
%    \begin{macrocode}
\si@opt@xchoicekey{prefixproduct}{times,cdot,none}{times}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@prefixpower}
% In the same area, the power for prefixes is variable.  Here, two
% choices ar needed.
%    \begin{macrocode}
\si@opt@xchoicekey{prefixpower}{ten,two}{ten}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@prefixnum}
% Unit prefixes can be given as either symbols or numerically.
%    \begin{macrocode}
\newif\ifsi@prefixnum
\si@opt@choicekey{prefix}{symbol,letter,power,number}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% \cs{si@tempb} used to for the expansion tests.  The default is
% \opt{none}, as the choice key will not allow other values to get
% here.
%    \begin{macrocode}
  {\si@prefixnumfalse
   \renewcommand*{\si@tempb}{power}%
   \ifx\si@tempa\si@tempb
     \si@prefixnumtrue
   \fi
   \renewcommand*{\si@tempb}{number}%
   \ifx\si@tempa\si@tempb
     \si@prefixnumtrue
   \fi}
  {\si@log@warn{Unknown value `#1' for option prefix}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@num@padlead}
%\begin{macro}{\ifsi@num@padtrail}
% A setting is needed to indicate when to add zeros to decimal
% numbers, either before the decimal marker (|.1| giving
% ``\num[padnumber=all]{.1}'') or after (|1.| giving
% ``\num[padnumber=all]{1.}'').
%    \begin{macrocode}
\newif\ifsi@num@padlead
\newif\ifsi@num@padtrail
\si@opt@choicekey[all]{padnumber}
  {leading,lead,trailing,trail,all,both,true,none,false}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% \cs{si@tempb} is used to for the expansion tests.  The default is
% \opt{none}, as the choice key will not allow other values to get
% here.
%    \begin{macrocode}
  {\si@num@padleadfalse
   \si@num@padtrailfalse
   \renewcommand*{\si@tempb}{leading}%
   \ifx\si@tempa\si@tempb
     \si@num@padleadtrue
   \fi
   \renewcommand*{\si@tempb}{lead}%
   \ifx\si@tempa\si@tempb
     \si@num@padleadtrue
   \fi
   \renewcommand*{\si@tempb}{trailing}%
   \ifx\si@tempa\si@tempb
     \si@num@padtrailtrue
   \fi
   \renewcommand*{\si@tempb}{trail}%
   \ifx\si@tempa\si@tempb
     \si@num@padtrailtrue
   \fi
   \renewcommand*{\si@tempb}{all}%
   \ifx\si@tempa\si@tempb
     \si@num@padleadtrue
     \si@num@padtrailtrue
   \fi
   \renewcommand*{\si@tempb}{true}%
   \ifx\si@tempa\si@tempb
     \si@num@padleadtrue
     \si@num@padtrailtrue
   \fi
   \renewcommand*{\si@tempb}{both}%
   \ifx\si@tempa\si@tempb
     \si@num@padleadtrue
     \si@num@padtrailtrue
   \fi}
  {\si@log@warn{Unknown value `#1' for option padnumber}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@sign}
%\begin{macro}{\ifsi@num@signmant}
%\begin{macro}{\ifsi@num@signexp}
% Some new switches for adding signs to numbers
%    \begin{macrocode}
\newif\ifsi@num@signmant
\newif\ifsi@num@signexp
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Signs can be added to numbers by default. Two options are needed
% here; whether to add a sign by default, and what the sign is.
%    \begin{macrocode}
\si@opt@xchoicekey{sign}{plus,minus,pm,mp}{plus}
\si@opt@choicekey[all]{addsign}
  {mantissa,exponent,mant,exp,all,both,true,none,false}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% The option is now processed.
%    \begin{macrocode}
  {\si@num@signmantfalse
   \si@num@signexpfalse
   \renewcommand*{\si@tempb}{mantissa}%
   \ifx\si@tempa\si@tempb
     \si@num@signmanttrue
   \fi
   \renewcommand*{\si@tempb}{mant}%
   \ifx\si@tempa\si@tempb
     \si@num@signmanttrue
   \fi
   \renewcommand*{\si@tempb}{exponent}%
   \ifx\si@tempa\si@tempb
     \si@num@signexptrue
   \fi
   \renewcommand*{\si@tempb}{exp}%
   \ifx\si@tempa\si@tempb
     \si@num@signexptrue
   \fi
   \renewcommand*{\si@tempb}{all}%
   \ifx\si@tempa\si@tempb
     \si@num@signmanttrue
     \si@num@signexptrue
   \fi
   \renewcommand*{\si@tempb}{true}%
   \ifx\si@tempa\si@tempb
     \si@num@signmanttrue
     \si@num@signexptrue
   \fi
   \renewcommand*{\si@tempb}{both}%
   \ifx\si@tempa\si@tempb
     \si@num@signmanttrue
     \si@num@signexptrue
   \fi}
  {\si@log@warn{Unknown value `#1' for option addsign}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@ang@padsmall}
%\begin{macro}{\ifsi@ang@padlarge}
% A switch for determining whether to typeset |\ang{;;1}| as
% \ang[padangle=both]{;;1} or \ang[padangle=none]{;;1}.  First, two
% new Boolean switches are needed to indicate padding.
%    \begin{macrocode}
\newif\ifsi@ang@padsmall
\newif\ifsi@ang@padlarge
\si@opt@choicekey[all]{padangle}
  {small,large,all,both,true,none,false}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% \cs{si@tempb} is used to for the expansion tests.  The default is
% \opt{none}, as the choice key will not allow other values to get
% here.
%    \begin{macrocode}
  {\si@ang@padsmallfalse
   \si@ang@padlargefalse
   \renewcommand*{\si@tempb}{small}%
   \ifx\si@tempa\si@tempb
     \si@ang@padsmalltrue
   \fi
   \renewcommand*{\si@tempb}{large}%
   \ifx\si@tempa\si@tempb
     \si@ang@padlargetrue
   \fi
   \renewcommand*{\si@tempb}{all}%
   \ifx\si@tempa\si@tempb
     \si@ang@padsmalltrue
     \si@ang@padlargetrue
   \fi
   \renewcommand*{\si@tempb}{true}%
   \ifx\si@tempa\si@tempb
     \si@ang@padsmalltrue
     \si@ang@padlargetrue
   \fi
   \renewcommand*{\si@tempb}{both}%
   \ifx\si@tempa\si@tempb
     \si@ang@padsmalltrue
     \si@ang@padlargetrue
   \fi}
  {\si@log@warn{Unknown value `#1' for option padangle}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@astroang}
% A slightly odd option to allow the method used by astronomers for
% angles.
%    \begin{macrocode}
\si@opt@boolkey{astroang}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tabformat}
% The formatting of numbers in tables is handled by a
% \pkg{dcolumn}-like system. For that, a single option is needed to
% control the centring of data in the table.
%    \begin{macrocode}
\si@opt@cmdkey[-1]{tabformat}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@xspace}
% Unit macros on their own may need \pkg{xpsace}.
%    \begin{macrocode}
\si@opt@boolkey{xspace}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@frac}
%\begin{macro}{\ifsi@slash}
% The option processing for formatting units with \cs{per} in them
% needs two switches.
%    \begin{macrocode}
\newif\ifsi@slash
\newif\ifsi@frac
\si@opt@choicekey[reciprocal]{per}
  {reciprocal,rp,power,slash,frac,fraction}
%    \end{macrocode}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% The usual value testing, with a default to use reciprocal powers.
%    \begin{macrocode}
  {\si@slashfalse
   \si@fracfalse
   \renewcommand*{\si@tempb}{slash}%
   \ifx\si@tempa\si@tempb
     \si@fractrue
     \si@slashtrue
     \let\si@frac\si@frc@slash
   \fi
   \renewcommand*{\si@tempb}{frac}%
   \ifx\si@tempa\si@tempb
     \si@fractrue
   \fi
   \renewcommand*{\si@tempb}{fraction}%
   \ifx\si@tempa\si@tempb
     \si@fractrue
   \fi}
  {\si@log@warn{Unknown value `#1' for option per}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@slash}
% For the \opt{slash} option, the separator can be customised.
%    \begin{macrocode}
\si@opt@xchoicekey{slash}{slash}{slash}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@denrbrac}
%\begin{macro}{\si@denlbrac}
% Macros for the right and left brackets added to
% potentially-ambiguous denominators.
%    \begin{macrocode}
\si@opt@cmdkeys{denrbrac,denlbrac}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% In the case of fractional handling of the \cs{per} operator,
% further refinement is available.
%    \begin{macrocode}
\si@opt@choicekey[frac]{fraction}
  {frac,nicefrac,nice,sfrac,xfrac,uglyfrac,ugly}
  {\let\si@frac\si@frc@frac
   \renewcommand*{\si@tempb}{nicefrac}%
   \ifx\si@tempa\si@tempb
     \let\si@frac\si@frc@nice
   \fi
   \renewcommand*{\si@tempb}{uglyfrac}%
   \ifx\si@tempa\si@tempb
     \let\si@frac\si@frc@ugly
   \fi
   \renewcommand*{\si@tempb}{nice}%
   \ifx\si@tempa\si@tempb
     \let\si@frac\si@frc@nice
   \fi
   \renewcommand*{\si@tempb}{sfrac}%
   \ifx\si@tempa\si@tempb
     \let\si@frac\si@frc@sfrac
   \fi
   \renewcommand*{\si@tempb}{xfrac}%
   \ifx\si@tempa\si@tempb
     \let\si@frac\si@frc@sfrac
   \fi
   \renewcommand*{\si@tempb}{ugly}%
   \ifx\si@tempa\si@tempb
     \let\si@frac\si@frc@ugly
   \fi}
  {\si@log@warn{Unknown value `#1' for option fraction}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@load}
%\begin{macro}{\si@noload}
% Loading of support files is controlled by two keys.  The first
% defines a list of files that may be loaded, the second a list that
% will not.  This makes it easy to exclude a single file from a long
% list.
%    \begin{macrocode}
\si@opt@cmdkeys{load,noload}
\si@opt@key{alsoload}{\si@addtolist{\si@load}{#1}}
\AtEndOfPackage{%
  \si@opt@disablekey{load}
    {Configuration files can only be used\MessageBreak
     when loading si}
  \si@opt@disablekey{also}
    {Configuration files can only be used\MessageBreak
     when loading si}
  \si@opt@disablekey{noload}
    {Configuration files can only be used\MessageBreak
     when loading si}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@textOmega}
%\begin{macro}{\si@mathsOmega}
% The various non-Latin symbols need to be handled, and given user interfaces.
% Some definitions are more complex than others; for \unitsym{\ohm}
% things are easy.
%    \begin{macrocode}
\si@opt@cmdkeys{textOmega,mathsOmega}
\si@opt@key{mathOmega}{\sisetup{mathsOmega=#1}}
\newcommand*{\si@mathsOmega}{\text{\ensuremath{\Omega}}}
\newcommand*{\si@textOmega}{\ensuremath{\Omega}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@textmu}
%\begin{macro}{\si@mathsmu}
% For the \unitsym{\micro} symbol, some direct loading of symbols is
% needed as the maths mu sign ($\mu$) is wrong.
%    \begin{macrocode}
\si@opt@cmdkeys{textmu,mathsmu}
\si@opt@key{mathmu}{\sisetup{mathsmu=#1}}
\DeclareFontEncoding{TS1}{}{}
\DeclareFontSubstitution{TS1}{cmr}{m}{n}
\DeclareTextSymbol{\si@textmu}{TS1}{181}
\DeclareTextSymbolDefault{\si@textmu}{TS1}
\DeclareFontFamily{OML}{eur}{\skewchar\font127}
\DeclareFontShape{OML}{eur}{m}{n}%
  {<5> <6> <7> <8> <9> gen * eurm %
    <10><10.95><12><14.4><17.28><20.74><24.88>eurm10}{}
\DeclareSymbolFont{greek}{OML}{eur}{m}{n}
\DeclareMathSymbol{\si@mathsmu}{\mathord}{greek}{"16}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@textdegree}
%\begin{macro}{\si@mathsdegree}
%\begin{macro}{\si@textminute}
%\begin{macro}{\si@mathsminute}
%\begin{macro}{\si@textsecond}
%\begin{macro}{\si@mathssecond}
% The angle signs.
%    \begin{macrocode}
\si@opt@cmdkeys{textdegree,mathsdegree,textminute,mathsminute,
  textsecond,mathssecond}
\si@opt@key{mathdegree}{\sisetup{mathsdegree=#1}}
\si@opt@key{mathminute}{\sisetup{mathsminute=#1}}
\si@opt@key{mathsecond}{\sisetup{mathssecond=#1}}
\newcommand*{\si@textdegree}{\ensuremath{{}^{\circ}}}
\newcommand*{\si@mathsdegree}{{}^{\circ}}
\newcommand*{\si@textminute}{\ensuremath{{}^{\prime}}}
\newcommand*{\si@mathsminute}{{}^{\prime}}
\newcommand*{\si@textsecond}{\ensuremath{{}^{\prime\prime}}}
\newcommand*{\si@mathssecond}{{}^{\prime\prime}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@textcelsius}
%\begin{macro}{\si@mathscelsius}
% Finally, degrees Celsius, which may need the degree symbol.
%    \begin{macrocode}
\si@opt@cmdkeys{textcelsius,mathscelsius}
\si@opt@key{mathcelsius}{\sisetup{mathscelsius=#1}}
\newcommand*{\si@textcelsius}{\si@textdegree C}
\newcommand*{\si@mathscelsius}{\si@mathsdegree\mathrm{C}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@textringA}
%\begin{macro}{\si@mathsringA}
% The \unitsym{\angstrom} sign.
%    \begin{macrocode}
\si@opt@cmdkeys{textringA,mathsringA}
\si@opt@key{mathringA}{\sisetup{mathsringA=#1}}
\newcommand*{\si@textringA}{\AA}
\newcommand*{\si@mathsringA}{\text{\AA}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@redefsymbols}
% A flag for using \pkg{textcomp} and \pkg{upgreek} to provide better
% symbols.
%    \begin{macrocode}
\si@opt@boolkey{redefsymbols}
\AtBeginDocument{%
  \si@opt@disablekey{redefsymbols}
    {Symbols can only be redefined\MessageBreak
     when loading si}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@eVcorra}
%\begin{macro}{\si@eVcorrb}
%    \begin{macrocode}
\newlength\si@eVcorra
\newlength\si@eVcorrb
\si@opt@key{eVcorra}{\setlength\si@eVcorra{#1}}
\si@opt@key{eVcorrb}{\setlength\si@eVcorrb{#1}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@locale}
%\begin{macro}{\si@loadlocales}
%\begin{macro}{\si@loctolang}
% Handling typographic conventions needs three keys.  \opt{locale} is
% used to set the locale, whereas \cs{loadlocales} reads in the
% definitions at package load time.
%    \begin{macrocode}
\si@opt@cmdkeys{loadlocales,loctolang}
\si@opt@cmdkey{locale}{%
  \sisetup{loadlocales={#1}}%
  \AtEndOfPackage{\si@loc@set{#1}}}
\AtBeginDocument{%
  \si@opt@disablekey{loadlocales}
    {Locale files can only be loaded\MessageBreak
     in the preamble}
  \si@opt@disablekey{loctolang}
    {Locale files can only be loaded\MessageBreak
     in the preamble}
  \si@opt@cmdkey{locale}{\si@loc@set{#1}}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsection{Compatibility options}
%\begin{macro}{\ifsi@old@ugly}
%\begin{macro}{\ifsi@old@nice}
%\begin{macro}{\ifsi@old@loose}
%\begin{macro}{\ifsi@old@tight}
% With the options for the package set up, the next stage is to
% provide support for users of the older packages.  These all set up
% switches, but do not do anything.  That is left to the emulation
% files, loaded at the end of the package. First of all, the
% \unitspkg options are dealt with; there are not many.
%    \begin{macrocode}
\si@opt@compatkey{units}{ugly}
\si@opt@compatkey{units}{nice}
\si@opt@compatkey{units}{loose}
\si@opt@compatkey{units}{tight}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@old@OHM}
%\begin{macro}{\ifsi@old@ohm}
%\begin{macro}{\ifsi@old@redef-gensymb}
%\begin{macro}{\ifsi@gensymb}
% The \unitsdef package is unfortunately much more profligate with
% options. The first set are to do with support for \pkg{gensymb}.
%    \begin{macrocode}
\si@opt@compatkey{unitsdef}{OHM}
\si@opt@compatkey{unitsdef}{ohm}
\si@opt@compatkey{unitsdef}{redef-gensymb}
\newif\ifsi@gensymb
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@old@LITER}
%\begin{macro}{\ifsi@old@liter}
%\begin{macro}{\ifsi@old@noxspace}
%\begin{macro}{\ifsi@old@noconfig}
% The second set are more general functionality.
%    \begin{macrocode}
\si@opt@compatkey{unitsdef}{LITER}
\si@opt@compatkey{unitsdef}{liter}
\si@opt@compatkey{unitsdef}{noxspace}
\si@opt@compatkey{unitsdef}{noconfig}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@old@noabbr}
%\begin{macro}{\ifsi@old@noamperageabbr}
%\begin{macro}{\ifsi@old@nofrequncyabbr}
%\begin{macro}{\ifsi@old@nomolabbr}
%\begin{macro}{\ifsi@old@novoltageabbr}
%\begin{macro}{\ifsi@old@novolumeabbr}
%\begin{macro}{\ifsi@old@noweightabbr}
%\begin{macro}{\ifsi@old@noenergyabbr}
%\begin{macro}{\ifsi@old@nolengthabbr}
%\begin{macro}{\ifsi@old@notimeabbr}
% The final set are for control of abbreviations, and are a good
% demonstration of why to use \pkg{xkeyval}!
%    \begin{macrocode}
\si@opt@compatkey{unitsdef}{noabbr}
\si@opt@compatkey{unitsdef}{noampereageabbr}
\si@opt@compatkey{unitsdef}{nofrequncyabbr}
\si@opt@compatkey{unitsdef}{nomolabbr}
\si@opt@compatkey{unitsdef}{novoltageabbr}
\si@opt@compatkey{unitsdef}{novolumeabbr}
\si@opt@compatkey{unitsdef}{noweightabbr}
\si@opt@compatkey{unitsdef}{noenergyabbr}
\si@opt@compatkey{unitsdef}{nolengthabbr}
\si@opt@compatkey{unitsdef}{notimeabbr}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@old@cdot}
%\begin{macro}{\ifsi@old@thickspace}
%\begin{macro}{\ifsi@old@mediumspace}
%\begin{macro}{\ifsi@old@thinspace}
%\begin{macro}{\ifsi@old@thickqspace}
%\begin{macro}{\ifsi@old@mediumqspace}
%\begin{macro}{\ifsi@old@thinqspace}
% The \SIunits package has lots of options.  These ones are all
% related to spacing.
%    \begin{macrocode}
\si@opt@compatkey{SIunits}{cdot}
\si@opt@compatkey{SIunits}{thickspace}
\si@opt@compatkey{SIunits}{mediumspace}
\si@opt@compatkey{SIunits}{thinspace}
\si@opt@compatkey{SIunits}{thickqspace}
\si@opt@compatkey{SIunits}{mediumqspace}
\si@opt@compatkey{SIunits}{thinqspace}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@old@amssymb}
%\begin{macro}{\ifsi@old@squaren}
%\begin{macro}{\ifsi@old@pstricks}
%\begin{macro}{\ifsi@old@Gray}
%\begin{macro}{\ifsi@old@italian}
% These options are used by \SIunits to control clashes with other
% packages.
%    \begin{macrocode}
\si@opt@compatkey{SIunits}{amssymb}
\si@opt@compatkey{SIunits}{squaren}
\si@opt@compatkey{SIunits}{pstricks}
\si@opt@compatkey{SIunits}{Gray}
\si@opt@compatkey{SIunits}{italian}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@old@textstyle}
%\begin{macro}{\ifsi@old@binary}
%\begin{macro}{\ifsi@old@noams}
%\begin{macro}{\ifsi@old@derivedinbase}
%\begin{macro}{\ifsi@old@derived}
% The miscellaneous options.
%    \begin{macrocode}
\si@opt@compatkey{SIunits}{textstyle}
\si@opt@compatkey{SIunits}{binary}
\si@opt@compatkey{SIunits}{noams}
\si@opt@compatkey{SIunits}{derivedinbase}
\si@opt@compatkey{SIunits}{derived}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsection{Constants}
% A number of macros are needed by the package that provide a
% non-changing output.  These are defined here; the intention is that
% these should not be macros that the user is likely to need to
% alter.  All of these macros have preface \cs{si@fix@}, to flag that
% that are intended as constants.  The package may rely on the
% contents of these macros for functionality.
%
%\begin{macro}{\si@fix@thin}
%\begin{macro}{\si@fix@med}
%\begin{macro}{\si@fix@medium}
%\begin{macro}{\si@fix@thick}
%\begin{macro}{\si@fix@space}
% First, there are the various space macros.  To allow both \opt{med}
% and \opt{medium} to be used as a space description, two macros are
% needed for the same output.
%    \begin{macrocode}
\newcommand*{\si@fix@thin}{\,}
\newcommand*{\si@fix@med}{\:}
\newcommand*{\si@fix@medium}{\:}
\newcommand*{\si@fix@thick}{\;}
\newcommand*{\si@fix@space}{\text{~}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@fix@cdot}
%\begin{macro}{\si@fix@comma}
%\begin{macro}{\si@fix@stop}
%\begin{macro}{\si@fix@fullstop}
%\begin{macro}{\si@fix@period}
%\begin{macro}{\si@fix@times}
% Next there are macros for material that is not simply whitespace.
% To allow several options, the full-stop gets lots of names.
%    \begin{macrocode}
\newcommand*{\si@fix@cdot}{\cdot}
\newcommand*{\si@fix@comma}{{,}}
\newcommand*{\si@fix@stop}{{.}}
\newcommand*{\si@fix@fullstop}{{.}}
\newcommand*{\si@fix@period}{{.}}
\newcommand*{\si@fix@times}{\times}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@fix@plus}
%\begin{macro}{\si@fix@minus}
%\begin{macro}{\si@fix@pm}
%\begin{macro}{\si@fix@mp}
% Signs for numbers are needed.
%    \begin{macrocode}
\newcommand*{\si@fix@plus}{+}
\newcommand*{\si@fix@minus}{-}
\newcommand*{\si@fix@pm}{\pm}
\newcommand*{\si@fix@mp}{\mp}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@fix@two}
%\begin{macro}{\si@fix@ten}
% The literals ``2'' and ``10'' are needed for exponents.
%    \begin{macrocode}
\newcommand*{\si@fix@two}{2}
\newcommand*{\si@fix@ten}{10}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@fix@slash}
% Another optional component that will probably not be used by many
% people.
%    \begin{macrocode}
\newcommand*{\si@fix@slash}{/}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@fix@none}
% Finally for spacing, there is the possibility of nothing at all
%    \begin{macrocode}
\newcommand*{\si@fix@none}{}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Symbols}
%\begin{macro}{\si@symbol}
% Each of the symbol macros needs to be set up; the options give a
% maths and text mode sign, but internally a single macro is needed
% for each.
%    \begin{macrocode}
\newcommand*{\si@symbol}[1]{%
  \expandafter\DeclareRobustCommand\expandafter*\expandafter{%
    \csname si@sym@#1\endcsname}{%
    \ifmmode
      \expandafter\csname si@maths#1\expandafter\endcsname%
    \else
      \expandafter\csname si@text#1\expandafter\endcsname%
    \fi}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@sym@Omega}
%\begin{macro}{\si@sym@ringA}
%\begin{macro}{\si@sym@mu}
%\begin{macro}{\si@sym@degree}
%\begin{macro}{\si@sym@minute}
%\begin{macro}{\si@sym@second}
%\begin{macro}{\si@sym@celsius}
% The various symbols are now declared.
%    \begin{macrocode}
\si@symbol{Omega}
\si@symbol{ringA}
\si@symbol{mu}
\si@symbol{degree}
\si@symbol{minute}
\si@symbol{second}
\si@symbol{celsius}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{si@tempa}
% The issue of redefinition of symbols now arises.  \currpkg can
% check for the loading of a number of support package, and can then
% redefine the appropriate symbols.
%    \begin{macrocode}
\AtBeginDocument{%
  \ifsi@redefsymbols
    \@ifpackageloaded{textcomp}
      {\si@log@debug{Redefining symbols using textcomp}%
       \renewcommand*{\si@textdegree}{\textdegree}%
       \renewcommand*{\si@mathsdegree}{\text{\textdegree}}%
%    \end{macrocode}
% \pkg{mathptmx} will give issues with \pkg{textcomp} and the
% \unitsym{\ohm} sign.
%    \begin{macrocode}
       \@ifpackageloaded{mathptmx}{}
         {\renewcommand*{\si@textmu}{\textmu}%
          \renewcommand*{\si@textOmega}{\textohm}}%
%    \end{macrocode}
% The \unitsym{\angstrom} symbol is only redefined if the encoding is
% OT1; other encodings should have a proper glyph used for \cs{AA}.
% The \cs{encodingdefault} macro is \cs{long} for some reason.
%    \begin{macrocode}
       \long\def\si@tempa{OT1}%
       \ifx\si@tempa\encodingdefault
         \renewcommand*{\si@mathsringA}{\text{\capitalring{A}}}%
         \renewcommand*{\si@textringA}{\capitalring{A}}
       \fi}{}
    \@ifpackageloaded{upgreek}
      {\si@log@debug{Redefining symbols using upgreek}%
       \renewcommand*{\si@mathsmu}{\upmu}%
       \renewcommand*{\si@mathsOmega}{\Upomega}}{}
  \fi}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Handling fractions}
%\begin{macro}{\si@frac}
%\begin{macro}{\si@frc@frac}
%\begin{macro}{\si@frc@slash}
%\begin{macro}{\si@frc@nice}
%\begin{macro}{\si@frc@sfrac}
% Various methods of handling fractions are provided.
%    \begin{macrocode}
\newcommand*{\si@frc@frac}[2]{%
  \ensuremath{\frac{\expandafter\si@unt@out\expandafter{#1}}%
    {\expandafter\si@unt@out\expandafter{#2}}}}
\let\si@frac\si@frc@frac
\newcommand*{\si@frc@slash}[2]{%
    \expandafter\si@unt@out\expandafter{#1}%
    \si@out@text{\ensuremath{\si@slash}}%
    \expandafter\si@unt@out\expandafter{#2}}
\newcommand*{\si@frc@nice}[2]{%
  \ensuremath{\si@frc@nicefrac{\expandafter\si@unt@out%
    \expandafter{#1}}{\expandafter\si@unt@out\expandafter{#2}}}}
\newcommand*{\si@frc@sfrac}[2]{%
    \sfrac{\expandafter\si@unt@out\expandafter{#1}}%
      {\expandafter\si@unt@out\expandafter{#2}}}
\AtBeginDocument{%
  \@ifpackageloaded{xfrac}
    {}
    {\si@log@inf{xfrac package unavailable\MessageBreak
       using `fraction=sfrac' will fall back on\MessageBreak
       nicefrac-like method}%
     \renewcommand*{\si@frc@sfrac}[2]{%
      \si@log@warn{xfrac package unavailable}%
      \si@frc@nice{#1}{#2}}}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@frc@nicefrac}
%\begin{macro}{\si@frc@displen}
%\begin{macro}{\si@frc@textlen}
%\begin{macro}{\si@frc@suplen}
%\begin{macro}{\si@frc@ssuplen}
% To avoid needing \unitspkg installed, the \cs{nicefrac} macro needs
% to be emulated here. The code is taken (with permission) from
% \kg{nicefrac}.\footnote{The original is licensed under the GPL;
% thanks to the author Axel Reichert for permission to copy the code
% here.}
%    \begin{macrocode}
\newlength\si@frc@displen
\newlength\si@frc@textlen
\newlength\si@frc@suplen
\newlength\si@frc@ssuplen
\newcommand*{\si@frc@nicefrac}{%
    \ifmmode
      \expandafter\si@frc@mathsnf%
    \else
      \expandafter\si@frc@textnf%
    \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@frc@mathsnf}
% The maths mode system.\\
%\cs{si@frc@mathsnf}\marg{numerator}\marg{denominator}
%    \begin{macrocode}
\newcommand*{\si@frc@mathsnf}[2]{%
  \begingroup
    \settoheight{\si@frc@displen}{\ensuremath{\displaystyle{M}}}%
    \settoheight{\si@frc@textlen}{\ensuremath{\textstyle{M}}}%
    \settoheight{\si@frc@suplen}{\ensuremath{\scriptstyle{M}}}%
    \settoheight{\si@frc@ssuplen}{\ensuremath{\scriptscriptstyle{M}}}%
    \addtolength{\si@frc@displen}{-\si@frc@ssuplen}%
    \addtolength{\si@frc@textlen}{-\si@frc@ssuplen}%
    \addtolength{\si@frc@suplen}{-\si@frc@ssuplen}%
    \mathchoice
      {\raisebox{\si@frc@displen}{\ensuremath{\scriptstyle{#1}}}}%
      {\raisebox{\si@frc@textlen}{\ensuremath{\scriptstyle{#1}}}}%
      {\raisebox{\si@frc@suplen}%
        {\ensuremath{\scriptscriptstyle{#1}}}}%
      {\raisebox{\si@frc@ssuplen}%
        {\ensuremath{\scriptscriptstyle{#1}}}}%
    \mkern-2mu/\mkern-1mu%
    \bgroup
      \mathchoice
        {\scriptstyle}%
        {\scriptstyle}%
        {\scriptscriptstyle}%
        {\scriptscriptstyle}%
      {#2}%
    \egroup
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@frc@textnf}
% A stripped down version of the \pkg{nicefrac} system for text mode.\\
%\cs{si@frc@textnf}\marg{numerator}\marg{denominator}
%    \begin{macrocode}
\newcommand*{\si@frc@textnf}[2]{%
  \begingroup
    \settoheight{\si@frc@textlen}{M}%
    \settoheight{\si@frc@ssuplen}{\fontsize\sf@size\z@%
      \selectfont{M}}%
    \addtolength{\si@frc@textlen}{-\si@frc@ssuplen}%
    \raisebox{\si@frc@textlen}{\fontsize\sf@size\z@%
      \selectfont{#1}}%
    \hspace{-0.25ex}/\hspace{-0.25ex}%
    \hbox{\fontsize\sf@size\z@\selectfont{#2}}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@frc@ugly}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% The \cs{si@frc@ugly} macro is needed to emulate the \opt{ugly}
% option in \unitspkg, where output depends on the current mode.\\
%\cs{si@frc@ugly}\marg{numerator}
%    \begin{macrocode}
\newcommand*{\si@frc@ugly}[1]{%
  \def\si@tempa{#1}%
  \ifmmode
    \expandafter\si@frc@frac%
  \else
    \def\si@tempb{1}%
    \ifx\si@tempa\si@tempb
%    \end{macrocode}
% The slash switch cannot be used, so the possibility of the
% numerator being one is handled here.
%    \begin{macrocode}
      \setbox\si@tempbox=\hbox{\ensuremath{\si@valuesep}}%
      \hskip-\wd\si@tempbox%
      \def\si@tempa{}%
    \fi
    \expandafter\si@frc@slash%
  \fi
  {\si@tempa}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsection{Font control}
% A number of controls and tests are needed to control the font used
% for output.  Underlying all of this is the \AMS\ package
% \pkg{amstext} package, providing the \cs{text} command.  Much of
% the font control system here is taken more or less verbatim from
% \sistyle; modifications have been made to fit the \currpkg
% interface.
%
%\begin{macro}{\si@fam@getmfam}
%\begin{macro}{\si@fam@sf}
%\begin{macro}{\si@fam@tt}
% The font families in use in the document are needed.
%    \begin{macrocode}
\newcommand*{\si@fam@getmfam}{%
  \sbox{0}{$%
    \@ifundefined{mathsf}
      {\si@log@debug{No mathsf family found}%
       \global\chardef\si@fam@sf=99}%
      {\mathsf{\global\chardef\si@fam@sf=\fam}}%
    \@ifundefined{mathtt}
      {\si@log@debug{No mathtt family found}%
       \global\chardef\si@fam@tt=99}%
      {\mathtt{\global\chardef\si@fam@tt=\fam}}%
    $}}
\AtBeginDocument{\si@fam@getmfam}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@fam@ifbtext}
%\begin{macro}{\si@fam@ifbmaths}
%\begin{macro}{\si@tempa}
% These tests check for bold in text and maths mode, respectively.\\
%\cs{si@fam@ifbtext}\marg{code}\\
%\cs{si@fam@ifbmaths}\marg{code}\\
%    \begin{macrocode}
\newcommand*{\si@fam@ifbtext}[1]{%
  \if b\expandafter\@car\f@series\@nil
    #1\fi}
\newcommand{\si@fam@ifbmaths}[1]{%
  \def\si@tempa{bold}%
  \ifx\math@version\si@tempa
    #1\fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@fam@ifbinline}
% For compatibility with \unitspkg, a method to change the behaviour
% when in inline maths is needed for the bold detector.
%    \begin{macrocode}
\newcommand*{\si@fam@ifbinline}{%
  \ifsi@inlinebtext
    \expandafter\si@fam@ifbtext%
  \else
    \expandafter\si@fam@ifbmaths%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@fam@ifitext}
%\begin{macro}{\si@tempa}
% This test check for italic or slanted text in text mode, by
% negation (upright text is |n|).\\
%\cs{si@fam@ifitext}\marg{code}\\
%    \begin{macrocode}
\newcommand*{\si@fam@ifitext}[1]{%
  \if n\expandafter\@car\f@series\@nil\else
    #1\fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@fam@mode}
% Detection of the current mode needs to happen``early'' (before any
% change of \cs{ensuremath}).  So a short macro is provided to do the
% job.
%    \begin{macrocode}
\newcommand*{\si@fam@mode}{%
  \ifsi@obeymode
    \ifmmode
      \sisetup{mode=maths}%
    \else
      \sisetup{mode=text}%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ifsi@fam@set}
% A marker is set up to check if font-matching has been taken place.
%    \begin{macrocode}
\newif\ifsi@fam@set
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@fam@set}
% Using the code from \sistyle as a base, a set of tests are used to
% set the current font families and weights.
%    \begin{macrocode}
\newcommand*{\si@fam@set}{%
  \si@fam@settrue
%    \end{macrocode}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% The temporary macros are needed for the \cs{ifx} tests.
%    \begin{macrocode}
  \edef\si@tempa{\sfdefault}%
  \edef\si@tempb{\ttdefault}%
%    \end{macrocode}
%\end{macro}
%\end{macro}
% The surrounding font family is only tested if matching is
% requested.
%    \begin{macrocode}
  \ifsi@obeyfamily
    \si@log@debug{Font detection: checking font}%
%    \end{macrocode}
%\begin{macro}{\si@fam@maths}
%\begin{macro}{\si@fam@text}
% Next, checks are needed for maths \latin{versus} text mode, and if
% in maths mode, whether this is inline or display.  Once that is
% done, font families can be tested.
%    \begin{macrocode}
    \ifmmode
      \ifdim\displaywidth>0pt\relax
        \si@log@debug{Font detection: display maths}%
        \ifnum\the\fam=\si@fam@sf
          \si@log@debug{Font detection: sf}%
          \expandafter\let\expandafter\si@fam@maths
            \csname\si@mathssf\endcsname
          \expandafter\let\expandafter\si@fam@text
            \csname\si@textsf\endcsname
        \else
          \ifnum\the\fam=\si@fam@tt
            \si@log@debug{Font detection: tt}%
            \expandafter\let\expandafter\si@fam@maths
              \csname\si@mathstt\endcsname
            \expandafter\let\expandafter\si@fam@text
              \csname\si@texttt\endcsname
          \else
            \si@log@debug{Font detection: rm}%
            \expandafter\let\expandafter\si@fam@maths
              \csname\si@mathsdefault\endcsname
            \expandafter\let\expandafter\si@fam@text
              \csname\si@textdefault\endcsname
          \fi
        \fi
%    \end{macrocode}
% Inline maths is now handled.
%    \begin{macrocode}
      \else
        \si@log@debug{Font detection: inline maths}%
        \ifx\f@family\si@tempa
          \si@log@debug{Font detection: sf}%
          \expandafter\let\expandafter\si@fam@maths
            \csname\si@mathssf\endcsname
          \expandafter\let\expandafter\si@fam@text
            \csname\si@textsf\endcsname
        \else
          \ifx\f@family\si@tempb
            \si@log@debug{Font detection: tt}%
            \expandafter\let\expandafter\si@fam@maths
              \csname\si@mathstt\endcsname
            \expandafter\let\expandafter\si@fam@text
              \csname\si@texttt\endcsname
          \else
            \si@log@debug{Font detection: rm}%
            \expandafter\let\expandafter\si@fam@maths
              \csname\si@mathsdefault\endcsname
            \expandafter\let\expandafter\si@fam@text
              \csname\si@textdefault\endcsname
          \fi
        \fi
      \fi
%    \end{macrocode}
% Not in maths mode, so the text mode checks are carried out.
%    \begin{macrocode}
    \else
      \si@log@debug{Font detection: text}%
      \ifx\f@family\si@tempa
        \si@log@debug{Font detection: sf}%
        \expandafter\let\expandafter\si@fam@maths
          \csname\si@mathssf\endcsname
        \expandafter\let\expandafter\si@fam@text
          \csname\si@textsf\endcsname
      \else
        \ifx\f@family\si@tempb
          \si@log@debug{Font detection: tt}%
          \expandafter\let\expandafter\si@fam@maths
            \csname\si@mathstt\endcsname
          \expandafter\let\expandafter\si@fam@text
            \csname\si@texttt\endcsname
        \else
          \si@log@debug{Font detection: rm}%
          \expandafter\let\expandafter\si@fam@maths
            \csname\si@mathsdefault\endcsname
          \expandafter\let\expandafter\si@fam@text
            \csname\si@textdefault\endcsname
        \fi
      \fi
    \fi
%    \end{macrocode}
% If the local font is not to be matched, setting the fonts is
% rather less complex.
%    \begin{macrocode}
  \else
    \si@log@debug{Font detection: inactive}%
    \expandafter\let\expandafter\si@fam@maths
      \csname\si@mathsdefault\endcsname
    \expandafter\let\expandafter\si@fam@text
      \csname\si@textdefault\endcsname
  \fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@fam@bold}
%\begin{macro}{\si@fam@setbold}
% With the font family set, the next check is for bold text.  This
% again needs to examine the current mode. Things are a bit more
% complex than in \sistyle as it is possible to be typesetting in
% either text or maths mode.  The bold commands are set up with
% \cs{def}, as nested calls can occur.
%    \begin{macrocode}
  \def\si@fam@bold{\unboldmath\mdseries}%
  \def\si@fam@setbold{\boldmath\bfseries}%
  \ifsi@obeybold
    \si@log@debug{Weight detection: checking weight}%
    \ifmmode
%    \end{macrocode}
%\end{macro}
% Display maths.
%    \begin{macrocode}
      \ifdim\displaywidth>0pt\relax
        \si@fam@ifbmaths
          {\let\si@fam@bold\si@fam@setbold
           \si@log@debug{Weight detection: bold weight}}%
%    \end{macrocode}
% Inline maths.
%    \begin{macrocode}
      \else
        \si@fam@ifbinline
          {\let\si@fam@bold\si@fam@setbold
           \si@log@debug{Weight detection: bold weight}}%
      \fi
%    \end{macrocode}
% Text mode.
%    \begin{macrocode}
    \else
      \si@fam@ifbtext%
        {\let\si@fam@bold\si@fam@setbold
         \si@log@debug{Weight detection: bold weight}}%
    \fi
  \fi
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@fam@italic}
% The value of \opt{obeyitalic} is now tested; as this does nothing
% in maths mode, a reminder is added to the log.
%    \begin{macrocode}
  \let\si@fam@italic\upshape
  \ifsi@obeyitalic
    \si@log@debug{Italic detection: checking italic}%
    \si@fam@ifitext
      {\let\si@fam@italic\relax
       \si@log@debug{Italic detection: italic}}%
    \ifsi@textmode\else
      \si@log@inf{maths mode - obeyitalic inactive}%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\subsection{Formatting numbers}
%\begin{macro}{\num}
% The system used here is modelled on that in \numprint; the
% input is broken down into single tokens, each one is examined and
% the result is re-assembled into an output number.  However, various
% changes have been made to the system used, and so the macros here
% are not simply renamed copies of those in \numprint.  The user
% macro \cs{num} sets any local keys, then calls the number
% formatting macro on the processed number.\\
%\cs{num}\oarg{options}\marg{num}
%    \begin{macrocode}
\DeclareRobustCommand*{\num}[2][]{%
  \begingroup%
    \sisetup{#1}%
    \si@fam@mode%
    \si@log@debug{Processing \string\num\space input `#2'}%
    \expandafter\si@out@num\expandafter{\si@num{#2}}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num}
% This is the main processing macro.  Unlike the related macro in
% \numprint, the output of this macro is not subjected to any font
% changes.  That is left to one of the \cs{si@out@\ldots} macros.  No
% grouping is applied here; any call to \cs{si@num} (or any of the
% sub-macros) must be within a group as the definitions used rely on
% this.  Grouping is not applied here so that other macros can get
% the various separated parts of the input.\\
%\cs{si@num}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@num}[1]{%
%    \end{macrocode}
%\begin{macro}{\si@tempa}
% The argument of the macro is fully expanded before any processing.
% By using \cs{scantokens}, any odd problems from packages with
% active characters can be avoided.  A bit of trickery is needed to
% avoid getting an extraneous space introduced here by
% \cs{scantokens}, hence the use of \cs{@empty}.
%    \begin{macrocode}
  \begingroup
    \makeatletter%
    \@makeother{\,}%
    \@makeother{\.}%
    \@makeother{\+}%
    \@makeother{\-}%
    \def~{}%
    \def\,{}%
    \catcode`\~=\active\relax
    \catcode`\^=\active\relax
    \scantokens{\si@num@xdef\si@tempa{#1}\@empty}%
  \endgroup
%    \end{macrocode}
% Processing only takes place if there is actually something in the
% argument.  This is tested once ``hard'' spaces have been stripped
% out.  If there is no argument, nothing happens; everything else in
% the \cs{si@num} macro occurs only if the argument is filled.
%    \begin{macrocode}
  \si@ifnotmtarg{\si@tempa}{%
%    \end{macrocode}
% The input is now validated. Further processing takes place a little
% later.
%    \begin{macrocode}
    \expandafter\si@num@valid\si@tempa\@empty\@empty%
%    \end{macrocode}
%\end{macro}
% If the input is valid, the input is passed to the number formatter.
%    \begin{macrocode}
   \ifsi@switch
     \expandafter\si@num@format\expandafter\si@tempa%
   \else
%    \end{macrocode}
% The parser must have bailed-out, and so no further processing of
% the input is done.  Instead, whatever was passed to the macro is
% returned as supplied.
%    \begin{macrocode}
     {#1}%
   \fi}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@xdef}
% When carrying out the \cs{edef} used to fully-expand a number,
% \cs{,} and |~| are deactivated, so that macros do not end up in the
% number. By using a separate macro, \cs{scantokens} is easier.
% \cs{protected@xdef} is not used here, as the argument given should
% only contain single (processable) characters or macros that expand
% to the same, not other macros or characters.\\
%\cs{si@num@xdef}\meta{macro}\meta{num}\cs{@empty}
%    \begin{macrocode}
\def\si@num@xdef#1#2\@empty{\xdef#1{#2}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@valid}
% Assuming that there is a non-space argument to \cs{si@num}, every
% character is checked to ensure it is valid in the context, so that
% further processing can occur without sanity checks.  If the
% character is valid, recursion occurs.\\
%\cs{si@num@valid}\meta{char}\meta{chars}\cs{@empty}
%    \begin{macrocode}
\def\si@num@valid#1#2\@empty{%
  \si@num@ifchr{#1}{\si@numvalid}{%
    \ifx\@empty#2\@empty\else
      \si@num@valid#2\@empty\@empty\@empty%
    \fi
    \si@switchtrue}%
%    \end{macrocode}
% If an invalid character has been picked up, the whole parsing
% system has to bail out.
%    \begin{macrocode}
    {\si@log@err{Invalid character `#1' in numerical input}%
       {Only characters from the list `\si@numvalid'\MessageBreak
          should be present in the argument of the \string\num
          macro\MessageBreak (or derivative such as an `s' column)}%
     \si@switchfalse}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@ifchr}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% A test is needed to check one string only contains characters from
% a second.  The main macro sets up for the recursion system below.\\
%\cs{si@num@ifchr}\marg{test-chars}\marg{valid-chars}
%    \begin{macrocode}
\newcommand*{\si@num@ifchr}[2]{%
  \begingroup
    \si@switchfalse
    \def\si@tempa{#1}%
    \edef\si@tempb{#2}%
%    \end{macrocode}
%\end{macro}
%\end{macro}
% Now the test can occur for the initial comparison string.
%    \begin{macrocode}
    \expandafter\si@num@chrstr\si@tempb\@empty\@empty%
%    \end{macrocode}
% By ending the group inside the \cs{if}, \cs{global} is avoided, and
% the switch can be used for other jobs.
%    \begin{macrocode}
  \ifsi@switch%
    \endgroup\expandafter\@firstoftwo%
  \else
    \endgroup\expandafter\@secondoftwo%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@chrstr}
% The second part of the comparison macro does the actual work.  This
% takes one character of the string of valid input at a time, and
% compares it to the single character in \cs{si@tempa}.\\
%\cs{si@num@chrstr}\meta{char}\meta{chars}\cs{@empty}
%    \begin{macrocode}
\def\si@num@chrstr#1#2\@empty{%
%    \end{macrocode}
%\begin{macro}{\si@tempb}
%\begin{macro}{\si@tempc}
% \cs{si@tempc} is used to hold the single character to check against
% \cs{si@tempa}, while \cs{si@tempb} stores the remaining characters
% to be compared.
%    \begin{macrocode}
  \def\si@tempc{#1}%
  \edef\si@tempb{#2}%
  \ifx\si@tempa\si@tempc
    \si@switchtrue
  \else
%    \end{macrocode}
%\end{macro}
%\end{macro}
% If \cs{si@tempb} is \cs{@empty}, then the recursion has
% bottomed-out, and all of the comparisons are done.  If not, go
% round again.
%    \begin{macrocode}
    \ifx\@empty\si@tempb\@empty\else
      \si@num@chrstr#2\@empty%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@exp}
%\begin{macro}{\si@num@mant}
%\begin{macro}{\si@num@expout}
%\begin{macro}{\si@num@mantout}
%\begin{macro}{\si@num@out}
% Various storage macros are needed.
%    \begin{macrocode}
\newcommand*{\si@num@exp}{}
\newcommand*{\si@num@mant}{}
\newcommand*{\si@num@expout}{}
\newcommand*{\si@num@mantout}{}
\newcommand*{\si@num@out}{}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@num@format}
%\begin{macro}{\si@num@arg}
% The number processor starts by saving |#1| (odd things happen
% otherwise), and locally clearing the stacks.\\
%\cs{si@num@format}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@num@format}[1]{%
  \protected@edef\si@num@arg{#1}%
  \def\si@num@exp{}%
  \def\si@num@mant{}%
  \def\si@num@expout{}%
  \def\si@num@mantout{}%
  \si@log@debug{Formatting number `\si@num@arg'}%
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
  \si@switchfalse
%    \end{macrocode}
% The input is split into an mantissa and an exponent.
%    \begin{macrocode}
  \expandafter\si@num@mantexp\si@num@arg\@empty\@empty%
%    \end{macrocode}
% The mantissa and exponent are now processed separately.  Firstly, a
% sign is tested for.  If there is one, it is added to
% \cs{si@num@out}, while the rest of the number is returned ``as is''
% in \cs{si@num@\ldots}.
%    \begin{macrocode}
  \si@num@sign{mant}%
%    \end{macrocode}
%\begin{macro}{\si@num@out}
% To allow for the case where the mantissa is only a sign, but the
% exponent contains a number, the output is initially defined to
% whatever is in \cs{si@num@mantout}.  This will change if there is a
% number in \cs{si@num@mant}.
%    \begin{macrocode}
  \protected@edef\si@num@out{\si@num@mantout}%
  \ifx\@empty\si@num@mant\@empty\else
     \si@num@digits{mant}%
     \protected@edef\si@num@out{\si@num@mantout}%
  \fi
  \si@num@sign{exp}%
  \ifx\@empty\si@num@exp\@empty\else
    \si@num@digits{exp}%
%    \end{macrocode}
% Allowance is made for the possibility of negative exponential-only
% numbers. Precautions are taken for the multiply sign (which is
% always in maths mode), and superscripts.  \cs{textsuperscript} is
% used here, as this will work in text or maths mode in the output
% routine.
%    \begin{macrocode}
    \ifx\@empty\si@num@mant\@empty\else
      \protected@edef\si@num@out%
        {\si@num@out\noexpand\ensuremath{{}\noexpand\si@expproduct{}}}%
    \fi
    \protected@edef\si@num@out%
      {\si@num@out\si@exppower%
        \noexpand\textsuperscript{\si@num@expout}}%
  \fi
%    \end{macrocode}
% If there is nothing in either number macro, then something is
% wrong.
%    \begin{macrocode}
  \ifx\@empty\si@num@mant\@empty
    \ifx\@empty\si@num@exp\@empty
      \si@log@err{Invalid number format `\si@num@arg'}%
        {Something is wrong with the number format; does it
         contain \MessageBreak any numbers (from the list %
            `\si@numlist')?}%
      \renewcommand*\si@num@out{}%
    \fi
  \fi%
%    \end{macrocode}
%\end{macro}
% With everything done, the result is output.
%    \begin{macrocode}
  \si@num@out}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@mantexp}
% Splitting the mantissa and exponent first checks for characters to
% gobble, which are simply thrown away.  For any other input, there
% are two possibilities.  If the character is an exponent marker,
% then the package switches from collecting the mantissa to
% collecting the exponent (after a sanity check).  All other
% characters are added to either the mantissa or the exponent, as
% appropriate.\\
%\cs{si@num@mantexp}\meta{char}\meta{chars}\cs{@empty}
%    \begin{macrocode}
\def\si@num@mantexp#1#2\@empty{%
  \si@num@ifchr{#1}{\si@numgobble}{}{%
    \si@num@ifchr{#1}{\si@numexp}%
      {\ifsi@switch
         \si@log@err{Duplicate exponent marker found}%
           {Only a single exponent character (from the list
             `\si@numexp')\MessageBreak may occur in a
             numerical argument}%
      \fi
      \si@switchtrue
      \si@log@debug{Exponent marker `#1' found in `\si@num@arg'}}%
%    \end{macrocode}
% When building up the mantissa and exponent, everything must be
% expandable, so \cs{edef} can be used rather than
% \cs{g@addto@macro}.
%    \begin{macrocode}
      {\ifsi@switch
         \si@log@debug{Adding `#1' to exponent for `\si@num@arg'}%
         \protected@edef\si@num@exp{\si@num@exp#1}%
       \else
         \si@log@debug{Adding `#1' to mantissa for `\si@num@arg'}%
         \protected@edef\si@num@mant{\si@num@mant#1}%
       \fi}}%
%    \end{macrocode}
% If the recursion has not bottomed out, another loop occurs.
%    \begin{macrocode}
  \ifx\@empty#2\@empty\else
    \si@num@mantexp#2\@empty\@empty\@empty%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@sign}
% The digit processor does several things to convert the run of
% digits, plus potentially a sign and a decimal point into the
% correct format for output.\\
%\cs{si@num@sign}\marg{mant/exp}
%    \begin{macrocode}
\newcommand*{\si@num@sign}[1]{%
  \expandafter\ifx\expandafter\@empty\csname si@num@#1\endcsname%
    \@empty\else
%    \end{macrocode}
% If the whole argument is not empty, then the sign-testing macro is
% run. This will return the sign in \cs{si@tempa} and the digits in
% \cs{si@tempb}.
%    \begin{macrocode}
    \expandafter\expandafter\expandafter\si@num@gensign%
      \csname si@num@#1\endcsname\@empty\@empty\@empty%
%    \end{macrocode}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempc}
% If a sign has to be added to unsigned numbers, this is
% done here.
%    \begin{macrocode}
    \edef\si@tempc{#1}%
    \ifx\@empty\si@tempa\@empty
      \def\si@tempa{mant}%
      \ifx\si@tempa\si@tempc
        \ifsi@num@signmant
          \si@log@debug{Adding sign \si@sign\space to mantissa for
            `\si@num@arg'}%
          \protected@edef\si@tempa{\si@sign}%
        \else
          \def\si@tempa{}%
        \fi
      \else
        \ifsi@num@signexp
          \si@log@debug{Adding sign \si@sign\space to exponent for
            `\si@num@arg'}%
          \protected@edef\si@tempa{\si@sign}%
        \else
          \def\si@tempa{}%
        \fi
      \fi
    \fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
% If there is no sign, then the original macro contains a pure
% number, and nothing happens (an empty number has already been
% tested for).
%    \begin{macrocode}
    \ifx\@empty\si@tempa\@empty
      \def\si@tempa{mant}%
      \ifx\si@tempa\si@tempc
        \si@log@debug{Unsigned mantissa for `\si@num@arg'}%
      \else
        \si@log@debug{Unsigned exponent for `\si@num@arg'}%
      \fi
    \else
%    \end{macrocode}
% There is a sign, so it is added to the output stack.
%    \begin{macrocode}
      \expandafter\protected@edef\csname si@num@#1out\endcsname%
        {\noexpand\ensuremath{\si@tempa}}%
%    \end{macrocode}
% A sign but no number can only be correct if the input is something
% like |-e10| to give \num{-e10}.
%    \begin{macrocode}
      \ifx\@empty\si@tempb\@empty
        \expandafter\def\csname si@num@#1\endcsname{}%
%    \end{macrocode}
%\begin{macro}{\si@tempa}
% \cs{si@tempa} is no longer needed, so can be reused.
%    \begin{macrocode}
        \def\si@tempa{mant}%
%    \end{macrocode}
%\end{macro}
% Checks to see if this is a mantissa, and that there is an exponent.
%    \begin{macrocode}
        \ifx\si@tempa\si@tempc
          \ifx\@empty\si@num@exp\@empty
            \si@log@warn{Sign but no number for `\si@num@arg'}%
          \fi
        \else
          \si@log@warn{Sign but no number for `\si@num@arg'}%
        \fi
      \else
        \expandafter\protected@edef\csname si@num@#1\endcsname%
          {\si@tempb}%
      \fi
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@gensign}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% The first one or two characters of the mantissa or exponent may
% contain a sign.  To test for this, the first two characters of the
% number are split off, and examined.  Two characters are used so
% that \cs{pm} and \cs{mp} can be represented by |+-| and |-+|,
% respectively. To allow the user to alter the valid signs, but
% retain this conversion, the generic character test is used before
% checking specific matches.\\
%\cs{si@num@gensign}\meta{char}\meta{char}\meta{chars}\cs{@empty}
%    \begin{macrocode}
\def\si@num@gensign#1#2#3\@empty{%
  \si@num@ifchr{#1}{\si@numsign}{%
    \si@num@ifchr{#2}{\si@numsign}{%
      \if +#1
        \if -#2
          \si@log@debug{Found sign combination +- for `\si@num@arg'}%
          \def\si@tempa{\pm}%
        \else
          \si@log@warn{Unknown sign combination `#1#2'}%
          \def\si@tempa{#1#2}%
        \fi
      \else
        \if -#1
          \if +#2
          \si@log@debug{Found sign combination -+ for `\si@num@arg'}%
            \def\si@tempa{\mp}%
          \else
            \si@log@warn{Unknown sign combination `#1#2'}%
            \def\si@tempa{#1#2}%
          \fi
        \else
          \si@log@warn{Unknown sign combination `#1#2'}%
          \def\si@tempa{#1#2}%
        \fi
      \fi
      \edef\si@tempb{#3}}%
%    \end{macrocode}
% Only one valid sign character.
%    \begin{macrocode}
      {\si@log@debug{Found single sign character `#1' for
         `\si@num@arg'}%
       \def\si@tempa{#1}%
       \edef\si@tempb{#2#3}}}%
%    \end{macrocode}
% No valid sign, so \cs{@empty} is returned for the sign .
%    \begin{macrocode}
    {\si@log@debug{No sign found for `\si@num@arg'}%
     \def\si@tempa{}%
     \edef\si@tempb{#1#2#3}}}%
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@num@digits}
%\begin{macro}{\si@tempb}
%\begin{macro}{\si@tempc}
% The core digit processor divides the number into the parts before
% and after the decimal point marker.\\
%\cs{si@num@digits}\marg{mant/exp}
%    \begin{macrocode}
\newcommand*{\si@num@digits}[1]{%
  \def\si@tempa{}%
  \def\si@tempb{}%
%    \end{macrocode}
% The package switch is used to indicate finding a decimal marker.
%    \begin{macrocode}
  \si@switchfalse
  \expandafter\expandafter\expandafter\si@num@split%
    \csname si@num@#1\endcsname\@empty\@empty%
%    \end{macrocode}
% The pre-decimal part of the number is now in \cs{si@tempa}, and the
% post-decimal part in \cs{si@tempb}.  A quick check is made on the
% pre-decimal part of the number.
%    \begin{macrocode}
  \ifx\@empty\si@tempa\@empty
    \ifsi@num@padlead
      \si@log@debug{Adding leading zero for `\si@num@arg'}%
      \def\si@tempa{0}%
    \fi
  \fi
%    \end{macrocode}
% A second test is needed, in case a zero should be added when a
% decimal marker is followed by nothing at all.  Here, the fact that
% a decimal marker was found is needed; the test is done now so
% \cs{ifsi@switch} can be reused.
%    \begin{macrocode}
  \ifx\@empty\si@tempb\@empty
    \ifsi@num@padtrail
      \ifsi@switch
        \si@log@debug{Adding trailing zero for `\si@num@arg'}%
        \def\si@tempb{0}%
      \fi
    \fi
  \fi
%    \end{macrocode}
% The contents of \cs{si@tempa} and \cs{si@tempb} are now completed.
% Some error checking is done, in case an odd argument has been
% given.
%    \begin{macrocode}
  \ifx\@empty\si@tempa\@empty
    \ifx\@empty\si@tempb\@empty\else
      \si@num@sepdigits{#1}%
    \fi
  \else
    \si@num@sepdigits{#1}%
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@num@split}
% The \cs{si@num@split} macro compares each character in the input
% against the list of characters valid at this stage: numbers,
% decimal markers and ``extra'' characters.  Before finding a decimal
% marker, numbers and extra characters are added to \cs{si@tempa};
% after a decimal is found, characters are added to \cs{si@tempb}.\\
%\cs{si@num@split}\meta{char}\meta{chars}\cs{@empty}
%    \begin{macrocode}
\def\si@num@split#1#2\@empty{%
  \si@num@ifchr{#1}{\si@numdecimal}{%
    \ifsi@switch
      \si@log@err{Duplicate decimal marker in `\si@num@arg'}
        {Only a single decimal marker (from the list
           `\si@numdecimal')\MessageBreak may occur in a
           numerical argument}%
    \else
      \si@log@debug{Found decimal marker `#1' in `\si@num@arg'}%
      \si@switchtrue
    \fi}{%
%    \end{macrocode}
% The earlier code only checks for a sign at the start of the text. A
% check is therefore needed for a sign after the first two
% characters; if one is found, it is ignored.
%    \begin{macrocode}
    \si@num@ifchr{#1}{\si@numsign}{%
      \si@log@err{Misplaced sign in `\si@num@arg'}
        {Sign characters `\si@numsign' can only occur\MessageBreak
           at the start of a number}}{%
%    \end{macrocode}
% The current character is added to the appropriate stack.
%    \begin{macrocode}
      \ifsi@switch
        \si@log@debug{Adding `#1' to decimal part for `\si@num@arg'}%
        \protected@edef\si@tempb{\si@tempb#1}%
      \else
        \si@log@debug{Adding `#1' to integer part for `\si@num@arg'}%
        \protected@edef\si@tempa{\si@tempa#1}%
      \fi}}%
%    \end{macrocode}
% Unless the recursion has bottomed, loop round again.
%    \begin{macrocode}
  \ifx\@empty#2\@empty\else
    \si@num@split#2\@empty\@empty%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@decimalhook}
% A hook is needed to attach things inside the group to happen
% afterwards, if the number is a decimal.
%    \begin{macrocode}
\newcommand*{\si@num@decimalhook}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@sepdigits}
% The \cs{si@num@sepdigits} macro is only called if at least one of
% the mantissa and exponent contain something to output. The integer
% and decimal parts of the number are processed separately.  First, a
% check is made to see if each part contains ``extra'' characters; if
% it does, no digit-separating is even attempted.\\
%\cs{si@num@sepdigits}\marg{mant/exp}
%    \begin{macrocode}
\newcommand*{\si@num@sepdigits}[1]{%
  \si@num@ifextra{\si@tempa}{}
%    \end{macrocode}
%\begin{macro}{\si@tempc}
% If the input is a pure number, then separation is attempted.
%    \begin{macrocode}
    {\expandafter\si@num@int\expandafter{\si@tempa}}%
  \def\si@tempc{}%
  \ifx\@empty\si@tempb\@empty\else
    \protected@edef\si@tempc{\noexpand\ensuremath{{\noexpand%
      \si@decimalsign}}}%
    \si@num@decimalhook%
    \si@num@ifextra{\si@tempb}{}%
      {\expandafter\si@num@dec\expandafter{\si@tempb}}%
  \fi
%    \end{macrocode}
%\end{macro}
% The construction is finalised by re-combining the number.
%    \begin{macrocode}
  \expandafter\protected@edef\csname si@num@#1out\endcsname%
    {\csname si@num@#1out\endcsname\si@tempa\si@tempc\si@tempb}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@ifextra}
%\begin{macro}{\si@num@extra}
% A relatively simple test for ``extra'' characters.  Once again, a
% bit of group trickery is used.\\
%\cs{si@num@ifextra}\marg{integer}\\
%\cs{si@num@extra}\meta{char}\meta{chars}\cs{@empty}
%    \begin{macrocode}
\newcommand*{\si@num@ifextra}[1]{%
  \begingroup
    \si@switchfalse
    \expandafter\si@num@extra#1\@empty\@empty%
    \ifsi@switch
      \si@log@debug{Found `extra' characters in `#1'}%
      \endgroup\expandafter\@firstoftwo%
    \else
      \endgroup\expandafter\@secondoftwo%
    \fi}
\def\si@num@extra#1#2\@empty{%
  \ifx\@empty#1\@empty\else
    \si@num@ifchr{#1}{\si@numextra}{\si@switchtrue}{}%
    \ifx\@empty#2\@empty\else
      \si@num@extra#2\@empty\@empty%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@num@int}
%\begin{macro}{\si@tempa}
% The formatting code for separating thousands is taken more-or-less
% directly from \sistyle.  A few changes are made to fit the various
% conventions here.  Following on from the code above, \cs{si@tempa}
% is used to store the integer part of the number, and \cs{si@tempb}
% is used for the decimal part.\\
%\cs{si@num@int}\marg{integer-part}
%    \begin{macrocode}
\newcommand*{\si@num@int}[1]{%
  \def\si@tempa{}%
  \ifsi@sepfour
    \si@num@intfmt{}#1\@empty\@empty\@empty%
  \else
    \si@num@iffive{#1}
      {\si@num@intfmt{}#1\@empty\@empty\@empty}
      {\def\si@tempa{#1}}%
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@num@iffive}
%\begin{macro}{\si@num@five}
% A test is needed for the presence of more than four characters.\\
%\cs{si@num@iffive}\marg{num}\\
%\cs{si@num@five}\meta{char}\meta{char}\meta{char}\meta{char}^^A
%\meta{chars}\cs{end}\\
%    \begin{macrocode}
\newcommand*{\si@num@iffive}[1]{%
  \si@num@five#1\@empty\@empty\@empty\@empty\@empty\end}
\def\si@num@five#1#2#3#4#5\end{%
   \ifx\@empty#5\@empty
      \expandafter\@secondoftwo%
   \else
      \expandafter\@firstoftwo%
   \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@num@intfmt}
%\begin{macro}{\si@num@fiint}
% The business end of the integer formatter.
%\cs{si@num@intfmt}\marg{char}\marg{char}\marg{char}\marg{char}\\
%\cs{si@num@fiint}\meta{chars}\cs{fi}\cs{fi}\cs{fi}
%    \begin{macrocode}
\newcommand*{\si@num@intfmt}[4]{%
  \ifx\@empty#2\@empty
    \si@num@intsep#1\relax
  \else
    \ifx\@empty#3\@empty
      \si@num@intsep\@empty\@empty#1#2\relax
    \else
      \ifx\@empty#4\@empty
        \si@num@intsep\@empty#1#2#3\relax
      \else
        \si@num@fiint{#1#2#3#4}%
      \fi
    \fi
  \fi}
\def\si@num@fiint#1\fi\fi\fi{\fi\fi\fi\si@num@intfmt{#1}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@num@intsep}
%\begin{macro}{\si@tempa}
% For adding separation to integers, an extra function is needed.\\
%\cs{si@num@intsep}\marg{char}\marg{char}\marg{char}\marg{char}
%    \begin{macrocode}
\newcommand*{\si@num@intsep}[4]{%
  \protected@edef\si@tempa{\si@tempa#1#2#3}%
  \if\relax#4\relax
  \else
    \protected@edef\si@tempa{\si@tempa\noexpand\ensuremath{\noexpand%
      \si@digitsep}}%
    \expandafter\si@num@intsep\expandafter#4%
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@num@dec}
%\begin{macro}{\si@num@decfmt}
%\begin{macro}{\si@tempb}
% Formatting a decimal uses a similar mechanism, but with a few
% alterations needed.\\
%\cs{si@num@dec}\marg{decimal-part}\\
%\cs{si@num@decfmt}\marg{char}\marg{char}\marg{char}\marg{char}\\
%    \begin{macrocode}
\newcommand*{\si@num@dec}[1]{%
  \def\si@tempb{}%
  \ifsi@sepfour
    \si@num@decfmt#1\@empty\@empty\@empty\@empty%
  \else
    \si@num@iffive{#1}
      {\si@num@decfmt#1\@empty\@empty\@empty\@empty}
      {\protected@edef\si@tempb{\si@tempb#1}}%
  \fi
}
\newcommand*{\si@num@decfmt}[4]{%
  \protected@edef\si@tempb{\si@tempb#1#2#3}%
  \ifx\@empty#4\@empty%
  \else
    \protected@edef\si@tempb{\si@tempb\noexpand\ensuremath{\noexpand%
      \si@digitsep}}%
    \expandafter\si@num@decfmt\expandafter#4%
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsection{Formatting angles}
%\begin{macro}{\ang}
% The approach used here is similar to that in \sistyle, but has been
% modified in a few ways.\\
%\cs{ang}\oarg{options}\marg{decimal-angle}\\
%\cs{ang}\oarg{options}|{|\meta{deg};\meta{min};\meta{sec}|}|
%    \begin{macrocode}
\DeclareRobustCommand*{\ang}[2][]{%
  \begingroup
    \sisetup{#1}%
    \si@fam@mode%
    \si@log@debug{Processing \string\ang\space input `#2'}%
    \@makeother{\;}%
    \makeatletter%
    \scantokens{\si@ang@parse#2;;;\@nil}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@ang@parse}
% With the correct catcodes in place, processing can take place strip
% out the semi-colons.\\
%\cs{si@ang@parse}\meta{num}|;|\meta{num}|;|\meta{num}|;|^^A
%\meta{chars}\cs{@nil}
%    \begin{macrocode}
\def\si@ang@parse#1;#2;#3;#4\@nil{\si@ang@set{#1}{#2}{#3}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@ang@killdegree}
%\begin{macro}{\si@ang@killminute}
%\begin{macro}{\si@ang@killsecond}
%\begin{macro}{\si@ang@astrosign}
%\begin{macro}{\si@ang@decimalsign}
% A mechanism is needed to handle moving the angle unit sings for the
% \opt{astroang} option.  This requires two steps, producing the sign
% over the decimal sign and preventing duplicate symbols appearing.\\
%\cs{si@ang@astrosign}\marg{degree/minute/second}
%    \begin{macrocode}
\newcommand*{\si@ang@killdegree}{\let\si@sym@degree\relax}
\newcommand*{\si@ang@killminute}{\let\si@sym@minute\relax}
\newcommand*{\si@ang@killsecond}{\let\si@sym@second\relax}
\newcommand*{\si@ang@astrosign}[1]{%
  \renewcommand*{\si@decimalsign}{%
    \rlap{\si@ang@decimalsign}%
    \expandafter\csname si@sym@#1\endcsname}%
    \def\si@num@decimalhook{\expandafter\aftergroup%
      \csname si@ang@kill#1\endcsname}}%
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@ang@set}
% The \cs{si@ang@set} macro does the work of assigning the degrees,
% minutes and seconds, and actually typesetting the result.\\
%\cs{si@ang@set}\marg{num}\marg{num}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@ang@set}[3]{%
%    \end{macrocode}
%\begin{macro}{\si@ang@degs}
%\begin{macro}{\si@ang@mins}
%\begin{macro}{\si@ang@secs}
% First, the three macros that will contain the measures must exist.
%    \begin{macrocode}
  \ifsi@ang@padlarge
    \newcommand*{\si@ang@degs}{0\si@sym@degree}%
    \newcommand*{\si@ang@mins}{0\si@sym@minute}%
    \newcommand*{\si@ang@secs}{0\si@sym@second}%
  \else
    \newcommand*{\si@ang@degs}{}%
    \newcommand*{\si@ang@mins}{}%
    \newcommand*{\si@ang@secs}{}%
  \fi
  \protected@edef\si@ang@decimalsign{\si@decimalsign}%
%    \end{macrocode}
%\begin{macro}{\si@ang@movesign}
% Either the signs need to be moved, or this needs to be killed off.
%    \begin{macrocode}
  \ifsi@astroang
    \let\si@ang@movesign\si@ang@astrosign
  \else
    \let\si@ang@movesign\@gobble
  \fi
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@ang@secnum}
%\begin{macro}{\si@ang@minnum}
% The arguments are now examined in reverse order.  If they are
% empty, then nothing is done.  Otherwise, the larger measures are
% zero-filled, if this has been requested. Some steps are needed
% to allow for addition of signs to numbers.
%    \begin{macrocode}
  \newcommand*{\si@ang@secnum}{\si@ang@num{second}}%
  \newcommand*{\si@ang@minnum}{\si@ang@num{minute}}%
   \si@ifnotmtarg{#3}
     {\si@log@debug{Found seconds `#3'}%
      \renewcommand*{\si@ang@secs}
       {\si@ang@secnum{#3}\si@sym@second}%
      \renewcommand*{\si@ang@mins}
        {\si@ang@pad{0\si@sym@minute}}%
      \renewcommand*{\si@ang@degs}
        {\si@ang@pad{0\si@sym@degree}}}%
   \si@ifnotmtarg{#2}
     {\si@log@debug{Found minutes `#2'}%
      \renewcommand*{\si@ang@secnum}{\si@ang@signlessnum{second}}%
      \renewcommand*{\si@ang@mins}
       {\si@ang@minnum{#2}\si@sym@minute}%
      \renewcommand*{\si@ang@degs}
        {\si@ang@pad{0\si@sym@degree}}}%
   \si@ifnotmtarg{#1}
     {\si@log@debug{Found degrees `#1'}%
      \renewcommand*{\si@ang@secnum}{\si@ang@signlessnum{second}}%
      \renewcommand*{\si@ang@minnum}{\si@ang@signlessnum{minute}}%
      \renewcommand*{\si@ang@degs}
%    \end{macrocode}
% The group here is needed to get the mechanism to move the symbol to
% work properly.
%    \begin{macrocode}
       {\si@ang@num{degree}{#1}%
        \si@sym@degree}}%
   \si@out@num%
     {\si@ang@degs\si@anglesep\si@ang@mins\si@anglesep\si@ang@secs}%
%    \end{macrocode}
%\end{macro}
%\end{macro}
% The group opened by \cs{ang} is closed.
%    \begin{macrocode}
   \endgroup}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@ang@pad}
% Padding is only added if requested; the zero is a literal.\\
%\cs{si@ang@pad}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@ang@pad}[1]{%
  \ifsi@ang@padsmall
    #1%
  \else
    \relax%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@ang@num}
%\begin{macro}{\si@ang@signlessnum}
% Modified versions of \cs{num}, one to typeset angles without a
% leading sign and the other with.\\
%\cs{si@ang@num}\marg{degree/minute/second}\marg{num}\\
%\cs{si@ang@signlessnum}\marg{degree/minute/second}\marg{num}
%    \begin{macrocode}
\newcommand{\si@ang@num}[2]{%
  \begingroup%
    \si@ang@movesign{#1}%
    \si@num{#2}%
  \endgroup}
\newcommand{\si@ang@signlessnum}[2]{%
  \begingroup%
    \si@ang@movesign{#1}%
    \sisetup{addsign=none}%
    \si@num{#2}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\subsection{New column types}
% The automatic formatting and alignment of numerical data in columns
% is handled here.  The various other packages that work in this area
% are basically ripped-off here.  The first part of the job is to
% make a new column type.  The letters |D|, |N| and |R| are taken by
% other packages, so |s| (for \currpkg) is chosen.  As in \pkg{rccol}
% and \numprint, initially no definition is given as lots of code needs
% to be added.
%    \begin{macrocode}
\newcolumntype{s}{}
%    \end{macrocode}
%\begin{macro}{\NC@rewrite@s}
% Following the \numprint approach, the \cs{NC@rewrite@S} macro is now
% changed to provide a hook for the collection of the tabular
% material.  This means messing with the internal macros of another
% package, but there is no other way to do this.  As \pkg{array} is a
% standard package from the \pkg{tools} bundle, this should be
% reasonably safe.  After resetting the storage token registers, the
% internal macro which handles optional arguments is called.
%    \begin{macrocode}
\renewcommand*{\NC@rewrite@s}{%
  \@ifnextchar[%]
    {\si@tab@rewrite}
    {\si@tab@rewrite[]}
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@rewrite}
%\begin{macro}{\si@tempa}
% An optional argument can now be picked up (this does not work using
% the optional argument to \cs{renewcommand} for \cs{NC@rewrite@S}).
% Here the begin and end code needed is added to the existing list if
% \cs{@temptokena}, with the start and end macros unexpanded.
% Argument |#1| contains any user setup options for this column.\\
%\cs{si@tab@rewrite}\oarg{options}
%    \begin{macrocode}
\def\si@tab@rewrite[#1]{%
  \edef\si@tempa{\the\@temptokena
    >{\noexpand\si@tab@begin[#1]\noexpand\ignorespaces}c%
    <{\noexpand\si@tab@end}}%
  \@temptokena\expandafter{\si@tempa}%
%    \end{macrocode}
% With the assignment done, the normal action of the \pkg{array}
% package is continued.
%    \begin{macrocode}
  \NC@find}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tab@numtoks}
%\begin{macro}{\si@tab@pretoks}
%\begin{macro}{\si@tab@posttoks}
% Some storage is needed for the data to build up.  In common with
% \pkg{rccol} and \numprint, token registers are used for this (thus leaving
% problematic input to be handled later).
%    \begin{macrocode}
\newtoks\si@tab@numtoks
\newtoks\si@tab@pretoks
\newtoks\si@tab@posttoks
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tab@begin}
% The lead-off macro starts by setting any local values for
% \cs{sisetup}.  Although this is an internal macro, square brackets
% for the option list are retained to make the option that this
% argument may be empty.\\
%\cs{si@tab@begin}\oarg{options}
%    \begin{macrocode}
\newcommand*{\si@tab@begin}[1][]{%
  \begingroup
    \sisetup{#1}%
    \si@tab@numtoks{}%
    \si@tab@pretoks{}%
    \si@tab@posttoks{}%
    \si@switchfalse
    \si@log@debug{Processing s column cell contents}%
    \si@tab@gettok}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@gettok}
%\begin{macro}{\si@tab@next}
% The iteration macro for collecting up tokens in the input. This is
% a pretty much direct copy from \numprint.  First |#1| is checked
% against various special values.\\
%\cs{si@tab@gettok}\marg{cell-contents}
%    \begin{macrocode}
\newcommand*{\si@tab@gettok}[1]{%
%    \end{macrocode}
% The current cell could be the end of a line.
%    \begin{macrocode}
  \ifx\tabularnewline#1
    \let\si@tab@next\tabularnewline
  \else
%    \end{macrocode}
% If the table is in the usual \cs{begin}\texttt{\ldots}\cs{end}
% construct, the \cs{end} might appear.
%    \begin{macrocode}
    \ifx\end#1
      \let\si@tab@next\end
    \else
%    \end{macrocode}
% The check for \cs{si@tab@end} deals with the likely situation that
% the current cell is not the last of the line; the result will be
% that the end-of-cell macro will be present.
%    \begin{macrocode}
      \ifx\si@tab@end#1
        \let\si@tab@next\si@tab@end
      \else
%    \end{macrocode}
% If \cs{begin}\texttt{\ldots}\cs{end} has not been used for the
% table, then \cs{endtabular} might crop up.
%    \begin{macrocode}
        \ifx\endtabular#1
          \let\si@tab@next\endtabular
        \else
%    \end{macrocode}
% Apparently, \texttt{tabularx} might have a \cs{csname} at the end
% of the cell.
%    \begin{macrocode}
          \ifx\csname#1
            \let\si@tab@next\csname
          \else
%    \end{macrocode}
% \cs{relax} is always a possibility.
%    \begin{macrocode}
            \ifx\relax#1\relax
              \let\si@tab@next\relax
            \else
%    \end{macrocode}
% If the macro gets here, then the input should be stored, either as
% part of a number or to be appended to the number.  This is checked
% by using \cs{si@numvalid}; initially this will hold the valid
% characters defined before, but will be altered to \cs{@empty} if
% collection of items after a number is in operation.  The system is
% set to recur, and the input is saved to the appropriate token
% register.
%    \begin{macrocode}
              \let\si@tab@next\si@tab@gettok
              \si@num@ifchr{#1}{\si@numvalid}
                {\si@switchtrue
                 \si@log@debug{Found valid cell contents `#1'}%
                 \si@tab@numtoks=\expandafter{\the\si@tab@numtoks#1}}
                {\si@log@debug{Found other cell contents \string#1}%
                 \si@tab@othertok{#1}}%
            \fi
          \fi
        \fi
      \fi
    \fi
  \fi
%    \end{macrocode}
% Finally, execute whatever should be the next step.
%    \begin{macrocode}
  \si@tab@next}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tab@othertok}
% Unrecognised input is added to a token register, either before or
% after the number.\\
%\cs{si@tab@othertok}\marg{chars}
%    \begin{macrocode}
\newcommand*{\si@tab@othertok}[1]{%
  \ifsi@switch
%    \end{macrocode}
% If working after a number has been found, it is necessary to
% prevent any more input being added to the number.
%    \begin{macrocode}
    \si@tab@posttoks=\expandafter{\the\si@tab@posttoks#1}%
  \else
    \si@tab@pretoks=\expandafter{\the\si@tab@pretoks#1}%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@end}
% At the end of the cell, the actual output has to occur.
%    \begin{macrocode}
\newcommand{\si@tab@end}{%
  \hfil%
  \the\si@tab@pretoks%
%    \end{macrocode}
% If no number was found, then output is skipped.
%    \begin{macrocode}
  \ifsi@switch
    \expandafter\si@tab@numout%
  \fi
  \the\si@tab@posttoks%
  \hfil%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tempcnta}
%\begin{macro}{\si@tempcntb}
% Counters are needed for the digit-counting system.
%    \begin{macrocode}
\newcount\si@tempcnta
\newcount\si@tempcntb
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tab@numout}
% If a number is found, then some secondary processing is needed to
% format it correctly.
%    \begin{macrocode}
\newcommand*{\si@tab@numout}{%
  \let\si@num@format\si@tab@num@format
%    \end{macrocode}
% Using the modified form of \cs{si@num}, the input (in
% \cs{si@tab@numtoks} is parsed.  This results in the mantissa before
% the decimal place in \cs{si@num@mantout} and the rest of the
% mantissa, plus any exponent part, in \cs{si@num@out}. The part of
% the mantissa after the decimal marker (if any) is stored in
% \cs{si@tab@mantout}, which can therefore be used as a flag for the
% inclusion of a decimal sign.
%    \begin{macrocode}
  \expandafter\si@num\expandafter{\the\si@tab@numtoks}%
  \afterassignment\si@tab@format\expandafter\si@tempcnta%
    \si@tabformat\relax}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@mantout}
% A storage macro is needed.
%    \begin{macrocode}
\newcommand*{\si@tab@mantout}{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@num@format}
% A modified version of \cs{si@num@format} is needed, as the
% ``decomposed'' number is needed directly by the table formatting
% system.\\
%\cs{si@tab@num@format}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@tab@num@format}[1]{%
%    \end{macrocode}
%\begin{macro}{\si@tab@org@sepdigits}
% The crucial sub-macro is redirected.
%    \begin{macrocode}
  \let\si@tab@org@sepdigits\si@num@sepdigits
  \let\si@num@sepdigits\si@tab@num@sepdigits
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@arg}
% With that done, things continue as in the original.
%    \begin{macrocode}
  \edef\si@num@arg{#1}%
  \si@switchfalse
  \expandafter\si@num@mantexp\si@num@arg\@empty\@empty%
  \si@num@sign{mant}%
  \ifx\@empty\si@num@mant\@empty\else
     \si@num@digits{mant}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@num@out}
% The pre-decimal part of the the number is in \cs{si@num@mantout},
% with the post-decimal part in \cs{si@tab@mantout}.  This ensures
% that there is no need to shuffle the location of any sign.  The macro
% now continues to build up everything after the decimal sign in
% \cs{si@num@out}.
%    \begin{macrocode}
     \protected@edef\si@num@out{\si@tab@mantout}%
  \fi
%    \end{macrocode}
% For the exponent, processing is back to normal.
%    \begin{macrocode}
  \let\si@num@sepdigits\si@tab@org@sepdigits
  \si@num@sign{exp}%
  \ifx\@empty\si@num@exp\@empty\else
    \si@num@digits{exp}%
    \ifx\@empty\si@num@mant\@empty\else
      \protected@edef\si@num@out%
        {\si@num@out\noexpand\ensuremath{\noexpand\si@expproduct}}%
    \fi
    \protected@edef\si@num@out%
      {\si@num@out\si@exppower%
        \noexpand\textsuperscript{\si@num@expout}}%
  \fi
  \ifx\@empty\si@num@mant\@empty
    \ifx\@empty\si@num@exp\@empty
      \si@log@err{Invalid number format `\si@num@arg'}%
        {Something is wrong with the number format; does it
         contain \MessageBreak any numbers (from the list %
            `\si@numlist')?}%
%    \end{macrocode}
%\begin{macro}{\si@tab@mantout}
% Need to clear both storage areas.
%    \begin{macrocode}
      \renewcommand*\si@num@out{}%
      \renewcommand*\si@tab@mantout{}%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tab@num@sepdigits}
% An altered version of \cs{si@num@sepdigits} is needed, so that the
% division of the data is made before and after the decimal sign for
% the mantissa.\\
%\cs{si@tab@num@sepdigits}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@tab@num@sepdigits}[1]{%
  \si@num@ifextra{\si@tempa}{}
    {\expandafter\si@num@int\expandafter{\si@tempa}}%
  \def\si@tempc{}%
  \ifx\@empty\si@tempb\@empty\else
    \si@num@ifextra{\si@tempb}{}%
      {\expandafter\si@num@dec\expandafter{\si@tempb}}%
  \fi
%    \end{macrocode}
% The storage of the results is different to the original version.
% The pre-decimal part (plus any sign) is stored in the
% \cs{si@num@}|#1out| macro, while the post-decimal part ends up in
% \cs{si@tab@}|#1out|.  No decimal sign is added in at all.
%    \begin{macrocode}
  \expandafter\protected@edef\csname si@num@#1out\endcsname%
    {\csname si@num@#1out\endcsname\si@tempa}%
  \expandafter\protected@edef\csname si@tab@#1out\endcsname%
    {\si@tempb}}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@prebox}
%\begin{macro}{\si@tab@postbox}
%\begin{macro}{\si@tempbox}
% The various boxes needed for the column centring are declared
% Unlike the \pkg{dcolumn} original, private boxes are used here.
% \cs{si@tempbox} is used when a space to measure one of the
% constituents is needed; it is never used for output.
%    \begin{macrocode}
\newbox\si@tab@prebox
\newbox\si@tab@postbox
\newbox\si@tempbox
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tab@format}
% The formatting set up is taken from \pkg{dcolumn}, with a few minor
% changes to fit the scheme used here.  There is only one argument
% here, as the appearance of the decimal sign is handled by the
% \pkg{keyval} system.  The numerical test here has been changed,
% compared to \pkg{dcolumn}, so that a value of zero gives a column
% centred on the decimal marker.\\
%\cs{si@tab@format}\marg{num}\cs{relax}
%    \begin{macrocode}
\def\si@tab@format#1\relax{%
  \ifnum\z@<\si@tempcnta
    \expandafter\si@tab@right%
  \else
    \expandafter\si@tab@centre%
  \fi
  {#1}%
%    \end{macrocode}
% Output of the formatted data occurs here; both positioning macros
% produce formatted data in boxes zero and two.
%    \begin{macrocode}
  \box\si@tab@prebox\box\si@tab@postbox}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@centre}
% This macro is executed if the decimal marker is at the centre of
% the column.  The argument is needed here to throw away anything
% left on the input stack by \cs{si@tab@format}. Unlike
% \pkg{dcolumn}, only a single macro is needed here, as the (divided)
% number is already available.\\
%\cs{si@tab@centre}\marg{gobble}
%    \begin{macrocode}
\newcommand*\si@tab@centre[1]{%
%    \end{macrocode}
% Box zero is used to hold the pre-decimal part, with box two holding
% the post-decimal part \emph{if} it is needed.
%    \begin{macrocode}
  \setbox\si@tab@prebox=\hbox%
    {\expandafter\si@out@num\expandafter{\si@num@mantout}}%
  \ifx\@empty\si@tab@mantout\@empty
    \ifx\@empty\si@num@out\@empty
      \setbox\si@tab@postbox=\hbox%
        {\phantom{\ensuremath{{\si@decimalsign}}}}%
    \else
      \setbox\si@tab@postbox=\hbox%
        {\expandafter\si@out@num\expandafter{\si@num@out}}%
    \fi
  \else
    \setbox\si@tab@postbox=\hbox%
      {\ensuremath{{\si@decimalsign}}%
        \expandafter\si@out@num\expandafter{\si@num@out}}%
  \fi
%    \end{macrocode}
% Which of the two boxes is wider is now checked, and the smaller is
% padded out.
%    \begin{macrocode}
  \ifdim \wd\si@tab@prebox>\wd\si@tab@postbox
    \setbox\si@tab@postbox=\hbox to\wd\si@tab@prebox%
      {\unhbox\si@tab@postbox\hfill}%
  \else
    \setbox\si@tab@prebox=\hbox to\wd\si@tab@postbox%
      {\hfill\unhbox\si@tab@prebox}%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@predim}
%\begin{macro}{\si@tab@postdim}
%\begin{macro}{\si@tempdima}
%\begin{macro}{\si@tempdimb}
% Some storage dimensions are declared.
%    \begin{macrocode}
\newdimen\si@tab@predim
\newdimen\si@tab@postdim
\newdimen\si@tempdima
\newdimen\si@tempdimb
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@tab@right}
% The column is not centred on the decimal marker; the user specifies
% how many characters on each side are allowed for.\\
%\cs{si@tab@right}\marg{num}
%    \begin{macrocode}
\newcommand*\si@tab@right[1]{%
%    \end{macrocode}
% The width of a character is measured, and stored.
%    \begin{macrocode}
  \setbox\si@tempbox=\hbox{\si@out@num{1}}
  \si@tempdima\wd\si@tempbox
%    \end{macrocode}
%\begin{macro}{\si@tab@prea}
%\begin{macro}{\si@tab@preb}
% If |#1| is empty, then no special processing is needed for box two.
% On the other hand, if there is something in |#1| then a bit of
% re-arranging is done.  In particular notice that \cs{si@tempcnta}
% is used with the pre-decimal value, before the post-decimal setting
% is saved.
%    \begin{macrocode}
  \ifx\relax#1\relax
    \hfill
    \let\si@tab@prea\relax
    \let\si@tab@preb\relax
  \else
    \si@tab@predim\the\si@tempcnta\si@tempdima
    \si@tab@sepcorr{pre}%
    \edef\si@tab@prea{to\si@tab@predim}%
    \edef\si@tab@preb{\hss\hfill}%
    \si@tempcnta\@gobble#1\relax
  \fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
% The width of the box needed is calculated by multiplying the width
% of a character (in \cs{si@tempdima} by the number of characters
% requested (in \cs{si@tempcnta}.  The width of the decimal sign is
% also allowed for and added on.
%    \begin{macrocode}
  \si@tab@postdim\si@tempcnta\si@tempdima
  \setbox\si@tempbox=\hbox{\ensuremath{{\si@decimalsign}}}%
  \advance\si@tab@postdim\wd\si@tempbox
  \si@tab@sepcorr{post}%
%    \end{macrocode}
% The pre-decimal part of the number is now added to box zero, with
% the post decimal part in box two if needed.
%    \begin{macrocode}
  \setbox\si@tab@prebox=\hbox\si@tab@prea{\si@tab@preb%
    \expandafter\si@out@num\expandafter{\si@num@mantout}}%
  \ifx\@empty\si@tab@mantout\@empty
    \setbox\si@tab@postbox=\hbox to\si@tab@postdim%
      {\expandafter\si@out@num\expandafter{\si@num@out}\hfil}%
  \else
    \setbox\si@tab@postbox=\hbox to\si@tab@postdim%
      {\ensuremath{{\si@decimalsign}}\expandafter\si@out@num%
        \expandafter{\si@num@out}\hfil}%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tab@sepcorr}
% A spacing correction is needed \emph{if} the number of digits to be
% allowed for will lead to the introduction of a separator.  A counter
% and dimension are needed for the testing.\\
%\cs{si@tab@sepcorr}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@tab@sepcorr}[1]{%
  \si@tempcntb\the\si@tempcnta\relax
%    \end{macrocode}
% Calculate how many groups of three there are, then allow for not
% separating four characters if \cs{ifsi@sepfour} is false.
%    \begin{macrocode}
  \divide\si@tempcntb\thr@@
  \ifsi@sepfour\else
    \ifnum\the\si@tempcnta=4
      \si@tempcntb\z@
    \fi
  \fi
%    \end{macrocode}
% The width of the separators is measured, and the correct number of
% separator widths are added to the box dimension.
%    \begin{macrocode}
  \setbox\si@tempbox=\hbox{\ensuremath{\si@digitsep}}%
  \expandafter\advance\csname si@tab@#1dim\endcsname%
    \si@tempcntb\wd\si@tempbox}%
%    \end{macrocode}
%\end{macro}
%
%\subsection{Units}
%\begin{macro}{\SI}
%\begin{macro}{\unitsym}
% There are two types of user macros for the units system; those for
% defining new units, prefixes and powers, and those for using them.
% There are two macros for using units, \cs{SI} and \cs{unitsym},
% which work in very similar ways.  \cs{unitsym} is just an alias for
% \cs{SI} with no number; everything is handed off into an internal
% macro.  The internal macro also handles the optional prefix
% argument to \cs{SI}\\
%\cs{SI}\oarg{options}\marg{num}
%\cs{unitsym}\oarg{options}\marg{unit}
%    \begin{macrocode}
\DeclareRobustCommand*{\SI}[2][]{%
  \@ifnextchar[%]
    {\si@SI[#1]{#2}}
    {\si@SI[#1]{#2}[]}}
\DeclareRobustCommand*{\unitsym}[2][]{\si@SI[#1]{}[]{#2}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\newunit}
%\begin{macro}{\renewunit}
%\begin{macro}{\provideunit}
% The \cs{newunit} and \cs{renewunit} macros create the new unit
% macros. To allow a mechanism for checking an existing definition,
% these macros simply carry out the appropriate tests, before handing
% off to the internal macro.  \cs{@ifdefinable} is not used here as a
% customised error is desirable. Other than that, the code here gives
% very similar results to \cs{newcommand} and \cs{renewcommand}.
% Finally, \cs{provideunit} adds the unit definition only if it does
% not already exist.\\
%\cs{newunit}\oarg{valuesep=none}\marg{unit}\marg{symbol}\\
%\cs{renewunit}\oarg{valuesep=none}\marg{unit}\marg{symbol}\\
%\cs{provideunit}\oarg{valuesep=none}\marg{unit}\marg{symbol}
%    \begin{macrocode}
\newcommand*{\newunit}[3][]{%
  \si@ifdefinable{#2}
    {\si@unt@defunit[#1]{#2}{#3}}
    {\si@log@err{Unit \string#2 already defined!}\@eha}}
\newcommand*{\renewunit}[3][]{%
  \si@ifdefinable{#2}
    {\si@log@err{Unit \string#2 undefined}\@ehc
     \si@unt@defunit[#1]{#2}{#3}}
    {\si@unt@defunit[#1]{#2}{#3}}}
\newcommand*{\provideunit}[3][]{%
  \si@ifdefinable{#2}
    {\si@unt@defunit[#1]{#2}{#3}}
    {}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\newprefix}
%\begin{macro}{\renewprefix}
%\begin{macro}{\provideprefix}
% The multiples of units are defined here; very similar code is used
% to the \cs{newunit}, \etc., macros.  The multiple prefixes cannot take
% an optional argument, and must represent some power.  Hence the arguments
% required are different.
%\cs{newprefix}\marg{multiple}\marg{powers-ten}\marg{symbol}\\
%\cs{renewprefix}\marg{multiple}\marg{powers-ten}\marg{symbol}\\
%\cs{provideprefix}\marg{multiple}\marg{powers-ten}\marg{symbol}
%    \begin{macrocode}
\newcommand*{\newprefix}[3]{%
  \si@ifdefinable{#1}
    {\si@unt@defprefix{#1}{#2}{#3}}
    {\si@log@err{Prefix \string#1 already defined!}\@eha}}
\newcommand*{\renewprefix}[3]{%
  \si@ifdefinable{#1}
    {\si@log@err{Prefix \string#1 undefined}\@ehc
     \si@unt@defprefix{#1}{#2}{#3}}
    {\si@unt@defprefix{#1}{#2}{#3}}}
\newcommand*{\provideprefix}[3]{%
  \si@ifdefinable{#1}
    {\si@unt@defprefix{#1}{#2}{#3}}
    {}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\newpower}
%\begin{macro}{\renewpower}
%\begin{macro}{\providepower}
% Here power multiples for units are set up.  As with units and
% multiples, a layered approach is used to keep things easy to
% maintain.  The optional argument here is \emph{not} a \pkg{keyval}
% one: only \opt{post} is a valid value.\\
%\cs{newpower}\oarg{post}\marg{num}\marg{power}\\
%\cs{renewpower}\oarg{post}\marg{num}\marg{power}\\
%\cs{providepower}\oarg{post}\marg{num}\marg{power}
%    \begin{macrocode}
\newcommand*{\newpower}[3][]{%
  \si@ifdefinable{#2}
    {\si@unt@defpower[#1]{#2}{#3}}
    {\si@log@err{Power \string#2 already defined!}\@eha}}
\newcommand*{\renewpower}[3][]{%
  \si@ifdefinable{#2}
    {\si@log@err{Power \string#2 undefined}\@ehc
     \si@unt@defpower[#1]{#2}{#3}}
    {\si@unt@defpower[#1]{#2}{#3}}}
\newcommand*{\providepower}[3][]{%
  \si@ifdefinable{#2}
    {\si@unt@defpower[#1]{#2}{#3}}
    {}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\begin{macro}{\ifsi@unt@num}
% A flag is needed to tell the processor whether there is a number,
% to get the correct spacing. The flag is true outside of the
% processor
%    \begin{macrocode}
\newif\ifsi@unt@num\si@unt@numtrue
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@SI}
%\begin{macro}{\si@unt@SIopts}
% The internal processing starts with \cs{si@SI}, which processes the
% second optional argument to \cs{SI} (which is empty for
% \cs{unitsym}).  Everything is set up in a group, and processing
% begins by handling the options.\\
%\cs{si@SI}\oarg{options}\marg{unit}\oarg{preunit}\marg{unit}
%    \begin{macrocode}
\def\si@SI[#1]#2[#3]#4{%
  \begingroup
    \si@ifnotmtarg{#1}
      {\sisetup{#1}%
       \edef\si@unt@SIopts{#1}}%
%    \end{macrocode}
%\end{macro}
% The prefix unit is handled before any processing of the number; the
% flags are set to get spacing correct.
%    \begin{macrocode}
    \si@unt@numfalse
    \si@xspacefalse
    \si@ifnotmtarg{#3}
      {\si@log@debug{Prefix unit found}%
       \si@unt@printunit{#3}}%
%    \end{macrocode}
% The numerical argument may be empty, in which case no extra space
% should be produced.
%    \begin{macrocode}
    \si@ifnotmtarg{#2}
      {\si@log@debug{Number found in \string\SI\space argument}%
       \num{#2}%
       \si@unt@numtrue}%
    \si@ifnotmtarg{#4}
      {\si@unt@printunit{#4}}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@ifliteral}
%\begin{macro}{\ifsi@unt@littest}
% The next stage of the processor is to determine whether or not the
% argument of the unit macro is processable.  For literal arguments,
% this is not the case, and the argument is typeset ``as is''.  On
% the other hand, any units, \etc., declared by the package will work
% with the processor, and so need to be executed before typesetting
% the result.\\
%\cs{si@unt@ifliteral}\marg{text}
%    \begin{macrocode}
\newif\ifsi@unt@littest
\newcommand*{\si@unt@ifliteral}[1]{%
  \begingroup
    \si@unt@littesttrue
%    \end{macrocode}
% The test relies on any non-processable test having some width;
% hopefully, this should be the case.
%    \begin{macrocode}
    \setbox\si@tempbox=\hbox{\si@unt@out{#1}}%
    \ifdim\wd\si@tempbox>\z@\relax
      \endgroup\expandafter\@firstoftwo%
    \else
      \endgroup\expandafter\@secondoftwo%
    \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ifsi@unt@litout}
%\begin{macro}{\si@unt@printunit}
% The printing macro uses the above test to determine how to act.  It
% then carries out the appropriate action: either typesetting or
% executing.  A flag is also provided so that any macro units inside
% a partially-literal argument will work (this is also needed to
% emulate \unitsdef).\\
%\cs{si@unt@printunit}\marg{unit}
%    \begin{macrocode}
\newif\ifsi@unt@litout
\newcommand{\si@unt@printunit}[1]{%
  \si@unt@ifliteral{#1}
%    \end{macrocode}
% The unit includes one or more literal items; typeset using the
% unit typesetting macro.
%    \begin{macrocode}
    {\si@log@debug{Literal items found in unit argument:\MessageBreak
       outputting without further processing}%
     \si@unt@litouttrue
     \si@unt@addvaluesep%
     \si@unt@out{#1}}
%    \end{macrocode}
% For processable output, the argument is executed; the macros are
% all designed for this.
%    \begin{macrocode}
    {\si@log@debug{Macro unit found:\MessageBreak
       processing to format output}%
     \si@unt@init%
     \advance\si@unt@depthcnt\@ne\relax
     #1%
     \si@unt@final}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@addvaluesep}
%\begin{macro}{\si@unt@addvalsep}
%\begin{macro}{\si@unt@litvalsep}
%\begin{macro}{\si@unt@stackvalsep}
% To ensure no problems pop up with expansion, adding the value--unit
% space is handled by a macro.
%    \begin{macrocode}
\newcommand*{\si@unt@addvaluesep}{%
  \ifsi@unt@num
    \expandafter\si@unt@addvalsep%
  \fi}
\newcommand*{\si@unt@addvalsep}{%
  \ifsi@unt@litout
    \expandafter\si@unt@litvalsep%
  \else
    \expandafter\si@unt@stackvalsep%
  \fi}
\newcommand*{\si@unt@stackvalsep}{%
  \protected@edef\si@unt@spstack{\si@valuesep}}
\newcommand*{\si@unt@litvalsep}{%
  \nobreak\ensuremath{\si@valuesep}\nobreak}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@spstack}
%\begin{macro}{\si@unt@stacka}
%\begin{macro}{\si@unt@stackb}
%\begin{macro}{\si@unt@unitcnta}
%\begin{macro}{\si@unt@unitcntb}
%\begin{macro}{\si@unt@depthcnt}
%\begin{macro}{\ifsi@unt@first}
%\begin{macro}{\si@unt@init}
% The initialisation macro sets up the various switches, and clears
% the storage areas for the formatted output.  There are two stacks,
% as when typesetting as fractions, the two parts of the number have
% to be stored separately.  The depth counter is used to tell when
% recursion ends in the processor.  The ``first'' switch is needed as
% the depth counter will not be at one for items processed by
% \cs{SI}.
%    \begin{macrocode}
\newcommand*{\si@unt@spstack}{}
\newcommand*{\si@unt@stacka}{}
\newcommand*{\si@unt@stackb}{}
\newcount\si@unt@unitcnta
\newcount\si@unt@unitcntb
\newcount\si@unt@depthcnt
\newif\ifsi@unt@first
\si@unt@depthcnt\m@ne\relax
\newcommand*{\si@unt@init}{%
  \begingroup
    \si@unt@litoutfalse
    \si@unt@firsttrue
    \si@unt@perfalse
    \si@unt@perseenfalse
    \si@unt@prepowerfalse
    \si@unt@depthcnt\z@\relax
    \si@unt@powerdim\z@\relax
    \si@unt@unitcnta\z@\relax
    \si@unt@unitcntb\z@\relax
    \si@unt@prefixcnt\z@\relax
    \renewcommand*{\si@unt@spstack}{}%
    \renewcommand*{\si@unt@stacka}{}%
    \renewcommand*{\si@unt@stackb}{}%
    \renewcommand*{\si@unt@holdstacka}{}%
    \renewcommand*{\si@unt@holdstackb}{}%
    \renewcommand*{\si@unt@lastadda}{space}%
    \renewcommand*{\si@unt@lastaddb}{space}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@final}
% The finalisation macro finishes off the output and resets the flags.
%    \begin{macrocode}
\newcommand*{\si@unt@final}{%
    \si@unt@third%
    \si@unt@stackout%
  \endgroup
  \ifsi@xspace
    \expandafter\expandafter\expandafter\xspace%
  \fi}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\si@unt@defunit}
% The internal macro for defining a unit does not check for
% redefinition; that is done by the user macros.
%\cs{si@unt@defunit}\oarg{valuesep=none}\marg{unit}\marg{symbol}
%    \begin{macrocode}
\newcommand*{\si@unt@defunit}[3][]{%
  \si@log@debug{Declaring unit \string#2 with \MessageBreak
    meaning \string#3}%
%    \end{macrocode}
% The optional argument can only have the value \opt{valuesep=none},
% which is used to prevent a space occurring between a number and the
% units (for example, with \cs{degree}).  The optional argument needs
% to be saved; \cs{edef} is used so there is no issue with
% redefinition. The macro name is effectively ``reversed'' so that
% life is easier with the expansions here.
%    \begin{macrocode}
  \si@ifnotmtarg{#1}
    {\expandafter\expandafter\expandafter\def\expandafter%
      \csname\expandafter\@gobble\string#2@opt@unt@si\endcsname{#1}}%
%    \end{macrocode}
% The unit macro itself is now defined.  The definition simply
% selects the correct path for the rest of the processing to go down.
%  To avoid needing specialised gobbling macros, the optional nature
% of the first argument is dropped.
%    \begin{macrocode}
  \DeclareRobustCommand*{#2}[1][]{%
    \ifsi@unt@littest
      \expandafter\si@gobblethree
    \else
%    \end{macrocode}
% For literal output, the third argument is all that is needed.
%    \begin{macrocode}
      \ifsi@unt@litout
        \expandafter\expandafter\expandafter\@gobbletwo
      \else
        \expandafter\expandafter\expandafter\si@unt@unit%
      \fi
    \fi
    {##1}{#2}{#3}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@gobblethree}
% \LaTeX\ does not have a \cs{@gobblethree} macro, but one is needed.
%    \begin{macrocode}
\long\def \si@gobblethree #1#2#3{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@defprefix}
% As with units, multiples are defined by an internal macro.
%\cs{si@unt@defprefix}\marg{multiple}\marg{powers-ten}\marg{symbol}\\
%    \begin{macrocode}
\newcommand*{\si@unt@defprefix}[3]{%
  \si@log@debug{Declaring multiple \string#1 with \MessageBreak
    meaning \string#3}%
  \DeclareRobustCommand{#1}{%
    \ifsi@unt@littest
      \expandafter\si@gobblethree
    \else
      \ifsi@unt@litout
        \expandafter\expandafter\expandafter\@gobbletwo
      \else
        \expandafter\expandafter\expandafter\si@unt@prefix%
      \fi
    \fi
    {#1}{#2}{#3}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@defpower}
% The definition of powers is complicated by the need to handle both
% those given before units (such as \cs{cubic}) and those given after
% (\eg~\cs{cubed}).  This means that an optional argument is
% needed.\\
%\cs{si@unt@defpower}\oarg{post}\marg{power}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@unt@defpower}[3][]{%
  \si@log@debug{Declaring power \string#2 with \MessageBreak
    meaning \string#3}%
%    \end{macrocode}
% Once again the optional argument is saved.
%    \begin{macrocode}
  \expandafter\expandafter\expandafter\edef\expandafter%
    \csname\expandafter\@gobble\string#2@opt@si\endcsname{#1}%
  \DeclareRobustCommand{#2}{%
    \ifsi@unt@littest
      \expandafter\@gobbletwo
    \else
%    \end{macrocode}
% The literal output here does not need to gobble anything, but uses
% \cs{textsuperscript} to get the correct effect.  This will of
% course give very odd results for prefix powers.
%    \begin{macrocode}
      \ifsi@unt@litout
        \expandafter\expandafter\expandafter\si@unt@litpower%
      \else
        \expandafter\expandafter\expandafter\si@unt@power%
      \fi
    \fi
    {#2}{#3}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\si@unt@unithook}
%\begin{macro}{\si@unt@unit}
% The macro for units is actually a processor, rather than
% typesetting anything, which is handled elsewhere.  The first
% argument to the macro is optional, but does not have square
% brackets to keep things simple with gobbling.\\
%\cs{si@unt@unit}\marg{num}\marg{unit}\marg{symbol}
%    \begin{macrocode}
\newcommand*{\si@unt@unithook}{}
\newcommand*{\si@unt@unit}[3]{%
%    \end{macrocode}
% When the count is minus one at the start of the processor, then the
% unit is begin used on its own: initialisation occurs.
%    \begin{macrocode}
  \ifnum\si@unt@depthcnt=\m@ne\relax
    \expandafter\si@unt@init%
  \fi
  \advance\si@unt@depthcnt\@ne\relax
  \si@log@debug{Unit processing: level \the\si@unt@depthcnt,
    \MessageBreak unit \string#2}%
  \si@unt@firstorsecond{#1}{#2}%
%    \end{macrocode}
% The core of the \cs{si@unt@unit} macro is testing if the symbol for
% the unit is a literal value or another macro.  Depending on the
% result, the symbol is either used as a literal or executed.
%    \begin{macrocode}
  \si@unt@ifliteral{#3}
    {\si@unt@addtostack{unit}{#3}%
     \ifsi@unt@prepower
       \expandafter\si@unt@stkpower%
     \fi}
    {#3}%
%    \end{macrocode}
% The counter is now stepped down, before checking if this is
% the end of a compound unit.
%    \begin{macrocode}
  \advance\si@unt@depthcnt\m@ne\relax
  \ifnum\si@unt@depthcnt=\z@\relax
    \expandafter\si@unt@final%
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@firstorsecond}
% At this stage, the flag will be set for the first item to be
% processed whichever route the unit has been called by.\\
%\cs{si@unt@firstorsecond}\marg{num}\marg{macro}
%    \begin{macrocode}
\newcommand{\si@unt@firstorsecond}[2]{%
  \ifsi@unt@first
    \expandafter\si@unt@first%
  \else
    \expandafter\si@unt@second%
  \fi
  {#1}{#2}}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@first}
% For the first unit in the input, some extra tasks are needed.
% First, the optional argument for the unit macro needs to be
% tested.\\
%\cs{si@unt@first}\marg{num}\marg{unit}
%    \begin{macrocode}
\newcommand*{\si@unt@first}[2]{%
  \si@ifnotmtarg{#1}
    {\num{#1}}%
  \si@unt@unithook%
%    \end{macrocode}
% To avoid filling up the macro list with useless values, the \eTeX\
% primitive \cs{ifcsname} is employed here (it also avoids complex
% expansion issues).  If some options exist, they are set.
%    \begin{macrocode}
  \ifcsname\expandafter\@gobble\string#2@opt@unt@si\endcsname
    \expandafter\si@unt@setopts%
  \else
    \expandafter\@gobble
  \fi
  {#2}%
  \si@unt@addvaluesep%
  \si@unt@firstfalse}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@setopts}
%\begin{macro}{\si@unt@setSIopts}
% A rather long set of \cs{expandafter} commands to get the options
% to set safely.\\
%\cs{si@unt@setopts}\marg{unit}
%    \begin{macrocode}
\newcommand*{\si@unt@setopts}[1]{%
  \expandafter\expandafter\expandafter\expandafter\expandafter%
    \expandafter\expandafter\si@temptoks\expandafter\expandafter%
    \expandafter\expandafter\expandafter\expandafter\expandafter{%
      \expandafter\csname\expandafter\@gobble\string#1@opt@unt@si%
      \endcsname}%
  \expandafter\sisetup\expandafter{\the\si@temptoks}%
  \si@log@debug{Applying options ``\the\si@temptoks''
    for\MessageBreak unit \string#1}%
%    \end{macrocode}
% The user options are reloaded, if defined, to ensure that they
% still work as expected.
%    \begin{macrocode}
  \@ifundefined{si@unt@SIopts}{}
    {\ifx\@empty\si@unt@SIopts\@empty\else
       \expandafter\expandafter\si@unt@setSIopts%
     \fi}}
\newcommand*{\si@unt@setSIopts}{%
  \expandafter\si@temptoks\expandafter{\si@unt@SIopts}%
  \expandafter\sisetup\expandafter{\the\si@temptoks}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@second}
%\begin{macro}{\si@unt@third}
% For everything apart from the first item to be processed, spacing
% may need to be added to separated different units.  The macro is
% divided into two, so that everything except the space can be added
% in finalisation.\\
%\cs{si@unt@second}\marg{num}\marg{unit}
%    \begin{macrocode}
\newcommand{\si@unt@second}[2]{%
  \si@ifnotmtarg{#1}
    {\si@log@warn{Optional argument to unit macro\MessageBreak
       allowed only for outer unit}}%
  \si@unt@third%
  \si@unt@addtostack{space}{\ensuremath{\si@unitsep}}}
\newcommand*{\si@unt@third}{%
  \ifsi@unt@prepower\else
    \expandafter\si@unt@stkpower%
  \fi
%    \end{macrocode}
%\begin{macro}{\si@tempa}
% A check is made to avoid adding $-1$ to prefixes.  If \opt{frac} is
% active, then the |b| stack will be in use, otherwise it will be
% |a|.
%    \begin{macrocode}
  \def\si@tempa{prefix}%
  \expandafter\ifx\csname si@unt@lastadd\si@unt@checkstack%
    \endcsname\si@tempa\else
    \expandafter\si@unt@spacecheck%
  \fi
  \ifsi@unt@per
    \expandafter\si@unt@perseentrue
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@spacecheck}
% A check to prevent adding $-1$ at the very beginning of the unit, where
% there is a space on the stack.
%    \begin{macrocode}
\newcommand*{\si@unt@spacecheck}{%
  \def\si@tempa{space}%
  \expandafter\ifx\csname si@unt@lastadd\si@unt@checkstack%
    \endcsname\si@tempa\else
    \expandafter\si@unt@reciptest%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@prefix}
% Actual output of the prefixes.\\
%\cs{si@unt@prefix}\marg{multiple}\marg{powers-ten}\marg{symbol}
%    \begin{macrocode}
\newcommand*{\si@unt@prefix}[3]{%
  \si@unt@firstorsecond{}{#1}%
  \ifsi@prefixnum
    \expandafter\si@unt@countprefix%
  \else
    \expandafter\si@unt@addprefix%
  \fi
  {#2}{#3}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@addprefix}
% To add the prefix, a little translation is needed.\\
%\cs{si@unt@countprefix}\marg{gobble}\marg{symbol}
%    \begin{macrocode}
\newcommand*{\si@unt@addprefix}[2]{\si@unt@addtostack{prefix}{#2}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@prefixcnt}
%\begin{macro}{\si@unt@countprefix}
%\begin{macro}{\si@unt@invprefix}
% On the other hand, to count the prefix numeral, the symbol is
% thrown away.
%\cs{si@unt@countprefix}\marg{powers-ten}\marg{gobble}
%    \begin{macrocode}
\newcount\si@unt@prefixcnt
\newcommand*{\si@unt@countprefix}[2]{%
 \si@tempcnta#1\relax
 \ifsi@unt@per
   \si@unt@invprefix%
 \fi
 \advance\si@unt@prefixcnt\si@tempcnta\relax}
\newcommand*{\si@unt@invprefix}{%
  \si@tempcntb\si@tempcnta\relax
  \si@tempcnta -\si@tempcntb\relax}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@litpower}
% For literal power output, the number can't simply be dumped, so
% a macro is needed.\\
%\cs{si@unt@litpower}\marg{gobble}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@unt@litpower}[2]{\textsuperscript{#2}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@unt@prepower}
%\begin{macro}{\si@unt@power}
% The handling of powers starts by checking if the number needs to be
% reversed.
%\cs{si@unt@power}\marg{power}\marg{num}
%    \begin{macrocode}
\newif\ifsi@unt@prepower
\newcommand*{\si@unt@power}[2]{%
  \si@unt@powerdim #2 pt\relax
  \ifsi@frac\else
    \ifsi@unt@per
      \expandafter\expandafter\expandafter\si@unt@invpower%
    \fi
  \fi
  \def\si@tempa{post}%
  \si@unt@prepowertrue
  \expandafter\expandafter\expandafter\ifx\expandafter%
    \csname\expandafter\@gobble\string#1@opt@si\endcsname\si@tempa
    \expandafter\si@unt@stackpower%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@powerdim}
% To do sign-inversion on the power, a dimension is used (this allows
% non-integer values to be handled).
%    \begin{macrocode}
\newdimen\si@unt@powerdim
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@stackpower}
%\begin{macro}{\si@unt@stkpower}
%\begin{macro}{\si@unt@stkpwr}
% Adding powers to the stack should also clear the power list.  If
% the number is already zero, then  of course nothing happens.
%    \begin{macrocode}
\newcommand*{\si@unt@stackpower}{%
  \si@unt@prepowerfalse
%    \end{macrocode}
% A trap is used for $-1$ added to the denominator of a fraction.
%    \begin{macrocode}
  \si@unt@stkpower%
  \si@unt@perfalse
  \si@unt@perseenfalse}
%    \end{macrocode}
% The \cs{si@unt@stkpower} macro needs to be called from a few
% places, so is spun out from the above.
%    \begin{macrocode}
\newcommand*{\si@unt@stkpower}{%
  \ifdim\si@unt@powerdim=\m@ne pt\relax
    \ifsi@frac\else
      \expandafter\expandafter\expandafter\si@unt@stkpwr%
    \fi
  \else
    \expandafter\si@unt@stkpwr%
  \fi}
%    \end{macrocode}
% Finally, the actual adding (set up to avoid problems with the
% \cs{if} above).
%    \begin{macrocode}
\newcommand*{\si@unt@stkpwr}{%
  \ifdim\si@unt@powerdim=\z@\relax\else
    \edef\si@tempa{unit}%
    \expandafter\ifx\csname si@unt@lastadd\si@unt@checkstack%
      \endcsname\si@tempa
      \si@unt@addtostack{power}{^{\num{\strip@pt\si@unt@powerdim}}}%
    \fi
  \fi
  \si@unt@powerdim\z@\relax}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@invpower}
% A macro to change the sign of the current power.
%    \begin{macrocode}
\newcommand*{\si@unt@invpower}{%
  \si@tempdima\si@unt@powerdim\relax
  \si@unt@powerdim -\si@tempdima\relax
%    \end{macrocode}
% The power might end up as ``1'', which is not wanted.  So it is
% chucked away.
%    \begin{macrocode}
  \ifdim\si@unt@powerdim=\p@\relax
    \si@unt@powerdim\z@\relax
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\ifsi@unt@per}
%\begin{macro}{\ifsi@unt@perseen}
%\begin{macro}{\per}
%\begin{macro}{\si@per}
% The \cs{per} macro sets the correct flags; almost everything else
% is done elsewhere.  There is always the case of two \cs{per}
% instructions; so the flag is flipped rather than set arbitrarily.
% The second flag is needed so that \cs{per} can give powers of $-1$
% properly.
%    \begin{macrocode}
\newif\ifsi@unt@per
\newif\ifsi@unt@perseen
\DeclareRobustCommand*{\per}{\si@per}
\newcommand*{\si@per}{%
  \si@unt@firstorsecond{}{\per}%
  \ifsi@unt@per
    \expandafter\si@unt@perfalse
  \else
    \expandafter\si@unt@pertrue
  \fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@reciptest}
%\begin{macro}{\si@unt@recip}
% A test is needed for adding $-1$ when needed. The second macro is
% fired only if the power should be reciprocal.
%    \begin{macrocode}
\newcommand*{\si@unt@reciptest}{%
  \ifsi@unt@per
    \ifsi@unt@perseen
      \expandafter\expandafter\expandafter\si@unt@recip%
    \fi
  \fi}
\newcommand*{\si@unt@recip}{%
  \si@unt@powerdim\m@ne pt\relax
  \si@unt@stackpower}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@lastadda}
%\begin{macro}{\si@unt@lastaddb}
%\begin{macro}{\si@unt@addtostack}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% Items cannot be added directly to the stacks (except the spacing
% stack, a) as the fractional handling may need to add the item to
% either storage area.  By indicating the type of data to be added to
% the stack, problems can be avoided.\\
%\cs{si@unt@addtostack}\marg{type}\marg{token}
%    \begin{macrocode}
\newcommand*{\si@unt@lastadda}{}
\newcommand*{\si@unt@lastaddb}{}
\newcommand*{\si@unt@addtostack}[2]{%
  \edef\si@tempa{#1}%
%    \end{macrocode}
% Two consecutive items cannot be of the same type; there must be spaces
% between units, units between prefixes, \etc.
%    \begin{macrocode}
  \expandafter\ifx\csname si@unt@lastadd\si@unt@checkstack\endcsname%
    \si@tempa
    \expandafter\@gobbletwo
  \else
    \expandafter\si@unt@preplussp%
  \fi
  {#1}{#2}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@preplussp}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% The space added after a prefix needs to be ignored.
%\cs{si@unt@prespace}\marg{type}\marg{stack}\marg{token}\marg{gobble}
%    \begin{macrocode}
\newcommand*{\si@unt@preplussp}[2]{%
  \def\si@tempa{prefix+space}%
  \edef\si@tempb{\csname si@unt@lastadd\si@unt@checkstack%
    \endcsname+#1}%
  \ifx\si@tempa\si@tempb
    \expandafter\@gobbletwo
  \else
    \expandafter\si@unt@stack%
  \fi
  {#1}{#2}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@stack}
% The macro for actually doing the stacking up.\\
%\cs{si@unt@stack}\marg{type}\marg{tokens}
%    \begin{macrocode}
\newcommand*{\si@unt@stack}[2]{%
  \expandafter\edef\csname si@unt@lastadd\si@unt@checkstack%
    \endcsname{#1}%
%    \end{macrocode}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% A count is kept of the number of \emph{units} added to each stack.
%    \begin{macrocode}
  \edef\si@tempa{#1}%
  \def\si@tempb{unit}%
  \ifx\si@tempa\si@tempb
    \expandafter\si@unt@inccnt%
  \fi
%    \end{macrocode}
% If a space is added, it is actually held until the next add.
%    \begin{macrocode}
  \def\si@tempb{space}%
  \ifx\si@tempa\si@tempb
    \expandafter\si@unt@holdspace%
  \else
    \expandafter\si@unt@addstack%
  \fi
  {#2}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@inccnt}
% The appropriate counter is added to.
%    \begin{macrocode}
\newcommand*{\si@unt@inccnt}{%
  \expandafter\advance\csname si@unt@unitcnt\si@unt@checkstack%
    \endcsname\@ne\relax}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@holdspace}
%\begin{macro}{\si@unt@addstack}
%\begin{macro}{\si@unt@holdstacka}
%\begin{macro}{\si@unt@holdstackb}
% Depending on the nature of the addition, it is either held or added
% to the stack.\\
%\cs{si@unt@holdspace}\marg{tokens}\\
%\cs{si@unt@addstack}\marg{tokens}\\
%    \begin{macrocode}
\newcommand*{\si@unt@holdstacka}{}
\newcommand*{\si@unt@holdstackb}{}
\newcommand*{\si@unt@holdspace}[1]{%
  \expandafter\protected@edef\csname si@unt@holdstack%
    \si@unt@checkstack\endcsname{#1}}
\newcommand*{\si@unt@addstack}[1]{%
  \expandafter\protected@edef\csname si@unt@stack%
    \si@unt@checkstack\endcsname%
    {\csname si@unt@stack\si@unt@checkstack\endcsname%
     \csname si@unt@holdstack\si@unt@checkstack\endcsname#1}%
  \expandafter\renewcommand\expandafter*\expandafter{%
    \csname si@unt@holdstack\si@unt@checkstack\endcsname}{}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@stackout}
% The stack contents are actually typeset here.  First the spacing
% between units and values is added.
%    \begin{macrocode}
\newcommand*{\si@unt@stackout}{%
  \ifsi@frac
    \expandafter\si@unt@fracout%
  \else
    \expandafter\si@unt@normout%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@checkstack}
% Which stack is in use needs to be tested.
%    \begin{macrocode}
\newcommand*{\si@unt@checkstack}{%
  \ifsi@frac
    \ifsi@unt@per
      \expandafter\expandafter\expandafter b%
    \else
      \expandafter\expandafter\expandafter a%
    \fi
  \else
    \expandafter a%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@spaceout}
% The space before a unit might not be needed, so it crops up a few
% times in the output routine.
%    \begin{macrocode}
\newcommand*{\si@unt@spaceout}{%
   \ensuremath{\si@unt@spstack}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@prefixout}
% If the prefix counter is not zero, then there is something to
% typeset.
%    \begin{macrocode}
\newcommand*{\si@unt@prefixout}{%
  \ifnum\si@unt@prefixcnt=\z@\relax\else
    \ifsi@unt@num
      \si@out@text{\ensuremath{{}\si@prefixproduct{}}}%
    \fi
    \let\si@exppower\si@prefixpower
    \num{e\the\si@unt@prefixcnt}%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@normout}
% The normal output mode is set up here; nothing much needs to be
% done as there is no need for complex checks.
%    \begin{macrocode}
\newcommand*{\si@unt@normout}{%
  \si@unt@prefixout%
  \si@unt@spaceout%
  \expandafter\si@unt@out\expandafter{\si@unt@stacka}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@fracout}
% For fractions, some checks are needed.
%    \begin{macrocode}
\newcommand*{\si@unt@fracout}{%
  \si@unt@notambig%
  \ifx\@empty\si@unt@stacka\@empty
    \ifx\@empty\si@unt@stackb\@empty
      \ifsi@unt@litout\else
        \si@log@err{Empty fractional unit}{The unit
          argument\MessageBreak given does not contain any
          symbols}%
      \fi
    \else
%    \end{macrocode}
% With an empty numerator, no space is added
%    \begin{macrocode}
      \ifsi@slash
        \si@unt@prefixout%
        \si@frac{}{\si@unt@stackb}%
      \else
        \si@unt@prefixout%
        \si@unt@spaceout%
        \si@frac{1}{\si@unt@stackb}%
      \fi
    \fi
  \else
%    \end{macrocode}
% If the denominator is empty, then the usual output system can be
% used.
%    \begin{macrocode}
    \ifx\@empty\si@unt@stackb\@empty
      \si@unt@normout%
    \else
      \si@unt@prefixout%
      \si@unt@spaceout%
      \si@frac{\si@unt@stacka}{\si@unt@stackb}%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@notambig}
%\begin{macro}{\si@unt@notabg}
% A trap is set for adding brackets to units using a slash, when more
% than one unit is in the denominator.
%    \begin{macrocode}
\newcommand*{\si@unt@notambig}{%
  \ifnum\si@unt@unitcntb>\@ne\relax
    \ifsi@slash
      \expandafter\expandafter\expandafter\si@unt@notabg%
    \fi
  \fi}
\newcommand*{\si@unt@notabg}{%
  \protected@edef\si@unt@stackb{\si@denlbrac\si@unt@stackb%
    \si@denrbrac}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\begin{macro}{\si@unt@out}
% The final part of the units system is the output routine.  This has
% to cope with units not only as macros but also as direct input
% (\sistyle-type input).  Non-Latin characters are also handled
% cleanly. As usual, \cs{scantokens} is used to make life easier.\\
%\cs{si@unt@out}\marg{unit}
%    \begin{macrocode}
\begingroup
  \catcode`\~=\active
  \catcode`\.=\active
  \gdef\si@unt@out#1{%
    \begingroup
      \si@unt@nonlatin%
      \makeatletter%
      \catcode`\~=\active
      \catcode`\.=\active
      \def~{\ensuremath{\si@unitspace}}%
      \def.{\ensuremath{\si@unitsep}}%
      \scantokens{\si@out@text{#1}\@empty}%
    \endgroup}
\endgroup
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@unt@nonlatin}
% To handle non-Latin symbols in the input, a single macro is
% provided.  Initially, it does nothing
%    \begin{macrocode}
\newcommand*{\si@unt@nonlatin}{\relax}
%    \end{macrocode}
% The meaning of different characters depends on the encoding used.
% Thus a test is made for the presence of a suitable package
% \emph{and} the encoding in use.  The various characters can then be
% handled.
%\begin{macro}{\si@tempa}
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifpackageloaded{inputenc}
    {\def\si@tempa{latin1}%
     \ifx\inputencodingname\si@tempa
%    \end{macrocode}
% The degree symbol is character 176 and the micro symbol is
% character 181 in latin1.
%    \begin{macrocode}
       \si@unt@sym{176}{\si@sym@degree}%
       \si@unt@sym{181}{\si@sym@mu}%
       \si@unt@sym{229}{\si@sym@ringA}%
     \fi}
%    \end{macrocode}
% No \pkg{inputenc} available.
%    \begin{macrocode}
    {}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@unt@sym}
% A macro for declaring symbols: a copy of \cs{DeclareInputMath} from
% \pkg{inputenc}.\\
%\cs{si@unt@sym}\marg{charcode}
%    \begin{macrocode}
\newcommand*{\si@unt@sym}[1]{%
  \bgroup
    \uccode`\~#1%
    \uppercase{%
      \egroup
      \def~}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\kilogram}
%\begin{macro}{\metre}
%\begin{macro}{\mole}
%\begin{macro}{\kelvin}
%\begin{macro}{\candela}
%\begin{macro}{\second}
%\begin{macro}{\ampere}
% With the system set up, the basic unit macros are implemented.  The
% only units defined whatever options are given are the base SI
% units.
%    \begin{macrocode}
\newunit{\kilogram}{kg}
\newunit{\metre}{m}
\newunit{\mole}{mol}
\newunit{\second}{s}
\newunit{\ampere}{A}
\newunit{\kelvin}{K}
\newunit{\candela}{cd}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\Square}
%\begin{macro}{\squared}
%\begin{macro}{\cubic}
%\begin{macro}{\cubed}
% Unlike multiples (which can be skipped if needed), the basic powers
% are also always defined.
%    \begin{macrocode}
\newpower{\Square}{2}
\newpower[post]{\squared}{2}
\newpower{\cubic}{3}
\newpower[post]{\cubed}{3}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\tothe}
%\begin{macro}{\tothe@opt@si}
% A macro for arbitrary powers, which comes after the unit and so
% needs to be marked as such.\\
%\cs{tothe}\marg{num}
%    \begin{macrocode}
\newcommand*{\tothe}[1]{%
  \ifsi@unt@littest
    \expandafter\@gobbletwo
  \else
    \ifsi@unt@litout
      \expandafter\expandafter\expandafter\si@unt@litpower%
    \else
      \expandafter\expandafter\expandafter\si@unt@power%
    \fi
  \fi
  {\tothe}{#1}}
\newcommand*{\tothe@opt@si}{post}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\subsection{Locales}
%\begin{macro}{\si@loc@load}
%\begin{macro}{\si@loc@sisetup}
% When loading a locale, the setup is saved rather than applied.
% Anything other than simple settings should be inside
% \cs{addtolocale}, which is already defined.\\
%\cs{si@loc@load}\marg{locale}
%    \begin{macrocode}
\newcommand*{\si@loc@load}[1]{%
  \let\si@loc@sisetup\sisetup
  \renewcommand*{\sisetup}[1]{%
    \expandafter\def\csname si@loc@#1\endcsname{##1}}
  \si@loadfile{#1}%
  \let\sisetup\si@loc@sisetup}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@loc@set}
% Setting the locale transfers the settings to \cs{sisetup}, and runs
% any extra macros.\\
%\cs{si@loc@set}\marg{locale}
%    \begin{macrocode}
\newcommand*{\si@loc@set}[1]{%
  \ifcsname si@loc@#1\endcsname
    \si@log@inf{Setting locale to `#1'}%
    \expandafter\expandafter\expandafter\expandafter\expandafter%
      \expandafter\expandafter\si@temptoks\expandafter\expandafter%
      \expandafter\expandafter\expandafter\expandafter\expandafter{%
        \expandafter\csname si@loc@#1\endcsname}%
    \expandafter\sisetup\expandafter{\the\si@temptoks}%
    \ifcsname si@loc@#1@extra\endcsname
      \csname si@loc@#1@extra\endcsname%
    \fi
  \else
    \ifcsname si@loc@#1@extra\endcsname
      \si@log@inf{Setting locale to `#1'}%
      \csname si@loc@#1@extra\endcsname%
    \else
      \si@log@warn{Unknown locale `#1'}%
    \fi
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\addtolocale}
% Arbitrary macros may need to be added to the locale.\\
%\cs{addtolocale}\marg{locale}\marg{commands}
%    \begin{macrocode}
\newcommand*{\addtolocale}[2]{\si@addtocsname{si@loc@#1@extra}{#2}}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Output routine}
%\begin{macro}{\si@out@text}
% With all of the setup done, the text can finally be typeset.  This
% is done inside a \cs{text} block, which takes care of
% \cs{ensuremath}, \etc.  First of all, the various catcode settings
% needed to get maths-in-text mode are made.  \cs{makeatletter} is
% needed so that \cs{scantokens} still allows internal macros to
% work.\\
%\cs{si@out@text}\marg{text}
%    \begin{macrocode}
\begingroup
  \catcode`\^=\active\relax
  \catcode`\-=\active\relax
  \gdef\si@out@text#1{%
    \begingroup
      \catcode`\^=\active\relax%
      \makeatletter%
%    \end{macrocode}
% The various font families can now be set up.  First a check is made
% in case there are nested calls to \cs{si@out@text}.
%    \begin{macrocode}
      \ifsi@fam@set\else
        \expandafter\si@fam@set%
      \fi
      \text{\si@fam@italic\si@fam@bold\si@fam@text%
%    \end{macrocode}
% In text mode, |^| will execute \cs{textsuperscript}, whereas in
% maths mode it will be converted to \cs{sp}, which the kernel
% defines as |^| with catcode 7.  \cs{scantokens} is used to set the
% catcodes here, plus any others that have been set by other pars of
% the package.
%    \begin{macrocode}
      \ifsi@textmode
        \let^\textsuperscript
        \catcode`\-=\active\relax%
        \let-\si@out@minus
%    \end{macrocode}
% The \cs{@empty} is needed here to mop up any extra space.
%    \begin{macrocode}
        \scantokens{#1\@empty}%
      \else
        \let^\sp
        \let\textsuperscript\sp
        $\si@fam@maths{\scantokens{#1}}$%
      \fi}%
%    \end{macrocode}
% Everything is done; a bit of tidying up is needed.
%    \begin{macrocode}
    \endgroup
    \check@mathfonts}
\endgroup
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@out@minus}
% An active minus sign is needed.
%    \begin{macrocode}
\newcommand*{\si@out@minus}{\ensuremath{-}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@out@num}
% For numerical output, the default fonts are controlled slightly
% differently to text output.\\
%\cs{si@out@num}\marg{num}
%    \begin{macrocode}
\newcommand*{\si@out@num}[1]{%
  \begingroup
    \sisetup{%
      textdefault=\si@textnumdefault,%
      mathdefault=\si@mathnumdefault}%
    \si@out@text{#1}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Finalisation}
% With the \currpkg kernel macros defined, the package can now run
% through finalisation.  First, the default key values are set. The
% user options are then processed.
%    \begin{macrocode}
\sisetup{
  unitsep=thin,
  valuesep=thin,
  decimalsign=fullstop,
  digitsep=thin,
  obeybold=false,
  inlinebold=text,
  obeyitalic=false,
  sign=plus,
  addsign=none,
  obeymode=false,
  mode=maths,
  padangle=small,
  padnumber=lead,
  sepfour=false,
  tabformat=-1,
  xspace=false,
  per=reciprocal,
  slash=slash,
  mathsdefault=\si@mathsrm,
  mathsrm=mathrm,
  mathssf=mathsf,
  mathstt=mathtt,
  textdefault=\si@textrm,
  textrm=rmfamily,
  textsf=sffamily,
  texttt=ttfamily,
  mathsnumdefault=\si@mathsrm,
  textnumdefault=\si@textrm,
  numlist=0123456789,
  numdecimal={.,},
  numexp=eEdD,
  numgobble={},
  numsign=+-\pm\mp,
  numextra=(),
  redefsymbols=true,
  load=default,
  noload={},
  eVcorra={0.3ex},
  eVcorrb={0ex},
  denlbrac=(,
  denrbrac=),
  astroang=false,
  loadlocales={},
  loctolang={},
  prefix=symbol,
  prefixpower=ten,
  prefixproduct=times}
\ProcessOptionsX[si]<opt>
%    \end{macrocode}
%\begin{macro}{\si@extension}
%\begin{macro}{\si@fileprefix}
% To keep the code easy to maintain, the reusable filename components
% are macros rather than literals.
%    \begin{macrocode}
\newcommand*{\si@extension}{cfg}
\newcommand*{\si@fileprefix}{si-}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@ifloaded}
% A bit of borrowing from the \LaTeX\ kernel.\\
%\cs{si@ifloaded}\marg{package}
%    \begin{macrocode}
\newcommand*{\si@ifloaded}[1]{%
  \@ifl@aded\si@extension{\si@fileprefix#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@loadfile}
% Loading configuration files is handled here.\\
%\cs{si@loadfile}\marg{file}
%    \begin{macrocode}
\newcommand*{\si@loadfile}[1]{%
  \si@ifloaded{#1}{}
    {\InputIfFileExists{\si@fileprefix#1.\si@extension}
      {}
      {\si@log@err{Failed to load file
         \si@fileprefix#1.\si@extension}
         {The configuration file requested could not be found}}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@requirecfgs}
%\changes{v0.6a}{2008/02/20}{Changed temporary macro used to fix
%  bug with \pkg{memoir} and \textsc{koma}-script}
%\begin{macro}{\si@tempb}
% The configuration files depend on each other.\\
%\cs{si@requirecfgs}\marg{cfg-file}
%    \begin{macrocode}
\newcommand*{\si@requirecfgs}[1]{%
  \@for\si@tempb:=#1\do{\si@loadfile{\si@tempb}}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@loademfile}
% For emulation files, an additional check is made.\\
%\cs{si@loademfile}\marg{file}
%    \begin{macrocode}
\newcommand*{\si@loademfile}[1]{%
  \@ifpackageloaded{#1}
    {\si@log@err{Emulation clash for package `#1'}
      {You have asked for emulation of package `#1'\MessageBreak
       (perhaps by giving si a back-compatibility
       option)\MessageBreak but the package is already loaded!}}
    {\si@loadfile{#1}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@emclash}
% A macro for emulation clashes.
%    \begin{macrocode}
\newcommand*{\si@emclash}[2]{%
  \si@log@err{Emulation clash: `#1' and `#2'}
    {You have asked for emulation of package `#1'\MessageBreak
     but have already loaded emulation of `#2'}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@tempa}
% A check is now made so that emulation takes place one file at a
% time, and that each file is loaded only once.
%    \begin{macrocode}
\ifx\@empty\si@emulate\@empty\else
  \@for\si@tempa:=\si@emulate\do{%
    \si@loademfile{\si@tempa}}
\fi
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\si@expanddefault}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
%\begin{macro}{\si@tempc}
% For turning the list of default choices into a loadable list.
%    \begin{macrocode}
\newcommand*{\si@expanddefault}[2]{%
\expandafter\ifx\expandafter\@empty\csname si@#1\endcsname\@empty
\else
  \def\si@tempb{default}
  \def\si@tempc{}
  \expandafter\@for\expandafter\si@tempa\expandafter:\expandafter
    =\csname si@#1\endcsname\do{%
    \ifx\si@tempa\si@tempb
      \si@addtolist{\si@tempc}{#2}
    \else
      \si@addtolist{\si@tempc}{\si@tempa}
    \fi}
  \expandafter\edef\csname si@#1\endcsname{\si@tempc}
  \expandafter\si@addtolist\expandafter{\csname si@no#1\endcsname}
    {default}
  \def\si@tempc{}
  \expandafter\@for\expandafter\si@tempa\expandafter:\expandafter
    =\csname si@#1\endcsname\do{%
    \si@switchfalse
    \expandafter\@for\expandafter\si@tempb\expandafter:\expandafter
      =\csname si@no#1\endcsname\do{%
      \ifx\si@tempa\si@tempb
        \si@switchtrue
      \fi
      \ifsi@switch\else
        \si@addtolist{\si@tempc}{\si@tempa}
      \fi}}
  \@for\si@tempa:=\si@tempc\do{%
    \si@loadfile{\si@tempa}}
\fi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
% The configuration and abbreviation files are loaded.
%    \begin{macrocode}
\si@expanddefault{load}{prefix,named,addn,prefixed,accepted,%
  physical,abbr}
%    \end{macrocode}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@tempb}
% The locale files are loaded; here there is a need to check on both
% \opt{loadlocales} and \opt{loctolang}.
%    \begin{macrocode}
\ifx\@empty\si@loadlocales\@empty\else
  \@for\si@tempa:=\si@loadlocales\do{%
    \si@loc@load{\si@tempa}}
\fi
%    \end{macrocode}
% For \opt{loctolang}.
%    \begin{macrocode}
\ifx\@empty\si@loctolang\@empty\else
  \def\si@tempa#1:#2\@nil{\si@loc@load{#1}}
  \@for\si@tempb:=\si@loctolang\do{%
    \expandafter\si@tempa\si@tempb:\@nil}
  \AtBeginDocument{%
    \@ifpackageloaded{babel}
      {\def\si@tempa#1:#2:#3\@nil{%
        \expandafter\addto\expandafter{\csname extras#2\endcsname}%
          {\si@loc@set{#1}}}%
       \@for\si@tempb:=\si@loctolang\do{%
         \expandafter\si@tempa\si@tempb::\@nil}}
      {\si@log@warn{babel not loaded - option\MessageBreak
        loctolang ignored}}}
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
% The very last job is to load a local configuration file, if one
% exists.
%    \begin{macrocode}
\IfFileExists{si.cfg}
  {\si@log@inf{Local configuration file found}%
   \InputIfFileExists{si.cfg}{}{}}
  {}
%    \end{macrocode}
%
%\iffalse
%</package>
%\fi
%
%\section{Loadable modules}
% To keep the package relatively clear, and to make maintenance
% easier, the only units defined in the package itself are the base
% units. Everything else is a loadable module (similar to the
% approach in \unitsdef).
%
%\iffalse
%<*prefix>
%\fi
%\subsection{Multiple prefixes}
%\begin{macro}{\yocto}
%\begin{macro}{\zepto}
%\begin{macro}{\atto}
%\begin{macro}{\femto}
%\begin{macro}{\pico}
%\begin{macro}{\nano}
%\begin{macro}{\micro}
%\begin{macro}{\Micro}
%\begin{macro}{\milli}
%\begin{macro}{\centi}
%\begin{macro}{\deci}
% The various SI multiple prefixes are defined here.  First the small
% powers.
%    \begin{macrocode}
\ProvidesFile{si-prefix.cfg}
  [2008/02/20 v.06a SI Multiple prefixes]
\newprefix{\yocto}{-24}{y}
\newprefix{\zepto}{-21}{z}
\newprefix{\atto}{-18}{a}
\newprefix{\femto}{-15}{f}
\newprefix{\pico}{-12}{p}
\newprefix{\nano}{-9}{n}
%    \end{macrocode}
% Some testing is needed for \unitsdef compatibility.
%    \begin{macrocode}
\ifsi@old@OHM
  \newprefix{\Micro}{-6}{\si@sym@mu}
\else
  \ifsi@gensymb\else
    \newprefix{\micro}{-6}{\si@sym@mu}
  \fi
\fi
\newprefix{\milli}{-3}{m}
\newprefix{\centi}{-2}{c}
\newprefix{\deci}{-1}{d}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\deca}
%\begin{macro}{\hecto}
%\begin{macro}{\kilo}
%\begin{macro}{\mega}
%\begin{macro}{\giga}
%\begin{macro}{\tera}
%\begin{macro}{\peta}
%\begin{macro}{\exa}
%\begin{macro}{\zetta}
%\begin{macro}{\yotta}
% Now the large ones.
%    \begin{macrocode}
\newprefix{\deca}{1}{da}
\newprefix{\hecto}{2}{h}
\newprefix{\kilo}{3}{k}
\newprefix{\mega}{6}{M}
\newprefix{\giga}{9}{G}
\newprefix{\tera}{12}{T}
\newprefix{\peta}{15}{P}
\newprefix{\exa}{18}{E}
\newprefix{\zetta}{21}{Z}
\newprefix{\yotta}{24}{Y}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\deka}
% Apparently, ``deka'' is common in the US for deca.
%    \begin{macrocode}
\newprefix{\deka}{1}{da}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\gram}
%\begin{macro}{\kilogram}
% As the base unit of mass is the kilogram, rather than the gram, a
% bit of extra work is needed; by default the package only defines
% \cs{kilogram}, but with the prefixes available, this is altered to
% be \cs{kilo}\cs{gram}.  For that, the \cs{gram} must be defined first.
%    \begin{macrocode}
\newunit{\gram}{g}
\renewunit{\kilogram}{\kilo\gram}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\iffalse
%</prefix>
%<*named>
%\fi
%\subsection{Derived units with specific names}
%\begin{macro}{\becquerel}
%\begin{macro}{\coulomb}
%\begin{macro}{\farad}
%\begin{macro}{\Gray}
%\begin{macro}{\hertz}
%\begin{macro}{\henry}
%\begin{macro}{\joule}
%\begin{macro}{\katal}
%\begin{macro}{\lumen}
%\begin{macro}{\lux}
%\begin{macro}{\newton}
% Derived units with specific names and symbols are defined.  Litre
% is an awkward one, but here the UK standard is used.
%    \begin{macrocode}
\ProvidesFile{si-named.cfg}
  [2008/02/20 v.06a SI Named units]
\newunit{\becquerel}{Bq}
\newunit{\coulomb}{C}
\newunit{\farad}{F}
\newunit{\Gray}{Gy}
\newunit{\hertz}{Hz}
\newunit{\henry}{H}
\newunit{\joule}{J}
\newunit{\katal}{kat}
\newunit{\lumen}{lm}
\newunit{\lux}{lx}
\newunit{\newton}{N}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ohm}
%\begin{macro}{\Ohm}
%\begin{macro}{\pascal}
%\begin{macro}{\siemens}
%\begin{macro}{\sievert}
%\begin{macro}{\tesla}
%\begin{macro}{\volt}
%\begin{macro}{\watt}
%\begin{macro}{\weber}
% Some testing is needed for \unitsdef compatibility.
%    \begin{macrocode}
\ifsi@old@OHM
  \newunit{\Ohm}{\si@sym@Omega}
\else
  \ifsi@gensymb\else
%    \end{macrocode}
% To be on the safe side, use \cs{provideunit}.
%    \begin{macrocode}
    \provideunit{\ohm}{\si@sym@Omega}
  \fi
\fi
\newunit{\pascal}{Pa}
\newunit{\siemens}{S}
\newunit{\sievert}{Sv}
\newunit{\tesla}{T}
\newunit{\volt}{V}
\newunit{\watt}{W}
\newunit{\weber}{Wb}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\celsius}
%\begin{macro}{\Celsius}
% The degree celsius is a named unit.
%    \begin{macrocode}
\ifsi@old@OHM
  \newunit{\Celsius}{\si@sym@celsius}
\else
  \ifsi@gensymb\else
    \newunit{\celsius}{\si@sym@celsius}
  \fi
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\radian}
%\begin{macro}{\steradian}
% The radian and steradian are officially derived units.
%    \begin{macrocode}
\newunit{\radian}{rad}
\newunit{\steradian}{sr}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\iffalse
%</named>
%<*prefixed>
%\fi
%\subsection{Units with prefixes}
% As in \unitsdef, some commonly used prefixed units are set up.
% This requires \file{si-prefix.cfg} and \file{si-named.cfg}.
%    \begin{macrocode}
\ProvidesFile{si-prefixed.cfg}
  [2008/02/20 v.06a SI Prefixed units]
\si@requirecfgs{prefix,named,accepted,physical}
%    \end{macrocode}
%\begin{macro}{\picometre}
%\begin{macro}{\nanometre}
%\begin{macro}{\micrometre}
%\begin{macro}{\millimetre}
%\begin{macro}{\centimetre}
%\begin{macro}{\decimetre}
%\begin{macro}{\kilometre}
% Extra distances.
%    \begin{macrocode}
\newunit{\picometre}{\pico\metre}
\newunit{\nanometre}{\nano\metre}
\newunit{\micrometre}{\micro\metre}
\newunit{\millimetre}{\milli\metre}
\newunit{\centimetre}{\centi\metre}
\newunit{\decimetre}{\deci\metre}
\newunit{\kilometre}{\kilo\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\femtogram}
%\begin{macro}{\picogram}
%\begin{macro}{\nanogram}
%\begin{macro}{\microgram}
%\begin{macro}{\milligram}
% Extra masses.
%    \begin{macrocode}
\newunit{\femtogram}{\femto\gram}
\newunit{\picogram}{\pico\gram}
\newunit{\nanogram}{\nano\gram}
\newunit{\microgram}{\micro\gram}
\newunit{\milligram}{\milli\gram}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\femtomole}
%\begin{macro}{\picomole}
%\begin{macro}{\nanomole}
%\begin{macro}{\micromole}
%\begin{macro}{\millimole}
% Now some moles.
%    \begin{macrocode}
\newunit{\femtomole}{\femto\mole}
\newunit{\picomole}{\pico\mole}
\newunit{\nanomole}{\nano\mole}
\newunit{\micromole}{\micro\mole}
\newunit{\millimole}{\milli\mole}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\attosecond}
%\begin{macro}{\femtosecond}
%\begin{macro}{\picosecond}
%\begin{macro}{\nanosecond}
%\begin{macro}{\microsecond}
%\begin{macro}{\millisecond}
% Prefixed seconds.
%    \begin{macrocode}
\newunit{\attosecond}{\atto\second}
\newunit{\femtosecond}{\femto\second}
\newunit{\picosecond}{\pico\second}
\newunit{\nanosecond}{\nano\second}
\newunit{\microsecond}{\micro\second}
\newunit{\millisecond}{\milli\second}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\picoampere}
%\begin{macro}{\nanoampere}
%\begin{macro}{\microampere}
%\begin{macro}{\milliampere}
%\begin{macro}{\kiloampere}
% The last prefixed base units are amperes.
%    \begin{macrocode}
\newunit{\picoampere}{\pico\ampere}
\newunit{\nanoampere}{\nano\ampere}
\newunit{\microampere}{\micro\ampere}
\newunit{\milliampere}{\milli\ampere}
\newunit{\kiloampere}{\kilo\ampere}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\millivolt}
%\begin{macro}{\kilovolt}
%\begin{macro}{\milliwatt}
%\begin{macro}{\kilowatt}
%\begin{macro}{\megawatt}
%\begin{macro}{\femtofarad}
%\begin{macro}{\picofarad}
%\begin{macro}{\nanofarad}
%\begin{macro}{\microfarad}
%\begin{macro}{\millifarad}
%\begin{macro}{\millisiemens}
% More electricity-related units.
%    \begin{macrocode}
\newunit{\millivolt}{\milli\volt}
\newunit{\kilovolt}{\nano\volt}
\newunit{\milliwatt}{\milli\watt}
\newunit{\kilowatt}{\kilo\watt}
\newunit{\megawatt}{\mega\watt}
\newunit{\femtofarad}{\femto\farad}
\newunit{\picofarad}{\pico\farad}
\newunit{\nanofarad}{\nano\farad}
\newunit{\microfarad}{\micro\farad}
\newunit{\millifarad}{\milli\farad}
\newunit{\millisiemens}{\milli\siemens}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kiloohm}
%\begin{macro}{\megaohm}
%\begin{macro}{\gigaohm}
% For resistance, checks are needed again for the definition of
% \cs{ohm}.
%    \begin{macrocode}
\ifsi@old@OHM
  \newunit{\kiloohm}{\kilo\Ohm}
  \newunit{\megaohm}{\mega\Ohm}
  \newunit{\gigaohm}{\giga\Ohm}
\else
  \ifsi@gensymb\else
  \newunit{\kiloohm}{\kilo\ohm}
  \newunit{\megaohm}{\mega\ohm}
  \newunit{\gigaohm}{\giga\ohm}
  \fi
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\microlitre}
%\begin{macro}{\millilitre}
%\begin{macro}{\cubicmetre}
%\begin{macro}{\cubiccentimetre}
%\begin{macro}{\centimetrecubed}
%\begin{macro}{\cubicmicrometre}
%\begin{macro}{\cubicmillimetre}
%\begin{macro}{\cubicdecimetre}
% Volumes (unlike \unitsdef, with litre and metre spelled
% correctly).  Only \cs{millilitre} and \cs{microlitre} are defined
% as they are the two officially-sanctioned prefixes for the litre.
%    \begin{macrocode}
\newunit{\microlitre}{\micro\litre}
\newunit{\millilitre}{\milli\litre}
\newunit{\cubicmetre}{\metre\cubed}
\newunit{\cubiccentimetre}{\centi\metre\cubed}
\newunit{\centimetrecubed}{\centi\metre\cubed}
\newunit{\cubicmicrometre}{\micro\metre\cubed}
\newunit{\cubicmillimetre}{\milli\metre\cubed}
\newunit{\cubicdecimetre}{\cubic\deci\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\squaremetre}
%\begin{macro}{\squarecentimetre}
%\begin{macro}{\squarekilometre}
% Areas, with metre spelled corrected; \cs{are} and \cs{hectare} are
% in the ``temporarily accepted'' file.
%    \begin{macrocode}
\newunit{\squaremetre}{\Square\metre}
\newunit{\squarecentimetre}{\Square\centi\metre}
\newunit{\squarekilometre}{\Square\kilo\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\millijoule}
%\begin{macro}{\kilojoule}
%\begin{macro}{\megajoule}
%\begin{macro}{\millielectronvolt}
%\begin{macro}{\kiloelectronvolt}
%\begin{macro}{\megaelectronvolt}
%\begin{macro}{\gigaelectronvolt}
%\begin{macro}{\teraelectronvolt}
% Some energy is needed by now!
%    \begin{macrocode}
\newunit{\millijoule}{\milli\joule}
\newunit{\kilojoule}{\kilo\joule}
\newunit{\megajoule}{\mega\joule}
\newunit{\millielectronvolt}{\milli\electronvolt}
\newunit{\kiloelectronvolt}{\kilo\electronvolt}
\newunit{\megaelectronvolt}{\mega\electronvolt}
\newunit{\gigaelectronvolt}{\giga\electronvolt}
\newunit{\teraelectronvolt}{\tera\electronvolt}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\millihertz}
%\begin{macro}{\kilohertz}
%\begin{macro}{\megahertz}
%\begin{macro}{\gigahertz}
%\begin{macro}{\terahertz}
% Frequencies.
%    \begin{macrocode}
\newunit{\millihertz}{\milli\hertz}
\newunit{\kilohertz}{\kilo\hertz}
\newunit{\megahertz}{\mega\hertz}
\newunit{\gigahertz}{\giga\hertz}
\newunit{\terahertz}{\tera\hertz}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\millinewton}
%\begin{macro}{\kilonewton}
%\begin{macro}{\hectopascal}
%\begin{macro}{\megabecquerel}
%\begin{macro}{\millisievert}
% A few more from various areas.
%    \begin{macrocode}
\newunit{\millinewton}{\milli\newton}
\newunit{\kilonewton}{\kilo\newton}
\newunit{\hectopascal}{\hecto\pascal}
\newunit{\megabecquerel}{\mega\becquerel}
\newunit{\millisievert}{\milli\sievert}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\iffalse
%</prefixed>
%<*abbr>
%\fi
%\subsection{Abbreviated units}
%\begin{macro}{\pA}
%\begin{macro}{\nA}
%\begin{macro}{\micA}
%\begin{macro}{\mA}
%\begin{macro}{\kA}
% The abbreviated units are sorted in one file.  To allow
% back-compatibility with \unitsdef, each one is inside an \cs{if}
% block for the appropriate option.  First currents.
%    \begin{macrocode}
\ProvidesFile{si-abbr.cfg}
  [2008/02/20 v.06a Abbreviated units]
\si@requirecfgs{prefix,named,accepted,physical}
\newunit{\pA}{\pico\ampere}
\newunit{\nA}{\nano\ampere}
\newunit{\micA}{\micro\ampere}
\newunit{\mA}{\milli\ampere}
\newunit{\kA}{\kilo\ampere}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\Hz}
%\begin{macro}{\mHz}
%\begin{macro}{\kHz}
%\begin{macro}{\MHz}
%\begin{macro}{\GHz}
%\begin{macro}{\THz}
% Then frequencies.
%    \begin{macrocode}
\newunit{\Hz}{\hertz}
\newunit{\mHz}{\milli\hertz}
\newunit{\kHz}{\kilo\hertz}
\newunit{\MHz}{\mega\hertz}
\newunit{\GHz}{\giga\hertz}
\newunit{\THz}{\tera\hertz}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\fmol}
%\begin{macro}{\pmol}
%\begin{macro}{\nmol}
%\begin{macro}{\micmol}
%\begin{macro}{\mmol}
% Amounts of substance.
%    \begin{macrocode}
\newunit{\fmol}{\femto\mole}
\newunit{\pmol}{\pico\mole}
\newunit{\nmol}{\nano\mole}
\newunit{\micmol}{\micro\mole}
\newunit{\mmol}{\milli\mole}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kV}
%\begin{macro}{\mV}
% Potentials.
%    \begin{macrocode}
\newunit{\kV}{\kilo\volt}
\newunit{\mV}{\milli\volt}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\ml}
%\begin{macro}{\micl}
%\begin{macro}{\cmc}
%\begin{macro}{\dmc}
% Volumes.
%    \begin{macrocode}
\newunit{\ml}{\milli\litre}
\newunit{\micl}{\micro\litre}
\newunit{\cmc}{\centi\metre\cubed}
\newunit{\dmc}{\deci\metre\cubed}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kg}
%\begin{macro}{\fg}
%\begin{macro}{\pg}
%\begin{macro}{\nanog}
%\begin{macro}{\micg}
%\begin{macro}{\mg}
%\begin{macro}{\amu}
% Masses.
%    \begin{macrocode}
\newunit{\kg}{\kilo\gram}
%    \end{macrocode}
% There is a name clash with \pkg{babel} here in French; hopefully
% there will not be too many complaints.
%    \begin{macrocode}
\provideunit{\fg}{\femto\gram}
\newunit{\pg}{\pico\gram}
\newunit{\nanog}{\nano\gram}
\newunit{\micg}{\micro\gram}
\newunit{\mg}{\milli\gram}
\newunit{\amu}{\atomicmass}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kJ}
%\begin{macro}{\eV}
%\begin{macro}{\meV}
%\begin{macro}{\keV}
%\begin{macro}{\MeV}
%\begin{macro}{\GeV}
%\begin{macro}{\TeV}
% Energies.
%    \begin{macrocode}
\newunit{\kJ}{\kilo\joule}
\newunit{\eV}{\electronvolt}
\newunit{\meV}{\milli\electronvolt}
\newunit{\keV}{\kilo\electronvolt}
\newunit{\MeV}{\mega\electronvolt}
\newunit{\GeV}{\giga\electronvolt}
\newunit{\TeV}{\tera\electronvolt}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\picom}
%\begin{macro}{\nm}
%\begin{macro}{\micm}
%\begin{macro}{\mm}
%\begin{macro}{\cm}
%\begin{macro}{\dm}
%\begin{macro}{\km}
% Lengths.
%    \begin{macrocode}
\newunit{\picom}{\pico\metre}
\newunit{\nm}{\nano\metre}
\newunit{\micm}{\micro\metre}
\newunit{\mm}{\milli\metre}
\newunit{\cm}{\centi\metre}
\newunit{\dm}{\deci\metre}
\newunit{\km}{\kilo\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\Sec}
%\begin{macro}{\as}
%\begin{macro}{\fs}
%\begin{macro}{\ps}
%\begin{macro}{\ns}
%\begin{macro}{\mics}
%\begin{macro}{\ms}
% Finally, times.
%    \begin{macrocode}
\newunit{\Sec}{\second}
\newunit{\as}{\atto\second}
\newunit{\fs}{\femto\second}
%    \end{macrocode}
% The letter class (and others) define \cs{ps} for postscripts, so
% \cs{provideunit} is best here.
%    \begin{macrocode}
\provideunit{\ps}{\pico\second}
\newunit{\ns}{\nano\second}
\newunit{\mics}{\micro\second}
\newunit{\ms}{\milli\second}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\iffalse
%</abbr>
%<*addn>
%\fi
%\subsection{Additional (temporary) SI units}
%\begin{macro}{\angstrom}
%\begin{macro}{\are}
%\begin{macro}{\hectare}
%\begin{macro}{\barn}
%\begin{macro}{\BAR}
%\begin{macro}{\millibar}
%\begin{macro}{\gal}
%\begin{macro}{\curie}
%\begin{macro}{\roentgen}
%\begin{macro}{\rad}
%\begin{macro}{\rem}
% Some units are ``temporarily'' acceptable for use in the SI system.
% These are defined here, although some are in very general use.
%    \begin{macrocode}
\ProvidesFile{si-addn.cfg}
  [2008/02/20 v.06a SI Additional units]
\newunit{\angstrom}{\si@sym@ringA}
\newunit{\are}{a}
\newunit{\hectare}{\hecto\are}
\newunit{\barn}{b}
\newunit{\BAR}{bar}
\newunit{\millibar}{\milli\BAR}
\newunit{\gal}{Gal}
\newunit{\curie}{Ci}
\newunit{\roentgen}{R}
\newunit{\rad}{rad}
\newunit{\rem}{rem}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\iffalse
%</addn>
%<*accepted>
%\fi
%\subsection{Units accepted for use with SI}
% The units which are accepted but do not fit in the above, plus
% \cs{percent} which seems to fit into this category.
%\begin{macro}{\minute}
%\begin{macro}{\hour}
%\begin{macro}{\Day}
%\begin{macro}{\degree}
%\begin{macro}{\Degree}
%\begin{macro}{\arcmin}
%\begin{macro}{\arcsec}
%\begin{macro}{\litre}
%\begin{macro}{\tonne}
%\begin{macro}{\neper}
%\begin{macro}{\bel}
%\begin{macro}{\percent}
%    \begin{macrocode}
\ProvidesFile{si-accepted.cfg}
  [2008/02/20 v.06a SI accepted units]
\newunit{\minute}{min}
\newunit{\hour}{h}
\newunit{\Day}{d}
\ifsi@old@OHM
  \newunit[valuesep=none]{\Degree}{\si@sym@degree}
\else
  \ifsi@gensymb\else
    \newunit[valuesep=none]{\degree}{\si@sym@degree}
  \fi
\fi
\newunit[valuesep=none]{\arcmin}{\si@sym@minute}
\newunit[valuesep=none]{\arcsec}{\si@sym@second}
\newunit{\litre}{l}
\newunit{\tonne}{t}
\newunit{\neper}{Np}
\newunit{\bel}{B}
\newunit{\percent}{\%}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\iffalse
%</accepted>
%<*physical>
%\fi
%\subsection{Units based on physical measurements}
%\begin{macro}{\si@eVspacea}
%\begin{macro}{\si@eVspaceb}
%\begin{macro}{\electronvolt}
%\begin{macro}{\atomicmassunit}
%\begin{macro}{\atomicmass}
%\begin{macro}{\dalton}
% A few units based on physical measurements exist.  For \cs{eV}, the need
% for a negative kern does make things a bit complicated.
%    \begin{macrocode}
\ProvidesFile{si-physical.cfg}
  [2008/02/20 v.06a SI physically-measured units]
\newcommand*{\si@eVspacea}{\text{\kern-\si@eVcorra}}%
\newcommand*{\si@eVspaceb}{\text{\kern-\si@eVcorrb}}%
\newunit{\electronvolt}{e\protect\si@eVspacea V\protect\si@eVspaceb}
\newunit{\atomicmass}{u}
\newunit{\atomicmassunit}{u}
\newunit{\dalton}{Da}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\iffalse
%</physical>
%\fi
%
%\section{Additional configurations}
% To provide flexibility for people in specific areas, specialised
% units can be set up.  These are then stored separately to ease use.
%
%\iffalse
%<*synchem>
%\fi
%\subsection{Synthetic chemistry}
%\begin{macro}{\mmHg}
%\begin{macro}{\molar}
%\begin{macro}{\Molar}
%\begin{macro}{\torr}
% Some useful units for synthetic chemists; although \cs{mmHg} and
% \cs{Molar} are outside of the SI system, they are used a lot.
% These are set up using \cs{provideunit} as people may have their
% own definitions.
%    \begin{macrocode}
\ProvidesFile{si-synchem.cfg}
  [2008/02/20 v.06a Units for synthetic chemists]
\si@requirecfgs{prefix}
\newunit{\mmHg}{mmHg}
\newunit{\molar}{\mole\per\cubic\deci\metre}
\newunit{\Molar}{\textsc{m}}
\newunit{\torr}{Torr}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\iffalse
%</synchem>
%<*hep>
%\fi
%\subsection{High-energy physics}
% The units here basically add the units from the \cs{hepunits}
% package which are not defined elsewhere here.  It is not entirely
% clear if \cs{mrad} refers to radians or rad: feedback would be
% welcome.  This set of commands is not in the emulation block as it
% does \emph{not} seek to emulate \pkg{hepunits}: that package is a
% blot-on to \SIunits.  The units here have the same name as those in
% \pkg{hepunits} but stick with the new package interface.
%    \begin{macrocode}
\ProvidesFile{si-hep.cfg}
  [2008/02/20 v.06a Units for high-energy physics]
\si@requirecfgs{prefix,named}
%    \end{macrocode}
%\begin{macro}{\micron}
%\begin{macro}{\mrad}
%\begin{macro}{\gauss}
% The first units are not specific to high-energy physics, but are
% not defined elsewhere in \currpkg.
%    \begin{macrocode}
\newunit{\micron}{\micro\metre}
\newunit{\mrad}{\milli\radian}
\newunit{\gauss}{G}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\nanobarn}
%\begin{macro}{\picobarn}
%\begin{macro}{\femtobarn}
%\begin{macro}{\attobarn}
%\begin{macro}{\zeptobarn}
%\begin{macro}{\yoctobarn}
% Various prefixed barns
%    \begin{macrocode}
\newunit{\nanobarn}{\nano\barn}
\newunit{\picobarn}{\pico\barn}
\newunit{\femtobarn}{\femto\barn}
\newunit{\attobarn}{\atto\barn}
\newunit{\zeptobarn}{\zepto\barn}
\newunit{\yoctobarn}{\yocto\barn}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\invbarn}
%\begin{macro}{\invnanobarn}
%\begin{macro}{\invpicobarn}
%\begin{macro}{\invfemtobarn}
%\begin{macro}{\invattobarn}
%\begin{macro}{\invzeptobarn}
%\begin{macro}{\invyoctobarn}
% Inverses barn units.
%    \begin{macrocode}
\newunit{\invbarn}{\per\barn}
\newunit{\invnanobarn}{\per\nano\barn}
\newunit{\invpicobarn}{\per\pico\barn}
\newunit{\invfemtobarn}{\per\femto\barn}
\newunit{\invattobarn}{\per\atto\barn}
\newunit{\invzeptobarn}{\per\zepto\barn}
\newunit{\invyoctobarn}{\per\yocto\barn}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\invnb}
%\begin{macro}{\invpb}
%\begin{macro}{\invfb}
%\begin{macro}{\invab}
%\begin{macro}{\invzb}
%\begin{macro}{\invyb}
% Also available abbreviated.
%    \begin{macrocode}
\newunit{\invnb}{\per\nano\barn}
\newunit{\invpb}{\per\pico\barn}
\newunit{\invfb}{\per\femto\barn}
\newunit{\invab}{\per\atto\barn}
\newunit{\invzb}{\per\zepto\barn}
\newunit{\invyb}{\per\yocto\barn}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\invcmsqpersecond}
%\begin{macro}{\invcmsqpersec}
%\begin{macro}{\lumiunits}
% Luminosity.
%    \begin{macrocode}
\newunit{\invcmsqpersecond}{\per\Square\centi\metre\per\second}
\newunit{\invcmsqpersec}{\per\Square\centi\metre\per\second}
\newunit{\lumiunits}{\per\Square\centi\metre\per\second}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\clight}
% The speed of light is used in units for the area, although of course
% it is not strictly a unit.
%    \begin{macrocode}
\newunit{\clight}{\ensuremath{\mathnormal{c}}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\inveV}
%\begin{macro}{\minveV}
%\begin{macro}{\minveV}
%\begin{macro}{\kinveV}
%\begin{macro}{\MinveV}
%\begin{macro}{\GinveV}
%\begin{macro}{\TinveV}
% The inverse of an electron-volt, plus prefixes.
%    \begin{macrocode}
\newunit{\inveV}{\per\electronvolt}
\newunit{\minveV}{\milli\per\electronvolt}
\newunit{\kinveV}{\kilo\per\electronvolt}
\newunit{\MinveV}{\mega\per\electronvolt}
\newunit{\GinveV}{\giga\per\electronvolt}
\newunit{\TinveV}{\tera\per\electronvolt}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\eVoverc}
%\begin{macro}{\eVovercsq}
% Some combinations of electron-volts and the speed of light.  As
% these are called |over|, they are set with a slash.  The
% \opt{eVcorrb} values have been set for Computer Modern.
%    \begin{macrocode}
\newunit[per=slash,eVcorrb=0.6ex]{\eVoverc}
  {\electronvolt\per\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\eVovercsq}
  {\electronvolt\per\Square\clight}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\meVoverc}
%\begin{macro}{\keVoverc}
%\begin{macro}{\MeVoverc}
%\begin{macro}{\GeVoverc}
%\begin{macro}{\TeVoverc}
% Prefixed combinations, first of the speed of light.
%    \begin{macrocode}
\newunit[per=slash,eVcorrb=0.6ex]{\meVoverc}
  {\milli\electronvolt\per\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\keVoverc}
  {\kilo\electronvolt\per\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\MeVoverc}
  {\mega\electronvolt\per\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\GeVoverc}
  {\giga\electronvolt\per\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\TeVoverc}
  {\tera\electronvolt\per\clight}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\meVovercsq}
%\begin{macro}{\keVovercsq}
%\begin{macro}{\MeVovercsq}
%\begin{macro}{\GeVovercsq}
%\begin{macro}{\TeVovercsq}
% Then of the square.
%    \begin{macrocode}
\newunit[per=slash,eVcorrb=0.6ex]{\meVovercsq}
  {\milli\electronvolt\per\Square\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\keVovercsq}
  {\kilo\electronvolt\per\Square\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\MeVovercsq}
  {\mega\electronvolt\per\Square\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\GeVovercsq}
  {\giga\electronvolt\per\Square\clight}
\newunit[per=slash,eVcorrb=0.6ex]{\TeVovercsq}
  {\tera\electronvolt\per\Square\clight}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\iffalse
%</hep>
%<*binary>
%\fi
%\subsection{Binary units}
%\begin{macro}{\kibi}
%\begin{macro}{\mebi}
%\begin{macro}{\gibi}
%\begin{macro}{\tebi}
%\begin{macro}{\pebi}
%\begin{macro}{\exbi}
% The binary units, as specified by the IEC and made available by
% \SIunits. First, the binary prefixes.
%    \begin{macrocode}
\ProvidesFile{si-binary.cfg}
  [2008/02/20 v.06a Binary units]
\newprefix{\kibi}{10}{Ki}
\newprefix{\mebi}{20}{Mi}
\newprefix{\gibi}{30}{Gi}
\newprefix{\tebi}{40}{Ti}
\newprefix{\pebi}{50}{Pi}
\newprefix{\exbi}{60}{Ei}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\bit}
%\begin{macro}{\byte}
% Now the units.
%    \begin{macrocode}
\newunit{\bit}{bit}
\newunit{\byte}{B}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%
%\iffalse
%</binary>
%\fi
%
%\section{Loadable locales}
% Some short files to provide the correct settings for various places.
%
%\iffalse
%<*UK>
%\fi
%\subsection{United Kingdom}
% This is also used for the USA, and is the default.
%    \begin{macrocode}
\ProvidesFile{si-UK.cfg}
  [2008/02/20 v.06a UK locale]
\sisetup{
  unitsep=thin,
  expproduct=times,
  valuesep=thin,
  decimalsign=fullstop,
  digitsep=thin,
  sepfour=false}
%    \end{macrocode}
%\iffalse
%</UK>
%<*USA>
%\fi
%\subsection{United States}
% The same as for the UK.
%    \begin{macrocode}
\ProvidesFile{si-USA.cfg}
  [2008/02/20 v.06a USA locale]
\sisetup{
  unitsep=thin,
  expproduct=times,
  valuesep=thin,
  decimalsign=fullstop,
  digitsep=thin,
  sepfour=false}
%    \end{macrocode}
%\iffalse
%</USA>
%\fi
%\iffalse
%<*germany>
%\fi
%\subsection{Germany}
% Germany, hopefully.
%    \begin{macrocode}
\ProvidesFile{si-germany.cfg}
  [2008/02/20 v.06a Germany locale]
\sisetup{
  unitsep=cdot,
  valuesep=thin,
  decimalsign=comma,
  expproduct=cdot,
  digitsep=thin,
  sepfour=false}
%    \end{macrocode}
%\iffalse
%</germany>
%\fi
%\iffalse
%<*south-africa>
%\fi
%\subsection{South Africa}
% Taken from \sistyle.
%    \begin{macrocode}
\ProvidesFile{si-south-africa.loc}
  [2008/02/20 v.06a UK Locale]
\sisetup{
  unitsep=cdot,
  valuesep=thin,
  expproduct=times,
  decimalsign=comma,
  digitsep=thin,
  sepfour=false}
%    \end{macrocode}
%\iffalse
%</south-africa>
%\fi
%\section{Emulation code}
% Each emulation mode loads an appropriate definition file.  This
% then alters the package defaults, and defines new macros provided
% by the emulated package.
%
%\iffalse
%<*units>
%\fi
%\subsection{\unitspkg}
% The very first thing to do here is a reload check, as things
% could go wrong with \unitsdef emulation.
%    \begin{macrocode}
\si@ifloaded{units}{\endinput}{}
%    \end{macrocode}
% The \unitspkg package is quite easy to emulate, as it only has a
% few options and macros. There is also no error checking in
% \unitspkg for conflicting options, so users probably expect none.
%    \begin{macrocode}
\ProvidesFile{si-units.cfg}
  [2008/02/20 v.06a Emulation of units]
\si@ifloaded{SIunits}
  {\si@emclash{units}{SIunits}\endinput}{}
\si@ifloaded{sistyle}
  {\si@emclash{units}{sistyle}\endinput}{}
%    \end{macrocode}
% To emulate \unitspkg, \cs{per} must give fractions.
%    \begin{macrocode}
\sisetup{per=fraction,fraction=nice,obeybold,inlinebold=maths,
  ,obeymode}
\ifsi@old@tight
  \sisetup{valuesep=thin}
\fi
\ifsi@old@loose
  \sisetup{valuesep=space}
\fi
\ifsi@old@ugly
  \sisetup{fraction=ugly}
\fi
%    \end{macrocode}
%\begin{macro}{\unit}
% The \unitspkg version of \cs{unit} is similar to \cs{SI}.  Here and
% in \cs{unitfrac} the \cs{num} macro is used; thus the number given
% really has to be a number.  However, if users are using \currpkg
% rather than \unitspkg they should expect more checking of input.  As
% the \unitspkg package uses the current mode, this has to be
% detected.\\
%\cs{unit}\oarg{num}\marg{unit}
%    \begin{macrocode}
\DeclareRobustCommand*{\unit}[2][]{%
  \ifmmode
    \SI{#1}{#2}%
  \else
    \SI[obeyfamily,obeyitalic]{#1}{#2}%
  \fi}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\unitfrac}
% \cs{unitfrac} is a bit more of a hack.\\
%\cs{unitfrac}\oarg{num}\marg{numerator}\marg{denominator}
%    \begin{macrocode}
\DeclareRobustCommand*{\unitfrac}[3][]{%
  \begingroup
    \si@fam@mode%
    \ifmmode\else
      \sisetup{obeyfamily,obeyitalic}%
    \fi
    \si@ifnotmtarg{#1}
      {\num{#1}\ensuremath{\si@valuesep}}%
    \si@frac{#2}{#3}
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\iffalse
%</units>
%\fi
%\iffalse
%<*unitsdef>
%\fi
%\subsection{\unitsdef}
% The package begins with the usual identification of what is
% happening.  Although \file{si-units.cfg} makes the same checks,
% the error will make more sense if it comes here, in the event of a
% clash.
%    \begin{macrocode}
\ProvidesFile{si-unitsdef.cfg}
  [2008/02/20 v.06a Emulation of unitsdef]
\si@ifloaded{SIunits}
  {\si@emclash{unitsdef}{SIunits}\endinput}{}
\si@ifloaded{sistyle}
  {\si@emclash{unitsdef}{sistyle}\endinput}{}
%    \end{macrocode}
% Emulation of \unitspkg is needed for \unitsdef to work.
%    \begin{macrocode}
\si@ifloaded{units}{}
  {\InputIfFileExists{\si@fileprefix units.\si@cfgextension}
     {}
     {\si@log@err{Could not load \si@fileprefix
       units.\si@cfgextension}
       {The file \si@fileprefix units.\si@cfgextension is
         required to emulate\MessageBreak
        unitsdef, but cannot be found\MessageBreak
        Is the si package properly installed?}
       \endinput}}
%    \end{macrocode}
% The \unitsdef package loads some packages that \currpkg does not.
% In particular, it loads \pkg{textcomp} and \pkg{fontenc}.  This
% could be important for output, and so the same is done here.
%    \begin{macrocode}
\RequirePackage{textcomp}
\RequirePackage[T1]{fontenc}
%    \end{macrocode}
% The multitude of package options for \unitsdef need to be handled.
%    \begin{macrocode}
\sisetup{mode=text}
\ifsi@old@noxspace
  \sisetup{xspace=false}
\fi
%    \end{macrocode}
% The various options for loading unit abbreviations have to be
% handled. Here, any request to avoid abbreviations prevents any
% loading.
%    \begin{macrocode}
\ifsi@old@noabbr
  \sisetup{noload=abbr}
\fi
\ifsi@old@nofrequncyabbr
  \sisetup{noload=abbr}
\fi
\ifsi@old@nomolabbr
  \sisetup{noload=abbr}
\fi
\ifsi@old@novoltageabbr
  \sisetup{noload=abbr}
\fi
\ifsi@old@novolumeabbr
  \sisetup{noload=abbr}
\fi
\ifsi@old@noweightabbr
  \sisetup{noload=abbr}
\fi
\ifsi@old@noenergyabbr
  \sisetup{noload=abbr}
\fi
\ifsi@old@nolengthabbr
  \sisetup{noload=abbr}
\fi
\ifsi@old@notimeabbr
  \sisetup{noload=abbr}
\fi
%    \end{macrocode}
%\begin{macro}{\unitvaluesep}
% To emulate the \cs{unitvaluesep} macro, a hack is needed of the original
% \pkg{xkeyval} macro for \opt{valuesep}, as well of course as a definition
% of the macro itself.
%    \begin{macrocode}
\newcommand*{\unitvaluesep}{\,}
\renewcommand*{\si@valuesep}{\text{\unitvaluesep}}
\si@opt@choicekey{valuesep}{space,thin,med,medium,thick,none}
    {\renewcommand*\unitvaluesep\@nameuse{si@fix@##1}}
    {\renewcommand*\unitvaluesep{##1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\unitsignonly}
%\begin{macro}{\ilu}
%\begin{macro}{\arc}
% Some rather straight-forward definitions, with just a bit of fun to
% get the spacing correct.
%    \begin{macrocode}
\DeclareRobustCommand*{\unitsignonly}{\unitsym}
\DeclareRobustCommand*{\ilu}[2][]{%
  \begingroup
    #1\unitvaluesep%
    \unit{#2}%
  \endgroup}
\DeclareRobustCommand*{\arc}{\ang}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\unitSIdef}
%\begin{macro}{\si@unitSIdef}
% The \unitsdef package uses a different approach to setting the font
% inside its version of \cs{SI}.  The problem is the same as for
% \cs{unitvaluesep}, but with the added problem that \currpkg uses
% \cs{csname} \ldots \cs{endcsname}.
%    \begin{macrocode}
\newcommand*{\unitSIdef}{\upshape}
\newcommand*{\si@unitSIdef}{\unitSIdef\selectfont}
\sisetup{textdefault=si@unitSIdef,textnumdefault=si@unitSIdef}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\per}
% Rather awkwardly, \unitsdef uses \cs{per} in a different way to
% \currpkg.
%    \begin{macrocode}
\DeclareRobustCommand*{\per}[2]{%
  \begingroup
    \si@xspacefalse
    \renewcommand*{\unitvaluesep}{}%
    \unitfrac{#1}{#2}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\unittimes}
%\begin{macro}{\unitsep}
%\begin{macro}{\unitsuperscript}
% Some pretty straight-forward stuff again; notice that the automatic
% analyser for units has to be turned off for this to work.
%    \begin{macrocode}
\newcommand*{\unittimes}{\ensuremath{\cdot}}
\newcommand*{\unitsep}{\,}
\renewcommand*{\si@unt@unithook}{\si@unt@litouttrue}
\sisetup{unitsep=none}
\newcommand*{\unitsuperscript}{\tothe}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\newnosepunit}
%\begin{macro}{\renewnosepunit}
% Simple aliases.
%    \begin{macrocode}
\newcommand*{\newnosepunit}{\newunit[valuesep=none]}
\newcommand*{\renewnosepunit}{\renewunit[valuesep=none]}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\setTextOmega}
%\begin{macro}{\setMathOmega}
%\begin{macro}{\setTextmu}
%\begin{macro}{\setMathmu}
%\begin{macro}{\setTextCelsius}
%\begin{macro}{\setMathCelsius}
%\begin{macro}{\setMathDegree}
%\begin{macro}{\setTextDegree}
% Controlling symbols is a simple translation job; as only one
% setting is used by \currpkg in text mode, a bit of extra work is
% needed.
%    \begin{macrocode}
\newcommand*{\setTextOmega}[2]{%
  \renewcommand*{\si@textOmega}{%
      \begingroup
      \edef\si@tempa{\sfdefault}%
      \ifx\f@family\si@tempa
        \expandafter#2%
      \else
        \expandafter#1%
      \fi
    \endgroup}}
\newcommand*{\setMathOmega}[1]{\sisetup{mathsOmega=#1}}
\newcommand*{\setTextmu}[2]{%
  \renewcommand*{\si@textmu}{%
    \begingroup
      \edef\si@tempa{\sfdefault}%
      \ifx\f@family\si@tempa
        \expandafter#2%
      \else
        \expandafter#1%
      \fi
    \endgroup}}
\newcommand*{\setMathmu}[1]{\sisetup{mathsmu=#1}}
\newcommand*{\setTextCelsius}[2]{%
  \renewcommand*{\si@textcelsius}{%
    \begingroup
      \edef\si@tempa{\sfdefault}%
      \ifx\f@family\si@tempa
        \expandafter#2%
      \else
        \expandafter#1%
      \fi
    \endgroup}}
\newcommand*{\setMathCelsius}[1]{\sisetup{mathscelsius=#1}}
\newcommand*{\setMathDegree}[2]{%
  \renewcommand*{\si@textdegree}{%
    \begingroup%
      \edef\si@tempa{\sfdefault}%
      \ifx\f@family\si@tempa
        \expandafter#2%
      \else
        \expandafter#1%
      \fi
    \endgroup}}
\newcommand*{\setTextDegree}[1]{\sisetup{textdegree=#1}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
% The \opt{ohm} and \opt{OHM} options are checked, and some sanity is
% ensured.  This needs to happen before loading the configuration
% files.
%    \begin{macrocode}
\ifsi@old@OHM
  \ifsi@old@ohm
    \si@log@inf{Both `ohm' and `OHM' options given\MessageBreak
      Using default behaviour for unitsdef}
    \expandafter\expandafter\expandafter\si@old@OHMfalse
  \fi
\fi
%    \end{macrocode}
%\begin{macro}{\meter}
%\begin{macro}{\liter}
%\begin{macro}{\ton}
%\begin{macro}{\days}
% For some reason, \unitsdef spells metre and litre incorrectly (the
% names have an official spelling).  Tonne is also spelled as ``ton'',
% which is wrong in the UK at least (1\,ton = 40\,cwt =\,2240 lb!)
%    \begin{macrocode}
\newunit{\meter}{\metre}
\newunit{\liter}{L}
\ifsi@old@liter
  \ifsi@old@LITER
    \si@log@inf{Both `liter' and `LITER' options given\MessageBreak
      Using default behaviour for unitsdef}
  \else
    \renewunit{\liter}{l}
  \fi
\fi
\newunit{\ton}{t}
\newunit{\days}{d}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\picometer}
%\begin{macro}{\nanometer}
%\begin{macro}{\micrometer}
%\begin{macro}{\millimeter}
%\begin{macro}{\centimeter}
%\begin{macro}{\decimeter}
%\begin{macro}{\kilometer}
% Extra distances.
%    \begin{macrocode}
\newunit{\picometer}{\pico\meter}
\newunit{\nanometer}{\nano\meter}
\newunit{\micrometer}{\micro\meter}
\newunit{\millimeter}{\milli\meter}
\newunit{\centimeter}{\centi\meter}
\newunit{\decimeter}{\deci\meter}
\newunit{\kilometer}{\kilo\meter}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\femtoliter}
%\begin{macro}{\picoliter}
%\begin{macro}{\nanoliter}
%\begin{macro}{\microliter}
%\begin{macro}{\milliliter}
%\begin{macro}{\centiliter}
%\begin{macro}{\deciliter}
%\begin{macro}{\hectoliter}
%\begin{macro}{\cubicmeter}
%\begin{macro}{\cubicmicrometer}
%\begin{macro}{\cubicmillimeter}
% Volumes with US spellings.
%    \begin{macrocode}
\newunit{\femtoliter}{\femto\liter}
\newunit{\picoliter}{\pico\liter}
\newunit{\nanoliter}{\nano\liter}
\newunit{\microliter}{\micro\liter}
\newunit{\milliliter}{\milli\liter}
\newunit{\centiliter}{\centi\liter}
\newunit{\deciliter}{\deci\liter}
\newunit{\hectoliter}{\hecto\liter}
\newunit{\cubicmeter}{\meter\cubed}
\newunit{\cubicmicrometer}{\micro\meter\cubed}
\newunit{\cubicmillimeter}{\milli\meter\cubed}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\squaremeter}
%\begin{macro}{\squarecentimeter}
%\begin{macro}{\squarekilometer}
%\begin{macro}{\ar}
%\begin{macro}{\hectar}
% Areas, including the mis-spellings for \cs{are} and
% \cs{hectare}.
%    \begin{macrocode}
\newunit{\squaremeter}{\Square\meter}
\newunit{\squarecentimeter}{\Square\centi\meter}
\newunit{\squarekilometer}{\Square\kilo\meter}
\newunit{\ar}{a}
\newunit{\hectar}{\hecto\ar}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kv}
%\begin{macro}{\mv}
% The code for \unitsdef has the capitalisation wrong for \cs{kV} and
% \cs{mV}.
%    \begin{macrocode}
\ifsi@old@noabbr
\else
  \ifsi@old@novoltageabbr\else
    \newunit{\kv}{\kilo\volt}
    \newunit{\mv}{\milli\volt}
  \fi
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\sek}
%\begin{macro}{\fg}
%\begin{macro}{\fl}
%\begin{macro}{\pl}
%\begin{macro}{\nl}
%\begin{macro}{\micl}
%\begin{macro}{\ml}
%\begin{macro}{\cl}
%\begin{macro}{\dl}
%\begin{macro}{\hl}
% There are some slightly different abbreviations, plus some which
% are not officially allowed.
%    \begin{macrocode}
\ifsi@old@noabbr\else
  \ifsi@old@notimeabbr\else
    \newunit{\sek}{\second}
  \fi
  \ifsi@old@noweightabbr\else
    \newunit{\fg}{\femto\gram}
  \fi
  \ifsi@old@novolumeabbr\else
    \newunit{\fl}{\femto\liter}
    \newunit{\pl}{\pico\liter}
    \newunit{\nl}{\nano\liter}
    \renewunit{\micl}{\micro\liter}
    \renewunit{\ml}{\milli\liter}
    \newunit{\cl}{\centi\liter}
    \newunit{\dl}{\deci\liter}
    \newunit{\hl}{\hecto\liter}
  \fi
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\calory}
%\begin{macro}{\kilocalory}
% \unitsdef spells calorie incorrectly, and it is also not an SI unit.
%    \begin{macrocode}
\newunit{\calory}{cal}
\newunit{\kilocalory}{\kilo\calory}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\uBar}
% \unitsdef uses \cs{ubar} for bar.
%    \begin{macrocode}
\newunit{\uBar}{ba}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\gensymbohm}
%\begin{macro}{\gensymbcelsius}
%\begin{macro}{\gensymbmicro}
%\begin{macro}{\gensymbdegree}
% If the options relating to \pkg{gensymb} are given, then the
% package \emph{has} to be loaded.  The definitions are then renamed;
% a slight awkward feature is that the hyphen character needs to be a
% letter.  To avoid needing to worry about this again, a second
% switch is set up.
%    \begin{macrocode}
\catcode`\-=11\relax
\ifsi@old@redef-gensymb
  \expandafter\si@gensymbtrue
\fi
\catcode`\-=12\relax
\ifsi@gensymb
  \RequirePackage{gensymb}
  \AtBeginDocument{
    \let\gensymbohm\ohm
    \let\gensymbcelsius\celsius
    \let\gensymbmicro\micro
    \let\gensymbdegree\degree
    \let\ohm\@undefined
    \let\celsius\@undefined
    \let\micro\@undefined
    \let\degree\@undefined
    \ifsi@old@OHM\else
      \newunit{\ohm}{\si@sym@Omega}
      \newunit{\celsius}{\si@sym@celsius}
      \newprefix{\micro}{\si@sym@mu}{-6}
      \newunit{\degree}{\si@sym@degree}
    \fi}
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
% The configuration files can now be loaded.
%    \begin{macrocode}
\si@requirecfgs{prefix,named,addn,accepted}
%    \end{macrocode}
% The \opt{noconfig} option could be ignored, but it costs little to
% let is be used.
%    \begin{macrocode}
\ifsi@old@noconfig\else
  \InputIfFileExists{unitsdef.cfg}
    {\si@log@inf{unitsdef config file loaded}}
    {\si@log@inf{unitsdef config file not found}}
\fi
%    \end{macrocode}
%
%\iffalse
%</unitsdef>
%<*sistyle>
%\fi
%\subsection{\sistyle}
% After setting the necessary defaults, the emulation code defines
% the macros in \sistyle as given in the manual for that package.
%    \begin{macrocode}
\ProvidesFile{si-sistyle.cfg}
  [2008/02/20 v.06a Emulation of sistyle]
\sisetup{%
  sepfour=true,
  obeyfamily,
  obeyitalic=true,
  numsign=+-,
  numextra={},
  unitsep=cdot}
%    \end{macrocode}
%\begin{macro}{\SIobeyboldtrue}
%\begin{macro}{\SIobeyboldfalse}
% Some simple switches, but not using \cs{newif}.
%    \begin{macrocode}
\newcommand*{\SIobeyboldtrue}{\sisetup{obeybold=true}}
\newcommand*{\SIobeyboldfalse}{\sisetup{obeybold=false}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\num}
%\begin{macro}{\si@sis@num}
%\begin{macro}{\si@sis@numstar}
% To get the correct behaviour for \cs{num}, some redefinitions are
% needed to handle to optional |*|.
%    \begin{macrocode}
\DeclareRobustCommand{\num}{%
  \@ifstar
    {\si@sis@numstar}
    {\si@sis@num}}
\newcommand*{\si@sis@num}[2][]{%
  \begingroup%
    \sisetup{#1}%
    \expandafter\si@out@num\expandafter{\si@num{#2}}%
  \endgroup}
\newcommand*{\si@sis@numstar}[2][]{%
  \begingroup%
    \sisetup{mode=text,obeybold}%
    \sisetup{#1}%
    \expandafter\si@out@num\expandafter{\si@num{#2}}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\pnt}
% The \cs{pnt} macro is needed as |.| is active inside \cs{SI}.  The
% name is exactly the same as in \sistyle, but the implementation is
% different.  This is not defined by the main package as there are
% better ways of including numbers in the output than this.
%    \begin{macrocode}
\newcommand*{\pnt}{\ensuremath{\si@decimalsign}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\SIgroupfourtrue}
%\begin{macro}{\SIgroupfourfalse}
% Switches for grouping four characters.
%    \begin{macrocode}
\newcommand*{\SIgroupfourtrue}{\sisetup{sepfour=true}}
\newcommand*{\SIgroupfourfalse}{\sisetup{sepfour=false}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\SIunitsep}
%\begin{macro}{\SIunitspace}
%\begin{macro}{\SIunitdot}
% Whatever is given here is passed through to \cs{sisetup}.
%    \begin{macrocode}
\newcommand*{\SIunitsep}[1]{\sisetup{valuesep={#1}}}
\newcommand*{\SIunitspace}[1]{\sisetup{unitspace={#1}}}
\newcommand*{\SIunitdot}[1]{\sisetup{unitsep={#1}}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\SIdecimalsign}
%\begin{macro}{\SIthousandsep}
%\begin{macro}{\SIproductsign}
% The same is true here, with the appropriate translation.
%    \begin{macrocode}
\newcommand*{\SIdecimalsign}[1]{\sisetup{decimalsign={#1}}}
\newcommand*{\SIthousandsep}[1]{\sisetup{digitsep={#1}}}
\newcommand*{\SIproductsign}[1]{\sisetup{expproduct={#1}}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\si@sis@savefont}
% The font definitions need a bit of extra work doing.  As both
% settings here have |@| as a letter, all should be fine.\\
%\cs{si@sis@savefont}\marg{setting}\marg{argument}
%    \begin{macrocode}
\newcommand{\si@sis@savefont}[2]{%
  \@namedef{si@sis@#1}{#2}%
  \sisetup{#1=si@sis@#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\SImathrm}
%\begin{macro}{\SImathsf}
%\begin{macro}{\SImathtt}
% The font control macros have to ensure that a macro name is passed
% to \cs{sisetup}.
%    \begin{macrocode}
\newcommand*{\SImathrm}[1]{\si@sis@savefont{mathrm}{#1}}
\newcommand*{\SImathsf}[1]{\si@sis@savefont{mathsf}{#1}}
\newcommand*{\SImathtt}[1]{\si@sis@savefont{mathtt}{#1}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\SIdefaultMfam}
%\begin{macro}{\SIdefaultNfam}
%\begin{macro}{\SIdefaultTfam}
% The same for the default keys.
%    \begin{macrocode}
\newcommand*{\SIdefaultMfam}[1]{\si@sis@savefont{mathdefault}{#1}}
\newcommand*{\SIdefaultNfam}[1]{\si@sis@savefont{mathnumdefault}{#1}}
\newcommand*{\SIdefaultTfam}[1]{\si@sis@savefont{textdefault}{#1}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\ensureupmath}
% The \cs{ensureupmath} command guarantees processing by the
% font-matching system. The argument cannot be processed here, so
% care is needed.
%    \begin{macrocode}
\DeclareRobustCommand*{\ensureupmath}[1]{%
  \begingroup
    \sisetup{mode=maths,obeyitalic=false}%
    \si@out@text{#1}%
  \endgroup}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\degC}
%\begin{macro}{\degF}
%\begin{macro}{\arcdeg}
% A few extra symbol names are needed.
%    \begin{macrocode}
\newcommand*{\degC}{\si@sym@celsius}
\newcommand*{\arcdeg}{\si@sym@degree}
\newcommand*{\degF}{\si@sym@degree F}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\AddToSIstyle}
%\begin{macro}{\SIstyle}
%\begin{macro}{\SIstyleToLang}
%\begin{macro}{\si@sis@addtolocale}
% Finally, the locale control.
%    \begin{macrocode}
\newcommand*{\SIstyle}[1]{\sisetup{locale=#1}}
\newcommand*{\SIstyleToLang}[2]{\sisetup{loctolang=#1:#2}}
\newcommand*{\AddToSIstyle}{%
  \si@switchfalse
  \@ifstar
    {\si@switchtrue
     \si@sis@addtolocale}
    {\si@sis@addtolocale}}
\newcommand*{\si@sis@addtolocale}[2]{%
    \ifsi@switch
       \expandafter\let\csname si@loc@#1@extra\endcsname\relax
     \fi
  \addtolocale{#1}{#2}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%
%\iffalse
%</sistyle>
%<*SIunits>
%\fi
%\subsection{\SIunits}
% \SIunits emulation starts in much the same way.
%    \begin{macrocode}
\ProvidesFile{si-SIunits.cfg}
  [2008/02/20 v.06a Emulation of SIunits]
\sisetup{
  unitsep=thick,
  valuesep=thick,
  prefixproduct=\si@valuesep}
\si@requirecfgs{prefix,named,accepted,physical}
%    \end{macrocode}
%\begin{macro}{\reciprocal}
%\begin{macro}{\rp}
%\begin{macro}{\per}
%\begin{macro}{\usk}
%\begin{macro}{\power}
%\begin{macro}{\rpsquare}
%\begin{macro}{\rpcubic}
%\begin{macro}{\fourth}
%\begin{macro}{\rpfourth}
% A few very simple translations, using the internal version of
% \cs{per} to allow changes of output style.
%    \begin{macrocode}
\newcommand*{\reciprocal}{\sisetup{per=reciprocal}\si@per}
\let\rp\reciprocal
\renewcommand*{\per}{\sisetup{per=slash}\si@per}
\newcommand*{\usk}{}
\newcommand*{\power}[1]{#1\tothe}
\newcommand*{\rpsquare}{\sisetup{per=reciprocal}\si@per\Square}
\newcommand*{\rpcubic}{\sisetup{per=reciprocal}\si@per\cubic}
\newpower{\fourth}{4}
\newcommand*{\rpfourth}{\sisetup{per=reciprocal}\si@per\fourth}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\rpsquared}
%\begin{macro}{\rpcubed}
% Here, some low-level switch changing is needed.
%    \begin{macrocode}
\newcommand*{\rpsquared}{%
  \sisetup{per=reciprocal}\si@unt@pertrue\si@unt@perseentrue\squared}
\newcommand*{\rpcubed}{\sisetup{per=reciprocal}\si@unt@pertrue\cubed}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\SIsetup}
%\begin{macro}{\si@tempa}
%\begin{macro}{\si@siu@setup}
% The various package spacing options are processed.  They also have
% to be correctly handled by the \cs{SIsetup} macro.
%    \begin{macrocode}
\newcommand*{\SIsetup}[1]{%
  \@for\si@tempa:=#1\do{%
    \@ifundefined{ifsi@old@#1}
      {\si@log@warn{Unknown SIunits option `#1'}}
      {\csname si@old@#1true\endcsname}}
  \si@siu@setup}
\newcommand*{\si@siu@setup}{%
  \ifsi@old@cdot
    \sisetup{unitsep=cdot}%
  \fi
  \ifsi@old@thickspace
    \sisetup{unitsep=thick}%
  \fi
  \ifsi@old@mediumspace
    \sisetup{unitsep=medium}%
  \fi
  \ifsi@old@thinspace
    \sisetup{unitsep=thin}%
  \fi
  \ifsi@old@thickqspace
    \sisetup{valuesep=thick}%
  \fi
  \ifsi@old@mediumqspace
    \sisetup{valuesep=medium}%
  \fi
  \ifsi@old@thinqspace
    \sisetup{valuesep=thin}%
  \fi}
\si@siu@setup
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\square}
%\begin{macro}{\squaren}
% \SIunits does slightly different things about the clash with
% \cs{square}, and either redefines this macro or provides
% \cs{squaren}.
%    \begin{macrocode}
\ifsi@old@squaren
  \newpower{\squaren}{2}
\fi
\AtBeginDocument{%
  \@ifundefined{square}
    {\newpower{\square}{2}}
    {\ifsi@old@amssymb
       \renewpower{\square}{2}
     \else
       \ifsi@old@squaren\else
         \si@log@warn{\string\square\space already
           defined\MessageBreak SIunits mode may cause
           errors}%
       \fi
     \fi}}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\begin{macro}{\gray}
% The potential clash with \pkg{PStricks} is also handled
% differently; here, \cs{Gray} will already be defined by the
%  \currpkg kernel.
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifundefined{gray}
    {\newunit{\gray}{Gy}}
    {\ifsi@old@pstricks
       \renewunit{\gray}{Gy}
     \else
       \ifsi@old@Gray\else
         \si@log@warn{\string\gray\space already
           defined\MessageBreak SIunits mode may cause
           errors}%
       \fi
     \fi}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\unit}
%\begin{macro}{\unita}
% The \cs{unit} macro is defined.
%    \begin{macrocode}
\ifsi@old@italian
  \let\unita\SI
\else
  \let\unit\SI
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
% The miscellaneous options are moped up.
%    \begin{macrocode}
\ifsi@old@textstyle
  \sisetup{mode=text}
\fi
\ifsi@old@binary
  \sisetup{alsoload=binary}
\fi
\ifsi@old@noams
  \AtBeginDocument{%
    \renewcommand*{\si@textmu}{\ensuremath\si@mathsmu}}
\fi
%    \end{macrocode}
%\begin{macro}{\arcminute}
%\begin{macro}{\arcsecond}
%\begin{macro}{\bbar}
%\begin{macro}{\dday}
%\begin{macro}{\liter}
%\begin{macro}{\rperminute}
%\begin{macro}{\ton}
%\begin{macro}{\degreecelsius}
% The unit macros defined by \SIunits that are not defined by
% \currpkg (by default).
%    \begin{macrocode}
\newunit[valuesep=none]{\arcminute}{\si@sym@minute}
\newunit[valuesep=none]{\arcsecond}{\si@sym@second}
\newunit{\bbar}{bar}
\newunit{\dday}{day}
\newunit{\liter}{L}
\newunit{\rperminute}{r/min}
\newunit{\ton}{t}
\newunit{\degreecelsius}{\celsius}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\addunit}
% This is an alias for \cs{newunit}.
%    \begin{macrocode}
\let\addunit\newunit
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\addprefix}
% A little more work for \cs{addprefix}.
%    \begin{macrocode}
\newcommand*{\addprefix}[2]{\newprefix{#1}{#2}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\graypersecond}
%\begin{macro}{\graypersecondnp}
%\begin{macro}{\metrepersquaresecond}
%\begin{macro}{\metrepersquaresecondnp}
%\begin{macro}{\joulepermole}
%\begin{macro}{\joulepermolenp}
%\begin{macro}{\molepercubicmetre}
%\begin{macro}{\molepercubicmetrenp}
%\begin{macro}{\radianpersquaresecond}
%\begin{macro}{\radianpersquaresecondnp}
%\begin{macro}{\kilogramsquaremetrepersecond}
% \SIunits provides lots of macros with rather long names, which are
% not really needed with \currpkg.  However, they have to be defined
% somewhere.  There are a lot of them, so a few are tackled at a
% time.
%    \begin{macrocode}
\addunit{\graypersecond}{\gray\per\second}
\addunit{\graypersecondnp}{\gray\reciprocal\second}
\addunit{\metrepersquaresecond}{\metre\per\second\squared}
\addunit{\metrepersquaresecondnp}{\metre\second\rpsquared}
\addunit{\joulepermole}{\joule\per\mole}
\addunit{\joulepermolenp}{\joule\reciprocal\mole}
\addunit{\molepercubicmetre}{\mole\per\cubic\metre}
\addunit{\molepercubicmetrenp}{\mole\rpcubic\metre}
\addunit{\radianpersquaresecond}{\radian\per\second\squared}
\addunit{\radianpersquaresecondnp}{\radian\second\rpsquared}
\addunit{\kilogramsquaremetrepersecond}
  {\kilogram\usk\squaremetre\per\second}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kilogramsquaremetrepersecondnp}
%\begin{macro}{\radianpersecond}
%\begin{macro}{\radianpersecondnp}
%\begin{macro}{\squaremetrepercubicmetre}
%\begin{macro}{\squaremetrepercubicmetrenp}
%\begin{macro}{\katalpercubicmetre}
%\begin{macro}{\katalpercubicmetrenp}
%\begin{macro}{\coulombpermol}
%\begin{macro}{\coulombpermolnp}
%\begin{macro}{\amperepersquaremetre}
%\begin{macro}{\amperepersquaremetrenp}
% Some more.
%    \begin{macrocode}
\addunit{\kilogramsquaremetrepersecondnp}
  {\kilogram\usk\squaremetre\reciprocal\second}
\addunit{\radianpersecond}{\radian\per\second}
\addunit{\radianpersecondnp}{\radian\reciprocal\second}
\addunit{\squaremetrepercubicmetre}{\squaremetre\per\cubic\metre}
\addunit{\squaremetrepercubicmetrenp}{\squaremetre\rpcubic\metre}
\addunit{\katalpercubicmetre}{\katal\per\cubic\metre}
\addunit{\katalpercubicmetrenp}{\katal\rpcubic\metre}
\addunit{\coulombpermol}{\coulomb\per\mole}
\addunit{\coulombpermolnp}{\coulomb\reciprocal\mole}
\addunit{\amperepersquaremetre}{\ampere\per\squaremetre}
\addunit{\amperepersquaremetrenp}{\ampere\rpsquare\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kilogrampercubicmetre}
%\begin{macro}{\kilogrampercubicmetrenp}
%\begin{macro}{\squaremetrepernewtonsecond}
%\begin{macro}{\squaremetrepernewtonsecondnp}
%\begin{macro}{\pascalsecond}
%\begin{macro}{\coulombpercubicmetre}
%\begin{macro}{\coulombpercubicmetrenp}
%\begin{macro}{\amperemetresecond}
%\begin{macro}{\voltpermetre}
%\begin{macro}{\voltpermetrenp}
%\begin{macro}{\coulombpersquaremetre}
% Some more.
%    \begin{macrocode}
\addunit{\kilogrampercubicmetre}{\kilogram\per\cubic\metre}
\addunit{\kilogrampercubicmetrenp}{\kilogram\rpcubic\metre}
\addunit{\squaremetrepernewtonsecond}
  {\squaremetre\per\newton\second}
\addunit{\squaremetrepernewtonsecondnp}
  {\squaremetre\reciprocal\newton\reciprocal\second}
\addunit{\pascalsecond}{\pascal\second}
\addunit{\coulombpercubicmetre}{\coulomb\per\cubic\metre}
\addunit{\coulombpercubicmetrenp}{\coulomb\rpcubic\metre}
\addunit{\amperemetresecond}{\ampere\metre\second}
\addunit{\voltpermetre}{\volt\per\metre}
\addunit{\voltpermetrenp}{\volt\reciprocal\metre}
\addunit{\coulombpersquaremetre}{\coulomb\per\squaremetre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\coulombpersquaremetrenp}
%\begin{macro}{\faradpermetre}
%\begin{macro}{\faradpermetrenp}
%\begin{macro}{\ohmmetre}
%\begin{macro}{\kilowatthour}
%\begin{macro}{\wattpersquaremetre}
%\begin{macro}{\wattpersquaremetrenp}
%\begin{macro}{\joulepersquaremetre}
%\begin{macro}{\joulepersquaremetrenp}
%\begin{macro}{\newtonpercubicmetre}
%\begin{macro}{\newtonpercubicmetrenp}
% Some more.
%    \begin{macrocode}
\addunit{\coulombpersquaremetrenp}{\coulomb\rpsquare\metre}
\addunit{\faradpermetre}{\farad\per\metre}
\addunit{\faradpermetrenp}{\farad\reciprocal\metre}
\addunit{\ohmmetre}{\ohm\metre}
\addunit{\kilowatthour}{\kilo\watt\hour}
\addunit{\wattpersquaremetre}{\watt\per\squaremetre}
\addunit{\wattpersquaremetrenp}{\watt\rpsquare\metre}
\addunit{\joulepersquaremetre}{\joule\per\squaremetre}
\addunit{\joulepersquaremetrenp}{\joule\rpsquare\metre}
\addunit{\newtonpercubicmetre}{\newton\per\cubic\metre}
\addunit{\newtonpercubicmetrenp}{\newton\rpcubic\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\newtonperkilogram}
%\begin{macro}{\newtonperkilogramnp}
%\begin{macro}{\jouleperkelvin}
%\begin{macro}{\jouleperkelvinnp}
%\begin{macro}{\jouleperkilogram}
%\begin{macro}{\jouleperkilogramnp}
%\begin{macro}{\coulombperkilogram}
%\begin{macro}{\coulombperkilogramnp}
%\begin{macro}{\squaremetrepersecond}
%\begin{macro}{\squaremetrepersecondnp}
%\begin{macro}{\squaremetrepersquaresecond}
% Some more.
%    \begin{macrocode}
\addunit{\newtonperkilogram}{\newton\per\kilogram}
\addunit{\newtonperkilogramnp}{\newton\reciprocal\kilogram}
\addunit{\jouleperkelvin}{\joule\per\kelvin}
\addunit{\jouleperkelvinnp}{\joule\reciprocal\kelvin}
\addunit{\jouleperkilogram}{\joule\per\kilogram}
\addunit{\jouleperkilogramnp}{\joule\reciprocal\kilogram}
\addunit{\coulombperkilogram}{\coulomb\per\kilogram}
\addunit{\coulombperkilogramnp}{\coulomb\reciprocal\kilogram}
\addunit{\squaremetrepersecond}{\squaremetre\per\second}
\addunit{\squaremetrepersecondnp}{\squaremetre\reciprocal\second}
\addunit{\squaremetrepersquaresecond}
  {\squaremetre\per\second\squared}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\squaremetrepersquaresecondnp}
%\begin{macro}{\kilogrammetrepersecond}
%\begin{macro}{\kilogrammetrepersecondnp}
%\begin{macro}{\candelapersquaremetre}
%\begin{macro}{\candelapersquaremetrenp}
%\begin{macro}{\amperepermetre}
%\begin{macro}{\amperepermetrenp}
%\begin{macro}{\joulepertesla}
%\begin{macro}{\jouleperteslanp}
%\begin{macro}{\henrypermetre}
%\begin{macro}{\henrypermetrenp}
% Some more.
%    \begin{macrocode}
\addunit{\squaremetrepersquaresecondnp}
  {\squaremetre\second\rpsquared}
\addunit{\kilogrammetrepersecond}{\kilogram\metre\per\second}
\addunit{\kilogrammetrepersecondnp}
  {\kilogram\metre\reciprocal\second}
\addunit{\candelapersquaremetre}{\candela\per\squaremetre}
\addunit{\candelapersquaremetrenp}{\candela\rpsquare\metre}
\addunit{\amperepermetre}{\ampere\per\metre}
\addunit{\amperepermetrenp}{\ampere\reciprocal\metre}
\addunit{\joulepertesla}{\joule\per\tesla}
\addunit{\jouleperteslanp}{\joule\reciprocal\tesla}
\addunit{\henrypermetre}{\henry\per\metre}
\addunit{\henrypermetrenp}{\henry\reciprocal\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kilogrampersecond}
%\begin{macro}{\kilogrampersecondnp}
%\begin{macro}{\kilogrampersquaremetresecond}
%\begin{macro}{\kilogrampersquaremetresecondnp}
%\begin{macro}{\kilogrampersquaremetre}
%\begin{macro}{\kilogrampersquaremetrenp}
%\begin{macro}{\kilogrampermetre}
%\begin{macro}{\kilogrampermetrenp}
%\begin{macro}{\joulepermolekelvin}
%\begin{macro}{\joulepermolekelvinnp}
%\begin{macro}{\kilogramperkilomole}
% Some more.
%    \begin{macrocode}
\addunit{\kilogrampersecond}{\kilogram\per\second}
\addunit{\kilogrampersecondnp}{\kilogram\reciprocal\second}
\addunit{\kilogrampersquaremetresecond}
  {\kilogram\per\squaremetre\second}
\addunit{\kilogrampersquaremetresecondnp}
  {\kilogram\rpsquare\metre\reciprocal\second}
\addunit{\kilogrampersquaremetre}{\kilogram\per\squaremetre}
\addunit{\kilogrampersquaremetrenp}{\kilogram\rpsquare\metre}
\addunit{\kilogrampermetre}{\kilogram\per\metre}
\addunit{\kilogrampermetrenp}{\kilogram\reciprocal\metre}
\addunit{\joulepermolekelvin}{\joule\per\mole\kelvin}
\addunit{\joulepermolekelvinnp}
  {\joule\reciprocal\mole\reciprocal\kelvin}
\addunit{\kilogramperkilomole}{\kilogram\per\kilo\mole}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kilogramperkilomolenp}
%\begin{macro}{\kilogramsquaremetre}
%\begin{macro}{\kilogramsquaremetrenp}
%\begin{macro}{\kilogrammetrepersquaresecond}
%\begin{macro}{\kilogrammetrepersquaresecondnp}
%\begin{macro}{\newtonpersquaremetre}
%\begin{macro}{\newtonpersquaremetrenp}
%\begin{macro}{\persquaremetresecond}
%\begin{macro}{\persquaremetresecondnp}
%\begin{macro}{\wattperkilogram}
%\begin{macro}{\wattperkilogramnp}
% Some more.
%    \begin{macrocode}
\addunit{\kilogramperkilomolenp}{\kilogram\kilo\reciprocal\mole}
\addunit{\kilogramsquaremetre}{\kilogram\squaremetre}
\addunit{\kilogramsquaremetrenp}{\kilogramsquaremetre}
\addunit{\kilogrammetrepersquaresecond}
  {\kilogram\metre\per\second\squared}
\addunit{\kilogrammetrepersquaresecondnp}
  {\kilogram\metre\second\rpsquared}
\addunit{\newtonpersquaremetre}{\newton\per\squaremetre}
\addunit{\newtonpersquaremetrenp}{\newton\rpsquare\metre}
\addunit{\persquaremetresecond}{1\per\squaremetre\second}
\addunit{\persquaremetresecondnp}{\rpsquare\metre\reciprocal\second}
\addunit{\wattperkilogram}{\watt\per\kilogram}
\addunit{\wattperkilogramnp}{\watt\reciprocal\kilogram}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\wattpercubicmetre}
%\begin{macro}{\wattpercubicmetrenp}
%\begin{macro}{\wattpersquaremetresteradian}
%\begin{macro}{\wattpersquaremetresteradiannp}
%\begin{macro}{\jouleperkilogramkelvin}
%\begin{macro}{\jouleperkilogramkelvinnp}
%\begin{macro}{\squaremetreperkilogram}
%\begin{macro}{\rpsquaremetreperkilogram}
%\begin{macro}{\cubicmetreperkilogram}
%\begin{macro}{\rpcubicmetreperkilogram}
%\begin{macro}{\newtonpermetre}
% Some more.
%    \begin{macrocode}
\addunit{\wattpercubicmetre}{\watt\per\cubic\metre}
\addunit{\wattpercubicmetrenp}{\watt\rpcubic\metre}
\addunit{\wattpersquaremetresteradian}{\watt\per\squaremetre\steradian}
\addunit{\wattpersquaremetresteradiannp}
  {\watt\rpsquare\metre\rp\steradian}
\addunit{\jouleperkilogramkelvin}{\joule\per\kilogram\kelvin}
\addunit{\jouleperkilogramkelvinnp}
  {\joule\reciprocal\kilogram\reciprocal\kelvin}
\addunit{\squaremetreperkilogram}{\squaremetre\per\kilogram}
\addunit{\rpsquaremetreperkilogram}
  {\squaremetre\reciprocal\kilogram}
\addunit{\cubicmetreperkilogram}{\cubic\metre\per\kilogram}
\addunit{\rpcubicmetreperkilogram}
  {\cubic\metre\reciprocal\kilogram}
\addunit{\newtonpermetre}{\newton\per\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\newtonpermetrenp}
%\begin{macro}{\wattpermetrekelvin}
%\begin{macro}{\wattpermetrekelvinnp}
%\begin{macro}{\newtonmetre}
%\begin{macro}{\newtonmetrenp}
%\begin{macro}{\squaremetrepercubicsecond}
%\begin{macro}{\squaremetrepercubicsecondnp}
%\begin{macro}{\metrepersecond}
%\begin{macro}{\metrepersecondnp}
%\begin{macro}{\joulepercubicmetre}
%\begin{macro}{\joulepercubicmetrenp}
% Some more.
%    \begin{macrocode}
\addunit{\newtonpermetrenp}{\newton\reciprocal\metre}
\addunit{\wattpermetrekelvin}{\watt\per\metre\kelvin}
\addunit{\wattpermetrekelvinnp}
  {\watt\reciprocal\metre\reciprocal\kelvin}
\addunit{\newtonmetre}{\newton\metre}
\addunit{\newtonmetrenp}{\newtonmetre}
\addunit{\squaremetrepercubicsecond}{\squaremetre\per\cubic\second}
\addunit{\squaremetrepercubicsecondnp}
  {\squaremetre\rpcubic\second}
\addunit{\metrepersecond}{\metre\per\second}
\addunit{\metrepersecondnp}{\metre\reciprocal\second}
\addunit{\joulepercubicmetre}{\joule\per\cubicmetre}
\addunit{\joulepercubicmetrenp}{\joule\rpcubic\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kilogrampercubicmetrecoulomb}
%\begin{macro}{\kilogrampercubicmetrecoulombnp}
%\begin{macro}{\cubicmetrepersecond}
%\begin{macro}{\rpcubicmetrepersecond}
%\begin{macro}{\kilogrampersecondcubicmetre}
%\begin{macro}{\kilogrampersecondcubicmetrenp}
% Last block.
%    \begin{macrocode}
\addunit{\kilogrampercubicmetrecoulomb}
  {\kilogram\per\cubic\metre\coulomb}
\addunit{\kilogrampercubicmetrecoulombnp}
  {\kilogram\rpcubic\metre\reciprocal\coulomb}
\addunit{\cubicmetrepersecond}{\cubicmetre\per\second}
\addunit{\rpcubicmetrepersecond}{\cubicmetre\reciprocal\second}
\addunit{\kilogrampersecondcubicmetre}
  {\kilogram\per\second\cubicmetre}
\addunit{\kilogrampersecondcubicmetrenp}
  {\kilogram\reciprocal\second\rpcubic\metre}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\yoctod}
%\begin{macro}{\zeptod}
%\begin{macro}{\attod}
%\begin{macro}{\femtod}
%\begin{macro}{\picod}
%\begin{macro}{\nanod}
%\begin{macro}{\microd}
%\begin{macro}{\millid}
%\begin{macro}{\centid}
% The prefixes giving numerical output need a trick.  First the small
% values.
%    \begin{macrocode}
\newunit{\yoctod}{\si@prefixnumtrue\yocto}
\newunit{\zeptod}{\si@prefixnumtrue\zepto}
\newunit{\attod}{\si@prefixnumtrue\atto}
\newunit{\femtod}{\si@prefixnumtrue\femto}
\newunit{\picod}{\si@prefixnumtrue\pico}
\newunit{\nanod}{\si@prefixnumtrue\nano}
\newunit{\microd}{\si@prefixnumtrue\micro}
\newunit{\millid}{\si@prefixnumtrue\milli}
\newunit{\centid}{\si@prefixnumtrue\centi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\decad}
%\begin{macro}{\dekad}
%\begin{macro}{\hectod}
%\begin{macro}{\kilod}
%\begin{macro}{\megad}
%\begin{macro}{\gigad}
%\begin{macro}{\terad}
%\begin{macro}{\petad}
%\begin{macro}{\exad}
%\begin{macro}{\zettad}
%\begin{macro}{\yottad}
% The the larger ones.
%    \begin{macrocode}
\newunit{\decad}{\si@prefixnumtrue\deca}
\newunit{\dekad}{\si@prefixnumtrue\deka}
\newunit{\hectod}{\si@prefixnumtrue\hecto}
\newunit{\kilod}{\si@prefixnumtrue\kilo}
\newunit{\megad}{\si@prefixnumtrue\mega}
\newunit{\gigad}{\si@prefixnumtrue\giga}
\newunit{\terad}{\si@prefixnumtrue\tera}
\newunit{\petad}{\si@prefixnumtrue\peta}
\newunit{\exad}{\si@prefixnumtrue\exa}
\newunit{\zettad}{\si@prefixnumtrue\zetta}
\newunit{\yottad}{\si@prefixnumtrue\yotta}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\kibid}
%\begin{macro}{\mebid}
%\begin{macro}{\gibid}
%\begin{macro}{\tebid}
%\begin{macro}{\pebid}
%\begin{macro}{\exbid}
% The binary versions need a little more work.
%    \begin{macrocode}
\newunit{\kibid}{%
  \si@prefixnumtrue\let\si@prefixpower\si@fix@two\kibi}
\newunit{\mebid}{%
  \si@prefixnumtrue\let\si@prefixpower\si@fix@two\mebi}
\newunit{\gibid}{%
  \si@prefixnumtrue\let\si@prefixpower\si@fix@two\gibi}
\newunit{\tebid}{%
  \si@prefixnumtrue\let\si@prefixpower\si@fix@two\tebi}
\newunit{\pebid}{%
  \si@prefixnumtrue\let\si@prefixpower\si@fix@two\pebi}
\newunit{\exbid}{%
  \si@prefixnumtrue\let\si@prefixpower\si@fix@two\exbi}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\derradian}
%\begin{macro}{\dersteradian}
%\begin{macro}{\derhertz}
%\begin{macro}{\dernewton}
%\begin{macro}{\derpascal}
%\begin{macro}{\derjoule}
%\begin{macro}{\derwatt}
%\begin{macro}{\dercoulomb}
%\begin{macro}{\dervolt}
%\begin{macro}{\derfarad}
%\begin{macro}{\derohm}
% The derived units may need to be defined.
%    \begin{macrocode}
\ifsi@old@derived
  \newunit{\derradian}{\metre\reciprocal\metre}
  \newunit{\dersteradian}{\squaremetre\rpsquare\metre}
  \newunit{\derhertz}{\reciprocal\second}
  \newunit{\dernewton}{\metre\kilogram\second\rpsquared}
  \newunit{\derpascal}{\newton\rpsquare\metre}
  \newunit{\derjoule}{\newton\metre}
  \newunit{\derwatt}{\joule\reciprocal\second}
  \newunit{\dercoulomb}{\ampere\second}
  \newunit{\dervolt}{\watt\reciprocal\ampere}
  \newunit{\derfarad}{\coulomb\reciprocal\volt}
  \newunit{\derohm}{\volt\reciprocal\ampere}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\dersiemens}
%\begin{macro}{\derweber}
%\begin{macro}{\dertesla}
%\begin{macro}{\derhenry}
%\begin{macro}{\dercelsius}
%\begin{macro}{\derlumen}
%\begin{macro}{\derlux}
%\begin{macro}{\derbecquerel}
%\begin{macro}{\dergray}
%\begin{macro}{\dersievert}
%\begin{macro}{\derkatal}
% In two blocks!
%    \begin{macrocode}
  \newunit{\dersiemens}{\ampere\reciprocal\volt}
  \newunit{\derweber}
    {\squaremetre\kilogram\second\rpsquared\reciprocal\ampere}
  \newunit{\dertesla}{\weber\rpsquare\metre}
  \newunit{\derhenry}{\weber\reciprocal\ampere}
  \newunit{\dercelsius}{\kelvin}
  \newunit{\derlumen}{\candela\steradian}
  \newunit{\derlux}{\lumen\rpsquare\metre}
  \newunit{\derbecquerel}{\derhertz}
  \newunit{\dergray}{\joule\reciprocal\kilogram}
  \newunit{\dersievert}{\dergray}
  \newunit{\derkatal}{\rp\second\usk\mole}
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\radianbase}
%\begin{macro}{\steradianbase}
%\begin{macro}{\hertzbase}
%\begin{macro}{\newtonbase}
%\begin{macro}{\pascalbase}
%\begin{macro}{\joulebase}
%\begin{macro}{\wattbase}
%\begin{macro}{\coulombbase}
%\begin{macro}{\voltbase}
%\begin{macro}{\faradbase}
%\begin{macro}{\ohmbase}
% Also the ``derived-in-base''.
%    \begin{macrocode}
\ifsi@old@derivedinbase
  \newunit{\radianbase}{\metre\reciprocal\metre}
  \newunit{\steradianbase}{\squaremetre\rpsquare\metre}
  \newunit{\hertzbase}{\reciprocal\second}
  \newunit{\newtonbase}{\metre\kilogram\second\rpsquared}
  \newunit{\pascalbase}{\reciprocal\metre\kilogram\second\rpsquared}
  \newunit{\joulebase}{\squaremetre\kilogram\second\rpsquared}
  \newunit{\wattbase}{\squaremetre\kilogram\rpcubic\second}
  \newunit{\coulombbase}{\ampere\second}
  \newunit{\voltbase}
    {\squaremetre\kilogram\rpcubic\second\reciprocal\ampere}
  \newunit{\faradbase}
    {\rpsquare\metre\reciprocal\kilogram\fourth\second\ampere%
      \squared}
  \newunit{\ohmbase}
    {\squaremetre\kilogram\rpcubic\second\rpsquare\ampere}
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\begin{macro}{\siemensbase}
%\begin{macro}{\weberbase}
%\begin{macro}{\teslabase}
%\begin{macro}{\henrybase}
%\begin{macro}{\celsiusbase}
%\begin{macro}{\lumenbase}
%\begin{macro}{\luxbase}
%\begin{macro}{\becquerelbase}
%\begin{macro}{\graybase}
%\begin{macro}{\sievertbase}
%\begin{macro}{\katalbase}
% Also in two blocks.
%    \begin{macrocode}
  \newunit{\siemensbase}
    {\rpsquare\metre\reciprocal\kilogram\cubic\second\ampere\squared}
  \newunit{\weberbase}
    {\squaremetre\kilogram\second\rpsquared\reciprocal\ampere}
  \newunit{\teslabase}{\kilogram\second\rpsquared\reciprocal\ampere}
  \newunit{\henrybase}
    {\squaremetre\kilogram\second\rpsquared\rpsquare\ampere}
  \newunit{\celsiusbase}{\kelvin}
  \newunit{\lumenbase}{\candela\squaremetre\rpsquare\metre}
  \newunit{\luxbase}{\candela\squaremetre\rpfourth\metre}
  \newunit{\becquerelbase}{\hertzbase}
  \newunit{\graybase}{\squaremetre\second\rpsquared}
  \newunit{\sievertbase}{\graybase}
  \newunit{\katalbase}{\rp\second\mole}
\fi
%    \end{macrocode}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
%\end{macro}
% Any configuration file is used if found.
%    \begin{macrocode}
\InputIfFileExists{SIunits.cfg}
  {\si@log@inf{SIunits config file loaded}}
  {\si@log@inf{SIunits config file not found}}
%    \end{macrocode}
%\iffalse
%</SIunits>
%\fi
%
%\Finale
%\iffalse
%<*refs>
@misc{NIST,
  note = {\url{http://physics.nist.gov/cuu/Units/rules.html}},
}
%</refs>
%<*jawltxdoc>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{jawltxdoc}
\usepackage[T1]{fontenc}
\usepackage[english,UKenglish]{babel}
\usepackage[scaled=0.95]{helvet}
\usepackage[version=3]{mhchem}
\usepackage[final]{microtype}
\usepackage[osf]{mathpazo}
\usepackage{booktabs,array,url,graphicx,courier,xspace}
\usepackage{upgreek,ifpdf,listings,float,caption,longtable}
\floatstyle{plaintop}
\restylefloat{table}
\ifpdf
  \usepackage{embedfile}
  \embedfile[%
    stringmethod=escape,%
    mimetype=plain/text,%
    desc={LaTeX docstrip source archive for package `\jobname'}%
    ]{\jobname.dtx}
\fi
\IfFileExists{\jobname.sty}
  {\usepackage{\jobname}}{}
\usepackage[numbered]{hypdoc}
\newlength\LaTeXwidth
\newlength\LaTeXoutdent
\newlength\LaTeXgap
\setlength\LaTeXgap{1em}
\setlength\LaTeXoutdent{-0.15\textwidth}
\newcommand*{\typesetexampleandcode}{%
  \begin{list}{}{%
    \setlength\itemindent{0pt}
    \setlength\leftmargin\LaTeXoutdent
    \setlength\rightmargin{0pt}
  }
  \item
    \setlength\LaTeXoutdent{-0.15\textwidth}
    \begin{minipage}[c]{\textwidth-\LaTeXwidth-\LaTeXoutdent-\LaTeXgap}
      \lst@sampleInput
    \end{minipage}%
    \hfill%
    \begin{minipage}[c]{\LaTeXwidth}%
      \hbox to\linewidth{\box\lst@samplebox\hss}%
    \end{minipage}%
  \end{list}
}
\newcommand*{\typesetcodeandexample}{%
  \begin{list}{}{%
    \setlength\itemindent{0pt}
    \setlength\leftmargin{0pt}
    \setlength\rightmargin{0pt}
  }
  \item
    \begin{minipage}[c]{\LaTeXwidth}%
      \hbox to\linewidth{\box\lst@samplebox\hss}%
    \end{minipage}%
    \lst@sampleInput
  \end{list}
}
\newcommand*{\typesetfloatexample}{%
  \begin{list}{}{%
    \setlength\itemindent{0pt}
    \setlength\leftmargin{0pt}
    \setlength\rightmargin{0pt}
  }
  \item
    \lst@sampleInput
    \begin{minipage}[c]{\LaTeXwidth}%
      \hbox to\linewidth{\box\lst@samplebox\hss}%
    \end{minipage}%
  \end{list}
}
\newcommand*{\typesetcodeonly}{%
  \begin{list}{}{%
    \setlength\itemindent{0pt}
    \setlength\leftmargin{0pt}
    \setlength\rightmargin{0pt}
  }
  \item
    \begin{minipage}[c]{\LaTeXwidth}%
      \hbox to\linewidth{\box\lst@samplebox\hss}%
    \end{minipage}%
  \end{list}
}
\edef\LaTeXexamplefile{\jobname.tmp}
\lst@RequireAspects{writefile}
\newbox\lst@samplebox
\lstnewenvironment{LaTeXexample}[1][\typesetexampleandcode]{%
  \let\typesetexample#1
  \global\let\lst@intname\@empty
  \setbox\lst@samplebox=\hbox\bgroup
  \setkeys{lst}{tabsize=4,gobble=3,breakindent=0pt,%
    basicstyle=\small\ttfamily,basewidth=0.51em,%
    keywordstyle=\color{blue}}
  \lst@BeginAlsoWriteFile{\LaTeXexamplefile}
}{%
  \lst@EndWriteFile\egroup
  \setlength\LaTeXwidth{\wd\lst@samplebox}
  \typesetexample%
}
\newcommand*{\lst@sampleInput}{%
  \MakePercentComment\catcode`\^^M=10\relax
  \small%
  {\setkeys{lst}{SelectCharTable=\lst@ReplaceInput{\^\^I}%
    {\lst@ProcessTabulator}}%
    \leavevmode \input{\LaTeXexamplefile}}%
  \MakePercentIgnore%
}
\newcommand*{\pkg}[1]{\textsf{#1}}
\newcommand*{\currpkg}{\pkg{\jobname}\xspace}
\newcommand*{\opt}[1]{\texttt{#1}}
\newcommand*{\file}[1]{\texttt{#1}}
\newcommand*{\ext}[1]{\file{.#1}}
\newcommand*{\latin}[1]{\emph{#1}}
\newcommand*{\etc}{%
  \@ifnextchar.
    {\latin{etc}}
    {\latin{etc.}}
  \xspace}
\newcommand*{\eg}{%
  \@ifnextchar.
    {\latin{e.g}}
    {\latin{e.g.}}
  \xspace}
\newcommand*{\ie}{%
  \@ifnextchar.
    {\latin{i.e}}
    {\latin{i.e.}}
  \xspace}
\newcommand*{\AMS}{{\protect\usefont{OMS}{cmsy}{m}{n}%
  A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
\providecommand*{\eTeX}{\ensuremath{\varepsilon}-\TeX}
\newcommand*{\XeTeX}
  {X\kern-.125em\lower.5ex\hbox{\reflectbox{E}}\kern-.1667em\TeX}
%</jawltxdoc>
%\fi