summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-02-21 18:13:54 +0000
committerKarl Berry <karl@freefriends.org>2008-02-21 18:13:54 +0000
commit3a5c4408a5ea1eff072ec15563a8e805c8c91bab (patch)
treed8aa76c76fe80c196e456733b303937b0b21367a /Master/texmf-dist/source
parenta691030f2a8c6493f60ec90ef9fcc2751ed85ee6 (diff)
newish exptl latex package si (19feb08)
git-svn-id: svn://tug.org/texlive/trunk@6705 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r--Master/texmf-dist/source/latex/si/si.dtx9272
-rw-r--r--Master/texmf-dist/source/latex/si/si.ins66
2 files changed, 9338 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/si/si.dtx b/Master/texmf-dist/source/latex/si/si.dtx
new file mode 100644
index 00000000000..40ec01b12db
--- /dev/null
+++ b/Master/texmf-dist/source/latex/si/si.dtx
@@ -0,0 +1,9272 @@
+% \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/18 v0.6 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}
+%\begin{macro}{\si@tempa}
+% The configuration files depend on each other.\\
+%\cs{si@requirecfgs}\marg{cfg-file}
+% \begin{macrocode}
+\newcommand*{\si@requirecfgs}[1]{%
+ \@for\si@tempa:=#1\do{\si@loadfile{\si@tempa}}}
+% \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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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/18 v0.6 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
diff --git a/Master/texmf-dist/source/latex/si/si.ins b/Master/texmf-dist/source/latex/si/si.ins
new file mode 100644
index 00000000000..3e8a8d3c58e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/si/si.ins
@@ -0,0 +1,66 @@
+%%
+%% This is file `si.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% si.dtx (with options: `install')
+%% ----------------------------------------------------------------
+%% 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
+%% ----------------------------------------------------------------
+%%
+\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
+\endinput
+%%
+%% End of file `si.ins'.