From 5e1a51472611bd034207d3ab83a1c277ab8f959c Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 18 Jun 2008 18:58:17 +0000 Subject: siunitx 1.0 (16jun08) git-svn-id: svn://tug.org/texlive/trunk@8852 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/bibtex/bib/siunitx/siunitx.bib | 38 + Master/texmf-dist/doc/latex/siunitx/README | 29 + Master/texmf-dist/doc/latex/siunitx/si-bug.ltx | 31 + .../doc/latex/siunitx/siunitx-manual.pdf | Bin 0 -> 721955 bytes Master/texmf-dist/doc/latex/siunitx/siunitx.pdf | Bin 0 -> 1101861 bytes Master/texmf-dist/source/latex/siunitx/siunitx.dtx | 12689 +++++++++++++++++++ Master/texmf-dist/source/latex/siunitx/siunitx.ins | 79 + .../texmf-dist/tex/latex/siunitx/config/si-DE.cfg | 27 + .../tex/latex/siunitx/config/si-SIunits.cfg | 329 + .../texmf-dist/tex/latex/siunitx/config/si-UK.cfg | 27 + .../texmf-dist/tex/latex/siunitx/config/si-USA.cfg | 27 + .../texmf-dist/tex/latex/siunitx/config/si-ZA.cfg | 28 + .../tex/latex/siunitx/config/si-abbr.cfg | 73 + .../tex/latex/siunitx/config/si-accepted.cfg | 39 + .../tex/latex/siunitx/config/si-addn.cfg | 33 + .../tex/latex/siunitx/config/si-astro.cfg | 23 + .../tex/latex/siunitx/config/si-binary.cfg | 30 + .../tex/latex/siunitx/config/si-fancynum.cfg | 48 + .../tex/latex/siunitx/config/si-fancyunits.cfg | 106 + .../texmf-dist/tex/latex/siunitx/config/si-hep.cfg | 39 + .../tex/latex/siunitx/config/si-hepunits.cfg | 71 + .../tex/latex/siunitx/config/si-named.cfg | 55 + .../tex/latex/siunitx/config/si-physical.cfg | 27 + .../tex/latex/siunitx/config/si-prefix.cfg | 50 + .../tex/latex/siunitx/config/si-prefixed.cfg | 103 + .../tex/latex/siunitx/config/si-sistyle.cfg | 87 + .../tex/latex/siunitx/config/si-synchem.cfg | 27 + .../tex/latex/siunitx/config/si-units.cfg | 53 + .../tex/latex/siunitx/config/si-unitsdef.cfg | 233 + Master/texmf-dist/tex/latex/siunitx/siunitx.sty | 3509 +++++ Master/tlpkg/bin/ctan2tds | 1 - Master/tlpkg/bin/tlpkg-ctan-check | 2 +- Master/tlpkg/tlpsrc/siunitx.tlpsrc | 2 + 33 files changed, 17913 insertions(+), 2 deletions(-) create mode 100644 Master/texmf-dist/bibtex/bib/siunitx/siunitx.bib create mode 100644 Master/texmf-dist/doc/latex/siunitx/README create mode 100644 Master/texmf-dist/doc/latex/siunitx/si-bug.ltx create mode 100644 Master/texmf-dist/doc/latex/siunitx/siunitx-manual.pdf create mode 100644 Master/texmf-dist/doc/latex/siunitx/siunitx.pdf create mode 100644 Master/texmf-dist/source/latex/siunitx/siunitx.dtx create mode 100644 Master/texmf-dist/source/latex/siunitx/siunitx.ins create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-DE.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-SIunits.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-UK.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-USA.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-ZA.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-abbr.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-accepted.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-addn.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-astro.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-binary.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-fancynum.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-fancyunits.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-hep.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-hepunits.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-named.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-physical.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-prefix.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-prefixed.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-sistyle.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-synchem.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-units.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/config/si-unitsdef.cfg create mode 100644 Master/texmf-dist/tex/latex/siunitx/siunitx.sty create mode 100644 Master/tlpkg/tlpsrc/siunitx.tlpsrc (limited to 'Master') diff --git a/Master/texmf-dist/bibtex/bib/siunitx/siunitx.bib b/Master/texmf-dist/bibtex/bib/siunitx/siunitx.bib new file mode 100644 index 00000000000..322ed1577a8 --- /dev/null +++ b/Master/texmf-dist/bibtex/bib/siunitx/siunitx.bib @@ -0,0 +1,38 @@ +@misc{BIPM:EN, + note = {\url{http://www.bipm.org/en/si/}}, +} + +@misc{BIPM:FR, + note = {\url{http://www.bipm.org/fr/si/}}, +} + +@misc{BIPM:PDF, + note = {\url{http://www.bipm.org/en/si/si_brochure/}}, +} + +@misc{Eijkhout, + author = {Victor Eijkhout}, + note = {\url{http://www.eijkhout.net/tbt/}}, + title = {{\TeX} by {T}opic}, + year = {2007}, +} + +@misc{fancyunits, + author = {Heiko Bauke}, + note = {\url{http://www.mpi-hd.mpg.de/personalhomes/bauke/LaTeX/Tips_und_Tricks/fancyunits/index.php}}, + title = {\pkg{fancyunits}}, + year = 2007, +} + +@misc{IUPAC, + note = {\url{http://old.iupac.org/publications/books/gbook/green_book_2ed.pdf}}, + title = {The \textsc{iupac} {G}reen {B}ook}, + year = 1993, +} + +@misc{NIST, + note = {\url{http://physics.nist.gov/cuu/Units/index.html}}, +} +\endinput +%% +%% End of file `siunitx.bib'. diff --git a/Master/texmf-dist/doc/latex/siunitx/README b/Master/texmf-dist/doc/latex/siunitx/README new file mode 100644 index 00000000000..f7a2eb88dc1 --- /dev/null +++ b/Master/texmf-dist/doc/latex/siunitx/README @@ -0,0 +1,29 @@ +---------------------------------------------------------------- +The siunitx 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 +---------------------------------------------------------------- + +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). + +The siunitx provides a set of tools for authors to typeset +numbers and units in a consistent way. The package has an +extended set of configuration options which make it possible to +follow varying typographic conventions with the same input +syntax. The package includes automated processing of numbers +and units, and the ability to control tabular alignment of +numbers. + +A number of LaTeX packages have been developed in the past for +formatting units: SIunits, sistyle, unitsdef, unitspkg, +fancyunits and fancynum. Support for users of all of these +packages is available as emulation modules in siunitx. In +addition, siunitx can carry out many of the functions of the +dcolumn, rccol and numprint packages. diff --git a/Master/texmf-dist/doc/latex/siunitx/si-bug.ltx b/Master/texmf-dist/doc/latex/siunitx/si-bug.ltx new file mode 100644 index 00000000000..d437dc2a5ce --- /dev/null +++ b/Master/texmf-dist/doc/latex/siunitx/si-bug.ltx @@ -0,0 +1,31 @@ +%% +%% This is file `si-bug.ltx', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `bug') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\listfiles +\documentclass{article} +\usepackage{siunitx} +\sisetup{debug} +\begin{document} +This is the bug test-case document for the \textsf{siunitx} +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} +\endinput +%% +%% End of file `si-bug.ltx'. diff --git a/Master/texmf-dist/doc/latex/siunitx/siunitx-manual.pdf b/Master/texmf-dist/doc/latex/siunitx/siunitx-manual.pdf new file mode 100644 index 00000000000..876361b294b Binary files /dev/null and b/Master/texmf-dist/doc/latex/siunitx/siunitx-manual.pdf differ diff --git a/Master/texmf-dist/doc/latex/siunitx/siunitx.pdf b/Master/texmf-dist/doc/latex/siunitx/siunitx.pdf new file mode 100644 index 00000000000..8b0b8d59923 Binary files /dev/null and b/Master/texmf-dist/doc/latex/siunitx/siunitx.pdf differ diff --git a/Master/texmf-dist/source/latex/siunitx/siunitx.dtx b/Master/texmf-dist/source/latex/siunitx/siunitx.dtx new file mode 100644 index 00000000000..04e9eb37b8e --- /dev/null +++ b/Master/texmf-dist/source/latex/siunitx/siunitx.dtx @@ -0,0 +1,12689 @@ +% \iffalse meta-comment +% +% Copyright (C) 2008 by +% Joseph Wright +% +% 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 siunitx.dtx +% and the derived files siunitx.ins, +% siunitx.sty, +% jawltxdoc.sty, +% si-bug.ltx, +% si-SIunits.cfg, +% si-sistyle.cfg, +% si-unitsdef.cfg, +% si-units.cfg, +% si-hepunits.cfg, +% si-fancynum.cfg, +% si-fancyunits.cfg, +% si-prefix.cfg, +% si-named.cfg, +% si-prefixed.cfg, +% si-addn.cfg, +% si-accepted.cfg, +% si-physical.cfg, +% si-abbr.cfg, +% si-synchem.cfg, +% si-hep.cfg, +% si-astro.cfg, +% si-binary.cfg, +% si-UK.cfg, +% si-USA.cfg, +% si-DE.cfg, +% si-ZA.cfg, +% siunitx.bib and +% siunitx.pdf +% +% TDS-ready files: +% The compressed file siunitx.tds.zip contains an unpacked version +% of all of the files included here, and pre-compiled +% documentation in PDF format. Simply decompress siunitx.tds.dtx +% in your local TeX directory, run your hash program (texhash, +% initexmf --update-fndb, etc.) and everything will be ready to +% go. The user documentation for the package is called +% siunitx-manual.pdf; the file siunitx.pdf includes the user +% manual and the fully-indexed source code. +% +% Unpacking: +% (a) If siunitx.ins is present: +% tex siunitx.ins +% (b) Without siunitx.ins: +% tex siunitx.dtx +% (c) If you use LaTeX to generate files: +% latex \let\install=y\input{siunitx.dtx} +% +% Documentation: +% (a) Without write18 enabled: +% pdflatex siunitx.dtx +% bibtex8 --wolfgang siunitx +% makeindex -s gind.ist siunitx.idx +% makeindex -s gglo.ist -o siunitx.gls siunitx.glo +% pdflatex siunitx.dtx +% pdflatex siunitx.dtx +% (b) With write18 enabled: +% pdflatex siunitx.dtx +% pdflatex siunitx.dtx +% pdflatex siunitx.dtx +% +% Installation: +% Copy siunitx.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, initexmf --update-fndb, 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 +% +%<*install> +\input docstrip.tex +\keepsilent +\askforoverwritefalse +\preamble + ---------------------------------------------------------------- + The siunitx 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 siunitx files:} +\generate{\file{jawltxdoc.sty}{\from{\jobname.dtx}{jawltxdoc}} +} +\usedir{tex/latex/siunitx} +\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}} +} +\usedir{source/latex/siunitx} +\generate{\file{\jobname.ins}{\from{\jobname.dtx}{install}} +} +\usedir{doc/latex/siunitx} +\generate{\file{si-bug.ltx}{\from{\jobname.dtx}{bug}} +} +\usedir{tex/latex/siunitx/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}} + \file{si-hepunits.cfg}{\from{\jobname.dtx}{hepunits}} + \file{si-fancynum.cfg}{\from{\jobname.dtx}{fancynum}} + \file{si-fancyunits.cfg}{\from{\jobname.dtx}{fancyunits}} +} +\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-astro.cfg}{\from{\jobname.dtx}{astro}} + \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-DE.cfg}{\from{\jobname.dtx}{DE}} + \file{si-ZA.cfg}{\from{\jobname.dtx}{ZA}} +} +\nopreamble +\usedir{bibtex/bib/siunitx} +\generate{\file{\jobname.bib}{\from{\jobname.dtx}{refs}} +} +\nopreamble\nopostamble +\usedir{doc/latex/siunitx} +\generate{\file{README.txt}{\from{\jobname.dtx}{readme}} +} +\endbatchfile +% +%<*readme> +---------------------------------------------------------------- +The siunitx 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 +---------------------------------------------------------------- + +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). + +The siunitx provides a set of tools for authors to typeset +numbers and units in a consistent way. The package has an +extended set of configuration options which make it possible to +follow varying typographic conventions with the same input +syntax. The package includes automated processing of numbers +and units, and the ability to control tabular alignment of +numbers. + +A number of LaTeX packages have been developed in the past for +formatting units: SIunits, sistyle, unitsdef, unitspkg, +fancyunits and fancynum. Support for users of all of these +packages is available as emulation modules in siunitx. In +addition, siunitx can carry out many of the functions of the +dcolumn, rccol and numprint packages. +% +%<*ignore> +\fi +% Will Robertson's trick +\immediate\write18{bibtex8 --wolfgang \jobname} +\immediate\write18{makeindex -s gind.ist -o \jobname.ind \jobname.idx} +\immediate\write18{makeindex -s gglo.ist -o \jobname.gls \jobname.glo} +% +%<*driver> +\PassOptionsToClass{a4paper}{article} +\documentclass[german,english,UKenglish]{ltxdoc} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +%\OnlyDescription +% Various adjustments are needed to the packages loaded. xfrac is +% only loaded if it is available. MiKTeX users should note that they +% will need to download the expl3 and xbase bundles from CTAN to use +% xfrac; the MiKTeX versions are very old and will cause errors. +\usepackage[final]{graphicx} +\IfFileExists{xfrac.sty} + {\usepackage{xfrac}} + {} +\usepackage{jawltxdoc} +\usepackage{textcomp,tikz,pgfplots,tocloft} +\usepackage[latin1]{inputenc} +\sisetup{ + eVcorra=0.1ex, + unitsep=cdot, + alsoload={synchem,hep,binary,astro}, + loctolang={UK:UKenglish,DE:german}} +\setlength{\cftsubsecnumwidth}{2.5em} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +% +% \fi +% +%\CheckSum{9403} +% +% \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@} +% +%\DoNotIndex{\if,\lowercase,\+,\,,\-,\.,\:,\;,\@argdef,\@cdr} +%\DoNotIndex{\@ifdefinable,\@testopt,\@yargdef,\color,\endlinechar} +%\DoNotIndex{\key@ifundefined,\newrobustcmd,\protected,\scriptspace} +%\DoNotIndex{\usebox,\tw@,\ifinner,\usepackage,\texttt,\textsf} +%\DoNotIndex{\NC@do,\loop,\l@ngrel@x,\g@addto@macro,\documentclass} +%\DoNotIndex{\document\,\begin,\=,\@ehb,\\,\listfiles} +% +%\DoNotIndex{\pascalsecond,\amperemetresecond,\ohmmetre} +%\DoNotIndex{\newtonmetre,\newtonmetrenp} +%\DoNotIndex{\kilogramsquaremetre,\kilogramsquaremetrenp} +% +%\changes{v1.0}{2008/06/12}{First official release} +% +%\setkeys{lst}{language=[LaTeX]{TeX},moretexcs={sisetup,num,ang,SI, +% si,newunit,newpower,newprefix,metre,candela,kelvin,ampere,eV, +% second,mole,per,kilogram,Square,squared,cubed,cubic,kilo,centi, +% gram,tothe,toprule,midrule,bottomrule,newton,micro,joule,mega, +% raiseto,deci,mathnormal,numprint,electronvolt,selectlanguage, +% kibi,byte,molar,Molar,mmHg,mebi,torr,parsec,lightyear,clight, +% eVperc,addplot,color,milli,cm,Hz,kg,DeclareRobustCommand, +% pascal,dalton}} +% +%\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*{\units}{\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). +% +% The \currpkg provides a set of tools for authors to typeset numbers +% and units in a consistent way. The package has an extended set of +% configuration options which make it possible to follow varying +% typographic conventions with the same input syntax. The package +% includes automated processing of numbers and units, and the ability +% to control tabular alignment of numbers. +% +% A number of \LaTeX\ packages have been developed in the past for +% formatting units: \SIunits, \SIstyle, \unitsdef, \units, +% \pkg{fancyunits} and \pkg{fancynum}. Support for users of all of +% these packages is available as emulation modules in \currpkg. +% In addition, \currpkg can carry out many of the functions of the +% \pkg{dcolumn}, \pkg{rccol} and \numprint packages. +%\end{abstract} +% +%\begin{multicols}{2} +% \tableofcontents +%\end{multicols} +% +%\clearpage +%\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. +% +% \currpkg aims to provide a unified method for \LaTeX\ users to +% typeset units and values correctly and easily. The design +% philosophy of \currpkg is to follow the agreed rules by default, +% but to allow variation through option settings. In this way, +% users can use \currpkg to follow the requirements of publishers, +% co-authors, universities, \etc without needing to alter the input +% at all. +% +% \currpkg is intended as a complete replacement for \SIunits, +% \SIstyle, \unitsdef, \units, \pkg{fancyunits} and +% \pkg{fancynum}. As such, emulation modes are provided for all of +% these packages. 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. +% +%\clearpage +%\part{Using the \currpkg package} +% +%\section{For the impatient} +% \currpkg provides the user macros: +%\begin{itemize} +% \item \cs{SI}\oarg{options}\marg{value}\oarg{pre-unit}\marg{unit} +% \item \cs{si}\oarg{options}\marg{unit} +% \item \cs{num}\oarg{options}\marg{number} +% \item \cs{ang}\oarg{options}\marg{angle} +% \item \cs{sisetup}\marg{options} +%\end{itemize} +% plus the |S| and |S| column types for decimal alignments and units +% in tables. These macros are designed for typesetting units and +% values with control of appearance and with intelligent processing. +% +% By default, all text is typeset in the current upright, serif maths +% font. This can be changes by setting the appropriate package +% options: \opt{obeyall} will use the current font for typesetting. +% +% The package includes a ``unit processor'', which allows the use of +% named units or literal values. Named units are processed to +% correctly include powers. +%\begin{LaTeXexample} +% \SI{10}{\gram}\\ +% \SI{23.4}{g.cm^3}\\ +% \num{1e34}\\ +% \ang{1;2;3}\\ +% \emph{\SI{16,7}{\metre\per\second}}\\ +% \textbf{\SI{30e3}{\Hz}}\\ +% \SI{1.2 x 3.56 x 9.2}{\milli\metre}\\ +% \sisetup{obeyall} +% \textbf{\SI{-4.5}{\cm}}\\ +% \si{\joule\per\mole\per\kelvin}\\ +% \si[per=frac]{\joule\per\mole\per\kelvin}\\ +% \num[dp=4]{1.23456}\\ +% \num[dp=4]{9.8}\\ +% \begin{tabular}{S[tabformat=3.2]} +% \toprule +% {Heading}\\ +% \midrule +% 1.3 \\ +% 134.2 \\ +% 3.56 \\ +% 74,7 \\ +% \bottomrule +% \end{tabular} +%\end{LaTeXexample} +% +%\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 +% \si{\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 before \currpkg.\footnote{This document has been compiled +% in this way. You have to load \pkg{xfrac} first as otherwise very +% nasty things happen with \pkg{xkeyval}. MiK\TeX\ users should note +% that the packaged versions of \pkg{expl3}, \pkg{template} and +% \pkg{xparse} will not work with \pkg{xfrac}: download copies from +% \textsc{ctan}!} 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}[noexample] +% \usepackage[]{siunitx} +%\end{LaTeXexample} +% As is shown in the example, the package can be loaded with one or +% more options, using the key--value 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 key--value +% 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{1234} \num{12345}\\ +% \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, for example.} The \opt{seperr} causes +% this data to be given as a separate error value. If the number +% also contains an exponent, then brackets are re-added after the +% separation to ensure that meaning is not lost. +%\begin{LaTeXexample} +% $\num{1.234(5)} = \num[seperr]{1.234(5)}$\\ +% $\num{1.234(5)e6} = \num[seperr]{1.234(5)e6}$ +%\end{LaTeXexample} +% The same applies to the unit and value macro \cs{SI}, described +% later, for example the rest mass of an electron \cite{IUPAC}: +%\begin{LaTeXexample} +% $ m_{\mathrm{e}} +% = \SI{9.1093897(54)e-31}{\kg} $\\ +% $ m_{\mathrm{e}} +% = \SI[seperr]{9.1093897(54)e-31}{\kg} $ +%\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[expbase=5]{2e20}\\ +% \num{3e30} \num[expproduct=tighttimes]{3e30} +%\end{LaTeXexample} +% +% \currpkg can automatically add colour to negative numbers, which is +% often useful for highlighting purposes. This is turned on with the +% \opt{colourneg} option; the colour used is set by \opt{negcolour}. +% Both of these are available with the US spellings: \opt{colorneg} +% and \opt{negcolor}. +%\begin{LaTeXexample} +% \num{-1}\\ +% \sisetup{colourneg} \num{-2}\\ +% \num{3e-3}\\ +% \num[negcolour=blue]{-4} +%\end{LaTeXexample} +% +% \currpkg can automatically zero-fill and round to a fixed number of +% decimal places. This is controlled by two options \opt{fixdp} and +% \opt{dp}. The later is an integer which specifies how many places +% to fix to; setting this option automatically sets \opt{fixdp} to +% \opt{true}. The place-fixing system will only alter pure numbers: for +% example, any error component will result in the input being left +% unchanged. +%\begin{LaTeXexample} +% \num{1.23456}\\ +% \sisetup{dp=2} +% \num{1.23456}\\ +% \num{9.8}\\ +% \num{-10.432}\\ +% \num{44.3221(2)} +%\end{LaTeXexample} +% +%\section{Tabular material} +%\subsection{Aligning numbers} +% 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 number is placed at the +% centre of the column, which then resizes to accommodate the width +% of the contents (\ref{tab:default}). This behaviour is set by the +% \opt{tabnumalign=centredecimal} option. By setting the +% \opt{tabnumalign} option to \opt{centre}, the centre of the space +% reserved for the number is placed at the centre of the column. The +% space reserved is stored in \opt{tabformat}, which is of the form +% \texttt{\meta{before}\meta{dec}\meta{after}}, where \meta{before} +% is the number of characters before the decimal marker and +% \meta{after} is the number after. Thus in the example, +% \opt{tabformat=2.4} provides space for two digits before the +% decimal marker and four after. \opt{tabnumalign} can also be set +% to \opt{left} and \opt{right}, with the expected results. +%\begin{LaTeXexample}[float] +% \begin{table} +% \caption{Behaviour of \texttt{S} column type +% \label{tab:default}} +% \centering +% \begin{tabular}{% +% S% +% S[tabnumalign=centre,tabformat=2.4]% +% S[tabnumalign=right,tabformat=2.4]% +% S[tabnumalign=centre,tabformat=2.4,decimalsymbol=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} +% The \opt{tabformat} setting can also be used to reserve space for +% numbers containing exponents. This is given in the same format as +% above, but with a mantissa and exponent part (\ref{tab:exptab}). +% Notice that this is designed to expect that numbers will contain a +% mantissa. Exponents can either be aligned so that the ``$\times$'' +% symbols match up vertically, or the exponent part can be allowed to +% move across as needed. Space for signs is added by using any sign +% in the \opt{tabformat}, so for example \opt{tabformat=+2.2} and +% \opt{tabformat=-2.2} have exactly the same effect. Setting +% \opt{tabformat} will automatically switch from \opt{tabnumalign} +% from \opt{centredecimal} to \opt{centre}, if the former is +% currently set. In other cases, the current alignment option is +% retained. +%\begin{LaTeXexample}[float] +% \begin{table} +% \caption{Exponents in tables +% \label{tab:exptab}} +% \centering +% \begin{tabular}{% +% S[tabnumalign=right,tabformat=2.2e2]% +% S[tabnumalign=centre,tabformat=2.2e1.1]% +% S[tabnumalign=centre,tabformat=2.2e1.1,tabalignexp=false]% +% S[tabnumalign=centre,tabformat=+2.2]} +% \toprule +% {Longer values} +% & {Longer values} +% & {Longer values} +% & {Values} \\ +% \midrule +% 2.3e1 & 2.34e1 & 2.34e1 & +2.31 \\ +% 34.23e45 & 34.23e45 & 34.23e45 & 34.23 \\ +% 56.78 & 56.78 & 56.78 & -56.78 \\ +% 1.0e34 & 1.0e34 & 1.0e34 & +-1.0 \\ +% \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). By default, the contents of +% non-numeric cells are centred. This can be altered by setting +% \opt{tabtextalign}, which can be set to \opt{left}, \opt{right} or +% \opt{centre}. The use of digit separators in table columns is +% accounted for: extra space is reserved if digit separators will be +% added. +% +%\subsection{Columns of units} +% As a complement to the |S| column, \currpkg also provides a second +% column type, |s|. This is intended for producing columns of units. +% The letters chosen are intended to be similar to \cs{SI} and +% \cs{si}, respectively. The alignment of material in |s| columns +% is governed by the \opt{tabunitalign} option. +%\begin{LaTeXexample}[float] +% \begin{table} +% \centering +% \caption{Number and units in tables} +% \label{tab:num-unit} +% \begin{tabular}{% +% S[tabformat=1.2e-1,tabnumalign=centre]% +% s[tabunitalign=left]} +% \toprule +% {Value} & \multicolumn{1}{c}{Unit} \\ +% \midrule +% 2.16e-5 & \metre\squared\per\second \\ +% 2.83e-6 & \metre\squared\per\second \\ +% 7.39e3 & \pascal\cubic\metre\per\mole \\ +% 1.0e5 & \pascal \\ +% \bottomrule +% \end{tabular} +% \end{table} +%\end{LaTeXexample} +% +%\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[decimalsymbol=comma]{1.05}\\ +% \ang{3.67890} \ang[digitsep=comma]{3.67890}\\ +% \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. +%\begin{LaTeXexample} +% \ang{1.2} \ang[astroang]{1.2}\\ +% \ang{1;2.3;} \ang[astroang]{1;2.3;}\\ +% \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 macros with the same name in \SIstyle and \unitsdef +% packages. 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 (|$|);^^A$ +% \item ``|.|'' and ``|,|'': the full stop (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=medium]{100}{m.s^{-2}} +%\end{LaTeXexample} +% The literal unit system will correctly typeset input containing the +% symbols \si{\micro} (micro), \si{\degree} (degree) and +% \si{\angstrom} (ring-A).\footnote{Currently this works with \XeTeX\ +% and \pkg{inputenc} using the \texttt{latin1}, \texttt{latin5} and +% \texttt{latin9} encodings.} +% \begingroup\makeatletter\si@unt@nonlatin +%\begin{LaTeXexample} +% \SI{10}{µm}\\ +% \SI{20}{°C}\\ +% \SI{30}{Å} +%\end{LaTeXexample} +%\endgroup +% +%\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 prefix 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=thin]{100}{\metre\per\Square\second}\\ +% \SI[prefixsymbolic=false]{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{\ssquare} +%\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} which +% raise the unit to the appropriate power, while \cs{squared} or +% \cs{cubed} follow the unit they apply to. The \cs{Square} macro is +% capitalised to avoid a name clash with \pkg{pstricks}; the +% alternative \cs{ssquare} is also provided. +%\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}\\ +% \SI{60}{\per\metre\Square\candela} +%\end{LaTeXexample} +% +%\DescribeMacro{\tothe} +%\DescribeMacro{\raiseto} +% 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. \cs{raiseto} +% achieves the same, but is used \emph{before} a unit to add a power +% \emph{after}.\footnote{\cs{raiseto} acts in the same way as +% \cs{tothe} when used in a literal context: the power will be +% produced where the macro is, rather than moving after the next +% item.} +%\begin{LaTeXexample} +% \SI{16.86}{\metre\tothe{4}}\\ +% \SI{7.895}{\raiseto{-6}\newton}\\ +% \SI{1.34}{\per\kelvin\tothe{7}} +%\end{LaTeXexample} +% +%\subsection{Units with no values} +%\DescribeMacro{\si} +% For typesetting the symbol for a unit on its own, with the full +% font control and without extra spaces, the \cs{si} 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}\\ +% \si{kg.m/s^2}\\ +% \si[mode=text,unitsep=thin]{\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. When used in this way, the units \emph{do not} take an +% optional \pkg{keyval} argument. +%\begin{LaTeXexample} +% \sisetup{prespace,allowoptarg} +% 123\metre\\ +% \kelvin[123]\\ +% \sisetup{mode=text} \ampere[234]\\ +% 6\second +%\end{LaTeXexample} +% +%\subsection{Pre-defined units, prefixes and powers} +%\newcommand*{\csindex}[1]{^^A +% \cs{#1}^^A +% \expandafter\SpecialUsageIndex\csname#1\endcsname} +%\newcommand*{\unitinfo}[1]{^^A +% #1 & \csindex{#1} & +% \expandafter\si\expandafter{\csname#1\endcsname}} +%\begin{table} +% \caption{The seven base SI units} +% \label{tab:baseunits} +% \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} +%\end{table} +%\DescribeMacro{\metre} +%\DescribeMacro{\meter} +% The package always defines the seven base SI units, irrespective of +% any package options given (\ref{tab: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}. As metre is often +% spelled as ``meter'' in the US, the macro \cs{meter} is provided in +% addition to the \cs{metre} macro.\footnote{The official SI spelling +% for the unit is ``metre''.} +% +% 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 defines the standard prefixes for +% powers of ten (\ref{tab: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. +% The package also defines a number of derived SI units which have +% assigned names and symbols (\ref{tab: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.} +%\newcommand*{\prefixunitsym}[1]{\si[prefixsymbolic=false]{#1}} +%\newcommand*{\prefixinfo}[1]{^^A +% #1 & \csindex{#1} & +% \expandafter\prefixunitsym\expandafter{\csname#1\endcsname} & +% \expandafter\si\expandafter{\csname#1\endcsname}} +%\begin{table} +% \caption{The SI prefixes (\opt{load=prefix})} +% \label{tab:prefix} +% \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{deca} \\ +% \prefixinfo{zepto} & +% \prefixinfo{hecto} \\ +% \prefixinfo{atto} & +% \prefixinfo{kilo} \\ +% \prefixinfo{femto} & +% \prefixinfo{mega} \\ +% \prefixinfo{pico} & +% \prefixinfo{giga} \\ +% \prefixinfo{nano} & +% \prefixinfo{tera} \\ +% \prefixinfo{micro} & +% \prefixinfo{peta} \\ +% \prefixinfo{milli} & +% \prefixinfo{exa} \\ +% \prefixinfo{centi} & +% \prefixinfo{zetta} \\ +% \prefixinfo{deci} & +% \prefixinfo{yotta} \\ +% \bottomrule +% \end{tabular} +%\end{table} +%\begin{table} +% \caption{The derived SI units with defined names +% (\opt{load=derived})} +% \label{tab:derived} +% \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{newton} \\ +% \unitinfo{celsius} & +% \unitinfo{ohm} \\ +% \unitinfo{coulomb} & +% \unitinfo{pascal} \\ +% \unitinfo{farad} & +% \unitinfo{radian} \\ +% \unitinfo{Gray} & +% \unitinfo{siemens} \\ +% & \csindex{ggray} & \ggray & +% \unitinfo{sievert} \\ +% \unitinfo{hertz} & +% \unitinfo{steradian} \\ +% \unitinfo{henry} & +% \unitinfo{tesla} \\ +% \unitinfo{joule} & +% \unitinfo{volt} \\ +% \unitinfo{katal} & +% \unitinfo{watt} \\ +% \unitinfo{lumen} & +% \unitinfo{weber} \\ +% \unitinfo{lux} \\ +% \bottomrule +% \end{tabular} +%\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 +% (\ref{tab:experimental}), those considered ``accepted'' +% (\ref{tab:accepted}), and those accepted temporarily +% (\ref{tab:addn}).\footnote{These are supposed to be replaced over +% time by SI units.} +%\DescribeMacro{\litre} +%\DescribeMacro{\liter} +% The unit ``litre'' is often spelled ``liter'' in the US; both +% spellings are provided by \currpkg, with \cs{liter} giving +% \si{\liter} and \cs{litre} producing \si{\litre}. +%\begin{table} +% \caption{Units derived from experiments +% (\opt{load=physical})} +% \label{tab:experimental} +% \centering +% \begin{tabular}{lll} +% \toprule +% \multicolumn{1}{c}{Unit} & +% \multicolumn{1}{c}{Macro} & +% \multicolumn{1}{c}{Symbol} \\ +% \midrule +% electron volt & \csindex{electronvolt} & \electronvolt \\ +% unified atomic mass unit +% & \csindex{atomicmassunit} & \atomicmassunit \\ +% & \csindex{atomicmass} & \atomicmass \\ +% \bottomrule +% \end{tabular} +%\end{table} +%\begin{table} +% \caption{Units accepted for use with SI +% (\opt{load=accepted})} +% \label{tab:accepted} +% \centering +% \begin{tabular}{lll} +% \toprule +% \multicolumn{1}{c}{Unit} & +% \multicolumn{1}{c}{Macro} & +% \multicolumn{1}{c}{Symbol} \\ +% \midrule +% \unitinfo{bel} \\ +% day & \csindex{Day} & \Day \\ +% & \csindex{dday} & \dday \\ +% \unitinfo{degree} \\ +% \unitinfo{hour} \\ +% \unitinfo{litre} \\ +% & \csindex{liter} & \liter \\ +% \unitinfo{minute} \\ +% minute (arc) & \csindex{arcmin} & \arcmin \\ +% \unitinfo{neper} \\ +% \unitinfo{percent} \\ +% second (arc) & \csindex{arcsec} & \arcsec \\ +% \unitinfo{tonne} \\ +% \bottomrule +% \end{tabular} +%\end{table} +%\begin{table} +% \centering +% \caption{Additional (temporary) SI units +% (\opt{load=addn})} +% \label{tab:addn} +% \begin{tabular}{lll} +% \toprule +% \multicolumn{1}{c}{Unit} & +% \multicolumn{1}{c}{Macro} & +% \multicolumn{1}{c}{Symbol} \\ +% \midrule +% {\aa}ngstr{\"o}m & \csindex{angstrom} & \angstrom \\ +% \unitinfo{are} \\ +% \unitinfo{curie} \\ +% bar & \csindex{BAR} & \BAR \\ +% & \csindex{bbar} & \bbar \\ +% \unitinfo{barn} \\ +% \unitinfo{gal} \\ +% \unitinfo{hectare} \\ +% \unitinfo{millibar} \\ +% \unitinfo{rad} \\ +% \unitinfo{rem} \\ +% \unitinfo{roentgen} \\ +% \bottomrule +% \end{tabular} +%\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}), which are made available by \opt{load=abbr}. +% In common with the units discussed above, the prefixed and +% abbreviated unit definitions are loaded by default. +%\newcommand*{\tablesubhead}[1]{^^A +% \addlinespace \emph{#1} \\*} +%\begin{longtable}{llll} +% \caption{Prefixed (\opt{load=prefixed}) and abbreviated +% (\opt{load=abbr}) units\label{tab: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 +% +% \tablesubhead{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} \\ +% +% \tablesubhead{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} \\ +% +% \tablesubhead{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} \\ +% +% \tablesubhead{Moles} +% \unitinfo{femtomole} & \csindex{fmol} \\ +% \unitinfo{picomole} & \csindex{pmol} \\ +% \unitinfo{nanomole} & \csindex{nmol} \\ +% \unitinfo{micromole} & \csindex{micmol} \\ +% \unitinfo{millimole} & \csindex{mmol} \\ +% +% \tablesubhead{Currents} +% \unitinfo{picoampere} & \csindex{pA} \\ +% \unitinfo{nanoampere} & \csindex{nA} \\ +% \unitinfo{microampere} & \csindex{micA} \\ +% \unitinfo{milliampere} & \csindex{mA} \\ +% \unitinfo{kiloampere} & \csindex{kA} \\ +% +% \tablesubhead{Areas} +% square centimetre & \csindex{squarecentimetre} & +% \squarecentimetre & \csindex{cms} \\* +% & \csindex{centimetresquared} & \centimetresquared \\ +% square metre & \csindex{squaremetre} & \squaremetre \\ +% square kilometre & \csindex{squarekilometre} & \squarekilometre \\ +% +% \tablesubhead{Volumes} +% \unitinfo{microlitre} & \csindex{micl} \\ +% \unitinfo{millilitre} & \csindex{ml} \\ +% cubic centimetre & \csindex{cubiccentimetre} & +% \cubiccentimetre & \csindex{cmc} \\* +% & \csindex{centimetrecubed} & \centimetrecubed \\ +% cubic decimetre & \csindex{cubicdecimetre} & +% \cubicdecimetre & \csindex{dmc} \\ +% +% \tablesubhead{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} \\ +% +% \tablesubhead{Potentials} +% \unitinfo{millivolt} & \csindex{mV} \\ +% \unitinfo{kilovolt} & \csindex{kV} \\ +% +% \tablesubhead{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} \\ +% \unitinfo{kilowatthour} & \cs{kWh} \\ +% +% \tablesubhead{Powers} +% \unitinfo{milliwatt} \\ +% \unitinfo{kilowatt} \\ +% \unitinfo{megawatt} \\ +% +% \tablesubhead{Capacitances} +% \unitinfo{femtofarad} \\ +% \unitinfo{picofarad} \\ +% \unitinfo{nanofarad} \\ +% \unitinfo{microfarad} \\ +% \unitinfo{millifarad} \\ +% +% \tablesubhead{Resistances} +% \unitinfo{kiloohm} \\ +% \unitinfo{megaohm} \\ +% \unitinfo{gigaohm} \\ +% \unitinfo{millisiemens} \\ +% +% \tablesubhead{Forces} +% \unitinfo{millinewton} \\ +% \unitinfo{kilonewton} \\ +% +% \tablesubhead{Other units} +% \unitinfo{hectopascal} \\ +% \unitinfo{megabecquerel} \\ +% \unitinfo{millisievert} \\ +%\end{longtable} +% +%\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 the specific unit macro 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{si} can be +% used to override the settings for the unit. The \cs{renewunit} and +% \cs{provideunit} macros take the same arguments. +%\begin{LaTeXexample} +% \SI{3.1415}{\degree}\\ +% \newunit[valuesep=none]{\oddunit}{XXX} +% \SI{12345}{\oddunit} +% \SI[valuesep=thick]{67890}{\oddunit} +%\end{LaTeXexample} +% +% As with the \LaTeX\ commands \cs{newcommand}, \etc, the choice of +% \cs{newunit}, \cs{renewunit} or \cs{provideunit} depends on the +% presence of an existing definition. While \cs{newunit} should be +% used when a unit has not been previously defined, \cs{renewunit} +% will issue a warning if the named unit does not already exist. +% \cs{provideunit} defines the unit if it does not exist, and +% otherwise does nothing at all. The same behaviour is seen with +% \cs{providepower} and \cs{provideprefix} (\latin{vide infra}). +% +% Output that is only valid in maths mode requires \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}\ofixarg{post}\marg{power}\marg{num}. Here, +% \meta{power} is the name of the power macro and \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}\\ +% \si{\kilogram\totheforth}\\ +% \si{\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}\ofixarg{binary}\marg{prefix}\marg{symbol}\marg{powers-ten}, +% where \meta{powers-ten} is the number of powers of ten the prefix +% represents. When the \opt{binary} option is given, the prefix is a +% power of two. For example, \cs{kilo} and \cs{kibi} are defined: +%\begin{LaTeXexample}[noexample] +% \newprefix{\kilo}{k}{3} +% \newprefix[binary]{\kibi}{Ki}{10} +%\end{LaTeXexample} +% +%\section{Specialist units} +% 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. In each case, they should be requested with the option +% \opt{alsoload=\meta{name}}. +% +%\subsection{Binary units (\opt{binary})\label{sec:binary}} +%\DescribeMacro{\bit} +%\DescribeMacro{\byte} +% The binary prefixes, \cs{bit}, \cs{byte} (\ref{tab:binary}) are not +% formally part of the SI system. They are available by giving the +% \opt{alsoload=binary} option. +%\begin{LaTeXexample} +% \SI{100}{\mebi\byte} +%\end{LaTeXexample} +%\begin{table} +% \caption{Binary prefixes +% (\opt{alsoload=binary})} +% \label{tab:binary} +% \centering +% \begin{tabular}{lllc} +% \toprule +% \multicolumn{1}{c}{Prefix} & +% \multicolumn{1}{c}{Macro} & +% \multicolumn{1}{c}{Power} & +% Symbol \\ +% \midrule +% \prefixinfo{kibi} \\ +% \prefixinfo{mebi} \\ +% \prefixinfo{gibi} \\ +% \prefixinfo{tebi} \\ +% \prefixinfo{pebi} \\ +% \prefixinfo{exbi} \\ +% \bottomrule +% \end{tabular} +%\end{table} +% +%\subsection{Synthetic chemistry (\opt{synchem})} +%\DescribeMacro{\mmHg} +%\DescribeMacro{\molar} +%\DescribeMacro{\Molar} +%\DescribeMacro{\torr} +%\DescribeMacro{\dalton} +% The \opt{synchem} file adds the common chemistry units \cs{mmHg}, +% \cs{molar}, \cs{Molar}, \cs{torr} and \cs{dalton} to \currpkg. 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. By default, \currpkg uses the +% UK default of a small-caps symbol. The \cs{dalton} unit is defined +% here as this name is not recognised by the various international +% bodies: the symbol \si{\amu} is preferred. +%\begin{LaTeXexample} +% \SI{1}{\Molar} HCl\\ +% \SI{760}{\torr}\\ +% \SI{0.01}{\mmHg}\\ +% \SI{3.0}{\molar}\\ +% \SI{106.42}{\dalton} +%\end{LaTeXexample} +% +%\subsection{High-energy physics (\opt{hep})} +% In contrast to \pkg{hepunits}, \currpkg does not define a long list +% of compound units for high-energy physics.\footnote{Using the +% \opt{emulate=hepunits} option will load a file defining those.} +% Instead, a small selection of new units are defined +% (\ref{tab:hep}). The mechanisms provided by \currpkg should avoid +% the need for large numbers of abbreviations. For example, the +% \pkg{hepunits} \cs{MinveV} can be given as |\per\MeV| in \currpkg, +% which requires only one more character. +%\begin{table} +% \caption{High-energy physics units (\opt{alsoload=hep})} +% \label{tab:hep} +% \centering +% \begin{tabular}{lllc} +% \toprule +% Unit & Macro & Symbol & Abbreviation \\ +% \midrule +% \addlinespace \emph{Areas} \\ +% \unitinfo{yoctobarn} & \csindex{yb} \\ +% \unitinfo{zeptobarn} & \csindex{zb} \\ +% \unitinfo{attobarn} & \csindex{ab} \\ +% \unitinfo{femtobarn} & \csindex{fb} \\ +% \unitinfo{picobarn} & \csindex{pb} \\ +% \unitinfo{nanobarn} & \csindex{nb} \\ +% \addlinespace \emph{Other units} \\ +% \unitinfo{micron} \\ +% millirad & \csindex{mrad} & \mrad \\ +% \unitinfo{gauss} \\ +% \bottomrule +% \end{tabular} +%\end{table} +% +%\DescribeMacro{\clight} +%\DescribeMacro{\eVperc} +% The \opt{hep} option defines two units which are slightly unusual. +% \cs{clight} gives \clight, which is recognised as a unit when used +% in the appropriate circumstances. The second unit provided is +% \cs{eVperc}, which is commonly-used and clear enough for a compound +% definition. Notice that the value of \opt{eVcorrb} will need to be +% adjusted when using this unit. +%\begin{LaTeXexample} +% \SI[per=slash,eVcorrb=0.4ex]{4.657}{\mega\eVperc\squared} +%\end{LaTeXexample} +% +%\subsection{Astronomy (\opt{astro})} +%\DescribeMacro{\parsec} +%\DescribeMacro{\lightyear} +% For astronomers, the \cs{parsec} and \cs{lightyear} units are +% available, and give the obvious results. +%\begin{LaTeXexample} +% \SI{12}{\parsec}\\ +% \SI{1}{\lightyear} +%\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{40}{\kilo\gram}$ +% \[ \num{50} \] +%\end{LaTeXexample} +% +% In contrast, by setting \opt{obeyall}, the current font is used: +% this may be maths or text, depending on the context. +%\begin{LaTeXexample} +% \sisetup{obeyall}\\ +% \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}$\\ +% \emph{\ang{4;4;4}} \emph{$\ang{4;4;4}$} +% \[ \ang{5;5;5} \] +%\end{LaTeXexample} +% +% Fine control of which elements of the local font are used is +% available with the \opt{obeyfamily}, \opt{obeybold}, +% \opt{obeyitalic} and \opt{obeymode} options. +%\begin{LaTeXexample} +% \sisetup{obeyfamily}\\ +% \ang{1;1;1} $\ang{1;1;1}$\\ +% \sffamily \ang{2;2;2} $\ang{2;2;2}$\\ +% \sisetup{obeybold} +% \textbf{\ang{3;3;3}} \boldmath $\ang{3;3;3}$\\ +% \emph{\ang{4;4;4}} \emph{$\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 +% key--value method. 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. +% +% The package options take a number of different forms. +%\begin{itemize} +% \item \opt{option=\meta{bool}} Simple true/false values. These +% macros all default to \opt{option=true}, meaning that giving the +% option name along will set the appropriate flag. +% \item \opt{option=\meta{choice}} 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 (with a warning). +% \item \opt{option=\meta{choice,literal}} If the given value is a +% \meta{choice}, then the internal settings for that choice are +% used. Any other value is used directly. +% \item \opt{option=\meta{literal}} The given value is used as a +% literal by the package. +% \item \opt{option=\meta{csname}} These options expect a command +% sequence as a value. +% \item \opt{option=\meta{length}} Requires a \TeX\ length, for +% example \opt{0.5ex}. +% \item \opt{option=\meta{list}} Takes a list of one or more items, +% which are not determined in advance. +% \item \opt{option=\meta{number}} Takes a number (possibly +% including an exponent part). +%\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. Where the key has a default value, it is given in bold. +% +%\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. +% The default is to use the current upright maths serif font with no +% variation. +% +%\DescribeOption{mode} +%\DescribeOption{textmode} +%\DescribeOption{valuemode} +%\DescribeOption{unitmode} +%\DescribeOption{obeymode} +% The output of \currpkg can occur using either text or maths mode. +% The package option \opt{mode} determines which is used: valid +% options are \defaultopt{maths} and \opt{text}.\footnote{Here and in +% all other cases, either UK or US spelling may be used. Thus +% \opt{mode=maths} or \opt{mode=math} have exactly the same effect.} +% The shortcut \opt{textmode} is provided for setting \opt{mode=text} +% quickly. Further refinement is possible using the \opt{valuemode} +% and \opt{unitmode} options. These apply to numbers (the output of +% \cs{num} and the first mandatory argument of \cs{SI}) and units +% (all other output), respectively. By setting the \opt{obeymode} +% flag, the package will use the local typesetting mode (maths or +% text). +% +%\DescribeOption{obeyall} +%\DescribeOption{obeyfamily} +%\DescribeOption{obeybold} +%\DescribeOption{obeyitalic} +% The detection and matching of surrounding text can be controlled +% using a number of Boolean package options. \opt{obeyall} turns on +% all of the detection. Thus output with \opt{obeyall} in force will +% always match the local text appearance. \opt{obeyfamily} instructs +% the package on detecting the surrounding font family (Roman, sans +% serif, fixed width), but does not detect bold or italic. +% \opt{obeybold} detects the local bold setting, whilst +% \opt{obeyitalic} picks up italic fonts. +% +% Bold detection is influenced by the value of \opt{inlinebold}, +% which takes values \defaultopt{text} and \opt{maths}. The package +% can detect the local value of bold for either the surrounding text, +% or the surrounding inline (|$|\ldots|$|) maths. The +% \opt{obeyitalic} option does \emph{not} have the same facility +% (maths is italic anyway). +% +%\DescribeOption{mathsrm} +%\DescribeOption{mathssf} +%\DescribeOption{mathstt} +%\SpecialOptionIndex{mathrm} +%\SpecialOptionIndex{mathsf} +%\SpecialOptionIndex{mathtt} +%\DescribeOption{textrm} +%\DescribeOption{textsf} +%\DescribeOption{texttt} +% The font commands used by the package to achieve the above are all +% available for user modification. The options \opt{mathsrm}, +% \opt{mathssf} and \opt{mathstt} hold the command sequences used in +% maths mode,\footnote{These can also be set using \opt{mathrm}, +% \opt{mathsf} and \opt{mathtt}} while \opt{textrm}, \opt{textsf} and +% \opt{texttt} do the same for text mode. By default, these contain +% the obvious command names, for example \opt{mathsrm=mathrm} and +% \opt{texttt=ttfamily}. However, they can be set at will: the macro +% names indicate the nature of the surrounding text detected. For +% example, the value of \opt{mathssf} is used in maths mode when the +% surrounding text is sans serif. +% +%\SpecialOptionIndex{valuemathsrm} +%\SpecialOptionIndex{valuemathssf} +%\SpecialOptionIndex{valuemathstt} +%\SpecialOptionIndex{valuemathrm} +%\SpecialOptionIndex{valuemathsf} +%\SpecialOptionIndex{valuemathtt} +%\SpecialOptionIndex{unitmathsrm} +%\SpecialOptionIndex{unitmathssf} +%\SpecialOptionIndex{unitmathstt} +%\SpecialOptionIndex{valuetextrm} +%\SpecialOptionIndex{valuetextsf} +%\SpecialOptionIndex{valuetexttt} +%\SpecialOptionIndex{valuetextrm} +%\SpecialOptionIndex{valuetextsf} +%\SpecialOptionIndex{valuetexttt} +%\SpecialOptionIndex{unittextrm} +%\SpecialOptionIndex{unittextsf} +%\SpecialOptionIndex{unittexttt} +% Each of the font options can be given separately for the contents +% of numbers and units. The option names include \opt{value} or +% \opt{unit} before the mode name. For example, the \opt{mathsrm} +% option may be split into \opt{valuemathsrm} and \opt{unitmathsrm}. +% +%\DescribeOption{detectdisplay} +% The font detection system can treat displayed mathematical content +% in two ways. This is controlled by the \opt{detectdisplay} option. +% When set to \defaultopt{true}, display mathematics is treated +% independently from the body of the document. Thus the local +% \emph{maths} font is checked for matching. In contrast, when set +% to \opt{false}, display material is treated with the current +% running text font. +%\begin{LaTeXexample} +% \sffamily +% Some text +% \sisetup{obeyall} +% \[ x = \SI{1.2e3}{\kg\kelvin\candela} \] +% More text +% \sisetup{detectdisplay=false} +% \[ y = \SI{3}{\metre\second\mole} \] +%\end{LaTeXexample} +% +%\subsection{Spacing and separators} +%\DescribeOption{unitsep} +%\DescribeOption{valuesep} +%\DescribeOption{digitsep} +%\DescribeOption{anglesep} +% The separators between items can all be set using options taking a +% list of pre-defined items or a literal value. The ``\opt{sep}'' +% options (\opt{unitsep}, \opt{valuesep}, \opt{digitsep} and +% \opt{anglesep}) all recognise \opt{thin}, \opt{medium}, \opt{med}, +% \opt{thick}, \opt{space}, \opt{cdot}, \opt{times}, \opt{tightcdot}, +% \opt{tighttimes}, \opt{fullstop}, \opt{stop}, \opt{period} and +% \opt{none}. The named spaces are the normal maths separations, +% with \opt{space} representing a full (non-breakable text) space, +% and with the obvious meanings for \opt{cdot} and \opt{times}. The +% \opt{tight} variants reduce the spacing available. Three possible +% values are provided for ``|.|'', and \opt{none} yields no space at +% all. In all cases, other values are treated literally and are +% typeset in maths mode. The default value is \defaultopt{thin} for +% all separations except \opt{anglesep}, which is set to +% \defaultopt{none}. +% +%\DescribeOption{unitspace} +%\DescribeOption{errspace} +% The \opt{unitspace} and \opt{errspace} options again take a list +% or literal value, but only the ``real'' spaces \opt{thin}, +% \opt{medium}, \opt{med}, \opt{thick}, \opt{space} and \opt{none} +% are recognised in the list. The \opt{unitspace} option controls the +% output generated by an explicit space (|~|) inside a unit macro, +% while \opt{errspace} is used to separate a bracketed error from the +% main number. +% +%\subsection{Number formatting} +%\DescribeOption{numdigits} +%\DescribeOption{numdecimal} +%\DescribeOption{numexp} +%\DescribeOption{numsign} +%\DescribeOption{numaddn} +%\DescribeOption{numgobble} +% There are two groups of options for formatting numbers. The first +% group all begin with ``\opt{num}'', and take literal values used by +% the package to parse numbers. \opt{numdigits} contains the valid +% number symbols (\defaultopt{0123456789}), with \opt{numdecimal} +% containing the decimal markers (\defaultopt{.,}). As in the +% \numprint package, \opt{numexp} (the list of exponent markers) +% recognises \defaultopt{deDE} as valid by default. \opt{numsign} +% contains the sign markers for numbers +% (\defaultopt{+-\cs{pm}\cs{mp}}). \opt{numaddn} and +% \opt{numgobble} both control which other characters do not give an +% error when present in a number. \opt{numaddn} contains valid +% characters which should be included in the final output ``as is'', +% whereas \opt{numgobble} lists the characters that are completely +% ignored. In all cases, the content of the options is a simple +% string, for example \opt{numdigits=1234567890}. +% +%\DescribeOption{decimalsymbol} +%\DescribeOption{digitsep} +%\DescribeOption{sepfour} +% The second group of number options control the output of numbers +% after parsing. The symbol used by \currpkg as a decimal marker is +% set by the \opt{decimalsymbol} option, which can take a list of +% choices or a literal. The valid choices here are +% \defaultopt{fullstop}, \opt{comma}, \opt{cdot} and +% \opt{tightcdot}.\footnote{\opt{fullstop} also has aliases +% \opt{stop} and \opt{period}.} Notice that this does not have to +% agree with the input marker. The other separator for numerical +% output is the division of digits into groups of three. The result +% is dependant on two options. The previously-described +% \opt{digitsep} option controls the spacing added between groups of +% three numbers. For numbers consisting of exactly four digits, the +% \opt{sepfour} Boolean option controls whether separation occurs in +% these cases. The default is \defaultopt{false}. +%\begin{LaTeXexample} +% \num{1234}\\ +% \num[sepfour]{1234} +%\end{LaTeXexample} +% +%\DescribeOption{seperr} +%\DescribeOption{numopenerr} +%\DescribeOption{numcloseerr} +% For numbers given with an error [\eg \num{1.23(4)}], the package +% can separate out the error part, to give for example +% \num[seperr]{1.23(4)}. This behaviour is activated by the +% \opt{seperr} option, and requires that \opt{numopenerr} and +% \opt{numcloseerr} contain the left- and right-hand delimiters for +% the error [defaults \opt{numopenerr=(} and \opt{numcloseerr=)}]. +%\begin{LaTeXexample} +% \sisetup{seperr}\\ +% \num{1.234(5)}\\ +% \num{1.234(5)e6} +%\end{LaTeXexample} +%\DescribeOption{trapambigerr} +%\DescribeOption{openerr} +%\DescribeOption{closeerr} +%\DescribeOption{tightpm} +% If the number has an exponent, or if units are not repeated, then +% the result can be considered ambiguous. By default, the package +% adds the markers stored in \opt{openerr} and \opt{closeerr} to +% remove the ambiguity; the options have the same default values as +% the input error markers. Detection of a potentially-ambiguous +% error is controlled by the \opt{trapambigerr} option, although for +% numbers with units the \opt{repeatunits} option is also important. +% The spacing around the $\pm$ sign is normally set by \TeX. However, +% using the \opt{tightpm} option will cause this to be reduced to a +% minimum. +%\begin{LaTeXexample} +% \sisetup{seperr}\\ +% \num[trapambigerr=false]{1.234(5)e6}\\ +% \SI{1.234(5)}{\metre}\\ +% \sisetup{repeatunits=false} +% \SI{1.234(5)}{\metre}\\ +% \SI[trapambigerr=false]{1.234(5)}{\metre}\\ +% \num[tightpm]{1.234(5)} +%\end{LaTeXexample} +% +%\DescribeOption{numprod} +%\DescribeOption{repeatunits} +% The number processor can recognise products in the numerical input; +% the symbols used for products are stored in \opt{numprod}, with the +% default value of ``\opt{x}''. By default, the \cs{SI} macro will +% repeat the units for a number given in this way. This behaviour is +% altered by the \opt{repeatunits} option, which takes the values +% \defaultopt{true}, \opt{false} and \opt{power}. The later applies +% only when providing multiplied numbers with units, and converts the +% unit to the appropriate power rather than repeating the +% units.\footnote{This is a very simply option: do not expect it to +% work with anything except areas and volumes.} Notice that when +% applied to errors, \opt{repeatunits} takes priority over +% \opt{trapambigerr}. +%\begin{LaTeXexample} +% \num{1 x 2 x 3}\\ +% \SI{4 x 5 x 6}{\metre}\\ +% \sisetup{repeatunits=false} +% \SI{1.2 x 3.4 x 5.6}{\milli\metre\cubed}\\ +% \SI[seperr]{1.234(5)}{\metre}\\ +% \SI[seperr, +% trapambigerr=false] +% {9.1093897(54)e-31}{\kilo\gram}\\ +% \SI[seperr,repeatunits, +% trapambigerr=false] +% {9.1093897(54)e-31}{\kilo\gram}\\ +% \SI[repeatunits=power]{1 x 2 x 3}{\metre} +%\end{LaTeXexample} +% +%\DescribeOption{expproduct} +%\DescribeOption{expbase} +%\DescribeOption{allowzeroexp} +% The formatting of exponents is controlled by \opt{expproduct} and +% \opt{expbase}. \opt{expproduct} sets the symbol used to indicate a +% product for exponents (\eg the $\times$ in \num{2e2}), while the +% value of \opt{expbase} sets the power used (the \num{10} in the +% example). Both options accept a very short list of options: +% \defaultopt{times}, \opt{tighttimes}, \opt{cdot} and +% \opt{tightcdot} for the product, and \defaultopt{ten} and \opt{two} +% for the power.\footnote{The \opt{tighttimes} and \opt{tightcdot} +% options give the rather questionable results: +% \num[expproduct=tighttimes]{1e2} and +% \num[expproduct=tightcdot]{1e2}, as opposed to \num{1e2} and +% \num[expproduct=cdot]{1e2}.} Other choices are used literally. Also +% relevant to exponent processing is the \opt{allowzeroexp} option. +% By default, the package will suppress a zero exponent, but setting +% the flag will allow the output of \num[allowzeroexp]{e0}. +% +%\DescribeOption{addsign} +%\DescribeOption{sign} +%\DescribeOption{retainplus} +% Additions to the input can take the form of implicit signs and +% padded zeros. The \opt{addsign} option takes a list of potential +% sites to add a sign: \defaultopt{none}, \opt{mantissa}, +% \opt{exponent} and \opt{both}.\footnote{Aliases are provided: +% \opt{mant} = \opt{mantissa}, \opt{exp} = \opt{exponent}, \opt{all} +% = \opt{true} = \opt{both}, \opt{false} = \opt{none}.} If no sign +% is given in the input, the setting here determines if one is added. +% The sign to add is stored in \opt{sign}, which takes the list of +% choices \defaultopt{plus}, \opt{minus}, \opt{pm} and \opt{mp}, or +% uses the input literally (in maths mode). For positive numbers, +% the \opt{retainplus} option causes a $+$ sign explicitly in the +% input to be retained. By default, the package will remove such +% signs. +% +%\DescribeOption{padnumber} +% The \opt{padnumber} option controls the addition of zeros to the +% input, to ``pad'' the result. The option takes a list of choices: +% \defaultopt{leading}, \opt{trailing}, \opt{both} and +% \opt{none}.\footnote{Aliases: \opt{all} = \opt{true} = \opt{both}, +% \opt{false} = \opt{none}.} No additional precision is added by +% this option; integer input will not add a decimal point. +%\begin{LaTeXexample} +% \num[padnumber=leading]{.1}\\ +% \num[padnumber=leading]{2.}\\ +% \num[padnumber=trailing]{3.}\\ +% \num[padnumber=both]{4.}\\ +% \num[padnumber=both]{.5}\\ +% \num[padnumber=both]{6}\\ +% \num[padnumber=none]{7.}\\ +% \num[padnumber=none]{.8} +%\end{LaTeXexample} +% +%\DescribeOption{fixdp} +%\DescribeOption{dp} +% In contrast to the \opt{padnumber} option, the package can alter +% the precision of the input number if the \opt{fixdp} option is set. +% The will fix the decimal places of the output to the number stored +% in the \opt{dp} option. The later should be a positive integer. +%\begin{LaTeXexample} +% \sisetup{fixdp,dp=3} +% \num{1}\\ +% \num{53.9}\\ +% \num{4.56783}\\ +% \num{-1.2942}\\ +% \num{-1.2949}\\ +% \num{9.9999} +%\end{LaTeXexample} +% +%\subsection{Angle formatting} +%\DescribeOption{padangle} +%\DescribeOption{strictarc} +% The angle formatter uses \cs{num} to format numbers: any options +% for numbers are therefore applicable here. The \opt{padangle} +% option takes choices \defaultopt{small}, \opt{large}, \opt{all} and +% \opt{none}, and controls how angles are padded when given in +% degrees, minutes and seconds.\footnote{Aliases: \opt{all} = +% \opt{true} = \opt{both}, \opt{false} = \opt{none}.} When giving +% angles as arcs (in degrees, minutes and seconds), the package can +% detect if the correct number of semi-colons have been given. This +% is controlled by the \opt{strictarc} option, which is a Boolean +% switch with a \defaultopt{true} default. With \opt{strictarc} set +% to \opt{false}, an incomplete arc is interpreted as degrees and +% minute, while an over-complete one will drop excess input. +%\begin{LaTeXexample} +% \ang[padangle=none]{1;;}\\ +% \ang[padangle=large]{2;;}\\ +% \ang[padangle=small]{3;;}\\ +% \ang[padangle=both]{;4;}\\ +% \ang[padangle=none]{;5;5}\\ +% \ang[strictarc=false]{1;2}\\ +% \ang[strictarc=false]{1;2;3;4;} +%\end{LaTeXexample} +% +%\DescribeOption{angformat} +% The angle formatting system can convert between decimal angles and +% those given as degrees, minutes and seconds. This is controlled by +% the \opt{angformat} option, which takes choices +% \defaultopt{unchanged}, \opt{decimal} and +% \opt{arc}.\footnote{Aliases: \opt{decimal} = \opt{dec}, \opt{arc} = +% \opt{dms}, \opt{unchanged} = \opt{none}.} When set to +% \opt{unchanged}, nothing is done to the input. The conversion is +% based on \TeX\ dimensions, and is therefore limited in accuracy. +% For this reason, the output is automatically rounded: output as a +% decimal angle is limited to three places, and that as an arc is +% given to a single decimal place for the seconds component. +%\begin{LaTeXexample} +% $\ang{1;2;3} = \ang[angformat=dec]{1;2;3}$\\ +% $\ang{4.56} = \ang[angformat=arc]{4.56}$ +%\end{LaTeXexample} +% +%\DescribeOption{astroang} +% For astronomers, the \opt{astroang} option is provided. This +% moves the degrees, minutes or seconds symbol (as appropriate) +% over the decimal marker rather than after the number. +%\begin{LaTeXexample} +% \ang{1;2;3.4}\\ +% \ang[astroang]{5;6;7.8} +%\end{LaTeXexample} +% +%\subsection{Tabular material} +%\DescribeOption{tabnumalign} +% Material typeset in |S| columns is processed internally by the +% \cs{num} macro. Thus, as with angles, the number options also +% apply here. The positioning of tabular material is controlled by +% the two options \opt{tabnumalign} and \opt{tabformat}. +% \opt{tabnumalign} takes values \defaultopt{centredecimal}, +% \opt{centre}, \opt{left} and \opt{right}.\footnote{Aliases +% \opt{centerdecimal} = \opt{centredecimal}; \opt{center} = +% \opt{centre}.} When using \opt{centredecimal}, the package places +% the decimal marker of the mantissa at the centre of the column, +% which then grows to accommodate the widest number given. For equal +% numbers of digits before and after the decimal sign, this is the +% easiest option. The other choices use a fixed-width box to store +% the number; the box is then aligned with the edges of the column. +% +%\DescribeOption{tabformat} +% The \opt{tabformat} option sets the amount of space reserved by +% \currpkg for the alignment box when not using the +% \opt{centredecimal} setting of \opt{tabnumalign}. The numerical +% parts of \opt{tabformat} are interpreted as +% \texttt{\meta{pre}\meta{dec}\meta{post}}; \meta{pre} and +% \meta{post} are the number of digits before and after the decimal +% sign, respectively. Both signs and exponents can be included in +% \opt{tabformat}, resulting in appropriate space being reserved. The +% entire \opt{tabformat} input is processed using the \cs{num} macro +% internally. Thus the decimal and exponent signs used in +% \opt{tabformat} are checked against \opt{numdecimal} and +% \opt{numexp}, respectively. +% +%\DescribeOption{tabalignexp} +% When \opt{tabformat} contains exponents, two possibilities are +% available for alignment. The first method is to place the exponent +% parts so that the ``$\times 10$'' parts form a column, with +% whitespace after shorter mantissa components. In the second +% method, no additional space is added after the mantissa, and the +% exponents do no line up (\ref{tab:alignexp}). This is controlled +% by the \opt{tabexpalign} option, which can be set to +% \defaultopt{true} or \opt{false}. +%\begin{LaTeXexample}[float] +% \begin{table} +% \centering +% \caption{The \opt{tabalignexp} option} +% \label{tab:alignexp} +% \sisetup{tabformat=1.3e2,tabnumalign=centre} +% \begin{tabular}{SS[tabalignexp=false]} +% \toprule +% {Header} & {Header} \\ +% \midrule +% 1.2e3 & 1.2e3 \\ +% 1.234e56 & 1.234e56 \\ +% \bottomrule +% \end{tabular} +% \end{table} +%\end{LaTeXexample} +% +%\DescribeOption{tabtextalign} +%\DescribeOption{tabunitalign} +%\DescribeOption{tabalign} +% Cells containing no numbers are handled by \currpkg in a manner +% similar to \cs{multicolumn}. The setting of \opt{tabtextalign} is +% taken from the list \defaultopt{centre}, \opt{right} and +% \opt{left}.\footnote{Alias \opt{centre} = \opt{center}.} As would +% be expected, these settings centre, right- or left-align the cell +% contents. In |s| columns, all content is treated as input to the +% \cs{si} macro. The alignment of the contents relative to the cell +% is controlled by the \opt{tabunitalign} option, which takes options +% \defaultopt{left}, \opt{right} and \opt{centre}. The settings for +% \opt{tabnumalign}, \opt{tabtextalign} and \opt{tabunitalign} can be +% set to the same value in one go with the \opt{tabalign} option. +% +%\DescribeOption{tabautofit} +% The contents of table cells can automatically be rounded or +% zero-filled to the number of decimal places given in +% \opt{tabformat}. The is activated by the \opt{tabautofit} Boolean +% option. As \opt{tabformat} does not apply to columns with alignment +% \opt{centredecimal}, \opt{tabautofit} is also inactive for these +% columns (\ref{tab:autofit}). +%\begin{LaTeXexample}[float] +% \begin{table} +% \centering +% \caption{The \opt{tabautofit} option} +% \label{tab:autofit} +% \sisetup{tabformat=1.3,tabnumalign=centre} +% % Notice the overfull hbox which results with +% % the first column +% \begin{tabular}{% +% S% +% S[tabautofit]% +% S[tabautofit,tabnumalign=centredecimal]} +% \toprule +% {Header} & {Header} & {Header} \\ +% \midrule +% 1.2 & 1.2 & 1.2 \\ +% 1.2345 & 1.2345 & 1.2345 \\ +% \bottomrule +% \end{tabular} +% \end{table} +%\end{LaTeXexample} +% +%\subsection{Units} +%\DescribeOption{per} +% Most of the unit options are concerned with the processing of named +% units. The processor for units given as macro names can be +% influenced to give a variety of output formats. The \opt{per} +% option defines how the keyword macro \cs{per} is handled. This +% option takes a choice from the list \defaultopt{reciprocal}, +% \opt{slash} and \opt{fraction}.\footnote{Aliases \opt{reciprocal} = +% \opt{rp} = \opt{power}, \opt{fraction} = \opt{frac}.} The default +% option uses \cs{per} to indicate reciprocal powers, whereas +% \opt{slash} causes the package to use ``$/$'' to show division. +% +%\DescribeOption{fraction} +%\DescribeOption{slash} +% The \opt{fraction} option defines how \opt{per=fraction} is +% interpreted. The list of applicable values here is +% \defaultopt{frac}, \opt{nice}, \opt{ugly} and \opt{sfrac}. In each +% case, the unit is typeset as a fraction, but the macro use to +% achieve this varies. \opt{frac} uses the \TeX\ \cs{frac}, macro, +% while \opt{nice} makes use of a \cs{nicefrac}-like method. The +% \opt{ugly} option uses a slash in text mode and \cs{frac} in maths +% mode.\footnote{Similar to the \pkg{ugly} option of the +% \pkg{nicefrac} package.} Finally, the setting \opt{fraction=sfrac} +% uses the \cs{sfrac} macro from the \pkg{xfrac} package, when +% available.\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}.} The \opt{slash} option sets the symbol used when +% \opt{per=slash} is in force. This recognises the single keyword +% \opt{slash}; anything else is used literally. +%\begin{LaTeXexample} +% \sisetup{per=fraction} +% \si[fraction=frac]{\metre\per\second}\\ +% \si[fraction=nice]{\metre\per\second}\\ +% \si[fraction=sfrac]{\metre\per\second}\\ +% \si[per=slash]{\metre\per\second} +%\end{LaTeXexample} +% +%\DescribeOption{stickyper} +% By default, \cs{per} applies only to the next unit +% given.\footnote{This is the standard method of reading units in +% English: for example, \si{\joule\per\mole\per\kelvin} is pronounced +% ``joules per mole per kelvin''.} By setting the \opt{stickyper} +% flag, this behaviour is changed so that \cs{per} applies to all +% subsequent units.\footnote{This is the behaviour in \SIunits.} +%\begin{LaTeXexample} +% \si{\kilogram\per\metre\ampere}\\ +% \si[stickyper]{\kilogram\per\metre\ampere} +%\end{LaTeXexample} +% +%\DescribeOption{trapambigfrac} +%\DescribeOption{openfrac} +%\DescribeOption{closefrac} +% When using \opt{per=slash}, multiple units in the denominator will +% yield a potentially ambiguous result. The \opt{trapambigfrac} +% determines whether the package checks for this: this takes +% \defaultopt{true} and \opt{false}. When set, the contents of +% \opt{openfrac} are inserted before the denominator, and +% \opt{closefrac} is inserted after. +%\begin{LaTeXexample} +% \sisetup{trapambigfrac,openfrac=(,closefrac=),per=slash}\\ +% \si{\metre\per\second\per\kilogram}\\ +% \si[trapambigfrac=false]{\metre\per\second\per\kilogram} +%\end{LaTeXexample} +% +%\DescribeOption{prefixsymbolic} +%\DescribeOption{prefixbase} +%\DescribeOption{prefixproduct} +% The unit prefixes (\cs{kilo}, \etc) are normally given as letters. +% However, the package can convert these into numerical +% powers.\footnote{Provided things are not too complex!} This is +% controlled by the \opt{prefixsymbolic} Boolean option, which by +% default is \defaultopt{true}. If \opt{prefixsymboli} is set to +% \opt{false}, the format of the prefix is controlled by +% \opt{prefixbase} and \opt{prefixproduct}, which work in the same +% way as \opt{expbase} and \opt{expproduct}. +% +%\DescribeOption{prespace} +%\DescribeOption{xspace} +%\DescribeOption{allowoptarg} +% By default, the single unit macros (\eg \cs{metre}) add no space +% either before or after the unit. Setting the \opt{xspace} flag to +% true means that the single macros are followed by the \cs{xspace} +% command (when used outside of \cs{SI}/\cs{si}). For users of +% \unitsdef, the \opt{prespace} macro changes the behaviour of the +% unit macros, so that they can immediately follow a number. As a +% result, the unit macros will \emph{always} be preceded by a fixed +% space when the \opt{prespace} flag is true: this will be in +% addition to any other space. Also relevant to users moving from +% \unitsdef is the \opt{allowoptarg} option. This allows single unit +% macros to take an optional numerical argument, in the same way that +% occurs in that package. +%\begin{LaTeXexample} +% \metre is the symbol for metres\\ +% \sisetup{xspace} +% No, \metre is the correct symbol\\ +% \sisetup{prespace} +% 30\metre\\ +% Do not use \metre in running text\\ +% \sisetup{allowoptarg} +% \metre[40] +%\end{LaTeXexample} +% +%\subsection{Symbols} +% User access to control the symbols used for \si{\ohm}, \si{\micro}, +% \si{\degree}, \si{\arcmin}, \si{\arcsec}, \si{\angstrom} and +% \si{\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 \si{\micro} symbol in text +% mode. The text mode macros should be safe when forced into text, +% and the maths ones when forced into maths. The symbols defined in +% this way are: +%\newcommand*{\listsymbopt}[1]{\item \opt{#1}\SpecialOptionIndex{#1}} +%\begin{itemize} +% \listsymbopt{textOmega}; +% \listsymbopt{mathsOmega}; +% \listsymbopt{textmu}; +% \listsymbopt{mathsmu}; +% \listsymbopt{textdegree}; +% \listsymbopt{mathsdegree}; +% \listsymbopt{textminute}; +% \listsymbopt{mathsminute}; +% \listsymbopt{textsecond}; +% \listsymbopt{mathssecond}; +% \listsymbopt{textringA}; +% \listsymbopt{mathsringA}; +% \listsymbopt{textcelsius}; +% \listsymbopt{mathscelsius}. +%\end{itemize} +% +%\DescribeOption{redefsymbols} +% 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, set the +% \opt{redefsymbols} option \opt{false} (the default is +% \defaultopt{true}). +% +%\DescribeOption{eVcorra} +%\DescribeOption{eVcorrb} +% The \si{\electronvolt} symbol requires some fine-tuning, and so has +% two options of its own, both \TeX\ lengths. \opt{eVcorra} is the +% correction applied to the gap between ``e'' and ``V'' of the unit: +% the default is \defaultopt{0.3ex}. \opt{eVcorrb} is the correction +% applied to the gap between ``V'' of the unit and whatever follows; +% the default is \defaultopt{0ex}. The optimal value for these +% options will depend on the current font settings.\footnote{This +% document uses \opt{eVcorra=0.1ex}.} +%\begin{LaTeXexample} +% \si[per=slash]{\electronvolt\per\metre}\\ +% \si[per=slash,eVcorrb=0.7ex]{\electronvolt\per\metre} +%\end{LaTeXexample} +% +%\subsection{Colour} +%\DescribeOption{colourall} +%\DescribeOption{colourunits} +%\DescribeOption{colourvalues} +%\SpecialOptionIndex{colorall} +%\SpecialOptionIndex{colorunit} +%\SpecialOptionIndex{colorvalue} +% The package provides internal hooks for applying colour to part or +% all of the output. This requires the user to load the \pkg{color} +% or \pkg{xcolor} package to support colour in the output; \currpkg +% will ignore a colour request if support is unavailable. The Boolean +% options \opt{colourall}, \opt{colourunits} and \opt{colourvalues} +% are used to turn application of a given colour on or off for all +% output, only units and only values, respectively. All three +% switches are available with US spelling, \eg \opt{colorall} and +% \opt{colourall} behave in the same way. With colour turned off, no +% \cs{color} command is issued internally, and output follows the +% surrounding text. +% +%\DescribeOption{colour} +%\DescribeOption{unitcolour} +%\DescribeOption{valuecolour} +%\SpecialOptionIndex{color} +%\SpecialOptionIndex{unitcolor} +%\SpecialOptionIndex{valuecolor} +% The colour names to use for colouring output are set by the +% \opt{colour}, \opt{unitcolour} and \opt{valuecolour} options (all +% also available with US spelling). The \opt{colour} option +% internally sets both \opt{unitcolour} and \opt{valuecolour}. +%\begin{LaTeXexample} +% {\color{brown} Text \num{50}}\\ +% \sisetup{colourall,colour=green} +% \SI{10}{\metre}\\ +% {\color{purple} Text \num{70}}\\ +% \sisetup{colourunits=true,colourvalues=false} +% \SI{40}{\second} +%\end{LaTeXexample} +% +%\DescribeOption{colourneg} +%\DescribeOption{negcolour} +%\SpecialOptionIndex{colorneg} +%\SpecialOptionIndex{negcolor} +% \currpkg can automatically add a colour to negative numbers. This +% is turned on using the \opt{colourneg} switch. The colour used is +% set by the \opt{negcolour} option; both options are available using +% US spellings. +% +%\subsection{International support} +%\DescribeOption{locale} +% \currpkg allows the user to switch between the typographic +% conventions of different (geographical) areas by using +% \latin{locales}. Currently, the package is supplied with +% configurations for locales \opt{UK}, \opt{USA}, \opt{DE} (Germany) +% and \opt{ZA} (South Africa). The \opt{locale} option is used to +% switch to a particular locale. +%\begin{LaTeXexample} +% \SI{1.234}{\metre}\\ +% \SI[locale=DE]{6.789}{\metre} +%\end{LaTeXexample} +% +%\DescribeOption{loctolang} +% Locales are distinct from \pkg{babel} languages, as typographic +% conventions are not tightly integrated with language. However, it +% is useful to be able to associate a particular locale with a +% \pkg{babel} language. The option \opt{loctolang} handles this, and +% expects pairs of values: +% \opt{loctolang=\meta{locale}:\meta{language}}. +%\begin{LaTeXexample} +% \sisetup{loctolang={UK:UKenglish,DE:german}}\\ +% \SI{6.022e23}{\per\mole}\\ +% \selectlanguage{german}\\ +% \SI{6.022e23}{\per\mole} +%\end{LaTeXexample} +% +%\subsection{Package control} +%\DescribeOption{load} +%\DescribeOption{noload} +%\DescribeOption{alsoload} +% The package keeps most of the unit and abbreviations definitions in +% files separate from \file{siunitx.sty}. To control what is loaded, +% three complementary options are provided, all of which take a list +% of one or more choices. \opt{load} and \opt{alsoload} define which +% support configuration files are loaded. The list in \opt{load} +% recognises the value \opt{default}, which is expanded to the normal +% list before loading. The difference between \opt{load} and +% \opt{alsoload} is that \opt{load} specifies the \emph{complete} +% list of files to load, whereas \opt{alsoload} adds to the existing +% list. To use the \opt{load} option successfully requires knowing +% everything that is needed. The \opt{noload} option can be used to +% delete one or more items from the \opt{load} list, without needing +% to know what is on it.\footnote{\opt{noload} does not prevent the +% loading of a file needed by one which is loaded. Thus the package +% may internally override a \opt{noload} value if needed.} +% +%\DescribeOption{log} +%\DescribeOption{debug} +% To control data written to the \ext{log} file, the \opt{log} option +% is provided. This takes a value from the list \defaultopt{normal}, +% \opt{none}, \opt{minimal}, \opt{errors} and \opt{debug}. As would +% be expected, these indicate the amount of detail written to the log +% file. As a shortcut to \opt{log=debug}, the package also recognises +% the \opt{debug} option directly. +% +%\DescribeOption{strict} +% Some users will want to stick closely to the official rules for +% typesetting units. This could be made complicated if the options +% for non-standards behaviour could not be turned off. The load-time +% option \opt{strict} resets package behaviour to follow the rules +% closely, and disables options which deviate from this. If the +% package is loaded with the \opt{strict} option, all output is made +% in maths mode using the upright serif font. +% +%\subsection{Back-compatibility options} +%\DescribeOption{emulate} +% The package can emulate \SIunits, \SIstyle, \unitsdef, \units, +% \pkg{hepunits}, \pkg{fancyunits} and \pkg{fancynum}. Giving the +% \opt{emulate=\meta{package}} option will give the desired +% emulation, and combinations which would be possible with the real +% packages will also work here. The package will recognise the +% options of the emulated packages. This will automatically cause +% emulation to be switched on. +% +%\subsection{Summary of all options} +% \ref{tab:allopt} lists a summary of the package options (excluding +% those for backward-compatibility). A reminder or the input format +% is also provided. +%\begin{longtable}{>{\ttfamily}lll} +% \caption{All package options\label{tab:allopt}}\\ +% \toprule +% Option & Type & Description \\ +% \midrule +% \endfirsthead +% \toprule +% Option & Type & Description \\ +% \midrule +% \endhead +% \bottomrule +% \multicolumn{3}{r}{\emph{Continued on next page}} +% \endfoot +% \bottomrule +% \endlastfoot +% addsign & List & Add sign to number \\ +% allowzeroexp & Boolean & Allow \num[allowzeroexp]{e0} \\ +% angformat & List & Conversion of angle format \\ +% anglesep & List or literal & Space between angle components \\ +% astroang & Boolean & Astronomy-style angles \\ +% closeerr & Literal & Closes potential-ambiguous error \\ +% closefrac & Literal & Closes potential-ambiguous fraction \\ +% color & Literal & Colour used for units and values \\ +% colour & Literal & Colour used for units and values \\ +% colorall & Boolean & Switch for colouring all output \\ +% colourall & Boolean & Switch for colouring all output \\ +% colorneg & Boolean & Colour negative numbers \\ +% colourneg & Boolean & Colour negative numbers \\ +% colorunits & Boolean & Switch for colouring units \\ +% colourunits & Boolean & Switch for colouring units \\ +% colorvalues & Boolean & Switch for colouring values \\ +% colourvalues & Boolean & Switch for colouring values \\ +% decimalsymbol & List or literal & Decimal symbol \\ +% debug & Boolean & Write debugging data to log \\ +% detectdisplay & Boolean & Treat display maths separately \\ +% digitsep & List & Separation of digits in large numbers \\ +% dp & Integer & Number of decimal places to \\ +% & & output numbers to \\ +% emulate & Modules & Emulation modules to load \\ +% errspace & List & Spacing of bracketed error \\ +% eVcorra & Length & Spacing correction in \eV \\ +% eVcorrb & Length & Spacing correction after \eV \\ +% expbase & List or Literal & Base used for exponents \\ +% expproduct & List or literal & Product sign for exponents \\ +% fixdp & Boolean & Switch for fixing decimal \\ +% & & places of numbers \\ +% fraction & List & Method used when setting \opt{per=frac} \\ +% inlinebold & List & Select how inline bold is tested \\ +% load & Modules & Modules to load \\ +% locale & Modules & Locale to follow \\ +% loctolang & Special & Associate locale with \pkg{babel} +% language \\ +% log & List & Amount of data added to log \\ +% mathOmega & Literal & ``$\makeatletter\si@mathsOmega\makeatother$'' +% symbol in maths mode \\ +% mathcelsius & Literal & ``$\makeatletter\si@mathscelsius\makeatother$'' +% symbol in maths mode \\ +% mathdegree & Literal & ``$\makeatletter\si@mathsdegree\makeatother$'' +% symbol in maths mode \\ +% mathminute & Literal & ``$\makeatletter\si@mathsminute\makeatother$'' +% symbol in maths mode \\ +% mathmu & Literal & ``$\makeatletter\si@mathsmu\makeatother$'' +% symbol in maths mode \\ +% mathringA & Literal & ``$\makeatletter\si@mathsringA\makeatother$'' +% symbol in maths mode \\ +% mathrm & Csname & Roman maths font \\ +% mathsOmega & Literal & ``$\makeatletter\si@mathsOmega\makeatother$'' +% symbol in maths mode \\ +% mathscelsius & Literal & ``$\makeatletter\si@mathscelsius\makeatother$'' +% symbol in maths mode \\ +% mathsdegree & Literal & ``$\makeatletter\si@mathsdegree\makeatother$'' +% symbol in maths mode \\ +% mathsecond & Literal & ``$\makeatletter\si@mathssecond\makeatother$'' +% symbol in maths mode \\ +% mathsf & Csname & Sans serif maths font \\ +% mathsminute & Literal & ``$\makeatletter\si@mathsminute\makeatother$'' +% symbol in maths mode \\ +% mathsmu & Literal & ``$\makeatletter\si@mathsmu\makeatother$'' +% symbol in maths mode \\ +% mathsringA & Literal & ``$\makeatletter\si@mathsringA\makeatother$'' +% symbol in maths mode \\ +% mathsrm & Csname & Roman maths font \\ +% mathssecond & Literal & ``$\makeatletter\si@mathssecond\makeatother$'' +% symbol in maths mode \\ +% mathssf & Csname & Sans serif maths font \\ +% mathstt & Csname & Fixed-width maths font \\ +% mathtt & Csname & Fixed-width maths font \\ +% mode & List & Use text or maths mode for \\ +% & & typesetting \\ +% negcolor & Literal & Colour used for negative numbers \\ +% negcolour & Literal & Colour used for negative numbers \\ +% noload & Modules & Modules not to load \\ +% numaddn & Literal & Additional input allowed in numbers \\ +% numcloseerr & Literal & Character indicating end of \\ +% & & numerical error\\ +% numdecimal & Literal & Decimal symbols in numbers\\ +% numdigits & Literal & Digit characters in numbers \\ +% numexp & Literal & Exponent characters in numbers \\ +% numgobble & Literal & Characters to ignore in numbers \\ +% numopenerr & Literal & Character indicating start of \\ +% & & numerical error\\ +% numprod & Literal & Characters used for a product \\ +% numsign & Literal & Sign characters in numbers \\ +% obeyall & Boolean & Combination of \opt{obeybold}, \\ +% & & \opt{obeyitalic} and \opt{obeymode} \\ +% obeybold & Boolean & Check local bold setting \\ +% obeyitalic & Boolean & Check local italic setting \\ +% obeymode & Boolean & Check local mode (text/maths) \\ +% openerr & Literal & Opens potentially-ambiguous error \\ +% openfrac & Literal & Opens potentially-ambiguous fraction \\ +% padangle & List & Add zeros to blank parts of angles \\ +% padnumber & List & Add zeros to blank parts of numbers \\ +% per & List & Behaviour of \cs{per} \\ +% prefixbase & List or literal & Base used when making prefixes \\ +% & & numerical \\ +% prefixproduct & List or literal & Product sign for prefixes \\ +% prefixsymbolic & Boolean & Behaviour of unit prefixes\\ +% prespace & Boolean & Add space before units \\ +% redefsymbols & Boolean & Use better symbols if available \\ +% repeatunits & List & Repeat units with separated errors \\ +% & & and products \\ +% retainplus & Boolean & Retain explicit plus sign\\ +% seperr & Boolean & Separate number and error \\ +% sepfour & Boolean & Separate four-digit numbers \\ +% sign & List or literal & Sign to add to numbers \\ +% slash & List or literal & Symbol used for ``/'' \\ +% stickyper & Boolean & Require \cs{per} only once \\ +% strict & Boolean & Obey the rules strictly \\ +% strictarc & Boolean & Require exactly zero or \\ +% & & two semi-colons \\ +% tabalign & List & Positioning of all column data \\ +% tabalignexp & Boolean & Alignment of exponents in tables \\ +% tabautofit & Boolean & Switch for rounding numbers to \\ +% & & length given by \opt{tabformat} \\ +% tabformat & Number & Space reserved in table for numbers \\ +% tabnumalign & List & Alignment of |S| column numbers \\ +% tabtextalign & List & Positioning of text in |S| columns \\ +% tabunitalign & List & Positioning of units in |s| columns \\ +% textcelsius & Literal & ``$^{\circ}$C'' symbol in text mode \\ +% textdegree & Literal & ``${\circ}$'' symbol in text mode \\ +% textminute & Literal & ``$'$'' symbol in text mode \\ +% textmu & Literal & ``$\upmu$'' symbol in text mode \\ +% textomega & Literal & ``$\Omega$'' symbol in text mode \\ +% textringa & Literal & ``\AA'' symbol in maths mode \\ +% textrm & Csname & Roman text font \\ +% textsecond & Literal & ``$''$'' symbol in text mode \\ +% textsf & Csname & Sans serif text font \\ +% texttt & Csname & Fixed-width text font \\ +% tightpm & Boolean & Reduce space around $\pm$ \\ +% trapambigerr & Boolean & Check for ambiguous errors \\ +% trapambigfrac & Boolean & Check for ambiguous fractions \\ +% unitcolor & Literal & Switch for colouring units \\ +% unitcolour & Literal & Switch for colouring units \\ +% unitmathrm & Csname & Roman maths font for units \\ +% unitmathsf & Csname & Sans serif maths font for units \\ +% unitmathsrm & Csname & Roman maths font for units \\ +% unitmathssf & Csname & Sans serif maths font for units \\ +% unitmathstt & Csname & Fixed-width maths font for units \\ +% unitmathtt & Csname & Fixed-width maths font for units \\ +% unitmode & List & As \opt{mode}, for units only \\ +% unitsep & List or literal & Separator for units \\ +% unitspace & List or literal & Space used for ``|~|'' in units \\ +% valuecolor & Literal & Switch for colouring value \\ +% valuecolour & Literal & Switch for colouring value \\ +% valuemathrm & Csname & Roman maths font for values \\ +% valuemathsf & Csname & Sans serif maths font for values \\ +% valuemathsrm & Csname & Roman maths font for values \\ +% valuemathssf & Csname & Sans serif maths font for values \\ +% valuemathstt & Csname & Fixed-width maths font for values \\ +% valuemathtt & Csname & Fixed-width maths font for values \\ +% valuemode & List & As \opt{mode}, for values only \\ +% valuesep & List or literal & Separator between value and unit \\ +% xspace & Boolean & Use \pkg{xspace} after units \\ +%\end{longtable} +% +%\section{Emulation of other packages} +% \currpkg has been designed as a replacement for \SIunits, \SIstyle, +% \unitsdef, \units, \pkg{hepunits}, \pkg{fancyunits} and +% \pkg{fancynum}. It therefore provides options reproduce the +% functions of all of these packages. In this way, \currpkg should +% be usable as a straight replacement for the older +% packages.\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 a +% 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{Configuration files} +% \currpkg is a modular package. The unit definitions, abbreviations +% and locales are all stored in configuration files. These all take +% names of the form \file{si-\meta{name}.cfg}, where \meta{name} is +% the part of the filename used as an option in \cs{sisetup} or when +% loading \currpkg. Producing new configuration files therefore +% consists of making a suitably-named file and adding it to the path +% searched by \TeX. The files should normally consist of settings +% (in \cs{sisetup}) and unit definitions, \etc. +% +%\DescribeMacro{\addtolocale} +% To allow arbitrary macros to be stored in locales, the +% \cs{addtolocale} macro is provided. This ensures that arbitrary +% text is only executed when using a locale, not when loading it. +% +%\DescribeMacro{\requiresiconfigs} +% To load one or more configuration files from inside another +% configuration file, the \cs{requiresiconfigs} macro is provided. +% This accepts a comma-separated list of configuration names, in the +% same way as \opt{load} or \opt{noload}. +% +% In addition to the various configuration files provided with the +% package, a local file \file{siunitx.cfg} may be provided. This is +% read at the end of loading \currpkg, and allows the user to include +% any local definitions or settings easily. +% +%\section{Common questions} +%\subsection{Why do I need \cs{per} more than once?} +% The unit engine of \currpkg is based around the English method for +% reading units out loud. Thus \si{\joule\per\mole\per\kelvin} is +% pronounced ``joules per mole per kelvin''. Hence by default you +% need to put \cs{per} before each item in the denominator of a unit. +% The behaviour can be altered by setting the \opt{stickyper} option. +% +%\subsection{Why is the order of my units changed?} +% Then using \opt{per=reciprocal}, the units are typeset as given. +% However, when using \opt{per=slash} or \opt{per=fraction}, the +% package needs to find which ones are in the denominator. It then +% prints the numerator and denominator separately. So if you give a +% unit in the denominator \emph{before} one in the numerator, they +% have to be re-ordered.\footnote{``Double division'' +% (\SI{1}{s/m/kg}) is mathematically incorrect.} +%\begin{LaTeXexample} +% \SI{88}{\per\kilogram\metre} \\ +% \SI[per=slash]{66}{\per\kilogram\metre} +%\end{LaTeXexample} +% +%\subsection{Why are compound units not recommended outside of +% \cs{SI}/\cs{si}?} +% To fully process units made up of several parts, the processor has +% to know where the end of the unit is. When the unit macros are +% used outside of \cs{SI}/\cs{si}, this is not the case. The package +% therefore does its best, but results may be sub-optimal. To get +% consistent results, either define a new \emph{single} unit, or keep +% compound units inside \cs{SI} and \cs{si}. +%\begin{LaTeXexample} +% \metre\per\micro\second \\ +% \si{\metre\per\micro\second} \\ +% \newunit{\myunit}{\metre\per\micro\second} +% \myunit +% \newunit{\myunittwo}{\kilogram\myunit} \\ +% \myunittwo \\ +% \kilogram\myunit +%\end{LaTeXexample} +% Notice the difference in behaviour of \cs{per} in the first two +% lines, and the spacing error on the last line in the example. +% +%\subsection{How do I set superscripts to use lining numbers?} +% Lowercase (``old style'') numbers are favoured by many people for +% use in running text. However, this does not necessarily look good +% in superscripts. The mode used to typeset data can be varied, so +% that maths mode numbers are used for the unit part of the output. +%\begin{LaTeXexample} +% \SI[mode=text]{1234}{\metre\per\second}\\ +% \SI[valuemode=text,unitmode=maths]{1234}{\metre\per\second} +%\end{LaTeXexample} +% +%\subsection{Why do most of the examples use +% \texorpdfstring{\si{\joule\per\mole\per\kelvin}}{J mol-1 K-1}?} +% The package author is a chemist, and this is the unit of entropy +% (disorder). It nicely demonstrates the use of the \cs{per} macro, +% and so it crops up a lot. It is also in the subsection heading +% here to act as a test with \pkg{hyperref} and moving arguments! +% +%\subsection{What can \numprint do that \currpkg cannot?} +% \currpkg uses a lot of ideas from \numprint: a reasonable amount of +% the number-processing code here is based on that in \numprint. +% However, the two packages have somewhat different aims, and as a +% result there are things that \numprint can do that \currpkg does +% not implement. The main features of \numprint not available here +% are: +%\begin{itemize} +% \item General support for numbers with base other than $10$ (see +% \pkg{nbaseprt}); +% \item Alignment of the decimal marker of powers in tables; +% \item Alignment of numbers in running text; +% \item Specific formatting commands for \TeX\ counters and lengths. +%\end{itemize} +% +%\section{Tricks and known issues} +% +%\subsection{Ensuring maths mode} +% 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. +% +%\subsection{Limitations of \cs{mathrm}} +% 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 \emph{may} get around this issue. +%\begin{LaTeXexample} +% \num[numaddn=\pi]{4\pi e-7}\\ +% \num[numaddn=\pi,mathsrm=mathnormal]{4\pi e-7} +%\end{LaTeXexample} +% On the other hand, you may want to use text mode, in which case +% \cs{ensuremath} is needed. Depending on the exact circumstances, +% the \LaTeX\ protection mechanism (\cs{DeclareRobustCommand}) may be +% sufficient; in some cases, this will fail and the \eTeX\ +% \cs{protected} system may be required. There are several potential +% pitfalls in this area; experimentation may well be needed. +%\begin{LaTeXexample} +% \DeclareRobustCommand*{\numpi}{\ensuremath{\pi}} +% \num[numaddn=\numpi,mode=text]{4\numpi e-7} +%\end{LaTeXexample} +% +%\subsection{Entire document in sans serif font} +% If your entire document is not in a Roman font, using +% the font detection system is not the most efficient method +% for setting the \currpkg output. Instead, the \opt{mathrm} +% and \opt{textrm} package options can be redefined. +%\begin{LaTeXexample} +% \sffamily +% Some text \\ +% \sisetup{obeyfamily=false,mathrm=mathsf,textrm=sffamily} +% \num{1e2} \\ +% \SI{3}{\newton} +% \[ \num{4e5} \si{\pascal} \] +%\end{LaTeXexample} +% +%\subsection{Effects of emulation} +% The package has been designed so that almost everything can be set +% using the options. In the emulation code, some internal macros are +% redefined. This is because the legacy packages do odd things, +% which are deliberately not implemented by \currpkg. Using an +% emulation file will prevent subsequent loading of the real package. +% This is to prevent errors or, worse, difficult to diagnose changes +% to output. +% +%\subsection{Centring columns on non-decimal input} +% The \pkg{dcolumn} manual suggests using that package to align a +% column on a $\pm$ sign. The same type of output is possible using +% \currpkg, but some care is needed (\ref{tab:dcolumn}). Odd things +% may happen: use with care! +%\begin{LaTeXexample}[float] +% \begin{table} +% \caption{Non-standard \texttt{S} column} +% \label{tab:dcolumn} +% \centering +% \begin{tabular}{% +% S[digitsep=none,decimalsymbol={\,\pm\,}, +% numdigits={0123456789.},numdecimal=+]} +% \toprule +% {Some Values} \\ +% \midrule +% 2.3456 + 0.02 \\ +% 34.2345 + 0.001 \\ +% 56.7835 + 0.067 \\ +% 90.473 + 0.021 \\ +% \bottomrule +% \end{tabular} +% \end{table} +%\end{LaTeXexample} +% +%\subsection{Adding items after the last column of a tabular} +% If you use an |S| or |s| column as the last one in a tabular, and +% you use the \pkg{array} ``|<|'' construction to add items after it, +% the spacing may be wrong. This will occur if the column contents +% are of differing widths. Changing the \LaTeX\ |\\| line ending for +% the plain \TeX\ \cs{cr} will give the correct spacing, but does not +% allow adjustment of inter-row distance (\ref{tab:cr}).\footnote{For +% the \TeX\ experts, the issue here is that the system to gather up +% cell contents is added in using the \texttt{<} construction. +% Normally, this comes after the cell contents and any other +% \texttt{<} arguments, so collects the user additions. However, in +% the last cell the contents include \texttt{\bslash\bslash}, which +% is converted to \cs{cr} before gathering can occur. By using +% \cs{cr} directly, the gathering process receives all of the cell +% contents as normal.} In most cases, this should not be a serious +% issue. +%\begin{LaTeXexample}[float] +% \begin{table} +% \caption{Correcting spacing in last \texttt{S} column} +% \label{tab:cr} +% \hfil +% \begin{tabular}{S<{\,\si{\kg}}S<{\,\si{\kg}}} +% \toprule +% \multicolumn{1}{c}{Long header} & +% \multicolumn{1}{c}{Long header} \\ +% \midrule +% 1.23 & 1.23 \\ +% 4.56 & 4.56 \\ +% 7.8 & 7.8 \\ +% \bottomrule +% \end{tabular} +% \hfil +% \begin{tabular}{S<{\,\si{\kg}}S<{\,\si{\kg}}} +% \toprule +% \multicolumn{1}{c}{Long header} & +% \multicolumn{1}{c}{Long header} \\ +% \midrule +% 1.23 & 1.23 \cr +% 4.56 & 4.56 \cr +% 7.8 & 7.8 \cr +% \bottomrule +% \end{tabular} +% \hfil +% \end{table} +%\end{LaTeXexample} +% +%\iffalse +%<*bug> +%\fi +%\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} in the +% \texttt{doc/latex/siunitx} directory or by running the \ext{dtx} or +% \ext{ins} file through \TeX. +% \begin{macrocode} +\listfiles +\documentclass{article} +% \end{macrocode} +% Load other packages needed here. +% \begin{macrocode} +\usepackage{siunitx} +% \end{macrocode} +% Normally, debugging the load procedure will not be needed; the +% debug option here means that all run-time information is logged. +% \begin{macrocode} +\sisetup{debug} +\begin{document} +This is the bug test-case document for the \textsf{siunitx} +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{macrocode} +%\iffalse +% +%\fi +% +%\section{Feature requests} +% Feature requests for \currpkg are welcome. The package maintainer +% will consider any ideas within the remit of the package (units and +% values). If suggesting a new feature, an example of how it should +% work would be appreciated. If new controls are needed, some +% suggestions for option names would be welcome. +% +%\section{Acknowledgements} +% Many thanks indeed to Stefan Pinnow, who has made a very large +% number of suggestions and found numerous bugs in the package. His +% contribution to the package has been vital. 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 (\units) and Harald Harders (\numprint). Will Robertson +% and Heiko Oberdiek deserve much credit for demonstrating \LaTeX\ +% coding best practice. Victor Eijkhout's excellent (and free) +% \emph{\TeX\ by Topic} has provided some useful coding hints +% \cite{Eijkhout}. The idea for combining and extending unit +% provision in \LaTeX\ was heavily inspired by Philip Lehmann's +% \pkg{biblatex}. Thanks to the various contributors of ideas for the +% package: Donald Arseneau, Michele Dondi, Paul Gans, Ben Morrow, Lan +% Thuy Pham, Alan Ristow, Patrick Heinze, Andrea Blomenhofer, Morten +% H{\o}gholm, Burkhard Moddemann and Patrick Steegstra. +% +%\clearpage +%\part{Correct application of (SI) units} +%\section{Background} +% Consistent and logical units are a necessity for scientific work, +% and have applicability everywhere. Historically, a number of +% systems have been used for physical units. SI units were +% introduced by the \latin{Conf\'erence G\'en\'erale des Poids et +% Mesures} (CGPM) in 1960. SI units are a coherent system based on +% seven base units, from which all other units may be derived. +% +% At the same time, physical quantities with units are mathematical +% entities, and as such way that they are typeset is important. In +% mathematics, changes of type (such as using bold, italic, sans +% serif typeface and so on) convey information. This means that +% rules exist not only for the type of units to be used under the SI +% system, but also the way they should appear in print. Advice on +% best practice has been made available by the \emph{National +% Institute of Standards and Technology} (NIST) \cite{NIST}. +% +% As befits an agreed international standard, the full rules are +% detailed. It is not appropriate to reproduce these in totality +% here; instead, a useful summary of the key points is provided. The +% full details are available from the \latin{Bureau International des +% Poids et Mesures} (BIPM) in French \cite{BIPM:FR} and English +% \cite{BIPM:EN}. They also publish a very useful and detailed guide +% to using units, values and so on, available online in a number of +% different formats \cite{BIPM:PDF}. +% +% \currpkg takes account of the information given here, so far as is +% possible. Thus the package defaults follow the recommendations +% made for typesetting units and values. Spacing and so forth is +% handled in such a way as to make implementing the rules +% (relatively) easy. +% +%\section{Units} +%\subsection{SI base units} +% There are seven base SI units, listed in \ref{tab:baseunits}. Apart +% from the kilogram, these are defined in terms of a measurable +% physical quantity needing the definition alone.\footnote{Some base +% units need others defined first; there is therefore a required +% order of definition.} The base units have been chosen such that +% all physical quantities can be expressed using an appropriative +% combination of these units, needing no others and with no +% redundancy. The kilogram is slightly different from the other base +% units as it is still defined in terms of a ``prototype'' held in +% Paris.\footnote{At the time of writing, this is under review and +% will be altered.} +% +%\subsection{SI derived units} +% All other units within the SI system are regarded as ``derived'' +% from the seven base units. At the most basic, all other SI units +% can be expressed as combinations of the base units. However, many +% units (listed in \ref{tab:derived}, \ref{tab:experimental} and +% \ref{tab:accepted}) have a special name and symbol.\footnote{The +% nautical mile has a given name but no agreed symbol, and although +% accepted by the SI is not provided by \currpkg as a unit macro.} +% Most of these units are simple combinations of one or more base +% units (raised to powers as appropriate). A small number of units +% derived from experimental data are allowed as SI units +% (\ref{tab:experimental}). +% +% Some of these units (in \ref{tab:accepted}) are regarded as only +% ``temporarily'' accepted, as the use of only the base and +% fully-consistent derived units in \ref{tab:derived} is encouraged. +% They are accepted as they are in common use in one or more +% disciplines; some are still very widespread in the appropriate +% areas. These units are mainly multiples of base units (for +% example, a tonne is \SI{1000}{\kilo\gram}). +% +% One point to note is that ``unitless ratios'' are regarded as +% having base units which cancel out. For example, the radian is +% regarded as having base unit \si{\metre\per\metre}. The result of +% this division (``$1$'') is therefore regarded as a derived SI unit +% in this context. +% +%\subsection{SI prefixes} +% A series of SI prefixes for decimal multiples and submultiples are +% provided, and can be used as modifiers for any SI unit (either base +% or derived units) with the exception of the kilogram. The prefixes +% are listed in \ref{tab:prefix}. No space should be used between a +% prefix and the unit, and only a single prefix should be used. Even +% the degree Celsius can be given a prefix, for example +% \SI{1}{\milli\celsius}. The only exception to this rule is for +% degrees, minutes and seconds of an arc: \ang{1;2;3}. +% +% It is important to note that the kilogram is the only SI unit with +% a prefix as part of its name and symbol. Only single prefix may +% be used, and so in the case of the kilogram prefix names are used +% with the unit name ``gram'' and the prefix symbols are used with +% the unit symbol \si{\gram}. For example $\SI{1e-6}{\kilogram} = +% \SI{1}{\milli\gram}$. +% +%\subsection{Other units} +% The application of SI units is meant to provide a single set of +% units which ensure consistency and clarity across all areas. +% However, other units are common is many areas, and are not without +% merit. The units provided by \currpkg by default do not included +% any of these; only units which are part of the SI set or are +% accepted for use with SI units are defined. However, several other +% sets of units can be loaded as optional modules. The binary +% prefixes and units (Section~\ref{sec:binary} and \ref{tab:binary}) +% are the most obvious example. These are \emph{not} part of the SI +% specifications, but the prefix names are derived from those in +% \ref{tab:prefix}. +% +% Other units (such as those provided by the modules \opt{synchem}, +% \opt{hep} and \opt{astro}) are normally to be avoided where +% possible. SI units should, in the main, be preferred due to the +% advantages of clear definition and self-consistency this brings. +% However, there will probably always be a place for specialist or +% non-standard units. This is particulary true of units derived from +% basic physical constants; for example reason, the \opt{hep} module +% defines the speed of light, \si{\clight}, as a unit. For work in +% basic science, a small number of physical constants are recognised +% as units provided the results for comparison with experiment are +% given in SI units. +% +% There are also many areas where non-standard units are used so +% commonly that to do otherwise is difficult or impossible. For +% example, most synthetic chemists measure the pressure inside vacuum +% apparatus in \si{\mmHg}, partly because the most common gauge for +% the task still uses a column of mercury metal. For these reasons, +% \currpkg does define non-SI units. +% +%\section{Units and values in print} +%\subsection{Mathematical meaning} +% As explained earlier, a unit--value combination is a single +% mathematical entity. This has implications for how both the number +% and the unit should be printed. Firstly, the two parts should not +% be separated. With the exception of the symbols for plane angles +% (\si{\degree}, \si{\arcmin} and \si{\arcsec}), it is usual to have +% a space between the unit and the value. This should therefore be a +% non-breaking space between the two. Different geographical areas +% have different conventions on the size of this space; a ``small'' +% space (|\,|) is the \currpkg default. +%\begin{LaTeXexample} +% A space for \SI{10}{\percent}\\ +% and also for \SI{100}{\celsius}\\ +% but not for \ang{1.23}. +%\end{LaTeXexample} +% +% The mathematical meaning of units also means that the shape, weight +% and family are important. Units are supposed to be typeset in an +% upright, medium weight serif font. Italic, bold and sans serif are +% all used mathematically to convey other meanings. \currpkg package +% defaults again follow this convention: any local settings are +% ignored, and uses the current upright serif maths font. However, +% there are occasions where this may not be the most desirable +% behaviour. A classic example would be in an all-bold section +% heading. As the surrounding text is bold, some people feel that +% any units should follow this. +%\begin{LaTeXexample} +% Units should \textbf{not be bold: \SI{54}{\farad}}\\ +% \textbf{But perhaps in a running block,\\ +% it might look better: \SI[obeybold]{54}{\farad}} +%\end{LaTeXexample} +% +%\subsection{Unit multiplication and division} +% Symbols for units formed from other units by multiplication are +% indicated by means of either a half-height (that is, centred) dot +% or a (thin) space. This document uses a half-height dot as +% (\emph{i}) this is the recommendation of \textsc{nist}, amongst +% others and (\emph{ii}) it avoids potential confusion between unit +% prefixes and multiplied units. +%\begin{LaTeXexample} +% $\si{\metre\second} = \mbox{metre second}$ \\ +% $\si{\milli\second} = \mbox{millisecond}$ \\ +% \sisetup{unitsep=thin} +% $\si{\metre\second} = \mbox{metre second}$ \\ +% $\si{\milli\second} = \mbox{millisecond}$ +%\end{LaTeXexample} +% There are some circumstances under which it is permissable to omit +% any spaces. The classic example is \si{\kWh}, where +% ``\si[unitsep=thin]{\kWh}'' does not add any useful information. +% If using such a unit repeatedly, users of \currpkg are advised to +% create a custom unit to ensure consistency.\footnote{\cs{kWh} and +% \cs{kilowatthour} are defined by \currpkg in this way.} +% +% Symbols for units formed from other units by division are indicated +% by means of a virgule (oblique stroke, slash, |/|), a horizontal +% line, or negative exponents.\footnote{Notice that a virgule and a +% solidus are not the same symbol.} However, to avoid ambiguity, the +% virgule must not be repeated on the same line unless parentheses +% are used. This is ensured when using named unit macros in \currpkg, +% which will ``trap'' repeated division and format it correctly. In +% complicated cases, negative exponents are to be preferred over +% other formats. +%\begin{LaTeXexample} +% \si{\joule\per\mole\per\kelvin}\\ +% \si[per=fraction]{\joule\per\mole\per\kelvin}\\ +% \si[per=slash]{\joule\per\mole\per\kelvin} +%\end{LaTeXexample} +% +%\subsection{Repeating units} +% Products and errors should show what unit applies to each value +% given. Thus \SI{2x3}{\metre} is an ordered set of lengths of a +% geometric area, whereas \SI[repeatunits=false]{2x3}{\metre} is a +% length (and equal to \SI{6}{\metre}). Thus, $\times$ is not a +% product but is a mathematical operator; in the same way, a $2 +% \times 3$ matrix is not a $6$ matrix! In some areas, areas and +% volumes are given with separated units but a unit raised to the +% appropriate power: \SI[repeatunits=power]{2 x 3}{\metre}. Although +% this does display the correct overall units, it is +% potentially-confusing and is not encouraged. +% +%\subsection{Clarity in writing values of quantities} +% Care must be taken when writing ranges of numbers. For purely +% numerical values, it is common to use a en-dash between values, for +% example ``see pages 1--5''. On the other hand, values with units +% could be misinterpret as negative values if written in this way. As +% the unit--value combination is a single mathematic entity, writing +% the values with an en-dash followed by a single unit is also +% incorrect. As a result, using the word ``to'' is strongly +% recommended. +%\begin{LaTeXexample} +% \SI{1}{\metre} to \SI{5}{\metre} long. +%\end{LaTeXexample} +% +%\subsection{Graphs and tables} +% In tables and graphs, repetition of the units following each entry +% or axis mark is confusing and repetitive. It is therefore best to +% place the unit in the label part of the information. Placing the +% unit in square brackets is common but mathematically +% poor.\footnote{For example, for an acceleration $a$, the expression +% $[a]$ is the dimensions of $a$, \ie length per time squared in this +% case.} Much better is to show division of all values by the unit, +% which leaves the entries as unitless ratios. This is illustrated +% in \ref{tab:label} and \ref{fig:label}. +%\begin{LaTeXexample}[float] +% \begin{table} +% \centering +% \caption{An example of table labelling} +% \label{tab:label} +% \begin{tabular}{cS[tabformat=1.4,tabnumalign=centre]} +% \toprule +% {Entry} & {Length/\si{\metre}} \\ +% \midrule +% 1 & 1.1234 \\ +% 2 & 1.1425 \\ +% 3 & 1.7578 \\ +% 4 & 1.9560 \\ +% \bottomrule +% \end{tabular} +% \end{table} +%\end{LaTeXexample} +%\begin{LaTeXexample}[float] +% \begin{figure} +% \centering +% \begin{tikzpicture} +% \begin{axis}[xlabel=$t/\si{\second}$,ylabel=$d/\si{\metre}$] +% \addplot[smooth,mark=x] +% plot coordinates { +% (0,0) +% (1,5) +% (2,8) +% (3,9) +% (4,8) +% (5,5) +% (6,0) +% }; +% \end{axis} +% \end{tikzpicture} +% \caption{An example of graph labelling} +% \label{fig:label} +% \end{figure} +%\end{LaTeXexample} +% +% In most cases, adding exponent values in the body of a table is +% less desirable than adding a fixed exponent to column headers. An +% example is shown in \ref{tab:exp}. The use of \cs{multicolumn} is +% needed here due to the ``|<|''; without \cs{multicolumn}, the +% titles are followed by ``\si{\kilo\gram}''! +%\begin{LaTeXexample}[float] +% \begin{table} +% \centering +% \caption{Good and bad columns} +% \label{tab:exp} +% \sisetup{tabnumalign=centre} +% \begin{tabular}{% +% c% +% S[tabformat=1.3e1]<{\,\si{\kilogram}}% +% S[tabformat=2.2]} +% \toprule +% Entry & \multicolumn{1}{c}{Mass} & +% {Mass/\SI{e3}{\kilogram}} \\ +% \midrule +% 1 & 4.56e3 & 4.56 \\ +% 2 & 2.40e3 & 2.40 \\ +% 3 & 1.345e4 & 13.45 \\ +% 4 & 4.5e2 & 0.45 \\ +% \bottomrule +% \end{tabular} +% \end{table} +%\end{LaTeXexample} +% +%\bibliographystyle{unsrt} +%\StopEventually{% +% \clearpage +% \part{Notes} +% \PrintChanges +% \PrintIndex +% \bibliography{siunitx}} +% +% \iffalse +%<*package> +% \fi +% +%\clearpage +%\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 \units. +% 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.\footnote{Although extra optional arguments may be added.} +% However, internal package macros will behave differently; if the +% user has redefined internal macros, then compatibility will 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} +%\begin{macro}{\si@svn@version} +%\begin{macro}{\si@svn@id} +%\begin{macro}{\si@svn@ver} +% As always, the package starts with identification. This defines a +% couple of macros for use with \emph{Subversion}, so that everything +% is nice and clear. This should also make it a bit easier to avoid +% messing up the revision data! For anyone reading the source, the +% revision number is also available as well as the release version +% number, of course. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\newcommand*{\si@svn@ver}{v1.0} +\def\si@svn@id$#1: #2.#3 #4 #5-#6-#7 #8 #9${% + \newcommand*{\si@svn@version}{% + #5/#6/#7\space\si@svn@ver\space}} +\si@svn@id $Id: siunitx.dtx 76 2008-06-15 08:10:34Z joseph $ +\ProvidesPackage{siunitx} + [\si@svn@version A comprehensive (SI) units package] +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +% The package requires \eTeX, so the usual test is made. +% \begin{macrocode} +\begingroup + \@ifundefined{eTeXversion} + {\PackageError{siunitx} + {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} +%\begin{macro}{\si@catcodes} +% There are circumstances under which some odd category codes might +% be in place. The category codes for |{|, |}|, |[|, |]| and |#| are +% assumed to be okay; if issues arise, this can be altered. \LaTeX\ +% will have set |@| as a letter on loading \currpkg. +% \begin{macrocode} +\edef\si@catcodes{% + \catcode\string`\string ` \the\catcode\string`\`\relax + \catcode\string`\string = \the\catcode\string`\=\relax + \catcode\string`\string ^ \the\catcode\string`\^\relax + \catcode\string`\string ~ \the\catcode\string`\~\relax + \catcode\string`\string : \the\catcode\string`\:\relax + \catcode\string`\string - \the\catcode\string`\-\relax + \catcode\string`\string + \the\catcode\string`\+\relax + \catcode\string`\string ; \the\catcode\string`\;\relax + \catcode\string`\string , \the\catcode\string`\,\relax + \catcode\string`\string . \the\catcode\string`\.\relax} +\catcode\string`\` 12\relax +\catcode`\= 12\relax +\catcode`\^ 7\relax +\catcode`\~ \active\relax +\@makeother{\:} +\@makeother{\-} +\@makeother{\+} +\@makeother{\;} +\@makeother{\,} +\@makeother{\.} +% \end{macrocode} +%\end{macro} +% 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. +% \begin{macrocode} +\RequirePackage{xkeyval}[2005/05/07] +\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@tempboxa} +%\begin{macro}{\si@tempboxb} +%\begin{macro}{\si@tempboxc} +%\begin{macro}{\si@tempboxd} +% Some boxes are also needed. +% \begin{macrocode} +\newbox\si@tempboxa +\newbox\si@tempboxb +\newbox\si@tempboxc +\newbox\si@tempboxd +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@packagecheck} +%\begin{macro}{\si@blockpkgs} +%\begin{macro}{\si@checkpkgs} +% 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. +% \begin{macrocode} +\newcommand*{\si@blockpkgs}{SIunits,sistyle,siunits,SIstyle,% + unitsdef,fancyunits} +\newcommand*{\si@checkpkgs}{units,hepunits,fancynum} +\newcommand*{\si@packagecheck}{% + \begingroup + \@for\si@tempa:=\si@blockpkgs\do{ + \@ifpackageloaded{\si@tempa} + {\PackageError{siunitx} + {Package `\si@tempa' incompatible} + {The \si@tempa\space package and siunitx are + incompatible.\MessageBreak Use the + `emulate=\si@tempa' package option when loading + siunitx}} + {}} +% \end{macrocode} +% Some packages should not cause a clash, but are emulated and would +% be better handled that way. +% \begin{macrocode} + \@for\si@tempa:=\si@checkpkgs\do{% + \@ifpackageloaded{\si@tempa} + {\PackageWarning{siunitx} + {Consider loading the siunitx package + with\MessageBreak option `emulate=\si@tempa', rather + than\MessageBreak loading both \si@tempa\space and + siunitx}} + {}} + \endgroup} +% \end{macrocode} +% 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} +%\end{macro} +%\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 command sequence.\\ +%\cs{si@addtocsname}\marg{csname}\marg{tokens} +% \begin{macrocode} +\newtoks{\si@temptoks} +\newcommand*{\si@addtocsname}[2]{% + \@ifundefined{#1} + {\expandafter\gdef\csname #1\endcsname{#2}} + {\si@temptoks\expandafter\expandafter\expandafter{% + \csname #1\endcsname#2}% + \expandafter\xdef\csname #1\endcsname{\the\si@temptoks}}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@ifmtarg} +%\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@ifmtarg#1{% + \si@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil} + \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} +%\end{macro} +%\begin{macro}{\si@newrobustcmd} +%\begin{macro}{\si@newcommand} +%\begin{macro}{\si@newcmd} +%\begin{macro}{\si@xargdef} +% Some more copying, this time from \pkg{etoolbox}. Various macros +% need to be \emph{really} robust. This is achieved using the \eTeX\ +% \cs{protected} primitive in various places. However, it would be +% nice to have a \cs{protected} version of \cs{newcommand}. +% \pkg{etoolbox} has code for that, but to avoid needing to load it, +% the necessary stuff is copied here. The only changes form the +% original are names, and the use of \cs{newcommand*} for the +% \cs{si@newcommand} macro.\\ +%\cs{si@newcommand}\marg{macro}\\ +%\cs{si@newcmd}\marg{macro}\oarg{num-args}\\ +%\cs{si@xargdef}\marg{macro}\oarg{num-args}\oarg{default}\marg{def} +% \begin{macrocode} +\@ifpackageloaded{etoolbox} + {\let\si@newrobustcmd\newrobustcmd} + {\protected\def\si@newrobustcmd{% + \@ifstar + {\let\l@ngrel@x\protected\si@newcommand} + {\def\l@ngrel@x{\protected\long}\si@newcommand}} + \newcommand*{\si@newcommand}[1]{\@testopt{\si@newcmd#1}0} + \def\si@newcmd#1[#2]{% + \@ifnextchar[%] + {\si@xargdef#1[#2]} + {\@argdef#1[#2]}} + \long\def\si@xargdef#1[#2][#3]#4{% + \@ifdefinable#1{% + \expandafter\protected + \expandafter\def + \expandafter#1% + \expandafter{% + \expandafter\@testopt + \csname\string#1\endcsname{#3}}% + \expandafter\@yargdef + \csname\string#1\endcsname\tw@{#2}{#4}}}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\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{siunitx}{#1}% + \else + \PackageError{siunitx}{#1}{#2}% + \fi + \fi} +\newcommand*{\si@log@warn}[1]{% + \ifsi@lognone\else + \ifsi@logmin\else + \PackageWarning{siunitx}{#1}% + \fi + \fi} +\newcommand*{\si@log@inf}[1]{% + \ifsi@lognone\else + \ifsi@logmin\else + \PackageInfo{siunitx}{#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{siunitx}{#1}% + \fi + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +% +%\subsection{String comparison} +%\begin{macro}{\si@str@ifchrstr} +%\begin{macro}{\si@str@chrstr} +% At various points, the package needs to compare two strings, to +% find if one occurs in the other. The first test is if a single +% character is part of a second string; this is used, for example, to +% check that a character is valid as input. The first argument is +% not expanded further, but the second is two allow division into +% individual units.\\ +%\cs{si@str@ifchrstr}\marg{char}\marg{chars}\\ +%\cs{si@str@chrstr}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@str@ifchrstr}[2]{% + \begingroup + \si@switchfalse + \renewcommand*{\si@tempa}{#1}% + \protected@edef\si@tempb{#2}% + \expandafter\si@str@chrstr\si@tempb\@empty\@empty\@empty + \ifsi@switch + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\def\si@str@chrstr#1#2\@empty{% + \renewcommand*{\si@tempc}{#1}% + \ifx\si@tempa\si@tempc + \expandafter\si@switchtrue + \else + \ifx\@empty#2\@empty\else + \si@str@chrstr#2\@empty\@empty + \fi + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@str@ifonlychrs} +%\begin{macro}{\si@str@onlychrs} +% The second test builds on the first. Here, a check is made to see +% if the first string is made up only of characters from the second +% string. In this case, the first string is expanded before +% testing. The second string will be expanded by the internal +% character by character test.\\ +%\cs{si@str@ifonlychars}\marg{string}\marg{valid-chars}\\ +%\cs{si@str@onlychars}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@str@ifonlychrs}[2]{% + \begingroup + \si@switchtrue + \protected@edef\si@tempa{#1}% + \renewcommand*{\si@tempb}{#2}% + \expandafter\si@str@onlychrs\si@tempa\@empty\@empty\@empty + \ifsi@switch + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\def\si@str@onlychrs#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@tempb} + {}{\si@switchfalse}% + \ifx\@empty#2\@empty\else + \si@str@onlychrs#2\@empty\@empty + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +% +%\subsection{Option handling} +%\begin{macro}{\sisetup} +% To allow modification of options at run time, a setup macro is +% provided. +% \begin{macrocode} +\newcommand*{\sisetup}{\setkeys[si]{key}} +% \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]{key}{#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]{key}[si@]{#2}[#1]{#3}} +\newcommand*{\si@opt@cmdkeys}[2][]{% + \define@cmdkeys[si]{key}[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]{key}[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} +% \begin{macrocode} +\newcommand*{\si@opt@choicekey}[4][]{% + \define@choicekey*+[si]{key}{#2}[\si@tempa]{#3}[#1] + {#4\si@log@debug{Option #2 set to ##1}} + {\si@log@warn{Unknown value `##1' for option #2}}} +% \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]{% + \define@choicekey*+[si]{key}{#1}[\si@tempa]{#2}[#1] +% \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} + {\si@log@debug{Option #1 set to ##1}% + \expandafter\renewcommand\expandafter*\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} + {\si@log@debug{Option #1 set to ##1}% + \expandafter\renewcommand\expandafter*\expandafter{% + \csname si@#1\endcsname}{##1}} +% \end{macrocode} +% Finally, the initial value of the macro is set up. +% \begin{macrocode} + \expandafter\newcommand\expandafter*\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]{key}[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 siunitx 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]{key}{#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} +% 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} +% A quick method to set \opt{log=debug}. +% \begin{macrocode} +\si@opt@boolkey{debug} +% \end{macrocode} +%\begin{macro}{\ifsi@strict} +% It would be useful to be able to disable some keys, when strict +% interpretation of the rules is desired. This is a load-time +% option, and has to disable various options. +% \begin{macrocode} +\si@opt@boolkey[% + \ifsi@strict + \sisetup{ + obeymode=false, + obeybold=false, + obeyitalic=false, + mode=maths, + repeatunits=true, + trapambigerr=true, + trapambigfrac=true} + \@for\si@tempa:=obeyall,obeymode,obeyitalic,mode,unitmode,% + valuemode,textmode,obeybold,repeatunits,trapambigerr,% + trapambigfrac\do{% + \begingroup + \edef\si@tempb{\endgroup + \noexpand\si@opt@disablekey{\si@tempa} + {Option `\si@tempa' forbidden in strict mode}}% + \si@tempb} + \fi]{strict} +\AtEndOfPackage{ + \si@opt@disablekey{strict} + {Option `strict' only available when\MessageBreak + loading package}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@emulate} +% The \opt{emulate} option is used for back-compatibility mode; the +% option is only valid when loading \currpkg. +% \begin{macrocode} +\newcommand*{\si@emulate}{} +\si@opt@key{emulate}{\si@addtolist{\si@emulate}{#1}} +\AtEndOfPackage{ + \si@opt@disablekey{emulate} + {Option `emulate' only available when\MessageBreak + loading package}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@unitsep} +%\begin{macro}{\si@unitspace} +%\begin{macro}{\si@errspace} +%\begin{macro}{\si@valuesep} +% The two \opt{\dots sep} 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}, +% \opt{tightcdot}\footnote{Both \cs{cdot}-based options 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,none,comma,stop,fullstop,period, + times,tighttimes,cdot,tightcdot}{thin} +\si@opt@xchoicekey{unitspace}{space,thin,med,medium,thick, + none}{thin} +\si@opt@xchoicekey{errspace}{space,thin,med,medium,thick, + none}{none} +\si@opt@xchoicekey{valuesep} + {thin,med,medium,thick,none,comma,stop,fullstop,period, + times,tighttimes,cdot,tightcdot}{thin} +% \end{macrocode} +%\end{macro} +%\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, + times,tighttimes,cdot,tightcdot}{thin} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@decimalsymbol} +% 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{decimalsymbol}{comma,stop,fullstop,period, + cdot,tightcdot}{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,comma,stop,fullstop,period, + times,tighttimes,cdot,tightcdot}{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@numtextmode} +%\begin{macro}{\ifsi@unittextmode} +% The output of the package can be typeset using either text or maths +% mode fonts. Two switches are needed, for numbers and units. +% \begin{macrocode} +\newif\ifsi@numtextmode +\newif\ifsi@unittextmode +% \end{macrocode} +%\end{macro} +%\end{macro} +% The \opt{textmode} option has to set both flags. +% \begin{macrocode} +\si@opt@choicekey[true]{textmode}{true,false} + {\si@numtextmodefalse + \si@unittextmodefalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@numtextmodetrue + \si@unittextmodetrue + \fi} +% \end{macrocode} +% The \opt{mode} option applies to numbers and units. +% \begin{macrocode} +\si@opt@choicekey{mode}{math,maths,text} + {\si@numtextmodefalse + \si@unittextmodefalse + \renewcommand*{\si@tempb}{text}% + \ifx\si@tempa\si@tempb + \si@numtextmodetrue + \si@unittextmodetrue + \fi} +% \end{macrocode} +% Now the two options for numbers or units alone. +% \begin{macrocode} +\si@opt@choicekey{valuemode}{math,maths,text} + {\si@numtextmodefalse + \renewcommand*{\si@tempb}{text}% + \ifx\si@tempa\si@tempb + \si@numtextmodetrue + \fi} +\si@opt@choicekey{unitmode}{math,maths,text} + {\si@unittextmodefalse + \renewcommand*{\si@tempb}{text}% + \ifx\si@tempa\si@tempb + \si@unittextmodetrue + \fi} +% \end{macrocode} +%\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} +% 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} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@obeyitalic} +% Italic is slightly different to bold, as there is no convenient +% switch for maths. Thus a choice key is used, with the appropriate +% check. +% \begin{macrocode} +\si@opt@boolkey{obeyitalic} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@detectdisplay} +% For handling display mathematics, a setting is needed for whether to +% treat it differently from other maths. +% \begin{macrocode} +\si@opt@boolkey{detectdisplay} +% \end{macrocode} +%\end{macro} +% The option to obey all font switching commands is Boolean-like but +% needs alternative setup. +% \begin{macrocode} +\si@opt@choicekey[true]{obeyall}{true,false} + {\si@obeyboldfalse + \si@obeyitalicfalse + \si@obeymodefalse + \si@obeyfamilyfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@obeyboldtrue + \si@obeyitalictrue + \si@obeymodetrue + \si@obeyfamilytrue + \fi} +% \end{macrocode} +%\begin{macro}{\si@valuemathsrm} +%\begin{macro}{\si@valuemathssf} +%\begin{macro}{\si@valuemathstt} +%\begin{macro}{\si@unitmathsrm} +%\begin{macro}{\si@unitmathssf} +%\begin{macro}{\si@unitmathstt} +% 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{valuemathsrm,valuemathssf,valuemathstt} +\si@opt@cmdkeys{unitmathsrm,unitmathssf,unitmathstt} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +% To make life easier for the user, US spellings are provided for the +% maths keys. +% \begin{macrocode} +\si@opt@key{valuemathrm}{\sisetup{valuemathsrm=#1}} +\si@opt@key{valuemathsf}{\sisetup{valuemathssf=#1}} +\si@opt@key{valuemathtt}{\sisetup{valuemathstt=#1}} +\si@opt@key{unitmathrm}{\sisetup{unitmathsrm=#1}} +\si@opt@key{unitmathsf}{\sisetup{unitmathssf=#1}} +\si@opt@key{unitmathtt}{\sisetup{unitmathstt=#1}} +% \end{macrocode} +% The combined options are given, for setting numbers and units +% at the same time. +% \begin{macrocode} +\si@opt@key{mathsrm}{\sisetup{valuemathsrm=#1,unitmathsrm=#1}} +\si@opt@key{mathssf}{\sisetup{valuemathssf=#1,unitmathssf=#1}} +\si@opt@key{mathstt}{\sisetup{valuemathstt=#1,unitmathstt=#1}} +\si@opt@key{mathrm}{\sisetup{valuemathsrm=#1,unitmathsrm=#1}} +\si@opt@key{mathsf}{\sisetup{valuemathssf=#1,unitmathssf=#1}} +\si@opt@key{mathtt}{\sisetup{valuemathstt=#1,unitmathstt=#1}} +% \end{macrocode} +%\begin{macro}{\si@valuetextrm} +%\begin{macro}{\si@valuetextsf} +%\begin{macro}{\si@valuetexttt} +%\begin{macro}{\si@unittextrm} +%\begin{macro}{\si@unittextsf} +%\begin{macro}{\si@unittexttt} +% The same thing for text mode fonts. Once again the default values +% are pretty obvious. +% \begin{macrocode} +\si@opt@cmdkeys{valuetextrm,valuetextsf,valuetexttt} +\si@opt@cmdkeys{unittextrm,unittextsf,unittexttt} +\si@opt@key{textrm}{\sisetup{unittextrm=#1,valuetextrm=#1}} +\si@opt@key{textsf}{\sisetup{unittextsf=#1,valuetextsf=#1}} +\si@opt@key{texttt}{\sisetup{unittexttt=#1,valuetexttt=#1}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@numdigits} +%\begin{macro}{\si@numdecimal} +%\begin{macro}{\si@numexp} +%\begin{macro}{\si@numprod} +%\begin{macro}{\si@numgobble} +%\begin{macro}{\si@numsign} +%\begin{macro}{\si@numcloseerr} +%\begin{macro}{\si@numopenerr} +%\begin{macro}{\si@numaddn} +% 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{numdigits,numdecimal,numexp,numgobble,numsign,% + numcloseerr,numopenerr,numaddn,numprod} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@numvalid} +%\begin{macro}{\si@numextra} +% 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@numextra}{% + \si@numopenerr\si@numcloseerr\si@numaddn} +\newcommand*{\si@numvalid}{\si@numgobble\si@numexp\si@numsign + \si@numdecimal\si@numdigits\si@numextra\si@numprod} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@seperr} +%\begin{macro}{\ifsi@trapambigerr} +%\begin{macro}{\si@openerr} +%\begin{macro}{\si@closeerr} +% An option to control whether numerical error values are printed with +% or separate from the number. +% \begin{macrocode} +\si@opt@boolkey{seperr} +\si@opt@boolkey{trapambigerr} +\si@opt@cmdkeys{openerr,closeerr} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\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}{\ifsi@retainplus} +% An option to keep an explicit positive sign. +% \begin{macrocode} +\si@opt@boolkey{retainplus} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@expbase} +%\begin{macro}{\si@expproduct} +% The options for exponents are set up. +% \begin{macrocode} +\si@opt@xchoicekey{expproduct}{times,tighttimes, + cdot,tightcdot}{times} +\si@opt@xchoicekey{expbase}{ten}{ten} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@allowzeroexp} +% The package normally prevents \num[allowzeroexp]{e0}. +% \begin{macrocode} +\si@opt@boolkey{allowzeroexp} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@prefixproduct} +% The marker for multiplication in prefixes. +% \begin{macrocode} +\si@opt@xchoicekey{prefixproduct}{times,tighttimes,cdot, + tightcdot,none}{times} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@prefixbase} +% In the same area, the power for prefixes is variable. Here, two +% choices ar needed. +% \begin{macrocode} +\si@opt@xchoicekey{prefixbase}{ten,two}{ten} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@prefixsymbolic} +% Unit prefixes can be given as either symbols or numerically. +% \begin{macrocode} +\si@opt@boolkey{prefixsymbolic} +% \end{macrocode} +%\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} + {\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} +% \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} +% 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} +% \end{macrocode} +%\begin{macro}{\ifsi@tightpm} +%\begin{macro}{\si@pm} +% To reduce spacing, it might be necessary to use a ``tight'' $\pm$ +% sign. +% \begin{macrocode} +\si@opt@boolkey{tightpm} +\newcommand*{\si@pm}{% + \ifsi@tightpm + \si@fix@tightpm + \else + \si@fix@pm + \fi} +% \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} + {\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} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@ang@toarc} +%\begin{macro}{\ifsi@ang@todec} +% To control whether angles are formatted as decimals or +% degrees--minutes--seconds, a package option plus two switches are +% needed. The later format is referred to as ``\opt{arc}'' most +% readily. An option to leave the input unchanged is also provided. +% \begin{macrocode} +\newif\ifsi@ang@toarc +\newif\ifsi@ang@todec +\si@opt@choicekey[all]{angformat} + {dec,decimal,arc,dms,unchanged,none} + {\si@ang@toarcfalse + \si@ang@todecfalse + \renewcommand*{\si@tempb}{dec}% + \ifx\si@tempa\si@tempb + \si@ang@todectrue + \fi + \renewcommand*{\si@tempb}{decimal}% + \ifx\si@tempa\si@tempb + \si@ang@todectrue + \fi + \renewcommand*{\si@tempb}{arc}% + \ifx\si@tempa\si@tempb + \si@ang@toarctrue + \fi + \renewcommand*{\si@tempb}{dms}% + \ifx\si@tempa\si@tempb + \si@ang@toarctrue + \fi} +% \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}{\ifsi@strictarc} +% For the \cs{ang} macro, the default is to require two semi-colons +% in the input for arc angles. This is controlled here. +% \begin{macrocode} +\si@opt@boolkey{strictarc} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@tab@fixed} +%\begin{macro}{\si@tabnumalign} +%\begin{macro}{\si@tab@rfill@S} +%\begin{macro}{\si@tab@lfill@S} +% To determine the control of table alignment, two options are +% provided. The \opt{tabnumalign} option controls which centring method +% is used, and the fills used for achieving this. +% \begin{macrocode} +\newif\ifsi@tab@fixed +\si@opt@choicekey{tabnumalign} + {centredecimal,centerdecimal,right,left,centre,center} + {\si@tab@fixedtrue + \let\si@tab@rfill@S\hfil + \let\si@tab@lfill@S\hfil + \renewcommand*{\si@tempb}{right}% + \ifx\si@tempa\si@tempb + \let\si@tab@lfill@S\hfill + \fi + \renewcommand*{\si@tempb}{left}% + \ifx\si@tempa\si@tempb + \let\si@tab@rfill@S\hfill + \fi + \renewcommand*{\si@tempb}{centredecimal}% + \ifx\si@tempa\si@tempb + \expandafter\si@tab@fixedfalse + \fi + \renewcommand*{\si@tempb}{centerdecimal}% + \ifx\si@tempa\si@tempb + \expandafter\si@tab@fixedfalse + \fi} +\si@opt@key{tabalign}{\sisetup{tabnumalign=#1,tabtextalign=#1, + tabunitalign=#1}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@tabalignexp} +% A switch for aligning exponents. +% \begin{macrocode} +\si@opt@boolkey{tabalignexp} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@tab@mantprecnt} +%\begin{macro}{\si@tab@mantpostcnt} +%\begin{macro}{\si@tab@expprecnt} +%\begin{macro}{\si@tab@exppostcnt} +%\begin{macro}{\ifsi@tab@mantsign} +%\begin{macro}{\ifsi@tab@expsign} +% To process the format information, various internal +% number-processing macros are used. First, some +% storage areas are created. +% \begin{macrocode} +\newcount\si@tab@mantprecnt +\newcount\si@tab@mantpostcnt +\newcount\si@tab@expprecnt +\newcount\si@tab@exppostcnt +\newif\ifsi@tab@mantsign +\newif\ifsi@tab@expsign +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +% The input is split into a mantissa and exponent, then passed to a +% re-useable macro for further processing. +% \begin{macrocode} +\si@opt@cmdkey{tabformat} + {\si@num@fixpm + \renewcommand*{\si@num@arg}{tabformat data}% + \renewcommand*{\si@num@exp}{}% + \renewcommand*{\si@num@mant}{}% + \si@tab@mantsignfalse + \si@tab@expsignfalse + \si@switchfalse + \si@num@sepmantexp{#1}% +% \end{macrocode} +% When checking for a sign, the internal flag for finding but +% deleting a plus sign is used. +% \begin{macrocode} + \si@num@sepsign{mant}% + \ifx\@empty\si@num@mantsign\@empty + \ifsi@num@delplus + \expandafter\expandafter\expandafter\si@tab@mantsigntrue + \fi + \else + \expandafter\si@tab@mantsigntrue + \fi + \si@num@sepsign{exp}% + \ifx\@empty\si@num@expsign\@empty + \ifsi@num@delplus + \expandafter\expandafter\expandafter\si@tab@expsigntrue + \fi + \else + \expandafter\si@tab@expsigntrue + \fi + \si@opt@proctform{mant}% + \si@opt@proctform{exp}% +% \end{macrocode} +% The \opt{tabformat} input should really have both an integer and +% decimal part for the mantissa. If neither are present, an error is +% raised. If just the one part is missing, an warning seems more +% suitable. +% \begin{macrocode} + \ifnum\si@tab@mantpostcnt=\z@\relax + \ifnum\si@tab@mantprecnt=\z@\relax + \si@log@err{Empty mantissa argument for tabformat} + {The argument `#1' contains no valid entry for + a mantissa\MessageBreak It should be of the + form `m.n', where m and n are integers}% + \else + \si@log@warn{Argument of tabformat contains\MessageBreak + no decimal part}% + \fi + \else + \ifnum\si@tab@mantprecnt=\z@\relax + \si@log@warn{Argument of tabformat contains\MessageBreak + no integer part}% + \fi + \fi +% \end{macrocode} +% If \opt{tabformat} has been given with +% \opt{tabnumalign=centredecimal} active, then the alignment is +% changed to centred. +% \begin{macrocode} + \ifsi@tab@fixed\else + \sisetup{tabnumalign=centre}% + \fi + \let\pm\si@num@pm + \let\mp\si@num@mp} +% \end{macrocode} +%\begin{macro}{\si@opt@proctform} +% Processing the number further uses the \cs{si@num@digits} macro. +% The results are stored in the appropriate counter.\\ +%\cs{si@opt@proctform}\marg{mant/exp} +% \begin{macrocode} +\newcommand*{\si@opt@proctform}[1]{% + \renewcommand*{\si@num@predec}{}% + \renewcommand*{\si@num@postdec}{}% + \si@switchfalse + \expandafter\si@ifnotmtarg\expandafter{% + \csname si@num@#1\endcsname} + {\expandafter\expandafter\expandafter\si@num@digits + \csname si@num@#1\endcsname\@empty\@empty}% + \csname si@tab@#1precnt\endcsname\z@\relax + \csname si@tab@#1postcnt\endcsname\z@\relax + \ifx\@empty\si@num@predec\@empty\else + \csname si@tab@#1precnt\endcsname\si@num@predec\relax + \fi + \ifx\@empty\si@num@postdec\@empty\else + \csname si@tab@#1postcnt\endcsname\si@num@postdec\relax + \fi} +% \end{macrocode} +%\end{macro} +% The alignment of tabular material when not processed by \cs{num} +% needs to be available. +% \begin{macrocode} +\si@opt@choicekey{tabtextalign}{left,right,centre,center} +% \end{macrocode} +%\begin{macro}{\si@tab@rfill@t} +%\begin{macro}{\si@tab@lfill@t} +% By default, centring happens on both sides of the content of +% tabular material. +% \begin{macrocode} + {\let\si@tab@rfill@t\hfill + \let\si@tab@lfill@t\hfill + \renewcommand*{\si@tempb}{right}% + \ifx\si@tempa\si@tempb + \let\si@tab@rfill@t\relax + \fi + \renewcommand*{\si@tempb}{left}% + \ifx\si@tempa\si@tempb + \let\si@tab@lfill@t\relax + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +% The alignment of unit columns for tabular material has a similar +% control option. +% \begin{macrocode} +\si@opt@choicekey{tabunitalign}{left,right,centre,center} +% \end{macrocode} +%\begin{macro}{\si@tab@rfill@s} +%\begin{macro}{\si@tab@lfill@s} +% By default, centring happens on both sides of the content of +% tabular material. +% \begin{macrocode} + {\let\si@tab@rfill@s\hfill + \let\si@tab@lfill@s\hfill + \renewcommand*{\si@tempb}{right}% + \ifx\si@tempa\si@tempb + \let\si@tab@rfill@s\relax + \fi + \renewcommand*{\si@tempb}{left}% + \ifx\si@tempa\si@tempb + \let\si@tab@lfill@s\relax + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@fixdp} +%\begin{macro}{\si@num@dp} +% To allow control of rounding, two options are needed. One sets how +% many fixed digits to use, the second turns this function on and +% off. +% \begin{macrocode} +\si@opt@boolkey{fixdp} +\newcount\si@num@dp +\si@opt@key{dp}{% + \si@str@ifonlychrs{#1}{0123456789} + {} + {\si@log@err{Invalid input for dp option} + {The dp option must be given a positive integer}}% + \si@num@dp#1\relax + \si@fixdptrue} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@tabautofit} +% To apply rounding automatically in a table, a separate option is +% used. +% \begin{macrocode} +\si@opt@boolkey{tabautofit} +% \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@prespace} +% \begin{macrocode} +\si@opt@boolkey + [\si@unt@numfalse + \ifsi@prespace + \si@unt@numtrue + \fi] + {prespace} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@allowoptarg} +% For \unitsdef users, a method to absorb optional arguments is +% needed. +% \begin{macrocode} +\si@opt@boolkey{allowoptarg} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@frac} +%\begin{macro}{\ifsi@slash} +%\begin{macro}{\ifsi@stickyper} +% The option processing for formatting units with \cs{per} in them +% needs two switches. +% \begin{macrocode} +\newif\ifsi@slash +\newif\ifsi@frac +\si@opt@boolkey{stickyper} +\si@opt@choicekey[reciprocal]{per} + {reciprocal,rp,power,slash,frac,fraction} + {\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} +% \end{macrocode} +%\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}{\ifsi@repeatunits} +%\begin{macro}{\ifsi@addunitpower} +% An option is needed for cases where units should be repeated. +% \begin{macrocode} +\newif\ifsi@repeatunits +\newif\ifsi@addunitpower +\si@opt@choicekey[true]{repeatunits}{true,false,power} + {\si@repeatunitsfalse + \si@addunitpowerfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@repeatunitstrue + \fi + \renewcommand*{\si@tempb}{power}% + \ifx\si@tempa\si@tempb + \si@addunitpowertrue + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@trapambigfrac} +%\begin{macro}{\si@closefrac} +%\begin{macro}{\si@openfrac} +% Macros for the right and left brackets added to potentially +% ambiguous denominators. +% \begin{macrocode} +\si@opt@boolkey{trapambigfrac} +\si@opt@cmdkeys{closefrac,openfrac} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +% 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} +% \end{macrocode} +%\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 package} + \si@opt@disablekey{noload} + {Configuration files can only be used\MessageBreak + when loading package}} +\AtEndOfPackage{ + \si@opt@key{alsoload}{% + \@for\si@tempa:=#1\do{\si@loadfile{\si@tempa}}}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@colourunits} +%\begin{macro}{\ifsi@colourvalues} +%\begin{macro}{\si@unitcolour} +%\begin{macro}{\si@valuecolour} +% Colour is turned on and off using two switches and the appropriate +% options. US spellings are also provided. +% \begin{macrocode} +\si@opt@boolkey{colourunits} +\si@opt@boolkey{colourvalues} +\si@opt@choicekey[true]{colorunits} + {true,false} + {\si@colourunitsfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colourunitstrue + \fi} +\si@opt@choicekey[true]{colorvalues} + {true,false} + {\si@colourvaluesfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colourvaluestrue + \fi} +\si@opt@choicekey[true]{colorall} + {true,false} + {\si@colourvaluesfalse + \si@colourunitsfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colourunitstrue + \si@colourvaluestrue + \fi} +\si@opt@choicekey[true]{colourall} + {true,false} + {\si@colourvaluesfalse + \si@colourunitsfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colourunitstrue + \si@colourvaluestrue + \fi} +\si@opt@cmdkeys{unitcolour,valuecolour} +\si@opt@key{unitcolor}{\sisetup{unitcolour=#1}} +\si@opt@key{valuecolor}{\sisetup{valuecolour=#1}} +\si@opt@key{colour}{\sisetup{unitcolour=#1,valuecolour=#1}} +\si@opt@key{color}{\sisetup{unitcolour=#1,valuecolour=#1}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@colourneg} +%\begin{macro}{\si@negcolour} +% The set up for colouring negative numbers is similar. +% \begin{macrocode} +\si@opt@boolkey{colourneg} +\si@opt@choicekey[true]{colorneg} + {true,false} + {\si@colournegfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colournegtrue + \fi} +\si@opt@cmdkeys{negcolour} +\si@opt@key{negcolor}{\sisetup{negcolour=#1}} +% \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 \si{\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 \si{\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\kern-\scriptspace C} +\newcommand*{\si@mathscelsius}{% + \si@mathsdegree\kern-\scriptspace\mathrm{C}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@textringA} +%\begin{macro}{\si@mathsringA} +% The \si{\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 siunitx}} +% \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@loctolang} +% Handling typographic conventions needs three keys. \opt{locale} is +% used to set the locale, \opt{loctolang} to bind to \pkg{babel}. +% \begin{macrocode} +\si@opt@key{locale}{% + \si@loc@load{#1}% + \si@loc@set{#1}}% +\si@opt@key{loctolang}{\si@loc@ltol{#1}} +% \end{macrocode} +%\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 +% \units 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} +%\begin{macro}{\ifsi@old@noprefixcmds} +% The \pkg{hepunits} package only has one option. +% \begin{macrocode} +\si@opt@compatkey{hepunits}{noprefixcmds} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@old@english} +%\begin{macro}{\ifsi@old@french} +% \pkg{fancynum} provides a few options. First the rather oddly +% named \opt{english} and \opt{french} ones. +% \begin{macrocode} +\si@opt@compatkey{fancynum}{english} +\si@opt@compatkey{fancynum}{french} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@old@tight} +%\begin{macro}{\ifsi@old@loose} +% A couple for spacing multiplication. +% \begin{macrocode} +\si@opt@compatkey{fancynum}{tight} +\si@opt@compatkey{fancynum}{loose} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@old@thinspaces} +%\begin{macro}{\ifsi@old@commas} +%\begin{macro}{\ifsi@old@plain} +% Three for digit separation. +% \begin{macrocode} +\si@opt@compatkey{fancynum}{thinspaces} +\si@opt@compatkey{fancynum}{commas} +\si@opt@compatkey{fancynum}{plain} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@old@spaceqspace} +% The \pkg{fancyunits} package provides one option not available with +% \SIunits. +% \begin{macrocode} +\si@opt@compatkey{fancyunits}{spaceqspace} +% \end{macrocode} +%\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} +%\begin{macro}{\si@fix@tighttimes} +%\begin{macro}{\si@fix@tightcdot} +% 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} +\newcommand*{\si@fix@tighttimes}{\bgroup\times\egroup} +\newcommand*{\si@fix@tightcdot}{\bgroup\cdot\egroup} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\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@tightpm} +%\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@tightpm}{\bgroup\pm\egroup} +\newcommand*{\si@fix@mp}{\mp} +% \end{macrocode} +%\end{macro} +%\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\protected\expandafter\def + \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} +% 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 +% \si{\ohm} sign. +% \begin{macrocode} + \@ifpackageloaded{mathptmx}{} + {\renewcommand*{\si@textmu}{\textmu}% + \renewcommand*{\si@textOmega}{\textohm}}% +% \end{macrocode} +% The \si{\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} + \renewcommand*{\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} +% +%\subsection{Handling fractions} +%\begin{macro}{\si@frac} +%\begin{macro}{\si@frc@hook} +%\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{\si@frc@hook\frac{% + \expandafter\si@unt@out\expandafter{#1}}% + {\expandafter\si@unt@out\expandafter{#2}}}} +\let\si@frac\si@frc@frac +\newcommand*{\si@frc@hook}{} +\newcommand*{\si@frc@slash}[2]{% + \expandafter\si@unt@out\expandafter{#1}% + \si@out{\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} +%\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 \units 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\relax/\mkern-1mu\relax + \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@\relax + \selectfont{M}}% + \addtolength{\si@frc@textlen}{-\si@frc@ssuplen}% + \raisebox{\si@frc@textlen}{\fontsize\sf@size\z@\relax + \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} +% The \cs{si@frc@ugly} macro is needed to emulate the \opt{ugly} +% option in \units, where output depends on the current mode.\\ +%\cs{si@frc@ugly}\marg{numerator} +% \begin{macrocode} +\newcommand*{\si@frc@ugly}[1]{% + \renewcommand*{\si@tempa}{#1}% + \ifmmode + \expandafter\si@frc@frac + \else + \renewcommand*{\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@tempboxa=\hbox{\ensuremath{\si@valuesep}}% + \hskip-\wd\si@tempboxa\relax + \renewcommand*{\si@tempa}{}% + \fi + \expandafter\si@frc@slash + \fi + {\si@tempa}} +% \end{macrocode} +%\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@sf} +%\begin{macro}{\si@fam@tt} +% The package needs to know the maths font families in use. This is +% set right at the start of the document, after any changes can have +% been made by, for example, \pkg{fontspec}. +% \begin{macrocode} +\g@addto@macro{\document}{% + \ifdefined\mathsf + \setbox\si@tempboxa=\hbox{% + $\mathsf{\global\chardef\si@fam@sf=\fam}$}% + \else + \si@log@inf{\string\mathsf not found}% + \global\chardef\si@fam@sf=99\relax + \fi + \ifdefined\mathtt + \setbox\si@tempboxa=\hbox{% + $\mathtt{\global\chardef\si@fam@tt=\fam}$}% + \else + \si@log@inf{\string\mathtt not found}% + \global\chardef\si@fam@tt=99\relax + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@fam@ifbtext} +%\begin{macro}{\si@fam@ifbmaths} +% 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]{% + \renewcommand*{\si@tempa}{bold}% + \ifx\math@version\si@tempa + #1\fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@fam@ifbinline} +% For compatibility with \units, 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} +% 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} +%\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}{\si@fam@colourcmd} +% The colour command is set up. +% \begin{macrocode} +\AtBeginDocument{ + \@ifpackageloaded{color} + {\let\si@fam@colourcmd\color} + {\let\si@fam@colourcmd\@gobble}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\ifsi@fam@set} +%\begin{macro}{\ifsi@textmode} +% A marker is set up to check if font-matching has been taken place. +% A second flag is used to track the use of text mode. +% \begin{macrocode} +\newif\ifsi@fam@set +\newif\ifsi@textmode +% \end{macrocode} +%\end{macro} +%\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. To begin with, the +% mode to use is set up. +% \begin{macrocode} +\newcommand*{\si@fam@set}{% + \ifsi@out@num + \ifsi@numtextmode + \expandafter\expandafter\expandafter\si@textmodetrue + \else + \expandafter\expandafter\expandafter\si@textmodefalse + \fi + \else + \ifsi@unittextmode + \expandafter\expandafter\expandafter\si@textmodetrue + \else + \expandafter\expandafter\expandafter\si@textmodefalse + \fi + \fi +% \end{macrocode} +%\begin{macro}{\si@mathsrm} +%\begin{macro}{\si@mathssf} +%\begin{macro}{\si@mathstt} +%\begin{macro}{\si@textrm} +%\begin{macro}{\si@textsf} +%\begin{macro}{\si@texttt} +%\begin{macro}{\si@colourcmd} +%\begin{macro}{\si@colour} +% The appropriate font macros are now established, if necessary. +% \begin{macrocode} + \ifsi@fam@set\else + \let\si@colourcmd\@gobble + \ifsi@out@num + \let\si@mathsrm\si@valuemathsrm + \let\si@mathssf\si@valuemathssf + \let\si@mathstt\si@valuemathstt + \let\si@textrm\si@valuetextrm + \let\si@textsf\si@valuetextsf + \let\si@texttt\si@valuetexttt + \ifsi@colourvalues + \let\si@colourcmd\si@fam@colourcmd + \fi + \let\si@colour\si@valuecolour + \else + \let\si@mathsrm\si@unitmathsrm + \let\si@mathssf\si@unitmathssf + \let\si@mathstt\si@unitmathstt + \let\si@textrm\si@unittextrm + \let\si@textsf\si@unittextsf + \let\si@texttt\si@unittexttt + \ifsi@colourunits + \let\si@colourcmd\si@fam@colourcmd + \fi + \let\si@colour\si@unitcolour + \fi + \fi + \si@fam@settrue +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +% The temporary macros are needed for the \cs{ifx} tests, which need to +% be expanded once. +% \begin{macrocode} + \edef\si@tempa{\sfdefault}% + \edef\si@tempb{\ttdefault}% +% \end{macrocode} +%\begin{macro}{\si@fam@maths} +%\begin{macro}{\si@fam@text} +% The surrounding font family is only tested if matching is +% requested. First, the defaults are set up assuming no detection +% takes place. +% \begin{macrocode} + \expandafter\let\expandafter\si@fam@maths + \csname\si@mathsrm\endcsname + \expandafter\let\expandafter\si@fam@text + \csname\si@textrm\endcsname + \ifsi@obeyfamily + \si@log@debug{Font detection: checking font}% +% \end{macrocode} +%\end{macro} +%\end{macro} +% The detection code has to check the mode currently in operation. +% Display mathematics can be handled in two ways, so this means some +% code is repeated: it is spun out to separate routines. +% \begin{macrocode} + \ifmmode + \ifinner + \si@log@debug{Font detection: inline maths}% + \si@fam@dettext + \else + \si@log@debug{Font detection: display maths}% + \ifsi@detectdisplay + \si@fam@detmaths + \else + \si@fam@dettext + \fi + \fi + \else + \si@log@debug{Font detection: text}% + \si@fam@dettext + \fi + \else + \si@log@debug{Font detection: inactive}% + \fi +% \end{macrocode} +%\begin{macro}{\si@fam@bold} +% 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 command is set up with +% \cs{def}, as nested calls can occur. +% \begin{macrocode} + \def\si@fam@bold{\unboldmath\mdseries}% + \ifsi@obeybold + \si@log@debug{Weight detection: checking weight}% + \ifmmode + \ifdim\displaywidth>0pt\relax + \ifsi@detectdisplay + \expandafter\si@fam@ifbmaths + \else + \expandafter\si@fam@ifbtext + \fi + \si@fam@setbold + \else + \si@fam@ifbinline\si@fam@setbold + \fi + \else + \si@fam@ifbtext\si@fam@setbold + \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}}% + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@fam@detmaths} +%\begin{macro}{\si@fam@dettext} +% Two detection macros are needed for maths and text mode. This +% allows handling of the various combinations without needing too +% many code lines. +% \begin{macrocode} +\newcommand*{\si@fam@detmaths}{% + \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@mathsrm\endcsname + \expandafter\let\expandafter\si@fam@text + \csname\si@textrm\endcsname + \fi + \fi} +\newcommand*{\si@fam@dettext}{% + \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@mathsrm\endcsname + \expandafter\let\expandafter\si@fam@text + \csname\si@textrm\endcsname + \fi + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@fam@setbold} +%\begin{macro}{\si@fam@boldify} +% For setting bold, a couple of control macros are needed. +% \begin{macrocode} +\newcommand*{\si@fam@setbold}{% + \si@log@debug{Weight detection: bold weight}% + \let\si@fam@bold\si@fam@boldify} +\newcommand*{\si@fam@boldify}{\boldmath\bfseries} +% \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} +\si@newrobustcmd*{\num}[2][]{% + \begingroup + \sisetup{#1}% + \si@fam@mode + \si@num@intabfalse + \si@log@debug{Processing \string\num\space input `#2'}% + \expandafter\si@out@num\expandafter{\si@num{#2}}% + \endgroup} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@num@intab} +% A flag for processing inside a table is needed. +% \begin{macrocode} +\newif\ifsi@num@intab +% \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} +% 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. +% \begin{macrocode} + \si@num@fixpm + \begingroup + \makeatletter + \@makeother{\,}% + \@makeother{\.}% + \@makeother{\+}% + \@makeother{\-}% + \def~{}% + \def\,{}% + \catcode`\~=\active\relax + \catcode`\^=\active\relax + \everyeof{\noexpand}% + \endlinechar\m@ne + \protected@xdef\si@tempa{\scantokens{#1}}% + \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 input other than spaces, the processor first +% checks the validity of the input, then moves on to format it. +% \begin{macrocode} + \si@ifnotmtarg{\si@tempa} + {\si@num@ifvalid{\si@tempa} + {\si@num@format{\si@tempa}} +% \end{macrocode} +% The parser has to 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} + {\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\space macro\MessageBreak + (or derivative such as an `s' column)}% + {#1}}}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@fixpm} +%\begin{macro}{\si@num@pm} +%\begin{macro}{\si@num@mp} +%\begin{macro}{\pm} +%\begin{macro}{\mp} +% With certain packages loaded, there can be issues with \cs{pm} and +% \cs{mp}. To avoid this, the \eTeX\ \cs{protected} system is +% employed; this is only used within local groups. +% \begin{macrocode} +\newcommand*{\si@num@fixpm}{% + \let\si@num@pm\pm + \let\si@num@mp\mp + \protected\def\pm{\si@num@pm}% + \protected\def\mp{\si@num@mp}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@ifvalid} +%\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@ifvalid}\marg{chars}\\ +%\cs{si@num@valid}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@num@ifvalid}[1]{% + \begingroup + \si@switchtrue + \expandafter\si@num@valid#1\@empty\@empty + \ifsi@switch + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\def\si@num@valid#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numvalid} + {\ifx\@empty#2\@empty\else + \si@num@valid#2\@empty\@empty\@empty + \fi} + {\si@switchfalse}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@in} +%\begin{macro}{\si@num@out} +%\begin{macro}{\si@num@exp} +%\begin{macro}{\si@num@expsign} +%\begin{macro}{\si@num@mant} +%\begin{macro}{\si@num@mantsign} +%\begin{macro}{\si@num@err} +%\begin{macro}{\si@num@xpart} +%\begin{macro}{\si@num@ambig} +%\begin{macro}{\si@tab@out} +%\begin{macro}{\si@tab@expout} +% Various storage macros are needed. +% \begin{macrocode} +\newcommand*{\si@num@in}{} +\newcommand*{\si@num@out}{} +\newcommand*{\si@num@exp}{} +\newcommand*{\si@num@expsign}{} +\newcommand*{\si@num@mant}{} +\newcommand*{\si@num@mantsign}{} +\newcommand*{\si@num@err}{} +\newcommand*{\si@num@xpart}{} +\newcommand*{\si@num@ambig}{} +\newcommand*{\si@tab@out}{} +\newcommand*{\si@tab@expout}{} +% \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}{\ifsi@num@erropen} +% A flag is set up for tracking unclosed errors. +% \begin{macrocode} +\newif\ifsi@num@erropen +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@format} +%\begin{macro}{\si@num@arg} +% The number processor starts by saving |#1| (odd things happen +% otherwise). A hook is also provided to allow modifications by +% other macros.\\ +%\cs{si@num@format}\marg{num} +% \begin{macrocode} +\newcommand*{\si@num@arg}{} +\newcommand*{\si@num@format}[1]{% + \protected@edef\si@num@arg{#1}% + \si@log@debug{Formatting number `\si@num@arg'}% +% \end{macrocode} +%\end{macro} +% The storage areas are emptied. +% \begin{macrocode} + \renewcommand*{\si@num@in}{}% + \renewcommand*{\si@num@exp}{}% + \renewcommand*{\si@num@expsign}{}% + \renewcommand*{\si@num@mant}{}% + \renewcommand*{\si@num@mantsign}{}% + \renewcommand*{\si@num@err}{}% + \renewcommand*{\si@num@xpart}{}% +% \end{macrocode} +% Any ``x-part'' is now found, leaving the first number in +% \cs{si@num@in} and anything else in \cs{si@num@xpart}. +% \begin{macrocode} + \si@switchfalse + \expandafter\si@num@findxpart\si@num@arg\@empty\@empty +% \end{macrocode} +% The input is split into an mantissa and an exponent; the flag is +% used here to indicate if an exponent is found. The mantissa will +% end up in \cs{si@num@mant}, and the exponent in \cs{si@num@exp}. +% \begin{macrocode} + \si@switchfalse + \si@num@sepmantexp{\si@num@in}% +% \end{macrocode} +% The sign and value of the mantissa and exponent are separated; the +% mantissa is done after the exponent as this makes life easier when +% using the table-formatting fork. Checks are then needed, as a sign +% with no value is potentially-valid for the mantissa (for example +% \num{-e10}). +% \begin{macrocode} + \si@num@sepsign{exp}% + \si@num@sepsign{mant}% + \ifx\@empty\si@num@exp\@empty + \ifx\@empty\si@num@expsign\@empty\else + \si@log@warn{Sign but no number for `\si@num@arg'}% + \fi + \let\si@num@expsign\@empty + \fi + \ifx\@empty\si@num@mant\@empty + \ifx\@empty\si@num@mantsign\@empty\else + \ifx\@empty\si@num@exp\@empty + \si@log@warn{Sign but no number for `\si@num@arg'}% + \let\si@num@mantsign\@empty + \fi + \fi + \fi +% \end{macrocode} +% A check for negative mantissa values is made, to allow some +% colour-based trickery. +% \begin{macrocode} + \renewcommand*{\si@tempa}{{-}}% + \ifx\si@num@mantsign\si@tempa + \ifsi@colourneg + \expandafter\expandafter\expandafter\si@fam@colourcmd + \else + \expandafter\expandafter\expandafter\@gobble + \fi + \else + \expandafter\@gobble + \fi + {\si@negcolour}% +% \end{macrocode} +% The next stage is to process the remaining data, to find the +% decimal marker and reformat correctly. These two macros control +% this entire process. The exponent is processed first as this makes +% life easier when the system is used to typeset tabular +% material.\footnote{The contents of \cs{si@num@predec} and +% \cs{si@num@postdec} are needed for the mantissa.} +% \begin{macrocode} + \si@num@procnum{exp}% + \si@num@procnum{mant}% +% \end{macrocode} +% If the exponent is zero, then if might need to be deleted. +% \begin{macrocode} + \si@str@ifonlychrs{\si@num@exp}{0\si@numdecimal} + {\ifsi@allowzeroexp\else + \renewcommand*{\si@num@exp}{}% + \ifx\@empty\si@num@mant\@empty + \renewcommand*{\si@num@mant}{1}% + \fi + \fi}{}% +% \end{macrocode} +% To build up the number for typesetting, a rather complex series +% of tests is needed. First, the ``ambiguous error'' flag is +% set if there is an exponent and the package has been asked to check +% this. The same flag will already be true if a unit is present and +% checking is active. +% \begin{macrocode} + \ifx\@empty\si@num@exp\@empty\else + \ifsi@trapambigerr + \expandafter\expandafter\expandafter\si@num@ambigerrtrue + \fi + \fi +% \end{macrocode} +%\begin{macro}{\si@num@out} +%\begin{macro}{\si@tab@out} +%\begin{macro}{\si@tab@expout} +% Processing now divides, as when used with the |S| column some extra +% steps are needed. Inside a table, the macro \cs{si@tab@out} holds +% the part of the mantissa before the decimal sign. The post-decimal +% part then ends up in \cs{i@num@out}. On the other hand, under +% normal circumstances the entire mantissa should be copied to +% \cs{si@num@out}. +% \begin{macrocode} + \protected@edef\si@num@out{% + \ensuremath{{\si@num@mantsign}}\si@num@mant}% + \renewcommand*{\si@tempa}{num}% + \ifsi@num@intab + \protected@edef\si@tab@out{% + \ensuremath{{\si@num@mantsign}}\si@num@predec}% + \protected@edef\si@num@out{\si@num@postdec}% + \renewcommand*{\si@tempa}{tab}% + \fi +% \end{macrocode} +% Now there is the error part to handle. For tables, a check has to +% be made so the error ends up in the correct part of the number. The +% value of \cs{si@tempa} is used to track this., and so is set up +% here. +% \begin{macrocode} + \ifx\@empty\si@num@postdec\@empty\else + \renewcommand*{\si@tempa}{num}% + \fi + \ifx\@empty\si@num@err\@empty\else +% \end{macrocode} +% If there is an error, and it is begin separated, the problem arises +% of the potential for ambiguous values. This can only apply outside +% of a table, as \opt{seperr} is disabled in tabular material. +% \begin{macrocode} + \ifsi@seperr + \ifsi@num@ambigerr + \protected@edef\si@num@out{% + \ensuremath{\si@openerr}\si@num@out}% + \si@repeatunitsfalse + \expandafter\si@num@erropentrue + \else +% \end{macrocode} +% If there is an exponential part and an error, errors are being +% separated and ambiguous errors are not trapped, then there is work +% to do. The exponent part is added to the \emph{error}, and deleted +% from the mantissa if necessary. +% \begin{macrocode} + \ifsi@trapambigerr\else + \ifx\@empty\si@num@exp\@empty\else + \protected@edef\si@num@err{% + \si@num@err\expandafter\@car\si@numexp\@nil + \si@num@expsign\si@num@exp}% + \ifsi@repeatunits\else + \renewcommand*{\si@num@exp}{}% + \renewcommand*{\si@num@expsign}{}% + \fi + \fi + \fi + \fi +% \end{macrocode} +% If \opt{seperr} is not in force, the error and mantissa have to be +% recombined. This is handled so that the same macro deals with +% tables and normal processing. +% \begin{macrocode} + \else + \expandafter\protected@edef\csname + si@\si@tempa @out\endcsname{% + \si@num@out\ensuremath{\si@errspace}\ensuremath + {\si@openerr}\si@num@err\ensuremath{\si@closeerr}}% + \renewcommand*{\si@num@err}{}% + \fi + \fi +% \end{macrocode} +% The main reconstruction can now occur. This performs various +% checks on the validity of the input, and adds the necessary +% ``filler'' between the supplied data. +% \begin{macrocode} + \renewcommand*{\si@tempa}{num@out}% + \ifsi@num@erropen + \renewcommand*{\si@tempa}{num@ambig}% + \fi + \ifsi@num@intab + \renewcommand*{\si@tempa}{tab@expout}% + \fi + \ifx\@empty\si@num@exp\@empty + \ifx\@empty\si@num@mant\@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@numdigits')?}% + \renewcommand*\si@num@out{}% + \fi + \else + \ifx\@empty\si@num@mant\@empty\else + \expandafter\protected@edef\csname + si@\si@tempa\endcsname{% + \csname si@\si@tempa\endcsname\ensuremath{{}% + \si@expproduct{}}}% + \fi + \expandafter\protected@edef\csname + si@\si@tempa\endcsname{% + \csname si@\si@tempa\endcsname\si@expbase + \textsuperscript{\ensuremath{\si@num@expsign}% + \si@num@exp}}% + \fi +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +% With everything done, the result is output. +% \begin{macrocode} + \ifsi@num@intab\else + \expandafter\si@num@out + \fi +% \end{macrocode} +% If there is anything inside the ``x-part'', then there is now +% more work to do. +% \begin{macrocode} + \ifx\@empty\si@num@err\@empty\else + \expandafter\si@num@procerr + \fi + \ifsi@num@erropen + \expandafter\si@out@num\expandafter{% + \ensuremath{\si@closeerr}}% + \ifx\@empty\si@num@ambig\@empty\else + \expandafter\si@out@num\expandafter{\si@num@ambig}% + \renewcommand*{\si@num@ambig}{}% + \fi + \fi + \si@num@erropenfalse + \ifx\@empty\si@num@xpart\@empty\else + \expandafter\si@num@sepxpart + \fi} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@findxpart} +% Before processing the number, any multiplied parts have to be found +% and removed. As there can be more than one product sign, the +% building process here has no error checking. +% \begin{macrocode} +\def\si@num@findxpart#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numprod} + {\si@switchtrue\si@seperrfalse}{}% + \ifsi@switch + \protected@edef\si@num@xpart{\si@num@xpart#1}% + \else + \protected@edef\si@num@in{\si@num@in#1}% + \fi + \ifx\@empty#2\@empty\else + \si@num@findxpart#2\@empty + \fi} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@sepmantexp} +%\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@sepmantexp}\marg{num}\\ +%\cs{si@num@mantexp}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@num@sepmantexp}[1]{% + \expandafter\si@num@mantexp#1\@empty\@empty} +\def\si@num@mantexp#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numgobble} + {\si@log@debug{Gobbling `#1' in \si@num@arg}} + {\si@str@ifchrstr{#1}{\si@numexp} + {\ifsi@switch + \si@log@err{Duplicate exponent marker found} + {Only a single exponent character \MessageBreak + (from the list `\si@numexp')\MessageBreak may + occur in a numerical argument}% + \else + \si@log@debug{Exponent marker `#1' found in + `\si@num@arg'}% + \fi + \si@switchtrue}% + {\ifsi@switch + \expandafter\si@num@addexp + \else + \expandafter\si@num@addmnt + \fi + {#1}}}% +% \end{macrocode} +% If the recursion has not bottomed out, another loop occurs. +% \begin{macrocode} + \ifx\@empty#2\@empty + \expandafter\@gobble + \else + \expandafter\si@num@sepmantexp + \fi + {#2}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@addmnt} +%\begin{macro}{\si@num@addexp} +%\begin{macro}{\si@num@addmntexp} +% To allow \cs{expandafter} use in the above, the actual addition to the +% appropriate macro is handled here.\\ +%\cs{si@num@addmnt}\marg{char}\\ +%\cs{si@num@addexp}\marg{char}\\ +%\cs{si@num@addmntexp}\marg{char}\marg{mant/exp}\marg{text} +% \begin{macrocode} +\newcommand*{\si@num@addmnt}[1]{% + \si@num@addmntexp{#1}{mant}{mantissa}} +\newcommand*{\si@num@addexp}[1]{% + \si@num@addmntexp{#1}{exp}{exponent}} +\newcommand*{\si@num@addmntexp}[3]{% + \si@log@debug{Adding `#1' to #3 for `\si@num@arg'}% + \expandafter\protected@edef\csname si@num@#2\endcsname{% + \csname si@num@#2\endcsname#1}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@sepsign} +% The input is now tested for a sign. If one exists, it is +% transferred into the \cs{si@num@}|#1sign| storage macro, with the +% remained of the number in \cs{si@num@}|#1|. The only check made +% directly here is that there is something to process.\\ +%\cs{si@num@sepsign}\marg{mant/exp} +% \begin{macrocode} +\newcommand*{\si@num@sepsign}[1]{% + \expandafter\ifx\expandafter\@empty + \csname si@num@#1\endcsname\@empty + \expandafter\@gobble + \else + \expandafter\si@num@gensign + \fi + {#1}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@gensign} +% The sign generator starts by calling the procedure to check if the +% input contains a valid one- or two-digit sign. The results are +% returned as \cs{si@num@sign} and \cs{si@num@value}.\\ +%\cs{si@num@gensign}\marg{mant/exp} +% \begin{macrocode} +\newcommand*{\si@num@gensign}[1]{% + \expandafter\expandafter\expandafter\si@num@findsign + \csname si@num@#1\endcsname\@empty\@empty +% \end{macrocode} +% If no sign has been found, then there may be a need to add one +% anyway. +% \begin{macrocode} + \ifx\@empty\si@num@sign\@empty + \ifx\@empty\si@num@value\@empty + \expandafter\expandafter\expandafter\@gobble + \else + \expandafter\expandafter\expandafter\si@num@addsign + \fi + \else + \expandafter\@gobble + \fi + {#1}% +% \end{macrocode} +% The appropriate storage areas are now assigned. +% \begin{macrocode} + \expandafter\let\csname si@num@#1sign\endcsname\si@num@sign + \expandafter\let\csname si@num@#1\endcsname\si@num@value} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@findsign} +%\begin{macro}{\si@num@sign} +%\begin{macro}{\si@num@value} +% 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@findsign}\meta{char}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@num@sign}{} +\def\si@num@findsign#1#2#3\@empty{% + \si@num@delplusfalse + \si@str@ifchrstr{#1}{\si@numsign}{% + \si@str@ifchrstr{#2}{\si@numsign}{% + \if +#1% + \if -#2% + \si@log@debug{Found sign combination +- for + `\si@num@arg'}% + \renewcommand*{\si@num@sign}{{\si@pm}}% + \else + \si@log@inf{Unknown sign combination `#1#2'}% + \renewcommand*{\si@num@sign}{{#1#2}}% + \fi + \else + \if -#1% + \if +#2% + \si@log@debug{Found sign combination -+ for + `\si@num@arg'}% + \renewcommand*{\si@num@sign}{{\mp}}% + \else + \si@log@inf{Unknown sign combination `#1#2'}% + \renewcommand*{\si@num@sign}{{#1#2}}% + \fi + \else + \si@log@inf{Unknown sign combination `#1#2'}% + \renewcommand*{\si@num@sign}{{#1#2}}% + \fi + \fi + \protected@edef\si@num@value{#3}}% +% \end{macrocode} +% Only one valid sign character. +% \begin{macrocode} + {\si@log@debug{Found single sign character `#1' for + `\si@num@arg'}% + \renewcommand*{\si@num@sign}{{#1}}% + \if +#1% + \ifsi@retainplus\else + \expandafter\expandafter\expandafter\si@num@killsign + \fi + \fi + \protected@edef\si@num@value{#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'}% + \renewcommand*{\si@num@sign}{}% + \protected@edef\si@num@value{#1#2#3}}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@num@delplus} +%\begin{macro}{\si@num@killsign} +% A simple spin-out to remove a plus sign. A flag is set as it might +% be useful to know this. +% \begin{macrocode} +\newif\ifsi@num@delplus +\newcommand*{\si@num@killsign}{% + \si@num@delplustrue + \renewcommand*{\si@num@sign}{}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@addsign} +%\begin{macro}{\si@num@asign} +% The macro to add a sign to an unsigned number has to check whether +% this is a mantissa or an exponent. The result is still placed in +% \cs{si@num@sign} for ease of processing later.\\ +%\cs{si@num@addsign}\marg{mant/exp}\\ +%\cs{si@num@asign}\marg{mantissa/exponent} +% \begin{macrocode} +\newcommand*{\si@num@addsign}[1]{% + \begingroup + \renewcommand*{\si@tempa}{#1}% + \renewcommand*{\si@tempb}{mant}% + \ifx\si@tempa\si@tempb + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup + {\ifsi@num@signmant + \expandafter\si@num@asign + \else + \expandafter\@gobble + \fi + {mantissa}} + {\ifsi@num@signexp + \expandafter\si@num@asign + \else + \expandafter\@gobble + \fi + {exponent}}} +\newcommand*{\si@num@asign}[1]{% + \let\si@num@sign\si@sign + \si@log@debug{Adding sign \si@sign\space to #1 for + `\si@num@arg'}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@procnum} +% The control macro for processing the number (plus any extra +% characters). +%\cs{si@num@finddigits}\marg{mant/exp} +% \begin{macrocode} +\newcommand*{\si@num@procnum}[1]{% + \expandafter\ifx\expandafter\@empty + \csname si@num@#1\endcsname\@empty + \expandafter\@gobble + \else + \expandafter\si@num@finddigits + \fi + {#1}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@predec} +%\begin{macro}{\si@num@postdec} +% Two new storage areas are defined. +% \begin{macrocode} +\newcommand*{\si@num@predec}{} +\newcommand*{\si@num@postdec}{} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@finddigits} +% The core digit processor divides the number into the parts before +% and after the decimal point marker. The temporary switch is used +% to indicate finding a decimal marker.\\ +%\cs{si@num@finddigits}\marg{mant/exp} +% \begin{macrocode} +\newcommand*{\si@num@finddigits}[1]{% + \renewcommand*{\si@num@predec}{}% + \renewcommand*{\si@num@postdec}{}% + \si@switchfalse + \expandafter\expandafter\expandafter\si@num@digits + \csname si@num@#1\endcsname\@empty\@empty +% \end{macrocode} +% Tests are now made to see if padding zeros are needed. The +% trailing test needs to verify if a decimal marker was found, as +% well as if a zero is needed. +% \begin{macrocode} + \ifx\@empty\si@num@predec\@empty + \ifsi@num@padlead + \expandafter\expandafter\expandafter\si@num@addprezero + \fi + \fi + \ifx\@empty\si@num@postdec\@empty + \ifsi@num@padtrail + \ifsi@switch + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \si@num@addpostzero + \fi + \fi + \fi +% \end{macrocode} +% The next checks to make concern input validity in a more +% mathematical sense. First, if the number is zero, then no sign +% should be given under any circumstances. Then leading zeros need +% to be removed from the input. This is slightly complicated by the +% potential presence of ``extra'' characters. +% \begin{macrocode} + \si@num@unsign{#1}% + \ifx\@empty\si@num@predec\@empty + \else + \expandafter\si@num@nozero + \fi +% \end{macrocode} +% A sanity check is made to ensure that the supplied number consisted +% of more than a decimal marker. +% \begin{macrocode} + \ifx\@empty\si@num@predec\@empty + \ifx\@empty\si@num@postdec\@empty + \expandafter\expandafter\expandafter\@gobble + \else + \expandafter\expandafter\expandafter\si@num@sepdigits + \fi + \else + \expandafter\si@num@sepdigits + \fi + {#1}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@digits} +%\begin{macro}{\si@num@pre} +%\begin{macro}{\si@num@post} +%\begin{macro}{\si@num@prepost} +% The \cs{si@num@digits} macro compares each character in the input +% against the list of characters valid at this stage: numbers, +% decimal markers and ``extra'' characters. +%\cs{si@num@digits}\meta{char}\meta{chars}\cs{@empty}\\ +%\cs{si@num@pre}\marg{num}\\ +%\cs{si@num@pre}\marg{num}\\ +%\cs{si@num@prepost}\marg{num}\marg{pre/post}\marg{text} +% \begin{macrocode} +\def\si@num@digits#1#2\@empty{% + \si@str@ifchrstr{#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'}% + \expandafter\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@str@ifchrstr{#1}{\si@numsign} + {\si@log@err{Misplaced sign character + `#1' 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; this is +% ``spun out'' to avoid problems with expansion of the switch code. +% \begin{macrocode} + {\ifsi@switch + \expandafter\si@num@post + \else + \expandafter\si@num@pre + \fi + {#1}}}% + \ifx\@empty#2\@empty\else + \si@num@digits#2\@empty\@empty + \fi} +\newcommand*{\si@num@pre}[1]{% + \si@num@prepost{#1}{pre}{integer}} +\newcommand*{\si@num@post}[1]{% + \si@num@prepost{#1}{post}{decimal}} +\newcommand*{\si@num@prepost}[3]{% + \expandafter\protected@edef\csname si@num@#2dec\endcsname{% + \csname si@num@#2dec\endcsname#1}% + \si@log@debug{Adding `#1' to #3 part for `\si@num@arg'}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@addprezero} +%\begin{macro}{\si@num@addpostzero} +%\begin{macro}{\si@num@addpzero} +% A similar set of macros are used for the padding zeros.\\ +%\cs{si@num@addpzero}\marg{pre/post}\marg{text} +% \begin{macrocode} +\newcommand*{\si@num@addprezero}{% + \si@num@addpzero{pre}{leading}} +\newcommand*{\si@num@addpostzero}{% + \si@num@addpzero{post}{trailing}} +\newcommand*{\si@num@addpzero}[2]{% + \si@log@debug{Adding #2 zero for `\si@num@arg'}% + \@namedef{si@num@#1dec}{0}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@unsign} +%\begin{macro}{\si@num@nosign} +% The trap for a sign with zero numerical input is made. First, a +% check is made to see if there is a sign to worry about. The pre- +% and post-decimal parts are then examined, to see if they contain +% something other than ``0'' or an extra character.\\ +%\cs{si@num@unsign}\marg{mant/exp}\\ +%\cs{si@num@nosign}\marg{mant/exp} +% \begin{macrocode} +\newcommand*{\si@num@unsign}[1]{% + \expandafter\ifx\expandafter\@empty + \csname si@num@#1sign\endcsname\@empty + \expandafter\@gobble + \else + \expandafter\si@num@nosign + \fi + {#1}} +\newcommand*{\si@num@nosign}[1]{% + \begingroup + \si@switchtrue + \si@str@ifonlychrs{\si@num@predec\si@num@postdec}{0} + {\si@switchfalse}{}% + \ifsi@switch + \aftergroup\@gobble + \else + \aftergroup\@firstofone + \fi + \endgroup + {\si@log@debug{Zero value: removing any sign}% + \ifsi@ang@sign\else + \@namedef{si@num@#1sign}{}% + \fi}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@nozero} +% A very short test for a totally zero pre-decimal component. +% \begin{macrocode} +\newcommand*{\si@num@nozero}{% + \si@str@ifonlychrs{\si@num@predec}{0} + {\renewcommand*{\si@num@predec}{0}}{}} +% \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.\\ +%\cs{si@num@sepdigits}\marg{mant/exp} +% \begin{macrocode} +\newcommand*{\si@num@sepdigits}[1]{% +% \end{macrocode} +% First an overall check is needed for additional characters. By +% altering the contents of \cs{si@numextra}, the same code can be +% shared by two different checks. +% \begin{macrocode} + \begingroup + \let\si@numextra\si@numaddn + \protected@edef\si@tempa{\si@num@predec\si@num@postdec}% + \si@num@ifextra{\si@tempa} + {\aftergroup\@gobble} + {\aftergroup\@firstofone}% + \endgroup +% \end{macrocode} +% Separation of the error in a number from the number itself is only +% attempted for the mantissa. +% \begin{macrocode} + {\renewcommand*{\si@tempb}{mant}% + \renewcommand*{\si@tempc}{#1}% + \ifx\si@tempb\si@tempc + \expandafter\si@num@checkerr + \fi}% +% \end{macrocode} +% If both parts of the number contain only digits, then any rounding +% can be attempted if there is no error part. Otherwise, the input +% must be left alone. +% \begin{macrocode} + \protected@edef\si@tempa{\si@num@predec\si@num@postdec}% + \expandafter\si@str@ifonlychrs\expandafter{\si@tempa} + {0123456789} + {\ifx\@empty\si@num@err\@empty + \ifsi@fixdp + \expandafter\expandafter\expandafter\si@num@fixdp + \fi + \fi}{}% +% \end{macrocode} +% If the pre-decimal part contains nothing except numbers, then +% digit separation is carried out. +% \begin{macrocode} + \si@num@ifextra{\si@num@predec}{} + {\expandafter\si@num@int\expandafter{\si@num@predec}}% +% \end{macrocode} +% A decision is made about the decimal sign, then digit separation +% occurs on the post-decimal part of the number. +% \begin{macrocode} + \renewcommand*{\si@tempc}{}% + \ifx\@empty\si@num@postdec\@empty\else + \si@num@decimalhook + \renewcommand*{\si@tempc}{% + \ensuremath{{\si@decimalsymbol}}}% + \si@num@ifextra{\si@num@postdec}{} + {\expandafter\si@num@dec\expandafter{\si@num@postdec}}% + \fi +% \end{macrocode} +% The construction is finalised by re-combining the number. +% \begin{macrocode} + \expandafter\protected@edef\csname si@num@#1\endcsname + {\si@num@predec\si@tempc\si@num@postdec}} +% \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'}% + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\def\si@num@extra#1#2\@empty{% + \ifx\@empty#1\@empty\else + \si@str@ifchrstr{#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}{\ifsi@num@ambigerr} +%\begin{macro}{\si@num@checkerr} +% When separating out an error from a number, the first step is to +% see if there is a decimal part to the number. If so, any error +% must be in that part of the decimal part; it is not possible to +% have an error starting in the integer part and continuing into the +% decimal part. +% \begin{macrocode} +\newif\ifsi@num@ambigerr +\newcommand*{\si@num@checkerr}{% + \ifx\@empty\si@num@postdec\@empty + \expandafter\si@num@preerr + \else + \expandafter\si@num@posterr + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@preerr} +% Errors in integers are easy to handle. After finding the error, +% the result is simply stored in the error macro \cs{si@num@err}. +% \begin{macrocode} +\newcommand*{\si@num@preerr}{% + \si@num@seperr{pre}% + \ifx\@empty\si@tempb\@empty\else + \expandafter\renewcommand\expandafter*\expandafter + \si@num@err\expandafter{\si@tempb}% + \fi} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@posterr} +%\begin{macro}{\si@num@psterr} +% Life is more complex for an error in the decimal part. This is +% found, then it may need zero-filling or the insertion of a decimal +% point. This depends on whether the number of error digits is +% larger than the number of post-decimal digits. +% \begin{macrocode} +\newcommand*{\si@num@posterr}{% + \si@num@seperr{post}% + \ifx\@empty\si@tempb\@empty\else + \ifsi@seperr + \expandafter\expandafter\expandafter\si@num@psterr + \else + \let\si@num@err\si@tempb + \fi + \fi} +\newcommand*{\si@num@psterr}{% + \si@num@cntdigits{\si@tempb}% + \si@tempcntb\si@tempcnta\relax + \si@num@cntdigits{\si@num@postdec}% + \ifnum\si@tempcnta<\si@tempcntb\relax + \expandafter\si@num@largeerr + \else + \expandafter\si@num@smallerr + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@seperr} +%\begin{macro}{\si@num@finderr} +% The usual hand-off is made for searching for an error.\\ +%\cs{si@num@seperr}\marg{pre/post}\\ +%\cs{si@num@finderr}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@num@seperr}[1]{% + \si@switchfalse + \renewcommand*{\si@tempa}{}% + \renewcommand*{\si@tempb}{}% + \expandafter\expandafter\expandafter\si@num@finderr + \csname si@num@#1dec\endcsname\@empty\@empty + \ifx\@empty\si@tempb\@empty\else + \expandafter\let\csname si@num@#1dec\endcsname\si@tempa + \fi} +\def\si@num@finderr#1#2\@empty{% +% \end{macrocode} +% First a check for the opening character of an error. +% \begin{macrocode} + \si@str@ifchrstr{#1}{\si@numopenerr} +% \end{macrocode} +% If the switch is set when an error is found, then something is +% wrong. +% \begin{macrocode} + {\ifsi@switch + \si@log@err{Invalid error in number} + {The numerical argument \si@num@arg\space has two (or + more)\MessageBreak error-opening characters}% + \else + \expandafter\si@switchtrue + \fi} +% \end{macrocode} +% The end-of-error character has to be the last item of the input, +% and an error needs to start before it ends. +% \begin{macrocode} + {\si@str@ifchrstr{#1}{\si@numcloseerr} + {\ifsi@switch + \ifx\@empty#2\@empty\else + \si@log@err{Invalid error in number} + {The numerical argument \si@num@arg\space has an + error-closing before the last character}% + \fi + \else + \si@log@err{Invalid error in number} + {The numerical argument \si@num@arg\space has an + error-closing character\MessageBreak but no + error-opening one}% + \fi} +% \end{macrocode} +% The input must be a digit. It is stored in the appropriate area. +% \begin{macrocode} + {\ifsi@switch + \expandafter\si@num@addtmpb + \else + \expandafter\si@num@addtmpa + \fi + {#1}}}% + \ifx\@empty#2\@empty\else + \si@num@finderr#2\@empty + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@addtmpa} +%\begin{macro}{\si@num@addtmpb} +%\begin{macro}{\si@num@addtmp} +% Some quick methods for adding to the temporary macros with \cs{if} +% expansion.\\ +%\cs{si@num@addtmpa}\marg{num}\\ +%\cs{si@num@addtmpb}\marg{num}\\ +%\cs{si@num@addtmp}\marg{a/b}\marg{num} +% \begin{macrocode} +\newcommand*{\si@num@addtmpa}[1]{\si@num@addtmp{a}{#1}} +\newcommand*{\si@num@addtmpb}[1]{\si@num@addtmp{b}{#1}} +\newcommand*{\si@num@addtmp}[2]{% + \expandafter\protected@edef\csname si@temp#1\endcsname{% + \csname si@temp#1\endcsname#2}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@cntdigits} +%\begin{macro}{\si@num@cntdgt} +% A recursive system for counting the number of characters in a given +% input; only used here to count digits in a number.\\ +%\cs{si@num@cntdigits}\marg{num}\\ +%\cs{si@num@cntdgt}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@num@cntdigits}[1]{% + \si@tempcnta\z@\relax + \expandafter\si@num@cntdgt#1\@empty\@empty} +\def\si@num@cntdgt#1#2\@empty{% + \ifx\@empty#1\@empty\else + \advance\si@tempcnta\@ne\relax + \fi + \ifx\@empty#2\@empty\else + \expandafter\si@num@cntdgt#2\@empty + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@smallerr} +%\begin{macro}{\si@num@serr} +% For handling an error with no more digits than the post-decimal +% part of a number, zero-padding is undertaken before adding a +% decimal sign and (possibly) leading zero. +% \begin{macrocode} +\newcommand*{\si@num@smallerr}{% + \si@tempcntb\si@tempcnta\relax + \si@num@serr + \protected@edef\si@num@err{% + \ifsi@num@padlead0\fi\expandafter\@car\si@numdecimal\@nil + \si@tempb}} +\newcommand*{\si@num@serr}{% + \si@num@cntdigits{\si@tempb}% + \ifnum\si@tempcnta=\si@tempcntb\relax\else + \protected@edef\si@tempb{0\si@tempb}% + \expandafter\si@num@serr + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@largeerr} +%\begin{macro}{\si@num@lerr} +%\begin{macro}{\si@num@movedigit} +% When the error has more digits than the decimal part, some +% shuffling is needed.\\ +%\cs{si@num@movedigit}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@num@largeerr}{% + \renewcommand*{\si@tempa}{}% + \si@tempcntb\si@tempcnta\relax + \si@num@lerr + \protected@edef\si@num@err{% + \si@tempa\ensuremath{\si@decimalsymbol}\si@tempb}} +\newcommand*{\si@num@lerr}{% + \si@num@cntdigits{\si@tempb}% + \ifnum\si@tempcnta=\si@tempcntb\relax\else + \expandafter\si@num@movedigit\si@tempb\@empty\@empty + \si@num@lerr + \fi} +\def\si@num@movedigit#1#2\@empty{% + \protected@edef\si@tempa{\si@tempa#1}% + \protected@edef\si@tempb{#2}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@fixdp} +% The test for fixing decimal places starts by counting up the number +% of decimal digits. The number is then padded, rounded or left +% alone. +% \begin{macrocode} +\newcommand*{\si@num@fixdp}{% + \si@num@cntdigits{\si@num@postdec}% + \ifx\@empty\si@num@postdec\@empty + \si@tempcnta\z@\relax + \fi + \ifnum\si@tempcnta>\si@num@dp\relax + \expandafter\si@num@round + \else + \ifnum\si@tempcnta<\si@num@dp\relax + \expandafter\expandafter\expandafter\si@num@pad + \fi + \fi} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@pad} +%\begin{macro}{\si@num@pd} +% Padding a number is a relatively easy matter. The number of digits +% is increased by adding ``$0$'' recursively. +% \begin{macrocode} +\newcommand*{\si@num@pad}{% + \si@log@debug{Padding to \the\si@num@dp\space digits}% + \loop\ifnum\si@tempcnta<\si@num@dp\si@num@pd\repeat} +\newcommand*{\si@num@pd}{% + \advance\si@tempcnta\@ne\relax + \protected@edef\si@num@postdec{\si@num@postdec0}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@round} +%\begin{macro}{\si@num@prernd} +%\begin{macro}{\si@num@postrnd} +%\begin{macro}{\si@num@reverse} +%\begin{macro}{\si@num@rev} +% Rounding a number is more complicated. The main macro here relies +% on several others. The initial stage is to reverse the entire +% number, to make life easier. This is then undone by the other +% macros as the output is constructed.\\ +%\cs{si@num@reverse}\marg{macro}\\ +%\cs{si@num@rev}\meta{char}\meta{chars}\cs{@empty} +% \begin{macrocode} +\newcommand*{\si@num@prernd}{} +\newcommand*{\si@num@postrnd}{} +\newcommand*{\si@num@round}{% + \si@log@debug{Rounding to \the\si@num@dp\space digits}% + \si@num@reverse{\si@num@postdec}% + \si@num@reverse{\si@num@predec}% + \let\si@num@prernd\si@num@predec + \let\si@num@postrnd\si@num@postdec + \renewcommand*{\si@num@predec}{}% + \renewcommand*{\si@num@postdec}{}% + \si@switchfalse + \si@num@rnd} +\newcommand*{\si@num@reverse}[1]{% + \renewcommand*{\si@tempa}{}% + \expandafter\si@num@rev#1\@empty\@empty + \let#1\si@tempa} +\def\si@num@rev#1#2\@empty{% + \edef\si@tempa{#1\si@tempa}% + \ifx\@empty#2\@empty\else + \si@num@rev#2\@empty\@empty + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@rnd} +%\begin{macro}{\si@num@rndpre} +%\begin{macro}{\si@num@rndpost} +% The core looping macro of the system simply divides the flow +% between rounding before and after the decimal. The two routines +% are quite similar, but have subtly different requirements. Both +% take one character at a time from the input, increment if there is +% a carry digit, check its value, and add to the output string. +% \begin{macrocode} +\newcommand*{\si@num@rnd}{% + \ifnum\si@tempcnta>\z@\relax + \expandafter\si@num@rndpost + \else + \expandafter\si@num@rndpre + \fi} +\newcommand*{\si@num@rndpre}{% + \expandafter\edef\expandafter\si@tempa\expandafter{% + \expandafter\@car\si@num@prernd\@nil}% + \expandafter\edef\expandafter\si@num@prernd\expandafter{% + \expandafter\@cdr\si@num@prernd\@nil}% + \si@tempcntb\si@tempa\relax + \ifsi@switch + \advance\si@tempcntb\@ne\relax + \fi + \si@switchfalse + \ifnum\si@tempcntb=10\relax + \si@tempcntb\z@\relax + \expandafter\expandafter\expandafter\si@switchtrue + \fi + \edef\si@num@predec{\the\si@tempcntb\si@num@predec}% + \ifx\@empty\si@num@prernd\@empty + \ifsi@switch + \edef\si@num@predec{1\si@num@predec}% + \fi + \else + \expandafter\si@num@rnd + \fi} +\newcommand*{\si@num@rndpost}{% + \expandafter\edef\expandafter\si@tempa\expandafter{% + \expandafter\@car\si@num@postrnd\@nil}% + \expandafter\edef\expandafter\si@num@postrnd\expandafter{% + \expandafter\@cdr\si@num@postrnd\@nil}% + \si@tempcntb\si@tempa\relax + \ifsi@switch + \advance\si@tempcntb\@ne\relax + \fi + \si@switchfalse + \ifnum\si@tempcnta>\si@num@dp\relax + \ifnum\si@tempcntb>4\relax + \expandafter\expandafter\expandafter\si@switchtrue + \fi + \else + \ifnum\si@tempcntb=10\relax + \si@tempcntb\z@\relax + \expandafter\expandafter\expandafter\si@switchtrue + \fi + \edef\si@num@postdec{\the\si@tempcntb\si@num@postdec}% + \fi + \advance\si@tempcnta\m@ne\relax + \si@num@rnd} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@int} +% 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]{% + \renewcommand*{\si@num@predec}{}% + \ifsi@sepfour + \si@num@intfmt{}#1\@empty\@empty\@empty + \else + \si@num@iffive{#1} + {\si@num@intfmt{}#1\@empty\@empty\@empty} + {\renewcommand*{\si@num@predec}{#1}}% + \fi} +% \end{macrocode} +%\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} +% 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@num@predec{\si@num@predec#1#2#3}% + \if\relax#4\relax\else + \protected@edef\si@num@predec{% + \si@num@predec\ensuremath{\noexpand\si@digitsep}}% + \expandafter\si@num@intsep\expandafter#4% + \fi} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@dec} +%\begin{macro}{\si@num@decfmt} +% 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]{% + \renewcommand*{\si@num@postdec}{}% + \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@num@postdec{\si@num@postdec#1}}% + \fi} +\newcommand*{\si@num@decfmt}[4]{% + \protected@edef\si@num@postdec{\si@num@postdec#1#2#3}% + \ifx\@empty#4\@empty% + \else + \protected@edef\si@num@postdec{% + \si@num@postdec\ensuremath{\noexpand\si@digitsep}}% + \expandafter\si@num@decfmt\expandafter#4% + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@num@procerr} +% Any error is recycled to to formatted correctly. The $\pm$ sign, +% and any unit, are also added. +% \begin{macrocode} +\newcommand*{\si@num@procerr}{% + \si@num@addunit + \ensuremath{\si@pm}% + \expandafter\si@num\expandafter{\si@num@err}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@sepxpart} +% A similar approach for numbers containing products, except the +% first token of the input has to be deleted. +% \begin{macrocode} +\newcommand*{\si@num@sepxpart}{% + \si@num@addunit + \ensuremath{\times}% + \expandafter\expandafter\expandafter\si@num\expandafter + \expandafter\expandafter{% + \expandafter\@cdr\si@num@xpart\@nil}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@num@addunit} +% A short macro to add units if needed. +% \begin{macrocode} +\newcommand*{\si@num@addunit}{% + \si@unt@numtrue + \ifx\@empty\si@unt@unitarg\@empty\else + \ifsi@repeatunits + \si@unt@printunit{\si@unt@unitarg}% + \fi + \fi} +% \end{macrocode} +%\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} +\si@newrobustcmd*{\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. Here, the input must either contain no +% semi-colons or two 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{% + \let\ifsi@ang@fixdp\ifsi@fixdp + \si@fixdpfalse + \si@ifmtarg{#4} + {\si@log@debug{Angle argument contains no + semi-colons:\MessageBreak decimal angle}% + \si@ang@dec{#1}{}{}} + {\si@log@debug{Angle argument contains + semi-colons:\MessageBreak degree-minute-second angle}% + \renewcommand*{\si@tempa}{#4}% + \renewcommand*{\si@tempb}{;;}% + \ifx\si@tempa\si@tempb\else + \ifsi@strictarc + \renewcommand*{\si@tempb}{;}% + \ifx\si@tempa\si@tempb + \si@log@err{Insufficient semi-colons in argument + of \string\ang}{The argument of + \string\ang\space must contain either no + semi-colons or exactly two}% + \else + \si@log@err{Excess semi-colons in argument of + \string\ang}{The argument of \string\ang\space + must contain either no semi-colons or exactly + two}% + \fi + \fi + \fi + \si@ang@arc{#1}{#2}{#3}}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@ang@dec} +%\begin{macro}{\si@ang@arc} +% Two tests are needed, in case the input format requires conversion. +% \begin{macrocode} +\newcommand*{\si@ang@dec}{% + \let\si@ang@fix\@gobble + \ifsi@ang@toarc + \expandafter\si@ang@dectoarc + \else + \sisetup{padangle=none}\expandafter\si@ang@typeset + \fi} +\newcommand*{\si@ang@arc}{% + \let\si@ang@fix\si@ang@arcfix + \ifsi@ang@todec + \expandafter\si@ang@arctodec + \else + \expandafter\si@ang@typeset + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\ifsi@ang@fixdp} +%\begin{macro}{\si@ang@fix} +%\begin{macro}{\si@ang@arcfix} +% A check is needed so that rounding and zero filling are only +% applied to the seconds of an arc angle. +%\cs{si@ang@fix}\marg{degree/minute/second}\\ +%\cs{si@ang@arcfix}\marg{degree/minute/second} +% \begin{macrocode} +\newif\ifsi@ang@fixdp +\newcommand*{\si@ang@fix}[1]{} +\newcommand*{\si@ang@arcfix}[1]{% + \renewcommand*{\si@tempa}{second}% + \renewcommand*{\si@tempb}{#1}% + \ifx\si@tempa\si@tempb + \ifsi@ang@fixdp + \expandafter\expandafter\expandafter\si@fixdptrue + \else + \expandafter\expandafter\expandafter\si@fixdpfalse + \fi + \else + \expandafter\si@fixdpfalse + \fi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@ang@ifnum} +% A test is required to check that the provided data consists of +% numbers which can actually be processed by \TeX. This is achieved +% by using \cs{si@num@ifvalid} with a fixed list of valid +% characters.\\ +%\cs{si@ang@ifnum}\marg{num} +% \begin{macrocode} +\newcommand*{\si@ang@ifnum}[1]{% + \begingroup + \renewcommand*{\si@numvalid}{0123456789,.+-}% + \ifx\@empty#1\@empty + \aftergroup\@firstoftwo + \else + \si@num@ifvalid{#1} + {\aftergroup\@firstoftwo} + {\aftergroup\@secondoftwo}% + \fi + \endgroup} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@ang@arctodec} +% The business end of converting arcs to decimal angles is relatively +% straight-forward, as it only needs one calculation. This has to be +% divided up, so that disaster does not strike if there are empty +% arguments; a check is also needed for the sign of the angle, +% so that the maths makes sense.\\ +%\cs{si@ang@arctodec}\marg{dec}\marg{min}\marg{sec} +% \begin{macrocode} +\newcommand*{\si@ang@arctodec}[3]{% + \let\si@ang@fix\@gobble + \ifnum\si@num@dp>\thr@@\relax + \si@num@dp\thr@@\relax + \fi + \si@fixdptrue + \si@ang@ifnum{#1} + {\si@ang@ifnum{#2} + {\si@ang@ifnum{#3} + {\si@tempdima\z@\relax + \renewcommand*{\si@tempa}{+}% + \ifx\@empty#1\@empty\else + \si@tempdima #1pt\relax + \fi + \ifdim\si@tempdima<\z@\relax + \renewcommand*{\si@tempa}{-}% + \fi + \ifx\@empty#2\@empty\else + \si@tempdima\dimexpr\si@tempdima\si@tempa + #2pt/60\relax + \fi + \ifdim\si@tempdima<\z@\relax + \renewcommand*{\si@tempa}{-}% + \else + \fi + \ifx\@empty#3\@empty\else + \si@tempdima\dimexpr\si@tempdima\si@tempa + #3pt/3600\relax + \fi + \sisetup{numdecimal=.}% + \expandafter\si@ang@typeset\expandafter{% + \strip@pt\si@tempdima}{}{}} + {\si@ang@notnum{#1}{#2}{#3}}} + {\si@ang@notnum{#1}{#2}{#3}}} + {\si@ang@notnum{#1}{#2}{#3}}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@ang@dectoarc} +%\begin{macro}{\si@ang@arcdeg} +%\begin{macro}{\si@ang@arcmin} +%\begin{macro}{\si@ang@arcsec} +% The conversion macros for decimal to arc angles. Life is more +% complex here than above, even without the need for checks on the +% input. A number of separation steps are needed, each of which +% needs a separate macro.\\ +%\cs{si@ang@dectoarc}\marg{angle} +% \begin{macrocode} +\newcommand*{\si@ang@dectoarc}[1]{% + \let\si@ang@fix\si@ang@arcfix + \si@ang@fixdptrue + \ifnum\si@num@dp>\@ne\relax + \si@num@dp\@ne\relax + \fi + \si@ang@ifnum{#1} + {\si@tempdima\z@\relax + \ifx\@empty#1\@empty\else + \si@tempdima #1pt\relax + \fi + \si@ang@sepint{deg}% + \si@tempdima\dimexpr\si@tempdima *60\relax + \si@ang@sepint{min}% + \edef\si@tempa{\the\dimexpr\si@tempdima *60\relax}% + \expandafter\newcommand\expandafter*\expandafter{% + \expandafter\si@ang@arcsec\expandafter}\expandafter{% + \expandafter\si@ang@strippt\si@tempa}% +% \end{macrocode} +% A check is made for ``0.0'' seconds, which should be converted to +% simply ``0''. +% \begin{macrocode} + \si@tempdima\z@\relax + \edef\si@tempa{\the\si@tempdima}% + \expandafter\renewcommand\expandafter*\expandafter{% + \expandafter\si@tempa\expandafter}\expandafter{% + \expandafter\si@ang@strippt\si@tempa}% + \ifx\si@tempa\si@ang@arcsec + \renewcommand*{\si@ang@arcsec}{0}% + \fi +% \end{macrocode} +% To avoid adding zeros where they are not required, each part of the +% angle is now checked. +% \begin{macrocode} + \renewcommand*{\si@tempa}{0}% + \ifx\si@ang@arcdeg\si@tempa + \si@temptoks{{}}% + \else + \si@temptoks{{\si@ang@arcdeg}}% + \fi + \ifx\si@ang@arcmin\si@tempa + \si@temptoks\expandafter{\the\si@temptoks{}}% + \else + \si@temptoks\expandafter{\the\si@temptoks{% + \si@ang@arcmin}}% + \fi + \ifx\si@ang@arcsec\si@tempa + \si@temptoks\expandafter{\the\si@temptoks{}}% + \else + \si@temptoks\expandafter{\the\si@temptoks{% + \si@ang@arcsec}}% + \fi + \expandafter\si@ang@typeset\the\si@temptoks} + {\si@ang@notnum{#1}{}{}}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@ang@sepint} +%\begin{macro}{\si@ang@sint} +%\begin{macro}{\si@ang@strippt} +% Support macros for the conversion from decimal to arc angles.\\ +%\cs{si@ang@sepint}\marg{deg/min}\\ +%\cs{si@ang@sint}\meta{chars}.\meta{chars}\cs{@empty}\\ +%\cs{si@ang@strippt}\meta{chars}\texttt{pt} +% \begin{macrocode} +\newcommand*{\si@ang@sepint}[1]{% + \expandafter\si@ang@sint\the\si@tempdima\@empty + \expandafter\let\csname si@ang@arc#1\endcsname\si@tempa} +\def\si@ang@sint#1.#2\@empty{% + \renewcommand*{\si@tempa}{#1}% + \si@tempdima 0.#2\relax} +\begingroup + \catcode`P=12 + \catcode`T=12 + \lowercase{ + \renewcommand*{\si@tempa}{% + \def\si@ang@strippt##1PT{##1}}} + \expandafter\endgroup +\si@tempa +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@ang@notnum} +% Not a \TeX\ number: complain.\\ +%\cs{si@ang@notnum}\marg{dec}\marg{min}\marg{sec} +% \begin{macrocode} +\newcommand*{\si@ang@notnum}[3]{% + \si@log@warn{Angle `#1;#2;#3' is not a pure + number:\MessageBreak output will be as given}% + \si@ang@typeset{#1}{#2}{#3}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ifsi@ang@sign} +% A flag is needed to leave signs along for angles, where +% a zero value may still need a sign. +% \begin{macrocode} +\newif\ifsi@ang@sign +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@ang@typeset} +% The \cs{si@ang@set} macro does the work of assigning the degrees, +% minutes and seconds, and actually typesetting the result.\\ +%\cs{si@ang@typeset}\marg{num}\marg{num}\marg{num} +% \begin{macrocode} +\newcommand*{\si@ang@typeset}[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@decimalsymbol{\si@decimalsymbol}% +% \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'}% + \si@ang@ifnum{#3} + {\ifdim #3 pt=\z@\relax\else + \si@ang@signtrue + \fi}{}% + \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'}% + \si@ang@ifnum{#2} + {\ifdim #2 pt=\z@\relax\else + \si@ang@signtrue + \fi}{}% + \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\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@fix{#1}% + \si@ang@movesign{#1}% + \si@num{#2}% + \endgroup} +\newcommand*{\si@ang@signlessnum}[2]{% + \begingroup + \si@ang@fix{#1}% + \si@ang@movesign{#1}% + \sisetup{addsign=none}% + \si@num{#2}% + \endgroup} +% \end{macrocode} +%\end{macro} +%\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@decimalsymbol} +% A mechanism is needed to handle moving the angle unit signs for the +% \opt{astroang} option. This requires two steps, producing the sign +% over the decimal sign and preventing duplicate symbols appearing. +% This is based on a suggestion from Morten H{\o}gholm, but using +% \TeX\ internals as \cs{makebox} does not work here. Note the need +% to correct for \cs{scriptspace} (thanks to Donald Arseneau for +% that).\\ +%\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@decimalsymbol}{% + \setbox\si@tempboxa=\hbox{% + \ensuremath{{\si@ang@decimalsymbol}}}% + \si@tempdima\wd\si@tempboxa\relax + \setbox\si@tempboxb=\hbox to\z@{% + \hss\unhbox\si@tempboxa\hss}% + \setbox\si@tempboxa=\hbox{% + \csname si@sym@#1\endcsname\hskip-\scriptspace}% + \si@tempdimb\wd\si@tempboxa\relax + \setbox\si@tempboxc=\hbox to\z@{% + \hss\unhbox\si@tempboxa\hss}% + \setbox\si@tempboxd=\hbox{% + \usebox\si@tempboxb\usebox\si@tempboxc}% + \ifdim\si@tempdima>\si@tempdimb\relax + \setbox\si@tempboxa=\hbox to\si@tempdima{% + \hss\unhbox\si@tempboxd\hss}% + \else + \setbox\si@tempboxa=\hbox to\si@tempdimb{% + \hss\unhbox\si@tempboxd\hss}% + \fi + \usebox\si@tempboxa% + \ifdim\si@tempdima>\si@tempdimb\relax\else + \hskip\scriptspace + \fi}% + \renewcommand*{\si@num@decimalhook}{\expandafter\aftergroup + \csname si@ang@kill#1\endcsname}}% +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +% +%\subsection{Tabular material} +% 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 letters |D|, |N| and |R| are +% already taken by the other packages for numerical alignment, and so +% |S| ($=$ \currpkg) is chosen for the alignment of numerical +% material. The package also provides a second column type, |s|, for +% units (the letter is taken from \cs{si}). +% +%\begin{macro}{\NC@list} +% The first part of the job is to create the basic apparatus for the +% columns using the \pkg{array} package. To prevent any issues with +% the content of optional arguments to the new columns, so +% rearrangement is needed. The \currpkg columns have to come +% \emph{before} any other column definitions. This is achieved by +% saving \cs{NC@list}, creating the columns then restoring the list +% with the appropriate extra parts. +% \begin{macrocode} +\edef\si@tempa{% + \noexpand\NC@do S\noexpand\NC@do s\the\NC@list} +\newcolumntype{S}{} +\newcolumntype{s}{} +\NC@list\expandafter{\si@tempa} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\NC@rewrite@S} +%\begin{macro}{\NC@rewrite@s} +% Following the \numprint approach, the \cs{NC@rewrite@\ldots} macros +% are rewritten to collect the cell contents. 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. 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. +% Passing an argument at this stage will cause issues, so each column +% type needs its own \texttt{begin} and \texttt{end} macros.\\ +%\cs{NC@rewrite@S}\oarg{options} +%\cs{NC@rewrite@s}\oarg{options} +% \begin{macrocode} +\renewcommand*{\NC@rewrite@S}[1][]{% + \edef\si@tempa{\the\@temptokena + >{\noexpand\si@tab@begin@S[#1]}c% + <{\noexpand\si@tab@end@S}}% + \@temptokena\expandafter{\si@tempa}% + \NC@find} +\renewcommand*{\NC@rewrite@s}[1][]{% + \edef\si@tempa{\the\@temptokena + >{\noexpand\si@tab@begin@s[#1]}c% + <{\noexpand\si@tab@end@s}}% + \@temptokena\expandafter{\si@tempa}% + \NC@find} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@tab@begin@S} +%\begin{macro}{\si@tab@begin@s} +%\begin{macro}{\si@tab@gettok} +% At this stage, the appropriate token gathering macro is activated, +% and the common starting macro is called. For the |S| column, the +% \opt{seperr} is turned off, and an error is set to be raised by any +% ``x-part'' input.\\ +%\cs{si@tab@begin@S}\oarg{options}\\ +%\cs{si@tab@begin@s}\oarg{options} +% \begin{macrocode} +\newcommand*{\si@tab@begin@S}[1][]{% + \si@log@debug{Processing S column cell contents}% + \let\si@tab@gettok\si@tab@gettok@S + \si@seperrfalse + \renewcommand*{\si@num@sepxpart}{% + \si@log@err{Multiple numbers not allowed in + tables\MessageBreak Only the first number used} + \@ehb}% + \si@tab@begin[#1]} +\newcommand*{\si@tab@begin@s}[1][]{% + \si@log@debug{Processing s column cell contents}% + \let\si@tab@gettok\si@tab@gettok@s + \si@tab@begin[#1]} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@tab@toks} +%\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@toks +\newtoks\si@tab@pretoks +\newtoks\si@tab@posttoks +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@tab@begin} +% The macro for gathering up input is common to both column types. It +% uses the method for \pkg{rccol}; the cell contents are collected by +% a second macro, which then stores all of the data in an appropriate +% token store.\\ +%\cs{si@tab@begin}\oarg{options} +% \begin{macrocode} +\newcommand*{\si@tab@begin}[1][]{% + \begingroup + \sisetup{#1}% + \si@tab@toks{}% + \si@tab@pretoks{}% + \si@tab@posttoks{}% + \si@switchfalse + \si@tab@gettok} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@tab@gettok@S} +%\begin{macro}{\si@tab@othertok} +%\begin{macro}{\si@tab@gettok@s} +%\begin{macro}{\si@tab@next} +% The two collection macros are very similar. Both compare the +% current input with a list of possible fixed values; this is pretty +% much a direct copy of \numprint. If the input is not on the list +% of choices, it is processed as data for \currpkg to handle. The +% |S| column does an additional check, to allow division of a number +% from any text. For the |s| column, everything gets added to +% \cs{si@tab@toks} for later processing. Two separate macros are +% needed here as the fixed values are dependant on the column type, +% and awkward errors pop up if a combined approach is tried.\\ +%\cs{si@tab@gettok@S}\marg{cell-contents}\\ +%\cs{si@tab@othertok}\marg{chars}\\ +%\cs{si@tab@gettok@s}\marg{cell-contents} +% \begin{macrocode} +\newcommand*{\si@tab@gettok@S}[1]{% + \ifx\tabularnewline#1\relax + \let\si@tab@next\si@tab@newline@S + \else + \ifx\end#1\relax + \let\si@tab@next\end + \else + \ifx\si@tab@end@S#1\relax + \let\si@tab@next\si@tab@end@S + \else + \ifx\endtabular#1\relax + \let\si@tab@next\endtabular + \else + \ifx\csname#1\relax + \let\si@tab@next\csname + \else + \ifx\relax#1\relax + \let\si@tab@next\relax + \else + \let\si@tab@next\si@tab@gettok@S + \si@str@ifchrstr{#1}{\si@numvalid} + {\si@switchtrue + \si@log@debug{Found numerical cell + contents `#1'}% + \si@tab@toks=\expandafter{% + \the\si@tab@toks#1}} + {\si@log@debug{Found other cell contents + \string#1}% + \si@tab@othertok{#1}}% + \fi + \fi + \fi + \fi + \fi + \fi + \si@tab@next} +\newcommand*{\si@tab@othertok}[1]{% + \ifsi@switch + \si@tab@posttoks=\expandafter{\the\si@tab@posttoks#1}% + \else + \si@tab@pretoks=\expandafter{\the\si@tab@pretoks#1}% + \fi} +\newcommand*{\si@tab@gettok@s}[1]{% + \ifx\tabularnewline#1\relax + \let\si@tab@next\si@tab@newline@s + \else + \ifx\end#1\relax + \let\si@tab@next\end + \else + \ifx\si@tab@end@s#1\relax + \let\si@tab@next\si@tab@end@s + \else + \ifx\endtabular#1\relax + \let\si@tab@next\endtabular + \else + \ifx\csname#1\relax + \let\si@tab@next\csname + \else + \ifx\relax#1\relax + \let\si@tab@next\relax + \else + \let\si@tab@next\si@tab@gettok@s + \si@tab@toks=\expandafter{% + \the\si@tab@toks#1}% + \si@log@debug{Found cell contents `#1'}% + \fi + \fi + \fi + \fi + \fi + \fi + \si@tab@next} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@tab@end@S} +%\begin{macro}{\si@tab@rfill} +%\begin{macro}{\si@tab@lfill} +%\begin{macro}{\si@tab@end@s} +% The end macros are similar, but with some minor differences. In +% both cases, the appropriate filling is carried out. For the |S| +% column, this depends on the cell contents, whereas for the |s| +% column the fill is always the same. Output of a number in an |S| +% column is only attempted if one was found, otherwise the cell +% contents will all be in \cs{si@tab@pretoks}. +% \begin{macrocode} +\newcommand*{\si@tab@end@S}{% + \ifsi@switch + \let\si@tab@lfill\si@tab@lfill@S + \let\si@tab@rfill\si@tab@rfill@S + \else + \let\si@tab@rfill\si@tab@rfill@t + \let\si@tab@lfill\si@tab@lfill@t + \fi + \si@tab@lfill\relax + \the\si@tab@pretoks + \ifsi@switch + \expandafter\si@tab@numout + \fi + \the\si@tab@posttoks + \si@tab@rfill\relax + \endgroup} +\newcommand*{\si@tab@end@s}{% + \si@tab@lfill@s\relax + \expandafter\si\expandafter{\the\si@tab@toks}% + \si@tab@rfill@s\relax + \endgroup} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@tab@newline@S} +%\begin{macro}{\si@tab@newline@s} +%\begin{macro}{\si@tab@end} +% If the column is the final one read, then some work is needed with +% the \cs{tabularnewline} macro. Output has to happen \emph{before} +% the new line, then the ending macro is made safe before calling the +% \LaTeX\ line end. If the user makes use of the primitive \cs{cr} +% then this problem does not arise as \cs{si@tab@end@\ldots} is +% called correctly. +% \begin{macrocode} +\newcommand*{\si@tab@newline@S}{% + \si@tab@end@S + \hfil\relax + \let\si@tab@end\si@tab@end@S + \renewcommand*{\si@tab@end@S}{\let\si@tab@end@S\si@tab@end}% + \tabularnewline} +\newcommand*{\si@tab@newline@s}{% + \si@tab@end@s + \hfil\relax + \let\si@tab@end\si@tab@end@s + \renewcommand*{\si@tab@end@s}{\let\si@tab@end@s\si@tab@end}% + \tabularnewline} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +% +%\begin{macro}{\si@tempcnta} +%\begin{macro}{\si@tempcntb} +% The second part of the tabular code is concerned with typesetting +% numbers in |S| columns with the appropriate alignment. 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}{% + \si@num@intabtrue + \ifsi@tab@fixed + \ifsi@tabautofit + \si@num@dp\si@tab@mantpostcnt\relax + \expandafter\expandafter\expandafter\si@fixdptrue + \fi + \fi + \expandafter\si@num\expandafter{\the\si@tab@toks}% + \si@tab@format} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@tab@prebox} +%\begin{macro}{\si@tab@postbox} +%\begin{macro}{\si@tab@midbox} +%\begin{macro}{\si@tab@expbox} +% The various boxes needed for the column centring are declared +% Unlike the \pkg{dcolumn} original, private boxes are used here. +% \cs{si@tempboxa} 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@midbox +\newbox\si@tab@postbox +\newbox\si@tab@expbox +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@tab@format} +% The formatting set up is taken from \pkg{dcolumn}, but with +% control of the output form the stored information. The choice +% of a variable (decimal-centred) column or fixed width boxes is +% made. +% \begin{macrocode} +\newcommand*{\si@tab@format}{% + \ifsi@tab@fixed + \expandafter\si@tab@fixed + \else + \expandafter\si@tab@unfixed + \fi +% \end{macrocode} +% A hack to get the correct colour everywhere without too much work. +% \begin{macrocode} + \ifsi@colourvalues + \si@fam@colourcmd{\si@valuecolour}% + \fi + \box\si@tab@prebox\box\si@tab@midbox\box\si@tab@postbox% + \box\si@tab@expbox} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@tab@unfixed} +% When the width of the contents is not fixed, the system creates a +% block in which the decimal marker is always at the centre. This is +% achieved by placing the pre- and post-decimal parts of the number +% in boxes. The wider one is then used to set up the column width, +% by resizing the other one. +% \begin{macrocode} +\newcommand*\si@tab@unfixed{% + \si@log@debug{Using variable width S column}% + \protected@edef\si@num@out{\si@num@out\si@tab@expout}% + \setbox\si@tab@prebox=\hbox + {\expandafter\si@out@num\expandafter{\si@tab@out}}% + \ifx\@empty\si@num@out\@empty + \setbox\si@tab@midbox=\hbox + {\phantom{\ensuremath{{\si@decimalsymbol}}}}% + \else + \setbox\si@tab@midbox=\hbox + {\ensuremath{{\si@decimalsymbol}}}% + \fi + \setbox\si@tab@postbox=\hbox + {\expandafter\si@out@num\expandafter{\si@num@out}}% + \ifdim\wd\si@tab@prebox>\wd\si@tab@postbox\relax + \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 + \setbox\si@tab@expbox=\hbox{}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@tab@predim} +%\begin{macro}{\si@tab@postdim} +%\begin{macro}{\si@tab@expdim} +%\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@tab@expdim +\newdimen\si@tempdima +\newdimen\si@tempdimb +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@tab@sp} +% A short macro to control superscript. +% \begin{macrocode} +\newcommand*{\si@tab@sp}{} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@tab@fixed} +% The column is not centred on the decimal marker; the user specifies +% how many characters on each side are allowed for. First, the width +% of a character is measured, and stored. +% \begin{macrocode} +\newcommand*{\si@tab@fixed}{% + \si@log@debug{Using fixed-width S column}% + \let\si@tab@sp\relax + \setbox\si@tab@midbox=\hbox{}% + \setbox\si@tab@expbox=\hbox{}% + \setbox\si@tempboxa=\hbox{\si@out@num{1}}% + \si@tempdima\wd\si@tempboxa\relax +% \end{macrocode} +% The width for the two output boxes is set up. +% \begin{macrocode} + \si@tab@predim\the\si@tab@mantprecnt\si@tempdima\relax + \si@tab@sepcorr{mantpre}{pre}% + \si@tab@postdim\si@tab@mantpostcnt\si@tempdima\relax + \setbox\si@tempboxa=\hbox{\ensuremath{{\si@decimalsymbol}}}% + \advance\si@tab@postdim\wd\si@tempboxa\relax + \si@tab@sepcorr{mantpost}{post}% +% \end{macrocode} +% If space is needed for an exponent, it needs to be allowed for in +% the exponent box dimension. First, the digits of the two parts are +% checked for; the width of a character is altered to be superscript. +% \begin{macrocode} + \setbox\si@tempboxa=\hbox{\si@out@num{^{1}}}% + \si@tempdima\wd\si@tempboxa\relax + \ifnum\si@tab@expprecnt>\z@\relax + \si@tab@expdim\si@tab@expprecnt\si@tempdima\relax + \si@tab@sepcorr{exppre}{exp}% + \fi + \let\si@tab@sp\sp + \ifnum\si@tab@exppostcnt>\z@\relax + \advance\si@tab@expdim\si@tab@exppostcnt\si@tempdima\relax + \setbox\si@tempboxa=\hbox{% + \ensuremath{^{\si@decimalsymbol}}}% + \advance\si@tab@expdim\wd\si@tempboxa\relax + \si@tab@sepcorr{exppost}{exp}% + \fi +% \end{macrocode} +% Space is reserved for signs. +% \begin{macrocode} + \setbox\si@tempboxa=\hbox{\ensuremath{-}}% + \ifsi@tab@mantsign + \advance\si@tab@predim\wd\si@tempboxa\relax + \fi + \setbox\si@tempboxa=\hbox{\ensuremath{^{-}}}% + \ifsi@tab@expsign + \advance\si@tab@expdim\wd\si@tempboxa\relax + \fi +% \end{macrocode} +% Now, if there is space to be saved for an exponent under any +% circumstances, the space for the ``$\times 10$'' part is needed. +% This is done by adding both counters together, then using this +% result for the logic. +% \begin{macrocode} + \si@tempcnta\si@tab@expprecnt\relax + \advance\si@tempcnta\si@tab@exppostcnt\relax + \ifnum\si@tempcnta>\z@\relax + \setbox\si@tempboxa=\hbox{\ensuremath{% + {}\si@expproduct{}\si@expbase}}% + \advance\si@tab@expdim\wd\si@tempboxa\relax + \fi +% \end{macrocode} +% Finally for the box dimensions, if the exponent is not aligned, +% the space reserved for it is added to the post box. +% \begin{macrocode} + \ifsi@tabalignexp\else + \advance\si@tab@postdim\si@tab@expdim\relax + \fi +% \end{macrocode} +% With the boxes set up, the contents can be sorted out. A bit of +% shuffling may be needed, depending on the treatment of exponents. +% \begin{macrocode} + \setbox\si@tab@prebox=\hbox to\si@tab@predim{\hss\hfill + \expandafter\si@out@num\expandafter{\si@tab@out}}% + \ifx\@empty\si@num@out\@empty + \setbox\si@tab@postbox=\hbox to\si@tab@postdim + {\expandafter\si@out@num\expandafter{\si@num@out}\hfil}% + \else + \ifsi@tabalignexp\else + \protected@edef\si@num@out{\si@num@out\si@tab@expout}% + \fi + \setbox\si@tab@postbox=\hbox to\si@tab@postdim + {\ensuremath{{\si@decimalsymbol}}\expandafter\si@out@num + \expandafter{\si@num@out}\hfil}% + \fi + \ifx\@empty\si@tab@expout\@empty + \ifsi@tabalignexp + \setbox\si@tab@expbox=\hbox to\si@tab@expdim{\hfil}% + \fi + \else + \ifsi@tabalignexp + \setbox\si@tab@expbox=\hbox to\si@tab@expdim + {\expandafter\si@out@num\expandafter{\si@tab@expout}% + \hfil}% + \fi + \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{count}\marg{dimen} +% \begin{macrocode} +\newcommand*{\si@tab@sepcorr}[2]{% + \expandafter\si@tempcnta\expandafter\the + \csname si@tab@#1cnt\endcsname\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@tempcnta\thr@@\relax + \ifsi@sepfour\else + \expandafter\ifnum\expandafter\the + \csname si@tab@#1cnt\endcsname=4\relax + \si@tempcnta\z@\relax + \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@tempboxa=\hbox{% + \ensuremath{\si@tab@sp{\si@digitsep}}}% + \expandafter\advance\csname si@tab@#2dim\endcsname + \si@tempcnta\wd\si@tempboxa} +% \end{macrocode} +%\end{macro} +% +%\subsection{Units} +%\begin{macro}{\SI} +%\begin{macro}{\si} +% 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{si}, +% which work in very similar ways. \cs{si} 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{si}\oarg{options}\marg{unit} +% \begin{macrocode} +\si@newrobustcmd*{\SI}[2][]{% + \@ifnextchar[%] + {\si@SI[#1]{#2}} + {\si@SI[#1]{#2}[]}} +\si@newrobustcmd*{\si}[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{options}\marg{unit}\marg{symbol}\\ +%\cs{renewunit}\oarg{options}\marg{unit}\marg{symbol}\\ +%\cs{provideunit}\oarg{options}\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@log@inf{Redefining unit \string#2}% + \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}\oarg{binary}\marg{multiple}\marg{powers-ten}^^A +% \marg{symbol}\\ +%\cs{renewprefix}\oarg{binary}\marg{multiple}\marg{powers-ten}^^A +% \marg{symbol}\\ +%\cs{provideprefix}\oarg{binary}\marg{multiple}\marg{powers-ten}^^A +% \marg{symbol} +% \begin{macrocode} +\newcommand*{\newprefix}[4][]{% + \si@ifdefinable{#2} + {\si@unt@defprefix[#1]{#2}{#3}{#4}} + {\si@log@err{Prefix \string#2 already defined!}\@eha}} +\newcommand*{\renewprefix}[4][]{% + \si@ifdefinable{#2} + {\si@log@err{Prefix \string#2 undefined}\@ehc + \si@unt@defprefix[#1]{#2}{#3}{#4}} + {\si@log@inf{Redefining prefix \string#2}% + \si@unt@defprefix[#1]{#2}{#3}{#4}}} +\newcommand*{\provideprefix}[4][]{% + \si@ifdefinable{#2} + {\si@unt@defprefix[#1]{#2}{#3}{#4}} + {}} +% \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@log@inf{Redefining power \string#2}% + \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. +% \begin{macrocode} +\newif\ifsi@unt@num +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@unt@unitarg} +% A storage macro for the argument of the unit macro. +% \begin{macrocode} +\newcommand*{\si@unt@unitarg}{} +% \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{si}). 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} +\newcommand*{\si@unt@SIopts}{} +\def\si@SI[#1]#2[#3]#4{% + \begingroup + \si@ifnotmtarg{#1} + {\sisetup{#1}% + \renewcommand*{\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{#4} + {\renewcommand*{\si@unt@unitarg}{#4}}% + \si@ifnotmtarg{#2} + {\si@log@debug{Number found in \string\SI\space + argument}% + \ifsi@repeatunits\else + \ifsi@trapambigerr + \expandafter\expandafter\expandafter + \si@num@ambigerrtrue + \fi + \fi + \num{#2}% + \si@unt@numtrue}% +% \end{macrocode} +% If there is a unit, a check is needed in case the units need to +% have a power added. +% \begin{macrocode} + \si@ifnotmtarg{#4} + {\si@ifmtarg{#2} + {\si@unt@printunit{#4}} + {\si@tempcnta\z@\relax + \ifsi@addunitpower + \si@unt@countx{#2}% + \fi + \ifnum\si@tempcnta>\z@\relax + \advance\si@tempcnta\@ne\relax + \edef\si@tempa{\noexpand\tothe{\si@tempcnta}}% + \renewcommand*{\si@tempb}{#4}% + \expandafter\expandafter\expandafter + \si@unt@printunit\expandafter\expandafter + \expandafter{% + \expandafter\si@tempb\si@tempa}% + \else + \si@unt@printunit{#4}% + \fi}}% + \endgroup} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@unt@countx} +% A short macro to count up any multiplication in numerical input. +% \begin{macrocode} +\newcommand*{\si@unt@countx}[1]{% + \si@tempcnta\z@\relax + \expandafter\si@unt@cntx#1\@empty\@empty} +\def\si@unt@cntx#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numprod} + {\advance\si@tempcnta\@ne\relax} + {}% + \ifx\@empty#2\@empty\else + \si@unt@cntx#2\@empty\@empty + \fi} +% \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@tempboxa=\hbox{\si@unt@out{#1}}% + \ifdim\wd\si@tempboxa>\z@\relax + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +% \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}{\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@litprefixfalse + \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} +%\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{options}\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 needs to be saved. The macro name is reversed +% so that life is easier with the expansions here. +% \begin{macrocode} + \si@ifnotmtarg{#1} + {\expandafter\@namedef\expandafter{% + \expandafter\@gobble\string#2@opt@unt@si}{#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. +% \begin{macrocode} + \protected\def#2{% + \ifsi@allowoptarg + \expandafter\si@unt@withopt + \else + \expandafter\si@unt@noopt + \fi + {#2}{#3}}} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@unt@withopt} +%\begin{macro}{\si@unt@noopt} +% To allow the correct expansion, the potential optional argument to +% a unit macro has to come last. So \cs{@ifnextchar} is needed to +% detect it and pass data through. To keep variation down, when the +% argument is not allowed, the empty |[]| is supplied.\\ +%\cs{si@unt@withopt}\marg{unit}\marg{symbol}\\ +%\cs{si@unt@noopt}\marg{unit}\marg{symbol} +% \begin{macrocode} +\newcommand*{\si@unt@withopt}[2]{% + \@ifnextchar[%] + {\si@unt@opt{#1}{#2}} + {\si@unt@opt{#1}{#2}[]}} +\newcommand*{\si@unt@noopt}[2]{\si@unt@opt{#1}{#2}[]} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@unt@opt} +% The optional argument to the unit macro (if present) is converted +% to a normal one for ease. The correct route for processing is then +% picked.\\ +%\cs{si@unt@opt}\marg{unit}\marg{symbol}\oarg{num} +% \begin{macrocode} +\def\si@unt@opt#1#2[#3]{% + \ifsi@unt@littest + \expandafter\si@gobblethree + \else +% \end{macrocode} +% For literal output, the second argument is all that is needed. +% \begin{macrocode} + \ifsi@unt@litout + \expandafter\expandafter\expandafter\@gobbletwo + \else + \expandafter\expandafter\expandafter\si@unt@unit + \fi + \fi + {#3}{#1}{#2}} +% \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} +%\begin{macro}{\ifsi@unt@litprefix} +% As with units, multiples are defined by an internal macro.\\ +%\cs{si@unt@defprefix}\oarg{binary}\marg{multiple}\marg{powers-ten}^^A +% \marg{symbol} +% \begin{macrocode} +\newif\ifsi@unt@litprefix +\si@unt@litprefixtrue +\newcommand*{\si@unt@defprefix}[4][]{% + \si@log@debug{Declaring multiple \string#1 with\MessageBreak + meaning \string#4}% +% \end{macrocode} +% The optional argument is saved, using \cs{def} as no check is made +% on an existing definition of the storage macro. +% \begin{macrocode} + \expandafter\expandafter\expandafter\def\expandafter + \csname\expandafter\@gobble\string#2@opt@si\endcsname{#1}% + \protected\def#2{% + \ifsi@unt@littest + \expandafter\si@gobblethree + \else + \ifsi@unt@litout + \expandafter\expandafter\expandafter\@gobbletwo + \else + \ifsi@unt@litprefix + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\@gobbletwo + \else + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\si@unt@prefix + \fi + \fi + \fi + {#2}{#3}{#4}}} +% \end{macrocode} +%\end{macro} +%\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\def\expandafter + \csname\expandafter\@gobble\string#2@opt@si\endcsname{#1}% + \protected\def#2{% + \ifsi@unt@littest + \expandafter\@gobbletwo + \else +% \end{macrocode} +% The literal output here does not need to gobble anything. +% \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@numtrue}% + \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} +% 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} + \renewcommand*{\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} +%\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}{% + \renewcommand*{\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@prefixsymbolic + \expandafter\si@unt@addprefix + \else + \expandafter\si@unt@countprefix + \fi + {#1}{#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{gobble}\marg{symbol} +% \begin{macrocode} +\newcommand*{\si@unt@addprefix}[3]{% + \si@unt@addtostack{prefix}{#3}} +% \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{multiple}\marg{powers-ten}\marg{gobble} +% \begin{macrocode} +\newcount\si@unt@prefixcnt +\newcommand*{\si@unt@countprefix}[3]{% +% \end{macrocode} +% A check is made for binary units. +% \begin{macrocode} + \renewcommand*{\si@tempa}{binary}% + \expandafter\expandafter\expandafter\ifx\expandafter + \csname\expandafter\@gobble\string#1@opt@si\endcsname + \si@tempa + \expandafter\sisetup + \else + \expandafter\@gobble + \fi + {prefixbase=two}% + \si@tempcnta#2\relax + \ifsi@unt@per + \expandafter\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 ensuring that ``pre'' powers +% follow \cs{per} cleanly. Then a check is needed for inversion.\\ +%\cs{si@unt@power}\marg{power}\marg{num} +% \begin{macrocode} +\newif\ifsi@unt@prepower +\newcommand*{\si@unt@power}[2]{% + \renewcommand*{\si@tempa}{post}% + \expandafter\expandafter\expandafter\ifx\expandafter + \csname\expandafter\@gobble\string#1@opt@si\endcsname + \si@tempa + \expandafter\@gobbletwo + \else + \expandafter\si@unt@firstorsecond + \fi + {}{\power}% + \si@unt@powerdim #2 pt\relax + \ifsi@frac\else + \ifsi@unt@per + \expandafter\expandafter\expandafter\si@unt@invpower + \fi + \fi + \renewcommand*{\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 + \else + \si@log@debug{Power \strip@pt\si@unt@powerdim\space saved + to be added after\MessageBreak next unit}% + \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 + \ifsi@stickyper\else + \si@unt@perfalse + \si@unt@perseenfalse + \fi} +% \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 + \renewcommand*{\si@tempa}{unit}% + \expandafter\ifx + \csname si@unt@lastadd\si@unt@checkstack\endcsname + \si@tempa + \si@log@debug{Adding power + \strip@pt\si@unt@powerdim\space to output stack}% + \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} +%\begin{macro}{\si@unt@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 +\si@newrobustcmd*{\si@per}{% + \ifsi@unt@littest\else + \ifsi@unt@litout + \expandafter\expandafter\expandafter /% + \else + \ifsi@unt@litprefix + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter /% + \else + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\si@unt@per + \fi + \fi + \fi} +\newcommand*{\si@unt@per}{% + \si@unt@firstorsecond{}{\per}% + \ifsi@unt@per + \ifsi@stickyper\else + \expandafter\expandafter\expandafter\si@unt@perfalse + \fi + \else + \expandafter\si@unt@pertrue + \fi} +\let\per\si@per +% \end{macrocode} +%\end{macro} +%\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} +% 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]{% + \renewcommand*{\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} +%\begin{macro}{\si@unt@preplussp} +% The space added after a prefix needs to be ignored.\\ +%\cs{si@unt@preplussp}\marg{type}\marg{stack}\marg{token}^^A +% \marg{gobble} +% \begin{macrocode} +\newcommand*{\si@unt@preplussp}[2]{% + \renewcommand*{\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} +%\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\renewcommand\expandafter*\expandafter{% + \csname si@unt@lastadd\si@unt@checkstack\endcsname}{#1}% +% \end{macrocode} +% A count is kept of the number of \emph{units} added to each stack. +% \begin{macrocode} + \renewcommand*{\si@tempa}{#1}% + \renewcommand*{\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} + \renewcommand*{\si@tempb}{space}% + \ifx\si@tempa\si@tempb + \expandafter\si@unt@holdspace + \else + \expandafter\si@unt@addstack + \fi + {#2}} +% \end{macrocode} +%\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. For the ``b'' space stack, a check is made to ensure +% that a space cannot be added before the first item.\\ +%\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]{% + \renewcommand*{\si@tempa}{b}% + \edef\si@tempb{\si@unt@checkstack}% + \ifx\si@tempa\si@tempb + \ifx\@empty\si@unt@stackb\@empty + \else + \expandafter\protected@edef + \csname si@unt@holdstack\si@unt@checkstack\endcsname{#1}% + \fi + \else + \expandafter\protected@edef + \csname si@unt@holdstack\si@unt@checkstack\endcsname{#1}% + \fi} +\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}{% + \si@unt@litouttrue + \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{\ensuremath{{}\si@prefixproduct{}}}% + \fi + \si@unt@stackvalsep + \let\si@expbase\si@prefixbase + \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 + \ifsi@trapambigfrac + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\si@unt@notabg + \fi + \fi + \fi} +\newcommand*{\si@unt@notabg}{% + \protected@edef\si@unt@stackb{\si@openfrac\si@unt@stackb + \si@closefrac}} +% \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}}% + \endlinechar\m@ne + \si@out{\scantokens{#1}}% + \endgroup} +\endgroup +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@unt@nonlatin} +% To handle non-Latin symbols in the input, a single macro is +% provided. If \XeTeX\ is in use, this can be detected immediately. +% \begin{macrocode} +\newcommand*{\si@unt@nonlatin}{} +\ifdefined\XeTeXrevision + \renewcommand*{\si@unt@nonlatin}{% + \catcode176=\active + \catcode181=\active + \catcode197=\active + \si@unt@sym{176}{\si@sym@degree}% + \si@unt@sym{181}{\si@sym@mu}% + \si@unt@sym{197}{\si@sym@ringA}}% +\fi +% \end{macrocode} +% If \pkg{inputenc} has been loaded, then a check is made that the +% encoding is correct. If all is well, the non-Latin symbols are +% handled. The degree symbol is character 176, the micro +% symbol is character 181 and ring capital A is character 197 in +% latin1. +% \begin{macrocode} +\AtBeginDocument{ + \@ifpackageloaded{inputenc} + {\@for\si@tempa:=latin1,latin5,latin9\do{ + \ifx\inputencodingname\si@tempa + \renewcommand*{\si@unt@nonlatin}{% + \catcode176=\active + \catcode181=\active + \catcode197=\active + \si@unt@sym{176}{\si@sym@degree}% + \si@unt@sym{181}{\si@sym@mu}% + \si@unt@sym{197}{\si@sym@ringA}}% + \fi}} + {}} +% \end{macrocode} +%\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}{\meter} +%\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{\meter}{\metre} +\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} +%\end{macro} +%\begin{macro}{\Square} +%\begin{macro}{\ssquare} +%\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{\ssquare}{2} +\newpower[post]{\squared}{2} +\newpower{\cubic}{3} +\newpower[post]{\cubed}{3} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\tothe} +%\begin{macro}{\si@tothe} +%\begin{macro}{\raiseto} +%\begin{macro}{\tothe@opt@si} +%\begin{macro}{\raiseto@opt@si} +% A macro for arbitrary powers, which comes after the unit and so +% needs to be marked as such.\\ +%\cs{tothe}\marg{num}\\ +%\cs{raiseto}\marg{num} +% \begin{macrocode} +\newcommand*{\tothe}{\si@tothe{\tothe}} +\newcommand*{\raiseto}{\si@tothe{\raiseto}} +\newcommand*{\si@tothe}[2]{% + \ifsi@unt@littest + \expandafter\@gobbletwo + \else + \ifsi@unt@litout + \expandafter\expandafter\expandafter\si@unt@litpower + \else + \expandafter\expandafter\expandafter\si@unt@power + \fi + \fi + {#1}{#2}} +\newcommand*{\tothe@opt@si}{post} +\newcommand*{\raiseto@opt@si}{} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\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\gdef\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}{\si@loc@ltol} +% \begin{macrocode} +\newcommand*{\si@loc@ltol}[1]{% + \def\si@tempa##1:##2\@nil{\si@loc@load{##1}} + \@for\si@tempb:=#1\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:=#1\do{% + \expandafter\si@tempa\si@tempb::\@nil}} + {\si@log@warn{babel not loaded \MessageBreak + loctolang option ignored}}}} +\AtBeginDocument{ + \@ifpackageloaded{babel} + {\renewcommand*{\si@loc@ltol}[1]{% + \def\si@tempa##1:##2\@nil{\si@loc@load{##1}}% + \@for\si@tempb:=#1\do{% + \expandafter\si@tempa\si@tempb:\@nil}% + \def\si@tempa##1:##2:##3\@nil{% + \expandafter\addto\expandafter{% + \csname extras##2\endcsname}% + {\si@loc@set{##1}}}% + \@for\si@tempb:=#1\do{% + \expandafter\si@tempa\si@tempb::\@nil}}} + {\renewcommand*{\si@loc@ltol}[1]{% + \si@log@warn{babel not loaded \MessageBreak + loctolang option ignored}}}} +% \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} +% 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}\marg{text} +% \begin{macrocode} +\begingroup + \catcode`\^=\active\relax + \catcode`\-=\active\relax + \gdef\si@out#1{% + \begingroup + \catcode`\^=\active\relax + \makeatletter + \endlinechar\m@ne +% \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 + \si@colourcmd{\si@colour}% + \text{\si@fam@italic\si@fam@bold\si@fam@text +% \end{macrocode} +% The correct mode is selected, and the input is handed off for +% typesetting. +% \begin{macrocode} + \ifsi@textmode + \expandafter\si@out@text + \else + \expandafter\si@out@maths + \fi + {\scantokens{#1}}}% + \endgroup + \check@mathfonts} +% \end{macrocode} +%\end{macro} +%\begin{macro}{\si@out@text} +%\begin{macro}{\si@out@maths} +% Output occurs with the correct changes to superscript behaviour.\\ +%\cs{si@out@text}\marg{text}\\ +%\cs{si@out@maths}\marg{text} +% \begin{macrocode} + \gdef\si@out@text#1{% + \let^\si@out@sp + \let\textsuperscript\si@out@sp + \catcode`\-=\active\relax + \let-\si@out@minus + #1} + \gdef\si@out@maths#1{% + \let^\sp + \let\textsuperscript\sp + $\si@fam@maths{#1}$} +\endgroup +% \end{macrocode} +%\end{macro} +%\end{macro} +%\begin{macro}{\si@out@sp} +% \cs{textsuperscript} gives slightly different alignment of numbers +% to using |^| in text mode. To avoid this, a slightly different +% definition is used. Elsewhere \cs{textsuperscript} is used, as +% the code above sorts out the text/maths mode issues.\\ +%\cs{si@out@sp}\marg{text} +% \begin{macrocode} +\newcommand*{\si@out@sp}[1]{\ensuremath{^{\text{#1}}}} +% \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}{\ifsi@out@num} +% A flag is needed to control output settings. This will be +% false unless inside \cs{si@out@num}. +% \begin{macrocode} +\newif\ifsi@out@num +% \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 + \si@out@numtrue + \si@out{#1}% + \endgroup} +% \end{macrocode} +%\end{macro} +% +%\subsection{Finalisation} +%\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@ifl@aded} +%\begin{macro}{\si@ifloaded} +% A bit of borrowing from the \LaTeX\ kernel. A copy of \cs{@ifl@aded} +% is needed as things aren't always done in the preamble by +% \currpkg.\\ +%\cs{si@ifloaded}\marg{package} +% \begin{macrocode} +\newcommand*{\si@ifl@aded}{} +\let\si@ifl@aded\@ifl@aded +\newcommand*{\si@ifloaded}[1]{% + \si@ifl@aded\si@extension{\si@fileprefix#1}} +% \end{macrocode} +%\end{macro} +%\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}{\requiresiconfigs} +% The configuration files depend on each other.\\ +%\cs{requiresiconfigs}\marg{cfg-file} +% \begin{macrocode} +\newcommand*{\requiresiconfigs}[1]{% + \@for\si@tempb:=#1\do{\si@loadfile{\si@tempb}}} +% \end{macrocode} +%\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 siunitx 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.\\ +%\cs{si@emclash}\marg{package}\marg{package} +% \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@emulating} +% For packages that are emulated, the \LaTeX\ mechanism to prevent +% re-loading is used. The list of packages to check at the start +% of the document also has to be altered.\\ +%\cs{si@emulating}\marg{package}\marg{version} +% \begin{macrocode} +\newcommand*{\si@emulating}[2]{% + \@namedef{ver@#1.sty}{#2 siunitx emulation of #1}% + \let\si@tempa\si@blockpkgs + \renewcommand*{\si@blockpkgs}{}% + \@for\si@tempb:=\si@tempa\do{% + \renewcommand*{\si@tempa}{#1}% + \ifx\si@tempa\si@tempb\else + \lowercase{\edef\si@tempa{#1}}% + \lowercase{\edef\si@tempc{\si@tempb}}% + \ifx\si@tempa\si@tempc + \@namedef{ver@\si@tempc.sty}{#2 siunitx emulation of + #1}% + \else + \si@addtolist{\si@blockpkgs}{\si@tempb}% + \fi + \fi}% + \let\si@tempa\si@checkpkgs + \renewcommand*{\si@checkpkgs}{}% + \renewcommand*{\si@tempb}{#1}% + \@for\si@tempc:=\si@tempa\do{% + \ifx\si@tempb\si@tempc\else + \si@addtolist{\si@checkpkgs}{\si@tempc}% + \fi}} +% \end{macrocode} +%\end{macro} +% 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{ + addsign=none, + allowzeroexp=false, + angformat=unchanged, + astroang=false,%( + closeerr=),%( + closefrac=), + colour=black, + colourall=false, + colourneg=false, + decimalsymbol=fullstop, + detectdisplay=true, + digitsep=thin, + dp=3, + eVcorra=0.3ex, + eVcorrb=0ex, + errspace=none, + fixdp=false, + inlinebold=text, + load=default, + mathsrm=mathrm, + mathssf=mathsf, + mathstt=mathtt, + mode=maths, + negcolour=red, + noload={}, + numaddn={},%( + numcloseerr=),% + numdecimal={.,}, + numdigits=0123456789, + numexp=eEdD, + numgobble={}, + numopenerr=(,%) + numprod=x, + numsign=+-\pm\mp, + obeybold=false, + obeyitalic=false, + obeymode=false, + openerr=(,%) + openfrac=(,%) + padangle=small, + padnumber=lead, + per=reciprocal, + prefixbase=ten, + prefixproduct=times, + prefixsymbolic=true, + prespace=false, + redefsymbols=true, + repeatunits=true, + retainplus=false, + seperr=false, + sepfour=false, + sign=plus, + slash=slash, + stickyper=false, + strictarc=true, + tabalignexp=true, + tabautofit=false, + tabformat=3.2, + tabnumalign=centredecimal, + tabtextalign=centre, + tabunitalign=left, + textrm=rmfamily, + textsf=sffamily, + texttt=ttfamily, + tightpm=false, + trapambigerr=true, + trapambigfrac=true, + unitsep=thin, + valuesep=thin, + xspace=false} +\ProcessOptionsX[si] +% \end{macrocode} +% 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} +%\begin{macro}{\si@expanddefault} +% 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 + \renewcommand*{\si@tempb}{default}% + \renewcommand*{\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}% + \renewcommand*{\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} +% The configuration and abbreviation files are loaded. +% \begin{macrocode} +\si@expanddefault{load}{prefix,named,addn,prefixed,accepted,% + physical,abbr} +% \end{macrocode} +% The very last job is to load a local configuration file, if one +% exists, and restore catcodes. +% \begin{macrocode} +\IfFileExists{siunitx.cfg} + {\si@log@inf{Local configuration file found}% + \InputIfFileExists{siunitx.cfg}{}{}} + {} +\si@catcodes +% \end{macrocode} +% +%\iffalse +% +%\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} + [\csname si@svn@version\endcsname siunitx: + 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 +% +%<*named> +%\fi +%\subsection{Derived units with specific names} +%\begin{macro}{\becquerel} +%\begin{macro}{\coulomb} +%\begin{macro}{\farad} +%\begin{macro}{\Gray} +%\begin{macro}{\ggray} +%\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} + [\csname si@svn@version\endcsname siunitx: SI Named units] +\newunit{\becquerel}{Bq} +\newunit{\coulomb}{C} +\newunit{\farad}{F} +\newunit{\Gray}{Gy} +\newunit{\ggray}{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} +%\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 +% +%<*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} + [\csname si@svn@version\endcsname siunitx: + SI Prefixed units] +\requiresiconfigs{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}{\kilo\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). \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}{\centimetresquared} +%\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{\centimetresquared}{\centi\metre\squared} +\newunit{\squarekilometre}{\Square\kilo\metre} +% \end{macrocode} +%\end{macro} +%\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} +%\begin{macro}{\kilowatthour} +% Some energy is needed by now! Notice the definition of +% \cs{kilowatthour} +% \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} +\newunit[unitsep=none]{\kilowatthour}{\kilo\watt\hour} +% \end{macrocode} +%\end{macro} +%\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 +% +%<*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} + [\csname si@svn@version\endcsname siunitx: Abbreviated units] +\requiresiconfigs{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} +%\begin{macro}{\cms} +% Volumes and areas +% \begin{macrocode} +\provideunit{\ml}{\milli\litre} +\provideunit{\micl}{\micro\litre} +\newunit{\cmc}{\centi\metre\cubed} +\newunit{\dmc}{\deci\metre\cubed} +\newunit{\cms}{\centi\metre\squared} +% \end{macrocode} +%\end{macro} +%\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} +%\begin{macro}{\kWh} +% 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} +\newunit[unitsep=none]{\kWh}{\kilo\watt\hour} +% \end{macrocode} +%\end{macro} +%\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 +% +%<*addn> +%\fi +%\subsection{Additional (temporary) SI units} +%\begin{macro}{\angstrom} +%\begin{macro}{\are} +%\begin{macro}{\hectare} +%\begin{macro}{\barn} +%\begin{macro}{\BAR} +%\begin{macro}{\bbar} +%\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} + [\csname si@svn@version\endcsname siunitx: + SI Additional units] +\newunit{\angstrom}{\si@sym@ringA} +\newunit{\are}{a} +\newunit{\hectare}{\hecto\are} +\newunit{\barn}{b} +\newunit{\BAR}{bar} +\newunit{\bbar}{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} +%\end{macro} +%\iffalse +% +%<*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}{\dday} +%\begin{macro}{\degree} +%\begin{macro}{\Degree} +%\begin{macro}{\arcmin} +%\begin{macro}{\arcsec} +%\begin{macro}{\litre} +%\begin{macro}{\liter} +%\begin{macro}{\tonne} +%\begin{macro}{\neper} +%\begin{macro}{\bel} +%\begin{macro}{\percent} +% \begin{macrocode} +\ProvidesFile{si-accepted.cfg} + [\csname si@svn@version\endcsname siunitx: SI Accepted units] +\newunit{\minute}{min} +\newunit{\hour}{h} +\newunit{\Day}{d} +\newunit{\dday}{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{\liter}{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} +%\end{macro} +%\end{macro} +%\iffalse +% +%<*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} +% 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} + [\csname si@svn@version\endcsname siunitx: + 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} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\iffalse +% +%\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} +%\begin{macro}{\dalton} +% 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} + [\csname si@svn@version\endcsname siunitx: Units for + synthetic chemists] +\requiresiconfigs{prefix} +\newunit{\mmHg}{mmHg} +\newunit{\molar}{\mole\per\cubic\deci\metre} +\newunit{\Molar}{\textsc{m}} +\newunit{\torr}{Torr} +\newunit{\dalton}{Da} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\iffalse +% +%<*hep> +%\fi +%\subsection{High-energy physics} +% Some units inspired by \pkg{hepunits}. +% \begin{macrocode} +\ProvidesFile{si-hep.cfg} + [\csname si@svn@version\endcsname siunitx: Units for + high-energy physics] +\requiresiconfigs{prefix,named} +% \end{macrocode} +%\begin{macro}{\micron} +%\begin{macro}{\mrad} +%\begin{macro}{\gauss} +% These specific to high-energy physics, but are not defined +% elsewhere in \currpkg.\footnote{It is not clear from +% \pkg{hepunits}, but the assumption is that \cs{mrad} represents +% millirad and not milliradian.} +% \begin{macrocode} +\provideunit{\micron}{\micro\metre} +\newunit{\mrad}{\milli\rad} +\newunit{\gauss}{G} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\clight} +%\begin{macro}{\eVperc} +% The speed of light is used in units for the area, although of +% course it is not strictly a unit. However, this makes it easier to +% use in other units. +% \begin{macrocode} +\newunit{\clight}{\ensuremath{\mathnormal{c}}} +\newunit{\eVperc}{\eV\per\clight} +% \end{macrocode} +%\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}{\nb} +%\begin{macro}{\pb} +%\begin{macro}{\fb} +%\begin{macro}{\ab} +%\begin{macro}{\zb} +%\begin{macro}{\yb} +% Abbreviations for the same, but using \cs{provideunit} to avoid any +% clashes. +% \begin{macrocode} +\provideunit{\nb}{\nano\barn} +\provideunit{\pb}{\pico\barn} +\provideunit{\fb}{\femto\barn} +\provideunit{\ab}{\atto\barn} +\provideunit{\zb}{\zepto\barn} +\provideunit{\yb}{\yocto\barn} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\iffalse +% +%<*astro> +%\fi +%\subsection{Astronomy} +%\begin{macro}{\parsec} +%\begin{macro}{\lightyear} +% For astronomy, the \cs{parsec} unit is needed. +% \begin{macrocode} +\ProvidesFile{si-astro.cfg} + [\csname si@svn@version\endcsname siunitx: + Units for astronomy] +\newunit{\parsec}{pc} +\newunit{\lightyear}{ly} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\iffalse +% +%<*binary> +%\fi +%\subsection{Binary units} +%\begin{macro}{\kibi} +%\begin{macro}{\mebi} +%\begin{macro}{\gibi} +%\begin{macro}{\tebi} +%\begin{macro}{\pebi} +%\begin{macro}{\exbi} +%\begin{macro}{\zebi} +%\begin{macro}{\yobi} +% The binary units, as specified by the IEC and made available by +% \SIunits. First, the binary prefixes. +% \begin{macrocode} +\ProvidesFile{si-binary.cfg} + [\csname si@svn@version\endcsname siunitx: Binary units] +\newprefix[binary]{\kibi}{10}{Ki} +\newprefix[binary]{\mebi}{20}{Mi} +\newprefix[binary]{\gibi}{30}{Gi} +\newprefix[binary]{\tebi}{40}{Ti} +\newprefix[binary]{\pebi}{50}{Pi} +\newprefix[binary]{\exbi}{60}{Ei} +\newprefix[binary]{\zebi}{70}{Zi} +\newprefix[binary]{\yobi}{80}{Yi} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\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 +% +%\fi +% +%\section{Loadable locales} +% Some short files to provide the correct settings for various places. +% +%\iffalse +%<*UK> +%\fi +%\subsection{United Kingdom} +% This is identical to the USA locale, and contains the package +% default values.\footnote{The package author is in the UK.} +% \begin{macrocode} +\ProvidesFile{si-UK.cfg} + [\csname si@svn@version\endcsname siunitx: UK locale] +\sisetup{ + unitsep=thin, + expproduct=times, + valuesep=thin, + decimalsymbol=fullstop, + digitsep=thin, + sepfour=false} +% \end{macrocode} +%\iffalse +% +%<*USA> +%\fi +%\subsection{United States} +% The same as for the UK. +% \begin{macrocode} +\ProvidesFile{si-USA.cfg} + [\csname si@svn@version\endcsname siunitx: USA locale] +\sisetup{ + unitsep=thin, + expproduct=times, + valuesep=thin, + decimalsymbol=fullstop, + digitsep=thin, + sepfour=false} +% \end{macrocode} +%\iffalse +% +%<*DE> +%\fi +%\subsection{Germany} +% Germany, hopefully. +% \begin{macrocode} +\ProvidesFile{si-DE.cfg} + [\csname si@svn@version\endcsname siunitx: Germany locale] +\sisetup{ + unitsep=cdot, + valuesep=thin, + decimalsymbol=comma, + expproduct=cdot, + digitsep=thin, + sepfour=false} +% \end{macrocode} +%\iffalse +% +%<*ZA> +%\fi +%\subsection{South Africa} +% Design decisions taken from the same section of \SIstyle. +% \begin{macrocode} +\ProvidesFile{si-ZA.cfg} + [\csname si@svn@version\endcsname siunitx: + South Africa locale] +\sisetup{ + unitsep=cdot, + valuesep=thin, + expproduct=times, + decimalsymbol=comma, + digitsep=thin, + sepfour=false} +% \end{macrocode} +%\iffalse +% +%\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{\units} +% 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 \units package is quite easy to emulate, as it only has a +% few options and macros. There is also no error checking in +% \units for conflicting options, so users probably expect none. +% \begin{macrocode} +\ProvidesFile{si-units.cfg} + [\csname si@svn@version\endcsname siunitx: Emulation of units] +\si@emulating{units}{1998/08/04 v0.9b} +\si@ifloaded{SIunits} + {\si@emclash{units}{SIunits}\endinput}{} +\si@ifloaded{sistyle} + {\si@emclash{units}{sistyle}\endinput}{} +% \end{macrocode} +% To emulate \units, \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 \units 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 \units they should expect more checking of input. As +% the \units package uses the current mode, this has to be +% detected.\\ +%\cs{unit}\oarg{num}\marg{unit} +% \begin{macrocode} +\si@newrobustcmd*{\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} +\si@newrobustcmd*{\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 +% +%\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} + [\csname si@svn@version\endcsname siunitx: + Emulation of unitsdef] +\si@emulating{unitsdef}{2005/01/04 v0.2} +\si@ifloaded{SIunits} + {\si@emclash{unitsdef}{SIunits}\endinput}{} +\si@ifloaded{sistyle} + {\si@emclash{unitsdef}{sistyle}\endinput}{} +% \end{macrocode} +% Emulation of \units is needed for \unitsdef to work. +% \begin{macrocode} +\requiresiconfigs{units} +% \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,allowoptarg,prespace} +\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}} +\define@choicekey*+[si]{key}{valuesep}[\si@tempa] + {space,thin,med,medium,thick,none} + {\renewcommand*\unitvaluesep\@nameuse{si@fix@##1}% + \si@log@debug{Option valuesep set to ##1}} + {\si@log@debug{Option valuesep set to ##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} +\let\unitsignonly\si +\si@newrobustcmd*{\ilu}[2][]{% + \begingroup + #1\unitvaluesep% + \unit{#2}% + \endgroup} +\let\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{textrm=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} +\let\per\relax +\si@newrobustcmd*{\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}{\liter} +%\begin{macro}{\ton} +%\begin{macro}{\days} +% Tonne is spelled as ``ton'' by \unitsdef, which is wrong in the UK +% at least (\SI{1}{ton} $=$ \SI{40}{cwt} $=$ \SI{2240}{lb}!). +% \begin{macrocode} +\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} +%\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} + \newunit{\micl}{\micro\liter} + \newunit{\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} +\requiresiconfigs{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 +% +%<*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} + [\csname si@svn@version\endcsname siunitx: Emulation of + SIstyle] +\si@emulating{sistyle}{2006/12/20 v2.3} +\sisetup{% + sepfour=true, + obeyfamily, + obeyitalic=true, + numsign=+-, + strictarc=false, + 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} +\let\num\relax +\si@newrobustcmd*{\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@decimalsymbol}} +% \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}{\SIdecimalsymbol} +%\begin{macro}{\SIthousandsep} +%\begin{macro}{\SIproductsign} +%\begin{macro}{\SIdecimalsign} +% The same is true here, with the appropriate translation. +% \begin{macrocode} +\newcommand*{\SIdecimalsymbol}[1]{\sisetup{decimalsymbol={#1}}} +\newcommand*{\SIthousandsep}[1]{\sisetup{digitsep={#1}}} +\newcommand*{\SIproductsign}[1]{\sisetup{expproduct={#1}}} +\newcommand*{\SIdecimalsign}[1]{\sisetup{decimalsymbol={#1}}} +% \end{macrocode} +%\end{macro} +%\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{mathrm}{#1}} +\newcommand*{\SIdefaultNfam}[1]{\si@sis@savefont{mathnumrm}{#1}} +\newcommand*{\SIdefaultTfam}[1]{\si@sis@savefont{textrm}{#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} +\si@newrobustcmd*{\ensureupmath}[1]{% + \begingroup + \sisetup{mode=maths,obeyitalic=false}% + \si@out{#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 +% +%<*SIunits> +%\fi +%\subsection{\SIunits} +% \SIunits emulation starts in much the same way. +% \begin{macrocode} +\ProvidesFile{si-SIunits.cfg} + [\csname si@svn@version\endcsname siunitx: Emulation of + SIunits] +\si@emulating{SIunits}{2007/12/02 v1.36} +\sisetup{ + unitsep=thick, + valuesep=thick, + prefixproduct=\si@valuesep, + trapambigfrac=false, + stickyper} +\requiresiconfigs{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@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} +%\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}{\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{\rperminute}{r/min} +\newunit{\ton}{t} +\newunit{\degreecelsius}{\celsius} +% \end{macrocode} +%\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}{\si@siu@newunit} +%\begin{macro}{\si@siu@power} +%\begin{macro}{\si@siu@newunithook} +% To save some code, making new units which need a \texttt{\ldots np} +% variant is handled by a dedicated macro.\\ +%\cs{si@siu@addunit}\oarg{power}\marg{pre}\marg{post} +% \begin{macrocode} +\newcommand*{\si@siu@newunit}[3][]{% +% \end{macrocode} +% A test is needed to sort out \cs{square}. +% \begin{macrocode} + \renewcommand*{\si@tempa}{#1}% + \renewcommand*{\si@tempb}{square}% + \renewcommand*{\si@siu@power}{}% + \ifx\@empty\si@tempa\@empty\else + \ifx\si@tempa\si@tempb + \renewcommand*{\si@siu@power}{\ssquare}% + \else + \edef\si@siu@power{% + \expandafter\noexpand\csname #1\endcsname}% + \fi + \fi +% \end{macrocode} +% The necessary information is now stored in temporary macros. +% \begin{macrocode} + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3\endcsname}% + \edef\si@tempb{% + \expandafter\noexpand\csname #2\endcsname\noexpand\per + \expandafter\noexpand\si@siu@power + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter% + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempb} + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3np\endcsname}% + \edef\si@tempb{% + \expandafter\noexpand\csname #2\endcsname\noexpand + \reciprocal\expandafter\noexpand\si@siu@power + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempb}% + \si@siu@newunithook[#1]{#2}{#3}} +\providecommand*{\si@siu@newunithook}[3][]{} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +% The basic units are now defined; these only have a single csname in +% each of the numerator and denominator. +% \begin{macrocode} +\si@siu@newunit{gray}{second} +\si@siu@newunit[square]{metre}{second} +\si@siu@newunit{joule}{mole} +\si@siu@newunit[cubic]{mole}{metre} +\si@siu@newunit[square]{radian}{second} +\si@siu@newunit{radian}{second} +\si@siu@newunit[cubic]{squaremetre}{metre} +\si@siu@newunit[cubic]{katal}{metre} +\si@siu@newunit{coulomb}{mol} +\si@siu@newunit[square]{ampere}{metre} +\si@siu@newunit[cubic]{kilogram}{metre} +\si@siu@newunit[cubic]{coulomb}{metre} +\si@siu@newunit{volt}{metre} +\si@siu@newunit[square]{coulomb}{squaremetre} +\si@siu@newunit{farad}{metre} +\si@siu@newunit[square]{watt}{metre} +\si@siu@newunit[square]{joule}{metre} +\si@siu@newunit[cubic]{newton}{metre} +\si@siu@newunit{newton}{kilogram} +\si@siu@newunit{joule}{kelvin} +\si@siu@newunit{joule}{kilogram} +\si@siu@newunit{coulomb}{kilogram} +\si@siu@newunit{squaremetre}{second} +\si@siu@newunit[square]{squaremetre}{second} +\si@siu@newunit[square]{candela}{metre} +\si@siu@newunit{ampere}{metre} +\si@siu@newunit{joule}{tesla} +\si@siu@newunit{henry}{metre} +\si@siu@newunit{kilogram}{second} +\si@siu@newunit[square]{kilogram}{metre} +\si@siu@newunit{kilogram}{metre} +\si@siu@newunit[square]{newton}{metre} +\si@siu@newunit{watt}{kilogram} +\si@siu@newunit[cubic]{watt}{metre} +\si@siu@newunit{squaremetre}{kilogram} +\si@siu@newunit{cubicmetre}{kilogram} +\si@siu@newunit{newton}{metre} +\si@siu@newunit[cubic]{squaremetre}{second} +\si@siu@newunit{metre}{second} +\si@siu@newunit[cubic]{joule}{metre} +\si@siu@newunit{cubicmetre}{second} +% \end{macrocode} +%\begin{macro}{\si@siu@newunitx} +%\begin{macro}{\si@siu@newunitxhook} +% For the more complex units, a slightly different approach is used; +% four arguments are required, and have to cover everything. +% \begin{macrocode} +\newcommand*{\si@siu@newunitx}[4]{% + \expandafter\newunit\expandafter{\csname #1per#2\endcsname} + {#3\per#4}% + \expandafter\newunit\expandafter{\csname #1per#2np\endcsname} + {#3\reciprocal#4} + \si@siu@newunitxhook{#1}{#2}{#3}{#4}} +\providecommand*{\si@siu@newunitxhook}[4]{} +% \end{macrocode} +%\end{macro} +%\end{macro} +% The units are defined. +% \begin{macrocode} +\si@siu@newunitx{kilogramsquaremetre}{second} + {\kilogram\squaremetre}{\second} +\si@siu@newunitx{squaremetre}{newtonsecond}{\squaremetre} + {\newton\second} +\si@siu@newunitx{kilogrammetre}{second}{\kilogram\metre} + {\second} +\si@siu@newunitx{kilogram}{squaremetresecond}{\kilogram} + {\squaremetre\second} +\si@siu@newunitx{joule}{molekelvin}{\joule}{\mole\kelvin} +\si@siu@newunitx{kilogram}{kilomole}{\kilogram}{\kilo\mole} +\si@siu@newunitx{kilogrammetre}{squaresecond}{\kilogram\metre} + {\second\squared} +\si@siu@newunitx{watt}{squaremetresteradian}{\watt} + {\squaremetre\steradian} +\si@siu@newunitx{joule}{kilogramkelvin}{\joule} + {\kilogram\kelvin} +\si@siu@newunitx{watt}{metrekelvin}{\watt}{\metre\kelvin} +\si@siu@newunitx{kilogram}{cubicmetrecoulomb}{\kilogram} + {\cubic\metre\coulomb} +\si@siu@newunitx{kilogram}{secondcubicmetre}{\kilogram} + {\second\cubicmetre} +% \end{macrocode} +%\begin{macro}{\si@siu@unity} +% A bit of cleverness to get the ``1'' correct; to avoid any clash, the unit +% is given an internal name. +% \begin{macrocode} +\newunit{\si@siu@unity}{1} +\si@siu@newunitx{}{squaremetresecond}{\si@siu@unity} + {\squaremetre\second} +% \end{macrocode} +%\end{macro} +% A few compound units that are best defined directly. +% \begin{macrocode} +\newunit{\pascalsecond}{\pascal\second} +\newunit{\amperemetresecond}{\ampere\metre\second} +\newunit{\ohmmetre}{\ohm\metre} +\newunit{\newtonmetre}{\newton\metre} +\let\newtonmetrenp\newtonmetre +\newunit{\kilogramsquaremetre}{\kilogram\squaremetre} +\let\kilogramsquaremetrenp\kilogramsquaremetre +% \end{macrocode} +%\begin{macro}{\si@siu@newprefix} +% To generate the prefixes correctly, a small saving in repetition.\\ +%\cs{si@siu@newprefix}\marg{prefix} +% \begin{macrocode} +\newcommand*{\si@siu@newprefix}[1]{% + \edef\si@tempa{\expandafter\noexpand\csname #1d\endcsname}% + \edef\si@tempb{\expandafter\noexpand\csname #1\endcsname}% + \expandafter\expandafter\expandafter\newcommand\expandafter + \expandafter\expandafter*\expandafter\expandafter + \expandafter{\expandafter\si@tempa\expandafter}\expandafter + {\expandafter\si@prefixsymbolicfalse\si@tempb}} +% \end{macrocode} +%\end{macro} +% This is now implemented. +% \begin{macrocode} +\si@siu@newprefix{yocto} +\si@siu@newprefix{zepto} +\si@siu@newprefix{atto} +\si@siu@newprefix{femto} +\si@siu@newprefix{pico} +\si@siu@newprefix{nano} +\si@siu@newprefix{micro} +\si@siu@newprefix{milli} +\si@siu@newprefix{centi} +\si@siu@newprefix{deca} +\si@siu@newprefix{deka} +\si@siu@newprefix{hecto} +\si@siu@newprefix{kilo} +\si@siu@newprefix{mega} +\si@siu@newprefix{giga} +\si@siu@newprefix{tera} +\si@siu@newprefix{peta} +\si@siu@newprefix{exa} +\si@siu@newprefix{zetta} +\si@siu@newprefix{yotta} +\ifsi@old@binary + \si@siu@newprefix{kibi} + \si@siu@newprefix{mebi} + \si@siu@newprefix{gibi} + \si@siu@newprefix{tebi} + \si@siu@newprefix{pebi} + \si@siu@newprefix{exbi} +\fi +% \end{macrocode} +%\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 +% +%<*hepunits> +%\fi +%\subsection{\pkg{hepunits}} +% The \pkg{hepunits} package provides some rather odd unit names, +% which are not really to be encouraged. +% \begin{macrocode} +\ProvidesFile{si-hepunits.cfg} + [\csname si@svn@version\endcsname Emulation of siunitx: + hepunits] +\si@emulating{hepunits}{2007/09/27} +\requiresiconfigs{SIunits,accepted,prefix,hep} +% \end{macrocode} +%\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} +\ifsi@old@noprefixcmds\else + \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} +\fi +% \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}{\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}{\per\milli\electronvolt} +\newunit{\kinveV}{\per\kilo\electronvolt} +\newunit{\MinveV}{\per\mega\electronvolt} +\newunit{\GinveV}{\per\giga\electronvolt} +\newunit{\TinveV}{\per\tera\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 +% +%<*fancynum> +%\fi +%\subsection{\pkg{fancynum}} +% \pkg{fancynum} only does things with numbers, so there is only +% a little emulation and a few macros needed. +% \begin{macrocode} +\ProvidesFile{si-fancynum.cfg} + [\csname si@svn@version\endcsname Emulation of siunitx: + fancynum] +\si@emulating{fancynum}{2000/08/08 0.92} +\sisetup{decimalsymbol=cdot,digitsep=comma} +% \end{macrocode} +%\begin{macro}{\fnum} +% The \cs{fnum} macro is rather restricted, but this is not +% reproduced. Instead, it is \cs{let} as an alias to the \cs{num} +% macro. +% \begin{macrocode} +\let\fnum\num +% \end{macrocode} +%\end{macro} +%\begin{macro}{\setfnumdsym} +%\begin{macro}{\setfnumgsym} +%\begin{macro}{\setfnummsym} +% The control macros are defined. +% \begin{macrocode} +\newcommand*{\setfnumdsym}[1]{\sisetup{decimalsymbol={#1}}} +\newcommand*{\setfnumgsym}[1]{\sisetup{digitsep={#1}}} +\newcommand*{\setfnummsym}[1]{\sisetup{expproduct={#1}}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +% The various package options are now processed if necessary. +% \begin{macrocode} +\ifsi@old@english + \sisetup{decimalsymbol=cdot,digitsep=comma} +\fi +\ifsi@old@french + \sisetup{decimalsymbol=comma,digitsep=fullstop} +\fi +\ifsi@old@tight + \sisetup{expproduct=tighttimes} +\fi +\ifsi@old@loose + \sisetup{expproduct=times} +\fi +\ifsi@old@thinspaces + \sisetup{digitsep=thin} +\fi +\ifsi@old@commas + \sisetup{digitsep=comma} +\fi +\ifsi@old@plain + \sisetup{digitsep=none} +\fi +% \end{macrocode} +% +%\iffalse +% +%<*fancyunits> +%\fi +%\subsection{\pkg{fancyunits}} +% The \pkg{fancyunits} package is not available on \textsc{ctan}, but +% is available from its authors homepage \cite{fancyunits}. It is +% similar to \SIunits, and so most of the code is shared here. +% However, a few bits of set up occur first, and an emulation-clash +% test is needed. +% \begin{macrocode} +\ProvidesFile{si-fancyunits.cfg} + [\csname si@svn@version\endcsname Emulation of siunitx: + fancyunits] +\si@emulating{fancyunits}{2007/02/01 v1.0.1} +\si@ifloaded{SIunits} + {\si@log@err{SIunits emulation loaded\MessageBreak before + fancyunits emulation}{You need to load the fancyunits + emualtion\MessageBreak code before that for + SIunits.\MessageBreak Try emulate=fancyunits as the first + option when\MessageBreak loading siunitx}}{} +% \end{macrocode} +%\begin{macro}{\si@siu@newunithook} +%\begin{macro}{\si@siu@newunitxhook} +% To create the extra macros provided by \pkg{fancyunits}, the +% \SIunits emulation code is changed to add the ``\texttt{uf}'' +% variants. +% \begin{macrocode} +\newcommand*{\si@siu@newunithook}[3][]{% + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3uf\endcsname}% + \renewcommand*{\si@tempb}{stickyper,per=fraction, + fraction=nice}% + \edef\si@tempc{% + \noexpand\sisetup{\si@tempb}% + \expandafter\noexpand\csname #2\endcsname\noexpand\si@per% + \expandafter\noexpand\si@siu@power% + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempc}% + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3Uf\endcsname}% + \renewcommand*{\si@tempb}{stickyper,per=fraction, + fraction=frac}% + \edef\si@tempc{% + \noexpand\sisetup{\si@tempb}% + \noexpand\def\noexpand\si@frc@hook{\noexpand\textstyle}% + \expandafter\noexpand\csname #2\endcsname\noexpand\si@per% + \expandafter\noexpand\si@siu@power% + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempc}% + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3UF\endcsname}% + \edef\si@tempc{% + \noexpand\sisetup{\si@tempb}% + \noexpand\def\noexpand\si@frc@hook{\noexpand\displaystyle}% + \expandafter\noexpand\csname #2\endcsname\noexpand\si@per% + \expandafter\noexpand\si@siu@power% + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempc}} +\newcommand*{\si@siu@newunitxhook}[4]{% + \expandafter\newunit\expandafter{\csname #1per#2uf\endcsname} + {\sisetup{stickyper,per=fraction,fraction=nice}% + #3\si@per#4}% + \expandafter\newunit\expandafter{\csname #1per#2Uf\endcsname} + {\sisetup{stickyper,per=fraction,fraction=frac}% + \renewcommand*{\si@frc@hook}{\textstyle}% + #3\si@per#4}% + \expandafter\newunit\expandafter{\csname #1per#2UF\endcsname} + {\sisetup{stickyper,per=fraction,fraction=frac}% + \renewcommand*{\si@frc@hook}{\displaystyle}% + #3\si@per#4}} +% \end{macrocode} +%\end{macro} +%\end{macro} +% With that done, the emulation modules can be loaded. +% \begin{macrocode} +\requiresiconfigs{SIunits,addn,astro} +\sisetup{obeyall} +% \end{macrocode} +% There is one \pkg{fancyunits}-specific option to handle. The other +% options all get sent through to the \SIunits system.\footnote{As +% \SIunits is rather more widely known than \pkg{fancyunits}, any +% other options which could be for either are assumed to be for +% \SIunits.} +% \begin{macrocode} +\ifsi@old@spaceqspace + \sisetup{valuesep=space} +\fi +% \end{macrocode} +%\begin{macro}{\paminute} +%\begin{macro}{\parsecond} +%\begin{macro}{\AstroE} +%\begin{macro}{\oersted} +%\begin{macro}{\ton} +% \pkg{fancyunits} provides some extra units, plus tonne spelled +% incorrectly (again). +% \begin{macrocode} +\newunit{\paminute}{'} +\newunit{\parsecond}{''} +\newunit{\AstroE}{AE} +\newunit{\oersted}{OE} +\provideunit{\ton}{t} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\decaD} +% An additional prefix. +% \begin{macrocode} +\let\decaD\decad +% \end{macrocode} +%\end{macro} +%\begin{macro}{\ufrac} +%\begin{macro}{\Ufrac} +%\begin{macro}{\UFrac} +% The fractional unit macros need to be reproduced. +% \begin{macrocode} +\newcommand*{\ufrac}[2]{% + \si[stickyper,per=fraction,fraction=nice]{#1\si@per#2}} +\newcommand*{\Ufrac}[2]{% + \ensuremath{\textstyle{% + \si[stickyper,per=fraction,fraction=frac]{#1\si@per#2}}}} +\newcommand*{\UFrac}[2]{% + \ensuremath{\displaystyle{% + \si[stickyper,per=fraction,fraction=frac]{#1\si@per#2}}}} +% \end{macrocode} +%\end{macro} +%\end{macro} +%\end{macro} +%\begin{macro}{\pow} +% A slightly-shorted named \cs{power}. +% \begin{macrocode} +\let\pow\power +% \end{macrocode} +%\end{macro} +%\begin{macro}{\Squaremetre} +% An alias for \cs{squaremetre}. +% \begin{macrocode} +\let\Squaremetre\squaremetre +% \end{macrocode} +%\end{macro} +% As with \SIunits, there is now a list of compound units to add. +% Only a few are not covered by the \SIunits emulation. +% \begin{macrocode} +\si@siu@newunit{Gray}{second} +\si@siu@newunit[square]{Squaremetre}{metre} +\si@siu@newunitx{Squaremetre}{newtonsecond}{\Square\metre} + {\newton\second} +\si@siu@newunit{Squaremetre}{second} +\si@siu@newunit[square]{Squaremetre}{squaresecond} +\si@siu@newunit{Squaremetre}{kilogram} +\si@siu@newunit[cubic]{Squaremetre}{second} +% \end{macrocode} +%\iffalse +% +%\fi +% +%\Finale +%\iffalse +%<*refs> +@misc{BIPM:EN, + note = {\url{http://www.bipm.org/en/si/}}, +} + +@misc{BIPM:FR, + note = {\url{http://www.bipm.org/fr/si/}}, +} + +@misc{BIPM:PDF, + note = {\url{http://www.bipm.org/en/si/si_brochure/}}, +} + +@misc{Eijkhout, + author = {Victor Eijkhout}, + note = {\url{http://www.eijkhout.net/tbt/}}, + title = {{\TeX} by {T}opic}, + year = {2007}, +} + +@misc{fancyunits, + author = {Heiko Bauke}, + note = {\url{http://www.mpi-hd.mpg.de/personalhomes/bauke/LaTeX/Tips_und_Tricks/fancyunits/index.php}}, + title = {\pkg{fancyunits}}, + year = 2007, +} + +@misc{IUPAC, + note = {\url{http://old.iupac.org/publications/books/gbook/green_book_2ed.pdf}}, + title = {The \textsc{iupac} {G}reen {B}ook}, + year = 1993, +} + +@misc{NIST, + note = {\url{http://physics.nist.gov/cuu/Units/index.html}}, +} +% +%<*jawltxdoc> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{jawltxdoc} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage[final]{listings,graphicx,microtype} +\usepackage[scaled=0.95]{helvet} +\usepackage[version=3]{mhchem} +\usepackage[osf]{mathpazo} +\usepackage{booktabs,array,url,courier,xspace,etoolbox,varioref} +\usepackage{upgreek,ifpdf,float,caption,longtable,babel} +\floatstyle{plaintop} +\restylefloat{table} +\labelformat{figure}{\figurename~#1} +\labelformat{table}{\tablename~#1} +\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} +\setcounter{IndexColumns}{2} +\newlength\LaTeXwidth +\newlength\LaTeXoutdent +\newlength\LaTeXgap +\setlength\LaTeXgap{1em} +\setlength\LaTeXoutdent{-0.15\textwidth} +\newbox\lst@samplebox +\edef\LaTeXexamplefile{\jobname.tmp} +\lst@RequireAspects{writefile} +\lstnewenvironment{LaTeXexample}[1][example]{% + \global\let\lst@intname\@empty + \ifcsname LaTeXcode#1\endcsname + \expandafter\let\expandafter\LaTeXcode + \csname LaTeXcode#1\endcsname + \expandafter\let\expandafter\LaTeXcodeend + \csname LaTeXcode#1end\endcsname + \else + \PackageError{jawltxdoc} + {Undefined example type `#1'} + \@ehd + \let\LaTeXcode\relax + \let\LaTeXcodeend\relax + \fi + \LaTeXcode} + {\lst@EndWriteFile + \LaTeXcodeend} +\newcommand*{\LaTeXcodeexample}{% + \setbox\lst@samplebox=\hbox\bgroup + \LaTeXcodefloat} +\newcommand*{\LaTeXcodeexampleend}{% + \egroup + \setlength\LaTeXwidth{\wd\lst@samplebox}% + \begin{list}{}{% + \setlength\itemindent{0pt} + \setlength\leftmargin\LaTeXoutdent + \setlength\rightmargin{0pt}}% + \item + \setlength\LaTeXoutdent{-0.15\textwidth} + \begin{minipage}[c]{% + \textwidth-\LaTeXwidth-\LaTeXoutdent-\LaTeXgap} + \LaTeXcodefloatend + \end{minipage}% + \hfill + \begin{minipage}[c]{\LaTeXwidth}% + \hbox to\linewidth{\box\lst@samplebox\hss}% + \end{minipage}% + \end{list}} +\let\LaTeXcodenoexample\LaTeXcodeexample +\newcommand*{\LaTeXcodenoexampleend}{% + \egroup + \setlength\LaTeXwidth{\wd\lst@samplebox}% + \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}} +\newcommand*{\LaTeXcodefloat}{% + \setkeys{lst}{tabsize=4,gobble=3,breakindent=0pt, + basicstyle=\small\ttfamily,basewidth=0.51em, + keywordstyle=\color{blue}}% + \lst@BeginAlsoWriteFile{\LaTeXexamplefile}} +\newcommand*{\LaTeXcodefloatend}{% + \MakePercentComment\catcode`\^^M=10\relax + \small + {\setkeys{lst}{SelectCharTable=\lst@ReplaceInput{\^\^I}% + {\lst@ProcessTabulator}}% + \leavevmode \input{\LaTeXexamplefile}}% + \MakePercentIgnore} +\lstnewenvironment{BibTeXexample}{% + \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{black}} + \lst@BeginAlsoWriteFile{\LaTeXexamplefile}} + {\lst@EndWriteFile + \LaTeXcodeexampleend} +\newcommand*{\DescribeOption}{% + \leavevmode\@bsphack\begingroup\MakePrivateLetters + \Describe@Option} +\newcommand*{\Describe@Option}[1]{\endgroup + \marginpar{\raggedleft\PrintDescribeEnv{#1}}% + \SpecialOptionIndex{#1}\@esphack\ignorespaces} +\newcommand*{\SpecialOptionIndex}[1]{\@bsphack + \index{#1\actualchar{\protect\ttfamily#1} + (option)\encapchar usage}% + \index{options:\levelchar#1\actualchar{\protect\ttfamily#1}% + \encapchar usage}\@esphack} +\newcommand*{\indexopt}[1]{\DescribeOption{#1}\opt{#1}} +\newcommand*{\DescribeOptionInfo}[2]{% + \DescribeOption{#1}% + \opt{#1=\meta{#2}}\xspace} +\newcommand*{\ofixarg}[1]{% + {\ttfamily[}% + \ifmmode \expandafter \nfss@text \fi + {% + \meta@font@select + \edef\meta@hyphen@restore{% + \hyphenchar\the\font\the\hyphenchar\font}% + \hyphenchar\font\m@ne + \language\l@nohyphenation + #1\/% + \meta@hyphen@restore + }% + {\ttfamily]}} +\newcommand*{\pkg}[1]{\textsf{#1}} +\newcommand*{\currpkg}{\pkg{\jobname}\xspace} +\newcommand*{\opt}[1]{\texttt{#1}} +\newcommand*{\defaultopt}[1]{\opt{\textbf{#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} +\DeclareRobustCommand*{\XeTeX} + {X\kern-.125em\lower.5ex\hbox{\reflectbox{E}}\kern-.1667em\TeX} +\providecommand*{\CTAN}{\textsc{ctan}} +\patchcmd{\@addmarginpar} + {\@latex@warning@no@line {Marginpar on page \thepage\space moved}} + {\relax}{}{} +% +%\fi diff --git a/Master/texmf-dist/source/latex/siunitx/siunitx.ins b/Master/texmf-dist/source/latex/siunitx/siunitx.ins new file mode 100644 index 00000000000..60b954530c6 --- /dev/null +++ b/Master/texmf-dist/source/latex/siunitx/siunitx.ins @@ -0,0 +1,79 @@ +%% +%% This is file `siunitx.ins', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `install') +%% ---------------------------------------------------------------- +%% The siunitx 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 siunitx 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 siunitx files:} +\generate{\file{jawltxdoc.sty}{\from{\jobname.dtx}{jawltxdoc}} +} +\usedir{tex/latex/siunitx} +\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}} +} +\usedir{source/latex/siunitx} +\generate{\file{\jobname.ins}{\from{\jobname.dtx}{install}} +} +\usedir{doc/latex/siunitx} +\generate{\file{si-bug.ltx}{\from{\jobname.dtx}{bug}} +} +\usedir{tex/latex/siunitx/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}} + \file{si-hepunits.cfg}{\from{\jobname.dtx}{hepunits}} + \file{si-fancynum.cfg}{\from{\jobname.dtx}{fancynum}} + \file{si-fancyunits.cfg}{\from{\jobname.dtx}{fancyunits}} +} +\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-astro.cfg}{\from{\jobname.dtx}{astro}} + \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-DE.cfg}{\from{\jobname.dtx}{DE}} + \file{si-ZA.cfg}{\from{\jobname.dtx}{ZA}} +} +\nopreamble +\usedir{bibtex/bib/siunitx} +\generate{\file{\jobname.bib}{\from{\jobname.dtx}{refs}} +} +\nopreamble\nopostamble +\usedir{doc/latex/siunitx} +\generate{\file{README.txt}{\from{\jobname.dtx}{readme}} +} +\endbatchfile +\endinput +%% +%% End of file `siunitx.ins'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-DE.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-DE.cfg new file mode 100644 index 00000000000..2f7b9d01d04 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-DE.cfg @@ -0,0 +1,27 @@ +%% +%% This is file `si-DE.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `DE') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-DE.cfg} + [\csname si@svn@version\endcsname siunitx: Germany locale] +\sisetup{ + unitsep=cdot, + valuesep=thin, + decimalsymbol=comma, + expproduct=cdot, + digitsep=thin, + sepfour=false} +\endinput +%% +%% End of file `si-DE.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-SIunits.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-SIunits.cfg new file mode 100644 index 00000000000..d6237983a9c --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-SIunits.cfg @@ -0,0 +1,329 @@ +%% +%% This is file `si-SIunits.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `SIunits') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-SIunits.cfg} + [\csname si@svn@version\endcsname siunitx: Emulation of + SIunits] +\si@emulating{SIunits}{2007/12/02 v1.36} +\sisetup{ + unitsep=thick, + valuesep=thick, + prefixproduct=\si@valuesep, + trapambigfrac=false, + stickyper} +\requiresiconfigs{prefix,named,accepted,physical} +\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} +\newcommand*{\rpsquared}{% + \sisetup{per=reciprocal}\si@unt@pertrue\si@unt@perseentrue% + \squared} +\newcommand*{\rpcubed}{% + \sisetup{per=reciprocal}\si@unt@pertrue\cubed} +\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 +\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}} +\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}} +\ifsi@old@italian + \let\unita\SI +\else + \let\unit\SI +\fi +\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 +\newunit[valuesep=none]{\arcminute}{\si@sym@minute} +\newunit[valuesep=none]{\arcsecond}{\si@sym@second} +\newunit{\rperminute}{r/min} +\newunit{\ton}{t} +\newunit{\degreecelsius}{\celsius} +\let\addunit\newunit +\newcommand*{\addprefix}[2]{\newprefix{#1}{#2}} +\newcommand*{\si@siu@newunit}[3][]{% + \renewcommand*{\si@tempa}{#1}% + \renewcommand*{\si@tempb}{square}% + \renewcommand*{\si@siu@power}{}% + \ifx\@empty\si@tempa\@empty\else + \ifx\si@tempa\si@tempb + \renewcommand*{\si@siu@power}{\ssquare}% + \else + \edef\si@siu@power{% + \expandafter\noexpand\csname #1\endcsname}% + \fi + \fi + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3\endcsname}% + \edef\si@tempb{% + \expandafter\noexpand\csname #2\endcsname\noexpand\per + \expandafter\noexpand\si@siu@power + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter% + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempb} + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3np\endcsname}% + \edef\si@tempb{% + \expandafter\noexpand\csname #2\endcsname\noexpand + \reciprocal\expandafter\noexpand\si@siu@power + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempb}% + \si@siu@newunithook[#1]{#2}{#3}} +\providecommand*{\si@siu@newunithook}[3][]{} +\si@siu@newunit{gray}{second} +\si@siu@newunit[square]{metre}{second} +\si@siu@newunit{joule}{mole} +\si@siu@newunit[cubic]{mole}{metre} +\si@siu@newunit[square]{radian}{second} +\si@siu@newunit{radian}{second} +\si@siu@newunit[cubic]{squaremetre}{metre} +\si@siu@newunit[cubic]{katal}{metre} +\si@siu@newunit{coulomb}{mol} +\si@siu@newunit[square]{ampere}{metre} +\si@siu@newunit[cubic]{kilogram}{metre} +\si@siu@newunit[cubic]{coulomb}{metre} +\si@siu@newunit{volt}{metre} +\si@siu@newunit[square]{coulomb}{squaremetre} +\si@siu@newunit{farad}{metre} +\si@siu@newunit[square]{watt}{metre} +\si@siu@newunit[square]{joule}{metre} +\si@siu@newunit[cubic]{newton}{metre} +\si@siu@newunit{newton}{kilogram} +\si@siu@newunit{joule}{kelvin} +\si@siu@newunit{joule}{kilogram} +\si@siu@newunit{coulomb}{kilogram} +\si@siu@newunit{squaremetre}{second} +\si@siu@newunit[square]{squaremetre}{second} +\si@siu@newunit[square]{candela}{metre} +\si@siu@newunit{ampere}{metre} +\si@siu@newunit{joule}{tesla} +\si@siu@newunit{henry}{metre} +\si@siu@newunit{kilogram}{second} +\si@siu@newunit[square]{kilogram}{metre} +\si@siu@newunit{kilogram}{metre} +\si@siu@newunit[square]{newton}{metre} +\si@siu@newunit{watt}{kilogram} +\si@siu@newunit[cubic]{watt}{metre} +\si@siu@newunit{squaremetre}{kilogram} +\si@siu@newunit{cubicmetre}{kilogram} +\si@siu@newunit{newton}{metre} +\si@siu@newunit[cubic]{squaremetre}{second} +\si@siu@newunit{metre}{second} +\si@siu@newunit[cubic]{joule}{metre} +\si@siu@newunit{cubicmetre}{second} +\newcommand*{\si@siu@newunitx}[4]{% + \expandafter\newunit\expandafter{\csname #1per#2\endcsname} + {#3\per#4}% + \expandafter\newunit\expandafter{\csname #1per#2np\endcsname} + {#3\reciprocal#4} + \si@siu@newunitxhook{#1}{#2}{#3}{#4}} +\providecommand*{\si@siu@newunitxhook}[4]{} +\si@siu@newunitx{kilogramsquaremetre}{second} + {\kilogram\squaremetre}{\second} +\si@siu@newunitx{squaremetre}{newtonsecond}{\squaremetre} + {\newton\second} +\si@siu@newunitx{kilogrammetre}{second}{\kilogram\metre} + {\second} +\si@siu@newunitx{kilogram}{squaremetresecond}{\kilogram} + {\squaremetre\second} +\si@siu@newunitx{joule}{molekelvin}{\joule}{\mole\kelvin} +\si@siu@newunitx{kilogram}{kilomole}{\kilogram}{\kilo\mole} +\si@siu@newunitx{kilogrammetre}{squaresecond}{\kilogram\metre} + {\second\squared} +\si@siu@newunitx{watt}{squaremetresteradian}{\watt} + {\squaremetre\steradian} +\si@siu@newunitx{joule}{kilogramkelvin}{\joule} + {\kilogram\kelvin} +\si@siu@newunitx{watt}{metrekelvin}{\watt}{\metre\kelvin} +\si@siu@newunitx{kilogram}{cubicmetrecoulomb}{\kilogram} + {\cubic\metre\coulomb} +\si@siu@newunitx{kilogram}{secondcubicmetre}{\kilogram} + {\second\cubicmetre} +\newunit{\si@siu@unity}{1} +\si@siu@newunitx{}{squaremetresecond}{\si@siu@unity} + {\squaremetre\second} +\newunit{\pascalsecond}{\pascal\second} +\newunit{\amperemetresecond}{\ampere\metre\second} +\newunit{\ohmmetre}{\ohm\metre} +\newunit{\newtonmetre}{\newton\metre} +\let\newtonmetrenp\newtonmetre +\newunit{\kilogramsquaremetre}{\kilogram\squaremetre} +\let\kilogramsquaremetrenp\kilogramsquaremetre +\newcommand*{\si@siu@newprefix}[1]{% + \edef\si@tempa{\expandafter\noexpand\csname #1d\endcsname}% + \edef\si@tempb{\expandafter\noexpand\csname #1\endcsname}% + \expandafter\expandafter\expandafter\newcommand\expandafter + \expandafter\expandafter*\expandafter\expandafter + \expandafter{\expandafter\si@tempa\expandafter}\expandafter + {\expandafter\si@prefixsymbolicfalse\si@tempb}} +\si@siu@newprefix{yocto} +\si@siu@newprefix{zepto} +\si@siu@newprefix{atto} +\si@siu@newprefix{femto} +\si@siu@newprefix{pico} +\si@siu@newprefix{nano} +\si@siu@newprefix{micro} +\si@siu@newprefix{milli} +\si@siu@newprefix{centi} +\si@siu@newprefix{deca} +\si@siu@newprefix{deka} +\si@siu@newprefix{hecto} +\si@siu@newprefix{kilo} +\si@siu@newprefix{mega} +\si@siu@newprefix{giga} +\si@siu@newprefix{tera} +\si@siu@newprefix{peta} +\si@siu@newprefix{exa} +\si@siu@newprefix{zetta} +\si@siu@newprefix{yotta} +\ifsi@old@binary + \si@siu@newprefix{kibi} + \si@siu@newprefix{mebi} + \si@siu@newprefix{gibi} + \si@siu@newprefix{tebi} + \si@siu@newprefix{pebi} + \si@siu@newprefix{exbi} +\fi +\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} + \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 +\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} + \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 +\InputIfFileExists{SIunits.cfg} + {\si@log@inf{SIunits config file loaded}} + {\si@log@inf{SIunits config file not found}} +\endinput +%% +%% End of file `si-SIunits.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-UK.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-UK.cfg new file mode 100644 index 00000000000..98aff00edb6 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-UK.cfg @@ -0,0 +1,27 @@ +%% +%% This is file `si-UK.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `UK') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-UK.cfg} + [\csname si@svn@version\endcsname siunitx: UK locale] +\sisetup{ + unitsep=thin, + expproduct=times, + valuesep=thin, + decimalsymbol=fullstop, + digitsep=thin, + sepfour=false} +\endinput +%% +%% End of file `si-UK.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-USA.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-USA.cfg new file mode 100644 index 00000000000..b8c5a064809 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-USA.cfg @@ -0,0 +1,27 @@ +%% +%% This is file `si-USA.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `USA') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-USA.cfg} + [\csname si@svn@version\endcsname siunitx: USA locale] +\sisetup{ + unitsep=thin, + expproduct=times, + valuesep=thin, + decimalsymbol=fullstop, + digitsep=thin, + sepfour=false} +\endinput +%% +%% End of file `si-USA.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-ZA.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-ZA.cfg new file mode 100644 index 00000000000..f2f0e09f749 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-ZA.cfg @@ -0,0 +1,28 @@ +%% +%% This is file `si-ZA.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `ZA') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-ZA.cfg} + [\csname si@svn@version\endcsname siunitx: + South Africa locale] +\sisetup{ + unitsep=cdot, + valuesep=thin, + expproduct=times, + decimalsymbol=comma, + digitsep=thin, + sepfour=false} +\endinput +%% +%% End of file `si-ZA.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-abbr.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-abbr.cfg new file mode 100644 index 00000000000..bf409115351 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-abbr.cfg @@ -0,0 +1,73 @@ +%% +%% This is file `si-abbr.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `abbr') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-abbr.cfg} + [\csname si@svn@version\endcsname siunitx: Abbreviated units] +\requiresiconfigs{prefix,named,accepted,physical} +\newunit{\pA}{\pico\ampere} +\newunit{\nA}{\nano\ampere} +\newunit{\micA}{\micro\ampere} +\newunit{\mA}{\milli\ampere} +\newunit{\kA}{\kilo\ampere} +\newunit{\Hz}{\hertz} +\newunit{\mHz}{\milli\hertz} +\newunit{\kHz}{\kilo\hertz} +\newunit{\MHz}{\mega\hertz} +\newunit{\GHz}{\giga\hertz} +\newunit{\THz}{\tera\hertz} +\newunit{\fmol}{\femto\mole} +\newunit{\pmol}{\pico\mole} +\newunit{\nmol}{\nano\mole} +\newunit{\micmol}{\micro\mole} +\newunit{\mmol}{\milli\mole} +\newunit{\kV}{\kilo\volt} +\newunit{\mV}{\milli\volt} +\provideunit{\ml}{\milli\litre} +\provideunit{\micl}{\micro\litre} +\newunit{\cmc}{\centi\metre\cubed} +\newunit{\dmc}{\deci\metre\cubed} +\newunit{\cms}{\centi\metre\squared} +\newunit{\kg}{\kilo\gram} +\provideunit{\fg}{\femto\gram} +\newunit{\pg}{\pico\gram} +\newunit{\nanog}{\nano\gram} +\newunit{\micg}{\micro\gram} +\newunit{\mg}{\milli\gram} +\newunit{\amu}{\atomicmass} +\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} +\newunit[unitsep=none]{\kWh}{\kilo\watt\hour} +\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} +\newunit{\Sec}{\second} +\newunit{\as}{\atto\second} +\newunit{\fs}{\femto\second} +\provideunit{\ps}{\pico\second} +\newunit{\ns}{\nano\second} +\newunit{\mics}{\micro\second} +\newunit{\ms}{\milli\second} +\endinput +%% +%% End of file `si-abbr.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-accepted.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-accepted.cfg new file mode 100644 index 00000000000..ffe8a8ca0ab --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-accepted.cfg @@ -0,0 +1,39 @@ +%% +%% This is file `si-accepted.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `accepted') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-accepted.cfg} + [\csname si@svn@version\endcsname siunitx: SI Accepted units] +\newunit{\minute}{min} +\newunit{\hour}{h} +\newunit{\Day}{d} +\newunit{\dday}{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{\liter}{L} +\newunit{\tonne}{t} +\newunit{\neper}{Np} +\newunit{\bel}{B} +\newunit{\percent}{\%} +\endinput +%% +%% End of file `si-accepted.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-addn.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-addn.cfg new file mode 100644 index 00000000000..89dc4487117 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-addn.cfg @@ -0,0 +1,33 @@ +%% +%% This is file `si-addn.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `addn') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-addn.cfg} + [\csname si@svn@version\endcsname siunitx: + SI Additional units] +\newunit{\angstrom}{\si@sym@ringA} +\newunit{\are}{a} +\newunit{\hectare}{\hecto\are} +\newunit{\barn}{b} +\newunit{\BAR}{bar} +\newunit{\bbar}{bar} +\newunit{\millibar}{\milli\BAR} +\newunit{\gal}{Gal} +\newunit{\curie}{Ci} +\newunit{\roentgen}{R} +\newunit{\rad}{rad} +\newunit{\rem}{rem} +\endinput +%% +%% End of file `si-addn.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-astro.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-astro.cfg new file mode 100644 index 00000000000..de516883511 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-astro.cfg @@ -0,0 +1,23 @@ +%% +%% This is file `si-astro.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `astro') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-astro.cfg} + [\csname si@svn@version\endcsname siunitx: + Units for astronomy] +\newunit{\parsec}{pc} +\newunit{\lightyear}{ly} +\endinput +%% +%% End of file `si-astro.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-binary.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-binary.cfg new file mode 100644 index 00000000000..110791abbcc --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-binary.cfg @@ -0,0 +1,30 @@ +%% +%% This is file `si-binary.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `binary') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-binary.cfg} + [\csname si@svn@version\endcsname siunitx: Binary units] +\newprefix[binary]{\kibi}{10}{Ki} +\newprefix[binary]{\mebi}{20}{Mi} +\newprefix[binary]{\gibi}{30}{Gi} +\newprefix[binary]{\tebi}{40}{Ti} +\newprefix[binary]{\pebi}{50}{Pi} +\newprefix[binary]{\exbi}{60}{Ei} +\newprefix[binary]{\zebi}{70}{Zi} +\newprefix[binary]{\yobi}{80}{Yi} +\newunit{\bit}{bit} +\newunit{\byte}{B} +\endinput +%% +%% End of file `si-binary.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-fancynum.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-fancynum.cfg new file mode 100644 index 00000000000..b60266bbc01 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-fancynum.cfg @@ -0,0 +1,48 @@ +%% +%% This is file `si-fancynum.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `fancynum') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-fancynum.cfg} + [\csname si@svn@version\endcsname Emulation of siunitx: + fancynum] +\si@emulating{fancynum}{2000/08/08 0.92} +\sisetup{decimalsymbol=cdot,digitsep=comma} +\let\fnum\num +\newcommand*{\setfnumdsym}[1]{\sisetup{decimalsymbol={#1}}} +\newcommand*{\setfnumgsym}[1]{\sisetup{digitsep={#1}}} +\newcommand*{\setfnummsym}[1]{\sisetup{expproduct={#1}}} +\ifsi@old@english + \sisetup{decimalsymbol=cdot,digitsep=comma} +\fi +\ifsi@old@french + \sisetup{decimalsymbol=comma,digitsep=fullstop} +\fi +\ifsi@old@tight + \sisetup{expproduct=tighttimes} +\fi +\ifsi@old@loose + \sisetup{expproduct=times} +\fi +\ifsi@old@thinspaces + \sisetup{digitsep=thin} +\fi +\ifsi@old@commas + \sisetup{digitsep=comma} +\fi +\ifsi@old@plain + \sisetup{digitsep=none} +\fi +\endinput +%% +%% End of file `si-fancynum.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-fancyunits.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-fancyunits.cfg new file mode 100644 index 00000000000..b784816341a --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-fancyunits.cfg @@ -0,0 +1,106 @@ +%% +%% This is file `si-fancyunits.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `fancyunits') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-fancyunits.cfg} + [\csname si@svn@version\endcsname Emulation of siunitx: + fancyunits] +\si@emulating{fancyunits}{2007/02/01 v1.0.1} +\si@ifloaded{SIunits} + {\si@log@err{SIunits emulation loaded\MessageBreak before + fancyunits emulation}{You need to load the fancyunits + emualtion\MessageBreak code before that for + SIunits.\MessageBreak Try emulate=fancyunits as the first + option when\MessageBreak loading siunitx}}{} +\newcommand*{\si@siu@newunithook}[3][]{% + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3uf\endcsname}% + \renewcommand*{\si@tempb}{stickyper,per=fraction, + fraction=nice}% + \edef\si@tempc{% + \noexpand\sisetup{\si@tempb}% + \expandafter\noexpand\csname #2\endcsname\noexpand\si@per% + \expandafter\noexpand\si@siu@power% + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempc}% + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3Uf\endcsname}% + \renewcommand*{\si@tempb}{stickyper,per=fraction, + fraction=frac}% + \edef\si@tempc{% + \noexpand\sisetup{\si@tempb}% + \noexpand\def\noexpand\si@frc@hook{\noexpand\textstyle}% + \expandafter\noexpand\csname #2\endcsname\noexpand\si@per% + \expandafter\noexpand\si@siu@power% + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempc}% + \edef\si@tempa{% + \expandafter\noexpand\csname #2per#1#3UF\endcsname}% + \edef\si@tempc{% + \noexpand\sisetup{\si@tempb}% + \noexpand\def\noexpand\si@frc@hook{\noexpand\displaystyle}% + \expandafter\noexpand\csname #2\endcsname\noexpand\si@per% + \expandafter\noexpand\si@siu@power% + \expandafter\noexpand\csname #3\endcsname}% + \expandafter\expandafter\expandafter\newunit\expandafter + \expandafter\expandafter{\expandafter\si@tempa\expandafter}% + \expandafter{\si@tempc}} +\newcommand*{\si@siu@newunitxhook}[4]{% + \expandafter\newunit\expandafter{\csname #1per#2uf\endcsname} + {\sisetup{stickyper,per=fraction,fraction=nice}% + #3\si@per#4}% + \expandafter\newunit\expandafter{\csname #1per#2Uf\endcsname} + {\sisetup{stickyper,per=fraction,fraction=frac}% + \renewcommand*{\si@frc@hook}{\textstyle}% + #3\si@per#4}% + \expandafter\newunit\expandafter{\csname #1per#2UF\endcsname} + {\sisetup{stickyper,per=fraction,fraction=frac}% + \renewcommand*{\si@frc@hook}{\displaystyle}% + #3\si@per#4}} +\requiresiconfigs{SIunits,addn,astro} +\sisetup{obeyall} +\ifsi@old@spaceqspace + \sisetup{valuesep=space} +\fi +\newunit{\paminute}{'} +\newunit{\parsecond}{''} +\newunit{\AstroE}{AE} +\newunit{\oersted}{OE} +\provideunit{\ton}{t} +\let\decaD\decad +\newcommand*{\ufrac}[2]{% + \si[stickyper,per=fraction,fraction=nice]{#1\si@per#2}} +\newcommand*{\Ufrac}[2]{% + \ensuremath{\textstyle{% + \si[stickyper,per=fraction,fraction=frac]{#1\si@per#2}}}} +\newcommand*{\UFrac}[2]{% + \ensuremath{\displaystyle{% + \si[stickyper,per=fraction,fraction=frac]{#1\si@per#2}}}} +\let\pow\power +\let\Squaremetre\squaremetre +\si@siu@newunit{Gray}{second} +\si@siu@newunit[square]{Squaremetre}{metre} +\si@siu@newunitx{Squaremetre}{newtonsecond}{\Square\metre} + {\newton\second} +\si@siu@newunit{Squaremetre}{second} +\si@siu@newunit[square]{Squaremetre}{squaresecond} +\si@siu@newunit{Squaremetre}{kilogram} +\si@siu@newunit[cubic]{Squaremetre}{second} +\endinput +%% +%% End of file `si-fancyunits.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-hep.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-hep.cfg new file mode 100644 index 00000000000..4e33ed98e37 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-hep.cfg @@ -0,0 +1,39 @@ +%% +%% This is file `si-hep.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `hep') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-hep.cfg} + [\csname si@svn@version\endcsname siunitx: Units for + high-energy physics] +\requiresiconfigs{prefix,named} +\provideunit{\micron}{\micro\metre} +\newunit{\mrad}{\milli\rad} +\newunit{\gauss}{G} +\newunit{\clight}{\ensuremath{\mathnormal{c}}} +\newunit{\eVperc}{\eV\per\clight} +\newunit{\nanobarn}{\nano\barn} +\newunit{\picobarn}{\pico\barn} +\newunit{\femtobarn}{\femto\barn} +\newunit{\attobarn}{\atto\barn} +\newunit{\zeptobarn}{\zepto\barn} +\newunit{\yoctobarn}{\yocto\barn} +\provideunit{\nb}{\nano\barn} +\provideunit{\pb}{\pico\barn} +\provideunit{\fb}{\femto\barn} +\provideunit{\ab}{\atto\barn} +\provideunit{\zb}{\zepto\barn} +\provideunit{\yb}{\yocto\barn} +\endinput +%% +%% End of file `si-hep.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-hepunits.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-hepunits.cfg new file mode 100644 index 00000000000..42b38b74b46 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-hepunits.cfg @@ -0,0 +1,71 @@ +%% +%% This is file `si-hepunits.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `hepunits') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-hepunits.cfg} + [\csname si@svn@version\endcsname Emulation of siunitx: + hepunits] +\si@emulating{hepunits}{2007/09/27} +\requiresiconfigs{SIunits,accepted,prefix,hep} +\ifsi@old@noprefixcmds\else + \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} + \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} +\fi +\newunit{\invcmsqpersecond}{\per\Square\centi\metre\per\second} +\newunit{\invcmsqpersec}{\per\Square\centi\metre\per\second} +\newunit{\lumiunits}{\per\Square\centi\metre\per\second} +\newunit{\inveV}{\per\electronvolt} +\newunit{\minveV}{\per\milli\electronvolt} +\newunit{\kinveV}{\per\kilo\electronvolt} +\newunit{\MinveV}{\per\mega\electronvolt} +\newunit{\GinveV}{\per\giga\electronvolt} +\newunit{\TinveV}{\per\tera\electronvolt} +\newunit[per=slash,eVcorrb=0.6ex]{\eVoverc} + {\electronvolt\per\clight} +\newunit[per=slash,eVcorrb=0.6ex]{\eVovercsq} + {\electronvolt\per\Square\clight} +\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} +\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} +\endinput +%% +%% End of file `si-hepunits.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-named.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-named.cfg new file mode 100644 index 00000000000..ef8fe1c3f06 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-named.cfg @@ -0,0 +1,55 @@ +%% +%% This is file `si-named.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `named') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-named.cfg} + [\csname si@svn@version\endcsname siunitx: SI Named units] +\newunit{\becquerel}{Bq} +\newunit{\coulomb}{C} +\newunit{\farad}{F} +\newunit{\Gray}{Gy} +\newunit{\ggray}{Gy} +\newunit{\hertz}{Hz} +\newunit{\henry}{H} +\newunit{\joule}{J} +\newunit{\katal}{kat} +\newunit{\lumen}{lm} +\newunit{\lux}{lx} +\newunit{\newton}{N} +\ifsi@old@OHM + \newunit{\Ohm}{\si@sym@Omega} +\else + \ifsi@gensymb\else + \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} +\ifsi@old@OHM + \newunit{\Celsius}{\si@sym@celsius} +\else + \ifsi@gensymb\else + \newunit{\celsius}{\si@sym@celsius} + \fi +\fi +\newunit{\radian}{rad} +\newunit{\steradian}{sr} +\endinput +%% +%% End of file `si-named.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-physical.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-physical.cfg new file mode 100644 index 00000000000..f0f9b580d6e --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-physical.cfg @@ -0,0 +1,27 @@ +%% +%% This is file `si-physical.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `physical') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-physical.cfg} + [\csname si@svn@version\endcsname siunitx: + 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} +\endinput +%% +%% End of file `si-physical.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-prefix.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-prefix.cfg new file mode 100644 index 00000000000..882b6985870 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-prefix.cfg @@ -0,0 +1,50 @@ +%% +%% This is file `si-prefix.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `prefix') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-prefix.cfg} + [\csname si@svn@version\endcsname siunitx: + 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} +\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} +\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} +\newprefix{\deka}{1}{da} +\newunit{\gram}{g} +\renewunit{\kilogram}{\kilo\gram} +\endinput +%% +%% End of file `si-prefix.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-prefixed.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-prefixed.cfg new file mode 100644 index 00000000000..5dce06ba0c8 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-prefixed.cfg @@ -0,0 +1,103 @@ +%% +%% This is file `si-prefixed.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `prefixed') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-prefixed.cfg} + [\csname si@svn@version\endcsname siunitx: + SI Prefixed units] +\requiresiconfigs{prefix,named,accepted,physical} +\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} +\newunit{\femtogram}{\femto\gram} +\newunit{\picogram}{\pico\gram} +\newunit{\nanogram}{\nano\gram} +\newunit{\microgram}{\micro\gram} +\newunit{\milligram}{\milli\gram} +\newunit{\femtomole}{\femto\mole} +\newunit{\picomole}{\pico\mole} +\newunit{\nanomole}{\nano\mole} +\newunit{\micromole}{\micro\mole} +\newunit{\millimole}{\milli\mole} +\newunit{\attosecond}{\atto\second} +\newunit{\femtosecond}{\femto\second} +\newunit{\picosecond}{\pico\second} +\newunit{\nanosecond}{\nano\second} +\newunit{\microsecond}{\micro\second} +\newunit{\millisecond}{\milli\second} +\newunit{\picoampere}{\pico\ampere} +\newunit{\nanoampere}{\nano\ampere} +\newunit{\microampere}{\micro\ampere} +\newunit{\milliampere}{\milli\ampere} +\newunit{\kiloampere}{\kilo\ampere} +\newunit{\millivolt}{\milli\volt} +\newunit{\kilovolt}{\kilo\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} +\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 +\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} +\newunit{\squaremetre}{\Square\metre} +\newunit{\squarecentimetre}{\Square\centi\metre} +\newunit{\centimetresquared}{\centi\metre\squared} +\newunit{\squarekilometre}{\Square\kilo\metre} +\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} +\newunit[unitsep=none]{\kilowatthour}{\kilo\watt\hour} +\newunit{\millihertz}{\milli\hertz} +\newunit{\kilohertz}{\kilo\hertz} +\newunit{\megahertz}{\mega\hertz} +\newunit{\gigahertz}{\giga\hertz} +\newunit{\terahertz}{\tera\hertz} +\newunit{\millinewton}{\milli\newton} +\newunit{\kilonewton}{\kilo\newton} +\newunit{\hectopascal}{\hecto\pascal} +\newunit{\megabecquerel}{\mega\becquerel} +\newunit{\millisievert}{\milli\sievert} +\endinput +%% +%% End of file `si-prefixed.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-sistyle.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-sistyle.cfg new file mode 100644 index 00000000000..aca37d6e003 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-sistyle.cfg @@ -0,0 +1,87 @@ +%% +%% This is file `si-sistyle.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `sistyle') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-sistyle.cfg} + [\csname si@svn@version\endcsname siunitx: Emulation of + SIstyle] +\si@emulating{sistyle}{2006/12/20 v2.3} +\sisetup{% + sepfour=true, + obeyfamily, + obeyitalic=true, + numsign=+-, + strictarc=false, + unitsep=cdot} +\newcommand*{\SIobeyboldtrue}{\sisetup{obeybold=true}} +\newcommand*{\SIobeyboldfalse}{\sisetup{obeybold=false}} +\let\num\relax +\si@newrobustcmd*{\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} +\newcommand*{\pnt}{\ensuremath{\si@decimalsymbol}} +\newcommand*{\SIgroupfourtrue}{\sisetup{sepfour=true}} +\newcommand*{\SIgroupfourfalse}{\sisetup{sepfour=false}} +\newcommand*{\SIunitsep}[1]{\sisetup{valuesep={#1}}} +\newcommand*{\SIunitspace}[1]{\sisetup{unitspace={#1}}} +\newcommand*{\SIunitdot}[1]{\sisetup{unitsep={#1}}} +\newcommand*{\SIdecimalsymbol}[1]{\sisetup{decimalsymbol={#1}}} +\newcommand*{\SIthousandsep}[1]{\sisetup{digitsep={#1}}} +\newcommand*{\SIproductsign}[1]{\sisetup{expproduct={#1}}} +\newcommand*{\SIdecimalsign}[1]{\sisetup{decimalsymbol={#1}}} +\newcommand*{\si@sis@savefont}[2]{% + \@namedef{si@sis@#1}{#2}% + \sisetup{#1=si@sis@#1}} +\newcommand*{\SImathrm}[1]{\si@sis@savefont{mathrm}{#1}} +\newcommand*{\SImathsf}[1]{\si@sis@savefont{mathsf}{#1}} +\newcommand*{\SImathtt}[1]{\si@sis@savefont{mathtt}{#1}} +\newcommand*{\SIdefaultMfam}[1]{\si@sis@savefont{mathrm}{#1}} +\newcommand*{\SIdefaultNfam}[1]{\si@sis@savefont{mathnumrm}{#1}} +\newcommand*{\SIdefaultTfam}[1]{\si@sis@savefont{textrm}{#1}} +\si@newrobustcmd*{\ensureupmath}[1]{% + \begingroup + \sisetup{mode=maths,obeyitalic=false}% + \si@out{#1}% + \endgroup} +\newcommand*{\degC}{\si@sym@celsius} +\newcommand*{\arcdeg}{\si@sym@degree} +\newcommand*{\degF}{\si@sym@degree F} +\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}} +\endinput +%% +%% End of file `si-sistyle.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-synchem.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-synchem.cfg new file mode 100644 index 00000000000..05f3f96d111 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-synchem.cfg @@ -0,0 +1,27 @@ +%% +%% This is file `si-synchem.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `synchem') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-synchem.cfg} + [\csname si@svn@version\endcsname siunitx: Units for + synthetic chemists] +\requiresiconfigs{prefix} +\newunit{\mmHg}{mmHg} +\newunit{\molar}{\mole\per\cubic\deci\metre} +\newunit{\Molar}{\textsc{m}} +\newunit{\torr}{Torr} +\newunit{\dalton}{Da} +\endinput +%% +%% End of file `si-synchem.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-units.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-units.cfg new file mode 100644 index 00000000000..d1514fdc9e4 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-units.cfg @@ -0,0 +1,53 @@ +%% +%% This is file `si-units.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `units') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\si@ifloaded{units}{\endinput}{} +\ProvidesFile{si-units.cfg} + [\csname si@svn@version\endcsname siunitx: Emulation of units] +\si@emulating{units}{1998/08/04 v0.9b} +\si@ifloaded{SIunits} + {\si@emclash{units}{SIunits}\endinput}{} +\si@ifloaded{sistyle} + {\si@emclash{units}{sistyle}\endinput}{} +\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 +\si@newrobustcmd*{\unit}[2][]{% + \ifmmode + \SI{#1}{#2}% + \else + \SI[obeyfamily,obeyitalic]{#1}{#2}% + \fi} +\si@newrobustcmd*{\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} +\endinput +%% +%% End of file `si-units.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/config/si-unitsdef.cfg b/Master/texmf-dist/tex/latex/siunitx/config/si-unitsdef.cfg new file mode 100644 index 00000000000..6d1575dd091 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/config/si-unitsdef.cfg @@ -0,0 +1,233 @@ +%% +%% This is file `si-unitsdef.cfg', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `unitsdef') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\ProvidesFile{si-unitsdef.cfg} + [\csname si@svn@version\endcsname siunitx: + Emulation of unitsdef] +\si@emulating{unitsdef}{2005/01/04 v0.2} +\si@ifloaded{SIunits} + {\si@emclash{unitsdef}{SIunits}\endinput}{} +\si@ifloaded{sistyle} + {\si@emclash{unitsdef}{sistyle}\endinput}{} +\requiresiconfigs{units} +\RequirePackage{textcomp} +\RequirePackage[T1]{fontenc} +\sisetup{mode=text,allowoptarg,prespace} +\ifsi@old@noxspace + \sisetup{xspace=false} +\fi +\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 +\newcommand*{\unitvaluesep}{\,} +\renewcommand*{\si@valuesep}{\text{\unitvaluesep}} +\define@choicekey*+[si]{key}{valuesep}[\si@tempa] + {space,thin,med,medium,thick,none} + {\renewcommand*\unitvaluesep\@nameuse{si@fix@##1}% + \si@log@debug{Option valuesep set to ##1}} + {\si@log@debug{Option valuesep set to ##1}% + \renewcommand*\unitvaluesep{##1}} +\let\unitsignonly\si +\si@newrobustcmd*{\ilu}[2][]{% + \begingroup + #1\unitvaluesep% + \unit{#2}% + \endgroup} +\let\arc\ang +\newcommand*{\unitSIdef}{\upshape} +\newcommand*{\si@unitSIdef}{\unitSIdef\selectfont} +\sisetup{textrm=si@unitSIdef} +\let\per\relax +\si@newrobustcmd*{\per}[2]{% + \begingroup + \si@xspacefalse + \renewcommand*{\unitvaluesep}{}% + \unitfrac{#1}{#2}% + \endgroup} +\newcommand*{\unittimes}{\ensuremath{\cdot}} +\newcommand*{\unitsep}{\,} +\renewcommand*{\si@unt@unithook}{\si@unt@litouttrue} +\sisetup{unitsep=none} +\newcommand*{\unitsuperscript}{\tothe} +\newcommand*{\newnosepunit}{\newunit[valuesep=none]} +\newcommand*{\renewnosepunit}{\renewunit[valuesep=none]} +\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}} +\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 +\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} +\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} +\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} +\newunit{\squaremeter}{\Square\meter} +\newunit{\squarecentimeter}{\Square\centi\meter} +\newunit{\squarekilometer}{\Square\kilo\meter} +\newunit{\ar}{a} +\newunit{\hectar}{\hecto\ar} +\ifsi@old@noabbr +\else + \ifsi@old@novoltageabbr\else + \newunit{\kv}{\kilo\volt} + \newunit{\mv}{\milli\volt} + \fi +\fi +\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} + \newunit{\micl}{\micro\liter} + \newunit{\ml}{\milli\liter} + \newunit{\cl}{\centi\liter} + \newunit{\dl}{\deci\liter} + \newunit{\hl}{\hecto\liter} + \fi +\fi +\newunit{\calory}{cal} +\newunit{\kilocalory}{\kilo\calory} +\newunit{\uBar}{ba} +\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 +\requiresiconfigs{prefix,named,addn,accepted} +\ifsi@old@noconfig\else + \InputIfFileExists{unitsdef.cfg} + {\si@log@inf{unitsdef config file loaded}} + {\si@log@inf{unitsdef config file not found}} +\fi +\endinput +%% +%% End of file `si-unitsdef.cfg'. diff --git a/Master/texmf-dist/tex/latex/siunitx/siunitx.sty b/Master/texmf-dist/tex/latex/siunitx/siunitx.sty new file mode 100644 index 00000000000..a51067b4669 --- /dev/null +++ b/Master/texmf-dist/tex/latex/siunitx/siunitx.sty @@ -0,0 +1,3509 @@ +%% +%% This is file `siunitx.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% siunitx.dtx (with options: `package') +%% ---------------------------------------------------------------- +%% The siunitx 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 +%% ---------------------------------------------------------------- +%% +\NeedsTeXFormat{LaTeX2e} +\newcommand*{\si@svn@ver}{v1.0} +\def\si@svn@id$#1: #2.#3 #4 #5-#6-#7 #8 #9${% + \newcommand*{\si@svn@version}{% + #5/#6/#7\space\si@svn@ver\space}} +\si@svn@id $Id: siunitx.dtx 76 2008-06-15 08:10:34Z joseph $ +\ProvidesPackage{siunitx} + [\si@svn@version A comprehensive (SI) units package] +\begingroup + \@ifundefined{eTeXversion} + {\PackageError{siunitx} + {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} +\edef\si@catcodes{% + \catcode\string`\string ` \the\catcode\string`\`\relax + \catcode\string`\string = \the\catcode\string`\=\relax + \catcode\string`\string ^ \the\catcode\string`\^\relax + \catcode\string`\string ~ \the\catcode\string`\~\relax + \catcode\string`\string : \the\catcode\string`\:\relax + \catcode\string`\string - \the\catcode\string`\-\relax + \catcode\string`\string + \the\catcode\string`\+\relax + \catcode\string`\string ; \the\catcode\string`\;\relax + \catcode\string`\string , \the\catcode\string`\,\relax + \catcode\string`\string . \the\catcode\string`\.\relax} +\catcode\string`\` 12\relax +\catcode`\= 12\relax +\catcode`\^ 7\relax +\catcode`\~ \active\relax +\@makeother{\:} +\@makeother{\-} +\@makeother{\+} +\@makeother{\;} +\@makeother{\,} +\@makeother{\.} +\RequirePackage{xkeyval}[2005/05/07] +\RequirePackage{amstext,array,xspace} +\newcommand*{\si@tempa}{} +\newcommand*{\si@tempb}{} +\newcommand*{\si@tempc}{} +\newif\ifsi@switch +\newbox\si@tempboxa +\newbox\si@tempboxb +\newbox\si@tempboxc +\newbox\si@tempboxd +\newcommand*{\si@blockpkgs}{SIunits,sistyle,siunits,SIstyle,% + unitsdef,fancyunits} +\newcommand*{\si@checkpkgs}{units,hepunits,fancynum} +\newcommand*{\si@packagecheck}{% + \begingroup + \@for\si@tempa:=\si@blockpkgs\do{ + \@ifpackageloaded{\si@tempa} + {\PackageError{siunitx} + {Package `\si@tempa' incompatible} + {The \si@tempa\space package and siunitx are + incompatible.\MessageBreak Use the + `emulate=\si@tempa' package option when loading + siunitx}} + {}} + \@for\si@tempa:=\si@checkpkgs\do{% + \@ifpackageloaded{\si@tempa} + {\PackageWarning{siunitx} + {Consider loading the siunitx package + with\MessageBreak option `emulate=\si@tempa', rather + than\MessageBreak loading both \si@tempa\space and + siunitx}} + {}} + \endgroup} +\si@packagecheck +\AtBeginDocument{\si@packagecheck} +\newcommand*{\si@ifdefinable}[1]{% + \expandafter\expandafter\expandafter\@ifundefined% + \expandafter\expandafter\expandafter% + {\expandafter\@gobble\string#1}} +\newcommand*{\si@addtolist}[2]{% + \ifx\@empty#1\@empty + \edef#1{#2}% + \else + \edef#1{#1,#2}% + \fi} +\newtoks{\si@temptoks} +\newcommand*{\si@addtocsname}[2]{% + \@ifundefined{#1} + {\expandafter\gdef\csname #1\endcsname{#2}} + {\si@temptoks\expandafter\expandafter\expandafter{% + \csname #1\endcsname#2}% + \expandafter\xdef\csname #1\endcsname{\the\si@temptoks}}} +\begingroup + \catcode`\Q=3 + \long\gdef\si@ifmtarg#1{% + \si@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil} + \long\gdef\si@xifmtarg#1#2Q#3#4#5\@nil{#4} + \long\gdef\si@ifnotmtarg#1{% + \si@xifmtarg#1QQ\@firstofone\@gobble\@nil} +\endgroup +\@ifpackageloaded{etoolbox} + {\let\si@newrobustcmd\newrobustcmd} + {\protected\def\si@newrobustcmd{% + \@ifstar + {\let\l@ngrel@x\protected\si@newcommand} + {\def\l@ngrel@x{\protected\long}\si@newcommand}} + \newcommand*{\si@newcommand}[1]{\@testopt{\si@newcmd#1}0} + \def\si@newcmd#1[#2]{% + \@ifnextchar[%] + {\si@xargdef#1[#2]} + {\@argdef#1[#2]}} + \long\def\si@xargdef#1[#2][#3]#4{% + \@ifdefinable#1{% + \expandafter\protected + \expandafter\def + \expandafter#1% + \expandafter{% + \expandafter\@testopt + \csname\string#1\endcsname{#3}}% + \expandafter\@yargdef + \csname\string#1\endcsname\tw@{#2}{#4}}}} +\newif\ifsi@debug +\newif\ifsi@logmin +\newif\ifsi@lognone +\newcommand*{\si@log@err}[2]{% + \ifsi@lognone\else + \ifsi@logmin + \PackageWarning{siunitx}{#1}% + \else + \PackageError{siunitx}{#1}{#2}% + \fi + \fi} +\newcommand*{\si@log@warn}[1]{% + \ifsi@lognone\else + \ifsi@logmin\else + \PackageWarning{siunitx}{#1}% + \fi + \fi} +\newcommand*{\si@log@inf}[1]{% + \ifsi@lognone\else + \ifsi@logmin\else + \PackageInfo{siunitx}{#1}% + \fi + \fi} +\newcommand*{\si@log@debug}[1]{% + \ifsi@lognone\else + \ifsi@debug + \PackageInfo{siunitx}{#1}% + \fi + \fi} +\newcommand*{\si@str@ifchrstr}[2]{% + \begingroup + \si@switchfalse + \renewcommand*{\si@tempa}{#1}% + \protected@edef\si@tempb{#2}% + \expandafter\si@str@chrstr\si@tempb\@empty\@empty\@empty + \ifsi@switch + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\def\si@str@chrstr#1#2\@empty{% + \renewcommand*{\si@tempc}{#1}% + \ifx\si@tempa\si@tempc + \expandafter\si@switchtrue + \else + \ifx\@empty#2\@empty\else + \si@str@chrstr#2\@empty\@empty + \fi + \fi} +\newcommand*{\si@str@ifonlychrs}[2]{% + \begingroup + \si@switchtrue + \protected@edef\si@tempa{#1}% + \renewcommand*{\si@tempb}{#2}% + \expandafter\si@str@onlychrs\si@tempa\@empty\@empty\@empty + \ifsi@switch + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\def\si@str@onlychrs#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@tempb} + {}{\si@switchfalse}% + \ifx\@empty#2\@empty\else + \si@str@onlychrs#2\@empty\@empty + \fi} +\newcommand*{\sisetup}{\setkeys[si]{key}} +\newcommand*{\si@opt@key}[2]{% + \define@key[si]{key}{#1} + {#2\si@log@debug{Option #1 set to ##1}}} +\newcommand*{\si@opt@cmdkey}[3][]{% + \define@cmdkey[si]{key}[si@]{#2}[#1]{#3}} +\newcommand*{\si@opt@cmdkeys}[2][]{% + \define@cmdkeys[si]{key}[si@]{#2}[#1]} +\newcommand*{\si@opt@boolkey}[2][]{% + \define@boolkey[si]{key}[si@]{#2}[true] + {#1\si@log@debug{Option #2 set to ##1}}} +\newcommand*{\si@opt@choicekey}[4][]{% + \define@choicekey*+[si]{key}{#2}[\si@tempa]{#3}[#1] + {#4\si@log@debug{Option #2 set to ##1}} + {\si@log@warn{Unknown value `##1' for option #2}}} +\newcommand*{\si@opt@xchoicekey}[3]{% + \define@choicekey*+[si]{key}{#1}[\si@tempa]{#2}[#1] + {\si@log@debug{Option #1 set to ##1}% + \expandafter\renewcommand\expandafter*\expandafter{% + \csname si@#1\endcsname}{\@nameuse{si@fix@##1}}} + {\si@log@debug{Option #1 set to ##1}% + \expandafter\renewcommand\expandafter*\expandafter{% + \csname si@#1\endcsname}{##1}} + \expandafter\newcommand\expandafter*\expandafter{% + \csname si@#1\endcsname}% + {\@nameuse{si@fix@#3}}} +\newcommand*{\si@opt@compatkey}[2]{% + \define@boolkey[si]{key}[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 siunitx package}}} +\newcommand*{\si@opt@disablekey}[2]{% + \key@ifundefined[si]{key}{#1} + {} + {\si@log@debug{Disabling key #1}% + \si@opt@key{#1}{\si@log@warn{#2}}}} +\si@opt@choicekey[normal]{log}{debug,verbose,normal,errors,none} + {\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} +\si@opt@boolkey{debug} +\si@opt@boolkey[% + \ifsi@strict + \sisetup{ + obeymode=false, + obeybold=false, + obeyitalic=false, + mode=maths, + repeatunits=true, + trapambigerr=true, + trapambigfrac=true} + \@for\si@tempa:=obeyall,obeymode,obeyitalic,mode,unitmode,% + valuemode,textmode,obeybold,repeatunits,trapambigerr,% + trapambigfrac\do{% + \begingroup + \edef\si@tempb{\endgroup + \noexpand\si@opt@disablekey{\si@tempa} + {Option `\si@tempa' forbidden in strict mode}}% + \si@tempb} + \fi]{strict} +\AtEndOfPackage{ + \si@opt@disablekey{strict} + {Option `strict' only available when\MessageBreak + loading package}} +\newcommand*{\si@emulate}{} +\si@opt@key{emulate}{\si@addtolist{\si@emulate}{#1}} +\AtEndOfPackage{ + \si@opt@disablekey{emulate} + {Option `emulate' only available when\MessageBreak + loading package}} +\si@opt@xchoicekey{unitsep} + {thin,med,medium,thick,none,comma,stop,fullstop,period, + times,tighttimes,cdot,tightcdot}{thin} +\si@opt@xchoicekey{unitspace}{space,thin,med,medium,thick, + none}{thin} +\si@opt@xchoicekey{errspace}{space,thin,med,medium,thick, + none}{none} +\si@opt@xchoicekey{valuesep} + {thin,med,medium,thick,none,comma,stop,fullstop,period, + times,tighttimes,cdot,tightcdot}{thin} +\si@opt@xchoicekey{digitsep} + {thin,med,medium,thick,none,comma,stop,fullstop,period, + times,tighttimes,cdot,tightcdot}{thin} +\si@opt@xchoicekey{decimalsymbol}{comma,stop,fullstop,period, + cdot,tightcdot}{fullstop} +\si@opt@xchoicekey{anglesep} + {thin,med,medium,thick,none,comma,stop,fullstop,period, + times,tighttimes,cdot,tightcdot}{none} +\si@opt@boolkey{obeymode} +\newif\ifsi@numtextmode +\newif\ifsi@unittextmode +\si@opt@choicekey[true]{textmode}{true,false} + {\si@numtextmodefalse + \si@unittextmodefalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@numtextmodetrue + \si@unittextmodetrue + \fi} +\si@opt@choicekey{mode}{math,maths,text} + {\si@numtextmodefalse + \si@unittextmodefalse + \renewcommand*{\si@tempb}{text}% + \ifx\si@tempa\si@tempb + \si@numtextmodetrue + \si@unittextmodetrue + \fi} +\si@opt@choicekey{valuemode}{math,maths,text} + {\si@numtextmodefalse + \renewcommand*{\si@tempb}{text}% + \ifx\si@tempa\si@tempb + \si@numtextmodetrue + \fi} +\si@opt@choicekey{unitmode}{math,maths,text} + {\si@unittextmodefalse + \renewcommand*{\si@tempb}{text}% + \ifx\si@tempa\si@tempb + \si@unittextmodetrue + \fi} +\si@opt@boolkey{obeyfamily} +\si@opt@boolkey{obeybold} +\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@opt@boolkey{obeyitalic} +\si@opt@boolkey{detectdisplay} +\si@opt@choicekey[true]{obeyall}{true,false} + {\si@obeyboldfalse + \si@obeyitalicfalse + \si@obeymodefalse + \si@obeyfamilyfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@obeyboldtrue + \si@obeyitalictrue + \si@obeymodetrue + \si@obeyfamilytrue + \fi} +\si@opt@cmdkeys{valuemathsrm,valuemathssf,valuemathstt} +\si@opt@cmdkeys{unitmathsrm,unitmathssf,unitmathstt} +\si@opt@key{valuemathrm}{\sisetup{valuemathsrm=#1}} +\si@opt@key{valuemathsf}{\sisetup{valuemathssf=#1}} +\si@opt@key{valuemathtt}{\sisetup{valuemathstt=#1}} +\si@opt@key{unitmathrm}{\sisetup{unitmathsrm=#1}} +\si@opt@key{unitmathsf}{\sisetup{unitmathssf=#1}} +\si@opt@key{unitmathtt}{\sisetup{unitmathstt=#1}} +\si@opt@key{mathsrm}{\sisetup{valuemathsrm=#1,unitmathsrm=#1}} +\si@opt@key{mathssf}{\sisetup{valuemathssf=#1,unitmathssf=#1}} +\si@opt@key{mathstt}{\sisetup{valuemathstt=#1,unitmathstt=#1}} +\si@opt@key{mathrm}{\sisetup{valuemathsrm=#1,unitmathsrm=#1}} +\si@opt@key{mathsf}{\sisetup{valuemathssf=#1,unitmathssf=#1}} +\si@opt@key{mathtt}{\sisetup{valuemathstt=#1,unitmathstt=#1}} +\si@opt@cmdkeys{valuetextrm,valuetextsf,valuetexttt} +\si@opt@cmdkeys{unittextrm,unittextsf,unittexttt} +\si@opt@key{textrm}{\sisetup{unittextrm=#1,valuetextrm=#1}} +\si@opt@key{textsf}{\sisetup{unittextsf=#1,valuetextsf=#1}} +\si@opt@key{texttt}{\sisetup{unittexttt=#1,valuetexttt=#1}} +\si@opt@cmdkeys{numdigits,numdecimal,numexp,numgobble,numsign,% + numcloseerr,numopenerr,numaddn,numprod} +\newcommand*{\si@numextra}{% + \si@numopenerr\si@numcloseerr\si@numaddn} +\newcommand*{\si@numvalid}{\si@numgobble\si@numexp\si@numsign + \si@numdecimal\si@numdigits\si@numextra\si@numprod} +\si@opt@boolkey{seperr} +\si@opt@boolkey{trapambigerr} +\si@opt@cmdkeys{openerr,closeerr} +\si@opt@boolkey{sepfour} +\si@opt@boolkey{retainplus} +\si@opt@xchoicekey{expproduct}{times,tighttimes, + cdot,tightcdot}{times} +\si@opt@xchoicekey{expbase}{ten}{ten} +\si@opt@boolkey{allowzeroexp} +\si@opt@xchoicekey{prefixproduct}{times,tighttimes,cdot, + tightcdot,none}{times} +\si@opt@xchoicekey{prefixbase}{ten,two}{ten} +\si@opt@boolkey{prefixsymbolic} +\newif\ifsi@num@padlead +\newif\ifsi@num@padtrail +\si@opt@choicekey[all]{padnumber} + {leading,lead,trailing,trail,all,both,true,none,false} + {\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} +\newif\ifsi@num@signmant +\newif\ifsi@num@signexp +\si@opt@xchoicekey{sign}{plus,minus,pm,mp}{plus} +\si@opt@choicekey[all]{addsign} + {mantissa,exponent,mant,exp,all,both,true,none,false} + {\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@opt@boolkey{tightpm} +\newcommand*{\si@pm}{% + \ifsi@tightpm + \si@fix@tightpm + \else + \si@fix@pm + \fi} +\newif\ifsi@ang@padsmall +\newif\ifsi@ang@padlarge +\si@opt@choicekey[all]{padangle} + {small,large,all,both,true,none,false} + {\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} +\newif\ifsi@ang@toarc +\newif\ifsi@ang@todec +\si@opt@choicekey[all]{angformat} + {dec,decimal,arc,dms,unchanged,none} + {\si@ang@toarcfalse + \si@ang@todecfalse + \renewcommand*{\si@tempb}{dec}% + \ifx\si@tempa\si@tempb + \si@ang@todectrue + \fi + \renewcommand*{\si@tempb}{decimal}% + \ifx\si@tempa\si@tempb + \si@ang@todectrue + \fi + \renewcommand*{\si@tempb}{arc}% + \ifx\si@tempa\si@tempb + \si@ang@toarctrue + \fi + \renewcommand*{\si@tempb}{dms}% + \ifx\si@tempa\si@tempb + \si@ang@toarctrue + \fi} +\si@opt@boolkey{astroang} +\si@opt@boolkey{strictarc} +\newif\ifsi@tab@fixed +\si@opt@choicekey{tabnumalign} + {centredecimal,centerdecimal,right,left,centre,center} + {\si@tab@fixedtrue + \let\si@tab@rfill@S\hfil + \let\si@tab@lfill@S\hfil + \renewcommand*{\si@tempb}{right}% + \ifx\si@tempa\si@tempb + \let\si@tab@lfill@S\hfill + \fi + \renewcommand*{\si@tempb}{left}% + \ifx\si@tempa\si@tempb + \let\si@tab@rfill@S\hfill + \fi + \renewcommand*{\si@tempb}{centredecimal}% + \ifx\si@tempa\si@tempb + \expandafter\si@tab@fixedfalse + \fi + \renewcommand*{\si@tempb}{centerdecimal}% + \ifx\si@tempa\si@tempb + \expandafter\si@tab@fixedfalse + \fi} +\si@opt@key{tabalign}{\sisetup{tabnumalign=#1,tabtextalign=#1, + tabunitalign=#1}} +\si@opt@boolkey{tabalignexp} +\newcount\si@tab@mantprecnt +\newcount\si@tab@mantpostcnt +\newcount\si@tab@expprecnt +\newcount\si@tab@exppostcnt +\newif\ifsi@tab@mantsign +\newif\ifsi@tab@expsign +\si@opt@cmdkey{tabformat} + {\si@num@fixpm + \renewcommand*{\si@num@arg}{tabformat data}% + \renewcommand*{\si@num@exp}{}% + \renewcommand*{\si@num@mant}{}% + \si@tab@mantsignfalse + \si@tab@expsignfalse + \si@switchfalse + \si@num@sepmantexp{#1}% + \si@num@sepsign{mant}% + \ifx\@empty\si@num@mantsign\@empty + \ifsi@num@delplus + \expandafter\expandafter\expandafter\si@tab@mantsigntrue + \fi + \else + \expandafter\si@tab@mantsigntrue + \fi + \si@num@sepsign{exp}% + \ifx\@empty\si@num@expsign\@empty + \ifsi@num@delplus + \expandafter\expandafter\expandafter\si@tab@expsigntrue + \fi + \else + \expandafter\si@tab@expsigntrue + \fi + \si@opt@proctform{mant}% + \si@opt@proctform{exp}% + \ifnum\si@tab@mantpostcnt=\z@\relax + \ifnum\si@tab@mantprecnt=\z@\relax + \si@log@err{Empty mantissa argument for tabformat} + {The argument `#1' contains no valid entry for + a mantissa\MessageBreak It should be of the + form `m.n', where m and n are integers}% + \else + \si@log@warn{Argument of tabformat contains\MessageBreak + no decimal part}% + \fi + \else + \ifnum\si@tab@mantprecnt=\z@\relax + \si@log@warn{Argument of tabformat contains\MessageBreak + no integer part}% + \fi + \fi + \ifsi@tab@fixed\else + \sisetup{tabnumalign=centre}% + \fi + \let\pm\si@num@pm + \let\mp\si@num@mp} +\newcommand*{\si@opt@proctform}[1]{% + \renewcommand*{\si@num@predec}{}% + \renewcommand*{\si@num@postdec}{}% + \si@switchfalse + \expandafter\si@ifnotmtarg\expandafter{% + \csname si@num@#1\endcsname} + {\expandafter\expandafter\expandafter\si@num@digits + \csname si@num@#1\endcsname\@empty\@empty}% + \csname si@tab@#1precnt\endcsname\z@\relax + \csname si@tab@#1postcnt\endcsname\z@\relax + \ifx\@empty\si@num@predec\@empty\else + \csname si@tab@#1precnt\endcsname\si@num@predec\relax + \fi + \ifx\@empty\si@num@postdec\@empty\else + \csname si@tab@#1postcnt\endcsname\si@num@postdec\relax + \fi} +\si@opt@choicekey{tabtextalign}{left,right,centre,center} + {\let\si@tab@rfill@t\hfill + \let\si@tab@lfill@t\hfill + \renewcommand*{\si@tempb}{right}% + \ifx\si@tempa\si@tempb + \let\si@tab@rfill@t\relax + \fi + \renewcommand*{\si@tempb}{left}% + \ifx\si@tempa\si@tempb + \let\si@tab@lfill@t\relax + \fi} +\si@opt@choicekey{tabunitalign}{left,right,centre,center} + {\let\si@tab@rfill@s\hfill + \let\si@tab@lfill@s\hfill + \renewcommand*{\si@tempb}{right}% + \ifx\si@tempa\si@tempb + \let\si@tab@rfill@s\relax + \fi + \renewcommand*{\si@tempb}{left}% + \ifx\si@tempa\si@tempb + \let\si@tab@lfill@s\relax + \fi} +\si@opt@boolkey{fixdp} +\newcount\si@num@dp +\si@opt@key{dp}{% + \si@str@ifonlychrs{#1}{0123456789} + {} + {\si@log@err{Invalid input for dp option} + {The dp option must be given a positive integer}}% + \si@num@dp#1\relax + \si@fixdptrue} +\si@opt@boolkey{tabautofit} +\si@opt@boolkey{xspace} +\si@opt@boolkey + [\si@unt@numfalse + \ifsi@prespace + \si@unt@numtrue + \fi] + {prespace} +\si@opt@boolkey{allowoptarg} +\newif\ifsi@slash +\newif\ifsi@frac +\si@opt@boolkey{stickyper} +\si@opt@choicekey[reciprocal]{per} + {reciprocal,rp,power,slash,frac,fraction} + {\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@opt@xchoicekey{slash}{slash}{slash} +\newif\ifsi@repeatunits +\newif\ifsi@addunitpower +\si@opt@choicekey[true]{repeatunits}{true,false,power} + {\si@repeatunitsfalse + \si@addunitpowerfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@repeatunitstrue + \fi + \renewcommand*{\si@tempb}{power}% + \ifx\si@tempa\si@tempb + \si@addunitpowertrue + \fi} +\si@opt@boolkey{trapambigfrac} +\si@opt@cmdkeys{closefrac,openfrac} +\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@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 package} + \si@opt@disablekey{noload} + {Configuration files can only be used\MessageBreak + when loading package}} +\AtEndOfPackage{ + \si@opt@key{alsoload}{% + \@for\si@tempa:=#1\do{\si@loadfile{\si@tempa}}}} +\si@opt@boolkey{colourunits} +\si@opt@boolkey{colourvalues} +\si@opt@choicekey[true]{colorunits} + {true,false} + {\si@colourunitsfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colourunitstrue + \fi} +\si@opt@choicekey[true]{colorvalues} + {true,false} + {\si@colourvaluesfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colourvaluestrue + \fi} +\si@opt@choicekey[true]{colorall} + {true,false} + {\si@colourvaluesfalse + \si@colourunitsfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colourunitstrue + \si@colourvaluestrue + \fi} +\si@opt@choicekey[true]{colourall} + {true,false} + {\si@colourvaluesfalse + \si@colourunitsfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colourunitstrue + \si@colourvaluestrue + \fi} +\si@opt@cmdkeys{unitcolour,valuecolour} +\si@opt@key{unitcolor}{\sisetup{unitcolour=#1}} +\si@opt@key{valuecolor}{\sisetup{valuecolour=#1}} +\si@opt@key{colour}{\sisetup{unitcolour=#1,valuecolour=#1}} +\si@opt@key{color}{\sisetup{unitcolour=#1,valuecolour=#1}} +\si@opt@boolkey{colourneg} +\si@opt@choicekey[true]{colorneg} + {true,false} + {\si@colournegfalse + \renewcommand*{\si@tempb}{true}% + \ifx\si@tempa\si@tempb + \si@colournegtrue + \fi} +\si@opt@cmdkeys{negcolour} +\si@opt@key{negcolor}{\sisetup{negcolour=#1}} +\si@opt@cmdkeys{textOmega,mathsOmega} +\si@opt@key{mathOmega}{\sisetup{mathsOmega=#1}} +\newcommand*{\si@mathsOmega}{\text{\ensuremath{\Omega}}} +\newcommand*{\si@textOmega}{\ensuremath{\Omega}} +\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} +\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}} +\si@opt@cmdkeys{textcelsius,mathscelsius} +\si@opt@key{mathcelsius}{\sisetup{mathscelsius=#1}} +\newcommand*{\si@textcelsius}{% + \si@textdegree\kern-\scriptspace C} +\newcommand*{\si@mathscelsius}{% + \si@mathsdegree\kern-\scriptspace\mathrm{C}} +\si@opt@cmdkeys{textringA,mathsringA} +\si@opt@key{mathringA}{\sisetup{mathsringA=#1}} +\newcommand*{\si@textringA}{\AA} +\newcommand*{\si@mathsringA}{\text{\AA}} +\si@opt@boolkey{redefsymbols} +\AtBeginDocument{ + \si@opt@disablekey{redefsymbols} + {Symbols can only be redefined\MessageBreak + when loading siunitx}} +\newlength\si@eVcorra +\newlength\si@eVcorrb +\si@opt@key{eVcorra}{\setlength\si@eVcorra{#1}} +\si@opt@key{eVcorrb}{\setlength\si@eVcorrb{#1}} +\si@opt@key{locale}{% + \si@loc@load{#1}% + \si@loc@set{#1}}% +\si@opt@key{loctolang}{\si@loc@ltol{#1}} +\si@opt@compatkey{units}{ugly} +\si@opt@compatkey{units}{nice} +\si@opt@compatkey{units}{loose} +\si@opt@compatkey{units}{tight} +\si@opt@compatkey{unitsdef}{OHM} +\si@opt@compatkey{unitsdef}{ohm} +\si@opt@compatkey{unitsdef}{redef-gensymb} +\newif\ifsi@gensymb +\si@opt@compatkey{unitsdef}{LITER} +\si@opt@compatkey{unitsdef}{liter} +\si@opt@compatkey{unitsdef}{noxspace} +\si@opt@compatkey{unitsdef}{noconfig} +\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} +\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} +\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} +\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} +\si@opt@compatkey{hepunits}{noprefixcmds} +\si@opt@compatkey{fancynum}{english} +\si@opt@compatkey{fancynum}{french} +\si@opt@compatkey{fancynum}{tight} +\si@opt@compatkey{fancynum}{loose} +\si@opt@compatkey{fancynum}{thinspaces} +\si@opt@compatkey{fancynum}{commas} +\si@opt@compatkey{fancynum}{plain} +\si@opt@compatkey{fancyunits}{spaceqspace} +\newcommand*{\si@fix@thin}{\,} +\newcommand*{\si@fix@med}{\:} +\newcommand*{\si@fix@medium}{\:} +\newcommand*{\si@fix@thick}{\;} +\newcommand*{\si@fix@space}{\text{~}} +\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} +\newcommand*{\si@fix@tighttimes}{\bgroup\times\egroup} +\newcommand*{\si@fix@tightcdot}{\bgroup\cdot\egroup} +\newcommand*{\si@fix@plus}{+} +\newcommand*{\si@fix@minus}{-} +\newcommand*{\si@fix@pm}{\pm} +\newcommand*{\si@fix@tightpm}{\bgroup\pm\egroup} +\newcommand*{\si@fix@mp}{\mp} +\newcommand*{\si@fix@two}{2} +\newcommand*{\si@fix@ten}{10} +\newcommand*{\si@fix@slash}{/} +\newcommand*{\si@fix@none}{} +\newcommand*{\si@symbol}[1]{% + \expandafter\protected\expandafter\def + \csname si@sym@#1\endcsname{% + \ifmmode + \expandafter\csname si@maths#1\expandafter\endcsname + \else + \expandafter\csname si@text#1\expandafter\endcsname + \fi}} +\si@symbol{Omega} +\si@symbol{ringA} +\si@symbol{mu} +\si@symbol{degree} +\si@symbol{minute} +\si@symbol{second} +\si@symbol{celsius} +\AtBeginDocument{% + \ifsi@redefsymbols + \@ifpackageloaded{textcomp} + {\si@log@debug{Redefining symbols using textcomp}% + \renewcommand*{\si@textdegree}{\textdegree}% + \renewcommand*{\si@mathsdegree}{\text{\textdegree}}% + \@ifpackageloaded{mathptmx}{} + {\renewcommand*{\si@textmu}{\textmu}% + \renewcommand*{\si@textOmega}{\textohm}}% + \renewcommand*{\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} +\newcommand*{\si@frc@frac}[2]{% + \ensuremath{\si@frc@hook\frac{% + \expandafter\si@unt@out\expandafter{#1}}% + {\expandafter\si@unt@out\expandafter{#2}}}} +\let\si@frac\si@frc@frac +\newcommand*{\si@frc@hook}{} +\newcommand*{\si@frc@slash}[2]{% + \expandafter\si@unt@out\expandafter{#1}% + \si@out{\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}}}} +\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} +\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\relax/\mkern-1mu\relax + \bgroup + \mathchoice + {\scriptstyle}% + {\scriptstyle}% + {\scriptscriptstyle}% + {\scriptscriptstyle}% + {#2}% + \egroup + \endgroup} +\newcommand*{\si@frc@textnf}[2]{% + \begingroup + \settoheight{\si@frc@textlen}{M}% + \settoheight{\si@frc@ssuplen}{\fontsize\sf@size\z@\relax + \selectfont{M}}% + \addtolength{\si@frc@textlen}{-\si@frc@ssuplen}% + \raisebox{\si@frc@textlen}{\fontsize\sf@size\z@\relax + \selectfont{#1}}% + \hspace{-0.25ex}/\hspace{-0.25ex}% + \hbox{\fontsize\sf@size\z@\selectfont{#2}}% + \endgroup} +\newcommand*{\si@frc@ugly}[1]{% + \renewcommand*{\si@tempa}{#1}% + \ifmmode + \expandafter\si@frc@frac + \else + \renewcommand*{\si@tempb}{1}% + \ifx\si@tempa\si@tempb + \setbox\si@tempboxa=\hbox{\ensuremath{\si@valuesep}}% + \hskip-\wd\si@tempboxa\relax + \renewcommand*{\si@tempa}{}% + \fi + \expandafter\si@frc@slash + \fi + {\si@tempa}} +\g@addto@macro{\document}{% + \ifdefined\mathsf + \setbox\si@tempboxa=\hbox{% + $\mathsf{\global\chardef\si@fam@sf=\fam}$}% + \else + \si@log@inf{\string\mathsf not found}% + \global\chardef\si@fam@sf=99\relax + \fi + \ifdefined\mathtt + \setbox\si@tempboxa=\hbox{% + $\mathtt{\global\chardef\si@fam@tt=\fam}$}% + \else + \si@log@inf{\string\mathtt not found}% + \global\chardef\si@fam@tt=99\relax + \fi} +\newcommand*{\si@fam@ifbtext}[1]{% + \if b\expandafter\@car\f@series\@nil + #1\fi} +\newcommand*{\si@fam@ifbmaths}[1]{% + \renewcommand*{\si@tempa}{bold}% + \ifx\math@version\si@tempa + #1\fi} +\newcommand*{\si@fam@ifbinline}{% + \ifsi@inlinebtext + \expandafter\si@fam@ifbtext + \else + \expandafter\si@fam@ifbmaths + \fi} +\newcommand*{\si@fam@ifitext}[1]{% + \if n\expandafter\@car\f@series\@nil\else + #1\fi} +\newcommand*{\si@fam@mode}{% + \ifsi@obeymode + \ifmmode + \sisetup{mode=maths}% + \else + \sisetup{mode=text}% + \fi + \fi} +\AtBeginDocument{ + \@ifpackageloaded{color} + {\let\si@fam@colourcmd\color} + {\let\si@fam@colourcmd\@gobble}} +\newif\ifsi@fam@set +\newif\ifsi@textmode +\newcommand*{\si@fam@set}{% + \ifsi@out@num + \ifsi@numtextmode + \expandafter\expandafter\expandafter\si@textmodetrue + \else + \expandafter\expandafter\expandafter\si@textmodefalse + \fi + \else + \ifsi@unittextmode + \expandafter\expandafter\expandafter\si@textmodetrue + \else + \expandafter\expandafter\expandafter\si@textmodefalse + \fi + \fi + \ifsi@fam@set\else + \let\si@colourcmd\@gobble + \ifsi@out@num + \let\si@mathsrm\si@valuemathsrm + \let\si@mathssf\si@valuemathssf + \let\si@mathstt\si@valuemathstt + \let\si@textrm\si@valuetextrm + \let\si@textsf\si@valuetextsf + \let\si@texttt\si@valuetexttt + \ifsi@colourvalues + \let\si@colourcmd\si@fam@colourcmd + \fi + \let\si@colour\si@valuecolour + \else + \let\si@mathsrm\si@unitmathsrm + \let\si@mathssf\si@unitmathssf + \let\si@mathstt\si@unitmathstt + \let\si@textrm\si@unittextrm + \let\si@textsf\si@unittextsf + \let\si@texttt\si@unittexttt + \ifsi@colourunits + \let\si@colourcmd\si@fam@colourcmd + \fi + \let\si@colour\si@unitcolour + \fi + \fi + \si@fam@settrue + \edef\si@tempa{\sfdefault}% + \edef\si@tempb{\ttdefault}% + \expandafter\let\expandafter\si@fam@maths + \csname\si@mathsrm\endcsname + \expandafter\let\expandafter\si@fam@text + \csname\si@textrm\endcsname + \ifsi@obeyfamily + \si@log@debug{Font detection: checking font}% + \ifmmode + \ifinner + \si@log@debug{Font detection: inline maths}% + \si@fam@dettext + \else + \si@log@debug{Font detection: display maths}% + \ifsi@detectdisplay + \si@fam@detmaths + \else + \si@fam@dettext + \fi + \fi + \else + \si@log@debug{Font detection: text}% + \si@fam@dettext + \fi + \else + \si@log@debug{Font detection: inactive}% + \fi + \def\si@fam@bold{\unboldmath\mdseries}% + \ifsi@obeybold + \si@log@debug{Weight detection: checking weight}% + \ifmmode + \ifdim\displaywidth>0pt\relax + \ifsi@detectdisplay + \expandafter\si@fam@ifbmaths + \else + \expandafter\si@fam@ifbtext + \fi + \si@fam@setbold + \else + \si@fam@ifbinline\si@fam@setbold + \fi + \else + \si@fam@ifbtext\si@fam@setbold + \fi + \fi + \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}}% + \fi} +\newcommand*{\si@fam@detmaths}{% + \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@mathsrm\endcsname + \expandafter\let\expandafter\si@fam@text + \csname\si@textrm\endcsname + \fi + \fi} +\newcommand*{\si@fam@dettext}{% + \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@mathsrm\endcsname + \expandafter\let\expandafter\si@fam@text + \csname\si@textrm\endcsname + \fi + \fi} +\newcommand*{\si@fam@setbold}{% + \si@log@debug{Weight detection: bold weight}% + \let\si@fam@bold\si@fam@boldify} +\newcommand*{\si@fam@boldify}{\boldmath\bfseries} +\si@newrobustcmd*{\num}[2][]{% + \begingroup + \sisetup{#1}% + \si@fam@mode + \si@num@intabfalse + \si@log@debug{Processing \string\num\space input `#2'}% + \expandafter\si@out@num\expandafter{\si@num{#2}}% + \endgroup} +\newif\ifsi@num@intab +\newcommand*{\si@num}[1]{% + \si@num@fixpm + \begingroup + \makeatletter + \@makeother{\,}% + \@makeother{\.}% + \@makeother{\+}% + \@makeother{\-}% + \def~{}% + \def\,{}% + \catcode`\~=\active\relax + \catcode`\^=\active\relax + \everyeof{\noexpand}% + \endlinechar\m@ne + \protected@xdef\si@tempa{\scantokens{#1}}% + \endgroup + \si@ifnotmtarg{\si@tempa} + {\si@num@ifvalid{\si@tempa} + {\si@num@format{\si@tempa}} + {\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\space macro\MessageBreak + (or derivative such as an `s' column)}% + {#1}}}} +\newcommand*{\si@num@fixpm}{% + \let\si@num@pm\pm + \let\si@num@mp\mp + \protected\def\pm{\si@num@pm}% + \protected\def\mp{\si@num@mp}} +\newcommand*{\si@num@ifvalid}[1]{% + \begingroup + \si@switchtrue + \expandafter\si@num@valid#1\@empty\@empty + \ifsi@switch + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\def\si@num@valid#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numvalid} + {\ifx\@empty#2\@empty\else + \si@num@valid#2\@empty\@empty\@empty + \fi} + {\si@switchfalse}} +\newcommand*{\si@num@in}{} +\newcommand*{\si@num@out}{} +\newcommand*{\si@num@exp}{} +\newcommand*{\si@num@expsign}{} +\newcommand*{\si@num@mant}{} +\newcommand*{\si@num@mantsign}{} +\newcommand*{\si@num@err}{} +\newcommand*{\si@num@xpart}{} +\newcommand*{\si@num@ambig}{} +\newcommand*{\si@tab@out}{} +\newcommand*{\si@tab@expout}{} +\newif\ifsi@num@erropen +\newcommand*{\si@num@arg}{} +\newcommand*{\si@num@format}[1]{% + \protected@edef\si@num@arg{#1}% + \si@log@debug{Formatting number `\si@num@arg'}% + \renewcommand*{\si@num@in}{}% + \renewcommand*{\si@num@exp}{}% + \renewcommand*{\si@num@expsign}{}% + \renewcommand*{\si@num@mant}{}% + \renewcommand*{\si@num@mantsign}{}% + \renewcommand*{\si@num@err}{}% + \renewcommand*{\si@num@xpart}{}% + \si@switchfalse + \expandafter\si@num@findxpart\si@num@arg\@empty\@empty + \si@switchfalse + \si@num@sepmantexp{\si@num@in}% + \si@num@sepsign{exp}% + \si@num@sepsign{mant}% + \ifx\@empty\si@num@exp\@empty + \ifx\@empty\si@num@expsign\@empty\else + \si@log@warn{Sign but no number for `\si@num@arg'}% + \fi + \let\si@num@expsign\@empty + \fi + \ifx\@empty\si@num@mant\@empty + \ifx\@empty\si@num@mantsign\@empty\else + \ifx\@empty\si@num@exp\@empty + \si@log@warn{Sign but no number for `\si@num@arg'}% + \let\si@num@mantsign\@empty + \fi + \fi + \fi + \renewcommand*{\si@tempa}{{-}}% + \ifx\si@num@mantsign\si@tempa + \ifsi@colourneg + \expandafter\expandafter\expandafter\si@fam@colourcmd + \else + \expandafter\expandafter\expandafter\@gobble + \fi + \else + \expandafter\@gobble + \fi + {\si@negcolour}% + \si@num@procnum{exp}% + \si@num@procnum{mant}% + \si@str@ifonlychrs{\si@num@exp}{0\si@numdecimal} + {\ifsi@allowzeroexp\else + \renewcommand*{\si@num@exp}{}% + \ifx\@empty\si@num@mant\@empty + \renewcommand*{\si@num@mant}{1}% + \fi + \fi}{}% + \ifx\@empty\si@num@exp\@empty\else + \ifsi@trapambigerr + \expandafter\expandafter\expandafter\si@num@ambigerrtrue + \fi + \fi + \protected@edef\si@num@out{% + \ensuremath{{\si@num@mantsign}}\si@num@mant}% + \renewcommand*{\si@tempa}{num}% + \ifsi@num@intab + \protected@edef\si@tab@out{% + \ensuremath{{\si@num@mantsign}}\si@num@predec}% + \protected@edef\si@num@out{\si@num@postdec}% + \renewcommand*{\si@tempa}{tab}% + \fi + \ifx\@empty\si@num@postdec\@empty\else + \renewcommand*{\si@tempa}{num}% + \fi + \ifx\@empty\si@num@err\@empty\else + \ifsi@seperr + \ifsi@num@ambigerr + \protected@edef\si@num@out{% + \ensuremath{\si@openerr}\si@num@out}% + \si@repeatunitsfalse + \expandafter\si@num@erropentrue + \else + \ifsi@trapambigerr\else + \ifx\@empty\si@num@exp\@empty\else + \protected@edef\si@num@err{% + \si@num@err\expandafter\@car\si@numexp\@nil + \si@num@expsign\si@num@exp}% + \ifsi@repeatunits\else + \renewcommand*{\si@num@exp}{}% + \renewcommand*{\si@num@expsign}{}% + \fi + \fi + \fi + \fi + \else + \expandafter\protected@edef\csname + si@\si@tempa @out\endcsname{% + \si@num@out\ensuremath{\si@errspace}\ensuremath + {\si@openerr}\si@num@err\ensuremath{\si@closeerr}}% + \renewcommand*{\si@num@err}{}% + \fi + \fi + \renewcommand*{\si@tempa}{num@out}% + \ifsi@num@erropen + \renewcommand*{\si@tempa}{num@ambig}% + \fi + \ifsi@num@intab + \renewcommand*{\si@tempa}{tab@expout}% + \fi + \ifx\@empty\si@num@exp\@empty + \ifx\@empty\si@num@mant\@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@numdigits')?}% + \renewcommand*\si@num@out{}% + \fi + \else + \ifx\@empty\si@num@mant\@empty\else + \expandafter\protected@edef\csname + si@\si@tempa\endcsname{% + \csname si@\si@tempa\endcsname\ensuremath{{}% + \si@expproduct{}}}% + \fi + \expandafter\protected@edef\csname + si@\si@tempa\endcsname{% + \csname si@\si@tempa\endcsname\si@expbase + \textsuperscript{\ensuremath{\si@num@expsign}% + \si@num@exp}}% + \fi + \ifsi@num@intab\else + \expandafter\si@num@out + \fi + \ifx\@empty\si@num@err\@empty\else + \expandafter\si@num@procerr + \fi + \ifsi@num@erropen + \expandafter\si@out@num\expandafter{% + \ensuremath{\si@closeerr}}% + \ifx\@empty\si@num@ambig\@empty\else + \expandafter\si@out@num\expandafter{\si@num@ambig}% + \renewcommand*{\si@num@ambig}{}% + \fi + \fi + \si@num@erropenfalse + \ifx\@empty\si@num@xpart\@empty\else + \expandafter\si@num@sepxpart + \fi} +\def\si@num@findxpart#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numprod} + {\si@switchtrue\si@seperrfalse}{}% + \ifsi@switch + \protected@edef\si@num@xpart{\si@num@xpart#1}% + \else + \protected@edef\si@num@in{\si@num@in#1}% + \fi + \ifx\@empty#2\@empty\else + \si@num@findxpart#2\@empty + \fi} +\newcommand*{\si@num@sepmantexp}[1]{% + \expandafter\si@num@mantexp#1\@empty\@empty} +\def\si@num@mantexp#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numgobble} + {\si@log@debug{Gobbling `#1' in \si@num@arg}} + {\si@str@ifchrstr{#1}{\si@numexp} + {\ifsi@switch + \si@log@err{Duplicate exponent marker found} + {Only a single exponent character \MessageBreak + (from the list `\si@numexp')\MessageBreak may + occur in a numerical argument}% + \else + \si@log@debug{Exponent marker `#1' found in + `\si@num@arg'}% + \fi + \si@switchtrue}% + {\ifsi@switch + \expandafter\si@num@addexp + \else + \expandafter\si@num@addmnt + \fi + {#1}}}% + \ifx\@empty#2\@empty + \expandafter\@gobble + \else + \expandafter\si@num@sepmantexp + \fi + {#2}} +\newcommand*{\si@num@addmnt}[1]{% + \si@num@addmntexp{#1}{mant}{mantissa}} +\newcommand*{\si@num@addexp}[1]{% + \si@num@addmntexp{#1}{exp}{exponent}} +\newcommand*{\si@num@addmntexp}[3]{% + \si@log@debug{Adding `#1' to #3 for `\si@num@arg'}% + \expandafter\protected@edef\csname si@num@#2\endcsname{% + \csname si@num@#2\endcsname#1}} +\newcommand*{\si@num@sepsign}[1]{% + \expandafter\ifx\expandafter\@empty + \csname si@num@#1\endcsname\@empty + \expandafter\@gobble + \else + \expandafter\si@num@gensign + \fi + {#1}} +\newcommand*{\si@num@gensign}[1]{% + \expandafter\expandafter\expandafter\si@num@findsign + \csname si@num@#1\endcsname\@empty\@empty + \ifx\@empty\si@num@sign\@empty + \ifx\@empty\si@num@value\@empty + \expandafter\expandafter\expandafter\@gobble + \else + \expandafter\expandafter\expandafter\si@num@addsign + \fi + \else + \expandafter\@gobble + \fi + {#1}% + \expandafter\let\csname si@num@#1sign\endcsname\si@num@sign + \expandafter\let\csname si@num@#1\endcsname\si@num@value} +\newcommand*{\si@num@sign}{} +\def\si@num@findsign#1#2#3\@empty{% + \si@num@delplusfalse + \si@str@ifchrstr{#1}{\si@numsign}{% + \si@str@ifchrstr{#2}{\si@numsign}{% + \if +#1% + \if -#2% + \si@log@debug{Found sign combination +- for + `\si@num@arg'}% + \renewcommand*{\si@num@sign}{{\si@pm}}% + \else + \si@log@inf{Unknown sign combination `#1#2'}% + \renewcommand*{\si@num@sign}{{#1#2}}% + \fi + \else + \if -#1% + \if +#2% + \si@log@debug{Found sign combination -+ for + `\si@num@arg'}% + \renewcommand*{\si@num@sign}{{\mp}}% + \else + \si@log@inf{Unknown sign combination `#1#2'}% + \renewcommand*{\si@num@sign}{{#1#2}}% + \fi + \else + \si@log@inf{Unknown sign combination `#1#2'}% + \renewcommand*{\si@num@sign}{{#1#2}}% + \fi + \fi + \protected@edef\si@num@value{#3}}% + {\si@log@debug{Found single sign character `#1' for + `\si@num@arg'}% + \renewcommand*{\si@num@sign}{{#1}}% + \if +#1% + \ifsi@retainplus\else + \expandafter\expandafter\expandafter\si@num@killsign + \fi + \fi + \protected@edef\si@num@value{#2#3}}}% + {\si@log@debug{No sign found for `\si@num@arg'}% + \renewcommand*{\si@num@sign}{}% + \protected@edef\si@num@value{#1#2#3}}} +\newif\ifsi@num@delplus +\newcommand*{\si@num@killsign}{% + \si@num@delplustrue + \renewcommand*{\si@num@sign}{}} +\newcommand*{\si@num@addsign}[1]{% + \begingroup + \renewcommand*{\si@tempa}{#1}% + \renewcommand*{\si@tempb}{mant}% + \ifx\si@tempa\si@tempb + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup + {\ifsi@num@signmant + \expandafter\si@num@asign + \else + \expandafter\@gobble + \fi + {mantissa}} + {\ifsi@num@signexp + \expandafter\si@num@asign + \else + \expandafter\@gobble + \fi + {exponent}}} +\newcommand*{\si@num@asign}[1]{% + \let\si@num@sign\si@sign + \si@log@debug{Adding sign \si@sign\space to #1 for + `\si@num@arg'}} +\newcommand*{\si@num@procnum}[1]{% + \expandafter\ifx\expandafter\@empty + \csname si@num@#1\endcsname\@empty + \expandafter\@gobble + \else + \expandafter\si@num@finddigits + \fi + {#1}} +\newcommand*{\si@num@predec}{} +\newcommand*{\si@num@postdec}{} +\newcommand*{\si@num@finddigits}[1]{% + \renewcommand*{\si@num@predec}{}% + \renewcommand*{\si@num@postdec}{}% + \si@switchfalse + \expandafter\expandafter\expandafter\si@num@digits + \csname si@num@#1\endcsname\@empty\@empty + \ifx\@empty\si@num@predec\@empty + \ifsi@num@padlead + \expandafter\expandafter\expandafter\si@num@addprezero + \fi + \fi + \ifx\@empty\si@num@postdec\@empty + \ifsi@num@padtrail + \ifsi@switch + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \si@num@addpostzero + \fi + \fi + \fi + \si@num@unsign{#1}% + \ifx\@empty\si@num@predec\@empty + \else + \expandafter\si@num@nozero + \fi + \ifx\@empty\si@num@predec\@empty + \ifx\@empty\si@num@postdec\@empty + \expandafter\expandafter\expandafter\@gobble + \else + \expandafter\expandafter\expandafter\si@num@sepdigits + \fi + \else + \expandafter\si@num@sepdigits + \fi + {#1}} +\def\si@num@digits#1#2\@empty{% + \si@str@ifchrstr{#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'}% + \expandafter\si@switchtrue + \fi} + {\si@str@ifchrstr{#1}{\si@numsign} + {\si@log@err{Misplaced sign character + `#1' in `\si@num@arg'} + {Sign characters `\si@numsign' can only + occur\MessageBreak at the start of a number}} + {\ifsi@switch + \expandafter\si@num@post + \else + \expandafter\si@num@pre + \fi + {#1}}}% + \ifx\@empty#2\@empty\else + \si@num@digits#2\@empty\@empty + \fi} +\newcommand*{\si@num@pre}[1]{% + \si@num@prepost{#1}{pre}{integer}} +\newcommand*{\si@num@post}[1]{% + \si@num@prepost{#1}{post}{decimal}} +\newcommand*{\si@num@prepost}[3]{% + \expandafter\protected@edef\csname si@num@#2dec\endcsname{% + \csname si@num@#2dec\endcsname#1}% + \si@log@debug{Adding `#1' to #3 part for `\si@num@arg'}} +\newcommand*{\si@num@addprezero}{% + \si@num@addpzero{pre}{leading}} +\newcommand*{\si@num@addpostzero}{% + \si@num@addpzero{post}{trailing}} +\newcommand*{\si@num@addpzero}[2]{% + \si@log@debug{Adding #2 zero for `\si@num@arg'}% + \@namedef{si@num@#1dec}{0}} +\newcommand*{\si@num@unsign}[1]{% + \expandafter\ifx\expandafter\@empty + \csname si@num@#1sign\endcsname\@empty + \expandafter\@gobble + \else + \expandafter\si@num@nosign + \fi + {#1}} +\newcommand*{\si@num@nosign}[1]{% + \begingroup + \si@switchtrue + \si@str@ifonlychrs{\si@num@predec\si@num@postdec}{0} + {\si@switchfalse}{}% + \ifsi@switch + \aftergroup\@gobble + \else + \aftergroup\@firstofone + \fi + \endgroup + {\si@log@debug{Zero value: removing any sign}% + \ifsi@ang@sign\else + \@namedef{si@num@#1sign}{}% + \fi}} +\newcommand*{\si@num@nozero}{% + \si@str@ifonlychrs{\si@num@predec}{0} + {\renewcommand*{\si@num@predec}{0}}{}} +\newcommand*{\si@num@decimalhook}{} +\newcommand*{\si@num@sepdigits}[1]{% + \begingroup + \let\si@numextra\si@numaddn + \protected@edef\si@tempa{\si@num@predec\si@num@postdec}% + \si@num@ifextra{\si@tempa} + {\aftergroup\@gobble} + {\aftergroup\@firstofone}% + \endgroup + {\renewcommand*{\si@tempb}{mant}% + \renewcommand*{\si@tempc}{#1}% + \ifx\si@tempb\si@tempc + \expandafter\si@num@checkerr + \fi}% + \protected@edef\si@tempa{\si@num@predec\si@num@postdec}% + \expandafter\si@str@ifonlychrs\expandafter{\si@tempa} + {0123456789} + {\ifx\@empty\si@num@err\@empty + \ifsi@fixdp + \expandafter\expandafter\expandafter\si@num@fixdp + \fi + \fi}{}% + \si@num@ifextra{\si@num@predec}{} + {\expandafter\si@num@int\expandafter{\si@num@predec}}% + \renewcommand*{\si@tempc}{}% + \ifx\@empty\si@num@postdec\@empty\else + \si@num@decimalhook + \renewcommand*{\si@tempc}{% + \ensuremath{{\si@decimalsymbol}}}% + \si@num@ifextra{\si@num@postdec}{} + {\expandafter\si@num@dec\expandafter{\si@num@postdec}}% + \fi + \expandafter\protected@edef\csname si@num@#1\endcsname + {\si@num@predec\si@tempc\si@num@postdec}} +\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'}% + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\def\si@num@extra#1#2\@empty{% + \ifx\@empty#1\@empty\else + \si@str@ifchrstr{#1}{\si@numextra}{\si@switchtrue}{}% + \ifx\@empty#2\@empty\else + \si@num@extra#2\@empty\@empty + \fi + \fi} +\newif\ifsi@num@ambigerr +\newcommand*{\si@num@checkerr}{% + \ifx\@empty\si@num@postdec\@empty + \expandafter\si@num@preerr + \else + \expandafter\si@num@posterr + \fi} +\newcommand*{\si@num@preerr}{% + \si@num@seperr{pre}% + \ifx\@empty\si@tempb\@empty\else + \expandafter\renewcommand\expandafter*\expandafter + \si@num@err\expandafter{\si@tempb}% + \fi} +\newcommand*{\si@num@posterr}{% + \si@num@seperr{post}% + \ifx\@empty\si@tempb\@empty\else + \ifsi@seperr + \expandafter\expandafter\expandafter\si@num@psterr + \else + \let\si@num@err\si@tempb + \fi + \fi} +\newcommand*{\si@num@psterr}{% + \si@num@cntdigits{\si@tempb}% + \si@tempcntb\si@tempcnta\relax + \si@num@cntdigits{\si@num@postdec}% + \ifnum\si@tempcnta<\si@tempcntb\relax + \expandafter\si@num@largeerr + \else + \expandafter\si@num@smallerr + \fi} +\newcommand*{\si@num@seperr}[1]{% + \si@switchfalse + \renewcommand*{\si@tempa}{}% + \renewcommand*{\si@tempb}{}% + \expandafter\expandafter\expandafter\si@num@finderr + \csname si@num@#1dec\endcsname\@empty\@empty + \ifx\@empty\si@tempb\@empty\else + \expandafter\let\csname si@num@#1dec\endcsname\si@tempa + \fi} +\def\si@num@finderr#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numopenerr} + {\ifsi@switch + \si@log@err{Invalid error in number} + {The numerical argument \si@num@arg\space has two (or + more)\MessageBreak error-opening characters}% + \else + \expandafter\si@switchtrue + \fi} + {\si@str@ifchrstr{#1}{\si@numcloseerr} + {\ifsi@switch + \ifx\@empty#2\@empty\else + \si@log@err{Invalid error in number} + {The numerical argument \si@num@arg\space has an + error-closing before the last character}% + \fi + \else + \si@log@err{Invalid error in number} + {The numerical argument \si@num@arg\space has an + error-closing character\MessageBreak but no + error-opening one}% + \fi} + {\ifsi@switch + \expandafter\si@num@addtmpb + \else + \expandafter\si@num@addtmpa + \fi + {#1}}}% + \ifx\@empty#2\@empty\else + \si@num@finderr#2\@empty + \fi} +\newcommand*{\si@num@addtmpa}[1]{\si@num@addtmp{a}{#1}} +\newcommand*{\si@num@addtmpb}[1]{\si@num@addtmp{b}{#1}} +\newcommand*{\si@num@addtmp}[2]{% + \expandafter\protected@edef\csname si@temp#1\endcsname{% + \csname si@temp#1\endcsname#2}} +\newcommand*{\si@num@cntdigits}[1]{% + \si@tempcnta\z@\relax + \expandafter\si@num@cntdgt#1\@empty\@empty} +\def\si@num@cntdgt#1#2\@empty{% + \ifx\@empty#1\@empty\else + \advance\si@tempcnta\@ne\relax + \fi + \ifx\@empty#2\@empty\else + \expandafter\si@num@cntdgt#2\@empty + \fi} +\newcommand*{\si@num@smallerr}{% + \si@tempcntb\si@tempcnta\relax + \si@num@serr + \protected@edef\si@num@err{% + \ifsi@num@padlead0\fi\expandafter\@car\si@numdecimal\@nil + \si@tempb}} +\newcommand*{\si@num@serr}{% + \si@num@cntdigits{\si@tempb}% + \ifnum\si@tempcnta=\si@tempcntb\relax\else + \protected@edef\si@tempb{0\si@tempb}% + \expandafter\si@num@serr + \fi} +\newcommand*{\si@num@largeerr}{% + \renewcommand*{\si@tempa}{}% + \si@tempcntb\si@tempcnta\relax + \si@num@lerr + \protected@edef\si@num@err{% + \si@tempa\ensuremath{\si@decimalsymbol}\si@tempb}} +\newcommand*{\si@num@lerr}{% + \si@num@cntdigits{\si@tempb}% + \ifnum\si@tempcnta=\si@tempcntb\relax\else + \expandafter\si@num@movedigit\si@tempb\@empty\@empty + \si@num@lerr + \fi} +\def\si@num@movedigit#1#2\@empty{% + \protected@edef\si@tempa{\si@tempa#1}% + \protected@edef\si@tempb{#2}} +\newcommand*{\si@num@fixdp}{% + \si@num@cntdigits{\si@num@postdec}% + \ifx\@empty\si@num@postdec\@empty + \si@tempcnta\z@\relax + \fi + \ifnum\si@tempcnta>\si@num@dp\relax + \expandafter\si@num@round + \else + \ifnum\si@tempcnta<\si@num@dp\relax + \expandafter\expandafter\expandafter\si@num@pad + \fi + \fi} +\newcommand*{\si@num@pad}{% + \si@log@debug{Padding to \the\si@num@dp\space digits}% + \loop\ifnum\si@tempcnta<\si@num@dp\si@num@pd\repeat} +\newcommand*{\si@num@pd}{% + \advance\si@tempcnta\@ne\relax + \protected@edef\si@num@postdec{\si@num@postdec0}} +\newcommand*{\si@num@prernd}{} +\newcommand*{\si@num@postrnd}{} +\newcommand*{\si@num@round}{% + \si@log@debug{Rounding to \the\si@num@dp\space digits}% + \si@num@reverse{\si@num@postdec}% + \si@num@reverse{\si@num@predec}% + \let\si@num@prernd\si@num@predec + \let\si@num@postrnd\si@num@postdec + \renewcommand*{\si@num@predec}{}% + \renewcommand*{\si@num@postdec}{}% + \si@switchfalse + \si@num@rnd} +\newcommand*{\si@num@reverse}[1]{% + \renewcommand*{\si@tempa}{}% + \expandafter\si@num@rev#1\@empty\@empty + \let#1\si@tempa} +\def\si@num@rev#1#2\@empty{% + \edef\si@tempa{#1\si@tempa}% + \ifx\@empty#2\@empty\else + \si@num@rev#2\@empty\@empty + \fi} +\newcommand*{\si@num@rnd}{% + \ifnum\si@tempcnta>\z@\relax + \expandafter\si@num@rndpost + \else + \expandafter\si@num@rndpre + \fi} +\newcommand*{\si@num@rndpre}{% + \expandafter\edef\expandafter\si@tempa\expandafter{% + \expandafter\@car\si@num@prernd\@nil}% + \expandafter\edef\expandafter\si@num@prernd\expandafter{% + \expandafter\@cdr\si@num@prernd\@nil}% + \si@tempcntb\si@tempa\relax + \ifsi@switch + \advance\si@tempcntb\@ne\relax + \fi + \si@switchfalse + \ifnum\si@tempcntb=10\relax + \si@tempcntb\z@\relax + \expandafter\expandafter\expandafter\si@switchtrue + \fi + \edef\si@num@predec{\the\si@tempcntb\si@num@predec}% + \ifx\@empty\si@num@prernd\@empty + \ifsi@switch + \edef\si@num@predec{1\si@num@predec}% + \fi + \else + \expandafter\si@num@rnd + \fi} +\newcommand*{\si@num@rndpost}{% + \expandafter\edef\expandafter\si@tempa\expandafter{% + \expandafter\@car\si@num@postrnd\@nil}% + \expandafter\edef\expandafter\si@num@postrnd\expandafter{% + \expandafter\@cdr\si@num@postrnd\@nil}% + \si@tempcntb\si@tempa\relax + \ifsi@switch + \advance\si@tempcntb\@ne\relax + \fi + \si@switchfalse + \ifnum\si@tempcnta>\si@num@dp\relax + \ifnum\si@tempcntb>4\relax + \expandafter\expandafter\expandafter\si@switchtrue + \fi + \else + \ifnum\si@tempcntb=10\relax + \si@tempcntb\z@\relax + \expandafter\expandafter\expandafter\si@switchtrue + \fi + \edef\si@num@postdec{\the\si@tempcntb\si@num@postdec}% + \fi + \advance\si@tempcnta\m@ne\relax + \si@num@rnd} +\newcommand*{\si@num@int}[1]{% + \renewcommand*{\si@num@predec}{}% + \ifsi@sepfour + \si@num@intfmt{}#1\@empty\@empty\@empty + \else + \si@num@iffive{#1} + {\si@num@intfmt{}#1\@empty\@empty\@empty} + {\renewcommand*{\si@num@predec}{#1}}% + \fi} +\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} +\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}} +\newcommand*{\si@num@intsep}[4]{% + \protected@edef\si@num@predec{\si@num@predec#1#2#3}% + \if\relax#4\relax\else + \protected@edef\si@num@predec{% + \si@num@predec\ensuremath{\noexpand\si@digitsep}}% + \expandafter\si@num@intsep\expandafter#4% + \fi} +\newcommand*{\si@num@dec}[1]{% + \renewcommand*{\si@num@postdec}{}% + \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@num@postdec{\si@num@postdec#1}}% + \fi} +\newcommand*{\si@num@decfmt}[4]{% + \protected@edef\si@num@postdec{\si@num@postdec#1#2#3}% + \ifx\@empty#4\@empty% + \else + \protected@edef\si@num@postdec{% + \si@num@postdec\ensuremath{\noexpand\si@digitsep}}% + \expandafter\si@num@decfmt\expandafter#4% + \fi} +\newcommand*{\si@num@procerr}{% + \si@num@addunit + \ensuremath{\si@pm}% + \expandafter\si@num\expandafter{\si@num@err}} +\newcommand*{\si@num@sepxpart}{% + \si@num@addunit + \ensuremath{\times}% + \expandafter\expandafter\expandafter\si@num\expandafter + \expandafter\expandafter{% + \expandafter\@cdr\si@num@xpart\@nil}} +\newcommand*{\si@num@addunit}{% + \si@unt@numtrue + \ifx\@empty\si@unt@unitarg\@empty\else + \ifsi@repeatunits + \si@unt@printunit{\si@unt@unitarg}% + \fi + \fi} +\si@newrobustcmd*{\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}} +\def\si@ang@parse#1;#2;#3;#4\@nil{% + \let\ifsi@ang@fixdp\ifsi@fixdp + \si@fixdpfalse + \si@ifmtarg{#4} + {\si@log@debug{Angle argument contains no + semi-colons:\MessageBreak decimal angle}% + \si@ang@dec{#1}{}{}} + {\si@log@debug{Angle argument contains + semi-colons:\MessageBreak degree-minute-second angle}% + \renewcommand*{\si@tempa}{#4}% + \renewcommand*{\si@tempb}{;;}% + \ifx\si@tempa\si@tempb\else + \ifsi@strictarc + \renewcommand*{\si@tempb}{;}% + \ifx\si@tempa\si@tempb + \si@log@err{Insufficient semi-colons in argument + of \string\ang}{The argument of + \string\ang\space must contain either no + semi-colons or exactly two}% + \else + \si@log@err{Excess semi-colons in argument of + \string\ang}{The argument of \string\ang\space + must contain either no semi-colons or exactly + two}% + \fi + \fi + \fi + \si@ang@arc{#1}{#2}{#3}}} +\newcommand*{\si@ang@dec}{% + \let\si@ang@fix\@gobble + \ifsi@ang@toarc + \expandafter\si@ang@dectoarc + \else + \sisetup{padangle=none}\expandafter\si@ang@typeset + \fi} +\newcommand*{\si@ang@arc}{% + \let\si@ang@fix\si@ang@arcfix + \ifsi@ang@todec + \expandafter\si@ang@arctodec + \else + \expandafter\si@ang@typeset + \fi} +\newif\ifsi@ang@fixdp +\newcommand*{\si@ang@fix}[1]{} +\newcommand*{\si@ang@arcfix}[1]{% + \renewcommand*{\si@tempa}{second}% + \renewcommand*{\si@tempb}{#1}% + \ifx\si@tempa\si@tempb + \ifsi@ang@fixdp + \expandafter\expandafter\expandafter\si@fixdptrue + \else + \expandafter\expandafter\expandafter\si@fixdpfalse + \fi + \else + \expandafter\si@fixdpfalse + \fi} +\newcommand*{\si@ang@ifnum}[1]{% + \begingroup + \renewcommand*{\si@numvalid}{0123456789,.+-}% + \ifx\@empty#1\@empty + \aftergroup\@firstoftwo + \else + \si@num@ifvalid{#1} + {\aftergroup\@firstoftwo} + {\aftergroup\@secondoftwo}% + \fi + \endgroup} +\newcommand*{\si@ang@arctodec}[3]{% + \let\si@ang@fix\@gobble + \ifnum\si@num@dp>\thr@@\relax + \si@num@dp\thr@@\relax + \fi + \si@fixdptrue + \si@ang@ifnum{#1} + {\si@ang@ifnum{#2} + {\si@ang@ifnum{#3} + {\si@tempdima\z@\relax + \renewcommand*{\si@tempa}{+}% + \ifx\@empty#1\@empty\else + \si@tempdima #1pt\relax + \fi + \ifdim\si@tempdima<\z@\relax + \renewcommand*{\si@tempa}{-}% + \fi + \ifx\@empty#2\@empty\else + \si@tempdima\dimexpr\si@tempdima\si@tempa + #2pt/60\relax + \fi + \ifdim\si@tempdima<\z@\relax + \renewcommand*{\si@tempa}{-}% + \else + \fi + \ifx\@empty#3\@empty\else + \si@tempdima\dimexpr\si@tempdima\si@tempa + #3pt/3600\relax + \fi + \sisetup{numdecimal=.}% + \expandafter\si@ang@typeset\expandafter{% + \strip@pt\si@tempdima}{}{}} + {\si@ang@notnum{#1}{#2}{#3}}} + {\si@ang@notnum{#1}{#2}{#3}}} + {\si@ang@notnum{#1}{#2}{#3}}} +\newcommand*{\si@ang@dectoarc}[1]{% + \let\si@ang@fix\si@ang@arcfix + \si@ang@fixdptrue + \ifnum\si@num@dp>\@ne\relax + \si@num@dp\@ne\relax + \fi + \si@ang@ifnum{#1} + {\si@tempdima\z@\relax + \ifx\@empty#1\@empty\else + \si@tempdima #1pt\relax + \fi + \si@ang@sepint{deg}% + \si@tempdima\dimexpr\si@tempdima *60\relax + \si@ang@sepint{min}% + \edef\si@tempa{\the\dimexpr\si@tempdima *60\relax}% + \expandafter\newcommand\expandafter*\expandafter{% + \expandafter\si@ang@arcsec\expandafter}\expandafter{% + \expandafter\si@ang@strippt\si@tempa}% + \si@tempdima\z@\relax + \edef\si@tempa{\the\si@tempdima}% + \expandafter\renewcommand\expandafter*\expandafter{% + \expandafter\si@tempa\expandafter}\expandafter{% + \expandafter\si@ang@strippt\si@tempa}% + \ifx\si@tempa\si@ang@arcsec + \renewcommand*{\si@ang@arcsec}{0}% + \fi + \renewcommand*{\si@tempa}{0}% + \ifx\si@ang@arcdeg\si@tempa + \si@temptoks{{}}% + \else + \si@temptoks{{\si@ang@arcdeg}}% + \fi + \ifx\si@ang@arcmin\si@tempa + \si@temptoks\expandafter{\the\si@temptoks{}}% + \else + \si@temptoks\expandafter{\the\si@temptoks{% + \si@ang@arcmin}}% + \fi + \ifx\si@ang@arcsec\si@tempa + \si@temptoks\expandafter{\the\si@temptoks{}}% + \else + \si@temptoks\expandafter{\the\si@temptoks{% + \si@ang@arcsec}}% + \fi + \expandafter\si@ang@typeset\the\si@temptoks} + {\si@ang@notnum{#1}{}{}}} +\newcommand*{\si@ang@sepint}[1]{% + \expandafter\si@ang@sint\the\si@tempdima\@empty + \expandafter\let\csname si@ang@arc#1\endcsname\si@tempa} +\def\si@ang@sint#1.#2\@empty{% + \renewcommand*{\si@tempa}{#1}% + \si@tempdima 0.#2\relax} +\begingroup + \catcode`P=12 + \catcode`T=12 + \lowercase{ + \renewcommand*{\si@tempa}{% + \def\si@ang@strippt##1PT{##1}}} + \expandafter\endgroup +\si@tempa +\newcommand*{\si@ang@notnum}[3]{% + \si@log@warn{Angle `#1;#2;#3' is not a pure + number:\MessageBreak output will be as given}% + \si@ang@typeset{#1}{#2}{#3}} +\newif\ifsi@ang@sign +\newcommand*{\si@ang@typeset}[3]{% + \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@decimalsymbol{\si@decimalsymbol}% + \ifsi@astroang + \let\si@ang@movesign\si@ang@astrosign + \else + \let\si@ang@movesign\@gobble + \fi + \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'}% + \si@ang@ifnum{#3} + {\ifdim #3 pt=\z@\relax\else + \si@ang@signtrue + \fi}{}% + \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'}% + \si@ang@ifnum{#2} + {\ifdim #2 pt=\z@\relax\else + \si@ang@signtrue + \fi}{}% + \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} + {\si@ang@num{degree}{#1}% + \si@sym@degree}}% + \si@out@num + {\si@ang@degs\si@anglesep\si@ang@mins\si@anglesep + \si@ang@secs}% + \endgroup} +\newcommand*{\si@ang@pad}[1]{\ifsi@ang@padsmall #1\fi} +\newcommand*{\si@ang@num}[2]{% + \begingroup + \si@ang@fix{#1}% + \si@ang@movesign{#1}% + \si@num{#2}% + \endgroup} +\newcommand*{\si@ang@signlessnum}[2]{% + \begingroup + \si@ang@fix{#1}% + \si@ang@movesign{#1}% + \sisetup{addsign=none}% + \si@num{#2}% + \endgroup} +\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@decimalsymbol}{% + \setbox\si@tempboxa=\hbox{% + \ensuremath{{\si@ang@decimalsymbol}}}% + \si@tempdima\wd\si@tempboxa\relax + \setbox\si@tempboxb=\hbox to\z@{% + \hss\unhbox\si@tempboxa\hss}% + \setbox\si@tempboxa=\hbox{% + \csname si@sym@#1\endcsname\hskip-\scriptspace}% + \si@tempdimb\wd\si@tempboxa\relax + \setbox\si@tempboxc=\hbox to\z@{% + \hss\unhbox\si@tempboxa\hss}% + \setbox\si@tempboxd=\hbox{% + \usebox\si@tempboxb\usebox\si@tempboxc}% + \ifdim\si@tempdima>\si@tempdimb\relax + \setbox\si@tempboxa=\hbox to\si@tempdima{% + \hss\unhbox\si@tempboxd\hss}% + \else + \setbox\si@tempboxa=\hbox to\si@tempdimb{% + \hss\unhbox\si@tempboxd\hss}% + \fi + \usebox\si@tempboxa% + \ifdim\si@tempdima>\si@tempdimb\relax\else + \hskip\scriptspace + \fi}% + \renewcommand*{\si@num@decimalhook}{\expandafter\aftergroup + \csname si@ang@kill#1\endcsname}}% +\edef\si@tempa{% + \noexpand\NC@do S\noexpand\NC@do s\the\NC@list} +\newcolumntype{S}{} +\newcolumntype{s}{} +\NC@list\expandafter{\si@tempa} +\renewcommand*{\NC@rewrite@S}[1][]{% + \edef\si@tempa{\the\@temptokena + >{\noexpand\si@tab@begin@S[#1]}c% + <{\noexpand\si@tab@end@S}}% + \@temptokena\expandafter{\si@tempa}% + \NC@find} +\renewcommand*{\NC@rewrite@s}[1][]{% + \edef\si@tempa{\the\@temptokena + >{\noexpand\si@tab@begin@s[#1]}c% + <{\noexpand\si@tab@end@s}}% + \@temptokena\expandafter{\si@tempa}% + \NC@find} +\newcommand*{\si@tab@begin@S}[1][]{% + \si@log@debug{Processing S column cell contents}% + \let\si@tab@gettok\si@tab@gettok@S + \si@seperrfalse + \renewcommand*{\si@num@sepxpart}{% + \si@log@err{Multiple numbers not allowed in + tables\MessageBreak Only the first number used} + \@ehb}% + \si@tab@begin[#1]} +\newcommand*{\si@tab@begin@s}[1][]{% + \si@log@debug{Processing s column cell contents}% + \let\si@tab@gettok\si@tab@gettok@s + \si@tab@begin[#1]} +\newtoks\si@tab@toks +\newtoks\si@tab@pretoks +\newtoks\si@tab@posttoks +\newcommand*{\si@tab@begin}[1][]{% + \begingroup + \sisetup{#1}% + \si@tab@toks{}% + \si@tab@pretoks{}% + \si@tab@posttoks{}% + \si@switchfalse + \si@tab@gettok} +\newcommand*{\si@tab@gettok@S}[1]{% + \ifx\tabularnewline#1\relax + \let\si@tab@next\si@tab@newline@S + \else + \ifx\end#1\relax + \let\si@tab@next\end + \else + \ifx\si@tab@end@S#1\relax + \let\si@tab@next\si@tab@end@S + \else + \ifx\endtabular#1\relax + \let\si@tab@next\endtabular + \else + \ifx\csname#1\relax + \let\si@tab@next\csname + \else + \ifx\relax#1\relax + \let\si@tab@next\relax + \else + \let\si@tab@next\si@tab@gettok@S + \si@str@ifchrstr{#1}{\si@numvalid} + {\si@switchtrue + \si@log@debug{Found numerical cell + contents `#1'}% + \si@tab@toks=\expandafter{% + \the\si@tab@toks#1}} + {\si@log@debug{Found other cell contents + \string#1}% + \si@tab@othertok{#1}}% + \fi + \fi + \fi + \fi + \fi + \fi + \si@tab@next} +\newcommand*{\si@tab@othertok}[1]{% + \ifsi@switch + \si@tab@posttoks=\expandafter{\the\si@tab@posttoks#1}% + \else + \si@tab@pretoks=\expandafter{\the\si@tab@pretoks#1}% + \fi} +\newcommand*{\si@tab@gettok@s}[1]{% + \ifx\tabularnewline#1\relax + \let\si@tab@next\si@tab@newline@s + \else + \ifx\end#1\relax + \let\si@tab@next\end + \else + \ifx\si@tab@end@s#1\relax + \let\si@tab@next\si@tab@end@s + \else + \ifx\endtabular#1\relax + \let\si@tab@next\endtabular + \else + \ifx\csname#1\relax + \let\si@tab@next\csname + \else + \ifx\relax#1\relax + \let\si@tab@next\relax + \else + \let\si@tab@next\si@tab@gettok@s + \si@tab@toks=\expandafter{% + \the\si@tab@toks#1}% + \si@log@debug{Found cell contents `#1'}% + \fi + \fi + \fi + \fi + \fi + \fi + \si@tab@next} +\newcommand*{\si@tab@end@S}{% + \ifsi@switch + \let\si@tab@lfill\si@tab@lfill@S + \let\si@tab@rfill\si@tab@rfill@S + \else + \let\si@tab@rfill\si@tab@rfill@t + \let\si@tab@lfill\si@tab@lfill@t + \fi + \si@tab@lfill\relax + \the\si@tab@pretoks + \ifsi@switch + \expandafter\si@tab@numout + \fi + \the\si@tab@posttoks + \si@tab@rfill\relax + \endgroup} +\newcommand*{\si@tab@end@s}{% + \si@tab@lfill@s\relax + \expandafter\si\expandafter{\the\si@tab@toks}% + \si@tab@rfill@s\relax + \endgroup} +\newcommand*{\si@tab@newline@S}{% + \si@tab@end@S + \hfil\relax + \let\si@tab@end\si@tab@end@S + \renewcommand*{\si@tab@end@S}{\let\si@tab@end@S\si@tab@end}% + \tabularnewline} +\newcommand*{\si@tab@newline@s}{% + \si@tab@end@s + \hfil\relax + \let\si@tab@end\si@tab@end@s + \renewcommand*{\si@tab@end@s}{\let\si@tab@end@s\si@tab@end}% + \tabularnewline} +\newcount\si@tempcnta +\newcount\si@tempcntb +\newcommand*{\si@tab@numout}{% + \si@num@intabtrue + \ifsi@tab@fixed + \ifsi@tabautofit + \si@num@dp\si@tab@mantpostcnt\relax + \expandafter\expandafter\expandafter\si@fixdptrue + \fi + \fi + \expandafter\si@num\expandafter{\the\si@tab@toks}% + \si@tab@format} +\newbox\si@tab@prebox +\newbox\si@tab@midbox +\newbox\si@tab@postbox +\newbox\si@tab@expbox +\newcommand*{\si@tab@format}{% + \ifsi@tab@fixed + \expandafter\si@tab@fixed + \else + \expandafter\si@tab@unfixed + \fi + \ifsi@colourvalues + \si@fam@colourcmd{\si@valuecolour}% + \fi + \box\si@tab@prebox\box\si@tab@midbox\box\si@tab@postbox% + \box\si@tab@expbox} +\newcommand*\si@tab@unfixed{% + \si@log@debug{Using variable width S column}% + \protected@edef\si@num@out{\si@num@out\si@tab@expout}% + \setbox\si@tab@prebox=\hbox + {\expandafter\si@out@num\expandafter{\si@tab@out}}% + \ifx\@empty\si@num@out\@empty + \setbox\si@tab@midbox=\hbox + {\phantom{\ensuremath{{\si@decimalsymbol}}}}% + \else + \setbox\si@tab@midbox=\hbox + {\ensuremath{{\si@decimalsymbol}}}% + \fi + \setbox\si@tab@postbox=\hbox + {\expandafter\si@out@num\expandafter{\si@num@out}}% + \ifdim\wd\si@tab@prebox>\wd\si@tab@postbox\relax + \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 + \setbox\si@tab@expbox=\hbox{}} +\newdimen\si@tab@predim +\newdimen\si@tab@postdim +\newdimen\si@tab@expdim +\newdimen\si@tempdima +\newdimen\si@tempdimb +\newcommand*{\si@tab@sp}{} +\newcommand*{\si@tab@fixed}{% + \si@log@debug{Using fixed-width S column}% + \let\si@tab@sp\relax + \setbox\si@tab@midbox=\hbox{}% + \setbox\si@tab@expbox=\hbox{}% + \setbox\si@tempboxa=\hbox{\si@out@num{1}}% + \si@tempdima\wd\si@tempboxa\relax + \si@tab@predim\the\si@tab@mantprecnt\si@tempdima\relax + \si@tab@sepcorr{mantpre}{pre}% + \si@tab@postdim\si@tab@mantpostcnt\si@tempdima\relax + \setbox\si@tempboxa=\hbox{\ensuremath{{\si@decimalsymbol}}}% + \advance\si@tab@postdim\wd\si@tempboxa\relax + \si@tab@sepcorr{mantpost}{post}% + \setbox\si@tempboxa=\hbox{\si@out@num{^{1}}}% + \si@tempdima\wd\si@tempboxa\relax + \ifnum\si@tab@expprecnt>\z@\relax + \si@tab@expdim\si@tab@expprecnt\si@tempdima\relax + \si@tab@sepcorr{exppre}{exp}% + \fi + \let\si@tab@sp\sp + \ifnum\si@tab@exppostcnt>\z@\relax + \advance\si@tab@expdim\si@tab@exppostcnt\si@tempdima\relax + \setbox\si@tempboxa=\hbox{% + \ensuremath{^{\si@decimalsymbol}}}% + \advance\si@tab@expdim\wd\si@tempboxa\relax + \si@tab@sepcorr{exppost}{exp}% + \fi + \setbox\si@tempboxa=\hbox{\ensuremath{-}}% + \ifsi@tab@mantsign + \advance\si@tab@predim\wd\si@tempboxa\relax + \fi + \setbox\si@tempboxa=\hbox{\ensuremath{^{-}}}% + \ifsi@tab@expsign + \advance\si@tab@expdim\wd\si@tempboxa\relax + \fi + \si@tempcnta\si@tab@expprecnt\relax + \advance\si@tempcnta\si@tab@exppostcnt\relax + \ifnum\si@tempcnta>\z@\relax + \setbox\si@tempboxa=\hbox{\ensuremath{% + {}\si@expproduct{}\si@expbase}}% + \advance\si@tab@expdim\wd\si@tempboxa\relax + \fi + \ifsi@tabalignexp\else + \advance\si@tab@postdim\si@tab@expdim\relax + \fi + \setbox\si@tab@prebox=\hbox to\si@tab@predim{\hss\hfill + \expandafter\si@out@num\expandafter{\si@tab@out}}% + \ifx\@empty\si@num@out\@empty + \setbox\si@tab@postbox=\hbox to\si@tab@postdim + {\expandafter\si@out@num\expandafter{\si@num@out}\hfil}% + \else + \ifsi@tabalignexp\else + \protected@edef\si@num@out{\si@num@out\si@tab@expout}% + \fi + \setbox\si@tab@postbox=\hbox to\si@tab@postdim + {\ensuremath{{\si@decimalsymbol}}\expandafter\si@out@num + \expandafter{\si@num@out}\hfil}% + \fi + \ifx\@empty\si@tab@expout\@empty + \ifsi@tabalignexp + \setbox\si@tab@expbox=\hbox to\si@tab@expdim{\hfil}% + \fi + \else + \ifsi@tabalignexp + \setbox\si@tab@expbox=\hbox to\si@tab@expdim + {\expandafter\si@out@num\expandafter{\si@tab@expout}% + \hfil}% + \fi + \fi} +\newcommand*{\si@tab@sepcorr}[2]{% + \expandafter\si@tempcnta\expandafter\the + \csname si@tab@#1cnt\endcsname\relax + \divide\si@tempcnta\thr@@\relax + \ifsi@sepfour\else + \expandafter\ifnum\expandafter\the + \csname si@tab@#1cnt\endcsname=4\relax + \si@tempcnta\z@\relax + \fi + \fi + \setbox\si@tempboxa=\hbox{% + \ensuremath{\si@tab@sp{\si@digitsep}}}% + \expandafter\advance\csname si@tab@#2dim\endcsname + \si@tempcnta\wd\si@tempboxa} +\si@newrobustcmd*{\SI}[2][]{% + \@ifnextchar[%] + {\si@SI[#1]{#2}} + {\si@SI[#1]{#2}[]}} +\si@newrobustcmd*{\si}[2][]{\si@SI[#1]{}[]{#2}} +\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@log@inf{Redefining unit \string#2}% + \si@unt@defunit[#1]{#2}{#3}}} +\newcommand*{\provideunit}[3][]{% + \si@ifdefinable{#2} + {\si@unt@defunit[#1]{#2}{#3}} + {}} +\newcommand*{\newprefix}[4][]{% + \si@ifdefinable{#2} + {\si@unt@defprefix[#1]{#2}{#3}{#4}} + {\si@log@err{Prefix \string#2 already defined!}\@eha}} +\newcommand*{\renewprefix}[4][]{% + \si@ifdefinable{#2} + {\si@log@err{Prefix \string#2 undefined}\@ehc + \si@unt@defprefix[#1]{#2}{#3}{#4}} + {\si@log@inf{Redefining prefix \string#2}% + \si@unt@defprefix[#1]{#2}{#3}{#4}}} +\newcommand*{\provideprefix}[4][]{% + \si@ifdefinable{#2} + {\si@unt@defprefix[#1]{#2}{#3}{#4}} + {}} +\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@log@inf{Redefining power \string#2}% + \si@unt@defpower[#1]{#2}{#3}}} +\newcommand*{\providepower}[3][]{% + \si@ifdefinable{#2} + {\si@unt@defpower[#1]{#2}{#3}} + {}} +\newif\ifsi@unt@num +\newcommand*{\si@unt@unitarg}{} +\newcommand*{\si@unt@SIopts}{} +\def\si@SI[#1]#2[#3]#4{% + \begingroup + \si@ifnotmtarg{#1} + {\sisetup{#1}% + \renewcommand*{\si@unt@SIopts}{#1}}% + \si@unt@numfalse + \si@xspacefalse + \si@ifnotmtarg{#3} + {\si@log@debug{Prefix unit found}% + \si@unt@printunit{#3}}% + \si@ifnotmtarg{#4} + {\renewcommand*{\si@unt@unitarg}{#4}}% + \si@ifnotmtarg{#2} + {\si@log@debug{Number found in \string\SI\space + argument}% + \ifsi@repeatunits\else + \ifsi@trapambigerr + \expandafter\expandafter\expandafter + \si@num@ambigerrtrue + \fi + \fi + \num{#2}% + \si@unt@numtrue}% + \si@ifnotmtarg{#4} + {\si@ifmtarg{#2} + {\si@unt@printunit{#4}} + {\si@tempcnta\z@\relax + \ifsi@addunitpower + \si@unt@countx{#2}% + \fi + \ifnum\si@tempcnta>\z@\relax + \advance\si@tempcnta\@ne\relax + \edef\si@tempa{\noexpand\tothe{\si@tempcnta}}% + \renewcommand*{\si@tempb}{#4}% + \expandafter\expandafter\expandafter + \si@unt@printunit\expandafter\expandafter + \expandafter{% + \expandafter\si@tempb\si@tempa}% + \else + \si@unt@printunit{#4}% + \fi}}% + \endgroup} +\newcommand*{\si@unt@countx}[1]{% + \si@tempcnta\z@\relax + \expandafter\si@unt@cntx#1\@empty\@empty} +\def\si@unt@cntx#1#2\@empty{% + \si@str@ifchrstr{#1}{\si@numprod} + {\advance\si@tempcnta\@ne\relax} + {}% + \ifx\@empty#2\@empty\else + \si@unt@cntx#2\@empty\@empty + \fi} +\newif\ifsi@unt@littest +\newcommand*{\si@unt@ifliteral}[1]{% + \begingroup + \si@unt@littesttrue + \setbox\si@tempboxa=\hbox{\si@unt@out{#1}}% + \ifdim\wd\si@tempboxa>\z@\relax + \aftergroup\@firstoftwo + \else + \aftergroup\@secondoftwo + \fi + \endgroup} +\newif\ifsi@unt@litout +\newcommand*{\si@unt@printunit}[1]{% + \si@unt@ifliteral{#1} + {\si@log@debug{Literal items found in unit + argument:\MessageBreak outputting without further + processing}% + \si@unt@litouttrue + \si@unt@addvaluesep + \si@unt@out{#1}} + {\si@log@debug{Macro unit found:\MessageBreak + processing to format output}% + \si@unt@init + \advance\si@unt@depthcnt\@ne\relax + #1% + \si@unt@final}} +\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} +\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@litprefixfalse + \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}} +\newcommand*{\si@unt@final}{% + \si@unt@third + \si@unt@stackout + \endgroup + \ifsi@xspace + \expandafter\expandafter\expandafter\xspace + \fi} +\newcommand*{\si@unt@defunit}[3][]{% + \si@log@debug{Declaring unit \string#2 with \MessageBreak + meaning \string#3}% + \si@ifnotmtarg{#1} + {\expandafter\@namedef\expandafter{% + \expandafter\@gobble\string#2@opt@unt@si}{#1}}% + \protected\def#2{% + \ifsi@allowoptarg + \expandafter\si@unt@withopt + \else + \expandafter\si@unt@noopt + \fi + {#2}{#3}}} +\newcommand*{\si@unt@withopt}[2]{% + \@ifnextchar[%] + {\si@unt@opt{#1}{#2}} + {\si@unt@opt{#1}{#2}[]}} +\newcommand*{\si@unt@noopt}[2]{\si@unt@opt{#1}{#2}[]} +\def\si@unt@opt#1#2[#3]{% + \ifsi@unt@littest + \expandafter\si@gobblethree + \else + \ifsi@unt@litout + \expandafter\expandafter\expandafter\@gobbletwo + \else + \expandafter\expandafter\expandafter\si@unt@unit + \fi + \fi + {#3}{#1}{#2}} +\long\def\si@gobblethree #1#2#3{} +\newif\ifsi@unt@litprefix +\si@unt@litprefixtrue +\newcommand*{\si@unt@defprefix}[4][]{% + \si@log@debug{Declaring multiple \string#1 with\MessageBreak + meaning \string#4}% + \expandafter\expandafter\expandafter\def\expandafter + \csname\expandafter\@gobble\string#2@opt@si\endcsname{#1}% + \protected\def#2{% + \ifsi@unt@littest + \expandafter\si@gobblethree + \else + \ifsi@unt@litout + \expandafter\expandafter\expandafter\@gobbletwo + \else + \ifsi@unt@litprefix + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\@gobbletwo + \else + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\si@unt@prefix + \fi + \fi + \fi + {#2}{#3}{#4}}} +\newcommand*{\si@unt@defpower}[3][]{% + \si@log@debug{Declaring power \string#2 with\MessageBreak + meaning \string#3}% + \expandafter\expandafter\expandafter\def\expandafter + \csname\expandafter\@gobble\string#2@opt@si\endcsname{#1}% + \protected\def#2{% + \ifsi@unt@littest + \expandafter\@gobbletwo + \else + \ifsi@unt@litout + \expandafter\expandafter\expandafter\si@unt@litpower + \else + \expandafter\expandafter\expandafter\si@unt@power + \fi + \fi + {#2}{#3}}} +\newcommand*{\si@unt@unithook}{} +\newcommand*{\si@unt@unit}[3]{% + \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}% + \si@unt@ifliteral{#3} + {\si@unt@addtostack{unit}{#3}% + \ifsi@unt@prepower + \expandafter\si@unt@stkpower + \fi} + {#3}% + \advance\si@unt@depthcnt\m@ne\relax + \ifnum\si@unt@depthcnt=\z@\relax + \expandafter\si@unt@final + \fi} +\newcommand*{\si@unt@firstorsecond}[2]{% + \ifsi@unt@first + \expandafter\si@unt@first + \else + \expandafter\si@unt@second + \fi + {#1}{#2}}% +\newcommand*{\si@unt@first}[2]{% + \si@ifnotmtarg{#1} + {\num{#1}% + \si@unt@numtrue}% + \si@unt@unithook + \ifcsname\expandafter\@gobble\string#2@opt@unt@si\endcsname + \expandafter\si@unt@setopts + \else + \expandafter\@gobble + \fi + {#2}% + \si@unt@addvaluesep + \si@unt@firstfalse} +\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}% + \@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}} +\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 + \renewcommand*{\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} +\newcommand*{\si@unt@spacecheck}{% + \renewcommand*{\si@tempa}{space}% + \expandafter\ifx + \csname si@unt@lastadd\si@unt@checkstack\endcsname\si@tempa + \else + \expandafter\si@unt@reciptest + \fi} +\newcommand*{\si@unt@prefix}[3]{% + \si@unt@firstorsecond{}{#1}% + \ifsi@prefixsymbolic + \expandafter\si@unt@addprefix + \else + \expandafter\si@unt@countprefix + \fi + {#1}{#2}{#3}} +\newcommand*{\si@unt@addprefix}[3]{% + \si@unt@addtostack{prefix}{#3}} +\newcount\si@unt@prefixcnt +\newcommand*{\si@unt@countprefix}[3]{% + \renewcommand*{\si@tempa}{binary}% + \expandafter\expandafter\expandafter\ifx\expandafter + \csname\expandafter\@gobble\string#1@opt@si\endcsname + \si@tempa + \expandafter\sisetup + \else + \expandafter\@gobble + \fi + {prefixbase=two}% + \si@tempcnta#2\relax + \ifsi@unt@per + \expandafter\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} +\newcommand*{\si@unt@litpower}[2]{\textsuperscript{#2}} +\newif\ifsi@unt@prepower +\newcommand*{\si@unt@power}[2]{% + \renewcommand*{\si@tempa}{post}% + \expandafter\expandafter\expandafter\ifx\expandafter + \csname\expandafter\@gobble\string#1@opt@si\endcsname + \si@tempa + \expandafter\@gobbletwo + \else + \expandafter\si@unt@firstorsecond + \fi + {}{\power}% + \si@unt@powerdim #2 pt\relax + \ifsi@frac\else + \ifsi@unt@per + \expandafter\expandafter\expandafter\si@unt@invpower + \fi + \fi + \renewcommand*{\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 + \else + \si@log@debug{Power \strip@pt\si@unt@powerdim\space saved + to be added after\MessageBreak next unit}% + \fi} +\newdimen\si@unt@powerdim +\newcommand*{\si@unt@stackpower}{% + \si@unt@prepowerfalse + \si@unt@stkpower + \ifsi@stickyper\else + \si@unt@perfalse + \si@unt@perseenfalse + \fi} +\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} +\newcommand*{\si@unt@stkpwr}{% + \ifdim\si@unt@powerdim=\z@\relax\else + \renewcommand*{\si@tempa}{unit}% + \expandafter\ifx + \csname si@unt@lastadd\si@unt@checkstack\endcsname + \si@tempa + \si@log@debug{Adding power + \strip@pt\si@unt@powerdim\space to output stack}% + \si@unt@addtostack{power}{^{\num{% + \strip@pt\si@unt@powerdim}}}% + \fi + \fi + \si@unt@powerdim\z@\relax} +\newcommand*{\si@unt@invpower}{% + \si@tempdima\si@unt@powerdim\relax + \si@unt@powerdim -\si@tempdima\relax + \ifdim\si@unt@powerdim=\p@\relax + \si@unt@powerdim\z@\relax + \fi} +\newif\ifsi@unt@per +\newif\ifsi@unt@perseen +\si@newrobustcmd*{\si@per}{% + \ifsi@unt@littest\else + \ifsi@unt@litout + \expandafter\expandafter\expandafter /% + \else + \ifsi@unt@litprefix + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter /% + \else + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\si@unt@per + \fi + \fi + \fi} +\newcommand*{\si@unt@per}{% + \si@unt@firstorsecond{}{\per}% + \ifsi@unt@per + \ifsi@stickyper\else + \expandafter\expandafter\expandafter\si@unt@perfalse + \fi + \else + \expandafter\si@unt@pertrue + \fi} +\let\per\si@per +\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} +\newcommand*{\si@unt@lastadda}{} +\newcommand*{\si@unt@lastaddb}{} +\newcommand*{\si@unt@addtostack}[2]{% + \renewcommand*{\si@tempa}{#1}% + \expandafter\ifx + \csname si@unt@lastadd\si@unt@checkstack\endcsname\si@tempa + \expandafter\@gobbletwo + \else + \expandafter\si@unt@preplussp + \fi + {#1}{#2}} +\newcommand*{\si@unt@preplussp}[2]{% + \renewcommand*{\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}} +\newcommand*{\si@unt@stack}[2]{% + \expandafter\renewcommand\expandafter*\expandafter{% + \csname si@unt@lastadd\si@unt@checkstack\endcsname}{#1}% + \renewcommand*{\si@tempa}{#1}% + \renewcommand*{\si@tempb}{unit}% + \ifx\si@tempa\si@tempb + \expandafter\si@unt@inccnt + \fi + \renewcommand*{\si@tempb}{space}% + \ifx\si@tempa\si@tempb + \expandafter\si@unt@holdspace + \else + \expandafter\si@unt@addstack + \fi + {#2}} +\newcommand*{\si@unt@inccnt}{% + \expandafter\advance + \csname si@unt@unitcnt\si@unt@checkstack\endcsname + \@ne\relax} +\newcommand*{\si@unt@holdstacka}{} +\newcommand*{\si@unt@holdstackb}{} +\newcommand*{\si@unt@holdspace}[1]{% + \renewcommand*{\si@tempa}{b}% + \edef\si@tempb{\si@unt@checkstack}% + \ifx\si@tempa\si@tempb + \ifx\@empty\si@unt@stackb\@empty + \else + \expandafter\protected@edef + \csname si@unt@holdstack\si@unt@checkstack\endcsname{#1}% + \fi + \else + \expandafter\protected@edef + \csname si@unt@holdstack\si@unt@checkstack\endcsname{#1}% + \fi} +\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}{}} +\newcommand*{\si@unt@stackout}{% + \si@unt@litouttrue + \ifsi@frac + \expandafter\si@unt@fracout + \else + \expandafter\si@unt@normout + \fi} +\newcommand*{\si@unt@checkstack}{% + \ifsi@frac + \ifsi@unt@per + \expandafter\expandafter\expandafter b% + \else + \expandafter\expandafter\expandafter a% + \fi + \else + \expandafter a% + \fi} +\newcommand*{\si@unt@spaceout}{% + \ensuremath{\si@unt@spstack}} +\newcommand*{\si@unt@prefixout}{% + \ifnum\si@unt@prefixcnt=\z@\relax\else + \ifsi@unt@num + \si@out{\ensuremath{{}\si@prefixproduct{}}}% + \fi + \si@unt@stackvalsep + \let\si@expbase\si@prefixbase + \num{e\the\si@unt@prefixcnt}% + \fi} +\newcommand*{\si@unt@normout}{% + \si@unt@prefixout + \si@unt@spaceout + \expandafter\si@unt@out\expandafter{\si@unt@stacka}} +\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 + \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 + \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} +\newcommand*{\si@unt@notambig}{% + \ifnum\si@unt@unitcntb>\@ne\relax + \ifsi@slash + \ifsi@trapambigfrac + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\si@unt@notabg + \fi + \fi + \fi} +\newcommand*{\si@unt@notabg}{% + \protected@edef\si@unt@stackb{\si@openfrac\si@unt@stackb + \si@closefrac}} +\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}}% + \endlinechar\m@ne + \si@out{\scantokens{#1}}% + \endgroup} +\endgroup +\newcommand*{\si@unt@nonlatin}{} +\ifdefined\XeTeXrevision + \renewcommand*{\si@unt@nonlatin}{% + \catcode176=\active + \catcode181=\active + \catcode197=\active + \si@unt@sym{176}{\si@sym@degree}% + \si@unt@sym{181}{\si@sym@mu}% + \si@unt@sym{197}{\si@sym@ringA}}% +\fi +\AtBeginDocument{ + \@ifpackageloaded{inputenc} + {\@for\si@tempa:=latin1,latin5,latin9\do{ + \ifx\inputencodingname\si@tempa + \renewcommand*{\si@unt@nonlatin}{% + \catcode176=\active + \catcode181=\active + \catcode197=\active + \si@unt@sym{176}{\si@sym@degree}% + \si@unt@sym{181}{\si@sym@mu}% + \si@unt@sym{197}{\si@sym@ringA}}% + \fi}} + {}} +\newcommand*{\si@unt@sym}[1]{% + \bgroup + \uccode`\~#1% + \uppercase{% + \egroup + \def~}} +\newunit{\kilogram}{kg} +\newunit{\metre}{m} +\newunit{\meter}{\metre} +\newunit{\mole}{mol} +\newunit{\second}{s} +\newunit{\ampere}{A} +\newunit{\kelvin}{K} +\newunit{\candela}{cd} +\newpower{\Square}{2} +\newpower{\ssquare}{2} +\newpower[post]{\squared}{2} +\newpower{\cubic}{3} +\newpower[post]{\cubed}{3} +\newcommand*{\tothe}{\si@tothe{\tothe}} +\newcommand*{\raiseto}{\si@tothe{\raiseto}} +\newcommand*{\si@tothe}[2]{% + \ifsi@unt@littest + \expandafter\@gobbletwo + \else + \ifsi@unt@litout + \expandafter\expandafter\expandafter\si@unt@litpower + \else + \expandafter\expandafter\expandafter\si@unt@power + \fi + \fi + {#1}{#2}} +\newcommand*{\tothe@opt@si}{post} +\newcommand*{\raiseto@opt@si}{} +\newcommand*{\si@loc@load}[1]{% + \let\si@loc@sisetup\sisetup + \renewcommand*{\sisetup}[1]{% + \expandafter\gdef\csname si@loc@#1\endcsname{##1}} + \si@loadfile{#1}% + \let\sisetup\si@loc@sisetup} +\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} +\newcommand*{\si@loc@ltol}[1]{% + \def\si@tempa##1:##2\@nil{\si@loc@load{##1}} + \@for\si@tempb:=#1\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:=#1\do{% + \expandafter\si@tempa\si@tempb::\@nil}} + {\si@log@warn{babel not loaded \MessageBreak + loctolang option ignored}}}} +\AtBeginDocument{ + \@ifpackageloaded{babel} + {\renewcommand*{\si@loc@ltol}[1]{% + \def\si@tempa##1:##2\@nil{\si@loc@load{##1}}% + \@for\si@tempb:=#1\do{% + \expandafter\si@tempa\si@tempb:\@nil}% + \def\si@tempa##1:##2:##3\@nil{% + \expandafter\addto\expandafter{% + \csname extras##2\endcsname}% + {\si@loc@set{##1}}}% + \@for\si@tempb:=#1\do{% + \expandafter\si@tempa\si@tempb::\@nil}}} + {\renewcommand*{\si@loc@ltol}[1]{% + \si@log@warn{babel not loaded \MessageBreak + loctolang option ignored}}}} +\newcommand*{\addtolocale}[2]{% + \si@addtocsname{si@loc@#1@extra}{#2}} +\begingroup + \catcode`\^=\active\relax + \catcode`\-=\active\relax + \gdef\si@out#1{% + \begingroup + \catcode`\^=\active\relax + \makeatletter + \endlinechar\m@ne + \ifsi@fam@set\else + \expandafter\si@fam@set + \fi + \si@colourcmd{\si@colour}% + \text{\si@fam@italic\si@fam@bold\si@fam@text + \ifsi@textmode + \expandafter\si@out@text + \else + \expandafter\si@out@maths + \fi + {\scantokens{#1}}}% + \endgroup + \check@mathfonts} + \gdef\si@out@text#1{% + \let^\si@out@sp + \let\textsuperscript\si@out@sp + \catcode`\-=\active\relax + \let-\si@out@minus + #1} + \gdef\si@out@maths#1{% + \let^\sp + \let\textsuperscript\sp + $\si@fam@maths{#1}$} +\endgroup +\newcommand*{\si@out@sp}[1]{\ensuremath{^{\text{#1}}}} +\newcommand*{\si@out@minus}{\ensuremath{-}} +\newif\ifsi@out@num +\newcommand*{\si@out@num}[1]{% + \begingroup + \si@out@numtrue + \si@out{#1}% + \endgroup} +\newcommand*{\si@extension}{cfg} +\newcommand*{\si@fileprefix}{si-} +\newcommand*{\si@ifl@aded}{} +\let\si@ifl@aded\@ifl@aded +\newcommand*{\si@ifloaded}[1]{% + \si@ifl@aded\si@extension{\si@fileprefix#1}} +\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}}}} +\newcommand*{\requiresiconfigs}[1]{% + \@for\si@tempb:=#1\do{\si@loadfile{\si@tempb}}} +\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 siunitx a back-compatibility + option)\MessageBreak but the package is already + loaded!}} + {\si@loadfile{#1}}} +\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'}} +\newcommand*{\si@emulating}[2]{% + \@namedef{ver@#1.sty}{#2 siunitx emulation of #1}% + \let\si@tempa\si@blockpkgs + \renewcommand*{\si@blockpkgs}{}% + \@for\si@tempb:=\si@tempa\do{% + \renewcommand*{\si@tempa}{#1}% + \ifx\si@tempa\si@tempb\else + \lowercase{\edef\si@tempa{#1}}% + \lowercase{\edef\si@tempc{\si@tempb}}% + \ifx\si@tempa\si@tempc + \@namedef{ver@\si@tempc.sty}{#2 siunitx emulation of + #1}% + \else + \si@addtolist{\si@blockpkgs}{\si@tempb}% + \fi + \fi}% + \let\si@tempa\si@checkpkgs + \renewcommand*{\si@checkpkgs}{}% + \renewcommand*{\si@tempb}{#1}% + \@for\si@tempc:=\si@tempa\do{% + \ifx\si@tempb\si@tempc\else + \si@addtolist{\si@checkpkgs}{\si@tempc}% + \fi}} +\sisetup{ + addsign=none, + allowzeroexp=false, + angformat=unchanged, + astroang=false,%( + closeerr=),%( + closefrac=), + colour=black, + colourall=false, + colourneg=false, + decimalsymbol=fullstop, + detectdisplay=true, + digitsep=thin, + dp=3, + eVcorra=0.3ex, + eVcorrb=0ex, + errspace=none, + fixdp=false, + inlinebold=text, + load=default, + mathsrm=mathrm, + mathssf=mathsf, + mathstt=mathtt, + mode=maths, + negcolour=red, + noload={}, + numaddn={},%( + numcloseerr=),% + numdecimal={.,}, + numdigits=0123456789, + numexp=eEdD, + numgobble={}, + numopenerr=(,%) + numprod=x, + numsign=+-\pm\mp, + obeybold=false, + obeyitalic=false, + obeymode=false, + openerr=(,%) + openfrac=(,%) + padangle=small, + padnumber=lead, + per=reciprocal, + prefixbase=ten, + prefixproduct=times, + prefixsymbolic=true, + prespace=false, + redefsymbols=true, + repeatunits=true, + retainplus=false, + seperr=false, + sepfour=false, + sign=plus, + slash=slash, + stickyper=false, + strictarc=true, + tabalignexp=true, + tabautofit=false, + tabformat=3.2, + tabnumalign=centredecimal, + tabtextalign=centre, + tabunitalign=left, + textrm=rmfamily, + textsf=sffamily, + texttt=ttfamily, + tightpm=false, + trapambigerr=true, + trapambigfrac=true, + unitsep=thin, + valuesep=thin, + xspace=false} +\ProcessOptionsX[si] +\ifx\@empty\si@emulate\@empty\else + \@for\si@tempa:=\si@emulate\do{% + \si@loademfile{\si@tempa}} +\fi +\newcommand*{\si@expanddefault}[2]{% + \expandafter\ifx\expandafter\@empty\csname si@#1\endcsname + \@empty + \else + \renewcommand*{\si@tempb}{default}% + \renewcommand*{\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}% + \renewcommand*{\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} +\si@expanddefault{load}{prefix,named,addn,prefixed,accepted,% + physical,abbr} +\IfFileExists{siunitx.cfg} + {\si@log@inf{Local configuration file found}% + \InputIfFileExists{siunitx.cfg}{}{}} + {} +\si@catcodes +\endinput +%% +%% End of file `siunitx.sty'. diff --git a/Master/tlpkg/bin/ctan2tds b/Master/tlpkg/bin/ctan2tds index 2c8debb2b40..79dcc805465 100755 --- a/Master/tlpkg/bin/ctan2tds +++ b/Master/tlpkg/bin/ctan2tds @@ -355,7 +355,6 @@ chdir $startdir || die "chdir($startdir) failed: $!"; # back to raw 'shortlst', "die 'skipping, nosell license'", 'showexpl', "&MAKEflatten", 'siam', "&MAKEsiam", - 'siunitx', "die 'skipping, still experimental'", 'skak', "&MAKEflatten", 'slidenotes', "die 'skipping, nonfree'", 'songs', "die 'skipping, requires binary'", diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 822de1d7c17..5c81ad46cce 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -170,7 +170,7 @@ my @WorkingTLP = qw( seqsplit setspace sf298 sffms sfg sfmath sgame shadbox shapepar shipunov shorttoc show2e showdim showexpl showlabels SIstyle SIunits - sidecap sides siggraph simplecv simplewick + sidecap sides siggraph simplecv simplewick siunitx skak skaknew slideshow smalltableof smartref snapshot songbook sort-by-letters soul spanish-mx sparklines spie splines splitbib splitindex spotcolor sprite srcltx sseq diff --git a/Master/tlpkg/tlpsrc/siunitx.tlpsrc b/Master/tlpkg/tlpsrc/siunitx.tlpsrc new file mode 100644 index 00000000000..bbdc65541b1 --- /dev/null +++ b/Master/tlpkg/tlpsrc/siunitx.tlpsrc @@ -0,0 +1,2 @@ +name siunitx +category Package -- cgit v1.2.3