diff --git a/texmf/tex/latex/frank_tex/minipage.sty b/texmf/tex/latex/frank_tex/minipage.sty new file mode 100644 index 0000000..b74368f --- /dev/null +++ b/texmf/tex/latex/frank_tex/minipage.sty @@ -0,0 +1,65 @@ +%%% ==================================================================== +%%% @LaTeX-style-file{ +%%% author = "Mario Wolczko", +%%% version = "2", +%%% date = "21 May 1992", +%%% time = "20:55:01 BST", +%%% filename = "boxedminipage.sty", +%%% email = "mario@acm.org", +%%% codetable = "ISO/ASCII", +%%% keywords = "LaTeX, minipage, framebox", +%%% supported = "no", +%%% docstring = "LaTeX document-style option which defines +%%% the boxedminipage environment -- just like minipage, but with +%%% a box around it.", +%%% } +%%% ==================================================================== +% +% This file is in the public domain +% +% The thickness of the rules around the box is controlled by +% \fboxrule, and the distance between the rules and the edges of the +% inner box is governed by \fboxsep. +% +% This code is based on Lamport's minipage code. +% +% Fixed, 7 Jun 89 by Jerry Leichter +% Leave \fboxsep worth of separation at top and bottom, not just at +% the sides! +% +\def\boxedminipage{\@ifnextchar [{\@iboxedminipage}{\@iboxedminipage[c]}} + +\def\@iboxedminipage[#1]#2{\leavevmode \@pboxswfalse + \if #1b\vbox + \else \if #1t\vtop + \else \ifmmode \vcenter + \else \@pboxswtrue $\vcenter + \fi + \fi + \fi\bgroup % start of outermost vbox/vtop/vcenter + \hsize #2 + \hrule\@height\fboxrule + \hbox\bgroup % inner hbox + \vrule\@width\fboxrule \hskip\fboxsep \vbox\bgroup % innermost vbox + \vskip\fboxsep + \advance\hsize -2\fboxrule \advance\hsize-2\fboxsep + \textwidth\hsize \columnwidth\hsize + \@parboxrestore + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ + \let\@footnotetext\@mpfootnotetext + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore\@minipagetrue + \everypar{\global\@minipagefalse\everypar{}}} + +\def\endboxedminipage{% + \par\vskip-\lastskip + \ifvoid\@mpfootins\else + \vskip\skip\@mpfootins\footnoterule\unvbox\@mpfootins\fi + \vskip\fboxsep + \egroup % ends the innermost \vbox + \hskip\fboxsep \vrule\@width\fboxrule + \egroup % ends the \hbox + \hrule\@height\fboxrule + \egroup% ends the vbox/vtop/vcenter + \if@pboxsw $\fi} + diff --git a/texmf/tex/latex/frank_tex/siunitx.sty b/texmf/tex/latex/frank_tex/siunitx.sty new file mode 100644 index 0000000..5c97779 --- /dev/null +++ b/texmf/tex/latex/frank_tex/siunitx.sty @@ -0,0 +1,3583 @@ +%% +%% 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} +\ProvidesPackage{siunitx} + [2009/03/29 v2.0alpha 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 +} +\begingroup + \@for\@tempa:=SIunits,sistyle,siunits,SIstyle,unitsdef,fancyunits\do{% + \@ifpackageloaded{\@tempa}{% + \PackageError{siunitx}{Package `\@tempa' incompatible}{% + The \@tempa\space package and siunitx are incompatible. + \MessageBreak Use the `emulate=\@tempa' package option when + loading siunitx. + }% + }{}% + } +\endgroup +\newcommand*{\si@package@check}{% + \begingroup + \@for\@tempa:=SIunits,sistyle,siunits,SIstyle\do{ + \@ifpackageloaded{\@tempa}{% + \PackageError{siunitx}{Package `\@tempa' incompatible}{% + The \@tempa\space package and siunitx are incompatible. + \MessageBreak Use the `emulate=\@tempa' package option when + loading siunitx. + }% + }{}% + }% + \endgroup +} +\AtBeginDocument{\si@package@check} +\newcommand*{\si@catcode@restore}{} +\newcommand*{\si@catcode@set}{} +\newcommand*{\si@catcode@store}[2]{% + \edef\si@catcode@restore{% + \si@catcode@restore + \catcode#1 \the\catcode#1\relax + }% + \catcode#1 #2\relax +} +\newcommand*{\si@catcode@symbols}{% + \si@catcode@set{42}{12}% * + \si@catcode@set{43}{12}% + + \si@catcode@set{44}{12}% , + \si@catcode@set{46}{12}% . + \si@catcode@set{47}{12}% / + \si@catcode@set{58}{12}% : + \si@catcode@set{59}{12}% ; + \si@catcode@set{60}{12}% < + \si@catcode@set{61}{12}% = + \si@catcode@set{62}{12}% > +} +\let\si@catcode@set\si@catcode@store +\si@catcode@symbols +\si@catcode@set{38}{4}% & +\si@catcode@set{45}{12}% - +\si@catcode@set{94}{7}% ^ +\si@catcode@set{95}{8}% _ +\si@catcode@set{126}{13}% ~ +\renewcommand*{\si@catcode@set}[2]{% + \catcode#1 #2\relax +} +\newcommand*{\si@lccode@restore}{} +\edef\si@lccode@restore{% + \lccode38 \the\lccode38\relax % & +} +\newcommand*{\si@lccode@set}[2]{% + \lccode#1 #2\relax +} +\RequirePackage{amstext,array,etex,pgfkeys} +\newcommand*{\si@encoding@ts@one}{% + \@ifundefined{T@TS1}{% + \DeclareFontEncoding{TS1}{}{}% + \DeclareFontSubstitution{TS1}{cmr}{m}{n}% + }{}% +} +\AtBeginDocument{% + \si@encoding@ts@one +} +\newcommand*{\si@key@path}{} +\newcommand*{\si@key@error}{% + \expandafter\si@key@error@aux\pgfkeyscurrentkey\si@stop +} +\newcommand*{\si@key@error@aux}{} +\def\si@key@error@aux/siunitx/#1\si@stop{% + \si@log@error{Unknown option `#1'}{% + The option `#1' is not known to siunitx. + }% +} +\newcommand*{\si@keys@family}[1]{% + \pgfkeys{ + /siunitx/#1/.is family, + /siunitx/#1/.unknown/.code = \si@key@error + }% +} +\pgfkeys{ + /siunitx/.is family, + /siunitx/.unknown/.code = \si@key@error +} +\pgfkeys{ + /handlers/.is siunitx switch/.code = {% + \edef\si@key@path{\pgfkeyscurrentpath}% + \pgfkeys{ + \si@key@path/.is choice, + \si@key@path/.default = {true}, + \si@key@path/true/.code = {\si@bool@cs@true{si@#1@bool}}, + \si@key@path/false/.code = {\si@bool@cs@false{si@#1@bool}}, + \si@key@path/yes/.code = {\si@bool@cs@true{si@#1@bool}}, + \si@key@path/no/.code = {\si@bool@cs@false{si@#1@bool}}, + \si@key@path/on/.code = {\si@bool@cs@true{si@#1@bool}}, + \si@key@path/off/.code = {\si@bool@cs@false{si@#1@bool}}, + }% + } +} +\newcommand*{\si@false@bool}{01} +\newcommand*{\si@true@bool}{00} +\newcommand*{\si@tmp@bool}{} +\newcommand*{\si@tempa}{} +\newcommand*{\si@tempb}{} +\newcount\si@tempcnt +\newsavebox\si@tempbox +\newtoks\si@temp@toks +\newcommand*{\si@log@error}{% + \PackageError{siunitx}% +} +\newcommand*{\si@log@info}{% + \PackageInfo{siunitx}% +} +\newcommand*{\si@log@warning}{% + \PackageWarning{siunitx}% +} +\newcommand*{\si@reserveda}{} +\newcommand*{\si@reservedb}{} +\newtoks\si@reserved@toks +\newcommand*{\si@add@left@n}[2]{% + \def\si@reserveda{#2}% + \edef#1{% + \expandafter\unexpanded\expandafter{\si@reserveda}% + \expandafter\unexpanded\expandafter{#1}% + }% +} +\newcommand*{\si@add@left@o}[2]{% + \expandafter\si@add@left@n\expandafter#1\expandafter{#2}% +} +\newcommand*{\si@add@left@cs@n}[1]{% + \expandafter\si@add@left@n\csname #1\endcsname +} +\newcommand*{\si@add@left@cs@o}[1]{% + \expandafter\si@add@left@o\csname #1\endcsname +} +\newcommand*{\si@add@right@n}[2]{% + \def\si@reserveda{#2}% + \edef#1{% + \expandafter\unexpanded\expandafter{#1}% + \expandafter\unexpanded\expandafter{\si@reserveda}% + }% +} +\newcommand*{\si@add@right@o}[2]{% + \expandafter\si@add@right@n\expandafter#1\expandafter{#2}% +} +\newcommand*{\si@add@right@cs@n}[1]{% + \expandafter\si@add@right@n\csname #1\endcsname +} +\newcommand*{\si@add@right@cs@o}[1]{% + \expandafter\si@add@right@o\csname #1\endcsname +} +\newcommand*{\si@bool@false}[1]{% + \let#1\si@false@bool +} +\newcommand*{\si@bool@new}[1]{% + \newcommand*{#1}{}% + \let#1\si@false@bool +} +\newcommand*{\si@bool@true}[1]{% + \let#1\si@true@bool +} +\newcommand*{\si@bool@cs@false}[1]{% + \expandafter\si@bool@false\csname #1\endcsname +} +\newcommand*{\si@bool@cs@new}[1]{% + \expandafter\si@bool@new\csname #1\endcsname +} +\newcommand*{\si@bool@cs@true}[1]{% + \expandafter\si@bool@true\csname #1\endcsname +} +\newcommand*{\si@bool@if@F}[1]{% + \if#1% + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi +} +\newcommand*{\si@bool@if@T}[1]{% + \if#1% + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi +} +\newcommand*{\si@bool@if@TF}[1]{% + \if#1% + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\newcommand*{\si@bool@cs@if@F}[1]{% + \expandafter\si@bool@if@F\csname #1\endcsname +} +\newcommand*{\si@bool@cs@if@T}[1]{% + \expandafter\si@bool@if@T\csname #1\endcsname +} +\newcommand*{\si@bool@cs@if@TF}[1]{% + \expandafter\si@bool@if@TF\csname #1\endcsname +} +\newcommand*{\si@clear@cs}[1]{% + \si@let@cN{#1}\@empty +} +\newcommand*{\si@clear@macro}[1]{% + \let#1\@empty +} +\newcommand*{\si@count@incr@cs}[1]{% + \advance\@nameuse{#1}\@ne\relax +} +\newcommand*{\si@csname@if@F}[1]{% + \ifcsname #1\endcsname + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi +} +\newcommand*{\si@csname@if@T}[1]{% + \ifcsname #1\endcsname + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi +} +\newcommand*{\si@csname@if@TF}[1]{% + \ifcsname #1\endcsname + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\newcommand*{\si@dowhile@bool@T}[2]{% + #2% + \si@bool@if@T#1{% + \si@dowhile@bool@T#1{#2}% + }% +} +\newcommand*{\si@empty@cs@if@F}[1]{% + \expandafter\si@empty@if@F\csname #1\endcsname +} +\newcommand*{\si@empty@cs@if@T}[1]{% + \expandafter\si@empty@if@T\csname #1\endcsname +} +\newcommand*{\si@empty@cs@if@TF}[1]{% + \expandafter\si@empty@if@TF\csname #1\endcsname +} +\newcommand*{\si@empty@if@F}[1]{% + \si@meaning@eq@if@F#1\@empty +} +\newcommand*{\si@empty@if@T}[1]{% + \si@meaning@eq@if@T#1\@empty +} +\newcommand*{\si@empty@if@TF}[1]{% + \si@meaning@eq@if@TF#1\@empty +} +\newcommand*{\si@empty@tlist@if@F}[1]{% + \expandafter\ifx\expandafter\si@nil\detokenize{#1}\si@nil + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi +} +\newcommand*{\si@empty@tlist@if@T}[1]{% + \expandafter\ifx\expandafter\si@nil\detokenize{#1}\si@nil + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi +} +\newcommand*{\si@empty@tlist@if@TF}[1]{% + \expandafter\ifx\expandafter\si@nil\detokenize{#1}\si@nil + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\newcommand*{\si@empty@toks@if@F}[1]{% + \expandafter\si@empty@tlist@if@F\expandafter{\the#1}% +} +\newcommand*{\si@empty@toks@if@T}[1]{% + \expandafter\si@empty@tlist@if@T\expandafter{\the#1}% +} +\newcommand*{\si@empty@toks@if@TF}[1]{% + \expandafter\si@empty@tlist@if@TF\expandafter{\the#1}% +} +\newcommand*{\si@elt@count}[1]{% + \number\numexpr 0\si@loop@over@macro#1\si@elt@count@aux\relax +} +\newcommand*{\si@elt@count@aux}[1]{+1} +\newcommand*{\si@elt@count@cs}[1]{% + \expandafter\si@elt@count\csname #1\endcsname +} +\newcommand*{\si@expand@tlist}[2]{% + \si@clear@macro#1% + \def\si@reservedb##1{% + \si@add@right@o#1{##1}% + }% + \si@loop@over@macro@aux\si@reservedb#2\si@loop@end\si@loop@stop +} +\newcommand*{\si@expand@tlist@cs}[1]{% + \expandafter\si@expand@tlist\csname #1\endcsname +} +\newcommand*{\si@in@if@F}[2]{% + \def\si@reserveda##1#2##2\si@stop{% + \si@no@value@if@T{##2}% + }% + \expandafter\si@reserveda#1#2\si@no@value\si@stop +} +\newcommand*{\si@in@if@T}[2]{% + \def\si@reserveda##1#2##2\si@stop{% + \si@no@value@if@F{##2}% + }% + \expandafter\si@reserveda#1#2\si@no@value\si@stop +} +\newcommand*{\si@in@if@TF}[2]{% + \def\si@reserveda##1#2##2\si@stop{% + \si@no@value@if@FT{##2}% + }% + \expandafter\si@reserveda#1#2\si@no@value\si@stop +} +\newcommand*{\si@in@tlist@if@F}[2]{% + \def\si@reserveda##1#2##2\si@stop{% + \si@no@value@if@T{##2}% + }% + \si@reserveda#1#2\si@no@value\si@stop +} +\newcommand*{\si@in@tlist@if@T}[2]{% + \def\si@reserveda##1#2##2\si@stop{% + \si@no@value@if@F{##2}% + }% + \si@reserveda#1#2\si@no@value\si@stop +} +\newcommand*{\si@in@tlist@if@TF}[2]{% + \def\si@reserveda##1#2##2\si@stop{% + \si@no@value@if@FT{##2}% + }% + \si@reserveda#1#2\si@no@value\si@stop +} +\newcommand*{\si@in@cs@if@F}[1]{% + \expandafter\si@in@if@F\csname #1\endcsname +} +\newcommand*{\si@in@cs@if@T}[1]{% + \expandafter\si@in@if@T\csname #1\endcsname +} +\newcommand*{\si@in@cs@if@TF}[1]{% + \expandafter\si@in@if@TF\csname #1\endcsname +} +\newcommand*{\si@let@cc}[2]{% + \expandafter\si@let@cN\expandafter{\expandafter#1\expandafter}% + \csname #2\endcsname +} +\newcommand*{\si@let@cN}[1]{% + \expandafter\let\csname #1\endcsname +} +\newcommand*{\si@let@Nc}[2]{% + \expandafter\let\expandafter#1\csname #2\endcsname +} +\newcommand*{\si@loop@over@cs}[1]{% + \expandafter\si@loop@over@macro\csname #1\endcsname +} +\newcommand*{\si@loop@over@macro}[2]{% + \expandafter\si@loop@over@macro@aux + \expandafter#2#1\si@loop@end\si@loop@stop +} +\newcommand*{\si@loop@over@macro@aux}[2]{% + \si@loop@end@if{#2}% + #1{#2}% + \si@loop@over@macro@aux#1% +} +\newcommand*{\si@loop@end@if}[1]{% + \expandafter\ifx\si@loop@end@if@aux#1?\si@nil\si@loop@end\si@loop@end + \expandafter\si@loop@exit + \fi +} +\newcommand*{\si@loop@exec@end@if}[2]{% + \expandafter\ifx\si@loop@end@if@aux#1?\si@nil\si@loop@end\si@loop@end + \expandafter\si@loop@exit@exec + \else + \expandafter\@gobble + \fi + {#2}% +} +\newcommand*{\si@loop@end@if@aux}{} +\def\si@loop@end@if@aux#1#2\si@nil\si@loop@end{#1} +\newcommand*{\si@loop@exit}{} +\def\si@loop@exit#1\si@loop@stop{} +\newcommand*{\si@loop@exit@exec}{} +\def\si@loop@exit@exec#1#2\si@loop@stop{#1} +\newcommand*{\si@loop@end}{\si@loop@end} +\newcommand*{\si@loop@stop}{\si@loop@stop} +\newcommand*{\si@loop@over@three}[2]{% + \expandafter\si@loop@over@three@aux + \expandafter#2#1\si@loop@end\si@loop@stop +} +\newcommand*{\si@loop@over@three@aux}[4]{% + \si@loop@end@if{#2}% + #1{#2#3#4}% + \si@loop@over@three@aux#1% +} +\newcommand*{\si@loop@over@three@cs}[1]{% + \expandafter\si@loop@over@three\csname #1\endcsname +} +\newcommand*{\si@meaning@eq@if@F}[2]{% + \ifx#1#2% + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi +} +\newcommand*{\si@meaning@eq@if@T}[2]{% + \ifx#1#2% + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi +} +\newcommand*{\si@meaning@eq@if@TF}[2]{% + \ifx#1#2% + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\newcommand*{\si@meaning@eq@cs@if@F}[2]{% + \expandafter\si@meaning@eq@if@F\csname #1\expandafter\endcsname + \csname #2\endcsname +} +\newcommand*{\si@meaning@eq@cs@if@T}[2]{% + \expandafter\si@meaning@eq@if@T\csname #1\expandafter\endcsname + \csname #2\endcsname +} +\newcommand*{\si@meaning@eq@cs@if@TF}[2]{% + \expandafter\si@meaning@eq@if@TF\csname #1\expandafter\endcsname + \csname #2\endcsname +} +\newcommand*{\si@mode@maths@display@if@T}{% + \ifmmode + \ifinner + \expandafter\expandafter\expandafter\@gobble + \else + \expandafter\expandafter\expandafter\@firstofone + \fi + \else + \expandafter\@gobble + \fi +} +\newcommand*{\si@mode@maths@inline@if@T}{% + \ifmmode + \ifinner + \expandafter\expandafter\expandafter\@firstofone + \else + \expandafter\expandafter\expandafter\@gobble + \fi + \else + \expandafter\@gobble + \fi +} +\newcommand*{\si@mode@maths@if@F}{% + \ifmmode + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi +} +\newcommand*{\si@mode@maths@if@TF}{% + \ifmmode + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\newcommand*{\si@edef@c}[1]{% + \expandafter\edef\csname #1\endcsname +} +\newcommand*{\si@newcommand}{% + \@ifstar{% + \let\l@ngrel@x\protected + \si@newcommand@aux@i + }{% + \def\l@ngrel@x{\protected\long}% + \si@newcommand@aux@i + }% +} +\newcommand*{\si@newcommand@aux@i}[1]{% + \@testopt{\si@newcommand@aux@ii#1}0% +} +\newcommand*{\si@newcommand@aux@ii}{} +\def\si@newcommand@aux@ii#1[#2]{% + \@ifnextchar[{% + \si@newcommand@aux@iii#1[#2]% + }{% + \@argdef#1[#2]% + }%] +} +\newcommand*{\si@newcommand@aux@iii}{} +\def\si@newcommand@aux@iii#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}% + }% +} +\newcommand*{\si@nil}{\si@nil} +\newcommand*{\si@stop}{\si@stop} +\newcommand*{\si@no@value}{\si@no@value} +\newcommand*{\si@no@value@if@F}[1]{% + \if\si@no@value@if@aux@i{#1}% + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi +} +\newcommand*{\si@no@value@if@FT}[1]{% + \if\si@no@value@if@aux@i{#1}% + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi +} +\newcommand*{\si@no@value@if@T}[1]{% + \if\si@no@value@if@aux@i{#1}% + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi +} +\newcommand*{\si@no@value@if@TF}[1]{% + \if\si@no@value@if@aux@i{#1}% + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\newcommand*{\si@no@value@if@aux@i}[1]{% + \if\expandafter\si@no@value@if@aux@ii\expandafter + {\string\si@no@value\space}{\detokenize{#1}}% + \si@true@bool + \else + \si@false@bool + \fi +} +\newcommand*{\si@no@value@if@aux@ii}[1]{% + \if\number\si@no@value@if@aux@iii{}{}#1\relax +} +\newcommand*{\si@no@value@if@aux@iii}[3]{% + \if#3\relax + \expandafter\si@no@value@if@aux@iv + \fi + \si@no@value@if@aux@iii{\if#3#1}{#2\fi}% +} +\newcommand*{\si@no@value@if@aux@iv}{} +\def\si@no@value@if@aux@iv\si@no@value@if@aux@iii#1#2#3{% + #1#3\relax'#213 + \si@true@bool + \else + \si@false@bool + \fi +} +\newcommand*{\si@num@if@F}[1]{% + \ifnum#1\relax + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi +} +\newcommand*{\si@num@if@T}[1]{% + \ifnum#1\relax + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi +} +\newcommand*{\si@num@if@TF}[1]{% + \ifnum#1\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\newcommand*{\si@replace@all@in}[3]{% + \si@reserved@toks{}% + \def\si@tempa##1#2##2\si@stop{% + \si@no@value@if@TF{##2}{% + \si@replace@all@in@aux{##1}% + }{% + \si@replace@all@in@aux{##1#3}% + \si@tempa\@empty##2\si@stop + }% + }% + \@firstofone{\expandafter\si@tempa\expandafter\@empty}% + #1#2\si@no@value\si@stop + \edef#1{\the\si@reserved@toks}% +} +\newcommand*{\si@replace@all@in@aux}[1]{% + \si@reserved@toks\expandafter\expandafter\expandafter{% + \expandafter\the\expandafter\si@reserved@toks#1% + }% +} +\newcommand*{\si@replace@all@in@cs}[1]{% + \expandafter\si@replace@all@in\csname #1\endcsname +} +\newcommand*{\si@reverse@macro}[1]{% + \edef#1{% + \expandafter\si@reverse@tlist\expandafter{#1}% + }% +} +\newcommand*{\si@reverse@cs}[1]{% + \expandafter\si@reverse@macro\csname #1\endcsname +} +\newcommand*{\si@reverse@tlist}[1]{% + \si@reverse@tlist@aux{}#1\si@loop@end\si@loop@stop +} +\newcommand*{\si@reverse@tlist@aux}[2]{% + \si@loop@exec@end@if{#2}{#1}% + \si@reverse@tlist@aux{#2#1}% +} +\newcommand*{\si@stop@if@F}[1]{% + \si@meaning@eq@if@F#1\si@stop +} +\newcommand*{\si@stop@if@T}[1]{% + \si@meaning@eq@if@T#1\si@stop +} +\newcommand*{\si@stop@if@TF}[1]{% + \si@meaning@eq@if@TF#1\si@stop +} +\newcommand*{\si@whiledo@num@T}[2]{% + \si@num@if@T{#1}{% + #2\si@whiledo@num@T{#1}{#2}% + }% +} +\newcommand*{\si@whiledo@empty@F}[2]{% + \si@empty@if@F#1{% + #2\si@whiledo@empty@F#1{#2}% + }% +} +\newcommand*{\si@whiledo@empty@T}[2]{% + \si@empty@if@T#1{% + #2\si@whiledo@empty@T#1{#2}% + }% +} +\newcommand*{\si@whiledo@empty@cs@F}[2]{% + \si@empty@cs@if@F{#1}{% + #2\si@whiledo@empty@cs@F{#1}{#2}% + }% +} +\newcommand*{\si@whiledo@empty@cs@T}[2]{% + \si@empty@cs@if@T{#1}{% + #2\si@whiledo@empty@cs@T{#1}{#2}% + }% +} +\newcommand*{\si@font@fam@mathsf}{} +\newcommand*{\si@font@fam@mathtt}{} +\newcommand*{\si@font@fam@detect@maths}[1]{% + \begingroup + \setbox\@tempboxa\hbox{% + \ensuremath{% + \csname math#1\endcsname{% + \expandafter\global\expandafter\chardef + \csname si@font@fam@math#1\endcsname\fam\relax + }% + }% + }% + \endgroup +} +\g@addto@macro{\document}{% + \si@font@fam@detect@maths{sf}% + \si@font@fam@detect@maths{tt}% +} +\newcommand*{\si@font@fam@sfdefault}{} +\newcommand*{\si@font@fam@ttfamily}{} +\newcommand*{\si@font@fam@detect@text}[1]{% + \si@edef@c{si@font@fam@#1default}{\@nameuse{#1default}}% +} +\AtBeginDocument{% + \si@font@fam@detect@text{sf}% + \si@font@fam@detect@text{tt}% +} +\si@bool@new\si@font@det@b@bool +\si@bool@new\si@font@det@family@bool +\si@bool@new\si@font@det@maths@display@bool +\si@bool@new\si@font@det@maths@inline@bool +\si@bool@new\si@font@det@it@bool +\si@bool@new\si@font@det@mode@bool +\si@keys@family{font/detect} +\pgfkeys{ + /siunitx/font/detect, + all/.style = { + /siunitx/font/detect/bold = true, + /siunitx/font/detect/family = true, + /siunitx/font/detect/italic = true, + /siunitx/font/detect/mode = true + }, + bold/.is siunitx switch = {font@det@b}, + display math/.is siunitx switch = {font@det@maths@display}, + display maths/.is siunitx switch = {font@det@maths@display}, + family/.is siunitx switch = {font@det@family}, + inline bold/.is choice, + inline bold/.cd, + maths/.code = {\si@bool@true\si@font@det@maths@inline@bool}, + math/.code = {\si@bool@true\si@font@det@maths@inline@bool}, + text/.code = {\si@bool@false\si@font@det@maths@inline@bool}, + /siunitx/font/detect, + italic/.is siunitx switch = {font@det@it}, + mode/.is siunitx switch = {font@det@mode}, + none/.style = { + /siunitx/font/detect/bold = false, + /siunitx/font/detect/family = false, + /siunitx/font/detect/italic = false, + /siunitx/font/detect/mode = false + }, + bold = false, + display maths = true, + inline bold = text, + italic = false, + mode = false +} +\si@bool@new\si@font@set@bool +\newcommand*{\si@font@set@bold}{} +\newcommand*{\si@font@set@family}{} +\newcommand*{\si@font@set@italic}{} +\si@bool@new\si@font@set@text@bool +\newcommand*{\si@font@det@set}{% + \si@bool@if@F\si@font@set@bool{% + \si@font@det@init + \si@bool@if@T\si@font@det@b@bool{% + \si@font@det@bold + }% + \si@bool@if@T\si@font@det@family@bool{% + \si@font@det@family + }% + \si@bool@if@T\si@font@det@it@bool{% + \si@font@det@italic + }% + \si@bool@if@T\si@font@det@mode@bool{% + \si@font@det@mode + }% + }% +} +\newcommand*{\si@font@det@init}{% + \si@bool@true\si@font@set@bool + \def\si@font@set@bold{\unboldmath\mdseries}% + \def\si@font@set@family{rm}% + \si@bool@false\si@font@set@text@bool + \def\si@font@set@italic{\upshape}% +} +\newcommand*{\si@font@det@bold}{% + \si@mode@maths@display@if@T{% + \si@bool@if@TF\si@font@det@maths@display@bool{% + \si@font@det@bold@maths + }{% + \si@font@det@bold@text + }% + }% + \si@mode@maths@inline@if@T{% + \si@bool@if@TF\si@font@det@maths@inline@bool{% + \si@font@det@bold@maths + }{% + \si@font@det@bold@text + }% + }% + \si@mode@maths@if@F{% + \si@font@det@bold@text + }% +} +\newcommand*{\si@font@det@bold@maths}{% + \def\si@tempa{bold}% + \si@meaning@eq@if@T\si@tempa\math@version{% + \def\si@font@set@bold{\boldmath\bfseries}% + }% +} +\newcommand*{\si@font@det@bold@text}{% + \def\si@tempa{b}% + \edef\si@tempb{\expandafter\@car\f@series\@nil}% + \si@meaning@eq@if@T\si@tempa\si@tempb{% + \def\si@font@set@bold{\boldmath\bfseries}% + }% +} +\newcommand*{\si@font@det@family}{% + \si@font@det@fam@text + \si@bool@if@T\si@font@det@maths@display@bool{% + \si@mode@maths@display@if@T{% + \si@font@det@fam@maths + }% + }% +} +\newcommand*{\si@font@det@fam@maths}{% + \def\si@font@set@family{rm}% + \si@num@if@TF{\the\fam=\si@font@fam@mathsf}{% + \def\si@font@set@family{sf}% + }{% + \si@num@if@T{\the\fam=\si@font@fam@mathtt}{% + \def\si@font@set@family{tt}% + }% + }% +} +\newcommand*{\si@font@det@fam@text}{% + \si@meaning@eq@if@T\f@family\si@font@fam@sfdefault{% + \def\si@font@set@family{sf}% + }% + \si@meaning@eq@if@T\f@family\si@font@fam@ttdefault{% + \def\si@font@set@family{tt}% + }% +} +\newcommand*{\si@font@det@italic}{% + \def\si@tempa{it}% + \si@meaning@eq@if@T\si@tempa\f@shape{% + \def\si@font@set@italic{\itshape}% + }% +} +\newcommand*{\si@font@det@mode}{% + \si@mode@maths@if@F{% + \si@bool@true\si@font@set@text@bool + }% +} +\newcommand*{\si@font@unit@maths@rm}{} +\newcommand*{\si@font@unit@maths@sf}{} +\newcommand*{\si@font@unit@maths@tt}{} +\newcommand*{\si@font@unit@text@rm}{} +\newcommand*{\si@font@unit@text@sf}{} +\newcommand*{\si@font@unit@text@tt}{} +\newcommand*{\si@font@num@maths@rm}{} +\newcommand*{\si@font@num@maths@sf}{} +\newcommand*{\si@font@num@maths@tt}{} +\newcommand*{\si@font@num@text@rm}{} +\newcommand*{\si@font@num@text@sf}{} +\newcommand*{\si@font@num@text@tt}{} +\si@bool@new\si@font@unit@textmode@bool +\si@bool@new\si@font@num@textmode@bool +\si@keys@family{font} +\si@keys@family{font/units} +\si@keys@family{font/numbers} +\pgfkeys{ + /siunitx/font, + maths rm/.style = { + /siunitx/font/units/maths rm = #1, + /siunitx/font/numbers/maths rm = #1 + }, + maths sf/.style = { + /siunitx/font/units/maths sf = #1, + /siunitx/font/numbers/maths sf = #1 + }, + maths tt/.style = { + /siunitx/font/units/maths tt = #1, + /siunitx/font/numbers/maths tt = #1 + }, + maths rm/.style = { + /siunitx/font/units/maths rm = #1, + /siunitx/font/numbers/maths rm = #1 + }, + maths sf/.style = { + /siunitx/font/units/maths sf = #1, + /siunitx/font/numbers/maths sf = #1 + }, + maths tt/.style = { + /siunitx/font/units/maths tt = #1, + /siunitx/font/numbers/maths tt = #1 + }, + mode/.is choice, + mode/.cd, + maths/.style = { + /siunitx/font/units/mode = maths, + /siunitx/font/numbers/mode = maths + }, + math/.style = { + /siunitx/font/units/mode = maths, + /siunitx/font/numbers/mode = maths + }, + text/.style = { + /siunitx/font/units/mode = text, + /siunitx/font/numbers/mode = text + }, + /siunitx/font, + text rm/.style = { + /siunitx/font/units/text rm = #1, + /siunitx/font/numbers/text rm = #1 + }, + text sf/.style = { + /siunitx/font/units/text sf = #1, + /siunitx/font/numbers/text sf = #1 + }, + text tt/.style = { + /siunitx/font/units/text tt = #1, + /siunitx/font/numbers/text tt = #1 + }, + /siunitx/font/units, + maths rm/.store in = {\si@font@unit@maths@rm}, + maths sf/.store in = {\si@font@unit@maths@sf}, + maths tt/.store in = {\si@font@unit@maths@tt}, + maths rm/.store in = {\si@font@unit@maths@rm}, + maths sf/.store in = {\si@font@unit@maths@sf}, + maths tt/.store in = {\si@font@unit@maths@tt}, + mode/.is choice, + mode/.cd, + maths/.code = {\si@bool@false\si@font@unit@textmode@bool}, + math/.code = {\si@bool@false\si@font@unit@textmode@bool}, + text/.code = {\si@bool@true\si@font@unit@textmode@bool}, + /siunitx/font/units, + text rm/.store in = {\si@font@unit@text@rm}, + text sf/.store in = {\si@font@unit@text@sf}, + text tt/.store in = {\si@font@unit@text@tt}, + /siunitx/font/numbers, + maths rm/.store in = {\si@font@num@maths@rm}, + maths sf/.store in = {\si@font@num@maths@sf}, + maths tt/.store in = {\si@font@num@maths@tt}, + maths rm/.store in = {\si@font@num@maths@rm}, + maths sf/.store in = {\si@font@num@maths@sf}, + maths tt/.store in = {\si@font@num@maths@tt}, + mode/.is choice, + mode/.cd, + maths/.code = {\si@bool@false\si@font@num@textmode@bool}, + math/.code = {\si@bool@false\si@font@num@textmode@bool}, + text/.code = {\si@bool@true\si@font@num@textmode@bool}, + /siunitx/font/numbers, + text rm/.store in = {\si@font@num@text@rm}, + text sf/.store in = {\si@font@num@text@sf}, + text tt/.store in = {\si@font@num@text@tt}, + /siunitx/font, + maths rm = \mathrm, + maths sf = \mathsf, + maths tt = \mathtt, + mode = maths, + text rm = \rmfamily, + text sf = \sffamily, + text tt = \ttfamily +} +\newcommand*{\si@print@type}{} +\newcommand*{\si@print}[2]{% + \begingroup + \def\si@print@type{#1}% + \si@bool@if@F\si@font@set@bool{% + \si@font@det@set + }% + \si@bool@if@F\si@font@det@mode@bool{% + \si@bool@cs@if@TF{si@font@#1@textmode@bool}{% + \si@bool@true\si@font@set@text@bool + }{% + \si@bool@false\si@font@set@text@bool + }% + }% + \si@print@codes + \text{\si@print@print{#2}}% + \endgroup + \check@mathfonts +} +\newcommand*{\si@print@num}{% + \si@print{num}% +} +\newcommand*{\si@print@num@o}[1]{% + \expandafter\si@print@num\expandafter{#1}% +} +\newcommand*{\si@print@unit}{% + \si@print{unit}% +} +\newcommand*{\si@print@unit@o}[1]{% + \expandafter\si@print@unit\expandafter{#1}% +} +\si@catcode@set{45}{13}% - +\si@catcode@set{94}{13}% ^ +\si@catcode@set{95}{13}% _ +\newcommand*{\si@print@codes}{% + \si@catcode@symbols + \si@catcode@set{94}{13}% ^ + \si@catcode@set{95}{13}% _ + \everyeof{\noexpand}% + \endlinechar\m@ne\relax + \si@bool@if@TF\si@font@set@text@bool{% + \si@catcode@set{45}{13}% - + \let-\si@print@minus + \let_\si@print@sb + \let^\si@print@sp + \let\textsubscript\si@print@sb + \let\textsuperscript\si@print@sp + }{% + \si@catcode@set{45}{12}% - + \let_\sb + \let^\sp + \let\textsubscript\sb + \let\textsuperscript\sp + }% +} +\si@catcode@set{45}{12}% - +\si@catcode@set{94}{7}% ^ +\si@catcode@set{95}{8}% _ +\newcommand*{\si@print@maths}[1]{% + \ensuremath{% + \@nameuse{si@font@\si@print@type @maths@\si@font@set@family}{#1}% + }% +} +\newcommand*{\si@print@text}[1]{#1} +\newcommand*{\si@print@print}[1]{% + \si@font@set@bold + \si@font@set@italic + \@nameuse{si@font@\si@print@type @text@\si@font@set@family}% + \si@bool@if@TF\si@font@set@text@bool{% + \si@print@text{\scantokens{#1}}% + }{% + \si@print@maths{\scantokens{#1}}% + }% +} +\newcommand*{\si@print@minus}{% + \text{\si@print@minus@symbol}% +} +\DeclareTextSymbolDefault{\si@print@minus@symbol}{TS1} +\DeclareTextSymbol{\si@print@minus@symbol}{TS1}{61} +\newcommand*{\si@print@sb}[1]{% + \ensuremath{_{\text{#1}}}% +} +\newcommand*{\si@print@sp}[1]{% + \ensuremath{^{\text{#1}}}% +} +\newcommand*{\si@num@pre@product}{} +\newcommand*{\si@num@pre@quotient}{} +\newcommand*{\si@num@pre@tokens}{} +\si@keys@family{numbers/input} +\pgfkeys{ + /siunitx/numbers/input, + product/.store in = {\si@num@pre@product}, + quotient/.store in = {\si@num@pre@quotient}, + protect tokens/.store in = {\si@num@pre@tokens}, + product = x, + quotient = /, + protect tokens = \mp\pi\pm +} +\newcommand*{\si@num@pre@arg}{} +\newcommand*{\si@num@pre@arg@den}{} +\newcommand*{\si@num@pre@arg@held}{} +\newcommand*{\si@num@pre@arg@num}{} +\si@bool@new\si@num@pre@error@bool +\newcommand*{\si@num@pre@process}[1]{% + \si@num@pre@init + \begingroup + \si@num@pre@protect@tokens + \protected@edef\@tempa{#1}% + \expandafter\endgroup\expandafter + \def\expandafter\si@num@pre@arg\expandafter{\@tempa}% + \si@num@pre@sep@prod + \si@num@pre@sep@quot +} +\newcommand*{\si@num@pre@error}{% + \si@bool@true\si@num@pre@error@bool + \si@log@error +} +\newcommand*{\si@num@pre@init}{% + \si@clear@macro\si@num@pre@arg + \si@clear@macro\si@num@pre@arg@den + \si@clear@macro\si@num@pre@arg@held + \si@clear@macro\si@num@pre@arg@num + \si@bool@false\si@num@pre@error@bool +} +\newcommand*{\si@num@pre@protect@tokens}{% + \si@loop@over@macro\si@num@pre@tokens\si@num@pre@protect@tokens@aux +} +\newcommand*{\si@num@pre@protect@tokens@aux}[1]{% + \let#1\relax +} +\newcommand*{\si@num@pre@sep@prod}{% + \si@loop@over@macro\si@num@pre@product\si@num@pre@sep@prod@aux +} +\newcommand*{\si@num@pre@sep@prod@aux}[1]{% + \si@in@if@T\si@num@pre@arg{#1}{% + \def\si@tempa##1#1##2\si@stop{% + \def\si@num@pre@arg{##1}% + \def\si@num@pre@arg@held{##2}% + }% + \expandafter\si@tempa\si@num@pre@arg\si@stop + \si@empty@if@T\si@num@pre@arg{% + \si@num@pre@error{Misplaced product token}{% + A number cannot begin with a product token. + }% + }% + \si@empty@if@T\si@num@pre@arg@held{% + \si@num@pre@error{Misplaced product token}{% + A number cannot end with a product token. + }% + }% + \si@loop@exit + }% +} +\newcommand*{\si@num@pre@sep@quot}{% + \si@loop@over@macro\si@num@pre@quotient\si@num@pre@sep@quot@aux +} +\newcommand*{\si@num@pre@sep@quot@aux}[1]{% + \si@in@if@T\si@num@pre@arg{#1}{% + \def\si@tempa##1#1##2\si@stop{% + \def\si@num@pre@arg@num{##1}% + \def\si@num@pre@arg@den{##2}% + }% + \expandafter\si@tempa\si@num@pre@arg\si@stop + \si@empty@if@T\si@num@pre@arg@num{% + \si@num@pre@error{Misplaced quotient token}{% + A number cannot begin with a quotient token. + }% + }% + \si@empty@if@T\si@num@pre@arg@den{% + \si@num@pre@error{Misplaced quotient token}{% + A number cannot end with a quotient token. + }% + }% + \si@in@if@T\si@num@pre@arg@den{#1}{% + \si@num@pre@error{Duplicate quotient token}{% + Only one quotient token can appear in a single number. + }% + }% + \si@loop@exit + }% +} +\newcommand*{\si@num@in@uncert@close}{} +\newcommand*{\si@num@in@complex}{} +\newcommand*{\si@num@in@decimal}{} +\newcommand*{\si@num@in@digits}{} +\newcommand*{\si@num@in@exponent}{} +\newcommand*{\si@num@in@signs}{} +\newcommand*{\si@num@in@symbols}{} +\pgfkeys{ + /siunitx/numbers/input, + close uncertainty/.store in = {\si@num@in@uncert@close}, + complex roots/.store in = {\si@num@in@complex}, + decimal markers/.store in = {\si@num@in@decimal}, + digits/.store in = {\si@num@in@digits}, + exponent markers/.store in = {\si@num@in@exponent}, + ignore/.store in = {\si@num@in@ignore}, + open uncertainty/.store in = {\si@num@in@uncert@open}, + signs/.store in = {\si@num@in@signs}, + symbols/.store in = {\si@num@in@symbols}, %( + close uncertainty = ), + complex roots = ij, + decimal markers = {.,}, + digits = 0123456789, + exponent markers = dDeE, + ignore = {}, + open uncertainty = (, %) + signs = +-\mp\pm, + symbols = \pi +} +\newcommand*{\si@num@in@mant}{} +\newcommand*{\si@num@in@mant@sign}{} +\newcommand*{\si@num@in@mant@int}{} +\newcommand*{\si@num@in@mant@dec}{} +\newcommand*{\si@num@in@mant@uncert}{} +\newcommand*{\si@num@in@mant@uncert@int}{} +\newcommand*{\si@num@in@mant@uncert@dec}{} +\newcommand*{\si@num@in@mant@comp}{} +\newcommand*{\si@num@in@mant@comp@sign}{} +\newcommand*{\si@num@in@mant@comp@int}{} +\newcommand*{\si@num@in@mant@comp@dec}{} +\newcommand*{\si@num@in@mant@comp@uncert}{} +\newcommand*{\si@num@in@mant@comp@uncert@int}{} +\newcommand*{\si@num@in@mant@comp@uncert@dec}{} +\newcommand*{\si@num@in@exp}{} +\newcommand*{\si@num@in@exp@sign}{} +\newcommand*{\si@num@in@exp@int}{} +\newcommand*{\si@num@in@exp@dec}{} +\newcommand*{\si@num@in@exp@uncert}{} +\newcommand*{\si@num@in@exp@uncert@int}{} +\newcommand*{\si@num@in@exp@uncert@dec}{} +\newcommand*{\si@num@in@exp@comp}{} +\newcommand*{\si@num@in@exp@comp@sign}{} +\newcommand*{\si@num@in@exp@comp@int}{} +\newcommand*{\si@num@in@exp@comp@dec}{} +\newcommand*{\si@num@in@exp@comp@uncert}{} +\newcommand*{\si@num@in@exp@comp@uncert@int}{} +\newcommand*{\si@num@in@exp@comp@uncert@dec}{} +\si@bool@new\si@num@in@mant@bool +\si@bool@new\si@num@in@mant@dec@bool +\si@bool@new\si@num@in@mant@uncert@dec@bool +\si@bool@new\si@num@in@mant@comp@bool +\si@bool@new\si@num@in@mant@comp@dec@bool +\si@bool@new\si@num@in@mant@comp@uncert@dec@bool +\si@bool@new\si@num@in@exp@bool +\si@bool@new\si@num@in@exp@dec@bool +\si@bool@new\si@num@in@exp@uncert@dec@bool +\si@bool@new\si@num@in@exp@comp@bool +\si@bool@new\si@num@in@exp@comp@dec@bool +\si@bool@new\si@num@in@exp@comp@uncert@dec@bool +\si@bool@new\si@num@in@symbols@bool +\newcommand*{\si@num@in@arg}{} +\si@bool@new\si@num@in@error@bool +\newcommand*{\si@num@in@parse}[1]{% + \si@num@in@init + \si@num@in@rescan{#1}% + \si@empty@if@TF\si@num@in@arg{% + \si@bool@true\si@num@in@error@bool + }{% + \si@num@in@arg@loop + \si@num@in@try{\si@num@in@separate}% + \si@num@in@try{\si@num@in@finalise}% + }% +} +\newcommand*{\si@num@in@parse@o}[1]{% + \expandafter\si@num@in@parse\expandafter{#1}% +} +\newcommand*{\si@num@in@add}[1]{% + \si@add@right@cs@n{si@num@in@#1}% +} +\newcommand*{\si@num@in@arg@loop}{% + \si@expand@tlist\si@tempa{% + \si@num@in@signs + \si@num@in@ignore + \si@num@in@digits + \si@num@in@decimal + \si@num@in@exponent + \si@num@in@complex + \si@num@in@symbols + \si@num@in@uncert@open + \si@num@in@uncert@close + }% + \si@clear@macro\si@tempb + \si@loop@over@macro\si@num@in@arg\si@num@in@arg@loop@aux + \si@num@in@try{\let\si@num@in@arg\si@tempb}% +} +\newcommand*{\si@num@in@arg@loop@aux}[1]{% + \si@in@if@F\si@tempa{#1}{% + \si@num@in@throw{Invalid token `#1' in numerical input}{% + Only the tokens: \MessageBreak + \si@tempa \MessageBreak + are valid for numerical input. + }% + \si@loop@exit + }% + \si@in@if@F\si@num@in@ignore{#1}{% + \si@add@right@n\si@tempb{#1}% + }% + \si@in@if@T\si@num@in@symbols{#1}{% + \si@bool@true\si@num@in@symbols@bool + }% +} +\newcommand*{\si@num@in@finalise}{% + \si@num@in@final@check + \si@num@in@try{\si@num@in@final@tidy}% +} +\newcommand*{\si@num@in@final@check}{% + \si@bool@true\si@num@in@mant@bool + \si@empty@if@T\si@num@in@mant@dec{% + \si@empty@if@T\si@num@in@mant@int{% + \si@bool@false\si@num@in@mant@bool + \si@empty@if@F\si@num@in@mant@uncert{% + \si@num@in@throw{Uncertainty but no number}{% + The mantissa contains only an uncertainty. + }% + }% + }% + }% + \si@bool@if@T\si@num@in@mant@comp@bool{% + \si@empty@if@T\si@num@in@mant@comp@dec{% + \si@empty@if@T\si@num@in@mant@comp@int{% + \si@empty@if@F\si@num@in@mant@comp@uncert{% + \si@num@in@throw{Uncertainty but no number}{% + The complex mantissa contains only an uncertainty. + }% + }% + }% + }% + }% + \si@bool@true\si@num@in@exp@bool + \si@empty@if@T\si@num@in@exp@dec{% + \si@empty@if@T\si@num@in@exp@int{% + \si@bool@false\si@num@in@exp@bool + \si@empty@if@F\si@num@in@exp@uncert{% + \si@num@in@throw{Uncertainty but no number}{% + The exponent contains only an uncertainty. + }% + }% + \si@empty@if@F\si@num@in@exp@sign{% + \si@num@in@throw{Sign but no exponent}{% + The exponent contains only a sign. + }% + }% + }% + }% + \si@bool@if@T\si@num@in@exp@comp@bool{% + \si@empty@if@T\si@num@in@exp@comp@dec{% + \si@empty@if@T\si@num@in@exp@comp@int{% + \si@empty@if@F\si@num@in@exp@comp@uncert{% + \si@num@in@throw{Uncertainty but no number}{% + The complex exponent contains only an uncertainty. + }% + }% + }% + }% + }% + \si@bool@if@F\si@num@in@mant@bool{% + \si@bool@if@F\si@num@in@mant@comp@bool{% + \si@bool@if@F\si@num@in@exp@bool{% + \si@bool@if@F\si@num@in@exp@comp@bool{% + \si@num@in@throw{Empty numerical argument}{% + The given `number' contains no information. + }% + }% + }% + }% + }% +} +\newcommand*{\si@num@in@final@tidy}{% + \si@num@in@final@tidy@aux{mant}% + \si@num@in@final@tidy@aux{exp}% +} +\newcommand*{\si@num@in@final@tidy@aux}[1]{% + \si@num@in@remove@zeros{#1}% + \si@num@in@remove@zeros{#1@comp}% + \si@num@in@zero@sign{#1}% +} +\newcommand*{\si@num@in@init}{% + \si@bool@false\si@num@in@error@bool + \si@bool@false\si@num@in@symbols@bool + \si@loop@over@macro\si@num@in@init@names\si@num@in@init@aux + \si@bool@false\si@num@in@mant@bool + \si@bool@false\si@num@in@mant@dec@bool + \si@bool@false\si@num@in@mant@uncert@dec@bool + \si@bool@false\si@num@in@mant@comp@bool + \si@bool@false\si@num@in@mant@comp@dec@bool + \si@bool@false\si@num@in@mant@comp@uncert@dec@bool + \si@bool@false\si@num@in@exp@bool + \si@bool@false\si@num@in@exp@dec@bool + \si@bool@false\si@num@in@exp@uncert@dec@bool + \si@bool@false\si@num@in@exp@comp@bool + \si@bool@false\si@num@in@exp@comp@dec@bool + \si@bool@false\si@num@in@exp@comp@uncert@dec@bool +} +\newcommand*{\si@num@in@init@aux}[1]{% + \si@clear@cs{si@num@in@#1}% +} +\newcommand*{\si@num@in@init@names}{% + {mant}% + {mant@sign}% + {mant@int}% + {mant@dec}% + {mant@uncert}% + {mant@uncert@int}% + {mant@uncert@dec}% + {mant@comp}% + {mant@comp@sign}% + {mant@comp@int}% + {mant@comp@dec}% + {mant@comp@uncert}% + {mant@comp@uncert@int}% + {mant@comp@uncert@dec}% + {exp}% + {exp@sign}% + {exp@int}% + {exp@dec}% + {exp@uncert}% + {exp@uncert@int}% + {exp@uncert@dec}% + {exp@comp}% + {exp@comp@sign}% + {exp@comp@int}% + {exp@comp@dec}% + {exp@comp@uncert}% + {exp@comp@uncert@int}% + {exp@comp@uncert@dec}% +} +\newcommand*{\si@num@in@protect@tokens}{} +\let\si@num@in@protect@tokens\si@num@pre@protect@tokens +\newcommand*{\si@num@in@remove@zeros}[1]{% + \si@in@cs@if@T{si@num@in@#1@int}{0}{% + \def\si@tempa##10##2\si@stop{% + \si@empty@tlist@if@TF{##1}{% + \si@in@tlist@if@TF{##2}{0}{% + \si@tempa##2\si@stop + }{% + \@namedef{si@num@in@#1@int}{##2}% + }% + }{% + \@namedef{si@num@in@#1@int}{##10##2}% + }% + }% + \si@let@Nc\si@tempb{si@num@in@#1@int}% + \expandafter\si@tempa\si@tempb\si@stop + \si@empty@cs@if@T{si@num@in@#1@int}{% + \@namedef{si@num@in@#1@int}{0}% + }% + }% +} +\newcommand*{\si@num@in@rescan}[1]{% + \begingroup + \si@catcode@symbols + \si@catcode@set{9}{9}% tab ignored + \si@catcode@set{32}{9}% space ignored + \si@catcode@set{126}{9}% tilde ignored + \everyeof{\noexpand}% + \si@clear@macro{\,}% + \si@num@in@protect@tokens + \protected@edef\@tempa{\scantokens{#1}}% + \expandafter\endgroup\expandafter + \def\expandafter\si@num@in@arg\expandafter{\@tempa}% +} +\newcommand*{\si@num@in@separate}{% + \si@num@in@try{\si@num@in@sep@exp}% + \si@num@in@separate@aux{mant}% + \si@num@in@separate@aux{exp}% +} +\newcommand*{\si@num@in@separate@aux}[1]{% + \si@num@in@try{\si@num@in@sep@sign{#1}}% + \si@num@in@try{\si@num@in@sep@comp{#1}}% + \si@num@in@try{\si@num@in@sep@dec{#1}}% + \si@num@in@try{\si@num@in@sep@dec@comp{#1}}% + \si@num@in@try{\si@num@in@sep@uncert{#1}}% + \si@num@in@try{\si@num@in@sep@uncert{#1@comp}}% +} +\newcommand*{\si@num@in@sep@comp}[1]{% + \si@empty@cs@if@F{si@num@in@#1}{% + \si@empty@if@F\si@num@in@complex{% + \si@let@Nc\si@tempa{si@num@in@#1}% + \si@bool@false\si@tmp@bool + \si@loop@over@macro\si@num@in@complex\si@num@in@sep@comp@aux@i + \si@num@in@try{\si@num@in@sep@comp@aux@ii{#1}}% + \si@num@in@try{\si@num@in@sep@comp@aux@iii{#1}}% + }% + }% +} +\newcommand*{\si@num@in@sep@comp@aux@i}[1]{% + \def\si@tempb##1#1##2##3\si@stop{% + \si@no@value@if@F{##2}{% + \si@no@value@if@TF{##3}{% + \si@bool@true\si@tmp@bool + \def\si@tempa{##1}% + \si@loop@exit + }{% + \si@num@in@throw{Misplaced complex root}{% + The complex root token `#1' can only come at \MessageBreak + the end of a number. + }% + \si@loop@exit + }% + }% + }% + \expandafter\si@tempb\si@tempa#1\si@no@value\si@stop +} +\newcommand*{\si@num@in@sep@comp@aux@ii}[1]{% + \si@let@cN{si@num@in@#1@comp@bool}\si@tmp@bool + \si@let@cN{si@num@in@#1}\si@tempa + \si@bool@if@T\si@tmp@bool{% + \si@empty@if@F\si@tempa{% + \def\si@tempb##1{% + \si@in@if@TF\si@num@in@signs{##1}{% + \si@bool@if@TF\si@tmp@bool{% + \si@num@in@throw{Duplicate sign found}{% + Only a single sign can be given \MessageBreak + in the complex part of a number. + }% + \si@loop@exit + }{% + \si@num@in@add{#1@comp@sign}{##1}% + \si@bool@true\si@tmp@bool + }% + }{% + \si@bool@if@TF\si@tmp@bool{% + \si@num@in@add{#1@comp}{##1}% + }{% + \si@num@in@add{#1}{##1}% + }% + }% + }% + \si@bool@false\si@tmp@bool + \si@clear@cs{si@num@in@#1}% + \si@loop@over@macro\si@tempa\si@tempb + }% + }% +} +\newcommand*{\si@num@in@sep@comp@aux@iii}[1]{% + \si@bool@cs@if@TF{si@num@in@#1@comp@bool}{% + \si@bool@if@F\si@tmp@bool{% + \si@let@cc{si@num@in@#1@comp@sign}{si@num@in@#1@sign}% + \si@clear@cs{si@num@in@#1@sign}% + \si@let@cc{si@num@in@#1@comp}{si@num@in@#1}% + \si@clear@cs{si@num@in@#1}% + }% + }{% + \expandafter\si@loop@over@macro\csname si@num@in@#1\endcsname + \si@num@in@sep@aux@iv + }% +} +\newcommand*{\si@num@in@sep@aux@iv}[1]{% + \si@in@if@T\si@num@in@signs{#1}{% + \si@num@in@throw{Duplicate sign found}{% + Only a single sign can be given \MessageBreak + in the real part of a number. + }% + \si@loop@exit + }% +} +\newcommand*{\si@num@in@sep@dec}[1]{% + \si@empty@cs@if@F{si@num@in@#1}{% + \si@num@in@sep@dec@aux@i{#1}% + }% +} +\newcommand*{\si@num@in@sep@dec@comp}[1]{% + \si@bool@cs@if@T{si@num@in@#1@comp@bool}{% + \si@empty@cs@if@TF{si@num@in@#1@comp}{% + \si@let@cc{si@num@in@#1@comp@int}{si@num@in@#1@comp}% + \si@let@cN{si@num@in@#1@comp}% + }{% + \si@num@in@sep@dec@aux@i{#1@comp}% + }% + }% +} +\newcommand*{\si@num@in@sep@dec@aux@i}[1]{% + \si@let@Nc\si@tempa{si@num@in@#1}% + \si@clear@macro\si@tempb + \si@bool@false\si@tmp@bool + \si@clear@cs{si@num@in@#1}% + \si@loop@over@macro\si@num@in@decimal\si@num@in@sep@dec@aux@ii + \si@num@in@try{\si@let@cN{si@num@in@#1@int}\si@tempa}% + \si@num@in@try{\si@let@cN{si@num@in@#1@dec}\si@tempb}% + \si@num@in@try{\si@let@cN{si@num@in@#1@dec@bool}\si@tmp@bool}% +} +\newcommand*{\si@num@in@sep@dec@aux@ii}[1]{% + \si@in@if@T\si@tempa{#1}{% + \si@bool@true\si@tmp@bool + \def\si@tempb##1#1##2\si@stop{% + \def\si@tempa{##1}% + \def\si@tempb{##2}% + }% + \expandafter\si@tempb\si@tempa\si@stop + \si@in@if@T\si@tempb{#1}{% + \si@num@in@throw{Duplicate decimal token found}{% + Only a single decimal marker token can be given \MessageBreak + in numerical input. + }% + }% + \si@loop@exit + }% +} +\newcommand*{\si@num@in@sep@exp}{% + \let\si@num@in@mant\si@num@in@arg + \si@loop@over@macro\si@num@in@exponent\si@num@in@sep@exp@aux +} +\newcommand*{\si@num@in@sep@exp@aux}[1]{% + \si@in@if@T\si@num@in@arg{#1}{% + \def\si@tempa##1#1##2\si@stop{% + \def\si@num@in@mant{##1}% + \def\si@num@in@exp{##2}% + }% + \expandafter\si@tempa\si@num@in@arg\si@stop + \si@in@if@T\si@num@in@exp{#1}{% + \si@num@in@throw{Duplicate exponent token found}{% + Only a single exponent marker token can be given \MessageBreak + in numerical input. + }% + }% + \si@loop@exit + }% +} +\newcommand*{\si@num@in@sep@sign}[1]{% + \si@empty@cs@if@F{si@num@in@#1}{% + \si@replace@all@in@cs{si@num@in@#1}{-+}{\mp}% + \si@replace@all@in@cs{si@num@in@#1}{+-}{\pm}% + \expandafter\expandafter\expandafter\si@num@in@sep@sign@aux + \csname si@num@in@#1\endcsname\si@stop{#1}% + }% +} +\newcommand*{\si@num@in@sep@sign@aux}{} +\def\si@num@in@sep@sign@aux#1#2\si@stop#3{% + \si@in@if@TF\si@num@in@signs{#1}{% + \@namedef{si@num@in@#3@sign}{#1}% + \@namedef{si@num@in@#3}{#2}% + }{% + \@namedef{si@num@in@#3}{#1#2}% + }% +} +\newcommand*{\si@num@in@sep@uncert}[1]{% + \si@empty@cs@if@TF{si@num@in@#1@dec}{% + \si@empty@cs@if@F{si@num@in@#1@int}{% + \si@num@in@sep@uncert@aux@i{#1}{int}% + }% + }{% + \si@num@in@sep@uncert@aux@i{#1}{dec}% + \si@num@in@sep@uncert@check@int{#1}% + }% +} +\newcommand*{\si@num@in@sep@uncert@aux@i}[2]{% + \si@let@Nc\si@tempa{si@num@in@#1@#2}% + \si@loop@over@macro\si@num@in@uncert@close\si@num@in@sep@uncert@aux@ii + \si@num@in@try{\si@num@in@sep@uncert@aux@iii{#1}{#2}}% +} +\newcommand*{\si@num@in@sep@uncert@aux@ii}[1]{% + \def\si@tempb##1#1##2##3\si@stop{% + \si@no@value@if@F{##2}{% + \si@no@value@if@TF{##3}{% + \si@bool@true\si@tmp@bool + \def\si@tempa{##1}% + \si@loop@exit + }{% + \si@num@in@throw{Misplaced closing uncertainty token}{% + The closing uncertainty token `#1' can only \MessageBreak + come at the end of a number. + }% + \si@loop@exit + }% + }% + }% + \si@bool@false\si@tmp@bool + \expandafter\si@tempb\si@tempa#1\si@no@value\si@stop + \si@bool@if@T\si@tmp@bool{% + \si@loop@exit + }% +} +\newcommand*{\si@num@in@sep@uncert@aux@iii}[2]{% + \si@bool@if@TF\si@tmp@bool{% + \si@bool@false\si@tmp@bool + \si@loop@over@macro\si@num@in@uncert@open + \si@num@in@sep@uncert@aux@iv + \si@num@in@try{\si@num@in@sep@uncert@aux@v{#1}{#2}}% + }{% + \si@loop@over@macro\si@num@in@uncert@open + \si@num@in@sep@uncert@aux@vi + }% +} +\newcommand*{\si@num@in@sep@uncert@aux@iv}[1]{% + \si@in@if@T\si@tempa{#1}{% + \si@bool@true\si@tmp@bool + \def\si@tempb##1#1##2\si@stop{% + \def\si@tempa{##1}% + \def\si@tempb{##2}% + }% + \expandafter\si@tempb\si@tempa\si@stop + \si@in@if@T\si@tempb{#1}{% + \si@num@in@throw{Duplicate opening uncertainty token found}{% + Only a single opening uncertainty token can be \MessageBreak + given in numerical input. + }% + }% + \si@loop@exit + }% +} +\newcommand*{\si@num@in@sep@uncert@aux@v}[2]{% + \si@bool@if@TF\si@tmp@bool{% + \si@let@cN{si@num@in@#1@#2}\si@tempa + \si@let@cN{si@num@in@#1@uncert}\si@tempb + \si@empty@if@T\si@tempb{% + \si@num@in@throw{Empty uncertainty given}{% + The number given contains an empty uncertainty. + }% + }% + }{% + \si@num@in@throw{% + Closing uncertainty token without matching opening% + }{% + The final token of a the number is a closing \MessageBreak + uncertainty token, but no opening token was found \MessageBreak + in this part of the number. + }% + }% +} +\newcommand*{\si@num@in@sep@uncert@aux@vi}[1]{% + \si@in@if@T\si@tempa{#1}{% + \si@num@in@throw{% + Opening uncertainty token without matching closing% + }{% + The opening uncertainty token `#1' was found with no \MessageBreak + matching closing token. + }% + \si@loop@exit + }% +} +\newcommand*{\si@num@in@sep@uncert@check@int}[1]{% + \def\si@num@in@sep@uncert@check@int@aux##1{% + \si@in@cs@if@T{si@num@in@#1@int}{##1}{% + \si@num@in@throw{Uncertainty in integer part}{% + The opening uncertainty token `##1' was found in the + \MessageBreak integer part of the input, but a decimal part + was also given. + }% + \si@loop@exit + }% + }% + \si@loop@over@macro\si@num@in@uncert@open + \si@num@in@sep@uncert@check@int@aux + \si@loop@over@macro\si@num@in@uncert@close + \si@num@in@sep@uncert@check@int@aux +} +\newcommand*{\si@num@in@throw}{% + \si@bool@true\si@num@in@error@bool + \si@log@error +} +\newcommand*{\si@num@in@try}{% + \si@bool@if@F\si@num@in@error@bool +} +\newcommand*{\si@num@in@zero@sign}[1]{% + \si@bool@cs@if@TF{si@num@in@#1@bool}{% + \si@num@in@zero@sign@aux@i{#1}% + }{% + \si@num@in@zero@sign@aux@i{#1@comp}% + }% +} +\newcommand*{\si@num@in@zero@sign@aux@i}[1]{% + \si@empty@cs@if@TF{si@num@in@#1@int}{% + \si@num@in@zero@sign@aux@ii{#1}% + }{% + \def\si@tempa{0}% + \si@meaning@eq@cs@if@T{si@tempa}{si@num@in@#1@int}{% + \si@num@in@zero@sign@aux@ii{#1}% + }% + }% +} +\newcommand*{\si@num@in@zero@sign@aux@ii}[1]{% + \si@empty@cs@if@TF{si@num@in@#1@dec}{% + \si@clear@cs{si@num@in@#1@sign}% + }{% + \def\si@tempa{0}% + \def\si@tempb##1{% + \si@in@if@F\si@tempa{##1}{% + \si@bool@false\si@tmp@bool + }% + }% + \si@bool@true\si@tmp@bool + \si@loop@over@cs{si@num@in@#1@dec}\si@tempb + \si@bool@if@T\si@tmp@bool{% + \si@clear@cs{si@num@in@#1@sign}% + }% + }% +} +\newcommand*{\si@num@post@sign@token}{} +\si@bool@new\si@num@post@plus@bool +\si@bool@new\si@num@post@rnd@figures@bool +\si@bool@new\si@num@post@rnd@places@bool +\si@bool@new\si@num@post@sign@bool +\si@bool@new\si@num@post@zero@dec@bool +\si@bool@new\si@num@post@zero@exp@bool +\si@bool@new\si@num@post@zero@int@bool +\newcount\si@num@post@figures +\newcount\si@num@post@places +\newcommand*{\si@num@post@dec}{} +\newcommand*{\si@num@post@int}{} +\si@bool@new\si@num@post@carry@bool +\si@bool@new\si@num@post@sig@bool +\newcommand*{\si@num@post@rnd@tens}{} +\newcount\si@num@post@rnd@cnt +\newcount\si@num@post@dec@cnt +\newcount\si@num@post@uncert@cnt +\newcommand*{\si@num@post@rnd@check}[2]{% + \@nameuse{si@num@post@#1}#2\relax + \expandafter\ifnum\csname si@num@post@#1\endcsname<\z@\relax + \si@log@error{Invalid input for rounding digits}{% + The input for option 'numbers/process/round #1' \MessageBreak + must be a positive integer. + }% + \fi +} +\si@keys@family{numbers/process} +\pgfkeys{ + /siunitx/numbers/process, + add zero decimal/.is siunitx switch = {num@post@zero@dec}, + add zero integer/.is siunitx switch = {num@post@zero@int}, + explicit sign/.store in = {\si@num@post@sign@token}, + include explicit sign/.is siunitx switch = {num@post@sign}, + retain explicit plus/.is siunitx switch = {num@post@plus}, + retain zero exponent/.is siunitx switch = {num@post@zero@exp}, + round mode/.is choice, + round mode/.cd, + figures/.code = {% + \si@bool@true\si@num@post@rnd@figures@bool + \si@bool@false\si@num@post@rnd@places@bool + }, + off/.code = {% + \si@bool@false\si@num@post@rnd@figures@bool + \si@bool@false\si@num@post@rnd@places@bool + }, + places/.code = {% + \si@bool@false\si@num@post@rnd@figures@bool + \si@bool@true\si@num@post@rnd@places@bool + }, + /siunitx/numbers/process, + round figures/.code = {\si@num@post@rnd@check{figures}{#1}}, + round places/.code = {\si@num@post@rnd@check{places}{#1}}, + add zero decimal = true, + add zero integer = true, + explicit sign = +, + include explicit sign = false, + retain explicit plus = false, + retain zero exponent = false, + round mode = off, + round figures = 2, + round places = 2 +} +\newcommand*{\si@num@post@process}{% + \si@num@post@sign + \si@num@post@zero@fill + \si@num@post@exponent + \si@bool@if@F\si@num@in@symbols@bool{% + \si@num@post@round + \si@bool@if@F\si@num@post@rnd@figures@bool{% + \si@bool@if@F\si@num@post@rnd@places@bool{% + \si@num@post@uncert + }% + }% + }% +} +\newcommand*{\si@num@post@add@sign}[1]{% + \si@bool@cs@if@TF{si@num@in@#1@bool}{% + \si@num@post@add@sign@aux{#1}% + }{% + \si@bool@cs@if@T{si@num@in@#1@comp@bool}{% + \si@num@post@add@sign@aux{#1@comp}% + }% + }% +} +\newcommand*{\si@num@post@add@sign@aux}[1]{% + \si@empty@cs@if@T{si@num@in@#1@sign}{% + \@namedef{si@num@in@#1@sign}{\si@num@post@sign@token}% + }% +} +\newcommand*{\si@num@post@exponent}{% + \si@bool@if@F\si@num@post@zero@exp@bool{% + \si@expand@tlist\si@tempa{% + \si@num@in@exp@int + \si@num@in@exp@dec + \si@num@in@exp@comp@int + \si@num@in@exp@comp@dec + }% + \si@in@if@T\si@tempa{0}{% + \def\si@tempb##10000##2\si@stop{% + \si@empty@tlist@if@T{##1}{% + \def\si@num@in@exp@int{}% + \def\si@num@in@exp@dec{}% + \def\si@num@in@exp@comp@int{}% + \def\si@num@in@exp@comp@dec{}% + \si@bool@false\si@num@in@exp@bool + \si@bool@false\si@num@in@exp@comp@bool + }% + }% + \expandafter\si@tempb\si@tempa0000\si@stop + }% + }% +} +\newcommand*{\si@num@post@plus}[1]{% + \si@bool@cs@if@TF{si@num@in@#1@bool}{% + \si@num@post@plus@aux{#1}% + }{% + \si@bool@cs@if@T{si@num@in@#1@comp@bool}{% + \si@num@post@plus@aux{#1@comp}% + }% + }% +} +\newcommand*{\si@num@post@plus@aux}[1]{% + \def\si@tempa{+}% + \si@meaning@eq@cs@if@T{si@num@in@#1@sign}{si@tempa}{% + \si@clear@cs{si@num@in@#1@sign}% + }% +} +\newcommand*{\si@num@post@sign}{% + \si@bool@if@F\si@num@post@plus@bool{% + \si@num@post@plus{mant}% + \si@num@post@plus{exp}% + }% + \si@bool@if@T\si@num@post@sign@bool{% + \si@num@post@add@sign{mant}% + \si@num@post@add@sign{exp}% + }% +} +\newcommand*{\si@num@post@round}{% + \si@num@post@round@aux{figures}% + \si@num@post@round@aux{places}% +} +\newcommand*{\si@num@post@round@aux}[1]{% + \si@bool@cs@if@T{si@num@post@rnd@#1@bool}{% + \@nameuse{si@num@post@rnd@#1}{mant}% + \@nameuse{si@num@post@rnd@#1}{mant@comp}% + \@nameuse{si@num@post@rnd@#1}{exp}% + \@nameuse{si@num@post@rnd@#1}{exp@comp}% + }% +} +\newcommand*{\si@num@post@rnd@dec}[1]{% + \si@num@if@F{\si@num@post@rnd@cnt>\@ne}{% + \si@tempcnt\expandafter\@car\si@num@post@dec\@nil\relax + \si@bool@if@T\si@num@post@carry@bool{% + \advance\si@tempcnt\@ne\relax + }% + \si@bool@false\si@num@post@carry@bool + \si@num@if@TF{\si@num@post@rnd@cnt=\@ne}{% + \si@num@if@T{\si@tempcnt>4}{% + \si@bool@true\si@num@post@carry@bool + }% + }{% + \si@num@if@T{\si@tempcnt=10}{% + \si@bool@true\si@num@post@carry@bool + \si@tempcnt\z@\relax + }% + \si@edef@c{si@num@in@#1@dec}{% + \the\si@tempcnt + \@nameuse{si@num@in@#1@dec}% + }% + }% + }% + \advance\si@num@post@rnd@cnt\m@ne\relax + \edef\si@num@post@dec{\expandafter\@cdr\si@num@post@dec\@nil}% +} +\newcommand*{\si@num@post@rnd@figures}[1]{% + \si@num@post@rnd@cnt\z@\relax + \si@bool@false\si@num@post@sig@bool + \si@clear@macro\si@num@post@dec + \si@clear@macro\si@num@post@int + \si@whiledo@empty@cs@F{si@num@in@#1@int}{% + \si@num@post@rnd@figures@aux@i{#1}{int}% + }% + \si@whiledo@empty@cs@F{si@num@in@#1@dec}{% + \si@num@post@rnd@figures@aux@i{#1}{dec}% + }% + \si@bool@if@TF\si@num@post@sig@bool{% + \si@num@if@TF{\si@num@post@rnd@cnt>\si@num@post@figures}{% + \si@num@post@rnd@figures@aux@ii{#1}% + }{% + \si@num@post@rnd@figures@aux@iii{#1}% + }% + }{% + \@namedef{si@num@in@#1@int}{0}% + \si@clear@cs{si@num@in@#1@dec}% + \si@bool@cs@false{si@num@in@#1@dec@bool}% + }% +} +\newcommand*{\si@num@post@rnd@figures@aux@i}[2]{% + \si@tempcnt\expandafter\expandafter\expandafter\@car + \csname si@num@in@#1@#2\endcsname\@nil\relax + \si@edef@c{si@num@post@#2}{% + \the\si@tempcnt + \@nameuse{si@num@post@#2}% + }% + \si@bool@if@F\si@num@post@sig@bool{% + \si@num@if@F{\si@tempcnt=\z@}{% + \si@bool@true\si@num@post@sig@bool + }% + }% + \si@bool@if@T\si@num@post@sig@bool{% + \advance\si@num@post@rnd@cnt\@ne\relax + }% + \si@edef@c{si@num@in@#1@#2}{% + \expandafter\expandafter\expandafter\@cdr + \csname si@num@in@#1@#2\endcsname\@nil + }% +} +\newcommand*{\si@num@post@rnd@figures@aux@ii}[1]{% + \advance\si@num@post@rnd@cnt-\si@num@post@figures\relax + \si@whiledo@empty@F\si@num@post@dec{% + \si@num@post@rnd@dec{#1}% + }% + \si@whiledo@empty@F\si@num@post@int{% + \si@num@post@rnd@figures@int{#1} + }% + \si@bool@if@T\si@num@post@carry@bool{% + \si@edef@c{si@num@in@#1@int}{% + 1% + \@nameuse{si@num@in@#1@int}% + }% + \si@empty@cs@if@F{si@num@in@#1@dec}{% + \si@reverse@cs{si@num@in@#1@dec}% + \si@edef@c{si@num@in@#1@dec}{% + \expandafter\expandafter\expandafter\@cdr + \csname si@num@in@#1@dec\endcsname\@nil + }% + \si@reverse@cs{si@num@in@#1@dec}% + }% + }% +} +\newcommand*{\si@num@post@rnd@figures@aux@iii}[1]{% + \advance\si@num@post@rnd@cnt-\si@num@post@figures\relax + \si@num@post@rnd@cnt-\si@num@post@rnd@cnt\relax + \si@reverse@macro\si@num@post@dec + \si@reverse@macro\si@num@post@int + \si@let@cN{si@num@in@#1@dec}\si@num@post@dec + \si@let@cN{si@num@in@#1@int}\si@num@post@int + \si@num@post@rnd@pad{#1}% +} +\newcommand*{\si@num@post@rnd@figures@int}[1]{% + \si@num@if@T{\si@num@post@rnd@cnt>\z@}{% + \si@edef@c{si@num@in@#1@int}{% + 0% + \@nameuse{si@num@in@#1@int}% + }% + }% + \si@num@if@F{\si@num@post@rnd@cnt>\@ne}{% + \si@tempcnt\expandafter\@car\si@num@post@int\@nil\relax + \si@bool@if@T\si@num@post@carry@bool{% + \advance\si@tempcnt\@ne\relax + }% + \si@bool@false\si@num@post@carry@bool + \si@num@if@TF{\si@num@post@rnd@cnt=\@ne}{% + \si@num@if@T{\si@tempcnt>4}{% + \si@bool@true\si@num@post@carry@bool + }% + }{% + \si@num@if@T{\si@tempcnt=10}{% + \si@bool@true\si@num@post@carry@bool + \si@tempcnt\z@\relax + }% + \si@edef@c{si@num@in@#1@int}{% + \the\si@tempcnt + \@nameuse{si@num@in@#1@int}% + }% + }% + }% + \advance\si@num@post@rnd@cnt\m@ne\relax + \edef\si@num@post@int{\expandafter\@cdr\si@num@post@int\@nil}% +} +\newcommand*{\si@num@post@rnd@pad}[1]{% + \si@whiledo@num@T{\si@num@post@rnd@cnt>\z@}{% + \si@edef@c{si@num@in@#1@dec}{% + \@nameuse{si@num@in@#1@dec}% + 0% + }% + \advance\si@num@post@rnd@cnt\m@ne\relax + }% +} +\newcommand*{\si@num@post@rnd@places}[1]{% + \si@num@if@TF{\si@num@post@places=\z@}{% + \si@clear@cs{si@num@in@#1@dec}% + \si@bool@cs@false{si@num@in@#1@dec@bool}% + }{% + \si@num@post@rnd@places@aux@i{#1}% + }% +} +\newcommand*{\si@num@post@rnd@places@aux@i}[1]{% + \si@empty@cs@if@T{si@num@in@#1@dec}{% + \@namedef{si@num@in@#1@dec}{0}% + }% + \si@num@post@rnd@cnt\si@elt@count@cs{si@num@in@#1@dec}\relax + \expandafter\expandafter\expandafter\ifnum + \csname si@num@in@#1@dec\endcsname=\z@\relax + \si@num@post@rnd@cnt\si@num@post@places\relax + \si@clear@cs{si@num@in@#1@dec}% + \expandafter\si@num@post@rnd@pad + \else + \expandafter\si@num@post@rnd@places@aux@ii + \fi + {#1}% +} +\newcommand*{\si@num@post@rnd@places@aux@ii}[1]{% + \advance\si@num@post@rnd@cnt-\si@num@post@places\relax + \si@num@if@TF{\si@num@post@rnd@cnt<\z@}{% + \si@num@post@rnd@cnt-\si@num@post@rnd@cnt\relax + \si@num@post@rnd@pad{#1}% + }{% + \si@num@post@rnd@places@init{#1}% + \si@num@post@rnd@places@aux@iii{#1}% + }% +} +\newcommand*{\si@num@post@rnd@places@aux@iii}[1]{% + \si@empty@if@TF\si@num@post@dec{% + \si@whiledo@empty@F\si@num@post@int{% + \si@num@post@rnd@places@int{#1}% + }% + \si@bool@if@T\si@num@post@carry@bool{% + \si@edef@c{si@num@in@#1@int}{% + 1% + \@nameuse{si@num@in@#1@int}% + }% + }% + }{% + \si@num@post@rnd@dec{#1}% + \si@num@post@rnd@places@aux@iii{#1}% + }% +} +\newcommand*{\si@num@post@rnd@places@int}[1]{% + \si@tempcnt\expandafter\@car\si@num@post@int\@nil\relax + \edef\si@num@post@int{\expandafter\@cdr\si@num@post@int\@nil}% + \si@bool@if@T\si@num@post@carry@bool{% + \advance\si@tempcnt\@ne\relax + }% + \si@bool@false\si@num@post@carry@bool + \si@num@if@T{\si@tempcnt=10}{% + \si@bool@true\si@num@post@carry@bool + \si@tempcnt\z@\relax + }% + \si@edef@c{si@num@in@#1@int}{% + \the\si@tempcnt + \@nameuse{si@num@in@#1@int}% + }% +} +\newcommand*{\si@num@post@rnd@places@init}[1]{% + \si@let@Nc\si@num@post@dec{si@num@in@#1@dec}% + \si@let@Nc\si@num@post@int{si@num@in@#1@int}% + \si@reverse@macro\si@num@post@dec + \si@reverse@macro\si@num@post@int + \si@clear@cs{si@num@in@#1@dec}% + \si@clear@cs{si@num@in@#1@int}% + \si@bool@false\si@num@post@carry@bool +} +\newcommand*{\si@num@post@zero@fill}{% + \si@bool@if@T\si@num@post@zero@int@bool{% + \si@num@post@zero@fill@aux{mant}{int}% + \si@num@post@zero@fill@aux{mant@comp}{int}% + \si@num@post@zero@fill@aux{exp}{int}% + \si@num@post@zero@fill@aux{exp@comp}{int}% + }% + \si@bool@if@T\si@num@post@zero@dec@bool{% + \si@num@post@zero@fill@aux{mant}{dec}% + \si@num@post@zero@fill@aux{mant@comp}{dec}% + \si@num@post@zero@fill@aux{exp}{dec}% + \si@num@post@zero@fill@aux{exp@comp}{dec}% + }% +} +\newcommand*{\si@num@post@zero@fill@aux}[2]{% + \si@bool@cs@if@T{si@num@in@#1@dec@bool}{% + \si@empty@cs@if@T{si@num@in@#1@#2}{% + \@namedef{si@num@in@#1@#2}{0}% + }% + }% +} +\newcommand*{\si@num@post@uncert}{% + \si@num@post@uncert@aux@i{mant}% + \si@num@post@uncert@aux@i{exp}% +} +\newcommand*{\si@num@post@uncert@aux@i}[1]{% + \si@num@post@uncert@aux@ii{#1}% + \si@num@post@uncert@aux@ii{#1@comp}% +} +\newcommand*{\si@num@post@uncert@aux@ii}[1]{% + \si@bool@cs@if@TF{si@num@in@#1@dec@bool}{% + \si@num@post@uncert@dec{#1}% + }{% + \si@num@post@uncert@int{#1}% + }% +} +\newcommand*{\si@num@post@uncert@dec}[1]{% + \si@empty@cs@if@F{si@num@in@#1@uncert}{% + \si@bool@cs@true{si@num@in@#1@uncert@dec@bool}% + \si@num@post@dec@cnt\si@elt@count@cs{si@num@in@#1@dec}\relax + \si@num@post@uncert@cnt\si@elt@count@cs{si@num@in@#1@uncert}\relax + \si@num@if@TF{\si@num@post@uncert@cnt>\si@num@post@dec@cnt}{% + \si@num@post@uncert@dec@aux@i{#1}% + }{% + \si@num@post@uncert@dec@aux@ii{#1}% + }% + }% +} +\newcommand*{\si@num@post@uncert@dec@aux@i}[1]{% + \def\si@tempa##1{% + \si@num@if@TF{\si@num@post@uncert@cnt>\si@num@post@dec@cnt}{% + \si@add@right@cs@n{si@num@in@#1@uncert@int}{##1}% + }{% + \si@add@right@cs@n{si@num@in@#1@uncert@dec}{##1}% + }% + \advance\si@num@post@uncert@cnt\m@ne\relax + }% + \si@loop@over@cs{si@num@in@#1@uncert}\si@tempa +} +\newcommand*{\si@num@post@uncert@dec@aux@ii}[1]{% + \def\si@tempa{% + \si@add@right@cs@n{si@num@in@#1@uncert@dec}{0}% + \advance\si@num@post@uncert@cnt\@ne\relax + }% + \si@whiledo@num@T{\si@num@post@uncert@cnt<\si@num@post@dec@cnt}{% + \si@tempa + }% + \def\si@tempa##1{% + \si@add@right@cs@o{si@num@in@#1@uncert@dec}{##1}% + }% + \expandafter\si@tempa\expandafter + {\csname si@num@in@#1@uncert\endcsname}% + \si@bool@if@T\si@num@post@zero@int@bool{% + \@namedef{si@num@in@#1@uncert@int}{0}% + }% +} +\newcommand*{\si@num@post@uncert@int}[1]{% + \si@let@cc{si@num@in@#1@uncert@int}{si@num@in@#1@uncert}% +} +\newcommand*{\si@num@out@bracket@close}{} +\newcommand*{\si@num@out@bracket@open}{} +\newcommand*{\si@num@out@complex@root}{} +\newcommand*{\si@num@out@decimal}{} +\newcommand*{\si@num@out@exp@base}{} +\newcommand*{\si@num@out@exp@prod}{} +\newcommand*{\si@num@out@group@sep}{} +\newcommand*{\si@num@out@uncert@close}{} +\newcommand*{\si@num@out@uncert@open}{} +\newcommand*{\si@num@out@uncert@space}{} +\si@bool@new\si@num@out@bracket@use@bool +\si@bool@new\si@num@out@group@digits@bool +\si@bool@new\si@num@out@group@four@bool +\si@bool@new\si@num@out@tight@bool +\si@bool@new\si@num@out@uncert@sep@bool +\newcommand*{\si@num@out@mant}{} +\newcommand*{\si@num@out@mant@sign}{} +\newcommand*{\si@num@out@mant@int}{} +\newcommand*{\si@num@out@mant@dec}{} +\newcommand*{\si@num@out@mant@uncert}{} +\newcommand*{\si@num@out@mant@uncert@dec}{} +\newcommand*{\si@num@out@mant@uncert@int}{} +\newcommand*{\si@num@out@mant@comp}{} +\newcommand*{\si@num@out@mant@comp@sign}{} +\newcommand*{\si@num@out@mant@comp@int}{} +\newcommand*{\si@num@out@mant@comp@dec}{} +\newcommand*{\si@num@out@mant@comp@uncert}{} +\newcommand*{\si@num@out@mant@comp@uncert@dec}{} +\newcommand*{\si@num@out@mant@comp@uncert@int}{} +\newcommand*{\si@num@out@exp}{} +\newcommand*{\si@num@out@exp@sign}{} +\newcommand*{\si@num@out@exp@int}{} +\newcommand*{\si@num@out@exp@dec}{} +\newcommand*{\si@num@out@exp@uncert}{} +\newcommand*{\si@num@out@exp@uncert@dec}{} +\newcommand*{\si@num@out@exp@uncert@int}{} +\newcommand*{\si@num@out@exp@comp}{} +\newcommand*{\si@num@out@exp@comp@sign}{} +\newcommand*{\si@num@out@exp@comp@int}{} +\newcommand*{\si@num@out@exp@comp@dec}{} +\newcommand*{\si@num@out@exp@comp@uncert}{} +\newcommand*{\si@num@out@exp@comp@uncert@dec}{} +\newcommand*{\si@num@out@exp@comp@uncert@int}{} +\newcommand*{\si@num@out@result}{} +\si@bool@new\si@num@out@mant@parts@bool +\si@bool@new\si@num@out@mant@comp@parts@bool +\si@bool@new\si@num@out@exp@parts@bool +\si@bool@new\si@num@out@exp@comp@parts@bool +\si@bool@new\si@num@out@mant@comp@bool +\si@bool@new\si@num@out@exp@comp@bool +\si@bool@new\si@num@out@mant@bool +\si@keys@family{numbers/output} +\pgfkeys{ + /siunitx/numbers/output, + close bracket/.store in = {\si@num@out@bracket@close}, + close uncertainty/.store in = {\si@num@out@uncert@close}, + complex root/.store in = {\si@num@out@complex@root}, + decimal marker/.store in = {\si@num@out@decimal}, + exponent base/.store in = {\si@num@out@exp@base}, + exponent product/.store in = {\si@num@out@exp@prod}, + group digits/.is siunitx switch = {num@out@group@digits}, + group four digits/.is siunitx switch = {num@out@group@four}, + group separator/.store in = {\si@num@out@group@sep}, + open bracket/.store in = {\si@num@out@bracket@open}, + open uncertainty/.store in = {\si@num@out@uncert@open}, + separate uncertainty/.is siunitx switch = {num@out@uncert@sep}, + tight spacing/.is siunitx switch = {num@out@tight}, + uncertainty space/.store in = {\si@num@out@uncert@space}, + use brackets/.is siunitx switch = {num@out@bracket@use}, %( + close bracket = ),% ( + close uncertainty = ), + complex root = i, + decimal marker = ., + exponent base = 10, + exponent product = \times, + group digits = true, + group four digits = false, + group separator = {\,}, + open bracket = (, %) + open uncertainty = (, %) + separate uncertainty = false, + tight spacing = false, + use brackets = true, + uncertainty space = {}, +} +\newcommand*{\si@num@out@process}{% + \si@num@out@init + \si@num@out@core + \si@num@out@complex + \si@empty@if@F\si@num@out@mant{% + \si@bool@true\si@num@out@mant@bool + }% + \si@num@out@sign{mant}% + \si@num@out@sign{exp}% + \si@num@out@exponent +} +\newcommand*{\si@num@out@add}[1]{% + \si@add@right@cs@n{si@num@out@#1}% +} +\newcommand*{\si@num@out@add@C}[2]{% + \expandafter\si@num@out@add@C@aux\expandafter + {\csname si@num@out@#2\endcsname}{#1}% +} +\newcommand*{\si@num@out@add@C@aux}[2]{% + \si@add@right@cs@o{si@num@out@#2}{#1}% +} +\newcommand*{\si@num@out@add@maths}[2]{% + \si@empty@if@F#2{% + \expandafter\si@num@out@add@maths@aux\expandafter{#2}{#1}% + }% +} +\newcommand*{\si@num@out@add@maths@aux}[2]{% + \si@num@out@add{#2}{\ensuremath{#1}}% +} +\newcommand*{\si@num@out@add@pm}[1]{% + \si@bool@if@TF\si@num@out@tight@bool{% + \si@num@out@add@maths{#1}{{\pm}}% + }{% + \def\si@tempa{\pm}% + \si@num@out@add@maths{#1}{\si@tempa}% + }% +} +\newcommand*{\si@num@out@bracket@comp}[1]{% + \si@bool@cs@if@T{si@num@out@#1@comp@bool}{% + \si@bool@cs@false{si@num@out@#1@parts@bool}% + \si@bool@cs@false{si@num@out@#1@comp@parts@bool}% + }% + \si@num@out@brackets@aux@i{#1}{comp}% +} +\newcommand*{\si@num@out@bracket@parts}[1]{% + \si@num@out@brackets@aux@i{#1}{parts}% +} +\newcommand*{\si@num@out@brackets@aux@i}[2]{% + \si@empty@cs@if@F{si@num@out@#1}{% + \si@bool@if@T\si@num@out@bracket@use@bool{% + \si@bool@cs@if@T{si@num@out@#1@#2@bool}{% + \si@num@out@bracket@aux@ii{#1}% + \si@bool@cs@false{si@num@out@#1@#2@bool}% + }% + }% + }% +} +\newcommand*{\si@num@out@bracket@aux@ii}[1]{% + \si@add@left@cs@o{si@num@out@#1}\si@num@out@bracket@open + \si@add@right@cs@o{si@num@out@#1}\si@num@out@bracket@close +} +\newcommand*{\si@num@out@complex}{% + \si@num@out@complex@aux{mant}% + \si@num@out@complex@aux{exp}% +} +\newcommand*{\si@num@out@complex@aux}[1]{% + \si@num@out@bracket@parts{#1@comp}% + \si@bool@cs@if@T{si@num@in@#1@comp@bool}{% + \si@num@out@add@maths{#1@comp}{\si@num@out@complex@root}% + \si@num@out@bracket@parts{#1}% + \si@empty@cs@if@F{si@num@out@#1}{% + \si@num@out@sign{#1@comp}% + \si@bool@cs@true{si@num@out@#1@comp@bool}% + }% + }% + \si@num@out@add@C{#1}{#1@comp}% +} +\newcommand*{\si@num@out@copy}[1]{% + \expandafter\si@num@out@copy@aux\csname si@num@in@#1\endcsname{#1}% +} +\newcommand*{\si@num@out@copy@aux}[2]{% + \si@add@right@cs@o{si@num@out@#2}{#1}% +} +\newcommand*{\si@num@out@copy@maths}[1]{% + \expandafter\si@num@out@copy@maths@aux + \csname si@num@in@#1\endcsname{#1}% +} +\newcommand*{\si@num@out@copy@maths@aux}[2]{% + \si@num@out@add@maths{#2}#1% +} +\newcommand*{\si@num@out@core}{% + \si@num@out@core@aux@i{mant}% + \si@num@out@core@aux@i{exp}% +} +\newcommand*{\si@num@out@core@aux@i}[1]{% + \si@num@out@core@aux@ii{#1}% + \si@num@out@core@aux@ii{#1@comp}% +} +\newcommand*{\si@num@out@core@aux@ii}[1]{% + \si@bool@cs@if@T{si@num@in@#1@bool}{% + \si@num@out@group@digits{#1}% + \si@empty@cs@if@F{si@num@in@#1@uncert}{% + \si@num@out@uncert{#1}% + }% + }% +} +\newcommand*{\si@num@out@exponent}{% + \si@bool@if@T\si@num@out@mant@bool{% + \si@empty@cs@if@F{si@num@out@exp}{% + \si@num@out@bracket@comp{mant}% + \si@num@out@bracket@parts{mant}% + }% + }% + \si@num@out@add@C{result}{mant}% + \si@bool@if@T\si@num@out@mant@bool{% + \si@empty@cs@if@F{si@num@out@exp}{% + \si@bool@if@TF\si@num@out@tight@bool{% + \expandafter\def\expandafter\si@tempa\expandafter + {\expandafter{\si@num@out@exp@prod}}% + \si@num@out@add@maths{result}\si@tempa + }{% + \si@num@out@add@maths{result}{\si@num@out@exp@prod}% + }% + }% + }% + \si@empty@cs@if@F{si@num@out@exp}{% + \si@num@out@add@C{result}{exp@base}% + \edef\si@num@out@exp{% + ^{\expandafter\unexpanded\expandafter{\si@num@out@exp}}% + }% + \si@num@out@add@C{result}{exp}% + }% +} +\newcommand*{\si@num@out@group@digits}[1]{% + \si@num@out@copy{#1@dec}% + \si@num@out@copy{#1@int}% + \si@bool@if@T\si@num@out@group@digits@bool{% + \si@bool@if@F\si@num@in@symbols@bool{% + \si@num@out@group@digits@aux@i{#1}{dec}% + \si@num@out@group@digits@aux@i{#1}{int}% + }% + }% + \si@num@out@add@C{#1}{#1@int}% + \si@bool@cs@if@T{si@num@in@#1@dec@bool}{% + \si@num@out@add@maths{#1}{\si@num@out@decimal}% + \si@num@out@add@C{#1}{#1@dec}% + }% +} +\newcommand*{\si@num@out@group@digits@aux@i}[2]{% + \si@empty@cs@if@F{si@num@in@#1@#2}{% + \si@bool@if@TF\si@num@out@group@four@bool{% + \si@num@out@group@digits@aux@ii{#1}{#2}% + }{% + \si@num@out@group@five@if@T{si@num@in@#1@#2}{% + \si@num@out@group@digits@aux@ii{#1}{#2}% + }% + }% + }% +} +\newcommand*{\si@num@out@group@digits@aux@ii}[2]{% + \si@clear@cs{si@num@out@#1@#2}% + \@nameuse{si@num@out@group@#2}{#1}% +} +\newcommand*{\si@num@out@group@dec}[1]{% + \def\si@num@out@group@dec@aux##1##2##3##4{% + \si@empty@tlist@if@TF{##2}{% + \si@num@out@add{#1@dec}{##1}% + }{% + \si@empty@tlist@if@TF{##3}{% + \si@num@out@add{#1@dec}{##1##2}% + }{% + \si@num@out@add{#1@dec}{##1##2##3}% + \si@empty@tlist@if@F{##4}{% + \si@num@out@add@maths{#1@dec}{\si@num@out@group@sep}% + \si@num@out@group@dec@aux##4% + }% + }% + }% + }% + \expandafter\expandafter\expandafter\si@num@out@group@dec@aux + \csname si@num@in@#1@dec\endcsname{}{}{}% +} +\newcommand*{\si@num@out@group@dec@aux}{} +\newcommand*{\si@num@out@group@five@if@T}[1]{% + \expandafter\expandafter\expandafter\si@num@out@group@five@if@aux + \csname #1\endcsname\@empty\@empty\@empty\@empty\si@stop +} +\newcommand*{\si@num@out@group@five@if@aux}{} +\def\si@num@out@group@five@if@aux#1#2#3#4#5\si@stop{% + \edef\si@tempa{#5}% + \si@empty@if@F\si@tempa +} +\newcommand*{\si@num@out@group@int}[1]{% + \def\si@num@out@group@int@aux@iii##1##2##3##4{% + \si@num@out@add{#1@int}{##1##2##3}% + \si@stop@if@F{##4}{% + \si@num@out@add@maths{#1@int}{\si@num@out@group@sep}% + \si@num@out@group@int@aux@iii##4% + }% + }% + \expandafter\si@num@out@group@int@aux@i + \csname si@num@in@#1@int\endcsname +} +\newcommand*{\si@num@out@group@int@aux@i}[1]{% + \expandafter\si@num@out@group@int@aux@ii\expandafter + {\expandafter}#1{}{}{}% +} +\newcommand*{\si@num@out@group@int@aux@ii}[4]{% + \si@empty@tlist@if@TF{#2}{% + \si@num@out@group@int@aux@iii#1\si@stop + }{% + \si@empty@tlist@if@TF{#3}{% + \si@num@out@group@int@aux@iii{}{}#1#2\si@stop + }{% + \si@empty@tlist@if@TF{#4}{% + \si@num@out@group@int@aux@iii{}#1#2#3\si@stop + }{% + \si@num@out@group@int@aux@ii{#1#2#3#4}% + }% + }% + }% +} +\newcommand*{\si@num@out@group@int@aux@iii}{} +\newcommand*{\si@num@out@init}{% + \si@loop@over@macro\si@num@in@init@names\si@num@out@init@aux + \si@clear@macro\si@num@out@result + \si@bool@false\si@num@out@mant@parts@bool + \si@bool@false\si@num@out@mant@comp@parts@bool + \si@bool@false\si@num@out@exp@parts@bool + \si@bool@false\si@num@out@exp@comp@parts@bool + \si@bool@false\si@num@out@mant@comp@bool + \si@bool@false\si@num@out@exp@comp@bool + \si@bool@false\si@num@out@mant@bool +} +\newcommand*{\si@num@out@init@aux}[1]{% + \si@clear@cs{si@num@out@#1}% +} +\newcommand*{\si@num@out@sign}[1]{% + \si@bool@if@TF\si@num@out@tight@bool{% + \si@let@Nc\si@tempa{si@num@in@#1@sign}% + \expandafter\def\expandafter\si@tempa\expandafter + {\expandafter{\si@tempa}}% + \si@num@out@add@maths{#1@sign}\si@tempa + }{% + \si@num@out@copy@maths{#1@sign}% + }% + \si@num@out@sign@aux@i{#1}% +} +\newcommand*{\si@num@out@sign@aux@i}[1]{% + \expandafter\si@num@out@sign@aux@ii + \csname si@num@out@#1@sign\endcsname{si@num@out@#1}% +} +\newcommand*{\si@num@out@sign@aux@ii}[2]{% + \si@add@left@cs@o{#2}{#1}% +} +\newcommand*{\si@num@out@uncert}[1]{% + \si@bool@if@TF\si@num@out@uncert@sep@bool{% + \si@bool@cs@true{si@num@out@#1@parts@bool}% + \si@num@out@group@digits{#1@uncert}% + \si@num@out@add@pm{#1}% + \si@num@out@add@C{#1}{#1@uncert}% + }{% + \si@num@out@add@maths{#1@uncert}{\si@num@out@uncert@open}% + \si@num@out@copy{#1@uncert}% + \si@num@out@add@maths{#1@uncert}{\si@num@out@uncert@close}% + \si@num@out@add@maths{#1}{\si@num@out@uncert@space}% + \si@num@out@add@C{#1}{#1@uncert}% + }% +} +\newcommand*{\si@num@print}{% + \si@print@num@o{\si@num@out@result}% \opt +} +\newcommand*{\si@tab@rewrite@check@cellspace}{% + \@ifpackageloaded{cellspace}{% + \si@log@info{Changing cellspace column letter to C}% + \newcolumntype{C}[1]{>{\bcolumn##1\@nil}##1<{\ecolumn}}% + \def\si@tempa##1\NC@do S##2\si@stop{% + \NC@list{##1##2}% + }% + \expandafter\si@tempa\the\NC@list\si@stop + \let\NC@find@S\@undefined + }{}% +} +\AtBeginDocument{\si@tab@rewrite@check@cellspace} +\newcommand*{\si@tab@rewrite@create}[1]{% + \edef\si@tempa{\noexpand\NC@do #1\the\NC@list}% + \newcolumntype{#1}{}% + \NC@list\expandafter{\si@tempa}% + \expandafter\renewcommand\expandafter*\expandafter{% + \csname NC@rewrite@#1\endcsname + }[1][]{% + \edef\si@tempa{% + \the\@temptokena + >{\noexpand\si@tab@collect@begin[\unexpanded{##1}]{#1}}% + c% + <{\noexpand\si@tab@print@out}% + }% + \@temptokena\expandafter{\si@tempa}% + \NC@find + }% +} +\AtBeginDocument{% + \si@tab@rewrite@create{S}% + \si@tab@rewrite@create{s}% +} +\newcommand*{\si@tab@collect@after}{} +\newcommand*{\si@tab@collect@before}{} +\newcommand*{\si@tab@collect@body}{} +\newcommand*{\si@tab@collect@num}{} +\si@bool@new\si@tab@collect@after@bool +\si@bool@new\si@tab@collect@before@bool +\newcommand*{\si@tab@collect@begin}[2][]{% + \begingroup + \sisetup{#1}% + \def\si@tab@collect@body{}% + \@nameuse{si@tab@collect@begin@#2}% + \si@tab@collect@get +} +\newcommand*{\si@tab@collect@begin@s}{% + \si@bool@false\si@tab@collect@before@bool + \let\si@tab@collect@token\si@tab@collect@token@s + \let\si@tab@print@out\si@tab@print@out@s + \def\si@tab@collect@braced##1{% + \si@add@right@n\si@tab@collect@body{{##1}}% + \si@tab@collect@next + }% +} +\newcommand*{\si@tab@collect@begin@S}{% + \def\si@tab@collect@after{}% + \def\si@tab@collect@before{}% + \si@bool@true\si@tab@collect@before@bool + \let\si@tab@collect@token\si@tab@collect@token@S + \let\si@tab@print@out\si@tab@print@out@S + \si@expand@tlist\si@tab@collect@num{% + \si@num@in@ignore + \si@num@in@signs + \si@num@in@digits + \si@num@in@decimal + \si@num@in@exponent + \si@num@in@complex + \si@num@in@symbols + \si@num@in@uncert@open + \si@num@in@uncert@close + }% + \def\si@tab@collect@braced##1{% + \si@bool@if@TF\si@tab@collect@before@bool{% + \si@add@right@n\si@tab@collect@before{##1}% + }{% + \si@bool@false\si@tab@collect@before@bool + \si@bool@true\si@tab@collect@after@bool + \si@add@right@n\si@tab@collect@after{##1}% + }% + \si@tab@collect@next + }% +} +\newcommand*{\si@tab@collect@braced}{} +\newcommand*{\si@tab@collect@expand}[1]{% + \edef\si@tempa{% + \expandafter\si@tab@collect@expand@aux@i\meaning#1:->\si@stop + }% + \si@meaning@eq@if@TF\si@tempa\si@tab@collect@expand@aux@ii{% + \si@tab@collect@before + \def\si@tab@collect@before{}% + \expandafter\def\expandafter\si@tab@collect@next\expandafter{% + \expandafter\si@tab@collect@get#1% + }% + }{% + \si@bool@if@TF\si@tab@collect@before@bool{% + \si@add@right@n\si@tab@collect@before{#1}% + }{% + \si@bool@true\si@tab@collect@after@bool + \si@bool@false\si@tab@collect@before@bool + \si@add@right@n\si@tab@collect@after{#1}% + }% + }% +} +\newcommand*{\si@tab@collect@expand@aux@i}{} +\def\si@tab@collect@expand@aux@i#1:->#2\si@stop{#1} +\newcommand*{\si@tab@collect@expand@aux@ii}{} +\edef\si@tab@collect@expand@aux@ii{% + \expandafter\si@tab@collect@expand@aux@i\meaning + \si@tab@collect@expand@aux@ii:->\si@stop +}% +\newcommand*{\si@tab@collect@get}{% + \let\si@tab@collect@next\si@tab@collect@get + \futurelet\si@tempa\si@tab@collect@get@aux +} +\newcommand*{\si@tab@collect@get@aux}{% + \si@meaning@eq@if@TF\si@tempa\bgroup{% + \si@tab@collect@braced + }{% + \si@tab@collect@unbraced + }% +} +\newcommand*{\si@tab@collect@newline}{% + \si@tab@print@out + \tabularnewline +} +\newcommand*{\si@tab@collect@next}{} +\newcommand*{\si@tab@collect@token}{} +\newcommand*{\si@tab@collect@token@s}[1]{% + \si@add@right@n\si@tab@collect@body{#1}% +} +\newcommand*{\si@tab@collect@token@S}[1]{% + \si@bool@if@TF\si@tab@collect@after@bool{% + \si@add@right@n\si@tab@collect@after{#1}% + }{% + \si@in@if@TF\si@tab@collect@num{#1}{% + \si@bool@false\si@tab@collect@before@bool + \si@add@right@n\si@tab@collect@body{#1}% + }{% + \si@tab@collect@expand{#1}% + }% + }% +} +\newcommand*{\si@tab@collect@unbraced}[1]{% + \si@meaning@eq@if@F{#1}\ignorespaces{% + \si@meaning@eq@if@F{#1}\unskip{% + \si@tab@collect@unbraced@aux{#1}% + }% + }% + \si@tab@collect@next +} +\newcommand*{\si@tab@collect@unbraced@aux}[1]{% + \def\si@tempa##1{% + \si@meaning@eq@if@T{#1}##1{% + \let\si@tab@collect@next##1% + }% + }% + \si@tempa\csname + \si@tempa\end + \si@tempa\endtabular + \si@tempa\si@tab@print@out + \si@tempa\relax + \si@meaning@eq@if@T\si@tab@collect@next\si@tab@collect@get{% + \si@meaning@eq@if@TF{#1}\tabularnewline{% + \let\si@tab@collect@next\si@tab@collect@newline + }{% + \si@tab@collect@token{#1}% + }% + }% +} +\si@keys@family{tables} +\pgfkeys{ + /siunitx/tables, + align exponents/.is siunitx switch = {}, + align uncertainties/.is siunitx switch = {}, + number position/.is choice, + number position/.cd, + center/.code = {}, + centre/.code = {}, + decimal centred/.code = {}, + decimal centered/.code = {}, + left/.code = {}, + right/.code = {}, + /siunitx/tables, + number format/.code = {}, + position/.is choice, + position/.cd, + center/.style = { + /siunitx/tables/number position = center, + /siunitx/tables/text position = center, + /siunitx/tables/unit position = center, + }, + centre/.style = { + /siunitx/tables/number position = centre, + /siunitx/tables/text position = centre, + /siunitx/tables/unit position = centre, + }, + left/.style = { + /siunitx/tables/number position = left, + /siunitx/tables/text position = left, + /siunitx/tables/unit position = left, + }, + right/.style = { + /siunitx/tables/number position = right, + /siunitx/tables/text position = right, + /siunitx/tables/unit position = right, + }, + /siunitx/tables, + text position/.is choice, + text position/.cd, + center/.code = {}, + centre/.code = {}, + none/.code = {}, + left/.code = {}, + right/.code = {}, + /siunitx/tables, + unit position/.is choice, + unit position/.cd, + center/.code = {}, + centre/.code = {}, + none/.code = {}, + left/.code = {}, + right/.code = {}, + /siunitx/tables, + number position = centre, + text position = centre, + unit position = centre +} +\newcommand*{\si@tab@print@out}{} +\newcommand*{\si@tab@print@out@s}{% + \si@tab@collect@body + \endgroup +} +\newcommand*{\si@tab@print@out@S}{% + \si@tab@collect@before + \si@tab@collect@body + \si@tab@collect@after + \endgroup +} +\newcommand*{\si@unit@def@list}{} +\newcommand*{\si@unit@def@prefix@list}{} +\newcommand*{\si@unit@def@power@list}{} +\newcommand*{\si@unit@def@qual@list}{} +\newcommand*{\si@unit@def@unit@list}{} +\newcommand*{\si@unit@def@list@combine}{% + \si@expand@tlist\si@unit@def@list{% + \si@unit@def@power@list + \si@unit@def@prefix@list + \si@unit@def@qual@list + \si@unit@def@unit@list + }% + \si@add@right@n\si@unit@def@list{% + \per + \raiseto + \tothe + }% +} +\AtBeginDocument{\si@unit@def@list@combine} +\newcommand*{\si@unit@def@power}[2]{% + \si@add@right@n\si@unit@def@power@list{#1}% + \@namedef{si@unit@literal@\string#1}##1{##1\textsuperscript{#2}}% + \@namedef{si@unit@macro@\string#1}{% + \def\si@unit@parse@power@last{#2}% + }% +} +\newcommand*{\si@unit@def@power@post}[2]{% + \si@add@right@n\si@unit@def@power@list{#1}% + \@namedef{si@unit@literal@\string#1}{\textsuperscript{#2}}% + \@namedef{si@unit@macro@\string#1}{% + \def\si@unit@parse@power@current{#2}% + \si@unit@parse@store{power}{null}% + }% +} +\newcommand*{\si@unit@def@prefix}[3]{% + \si@add@right@n\si@unit@def@prefix@list{#1}% + \@namedef{si@unit@literal@\string#1}{#2}% + \@namedef{si@unit@number@\string#1}{#3}% + \@namedef{si@unit@macro@\string#1}{% + \si@unit@parse@store{prefix}{#2}% + }% +} +\newcommand*{\si@unit@def@prefix@binary}[1]{% + \si@unit@def@prefix{#1}% +} +\newcommand*{\si@unit@def@qual}[2]{% + \si@add@right@n\si@unit@def@qual@list{#1}% + \@namedef{si@unit@literal@\string#1}{\text{ }(#2)}% + \@namedef{si@unit@macro@\string#1}{% + \si@unit@parse@store{qual}{#2}% + }% +} +\newcommand*{\si@unit@def@unit}[3]{% + \si@add@right@n\si@unit@def@unit@list{#1}% + \si@empty@tlist@if@TF{#2}{% + \si@let@cN{si@unit@options@\string#1}\@undefined + }{% + \@namedef{si@unit@options@\string#1}{#2}% + }% + \@namedef{si@unit@literal@\string#1}{#3}% + \@namedef{si@unit@macro@\string#1}{% + \si@csname@if@TF{si@unit@macro@\expandafter\string\@car#3\@nil}{% + #3% + }{% + \si@unit@parse@store{unit}{#3}% + }% + }% +} +\si@bool@new\si@unit@create@body@bool +\si@bool@new\si@unit@create@opt@bool +\si@bool@new\si@unit@create@overwrite@bool +\si@bool@new\si@unit@create@prespace@bool +\si@bool@new\si@unit@create@xspace@bool +\si@keys@family{units/creation} +\pgfkeys{ + /siunitx/units/creation, + add leading space/.is siunitx switch = {unit@create@prespace}, + allow in body/.is siunitx switch = {unit@create@body}, + allow optional argument/.is siunitx switch = {unit@create@opt}, + overwrite macros/.is siunitx switch = {unit@create@overwrite}, + use xspace/.is siunitx switch = {unit@create@xspace}, + add leading space = false, + allow in body = false, + allow optional argument = false, + overwrite macros = false, + use xspace = false +} +\newcommand*{\si@unit@create@body}{% + \si@bool@if@T\si@unit@create@body@bool{% + \si@unit@create@macros + }% +} +\AtBeginDocument{\si@unit@create@body} +\newcommand*{\si@unit@create@macros}{% + \si@bool@if@T\si@unit@create@xspace@bool{% + \RequirePackage{xspace}% + }% + \si@bool@if@T\si@unit@create@overwrite@bool{% + \si@loop@over@macro\si@unit@def@list\si@unit@create@undefine + }% + \si@bool@if@TF\si@unit@create@opt@bool{% + \si@loop@over@macro\si@unit@def@list\si@unit@create@optional + }{% + \si@loop@over@macro\si@unit@def@list\si@unit@create@plain + }% +} +\newcommand*{\si@unit@create@optional}[1]{% + \ifdefined#1\else + \edef\si@tempa{% + \unexpanded{\si@newcommand*{#1}[1][]}{% + \si@bool@if@T\si@unit@create@prespace@bool{% + \unexpanded{\si@empty@tlist@if@T{##1}}{% + \unexpanded{\ensuremath{\si@unit@out@unit@sep}}% + }% + }% + \unexpanded{\SI{##1}{#1}}% + \si@bool@if@T\si@unit@create@xspace@bool{% + \noexpand\xspace + }% + }% + }% + \expandafter\si@tempa + \fi +} +\newcommand*{\si@unit@create@plain}[1]{% + \ifdefined#1\else + \edef\si@tempa{% + \unexpanded{\si@newcommand*{#1}}{% + \si@bool@if@T\si@unit@create@prespace@bool{% + \unexpanded{\ensuremath{\si@unit@out@unit@sep}}% + }% + \unexpanded{\si{#1}}% + \si@bool@if@T\si@unit@create@xspace@bool{% + \noexpand\xspace + }% + }% + }% + \expandafter\si@tempa + \fi +} +\newcommand*{\si@unit@create@undefine}[1]{% + \let#1\@undefined +} +\@namedef{si@unit@literal@\string\per}{/} +\@namedef{si@unit@macro@\string\per}{% + \si@bool@true\si@unit@parse@per@last@bool + \def\si@unit@parse@power@last{1}% +} +\@namedef{si@unit@literal@\string\raiseto}#1#2{ + #2\textsuperscript{#1}% +} +\@namedef{si@unit@macro@\string\raiseto}#1{% + \def\si@unit@parse@power@last{#1}% +} +\@namedef{si@unit@literal@\string\tothe}#1{% + \textsuperscript{#1}% +} +\@namedef{si@unit@macro@\string\tothe}#1{% + \def\si@unit@parse@power@current{#1}% + \si@unit@parse@store{power}{null}% +} +\newcommand*{\si@unit@in@parse}[1]{% + \si@empty@tlist@if@F{#1}{% + \si@unit@in@process@if@TF{#1}{% + \si@unit@parse@unit{#1}% + }{% + \si@bool@if@TF\si@unit@out@lit@allow@bool{% + \si@unit@out@literal{#1}% + }{% + \si@log@error{Literal units disabled}{% + You gave the literal input `#1' for a unit\MessageBreak + but literal unit output is disabled. + }% + }% + }% + }% +} +\newcommand*{\si@unit@in@process@if@TF}[1]{% + \begingroup + \si@loop@over@macro\si@unit@def@list\si@unit@in@process@aux + \let\raiseto\@gobble + \let\tothe\@gobble + \protected@edef\@tempa{#1}% + \expandafter\endgroup + \expandafter\def\expandafter\si@tempa\expandafter{\@tempa}% + \si@empty@if@TF\si@tempa +} +\newcommand*{\si@unit@in@process@aux}[1]{% + \si@clear@macro#1% +} +\newcommand*{\si@unit@parse@block}{} +\newcommand*{\si@unit@parse@block@den}{} +\newcount\si@unit@parse@block@cnt +\newcount\si@unit@parse@block@den@cnt +\si@bool@new\si@unit@parse@per@current@bool +\si@bool@new\si@unit@parse@per@last@bool +\newcommand*{\si@unit@parse@power@current}{} +\newcommand*{\si@unit@parse@power@last}{} +\si@bool@new\si@unit@parse@qual@sub@bool +\newcommand*{\si@unit@parse@queue}{} +\newcommand*{\si@unit@parse@queue@den}{} +\newcommand*{\si@unit@parse@sep}{} +\si@bool@new\si@unit@parse@sticky@bool +\newcommand*{\si@unit@parse@type@last}{} +\newcommand*{\si@unit@parse@type@last@den}{} +\newcommand*{\si@unit@parse@type@prefix}{prefix} +\newcommand*{\si@unit@parse@type@power}{power} +\newcommand*{\si@unit@parse@type@qual}{qual} +\newcommand*{\si@unit@parse@type@unit}{unit} +\si@bool@new\si@unit@parse@fraction@bool +\newcommand*{\si@unit@parse@qual@format}{} +\si@keys@family{units/output} +\pgfkeys{ + /siunitx/units/output, + print as fraction/.is siunitx switch = {unit@parse@fraction}, + qualifier format/.is choice, + qualifier format/.cd, + brackets/.code = {% + \def\si@unit@parse@qual@format##1{(##1)}% + \si@bool@false\si@unit@parse@qual@sub@bool + }, + space/.code = {% + \def\si@unit@parse@qual@format##1{\text{ }##1}% + \si@bool@false\si@unit@parse@qual@sub@bool + }, + subscript/.code = {% + \def\si@unit@parse@qual@format##1{_{##1}}% + \si@bool@true\si@unit@parse@qual@sub@bool + }, + /siunitx/units/output, + sticky per/.is siunitx switch = {unit@parse@sticky}, + print as fraction = false, + qualifier format = subscript, + sticky per = false, +} +\newcommand*{\si@unit@parse@unit}[1]{% + \si@unit@parse@init + \si@unit@parse@options{#1}% + \si@unit@out@sep@print + #1% + \si@unit@parse@store@unit{stop}% + \si@print@unit@o{\si@unit@parse@queue}% TEMP +} +\newcommand*{\si@unit@parse@block@new}[1]{% + \si@empty@if@F\si@unit@parse@power@current{% + \si@unit@parse@store@power{null}% + }% + \si@unit@parse@block@trans + \let\si@unit@parse@per@current@bool\si@unit@parse@per@last@bool + \let\si@unit@parse@power@current\si@unit@parse@power@last + \si@clear@macro\si@unit@parse@power@last + \si@bool@if@TF\si@unit@parse@sticky@bool{% + \si@bool@if@T\si@unit@parse@per@last@bool{% + \def\si@unit@parse@power@last{1}% + }% + }{% + \si@bool@false\si@unit@parse@per@last@bool + }% + \@namedef{si@unit@parse@block\si@unit@parse@queue@use}{#1}% +} +\newcommand*{\si@unit@parse@block@trans}{% + \si@empty@cs@if@F{si@unit@parse@queue\si@unit@parse@queue@use}{% + \si@add@right@cs@o{si@unit@parse@queue\si@unit@parse@queue@use}{% + \si@unit@parse@sep + }% + }% + \expandafter\si@unit@parse@block@add@aux\expandafter{% + \csname si@unit@parse@block\si@unit@parse@queue@use\endcsname + }% +} +\newcommand*{\si@unit@parse@block@add@aux}[1]{% + \si@add@right@cs@o{si@unit@parse@queue\si@unit@parse@queue@use}{#1}% +} +\newcommand*{\si@unit@parse@bracket}[1]{% + \si@bool@if@T\si@unit@out@bracket@use@bool{% + \si@add@left@cs@o{si@unit@parse@#1}\si@unit@out@bracket@open + \si@add@right@cs@o{si@unit@parse@#1}\si@unit@out@bracket@close + }% +} +\newcommand*{\si@unit@parse@init}{% + \si@loop@over@macro\si@unit@def@list\si@unit@parse@init@aux + \si@clear@macro\si@unit@parse@current + \si@clear@macro\si@unit@parse@current@den + \si@clear@macro\si@unit@parse@power@current + \si@clear@macro\si@unit@parse@power@last + \si@clear@macro\si@unit@parse@queue + \si@clear@macro\si@unit@parse@queue@den + \def\si@unit@parse@type@last{start}% + \def\si@unit@parse@type@last@den{start}% + \expandafter\def\expandafter\si@unit@parse@sep\expandafter{% + \expandafter\ensuremath\expandafter{\si@unit@out@unit@sep}% + }% + \si@unit@parse@block@cnt\z@\relax + \si@unit@parse@block@den@cnt\z@\relax + \si@bool@false\si@unit@parse@per@last@bool + \si@bool@false\si@unit@parse@per@current@bool +} +\newcommand*{\si@unit@parse@init@aux}[1]{% + \si@let@Nc#1{si@unit@macro@\string#1}% +} +\newcommand*{\si@unit@parse@last@if@F}[1]{% + \si@meaning@eq@cs@if@F + {si@unit@parse@type@last\si@unit@parse@queue@use}% + {si@unit@parse@type@#1}% +} +\newcommand*{\si@unit@parse@last@if@T}[1]{% + \si@meaning@eq@cs@if@T + {si@unit@parse@type@last\si@unit@parse@queue@use}% + {si@unit@parse@type@#1}% +} +\newcommand*{\si@unit@parse@last@if@TF}[1]{% + \si@meaning@eq@cs@if@TF + {si@unit@parse@type@last\si@unit@parse@queue@use}% + {si@unit@parse@type@#1}% +} +\newcommand*{\si@unit@parse@options}[1]{% + \si@csname@if@T{si@unit@options@\expandafter\string\@car#1\@nil}{% + \edef\si@tempa{% + \expandafter\expandafter\expandafter\unexpanded + \expandafter\expandafter\expandafter{% + \csname si@unit@options@\expandafter\string\@car#1\@nil + \endcsname + },% + \expandafter\unexpanded\expandafter{\si@unit@internal@opts}% + }% + \expandafter\sisetup\expandafter{\si@tempa}% + }% +} +\newcommand*{\si@unit@parse@queue@use}{% + \si@bool@if@T\si@unit@parse@fraction@bool{% + \si@bool@if@T\si@unit@parse@per@current@bool{@den}% + }% +} +\newcommand*{\si@unit@parse@store}[2]{% + \@nameuse{si@unit@parse@store@#1}{#2}% +} +\newcommand*{\si@unit@parse@store@add@n}[1]{% + \si@add@right@cs@n{si@unit@parse@block\si@unit@parse@queue@use}{#1}% +} +\newcommand*{\si@unit@parse@store@add@o}[1]{% + \si@add@right@cs@o{si@unit@parse@block\si@unit@parse@queue@use}{#1}% +} +\newcommand*{\si@unit@parse@store@power}[1]{% + \si@unit@parse@last@if@T{qual}{% + \si@bool@if@F\si@unit@parse@qual@sub@bool{% + \si@unit@parse@bracket{block\si@unit@parse@queue@use}% + }% + \si@unit@parse@store@power@aux + }% + \si@unit@parse@last@if@T{unit}{% + \si@unit@parse@store@power@aux + }% + \si@clear@macro\si@unit@parse@power@current +} +\newcommand*{\si@unit@parse@store@power@aux}{% + \si@unit@parse@store@type{power}% + \si@bool@if@T\si@unit@parse@per@current@bool{% + \si@bool@if@F\si@unit@parse@fraction@bool{% + \si@unit@parse@store@power@inv + }% + }% + \def\si@tempa{1}% + \si@meaning@eq@if@F\si@unit@parse@power@current\si@tempa{% + \si@unit@parse@store@add@o{% + \expandafter^\expandafter{\si@unit@parse@power@current}% + }% + }% +} +\newcommand*{\si@unit@parse@store@power@inv}{% + \si@in@if@TF\si@unit@parse@power@current{-}{% + \def\si@tempa##1-##2\si@stop{% + \def\si@unit@parse@power@current{##2}% + }% + }{% + \si@add@left@n\si@unit@parse@power@current{-}% + }% +} +\newcommand*{\si@unit@parse@store@prefix}[1]{% + \si@unit@parse@last@if@F{prefix}{% + \si@unit@parse@store@type{prefix}% + \si@unit@parse@block@new{#1}% + }% +} +\newcommand*{\si@unit@parse@store@qual}[1]{% + \si@unit@parse@last@if@T{unit}{% + \si@unit@parse@store@add@o{\si@unit@parse@qual@format{#1}}% + \si@unit@parse@store@type{qual}% + }% +} +\newcommand*{\si@unit@parse@store@type}[1]{% + \si@let@cc{si@unit@parse@type@last\si@unit@parse@queue@use}% + {si@unit@parse@type@#1}% +} +\newcommand*{\si@unit@parse@store@unit}[1]{% + \si@count@incr@cs{si@unit@parse@block\si@unit@parse@queue@use @cnt}% + \si@unit@parse@last@if@TF{prefix}{% + \si@unit@parse@store@type{unit}% + \si@unit@parse@store@add@n{#1}% + }{% + \si@unit@parse@store@type{unit}% + \si@unit@parse@block@new{#1}% + }% +} +\newcommand*{\si@unit@out@literal@unit}{} +\newcommand*{\si@unit@out@bracket@close}{} +\newcommand*{\si@unit@out@bracket@open}{} +\si@bool@new\si@unit@out@bracket@use@bool +\si@bool@new\si@unit@out@break@bool +\si@bool@new\si@unit@out@lit@allow@bool +\newcommand*{\si@unit@out@num@sep}{} +\newcommand*{\si@unit@out@unit@sep}{} +\newcommand*{\si@unit@out@unit@space}{} +\pgfkeys{ + /siunitx/units/output, + allow literal units/.is siunitx switch = {unit@out@lit@allow}, + allow number-unit breaks/.is siunitx switch = {unit@out@break}, + close bracket/.store in = \si@unit@out@bracket@close, + inter-unit separator/.store in = \si@unit@out@unit@sep, + inter-unit space/.store in = \si@unit@out@unit@space, + number-unit separator/.store in = \si@unit@out@num@sep, + open bracket/.store in = \si@unit@out@bracket@open, + use brackets/.is siunitx switch = {unit@out@bracket@use}, %( + allow literal units = true, + allow number-unit breaks = false, + close bracket = ), + inter-unit separator = \,, + inter-unit space = \,, + number-unit separator = \,, + open bracket = (, % + use brackets = true +} +\newcommand*{\si@unit@out@literal}[1]{% + \si@loop@over@macro\si@unit@def@list\si@unit@out@literal@aux + \si@unit@out@literal@print{#1}% +} +\newcommand*{\si@unit@out@literal@aux}[1]{% + \si@let@Nc#1{si@unit@literal@\string#1}% +} +\si@catcode@set{46}{13}% . +\si@catcode@set{38}{13}% & +\newcommand*{\si@unit@out@literal@print}[1]{% + \def\si@unit@out@literal@unit{#1}% + \si@unit@out@replace@fullstops\si@unit@out@literal@unit + \si@unit@out@replace@tildes\si@unit@out@literal@unit + \begingroup + \si@catcode@set{38}{13}% & + \si@catcode@set{126}{13}% ~ + \let.\si@unit@out@unit@sep + \let&\si@unit@out@unit@space + \protected@edef\si@unit@out@literal@unit{\si@unit@out@literal@unit}% + \si@print@unit@o{\si@unit@out@literal@unit}% + \endgroup +} +\si@catcode@set{46}{12}% . +\si@lccode@set{38}{46}% & -> . +\lowercase{% + \newcommand*{\si@unit@out@replace@fullstops}[1]{% + \si@replace@all@in#1{.}{&}% + } +} +\si@lccode@set{38}{0}% & -> & +\newcommand*{\si@unit@out@replace@tildes}[1]{% + \si@replace@all@in#1{~}{&}% +} +\si@catcode@set{38}{4}% & +\newcommand*{\si@unit@out@sep@print}{% + \ensuremath{% + \si@bool@if@TF\si@unit@out@break@bool{% + \allowbreak + }{% + \nobreak + }% + \si@unit@out@num@sep + }% +} +\si@bool@new\si@symbol@redefine@bool + +\si@keys@family{symbols} +\pgfkeys{ + /siunitx/symbols, + redefine symbols/.is siunitx switch = {symbol@redefine}, + redefine symbols = true +} +\newcommand*{\si@symbol@redefine}{% + \si@bool@if@T\si@symbol@redefine@bool{% + \@ifpackageloaded{textcomp}{% + \sisetup{ + symbols/maths/degree = \text{\textdegree}, + symbols/text/degree = \textdegree + }% + \@ifpackageloaded{mathptmx}{}{% + \sisetup{ + symbols/text/micro = \textmu, + symbols/text/ohm = \textomega + }% + }% + \def\si@tempa{OT1}% + \si@meaning@eq@if@T\si@tempa\encodingdefault{% + \sisetup{ + symbols/maths/angstrom = \text{\capitalring{A}}, + symbols/text/angstrom = \capitalring{A} + }% + }% + }{}% + \@ifpackageloaded{upgreek}{% + \sisetup{ + symbols/maths/ohm = \Upomega + } + }{}% + }% +} +\AtBeginDocument{\si@symbol@redefine} +\newcommand*{\si@symbol@maths@angstrom}{} +\newcommand*{\si@symbol@maths@arcminute}{} +\newcommand*{\si@symbol@maths@arcsecond}{} +\newcommand*{\si@symbol@maths@celsius}{} +\newcommand*{\si@symbol@maths@degree}{} +\newcommand*{\si@symbol@maths@micro}{} +\newcommand*{\si@symbol@maths@ohm}{} +%%\begin{macro}{\si@symbol@text@angstrom} +\newcommand*{\si@symbol@text@angstrom}{} +\newcommand*{\si@symbol@text@arcminute}{} +\newcommand*{\si@symbol@text@arcsecond}{} +\newcommand*{\si@symbol@text@celsius}{} +\newcommand*{\si@symbol@text@degree}{} +\newcommand*{\si@symbol@text@micro}{} +\newcommand*{\si@symbol@text@ohm}{} +\si@keys@family{symbols/maths} +\pgfkeys{ + /siunitx/symbols/maths, + angstrom/.store in = \si@symbol@maths@angstrom, + arcminute/.store in = \si@symbol@maths@arcminute, + arcsecond/.store in = \si@symbol@maths@arcsecond, + celsius/.store in = \si@symbol@maths@celsius, + degree/.store in = \si@symbol@maths@degree, + micro/.store in = \si@symbol@maths@micro, + ohm/.store in = \si@symbol@maths@ohm, + angstrom = \text{\AA}, + arcminute = {}^{\prime}, + arcsecond = {}^{\prime\prime}, + celsius = {}^{\circ}\kern-\scriptspace C, + degree = {}^{\circ}, + micro = \si@symbol@maths@mu, + ohm = \text{\ensuremath{\Omega}} +} +\si@keys@family{symbols/math} +\pgfkeys{ + /siunitx/symbols/math, + angstrom/.store in = \si@symbol@maths@angstrom, + arcminute/.store in = \si@symbol@maths@arcminute, + arcsecond/.store in = \si@symbol@maths@arcsecond, + celsius/.store in = \si@symbol@maths@celsius, + degree/.store in = \si@symbol@maths@degree, + micro/.store in = \si@symbol@maths@micro, + ohm/.store in = \si@symbol@maths@ohm, +} +\si@keys@family{symbols/text} +\pgfkeys{ + /siunitx/symbols/text, + angstrom/.store in = \si@symbol@text@angstrom, + arcminute/.store in = \si@symbol@text@arcminute, + arcsecond/.store in = \si@symbol@text@arcsecond, + celsius/.store in = \si@symbol@text@celsius, + degree/.store in = \si@symbol@text@degree, + micro/.store in = \si@symbol@text@micro, + ohm/.store in = \si@symbol@text@ohm, + angstrom = \AA, + arcminute = \ensuremath{{}^{\prime}}, + arcsecond = \ensuremath{{}^{\prime\prime}}, + celsius = \ensuremath{{}^{\circ}}\kern-\scriptspace C, + degree = \ensuremath{{}^{\circ}}, + micro = \si@symbol@text@mu, + ohm = \ensuremath{\Omega} +} +\newcommand*{\si@symbol@new}[1]{% + \expandafter\si@newcommand\expandafter*\expandafter{% + \csname SIUnitSymbol#1\endcsname + }{% + \si@mode@maths@if@TF{% + \lowercase{\@nameuse{si@symbol@maths@#1}}% + }{% + \lowercase{\@nameuse{si@symbol@text@#1}}% + }% + }% +} +\si@symbol@new{Angstrom} +\si@symbol@new{Arcminute} +\si@symbol@new{Arcsecond} +\si@symbol@new{Celsius} +\si@symbol@new{Degree} +\si@symbol@new{Micro} +\si@symbol@new{Ohm} +\DeclareFontEncoding{TS1}{}{} +\DeclareFontSubstitution{TS1}{cmr}{m}{n} +\DeclareTextSymbol{\si@symbol@text@mu}{TS1}{181} +\DeclareTextSymbolDefault{\si@symbol@text@mu}{TS1} +\newcommand*{\si@symbol@check@upgreek}{% + \@ifpackageloaded{upgreek}{% + \let\si@symbol@maths@mu\upmu + }{% + \DeclareFontFamily{OML}{eur}{\skewchar\font127}% + \DeclareFontShape{OML}{eur}{m}{n}% + {<-6> eurm5 <6-8> eurm7 <8-> eurm10}{}% + \DeclareSymbolFont{si@symbol}{OML}{eur}{m}{n}% + \DeclareMathSymbol{\si@symbol@maths@mu}{\mathord}{si@symbol}{22}% + }% +} +\AtBeginDocument{\si@symbol@check@upgreek} +\newcommand*{\DeclareSIPower}{% + \@ifstar{% + \si@unit@def@power@post + }{% + \si@unit@def@power + }% +} +\newcommand*{\DeclareSIPrefix}{% + \@ifstar{% + \si@unit@def@prefix@binary + }{% + \si@unit@def@prefix + }% +} +\newcommand*{\DeclareSIQualifier}{% + \si@unit@def@qual +} +\newcommand*{\DeclareSIUnit}[2][]{% + \si@unit@def@unit{#2}{#1}% +} +\@onlypreamble\DeclareSIPower +\@onlypreamble\DeclareSIPrefix +\@onlypreamble\DeclareSIQualifier +\@onlypreamble\DeclareSIUnit +\si@newcommand*{\sisetup}[1]{% + \pgfqkeys{/siunitx}{#1}% +} +\si@newcommand*{\num}[2][]{% + \begingroup + \sisetup{#1}% + \si@num@internal{#2}% + \endgroup +} +\newcommand*{\si@num@internal}[1]{% + \si@num@pre@process{#1}% + \si@bool@if@F\si@num@pre@error@bool{% + \si@num@in@parse@o{\si@num@pre@arg}% + \si@bool@if@F\si@num@in@error@bool{% + \si@num@post@process + \si@num@out@process + \si@num@print + }% + }% +} +\si@newcommand*{\SI}[2][]{% + \begingroup + \def\si@tempa{{#1}{#2}}% + \si@unit@internal@i +} +\newcommand*{\si@unit@internal@i}[2][]{% + \expandafter\si@unit@internal@ii\si@tempa{#1}{#2}% +} +\newcommand*{\si@unit@internal@ii}[4]{% TEMP + \sisetup{#1}% + \def\si@unit@internal@opts{#1}% + \si@unit@in@parse{#3}% + \si@num@internal{#2}% + \si@bool@if@F\si@num@in@error@bool{% + \si@empty@tlist@if@T{#4}{% + \let\si@unit@out@sep@print\relax + }% + }% + \si@unit@in@parse{#4}% + \endgroup +} +\newcommand*{\si@unit@internal@opts}{} +\si@newcommand*{\si}[2][]{% + \begingroup + \sisetup{#1}% + \si@unit@in@parse{#2}% + \endgroup +} +\DeclareSIUnit{\kilogram}{\kilo\gram} +\DeclareSIUnit{\metre}{m} +\DeclareSIUnit{\meter}{\metre} +\DeclareSIUnit{\mole}{mol} +\DeclareSIUnit{\second}{s} +\DeclareSIUnit{\ampere}{A} +\DeclareSIUnit{\kelvin}{K} +\DeclareSIUnit{\candela}{cd} +\DeclareSIUnit{\gram}{g} +\DeclareSIPrefix{\yocto}{y}{-24} +\DeclareSIPrefix{\zepto}{z}{-21} +\DeclareSIPrefix{\atto}{a}{-18} +\DeclareSIPrefix{\femto}{f}{-15} +\DeclareSIPrefix{\pico}{p}{-12} +\DeclareSIPrefix{\nano}{n}{-9} +\DeclareSIPrefix{\micro}{\SIUnitSymbolMicro}{-6} +\DeclareSIPrefix{\milli}{m}{-3} +\DeclareSIPrefix{\centi}{c}{-2} +\DeclareSIPrefix{\deci}{d}{-1} +\DeclareSIPrefix{\deca}{da}{1} +\DeclareSIPrefix{\deka}{da}{1} +\DeclareSIPrefix{\hecto}{h}{2} +\DeclareSIPrefix{\kilo}{k}{3} +\DeclareSIPrefix{\mega}{M}{6} +\DeclareSIPrefix{\giga}{G}{9} +\DeclareSIPrefix{\tera}{T}{12} +\DeclareSIPrefix{\peta}{P}{15} +\DeclareSIPrefix{\exa}{E}{18} +\DeclareSIPrefix{\zetta}{Z}{21} +\DeclareSIPrefix{\yotta}{Y}{24} +\DeclareSIUnit{\becquerel}{Bq} +\DeclareSIUnit{\celsius}{\SIUnitSymbolCelsius} +\DeclareSIUnit{\coulomb}{C} +\DeclareSIUnit{\farad}{F} +\DeclareSIUnit{\gray}{Gy} +\DeclareSIUnit{\hertz}{Hz} +\DeclareSIUnit{\henry}{H} +\DeclareSIUnit{\joule}{J} +\DeclareSIUnit{\katal}{kat} +\DeclareSIUnit{\lumen}{lm} +\DeclareSIUnit{\lux}{lx} +\DeclareSIUnit{\newton}{N} +\DeclareSIUnit{\ohm}{\SIUnitSymbolOhm} +\DeclareSIUnit{\pascal}{Pa} +\DeclareSIUnit{\radian}{rad} +\DeclareSIUnit{\siemens}{S} +\DeclareSIUnit{\sievert}{Sv} +\DeclareSIUnit{\steradian}{sr} +\DeclareSIUnit{\tesla}{T} +\DeclareSIUnit{\volt}{V} +\DeclareSIUnit{\watt}{W} +\DeclareSIUnit{\weber}{Wb} +\DeclareSIUnit[units/output/number-unit separator={}] + {\arcmin}{\arcminute} +\DeclareSIUnit[units/output/number-unit separator={}] + {\arcminute}{\SIUnitSymbolArcminute} +\DeclareSIUnit[units/output/number-unit separator={}] + {\arcsecond}{\SIUnitSymbolArcsecond} +\DeclareSIUnit{\day}{d} +\DeclareSIUnit[units/output/number-unit separator={}] + {\degree}{\SIUnitSymbolDegree} +\DeclareSIUnit{\hectare}{ha} +\DeclareSIUnit{\hour}{h} +\DeclareSIUnit{\litre}{l} +\DeclareSIUnit{\liter}{L} +\DeclareSIUnit{\minute}{min} +\DeclareSIUnit{\percent}{\char37} +\DeclareSIUnit{\tonne}{t} +\DeclareSIUnit{\astronomicalunit}{ua} +\DeclareSIUnit{\atomicmassunit}{u} +\DeclareSIUnit{\electronvolt}{eV} +\DeclareSIUnit{\dalton}{Da} +\DeclareSIUnit{\clight}{\text{\ensuremath{c_{0}}}} +\DeclareSIUnit{\electronmass}{\text{\ensuremath{m_{\text{e}}}}} +\DeclareSIUnit{\planckbar}{\text{\ensuremath{\hbar}}} +\DeclareSIUnit{\elementarycharge}{\text{\ensuremath{e}}} +\DeclareSIUnit{\bohr}{\text{\ensuremath{a_{0}}}} +\DeclareSIUnit{\hartree}{\text{\ensuremath{E_{\textup{h}}}}} +\DeclareSIUnit{\angstrom}{\SIUnitSymbolAngstrom} +\DeclareSIUnit{\bar}{bar} +\DeclareSIUnit{\barn}{b} +\DeclareSIUnit{\bel}{B} +\DeclareSIUnit{\decibel}{\deci\bel} +\DeclareSIUnit{\knot}{kn} +\DeclareSIUnit{\mmHg}{mmHg} +\DeclareSIUnit{\nauticalmile}{M} +\DeclareSIUnit{\neper}{Np} +\DeclareSIPower{\square}{2} +\DeclareSIPower*{\squared}{2} +\DeclareSIPower{\cubic}{3} +\DeclareSIPower*{\cubed}{3} +\si@catcode@restore +\si@lccode@restore +%% +%% Copyright (C) 2008-2009 by +%% Joseph Wright +%% +%% It may be distributed and/or modified under the conditions of +%% the LaTeX Project Public License (LPPL), either version 1.3c of +%% this license or (at your option) any later version. The latest +%% version of this license is in the file: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% This work is "maintained" (as per LPPL maintenance status) by +%% Joseph Wright. +%% +%% This work consists of the file siunitx.dtx +%% and the derived files siunitx.pdf, +%% siunitx.sty and +%% siunitx.ins. +%% +%% +%% End of file `siunitx.sty'.