summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-05-17 20:38:21 +0000
committerKarl Berry <karl@freefriends.org>2021-05-17 20:38:21 +0000
commit02d9f17ba92ad3f076e2dc14711462e1dfea6ec0 (patch)
tree1d9b453be69b5988dfe2bc0584d6425547563f69 /Master/texmf-dist/tex/latex
parent00085afeded239f44fcdb90c9f1ba8ec7f3680be (diff)
siunitx (17may21)
git-svn-id: svn://tug.org/texlive/trunk@59239 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex')
-rw-r--r--Master/texmf-dist/tex/latex/siunitx/siunitx-abbreviations.cfg124
-rw-r--r--Master/texmf-dist/tex/latex/siunitx/siunitx-binary.cfg2
-rw-r--r--Master/texmf-dist/tex/latex/siunitx/siunitx-v2.sty7652
-rw-r--r--Master/texmf-dist/tex/latex/siunitx/siunitx-version-1.cfg2
-rw-r--r--Master/texmf-dist/tex/latex/siunitx/siunitx.sty13380
5 files changed, 14204 insertions, 6956 deletions
diff --git a/Master/texmf-dist/tex/latex/siunitx/siunitx-abbreviations.cfg b/Master/texmf-dist/tex/latex/siunitx/siunitx-abbreviations.cfg
deleted file mode 100644
index abf0f50d217..00000000000
--- a/Master/texmf-dist/tex/latex/siunitx/siunitx-abbreviations.cfg
+++ /dev/null
@@ -1,124 +0,0 @@
-%%
-%% This is file `siunitx-abbreviations.cfg',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% siunitx.dtx (with options: `config,abbreviations')
-%% ---------------------------------------------------------------
-%% 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
-%% ---------------------------------------------------------------
-%%
-\ProvidesExplFile {siunitx-abbreviations.cfg} {2021-04-17} {2.8e}
- {siunitx: Abbreviated units}
-\DeclareSIUnit \A { \ampere }
-\DeclareSIUnit \pA { \pico \ampere }
-\DeclareSIUnit \nA { \nano \ampere }
-\DeclareSIUnit \uA { \micro \ampere }
-\DeclareSIUnit \mA { \milli \ampere }
-\DeclareSIUnit \kA { \kilo \ampere }
-\DeclareSIUnit \Hz { \hertz }
-\DeclareSIUnit \mHz { \milli \hertz }
-\DeclareSIUnit \kHz { \kilo \hertz }
-\DeclareSIUnit \MHz { \mega \hertz }
-\DeclareSIUnit \GHz { \giga \hertz }
-\DeclareSIUnit \THz { \tera \hertz }
-\DeclareSIUnit \mol { \mole }
-\DeclareSIUnit \fmol { \femto \mole }
-\DeclareSIUnit \pmol { \pico \mole }
-\DeclareSIUnit \nmol { \nano \mole }
-\DeclareSIUnit \umol { \micro \mole }
-\DeclareSIUnit \mmol { \milli \mole }
-\DeclareSIUnit \kmol { \kilo \mole }
-\DeclareSIUnit \V { \volt }
-\DeclareSIUnit \pV { \pico \volt }
-\DeclareSIUnit \nV { \nano \volt }
-\DeclareSIUnit \uV { \micro \volt }
-\DeclareSIUnit \mV { \milli \volt }
-\DeclareSIUnit \kV { \kilo \volt }
-\DeclareSIUnit \hl { \hecto \litre }
-\DeclareSIUnit \l { \litre }
-\DeclareSIUnit \ml { \milli \litre }
-\DeclareSIUnit \ul { \micro \litre }
-\DeclareSIUnit \hL { \hecto \liter }
-\DeclareSIUnit \L { \liter }
-\DeclareSIUnit \mL { \milli \liter }
-\DeclareSIUnit \uL { \micro \liter }
-\DeclareSIUnit \fg { \femto \gram }
-\DeclareSIUnit \pg { \pico \gram }
-\DeclareSIUnit \ng { \nano \gram }
-\DeclareSIUnit \ug { \micro \gram }
-\DeclareSIUnit \mg { \milli \gram }
-\DeclareSIUnit \g { \gram }
-\DeclareSIUnit \kg { \kilo \gram }
-\DeclareSIUnit \amu { \atomicmassunit }
-\DeclareSIUnit \W { \watt }
-\DeclareSIUnit \uW { \micro \watt }
-\DeclareSIUnit \mW { \milli \watt }
-\DeclareSIUnit \kW { \kilo \watt }
-\DeclareSIUnit \MW { \mega \watt }
-\DeclareSIUnit \GW { \giga \watt }
-\DeclareSIUnit \J { \joule }
-\DeclareSIUnit \uJ { \micro \joule }
-\DeclareSIUnit \mJ { \milli \joule }
-\DeclareSIUnit \kJ { \kilo \joule }
-\DeclareSIUnit \eV { \electronvolt }
-\DeclareSIUnit \meV { \milli \electronvolt }
-\DeclareSIUnit \keV { \kilo \electronvolt }
-\DeclareSIUnit \MeV { \mega \electronvolt }
-\DeclareSIUnit \GeV { \giga \electronvolt }
-\DeclareSIUnit \TeV { \tera \electronvolt }
-\DeclareSIUnit [ inter-unit-product = ] \kWh { \kilo \watt \hour }
-\DeclareSIUnit \m { \metre }
-\DeclareSIUnit \pm { \pico \metre }
-\DeclareSIUnit \nm { \nano \metre }
-\DeclareSIUnit \um { \micro \metre }
-\DeclareSIUnit \mm { \milli \metre }
-\DeclareSIUnit \cm { \centi \metre }
-\DeclareSIUnit \dm { \deci \metre }
-\DeclareSIUnit \km { \kilo \metre }
-\DeclareSIUnit \K { \kelvin }
-\DeclareSIUnit \dB { \deci \bel }
-\DeclareSIUnit \F { \farad }
-\DeclareSIUnit \fF { \femto \farad }
-\DeclareSIUnit \pF { \pico \farad }
-\DeclareSIUnit \N { \newton }
-\DeclareSIUnit \mN { \milli \newton }
-\DeclareSIUnit \kN { \kilo \newton }
-\DeclareSIUnit \MN { \mega \newton }
-\DeclareSIUnit \Pa { \pascal }
-\DeclareSIUnit \kPa { \kilo \pascal }
-\DeclareSIUnit \MPa { \mega \pascal }
-\DeclareSIUnit \GPa { \giga \pascal }
-\DeclareSIUnit \mohm { \milli \ohm }
-\DeclareSIUnit \kohm { \kilo \ohm }
-\DeclareSIUnit \Mohm { \mega \ohm }
-\DeclareSIUnit \s { \second }
-\DeclareSIUnit \as { \atto \second }
-\DeclareSIUnit \fs { \femto \second }
-\DeclareSIUnit \ps { \pico \second }
-\DeclareSIUnit \ns { \nano \second }
-\DeclareSIUnit \us { \micro \second }
-\DeclareSIUnit \ms { \milli \second }
-%% Copyright (C) 2008-2021 by
-%% Joseph Wright <joseph.wright@morningstar2.co.uk>
-%%
-%% 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-abbreviations.cfg'.
diff --git a/Master/texmf-dist/tex/latex/siunitx/siunitx-binary.cfg b/Master/texmf-dist/tex/latex/siunitx/siunitx-binary.cfg
index 40b935e79c2..be731abdf6b 100644
--- a/Master/texmf-dist/tex/latex/siunitx/siunitx-binary.cfg
+++ b/Master/texmf-dist/tex/latex/siunitx/siunitx-binary.cfg
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% siunitx.dtx (with options: `config,binary')
+%% siunitx-v2.dtx (with options: `config,binary')
%% ---------------------------------------------------------------
%% The siunitx package --- A comprehensive (SI) units package
%% Maintained by Joseph Wright
diff --git a/Master/texmf-dist/tex/latex/siunitx/siunitx-v2.sty b/Master/texmf-dist/tex/latex/siunitx/siunitx-v2.sty
new file mode 100644
index 00000000000..260971dfcba
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/siunitx/siunitx-v2.sty
@@ -0,0 +1,7652 @@
+%%
+%% This is file `siunitx-v2.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% siunitx-v2.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
+%% ---------------------------------------------------------------
+%%
+\RequirePackage{expl3}[2020/01/12]
+\RequirePackage{xparse}
+\ProvidesExplPackage {siunitx} {2021-04-17} {2.8e}
+ {A comprehensive (SI) units package}
+\@ifpackagelater { expl3 } { 2020/01/12 }
+ { }
+ {
+ \PackageError { siunitx } { Support~package~expl3~too~old }
+ {
+ You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~
+ 'l3packages'.\MessageBreak
+ Loading~siunitx~will~abort!
+ }
+ \tex_endinput:D
+ }
+\msg_new:nnnn { siunitx } { incompatible-package }
+ { Package~'#1'~incompatible. }
+ { The~#1~package~and~siunitx~are~incompatible. }
+\cs_new_protected:Npn \__siunitx_load_check:n #1 {
+ \group_begin:
+ \@ifpackageloaded {#1}
+ { \msg_error:nnx { siunitx } { incompatible-package } {#1} }
+ { }
+ \group_end:
+}
+\clist_map_function:nN
+ { SIunits , sistyle , siunits , SIstyle , unitsdef , fancyunits }
+ \__siunitx_load_check:n
+\AtBeginDocument {
+ \clist_map_function:nN { SIunits , sistyle , siunits , SIstyle }
+ \__siunitx_load_check:n
+}
+\RequirePackage{ amstext , array , l3keys2e }
+\@ifl@t@r \fmtversion { 2020-10-01 }
+ { \cs_new_eq:NN \__siunitx_if_hooks:TF \use_i:nn }
+ { \cs_new_eq:NN \__siunitx_if_hooks:TF \use_ii:nn }
+\cs_new:Npn \__siunitx_tmp:w { }
+\cs_generate_variant:Nn \clist_map_function:nN { nc }
+\cs_generate_variant:Nn \tl_if_blank:nTF { V }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { No, NV , Nx }
+\bool_new:N \l__siunitx_tmp_bool
+\box_new:N \l__siunitx_tmp_box
+\dim_new:N \l__siunitx_tmp_dim
+\int_new:N \l__siunitx_tmp_int
+\tl_new:N \l__siunitx_tmpa_tl
+\tl_new:N \l__siunitx_tmpb_tl
+\cs_new_protected:Npn \__siunitx_error:nxx #1#2#3 {
+ \bool_set_true:N \l__siunitx_error_bool
+ \msg_error:nnxx { siunitx } {#1} {#2} {#3}
+}
+\cs_new_protected:Npn \__siunitx_error:nx #1#2 {
+ \__siunitx_error:nxx {#1} {#2} { }
+}
+\cs_new_protected:Npn \__siunitx_error:n #1 {
+ \__siunitx_error:nxx {#1} { } { }
+}
+\bool_new:N \l__siunitx_error_bool
+\AtBeginDocument {
+ \cs_if_free:cT { T@TS1 }
+ { \RequirePackage { textcomp } }
+}
+\cs_new_protected:Npn \__siunitx_tl_put_left_math:Nn #1#2
+ { \tl_put_left:Nn #1 { \ensuremath {#2} } }
+\cs_generate_variant:Nn \__siunitx_tl_put_left_math:Nn { NV }
+\exp_args:NNx \seq_const_from_clist:Nn \c__siunitx_old_options_seq
+ {
+ \tl_to_str:n
+ {
+ addsign ,
+ allowlitunits ,
+ allowoptarg ,
+ allowzeroexp ,
+ alsoload ,
+ angformat ,
+ anglesep ,
+ astroang ,
+ closeerr ,
+ closrfrac ,
+ closerange ,
+ colour ,
+ colorall ,
+ colourall ,
+ colorneg ,
+ colourneg ,
+ colourunits ,
+ colourunits ,
+ colorvalues ,
+ colourvalues ,
+ decimalsymbol ,
+ debug ,
+ detectdisplay ,
+ digitsep ,
+ dp ,
+ emulate ,
+ errspace ,
+ eVcorra ,
+ eVcorrb ,
+ expbase ,
+ expproduct ,
+ fixdp ,
+ fixsf ,
+ fraction ,
+ inlinebold ,
+ loctolang ,
+ log ,
+ load ,
+ mathOmega ,
+ mathcelsius ,
+ mathdegree ,
+ mathminute ,
+ mathmu ,
+ mathringA ,
+ mathrm ,
+ mathsOmega ,
+ mathscelsius ,
+ mathsdegree ,
+ mathsecond ,
+ mathsf ,
+ mathsminute ,
+ mathsmu ,
+ mathsringA ,
+ mathsrm ,
+ mathssecond ,
+ mathssf ,
+ mathstt ,
+ mathtt ,
+ negcolor ,
+ negcolour ,
+ noload ,
+ numaddn ,
+ numcloseerr ,
+ numdecimal ,
+ numdigits ,
+ numdiv ,
+ numexp ,
+ numgobble ,
+ numopenerr ,
+ numprod ,
+ numsign ,
+ obeyall ,
+ obeybold ,
+ obeyfamily ,
+ obeymode ,
+ obeyitalic ,
+ openerr ,
+ openfrac ,
+ openrange ,
+ padangle ,
+ padnumber ,
+ per ,
+ prefixbase ,
+ prefixproduct ,
+ prefixsymbolic ,
+ prespace ,
+ redefsymbols ,
+ repeatunits ,
+ retainplus ,
+ seperr ,
+ sepfour ,
+ sf ,
+ sign ,
+ slash ,
+ stickyper ,
+ strictarc ,
+ tabalign ,
+ tabalignexp ,
+ tabautofit ,
+ tabexpalign ,
+ tabformat ,
+ tabnumalign ,
+ tabparseonly ,
+ tabtextalign ,
+ textOmega ,
+ textcelsius ,
+ textdegree ,
+ textminute ,
+ textmode ,
+ textmu ,
+ textringA ,
+ textrm ,
+ textsecond ,
+ textsf ,
+ texttt ,
+ tightpm ,
+ tophrase ,
+ trapamigerr ,
+ trapambigfrac ,
+ trapambigrange ,
+ unitcolor ,
+ unitcolour ,
+ unitmathrm ,
+ unitmathsf ,
+ unitmathsrm ,
+ unitmathssf ,
+ unitmathstt ,
+ unitmathtt ,
+ unitmode ,
+ unitsep ,
+ unitspace ,
+ valuecolor ,
+ valuecolour ,
+ valuemathrm ,
+ valuemathsf ,
+ valuemathsrm ,
+ valuemathssf ,
+ valuemathstt ,
+ valuemathtt ,
+ valuemode ,
+ valuesep ,
+ xspace
+ }
+ }
+\tl_new:N \l__siunitx_key_tl
+\keys_define:nn { siunitx } {
+ unknown .code:n =
+ {
+ \seq_if_in:NVTF \c__siunitx_old_options_seq \l_keys_key_tl
+ {
+ \msg_warning:nnx { siunitx } { version-1-option }
+ { \exp_not:V \l_keys_key_tl }
+ \tl_set:Nx \l__siunitx_key_tl
+ {
+ \keys_set:nn { siunitx }
+ {
+ \exp_not:V \l_keys_key_tl
+ \tl_if_blank:nF {#1} { = \exp_not:n {#1} }
+ }
+ }
+ \keys_set:nn { siunitx } { version-1-compatibility }
+ \tl_use:N \l__siunitx_key_tl
+ }
+ {
+ \msg_error:nnx { siunitx } { unknown-option }
+ { \exp_not:V \l_keys_key_tl }
+ }
+ }
+}
+\AtBeginDocument {
+ \keys_define:nn { siunitx } {
+ unknown .code:n =
+ {
+ \seq_if_in:NVTF \c__siunitx_old_options_seq \l_keys_key_tl
+ {
+ \msg_error:nnx { siunitx } { version-1-option }
+ { \exp_not:V \l_keys_key_tl }
+ }
+ {
+ \msg_error:nnx { siunitx } { unknown-option }
+ { \exp_not:V \l_keys_key_tl }
+ }
+ }
+}
+}
+\cs_new_protected:Npn \__siunitx_option_deactivate:n #1 {
+ \clist_put_right:Nn \l__siunitx_option_deactivate_clist {#1}
+}
+\cs_new_protected:Npn \__siunitx_option_deactivate_aux:n #1 {
+ \keys_define:nn { siunitx }
+ {
+ #1 .code:n =
+ { \msg_warning:nnx { siunitx } { option-preamble-only } {#1} }
+ }
+}
+\AtBeginDocument {
+ \clist_map_function:NN \l__siunitx_option_deactivate_clist
+ \__siunitx_option_deactivate_aux:n
+}
+\clist_new:N \l__siunitx_option_deactivate_clist
+\cs_new_protected:Npn \__siunitx_option_unchanged:Nnn #1#2#3
+ {
+ \str_if_eq:VnT #1 {#2}
+ { \tl_set:Nn #1 {#3} }
+ }
+\cs_generate_variant:Nn \tl_if_empty_p:n { f }
+\cs_generate_variant:Nn \tl_if_empty:nT { f }
+\cs_generate_variant:Nn \tl_if_in:NnTF { NV }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
+\prg_new_conditional:Npnn \__siunitx_cs_if_tl:N #1 { T, F , TF , p }
+ {
+ \bool_lazy_and:nnTF
+ {
+ \tl_if_empty_p:f
+ {
+ \cs_prefix_spec:N #1
+ \cs_argument_spec:N #1
+ }
+ }
+ { \bool_not_p:n { \cs_if_exist_p:c { \cs_to_str:N #1 ~ } } }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_new_conditional:Npnn \__siunitx_number_if_zero:n #1 { p , TF }
+ {
+ \tl_map_function:nN {#1} \__siunitx_number_if_zero_aux:n
+ \prg_return_true:
+ }
+\cs_generate_variant:Nn \__siunitx_number_if_zero_p:n { V }
+\cs_new:Npn \__siunitx_number_if_zero_aux:n #1
+ {
+ \token_if_eq_charcode:NNF #1 0
+ { \tl_map_break:n { \prg_return_false: \use_none:n } }
+ }
+\AtBeginDocument
+ {
+ \@ifpackageloaded { tex4ht }
+ {
+ \cs_set_eq:NN \__siunitx_print_text_super:n \textsuperscript
+ \__siunitx_option_unchanged:Nnn \l__siunitx_qualifier_mode_tl
+ { subscript } { brackets }
+ \keys_set:nn { siunitx } { mode = text }
+ }
+ { }
+ }
+\cs_new_eq:NN \__siunitx_ensure_ltr:n \use:n
+\AtBeginDocument
+ {
+ \@ifpackageloaded { bidi }
+ {
+ \sys_if_engine_xetex:T
+ { \cs_set_protected:Npn \__siunitx_ensure_ltr:n #1 { \LRE {#1} } }
+ }
+ { }
+ }
+\cs_new_protected:Npn \__siunitx_textsuperscript:n #1
+ {
+ \m@th
+ \ensuremath { ^ { \mbox { \fontsize \sf@size \z@ \selectfont #1 } } }
+ }
+\bool_new:N \l__siunitx_display_math_bool
+\tex_everydisplay:D \exp_after:wN
+ {
+ \tex_the:D \tex_everydisplay:D
+ \bool_set_true:N \l__siunitx_display_math_bool
+ }
+\cs_generate_variant:Nn \prop_get:NnNT { NV }
+\cs_generate_variant:Nn \prop_get:NnNF { NV }
+\cs_generate_variant:Nn \prop_get:NnNTF { NV }
+\cs_new_protected:Npn \__siunitx_set_math_fam:n #1 {
+ \group_begin:
+ \hbox_set:Nn \l__siunitx_tmp_box
+ {
+ \ensuremath
+ {
+ \use:c { math #1 }
+ {
+ \int_const:cn { c__siunitx_math #1 _int } { \fam }
+ }
+ }
+ }
+ \group_end:
+}
+\__siunitx_if_hooks:TF
+ {
+ \AddToHook { begindocument / end } [ siunitx ]
+ {
+ \__siunitx_set_math_fam:n { sf }
+ \__siunitx_set_math_fam:n { tt }
+ }
+ }
+ {
+ \tl_put_right:Nn \document
+ {
+ \__siunitx_set_math_fam:n { sf }
+ \__siunitx_set_math_fam:n { tt }
+ \ignorespaces
+ }
+ }
+\cs_new_protected:Npn \__siunitx_set_text_fam:n #1 {
+ \tl_const:cx { c__siunitx_text #1 _tl } { \use:c { #1 default } }
+}
+\AtBeginDocument {
+ \__siunitx_set_text_fam:n { sf }
+ \__siunitx_set_text_fam:n { tt }
+}
+\tl_new:N \l__siunitx_detect_inline_weight_tl
+\tl_new:N \l__siunitx_detect_inline_family_tl
+\keys_define:nn { siunitx } {
+ detect-all .choice:,
+ detect-all .default:n = true,
+ detect-all / false .meta:n =
+ {
+ detect-family = false ,
+ detect-mode = false ,
+ detect-shape = false ,
+ detect-weight = false ,
+ },
+ detect-all / true .meta:n =
+ {
+ detect-family = true ,
+ detect-mode = true ,
+ detect-shape = true ,
+ detect-weight = true ,
+ },
+ detect-display-math .bool_set:N =
+ \l__siunitx_detect_display_math_bool,
+ detect-family .bool_set:N = \l__siunitx_detect_family_bool,
+ detect-inline-family .choice:,
+ detect-inline-family .value_required:n = true,
+ detect-inline-family /
+ math .code:n =
+ { \tl_set:Nn \l__siunitx_detect_inline_family_tl { math } },
+ detect-inline-family /
+ text .code:n =
+ { \tl_set:Nn \l__siunitx_detect_inline_family_tl { text } },
+ detect-inline-weight .choice:,
+ detect-inline-weight .value_required:n = true,
+ detect-inline-weight /
+ math .code:n =
+ { \tl_set:Nn \l__siunitx_detect_inline_weight_tl { math } },
+ detect-inline-weight /
+ text .code:n =
+ { \tl_set:Nn \l__siunitx_detect_inline_weight_tl { text } },
+ detect-italic .bool_set:N = \l__siunitx_detect_shape_bool,
+ detect-mode .bool_set:N = \l__siunitx_detect_mode_bool,
+ detect-none .choice:,
+ detect-none .default:n = true,
+ detect-none / false .meta:n =
+ {
+ detect-family = true,
+ detect-mode = true,
+ detect-shape = true,
+ detect-weight = true
+ },
+ detect-none / true .meta:n =
+ {
+ detect-family = false,
+ detect-mode = false,
+ detect-shape = false,
+ detect-weight = false
+ },
+ detect-shape .bool_set:N = \l__siunitx_detect_shape_bool,
+ detect-weight .bool_set:N = \l__siunitx_detect_weight_bool
+}
+\keys_set:nn { siunitx } {
+ detect-inline-family = text ,
+ detect-inline-weight = text ,
+}
+\bool_new:N \l__siunitx_font_set_bool
+\bool_new:N \l__siunitx_font_math_mode_bool
+\tl_new:N \l__siunitx_font_family_tl
+\cs_new:Npn \__siunitx_font_shape: { }
+\cs_new:Npn \__siunitx_font_weight: { }
+\cs_new_protected:Npn \__siunitx_detect_font: {
+ \bool_if:NF \l__siunitx_font_set_bool
+ {
+ \__siunitx_detect_font_init:
+ \bool_if:NT \l__siunitx_detect_weight_bool
+ { \__siunitx_detect_font_weight: }
+ \bool_if:NT \l__siunitx_detect_family_bool
+ { \__siunitx_detect_font_family: }
+ \bool_if:NT \l__siunitx_detect_shape_bool
+ { \__siunitx_detect_font_shape: }
+ \bool_if:NT \l__siunitx_detect_mode_bool
+ { \__siunitx_detect_font_mode: }
+ }
+}
+\cs_new_protected:Npn \__siunitx_detect_font_init: {
+ \bool_set_true:N \l__siunitx_font_set_bool
+ \cs_set:Npn \__siunitx_font_weight:
+ {
+ \unboldmath
+ \mdseries
+ }
+ \cs_set:Npn \__siunitx_font_shape: { \upshape }
+ \tl_set:Nn \l__siunitx_font_family_tl { rm }
+ \bool_set_true:N \l__siunitx_font_math_mode_bool
+}
+\cs_new_protected:Npn \__siunitx_detect_font_weight: {
+ \mode_if_math:TF
+ {
+ \bool_if:NTF \l__siunitx_display_math_bool
+ {
+ \bool_if:NTF \l__siunitx_detect_display_math_bool
+ { \__siunitx_detect_font_weight_math: }
+ { \__siunitx_detect_font_weight_text: }
+ }
+ {
+ \use:c
+ {
+ __siunitx_detect_font_weight_
+ \l__siunitx_detect_inline_weight_tl
+ :
+ }
+ }
+ }
+ { \__siunitx_detect_font_weight_text: }
+}
+\cs_new_protected:Npn \__siunitx_detect_font_weight_math: {
+ \str_if_eq:VnT \math@version { bold }
+ {
+ \cs_set:Npn \__siunitx_font_weight:
+ {
+ \boldmath
+ \bfseries
+ }
+ }
+ \str_if_eq:VnT \math@version { light }
+ { \cs_set:Npn \__siunitx_font_weight: { \lseries } }
+}
+\cs_new_protected:Npn \__siunitx_detect_font_weight_text: {
+ \tl_set:Nx \l__siunitx_tmpa_tl { \tl_head:N \f@series }
+ \str_if_eq:VnT \l__siunitx_tmpa_tl { b }
+ {
+ \cs_set:Npn \__siunitx_font_weight:
+ {
+ \boldmath
+ \bfseries
+ }
+ }
+ \str_if_eq:VnT \l__siunitx_tmpa_tl { l }
+ { \cs_set:Npn \__siunitx_font_weight: { \lseries } }
+}
+\cs_new_protected:Npn \__siunitx_detect_font_family: {
+ \mode_if_math:TF
+ {
+ \bool_if:NTF \l__siunitx_display_math_bool
+ {
+ \bool_if:NTF \l__siunitx_detect_display_math_bool
+ { \__siunitx_detect_font_family_math: }
+ { \__siunitx_detect_font_family_text: }
+ }
+ {
+ \use:c
+ {
+ __siunitx_detect_font_family_
+ \l__siunitx_detect_inline_family_tl
+ :
+ }
+ }
+ }
+ { \__siunitx_detect_font_family_text: }
+}
+\cs_new_protected:Npn \__siunitx_detect_font_family_math: {
+ \tl_set:Nn \l__siunitx_font_family_tl { rm }
+ \int_compare:nNnT { \fam } = { \c__siunitx_mathsf_int }
+ { \tl_set:Nn \l__siunitx_font_family_tl { sf } }
+ \int_compare:nNnT { \fam } = { \c__siunitx_mathtt_int }
+ { \tl_set:Nn \l__siunitx_font_family_tl { tt } }
+}
+\cs_new_protected:Npn \__siunitx_detect_font_family_text: {
+ \tl_if_eq:NNT \f@family \c__siunitx_textsf_tl
+ { \tl_set:Nn \l__siunitx_font_family_tl { sf } }
+ \tl_if_eq:NNT \f@family \c__siunitx_texttt_tl
+ { \tl_set:Nn \l__siunitx_font_family_tl { tt } }
+}
+\cs_new_protected:Npn \__siunitx_detect_font_shape:
+ {
+ \cs_if_exist:cT { \f@shape shape }
+ {
+ \cs_set:Npx \__siunitx_font_shape: { \exp_not:c { \f@shape shape } }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_detect_font_mode: {
+ \mode_if_math:F
+ {
+ \bool_set_false:N \l__siunitx_font_math_mode_bool
+ \bool_set_false:N \l__siunitx_number_math_mode_bool
+ \bool_set_false:N \l__siunitx_unit_math_mode_bool
+ }
+}
+\bool_new:N \l__siunitx_number_math_mode_bool
+\bool_new:N \l__siunitx_unit_math_mode_bool
+\cs_new:Npn \__siunitx_number_mathrm:n #1 { }
+\cs_new:Npn \__siunitx_number_mathsf:n #1 { }
+\cs_new:Npn \__siunitx_number_mathtt:n #1 { }
+\cs_new:Npn \__siunitx_number_textrm: { }
+\cs_new:Npn \__siunitx_number_textsf: { }
+\cs_new:Npn \__siunitx_number_texttt: { }
+\keys_define:nn { siunitx } {
+ number-color .tl_set:N = \l__siunitx_number_color_tl,
+ number-math-rm .code:n =
+ { \cs_set:Npn \__siunitx_number_mathrm:n ##1 { #1 {##1} } },
+ number-math-sf .code:n =
+ { \cs_set:Npn \__siunitx_number_mathsf:n ##1 { #1 {##1} } },
+ number-math-tt .code:n =
+ { \cs_set:Npn \__siunitx_number_mathtt:n ##1 { #1 {##1} } },
+ number-mode .choice:,
+ number-mode / math .code:n =
+ { \bool_set_true:N \l__siunitx_number_math_mode_bool },
+ number-mode / text .code:n =
+ { \bool_set_false:N \l__siunitx_number_math_mode_bool },
+ number-text-rm .code:n =
+ { \cs_set:Npn \__siunitx_number_textrm: {#1} },
+ number-text-sf .code:n =
+ { \cs_set:Npn \__siunitx_number_textsf: {#1} },
+ number-text-tt .code:n =
+ { \cs_set:Npn \__siunitx_number_texttt: {#1} }
+}
+\cs_new:Npn \__siunitx_unit_mathrm: { }
+\cs_new:Npn \__siunitx_unit_mathsf: { }
+\cs_new:Npn \__siunitx_unit_mathtt: { }
+\cs_new:Npn \__siunitx_unit_textrm: { }
+\cs_new:Npn \__siunitx_unit_textsf: { }
+\cs_new:Npn \__siunitx_unit_texttt: { }
+\keys_define:nn { siunitx } {
+ unit-color .tl_set:N = \l__siunitx_unit_color_tl,
+ unit-math-rm .code:n =
+ { \cs_set:Npn \__siunitx_unit_mathrm:n ##1 { #1 {##1} } },
+ unit-math-sf .code:n =
+ { \cs_set:Npn \__siunitx_unit_mathsf:n ##1 { #1 {##1} } },
+ unit-math-tt .code:n =
+ { \cs_set:Npn \__siunitx_unit_mathtt:n ##1 { #1 {##1} } },
+ unit-mode .choice:,
+ unit-mode / math .code:n =
+ { \bool_set_true:N \l__siunitx_unit_math_mode_bool },
+ unit-mode / text .code:n =
+ { \bool_set_false:N \l__siunitx_unit_math_mode_bool },
+ unit-text-rm .code:n =
+ { \cs_set:Npn \__siunitx_unit_textrm: {#1} },
+ unit-text-sf .code:n =
+ { \cs_set:Npn \__siunitx_unit_textsf: {#1} },
+ unit-text-tt .code:n =
+ { \cs_set:Npn \__siunitx_unit_texttt: {#1} }
+}
+\keys_define:nn { siunitx } {
+ color .meta:n =
+ {
+ number-color = #1,
+ unit-color = #1
+ },
+ math-rm .meta:n =
+ {
+ number-math-rm = #1,
+ unit-math-rm = #1
+ },
+ math-sf .meta:n =
+ {
+ number-math-sf = #1,
+ unit-math-sf = #1
+ },
+ math-tt .meta:n =
+ {
+ number-math-tt = #1,
+ unit-math-tt = #1
+ },
+ mode .choice:,
+ mode / math .meta:n =
+ {
+ number-mode = math,
+ unit-mode = math
+ },
+ mode / text .meta:n =
+ {
+ number-mode = text,
+ unit-mode = text
+ },
+ text-rm .meta:n =
+ {
+ number-text-rm = #1,
+ unit-text-rm = #1
+ },
+ text-sf .meta:n =
+ {
+ number-text-sf = #1,
+ unit-text-sf = #1
+ },
+ text-tt .meta:n =
+ {
+ number-text-tt = #1,
+ unit-text-tt = #1
+ }
+}
+\keys_set:nn { siunitx } {
+ math-rm = \mathrm,
+ math-sf = \mathsf,
+ math-tt = \mathtt,
+ mode = math,
+ text-rm = \rmfamily,
+ text-sf = \sffamily,
+ text-tt = \ttfamily,
+}
+\AtBeginDocument {
+ \tl_set:Nx \l__siunitx_tmpa_tl { \familydefault }
+ \@ifpackageloaded { eulervm }
+ {
+ \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
+ \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { number-math-rm = \mathnormal } }
+ \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { unit-math-rm = \mathnormal } }
+ }
+ { }
+ \tl_if_eq:NNT \l__siunitx_tmpa_tl \c__siunitx_textsf_tl
+ {
+ \@ifpackageloaded { arev }
+ { }
+ {
+ \@ifpackageloaded { cmbright }
+ { }
+ {
+ \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
+ \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { number-math-rm = \mathsf } }
+ \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { unit-math-rm = \mathsf } }
+ }
+ }
+ \cs_set:Npn \__siunitx_tmp:w { \rmfamily }
+ \cs_if_eq:NNT \__siunitx_number_textrm: \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { number-text-rm = \sffamily } }
+ \cs_if_eq:NNT \__siunitx_unit_textrm: \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { unit-text-rm = \sffamily } }
+ }
+ \tl_if_eq:NNT \l__siunitx_tmpa_tl \c__siunitx_texttt_tl
+ {
+ \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
+ \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { number-math-rm = \mathtt } }
+ \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { unit-math-rm = \mathtt } }
+ \cs_set:Npn \__siunitx_tmp:w { \rmfamily }
+ \cs_if_eq:NNT \__siunitx_number_textrm: \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { number-text-rm = \ttfamily } }
+ \cs_if_eq:NNT \__siunitx_unit_textrm: \__siunitx_tmp:w
+ { \keys_set:nn { siunitx } { unit-text-rm = \ttfamily } }
+ }
+}
+\tl_new:N \l__siunitx_print_arg_tl
+\tl_new:N \l__siunitx_print_type_tl
+\cs_new_protected:Npn \__siunitx_print:nn #1#2 {
+ \group_begin:
+ \tl_set:Nn \l__siunitx_print_type_tl {#1}
+ \tl_set:Nn \l__siunitx_print_arg_tl {#2}
+ \__siunitx_detect_font:
+ \bool_if:NF \l__siunitx_detect_mode_bool
+ {
+ \bool_if:cTF { l__siunitx_ #1 _math_mode_bool }
+ { \bool_set_true:N \l__siunitx_font_math_mode_bool }
+ { \bool_set_false:N \l__siunitx_font_math_mode_bool }
+ }
+ \__siunitx_print_aux:
+ \group_end:
+}
+\cs_generate_variant:Nn \__siunitx_print:nn { nV }
+\cs_new_protected:Npn \__siunitx_print_aux:
+ {
+ \text
+ {
+ \__siunitx_ensure_ltr:n
+ {
+ \color@begingroup
+ \__siunitx_print_color:
+ \__siunitx_font_shape:
+ \__siunitx_font_weight:
+ \use:c
+ {
+ __siunitx_ \l__siunitx_print_type_tl _
+ text \l__siunitx_font_family_tl :
+ }
+ \bool_if:NTF \l__siunitx_font_math_mode_bool
+ { \__siunitx_print_math: }
+ { \__siunitx_print_text: }
+ \color@endgroup
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_print_color: {
+ \tl_if_empty:cF { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
+ {
+ \color
+ {
+ \tl_use:c { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
+ }
+ }
+}
+\AtBeginDocument {
+ \@ifpackageloaded { color }
+ { \cs_new_eq:NN \__siunitx_textcolor:n \textcolor }
+ {
+ \cs_set_protected:Npn \__siunitx_print_color:
+ {
+ \tl_if_empty:cF { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
+ {
+ \cs_gset_eq:NN \__siunitx_print_color: \scan_stop:
+ \msg_warning:nn { siunitx } { color-not-loaded }
+ }
+ }
+ \cs_new_protected:Npn \__siunitx_textcolor:n #1
+ {
+ \cs_gset_eq:NN \__siunitx_textcolor:n \use_none:n
+ \msg_warning:nn { siunitx } { color-not-loaded }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_print_math:
+ {
+ \cs_set_eq:NN \PrintSubscript \sb
+ \cs_set_eq:NN \PrintSuperscript \sp
+ \ensuremath
+ {
+ \use:c
+ {
+ __siunitx_ \l__siunitx_print_type_tl _
+ math \l__siunitx_font_family_tl :n
+ }
+ { \l__siunitx_print_arg_tl }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_print_text:
+ {
+ \tl_replace_all:Nnn \l__siunitx_print_arg_tl { - }
+ { \textminus }
+ \__siunitx_print_text_aux:
+ \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \mp }
+ { \ensuremath { \mp } }
+ \tl_remove_all:Nn \l__siunitx_print_arg_tl { \mathord }
+ \cs_set_eq:NN \PrintSubscript \__siunitx_print_text_sub:n
+ \cs_set_eq:NN \PrintSuperscript \__siunitx_print_text_super:n
+ \__siunitx_print_text_aux:NnN
+ _ { math_subscript } \__siunitx_print_text_sub:n
+ _ { active } \__siunitx_print_text_sub:n
+ ^ { math_superscript } \__siunitx_print_text_super:n
+ ^ { active } \__siunitx_print_text_super:n
+ \q_recursion_tail ? ?
+ \q_recursion_stop
+ \l__siunitx_print_arg_tl
+ }
+\cs_new_protected:Npn \__siunitx_print_text_aux:
+ {
+ \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \pm }
+ { \ensuremath { \pm } }
+ }
+\cs_new_protected:Npn \__siunitx_print_text_aux:NnN #1#2#3
+ {
+ \quark_if_recursion_tail_stop:N #1
+ \tl_set_rescan:Nnn \l__siunitx_tmpa_tl
+ { \use:c { char_set_catcode_ #2 :N } #1 }
+ {#1}
+ \tl_replace_all:NVn \l__siunitx_print_arg_tl \l__siunitx_tmpa_tl {#3}
+ \__siunitx_print_text_aux:NnN
+ }
+\AtBeginDocument
+ {
+ \@ifpackageloaded { textcomp }
+ {
+ \cs_set_protected:Npn \__siunitx_print_text_aux:
+ {
+ \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \pm }
+ { \textpm }
+ }
+ }
+ { }
+ }
+\cs_new_protected:Npn \__siunitx_print_text_sub:n #1
+ {
+ \cs_set:Npn \__siunitx_print_text_sub_super:n ##1
+ {
+ \ensuremath
+ {
+ \sb { \text {#1} }
+ \sp { \text {##1} }
+ }
+ }
+ \cs_set_protected:Npn \__siunitx_peek_true:
+ {
+ \tex_afterassignment:D \__siunitx_print_text_sub_super:n
+ \cs_set_eq:NN \__siunitx_tmp:w
+ }
+ \cs_set_protected:Npn \__siunitx_peek_false:
+ { \ensuremath { \sb { \text {#1} } } }
+ \peek_after:Nw \__siunitx_print_text_sub_peek:
+ }
+\cs_new_protected:Npn \__siunitx_print_text_sub_peek:
+ {
+ \if_meaning:w \l_peek_token \__siunitx_print_text_super:n
+ \exp_after:wN \__siunitx_peek_true:
+ \else:
+ \exp_after:wN \__siunitx_peek_false:
+ \fi:
+ }
+\cs_new_protected:Npn \__siunitx_peek_true: { }
+\cs_new_protected:Npn \__siunitx_peek_false: { }
+\cs_new_protected:Npn \__siunitx_print_text_sub_super:n { }
+\cs_new_protected:Npn \__siunitx_print_text_super:n #1 {
+ \tl_set:Nn \l__siunitx_tmpa_tl {#1}
+ \tl_replace_all:Nnn \l__siunitx_tmpa_tl { - }
+ { \textminus }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:N \ensuremath
+ { \sp { \exp_not:N \text { \exp_not:V \l__siunitx_tmpa_tl } } }
+ }
+ \l__siunitx_tmpa_tl
+}
+\keys_define:nn { siunitx } {
+ input-product .tl_set:N = \l__siunitx_input_product_tl,
+ input-quotient .tl_set:N = \l__siunitx_input_quotient_tl,
+}
+\keys_set:nn { siunitx } {
+ input-product = x,
+ input-quotient = /
+}
+\tl_new:N \l__siunitx_number_arg_tl
+\tl_new:N \l__siunitx_number_next_tl
+\tl_new:N \l__siunitx_number_multi_tl
+\tl_new:N \l__siunitx_number_denominator_tl
+\tl_new:N \l__siunitx_number_numerator_tl
+\cs_new_protected:Npn \__siunitx_number_preprocess:n #1 {
+ \__siunitx_number_preprocess_init:
+ \tl_set:Nn \l__siunitx_number_arg_tl {#1}
+ \__siunitx_number_preprocess_product:
+ \tl_if_empty:NT \l__siunitx_number_multi_tl
+ { \__siunitx_number_preprocess_quotient: }
+}
+\cs_generate_variant:Nn \__siunitx_number_preprocess:n { V }
+\cs_new_protected:Npn \__siunitx_number_preprocess_init: {
+ \bool_set_false:N \l__siunitx_error_bool
+ \tl_clear:N \l__siunitx_number_multi_tl
+}
+\cs_new_protected:Npn \__siunitx_number_preprocess_product: {
+ \tl_map_function:NN \l__siunitx_input_product_tl
+ \__siunitx_number_preprocess_product_aux:N
+}
+\cs_new_protected:Npn \__siunitx_number_preprocess_product_aux:N #1 {
+ \tl_if_in:NnT \l__siunitx_number_arg_tl {#1}
+ {
+ \cs_set:Npn \__siunitx_tmp:w ##1 #1 ##2 \q_stop
+ {
+ \tl_set:Nn \l__siunitx_number_arg_tl {##1}
+ \tl_set:Nn \l__siunitx_number_next_tl {##2}
+ \tl_set:Nn \l__siunitx_number_multi_tl { product }
+ }
+ \exp_after:wN \__siunitx_tmp:w \l__siunitx_number_arg_tl \q_stop
+ \tl_if_empty:NT \l__siunitx_number_arg_tl
+ { \__siunitx_error:n { starting-product-token } }
+ \tl_if_empty:NT \l__siunitx_number_next_tl
+ { \__siunitx_error:n { ending-product-token } }
+ \tl_map_break:
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_preprocess_quotient: {
+ \tl_map_function:NN \l__siunitx_input_quotient_tl
+ \__siunitx_number_preprocess_quotient_aux:N
+}
+\cs_new_protected:Npn \__siunitx_number_preprocess_quotient_aux:N #1 {
+ \tl_if_in:NnT \l__siunitx_number_arg_tl {#1}
+ {
+ \cs_set:Npn \__siunitx_tmp:w ##1 #1 ##2 \q_stop
+ {
+ \tl_set:Nn \l__siunitx_number_numerator_tl {##1}
+ \tl_set:Nn \l__siunitx_number_denominator_tl {##2}
+ \tl_set:Nn \l__siunitx_number_multi_tl { quotient }
+ }
+ \exp_after:wN \__siunitx_tmp:w \l__siunitx_number_arg_tl \q_stop
+ \tl_if_empty:NT \l__siunitx_number_numerator_tl
+ { \__siunitx_error:n { starting-quotient-token } }
+ \tl_if_empty:NT \l__siunitx_number_denominator_tl
+ { \__siunitx_error:n { ending-quotient-token } }
+ \tl_if_in:NnT \l__siunitx_number_denominator_tl {#1}
+ { \__siunitx_error:n { duplicate-quotient-token } }
+ \tl_map_break:
+ }
+}
+\tl_const:Nn \c__siunitx_number_part_complex_tl { complex }
+\bool_new:N \l__siunitx_number_in_complex_bool
+\bool_new:N \l__siunitx_number_in_complex_root_bool
+\bool_new:N \l__siunitx_number_in_decimal_bool
+\bool_new:N \l__siunitx_number_in_exponent_bool
+\bool_new:N \l__siunitx_number_in_first_bool
+\bool_new:N \l__siunitx_number_in_sign_bool
+\bool_new:N \l__siunitx_number_in_uncert_bool
+\bool_new:N \l__siunitx_number_in_value_bool
+\prop_new:N \l__siunitx_number_in_prop
+\tl_new:N \l__siunitx_number_parsed_tl
+\tl_new:N \l__siunitx_number_part_tl
+\tl_new:N \l__siunitx_number_part_decimal_tl
+\tl_new:N \l__siunitx_number_part_decimal_marker_tl
+\tl_new:N \l__siunitx_number_part_integer_tl
+\tl_new:N \l__siunitx_number_part_sign_tl
+\tl_new:N \l__siunitx_number_part_uncert_tl
+\int_new:N \l__siunitx_number_mantissa_length_int
+\tl_new:N \l__siunitx_number_uncert_tl
+\int_new:N \l__siunitx_number_uncert_length_int
+\tl_new:N \l__siunitx_input_uncert_sign_tl
+\keys_define:nn { siunitx } {
+ input-close-uncertainty .tl_set:N = \l__siunitx_input_uncert_close_tl ,
+ input-complex-roots .tl_set:N = \l__siunitx_input_complex_tl ,
+ input-comparators .tl_set:N = \l__siunitx_input_comparator_tl ,
+ input-decimal-markers .tl_set:N = \l__siunitx_input_decimal_tl ,
+ input-digits .tl_set:N = \l__siunitx_input_digit_tl ,
+ input-exponent-markers .tl_set:N = \l__siunitx_input_exponent_tl ,
+ input-ignore .tl_set:N = \l__siunitx_input_ignore_tl ,
+ input-open-uncertainty .tl_set:N = \l__siunitx_input_uncert_open_tl ,
+ input-protect-tokens .tl_set:N = \l__siunitx_input_protect_tl ,
+ input-signs .tl_set:N = \l__siunitx_input_sign_tl ,
+ input-symbols .tl_set:N = \l__siunitx_input_symbol_tl ,
+ input-uncertainty-signs .code:n =
+ {
+ \tl_set:Nn \l__siunitx_input_uncert_sign_tl {#1}
+ \tl_map_inline:nn {#1}
+ {
+ \tl_if_in:NnF \l__siunitx_input_sign_tl {##1}
+ { \tl_put_right:Nn \l__siunitx_input_sign_tl {##1} }
+ }
+ } ,
+}
+\keys_set:nn { siunitx } { % (
+ input-close-uncertainty = ),
+ input-complex-roots = ij,
+ input-comparators = {<=>\approx\ge\geq\gg\le\leq\ll\sim},
+ input-decimal-markers = {.,},
+ input-digits = 0123456789,
+ input-exponent-markers = dDeE,
+ input-open-uncertainty = (, % )
+ input-protect-tokens = \approx\dots\ge\geq\gg\le\leq\ll\mp\pi\pm\sim,
+ input-signs = +-\mp\pm,
+ input-symbols = \dots\pi,
+ input-uncertainty-signs = \pm,
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse:n #1 {
+ \tl_if_empty:nF {#1}
+ {
+ \__siunitx_number_in_init:
+ \cs_set_eq:NN \__siunitx_number_in_parse_more:N
+ \__siunitx_number_in_parse_mantissa_aux:N
+ \__siunitx_number_in_parse_aux:n {#1}
+ }
+}
+\cs_generate_variant:Nn \__siunitx_number_in_parse:n { V }
+\group_begin:
+ \char_set_catcode_active:N \~
+ \char_set_catcode_space:N \ %
+ \cs_new_protected:Npn \__siunitx_number_in_parse_aux:n#1%
+ {%
+ \group_begin:
+ \__siunitx_number_in_protect:
+ \cs_set_eq:NN\,\prg_do_nothing:
+ \cs_set_eq:NN~\prg_do_nothing:
+ \tl_set_rescan:Nnx\l__siunitx_number_arg_tl
+ {%
+ \char_set_catcode_ignore:N\ %
+ \char_set_catcode_other:N\,%
+ \char_set_catcode_other:N\.%
+ }%
+ {#1}%
+ \exp_args:NNNV\group_end:
+ \tl_set:Nn\l__siunitx_number_arg_tl\l__siunitx_number_arg_tl
+ \__siunitx_number_in_sign_replace:N\l__siunitx_number_arg_tl
+ \__siunitx_number_in_parse_relation:N\l__siunitx_number_arg_tl
+ \tl_map_function:NN\l__siunitx_number_arg_tl
+ \__siunitx_number_in_parse_loop:N
+ \tl_if_empty:NF\l__siunitx_number_parsed_tl
+ {%
+ \bool_if:NTF\l__siunitx_number_in_uncert_bool
+ {\__siunitx_error:nx{invalid-number}{#1}}%
+ {%
+ \prop_put:NVn \l__siunitx_number_in_prop
+ \l__siunitx_number_part_tl {true}%
+ \bool_if:NTF\l__siunitx_number_in_decimal_bool
+ {%
+ \prop_put:NVV\l__siunitx_number_in_prop
+ \l__siunitx_number_part_decimal_tl
+ \l__siunitx_number_parsed_tl
+ }%
+ {%
+ \prop_put:NVV\l__siunitx_number_in_prop
+ \l__siunitx_number_part_integer_tl
+ \l__siunitx_number_parsed_tl
+ }%
+ }%
+ }%
+ \__siunitx_number_in_check:n {#1}%
+ }
+\group_end:
+\cs_new_protected:Npn \__siunitx_number_in_init: {
+ \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
+ \__siunitx_number_in_parse_mantissa:N
+ \cs_set_eq:NN \__siunitx_number_in_check:n
+ \__siunitx_number_in_check_short:n
+ \tl_clear:N \l__siunitx_number_parsed_tl
+ \prop_clear:N \l__siunitx_number_in_prop
+ \bool_set_false:N \l__siunitx_error_bool
+ \bool_set_false:N \l__siunitx_number_in_complex_bool
+ \bool_set_false:N \l__siunitx_number_in_complex_root_bool
+ \bool_set_false:N \l__siunitx_number_in_exponent_bool
+ \bool_set_false:N \l__siunitx_number_in_uncert_bool
+ \__siunitx_number_in_init_part:n { mantissa }
+}
+\cs_new_protected:Npn \__siunitx_number_in_init_part:n #1 {
+ \bool_set_false:N \l__siunitx_number_in_decimal_bool
+ \bool_set_true:N \l__siunitx_number_in_first_bool
+ \bool_set_false:N \l__siunitx_number_in_sign_bool
+ \bool_set_false:N \l__siunitx_number_in_value_bool
+ \tl_set:Nn \l__siunitx_number_part_tl {#1}
+ \tl_set:Nn \l__siunitx_number_part_decimal_tl { #1 -decimal }
+ \tl_set:Nn \l__siunitx_number_part_decimal_marker_tl
+ { #1 -decimal-marker }
+ \tl_set:Nn \l__siunitx_number_part_integer_tl { #1 -integer }
+ \tl_set:Nn \l__siunitx_number_part_sign_tl { #1 -sign }
+ \tl_set:Nn \l__siunitx_number_part_uncert_tl { #1 -uncertainty }
+}
+\cs_new_protected:Npn \__siunitx_number_in_protect: {
+ \tl_map_function:NN \l__siunitx_input_protect_tl
+ \__siunitx_number_in_protect_aux:N
+}
+\cs_new_protected:Npn \__siunitx_number_in_protect_aux:N #1 {
+ \cs_set_eq:NN #1 \scan_stop:
+}
+\cs_new_protected:Npn \__siunitx_number_in_sign_replace:N #1
+ {
+ \__siunitx_number_in_sign_replace_aux:N #1
+ \__siunitx_number_in_sign_replace_aux:NnN #1
+ { -+ } \mp
+ { +- } \pm
+ { << } \ll
+ { <= } \le
+ { >> } \gg
+ { >= } \ge
+ { ?? } \q_recursion_tail
+ \q_recursion_stop
+ }
+\group_begin:
+ \char_set_catcode_active:N -
+ \cs_new_protected:Npx \__siunitx_number_in_sign_replace_aux:N #1
+ { \tl_replace_all:Nnn #1 { \exp_not:N - } { \token_to_str:N - } }
+\group_end:
+\cs_new_protected:Npn \__siunitx_number_in_sign_replace_aux:NnN #1#2#3
+ {
+ \quark_if_recursion_tail_stop:N #3
+ \tl_replace_all:Nnn #1 {#2} {#3}
+ \__siunitx_number_in_sign_replace_aux:NnN #1
+ }
+\cs_new_protected:Npn \__siunitx_number_in_parse_error:nn #1#2 {
+ \__siunitx_error:nx {#1} { \exp_not:n {#2} }
+ \tl_map_break:
+}
+\cs_generate_variant:Nn \__siunitx_number_in_parse_error:nn { nV }
+\cs_new_protected:Npn \__siunitx_number_in_parse_loop:N #1 { }
+\cs_new_protected:Npn \__siunitx_number_in_parse_more:N #1 { }
+\cs_new_protected:Npn \__siunitx_number_in_parse_relation:N #1 {
+ \exp_after:wN \__siunitx_number_in_parse_relation:w #1 \q_stop #1
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse_relation:w
+ #1#2 \q_stop #3 {
+ \tl_if_in:NnT \l__siunitx_input_comparator_tl {#1}
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { comparator } {#1}
+ \tl_set:Nn #3 {#2}
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse_restricted:N #1 {
+ \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nn
+ { restricted-number } {#1}
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { restricted-number } \l__siunitx_number_arg_tl
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { restricted-number } \l__siunitx_number_arg_tl
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { restricted-number } \l__siunitx_number_arg_tl
+ }
+ {
+ \__siunitx_number_in_parse_error:nn
+ { restricted-number } {#1}
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse_complex:N #1 {
+ \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
+ {
+ \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
+ \__siunitx_number_in_parse_mantissa:N
+ \__siunitx_number_in_exponent:N #1
+ }
+ {
+ \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { misplaced-complex-root-token }
+ \l__siunitx_number_arg_tl
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse_exponent:N #1 {
+ \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nn
+ { duplicate-exponent-token } { \token_to_str:N #1 }
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { invalid-token-in-exponent } \l__siunitx_number_arg_tl
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { invalid-token-in-exponent } \l__siunitx_number_arg_tl
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { invalid-token-in-exponent }
+ \l__siunitx_number_arg_tl
+ }
+ {
+ \__siunitx_number_in_parse_error:nn
+ { invalid-token-in-number } {#1}
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse_mantissa:N #1 {
+ \tl_if_in:NnTF \l__siunitx_input_digit_tl {#1}
+ { \__siunitx_number_in_digit:n {#1} }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_decimal_tl {#1}
+ { \__siunitx_number_in_decimal:N #1 }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
+ { \__siunitx_number_in_sign:N #1 }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_symbol_tl {#1}
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { symbolic }
+ { true }
+ \__siunitx_number_in_digit:n {#1}
+ }
+ {
+ \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
+ { \__siunitx_number_in_parse_more:N #1 }
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse_mantissa_aux:N #1 {
+ \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
+ { \__siunitx_number_in_exponent:N #1 }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
+ { \__siunitx_number_in_uncert_open:N #1 }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nn
+ { misplaced-uncertainty-token } {#1}
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
+ { \__siunitx_number_in_complex:N #1 }
+ {
+ \__siunitx_number_in_parse_error:nn
+ { invalid-token-in-number } {#1}
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse_uncert:N #1 {
+ \tl_if_in:NnTF \l__siunitx_input_digit_tl {#1}
+ { \__siunitx_number_in_digit:n {#1} }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_decimal_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { invalid-token-in-uncertainty }
+ \l__siunitx_number_arg_tl
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
+ {
+ \__siunitx_number_in_parse_error:nV
+ { invalid-token-in-uncertainty }
+ \l__siunitx_number_arg_tl
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_symbol_tl {#1}
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { symbolic }
+ { true }
+ \__siunitx_number_in_digit:n {#1}
+ }
+ {
+ \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
+ {
+ \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl
+ {#1}
+ { \__siunitx_number_in_uncert_close:N #1 }
+ {
+ \__siunitx_number_in_parse_error:nV
+ { invalid-token-in-uncertainty }
+ \l__siunitx_number_arg_tl
+ }
+ }
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_parse_uncert_after:N #1 {
+ \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
+ {
+ \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
+ \__siunitx_number_in_parse_mantissa:N
+ \__siunitx_number_in_exponent:N #1
+ }
+ {
+ \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
+ {
+ \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
+ \__siunitx_number_in_parse_mantissa:N
+ \__siunitx_number_in_sign:N #1
+ }
+ {
+ \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
+ {
+ \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
+ {
+ \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
+ \__siunitx_number_in_parse_mantissa:N
+ \__siunitx_number_in_complex:N #1
+ }
+ {
+ \__siunitx_number_in_parse_error:nV { invalid-number }
+ \l__siunitx_number_arg_tl
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_complex:N #1 {
+ \bool_set_false:N \l__siunitx_number_in_first_bool
+ \bool_if:NTF \l__siunitx_number_in_complex_root_bool
+ {
+ \__siunitx_number_in_parse_error:nn
+ { duplicate-complex-root-token } { \token_to_str:N #1 }
+ }
+ {
+ \cs_set_eq:NN \__siunitx_number_in_check:n
+ \__siunitx_number_in_check_full:n
+ \bool_set_true:N \l__siunitx_number_in_complex_root_bool
+ \prop_put:Nnn \l__siunitx_number_in_prop { complex-root } {#1}
+ \tl_if_empty:NF \l__siunitx_number_parsed_tl
+ {
+ \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
+ \__siunitx_number_in_parse_complex:N
+ }
+ \bool_if:NT \l__siunitx_number_in_decimal_bool
+ {
+ \bool_if:NF \l__siunitx_number_in_complex_bool
+ {
+ \prop_if_in:NnT \l__siunitx_number_in_prop
+ { mantissa-uncertainty }
+ {
+ \__siunitx_number_in_complex_aux:nn
+ { mantissa-decimal } { complex-decimal }
+ \__siunitx_number_in_complex_aux:nn
+ { mantissa-uncertainty } { complex-uncertainty }
+ }
+ \__siunitx_number_in_complex_aux:nn { mantissa-integer }
+ { complex-integer }
+ \__siunitx_number_in_complex_aux:nn
+ { mantissa-decimal-marker } { complex-decimal-marker }
+ \prop_remove:Nn \l__siunitx_number_in_prop { mantissa }
+ \prop_put:Nnn \l__siunitx_number_in_prop { complex }
+ { true }
+ }
+ }
+ \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
+ {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { mantissa-sign }
+ {
+ \__siunitx_number_in_complex_aux:nn { mantissa-sign }
+ { complex-sign }
+ }
+ }
+ \bool_set_true:N \l__siunitx_number_in_complex_bool
+ \bool_set_false:N \l__siunitx_number_in_first_bool
+ \__siunitx_number_in_init_part:n { complex }
+ \prop_if_in:NnT \l__siunitx_number_in_prop
+ { complex-decimal-marker }
+ { \bool_set_true:N \l__siunitx_number_in_decimal_bool }
+ \prop_if_in:NnTF \l__siunitx_number_in_prop
+ { complex-sign }
+ { \bool_set_true:N \l__siunitx_number_in_sign_bool }
+ { \prop_remove:Nn \l__siunitx_number_in_prop { mantissa } }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_complex_aux:nn #1#2 {
+ \prop_get:NnNT \l__siunitx_number_in_prop {#1} \l__siunitx_tmpa_tl
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop {#1}
+ \prop_put:NnV \l__siunitx_number_in_prop {#2} \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_decimal:N #1 {
+ \bool_set_false:N \l__siunitx_number_in_first_bool
+ \bool_if:NTF \l__siunitx_number_in_decimal_bool
+ {
+ \__siunitx_number_in_parse_error:nn { duplicate-decimal-token }
+ {#1}
+ }
+ {
+ \bool_set_true:N \l__siunitx_number_in_decimal_bool
+ \tl_if_empty:NF \l__siunitx_number_parsed_tl
+ {
+ \prop_put:NVn \l__siunitx_number_in_prop
+ \l__siunitx_number_part_tl { true }
+ \prop_put:NVV \l__siunitx_number_in_prop
+ \l__siunitx_number_part_integer_tl
+ \l__siunitx_number_parsed_tl
+ \tl_clear:N \l__siunitx_number_parsed_tl
+ }
+ \prop_put:NVn \l__siunitx_number_in_prop
+ \l__siunitx_number_part_decimal_marker_tl {#1}
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_digit:n #1 {
+ \bool_set_false:N \l__siunitx_number_in_first_bool
+ \bool_if:NTF \l__siunitx_number_in_uncert_bool
+ { \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1} }
+ {
+ \bool_if:NTF \l__siunitx_number_in_decimal_bool
+ {
+ \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1}
+ \str_if_eq:nnF {#1} { 0 }
+ { \bool_set_true:N \l__siunitx_number_in_value_bool }
+ }
+ {
+ \str_if_eq:nnTF {#1} { 0 }
+ {
+ \prop_put:NVn \l__siunitx_number_in_prop
+ \l__siunitx_number_part_tl { true }
+ \prop_put:NVn \l__siunitx_number_in_prop
+ \l__siunitx_number_part_integer_tl { 0 }
+ }
+ { \bool_set_true:N \l__siunitx_number_in_value_bool }
+ \bool_if:NT \l__siunitx_number_in_value_bool
+ { \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1} }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_exponent:N #1 {
+ \bool_if:NTF \l__siunitx_number_in_exponent_bool
+ {
+ \__siunitx_number_in_parse_error:nn { duplicate-exponent-token }
+ { \token_to_str:N #1 }
+ }
+ {
+ \cs_set_eq:NN \__siunitx_number_in_parse_more:N
+ \__siunitx_number_in_parse_exponent:N
+ \tl_if_empty:NF \l__siunitx_number_parsed_tl
+ { \__siunitx_number_in_store: }
+ \bool_set_true:N \l__siunitx_number_in_exponent_bool
+ \__siunitx_number_in_init_part:n { exponent }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_sign:N #1 {
+ \bool_if:NTF \l__siunitx_number_in_first_bool
+ {
+ \bool_set_false:N \l__siunitx_number_in_first_bool
+ \bool_set_true:N \l__siunitx_number_in_sign_bool
+ \prop_put:NVn \l__siunitx_number_in_prop
+ \l__siunitx_number_part_sign_tl {#1}
+ }
+ {
+ \bool_if:NTF \l__siunitx_number_in_exponent_bool
+ {
+ \__siunitx_number_in_parse_error:nn { misplaced-sign-token }
+ {#1}
+ }
+ {
+ \bool_if:NTF \l__siunitx_number_in_complex_bool
+ {
+ \__siunitx_number_in_parse_error:nn
+ { misplaced-sign-token } {#1}
+ }
+ {
+ \tl_if_empty:NF \l__siunitx_number_parsed_tl
+ { \__siunitx_number_in_store: }
+ \cs_set_eq:NN \__siunitx_number_in_check:n
+ \__siunitx_number_in_check_full:n
+ \__siunitx_number_in_init_part:n { complex }
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { complex-sign } {#1}
+ \bool_set_true:N \l__siunitx_number_in_complex_bool
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_uncert_open:N #1 {
+ \bool_set_false:N \l__siunitx_number_in_first_bool
+ \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
+ \__siunitx_number_in_parse_uncert:N
+ \bool_set_true:N \l__siunitx_number_in_uncert_bool
+ \tl_if_empty:NTF \l__siunitx_number_parsed_tl
+ {
+ \prop_if_in:NVF \l__siunitx_number_in_prop
+ \l__siunitx_number_part_integer_tl
+ {
+ \__siunitx_number_in_parse_error:nV { invalid-number }
+ \l__siunitx_number_arg_tl
+ }
+ }
+ { \__siunitx_number_in_store: }
+}
+\cs_new_protected:Npn \__siunitx_number_in_uncert_close:N #1 {
+ \bool_set_false:N \l__siunitx_number_in_uncert_bool
+ \tl_if_empty:NTF \l__siunitx_number_parsed_tl
+ {
+ \__siunitx_number_in_parse_error:nV { empty-uncertainty }
+ \l__siunitx_number_arg_tl
+ }
+ {
+ \prop_put:NVV \l__siunitx_number_in_prop
+ \l__siunitx_number_part_uncert_tl \l__siunitx_number_parsed_tl
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { uncertainty } { true }
+ \tl_clear:N \l__siunitx_number_parsed_tl
+ \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
+ \__siunitx_number_in_parse_uncert_after:N
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_store: {
+ \prop_put:NVn \l__siunitx_number_in_prop \l__siunitx_number_part_tl
+ { true }
+ \bool_if:NTF \l__siunitx_number_in_decimal_bool
+ {
+ \prop_put:NVV \l__siunitx_number_in_prop
+ \l__siunitx_number_part_decimal_tl \l__siunitx_number_parsed_tl
+ }
+ {
+ \prop_put:NVV \l__siunitx_number_in_prop
+ \l__siunitx_number_part_integer_tl \l__siunitx_number_parsed_tl
+ }
+ \tl_clear:N \l__siunitx_number_parsed_tl
+}
+\cs_new_protected:Npn \__siunitx_number_in_check:n #1 { }
+\cs_new_protected:Npn \__siunitx_number_in_check_short:n #1 {
+ \prop_if_in:NVF \l__siunitx_number_in_prop
+ \l__siunitx_number_part_integer_tl
+ {
+ \prop_if_in:NVF \l__siunitx_number_in_prop
+ \l__siunitx_number_part_decimal_tl
+ { \__siunitx_error:nx { invalid-number } {#1} }
+ }
+ \bool_if:NF \l__siunitx_number_in_value_bool
+ {
+ \tl_if_eq:NNF \l__siunitx_number_part_tl
+ \c__siunitx_number_part_complex_tl
+ {
+ \prop_get:NVNT \l__siunitx_number_in_prop
+ \l__siunitx_number_part_sign_tl \l__siunitx_tmpa_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { \l__siunitx_number_part_sign_tl -deleted }
+ \prop_put:NVV \l__siunitx_number_in_prop
+ \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
+ }
+ \prop_remove:NV \l__siunitx_number_in_prop
+ \l__siunitx_number_part_sign_tl
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_check_full:n #1 {
+ \tl_if_eq:NNF \l__siunitx_number_part_tl
+ \c__siunitx_number_part_complex_tl
+ { \__siunitx_number_in_check_short:n {#1} }
+ \bool_if:NF \l__siunitx_number_in_complex_root_bool
+ {
+ \prop_get:NnN \l__siunitx_number_in_prop { complex-sign }
+ \l__siunitx_tmpa_tl
+ \tl_if_in:NVTF \l__siunitx_input_uncert_sign_tl \l__siunitx_tmpa_tl
+ {
+ \prop_if_in:NnTF \l__siunitx_number_in_prop { uncertainty }
+ {
+ \__siunitx_error:nx { misplaced-sign-token }
+ { \exp_not:n {#1} }
+ }
+ { \__siunitx_number_in_complex_to_uncert:n {#1} }
+ }
+ {
+ \__siunitx_error:nx { misplaced-sign-token }
+ { \exp_not:n {#1} }
+ }
+ }
+ \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-sign }
+ \prop_put:NnV \l__siunitx_number_in_prop { complex-sign }
+ \l__siunitx_tmpa_tl
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert:n #1 {
+ \prop_remove:Nn \l__siunitx_number_in_prop { complex }
+ \prop_remove:Nn \l__siunitx_number_in_prop { complex-decimal-marker }
+ \prop_remove:Nn \l__siunitx_number_in_prop { complex-sign }
+ \prop_put:Nnn \l__siunitx_number_in_prop { uncertainty } { true }
+ \prop_get:NnNTF \l__siunitx_number_in_prop { complex-integer }
+ \l__siunitx_number_uncert_tl
+ {
+ \tl_if_single:NTF \l__siunitx_number_uncert_tl
+ {
+ \int_compare:nNnTF \l__siunitx_number_uncert_tl = 0
+ { \__siunitx_number_in_complex_to_uncert_dec:n {#1} }
+ { \__siunitx_number_in_complex_to_uncert_int: }
+ }
+ { \__siunitx_number_in_complex_to_uncert_int: }
+ }
+ { \__siunitx_number_in_complex_to_uncert_dec:n {#1} }
+ \prop_remove:Nn \l__siunitx_number_in_prop { complex-integer }
+ \prop_remove:Nn \l__siunitx_number_in_prop { complex-decimal }
+}
+\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_int: {
+ \prop_get:NnNF \l__siunitx_number_in_prop { complex-decimal }
+ \l__siunitx_tmpa_tl
+ { \tl_clear:N \l__siunitx_tmpa_tl }
+ \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
+ \l__siunitx_tmpb_tl
+ { \tl_clear:N \l__siunitx_tmpb_tl }
+ \__siunitx_number_in_complex_to_uncert_pad:
+}
+\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_dec:n
+ #1
+ {
+ \tl_clear:N \l__siunitx_number_uncert_tl
+ \prop_get:NnNTF \l__siunitx_number_in_prop { complex-decimal }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_get:NnN \l__siunitx_number_in_prop { mantissa-decimal }
+ \l__siunitx_tmpb_tl
+ \quark_if_no_value:NT \l__siunitx_tmpb_tl
+ { \tl_clear:N \l__siunitx_tmpb_tl }
+ \tl_map_function:NN
+ \l__siunitx_tmpa_tl
+ \__siunitx_number_in_complex_to_uncert_dec_loop:N
+ \__siunitx_number_in_complex_to_uncert_pad:
+ }
+ { \__siunitx_error:nx { misplaced-sign-token } { \exp_not:n {#1} } }
+ }
+\cs_new_protected:Npn
+ \__siunitx_number_in_complex_to_uncert_dec_loop:N #1
+ {
+ \str_if_eq:nnTF {#1} { 0 }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { \tl_tail:N \l__siunitx_tmpa_tl }
+ \tl_if_empty:NF \l__siunitx_tmpb_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { \tl_tail:N \l__siunitx_tmpb_tl }
+ }
+ }
+ { \tl_map_break: }
+ }
+\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_pad:
+ {
+ \int_set:Nn \l__siunitx_number_uncert_length_int
+ { \tl_count:N \l__siunitx_tmpa_tl }
+ \int_set:Nn \l__siunitx_number_mantissa_length_int
+ { \tl_count:N \l__siunitx_tmpb_tl }
+ \int_compare:nNnTF
+ { \l__siunitx_number_mantissa_length_int }
+ > { \l__siunitx_number_uncert_length_int }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:V \l__siunitx_tmpa_tl
+ \prg_replicate:nn
+ {
+ \l__siunitx_number_mantissa_length_int
+ - \l__siunitx_number_uncert_length_int
+ }
+ { 0 }
+ }
+ }
+ {
+ \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
+ \l__siunitx_tmpb_tl
+ { \tl_clear:N \l__siunitx_tmpb_tl }
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ {
+ \exp_not:V \l__siunitx_tmpb_tl
+ \prg_replicate:nn
+ {
+ \l__siunitx_number_uncert_length_int
+ - \l__siunitx_number_mantissa_length_int
+ }
+ { 0 }
+ }
+ \tl_if_empty:NF \l__siunitx_tmpb_tl
+ {
+ \prop_put:NnV \l__siunitx_number_in_prop { mantissa-decimal }
+ \l__siunitx_tmpb_tl
+ \prop_if_in:NnF \l__siunitx_number_in_prop
+ { mantissa-decimal-marker }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { mantissa-decimal-marker } { . }
+ }
+ }
+ }
+ \tl_put_right:NV \l__siunitx_number_uncert_tl \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_in_prop { mantissa-uncertainty }
+ \l__siunitx_number_uncert_tl
+ }
+\int_new:N \l__siunitx_round_int
+\tl_new:N \l__siunitx_round_tl
+\bool_new:N \l__siunitx_round_bool
+\tl_new:N \l__siunitx_round_decimal_in_tl
+\tl_new:N \l__siunitx_round_decimal_out_tl
+\tl_new:N \l__siunitx_round_discard_tl
+\tl_new:N \l__siunitx_round_even_bool
+\tl_new:N \l__siunitx_round_integer_in_tl
+\tl_new:N \l__siunitx_round_integer_out_tl
+\bool_new:N \l__siunitx_round_half_up_bool
+\int_new:N \l__siunitx_process_decimal_int
+\int_new:N \l__siunitx_process_uncertainty_int
+\tl_new:N \l__siunitx_uncertainty_decimal_tl
+\tl_new:N \l__siunitx_uncertainty_integer_tl
+\bool_new:N \l__siunitx_process_fixed_bool
+\bool_new:N \l__siunitx_process_engineering_bool
+\bool_new:N \l__siunitx_process_scientific_bool
+\bool_new:N \l__siunitx_process_drop_exponent_bool
+\keys_define:nn { siunitx }
+ {
+ add-decimal-zero .bool_set:N = \l__siunitx_process_decimal_zero_bool,
+ add-integer-zero .bool_set:N = \l__siunitx_process_integer_zero_bool,
+ explicit-sign .tl_set:N = \l__siunitx_process_sign_tl,
+ fixed-exponent .int_set:N = \l__siunitx_process_fixed_int,
+ minimum-integer-digits .int_set:N =
+ \l__siunitx_process_integer_min_int,
+ retain-explicit-plus .bool_set:N = \l__siunitx_process_plus_bool,
+ omit-uncertainty .bool_set:N = \l__siunitx_omit_uncert_bool,
+ retain-unity-mantissa .bool_set:N =
+ \l__siunitx_process_unity_mantissa_bool,
+ retain-zero-exponent .bool_set:N =
+ \l__siunitx_process_zero_exponent_bool,
+ round-half .choice:,
+ round-half / even .code:n =
+ { \bool_set_false:N \l__siunitx_round_half_up_bool },
+ round-half / up .code:n =
+ { \bool_set_true:N \l__siunitx_round_half_up_bool },
+ round-integer-to-decimal .bool_set:N =
+ \l__siunitx_process_int_to_dec_bool,
+ round-minimum .tl_set:N = \l__siunitx_process_round_min_tl,
+ round-mode .choice: ,
+ round-mode / figures .code:n =
+ { \tl_set:Nn \l__siunitx_round_tl { figures } },
+ round-mode / off .code:n = { \tl_clear:N \l__siunitx_round_tl },
+ round-mode / places .code:n =
+ { \tl_set:Nn \l__siunitx_round_tl { places } },
+ round-precision .int_set:N = \l__siunitx_process_precision_int,
+ scientific-notation .choice: ,
+ scientific-notation
+ / false .code:n =
+ {
+ \bool_set_false:N \l__siunitx_process_fixed_bool
+ \bool_set_false:N \l__siunitx_process_engineering_bool
+ \bool_set_false:N \l__siunitx_process_scientific_bool
+ },
+ scientific-notation
+ / engineering .code:n =
+ {
+ \bool_set_false:N \l__siunitx_process_fixed_bool
+ \bool_set_true:N \l__siunitx_process_engineering_bool
+ \bool_set_true:N \l__siunitx_process_scientific_bool
+ },
+ scientific-notation
+ / fixed .code:n =
+ {
+ \bool_set_true:N \l__siunitx_process_fixed_bool
+ \bool_set_false:N \l__siunitx_process_engineering_bool
+ \bool_set_false:N \l__siunitx_process_scientific_bool
+ },
+ scientific-notation
+ / true .code:n =
+ {
+ \bool_set_false:N \l__siunitx_process_fixed_bool
+ \bool_set_false:N \l__siunitx_process_engineering_bool
+ \bool_set_true:N \l__siunitx_process_scientific_bool
+ },
+ zero-decimal-to-integer .bool_set:N =
+ \l__siunitx_zero_decimal_to_integer_bool
+ }
+\keys_set:nn { siunitx }
+ {
+ add-decimal-zero = true,
+ add-integer-zero = true,
+ retain-unity-mantissa = true,
+ round-half = up,
+ round-minimum = 0,
+ round-precision = 2
+ }
+\cs_new_protected:Npn \__siunitx_number_process:
+ {
+ \__siunitx_number_process_sign:
+ \__siunitx_number_process_zero_fill:
+ \__siunitx_number_process_mantissa:
+ \prop_if_in:NnF \l__siunitx_number_in_prop { symbolic }
+ {
+ \bool_if:NTF \l__siunitx_process_fixed_bool
+ { \__siunitx_number_process_fixed: }
+ {
+ \bool_if:NT \l__siunitx_process_scientific_bool
+ { \__siunitx_number_process_scientific: }
+ }
+ \__siunitx_number_process_exponent:
+ \__siunitx_number_process_uncertainty:
+ \bool_if:NT \l__siunitx_exp_to_prefix_bool
+ {
+ \tl_if_empty:NF \l__siunitx_unit_tl
+ { \__siunitx_number_exp_to_prefix: }
+ }
+ \prop_if_in:NnTF \l__siunitx_number_in_prop { uncertainty }
+ {
+ \bool_if:NT \l__siunitx_omit_uncert_bool
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { uncertainty }
+ \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-uncertainty }
+ }
+ }
+ { \__siunitx_number_process_round: }
+ }
+ \__siunitx_number_process_zero_to_integer:
+ \__siunitx_number_process_integer_digits:
+ \bool_if:NT \l__siunitx_process_drop_exponent_bool
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_exponent: {
+ \bool_if:NF \l__siunitx_process_zero_exponent_bool
+ {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
+ {
+ \bool_set_false:N \l__siunitx_tmp_bool
+ \__siunitx_number_process_exponent_aux:n { integer }
+ \bool_if:NF \l__siunitx_tmp_bool
+ { \__siunitx_number_process_exponent_aux:n { decimal } }
+ \bool_if:NF \l__siunitx_tmp_bool
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
+ \prop_remove:Nn \l__siunitx_number_in_prop
+ { exponent-integer }
+ \prop_remove:Nn \l__siunitx_number_in_prop
+ { exponent-decimal }
+ \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { mantissa } { true }
+ \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-integer } { 1 }
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_exponent_aux:n #1 {
+ \prop_get:NnNT \l__siunitx_number_in_prop { exponent- #1 }
+ \l__siunitx_tmpa_tl
+ {
+ \int_compare:nNnF { \l__siunitx_tmpa_tl } = { 0 }
+ { \bool_set_true:N \l__siunitx_tmp_bool }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_figures:n #1
+ {
+ \int_compare:nNnTF \l__siunitx_process_precision_int > 0
+ {
+ \prop_if_in:NnT \l__siunitx_number_in_prop {#1}
+ { \__siunitx_number_process_figures_aux:n {#1} }
+ }
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -sign }
+ \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
+ \bool_if:NF \l__siunitx_process_int_to_dec_bool
+ { \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker } }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_figures_aux:n #1
+ {
+ \__siunitx_number_process_figures_init:n {#1}
+ \__siunitx_number_process_figures_count:n { integer }
+ \__siunitx_number_process_figures_count:n { decimal }
+ \bool_if:NTF \l__siunitx_round_bool
+ {
+ \bool_set_false:N \l__siunitx_round_bool
+ \int_compare:nNnTF
+ \l__siunitx_round_int > \l__siunitx_process_precision_int
+ {
+ \__siunitx_number_process_figures_round:
+ \__siunitx_number_process_round_tidy:n {#1}
+ }
+ { \__siunitx_number_process_figures_pad:n {#1} }
+ }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_figures_init:n #1
+ {
+ \int_zero:N \l__siunitx_round_int
+ \bool_set_false:N \l__siunitx_round_bool
+ \bool_set_false:N \l__siunitx_round_even_bool
+ \prop_get:NnNF \l__siunitx_number_in_prop { #1 -decimal }
+ \l__siunitx_round_decimal_in_tl
+ { \tl_clear:N \l__siunitx_round_decimal_in_tl }
+ \prop_get:NnNF \l__siunitx_number_in_prop { #1 -integer }
+ \l__siunitx_round_integer_in_tl
+ { \tl_clear:N \l__siunitx_round_integer_in_tl }
+ \tl_clear:N \l__siunitx_round_decimal_out_tl
+ \tl_clear:N \l__siunitx_round_integer_out_tl
+ \tl_clear:N \l__siunitx_round_discard_tl
+ }
+\cs_new_protected:Npn \__siunitx_number_process_figures_count:n #1
+ {
+ \tl_if_empty:cF { l__siunitx_round_ #1 _in_tl }
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -uncertainty }
+ { \__siunitx_number_process_figures_count_aux:n {#1} }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_figures_count_aux:n #1
+ {
+ \int_set:Nn \l__siunitx_tmp_int
+ { \tl_head:v { l__siunitx_round_ #1 _in_tl } }
+ \tl_set:cx { l__siunitx_round_ #1 _in_tl }
+ { \tl_tail:v { l__siunitx_round_ #1 _in_tl } }
+ \tl_put_left:cV { l__siunitx_round_ #1 _out_tl } \l__siunitx_tmp_int
+ \bool_if:NF \l__siunitx_round_bool
+ {
+ \int_compare:nNnF \l__siunitx_tmp_int = 0
+ { \bool_set_true:N \l__siunitx_round_bool }
+ }
+ \bool_if:NT \l__siunitx_round_bool
+ { \int_incr:N \l__siunitx_round_int }
+ \tl_if_empty:cTF { l__siunitx_round_ #1 _in_tl }
+ {
+ \tl_set_eq:cc { l__siunitx_round_ #1 _in_tl }
+ { l__siunitx_round_ #1 _out_tl }
+ \tl_clear:c { l__siunitx_round_ #1 _out_tl }
+ }
+ { \__siunitx_number_process_figures_count_aux:n {#1} }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_figures_round:
+ {
+ \int_set:Nn \l__siunitx_round_int
+ { \l__siunitx_round_int - \l__siunitx_process_precision_int }
+ \tl_if_empty:NF \l__siunitx_round_decimal_in_tl
+ { \__siunitx_number_process_figures_round_loop: }
+ \tl_if_empty:NF \l__siunitx_round_integer_in_tl
+ { \__siunitx_number_process_figures_integer: }
+ \bool_if:NT \l__siunitx_round_bool
+ { \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 1 } }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_figures_round_loop:
+ {
+ \__siunitx_number_process_round_decimal:
+ \tl_if_empty:NF \l__siunitx_round_decimal_in_tl
+ { \__siunitx_number_process_figures_round_loop: }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_figures_integer:
+ {
+ \int_compare:nNnT \l__siunitx_round_int > 0
+ { \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 0 } }
+ \int_compare:nNnF \l__siunitx_round_int > 1
+ {
+ \int_set:Nn \l__siunitx_tmp_int
+ { \tl_head:N \l__siunitx_round_integer_in_tl }
+ \__siunitx_number_process_round_up:
+ \int_compare:nNnTF \l__siunitx_round_int = 1
+ {
+ \int_compare:nNnT \l__siunitx_tmp_int > 4
+ { \bool_set_true:N \l__siunitx_round_bool }
+ }
+ {
+ \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
+ {
+ \bool_set_true:N \l__siunitx_round_bool
+ \int_zero:N \l__siunitx_tmp_int
+ }
+ \tl_put_left:NV \l__siunitx_round_integer_out_tl
+ \l__siunitx_tmp_int
+ }
+ }
+ \int_decr:N \l__siunitx_round_int
+ \tl_set:Nx \l__siunitx_round_integer_in_tl
+ { \tl_tail:N \l__siunitx_round_integer_in_tl }
+ \tl_if_empty:NF \l__siunitx_round_integer_in_tl
+ { \__siunitx_number_process_figures_integer: }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_figures_pad:n #1 {
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 -integer }
+ \l__siunitx_round_integer_in_tl
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal }
+ \l__siunitx_round_decimal_in_tl
+ \int_set:Nn \l__siunitx_round_int
+ { \l__siunitx_process_precision_int - \l__siunitx_round_int }
+ \__siunitx_number_process_pad:n {#1}
+}
+\cs_new_protected:Npn \__siunitx_number_process_fixed: {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { complex }
+ {
+ \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-integer }
+ \l__siunitx_tmpa_tl
+ { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
+ \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
+ \l__siunitx_tmpb_tl
+ { \tl_clear:N \l__siunitx_tmpb_tl }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { { \l__siunitx_tmpa_tl } { \l__siunitx_tmpb_tl } }
+ \prop_get:NnNF \l__siunitx_number_in_prop { exponent-integer }
+ \l__siunitx_tmpb_tl
+ { \tl_set:Nn \l__siunitx_tmpb_tl { 0 } }
+ \group_begin:
+ \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
+ \l__siunitx_tmpa_tl
+ {
+ \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
+ }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_tmpb_tl
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { \l__siunitx_tmpa_tl { \l__siunitx_tmpb_tl } }
+ \exp_after:wN \__siunitx_number_process_fixed_aux_i:nnn
+ \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_fixed_aux_i:nnn #1#2#3
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { exponent } { true }
+ \int_compare:nNnTF \l__siunitx_process_fixed_int > 0
+ {
+ \prop_put:NnV \l__siunitx_number_in_prop { exponent-integer }
+ \l__siunitx_process_fixed_int
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
+ }
+ {
+ \prop_put:Nnx \l__siunitx_number_in_prop { exponent-integer }
+ { \int_eval:n { - \l__siunitx_process_fixed_int } }
+ \prop_put:Nnn \l__siunitx_number_in_prop { exponent-sign } { - }
+ }
+ \__siunitx_number_process_fixed_aux_ii:nnn {#1} {#2} {#3}
+ }
+\cs_new_protected:Npn \__siunitx_number_process_fixed_aux_ii:nnn #1#2#3
+ {
+ \bool_set_true:N \l__siunitx_tmp_bool
+ \tl_map_inline:nn {#1#2}
+ {
+ \str_if_eq:nnF {##1} { 0 }
+ {
+ \bool_set_false:N \l__siunitx_tmp_bool
+ \tl_map_break:
+ }
+ }
+ \bool_if:NF \l__siunitx_tmp_bool
+ { \__siunitx_number_process_fixed_aux_iii:nnn {#1} {#2} {#3} }
+ }
+\cs_new_protected:Npn
+ \__siunitx_number_process_fixed_aux_iii:nnn #1#2#3 {
+ \int_compare:nNnTF {#3} > { \l__siunitx_process_fixed_int }
+ { \__siunitx_number_process_fixed_large:nnn {#1} {#2} {#3} }
+ {
+ \int_compare:nNnTF {#3} < { \l__siunitx_process_fixed_int }
+ { \__siunitx_number_process_fixed_small:nnn {#1} {#2} {#3} }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { mantissa-integer } {#1}
+ \tl_if_empty:nTF {#2}
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop
+ { mantissa-decimal }
+ \prop_remove:Nn \l__siunitx_number_in_prop
+ { mantissa-decimal-marker }
+ }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { mantissa-decimal } {#2}
+ \prop_if_in:NnF \l__siunitx_number_in_prop
+ { mantissa-decimal-marker }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { mantissa-decimal-marker } { . }
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_fixed_large:nnn #1
+ {
+ \__siunitx_number_if_zero:nTF {#1}
+ { \__siunitx_number_process_fixed_large_aux:nnn { } }
+ { \__siunitx_number_process_fixed_large_aux:nnn {#1} }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_fixed_large_aux:nnn #1#2#3
+ {
+ \cs_set_protected:Npn
+ \__siunitx_number_process_fixed_large_aux:w ##1##2 \q_stop
+ {
+ \tl_if_empty:nTF {##2}
+ {
+ \int_compare:nNnTF
+ { #3 - 1 } = { \l__siunitx_process_fixed_int }
+ {
+ \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
+ { } { #3 - 1 }
+ }
+ {
+ \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
+ { 0 } { #3 - 1 }
+ }
+ }
+ {
+ \__siunitx_number_if_zero:nTF {#1}
+ {
+ \__siunitx_number_process_fixed_aux_ii:nnn {##1} {##2}
+ { #3 - 1 }
+ }
+ {
+ \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
+ {##2} { #3 - 1 }
+ }
+ }
+ }
+ \tl_if_empty:nTF {#2}
+ { \__siunitx_number_process_fixed_aux_ii:nnn { #1 0 } { } { #3 - 1 } }
+ { \__siunitx_number_process_fixed_large_aux:w #2 \q_stop }
+}
+\cs_new_protected:Npn \__siunitx_number_process_fixed_large_aux:w
+ { }
+\cs_new_protected:Npn
+ \__siunitx_number_process_fixed_small:nnn #1#2#3 {
+ \cs_set_protected:Npn
+ \__siunitx_number_process_fixed_small_aux:w ##1##2 \q_stop ##3
+ {
+ \tl_if_empty:nTF {##2}
+ {
+ \tl_if_empty:nTF {##3}
+ {
+ \__siunitx_number_process_fixed_aux_ii:nnn { 0 }
+ { ##1 #2 } { #3 + 1 }
+ }
+ {
+ \__siunitx_number_process_fixed_aux_ii:nnn {##3}
+ { ##1 #2 } { #3 + 1 }
+ }
+ }
+ {
+ \__siunitx_number_process_fixed_small_aux:w ##2 \q_stop
+ { ##3 ##1 }
+ }
+ }
+ \__siunitx_number_process_fixed_small_aux:w #1 \q_stop { }
+}
+\cs_new_protected:Npn \__siunitx_number_process_fixed_small_aux:w
+ { }
+\cs_new_protected:Npn \__siunitx_number_process_integer_digits: {
+ \int_compare:nNnT \l__siunitx_process_integer_min_int > 0
+ {
+ \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
+ \l__siunitx_tmpa_tl
+ {
+ \int_set:Nn \l__siunitx_tmp_int
+ {
+ \l__siunitx_process_integer_min_int
+ - \tl_count:N \l__siunitx_tmpa_tl
+ }
+ \int_compare:nNnT \l__siunitx_tmp_int > 0
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \prg_replicate:nn { \l__siunitx_tmp_int } { 0 }
+ \exp_not:V \l__siunitx_tmpa_tl
+ }
+ \prop_put:NnV \l__siunitx_number_in_prop
+ { mantissa-integer } \l__siunitx_tmpa_tl
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_mantissa: {
+ \bool_if:NF \l__siunitx_process_unity_mantissa_bool
+ {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
+ {
+ \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
+ \l__siunitx_tmpa_tl
+ {
+ \tl_if_eq:NNT \c__siunitx_unity_tl \l__siunitx_tmpa_tl
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop
+ { mantissa-decimal-marker }
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop
+ { mantissa }
+ \prop_remove:Nn \l__siunitx_number_in_prop
+ { mantissa-integer }
+ }
+ }
+ }
+ }
+ }
+}
+\tl_const:Nn \c__siunitx_unity_tl { 1 }
+\cs_new_protected:Npn \__siunitx_number_process_pad:n #1 {
+ \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal }
+ \l__siunitx_tmpa_tl
+ {
+ \int_while_do:nNnn { \l__siunitx_round_int } > { 0 }
+ {
+ \tl_put_right:Nn \l__siunitx_tmpa_tl { 0 }
+ \int_decr:N \l__siunitx_round_int
+ }
+ \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
+ \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_places:n #1
+ {
+ \prop_if_in:NnT \l__siunitx_number_in_prop {#1}
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -uncertainty }
+ { \__siunitx_number_process_places_aux_i:n {#1} }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_places_aux_i:n #1
+ {
+ \int_compare:nNnTF \l__siunitx_process_precision_int = 0
+ { \__siunitx_number_process_places_none:n {#1} }
+ {
+ \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal }
+ \l__siunitx_tmpa_tl
+ {
+ \tl_if_empty:NT \l__siunitx_tmpa_tl
+ { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
+ \__siunitx_number_process_places_aux_i:TF
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { #1 -decimal } { }
+ \int_set:Nn \l__siunitx_round_int
+ { \l__siunitx_process_precision_int }
+ \__siunitx_number_process_pad:n {#1}
+ }
+ {
+ \int_set:Nn \l__siunitx_round_int
+ { \tl_count:N \l__siunitx_tmpa_tl }
+ \__siunitx_number_process_places_aux_ii:n {#1}
+ }
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_places_aux_i:TF
+ {
+ \bool_set_true:N \l__siunitx_tmp_bool
+ \tl_map_inline:Nn \l__siunitx_tmpa_tl
+ {
+ \int_compare:nNnF {##1} = 0
+ {
+ \bool_set_false:N \l__siunitx_tmp_bool
+ \tl_map_break:
+ }
+ }
+ \bool_if:NTF \l__siunitx_tmp_bool
+ }
+\cs_new_protected:Npn \__siunitx_number_process_places_none:n #1
+ {
+ \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal } \l__siunitx_tmpa_tl
+ {
+ \int_compare:nNnTF { \tl_head:N \l__siunitx_tmpa_tl } > 4
+ {
+ \prop_get:NnNTF \l__siunitx_number_in_prop { #1 -integer }
+ \l__siunitx_tmpb_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { \int_eval:n { \l__siunitx_tmpb_tl + 1 } }
+ \bool_if:NF \l__siunitx_round_half_up_bool
+ {
+ \bool_lazy_and:nnT
+ {
+ \int_compare_p:nNn
+ { 0 \tl_head:N \l__siunitx_tmpa_tl } = 5
+ }
+ {
+ \int_compare_p:nNn
+ { 0 \tl_tail:N \l__siunitx_tmpa_tl } = 0
+ }
+ {
+ \int_if_odd:nT \l__siunitx_tmpb_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { \int_eval:n { \l__siunitx_tmpb_tl - 1 } }
+ }
+ }
+ }
+ }
+ { \tl_set:Nn \l__siunitx_tmpb_tl { 1 } }
+ \prop_put:NnV \l__siunitx_number_in_prop
+ { #1 -integer } \l__siunitx_tmpb_tl
+ }
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -integer }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { #1 -integer } { 0 }
+ }
+ }
+ }
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
+ \bool_if:NF \l__siunitx_process_int_to_dec_bool
+ { \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker } }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_places_aux_ii:n #1
+ {
+ \int_sub:Nn \l__siunitx_round_int
+ { \l__siunitx_process_precision_int }
+ \int_compare:nNnTF \l__siunitx_round_int < 0
+ {
+ \int_set:Nn \l__siunitx_round_int { - \l__siunitx_round_int }
+ \__siunitx_number_process_pad:n {#1}
+ }
+ {
+ \__siunitx_number_process_places_init:n {#1}
+ \__siunitx_number_process_places_loop:n {#1}
+ \__siunitx_number_process_round_tidy:n {#1}
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_places_init:n #1
+ {
+ \prop_get:NnNF \l__siunitx_number_in_prop { #1 -integer }
+ \l__siunitx_round_integer_in_tl
+ { \tl_clear:N \l__siunitx_round_integer_in_tl }
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal }
+ \l__siunitx_round_decimal_in_tl
+ \tl_reverse:N \l__siunitx_round_integer_in_tl
+ \tl_reverse:N \l__siunitx_round_decimal_in_tl
+ \tl_clear:N \l__siunitx_round_integer_out_tl
+ \tl_clear:N \l__siunitx_round_decimal_out_tl
+ \tl_clear:N \l__siunitx_round_discard_tl
+ \bool_set_false:N \l__siunitx_round_bool
+ \bool_set_false:N \l__siunitx_round_even_bool
+ }
+\cs_new_protected:Npn \__siunitx_number_process_places_loop:n #1
+ {
+ \tl_if_empty:NTF \l__siunitx_round_decimal_in_tl
+ {
+ \tl_if_empty:NF \l__siunitx_round_integer_in_tl
+ {
+ \__siunitx_number_process_places_integer:n {#1}
+ \__siunitx_number_process_places_loop:n {#1}
+ }
+ \bool_if:NT \l__siunitx_round_bool
+ {
+ \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 1 }
+ \bool_set_false:N \l__siunitx_round_bool
+ }
+ }
+ {
+ \__siunitx_number_process_round_decimal:
+ \__siunitx_number_process_places_loop:n {#1}
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_places_integer:n #1
+ {
+ \int_set:Nn \l__siunitx_tmp_int
+ { \tl_head:N \l__siunitx_round_integer_in_tl }
+ \tl_set:Nx \l__siunitx_round_integer_in_tl
+ { \tl_tail:N \l__siunitx_round_integer_in_tl }
+ \__siunitx_number_process_round_up:
+ \bool_set_false:N \l__siunitx_round_bool
+ \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
+ {
+ \int_zero:N \l__siunitx_tmp_int
+ \bool_set_true:N \l__siunitx_round_bool
+ }
+ \tl_put_left:NV \l__siunitx_round_integer_out_tl \l__siunitx_tmp_int
+ }
+\cs_new_protected:Npn \__siunitx_number_process_round:
+ {
+ \tl_if_empty:NF \l__siunitx_round_tl
+ {
+ \bool_if:NT \l__siunitx_process_int_to_dec_bool
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa-decimal }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-decimal }
+ { 0 }
+ }
+ \prop_if_in:NnF \l__siunitx_number_in_prop
+ { mantissa-decimal-marker }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { mantissa-decimal-marker } { . }
+ }
+ }
+ \clist_map_function:nc { mantissa , complex }
+ { __siunitx_number_process_ \l__siunitx_round_tl :n }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_round_decimal:
+ {
+ \int_compare:nNnF \l__siunitx_round_int > 1
+ { \__siunitx_number_process_round_decimal_aux: }
+ \tl_put_right:Nx \l__siunitx_round_discard_tl
+ { \tl_head:N \l__siunitx_round_decimal_in_tl }
+ \tl_set:Nx \l__siunitx_round_decimal_in_tl
+ { \tl_tail:N \l__siunitx_round_decimal_in_tl }
+ \int_decr:N \l__siunitx_round_int
+ }
+\cs_new_protected:Npn \__siunitx_number_process_round_decimal_aux:
+ {
+ \int_set:Nn \l__siunitx_tmp_int
+ { \tl_head:N \l__siunitx_round_decimal_in_tl }
+ \__siunitx_number_process_round_up:
+ \int_compare:nNnTF \l__siunitx_round_int = 1
+ {
+ \int_compare:nNnT \l__siunitx_tmp_int > 4
+ {
+ \bool_set_true:N \l__siunitx_round_bool
+ \bool_if:NF \l__siunitx_round_half_up_bool
+ {
+ \int_compare:nNnT
+ { \l__siunitx_round_discard_tl \int_use:N \l__siunitx_tmp_int } = 5
+ { \bool_set_true:N \l__siunitx_round_even_bool }
+ }
+ }
+ }
+ {
+ \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
+ {
+ \bool_set_true:N \l__siunitx_round_bool
+ \int_zero:N \l__siunitx_tmp_int
+ }
+ \tl_put_left:NV \l__siunitx_round_decimal_out_tl
+ \l__siunitx_tmp_int
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_round_up:
+ {
+ \bool_if:NT \l__siunitx_round_bool
+ {
+ \bool_if:NTF \l__siunitx_round_even_bool
+ {
+ \bool_set_false:N \l__siunitx_round_even_bool
+ \int_if_even:nF \l__siunitx_tmp_int
+ { \int_incr:N \l__siunitx_tmp_int }
+ }
+ { \int_incr:N \l__siunitx_tmp_int }
+ }
+ \bool_set_false:N \l__siunitx_round_bool
+ }
+\cs_new_protected:Npn \__siunitx_number_process_round_tidy:n #1
+ {
+ \bool_lazy_and:nnTF
+ { \__siunitx_number_if_zero_p:V \l__siunitx_round_integer_out_tl }
+ { \__siunitx_number_if_zero_p:V \l__siunitx_round_decimal_out_tl }
+ {
+ \str_if_eq:VnTF \l__siunitx_process_round_min_tl { 0 }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
+ \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
+ \l__siunitx_round_decimal_out_tl
+ }
+ {
+ \exp_after:wN \__siunitx_number_process_round_tidy_aux:w
+ \l__siunitx_process_round_min_tl . . \q_stop {#1}
+ }
+ }
+ {
+ \prop_put:NnV \l__siunitx_number_in_prop { #1 -integer }
+ \l__siunitx_round_integer_out_tl
+ \tl_if_empty:NTF \l__siunitx_round_decimal_out_tl
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker }
+ }
+ {
+ \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
+ \l__siunitx_round_decimal_out_tl
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_round_tidy_aux:w
+ #1 . #2 . #3 \q_stop #4
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { comparator } { < }
+ \prop_put:Nnn \l__siunitx_number_in_prop { #4 -integer } {#1}
+ \tl_if_empty:nTF {#2}
+ { \prop_remove:Nn \l__siunitx_number_in_prop { #4 -decimal } }
+ { \prop_put:Nnn \l__siunitx_number_in_prop { #4 -decimal } {#2} }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_scientific: {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { complex }
+ {
+ \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-integer }
+ \l__siunitx_tmpa_tl
+ { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
+ \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
+ \l__siunitx_tmpb_tl
+ { \tl_clear:N \l__siunitx_tmpb_tl }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { { \l__siunitx_tmpa_tl } { \l__siunitx_tmpb_tl } }
+ \prop_get:NnNF \l__siunitx_number_in_prop { exponent-integer }
+ \l__siunitx_tmpb_tl
+ { \tl_set:Nn \l__siunitx_tmpb_tl { 0 } }
+ \group_begin:
+ \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
+ \l__siunitx_tmpa_tl
+ { \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_tmpb_tl
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { \l__siunitx_tmpa_tl { \l__siunitx_tmpb_tl } }
+ \exp_after:wN \__siunitx_number_process_scientific_aux_i:nnn
+ \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_scientific_aux_i:nnn #1#2#3
+ {
+ \bool_set_true:N \l__siunitx_tmp_bool
+ \tl_map_inline:nn {#1#2}
+ {
+ \str_if_eq:nnF {##1} { 0 }
+ {
+ \bool_set_false:N \l__siunitx_tmp_bool
+ \tl_map_break:
+ }
+ }
+ \bool_if:NF \l__siunitx_tmp_bool
+ { \__siunitx_number_process_scientific_aux_ii:nnn {#1} {#2} {#3} }
+ }
+\cs_new_protected:Npn
+ \__siunitx_number_process_scientific_aux_ii:nnn #1#2#3 {
+ \int_compare:nNnTF { \tl_count:n {#1} } > 1
+ { \__siunitx_number_process_scientific_large:nnn {#1} {#2} {#3} }
+ {
+ \__siunitx_number_if_zero:nTF {#1}
+ {
+ \__siunitx_number_process_scientific_small:wn
+ #2 \q_stop {#3}
+ }
+ {
+ \bool_if:NTF \l__siunitx_process_engineering_bool
+ { \__siunitx_number_process_scientific_engineering:nnn }
+ { \__siunitx_number_process_scientific_store:nnn }
+ {#1} {#2} {#3}
+ }
+
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_scientific_large:nnn #1#2#3
+ {
+ \cs_set_protected:Npn \__siunitx_number_process_scientific_large_loop:nNN
+ ##1##2##3
+ {
+ \quark_if_recursion_tail_stop_do:Nn ##3
+ {
+ \__siunitx_number_process_scientific_aux_ii:nnn {##1} { ##2 #2 }
+ { #3 + 1 }
+ }
+ \__siunitx_number_process_scientific_large_loop:nNN { ##1 ##2 } ##3
+ }
+ \__siunitx_number_process_scientific_large_loop:nNN { } #1
+ \q_recursion_tail \q_recursion_stop
+ }
+\cs_new_protected:Npn
+ \__siunitx_number_process_scientific_small:wn #1#2 \q_stop #3
+ { \__siunitx_number_process_scientific_aux_ii:nnn {#1} {#2} { #3 - 1 } }
+\cs_new_protected:Npn
+ \__siunitx_number_process_scientific_store:nnn #1#2#3
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-integer } {#1}
+ \tl_if_empty:nTF {#2}
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-decimal }
+ \prop_remove:Nn \l__siunitx_number_in_prop
+ { mantissa-decimal-marker }
+ }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { mantissa-decimal } {#2}
+ \prop_if_in:NnF \l__siunitx_number_in_prop
+ { mantissa-decimal-marker }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop
+ { mantissa-decimal-marker } { . }
+ }
+ }
+ \int_compare:nNnTF {#3} = { 0 }
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
+ }
+ {
+ \prop_put:Nnn \l__siunitx_number_in_prop { exponent } { true }
+ \int_compare:nNnTF {#3} > { 0 }
+ {
+ \int_set:Nn \l__siunitx_tmp_int {#3}
+ \prop_put:NnV \l__siunitx_number_in_prop
+ { exponent-integer } \l__siunitx_tmp_int
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
+ }
+ {
+ \int_set:Nn \l__siunitx_tmp_int { 0 - (#3) }
+ \prop_put:NnV \l__siunitx_number_in_prop
+ { exponent-integer } \l__siunitx_tmp_int
+ \prop_put:Nnn \l__siunitx_number_in_prop { exponent-sign }
+ { - }
+ }
+ }
+ }
+\cs_new_protected:Npn
+ \__siunitx_number_process_scientific_engineering:nnn #1#2#3
+ {
+ \use:c
+ {
+ __siunitx_number_process_scientific_engineering_
+ \int_compare:nNnTF {#3} < { 0 }
+ {
+ \int_case:nnF { \int_mod:nn { 0 - (#3) } { 3 } }
+ {
+ { 1 } { 2 }
+ { 2 } { 1 }
+ }
+ { 0 }
+ }
+ { \int_mod:nn {#3} { 3 } }
+ :nnn
+ }
+ {#1} {#2} {#3}
+ }
+\cs_new_eq:cN
+ { __siunitx_number_process_scientific_engineering_0:nnn }
+ \__siunitx_number_process_scientific_store:nnn
+\cs_new_protected:cpn
+ { __siunitx_number_process_scientific_engineering_1:nnn } #1#2#3
+ {
+ \tl_if_empty:nTF {#2}
+ {
+ \__siunitx_number_process_scientific_store:nnn { #1 0 } { }
+ { #3 - 1 }
+ }
+ {
+ \use:c
+ { __siunitx_number_process_scientific_engineering_1:nw }
+ {#1} #2 \q_stop {#3}
+ }
+ }
+\cs_new_protected:cpn
+ { __siunitx_number_process_scientific_engineering_1:nw }
+ #1#2#3 \q_stop #4
+ {
+ \__siunitx_number_process_scientific_store:nnn
+ {#1#2} {#3} { #4 - 1 }
+ }
+\cs_new_protected:cpn
+ { __siunitx_number_process_scientific_engineering_2:nnn } #1#2#3
+ {
+ \tl_if_empty:nTF {#2}
+ {
+ \__siunitx_number_process_scientific_store:nnn { #1 00 } { }
+ { #3 - 2 }
+ }
+ {
+ \use:c
+ { __siunitx_number_process_scientific_engineering_2_i:nw }
+ {#1} #2 \q_stop {#3}
+ }
+ }
+\cs_new_protected:cpn
+ { __siunitx_number_process_scientific_engineering_2_i:nw }
+ #1#2#3 \q_stop #4
+ {
+ \tl_if_empty:nTF {#3}
+ {
+ \__siunitx_number_process_scientific_store:nnn { #1#2 0 } { }
+ { #4 - 2 }
+ }
+ {
+ \use:c
+ { __siunitx_number_process_scientific_engineering_2_ii:nw }
+ {#1#2} #3 \q_stop {#4}
+ }
+ }
+\cs_new_protected:cpn
+ { __siunitx_number_process_scientific_engineering_2_ii:nw }
+ #1#2#3 \q_stop #4
+ {
+ \__siunitx_number_process_scientific_store:nnn { #1#2 } {#3}
+ { #4 - 2 }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_sign: {
+ \bool_if:NF \l__siunitx_process_plus_bool
+ {
+ \prop_if_in:NnTF \l__siunitx_number_in_prop { mantissa-sign }
+ { \__siunitx_number_process_sign_plus:n { mantissa } }
+ {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { complex-sign }
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
+ { \__siunitx_number_process_sign_plus:n { complex } }
+ }
+ }
+ \prop_if_in:NnT \l__siunitx_number_in_prop { exponent-sign }
+ { \__siunitx_number_process_sign_plus:n { exponent } }
+ }
+ \tl_if_empty:NF \l__siunitx_process_sign_tl
+ {
+ \__siunitx_number_process_sign_add:n { mantissa }
+ \prop_if_in:NnTF \l__siunitx_number_in_prop { complex }
+ { \__siunitx_number_process_sign_add:n { complex } }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_sign_add:n #1 {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -sign }
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -had-sign }
+ {
+ \prop_get:NnN \l__siunitx_number_in_prop {#1}
+ \l__siunitx_tmpa_tl
+ \tl_if_empty:NTF \l__siunitx_tmpa_tl
+ {
+ \prop_put:NnV \l__siunitx_number_in_prop { sign }
+ \l__siunitx_process_sign_tl
+ }
+ {
+ \prop_put:NnV \l__siunitx_number_in_prop { #1 -sign }
+ \l__siunitx_process_sign_tl
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_sign_plus:n #1 {
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 -sign }
+ \l__siunitx_tmpa_tl
+ \tl_if_eq:NNT \c__siunitx_plus_tl \l__siunitx_tmpa_tl
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -sign }
+ \prop_put:Nnn \l__siunitx_number_in_prop { #1 -had-sign } { true }
+ }
+}
+\tl_const:Nn \c__siunitx_plus_tl { + }
+\cs_new_protected:Npn \__siunitx_number_process_uncertainty: {
+ \clist_map_function:nN { mantissa , complex }
+ \__siunitx_number_process_uncertainty_aux:n
+}
+\cs_new_protected:Npn
+ \__siunitx_number_process_uncertainty_aux:n #1 {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { #1 -uncertainty }
+ {
+ \prop_if_in:NnTF \l__siunitx_number_in_prop { #1 -decimal-marker }
+ { \__siunitx_number_process_uncertainty_decimal:n {#1} }
+ { \__siunitx_number_process_uncertainty_integer:n {#1} }
+ }
+}
+\cs_new_protected:Npn
+ \__siunitx_number_process_uncertainty_decimal:n #1 {
+ \__siunitx_number_process_uncertainty_count:nn {#1} { decimal }
+ \__siunitx_number_process_uncertainty_count:nn {#1} { uncertainty }
+ \tl_clear:N \l__siunitx_uncertainty_decimal_tl
+ \tl_clear:N \l__siunitx_uncertainty_integer_tl
+ \int_compare:nNnTF
+ { \l__siunitx_process_uncertainty_int } >
+ { \l__siunitx_process_decimal_int }
+ { \__siunitx_number_process_uncertainty_separate: }
+ { \__siunitx_number_process_uncertainty_pad: }
+ \tl_if_empty:NF \l__siunitx_uncertainty_integer_tl
+ {
+ \prop_put:NnV \l__siunitx_number_in_prop
+ { #1 -uncertainty-integer }
+ \l__siunitx_uncertainty_integer_tl
+ }
+ \prop_put:NnV \l__siunitx_number_in_prop { #1 -uncertainty-decimal }
+ \l__siunitx_uncertainty_decimal_tl
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal-marker }
+ \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_in_prop
+ { #1 -uncertainty-decimal-marker } \l__siunitx_tmpa_tl
+}
+\cs_new_protected:Npn
+ \__siunitx_number_process_uncertainty_count:nn #1#2 {
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 - #2 }
+ \l__siunitx_tmpa_tl
+ \int_set:cn { l__siunitx_process_ #2 _int }
+ { \tl_count:N \l__siunitx_tmpa_tl }
+}
+\cs_new_protected:Npn \__siunitx_number_process_uncertainty_pad: {
+ \int_while_do:nNnn
+ { \l__siunitx_process_uncertainty_int } <
+ { \l__siunitx_process_decimal_int }
+ {
+ \tl_put_right:Nn \l__siunitx_uncertainty_decimal_tl {0}
+ \int_incr:N \l__siunitx_process_uncertainty_int
+ }
+ \tl_put_right:NV \l__siunitx_uncertainty_decimal_tl
+ \l__siunitx_tmpa_tl
+}
+\cs_new_protected:Npn
+ \__siunitx_number_process_uncertainty_separate: {
+ \tl_map_function:NN \l__siunitx_tmpa_tl
+ \__siunitx_number_process_uncertainty_separate_aux:N
+}
+\cs_new_protected:Npn
+ \__siunitx_number_process_uncertainty_separate_aux:N #1 {
+ \int_compare:nNnTF
+ { \l__siunitx_process_uncertainty_int } >
+ { \l__siunitx_process_decimal_int }
+ { \tl_put_right:Nn \l__siunitx_uncertainty_integer_tl {#1} }
+ { \tl_put_right:Nn \l__siunitx_uncertainty_decimal_tl {#1} }
+ \int_decr:N \l__siunitx_process_uncertainty_int
+}
+\cs_new_protected:Npn
+ \__siunitx_number_process_uncertainty_integer:n #1 {
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 -uncertainty }
+ \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_in_prop { #1 -uncertainty-integer }
+ \l__siunitx_tmpa_tl
+}
+\cs_new_protected:Npn \__siunitx_number_process_zero_fill: {
+ \__siunitx_number_process_zero_fill_aux:n { integer }
+ \__siunitx_number_process_zero_fill_aux:n { decimal }
+}
+\cs_new:Npn \__siunitx_number_process_zero_fill_aux:n #1 {
+ \bool_if:cT { l__siunitx_process_ #1 _zero_bool }
+ {
+ \__siunitx_number_process_zero_fill_aux:nn { mantissa } {#1}
+ \__siunitx_number_process_zero_fill_aux:nn { complex } {#1}
+ \__siunitx_number_process_zero_fill_aux:nn { exponent } {#1}
+ }
+}
+\cs_new_protected:Npn
+ \__siunitx_number_process_zero_fill_aux:nn #1#2 {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { #1 -decimal-marker }
+ {
+ \prop_if_in:NnF \l__siunitx_number_in_prop { #1 - #2 }
+ { \prop_put:Nnn \l__siunitx_number_in_prop { #1 - #2 } { 0 } }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_process_zero_to_integer:
+ {
+ \bool_if:NT \l__siunitx_zero_decimal_to_integer_bool
+ {
+ \__siunitx_number_process_zero_to_integer_aux:n { mantissa }
+ \__siunitx_number_process_zero_to_integer_aux:n { complex }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_process_zero_to_integer_aux:n #1
+ {
+ \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal } \l__siunitx_tmpa_tl
+ {
+ \bool_set_true:N \l__siunitx_tmp_bool
+ \tl_map_inline:Nn \l__siunitx_tmpa_tl
+ {
+ \str_if_eq:nnF {##1} { 0 }
+ {
+ \bool_set_false:N \l__siunitx_tmp_bool
+ \tl_map_break:
+ }
+ }
+ \bool_if:NT \l__siunitx_tmp_bool
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker }
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_exp_to_prefix:
+ {
+ \prop_set_eq:NN \l__siunitx_unit_prop \l__siunitx_unit_saved_prop
+ \prop_get:NnNT \l__siunitx_number_in_prop { exponent-integer }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
+ \l__siunitx_tmpb_tl
+ { \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
+ \prop_if_in:NnT \l__siunitx_unit_prop { per-1 }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { \int_eval:n { - \l__siunitx_tmpa_tl } }
+ }
+ \prop_get:NnNT \l__siunitx_unit_prop { prefix-1 } \l__siunitx_tmpb_tl
+ {
+ \prop_remove:Nn \l__siunitx_unit_prop { prefix-1 }
+ \prop_remove:Nn \l__siunitx_unit_prop { prefix-symbol-1 }
+ \prop_get:NVN \l__siunitx_prefix_forward_prop \l__siunitx_tmpb_tl
+ \l__siunitx_tmpb_tl
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { \int_eval:n { \l__siunitx_tmpa_tl + \l__siunitx_tmpb_tl } }
+ }
+ \prop_get:NnNT \l__siunitx_unit_prop { power-1 } \l__siunitx_tmpb_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { \int_eval:n { \l__siunitx_tmpa_tl / \l__siunitx_tmpb_tl } }
+ }
+ \prop_get:NVNTF \l__siunitx_prefix_reverse_prop \l__siunitx_tmpa_tl
+ \l__siunitx_tmpb_tl
+ {
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
+ \use:c
+ {
+ __siunitx_ \exp_after:wN \token_to_str:N \l__siunitx_tmpb_tl
+ _function:w
+ }
+ \prop_get:NnN \l__siunitx_unit_prop { total-units } \l__siunitx_tmpa_tl
+ \int_set:Nn \l__siunitx_unit_int \l__siunitx_tmpa_tl
+ \cs_set_eq:NN \__siunitx_pm: \pm
+ \__siunitx_unit_format:
+ \cs_set_eq:NN \pm \__siunitx_pm:
+ }
+ {
+ \msg_error:nnx { siunitx } { non-convertible-exponent }
+ { \l__siunitx_tmpa_tl }
+ }
+ }
+ }
+\prop_new:N \l__siunitx_number_out_prop
+\tl_new:N \l__siunitx_group_sep_tl
+\tl_new:N \l__siunitx_output_decimal_tl
+\bool_new:N \l__siunitx_complex_after_bool
+\bool_new:N \l__siunitx_group_decimal_bool
+\bool_new:N \l__siunitx_group_integer_bool
+\keys_define:nn { siunitx } {
+ bracket-negative-numbers .bool_set:N =
+ \l__siunitx_negative_bracket_bool ,
+ bracket-numbers .bool_set:N = \l__siunitx_brackets_bool,
+ close-bracket .tl_set:N = \l__siunitx_bracket_close_tl,
+ complex-root-position .choice:,
+ complex-root-position
+ / after-number .code:n =
+ { \bool_set_true:N \l__siunitx_complex_after_bool } ,
+ complex-root-position
+ / before-number .code:n =
+ { \bool_set_false:N \l__siunitx_complex_after_bool } ,
+ copy-complex-root .bool_set:N =
+ \l__siunitx_output_complex_copy_bool,
+ copy-decimal-marker .bool_set:N =
+ \l__siunitx_output_decimal_copy_bool,
+ exponent-base .tl_set:N = \l__siunitx_exponent_base_tl,
+ exponent-product .tl_set:N =
+ \l__siunitx_exponent_product_tl,
+ group-decimal-digits .meta:n = { group-digits = decimal },
+ group-digits .choice: ,
+ group-digits /
+ decimal .code:n =
+ {
+ \bool_set_true:N \l__siunitx_group_decimal_bool
+ \bool_set_false:N \l__siunitx_group_integer_bool
+ },
+ group-digits /
+ false .code:n =
+ {
+ \bool_set_false:N \l__siunitx_group_decimal_bool
+ \bool_set_false:N \l__siunitx_group_integer_bool
+ },
+ group-digits /
+ integer .code:n =
+ {
+ \bool_set_false:N \l__siunitx_group_decimal_bool
+ \bool_set_true:N \l__siunitx_group_integer_bool
+ },
+ group-digits /
+ true .code:n =
+ {
+ \bool_set_true:N \l__siunitx_group_decimal_bool
+ \bool_set_true:N \l__siunitx_group_integer_bool
+ },
+ group-digits .default:n = true ,
+ group-four-digits .choice:,
+ group-four-digits /
+ false .meta:n = { group-minimum-digits = 5 },
+ group-four-digits /
+ true .meta:n = { group-minimum-digits = 4 },
+ group-four-digits .default:n = true,
+ group-integer-digits .meta:n = { group-digits = integer },
+ group-minimum-digits .int_set:N = \l__siunitx_group_min_int,
+ group-separator .code:n =
+ { \tl_set:Nn \l__siunitx_group_sep_tl { {#1} } },
+ negative-color .tl_set:N = \l__siunitx_negative_color_tl,
+ open-bracket .tl_set:N = \l__siunitx_bracket_open_tl,
+ output-close-uncertainty .tl_set:N =
+ \l__siunitx_output_uncert_close_tl,
+ output-complex-root .tl_set:N = \l__siunitx_output_complex_tl ,
+ output-decimal-marker .code:n =
+ { \tl_set:Nn \l__siunitx_output_decimal_tl { {#1} } },
+ output-exponent-marker .tl_set:N = \l__siunitx_output_exponent_tl,
+ output-open-uncertainty .tl_set:N =
+ \l__siunitx_output_uncert_open_tl,
+ separate-uncertainty .bool_set:N = \l__siunitx_uncert_sep_bool,
+ tight-spacing .bool_set:N = \l__siunitx_tight_bool,
+ uncertainty-separator .tl_set:N = \l__siunitx_uncert_sep_tl,
+}
+\keys_set:nn { siunitx }
+ {
+ bracket-numbers = true , % (
+ close-bracket = ) ,
+ complex-root-position = after-number ,
+ copy-decimal-marker = false ,
+ exponent-base = 10 ,
+ exponent-product = \times ,
+ group-digits = true ,
+ group-minimum-digits = 5 ,
+ group-separator = \, ,
+ open-bracket = ( , % ) (
+ output-close-uncertainty = ) ,
+ output-complex-root = \ensuremath { \mathrm { i } } ,
+ output-decimal-marker = . ,
+ output-open-uncertainty = ( % )
+ }
+\cs_new_protected:Npn \__siunitx_number_format: {
+ \prop_if_empty:NF \l__siunitx_number_in_prop
+ {
+ \prop_clear:N \l__siunitx_number_out_prop
+ \__siunitx_number_format_reassemble:
+ \__siunitx_number_format_complex:
+ \__siunitx_number_format_sign:n { mantissa }
+ \__siunitx_number_format_sign:n { exponent }
+ \__siunitx_number_format_relation:
+ \__siunitx_number_format_color:
+ \__siunitx_number_format_final:
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_brackets:n #1 {
+ \bool_if:NT \l__siunitx_brackets_bool
+ {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -bracket }
+ {
+ \__siunitx_number_format_brackets_aux:n {#1}
+ \prop_remove:Nn \l__siunitx_number_out_prop { #1 -bracket }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_brackets_aux:n #1 {
+ \prop_get:NnNF \l__siunitx_number_out_prop { #1 -result }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
+ }
+ \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_open_tl
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_close_tl
+ \str_if_eq:nnTF {#1} { result }
+ { \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl }
+ {
+ \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
+ \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_color: {
+ \tl_if_empty:NF \l__siunitx_negative_color_tl
+ {
+ \__siunitx_number_format_color_aux:n { mantissa-sign }
+ \__siunitx_number_format_color_aux:n { sign }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_color_aux:n #1 {
+ \prop_get:NnNT \l__siunitx_number_in_prop {#1} \l__siunitx_tmpa_tl
+ {
+ \str_if_eq:VnT \l__siunitx_tmpa_tl { - }
+ {
+ \prop_put:NnV \l__siunitx_number_out_prop { color }
+ \l__siunitx_negative_color_tl
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_complex: {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { complex-root }
+ {
+ \prop_if_in:NnTF \l__siunitx_number_out_prop { complex }
+ {
+ \__siunitx_number_format_brackets:n { complex }
+ \__siunitx_number_format_complex_aux:n { complex }
+ \__siunitx_number_format_complex_aux:n { complex-result }
+ \prop_if_in:NnT \l__siunitx_number_out_prop
+ { complex-uncertainty }
+ {
+ \__siunitx_number_format_complex_aux:n
+ { complex-uncertainty }
+ }
+ }
+ {
+ \prop_put:NnV \l__siunitx_number_out_prop { complex }
+ \l__siunitx_output_complex_tl
+ }
+ \__siunitx_number_format_join_complex:
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_complex_aux:n #1 {
+ \bool_if:NTF \l__siunitx_output_complex_copy_bool
+ {
+ \prop_get:NnN \l__siunitx_number_in_prop { complex-root }
+ \l__siunitx_tmpa_tl
+ }
+ { \tl_set_eq:NN \l__siunitx_tmpa_tl \l__siunitx_output_complex_tl }
+ \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
+ \bool_if:NTF \l__siunitx_complex_after_bool
+ { \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
+ { \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
+ \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
+}
+\cs_new_protected:Npn \__siunitx_number_format_copy:n #1 {
+ \prop_get:NnN \l__siunitx_number_in_prop {#1} \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
+}
+\cs_new_protected:Npn \__siunitx_number_format_copy:nn #1#2 {
+ \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_out_prop {#2} \l__siunitx_tmpa_tl
+}
+\cs_new_protected:Npn \__siunitx_number_format_final: {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { complex }
+ {
+ \prop_if_in:NnF \l__siunitx_number_out_prop { mantissa-result }
+ {
+ \__siunitx_number_format_copy:nn { complex }
+ { mantissa-result }
+ }
+ }
+ \prop_if_in:NnTF \l__siunitx_number_out_prop { exponent }
+ {
+ \__siunitx_number_format_final_exponent:
+ \prop_if_in:NnTF \l__siunitx_number_out_prop { mantissa-result }
+ { \__siunitx_number_format_final_combined: }
+ { \__siunitx_number_format_final_exponent_only: }
+ }
+ { \__siunitx_number_format_copy:nn { mantissa-result } { result } }
+ \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-bracket }
+ {
+ \prop_put:Nnn \l__siunitx_number_out_prop { result-bracket }
+ { true }
+ \prop_remove:Nn \l__siunitx_number_out_prop { mantissa-bracket }
+ }
+ \prop_if_in:NnT \l__siunitx_number_out_prop { comparator }
+ {
+ \__siunitx_number_format_brackets:n { result }
+ \prop_get:NnN \l__siunitx_number_out_prop { comparator }
+ \l__siunitx_tmpa_tl
+ \prop_get:NnN \l__siunitx_number_out_prop { result }
+ \l__siunitx_tmpb_tl
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:N \mathord
+ \exp_not:V \l__siunitx_tmpa_tl
+ \exp_not:V \l__siunitx_tmpb_tl
+ }
+ \prop_put:NnV \l__siunitx_number_out_prop { result }
+ \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_final_combined: {
+ \__siunitx_number_format_brackets:n { mantissa }
+ \prop_get:NnN \l__siunitx_number_out_prop { mantissa-result }
+ \l__siunitx_tmpa_tl
+ \tl_if_empty:NT \l__siunitx_output_exponent_tl
+ {
+ \tl_put_right:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:N \ensuremath
+ {
+ \bool_if:NTF \l__siunitx_tight_bool
+ { { \exp_not:V \l__siunitx_exponent_product_tl } }
+ { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
+ }
+ }
+ }
+ \prop_get:NnN \l__siunitx_number_out_prop { exponent-result }
+ \l__siunitx_tmpb_tl
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { result }
+ \l__siunitx_tmpa_tl
+ \prop_put:Nnn \l__siunitx_number_out_prop
+ { result-bracket-exponent } { true }
+}
+\cs_new_protected:Npn \__siunitx_number_format_final_exponent: {
+ \prop_get:NnN \l__siunitx_number_out_prop { exponent }
+ \l__siunitx_tmpa_tl
+ \tl_if_empty:NTF \l__siunitx_output_exponent_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { ^ { \exp_not:V \l__siunitx_tmpa_tl } }
+ \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_exponent_base_tl
+ }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:V \l__siunitx_output_exponent_tl
+ \exp_not:N \mathord
+ \exp_not:V \l__siunitx_tmpa_tl
+ }
+ }
+ \prop_put:NnV \l__siunitx_number_out_prop { exponent-result }
+ \l__siunitx_tmpa_tl
+}
+\cs_new_protected:Npn
+ \__siunitx_number_format_final_exponent_only: {
+ \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_get:NnN \l__siunitx_number_out_prop { exponent-result }
+ \l__siunitx_tmpb_tl
+ \__siunitx_tl_put_left_math:NV \l__siunitx_tmpb_tl
+ \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { exponent-result }
+ \l__siunitx_tmpb_tl
+ }
+ \__siunitx_number_format_copy:nn { exponent-result } { result }
+}
+\cs_new_protected:Npn \__siunitx_number_format_group:n #1 {
+ \__siunitx_number_format_group_aux:nn {#1} { integer }
+ \__siunitx_number_format_group_aux:nn {#1} { decimal }
+ \prop_if_in:NnTF \l__siunitx_number_out_prop { #1 -integer }
+ { \__siunitx_number_format_copy:nn { #1 -integer } {#1} }
+ { \tl_clear:N \l__siunitx_tmpa_tl }
+ \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal-marker }
+ \l__siunitx_tmpb_tl
+ {
+ \bool_if:NTF \l__siunitx_output_decimal_copy_bool
+ { \tl_set:Nx \l__siunitx_tmpb_tl { { \l__siunitx_tmpb_tl } } }
+ {
+ \tl_set_eq:NN \l__siunitx_tmpb_tl
+ \l__siunitx_output_decimal_tl
+ }
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { #1 -decimal-marker }
+ \l__siunitx_tmpb_tl
+ \prop_get:NnNF \l__siunitx_number_out_prop { #1 -decimal }
+ \l__siunitx_tmpb_tl
+ { \tl_clear:N \l__siunitx_tmpb_tl }
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_group_aux:nn #1#2 {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { #1 - #2 }
+ {
+ \bool_if:cTF { l__siunitx_group_ #2 _bool }
+ { \__siunitx_number_format_group:nn {#1} {#2} }
+ { \__siunitx_number_format_copy:n { #1 - #2 } }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_group:nn #1#2
+ {
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 - #2 } \l__siunitx_tmpa_tl
+ \int_compare:nNnTF
+ { \tl_count:N \l__siunitx_tmpa_tl } < \l__siunitx_group_min_int
+ { \__siunitx_number_format_copy:n { #1 - #2 } }
+ {
+ \tl_clear:N \l__siunitx_tmpb_tl
+ \use:c { __siunitx_number_format_group_ #2 : }
+ \prop_put:NnV \l__siunitx_number_out_prop { #1 - #2 } \l__siunitx_tmpb_tl
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_format_group_decimal: {
+ \tl_if_empty:NF \l__siunitx_tmpa_tl
+ {
+ \exp_after:wN \__siunitx_number_format_group_decimal_aux:NNNN
+ \l__siunitx_tmpa_tl { } { } { }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_group_decimal_aux:NNNN
+ #1#2#3#4 {
+ \tl_if_empty:nTF {#2}
+ { \tl_put_right:Nn \l__siunitx_tmpb_tl {#1} }
+ {
+ \tl_if_empty:nTF {#3}
+ { \tl_put_right:Nn \l__siunitx_tmpb_tl { #1 #2 } }
+ {
+ \tl_put_right:Nn \l__siunitx_tmpb_tl { #1 #2 #3 }
+ \tl_if_empty:nF {#4}
+ {
+ \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_group_sep_tl
+ \__siunitx_number_format_group_decimal_aux:NNNN #4
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_group_integer: {
+ \tl_if_empty:NF \l__siunitx_tmpa_tl
+ {
+ \__siunitx_number_format_group_integer_setup:V \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_group_integer_setup:n #1 {
+ \__siunitx_number_format_group_integer_setup_aux:NNNN
+ { } #1 { } { } { }
+}
+\cs_generate_variant:Nn \__siunitx_number_format_group_integer_setup:n
+ { V }
+\cs_new_protected:Npn
+ \__siunitx_number_format_group_integer_setup_aux:NNNN #1#2#3#4 {
+ \tl_if_empty:nTF {#2}
+ { \__siunitx_number_format_group_integer_aux:NNNN #1 \q_nil }
+ {
+ \tl_if_empty:nTF {#3}
+ {
+ \__siunitx_number_format_group_integer_aux:NNNN { } { } #1#2
+ \q_nil
+ }
+ {
+ \tl_if_empty:nTF {#4}
+ {
+ \__siunitx_number_format_group_integer_aux:NNNN { } #1#2#3
+ \q_nil
+ }
+ {
+ \__siunitx_number_format_group_integer_setup_aux:NNNN
+ {#1#2#3#4}
+ }
+ }
+ }
+}
+\cs_new_protected:Npn
+ \__siunitx_number_format_group_integer_aux:NNNN #1#2#3#4 {
+ \tl_put_right:Nn \l__siunitx_tmpb_tl {#1#2#3}
+ \quark_if_nil:nF {#4}
+ {
+ \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_group_sep_tl
+ \__siunitx_number_format_group_integer_aux:NNNN #4
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_join_complex: {
+ \__siunitx_number_format_sign_complex:
+ \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
+ {
+ \__siunitx_number_format_brackets:n { mantissa }
+ \prop_get:NnN \l__siunitx_number_out_prop { mantissa-result }
+ \l__siunitx_tmpa_tl
+ \prop_get:NnNF \l__siunitx_number_out_prop { complex-result }
+ \l__siunitx_tmpb_tl
+ {
+ \prop_get:NnN \l__siunitx_number_out_prop { complex }
+ \l__siunitx_tmpb_tl
+ }
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { mantissa-result }
+ \l__siunitx_tmpa_tl
+ \prop_put:Nnn \l__siunitx_number_out_prop { mantissa-bracket }
+ { true }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_join_uncert: {
+ \__siunitx_number_format_join_uncert:n { mantissa }
+ \__siunitx_number_format_join_uncert:n { complex }
+}
+\cs_new_protected:Npn \__siunitx_number_format_join_uncert:n #1 {
+ \prop_get:NnNT \l__siunitx_number_out_prop {#1}
+ \l__siunitx_tmpa_tl
+ {
+ \prop_get:NnNTF \l__siunitx_number_out_prop { #1 -uncertainty }
+ \l__siunitx_tmpb_tl
+ {
+ \bool_if:NT \l__siunitx_uncert_sep_bool
+ { \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpb_tl }
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
+ \l__siunitx_tmpa_tl
+ \prop_put:Nnn \l__siunitx_number_out_prop { #1 -bracket }
+ { true }
+ }
+ { \__siunitx_number_format_copy:nn {#1} { #1 -result } }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_join_uncert_pm:N #1
+ {
+ \bool_if:NTF \l__siunitx_tight_bool
+ { \tl_put_left:Nn #1 { \ensuremath { { \pm } } } }
+ { \tl_put_left:Nn #1 { \ensuremath { { } \pm { } } } }
+ }
+\cs_new_protected:Npn \__siunitx_number_format_reassemble: {
+ \prop_if_in:NnT \l__siunitx_number_in_prop { mantissa }
+ {
+ \__siunitx_number_format_group:n { mantissa }
+ \__siunitx_number_format_uncertainty:n { mantissa }
+ }
+ \prop_if_in:NnT \l__siunitx_number_in_prop { complex }
+ {
+ \__siunitx_number_format_group:n { complex }
+ \__siunitx_number_format_uncertainty:n { complex }
+ }
+ \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
+ { \__siunitx_number_format_group:n { exponent } }
+}
+\cs_new_protected:Npn \__siunitx_number_format_relation: {
+ \prop_get:NnNT \l__siunitx_number_in_prop { comparator }
+ \l__siunitx_tmpa_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:N \ensuremath
+ { \exp_not:V \l__siunitx_tmpa_tl }
+ }
+ \prop_put:NnV \l__siunitx_number_out_prop { comparator }
+ \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_sign:n #1 {
+ \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
+ {
+ \prop_get:NnNT \l__siunitx_number_in_prop { #1 -sign }
+ \l__siunitx_tmpa_tl
+ {
+ \bool_if:NTF \l__siunitx_negative_bracket_bool
+ {
+ \str_if_eq:VnTF \l__siunitx_tmpa_tl { - }
+ { \__siunitx_number_format_sign_negative_brackets:n {#1} }
+ { \__siunitx_number_format_sign_aux:n {#1} }
+ }
+ { \__siunitx_number_format_sign_aux:n {#1} }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_sign_aux:n #1 {
+ \tl_clear:N \l__siunitx_tmpb_tl
+ \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { #1 -sign }
+ \l__siunitx_tmpb_tl
+ \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
+ \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
+ \prop_get:NnNT \l__siunitx_number_out_prop { #1 -result }
+ \l__siunitx_tmpa_tl
+ {
+ \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
+ \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn
+ \__siunitx_number_format_sign_negative_brackets:n #1
+ {
+ \__siunitx_number_format_brackets_aux:n {#1}
+ \prop_get:NnNT \l__siunitx_number_out_prop { #1 }
+ \l__siunitx_tmpa_tl
+ {
+ \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_open_tl
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_close_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { #1 }
+ \l__siunitx_tmpa_tl
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_format_sign_complex: {
+ \__siunitx_number_format_sign_complex:n { complex }
+ \__siunitx_number_format_sign_complex:n { complex-result }
+}
+\cs_new_protected:Npn \__siunitx_number_format_sign_complex:n #1 {
+ \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
+ {
+ \prop_get:NnNT \l__siunitx_number_in_prop { complex-sign }
+ \l__siunitx_tmpa_tl
+ {
+ \bool_if:NTF \l__siunitx_tight_bool
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { \exp_not:N \mathord \exp_not:V \l__siunitx_tmpa_tl }
+ }
+ {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { { } \exp_not:V \l__siunitx_tmpa_tl { } }
+ }
+ }
+ \tl_clear:N \l__siunitx_tmpb_tl
+ \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_out_prop { complex-sign }
+ \l__siunitx_tmpb_tl
+ \prop_get:NnN \l__siunitx_number_out_prop {#1}
+ \l__siunitx_tmpa_tl
+ \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \prop_put:NnV \l__siunitx_number_out_prop {#1}
+ \l__siunitx_tmpa_tl
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_format_uncertainty:n #1 {
+ \prop_if_in:NnTF \l__siunitx_number_in_prop { #1 -uncertainty }
+ {
+ \bool_if:NTF \l__siunitx_uncert_sep_bool
+ { \__siunitx_number_format_uncertainty_sep:n {#1} }
+ { \__siunitx_number_format_uncertainty_joined:n {#1} }
+ \__siunitx_number_format_join_uncert:
+ }
+ { \__siunitx_number_format_copy:nn {#1} { #1 -result } }
+}
+\cs_new_protected:Npn
+ \__siunitx_number_format_uncertainty_joined:n #1 {
+ \prop_get:NnN \l__siunitx_number_in_prop { #1 -uncertainty }
+ \l__siunitx_tmpa_tl
+ \prop_remove:Nn \l__siunitx_number_in_prop { #1 -uncertainty }
+ \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_output_uncert_open_tl
+ \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_uncert_sep_tl
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_output_uncert_close_tl
+ \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
+ \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
+ \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
+}
+\cs_new_protected:Npn
+ \__siunitx_number_format_uncertainty_sep:n #1 {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -integer }
+ {
+ \prop_if_in:NnF \l__siunitx_number_out_prop
+ { #1 -uncertainty-integer }
+ {
+ \prop_put:Nnn \l__siunitx_number_out_prop
+ { #1 -uncertainty-integer } { 0 }
+ }
+ }
+ \__siunitx_number_format_group:n { #1 -uncertainty }
+ \prop_put:NnV \l__siunitx_number_out_prop { #1 -uncertainty }
+ \l__siunitx_tmpa_tl
+}
+\tl_new:N \l__siunitx_number_out_tl
+\tl_new:N \l__siunitx_number_out_saved_tl
+\tl_new:N \l__siunitx_number_fraction_tl
+\bool_new:N \l__siunitx_number_compound_bool
+\tl_new:N \l__siunitx_quotient_mode_tl
+\cs_new_protected:Npn \__siunitx_fraction:nn { }
+\keys_define:nn { siunitx } {
+ fraction-function .code:n =
+ { \cs_set_protected:Npn \__siunitx_fraction:nn {#1} },
+ output-product .tl_set:N = \l__siunitx_output_product_tl,
+ output-quotient .tl_set:N = \l__siunitx_output_quotient_tl,
+ parse-numbers .bool_set:N = \l__siunitx_number_parse_bool,
+ quotient-mode .choice:,
+ quotient-mode / fraction .code:n =
+ { \tl_set:Nn \l__siunitx_quotient_mode_tl { fraction } },
+ quotient-mode / symbol .code:n =
+ { \tl_set:Nn \l__siunitx_quotient_mode_tl { symbol } },
+}
+\keys_set:nn { siunitx } {
+ fraction-function = \frac ,
+ output-product = \times ,
+ output-quotient = / ,
+ parse-numbers = true ,
+ quotient-mode = symbol
+}
+\cs_new_protected:Npn \__siunitx_number_output:n #1 {
+ \tl_clear:N \l__siunitx_unit_tl
+ \tl_clear:N \l__siunitx_preunit_tl
+ \__siunitx_combined_output:n {#1}
+}
+\cs_generate_variant:Nn \__siunitx_number_output:n { V }
+\cs_new_protected:Npn \__siunitx_number_output_bracket: {
+ \bool_if:NF \l__siunitx_error_bool
+ {
+ \bool_if:NT \l__siunitx_number_compound_bool
+ { \__siunitx_number_format_brackets:n { result } }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_output_color: {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { color }
+ {
+ \prop_get:NnN \l__siunitx_number_out_prop { color }
+ \l__siunitx_number_color_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_output_parse:n #1 {
+ \__siunitx_number_preprocess:n {#1}
+ \bool_if:NF \l__siunitx_error_bool
+ {
+ \tl_if_empty:NTF \l__siunitx_number_multi_tl
+ { \__siunitx_number_output_parse_aux: }
+ {
+ \use:c
+ { __siunitx_number_output_ \l__siunitx_number_multi_tl : }
+ }
+ }
+}
+\cs_generate_variant:Nn \__siunitx_number_output_parse:n { V }
+\cs_new_protected:Npn \__siunitx_number_output_parse_aux: {
+ \__siunitx_number_in_parse:V \l__siunitx_number_arg_tl
+ \bool_if:NF \l__siunitx_error_bool
+ {
+ \__siunitx_number_process:
+ \__siunitx_number_format:
+ \__siunitx_number_output_color:
+ \bool_if:NTF \l__siunitx_brackets_bool
+ { \__siunitx_number_output_single: }
+ {
+ \prop_if_in:NnTF \l__siunitx_number_out_prop
+ { result-bracket }
+ { \__siunitx_number_output_parts: }
+ { \__siunitx_number_output_single: }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_output_parts: {
+ \bool_lazy_and:nnTF
+ { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
+ { \tl_if_empty_p:N \l__siunitx_unit_tl }
+ { \__siunitx_number_output_single: }
+ { \__siunitx_number_output_parts_aux: }
+}
+\cs_new_protected:Npn \__siunitx_number_output_parts_aux: {
+ \bool_if:NTF \l__siunitx_multi_repeat_bool
+ {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-result }
+ {
+ \__siunitx_number_output_parts_aux:n { mantissa }
+ \__siunitx_number_output_parts_aux:n { complex }
+ }
+ \prop_get:NnNT \l__siunitx_number_out_prop { exponent-result }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-result }
+ {
+ \tl_put_left:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:N \ensuremath
+ {
+ \bool_if:NTF \l__siunitx_tight_bool
+ { { \exp_not:V \l__siunitx_exponent_product_tl } }
+ { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
+ }
+ }
+ \prop_put:NnV \l__siunitx_number_out_prop { exponent }
+ \l__siunitx_tmpa_tl
+ }
+ \__siunitx_number_output_parts_print:n { exponent }
+ }
+ }
+ { \__siunitx_number_output_single: }
+}
+\cs_new_protected:Npn \__siunitx_number_output_parts_aux:n #1 {
+ \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
+ { \__siunitx_number_output_parts_print:n {#1} }
+ \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -uncertainty }
+ {
+ \bool_if:NTF \l__siunitx_tight_bool
+ { \__siunitx_print:nn { number } { \ensuremath { { \pm } } } }
+ { \__siunitx_print:nn { number } { \ensuremath { { } \pm { } } } }
+ \__siunitx_number_output_parts_print:n { #1 -uncertainty }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_output_parts_print:n #1 {
+ \__siunitx_unit_output_pre_print:
+ \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
+ \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
+ \__siunitx_unit_output_print:
+}
+\cs_new_protected:Npn \__siunitx_number_output_product: {
+ \bool_if:NTF \l__siunitx_product_brackets_bool
+ {
+ \bool_lazy_and:nnTF
+ { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
+ { \tl_if_empty_p:N \l__siunitx_unit_tl }
+ { \__siunitx_number_output_product_aux: }
+ { \__siunitx_number_output_product_brackets: }
+ }
+ {
+ \bool_if:NTF \l__siunitx_product_repeat_bool
+ { \__siunitx_number_output_product_aux: }
+ {
+ \__siunitx_unit_output_pre_print:
+ \tl_set_eq:NN \l__siunitx_unit_saved_tl \l__siunitx_unit_tl
+ \tl_clear:N \l__siunitx_pre_unit_tl
+ \tl_clear:N \l__siunitx_unit_tl
+ \group_begin:
+ \__siunitx_number_output_product_aux:
+ \group_end:
+ \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_saved_tl
+ \__siunitx_unit_output_print:
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_output_product_brackets: {
+ \__siunitx_unit_output_pre_print:
+ \__siunitx_print:nV { number } \l__siunitx_bracket_open_tl
+ \nobreak
+ \tl_set_eq:NN \l__siunitx_unit_saved_tl \l__siunitx_unit_tl
+ \tl_clear:N \l__siunitx_pre_unit_tl
+ \tl_clear:N \l__siunitx_unit_tl
+ \__siunitx_number_output_product_aux:
+ \nobreak
+ \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_saved_tl
+ \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl
+ \__siunitx_unit_output_print:
+}
+\cs_new_protected:Npn \__siunitx_number_output_product_aux: {
+ \bool_set_true:N \l__siunitx_number_compound_bool
+ \__siunitx_number_preprocess:V \l__siunitx_number_arg_tl
+ \bool_if:NF \l__siunitx_error_bool
+ {
+ \tl_if_empty:NTF \l__siunitx_number_multi_tl
+ { \__siunitx_number_output_parse_aux: }
+ { \__siunitx_number_output_quotient: }
+ \tl_if_empty:NF \l__siunitx_number_next_tl
+ {
+ \bool_if:NTF \l__siunitx_tight_bool
+ {
+ \__siunitx_print:nn { number }
+ { \ensuremath { \l__siunitx_output_product_tl } }
+ }
+ {
+ \__siunitx_print:nn { number }
+ { \ensuremath { { } \l__siunitx_output_product_tl { } } }
+ }
+ \__siunitx_number_output_parse:V \l__siunitx_number_next_tl
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_number_output_quotient: {
+ \use:c
+ { __siunitx_number_output_quotient_ \l__siunitx_quotient_mode_tl : }
+}
+\cs_new_protected:Npn \__siunitx_number_output_quotient_fraction: {
+ \bool_set_false:N \l__siunitx_number_compound_bool
+ \__siunitx_number_output_quotient_aux_i:
+ \tl_set:Nx \l__siunitx_number_out_tl
+ { { \exp_not:V \l__siunitx_number_numerator_tl } }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { { \exp_not:V \l__siunitx_number_denominator_tl } }
+ \tl_put_right:NV \l__siunitx_number_out_tl \l__siunitx_tmpa_tl
+ \tl_put_left:Nn \l__siunitx_number_out_tl { \__siunitx_fraction:nn }
+ \tl_set:Nx \l__siunitx_number_out_tl
+ {
+ \exp_not:N \ensuremath
+ { \exp_not:V \l__siunitx_number_out_tl }
+ }
+ \__siunitx_number_output_single_aux:
+}
+\cs_new_protected:Npn \__siunitx_number_output_quotient_symbol: {
+ \bool_set_true:N \l__siunitx_number_compound_bool
+ \__siunitx_number_output_quotient_aux_i:
+ \tl_set_eq:NN \l__siunitx_number_out_tl
+ \l__siunitx_number_numerator_tl
+ \tl_put_right:NV \l__siunitx_number_out_tl \l__siunitx_output_quotient_tl
+ \tl_put_right:NV \l__siunitx_number_out_tl
+ \l__siunitx_number_denominator_tl
+ \__siunitx_number_output_single_aux:
+}
+\cs_new_protected:Npn \__siunitx_number_output_quotient_aux_i: {
+ \__siunitx_number_in_parse:V \l__siunitx_number_numerator_tl
+ \__siunitx_number_output_quotient_aux_ii:
+ \__siunitx_number_output_color:
+ \prop_if_in:NnT \l__siunitx_number_out_prop { complex }
+ {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
+ {
+ \prop_put:Nnn \l__siunitx_number_out_prop
+ { result-bracket } { true }
+ \__siunitx_number_format_brackets:n { result }
+ }
+ }
+ \prop_get:NnN \l__siunitx_number_out_prop { result }
+ \l__siunitx_number_numerator_tl
+ \__siunitx_number_in_parse:V \l__siunitx_number_denominator_tl
+ \__siunitx_number_output_quotient_aux_ii:
+ \prop_if_in:NnT \l__siunitx_number_out_prop
+ { result-bracket-exponent }
+ {
+ \prop_put:Nnn \l__siunitx_number_out_prop { result-bracket }
+ { true }
+ }
+ \__siunitx_number_output_bracket:
+ \prop_get:NnN \l__siunitx_number_out_prop { result }
+ \l__siunitx_number_denominator_tl
+}
+\cs_new_protected:Npn \__siunitx_number_output_quotient_aux_ii: {
+ \__siunitx_number_process:
+ \__siunitx_number_format:
+}
+\cs_new_protected:Npn \__siunitx_number_output_single: {
+ \bool_lazy_and:nnF
+ { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
+ { \tl_if_empty_p:N \l__siunitx_unit_tl }
+ {
+ \prop_if_in:NnF \l__siunitx_number_out_prop { exponent }
+ { \__siunitx_number_format_brackets:n { result } }
+ }
+ \__siunitx_number_output_bracket:
+ \prop_get:NnN \l__siunitx_number_out_prop { result }
+ \l__siunitx_number_out_tl
+ \__siunitx_number_output_single_aux:
+}
+\cs_new_protected:Npn \__siunitx_number_output_single_aux: {
+ \__siunitx_unit_output_pre_print:
+ \quark_if_no_value:NTF \l__siunitx_number_out_tl
+ { \tl_clear:N \l__siunitx_number_unit_product_tl }
+ { \__siunitx_print:nV { number } \l__siunitx_number_out_tl }
+ \__siunitx_unit_output_print:
+}
+\bool_new:N \l__siunitx_angle_degree_space_bool
+\bool_new:N \l__siunitx_angle_minute_space_bool
+\box_new:N \l__siunitx_angle_marker_box
+\box_new:N \l__siunitx_angle_unit_box
+\dim_new:N \l__siunitx_angle_marker_dim
+\dim_new:N \l__siunitx_angle_unit_dim
+\prop_new:N \l__siunitx_angle_degree_prop
+\prop_new:N \l__siunitx_angle_minute_prop
+\prop_new:N \l__siunitx_angle_second_prop
+\keys_define:nn { siunitx } {
+ add-arc-degree-zero .bool_set:N =
+ \l__siunitx_angle_degree_zero_bool ,
+ add-arc-minute-zero .bool_set:N =
+ \l__siunitx_angle_minute_zero_bool ,
+ add-arc-second-zero .bool_set:N =
+ \l__siunitx_angle_second_zero_bool ,
+ angle-symbol-over-decimal .bool_set:N =
+ \l__siunitx_angle_astronomy_bool ,
+ arc-separator .tl_set:N =
+ \l__siunitx_angle_arc_separator_tl ,
+ number-angle-product .tl_set:N =
+ \l__siunitx_angle_unit_product_tl ,
+ number-angle-separator .tl_set:N =
+ \l__siunitx_angle_unit_product_tl ,
+}
+\cs_new_protected:Npn \__siunitx_angle_output:nnn #1#2#3 {
+ \__siunitx_angle_init:
+ \IfNoValueTF {#2}
+ {
+ \bool_set_false:N \l__siunitx_angle_minute_zero_bool
+ \bool_set_false:N \l__siunitx_angle_second_zero_bool
+ \__siunitx_angle_output_aux:nnn {#1} { } { }
+ }
+ {
+ \IfNoValueTF {#3}
+ { \__siunitx_error:nx { invalid-arc-format } { #1 ; #2 } }
+ { \__siunitx_angle_output_aux:nnn {#1} {#2} {#3} }
+ }
+}
+\cs_new_protected:Npn \__siunitx_angle_output_aux:nnn #1#2#3 {
+ \tl_if_empty:nTF { #1#2#3 }
+ { \__siunitx_error:n { empty-arc } }
+ {
+ \bool_if:NTF \l__siunitx_number_parse_bool
+ { \__siunitx_angle_parse:nnn {#1} {#2} {#3} }
+ { \__siunitx_angle_direct:nnn {#1} {#2} {#3} }
+ }
+}
+\cs_new_protected:Npn \__siunitx_angle_init: {
+ \bool_set_false:N \l__siunitx_angle_degree_space_bool
+ \bool_set_false:N \l__siunitx_angle_minute_space_bool
+ \prop_clear:N \l__siunitx_angle_degree_prop
+ \prop_clear:N \l__siunitx_angle_minute_prop
+ \prop_clear:N \l__siunitx_angle_second_prop
+ \tl_clear:N \l__siunitx_preunit_tl
+ \tl_set_eq:NN \l__siunitx_number_unit_product_tl
+ \l__siunitx_angle_unit_product_tl
+ \cs_set_eq:NN \__siunitx_number_in_parse_more:N
+ \__siunitx_number_in_parse_restricted:N
+}
+\cs_new_protected:Npn \__siunitx_angle_direct:nnn #1 {
+ \tl_if_empty:nTF {#1}
+ {
+ \bool_if:NTF \l__siunitx_angle_degree_zero_bool
+ { \__siunitx_angle_direct_aux_i:nnn { 0 } }
+ { \__siunitx_angle_direct_aux_i:nnn { } }
+ }
+ { \__siunitx_angle_direct_aux_i:nnn {#1} }
+}
+\cs_new_protected:Npn \__siunitx_angle_direct_aux_i:nnn #1#2 {
+ \tl_if_empty:nTF {#2}
+ {
+ \bool_if:NTF \l__siunitx_angle_minute_zero_bool
+ { \__siunitx_angle_direct_aux_ii:nnn {#1} { 0 } }
+ { \__siunitx_angle_direct_aux_ii:nnn {#1} { } }
+ }
+ { \__siunitx_angle_direct_aux_ii:nnn {#1} {#2} }
+}
+\cs_new_protected:Npn \__siunitx_angle_direct_aux_ii:nnn #1#2#3 {
+ \tl_if_empty:nTF {#3}
+ {
+ \bool_if:NTF \l__siunitx_angle_second_zero_bool
+ { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} { 0 } }
+ { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} { } }
+ }
+ { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} {#3} }
+}
+\cs_new_protected:Npn \__siunitx_angle_direct_aux_iii:nnn #1#2#3 {
+ \tl_if_empty:nF {#1}
+ {
+ \tl_if_empty:nF {#2#3}
+ { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
+ }
+ \tl_if_empty:nF {#2}
+ {
+ \tl_if_empty:nF {#3}
+ { \bool_set_true:N \l__siunitx_angle_minute_space_bool }
+ }
+ \__siunitx_angle_print_direct:nnn {#1} {#2} {#3}
+}
+\cs_new_protected:Npn \__siunitx_angle_parse:nnn #1#2#3 {
+ \__siunitx_angle_parse_aux:nn {#1} { degree }
+ \__siunitx_angle_parse_aux:nn {#2} { minute }
+ \__siunitx_angle_parse_aux:nn {#3} { second }
+ \__siunitx_angle_check_sign:
+ \__siunitx_angle_zero_fill:
+ \prop_if_empty:NF \l__siunitx_angle_degree_prop
+ {
+ \prop_if_empty:NF \l__siunitx_angle_minute_prop
+ { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
+ \prop_if_empty:NF \l__siunitx_angle_second_prop
+ { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
+ }
+ \prop_if_empty:NF \l__siunitx_angle_minute_prop
+ {
+ \prop_if_empty:NF \l__siunitx_angle_second_prop
+ { \bool_set_true:N \l__siunitx_angle_minute_space_bool }
+ }
+ \__siunitx_angle_print:
+}
+\cs_new_protected:Npn \__siunitx_angle_parse_aux:nn #1#2 {
+ \prop_clear:N \l__siunitx_number_in_prop
+ \tl_if_empty:nF {#1}
+ {
+ \__siunitx_number_in_init:
+ \__siunitx_number_in_parse_aux:n {#1}
+ }
+ \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign-deleted }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_put:NnV \l__siunitx_number_in_prop { mantissa-sign }
+ \l__siunitx_tmpa_tl
+ }
+ \__siunitx_number_process:
+ \prop_set_eq:cN { l__siunitx_angle_ #2 _prop }
+ \l__siunitx_number_in_prop
+}
+\cs_new_protected:Npn \__siunitx_angle_check_sign: {
+ \prop_if_empty:NTF \l__siunitx_angle_degree_prop
+ {
+ \prop_if_empty:NF \l__siunitx_angle_minute_prop
+ { \__siunitx_angle_check_sign_aux:n { second } }
+ }
+ {
+ \__siunitx_angle_check_sign_aux:n { minute }
+ \__siunitx_angle_check_sign_aux:n { second }
+ }
+}
+\cs_new_protected:Npn \__siunitx_angle_check_sign_aux:n #1 {
+ \prop_if_in:cnTF { l__siunitx_angle_ #1 _prop }
+ { mantissa-sign }
+ { \msg_error:nn { siunitx } { bad-arc-sign } }
+ {
+ \prop_if_in:cnT { l__siunitx_angle_ #1 _prop }
+ { mantissa-sign-deleted }
+ { \msg_error:nn { siunitx } { bad-arc-sign } }
+ }
+}
+\cs_new_protected:Npn \__siunitx_angle_zero_fill: {
+ \bool_lazy_and:nnT
+ { \l__siunitx_angle_second_zero_bool }
+ { \prop_if_empty_p:N \l__siunitx_angle_second_prop }
+ {
+ \prop_put:Nnn \l__siunitx_angle_second_prop { mantissa }
+ { true }
+ \prop_put:Nnn \l__siunitx_angle_second_prop { mantissa-integer }
+ { 0 }
+ }
+ \bool_lazy_and:nnT
+ { \l__siunitx_angle_minute_zero_bool }
+ { \prop_if_empty_p:N \l__siunitx_angle_minute_prop }
+ {
+ \prop_put:Nnn \l__siunitx_angle_minute_prop { mantissa }
+ { true }
+ \prop_put:Nnn \l__siunitx_angle_minute_prop { mantissa-integer }
+ { 0 }
+ \__siunitx_angle_sign_shuffle:nn { second } { minute }
+ }
+ \bool_lazy_and:nnT
+ { \l__siunitx_angle_degree_zero_bool }
+ { \prop_if_empty_p:N \l__siunitx_angle_degree_prop }
+ {
+ \prop_put:Nnn \l__siunitx_angle_degree_prop { mantissa }
+ { true }
+ \prop_put:Nnn \l__siunitx_angle_degree_prop { mantissa-integer }
+ { 0 }
+ \__siunitx_angle_sign_shuffle:nn { second } { degree }
+ \__siunitx_angle_sign_shuffle:nn { minute } { degree }
+ }
+}
+\cs_new_protected:Npn \__siunitx_angle_sign_shuffle:nn #1#2 {
+ \__siunitx_angle_sign_shuffle_aux:nnn {#1} {#2} { }
+ \__siunitx_angle_sign_shuffle_aux:nnn {#1} {#2} { -deleted }
+}
+\cs_new_protected:Npn \__siunitx_angle_sign_shuffle_aux:nnn
+ #1#2#3 {
+ \prop_get:cnN { l__siunitx_angle_ #1 _prop } { mantissa-sign #3 }
+ \l__siunitx_tmpa_tl
+ \prop_remove:cn { l__siunitx_angle_ #1 _prop } { mantissa-sign #3 }
+ \quark_if_no_value:NF \l__siunitx_tmpa_tl
+ {
+ \prop_put:cnV { l__siunitx_angle_ #2 _prop } { mantissa-sign #3 }
+ \l__siunitx_tmpa_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_angle_print: {
+ \__siunitx_angle_print_aux:nn { degree } { \SIUnitSymbolDegree }
+ \bool_if:NT \l__siunitx_angle_degree_space_bool
+ {
+ \nobreak
+ \l__siunitx_angle_arc_separator_tl
+ }
+ \__siunitx_angle_print_aux:nn { minute } { \SIUnitSymbolArcminute }
+ \bool_if:NT \l__siunitx_angle_minute_space_bool
+ {
+ \nobreak
+ \l__siunitx_angle_arc_separator_tl
+ }
+ \__siunitx_angle_print_aux:nn { second } { \SIUnitSymbolArcsecond }
+}
+\cs_new_protected:Npn \__siunitx_angle_print_aux:nn #1#2 {
+ \prop_if_empty:cF { l__siunitx_angle_ #1 _prop }
+ {
+ \prop_set_eq:Nc \l__siunitx_number_in_prop
+ { l__siunitx_angle_ #1 _prop }
+ \tl_set:Nn \l__siunitx_unit_tl {#2}
+ \tl_clear:N \l__siunitx_number_out_tl
+ \__siunitx_number_format:
+ \__siunitx_number_output_color:
+ \bool_if:NTF \l__siunitx_angle_astronomy_bool
+ { \__siunitx_angle_print_astronomy: }
+ { \__siunitx_number_output_single: }
+ }
+}
+\cs_new_protected:Npn \__siunitx_angle_print_astronomy: {
+ \prop_if_in:NnTF \l__siunitx_number_in_prop
+ { mantissa-decimal-marker }
+ { \__siunitx_angle_print_astronomy_aux: }
+ { \__siunitx_number_output_single: }
+}
+\cs_new_protected:Npn \__siunitx_angle_print_astronomy_aux: {
+ \prop_get:NnNF \l__siunitx_number_out_prop { mantissa-sign }
+ \l__siunitx_tmpa_tl
+ { \tl_clear:N \l__siunitx_tmpa_tl }
+ \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
+ \l__siunitx_tmpb_tl
+ {
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
+ }
+ \hbox_set:Nn \l__siunitx_angle_marker_box
+ {
+ \__siunitx_print:nn { number } { { \l__siunitx_output_decimal_tl } }
+ }
+ \hbox_set:Nn \l__siunitx_angle_unit_box
+ {
+ \__siunitx_print:nV { unit } \l__siunitx_unit_tl
+ \skip_horizontal:n { -\scriptspace }
+ }
+ \__siunitx_angle_print_astronomy_aux:n { marker }
+ \__siunitx_angle_print_astronomy_aux:n { unit }
+ \hbox_set:Nn \l__siunitx_angle_marker_box
+ {
+ \box_use:N \l__siunitx_angle_marker_box
+ \box_use:N \l__siunitx_angle_unit_box
+ }
+ \dim_compare:nNnTF
+ { \l__siunitx_angle_marker_dim } > { \l__siunitx_angle_unit_dim }
+ { \__siunitx_angle_print_astronomy_marker: }
+ { \__siunitx_angle_print_astronomy_unit: }
+ \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-decimal }
+ \l__siunitx_tmpa_tl
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+}
+\cs_new_protected:Npn \__siunitx_angle_print_astronomy_aux:n #1 {
+ \dim_set:cn { l__siunitx_angle_ #1 _dim }
+ { \box_wd:c { l__siunitx_angle_ #1 _box } }
+ \hbox_set_to_wd:cnn { l__siunitx_angle_ #1 _box } { \c_zero_skip }
+ {
+ \tex_hss:D
+ \hbox_unpack:c { l__siunitx_angle_ #1_box }
+ \tex_hss:D
+ }
+}
+\cs_new_protected:Npn \__siunitx_angle_print_astronomy_marker: {
+ \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box
+ { \l__siunitx_angle_marker_dim }
+ {
+ \tex_hss:D
+ \hbox_unpack:N \l__siunitx_angle_marker_box
+ \tex_hss:D
+ }
+ \box_use:N \l__siunitx_angle_marker_box
+}
+\cs_new_protected:Npn \__siunitx_angle_print_astronomy_unit: {
+ \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box
+ { \l__siunitx_angle_unit_dim }
+ {
+ \tex_hss:D
+ \hbox_unpack:N \l__siunitx_angle_marker_box
+ \tex_hss:D
+ }
+ \box_use:N \l__siunitx_angle_marker_box
+ \skip_horizontal:N \scriptspace
+}
+\cs_new_protected:Npn \__siunitx_angle_print_direct:nnn #1#2#3 {
+ \__siunitx_angle_print_direct_aux:nn {#1} { \SIUnitSymbolDegree }
+ \bool_if:NT \l__siunitx_angle_degree_space_bool
+ {
+ \nobreak
+ \l__siunitx_angle_arc_separator_tl
+ }
+ \__siunitx_angle_print_direct_aux:nn {#2} { \SIUnitSymbolArcminute }
+ \bool_if:NT \l__siunitx_angle_minute_space_bool
+ {
+ \nobreak
+ \l__siunitx_angle_arc_separator_tl
+ }
+ \__siunitx_angle_print_direct_aux:nn {#3} { \SIUnitSymbolArcsecond }
+}
+\cs_new_protected:Npn \__siunitx_angle_print_direct_aux:nn #1#2 {
+ \tl_if_empty:nF {#1}
+ {
+ \tl_set:Nn \l__siunitx_unit_tl {#2}
+ \__siunitx_print:nn { number } { \ensuremath {#1} }
+ \__siunitx_unit_output_print:
+ }
+}
+\seq_new:N \l_siunitx_unit_symbolic_seq
+\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \of }
+\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \highlight }
+\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \per }
+\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \raiseto }
+\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \tothe }
+\cs_new_protected:Npn \__siunitx_declare_power_after:Nn #1#2 {
+ \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w }
+ { \__siunitx_textsuperscript:n {#2} }
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
+ { \__siunitx_unit_parse_power_after:n {#2} }
+}
+\cs_new_protected:Npn \__siunitx_declare_power_before:Nn #1#2 {
+ \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } ##1
+ { ##1 \__siunitx_textsuperscript:n {#2} }
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
+ { \__siunitx_unit_parse_power_before:n {#2} }
+}
+\cs_new_protected:Npn \__siunitx_declare_prefix:Nnnn #1#2#3#4
+ {
+ \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
+ \prop_put:Nnn \l__siunitx_prefix_forward_prop {#1} {#4}
+ \prop_put:Nnn \l__siunitx_prefix_reverse_prop {#4} {#1}
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } {#2}
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
+ {
+ \bool_if:NTF \l__siunitx_prefix_symbols_bool
+ { \__siunitx_unit_parse_prefix:Nn #1 {#2} }
+ { \__siunitx_unit_parse_prefix:nn {#3} {#4} }
+ }
+ }
+\prop_new:N \l__siunitx_prefix_forward_prop
+\prop_new:N \l__siunitx_prefix_reverse_prop
+\cs_new_protected:Npn \__siunitx_declare_qualifier:Nn #1#2 {
+ \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w }
+ { \text { ~ } ( #2 ) }
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
+ { \__siunitx_unit_parse_qualifier:n {#2} }
+}
+\cs_new_protected:Npn \__siunitx_declare_unit:Nnn #1#2#3 {
+ \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
+ \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } {#2}
+ \cs_set_protected:cpn { __siunitx_ \token_to_str:N #1 _function:w }
+ {
+ \__siunitx_unit_if_literal:nTF {#2}
+ { \__siunitx_unit_parse_unit:Nn #1 {#2} }
+ {#2}
+ }
+ \tl_if_empty:nTF {#3}
+ { \cs_undefine:c { l__siunitx_ \token_to_str:N #1 _options_tl } }
+ {
+ \tl_clear_new:c { l__siunitx_ \token_to_str:N #1 _options_tl }
+ \tl_set:cn { l__siunitx_ \token_to_str:N #1 _options_tl } {#3}
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_first_token:n #1 {
+ \exp_last_unbraced:No \token_to_str:N { \tl_head:w #1 \q_stop }
+}
+\cs_new:cpn { __siunitx_ \token_to_str:N \per _literal:w } { / }
+\cs_new_protected:cpn { __siunitx_ \token_to_str:N \per _function:w } {
+ \bool_set_true:N \l__siunitx_per_bool
+ \__siunitx_unit_parse_per:
+}
+\cs_new:cpn { __siunitx_ \token_to_str:N \raiseto _literal:w } #1#2 {
+ #2
+ \__siunitx_textsuperscript:n {#1}
+}
+\cs_new_protected:cpn { __siunitx_ \token_to_str:N \raiseto _function:w }
+ #1 {
+ \__siunitx_unit_parse_power_before:n {#1}
+}
+\cs_new:cpn { __siunitx_ \token_to_str:N \tothe _literal:w } #1 {
+ \__siunitx_textsuperscript:n {#1}
+}
+\cs_new_protected:cpn { __siunitx_ \token_to_str:N \tothe _function:w }
+ #1 {
+ \__siunitx_unit_parse_power_after:n {#1}
+}
+\cs_new:cpn { __siunitx_ \token_to_str:N \of _literal:w } #1 {
+ \text { ~ } ( #1 )
+}
+\cs_new_protected:cpn { __siunitx_ \token_to_str:N \of _function:w } #1 {
+ \__siunitx_unit_parse_qualifier:n {#1}
+}
+\AtBeginDocument {
+ \cs_if_exist:NT \cancel
+ {
+ \cs_set_protected:Npn \__siunitx_cancel:n #1
+ { \__siunitx__real_cancel:n { \__siunitx_print:nn { unit } {#1} } }
+ \cs_set_eq:NN \__siunitx__real_cancel:n \cancel
+ \seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \cancel }
+ \cs_new_protected:cpn
+ { __siunitx_ \token_to_str:N \cancel _function:w }
+ { \__siunitx_unit_parse_special:n { \__siunitx_cancel:n } }
+ }
+}
+\cs_new:cpn
+ { __siunitx_ \token_to_str:N \highlight _literal:w } #1
+ { \__siunitx_textcolor:n {#1} }
+\cs_new_protected:cpn
+ { __siunitx_ \token_to_str:N \highlight _function:w } #1
+ { \__siunitx_unit_parse_special:n { \__siunitx_textcolor:n {#1} } }
+\keys_define:nn { siunitx } {
+ free-standing-units .bool_set:N = \l__siunitx_create_free_bool ,
+ overwrite-functions .bool_set:N = \l__siunitx_create_overwrite_bool,
+ space-before-unit .bool_set:N = \l__siunitx_create_prespace_bool ,
+ unit-optional-argument .bool_set:N = \l__siunitx_create_optional_bool ,
+ use-xspace .bool_set:N = \l__siunitx_create_xspace_bool ,
+}
+\__siunitx_option_deactivate:n {
+ free-standing-units ,
+ overwrite-functions ,
+ space-before-unit ,
+ unit-optional-argument ,
+ use-xspace ,
+}
+\cs_new_protected:Npn \__siunitx_unit_create_empty_functions:
+ {
+ \__siunitx_unit_create_functions_aux_i:
+ \seq_map_function:NN \l_siunitx_unit_symbolic_seq
+ \__siunitx_unit_create_empty_functions_aux:N
+ \__siunitx_unit_create_functions_aux_ii:
+ }
+\cs_new_protected:Npn \__siunitx_unit_create_empty_functions_aux:N #1
+ {
+ \cs_if_free:NT #1
+ { \cs_set_protected:Npn #1 { \ERROR } }
+ }
+\cs_new_protected:Npn \__siunitx_unit_create_functions:
+ {
+ \__siunitx_unit_create_functions_aux_i:
+ \bool_if:NT \l__siunitx_create_overwrite_bool
+ { \seq_map_function:NN \l_siunitx_unit_symbolic_seq \cs_undefine:N }
+ \bool_if:NTF \l__siunitx_create_optional_bool
+ {
+ \seq_map_function:NN \l_siunitx_unit_symbolic_seq
+ \__siunitx_unit_create_with_arg:N
+ }
+ {
+ \seq_map_function:NN \l_siunitx_unit_symbolic_seq
+ \__siunitx_unit_create:N
+ }
+ \__siunitx_unit_create_functions_aux_ii:
+ \bool_if:NT \l__siunitx_create_xspace_bool
+ { \RequirePackage { xspace } }
+ }
+\cs_new_protected:Npn \__siunitx_unit_create_functions_aux_i:
+ {
+ \@ifpackageloaded { soulpos }
+ {
+ \@ifpackageloaded { soul }
+ { }
+ {
+ \cs_set_protected:Npn \__siunitx_unit_create_functions_aux_ii:
+ {
+ \cs_undefine:N \hl
+ \cs_undefine:N \ul
+ }
+ }
+ }
+ { }
+ }
+\cs_new_protected:Npn \__siunitx_unit_create_functions_aux_ii: { }
+\cs_new_protected:Npn \__siunitx_unit_create:N #1 {
+ \cs_if_free:NT #1
+ {
+ \cs_set:Npx \__siunitx_tmp:w
+ {
+ \ProvideDocumentCommand \exp_not:N #1 { }
+ {
+ \group_begin:
+ \exp_not:N \cs_if_free:NF
+ \exp_not:c
+ { l__siunitx_ \token_to_str:N #1 _options_tl }
+ {
+ \keys_set:nV { siunitx }
+ \exp_not:c
+ { l__siunitx_ \token_to_str:N #1 _options_tl }
+ }
+ \bool_if:NT \l__siunitx_create_prespace_bool
+ { \exp_not:N \l__siunitx_number_unit_product_tl }
+ \exp_not:n { \__siunitx_unit_output:nn {#1} { } }
+ \group_end:
+ \bool_if:NT \l__siunitx_create_xspace_bool
+ { \exp_not:N \xspace }
+ }
+ }
+ \__siunitx_tmp:w
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_create_with_arg:N #1 {
+ \cs_if_free:NT #1
+ {
+ \cs_set:Npx \__siunitx_tmp:w
+ {
+ \ProvideDocumentCommand \exp_not:N #1 { o }
+ {
+ \group_begin:
+ \exp_not:N \cs_if_free:NF
+ \exp_not:c
+ { l__siunitx_ \token_to_str:N #1 _options_tl }
+ {
+ \keys_set:nV { siunitx }
+ \exp_not:c
+ {
+ l__siunitx_ \token_to_str:N #1 _options_tl
+ }
+ }
+ \exp_not:N \IfNoValueTF {####1}
+ {
+ \bool_if:NT \l__siunitx_create_prespace_bool
+ { \exp_not:N \l__siunitx_number_unit_product_tl }
+ \exp_not:n { \__siunitx_unit_output:nn {#1} { } }
+ }
+ { \SI {####1} { \exp_not:N #1 } }
+ \group_end:
+ \bool_if:NT \l__siunitx_create_xspace_bool
+ { \exp_not:N \xspace }
+ }
+ }
+ \__siunitx_tmp:w
+ }
+}
+\AtBeginDocument {
+ \cs_if_eq:NNT \color \use_none:n
+ { \cs_set_protected:Npn \color #1 { } }
+ \cs_set:Npn \__siunitx_tmp:w #1 { }
+ \cs_if_eq:NNT \color \__siunitx_tmp:w
+ { \cs_set_protected:Npn \color #1 { } }
+ \tl_map_function:nN { \bar \color \ng \pm \array@row@rst }
+ \__siunitx_protect_symbols:N
+}
+\__siunitx_if_hooks:TF
+ {
+ \AddToHook { begindocument / end } [ siunitx ]
+ { \__siunitx_protect_symbols:N \fg }
+ }
+ {
+ \tl_put_right:Nn \document
+ {
+ \__siunitx_protect_symbols:N \fg
+ \ignorespaces
+ }
+ }
+\cs_new_protected:Npn \__siunitx_protect_symbols:N #1 {
+ \cs_if_exist:NT #1
+ {
+ \tl_if_empty:fT { \cs_prefix_spec:N #1 }
+ { \cs_set_protected:Npx #1 { \exp_not:V #1 } }
+ }
+}
+\keys_define:nn { siunitx } {
+ forbid-literal-units .bool_set:N =
+ \l__siunitx_unit_forbid_literal_bool,
+ parse-units .bool_set:N = \l__siunitx_unit_parse_bool
+}
+\keys_set:nn { siunitx } {
+ forbid-literal-units = false,
+ parse-units = true
+}
+\cs_new_protected:Npn \__siunitx_unit_in:nn #1#2 {
+ \bool_if:NTF \l__siunitx_unit_parse_bool
+ {
+ \tl_if_empty:nF {#1}
+ {
+ \__siunitx_unit_if_literal:nTF {#1}
+ {
+ \tl_clear:N \l__siunitx_per_mode_tl
+ \bool_if:NTF \l__siunitx_unit_forbid_literal_bool
+ {
+ \msg_error:nnx { siunitx } { literal-unit }
+ { \exp_not:n {#1} }
+ }
+ {
+ \cs_set_eq:NN \__siunitx_pm: \pm
+ \__siunitx_unit_format_literal:n {#1}
+ \cs_set_eq:NN \pm \__siunitx_pm:
+ }
+ }
+ {
+ \cs_set_eq:NN \__siunitx_pm: \pm
+ \__siunitx_unit_parse:nn {#1} {#2}
+ \__siunitx_unit_format:
+ \prop_set_eq:NN \l__siunitx_unit_saved_prop \l__siunitx_unit_prop
+ \cs_set_eq:NN \pm \__siunitx_pm:
+ }
+ }
+ }
+ { \__siunitx_unit_format_literal:n {#1} }
+}
+\cs_generate_variant:Nn \__siunitx_unit_in:nn { V }
+\cs_new:Npn \__siunitx_pm: { }
+\cs_new_protected:Npn \__siunitx_unit_if_literal:nTF #1#2#3 {
+ \group_begin:
+ \seq_map_function:NN \l_siunitx_unit_symbolic_seq
+ \__siunitx_unit_if_literal_aux:N
+ \cs_set_eq:NN \of \use_none:n
+ \cs_set_eq:NN \highlight \use_none:n
+ \cs_set_eq:NN \raiseto \use_none:n
+ \cs_set_eq:NN \tothe \use_none:n
+ \protected@edef \l__siunitx_tmpa_tl {#1}
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_tmpa_tl \l__siunitx_tmpa_tl
+ \tl_if_blank:VTF \l__siunitx_tmpa_tl {#3} {#2}
+}
+\cs_new_protected:Npn \__siunitx_unit_if_literal_aux:N #1 {
+ \cs_set_eq:NN #1 \prg_do_nothing:
+}
+\int_new:N \l__siunitx_unit_int
+\prop_new:N \l__siunitx_unit_prop
+\prop_new:N \l__siunitx_unit_saved_prop
+\bool_new:N \l__siunitx_per_bool
+\keys_define:nn { siunitx }
+ {
+ exponent-to-prefix .bool_set:N = \l__siunitx_exp_to_prefix_bool ,
+ prefixes-as-symbols .bool_set:N = \l__siunitx_prefix_symbols_bool ,
+ sticky-per .bool_set:N = \l__siunitx_sticky_per_bool
+ }
+\keys_set:nn { siunitx } { prefixes-as-symbols = true }
+\cs_new_protected:Npn \__siunitx_unit_parse:nn #1#2 {
+ \__siunitx_unit_parse_init:
+ \__siunitx_unit_parse_options:nn {#1} {#2}
+ #1
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_init:
+ {
+ \prop_clear:N \l__siunitx_unit_prop
+ \int_zero:N \l__siunitx_unit_int
+ \bool_set_false:N \l__siunitx_per_bool
+ \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
+ { \cs_set_eq:Nc ##1 { __siunitx_ \token_to_str:N ##1 _function:w } }
+ }
+\cs_new_protected:Npn \__siunitx_unit_parse_options:nn #1#2 {
+ \tl_if_single:nT {#1}
+ {
+ \cs_if_free:cF
+ { l__siunitx_ \__siunitx_unit_first_token:n {#1} _options_tl }
+ {
+ \keys_set:nv { siunitx }
+ { l__siunitx_ \__siunitx_unit_first_token:n {#1} _options_tl }
+ \keys_set:nn { siunitx } {#2}
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_power_before:n #1 {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { power- \int_eval:n { \l__siunitx_unit_int + 1 } }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_power_after:n #1 {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { power- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_prefix:Nn #1#2
+ {
+ \int_incr:N \l__siunitx_unit_int
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { prefix- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { prefix-symbol- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#2}
+ }
+\cs_new_protected:Npn \__siunitx_unit_parse_prefix:nn #1#2
+ {
+ \__siunitx_unit_parse_prefix:Nn \ERROR {#2}
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { prefix-base- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
+ }
+\cs_new_protected:Npn \__siunitx_unit_parse_per: {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { per- \int_eval:n { \l__siunitx_unit_int + 1 } }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
+ \bool_if:NT \l__siunitx_sticky_per_bool
+ { \cs_set_eq:NN \per \__siunitx_unit_parse_per_error: }
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_per_error: {
+ \msg_error:nn { siunitx } { duplicate-sticky-per }
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_qualifier:n #1 {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { symbol- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ { \msg_error:nn { siunitx } { qualifier-before-unit } }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { qualifier- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_special:n #1 {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { special- \int_eval:n { \l__siunitx_unit_int + 1 } }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_unit:Nn #1#2 {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { prefix-symbol- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { symbol- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ { \int_incr:N \l__siunitx_unit_int }
+ }
+ { \int_incr:N \l__siunitx_unit_int }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { unit- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { symbol- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#2}
+ \__siunitx_unit_parse_unit_per:
+}
+\cs_new_protected:Npn \__siunitx_unit_parse_unit_per: {
+ \bool_if:NT \l__siunitx_sticky_per_bool
+ {
+ \bool_if:NT \l__siunitx_per_bool
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { per- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ { true }
+ }
+ }
+}
+\tl_new:N \l__siunitx_preunit_tl
+\tl_new:N \l__siunitx_unit_tl
+\tl_new:N \l__siunitx_unit_current_tl
+\tl_new:N \l__siunitx_unit_denominator_tl
+\tl_new:N \l__siunitx_unit_numerator_tl
+\tl_new:N \l__siunitx_unit_saved_tl
+\int_new:N \l__siunitx_unit_denominator_int
+\int_new:N \l__siunitx_unit_numerator_int
+\int_new:N \l__siunitx_unit_prefix_int
+\int_new:N \l__siunitx_unit_prefix_base_int
+\tl_new:N \l__siunitx_unit_prefix_current_tl
+\int_new:N \l__siunitx_unit_prefix_gram_int
+\bool_new:N \l__siunitx_omit_unit_space_bool
+\bool_new:N \l__siunitx_per_auto_bool
+\bool_new:N \l__siunitx_per_fraction_bool
+\tl_new:N \l__siunitx_per_mode_tl
+\bool_new:N \l__siunitx_power_number_bool
+\bool_new:N \l__siunitx_per_two_parts_bool
+\tl_new:N \l__siunitx_qualifier_mode_tl
+\keys_define:nn { siunitx } {
+ bracket-unit-denominator .bool_set:N
+ = \l__siunitx_unit_denominator_bracket_bool,
+ inter-unit-product .tl_set:N = \l__siunitx_unit_product_tl ,
+ inter-unit-separator .tl_set:N = \l__siunitx_unit_product_tl ,
+ literal-superscript-as-power
+ .bool_set:N = \l__siunitx_literal_power_bool,
+ per-mode .choice:,
+ per-mode / fraction .code:n =
+ {
+ \bool_set_false:N \l__siunitx_per_auto_bool
+ \bool_set_true:N \l__siunitx_per_fraction_bool
+ \bool_set_true:N \l__siunitx_per_two_parts_bool
+ \tl_set:Nn \l__siunitx_per_mode_tl { fraction }
+ },
+ per-mode / power .meta:n = { per-mode = reciprocal } ,
+ per-mode / power-positive-first .meta:n =
+ { per-mode = reciprocal-positive-first } ,
+ per-mode / reciprocal .code:n =
+ {
+ \bool_set_false:N \l__siunitx_per_auto_bool
+ \bool_set_false:N \l__siunitx_per_fraction_bool
+ \bool_set_false:N \l__siunitx_per_two_parts_bool
+ \tl_clear:N \l__siunitx_per_mode_tl
+ },
+ per-mode / reciprocal-positive-first .code:n =
+ {
+ \bool_set_false:N \l__siunitx_per_auto_bool
+ \bool_set_false:N \l__siunitx_per_fraction_bool
+ \bool_set_true:N \l__siunitx_per_two_parts_bool
+ \tl_clear:N \l__siunitx_per_mode_tl
+ },
+ per-mode / repeated-symbol .code:n =
+ {
+ \bool_set_false:N \l__siunitx_per_auto_bool
+ \bool_set_false:N \l__siunitx_per_fraction_bool
+ \bool_set_false:N \l__siunitx_per_two_parts_bool
+ \tl_set:Nn \l__siunitx_per_mode_tl { repeat }
+ },
+ per-mode / symbol .code:n =
+ {
+ \bool_set_false:N \l__siunitx_per_auto_bool
+ \bool_set_true:N \l__siunitx_per_fraction_bool
+ \bool_set_true:N \l__siunitx_per_two_parts_bool
+ \tl_set:Nn \l__siunitx_per_mode_tl { symbol }
+ },
+ per-mode / symbol-or-fraction .code:n =
+ {
+ \bool_set_true:N \l__siunitx_per_auto_bool
+ \bool_set_true:N \l__siunitx_per_fraction_bool
+ \bool_set_true:N \l__siunitx_per_two_parts_bool
+ \tl_set:Nn \l__siunitx_per_mode_tl { symbol }
+ },
+ per-symbol .tl_set:N = \l__siunitx_per_symbol_tl,
+ power-font .choice:,
+ power-font / number .code:n =
+ { \bool_set_true:N \l__siunitx_power_number_bool },
+ power-font / unit .code:n =
+ { \bool_set_false:N \l__siunitx_power_number_bool },
+ qualifier-mode .choice:,
+ qualifier-mode / brackets .code:n =
+ { \tl_set:Nn \l__siunitx_qualifier_mode_tl { brackets } },
+ qualifier-mode / phrase .code:n =
+ { \tl_set:Nn \l__siunitx_qualifier_mode_tl { phrase } },
+ qualifier-mode / space .code:n =
+ { \tl_set:Nn \l__siunitx_qualifier_mode_tl { space } },
+ qualifier-mode / subscript .code:n =
+ { \tl_set:Nn \l__siunitx_qualifier_mode_tl { subscript } },
+ qualifier-mode / text .code:n =
+ { \tl_set:Nn \l__siunitx_qualifier_mode_tl { text } },
+ qualifier-phrase .tl_set:N = \l__siunitx_qualifier_phrase_tl
+}
+\keys_set:nn { siunitx } {
+ bracket-unit-denominator = true,
+ inter-unit-product = \,,
+ literal-superscript-as-power = true,
+ per-mode = reciprocal,
+ per-symbol = /,
+ power-font = number,
+ qualifier-mode = subscript,
+ qualifier-phrase = { ~ of ~ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format: {
+ \prop_put:Nnx \l__siunitx_unit_prop { total-units }
+ { \int_use:N \l__siunitx_unit_int }
+ \__siunitx_unit_format_init:
+ \int_while_do:nNnn { \l__siunitx_unit_int } > { 0 }
+ {
+ \__siunitx_unit_format_prefix:
+ \__siunitx_unit_format_symbol:
+ \__siunitx_unit_format_qualifier:
+ \__siunitx_unit_format_power:
+ \__siunitx_unit_format_add:
+ \int_decr:N \l__siunitx_unit_int
+ }
+ \bool_if:NT \l__siunitx_per_two_parts_bool
+ {
+ \bool_if:NTF \l__siunitx_per_fraction_bool
+ { \__siunitx_unit_format_fraction: }
+ { \__siunitx_unit_format_sorted: }
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_add: {
+ \bool_if:NTF \l__siunitx_per_two_parts_bool
+ {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { per- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpb_tl
+ {
+ \__siunitx_unit_format_add_aux:n { _denominator }
+ \int_incr:N \l__siunitx_unit_denominator_int
+ }
+ {
+ \__siunitx_unit_format_add_aux:n { _numerator }
+ \int_incr:N \l__siunitx_unit_numerator_int
+ }
+ }
+ { \__siunitx_unit_format_add_aux:n { } }
+ \tl_clear:N \l__siunitx_unit_current_tl
+}
+\cs_new_protected:Npn \__siunitx_unit_format_add_aux:n #1 {
+ \tl_if_empty:cF { l__siunitx_unit #1 _tl }
+ {
+ \str_if_eq:VnTF \l__siunitx_per_mode_tl { repeat }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { per- \int_eval:n { \l__siunitx_unit_int + 1 } }
+ \prop_if_in:NVF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ {
+ \tl_put_right:NV \l__siunitx_unit_current_tl
+ \l__siunitx_unit_product_tl
+ }
+ }
+ {
+ \tl_put_right:NV \l__siunitx_unit_current_tl
+ \l__siunitx_unit_product_tl
+ }
+ }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { special- \int_use:N \l__siunitx_unit_int }
+ \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ \l__siunitx_tmpa_tl
+ {
+ \tl_put_left:cx { l__siunitx_unit #1 _tl }
+ {
+ \exp_not:V \l__siunitx_tmpa_tl
+ { \exp_not:V \l__siunitx_unit_current_tl }
+ }
+ }
+ {
+ \tl_put_left:cV { l__siunitx_unit #1 _tl }
+ \l__siunitx_unit_current_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_fraction: {
+ \int_compare:nNnT { \l__siunitx_unit_numerator_int } = { 0 }
+ {
+ \str_if_eq:VnT \l__siunitx_per_mode_tl { symbol }
+ { \bool_set_true:N \l__siunitx_omit_unit_space_bool }
+ }
+ \int_compare:nNnTF { \l__siunitx_unit_denominator_int } > { 0 }
+ {
+ \bool_if:NTF \l__siunitx_per_auto_bool
+ { \__siunitx_unit_format_fraction_auto: }
+ {
+ \use:c
+ { __siunitx_unit_format_fraction_ \l__siunitx_per_mode_tl : }
+ }
+ }
+ { \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_fraction_fraction: {
+ \tl_if_empty:NT \l__siunitx_unit_numerator_tl
+ { \tl_set:Nn \l__siunitx_unit_numerator_tl { 1 } }
+ \tl_set:Nx \l__siunitx_unit_numerator_tl
+ { { \exp_not:V \l__siunitx_unit_numerator_tl } }
+ \tl_put_left:Nn \l__siunitx_unit_numerator_tl
+ { \__siunitx_print:nn { unit } }
+ \tl_set:Nx \l__siunitx_unit_numerator_tl
+ { { \exp_not:V \l__siunitx_unit_numerator_tl } }
+ \tl_set:Nx \l__siunitx_unit_denominator_tl
+ { { \exp_not:V \l__siunitx_unit_denominator_tl } }
+ \tl_put_left:Nn \l__siunitx_unit_denominator_tl
+ { \__siunitx_print:nn { unit } }
+ \tl_set:Nx \l__siunitx_unit_denominator_tl
+ { { \exp_not:V \l__siunitx_unit_denominator_tl } }
+ \tl_set:Nn \l__siunitx_unit_tl { \__siunitx_fraction:nn }
+ \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl
+ \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_denominator_tl
+ \tl_set:Nx \l__siunitx_unit_tl
+ { \exp_not:N \ensuremath { \exp_not:V \l__siunitx_unit_tl } }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_fraction_auto: {
+ \mode_if_math:TF
+ {
+ \group_begin:
+ \__siunitx_unit_format_fraction_fraction:
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_tmpa_tl \l__siunitx_unit_tl
+ \group_begin:
+ \__siunitx_unit_format_fraction_symbol:
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_unit_tl
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ {
+ \__siunitx_print:nn { unit }
+ { \exp_not:V \l__siunitx_tmpb_tl }
+ }
+ \tl_set:Nx \l__siunitx_unit_tl
+ {
+ \exp_not:N \ensuremath {
+ \tex_mathchoice:D
+ { \exp_not:V \l__siunitx_tmpa_tl }
+ { \exp_not:V \l__siunitx_tmpb_tl }
+ { \exp_not:V \l__siunitx_tmpb_tl }
+ { \exp_not:V \l__siunitx_tmpb_tl }
+ }
+ }
+ }
+ { \__siunitx_unit_format_fraction_symbol: }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_fraction_symbol: {
+ \__siunitx_unit_format_fraction_symbol_aux:
+ \int_compare:nNnT { \l__siunitx_unit_denominator_int } > { 1 }
+ {
+ \bool_if:NT \l__siunitx_unit_denominator_bracket_bool
+ {
+ \tl_put_left:NV \l__siunitx_unit_denominator_tl \l__siunitx_bracket_open_tl
+ \tl_put_right:NV \l__siunitx_unit_denominator_tl \l__siunitx_bracket_close_tl
+ }
+ }
+ \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl
+ \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_per_symbol_tl
+ \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_denominator_tl
+}
+\cs_new_protected:Npn
+ \__siunitx_unit_format_fraction_symbol_aux: { }
+\cs_new_protected:Npn
+ \__siunitx_unit_format_fraction_symbol_aux_alt: {
+ \tl_if_empty:NT \l__siunitx_unit_numerator_tl
+ { \tl_set:Nn \l__siunitx_unit_numerator_tl { 1 } }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_init: {
+ \bool_set_false:N \l__siunitx_omit_unit_space_bool
+ \tl_clear:N \l__siunitx_unit_tl
+ \tl_clear:N \l__siunitx_unit_current_tl
+ \tl_clear:N \l__siunitx_unit_denominator_tl
+ \int_zero:N \l__siunitx_unit_prefix_gram_int
+ \tl_clear:N \l__siunitx_unit_numerator_tl
+ \int_zero:N \l__siunitx_unit_prefix_base_int
+ \int_zero:N \l__siunitx_unit_prefix_int
+ \int_zero:N \l__siunitx_unit_denominator_int
+ \int_zero:N \l__siunitx_unit_numerator_int
+ \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
+ { \__siunitx_unit_print_literal_aux:N ##1 }
+}
+\group_begin:
+ \char_set_catcode_active:N \~
+ \cs_new_protected:Npn \__siunitx_unit_format_literal:n #1
+ {
+ \int_zero:N \l__siunitx_unit_prefix_int
+ \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
+ { \__siunitx_unit_print_literal_aux:N ##1 }
+ \tl_set:Nn \l__siunitx_unit_tl {#1}
+ \tl_replace_all:NnV \l__siunitx_unit_tl { . }
+ \l__siunitx_unit_product_tl
+ \tl_replace_all:NnV \l__siunitx_unit_tl { ~ }
+ \l__siunitx_unit_product_tl
+ \bool_if:NT \l__siunitx_literal_power_bool
+ {
+ \tl_replace_all:Nnn \l__siunitx_unit_tl { ^ }
+ { \__siunitx_unit_format_literal_power:n }
+ \tl_replace_all:Non \l__siunitx_unit_tl { \token_to_str:N ^ }
+ { \__siunitx_unit_format_literal_power:n }
+ }
+ \__siunitx_unit_format_literal_extras:
+ }
+\group_end:
+\cs_new_protected:Npn \__siunitx_unit_print_literal_aux:N #1
+ { \cs_set_eq:Nc #1 { __siunitx_ \token_to_str:N #1 _literal:w } }
+\cs_new_protected:Npn \__siunitx_unit_format_literal_power:n #1
+ { \PrintSuperscript { \__siunitx_unit_format_power_aux:n {#1} } }
+ %\end{macro}
+\cs_new_protected:Npn \__siunitx_unit_format_literal_extras:
+ {
+ \__siunitx_unit_format_literal_extras_aux:nN { 176 }
+ \SIUnitSymbolDegree
+ \__siunitx_unit_format_literal_extras_aux:nN { 181 }
+ \SIUnitSymbolMicro
+ \__siunitx_unit_format_literal_extras_aux:nN { 197 }
+ \SIUnitSymbolAngstrom
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_literal_extras_aux:nN #1#2
+ {
+ \tl_replace_all:Nxn \l__siunitx_unit_tl
+ { \char_generate:nn { #1 } { 12 } }
+ {#2}
+ }
+\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: }
+ {
+ \AtBeginDocument
+ {
+ \cs_if_exist:NTF \inputencodingname
+ {
+ \tl_set:Nn \l__siunitx_tmpa_tl { latin1 , latin5 , latin9 }
+ \clist_if_in:NVF \l__siunitx_tmpa_tl \inputencodingname
+ {
+ \cs_set_eq:NN \__siunitx_unit_format_literal_extras:
+ \scan_stop:
+ }
+ }
+ {
+ \cs_set_eq:NN \__siunitx_unit_format_literal_extras:
+ \scan_stop:
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_power: {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { power- \int_use:N \l__siunitx_unit_int }
+ \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ \l__siunitx_tmpa_tl
+ { \__siunitx_unit_format_power_aux: }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { per- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ {
+ \tl_set:Nn \l__siunitx_tmpa_tl { 1 }
+ \__siunitx_unit_format_power_aux:
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_power_aux: {
+ \str_if_eq:VnTF \l__siunitx_per_mode_tl { repeat }
+ { \__siunitx_unit_format_power_repeat: }
+ { \__siunitx_unit_format_power_per: }
+ \str_if_eq:VnF \l__siunitx_tmpa_tl { 1 }
+ {
+ \__siunitx_unit_format_power_brackets:
+ \tl_put_right:Nx \l__siunitx_unit_current_tl
+ {
+ \exp_not:N \PrintSuperscript
+ {
+ \__siunitx_unit_format_power_aux:n
+ {
+ \exp_after:wN \__siunitx_unit_format_power:w
+ \l__siunitx_tmpa_tl . . \q_stop
+ }
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_power_aux:n #1 {
+ \bool_if:NTF \l__siunitx_power_number_bool
+ { \__siunitx_unit_format_power_aux:nn { number } {#1} }
+ { \__siunitx_unit_format_power_aux:nn { unit } {#1} }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_power_aux:nn #1#2 {
+ \bool_if:cTF { l__siunitx_ #1 _math_mode_bool }
+ { \__siunitx_print:nn {#1} {#2} }
+ {
+ \tl_set:Nn \l__siunitx_tmpa_tl {#2}
+ \tl_replace_all:Nnn \l__siunitx_tmpa_tl { - }
+ { \text { \textminus } }
+ \__siunitx_print:nV {#1} \l__siunitx_tmpa_tl
+ }
+}
+\cs_new:Npn \__siunitx_unit_format_power:w #1 . #2 . #3 \q_stop
+ {
+ \exp_not:n {#1}
+ \tl_if_blank:nF {#2}
+ {
+ \exp_not:V \l__siunitx_output_decimal_tl
+ \exp_not:n {#2}
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_power_brackets: {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { bracket- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
+ {
+ \tl_put_left:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_open_tl
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_close_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_power_per: {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { per- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
+ {
+ \bool_if:NF \l__siunitx_per_fraction_bool
+ {
+ \tl_if_in:NnTF \l__siunitx_tmpa_tl { - }
+ {
+ \cs_set:Npn \__siunitx_tmp:w ##1 - ##2 \q_stop
+ { \tl_set:Nn \l__siunitx_tmpa_tl {##2} }
+ \exp_after:wN \__siunitx_tmp:w \l__siunitx_tmpa_tl \q_stop
+ }
+ { \tl_put_left:Nn \l__siunitx_tmpa_tl { - } }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_power_repeat: {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { per- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
+ {
+ \tl_put_left:NV \l__siunitx_unit_current_tl \l__siunitx_per_symbol_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_prefix: {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { prefix-symbol- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ {
+ \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ \l__siunitx_unit_prefix_current_tl
+ \bool_if:NTF \l__siunitx_prefix_symbols_bool
+ { \__siunitx_unit_format_prefix_symbol: }
+ { \__siunitx_unit_format_prefix_number: }
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_prefix_number: {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { prefix-base- \int_use:N \l__siunitx_unit_int }
+ \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ \l__siunitx_tmpa_tl
+ \int_compare:nNnT { \l__siunitx_unit_prefix_base_int } = { 0 }
+ {
+ \int_set:Nn \l__siunitx_unit_prefix_base_int
+ { \l__siunitx_tmpa_tl }
+ }
+ \int_compare:nNnTF
+ { \l__siunitx_unit_prefix_base_int } = { \l__siunitx_tmpa_tl }
+ { \__siunitx_unit_format_prefix_number_calc: }
+ { \msg_error:nn { siunitx } { prefix-base-mismatch } }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_prefix_number_calc: {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { power- \int_use:N \l__siunitx_unit_int }
+ \prop_get:NVNF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ \l__siunitx_tmpa_tl
+ { \tl_set:Nn \l__siunitx_tmpa_tl { 1 } }
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { unit- \int_use:N \l__siunitx_unit_int }
+ \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpb_tl
+ \l__siunitx_tmpb_tl
+ \str_if_eq:VnT \l__siunitx_tmpb_tl { \gram }
+ {
+ \tl_set:Nx \l__siunitx_unit_prefix_current_tl
+ { \int_eval:n { \l__siunitx_unit_prefix_current_tl - 3 } }
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { symbol- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpb_tl { kg }
+ }
+ \tl_set:Nx \l__siunitx_unit_prefix_current_tl
+ {
+ \int_eval:n
+ { \l__siunitx_unit_prefix_current_tl * \l__siunitx_tmpa_tl }
+ }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { per- \int_use:N \l__siunitx_unit_int }
+ \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ {
+ \int_set:Nn \l__siunitx_unit_prefix_int
+ {
+ \l__siunitx_unit_prefix_int
+ - \l__siunitx_unit_prefix_current_tl
+ }
+ }
+ {
+ \int_set:Nn \l__siunitx_unit_prefix_int
+ {
+ \l__siunitx_unit_prefix_int
+ + \l__siunitx_unit_prefix_current_tl
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_prefix_symbol: {
+ \tl_set_eq:NN \l__siunitx_unit_current_tl
+ \l__siunitx_unit_prefix_current_tl
+}
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier: {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { qualifier- \int_use:N \l__siunitx_unit_int }
+ \prop_get:NVNT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ \l__siunitx_tmpa_tl
+ {
+ \use:c
+ {
+ __siunitx_unit_format_qualifier_
+ \l__siunitx_qualifier_mode_tl :
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_brackets: {
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_open_tl
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_close_tl
+}
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_phrase:
+ {
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_qualifier_phrase_tl
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { bracket- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
+ }
+\char_set_catcode_active:N \~
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_space: {
+ \tl_put_right:Nn \l__siunitx_unit_current_tl { \text { ~ } }
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { bracket- \int_use:N \l__siunitx_unit_int }
+ \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
+}
+\char_set_catcode_space:N \~
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_subscript: {
+ \tl_put_right:Nx \l__siunitx_unit_current_tl
+ { \exp_not:N \PrintSubscript { \exp_not:V \l__siunitx_tmpa_tl } }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_text: {
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
+}
+\cs_new_protected:Npn \__siunitx_unit_format_sorted:
+ {
+ \tl_set:Nx \l__siunitx_unit_tl
+ {
+ \exp_not:V \l__siunitx_unit_numerator_tl
+ \bool_lazy_or:nnF
+ { \tl_if_empty_p:N \l__siunitx_unit_numerator_tl }
+ { \tl_if_empty_p:N \l__siunitx_unit_denominator_tl }
+ {
+ \exp_not:N \l__siunitx_unit_product_tl
+ }
+ \exp_not:V \l__siunitx_unit_denominator_tl
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_symbol: {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { symbol- \int_use:N \l__siunitx_unit_int }
+ \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
+ \l__siunitx_tmpa_tl
+ {
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
+ }
+ { \__siunitx_unit_format_symbol_aux: }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_symbol_aux: {
+ \msg_error:nn { siunitx } { prefix-only }
+}
+\cs_new_protected:Npn \__siunitx_unit_format_symbol_aux_alt: {
+ \int_compare:nNnTF { \l__siunitx_unit_int } = { 1 }
+ {
+ \prop_remove:Nn \l__siunitx_unit_prop { prefix-1 }
+ \prop_remove:Nn \l__siunitx_unit_prop { prefix-symbol-1 }
+ \prop_remove:Nn \l__siunitx_unit_prop { prefix-base-1 }
+ \prop_remove:Nn \l__siunitx_unit_prop { total-units }
+ \prop_if_empty:NF \l__siunitx_unit_prop
+ { \msg_error:nn { siunitx } { prefix-only } }
+ }
+ { \msg_error:nn { siunitx } { prefix-only } }
+}
+\bool_new:N \l__siunitx_multi_brackets_bool
+\bool_new:N \l__siunitx_multi_repeat_bool
+\bool_new:N \l__siunitx_product_brackets_bool
+\bool_new:N \l__siunitx_product_power_bool
+\bool_new:N \l__siunitx_product_repeat_bool
+\bool_new:N \l__siunitx_number_unit_repeat_bool
+\keys_define:nn { siunitx } {
+ allow-number-unit-breaks .bool_set:N =
+ \l__siunitx_number_unit_breaks_bool,
+ multi-part-units .choice:,
+ multi-part-units
+ / brackets .code:n =
+ {
+ \bool_set_true:N \l__siunitx_multi_brackets_bool
+ \bool_set_false:N \l__siunitx_multi_repeat_bool
+ },
+ multi-part-units
+ / repeat .code:n =
+ {
+ \bool_set_false:N \l__siunitx_multi_brackets_bool
+ \bool_set_true:N \l__siunitx_multi_repeat_bool
+ },
+ multi-part-units
+ / single .code:n =
+ {
+ \bool_set_false:N \l__siunitx_multi_brackets_bool
+ \bool_set_false:N \l__siunitx_multi_repeat_bool
+ },
+ number-unit-product .tl_set:N =
+ \l__siunitx_number_unit_product_tl,
+ number-unit-separator .tl_set:N =
+ \l__siunitx_number_unit_product_tl,
+ product-units .choice:,
+ product-units
+ / brackets .code:n =
+ {
+ \bool_set_true:N \l__siunitx_product_brackets_bool
+ \bool_set_false:N \l__siunitx_product_power_bool
+ \bool_set_false:N \l__siunitx_product_repeat_bool
+ },
+ product-units
+ / brackets-power .code:n =
+ {
+ \bool_set_true:N \l__siunitx_product_brackets_bool
+ \bool_set_true:N \l__siunitx_product_power_bool
+ \bool_set_false:N \l__siunitx_product_repeat_bool
+ },
+ product-units
+ / power .code:n =
+ {
+ \bool_set_false:N \l__siunitx_product_brackets_bool
+ \bool_set_true:N \l__siunitx_product_power_bool
+ \bool_set_false:N \l__siunitx_product_repeat_bool
+ },
+ product-units
+ / repeat .code:n =
+ {
+ \bool_set_false:N \l__siunitx_product_brackets_bool
+ \bool_set_false:N \l__siunitx_product_power_bool
+ \bool_set_true:N \l__siunitx_product_repeat_bool
+ },
+ product-units
+ / single .code:n =
+ {
+ \bool_set_false:N \l__siunitx_product_brackets_bool
+ \bool_set_false:N \l__siunitx_product_power_bool
+ \bool_set_false:N \l__siunitx_product_repeat_bool
+ },
+}
+\keys_set:nn { siunitx } {
+ multi-part-units = brackets,
+ number-unit-product = \, ,
+ product-units = repeat
+}
+\cs_new_protected:Npn \__siunitx_unit_output:nn #1#2 {
+ \cs_set_eq:NN \__siunitx_unit_format_symbol_aux:
+ \__siunitx_unit_format_symbol_aux_alt:
+ \cs_set_eq:NN \__siunitx_unit_format_fraction_symbol_aux_ii:
+ \__siunitx_unit_format_fraction_symbol_aux_alt:
+ \__siunitx_unit_in:nn {#1} {#2}
+ \int_compare:nNnTF { \l__siunitx_unit_prefix_int } = { 0 }
+ {
+ \str_if_eq:VnT \l__siunitx_per_mode_tl { symbol }
+ {
+ \int_compare:nNnT { \l__siunitx_unit_numerator_int } = { 0 }
+ {
+ \bool_if:NT \l__siunitx_unit_parse_bool
+ { \__siunitx_print:nn { unit } { 1 } }
+ }
+ }
+ }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \int_use:N \l__siunitx_unit_prefix_base_int
+ \exp_not:N \PrintSuperscript
+ { \int_use:N \l__siunitx_unit_prefix_int }
+ }
+ \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
+ \__siunitx_unit_output_number_sep:
+ }
+ \__siunitx_print:nV { unit } \l__siunitx_unit_tl
+}
+\cs_generate_variant:Nn \__siunitx_unit_output:nn { V }
+\cs_new_protected:Npn \__siunitx_unit_output_number_sep: {
+ \bool_if:NTF \l__siunitx_number_unit_breaks_bool
+ { \penalty \binoppenalty } { \nobreak }
+ \bool_if:NTF \l__siunitx_per_auto_bool
+ {
+ \mode_if_math:TF
+ {
+ \tex_mathchoice:D
+ { \l__siunitx_number_unit_product_tl }
+ { \__siunitx_unit_output_number_sep_aux: }
+ { \__siunitx_unit_output_number_sep_aux: }
+ { \__siunitx_unit_output_number_sep_aux: }
+ }
+ { \__siunitx_unit_output_number_sep_aux: }
+ }
+ { \__siunitx_unit_output_number_sep_aux: }
+}
+\cs_new_protected:Npn \__siunitx_unit_output_number_sep_aux: {
+ \bool_if:NF \l__siunitx_omit_unit_space_bool
+ { \l__siunitx_number_unit_product_tl }
+}
+\cs_new_protected:Npn \__siunitx_unit_output_pre_print: {
+ \tl_if_empty:NF \l__siunitx_pre_unit_tl
+ {
+ \nobreak
+ \__siunitx_print:nV { unit } \l__siunitx_pre_unit_tl
+ }
+}
+\cs_new_protected:Npn \__siunitx_unit_output_print: {
+ \int_compare:nNnF { \l__siunitx_unit_prefix_int } = { 0 }
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \bool_if:NTF \l__siunitx_tight_bool
+ {
+ \exp_not:N \ensuremath
+ { { \exp_not:V \l__siunitx_exponent_product_tl } }
+ }
+ {
+ \exp_not:N \ensuremath
+ { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
+ }
+ \int_use:N \l__siunitx_unit_prefix_base_int
+ ^ { \int_use:N \l__siunitx_unit_prefix_int }
+ }
+ \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
+ }
+ \tl_if_empty:NF \l__siunitx_unit_tl
+ {
+ \__siunitx_unit_output_number_sep:
+ \__siunitx_print:nV { unit } \l__siunitx_unit_tl
+ }
+}
+\keys_define:nn { siunitx } {
+ preunit .tl_set:N = \l__siunitx_preunit_tl ,
+}
+\tl_new:N \l__siunitx_pre_unit_tl
+\int_new:N \l__siunitx_number_product_int
+\cs_new_protected:Npn \__siunitx_combined:nnnn #1#2#3#4 {
+ \IfNoValueTF {#3}
+ { \tl_clear:N \l__siunitx_pre_unit_tl }
+ {
+ \group_begin:
+ \__siunitx_unit_in:nn {#3} {#1}
+ \cs_set_eq:NN \l__siunitx_pre_unit_tl \l__siunitx_unit_tl
+ \exp_args:NNNo \group_end:
+ \tl_set:Nn \l__siunitx_pre_unit_tl { \l__siunitx_unit_tl }
+ }
+ \cs_set_eq:NN \l__siunitx_brackets_bool
+ \l__siunitx_multi_brackets_bool
+ \__siunitx_combined_unit:nnn {#2} {#4} {#1}
+ \__siunitx_combined_output:n {#2}
+}
+\cs_new_protected:Npn \__siunitx_combined_output:n #1 {
+ \bool_if:NTF \l__siunitx_number_parse_bool
+ {
+ \tl_clear:N \l__siunitx_number_out_tl
+ \bool_set_false:N \l__siunitx_number_compound_bool
+ \__siunitx_number_output_parse:n {#1}
+ }
+ {
+ \__siunitx_unit_output_pre_print:
+ \__siunitx_print:nn { number } { \ensuremath {#1} }
+ \__siunitx_unit_output_print:
+ }
+}
+\cs_new_protected:Npn \__siunitx_combined_unit:nnn #1#2#3 {
+ \bool_if:NTF \l__siunitx_product_power_bool
+ {
+ \__siunitx_combined_product_count:n {#1}
+ \int_compare:nNnTF { \l__siunitx_number_product_int } > { 0 }
+ {
+ \int_incr:N \l__siunitx_number_product_int
+ \tl_set:Nn \l__siunitx_tmpa_tl {#2}
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { \tothe { \exp_not:V \l__siunitx_number_product_int } }
+ \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
+ \__siunitx_unit_in:Vn \l__siunitx_tmpa_tl {#3}
+ }
+ { \__siunitx_unit_in:nn {#2} {#3} }
+ }
+ { \__siunitx_unit_in:nn {#2} {#3} }
+}
+\cs_new_protected:Npn \__siunitx_combined_product_count:n #1 {
+ \int_zero:N \l__siunitx_number_product_int
+ \tl_set:Nn \l__siunitx_tmpa_tl {#1}
+ \tl_map_function:NN \l__siunitx_input_product_tl
+ \__siunitx_combined_product_count_aux:N
+}
+\cs_new_protected:Npn \__siunitx_combined_product_count_aux:N #1 {
+ \tl_if_in:NnT \l__siunitx_tmpa_tl {#1}
+ {
+ \int_incr:N \l__siunitx_number_product_int
+ \tl_remove_once:Nn \l__siunitx_tmpa_tl {#1}
+ \__siunitx_combined_product_count_aux:N #1
+ }
+}
+\bool_new:N \l__siunitx_list_brackets_bool
+\bool_new:N \l__siunitx_list_repeat_bool
+\tl_new:N \l__siunitx_list_current_tl
+\tl_new:N \l__siunitx_list_tl
+\keys_define:nn { siunitx }
+ {
+ list-final-separator .tl_set:N = \l__siunitx_list_separator_final_tl ,
+ list-pair-separator .tl_set:N = \l__siunitx_list_separator_pair_tl ,
+ list-separator .tl_set:N = \l__siunitx_list_separator_tl ,
+ list-units .choice:,
+ list-units
+ / brackets .code:n =
+ {
+ \bool_set_true:N \l__siunitx_list_brackets_bool
+ \bool_set_false:N \l__siunitx_list_repeat_bool
+ },
+ list-units
+ / repeat .code:n =
+ {
+ \bool_set_false:N \l__siunitx_list_brackets_bool
+ \bool_set_true:N \l__siunitx_list_repeat_bool
+ },
+ list-units
+ / single .code:n =
+ {
+ \bool_set_false:N \l__siunitx_list_brackets_bool
+ \bool_set_false:N \l__siunitx_list_repeat_bool
+ }
+ }
+\keys_set:nn { siunitx }
+ {
+ list-final-separator = { ~ and ~ } ,
+ list-pair-separator = { ~ and ~ } ,
+ list-separator = { , ~ } ,
+ list-units = repeat
+}
+\cs_new_protected:Npn \__siunitx_list_numbers:n #1
+ {
+ \tl_clear:N \l__siunitx_unit_tl
+ \tl_clear:N \l__siunitx_preunit_tl
+ \__siunitx_list_numbers_aux_i:n {#1}
+ }
+\cs_new_protected:Npn \__siunitx_list_numbers_aux_i:n #1
+ {
+ \bool_set_true:N \l__siunitx_list_first_bool
+ \tl_clear:N \l__siunitx_list_current_tl
+ \int_compare:nNnTF { \tl_count:n {#1} } > 2
+ {
+ \tl_map_function:nN {#1} \__siunitx_list_numbers_aux_ii:n
+ \l__siunitx_list_tl
+ \l__siunitx_list_separator_final_tl
+ \l__siunitx_list_current_tl
+ }
+ {
+ \int_compare:nNnTF { \tl_count:n {#1} } = 2
+ { \__siunitx_list_numbers_aux:nn #1 }
+ { \__siunitx_combined_output:n #1 }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_list_numbers_aux_ii:n #1
+ {
+ \tl_if_empty:NTF \l__siunitx_list_tl
+ { \tl_set_eq:NN \l__siunitx_list_tl \l__siunitx_list_current_tl }
+ {
+ \tl_put_right:NV \l__siunitx_list_tl \l__siunitx_list_separator_tl
+ \tl_put_right:NV \l__siunitx_list_tl \l__siunitx_list_current_tl
+ }
+ \tl_set:Nn \l__siunitx_list_current_tl { \__siunitx_combined_output:n {#1} }
+ }
+\cs_new_protected:Npn \__siunitx_list_numbers_aux:nn #1#2
+ {
+ \__siunitx_combined_output:n {#1}
+ \l__siunitx_list_separator_pair_tl
+ \__siunitx_combined_output:n {#2}
+ }
+\cs_new_protected:Npn \__siunitx_list_units:nnn #1#2#3
+ {
+ \__siunitx_unit_parse_options:nn {#2} {#3}
+ \bool_if:NTF \l__siunitx_list_repeat_bool
+ {
+ \__siunitx_unit_in:nn {#2} {#3}
+ \__siunitx_list_numbers_aux_i:n {#1}
+ }
+ {
+ \bool_if:NT \l__siunitx_process_fixed_bool
+ { \bool_set_true:N \l__siunitx_process_drop_exponent_bool }
+ \bool_if:NT \l__siunitx_list_brackets_bool
+ { \__siunitx_print:nV { number } \l__siunitx_bracket_open_tl }
+ \__siunitx_list_numbers:n {#1}
+ \bool_if:NT \l__siunitx_list_brackets_bool
+ { \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl }
+ \__siunitx_range_exponent:
+ \__siunitx_unit_output_number_sep:
+ \__siunitx_unit_output:nn {#2} {#3}
+ }
+ }
+\bool_new:N \l__siunitx_range_brackets_bool
+\bool_new:N \l__siunitx_range_repeat_bool
+\keys_define:nn { siunitx } {
+ range-phrase .tl_set:N = \l__siunitx_range_phrase_tl,
+ range-units .choice:,
+ range-units
+ / brackets .code:n =
+ {
+ \bool_set_true:N \l__siunitx_range_brackets_bool
+ \bool_set_false:N \l__siunitx_range_repeat_bool
+ },
+ range-units
+ / repeat .code:n =
+ {
+ \bool_set_false:N \l__siunitx_range_brackets_bool
+ \bool_set_true:N \l__siunitx_range_repeat_bool
+ },
+ range-units
+ / single .code:n =
+ {
+ \bool_set_false:N \l__siunitx_range_brackets_bool
+ \bool_set_false:N \l__siunitx_range_repeat_bool
+ },
+}
+\keys_set:nn { siunitx } {
+ range-phrase = { ~ to ~ },
+ range-units = repeat,
+}
+\cs_new_protected:Npn \__siunitx_range_numbers:nn #1#2
+ {
+ \__siunitx_range_numbers_aux:n {#1}
+ \l__siunitx_range_phrase_tl
+ \__siunitx_range_numbers_aux:n {#2}
+ }
+\cs_new_protected:Npn \__siunitx_range_numbers_aux:n #1
+ {
+ \bool_if:NTF \l__siunitx_number_parse_bool
+ {
+ \tl_clear:N \l__siunitx_number_out_tl
+ \tl_clear:N \l__siunitx_number_out_saved_tl
+ \bool_set_false:N \l__siunitx_number_compound_bool
+ \__siunitx_number_output_parse:n {#1}
+ \bool_if:NT \l__siunitx_number_compound_bool
+ { \msg_error:nnx { siunitx } { multi-part-range } {#1} }
+ }
+ {
+ \__siunitx_unit_output_pre_print:
+ \__siunitx_print:nn { number } {#1}
+ \__siunitx_unit_output_print:
+ }
+ }
+\cs_new_protected:Npn \__siunitx_range_unit:nnnn #1#2#3#4 {
+ \__siunitx_unit_parse_options:nn {#1} {#2}
+ \bool_if:NTF \l__siunitx_range_repeat_bool
+ {
+ \__siunitx_unit_in:nn {#1} {#2}
+ \__siunitx_range_numbers_aux:n {#3}
+ \l__siunitx_range_phrase_tl
+ \__siunitx_range_numbers_aux:n {#4}
+ }
+ {
+ \bool_if:NT \l__siunitx_process_fixed_bool
+ { \bool_set_true:N \l__siunitx_process_drop_exponent_bool }
+ \bool_if:NT \l__siunitx_range_brackets_bool
+ { \__siunitx_print:nV { number } \l__siunitx_bracket_open_tl }
+ \__siunitx_range_numbers:nn {#3} {#4}
+ \bool_if:NT \l__siunitx_range_brackets_bool
+ { \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl }
+ \__siunitx_range_exponent:
+ \__siunitx_unit_output_number_sep:
+ \__siunitx_unit_output:nn {#1} {#2}
+ }
+}
+\cs_new_protected:Npn \__siunitx_range_exponent:
+ {
+ \bool_if:NT \l__siunitx_process_fixed_bool
+ {
+ \tl_set_eq:NN \l__siunitx_tmpa_tl \l__siunitx_exponent_product_tl
+ \bool_if:NT \l__siunitx_tight_bool
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { \exp_not:N \mathord \exp_not:o \l__siunitx_tmpa_tl }
+ }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:N \ensuremath { { } \exp_not:o \l__siunitx_tmpa_tl { } }
+ 10 \exp_not:N \PrintSuperscript
+ { \int_use:N \l__siunitx_process_fixed_int }
+ }
+ \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
+ }
+ }
+\AtBeginDocument {
+ \@ifpackageloaded { cellspace }
+ {
+ \cs_if_exist:NT \NC@find@S
+ {
+ \newcolumntype { C } [1]
+ { > { \bcolumn #1 \@nil } #1 < { \ecolumn } }
+ \cs_set:Npn \__siunitx_tmp:w #1 \NC@do S #2 \q_stop
+ { \NC@list { #1 #2 } }
+ \exp_after:wN \__siunitx_tmp:w \tex_the:D \NC@list \q_stop
+ \cs_undefine:N \NC@find@S
+ \msg_new:nnn { siunitx } { moved-cellspace-column }
+ { Column~type~for~cellspace~package~moved~to~'#1'. }
+ \msg_warning:nnn { siunitx } { moved-cellspace-column } { C }
+ \ifcellspace@m
+ \def \env@matrix
+ {
+ \hskip -\arraycolsep
+ \let \@ifnextchar \new@ifnextchar
+ \array
+ {
+ * { \c@MaxMatrixCols }
+ { > { \bcolumn c \@nil $ } c < { $ \ecolumn } } @ { }
+ }
+ }
+ \fi
+ }
+ }
+ { }
+}
+\cs_new_protected:Npn \__siunitx_table_rewrite_create:N #1 {
+ \newcolumntype {#1} { }
+ \cs_set_protected:Npn
+ \__siunitx_table_rewrite_create_aux:w \NC@do ##1##2 \NC@do #1
+ { \NC@list { \NC@do ##1 \NC@do #1 ##2 } }
+ \exp_after:wN \__siunitx_table_rewrite_create_aux:w \tex_the:D \NC@list
+ \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [1] [ ]
+ {
+ \@temptokena \exp_after:wN
+ {
+ \tex_the:D \@temptokena
+ > { \__siunitx_table_collect_begin:Nn #1 {##1} }
+ c
+ < { \__siunitx_table_print: }
+ }
+ \NC@find
+ }
+}
+\AtBeginDocument
+ {
+ \@ifpackageloaded { mdwtab }
+ {
+ \cs_set_protected:Npn \__siunitx_table_rewrite_create:N #1
+ {
+ \newcolumntype {#1} [1] []
+ {
+ > { \__siunitx_table_collect_begin:Nn #1 {##1} }
+ c
+ < { \__siunitx_table_print: }
+ }
+ }
+ }
+ { }
+ }
+\cs_new_protected:Npn \__siunitx_table_rewrite_create_aux:w { }
+\AtBeginDocument { \__siunitx_table_rewrite_create:N s }
+\AtBeginDocument { \__siunitx_table_rewrite_create:N S }
+\tl_new:N \l__siunitx_table_collect_tl
+\tl_new:N \l__siunitx_table_collect_pre_tl
+\tl_new:N \l__siunitx_table_collect_post_tl
+\tl_new:N \l__siunitx_number_valid_tl
+\bool_new:N \l__siunitx_table_math_bool
+\bool_new:N \l__siunitx_table_collect_pre_bool
+\bool_new:N \l__siunitx_table_collect_post_bool
+\cs_new_protected:Npn \__siunitx_table_collect_begin:Nn #1#2
+ {
+ \keys_set:nn { siunitx } {#2}
+ \__siunitx_table_collect_begin:Nw #1
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_begin:Nw #1#2 \ignorespaces
+ { \use:c { __siunitx_table_collect_begin_ #1 : } #2 }
+\cs_new_protected:Npn \__siunitx_table_collect_begin_s: {
+ \cs_set_eq:NN \__siunitx_table_collect_token:N
+ \__siunitx_table_collect_token_s:N
+ \cs_set_eq:NN \__siunitx_table_print: \__siunitx_table_print_s:
+ \__siunitx_table_collect_init_s:
+ \__siunitx_table_collect_get:
+}
+\cs_new_protected:Npn \__siunitx_table_collect_begin_S: {
+ \cs_set_eq:NN \__siunitx_table_collect_token:N
+ \__siunitx_table_collect_token_S:N
+ \cs_set_eq:NN \__siunitx_table_print: \__siunitx_table_print_S:
+ \__siunitx_table_collect_init_S:
+ \__siunitx_detect_font:
+ \bool_if:NTF \l__siunitx_number_parse_bool
+ { \__siunitx_table_collect_get: }
+ { \__siunitx_table_print_S_direct: }
+}
+\cs_new_protected:Npn \__siunitx_table_collect_braced:n #1 { }
+\cs_new_protected:Npn \__siunitx_table_collect_expand:N #1 {
+ \cs_if_eq:NNTF #1 \color
+ {
+ \bool_if:NTF \l__siunitx_table_collect_pre_bool
+ {
+ \tl_clear:N \l__siunitx_number_color_tl
+ \tl_clear:N \l__siunitx_unit_color_tl
+ \tl_put_right:Nn \l__siunitx_table_collect_pre_tl {#1}
+ }
+ {
+ \bool_set_true:N \l__siunitx_table_collect_post_bool
+ \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1}
+ }
+ }
+ {
+ \__siunitx_cs_if_tl:NTF #1
+ {
+ \tl_use:N \l__siunitx_table_collect_pre_tl
+ \tl_clear:N \l__siunitx_table_collect_pre_tl
+ \cs_set:Npn \__siunitx_table_collect_next:
+ { \exp_after:wN \__siunitx_table_collect_get: #1 }
+ }
+ {
+ \bool_if:NTF \l__siunitx_table_collect_pre_bool
+ {
+ \tl_put_right:Nn \l__siunitx_table_collect_pre_tl {#1}
+ \__siunitx_table_collect_expand_math:N #1
+ }
+ {
+ \bool_set_true:N \l__siunitx_table_collect_post_bool
+ \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1}
+ }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_table_collect_expand_math:N #1 {
+ \token_if_math_toggle:NTF #1
+ {
+ \bool_if:NTF \l__siunitx_table_math_bool
+ { \bool_set_false:N \l__siunitx_table_math_bool }
+ { \bool_set_true:N \l__siunitx_table_math_bool }
+ }
+ {
+ \cs_if_eq:NNTF #1 \( % \)
+ { \bool_set_true:N \l__siunitx_table_math_bool }
+ { % \(
+ \cs_if_eq:NNT #1 \)
+ { \bool_set_false:N \l__siunitx_table_math_bool }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_table_collect_get:
+ {
+ \cs_set_eq:NN \__siunitx_table_collect_next:
+ \__siunitx_table_collect_get:
+ \peek_catcode_ignore_spaces:NTF \c_group_begin_token
+ { \__siunitx_table_collect_braced:n }
+ { \__siunitx_table_collect_not_braced:N }
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_init: {
+ \tl_clear:N \l__siunitx_table_collect_tl
+ \tl_clear:N \l__siunitx_table_collect_pre_tl
+ \tl_clear:N \l__siunitx_table_collect_post_tl
+ \bool_set_false:N \l__siunitx_table_collect_post_bool
+ \bool_set_false:N \l__siunitx_table_math_bool
+}
+\cs_new_protected:Npn \__siunitx_table_collect_init_s: {
+ \__siunitx_table_collect_init:
+ \bool_set_false:N \l__siunitx_table_collect_pre_bool
+ \cs_set_protected:Npn \__siunitx_table_collect_braced:n ##1
+ {
+ \tl_put_right:Nn \l__siunitx_table_collect_tl { {##1} }
+ \__siunitx_table_collect_next:
+ }
+}
+\cs_new_protected:Npn \__siunitx_table_collect_init_S: {
+ \__siunitx_number_in_init:
+ \tl_set:Nx \l__siunitx_number_valid_tl
+ {
+ \exp_not:V \l__siunitx_input_complex_tl
+ \exp_not:V \l__siunitx_input_decimal_tl
+ \exp_not:V \l__siunitx_input_digit_tl
+ \exp_not:V \l__siunitx_input_exponent_tl
+ \exp_not:V \l__siunitx_input_ignore_tl
+ \exp_not:V \l__siunitx_input_comparator_tl
+ \exp_not:V \l__siunitx_input_uncert_close_tl
+ \exp_not:V \l__siunitx_input_uncert_open_tl
+ \exp_not:V \l__siunitx_input_sign_tl
+ \exp_not:V \l__siunitx_input_symbol_tl
+ }
+ \bool_set_true:N \l__siunitx_table_collect_pre_bool
+ \cs_set_protected:Npn \__siunitx_table_collect_braced:n ##1
+ {
+ \bool_if:NTF \l__siunitx_table_collect_pre_bool
+ { \tl_put_right:Nn \l__siunitx_table_collect_pre_tl { {##1} } }
+ {
+ \bool_set_true:N \l__siunitx_table_collect_post_bool
+ \tl_put_right:Nn \l__siunitx_table_collect_post_tl { {##1} }
+ }
+ \__siunitx_table_collect_next:
+ }
+}
+\cs_new_protected:Npn \__siunitx_table_collect_next: { }
+\cs_new_protected:Npn \__siunitx_table_collect_newline: {
+ \__siunitx_table_print:
+ \cs_set_eq:NN \__siunitx_table_print: \prg_do_nothing:
+ \tabularnewline
+}
+\cs_new_protected:Npn \__siunitx_table_collect_end: {
+ \__siunitx_table_print:
+ \cs_set_eq:NN \__siunitx_table_print: \prg_do_nothing:
+ \end
+}
+\cs_new_protected:Npn \__siunitx_table_collect_not_braced:N #1
+ {
+ \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D
+ {
+ \token_if_eq_meaning:NNF #1 \tex_unskip:D
+ { \__siunitx_table_collect_not_braced_aux_i:N #1 }
+ }
+ \__siunitx_table_collect_next:
+ }
+\AtBeginDocument
+ {
+ \@ifpackageloaded { mdwtab }
+ {
+ \cs_set_protected:Npn \__siunitx_table_collect_not_braced:N #1
+ {
+ \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D
+ {
+ \token_if_eq_meaning:NNF #1 \tex_unskip:D
+ {
+ \token_if_eq_meaning:NNF #1 \tab@setcr
+ {
+ \token_if_eq_meaning:NNF #1 \@maybe@unskip
+ { \__siunitx_table_collect_not_braced_aux_i:N #1 }
+ }
+ }
+ }
+ \__siunitx_table_collect_next:
+ }
+ }
+ { }
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_not_braced_aux_i:N #1 {
+ \cs_set:Npn \__siunitx_table_collect_not_braced_aux_ii:N ##1
+ {
+ \token_if_eq_meaning:NNT #1 ##1
+ { \cs_set_eq:NN \__siunitx_table_collect_next: ##1 }
+ }
+ \tl_map_function:nN
+ { \cs:w \scan_stop: \__siunitx_table_print: }
+ \__siunitx_table_collect_not_braced_aux_ii:N
+ \token_if_eq_meaning:NNT \__siunitx_table_collect_next:
+ \__siunitx_table_collect_get:
+ {
+ \token_if_eq_meaning:NNTF #1 \tabularnewline
+ {
+ \cs_set_eq:NN \__siunitx_table_collect_next:
+ \__siunitx_table_collect_newline:
+ }
+ {
+ \token_if_eq_meaning:NNTF #1 \end
+ {
+ \cs_set_eq:NN \__siunitx_table_collect_next:
+ \__siunitx_table_collect_end:
+ }
+ { \__siunitx_table_collect_token:N #1 }
+ }
+ }
+}
+\cs_new_protected:Npn \__siunitx_table_collect_not_braced_aux_ii:N #1 { }
+\cs_new_protected:Npn \__siunitx_table_collect_token:N #1 { }
+\cs_new_protected:Npn \__siunitx_table_collect_token_s:N #1 {
+ \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
+}
+\cs_new_protected:Npn \__siunitx_table_collect_token_S:N #1 {
+ \bool_if:NTF \l__siunitx_table_collect_post_bool
+ { \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1} }
+ {
+ \tl_if_in:NnTF \l__siunitx_number_valid_tl {#1}
+ {
+ \bool_set_false:N \l__siunitx_table_collect_pre_bool
+ \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
+ }
+ { \__siunitx_table_collect_expand:N #1 }
+ }
+}
+\skip_const:Nn \c__siunitx_one_fill_skip { 0pt plus 1fill }
+\AtBeginDocument
+ {
+ \@ifpackageloaded { colortbl }
+ {
+ \cs_new_protected:Npn \__siunitx_table_colortbl_correction:
+ {
+ \skip_horizontal:n { 0pt plus -0.5fill }
+ \tex_kern:D \c_zero_skip
+ }
+ }
+ { \cs_new_protected:Npn \__siunitx_table_colortbl_correction: { } }
+ }
+\cs_new_protected:Npn \__siunitx_table_align_left:n #1
+ {
+ \__siunitx_table_colortbl_correction:
+ \skip_horizontal:n {#1}
+ \tex_kern:D \c_zero_skip
+ }
+\cs_new_protected:Npn \__siunitx_table_align_right:n #1
+ {
+ \skip_horizontal:n { \c__siunitx_one_fill_skip - #1 }
+ \tex_kern:D \c_zero_skip
+ \__siunitx_table_colortbl_correction:
+ }
+\cs_new_eq:NN \__siunitx_table_column_begin:n \__siunitx_table_align_left:n
+\cs_new_eq:NN \__siunitx_table_column_end:n \__siunitx_table_align_right:n
+\keys_define:nn { siunitx }
+ {
+ table-column-width .code:n =
+ {
+ \dim_compare:nNnTF {#1} = { \c_zero_dim }
+ {
+ \cs_set_eq:NN \__siunitx_table_column_begin:n
+ \__siunitx_table_align_left:n
+ \cs_set_eq:NN \__siunitx_table_column_end:n
+ \__siunitx_table_align_right:n
+ }
+ {
+ \cs_set_protected:Npn \__siunitx_table_column_begin:n ##1
+ {
+ \__siunitx_table_colortbl_correction:
+ \tex_hbox:D to \dim_eval:n {#1}
+ \c_group_begin_token
+ \skip_horizontal:n {##1}
+ \tex_kern:D \c_zero_skip
+ }
+ \cs_set_protected:Npn \__siunitx_table_column_end:n ##1
+ {
+ \skip_horizontal:n { \c__siunitx_one_fill_skip - ##1 }
+ \tex_kern:D \c_zero_skip
+ \c_group_end_token
+ \__siunitx_table_colortbl_correction:
+ }
+ }
+ }
+ }
+\skip_new:N \l__siunitx_table_unit_align_skip
+\keys_define:nn { siunitx }
+ {
+ table-unit-alignment .choice:,
+ table-unit-alignment /
+ center .code:n =
+ {
+ \skip_set:Nn \l__siunitx_table_unit_align_skip
+ { 0pt plus 0.5fill }
+ },
+ table-unit-alignment /
+ left .code:n =
+ { \skip_set:Nn \l__siunitx_table_unit_align_skip { \c_zero_skip } },
+ table-unit-alignment /
+ right .code:n =
+ {
+ \skip_set:Nn \l__siunitx_table_unit_align_skip
+ { 0pt plus 1fill }
+ }
+ }
+\keys_set:nn { siunitx } { table-unit-alignment = center }
+\cs_new_protected:Npn \__siunitx_table_print_s:
+ {
+ \__siunitx_table_column_begin:n { \l__siunitx_table_unit_align_skip }
+ \tl_if_empty:NF \l__siunitx_table_collect_tl
+ { \__siunitx_unit_output:Vn \l__siunitx_table_collect_tl { } }
+ \__siunitx_table_column_end:n { \l__siunitx_table_unit_align_skip }
+ }
+\prop_new:N \l__siunitx_table_model_prop
+\dim_new:N \l__siunitx_table_exponent_dim
+\dim_new:N \l__siunitx_table_integer_dim
+\dim_new:N \l__siunitx_table_mantissa_dim
+\dim_new:N \l__siunitx_table_marker_dim
+\dim_new:N \l__siunitx_table_result_dim
+\dim_new:N \l__siunitx_table_uncert_dim
+\dim_new:N \l__siunitx_table_fill_pre_dim
+\dim_new:N \l__siunitx_table_fill_post_dim
+\dim_new:N \l__siunitx_table_fill_mid_dim
+\box_new:N \l__siunitx_table_pre_box
+\box_new:N \l__siunitx_table_post_box
+\box_new:N \l__siunitx_table_mantissa_box
+\box_new:N \l__siunitx_table_result_box
+\skip_new:N \l__siunitx_table_number_align_skip
+\skip_new:N \l__siunitx_table_text_align_skip
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_main: { }
+\cs_new_protected:Npn \__siunitx_table_print_S_parsed: { }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill:n #1 { }
+\keys_define:nn { siunitx }
+ {
+ table-align-comparator .choice:,
+ table-align-comparator /
+ false .code:n =
+ {
+ \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
+ \__siunitx_table_print_S_reserved_store_fill_pre:n
+ },
+ table-align-comparator /
+ true .code:n =
+ {
+ \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
+ \__siunitx_table_print_S_reserved_store_fill_mid:n
+ },
+ table-align-comparator .default:n = true,
+ table-align-exponent .bool_set:N =
+ \l__siunitx_table_align_exponent_bool,
+ table-align-text-pre .bool_set:N =
+ \l__siunitx_table_align_text_pre_bool,
+ table-align-text-post .bool_set:N =
+ \l__siunitx_table_align_text_post_bool,
+ table-align-uncertainty .bool_set:N = \l__siunitx_table_align_uncert_bool,
+ table-auto-round .bool_set:N = \l__siunitx_table_auto_round_bool,
+ table-number-alignment .choice:,
+ table-number-alignment /
+ center .code:n =
+ {
+ \skip_set:Nn \l__siunitx_table_number_align_skip
+ { 0pt plus 0.5fill }
+ \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
+ \__siunitx_table_print_S_direct_reserved:
+ \cs_set_eq:NN \__siunitx_table_print_S_parsed:
+ \__siunitx_table_print_S_reserved:
+ },
+ table-number-alignment /
+ center-decimal-marker .code:n =
+ {
+ \skip_set:Nn \l__siunitx_table_number_align_skip
+ { 0pt plus 0.5fill }
+ \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
+ \__siunitx_table_print_S_direct_centered:
+ \cs_set_eq:NN \__siunitx_table_print_S_parsed:
+ \__siunitx_table_print_S_centered:
+ },
+ table-number-alignment /
+ left .code:n =
+ {
+ \skip_zero:N \l__siunitx_table_number_align_skip
+ \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
+ \__siunitx_table_print_S_direct_reserved:
+ \cs_set_eq:NN \__siunitx_table_print_S_parsed:
+ \__siunitx_table_print_S_reserved:
+ },
+ table-number-alignment /
+ right .code:n =
+ {
+ \skip_set:Nn \l__siunitx_table_number_align_skip
+ { 0pt plus 1fill }
+ \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
+ \__siunitx_table_print_S_direct_reserved:
+ \cs_set_eq:NN \__siunitx_table_print_S_parsed:
+ \__siunitx_table_print_S_reserved:
+ },
+ table-omit-exponent .bool_set:N =
+ \l__siunitx_table_omit_exponent_bool,
+ table-text-alignment .choice:,
+ table-text-alignment /
+ center .code:n =
+ {
+ \skip_set:Nn \l__siunitx_table_text_align_skip
+ { 0pt plus 0.5fill }
+ },
+ table-text-alignment /
+ left .code:n =
+ { \skip_zero:N \l__siunitx_table_text_align_skip },
+ table-text-alignment /
+ right .code:n =
+ {
+ \skip_set:Nn \l__siunitx_table_text_align_skip
+ { 0pt plus 1fill }
+ },
+ table-comparator .choice:,
+ table-comparator /
+ false .code:n =
+ { \prop_remove:Nn \l__siunitx_table_model_prop { comparator } },
+ table-comparator /
+ true .code:n =
+ { \prop_put:Nnn \l__siunitx_table_model_prop { comparator } { > } },
+ table-comparator .default:n = true,
+ table-figures-decimal .code:n =
+ {
+ \int_compare:nNnTF {#1} = 0
+ {
+ \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-decimal }
+ \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-decimal-raw }
+ \prop_remove:Nn \l__siunitx_table_model_prop
+ { mantissa-decimal-marker }
+ \prop_if_in:NnTF \l__siunitx_table_model_prop { mantissa-integer }
+ {
+ \prop_put:Nnn \l__siunitx_table_model_prop { mantissa }
+ { true }
+ }
+ { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa } }
+ }
+ {
+ \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-decimal }
+ { \prg_replicate:nn {#1} { 8 } }
+ \prop_put:Nnn \l__siunitx_table_model_prop { mantissa-decimal-raw }
+ {#1}
+ \prop_put:Nnn \l__siunitx_table_model_prop { mantissa } { true }
+ \prop_put:NnV \l__siunitx_table_model_prop
+ { mantissa-decimal-marker } \l__siunitx_output_decimal_tl
+ }
+ },
+ table-figures-exponent .code:n =
+ {
+ \int_compare:nNnTF {#1} = 0
+ { \prop_remove:Nn \l__siunitx_table_model_prop { exponent-integer } }
+ {
+ \prop_put:Nnx \l__siunitx_table_model_prop { exponent-integer }
+ { \prg_replicate:nn {#1} { 8 } }
+ \prop_put:Nnn \l__siunitx_table_model_prop { exponent } { true }
+ }
+ },
+ table-figures-integer .code:n =
+ {
+ \int_compare:nNnTF {#1} = 0
+ {
+ \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-integer }
+ \prop_if_in:NnTF \l__siunitx_table_model_prop { mantissa-decimal }
+ {
+ \prop_put:Nnn \l__siunitx_table_model_prop { mantissa }
+ { true }
+ }
+ { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa } }
+ }
+ {
+ \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-integer }
+ { \prg_replicate:nn {#1} { 8 } }
+ \prop_put:Nnn \l__siunitx_table_model_prop { mantissa } { true }
+ }
+ },
+ table-figures-uncertainty .code:n =
+ {
+ \int_compare:nNnTF {#1} = 0
+ { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-uncertainty } }
+ {
+ \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-uncertainty }
+ { \prg_replicate:nn {#1} { 8 } }
+ }
+ },
+ table-parse-only .bool_set:N = \l__siunitx_table_parse_only_bool,
+ table-space-text-pre .tl_set:N = \l__siunitx_table_pre_tl,
+ table-space-text-post .tl_set:N = \l__siunitx_table_post_tl,
+ table-sign-exponent .choice:,
+ table-sign-exponent / true .code:n =
+ { \prop_put:Nnn \l__siunitx_table_model_prop { exponent-sign } { - } },
+ table-sign-exponent / false .code:n =
+ { \prop_remove:Nn \l__siunitx_table_model_prop { exponent-sign } },
+ table-sign-exponent .default:n = true,
+ table-sign-mantissa .choice:,
+ table-sign-mantissa / true .code:n =
+ { \prop_put:Nnn \l__siunitx_table_model_prop { mantissa-sign } { - } },
+ table-sign-mantissa / false .code:n =
+ { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-sign } },
+ table-sign-mantissa .default:n = true,
+ }
+\keys_define:nn { siunitx }
+ {
+ table-alignment .meta:n =
+ {
+ table-number-alignment = #1,
+ table-text-alignment = #1,
+ table-unit-alignment = #1
+ }
+ }
+\keys_define:nn { siunitx }
+ {
+ table-format .code:n =
+ {
+ \bool_set_eq:NN \l__siunitx_process_plus_saved_bool \l__siunitx_process_plus_bool
+ \bool_set_true:N \l__siunitx_process_plus_bool
+ \__siunitx_number_in_parse:n {#1}
+ \prop_set_eq:NN \l__siunitx_table_model_prop \l__siunitx_number_in_prop
+ \tl_clear:N \l__siunitx_tmpa_tl
+ \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
+ \l__siunitx_tmpb_tl
+ {
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { table-figures-integer = \l__siunitx_tmpb_tl }
+ }
+ \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-decimal }
+ \l__siunitx_tmpb_tl
+ {
+ \clist_put_right:Nx \l__siunitx_tmpa_tl
+ { table-figures-decimal = \l__siunitx_tmpb_tl }
+ }
+ \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-uncertainty }
+ \l__siunitx_tmpb_tl
+ {
+ \clist_put_right:Nx \l__siunitx_tmpa_tl
+ { table-figures-uncertainty = \l__siunitx_tmpb_tl }
+ }
+ \prop_if_in:NnTF \l__siunitx_number_in_prop { mantissa-sign }
+ {
+ \clist_put_right:Nn \l__siunitx_tmpa_tl
+ { table-sign-mantissa =true }
+ }
+ {
+ \clist_put_right:Nn \l__siunitx_tmpa_tl
+ { table-sign-mantissa =false }
+ }
+ \prop_get:NnNT \l__siunitx_number_in_prop { exponent-integer }
+ \l__siunitx_tmpb_tl
+ {
+ \clist_put_right:Nx \l__siunitx_tmpa_tl
+ { table-figures-exponent = \l__siunitx_tmpb_tl }
+ }
+ \prop_if_in:NnTF \l__siunitx_number_in_prop { exponent-sign }
+ {
+ \clist_put_right:Nn \l__siunitx_tmpa_tl
+ { table-sign-exponent =true }
+ }
+ {
+ \clist_put_right:Nn \l__siunitx_tmpa_tl
+ { table-sign-exponent =false }
+ }
+ \clist_put_right:Nn \l__siunitx_tmpa_tl
+ { table-number-alignment = center }
+ \keys_set:nV { siunitx } \l__siunitx_tmpa_tl
+ \bool_set_eq:NN \l__siunitx_process_plus_bool \l__siunitx_process_plus_saved_bool
+ }
+ }
+\bool_new:N \l__siunitx_process_plus_saved_bool
+\cs_new_protected:Npn \__siunitx_table_print_S:
+ {
+ \bool_if:NTF \l__siunitx_table_collect_pre_bool
+ {
+ \__siunitx_table_column_begin:n { \l__siunitx_table_text_align_skip }
+ \l__siunitx_table_collect_pre_tl
+ \__siunitx_table_column_end:n { \l__siunitx_table_text_align_skip }
+ }
+ {
+ \__siunitx_table_column_begin:n { \l__siunitx_table_number_align_skip }
+ \bool_if:NTF \l__siunitx_table_parse_only_bool
+ { \__siunitx_table_print_S_no_alignment: }
+ { \__siunitx_table_print_S_alignment: }
+ \bool_if:NTF \l__siunitx_table_align_text_pre_bool
+ { \__siunitx_table_print_S_pre_aligned: }
+ { \__siunitx_table_print_S_pre_not_aligned: }
+ \box_use:N \l__siunitx_table_result_box
+ \bool_if:NTF \l__siunitx_table_align_text_post_bool
+ { \__siunitx_table_print_S_post_aligned: }
+ { \__siunitx_table_print_S_post_not_aligned: }
+ \__siunitx_table_column_end:n { \l__siunitx_table_number_align_skip }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_no_alignment:
+ {
+ \l__siunitx_table_collect_pre_tl
+ \__siunitx_number_output:V \l__siunitx_table_collect_tl
+ \l__siunitx_table_collect_post_tl
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_alignment:
+ { \__siunitx_table_print_S_parsed: }
+\cs_new_protected:Npn \__siunitx_table_print_S_parse:
+ {
+ \bool_set_false:N \l__siunitx_error_bool
+ \__siunitx_number_in_parse:V \l__siunitx_table_collect_tl
+ \bool_if:NF \l__siunitx_error_bool
+ {
+ \bool_if:NTF \l__siunitx_table_omit_exponent_bool
+ {
+ \bool_set_true:N \l__siunitx_process_fixed_bool
+ \__siunitx_number_process:
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
+ \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
+ }
+ { \__siunitx_number_process: }
+ \__siunitx_number_format:
+ \__siunitx_number_output_color:
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_measure:NN #1#2
+ {
+ \tl_if_empty:NTF #1
+ { \dim_zero:N #2 }
+ {
+ \group_begin:
+ \hbox_set:Nn \l__siunitx_tmp_box
+ { \__siunitx_print:nV { number } #1 }
+ \exp_args:NNNo \group_end:
+ \dim_set:Nn #2 { \dim_use:N \box_wd:N \l__siunitx_tmp_box }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_pre_aligned:
+ {
+ \box_use:N \l__siunitx_table_pre_box
+ \hbox_to_wd:nn { \l__siunitx_table_fill_pre_dim } { \tex_hfil:D }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_pre_not_aligned:
+ {
+ \hbox_to_wd:nn { \l__siunitx_table_fill_pre_dim } { \tex_hfil:D }
+ \box_use:N \l__siunitx_table_pre_box
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_post_aligned:
+ {
+ \hbox_to_wd:nn { \l__siunitx_table_fill_post_dim } { \tex_hfil:D }
+ \box_use:N \l__siunitx_table_post_box
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_post_not_aligned:
+ {
+ \box_use:N \l__siunitx_table_post_box
+ \hbox_to_wd:nn { \l__siunitx_table_fill_post_dim } { \tex_hfil:D }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_centered:
+ {
+ \__siunitx_table_print_S_centered_ends:
+ \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
+ \__siunitx_table_print_S_parse:
+ \bool_if:NF \l__siunitx_error_bool
+ {
+ \__siunitx_table_print_S_centered_measure:
+ \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
+ \dim_set:Nn \l__siunitx_table_fill_pre_dim
+ {
+ \l__siunitx_table_result_dim
+ - \l__siunitx_table_integer_dim
+ - \l__siunitx_table_marker_dim
+ }
+ \dim_compare:nNnTF \l__siunitx_table_integer_dim >
+ \l__siunitx_table_fill_pre_dim
+ { \__siunitx_table_print_S_centered_integer: }
+ { \__siunitx_table_print_S_centered_decimal: }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_centered_ends:
+ {
+ \hbox_set:Nn \l__siunitx_table_pre_box
+ {
+ {
+ \l__siunitx_table_collect_pre_tl
+ \bool_if:NT \l__siunitx_table_math_bool
+ {
+ \scan_stop:
+ \c_math_toggle_token
+ }
+ }
+ }
+ \dim_compare:nNnT
+ { \box_wd:N \l__siunitx_table_pre_box } = \c_zero_dim
+ {
+ \box_clear:N \l__siunitx_table_pre_box
+ \l__siunitx_table_collect_pre_tl
+ \bool_set_false:N \l__siunitx_font_set_bool
+ }
+ \hbox_set:Nn \l__siunitx_table_post_box
+ {
+ \bool_if:NT \l__siunitx_table_math_bool
+ {
+ \c_math_toggle_token
+ \scan_stop:
+ }
+ \l__siunitx_table_collect_post_tl
+ }
+ \dim_compare:nNnTF
+ { \box_wd:N \l__siunitx_table_pre_box } >
+ { \box_wd:N \l__siunitx_table_post_box }
+ {
+ \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
+ { \box_wd:N \l__siunitx_table_pre_box }
+ {
+ \hbox_unpack:N \l__siunitx_table_post_box
+ \tex_hfil:D
+ }
+ }
+ {
+ \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
+ { \box_wd:N \l__siunitx_table_post_box }
+ {
+ \tex_hfil:D
+ \hbox_unpack:N \l__siunitx_table_pre_box
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure:
+ {
+ \__siunitx_table_print_S_centered_measure_int_part:
+ \__siunitx_table_print_S_centered_measure_marker:
+ \__siunitx_table_print_S_centered_measure_result:
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_int_part:
+ {
+ \prop_get:NnNF \l__siunitx_number_out_prop { comparator } \l__siunitx_tmpa_tl
+ { \tl_clear:N \l__siunitx_tmpa_tl }
+ \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-sign }
+ \l__siunitx_tmpb_tl
+ { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
+ \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
+ \l__siunitx_tmpb_tl
+ { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
+ \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
+ \l__siunitx_table_integer_dim
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_marker:
+ {
+ \__siunitx_table_print_S_measure:NN \l__siunitx_output_decimal_tl
+ \l__siunitx_table_marker_dim
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_result:
+ {
+ \prop_get:NnN \l__siunitx_number_out_prop { result } \l__siunitx_tmpa_tl
+ \hbox_set:Nn \l__siunitx_table_result_box
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \dim_set:Nn \l__siunitx_table_result_dim
+ { \box_wd:N \l__siunitx_table_result_box }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_centered_integer:
+ {
+ \dim_set:Nn \l__siunitx_table_fill_post_dim
+ { \l__siunitx_table_integer_dim - \l__siunitx_table_fill_pre_dim }
+ \dim_zero:N \l__siunitx_table_fill_pre_dim
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_centered_decimal:
+ {
+ \dim_sub:Nn \l__siunitx_table_fill_pre_dim
+ { \l__siunitx_table_integer_dim }
+ \dim_zero:N \l__siunitx_table_fill_post_dim
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved:
+ {
+ \__siunitx_table_print_S_reserved_init:
+ \__siunitx_table_print_S_reserved_ends:
+ \bool_if:NT \l__siunitx_table_auto_round_bool
+ { \__siunitx_table_print_S_reserved_round_auto: }
+ \__siunitx_table_print_S_parse:
+ \bool_if:NF \l__siunitx_error_bool
+ {
+ \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
+ \__siunitx_table_print_S_reserved_comparator:
+ \__siunitx_table_print_S_reserved_mantissa:
+ \__siunitx_table_print_S_reserved_exponent:
+ \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_init:
+ {
+ \dim_zero:N \l__siunitx_table_fill_mid_dim
+ \dim_zero:N \l__siunitx_table_fill_post_dim
+ \prop_set_eq:NN \l__siunitx_number_in_prop \l__siunitx_table_model_prop
+ \__siunitx_number_process_sign:
+ \__siunitx_number_process_zero_fill:
+ \__siunitx_number_process_mantissa:
+ \prop_if_in:NnF \l__siunitx_number_in_prop { symbolic }
+ { \__siunitx_number_process_uncertainty: }
+ \__siunitx_number_format:
+ \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-decimal-raw }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_put:NnV \l__siunitx_number_out_prop { mantissa-decimal-raw }
+ \l__siunitx_tmpa_tl
+ }
+ \prop_set_eq:NN \l__siunitx_table_model_prop \l__siunitx_number_out_prop
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_ends:
+ {
+ \hbox_set:Nn \l__siunitx_table_pre_box
+ {
+ {
+ \l__siunitx_table_collect_pre_tl
+ \bool_if:NT \l__siunitx_table_math_bool
+ {
+ \scan_stop:
+ \c_math_toggle_token
+ }
+ }
+ }
+ \dim_compare:nNnT
+ { \box_wd:N \l__siunitx_table_pre_box } = \c_zero_dim
+ {
+ \box_clear:N \l__siunitx_table_pre_box
+ \l__siunitx_table_collect_pre_tl
+ \bool_set_false:N \l__siunitx_font_set_bool
+ }
+ \hbox_set:Nn \l__siunitx_tmp_box { { \l__siunitx_table_pre_tl } }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
+ { \box_wd:N \l__siunitx_tmp_box }
+ {
+ \tex_hfil:D
+ \hbox_unpack:N \l__siunitx_table_pre_box
+ }
+ \hbox_set:Nn \l__siunitx_tmp_box { \l__siunitx_table_post_tl }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
+ { \box_wd:N \l__siunitx_tmp_box }
+ {
+ {
+ \bool_if:NT \l__siunitx_table_math_bool
+ {
+ \c_math_toggle_token
+ \scan_stop:
+ }
+ \l__siunitx_table_collect_post_tl
+ }
+ \tex_hfil:D
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_round_auto:
+ {
+ \prop_get:NnNTF \l__siunitx_table_model_prop { mantissa-decimal-raw }
+ \l__siunitx_tmpa_tl
+ { \int_set:Nn \l__siunitx_process_precision_int { \l__siunitx_tmpa_tl } }
+ { \int_zero:N \l__siunitx_process_precision_int }
+ \tl_set:Nn \l__siunitx_round_tl { places }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_comparator:
+ {
+ \prop_get:NnNTF \l__siunitx_table_model_prop { comparator }
+ \l__siunitx_tmpa_tl
+ {
+ \hbox_set:Nn \l__siunitx_tmp_box
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \prop_get:NnNTF \l__siunitx_number_out_prop { comparator }
+ \l__siunitx_tmpa_tl
+ {
+ \hbox_set_to_wd:Nnn \l__siunitx_table_result_box
+ { \box_wd:N \l__siunitx_tmp_box }
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ }
+ {
+ \dim_add:Nn \l__siunitx_table_fill_pre_dim
+ { \box_wd:N \l__siunitx_tmp_box }
+ \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
+ \__siunitx_table_print_S_reserved_store_fill_pre:n
+ }
+ }
+ {
+ \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
+ \__siunitx_table_print_S_reserved_store_fill_pre:n
+ \prop_if_in:NnT \l__siunitx_number_out_prop { comparator }
+ {
+ \msg_error:nnx { siunitx } { table-partial-number }
+ { a~comparator }
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill_pre:n
+ { \dim_add:Nn \l__siunitx_table_fill_pre_dim }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill_mid:n
+ { \dim_add:Nn \l__siunitx_table_fill_mid_dim }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa:
+ {
+ \prop_get:NnNTF \l__siunitx_table_model_prop { mantissa }
+ \l__siunitx_tmpa_tl
+ {
+ \hbox_set:Nn \l__siunitx_tmp_box
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \prop_get:NnNTF \l__siunitx_number_out_prop { mantissa }
+ \l__siunitx_tmpa_tl
+ {
+ \dim_set:Nn \l__siunitx_table_mantissa_dim
+ { \box_wd:N \l__siunitx_tmp_box }
+ \hbox_set:Nn \l__siunitx_table_mantissa_box
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \__siunitx_table_print_S_reserved_mantissa_parts:
+ }
+ {
+ \__siunitx_table_print_S_reserved_store_fill:n
+ { \box_wd:N \l__siunitx_tmp_box }
+ }
+ }
+ {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
+ {
+ \msg_error:nnx { siunitx } { table-partial-number }
+ { a~mantissa }
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_parts:
+ {
+ \__siunitx_table_print_S_reserved_mantissa_integer:
+ \hbox_set:Nn \l__siunitx_table_result_box
+ {
+ \hbox_unpack:N \l__siunitx_table_result_box
+ \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
+ \hbox_unpack:N \l__siunitx_table_mantissa_box
+ }
+ \dim_set:Nn \l__siunitx_table_fill_mid_dim
+ {
+ \l__siunitx_table_mantissa_dim
+ - \box_wd:N \l__siunitx_table_mantissa_box
+ - \l__siunitx_table_integer_dim
+ }
+ \__siunitx_table_print_S_reserved_mantissa_uncert:
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_integer:
+ {
+ \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-sign }
+ \l__siunitx_tmpa_tl
+ { \tl_clear:N \l__siunitx_tmpa_tl }
+ \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-integer }
+ \l__siunitx_tmpb_tl
+ { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
+ \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
+ \l__siunitx_table_integer_dim
+ \prop_get:NnNF \l__siunitx_number_out_prop { mantissa-sign }
+ \l__siunitx_tmpa_tl
+ { \tl_clear:N \l__siunitx_tmpa_tl }
+ \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
+ \l__siunitx_tmpb_tl
+ { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
+ \tl_if_empty:NF \l__siunitx_tmpa_tl
+ {
+ \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
+ \l__siunitx_tmp_dim
+ \dim_sub:Nn \l__siunitx_table_integer_dim { \l__siunitx_tmp_dim }
+ }
+ \__siunitx_table_print_S_reserved_store_fill:n
+ { \l__siunitx_table_integer_dim }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_uncert:
+ {
+ \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-uncertainty }
+ \l__siunitx_tmpa_tl
+ {
+ \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpa_tl
+ \hbox_set:Nn \l__siunitx_tmp_box
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \prop_get:NnNTF \l__siunitx_number_out_prop { mantissa-uncertainty }
+ \l__siunitx_tmpa_tl
+ {
+ \dim_set:Nn \l__siunitx_table_uncert_dim
+ { \box_wd:N \l__siunitx_tmp_box }
+ \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpa_tl
+ \hbox_set:Nn \l__siunitx_tmp_box
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \bool_if:NTF \l__siunitx_table_align_uncert_bool
+ { \__siunitx_table_print_S_reserved_mantissa_uncert_aligned: }
+ { \__siunitx_table_print_S_reserved_mantissa_uncert_not_aligned: }
+ }
+ {
+ \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
+ \__siunitx_table_print_S_reserved_store_fill_mid:n
+ \__siunitx_table_print_S_reserved_store_fill:n
+ { \box_wd:N \l__siunitx_tmp_box }
+ }
+ }
+ }
+\cs_new_protected:Npn
+ \__siunitx_table_print_S_reserved_mantissa_uncert_aligned:
+ {
+ \hbox_set:Nn \l__siunitx_table_result_box
+ {
+ \hbox_unpack:N \l__siunitx_table_result_box
+ \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
+ \hbox_unpack:N \l__siunitx_tmp_box
+ }
+ \dim_set:Nn \l__siunitx_table_fill_mid_dim
+ { \l__siunitx_table_uncert_dim - \box_wd:N \l__siunitx_tmp_box }
+ }
+\cs_new_protected:Npn
+ \__siunitx_table_print_S_reserved_mantissa_uncert_not_aligned:
+ {
+ \hbox_set:Nn \l__siunitx_table_result_box
+ {
+ \hbox_unpack:N \l__siunitx_table_result_box
+ \hbox_unpack:N \l__siunitx_tmp_box
+ }
+ \dim_add:Nn \l__siunitx_table_fill_mid_dim
+ {
+ \l__siunitx_table_uncert_dim
+ - \box_wd:N \l__siunitx_tmp_box
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent:
+ {
+ \prop_get:NnNTF \l__siunitx_table_model_prop { exponent-result }
+ \l__siunitx_tmpa_tl
+ {
+ \prop_if_in:NnT \l__siunitx_table_model_prop { mantissa }
+ { \__siunitx_table_print_S_reserved_exponent_product: }
+ \hbox_set:Nn \l__siunitx_tmp_box
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \prop_get:NnNTF \l__siunitx_number_out_prop { exponent-result }
+ \l__siunitx_tmpa_tl
+ {
+ \dim_set:Nn \l__siunitx_table_exponent_dim
+ { \box_wd:N \l__siunitx_tmp_box }
+ \tl_if_empty:NT \l__siunitx_output_exponent_tl
+ {
+ \prop_if_in:NnTF \l__siunitx_number_out_prop { mantissa }
+ { \__siunitx_table_print_S_reserved_exponent_product: }
+ { \__siunitx_table_print_S_reserved_exponent_product_correction: }
+ }
+ \hbox_set:Nn \l__siunitx_tmp_box
+ { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \bool_if:NTF \l__siunitx_table_align_exponent_bool
+ { \__siunitx_table_print_S_reserved_exponent_aligned: }
+ { \__siunitx_table_print_S_reserved_exponent_not_aligned: }
+ }
+ {
+ \dim_set:Nn \l__siunitx_table_fill_post_dim
+ { \l__siunitx_table_fill_mid_dim + \box_wd:N \l__siunitx_tmp_box }
+ }
+ }
+ {
+ \prop_if_in:NnT \l__siunitx_number_out_prop { exponent-result }
+ {
+ \msg_error:nnx { siunitx } { table-partial-number }
+ { an~exponent }
+ }
+ \dim_set_eq:NN \l__siunitx_table_fill_post_dim
+ \l__siunitx_table_fill_mid_dim
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent_product:
+ {
+ \tl_set_eq:NN \l__siunitx_tmpb_tl \l__siunitx_exponent_product_tl
+ \bool_if:NT \l__siunitx_tight_bool
+ {
+ \tl_set:Nx \l__siunitx_tmpb_tl
+ { \exp_not:N \mathord \exp_not:o \l__siunitx_tmpb_tl }
+ }
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ {
+ \exp_not:N \ensuremath { { } \exp_not:o \l__siunitx_tmpb_tl { } }
+ \exp_not:o \l__siunitx_tmpa_tl
+ }
+ }
+\cs_new_protected:Npn
+ \__siunitx_table_print_S_reserved_exponent_product_correction:
+ {
+ \group_begin:
+ \tl_clear:N \l__siunitx_tmpa_tl
+ \__siunitx_table_print_S_reserved_exponent_product:
+ \tl_set:Nx \l__siunitx_tmpa_tl
+ { { } \exp_not:o \l__siunitx_tmpa_tl { } }
+ \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl \l__siunitx_tmp_dim
+ \exp_args:NNNo \group_end:
+ \dim_set:Nn \l__siunitx_tmp_dim { \dim_use:N \l__siunitx_tmp_dim }
+ \__siunitx_table_print_S_reserved_store_fill:n { \l__siunitx_tmp_dim }
+ \dim_sub:Nn \l__siunitx_table_exponent_dim { \l__siunitx_tmp_dim }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent_aligned:
+ {
+ \hbox_set:Nn \l__siunitx_table_result_box
+ {
+ \hbox_unpack:N \l__siunitx_table_result_box
+ \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
+ \hbox_unpack:N \l__siunitx_tmp_box
+ }
+ \dim_set:Nn \l__siunitx_table_fill_post_dim
+ {
+ \l__siunitx_table_exponent_dim
+ - \box_wd:N \l__siunitx_tmp_box
+ }
+ }
+\cs_new_protected:Npn
+ \__siunitx_table_print_S_reserved_exponent_not_aligned:
+ {
+ \hbox_set:Nn \l__siunitx_table_result_box
+ {
+ \hbox_unpack:N \l__siunitx_table_result_box
+ \hbox_unpack:N \l__siunitx_tmp_box
+ }
+ \dim_set:Nn \l__siunitx_table_fill_post_dim
+ {
+ \l__siunitx_table_fill_mid_dim
+ + \l__siunitx_table_exponent_dim
+ - \box_wd:N \l__siunitx_tmp_box
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct:
+ {
+ \peek_catcode_ignore_spaces:NTF \c_group_begin_token
+ { \__siunitx_table_print_S_direct_text:n }
+ { \__siunitx_table_print_S_direct_main: }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_text:n #1
+ {
+ \__siunitx_table_column_begin:n { \l__siunitx_table_text_align_skip }
+ #1
+ \__siunitx_table_column_end:n { \l__siunitx_table_text_align_skip }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered:
+ {
+ \cs_set_eq:NN \__siunitx_table_print:
+ \__siunitx_table_print_S_direct_centered_end:
+ \hbox_set:Nn \l__siunitx_tmp_box
+ { \ensuremath { \l__siunitx_output_decimal_tl } }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
+ { \box_wd:N \l__siunitx_tmp_box }
+ { \tex_hfil:D }
+ \hbox_set:Nw \l__siunitx_table_pre_box
+ \c_math_toggle_token
+ \tl_map_function:NN \l__siunitx_input_decimal_tl
+ \__siunitx_table_print_S_direct_centered_aux:N
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_aux:N #1
+ {
+ \char_set_active_eq:NN #1 \__siunitx_table_print_S_direct_centered_begin:
+ \char_set_mathcode:nn { `#1 } { "8000 }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_begin:
+ {
+ \c_math_toggle_token
+ \hbox_set_end:
+ \hbox_set:Nw \l__siunitx_table_post_box
+ \c_math_toggle_token
+ \l__siunitx_output_decimal_tl
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_end:
+ {
+ \c_math_toggle_token
+ \hbox_set_end:
+ \dim_compare:nNnTF
+ { \box_wd:N \l__siunitx_table_pre_box } >
+ { \box_wd:N \l__siunitx_table_post_box }
+ {
+ \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
+ { \box_wd:N \l__siunitx_table_pre_box }
+ {
+ \hbox_unpack:N \l__siunitx_table_post_box
+ \tex_hfil:D
+ }
+ }
+ {
+ \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
+ { \box_wd:N \l__siunitx_table_post_box }
+ {
+ \tex_hfil:D
+ \hbox_unpack:N \l__siunitx_table_pre_box
+ }
+ }
+ \box_use:N \l__siunitx_table_pre_box
+ \box_use:N \l__siunitx_table_post_box
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved:
+ {
+ \cs_set_eq:NN \__siunitx_table_print:
+ \__siunitx_table_print_S_direct_reserved_end:
+ \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-integer }
+ \l__siunitx_tmpa_tl
+ { \tl_clear:N \l__siunitx_tmpa_tl }
+ \hbox_set:Nn \l__siunitx_tmp_box
+ {
+ \ensuremath
+ {
+ \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-sign }
+ \l__siunitx_tmpb_tl
+ { \l__siunitx_tmpb_tl }
+ \l__siunitx_tmpa_tl
+ }
+ }
+ \dim_set:Nn \l__siunitx_table_integer_dim
+ { \box_wd:N \l__siunitx_tmp_box }
+ \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-decimal }
+ \l__siunitx_tmpa_tl
+ { \tl_clear:N \l__siunitx_tmpa_tl }
+ \hbox_set:Nn \l__siunitx_tmp_box
+ {
+ \ensuremath
+ {
+ \l__siunitx_output_decimal_tl
+ \l__siunitx_tmpa_tl
+ }
+ }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
+ { \box_wd:N \l__siunitx_tmp_box }
+ { \tex_hfil:D }
+ \tex_setbox:D \l__siunitx_table_pre_box \tex_hbox:D to \l__siunitx_table_integer_dim
+ \c_group_begin_token
+ \c_math_toggle_token
+ \tl_map_function:NN \l__siunitx_input_decimal_tl
+ \__siunitx_table_print_S_direct_reserved_aux:N
+ \tex_hfill:D
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_aux:N #1
+ {
+ \char_set_active_eq:NN #1 \__siunitx_table_print_S_direct_reserved_begin:
+ \char_set_mathcode:nn { `#1 } { "8000 }
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_begin:
+ {
+ \c_math_toggle_token
+ \c_group_end_token
+ \tex_setbox:D \l__siunitx_table_post_box \tex_hbox:D to \box_wd:N \l__siunitx_tmp_box
+ \c_group_begin_token
+ \c_math_toggle_token
+ \l__siunitx_output_decimal_tl
+ }
+\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_end:
+ {
+ \c_math_toggle_token
+ \tex_hfil:D
+ \c_group_end_token
+ \__siunitx_table_align_left:n { \l__siunitx_table_number_align_skip }
+ \box_use:N \l__siunitx_table_pre_box
+ \box_use:N \l__siunitx_table_post_box
+ \__siunitx_table_align_right:n { \l__siunitx_table_number_align_skip }
+ }
+\keys_set:nn { siunitx }
+ {
+ table-align-comparator = true,
+ table-align-exponent = true,
+ table-align-text-pre = true,
+ table-align-text-post = true,
+ table-align-uncertainty = true,
+ table-omit-exponent = false,
+ table-parse-only = false,
+ table-number-alignment = center-decimal-marker,
+ table-text-alignment = center,
+ table-figures-decimal = 2,
+ table-figures-integer = 3
+ }
+\keys_define:nn { siunitx }
+ { redefine-symbols .bool_set:N = \l__siunitx_redefine_symbols_bool }
+\keys_set:nn { siunitx } { redefine-symbols = true }
+\AtBeginDocument
+ {
+ \bool_if:NT \l__siunitx_redefine_symbols_bool
+ {
+ \@ifpackageloaded { fourier }
+ {
+ \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_text_tl
+ { \textohm }
+ { \text { \ensuremath { \l__siunitx_ohm_math_tl } } }
+ }
+ { }
+ \@ifpackageloaded { mathptmx }
+ {
+ \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_text_tl
+ { \textohm }
+ { \text { \ensuremath { \l__siunitx_ohm_math_tl } } }
+ }
+ { }
+ \str_if_eq:VnT \encodingdefault { OT1 }
+ {
+ \__siunitx_option_unchanged:Nnn \l__siunitx_angstrom_math_tl
+ { \text { \AA } }
+ { \text { \capitalring { A } } }
+ \__siunitx_option_unchanged:Nnn \l__siunitx_angstrom_text_tl
+ { \AA }
+ { \capitalring { A } }
+ }
+ \@ifpackageloaded { unicode-math }
+ {
+ \exp_args:NNnx
+ \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
+ { \text { \ensuremath { \Omega } } }
+ { \char_generate:nn { "03A9 } { 12 } }
+ }
+ { }
+ \@ifpackageloaded { upgreek }
+ {
+ \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
+ { \text { \ensuremath { \Omega } } }
+ { \text { \ensuremath { \Upomega } } }
+ }
+ {
+ \cs_if_exist:NT \upOmega
+ {
+ \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
+ { \text { \ensuremath { \Omega } } }
+ { \text { \ensuremath { \upOmega } } }
+ }
+ }
+ }
+ }
+\keys_define:nn { siunitx } {
+ math-angstrom .tl_set:N = \l__siunitx_angstrom_math_tl,
+ math-arcminute .tl_set:N = \l__siunitx_arcminute_math_tl,
+ math-arcsecond .tl_set:N = \l__siunitx_arcsecond_math_tl,
+ math-celsius .tl_set:N = \l__siunitx_celsius_math_tl,
+ math-degree .tl_set:N = \l__siunitx_degree_math_tl,
+ math-micro .tl_set:N = \l__siunitx_micro_math_tl,
+ math-ohm .tl_set:N = \l__siunitx_ohm_math_tl
+}
+\keys_set:nn { siunitx } {
+ math-angstrom = \text { \AA },
+ math-arcminute = { } ^ { \prime },
+ math-arcsecond = { } ^ { \prime \prime },
+ math-celsius = \text { \textdegree } \__siunitx_unit_mathrm:n { C } ,
+ math-degree = \text { \textdegree },
+ math-micro = \text { \textmu },
+ math-ohm = \text { \ensuremath { \Omega } },
+}
+\keys_define:nn { siunitx } {
+ text-angstrom .tl_set:N = \l__siunitx_angstrom_text_tl,
+ text-arcminute .tl_set:N = \l__siunitx_arcminute_text_tl,
+ text-arcsecond .tl_set:N = \l__siunitx_arcsecond_text_tl,
+ text-celsius .tl_set:N = \l__siunitx_celsius_text_tl,
+ text-degree .tl_set:N = \l__siunitx_degree_text_tl,
+ text-micro .tl_set:N = \l__siunitx_micro_text_tl,
+ text-ohm .tl_set:N = \l__siunitx_ohm_text_tl,
+}
+\keys_set:nn { siunitx } {
+ text-angstrom = \AA,
+ text-arcminute = \ensuremath { { } ^ { \prime } },
+ text-arcsecond = \ensuremath { { } ^ { \prime \prime } },
+ text-celsius = \text { \textdegree } C,
+ text-degree = \text { \textdegree },
+ text-micro = \textmu ,
+ text-ohm = \textohm
+}
+\cs_new_protected:Npn \__siunitx_symbol_new:n #1
+ {
+ \cs_set_protected:cpn { SIUnitSymbol #1 }
+ {
+ \use:c
+ {
+ l__siunitx_
+ \str_foldcase:n {#1}
+ _
+ \mode_if_math:TF { math } { text }
+ _tl
+ }
+ }
+ }
+\__siunitx_symbol_new:n { Angstrom }
+\__siunitx_symbol_new:n { Arcminute }
+\__siunitx_symbol_new:n { Arcsecond }
+\__siunitx_symbol_new:n { Celsius }
+\__siunitx_symbol_new:n { Degree }
+\__siunitx_symbol_new:n { Micro }
+\__siunitx_symbol_new:n { Ohm }
+\clist_new:N \l__siunitx_pgf_link_clist
+\cs_new_protected:Npn \__siunitx_pgf_link: {
+ \clist_clear:N \l__siunitx_pgf_link_clist
+ \str_if_eq:VnT \l__siunitx_round_tl { figure }
+ {
+ \clist_put_right:Nn \l__siunitx_pgf_link_clist { fixed }
+ \clist_put_right:Nn \l__siunitx_pgf_link_clist
+ { fixed~zerofill = true }
+ }
+ \clist_put_right:Nx \l__siunitx_pgf_link_clist
+ { precision = \int_use:N \l__siunitx_process_precision_int }
+ \clist_put_right:Nx \l__siunitx_pgf_link_clist
+ {
+ set~decimal~separator =
+ { { \exp_not:V \l__siunitx_output_decimal_tl } }
+ }
+ \clist_put_right:Nx \l__siunitx_pgf_link_clist
+ { set~thousands~separator = { \exp_not:V \l__siunitx_group_sep_tl } }
+ \clist_put_right:Nx \l__siunitx_pgf_link_clist
+ {
+ min~exponent~for~1000~sep = \int_eval:n { \l__siunitx_group_min_int - 1 }
+ }
+ \bool_lazy_or:nnF
+ { \l__siunitx_group_decimal_bool } { \l__siunitx_group_integer_bool }
+ {
+ \clist_put_right:Nn \l__siunitx_pgf_link_clist
+ { min~exponent~for~1000~sep = 999 }
+ }
+ \bool_if:NTF \l__siunitx_process_integer_zero_bool
+ {
+ \clist_put_right:Nn \l__siunitx_pgf_link_clist
+ { skip~0. = false }
+ }
+ {
+ \clist_put_right:Nn \l__siunitx_pgf_link_clist
+ { skip~0. = true }
+ }
+ \str_if_eq:VnTF \l__siunitx_process_sign_tl { + }
+ {
+ \clist_put_right:Nn \l__siunitx_pgf_link_clist
+ { showpos = true }
+ }
+ {
+ \clist_put_right:Nn \l__siunitx_pgf_link_clist
+ { showpos = false }
+ }
+ \use:x
+ {
+ \exp_not:N \pgfqkeys
+ { /pgf/number~format }
+ { \exp_not:V \l__siunitx_pgf_link_clist }
+ }
+}
+\msg_new:nnnn { siunitx } { bad-arc-sign }
+ { Incorrect~use~of~sign~in~degree-minute-second~angle. }
+ { Only~the~highest~value~part~of~an~angle~can~have~a~sign. }
+\msg_new:nnnn { siunitx } { color-not-loaded }
+ { Package~"color"~not~loaded. }
+ { The~command~\token_to_str:N \color \ is~not~available. }
+\msg_new:nnnn { siunitx } { duplicate-complex-root-token }
+ { Duplicate~complex~root~token~'#1'~in~input. }
+ { Only~one~complex~root~token~can~appear~in~a~single~number. }
+\msg_new:nnnn { siunitx } { duplicate-decimal-token }
+ { Duplicate~decimal~marker~token~'#1'~in~input. }
+ { Only~one~decimal~marker~token~can~appear~in~a~single~number. }
+\msg_new:nnnn { siunitx } { duplicate-exponent-token }
+ { Duplicate~exponent~marker~token~'#1'~in~input. }
+ { Only~one~exponent~marker~token~can~appear~in~a~single~number. }
+\msg_new:nnnn { siunitx } { duplicate-quotient-token }
+ { Duplicate~quotient~token. }
+ { Only~one~quotient~token~can~appear~in~a~single~number. }
+\msg_new:nnnn { siunitx } { duplicate-sticky-per }
+ { Duplicate~\token_to_str:N \per. }
+ {
+ When~the~'sticky-per'~option~is~active,~only~one
+ \token_to_str:N \per may~appear~in~a~unit.
+ }
+\msg_new:nnnn { siunitx } { empty-arc }
+ { Empty~degree-minute-second~angle. }
+ { The~angle~given~does~not~contain~any~numbers. }
+\msg_new:nnnn { siunitx } { empty-uncertainty }
+ { Empty~uncertainty~given~in~'#1'. }
+ { The~number~given~contains~an~empty~uncertainty. }
+\msg_new:nnnn { siunitx } { ending-product-token }
+ { Misplaced~product~token. }
+ { A~number~cannot~end~with~a~product~token. }
+\msg_new:nnnn { siunitx } { ending-quotient-token }
+ { Misplaced~quotient~token. }
+ { A~number~cannot~end~with~a~quotient~token. }
+\msg_new:nnnn { siunitx } { invalid-arc-format }
+ { Invalid~degree-minute-second angle~'#1'. }
+ {
+ Angles~given~in~degree-minute-second~format~should~contain~two~';'
+ symbols~to~divide~up~the~parts~of~the~input.
+ }
+\msg_new:nnnn { siunitx } { invalid-number }
+ { Invalid~numerical~input~'#1'. }
+ {
+ The~input~given~as~a~number~does~not~make~logical~sense.~
+ This~happens,~for~example,~if~a~number~only~contains~a~sign.
+ }
+\msg_new:nnnn { siunitx } { invalid-token-in-exponent }
+ { Invalid~exponent~in~numerical~input~'#1'. }
+ {
+ The~exponent~part~of~a~number~cannot~contain~an~uncertainty~or~
+ complex~part: \\
+ the~input~given~appears~to~contain~one~of~these~in~the~exponent.
+ }
+\msg_new:nnnn { siunitx } { invalid-token-in-number }
+ { Invalid~token~'#1'~in~numerical~input. }
+ {
+ Numbers~can~only~contain~tokens~defined~using~the~
+ 'input-...'~options:\\
+ the~token~'#1'~is~not~set~up~as~a~valid~part~of~a~number.
+ }
+\msg_new:nnnn { siunitx } { invalid-token-in-uncertainty }
+ { Invalid~uncertainty~in~numerical~input~'#1'. }
+ {
+ The~uncertainty~part~of~a~number~may~only~contain~digits~or~
+ symbols.
+ }
+\msg_new:nnnn { siunitx } { literal-unit }
+ { Literal~units~disabled. }
+ {
+ You~gave~the~literal~input~'#1'~
+ but~literal~unit~output~is~disabled.
+ }
+\msg_new:nnnn { siunitx } { misplaced-sign-token }
+ { Misplaced~sign~token~'#1'. }
+ { Sign~tokens~can~only~come~at~the~beginning~of~a~number. }
+\msg_new:nnnn { siunitx } { misplaced-complex-root-token }
+ { Misplaced~complex~token~in~numerical~input~'#1'. }
+ {
+ The~root~token~must~come~either~before~or~after~the~real~digits~
+ of~the~complex~part.
+ }
+\msg_new:nnnn { siunitx } { misplaced-uncertainty-token }
+ { Misplaced~uncertainty~token~'#1'. }
+ {
+ The~uncertainty~in~a~number~must~be~given~between~a~set~of~
+ delimiters~as~defined~by~the\\
+ \ \ 'input-open-uncertainty'~and~'input-close-uncertainty'~
+ options.
+ }
+\msg_new:nnnn { siunitx } { multi-part-range }
+ { Numerical~range~with~multiple~parts. }
+ {
+ The~input~'#1'~is~a~number~which~has~more~than~one~part: \\
+ ranges~can~only~contain~one~number~in~each~part.
+ }
+\msg_new:nnn { siunitx } { non-convertible-exponent }
+ { Exponent~'#1'~cannot~be~converted~into~a~symbolic~prefix. }
+\msg_new:nnn { siunitx } { option-not-available }
+ { Option~'#1'~not~available~in~strict~mode. }
+\msg_new:nnn { siunitx } { option-preamble-only }
+ { Option~'#1'~only~available~in~the~preamble. }
+\msg_new:nnnn { siunitx } { prefix-base-mismatch }
+ { Prefix~bases~do~not~match. }
+ {
+ You~have~asked~for~prefixes~to~be~converted~into~a~power,~
+ but~the~bases~do~not~match.
+ }
+\msg_new:nnn { siunitx } { prefix-only }
+ { Prefix~with~no~unit. }
+\msg_new:nnnn { siunitx } { qualifier-before-unit }
+ { Qualifier~before~unit. }
+ { Unit~qualifiers~have~to~follow~after~units,~not~before~them. }
+\msg_new:nnnn { siunitx } { restricted-number }
+ { Token~'#1'~forbidden~in~restricted~numerical~input. }
+ {
+ The~current~input~must~be~a~real~number~and~cannot~contain: \\
+ \ -~an~exponent; \\
+ \ -~an~uncertainty; \\
+ \ -~a~complex~part.
+ }
+\msg_new:nnnn { siunitx } { starting-product-token }
+ { Misplaced~product~token. }
+ { A~number~cannot~begin~with~a~product~token. }
+\msg_new:nnnn { siunitx } { starting-quotient-token }
+ { Misplaced~quotient~token. }
+ { A~number~cannot~begin~with~a~quotient~token. }
+\msg_new:nnnn { siunitx } { table-partial-number }
+ { No~space~reserved~for~#1~\msg_line_context:. }
+ {
+ The~number~in~the~current~table~cell~contains~#1~part,
+ but~you~did~not~reserve~any~space~to~print~it: \\
+ it~will~be~missing~in~the~output.
+ }
+\msg_new:nnnn { siunitx } { unknown-option }
+ { Unknown~option~'#1'. }
+ {
+ The~option~file~'#1'~is~not~known~by~siunitx:
+ perhaps~it~is~spelled~incorrectly.
+ }
+\msg_new:nnnn { siunitx } { version-1-option }
+ { Version~1~option~'#1'~detected. }
+ {
+ Use: \\
+ \ \ \token_to_str:N \usepackage [ version-1-compatibility ]
+ \iow_char:N \{ siunitx \token_to_str:N \iow_char:N \} \\
+ in~the~preamble~to~load~the~appropriate~code.
+ }
+\NewDocumentCommand \DeclareBinaryPrefix { m m m } {
+ \__siunitx_declare_prefix:Nnnn #1 {#2} { 2 } {#3}
+}
+\NewDocumentCommand \DeclareSIPostPower { m m } {
+ \__siunitx_declare_power_after:Nn #1 {#2}
+}
+\NewDocumentCommand \DeclareSIPrefix { m m m } {
+ \__siunitx_declare_prefix:Nnnn #1 {#2} { 10 } {#3}
+}
+\NewDocumentCommand \DeclareSIPrePower { m m } {
+ \__siunitx_declare_power_before:Nn #1 {#2}
+}
+\NewDocumentCommand \DeclareSIQualifier { m m } {
+ \__siunitx_declare_qualifier:Nn #1 {#2}
+}
+\NewDocumentCommand \DeclareSIUnit { O { } m m } {
+ \__siunitx_declare_unit:Nnn #2 {#3} {#1}
+}
+\NewDocumentCommand \DeclareSIUnitWithOptions { m m m } {
+ \__siunitx_declare_unit:Nnn #1 {#2} {#3}
+}
+\@onlypreamble \DeclareBinaryPrefix
+\@onlypreamble \DeclareSIPostPower
+\@onlypreamble \DeclareSIPrefix
+\@onlypreamble \DeclareSIPrePower
+\@onlypreamble \DeclareSIQualifier
+\@onlypreamble \DeclareSIUnit
+\@onlypreamble \DeclareSIUnitWithOptions
+\cs_new_protected:Npn \SendSettingsToPgf { \__siunitx_pgf_link: }
+\NewDocumentCommand \ang { o > { \SplitArgument { 2 } { ; } } m } {
+ \group_begin:
+ \IfNoValueF {#1}
+ { \keys_set:nn { siunitx } {#1} }
+ \__siunitx_angle_output:nnn #2
+ \group_end:
+}
+\NewDocumentCommand \num { o m } {
+ \leavevmode
+ \group_begin:
+ \bool_set_false:N \l__siunitx_font_set_bool
+ \IfNoValueF {#1}
+ { \keys_set:nn { siunitx } {#1} }
+ \__siunitx_number_output:n {#2}
+ \group_end:
+}
+\NewDocumentCommand \numlist { o > { \SplitList { ; } } m } {
+ \leavevmode
+ \group_begin:
+ \bool_set_false:N \l__siunitx_font_set_bool
+ \IfNoValueF {#1}
+ { \keys_set:nn { siunitx } {#1} }
+ \__siunitx_list_numbers:n {#2}
+ \group_end:
+}
+\NewDocumentCommand \numrange { o m m } {
+ \leavevmode
+ \group_begin:
+ \bool_set_false:N \l__siunitx_font_set_bool
+ \IfNoValueF {#1}
+ { \keys_set:nn { siunitx } {#1} }
+ \__siunitx_range_numbers:nn {#2} {#3}
+ \group_end:
+}
+\NewDocumentCommand \SIlist { o > { \SplitList { ; } } m m } {
+ \leavevmode
+ \group_begin:
+ \bool_set_false:N \l__siunitx_font_set_bool
+ \IfNoValueTF {#1}
+ { \__siunitx_list_units:nnn {#2} {#3} { } }
+ {
+ \keys_set:nn { siunitx } {#1}
+ \__siunitx_list_units:nnn {#2} {#3} {#1}
+ }
+ \group_end:
+}
+\NewDocumentCommand \SIrange { o m m m } {
+ \leavevmode
+ \group_begin:
+ \bool_set_false:N \l__siunitx_font_set_bool
+ \IfNoValueTF {#1}
+ { \__siunitx_range_unit:nnnn {#4} { } {#2} {#3} }
+ {
+ \keys_set:nn { siunitx } {#1}
+ \__siunitx_range_unit:nnnn {#4} {#1} {#2} {#3}
+ }
+ \group_end:
+}
+\NewDocumentCommand \SI { o m o m } {
+ \leavevmode
+ \group_begin:
+ \bool_set_false:N \l__siunitx_font_set_bool
+ \IfNoValueTF {#1}
+ { \__siunitx_combined:nnnn { } {#2} {#3} {#4} }
+ {
+ \keys_set:nn { siunitx } {#1}
+ \__siunitx_combined:nnnn {#1} {#2} {#3} {#4}
+ }
+ \group_end:
+}
+\NewDocumentCommand \sisetup { m } {
+ \keys_set:nn { siunitx } {#1}
+}
+\NewDocumentCommand \tablenum { o m } {
+ \leavevmode
+ \group_begin:
+ \bool_set_false:N \l__siunitx_font_set_bool
+ \IfNoValueF {#1}
+ { \keys_set:nn { siunitx } {#1} }
+ \bool_if:NTF \l__siunitx_number_parse_bool
+ {
+ \tl_set:Nn \l__siunitx_table_collect_tl {#2}
+ \bool_set_false:N \l__siunitx_table_collect_pre_bool
+ \__siunitx_table_print_S:
+ }
+ { \__siunitx_table_print_S_direct: #2 \__siunitx_table_print: }
+ \group_end:
+}
+\NewDocumentCommand \si { o m } {
+ \leavevmode
+ \group_begin:
+ \bool_set_false:N \l__siunitx_font_set_bool
+ \IfNoValueTF {#1}
+ { \__siunitx_unit_output:nn {#2} { } }
+ {
+ \keys_set:nn { siunitx } {#1}
+ \__siunitx_unit_output:nn {#2} {#1}
+ }
+ \group_end:
+}
+\cs_new_protected:Npn \__siunitx_contents_bookmarks:
+ {
+ \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
+ { \__siunitx_unit_print_literal_aux:N ##1 }
+ \cs_if_exist:NT \FB@fg
+ { \cs_set_eq:NN \fg \FB@fg }
+ \msg_redirect_name:nnn { xparse } { redefine-command } { none }
+ \cs_set_eq:NN \num \numInBookmark
+ \cs_set_eq:NN \numrange \numrangeInBookmark
+ \cs_set_eq:NN \si \siInBookmark
+ \cs_set_eq:NN \SI \SIInBookmark
+ \cs_set_eq:NN \SIrange \SIrangeInBookmark
+ \cs_set_eq:NN \si \siInBookmark
+ \cs_set_eq:NN \highlight \use_ii:nn
+ \cs_set_eq:NN \__siunitx_textsuperscript:n \use:n
+ \cs_set:Npn \SIUnitSymbolAngstrom { \AA }
+ \cs_set:Npn \SIUnitSymbolArcminute { ' }
+ \cs_set:Npn \SIUnitSymbolArcsecond { '' }
+ \cs_set:Npn \SIUnitSymbolCelsius { \textcelsius }
+ \cs_set:Npn \SIUnitSymbolDegree { \textdegree }
+ \cs_set:Npn \SIUnitSymbolMicro { \textmu }
+ \cs_set:Npn \SIUnitSymbolOhm { \textohm }
+ }
+\DeclareExpandableDocumentCommand \numInBookmark { o m } {#2}
+\DeclareExpandableDocumentCommand \numrangeInBookmark { o m m }
+ { #2 \l__siunitx_range_phrase_tl #3 }
+\DeclareExpandableDocumentCommand \SIInBookmark { o m o m }
+ { \IfNoValueF {#3} {#3} #2 ~ #4 }
+\DeclareExpandableDocumentCommand \SIlistInBookmark
+ { o m m } { \__siunitx_bookmark_SIlist_map:nn {#1} {#2} }
+\DeclareExpandableDocumentCommand \SIrangeInBookmark
+ { o m m m } { #2 ~ #4 \l__siunitx_range_phrase_tl #3 ~ #4 }
+\DeclareExpandableDocumentCommand \siInBookmark { o m } {#2}
+\cs_new:Npn \__siunitx_bookmark_SIlist_map:nn #1#2 {
+ \__siunitx_bookmark_SIlist_map_aux:nw {#2} #1 ; \q_recursion_tail ;
+ \q_recursion_tail ; \q_recursion_stop
+}
+\cs_new:Npn \__siunitx_bookmark_SIlist_map_aux:nw #1#2 ; #3 ; #4 {
+ #2 ~ #1
+ \quark_if_recursion_tail_stop:n {#3}
+ \quark_if_recursion_tail_stop_do:nn {#4}
+ {
+ \l__siunitx_list_separator_final_tl
+ #3 ~ #1
+ }
+ \l__siunitx_list_separator_tl
+ \__siunitx_bookmark_SIlist_map_aux:nw {#1} #3 ; #4
+}
+\AtBeginDocument {
+ \@ifpackageloaded { hyperref }
+ { \pdfstringdefDisableCommands { \__siunitx_contents_bookmarks: } }
+ { }
+}
+\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 \degreeCelsius { \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 [ number-unit-product = ] \arcmin { \arcminute }
+\DeclareSIUnit [ number-unit-product = ]
+ \arcminute { \SIUnitSymbolArcminute }
+\DeclareSIUnit [ number-unit-product = ]
+ \arcsecond { \SIUnitSymbolArcsecond }
+\DeclareSIUnit \day { d }
+\DeclareSIUnit[ number-unit-product = ] \degree { \SIUnitSymbolDegree }
+\DeclareSIUnit \hectare { ha }
+\DeclareSIUnit \hour { h }
+\DeclareSIUnit \litre { l }
+\DeclareSIUnit \liter { L }
+\DeclareSIUnit \minute { min }
+\DeclareSIUnit \percent { \char 37 }
+\DeclareSIUnit \tonne { t }
+\DeclareSIUnit \astronomicalunit { au }
+\DeclareSIUnit \atomicmassunit { u }
+\DeclareSIUnit \electronvolt { eV }
+\DeclareSIUnit \dalton { Da }
+\group_begin:
+\cs_set_eq:NN \endgroup \group_end:
+\char_set_catcode_math_subscript:N \_
+\use:n
+ {
+ \endgroup
+ \DeclareSIUnit \clight { \text { \ensuremath { c _ { 0 } } } }
+ \DeclareSIUnit \electronmass
+ { \text { \ensuremath { m _ { \textup { e } } } } }
+ }
+\DeclareSIUnit \planckbar { \text { \ensuremath { \hbar } } }
+\DeclareSIUnit \elementarycharge { \text { \ensuremath { e } } }
+\group_begin:
+\cs_set_eq:NN \endgroup \group_end:
+\char_set_catcode_math_subscript:N \_
+\use:n
+ {
+ \endgroup
+ \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 }
+\DeclareSIPrePower \square { 2 }
+\DeclareSIPostPower \squared { 2 }
+\DeclareSIPrePower \cubic { 3 }
+\DeclareSIPostPower \cubed { 3 }
+\keys_define:nn { siunitx } {
+ strict .code:n =
+ {
+ \keys_set:nn { siunitx }
+ {
+ bracket-numbers = true,
+ detect-family = false,
+ detect-mode = false,
+ detect-shape = false,
+ detect-weight = false,
+ multi-part-units = brackets,
+ parse-numbers = true,
+ parse-units = true,
+ product-units = repeat
+ }
+ \__siunitx_strict_option:n
+ {
+ bracket-numbers ,
+ detect-family ,
+ detect-italic ,
+ detect-mode ,
+ detect-shape ,
+ detect-weight ,
+ multi-part-units ,
+ parse-numbers ,
+ parse-units ,
+ product-units
+ }
+ \keys_define:nn { siunitx }
+ {
+ per-mode / repeated-symbol .code:n =
+ {
+ \msg_warning:nnx { siunitx } { option-not-available }
+ { per-mode~=~repeated-symbol }
+ }
+ }
+ }
+}
+\__siunitx_option_deactivate:n { strict }
+\cs_new_protected:Npn \__siunitx_strict_option:n #1 {
+ \clist_map_function:nN {#1} \__siunitx_strict_option_aux:n
+}
+\cs_new_protected:Npn \__siunitx_strict_option_aux:n #1 {
+ \keys_define:nn { siunitx }
+ { #1 .code:n =
+ { \msg_warning:nnx { siunitx } { option-not-available } {#1} }
+ }
+}
+\keys_define:nn { siunitx } {
+ locale .choice:,
+ locale /
+ DE .meta:n =
+ {
+ exponent-product = \ensuremath { \cdot } ,
+ inter-unit-product = \, ,
+ output-decimal-marker = { , }
+ },
+ locale /
+ FR .meta:n =
+ {
+ exponent-product = \ensuremath { \times } ,
+ inter-unit-product = \, ,
+ output-decimal-marker = { , }
+ },
+ locale /
+ UK .meta:n =
+ {
+ exponent-product = \ensuremath { \times } ,
+ inter-unit-product = \, ,
+ output-decimal-marker = .
+ },
+ locale /
+ US .meta:n = { locale = UK },
+ locale /
+ USA .meta:n = { locale = UK },
+ locale /
+ ZA .meta:n =
+ {
+ exponent-product = \ensuremath { \times } ,
+ inter-unit-product = \ensuremath { \cdot } ,
+ output-decimal-marker = { , }
+ },
+}
+\file_if_exist:nT { translator.sty }
+ {
+ \RequirePackage { translator }
+ \usedictionary { translator-basic-dictionary }
+ \providetranslation [ to = English ]
+ { to~(numerical~range) } { to }
+ \providetranslation [ to = French ]
+ { to~(numerical~range) } { \`a }
+ \providetranslation [ to = German ]
+ { to~(numerical~range) } { bis }
+ \providetranslation [ to = Spanish ]
+ { to~(numerical~range) } { a }
+ \sisetup
+ {
+ list-final-separator = { ~ \translate { and } ~ },
+ list-pair-separator = { ~ \translate { and } ~ },
+ range-phrase = { ~ \translate { to~(numerical~range) } ~ }
+ }
+ }
+\tl_const:Nn \c__siunitx_configuration_ext_tl { cfg }
+\keys_define:nn { siunitx }
+ {
+ abbreviations .choice:,
+ abbreviations /
+ true .code:n = { \__siunitx_load_abbreviations: },
+ abbreviations /
+ false .code:n =
+ { \cs_set_eq:NN \__siunitx_load_abbreviations: \prg_do_nothing: } ,
+ abbreviations .default:n = true ,
+ binary-units .choice:,
+ binary-units /
+ true .code:n = { \AtBeginDocument { \__siunitx_load_binary: } },
+ binary-units /
+ false .code:n =
+ { \cs_set_eq:NN \__siunitx_load_binary: \prg_do_nothing: } ,
+ binary-units .default:n = true
+ }
+\cs_new_protected:Npn \__siunitx_load_abbreviations:
+ {
+ \@onefilewithoptions { siunitx-abbreviations } [ ] [ ]
+ \c__siunitx_configuration_ext_tl
+ }
+\cs_new_protected:Npn \__siunitx_load_binary:
+ {
+ \@onefilewithoptions { siunitx-binary } [ ] [ ]
+ \c__siunitx_configuration_ext_tl
+ }
+\AtBeginDocument { \__siunitx_load_abbreviations: }
+\__siunitx_option_deactivate:n { abbreviations , binary }
+\keys_define:nn { siunitx }
+ {
+ version-1-compatibility .choice: ,
+ version-1-compatibility /
+ true .code:n =
+ {
+ \@onefilewithoptions { siunitx-version-1 } [ ] [ ]
+ \c__siunitx_configuration_ext_tl
+ },
+ version-1-compatibility /
+ false .code:n = { } ,
+ version-1-compatibility .default:n = true
+ }
+\__siunitx_option_deactivate:n { version-1-compatibility }
+\keys_define:nn { siunitx } {
+ load-configurations .code:n =
+ {
+ \clist_if_in:nnT {#1} { version-1 }
+ {
+ \@onefilewithoptions { siunitx-version-1 } [ ] [ ]
+ \c__siunitx_configuration_ext_tl
+ }
+ }
+}
+\__siunitx_option_deactivate:n { load-configurations }
+\file_if_exist:nT { siunitx . \c__siunitx_configuration_ext_tl }
+ {
+ \@onefilewithoptions { siunitx } [ ] [ ]
+ \c__siunitx_configuration_ext_tl
+ }
+\ProcessKeysOptions { siunitx }
+\AtBeginDocument {
+ \bool_if:NTF \l__siunitx_create_free_bool
+ { \__siunitx_unit_create_functions: }
+ { \__siunitx_unit_create_empty_functions: }
+}
+%% Copyright (C) 2008-2021 by
+%% Joseph Wright <joseph.wright@morningstar2.co.uk>
+%%
+%% 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-v2.sty'.
diff --git a/Master/texmf-dist/tex/latex/siunitx/siunitx-version-1.cfg b/Master/texmf-dist/tex/latex/siunitx/siunitx-version-1.cfg
index 4ae7beac851..4eb5b97e05f 100644
--- a/Master/texmf-dist/tex/latex/siunitx/siunitx-version-1.cfg
+++ b/Master/texmf-dist/tex/latex/siunitx/siunitx-version-1.cfg
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% siunitx.dtx (with options: `config,version-1')
+%% siunitx-v2.dtx (with options: `config,version-1')
%% ---------------------------------------------------------------
%% The siunitx package --- A comprehensive (SI) units package
%% Maintained by Joseph Wright
diff --git a/Master/texmf-dist/tex/latex/siunitx/siunitx.sty b/Master/texmf-dist/tex/latex/siunitx/siunitx.sty
index 8c6bd053e13..84ea93a78da 100644
--- a/Master/texmf-dist/tex/latex/siunitx/siunitx.sty
+++ b/Master/texmf-dist/tex/latex/siunitx/siunitx.sty
@@ -4,7634 +4,7331 @@
%%
%% 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
-%% ---------------------------------------------------------------
+%% siunitx.dtx (with options: `package,init')
+%% siunitx-angle.dtx (with options: `package')
+%% siunitx-complex.dtx (with options: `package')
+%% siunitx-compound.dtx (with options: `package')
+%% siunitx-locale.dtx (with options: `package')
+%% siunitx-number.dtx (with options: `package')
+%% siunitx-print.dtx (with options: `package')
+%% siunitx-table.dtx (with options: `package')
+%% siunitx-unit.dtx (with options: `package')
+%% siunitx-quantity.dtx (with options: `package')
+%% siunitx-symbol.dtx (with options: `package')
+%% siunitx-abbreviation.dtx (with options: `package')
+%% siunitx-binary.dtx (with options: `package')
+%% siunitx-command.dtx (with options: `package')
+%% siunitx-emulation.dtx (with options: `package,options')
+%% siunitx.dtx (with options: `package,options')
+%% siunitx-emulation.dtx (with options: `package,interfaces')
+%% siunitx.dtx (with options: `package,interfaces')
%%
-\RequirePackage{expl3}[2020/01/12]
-\RequirePackage{xparse}
-\ProvidesExplPackage {siunitx} {2021-04-17} {2.8e}
- {A comprehensive (SI) units package}
-\@ifpackagelater { expl3 } { 2020/01/12 }
- { }
- {
- \PackageError { siunitx } { Support~package~expl3~too~old }
- {
- You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+\DeclareRelease{2}{2010-05-23}{siunitx-v2.sty}
+\DeclareRelease{v2}{2010-05-23}{siunitx-v2.sty}
+\DeclareCurrentRelease{}{2021-05-17}
+\@ifundefined{ExplFileDate}
+ {\RequirePackage{expl3}}
+ {}
+\@ifl@t@r\ExplFileDate{2018-06-01}
+ {}
+ {%
+ \PackageError{siunitx}{Support package expl3 too old}
+ {%
+ You need to update your installation of the bundles 'l3kernel' and
'l3packages'.\MessageBreak
- Loading~siunitx~will~abort!
- }
- \tex_endinput:D
- }
+ Loading~siunitx~will~abort!%
+ }%
+ \endinput
+ }%
+\ProvidesExplPackage {siunitx} {2021-05-17} {3.0.0}
+ {A comprehensive (SI) units package}
\msg_new:nnnn { siunitx } { incompatible-package }
{ Package~'#1'~incompatible. }
{ The~#1~package~and~siunitx~are~incompatible. }
-\cs_new_protected:Npn \__siunitx_load_check:n #1 {
- \group_begin:
+\cs_new_protected:Npn \__siunitx_load_check:n #1
+ {
\@ifpackageloaded {#1}
{ \msg_error:nnx { siunitx } { incompatible-package } {#1} }
{ }
- \group_end:
-}
+ }
\clist_map_function:nN
- { SIunits , sistyle , siunits , SIstyle , unitsdef , fancyunits }
+ { SIunits , sistyle , unitsdef , fancyunits }
\__siunitx_load_check:n
-\AtBeginDocument {
- \clist_map_function:nN { SIunits , sistyle , siunits , SIstyle }
- \__siunitx_load_check:n
-}
-\RequirePackage{ amstext , array , l3keys2e }
-\@ifl@t@r \fmtversion { 2020-10-01 }
- { \cs_new_eq:NN \__siunitx_if_hooks:TF \use_i:nn }
- { \cs_new_eq:NN \__siunitx_if_hooks:TF \use_ii:nn }
-\cs_new:Npn \__siunitx_tmp:w { }
-\cs_generate_variant:Nn \clist_map_function:nN { nc }
-\cs_generate_variant:Nn \tl_if_blank:nTF { V }
-\cs_generate_variant:Nn \tl_replace_all:Nnn { No, NV , Nx }
-\bool_new:N \l__siunitx_tmp_bool
-\box_new:N \l__siunitx_tmp_box
-\dim_new:N \l__siunitx_tmp_dim
-\int_new:N \l__siunitx_tmp_int
-\tl_new:N \l__siunitx_tmpa_tl
-\tl_new:N \l__siunitx_tmpb_tl
-\cs_new_protected:Npn \__siunitx_error:nxx #1#2#3 {
- \bool_set_true:N \l__siunitx_error_bool
- \msg_error:nnxx { siunitx } {#1} {#2} {#3}
-}
-\cs_new_protected:Npn \__siunitx_error:nx #1#2 {
- \__siunitx_error:nxx {#1} {#2} { }
-}
-\cs_new_protected:Npn \__siunitx_error:n #1 {
- \__siunitx_error:nxx {#1} { } { }
-}
-\bool_new:N \l__siunitx_error_bool
-\AtBeginDocument {
- \cs_if_free:cT { T@TS1 }
- { \RequirePackage { textcomp } }
-}
-\cs_new_protected:Npn \__siunitx_tl_put_left_math:Nn #1#2
- { \tl_put_left:Nn #1 { \ensuremath {#2} } }
-\cs_generate_variant:Nn \__siunitx_tl_put_left_math:Nn { NV }
-\exp_args:NNx \seq_const_from_clist:Nn \c__siunitx_old_options_seq
- {
- \tl_to_str:n
- {
- addsign ,
- allowlitunits ,
- allowoptarg ,
- allowzeroexp ,
- alsoload ,
- angformat ,
- anglesep ,
- astroang ,
- closeerr ,
- closrfrac ,
- closerange ,
- colour ,
- colorall ,
- colourall ,
- colorneg ,
- colourneg ,
- colourunits ,
- colourunits ,
- colorvalues ,
- colourvalues ,
- decimalsymbol ,
- debug ,
- detectdisplay ,
- digitsep ,
- dp ,
- emulate ,
- errspace ,
- eVcorra ,
- eVcorrb ,
- expbase ,
- expproduct ,
- fixdp ,
- fixsf ,
- fraction ,
- inlinebold ,
- loctolang ,
- log ,
- load ,
- mathOmega ,
- mathcelsius ,
- mathdegree ,
- mathminute ,
- mathmu ,
- mathringA ,
- mathrm ,
- mathsOmega ,
- mathscelsius ,
- mathsdegree ,
- mathsecond ,
- mathsf ,
- mathsminute ,
- mathsmu ,
- mathsringA ,
- mathsrm ,
- mathssecond ,
- mathssf ,
- mathstt ,
- mathtt ,
- negcolor ,
- negcolour ,
- noload ,
- numaddn ,
- numcloseerr ,
- numdecimal ,
- numdigits ,
- numdiv ,
- numexp ,
- numgobble ,
- numopenerr ,
- numprod ,
- numsign ,
- obeyall ,
- obeybold ,
- obeyfamily ,
- obeymode ,
- obeyitalic ,
- openerr ,
- openfrac ,
- openrange ,
- padangle ,
- padnumber ,
- per ,
- prefixbase ,
- prefixproduct ,
- prefixsymbolic ,
- prespace ,
- redefsymbols ,
- repeatunits ,
- retainplus ,
- seperr ,
- sepfour ,
- sf ,
- sign ,
- slash ,
- stickyper ,
- strictarc ,
- tabalign ,
- tabalignexp ,
- tabautofit ,
- tabexpalign ,
- tabformat ,
- tabnumalign ,
- tabparseonly ,
- tabtextalign ,
- textOmega ,
- textcelsius ,
- textdegree ,
- textminute ,
- textmode ,
- textmu ,
- textringA ,
- textrm ,
- textsecond ,
- textsf ,
- texttt ,
- tightpm ,
- tophrase ,
- trapamigerr ,
- trapambigfrac ,
- trapambigrange ,
- unitcolor ,
- unitcolour ,
- unitmathrm ,
- unitmathsf ,
- unitmathsrm ,
- unitmathssf ,
- unitmathstt ,
- unitmathtt ,
- unitmode ,
- unitsep ,
- unitspace ,
- valuecolor ,
- valuecolour ,
- valuemathrm ,
- valuemathsf ,
- valuemathsrm ,
- valuemathssf ,
- valuemathstt ,
- valuemathtt ,
- valuemode ,
- valuesep ,
- xspace
- }
+\AtBeginDocument
+ {
+ \clist_map_function:nN { SIunits , sistyle }
+ \__siunitx_load_check:n
}
-\tl_new:N \l__siunitx_key_tl
-\keys_define:nn { siunitx } {
- unknown .code:n =
- {
- \seq_if_in:NVTF \c__siunitx_old_options_seq \l_keys_key_tl
+\providecommand \IfFormatAtLeastTF { \@ifl@t@r \fmtversion }
+\tl_new:N \l__siunitx_tmp_tl
+\bool_new:N \l__siunitx_angle_tmp_bool
+\dim_new:N \l__siunitx_angle_tmp_dim
+\tl_new:N \l__siunitx_angle_tmp_tl
+\keys_define:nn { siunitx }
+ {
+ angle-mode .choice: ,
+ angle-mode / arc .code:n =
+ {
+ \bool_set_true:N \l__siunitx_angle_force_arc_bool
+ \bool_set_false:N \l__siunitx_angle_force_decimal_bool
+ } ,
+ angle-mode / decimal .code:n =
+ {
+ \bool_set_false:N \l__siunitx_angle_force_arc_bool
+ \bool_set_true:N \l__siunitx_angle_force_decimal_bool
+ } ,
+ angle-mode / input .code:n =
+ {
+ \bool_set_false:N \l__siunitx_angle_force_arc_bool
+ \bool_set_false:N \l__siunitx_angle_force_decimal_bool
+ } ,
+ angle-symbol-degree .tl_set:N =
+ \l__siunitx_angle_symbol_degree_tl ,
+ angle-symbol-minute .tl_set:N =
+ \l__siunitx_angle_symbol_minute_tl ,
+ angle-symbol-second .tl_set:N =
+ \l__siunitx_angle_symbol_second_tl ,
+ angle-symbol-over-decimal .bool_set:N =
+ \l__siunitx_angle_astronomy_bool ,
+ angle-separator .tl_set:N =
+ \l__siunitx_angle_separator_tl ,
+ fill-angle-degrees .bool_set:N =
+ \l__siunitx_angle_fill_degrees_bool ,
+ fill-angle-minutes .bool_set:N =
+ \l__siunitx_angle_fill_minutes_bool ,
+ fill-angle-seconds .bool_set:N =
+ \l__siunitx_angle_fill_seconds_bool ,
+ number-angle-product .tl_set:N =
+ \l__siunitx_angle_product_tl
+ }
+\bool_new:N \l__siunitx_angle_force_arc_bool
+\bool_new:N \l__siunitx_angle_force_decimal_bool
+\cs_new_protected:Npn \siunitx_angle:n #1
+ {
+ \bool_if:NTF \l__siunitx_angle_force_arc_bool
+ { \exp_args:Ne \__siunitx_angle_arc_convert:n { \fp_eval:n {#1} } }
+ {
+ \siunitx_number_parse:nN {#1} \l__siunitx_angle_degrees_tl
+ \tl_set:Nx \l__siunitx_angle_degrees_tl
+ { \siunitx_number_output:NN \l__siunitx_angle_degrees_tl \q_nil }
+ \__siunitx_angle_arc_print:VVV
+ \l__siunitx_angle_degrees_tl
+ \c_empty_tl
+ \c_empty_tl
+ }
+ }
+\cs_new_protected:Npn \siunitx_angle:nnn #1#2#3
+ {
+ \bool_if:NTF \l__siunitx_angle_force_decimal_bool
+ {
+ \exp_args:Ne \siunitx_angle:n
+ { \fp_eval:n { #1 + (#2) / 60 + (#3) / 3600 } }
+ }
+ { \__siunitx_angle_arc_sign:nnn {#1} {#2} {#3} }
+ }
+\cs_new_protected:Npn \__siunitx_angle_arc_convert:n #1
+ {
+ \use:x
+ {
+ \siunitx_angle:nnn
+ { \fp_eval:n { trunc(#1,0) } }
+ { \fp_eval:n { trunc((#1 - trunc(#1,0)) * 60,0) } }
+ {
+ \fp_eval:n
+ {
+ (
+ (#1 - trunc(#1,0)) * 60
+ - trunc((#1 - trunc(#1,0)) * 60,0)
+ )
+ * 60
+ }
+ }
+ }
+ }
+\tl_new:N \l__siunitx_angle_degrees_tl
+\tl_new:N \l__siunitx_angle_minutes_tl
+\tl_new:N \l__siunitx_angle_seconds_tl
+\tl_new:N \l__siunitx_angle_sign_tl
+\cs_new_protected:Npn \__siunitx_angle_arc_sign:nnn #1#2#3
+ {
+ \group_begin:
+ \keys_set:nn { siunitx }
+ {
+ input-close-uncertainty = ,
+ input-exponent-markers = ,
+ input-open-uncertainty = ,
+ input-uncertainty-signs =
+ }
+ \tl_clear:N \l__siunitx_angle_sign_tl
+ \__siunitx_angle_arc_sign:nn {#1} { degrees }
+ \__siunitx_angle_arc_sign:nn {#2} { minutes }
+ \__siunitx_angle_arc_sign:nn {#3} { seconds }
+ \tl_if_empty:NF \l__siunitx_angle_sign_tl
{
- \msg_warning:nnx { siunitx } { version-1-option }
- { \exp_not:V \l_keys_key_tl }
- \tl_set:Nx \l__siunitx_key_tl
+ \clist_map_inline:nn { degrees , minutes , seconds }
{
- \keys_set:nn { siunitx }
+ \tl_if_empty:cF { l__siunitx_angle_ ##1 _tl }
{
- \exp_not:V \l_keys_key_tl
- \tl_if_blank:nF {#1} { = \exp_not:n {#1} }
+ \tl_set:cx { l__siunitx_angle_ ##1 _tl }
+ {
+ { }
+ { \exp_not:V \l__siunitx_angle_sign_tl }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \__siunitx_angle_sign:nnnnnnn
+ \cs:w l__siunitx_angle_ ##1 _tl \cs_end:
+ }
+ \clist_map_break:
}
}
- \keys_set:nn { siunitx } { version-1-compatibility }
- \tl_use:N \l__siunitx_key_tl
}
+ \clist_map_inline:nn { degrees , minutes , seconds }
{
- \msg_error:nnx { siunitx } { unknown-option }
- { \exp_not:V \l_keys_key_tl }
+ \tl_if_empty:cF { l__siunitx_angle_ ##1 _tl }
+ {
+ \tl_set:cx { l__siunitx_angle_ ##1 _tl }
+ {
+ \exp_args:Nc \siunitx_number_output:NN
+ { l__siunitx_angle_ ##1 _tl } \q_nil
+ }
+ }
}
- }
-}
-\AtBeginDocument {
- \keys_define:nn { siunitx } {
- unknown .code:n =
+ \__siunitx_angle_arc_print:VVV
+ \l__siunitx_angle_degrees_tl
+ \l__siunitx_angle_minutes_tl
+ \l__siunitx_angle_seconds_tl
+ \group_end:
+ }
+\cs_new_protected:Npn \__siunitx_angle_arc_sign:nn #1#2
+ {
+ \tl_if_blank:nTF {#1}
+ {
+ \bool_if:cTF { l__siunitx_angle_fill_ #2 _bool }
+ {
+ \tl_set:cn { l__siunitx_angle_ #2 _tl }
+ { { } { } { 0 } { } { } { } { 0 } }
+ }
+ { \tl_clear:c { l__siunitx_angle_ #2 _tl } }
+ }
+ {
+ \siunitx_number_parse:nN {#1} \l__siunitx_angle_tmp_tl
+ \exp_after:wN \__siunitx_angle_extract_sign:nnnnnnnn \l__siunitx_angle_tmp_tl {#2}
+ }
+ }
+\cs_new_protected:Npn \__siunitx_angle_extract_sign:nnnnnnnn #1#2#3#4#5#6#7#8
+ {
+ \tl_if_blank:nTF {#2}
+ { \tl_set_eq:cN { l__siunitx_angle_ #8 _tl } \l__siunitx_angle_tmp_tl }
{
- \seq_if_in:NVTF \c__siunitx_old_options_seq \l_keys_key_tl
+ \tl_set:cn { l__siunitx_angle_ #8 _tl }
+ { {#1} { } {#3} {#4} {#5} {#6} {#7} }
+ \tl_set:Nn \l__siunitx_angle_sign_tl {#2}
+ \keys_set:nn { siunitx }
+ { input-comparators = , input-signs = }
+ }
+ }
+\cs_new:Npn \__siunitx_angle_sign:nnnnnnn #1#2#3#4#5#6#7
+ { \exp_not:n { {#3} {#4} {#5} {#6} {#7} } }
+\box_new:N \l__siunitx_angle_marker_box
+\box_new:N \l__siunitx_angle_unit_box
+\cs_new_protected:Npn \__siunitx_angle_arc_print:nnn #1#2#3
+ {
+ \__siunitx_angle_arc_print_auxi:nVn {#1}
+ \l__siunitx_angle_symbol_degree_tl {#2#3}
+ \__siunitx_angle_arc_print_auxi:nVn {#2}
+ \l__siunitx_angle_symbol_minute_tl {#3}
+ \__siunitx_angle_arc_print_auxi:nVn {#3}
+ \l__siunitx_angle_symbol_second_tl { }
+ }
+\cs_generate_variant:Nn \__siunitx_angle_arc_print:nnn { VVV }
+\cs_new_protected:Npn \__siunitx_angle_arc_print_auxi:nnn #1#2#3
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \bool_if:NTF \l__siunitx_angle_astronomy_bool
+ { \__siunitx_angle_arc_print_auxii:nw {#2} #1 \q_stop }
{
- \msg_error:nnx { siunitx } { version-1-option }
- { \exp_not:V \l_keys_key_tl }
+ \__siunitx_angle_arc_print_auxv:w #1 \q_stop
+ \__siunitx_angle_arc_print_auxvi:n {#2}
}
+ \tl_if_blank:nF {#3}
{
- \msg_error:nnx { siunitx } { unknown-option }
- { \exp_not:V \l_keys_key_tl }
+ \nobreak
+ \l__siunitx_angle_separator_tl
}
}
-}
-}
-\cs_new_protected:Npn \__siunitx_option_deactivate:n #1 {
- \clist_put_right:Nn \l__siunitx_option_deactivate_clist {#1}
-}
-\cs_new_protected:Npn \__siunitx_option_deactivate_aux:n #1 {
- \keys_define:nn { siunitx }
- {
- #1 .code:n =
- { \msg_warning:nnx { siunitx } { option-preamble-only } {#1} }
- }
-}
-\AtBeginDocument {
- \clist_map_function:NN \l__siunitx_option_deactivate_clist
- \__siunitx_option_deactivate_aux:n
-}
-\clist_new:N \l__siunitx_option_deactivate_clist
-\cs_new_protected:Npn \__siunitx_option_unchanged:Nnn #1#2#3
- {
- \str_if_eq:VnT #1 {#2}
- { \tl_set:Nn #1 {#3} }
- }
-\cs_generate_variant:Nn \tl_if_empty_p:n { f }
-\cs_generate_variant:Nn \tl_if_empty:nT { f }
-\cs_generate_variant:Nn \tl_if_in:NnTF { NV }
-\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
-\prg_new_conditional:Npnn \__siunitx_cs_if_tl:N #1 { T, F , TF , p }
+ }
+\cs_generate_variant:Nn \__siunitx_angle_arc_print_auxi:nnn { nV }
+\cs_new_protected:Npn \__siunitx_angle_arc_print_auxii:nw
+ #1#2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop
{
- \bool_lazy_and:nnTF
+ \mode_if_math:TF
+ { \bool_set_true:N \l__siunitx_angle_tmp_bool }
+ { \bool_set_false:N \l__siunitx_angle_tmp_bool }
+ \siunitx_print_number:n {#2#3#4}
+ \tl_if_blank:nTF {#6}
+ { \__siunitx_angle_arc_print_auxvi:n {#1} }
{
- \tl_if_empty_p:f
+ \hbox_set:Nn \l__siunitx_angle_marker_box
+ {
+ \__siunitx_angle_arc_print_auxiii:n
+ { \siunitx_print_number:n {#5} }
+ }
+ \hbox_set:Nn \l__siunitx_angle_unit_box
{
- \cs_prefix_spec:N #1
- \cs_argument_spec:N #1
+ \__siunitx_angle_arc_print_auxiii:n
+ {
+ \siunitx_unit_format:nN {#1} \l__siunitx_angle_tmp_tl
+ \siunitx_print_unit:V \l__siunitx_angle_tmp_tl
+ \skip_horizontal:n { -\scriptspace }
+ }
}
+ \dim_compare:nNnTF { \box_wd:N \l__siunitx_angle_marker_box } >
+ { \box_wd:N \l__siunitx_angle_unit_box }
+ {
+ \__siunitx_angle_arc_print_auxiv:NN
+ \l__siunitx_angle_marker_box
+ \l__siunitx_angle_unit_box
+ }
+ {
+ \__siunitx_angle_arc_print_auxiv:NN
+ \l__siunitx_angle_unit_box
+ \l__siunitx_angle_marker_box
+ }
+ \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box
+ \l__siunitx_angle_tmp_dim
+ {
+ \hbox_overlap_right:n
+ { \box_use_drop:N \l__siunitx_angle_marker_box }
+ \hbox_overlap_right:n
+ { \box_use_drop:N \l__siunitx_angle_unit_box }
+ \tex_hfil:D
+ }
+ \box_use:N \l__siunitx_angle_marker_box
+ \skip_horizontal:N \scriptspace
+ \siunitx_print_number:n {#6}
}
- { \bool_not_p:n { \cs_if_exist_p:c { \cs_to_str:N #1 ~ } } }
- { \prg_return_true: }
- { \prg_return_false: }
}
-\prg_new_conditional:Npnn \__siunitx_number_if_zero:n #1 { p , TF }
+\cs_new_protected:Npn \__siunitx_angle_arc_print_auxiii:n #1
+ {
+ \bool_if:NTF \l__siunitx_angle_tmp_bool
+ { \ensuremath }
+ { \use:n }
+ {#1}
+ }
+\cs_new_protected:Npn \__siunitx_angle_arc_print_auxiv:NN #1#2
{
- \tl_map_function:nN {#1} \__siunitx_number_if_zero_aux:n
- \prg_return_true:
+ \dim_set:Nn \l__siunitx_angle_tmp_dim { \box_wd:N #1 }
+ \hbox_set_to_wd:Nnn #2
+ \l__siunitx_angle_tmp_dim
+ {
+ \tex_hss:D
+ \hbox_unpack_drop:N #2
+ \tex_hss:D
+ }
}
-\cs_generate_variant:Nn \__siunitx_number_if_zero_p:n { V }
-\cs_new:Npn \__siunitx_number_if_zero_aux:n #1
+\cs_new_protected:Npn \__siunitx_angle_arc_print_auxv:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_stop
+ { \siunitx_print_number:n {#1#2#3#4#5} }
+\cs_new_protected:Npn \__siunitx_angle_arc_print_auxvi:n #1
{
- \token_if_eq_charcode:NNF #1 0
- { \tl_map_break:n { \prg_return_false: \use_none:n } }
+ \nobreak
+ \l__siunitx_angle_product_tl
+ \siunitx_unit_format:nN {#1} \l__siunitx_angle_tmp_tl
+ \siunitx_print_unit:V \l__siunitx_angle_tmp_tl
}
-\AtBeginDocument
+\keys_set:nn { siunitx }
{
- \@ifpackageloaded { tex4ht }
+ angle-mode = input ,
+ angle-symbol-degree = \degree ,
+ angle-symbol-minute = \arcminute ,
+ angle-symbol-over-decimal = false ,
+ angle-symbol-second = \arcsecond ,
+ angle-separator = ,
+ fill-angle-degrees = false ,
+ fill-angle-minutes = false ,
+ fill-angle-seconds = false ,
+ number-angle-product =
+ }
+\tl_new:N \l__siunitx_complex_tmp_tl
+\tl_new:N \l__siunitx_complex_input_tl
+\tl_new:N \l__siunitx_complex_comparator_tl
+\tl_new:N \l__siunitx_complex_exp_tl
+\tl_new:N \l__siunitx_complex_real_tl
+\tl_new:N \l__siunitx_complex_img_tl
+\tl_new:N \l__siunitx_complex_join_tl
+\tl_new:N \l__siunitx_complex_sign_tl
+\bool_new:N \l__siunitx_complex_root_after_bool
+\keys_define:nn { siunitx }
+ {
+ complex-root-position .choice: ,
+ complex-root-position / after-number .code:n =
+ { \bool_set_true:N \l__siunitx_complex_root_after_bool } ,
+ complex-root-position / before-number .code:n =
+ { \bool_set_false:N \l__siunitx_complex_root_after_bool } ,
+ input-complex-root .tl_set:N =
+ \l__siunitx_complex_input_root_tl ,
+ output-complex-root .tl_set:N =
+ \l__siunitx_complex_output_root_tl
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse:nNN #1#2#3
+ {
+ \group_begin:
+ \__siunitx_complex_parse_clear:
+ \protected@edef \l__siunitx_complex_arg_tl {#1}
+ \tl_set_eq:NN \l__siunitx_complex_input_tl \l__siunitx_complex_arg_tl
+ \siunitx_number_normalize_symbols:N \l__siunitx_complex_arg_tl
+ \tl_if_empty:NF \l__siunitx_complex_arg_tl
+ { \__siunitx_complex_parse_comparator: }
+ \__siunitx_complex_parse_check:
+ \cs_set_protected:Npx \__siunitx_complex_parse_end:
+ {
+ \tl_set:Nn \exp_not:N #2 { \exp_not:V \l__siunitx_complex_real_tl }
+ \tl_set:Nn \exp_not:N #3 { \exp_not:V \l__siunitx_complex_img_tl }
+ }
+ \exp_after:wN \group_end:
+ \__siunitx_complex_parse_end:
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_end: { }
+\cs_new_protected:Npn \__siunitx_complex_parse_clear:
+ {
+ \tl_clear:N \l__siunitx_complex_real_tl
+ \tl_clear:N \l__siunitx_complex_img_tl
+ \tl_clear:N \l__siunitx_complex_exp_tl
+ \tl_clear:N \l__siunitx_complex_sign_tl
+ \tl_clear:N \l__siunitx_complex_join_tl
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_check:
+ {
+ \bool_lazy_all:nTF
{
- \cs_set_eq:NN \__siunitx_print_text_super:n \textsuperscript
- \__siunitx_option_unchanged:Nnn \l__siunitx_qualifier_mode_tl
- { subscript } { brackets }
- \keys_set:nn { siunitx } { mode = text }
+ { \tl_if_empty_p:N \l__siunitx_complex_real_tl }
+ { \tl_if_empty_p:N \l__siunitx_complex_img_tl }
+ { \tl_if_empty_p:N \l__siunitx_complex_exp_tl }
}
- { }
+ {
+ \msg_error:nnx { siunitx } { invalid-complex-number }
+ { \exp_not:V \l__siunitx_complex_input_tl }
+ }
+ { \__siunitx_complex_parse_finalise: }
}
-\cs_new_eq:NN \__siunitx_ensure_ltr:n \use:n
-\AtBeginDocument
+\cs_new_protected:Npn \__siunitx_complex_parse_finalise:
{
- \@ifpackageloaded { bidi }
- {
- \sys_if_engine_xetex:T
- { \cs_set_protected:Npn \__siunitx_ensure_ltr:n #1 { \LRE {#1} } }
- }
- { }
+ \tl_if_empty:NTF \l__siunitx_complex_img_tl
+ { \__siunitx_complex_parse_finalise:N \l__siunitx_complex_real_tl }
+ {
+ \tl_if_empty:NTF \l__siunitx_complex_real_tl
+ { \__siunitx_complex_parse_finalise:N \l__siunitx_complex_img_tl }
+ {
+ \__siunitx_complex_parse_finalise:N \l__siunitx_complex_real_tl
+ \tl_set_eq:NN \l__siunitx_complex_sign_tl \l__siunitx_complex_join_tl
+ \__siunitx_complex_parse_finalise:N \l__siunitx_complex_img_tl
+ }
+ }
}
-\cs_new_protected:Npn \__siunitx_textsuperscript:n #1
+\cs_new_protected:Npn \__siunitx_complex_parse_finalise:N #1
{
- \m@th
- \ensuremath { ^ { \mbox { \fontsize \sf@size \z@ \selectfont #1 } } }
+ \tl_set:Nx #1
+ {
+ \exp_not:V \l__siunitx_complex_comparator_tl
+ \exp_not:V \l__siunitx_complex_sign_tl
+ \exp_not:V #1
+ \exp_not:V \l__siunitx_complex_exp_tl
+ }
+ \tl_clear:N \l__siunitx_complex_comparator_tl
+ \tl_clear:N \l__siunitx_complex_sign_tl
+ \siunitx_number_parse:VN #1 #1
}
-\bool_new:N \l__siunitx_display_math_bool
-\tex_everydisplay:D \exp_after:wN
+\cs_new_protected:Npn \__siunitx_complex_parse_comparator:
{
- \tex_the:D \tex_everydisplay:D
- \bool_set_true:N \l__siunitx_display_math_bool
+ \exp_after:wN \__siunitx_complex_parse_comparator_aux:Nw
+ \l__siunitx_complex_arg_tl \q_stop
}
-\cs_generate_variant:Nn \prop_get:NnNT { NV }
-\cs_generate_variant:Nn \prop_get:NnNF { NV }
-\cs_generate_variant:Nn \prop_get:NnNTF { NV }
-\cs_new_protected:Npn \__siunitx_set_math_fam:n #1 {
- \group_begin:
- \hbox_set:Nn \l__siunitx_tmp_box
+\cs_new_protected:Npn \__siunitx_complex_parse_comparator_aux:Nw #1#2 \q_stop
+ {
+ \tl_if_in:NnTF \l_siunitx_number_input_comparator_tl {#1}
+ {
+ \tl_set:Nn \l__siunitx_complex_comparator_tl {#1}
+ \tl_set:Nn \l__siunitx_complex_arg_tl {#2}
+ }
+ { \tl_clear:N \l__siunitx_complex_comparator_tl }
+ \tl_if_empty:NF \l__siunitx_complex_arg_tl
+ { \__siunitx_complex_parse_sign: }
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_exponent:
+ {
+ \tl_if_empty:NTF \l_siunitx_number_input_exponent_tl
+ { \__siunitx_complex_parse_root: }
{
- \ensuremath
+ \tl_set:Nx \l__siunitx_complex_tmp_tl
+ { \tl_head:V \l_siunitx_number_input_exponent_tl }
+ \tl_map_inline:Nn \l_siunitx_number_input_exponent_tl
{
- \use:c { math #1 }
- {
- \int_const:cn { c__siunitx_math #1 _int } { \fam }
- }
+ \tl_replace_all:NnV \l__siunitx_complex_arg_tl
+ {##1} \l__siunitx_complex_tmp_tl
+ }
+ \use:x
+ {
+ \cs_set_protected:Npn
+ \exp_not:N \__siunitx_complex_parse_exponent_auxi:w
+ ####1 \exp_not:V \l__siunitx_complex_tmp_tl
+ ####2 \exp_not:V \l__siunitx_complex_tmp_tl
+ ####3 \exp_not:N \q_stop
+ }
+ { \__siunitx_complex_parse_exponent_auxii:nn {##1} {##2} }
+ \use:x
+ {
+ \__siunitx_complex_parse_exponent_auxi:w
+ \exp_not:V \l__siunitx_complex_arg_tl
+ \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_nil
+ \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_stop
}
}
- \group_end:
-}
-\__siunitx_if_hooks:TF
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_exponent_auxi:w { }
+\cs_new_protected:Npn \__siunitx_complex_parse_exponent_auxii:nn #1#2
{
- \AddToHook { begindocument / end } [ siunitx ]
+ \quark_if_nil:nF {#2}
{
- \__siunitx_set_math_fam:n { sf }
- \__siunitx_set_math_fam:n { tt }
+ \tl_set:Nn \l__siunitx_complex_arg_tl {#1}
+ \tl_set:Nx \l__siunitx_complex_exp_tl
+ { \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:n {#2} }
}
+ \__siunitx_complex_parse_root:
}
+\cs_new_protected:Npn \__siunitx_complex_parse_root:
{
- \tl_put_right:Nn \document
+ \tl_if_empty:NTF \l__siunitx_complex_input_root_tl
+ { \tl_set_eq:NN \l__siunitx_complex_real_tl \l__siunitx_complex_arg_tl }
{
- \__siunitx_set_math_fam:n { sf }
- \__siunitx_set_math_fam:n { tt }
- \ignorespaces
+ \tl_set:Nx \l__siunitx_complex_tmp_tl
+ { \tl_head:V \l__siunitx_complex_input_root_tl }
+ \tl_map_inline:Nn \l__siunitx_complex_input_root_tl
+ {
+ \tl_replace_all:NnV \l__siunitx_complex_arg_tl
+ {##1} \l__siunitx_complex_tmp_tl
+ }
+ \use:x
+ {
+ \cs_set_protected:Npn
+ \exp_not:N \__siunitx_complex_parse_root_auxi:w
+ ####1 \exp_not:V \l__siunitx_complex_tmp_tl
+ ####2 \exp_not:V \l__siunitx_complex_tmp_tl
+ ####3 \exp_not:N \q_stop
+ }
+ { \__siunitx_complex_parse_root_auxii:nn {##1} {##2} }
+ \use:x
+ {
+ \__siunitx_complex_parse_root_auxi:w
+ \exp_not:V \l__siunitx_complex_arg_tl
+ \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_nil
+ \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_stop
+ }
}
}
-\cs_new_protected:Npn \__siunitx_set_text_fam:n #1 {
- \tl_const:cx { c__siunitx_text #1 _tl } { \use:c { #1 default } }
-}
-\AtBeginDocument {
- \__siunitx_set_text_fam:n { sf }
- \__siunitx_set_text_fam:n { tt }
-}
-\tl_new:N \l__siunitx_detect_inline_weight_tl
-\tl_new:N \l__siunitx_detect_inline_family_tl
-\keys_define:nn { siunitx } {
- detect-all .choice:,
- detect-all .default:n = true,
- detect-all / false .meta:n =
- {
- detect-family = false ,
- detect-mode = false ,
- detect-shape = false ,
- detect-weight = false ,
- },
- detect-all / true .meta:n =
- {
- detect-family = true ,
- detect-mode = true ,
- detect-shape = true ,
- detect-weight = true ,
- },
- detect-display-math .bool_set:N =
- \l__siunitx_detect_display_math_bool,
- detect-family .bool_set:N = \l__siunitx_detect_family_bool,
- detect-inline-family .choice:,
- detect-inline-family .value_required:n = true,
- detect-inline-family /
- math .code:n =
- { \tl_set:Nn \l__siunitx_detect_inline_family_tl { math } },
- detect-inline-family /
- text .code:n =
- { \tl_set:Nn \l__siunitx_detect_inline_family_tl { text } },
- detect-inline-weight .choice:,
- detect-inline-weight .value_required:n = true,
- detect-inline-weight /
- math .code:n =
- { \tl_set:Nn \l__siunitx_detect_inline_weight_tl { math } },
- detect-inline-weight /
- text .code:n =
- { \tl_set:Nn \l__siunitx_detect_inline_weight_tl { text } },
- detect-italic .bool_set:N = \l__siunitx_detect_shape_bool,
- detect-mode .bool_set:N = \l__siunitx_detect_mode_bool,
- detect-none .choice:,
- detect-none .default:n = true,
- detect-none / false .meta:n =
- {
- detect-family = true,
- detect-mode = true,
- detect-shape = true,
- detect-weight = true
- },
- detect-none / true .meta:n =
- {
- detect-family = false,
- detect-mode = false,
- detect-shape = false,
- detect-weight = false
- },
- detect-shape .bool_set:N = \l__siunitx_detect_shape_bool,
- detect-weight .bool_set:N = \l__siunitx_detect_weight_bool
-}
-\keys_set:nn { siunitx } {
- detect-inline-family = text ,
- detect-inline-weight = text ,
-}
-\bool_new:N \l__siunitx_font_set_bool
-\bool_new:N \l__siunitx_font_math_mode_bool
-\tl_new:N \l__siunitx_font_family_tl
-\cs_new:Npn \__siunitx_font_shape: { }
-\cs_new:Npn \__siunitx_font_weight: { }
-\cs_new_protected:Npn \__siunitx_detect_font: {
- \bool_if:NF \l__siunitx_font_set_bool
- {
- \__siunitx_detect_font_init:
- \bool_if:NT \l__siunitx_detect_weight_bool
- { \__siunitx_detect_font_weight: }
- \bool_if:NT \l__siunitx_detect_family_bool
- { \__siunitx_detect_font_family: }
- \bool_if:NT \l__siunitx_detect_shape_bool
- { \__siunitx_detect_font_shape: }
- \bool_if:NT \l__siunitx_detect_mode_bool
- { \__siunitx_detect_font_mode: }
- }
-}
-\cs_new_protected:Npn \__siunitx_detect_font_init: {
- \bool_set_true:N \l__siunitx_font_set_bool
- \cs_set:Npn \__siunitx_font_weight:
- {
- \unboldmath
- \mdseries
- }
- \cs_set:Npn \__siunitx_font_shape: { \upshape }
- \tl_set:Nn \l__siunitx_font_family_tl { rm }
- \bool_set_true:N \l__siunitx_font_math_mode_bool
-}
-\cs_new_protected:Npn \__siunitx_detect_font_weight: {
- \mode_if_math:TF
- {
- \bool_if:NTF \l__siunitx_display_math_bool
- {
- \bool_if:NTF \l__siunitx_detect_display_math_bool
- { \__siunitx_detect_font_weight_math: }
- { \__siunitx_detect_font_weight_text: }
- }
- {
- \use:c
- {
- __siunitx_detect_font_weight_
- \l__siunitx_detect_inline_weight_tl
- :
- }
- }
- }
- { \__siunitx_detect_font_weight_text: }
-}
-\cs_new_protected:Npn \__siunitx_detect_font_weight_math: {
- \str_if_eq:VnT \math@version { bold }
- {
- \cs_set:Npn \__siunitx_font_weight:
- {
- \boldmath
- \bfseries
- }
- }
- \str_if_eq:VnT \math@version { light }
- { \cs_set:Npn \__siunitx_font_weight: { \lseries } }
-}
-\cs_new_protected:Npn \__siunitx_detect_font_weight_text: {
- \tl_set:Nx \l__siunitx_tmpa_tl { \tl_head:N \f@series }
- \str_if_eq:VnT \l__siunitx_tmpa_tl { b }
- {
- \cs_set:Npn \__siunitx_font_weight:
- {
- \boldmath
- \bfseries
- }
- }
- \str_if_eq:VnT \l__siunitx_tmpa_tl { l }
- { \cs_set:Npn \__siunitx_font_weight: { \lseries } }
-}
-\cs_new_protected:Npn \__siunitx_detect_font_family: {
- \mode_if_math:TF
- {
- \bool_if:NTF \l__siunitx_display_math_bool
- {
- \bool_if:NTF \l__siunitx_detect_display_math_bool
- { \__siunitx_detect_font_family_math: }
- { \__siunitx_detect_font_family_text: }
- }
- {
- \use:c
- {
- __siunitx_detect_font_family_
- \l__siunitx_detect_inline_family_tl
- :
- }
- }
- }
- { \__siunitx_detect_font_family_text: }
-}
-\cs_new_protected:Npn \__siunitx_detect_font_family_math: {
- \tl_set:Nn \l__siunitx_font_family_tl { rm }
- \int_compare:nNnT { \fam } = { \c__siunitx_mathsf_int }
- { \tl_set:Nn \l__siunitx_font_family_tl { sf } }
- \int_compare:nNnT { \fam } = { \c__siunitx_mathtt_int }
- { \tl_set:Nn \l__siunitx_font_family_tl { tt } }
-}
-\cs_new_protected:Npn \__siunitx_detect_font_family_text: {
- \tl_if_eq:NNT \f@family \c__siunitx_textsf_tl
- { \tl_set:Nn \l__siunitx_font_family_tl { sf } }
- \tl_if_eq:NNT \f@family \c__siunitx_texttt_tl
- { \tl_set:Nn \l__siunitx_font_family_tl { tt } }
-}
-\cs_new_protected:Npn \__siunitx_detect_font_shape:
- {
- \cs_if_exist:cT { \f@shape shape }
- {
- \cs_set:Npx \__siunitx_font_shape: { \exp_not:c { \f@shape shape } }
- }
- }
-\cs_new_protected:Npn \__siunitx_detect_font_mode: {
- \mode_if_math:F
- {
- \bool_set_false:N \l__siunitx_font_math_mode_bool
- \bool_set_false:N \l__siunitx_number_math_mode_bool
- \bool_set_false:N \l__siunitx_unit_math_mode_bool
- }
-}
-\bool_new:N \l__siunitx_number_math_mode_bool
-\bool_new:N \l__siunitx_unit_math_mode_bool
-\cs_new:Npn \__siunitx_number_mathrm:n #1 { }
-\cs_new:Npn \__siunitx_number_mathsf:n #1 { }
-\cs_new:Npn \__siunitx_number_mathtt:n #1 { }
-\cs_new:Npn \__siunitx_number_textrm: { }
-\cs_new:Npn \__siunitx_number_textsf: { }
-\cs_new:Npn \__siunitx_number_texttt: { }
-\keys_define:nn { siunitx } {
- number-color .tl_set:N = \l__siunitx_number_color_tl,
- number-math-rm .code:n =
- { \cs_set:Npn \__siunitx_number_mathrm:n ##1 { #1 {##1} } },
- number-math-sf .code:n =
- { \cs_set:Npn \__siunitx_number_mathsf:n ##1 { #1 {##1} } },
- number-math-tt .code:n =
- { \cs_set:Npn \__siunitx_number_mathtt:n ##1 { #1 {##1} } },
- number-mode .choice:,
- number-mode / math .code:n =
- { \bool_set_true:N \l__siunitx_number_math_mode_bool },
- number-mode / text .code:n =
- { \bool_set_false:N \l__siunitx_number_math_mode_bool },
- number-text-rm .code:n =
- { \cs_set:Npn \__siunitx_number_textrm: {#1} },
- number-text-sf .code:n =
- { \cs_set:Npn \__siunitx_number_textsf: {#1} },
- number-text-tt .code:n =
- { \cs_set:Npn \__siunitx_number_texttt: {#1} }
-}
-\cs_new:Npn \__siunitx_unit_mathrm: { }
-\cs_new:Npn \__siunitx_unit_mathsf: { }
-\cs_new:Npn \__siunitx_unit_mathtt: { }
-\cs_new:Npn \__siunitx_unit_textrm: { }
-\cs_new:Npn \__siunitx_unit_textsf: { }
-\cs_new:Npn \__siunitx_unit_texttt: { }
-\keys_define:nn { siunitx } {
- unit-color .tl_set:N = \l__siunitx_unit_color_tl,
- unit-math-rm .code:n =
- { \cs_set:Npn \__siunitx_unit_mathrm:n ##1 { #1 {##1} } },
- unit-math-sf .code:n =
- { \cs_set:Npn \__siunitx_unit_mathsf:n ##1 { #1 {##1} } },
- unit-math-tt .code:n =
- { \cs_set:Npn \__siunitx_unit_mathtt:n ##1 { #1 {##1} } },
- unit-mode .choice:,
- unit-mode / math .code:n =
- { \bool_set_true:N \l__siunitx_unit_math_mode_bool },
- unit-mode / text .code:n =
- { \bool_set_false:N \l__siunitx_unit_math_mode_bool },
- unit-text-rm .code:n =
- { \cs_set:Npn \__siunitx_unit_textrm: {#1} },
- unit-text-sf .code:n =
- { \cs_set:Npn \__siunitx_unit_textsf: {#1} },
- unit-text-tt .code:n =
- { \cs_set:Npn \__siunitx_unit_texttt: {#1} }
-}
-\keys_define:nn { siunitx } {
- color .meta:n =
- {
- number-color = #1,
- unit-color = #1
- },
- math-rm .meta:n =
- {
- number-math-rm = #1,
- unit-math-rm = #1
- },
- math-sf .meta:n =
- {
- number-math-sf = #1,
- unit-math-sf = #1
- },
- math-tt .meta:n =
- {
- number-math-tt = #1,
- unit-math-tt = #1
- },
- mode .choice:,
- mode / math .meta:n =
- {
- number-mode = math,
- unit-mode = math
- },
- mode / text .meta:n =
- {
- number-mode = text,
- unit-mode = text
- },
- text-rm .meta:n =
- {
- number-text-rm = #1,
- unit-text-rm = #1
- },
- text-sf .meta:n =
- {
- number-text-sf = #1,
- unit-text-sf = #1
- },
- text-tt .meta:n =
- {
- number-text-tt = #1,
- unit-text-tt = #1
- }
-}
-\keys_set:nn { siunitx } {
- math-rm = \mathrm,
- math-sf = \mathsf,
- math-tt = \mathtt,
- mode = math,
- text-rm = \rmfamily,
- text-sf = \sffamily,
- text-tt = \ttfamily,
-}
-\AtBeginDocument {
- \tl_set:Nx \l__siunitx_tmpa_tl { \familydefault }
- \@ifpackageloaded { eulervm }
- {
- \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
- \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { number-math-rm = \mathnormal } }
- \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { unit-math-rm = \mathnormal } }
- }
- { }
- \tl_if_eq:NNT \l__siunitx_tmpa_tl \c__siunitx_textsf_tl
- {
- \@ifpackageloaded { arev }
- { }
- {
- \@ifpackageloaded { cmbright }
- { }
- {
- \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
- \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { number-math-rm = \mathsf } }
- \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { unit-math-rm = \mathsf } }
- }
- }
- \cs_set:Npn \__siunitx_tmp:w { \rmfamily }
- \cs_if_eq:NNT \__siunitx_number_textrm: \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { number-text-rm = \sffamily } }
- \cs_if_eq:NNT \__siunitx_unit_textrm: \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { unit-text-rm = \sffamily } }
- }
- \tl_if_eq:NNT \l__siunitx_tmpa_tl \c__siunitx_texttt_tl
- {
- \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
- \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { number-math-rm = \mathtt } }
- \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { unit-math-rm = \mathtt } }
- \cs_set:Npn \__siunitx_tmp:w { \rmfamily }
- \cs_if_eq:NNT \__siunitx_number_textrm: \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { number-text-rm = \ttfamily } }
- \cs_if_eq:NNT \__siunitx_unit_textrm: \__siunitx_tmp:w
- { \keys_set:nn { siunitx } { unit-text-rm = \ttfamily } }
- }
-}
-\tl_new:N \l__siunitx_print_arg_tl
-\tl_new:N \l__siunitx_print_type_tl
-\cs_new_protected:Npn \__siunitx_print:nn #1#2 {
- \group_begin:
- \tl_set:Nn \l__siunitx_print_type_tl {#1}
- \tl_set:Nn \l__siunitx_print_arg_tl {#2}
- \__siunitx_detect_font:
- \bool_if:NF \l__siunitx_detect_mode_bool
- {
- \bool_if:cTF { l__siunitx_ #1 _math_mode_bool }
- { \bool_set_true:N \l__siunitx_font_math_mode_bool }
- { \bool_set_false:N \l__siunitx_font_math_mode_bool }
- }
- \__siunitx_print_aux:
- \group_end:
-}
-\cs_generate_variant:Nn \__siunitx_print:nn { nV }
-\cs_new_protected:Npn \__siunitx_print_aux:
+\cs_new_protected:Npn \__siunitx_complex_parse_root_auxi:w { }
+\cs_new_protected:Npn \__siunitx_complex_parse_root_auxii:nn #1#2
{
- \text
+ \quark_if_nil:nTF {#2}
+ { \tl_set:Nn \l__siunitx_complex_real_tl {#1} }
{
- \__siunitx_ensure_ltr:n
+ \tl_set:Nn \l__siunitx_complex_img_tl {#2}
+ \tl_if_blank:nTF {#1}
{
- \color@begingroup
- \__siunitx_print_color:
- \__siunitx_font_shape:
- \__siunitx_font_weight:
- \use:c
- {
- __siunitx_ \l__siunitx_print_type_tl _
- text \l__siunitx_font_family_tl :
- }
- \bool_if:NTF \l__siunitx_font_math_mode_bool
- { \__siunitx_print_math: }
- { \__siunitx_print_text: }
- \color@endgroup
+ \tl_if_blank:nT {#2}
+ { \tl_set:Nn \l__siunitx_complex_img_tl { 1 } }
+ }
+ {
+ \tl_if_blank:nTF {#2}
+ { \__siunitx_complex_parse_split:n {#1} }
+ { \__siunitx_complex_parse_sign_check:n {#1} }
}
}
}
-\cs_new_protected:Npn \__siunitx_print_color: {
- \tl_if_empty:cF { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
- {
- \color
+\cs_new_protected:Npn \__siunitx_complex_parse_sign:
+ {
+ \exp_after:wN \__siunitx_complex_parse_sign_aux:Nw
+ \l__siunitx_complex_arg_tl \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_sign_aux:Nw #1#2 \q_stop
+ {
+ \tl_if_in:NnT \l_siunitx_number_input_sign_tl {#1}
+ {
+ \tl_set:Nn \l__siunitx_complex_sign_tl {#1}
+ \tl_set:Nn \l__siunitx_complex_arg_tl {#2}
+ }
+ \tl_if_empty:NF \l__siunitx_complex_arg_tl
+ { \__siunitx_complex_parse_exponent: }
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_sign_check:n #1
+ {
+ \__siunitx_complex_parse_sign_check:nN { } #1 \q_recursion_tail \q_recursion_stop
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_sign_check:nN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \__siunitx_complex_parse_clear: }
+ \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#2}
+ { \__siunitx_complex_parse_sign_check:nNw {#1} #2 }
+ { \__siunitx_complex_parse_sign_check:nN {#1#2} }
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_sign_check:nNw
+ #1#2 #3 \q_recursion_tail \q_recursion_stop
+ {
+ \tl_if_blank:nTF {#3}
+ {
+ \tl_if_blank:nTF {#1}
+ { \__siunitx_complex_parse_clear: }
+ {
+ \tl_set:Nn \l__siunitx_complex_real_tl {#1}
+ \tl_set:Nn \l__siunitx_complex_join_tl {#2}
+ }
+ }
+ { \__siunitx_complex_parse_clear: }
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_split:n #1
+ {
+ \__siunitx_complex_parse_split:nN { } #1 \q_recursion_tail \q_recursion_stop
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_split:nN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \tl_set:Nn \l__siunitx_complex_img_tl {#1} }
+ \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#2}
+ {
+ \tl_set:Nn \l__siunitx_complex_real_tl {#1}
+ \tl_set:Nn \l__siunitx_complex_join_tl {#2}
+ \__siunitx_complex_parse_split:w
+ }
+ { \__siunitx_complex_parse_split:nN {#1#2} }
+ }
+\cs_new_protected:Npn \__siunitx_complex_parse_split:w #1 \q_recursion_tail \q_recursion_stop
+ {
+ \tl_set:Nx \l__siunitx_complex_img_tl
+ {
+ \tl_if_blank:nTF {#1}
+ { 1 }
+ { \exp_not:n {#1} }
+ }
+ \tl_if_empty:NT \l__siunitx_complex_real_tl
+ { \__siunitx_complex_parse_clear: }
+ }
+\tl_new:N \l__siunitx_complex_bracket_close_tl
+\tl_new:N \l__siunitx_complex_bracket_open_tl
+\tl_set:Nn \l__siunitx_complex_bracket_open_tl { ( }
+\tl_set:Nn \l__siunitx_complex_bracket_close_tl { ) }
+\tl_new:N \l__siunitx_complex_unit_tl
+\cs_new_protected:Npn \siunitx_complex_number:n #1
+ {
+ \group_begin:
+ \bool_if:NTF \l_siunitx_number_parse_bool
{
- \tl_use:c { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
+ \__siunitx_complex_parse:nNN {#1} \l__siunitx_complex_real_tl \l__siunitx_complex_img_tl
+ \__siunitx_complex_format:n { }
}
- }
-}
-\AtBeginDocument {
- \@ifpackageloaded { color }
- { \cs_new_eq:NN \__siunitx_textcolor:n \textcolor }
- {
- \cs_set_protected:Npn \__siunitx_print_color:
{
- \tl_if_empty:cF { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
- {
- \cs_gset_eq:NN \__siunitx_print_color: \scan_stop:
- \msg_warning:nn { siunitx } { color-not-loaded }
- }
+ \siunitx_number_format:nN {#1} \l__siunitx_complex_tmp_tl
+ \siunitx_print_number:V \l__siunitx_complex_tmp_tl
}
- \cs_new_protected:Npn \__siunitx_textcolor:n #1
+ \group_end:
+ }
+\cs_new_protected:Npn \siunitx_complex_quantity:nn #1#2
+ {
+ \group_begin:
+ \bool_if:NTF \l_siunitx_number_parse_bool
{
- \cs_gset_eq:NN \__siunitx_textcolor:n \use_none:n
- \msg_warning:nn { siunitx } { color-not-loaded }
+ \__siunitx_complex_parse:nNN {#1} \l__siunitx_complex_real_tl \l__siunitx_complex_img_tl
+ \__siunitx_complex_format:n {#2}
}
- }
-}
-\cs_new_protected:Npn \__siunitx_print_math:
+ { \siunitx_quantity:nn {#1} {#2} }
+ \group_end:
+ }
+\cs_new_protected:Npn \__siunitx_complex_format:n #1
{
- \cs_set_eq:NN \PrintSubscript \sb
- \cs_set_eq:NN \PrintSuperscript \sp
- \ensuremath
+ \bool_lazy_and:nnF
+ { \tl_if_empty_p:N \l__siunitx_complex_real_tl }
+ { \tl_if_empty_p:N \l__siunitx_complex_img_tl }
+ { \__siunitx_complex_format_auxi:n {#1} }
+ }
+\cs_new_protected:Npn \__siunitx_complex_format_auxi:n #1
+ {
+ \tl_clear:N \l__siunitx_complex_tmp_tl
+ \tl_if_empty:NTF \l__siunitx_complex_real_tl
{
- \use:c
+ \__siunitx_complex_format_units:n {#1}
+ \exp_after:wN \__siunitx_complex_format_unary:nnnnnnn \l__siunitx_complex_img_tl
+ \tl_set:Nx \l__siunitx_complex_tmp_tl
{
- __siunitx_ \l__siunitx_print_type_tl _
- math \l__siunitx_font_family_tl :n
+ \siunitx_number_output:N \l__siunitx_complex_img_tl
+ \exp_not:V \l__siunitx_complex_output_root_tl
}
- { \l__siunitx_print_arg_tl }
}
+ {
+ \tl_if_empty:NTF \l__siunitx_complex_img_tl
+ {
+ \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl
+ \tl_set:Nx \l__siunitx_complex_tmp_tl
+ { \siunitx_number_output:N \l__siunitx_complex_real_tl }
+ }
+ { \__siunitx_complex_format_auxii:n {#1} }
+ }
+ \tl_if_blank:nTF {#1}
+ { \siunitx_print_number:V \l__siunitx_complex_tmp_tl }
+ { \siunitx_quantity_print:VV \l__siunitx_complex_tmp_tl \l__siunitx_complex_unit_tl }
}
-\cs_new_protected:Npn \__siunitx_print_text:
- {
- \tl_replace_all:Nnn \l__siunitx_print_arg_tl { - }
- { \textminus }
- \__siunitx_print_text_aux:
- \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \mp }
- { \ensuremath { \mp } }
- \tl_remove_all:Nn \l__siunitx_print_arg_tl { \mathord }
- \cs_set_eq:NN \PrintSubscript \__siunitx_print_text_sub:n
- \cs_set_eq:NN \PrintSuperscript \__siunitx_print_text_super:n
- \__siunitx_print_text_aux:NnN
- _ { math_subscript } \__siunitx_print_text_sub:n
- _ { active } \__siunitx_print_text_sub:n
- ^ { math_superscript } \__siunitx_print_text_super:n
- ^ { active } \__siunitx_print_text_super:n
- \q_recursion_tail ? ?
- \q_recursion_stop
- \l__siunitx_print_arg_tl
- }
-\cs_new_protected:Npn \__siunitx_print_text_aux:
+\cs_new_protected:Npn \__siunitx_complex_format_unary:nnnnnnn #1#2#3#4#5#6#7
{
- \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \pm }
- { \ensuremath { \pm } }
+ \tl_set:Nx \l__siunitx_complex_img_tl
+ {
+ \exp_not:n { {#1} {#2} }
+ \tl_if_blank:nTF {#4}
+ {
+ \str_if_eq:nnTF {#3} { 1 }
+ { { } { } }
+ { \exp_not:n { {#3} {#4} } }
+ }
+ { \exp_not:n { {#3} {#4} } }
+ \exp_not:n { {#5} {#6} {#7} }
+ }
}
-\cs_new_protected:Npn \__siunitx_print_text_aux:NnN #1#2#3
+\cs_new_protected:Npn \__siunitx_complex_format_auxii:n #1
{
- \quark_if_recursion_tail_stop:N #1
- \tl_set_rescan:Nnn \l__siunitx_tmpa_tl
- { \use:c { char_set_catcode_ #2 :N } #1 }
- {#1}
- \tl_replace_all:NVn \l__siunitx_print_arg_tl \l__siunitx_tmpa_tl {#3}
- \__siunitx_print_text_aux:NnN
+ \__siunitx_complex_format_units:n {#1}
+ \exp_after:wN \__siunitx_complex_drop_exponent:nnnnnnn \l__siunitx_complex_real_tl
+ \exp_after:wN \__siunitx_complex_format_sign:nnnnnnn \l__siunitx_complex_img_tl
+ \tl_set:Nx \l__siunitx_complex_tmp_tl
+ { \siunitx_number_output:NN \l__siunitx_complex_img_tl \q_nil }
+ \exp_after:wN \__siunitx_complex_extract_exponent:w \l__siunitx_complex_tmp_tl \q_stop
+ \tl_set:Nx \l__siunitx_complex_tmp_tl
+ {
+ \bool_lazy_and:nnTF
+ { \l_siunitx_number_bracket_ambiguous_bool }
+ { ! \tl_if_empty_p:N \l__siunitx_complex_exp_tl }
+ { \__siunitx_complex_format_bracket:n }
+ { \use:n }
+ {
+ \siunitx_number_output:N \l__siunitx_complex_real_tl
+ \exp_not:V \l__siunitx_complex_sign_tl
+ \bool_if:NF \l__siunitx_complex_root_after_bool
+ { \exp_not:V \l__siunitx_complex_output_root_tl }
+ \exp_not:V \l__siunitx_complex_tmp_tl
+ \bool_if:NT \l__siunitx_complex_root_after_bool
+ { \exp_not:V \l__siunitx_complex_output_root_tl }
+ }
+ \exp_not:V \l__siunitx_complex_exp_tl
+ }
}
-\AtBeginDocument
+\cs_new_protected:Npn \__siunitx_complex_drop_exponent:nnnnnnn #1#2#3#4#5#6#7
+ { \tl_set:Nn \l__siunitx_complex_real_tl { {#1} {#2} {#3} {#4} {#5} { } { 0 } } }
+\cs_new_protected:Npn \__siunitx_complex_format_sign:nnnnnnn #1#2#3#4#5#6#7
{
- \@ifpackageloaded { textcomp }
+ \tl_set:Nx \l__siunitx_complex_img_tl
{
- \cs_set_protected:Npn \__siunitx_print_text_aux:
+ { }
+ { \tl_if_blank:nTF {#2} { + } { \exp_not:n {#2} } }
+ \tl_if_blank:nTF {#4}
{
- \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \pm }
- { \textpm }
+ \str_if_eq:nnTF {#3} { 1 }
+ { { } { } }
+ { \exp_not:n { {#3} {#4} } }
}
+ { \exp_not:n { {#3} {#4} } }
+ \exp_not:n { {#5} {#6} {#7} }
}
- { }
}
-\cs_new_protected:Npn \__siunitx_print_text_sub:n #1
+\cs_new_protected:Npn \__siunitx_complex_extract_exponent:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8
+ \q_nil #9 \q_stop
{
- \cs_set:Npn \__siunitx_print_text_sub_super:n ##1
+ \tl_set:Nn \l__siunitx_complex_sign_tl {#1#2}
+ \__siunitx_complex_extract_exponent_aux:nw {#3#4#5#6#7#8} #9 \q_stop
+ }
+\cs_new:Npn \__siunitx_complex_extract_exponent_aux:nw
+ #1#2 \q_nil #3 \q_nil #4 \q_stop
+ {
+ \tl_set:Nn \l__siunitx_complex_tmp_tl {#1#2}
+ \tl_set:Nn \l__siunitx_complex_exp_tl {#3#4}
+ }
+\cs_new_protected:Npn \__siunitx_complex_format_bracket:n #1
+ {
+ \exp_not:V \l__siunitx_complex_bracket_open_tl
+ #1
+ \exp_not:V \l__siunitx_complex_bracket_close_tl
+ }
+\cs_new_protected:Npn \__siunitx_complex_format_units:n #1
+ {
+ \tl_if_blank:nTF {#1}
{
- \ensuremath
- {
- \sb { \text {#1} }
- \sp { \text {##1} }
- }
+ \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl
+ \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl
}
- \cs_set_protected:Npn \__siunitx_peek_true:
{
- \tex_afterassignment:D \__siunitx_print_text_sub_super:n
- \cs_set_eq:NN \__siunitx_tmp:w
+ \use:c { __siunitx_complex_format_ \l_siunitx_quantity_prefix_mode_tl :n } {#1}
}
- \cs_set_protected:Npn \__siunitx_peek_false:
- { \ensuremath { \sb { \text {#1} } } }
- \peek_after:Nw \__siunitx_print_text_sub_peek:
}
-\cs_new_protected:Npn \__siunitx_print_text_sub_peek:
+\cs_new_protected:cpn { __siunitx_complex_format_combine-exponent:n } #1
{
- \if_meaning:w \l_peek_token \__siunitx_print_text_super:n
- \exp_after:wN \__siunitx_peek_true:
- \else:
- \exp_after:wN \__siunitx_peek_false:
- \fi:
+ \tl_if_empty:NF \l__siunitx_complex_real_tl
+ { \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl }
+ \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl
+ \fp_set:Nn \l__siunitx_complex_tmp_fp
+ { \exp_after:wN \__siunitx_complex_extract_exp:nnnnnnn \l__siunitx_complex_img_tl }
+ \siunitx_unit_format_combine_exponent:nnN {#1}
+ \l__siunitx_complex_tmp_fp \l__siunitx_complex_unit_tl
}
-\cs_new_protected:Npn \__siunitx_peek_true: { }
-\cs_new_protected:Npn \__siunitx_peek_false: { }
-\cs_new_protected:Npn \__siunitx_print_text_sub_super:n { }
-\cs_new_protected:Npn \__siunitx_print_text_super:n #1 {
- \tl_set:Nn \l__siunitx_tmpa_tl {#1}
- \tl_replace_all:Nnn \l__siunitx_tmpa_tl { - }
- { \textminus }
- \tl_set:Nx \l__siunitx_tmpa_tl
- {
- \exp_not:N \ensuremath
- { \sp { \exp_not:N \text { \exp_not:V \l__siunitx_tmpa_tl } } }
- }
- \l__siunitx_tmpa_tl
-}
-\keys_define:nn { siunitx } {
- input-product .tl_set:N = \l__siunitx_input_product_tl,
- input-quotient .tl_set:N = \l__siunitx_input_quotient_tl,
-}
-\keys_set:nn { siunitx } {
- input-product = x,
- input-quotient = /
-}
-\tl_new:N \l__siunitx_number_arg_tl
-\tl_new:N \l__siunitx_number_next_tl
-\tl_new:N \l__siunitx_number_multi_tl
-\tl_new:N \l__siunitx_number_denominator_tl
-\tl_new:N \l__siunitx_number_numerator_tl
-\cs_new_protected:Npn \__siunitx_number_preprocess:n #1 {
- \__siunitx_number_preprocess_init:
- \tl_set:Nn \l__siunitx_number_arg_tl {#1}
- \__siunitx_number_preprocess_product:
- \tl_if_empty:NT \l__siunitx_number_multi_tl
- { \__siunitx_number_preprocess_quotient: }
-}
-\cs_generate_variant:Nn \__siunitx_number_preprocess:n { V }
-\cs_new_protected:Npn \__siunitx_number_preprocess_init: {
- \bool_set_false:N \l__siunitx_error_bool
- \tl_clear:N \l__siunitx_number_multi_tl
-}
-\cs_new_protected:Npn \__siunitx_number_preprocess_product: {
- \tl_map_function:NN \l__siunitx_input_product_tl
- \__siunitx_number_preprocess_product_aux:N
-}
-\cs_new_protected:Npn \__siunitx_number_preprocess_product_aux:N #1 {
- \tl_if_in:NnT \l__siunitx_number_arg_tl {#1}
- {
- \cs_set:Npn \__siunitx_tmp:w ##1 #1 ##2 \q_stop
- {
- \tl_set:Nn \l__siunitx_number_arg_tl {##1}
- \tl_set:Nn \l__siunitx_number_next_tl {##2}
- \tl_set:Nn \l__siunitx_number_multi_tl { product }
- }
- \exp_after:wN \__siunitx_tmp:w \l__siunitx_number_arg_tl \q_stop
- \tl_if_empty:NT \l__siunitx_number_arg_tl
- { \__siunitx_error:n { starting-product-token } }
- \tl_if_empty:NT \l__siunitx_number_next_tl
- { \__siunitx_error:n { ending-product-token } }
- \tl_map_break:
- }
-}
-\cs_new_protected:Npn \__siunitx_number_preprocess_quotient: {
- \tl_map_function:NN \l__siunitx_input_quotient_tl
- \__siunitx_number_preprocess_quotient_aux:N
-}
-\cs_new_protected:Npn \__siunitx_number_preprocess_quotient_aux:N #1 {
- \tl_if_in:NnT \l__siunitx_number_arg_tl {#1}
- {
- \cs_set:Npn \__siunitx_tmp:w ##1 #1 ##2 \q_stop
- {
- \tl_set:Nn \l__siunitx_number_numerator_tl {##1}
- \tl_set:Nn \l__siunitx_number_denominator_tl {##2}
- \tl_set:Nn \l__siunitx_number_multi_tl { quotient }
- }
- \exp_after:wN \__siunitx_tmp:w \l__siunitx_number_arg_tl \q_stop
- \tl_if_empty:NT \l__siunitx_number_numerator_tl
- { \__siunitx_error:n { starting-quotient-token } }
- \tl_if_empty:NT \l__siunitx_number_denominator_tl
- { \__siunitx_error:n { ending-quotient-token } }
- \tl_if_in:NnT \l__siunitx_number_denominator_tl {#1}
- { \__siunitx_error:n { duplicate-quotient-token } }
- \tl_map_break:
- }
-}
-\tl_const:Nn \c__siunitx_number_part_complex_tl { complex }
-\bool_new:N \l__siunitx_number_in_complex_bool
-\bool_new:N \l__siunitx_number_in_complex_root_bool
-\bool_new:N \l__siunitx_number_in_decimal_bool
-\bool_new:N \l__siunitx_number_in_exponent_bool
-\bool_new:N \l__siunitx_number_in_first_bool
-\bool_new:N \l__siunitx_number_in_sign_bool
-\bool_new:N \l__siunitx_number_in_uncert_bool
-\bool_new:N \l__siunitx_number_in_value_bool
-\prop_new:N \l__siunitx_number_in_prop
-\tl_new:N \l__siunitx_number_parsed_tl
-\tl_new:N \l__siunitx_number_part_tl
-\tl_new:N \l__siunitx_number_part_decimal_tl
-\tl_new:N \l__siunitx_number_part_decimal_marker_tl
-\tl_new:N \l__siunitx_number_part_integer_tl
-\tl_new:N \l__siunitx_number_part_sign_tl
-\tl_new:N \l__siunitx_number_part_uncert_tl
-\int_new:N \l__siunitx_number_mantissa_length_int
-\tl_new:N \l__siunitx_number_uncert_tl
-\int_new:N \l__siunitx_number_uncert_length_int
-\tl_new:N \l__siunitx_input_uncert_sign_tl
-\keys_define:nn { siunitx } {
- input-close-uncertainty .tl_set:N = \l__siunitx_input_uncert_close_tl ,
- input-complex-roots .tl_set:N = \l__siunitx_input_complex_tl ,
- input-comparators .tl_set:N = \l__siunitx_input_comparator_tl ,
- input-decimal-markers .tl_set:N = \l__siunitx_input_decimal_tl ,
- input-digits .tl_set:N = \l__siunitx_input_digit_tl ,
- input-exponent-markers .tl_set:N = \l__siunitx_input_exponent_tl ,
- input-ignore .tl_set:N = \l__siunitx_input_ignore_tl ,
- input-open-uncertainty .tl_set:N = \l__siunitx_input_uncert_open_tl ,
- input-protect-tokens .tl_set:N = \l__siunitx_input_protect_tl ,
- input-signs .tl_set:N = \l__siunitx_input_sign_tl ,
- input-symbols .tl_set:N = \l__siunitx_input_symbol_tl ,
- input-uncertainty-signs .code:n =
- {
- \tl_set:Nn \l__siunitx_input_uncert_sign_tl {#1}
- \tl_map_inline:nn {#1}
- {
- \tl_if_in:NnF \l__siunitx_input_sign_tl {##1}
- { \tl_put_right:Nn \l__siunitx_input_sign_tl {##1} }
- }
- } ,
-}
-\keys_set:nn { siunitx } { % (
- input-close-uncertainty = ),
- input-complex-roots = ij,
- input-comparators = {<=>\approx\ge\geq\gg\le\leq\ll\sim},
- input-decimal-markers = {.,},
- input-digits = 0123456789,
- input-exponent-markers = dDeE,
- input-open-uncertainty = (, % )
- input-protect-tokens = \approx\dots\ge\geq\gg\le\leq\ll\mp\pi\pm\sim,
- input-signs = +-\mp\pm,
- input-symbols = \dots\pi,
- input-uncertainty-signs = \pm,
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse:n #1 {
- \tl_if_empty:nF {#1}
- {
- \__siunitx_number_in_init:
- \cs_set_eq:NN \__siunitx_number_in_parse_more:N
- \__siunitx_number_in_parse_mantissa_aux:N
- \__siunitx_number_in_parse_aux:n {#1}
- }
-}
-\cs_generate_variant:Nn \__siunitx_number_in_parse:n { V }
-\group_begin:
- \char_set_catcode_active:N \~
- \char_set_catcode_space:N \ %
- \cs_new_protected:Npn \__siunitx_number_in_parse_aux:n#1%
- {%
- \group_begin:
- \__siunitx_number_in_protect:
- \cs_set_eq:NN\,\prg_do_nothing:
- \cs_set_eq:NN~\prg_do_nothing:
- \tl_set_rescan:Nnx\l__siunitx_number_arg_tl
- {%
- \char_set_catcode_ignore:N\ %
- \char_set_catcode_other:N\,%
- \char_set_catcode_other:N\.%
- }%
- {#1}%
- \exp_args:NNNV\group_end:
- \tl_set:Nn\l__siunitx_number_arg_tl\l__siunitx_number_arg_tl
- \__siunitx_number_in_sign_replace:N\l__siunitx_number_arg_tl
- \__siunitx_number_in_parse_relation:N\l__siunitx_number_arg_tl
- \tl_map_function:NN\l__siunitx_number_arg_tl
- \__siunitx_number_in_parse_loop:N
- \tl_if_empty:NF\l__siunitx_number_parsed_tl
- {%
- \bool_if:NTF\l__siunitx_number_in_uncert_bool
- {\__siunitx_error:nx{invalid-number}{#1}}%
- {%
- \prop_put:NVn \l__siunitx_number_in_prop
- \l__siunitx_number_part_tl {true}%
- \bool_if:NTF\l__siunitx_number_in_decimal_bool
- {%
- \prop_put:NVV\l__siunitx_number_in_prop
- \l__siunitx_number_part_decimal_tl
- \l__siunitx_number_parsed_tl
- }%
- {%
- \prop_put:NVV\l__siunitx_number_in_prop
- \l__siunitx_number_part_integer_tl
- \l__siunitx_number_parsed_tl
- }%
- }%
- }%
- \__siunitx_number_in_check:n {#1}%
- }
-\group_end:
-\cs_new_protected:Npn \__siunitx_number_in_init: {
- \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
- \__siunitx_number_in_parse_mantissa:N
- \cs_set_eq:NN \__siunitx_number_in_check:n
- \__siunitx_number_in_check_short:n
- \tl_clear:N \l__siunitx_number_parsed_tl
- \prop_clear:N \l__siunitx_number_in_prop
- \bool_set_false:N \l__siunitx_error_bool
- \bool_set_false:N \l__siunitx_number_in_complex_bool
- \bool_set_false:N \l__siunitx_number_in_complex_root_bool
- \bool_set_false:N \l__siunitx_number_in_exponent_bool
- \bool_set_false:N \l__siunitx_number_in_uncert_bool
- \__siunitx_number_in_init_part:n { mantissa }
-}
-\cs_new_protected:Npn \__siunitx_number_in_init_part:n #1 {
- \bool_set_false:N \l__siunitx_number_in_decimal_bool
- \bool_set_true:N \l__siunitx_number_in_first_bool
- \bool_set_false:N \l__siunitx_number_in_sign_bool
- \bool_set_false:N \l__siunitx_number_in_value_bool
- \tl_set:Nn \l__siunitx_number_part_tl {#1}
- \tl_set:Nn \l__siunitx_number_part_decimal_tl { #1 -decimal }
- \tl_set:Nn \l__siunitx_number_part_decimal_marker_tl
- { #1 -decimal-marker }
- \tl_set:Nn \l__siunitx_number_part_integer_tl { #1 -integer }
- \tl_set:Nn \l__siunitx_number_part_sign_tl { #1 -sign }
- \tl_set:Nn \l__siunitx_number_part_uncert_tl { #1 -uncertainty }
-}
-\cs_new_protected:Npn \__siunitx_number_in_protect: {
- \tl_map_function:NN \l__siunitx_input_protect_tl
- \__siunitx_number_in_protect_aux:N
-}
-\cs_new_protected:Npn \__siunitx_number_in_protect_aux:N #1 {
- \cs_set_eq:NN #1 \scan_stop:
-}
-\cs_new_protected:Npn \__siunitx_number_in_sign_replace:N #1
- {
- \__siunitx_number_in_sign_replace_aux:N #1
- \__siunitx_number_in_sign_replace_aux:NnN #1
- { -+ } \mp
- { +- } \pm
- { << } \ll
- { <= } \le
- { >> } \gg
- { >= } \ge
- { ?? } \q_recursion_tail
- \q_recursion_stop
+\cs_new_protected:cpx { __siunitx_complex_format_extract-exponent:n } #1
+ {
+ \exp_not:N \siunitx_unit_format_extract_prefixes:nNN {#1}
+ \exp_not:N \l__siunitx_complex_unit_tl \exp_not:N \l__siunitx_complex_tmp_fp
+ \exp_not:c { __siunitx_complex_format_extract-exponent:N }
+ \exp_not:N \l__siunitx_complex_img_tl
+ \exp_not:N \tl_if_empty:NF \exp_not:N \l__siunitx_complex_real_tl
+ {
+ \exp_not:c { __siunitx_complex_format_extract-exponent:N }
+ \exp_not:N \l__siunitx_complex_real_tl
+ }
}
-\group_begin:
- \char_set_catcode_active:N -
- \cs_new_protected:Npx \__siunitx_number_in_sign_replace_aux:N #1
- { \tl_replace_all:Nnn #1 { \exp_not:N - } { \token_to_str:N - } }
-\group_end:
-\cs_new_protected:Npn \__siunitx_number_in_sign_replace_aux:NnN #1#2#3
+\cs_new_protected:cpn { __siunitx_complex_format_extract-exponent:N } #1
{
- \quark_if_recursion_tail_stop:N #3
- \tl_replace_all:Nnn #1 {#2} {#3}
- \__siunitx_number_in_sign_replace_aux:NnN #1
- }
-\cs_new_protected:Npn \__siunitx_number_in_parse_error:nn #1#2 {
- \__siunitx_error:nx {#1} { \exp_not:n {#2} }
- \tl_map_break:
-}
-\cs_generate_variant:Nn \__siunitx_number_in_parse_error:nn { nV }
-\cs_new_protected:Npn \__siunitx_number_in_parse_loop:N #1 { }
-\cs_new_protected:Npn \__siunitx_number_in_parse_more:N #1 { }
-\cs_new_protected:Npn \__siunitx_number_in_parse_relation:N #1 {
- \exp_after:wN \__siunitx_number_in_parse_relation:w #1 \q_stop #1
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse_relation:w
- #1#2 \q_stop #3 {
- \tl_if_in:NnT \l__siunitx_input_comparator_tl {#1}
- {
- \prop_put:Nnn \l__siunitx_number_in_prop { comparator } {#1}
- \tl_set:Nn #3 {#2}
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse_restricted:N #1 {
- \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
- {
- \__siunitx_number_in_parse_error:nn
- { restricted-number } {#1}
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { restricted-number } \l__siunitx_number_arg_tl
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { restricted-number } \l__siunitx_number_arg_tl
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { restricted-number } \l__siunitx_number_arg_tl
- }
- {
- \__siunitx_number_in_parse_error:nn
- { restricted-number } {#1}
- }
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse_complex:N #1 {
- \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
- {
- \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
- \__siunitx_number_in_parse_mantissa:N
- \__siunitx_number_in_exponent:N #1
- }
- {
- \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { misplaced-complex-root-token }
- \l__siunitx_number_arg_tl
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse_exponent:N #1 {
- \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
- {
- \__siunitx_number_in_parse_error:nn
- { duplicate-exponent-token } { \token_to_str:N #1 }
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { invalid-token-in-exponent } \l__siunitx_number_arg_tl
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { invalid-token-in-exponent } \l__siunitx_number_arg_tl
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { invalid-token-in-exponent }
- \l__siunitx_number_arg_tl
- }
- {
- \__siunitx_number_in_parse_error:nn
- { invalid-token-in-number } {#1}
- }
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse_mantissa:N #1 {
- \tl_if_in:NnTF \l__siunitx_input_digit_tl {#1}
- { \__siunitx_number_in_digit:n {#1} }
- {
- \tl_if_in:NnTF \l__siunitx_input_decimal_tl {#1}
- { \__siunitx_number_in_decimal:N #1 }
- {
- \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
- { \__siunitx_number_in_sign:N #1 }
- {
- \tl_if_in:NnTF \l__siunitx_input_symbol_tl {#1}
- {
- \prop_put:Nnn \l__siunitx_number_in_prop { symbolic }
- { true }
- \__siunitx_number_in_digit:n {#1}
- }
- {
- \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
- { \__siunitx_number_in_parse_more:N #1 }
- }
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse_mantissa_aux:N #1 {
- \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
- { \__siunitx_number_in_exponent:N #1 }
- {
- \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
- { \__siunitx_number_in_uncert_open:N #1 }
- {
- \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
- {
- \__siunitx_number_in_parse_error:nn
- { misplaced-uncertainty-token } {#1}
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
- { \__siunitx_number_in_complex:N #1 }
- {
- \__siunitx_number_in_parse_error:nn
- { invalid-token-in-number } {#1}
- }
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse_uncert:N #1 {
- \tl_if_in:NnTF \l__siunitx_input_digit_tl {#1}
- { \__siunitx_number_in_digit:n {#1} }
- {
- \tl_if_in:NnTF \l__siunitx_input_decimal_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { invalid-token-in-uncertainty }
- \l__siunitx_number_arg_tl
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
- {
- \__siunitx_number_in_parse_error:nV
- { invalid-token-in-uncertainty }
- \l__siunitx_number_arg_tl
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_symbol_tl {#1}
- {
- \prop_put:Nnn \l__siunitx_number_in_prop { symbolic }
- { true }
- \__siunitx_number_in_digit:n {#1}
- }
- {
- \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
- {
- \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl
- {#1}
- { \__siunitx_number_in_uncert_close:N #1 }
- {
- \__siunitx_number_in_parse_error:nV
- { invalid-token-in-uncertainty }
- \l__siunitx_number_arg_tl
- }
- }
- }
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_parse_uncert_after:N #1 {
- \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
- {
- \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
- \__siunitx_number_in_parse_mantissa:N
- \__siunitx_number_in_exponent:N #1
- }
- {
- \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
- {
- \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
- \__siunitx_number_in_parse_mantissa:N
- \__siunitx_number_in_sign:N #1
- }
- {
- \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
- {
- \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
- {
- \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
- \__siunitx_number_in_parse_mantissa:N
- \__siunitx_number_in_complex:N #1
- }
- {
- \__siunitx_number_in_parse_error:nV { invalid-number }
- \l__siunitx_number_arg_tl
- }
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_complex:N #1 {
- \bool_set_false:N \l__siunitx_number_in_first_bool
- \bool_if:NTF \l__siunitx_number_in_complex_root_bool
- {
- \__siunitx_number_in_parse_error:nn
- { duplicate-complex-root-token } { \token_to_str:N #1 }
- }
- {
- \cs_set_eq:NN \__siunitx_number_in_check:n
- \__siunitx_number_in_check_full:n
- \bool_set_true:N \l__siunitx_number_in_complex_root_bool
- \prop_put:Nnn \l__siunitx_number_in_prop { complex-root } {#1}
- \tl_if_empty:NF \l__siunitx_number_parsed_tl
- {
- \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
- \__siunitx_number_in_parse_complex:N
- }
- \bool_if:NT \l__siunitx_number_in_decimal_bool
- {
- \bool_if:NF \l__siunitx_number_in_complex_bool
- {
- \prop_if_in:NnT \l__siunitx_number_in_prop
- { mantissa-uncertainty }
- {
- \__siunitx_number_in_complex_aux:nn
- { mantissa-decimal } { complex-decimal }
- \__siunitx_number_in_complex_aux:nn
- { mantissa-uncertainty } { complex-uncertainty }
- }
- \__siunitx_number_in_complex_aux:nn { mantissa-integer }
- { complex-integer }
- \__siunitx_number_in_complex_aux:nn
- { mantissa-decimal-marker } { complex-decimal-marker }
- \prop_remove:Nn \l__siunitx_number_in_prop { mantissa }
- \prop_put:Nnn \l__siunitx_number_in_prop { complex }
- { true }
- }
- }
- \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
- {
- \prop_if_in:NnT \l__siunitx_number_in_prop { mantissa-sign }
- {
- \__siunitx_number_in_complex_aux:nn { mantissa-sign }
- { complex-sign }
- }
- }
- \bool_set_true:N \l__siunitx_number_in_complex_bool
- \bool_set_false:N \l__siunitx_number_in_first_bool
- \__siunitx_number_in_init_part:n { complex }
- \prop_if_in:NnT \l__siunitx_number_in_prop
- { complex-decimal-marker }
- { \bool_set_true:N \l__siunitx_number_in_decimal_bool }
- \prop_if_in:NnTF \l__siunitx_number_in_prop
- { complex-sign }
- { \bool_set_true:N \l__siunitx_number_in_sign_bool }
- { \prop_remove:Nn \l__siunitx_number_in_prop { mantissa } }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_complex_aux:nn #1#2 {
- \prop_get:NnNT \l__siunitx_number_in_prop {#1} \l__siunitx_tmpa_tl
- {
- \prop_remove:Nn \l__siunitx_number_in_prop {#1}
- \prop_put:NnV \l__siunitx_number_in_prop {#2} \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_decimal:N #1 {
- \bool_set_false:N \l__siunitx_number_in_first_bool
- \bool_if:NTF \l__siunitx_number_in_decimal_bool
- {
- \__siunitx_number_in_parse_error:nn { duplicate-decimal-token }
- {#1}
- }
- {
- \bool_set_true:N \l__siunitx_number_in_decimal_bool
- \tl_if_empty:NF \l__siunitx_number_parsed_tl
- {
- \prop_put:NVn \l__siunitx_number_in_prop
- \l__siunitx_number_part_tl { true }
- \prop_put:NVV \l__siunitx_number_in_prop
- \l__siunitx_number_part_integer_tl
- \l__siunitx_number_parsed_tl
- \tl_clear:N \l__siunitx_number_parsed_tl
- }
- \prop_put:NVn \l__siunitx_number_in_prop
- \l__siunitx_number_part_decimal_marker_tl {#1}
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_digit:n #1 {
- \bool_set_false:N \l__siunitx_number_in_first_bool
- \bool_if:NTF \l__siunitx_number_in_uncert_bool
- { \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1} }
- {
- \bool_if:NTF \l__siunitx_number_in_decimal_bool
- {
- \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1}
- \str_if_eq:nnF {#1} { 0 }
- { \bool_set_true:N \l__siunitx_number_in_value_bool }
- }
- {
- \str_if_eq:nnTF {#1} { 0 }
- {
- \prop_put:NVn \l__siunitx_number_in_prop
- \l__siunitx_number_part_tl { true }
- \prop_put:NVn \l__siunitx_number_in_prop
- \l__siunitx_number_part_integer_tl { 0 }
- }
- { \bool_set_true:N \l__siunitx_number_in_value_bool }
- \bool_if:NT \l__siunitx_number_in_value_bool
- { \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1} }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_exponent:N #1 {
- \bool_if:NTF \l__siunitx_number_in_exponent_bool
- {
- \__siunitx_number_in_parse_error:nn { duplicate-exponent-token }
- { \token_to_str:N #1 }
- }
- {
- \cs_set_eq:NN \__siunitx_number_in_parse_more:N
- \__siunitx_number_in_parse_exponent:N
- \tl_if_empty:NF \l__siunitx_number_parsed_tl
- { \__siunitx_number_in_store: }
- \bool_set_true:N \l__siunitx_number_in_exponent_bool
- \__siunitx_number_in_init_part:n { exponent }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_sign:N #1 {
- \bool_if:NTF \l__siunitx_number_in_first_bool
- {
- \bool_set_false:N \l__siunitx_number_in_first_bool
- \bool_set_true:N \l__siunitx_number_in_sign_bool
- \prop_put:NVn \l__siunitx_number_in_prop
- \l__siunitx_number_part_sign_tl {#1}
- }
- {
- \bool_if:NTF \l__siunitx_number_in_exponent_bool
- {
- \__siunitx_number_in_parse_error:nn { misplaced-sign-token }
- {#1}
- }
- {
- \bool_if:NTF \l__siunitx_number_in_complex_bool
- {
- \__siunitx_number_in_parse_error:nn
- { misplaced-sign-token } {#1}
- }
- {
- \tl_if_empty:NF \l__siunitx_number_parsed_tl
- { \__siunitx_number_in_store: }
- \cs_set_eq:NN \__siunitx_number_in_check:n
- \__siunitx_number_in_check_full:n
- \__siunitx_number_in_init_part:n { complex }
- \prop_put:Nnn \l__siunitx_number_in_prop
- { complex-sign } {#1}
- \bool_set_true:N \l__siunitx_number_in_complex_bool
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_uncert_open:N #1 {
- \bool_set_false:N \l__siunitx_number_in_first_bool
- \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
- \__siunitx_number_in_parse_uncert:N
- \bool_set_true:N \l__siunitx_number_in_uncert_bool
- \tl_if_empty:NTF \l__siunitx_number_parsed_tl
- {
- \prop_if_in:NVF \l__siunitx_number_in_prop
- \l__siunitx_number_part_integer_tl
- {
- \__siunitx_number_in_parse_error:nV { invalid-number }
- \l__siunitx_number_arg_tl
- }
- }
- { \__siunitx_number_in_store: }
-}
-\cs_new_protected:Npn \__siunitx_number_in_uncert_close:N #1 {
- \bool_set_false:N \l__siunitx_number_in_uncert_bool
- \tl_if_empty:NTF \l__siunitx_number_parsed_tl
- {
- \__siunitx_number_in_parse_error:nV { empty-uncertainty }
- \l__siunitx_number_arg_tl
- }
- {
- \prop_put:NVV \l__siunitx_number_in_prop
- \l__siunitx_number_part_uncert_tl \l__siunitx_number_parsed_tl
- \prop_put:Nnn \l__siunitx_number_in_prop
- { uncertainty } { true }
- \tl_clear:N \l__siunitx_number_parsed_tl
- \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
- \__siunitx_number_in_parse_uncert_after:N
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_store: {
- \prop_put:NVn \l__siunitx_number_in_prop \l__siunitx_number_part_tl
- { true }
- \bool_if:NTF \l__siunitx_number_in_decimal_bool
- {
- \prop_put:NVV \l__siunitx_number_in_prop
- \l__siunitx_number_part_decimal_tl \l__siunitx_number_parsed_tl
- }
- {
- \prop_put:NVV \l__siunitx_number_in_prop
- \l__siunitx_number_part_integer_tl \l__siunitx_number_parsed_tl
- }
- \tl_clear:N \l__siunitx_number_parsed_tl
-}
-\cs_new_protected:Npn \__siunitx_number_in_check:n #1 { }
-\cs_new_protected:Npn \__siunitx_number_in_check_short:n #1 {
- \prop_if_in:NVF \l__siunitx_number_in_prop
- \l__siunitx_number_part_integer_tl
- {
- \prop_if_in:NVF \l__siunitx_number_in_prop
- \l__siunitx_number_part_decimal_tl
- { \__siunitx_error:nx { invalid-number } {#1} }
- }
- \bool_if:NF \l__siunitx_number_in_value_bool
- {
- \tl_if_eq:NNF \l__siunitx_number_part_tl
- \c__siunitx_number_part_complex_tl
- {
- \prop_get:NVNT \l__siunitx_number_in_prop
- \l__siunitx_number_part_sign_tl \l__siunitx_tmpa_tl
- {
- \tl_set:Nx \l__siunitx_tmpb_tl
- { \l__siunitx_number_part_sign_tl -deleted }
- \prop_put:NVV \l__siunitx_number_in_prop
- \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
- }
- \prop_remove:NV \l__siunitx_number_in_prop
- \l__siunitx_number_part_sign_tl
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_check_full:n #1 {
- \tl_if_eq:NNF \l__siunitx_number_part_tl
- \c__siunitx_number_part_complex_tl
- { \__siunitx_number_in_check_short:n {#1} }
- \bool_if:NF \l__siunitx_number_in_complex_root_bool
- {
- \prop_get:NnN \l__siunitx_number_in_prop { complex-sign }
- \l__siunitx_tmpa_tl
- \tl_if_in:NVTF \l__siunitx_input_uncert_sign_tl \l__siunitx_tmpa_tl
+ \tl_set:Nx #1
+ { \siunitx_number_adjust_exponent:Nn #1 \l__siunitx_complex_tmp_fp }
+ \siunitx_number_process:NN #1 #1
+ }
+\cs_new_protected:Npn \__siunitx_complex_format_input:n #1
+ {
+ \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl
+ \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl
+ \siunitx_unit_format:nN {#1} \l__siunitx_complex_unit_tl
+ }
+\cs_new:Npn \__siunitx_complex_extract_exp:nnnnnnn #1#2#3#4#5#6#7 { #6#7 }
+\msg_new:nnnn { siunitx } { invalid-complex-number }
+ { Invalid~complex-number~'#1'. }
+ {
+ The~input~'#1'~could~not~be~parsed~as~a~complex|number~following~the~
+ format~defined~in~module~documentation.
+ }
+\keys_set:nn { siunitx }
+ {
+ complex-root-position = after-number ,
+ input-complex-root = ij ,
+ output-complex-root = \mathrm { i }
+ }
+\cs_generate_variant:Nn \keys_set:nn { nx }
+\fp_new:N \l__siunitx_compound_tmp_fp
+\seq_new:N \l__siunitx_compound_tmp_seq
+\tl_new:N \l__siunitx_compound_tmp_tl
+\tl_new:N \l__siunitx_compound_first_tl
+\tl_new:N \l__siunitx_compound_exp_tl
+\tl_new:N \l__siunitx_compound_start_tl
+\tl_new:N \l__siunitx_compound_end_tl
+\int_new:N \l__siunitx_compound_count_int
+\tl_new:N \l__siunitx_compound_unit_tl
+\tl_new:N \l__siunitx_compound_bracket_close_tl
+\tl_new:N \l__siunitx_compound_bracket_open_tl
+\tl_set:Nn \l__siunitx_compound_bracket_open_tl { ( }
+\tl_set:Nn \l__siunitx_compound_bracket_close_tl { ) }
+\bool_new:N \l__siunitx_compound_exp_bracket_bool
+\bool_new:N \l__siunitx_compound_exp_combine_bool
+\bool_new:N \l__siunitx_compound_separator_text_bool
+\bool_new:N \l__siunitx_compound_unit_bracket_bool
+\bool_new:N \l__siunitx_compound_unit_power_bool
+\bool_new:N \l__siunitx_compound_unit_repeat_bool
+\keys_define:nn { siunitx }
+ {
+ compound-exponents .choice: ,
+ compound-exponents / combine .code:n =
+ {
+ \bool_set_false:N \l__siunitx_compound_exp_bracket_bool
+ \bool_set_true:N \l__siunitx_compound_exp_combine_bool
+ } ,
+ compound-exponents / combine-bracket .code:n =
+ {
+ \bool_set_true:N \l__siunitx_compound_exp_bracket_bool
+ \bool_set_true:N \l__siunitx_compound_exp_combine_bool
+ } ,
+ compound-exponents / individual .code:n =
+ {
+ \bool_set_false:N \l__siunitx_compound_exp_bracket_bool
+ \bool_set_false:N \l__siunitx_compound_exp_combine_bool
+ } ,
+ compound-final-separator .tl_set:N =
+ \l__siunitx_compound_separator_final_tl ,
+ compound-pair-separator .tl_set:N =
+ \l__siunitx_compound_separator_pair_tl ,
+ compound-separator .tl_set:N =
+ \l__siunitx_compound_separator_tl ,
+ compound-separator-mode .choice: ,
+ compound-separator-mode / number .code:n =
+ { \bool_set_false:N \l__siunitx_compound_separator_text_bool } ,
+ compound-separator-mode / text .code:n =
+ { \bool_set_true:N \l__siunitx_compound_separator_text_bool } ,
+ compound-units .choice: ,
+ compound-units / bracket .code:n =
+ {
+ \bool_set_true:N \l__siunitx_compound_unit_bracket_bool
+ \bool_set_false:N \l__siunitx_compound_unit_power_bool
+ \bool_set_false:N \l__siunitx_compound_unit_repeat_bool
+ } ,
+ compound-units / bracket-power .code:n =
+ {
+ \bool_set_true:N \l__siunitx_compound_unit_bracket_bool
+ \bool_set_true:N \l__siunitx_compound_unit_power_bool
+ \bool_set_false:N \l__siunitx_compound_unit_repeat_bool
+ } ,
+ compound-units / power .code:n =
+ {
+ \bool_set_false:N \l__siunitx_compound_unit_bracket_bool
+ \bool_set_true:N \l__siunitx_compound_unit_power_bool
+ \bool_set_false:N \l__siunitx_compound_unit_repeat_bool
+ } ,
+ compound-units / repeat .code:n =
+ {
+ \bool_set_false:N \l__siunitx_compound_unit_bracket_bool
+ \bool_set_false:N \l__siunitx_compound_unit_power_bool
+ \bool_set_true:N \l__siunitx_compound_unit_repeat_bool
+ } ,
+ compound-units / single .code:n =
+ {
+ \bool_set_false:N \l__siunitx_compound_unit_bracket_bool
+ \bool_set_false:N \l__siunitx_compound_unit_power_bool
+ \bool_set_false:N \l__siunitx_compound_unit_repeat_bool
+ }
+ }
+\cs_new_protected:Npn \siunitx_compound_number:n #1
+ {
+ \group_begin:
+ \__siunitx_compound_format:nn {#1} { }
+ \__siunitx_compound_print:N \siunitx_print_number:x
+ \group_end:
+ }
+\cs_new_protected:Npn \__siunitx_compound_format:nn #1#2
+ {
+ \seq_clear:N \l__siunitx_compound_tmp_seq
+ \bool_if:NTF \l_siunitx_number_parse_bool
+ {
+ \exp_args:Nxx \__siunitx_compound_format:nnn
+ { \tl_head:n {#1} }
+ { \tl_tail:n {#1} }
+ {#2}
+ }
+ { \tl_map_function:nN {#1} \__siunitx_compound_unparsed:n }
+ }
+\cs_new_protected:Npn \__siunitx_compound_format:nnn #1#2#3
+ {
+ \siunitx_number_parse:nN {#1} \l__siunitx_compound_tmp_tl
+ \tl_if_blank:nTF {#3}
+ { \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl }
+ { \__siunitx_compound_format_units:nn {#2} {#3} }
+ \bool_lazy_and:nnTF
+ { \l__siunitx_compound_exp_combine_bool }
+ { \int_compare_p:nNn { \tl_count:n {#2} } > 0 }
+ { \__siunitx_compound_extract_exponents: }
+ {
+ \tl_set:Nx \l__siunitx_compound_tmp_tl
+ { \siunitx_number_output:N \l__siunitx_compound_first_tl }
+ \seq_put_right:NV \l__siunitx_compound_tmp_seq \l__siunitx_compound_tmp_tl
+ }
+ \tl_map_function:nN {#2} \__siunitx_compound_parsed:n
+ }
+\cs_new_protected:Npn \__siunitx_compound_extract_exponents:
+ {
+ \tl_set:Nx \l__siunitx_compound_tmp_tl
+ { \siunitx_number_output:NN \l__siunitx_compound_first_tl \q_nil }
+ \exp_after:wN \__siunitx_compound_extract_exponents_auxi:w
+ \l__siunitx_compound_tmp_tl \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxi:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8
+ \q_nil #9 \q_stop
+ {
+ \__siunitx_compound_extract_exponents_auxii:nw {#1#2#3#4#5#6#7#8} #9 \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxii:nw
+ #1#2 \q_nil #3 \q_nil #4 \q_stop
+ {
+ \seq_put_right:Nn \l__siunitx_compound_tmp_seq { #1#2 }
+ \tl_set:Nn \l__siunitx_compound_exp_tl { #3#4 }
+ \exp_after:wN \__siunitx_compound_extract_exponents_auxiii:nnnnnnn
+ \l__siunitx_compound_first_tl
+ }
+\cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxiii:nnnnnnn
+ #1#2#3#4#5#6#7
+ {
+ \keys_set:nn { siunitx }
+ {
+ drop-exponent = true ,
+ exponent-mode = fixed ,
+ fixed-exponent = #6#7
+ }
+ }
+\cs_new_protected:Npn \__siunitx_compound_parsed:n #1
+ {
+ \siunitx_number_format:nN {#1} \l__siunitx_compound_tmp_tl
+ \seq_put_right:NV \l__siunitx_compound_tmp_seq \l__siunitx_compound_tmp_tl
+ }
+\cs_new_protected:Npn \__siunitx_compound_unparsed:n #1
+ {
+ \seq_put_right:Nn \l__siunitx_compound_tmp_seq { \ensuremath {#1} }
+ }
+\cs_new_protected:Npn \__siunitx_compound_format_units:nn #1#2
+ {
+ \bool_if:NTF \l__siunitx_compound_unit_power_bool
+ {
+ \use:c { __siunitx_compound_format_ \l_siunitx_quantity_prefix_mode_tl :nn }
+ {#2} { \tl_count:n {#1} + 1 }
+ }
+ {
+ \use:c { __siunitx_compound_format_ \l_siunitx_quantity_prefix_mode_tl :n } {#2}
+ }
+ }
+\cs_new_protected:cpx { __siunitx_compound_format_combine-exponent:n } #1
+ {
+ \exp_not:c { __siunitx_compound_format_combine-exponent_aux:n }
+ {
+ \exp_not:N \siunitx_unit_format_combine_exponent:nnN
+ {#1}
+ }
+ }
+\cs_new_protected:cpx { __siunitx_compound_format_combine-exponent:nn } #1#2
+ {
+ \exp_not:c { __siunitx_compound_format_combine-exponent_aux:n }
+ {
+ \exp_not:N \siunitx_unit_format_multiply_combine_exponent:nnnN
+ {#1} {#2}
+ }
+ }
+\cs_new_protected:cpn { __siunitx_compound_format_combine-exponent_aux:n } #1
+ {
+ \bool_set_true:N \l__siunitx_compound_exp_combine_bool
+ \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl
+ \exp_args:NV \__siunitx_compound_extract_exp:nN
+ \l__siunitx_compound_first_tl \l__siunitx_compound_tmp_fp
+ #1 \l__siunitx_compound_tmp_fp \l__siunitx_compound_unit_tl
+ }
+\cs_new_protected:cpx { __siunitx_compound_format_extract-exponent:n } #1
+ {
+ \exp_not:c { __siunitx_compound_format_extract-exponent_aux:n }
+ { \exp_not:N \siunitx_unit_format_extract_prefixes:nNN {#1} }
+ }
+\cs_new_protected:cpx { __siunitx_compound_format_extract-exponent:nn } #1#2
+ {
+ \exp_not:c { __siunitx_compound_format_extract-exponent_aux:n }
+ {
+ \exp_not:N \siunitx_unit_format_multiply_extract_prefixes:nnNN
+ {#1} {#2}
+ }
+ }
+\cs_new_protected:cpn { __siunitx_compound_format_extract-exponent_aux:n } #1
+ {
+ #1 \l__siunitx_compound_unit_tl \l__siunitx_compound_tmp_fp
+ \tl_set:Nx \l__siunitx_compound_tmp_tl
+ { \siunitx_number_adjust_exponent:Nn \l__siunitx_compound_tmp_tl \l__siunitx_compound_tmp_fp }
+ \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl
+ \bool_set_true:N \l__siunitx_compound_exp_combine_bool
+ }
+\cs_new_protected:Npn \__siunitx_compound_format_input:n #1
+ {
+ \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl
+ \siunitx_unit_format:nN {#1} \l__siunitx_compound_unit_tl
+ }
+\cs_new_protected:Npn \__siunitx_compound_format_input:nn #1#2
+ {
+ \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl
+ \siunitx_unit_format_multiply:nnN {#1} {#2} \l__siunitx_compound_unit_tl
+ }
+\cs_new_protected:Npn \__siunitx_compound_extract_exp:nN #1#2
+ { \__siunitx_compound_extract_exp:nnnnnnnN #1 #2 }
+\cs_new_protected:Npn \__siunitx_compound_extract_exp:nnnnnnnN #1#2#3#4#5#6#7#8
+ { \fp_set:Nn #8 {#6#7} }
+\cs_new_protected:Npn \siunitx_compound_quantity:nn #1#2
+ {
+ \group_begin:
+ \bool_if:NT \l__siunitx_compound_unit_bracket_bool
+ { \bool_set_true:N \l__siunitx_compound_exp_bracket_bool }
+ \bool_if:NT \l__siunitx_compound_unit_repeat_bool
+ { \bool_set_false:N \l__siunitx_compound_exp_combine_bool }
+ \bool_lazy_or:nnT
+ { \l__siunitx_compound_unit_bracket_bool }
+ { ! \l__siunitx_compound_unit_repeat_bool }
+ { \bool_set_false:N \l_siunitx_number_bracket_ambiguous_bool }
+ \__siunitx_compound_format:nn {#1} {#2}
+ \str_if_eq:VnT \l_siunitx_quantity_prefix_mode_tl { combine-exponent }
+ { \tl_clear:N \l__siunitx_compound_exp_tl }
+ \bool_if:NTF \l__siunitx_compound_unit_repeat_bool
+ { \__siunitx_compound_print:N \__siunitx_compound_print_quantity:n }
{
- \prop_if_in:NnTF \l__siunitx_number_in_prop { uncertainty }
+ \bool_lazy_and:nnTF
+ { \l__siunitx_compound_unit_bracket_bool }
+ { \tl_if_empty_p:N \l__siunitx_compound_exp_tl }
{
- \__siunitx_error:nx { misplaced-sign-token }
- { \exp_not:n {#1} }
+ \siunitx_print_number:V \l__siunitx_compound_bracket_open_tl
+ \__siunitx_compound_print:N \siunitx_print_number:x
+ \siunitx_print_number:V \l__siunitx_compound_bracket_close_tl
}
- { \__siunitx_number_in_complex_to_uncert:n {#1} }
+ { \__siunitx_compound_print:N \siunitx_print_number:x }
+ \__siunitx_compound_print_quantity:n { }
}
- {
- \__siunitx_error:nx { misplaced-sign-token }
- { \exp_not:n {#1} }
- }
- }
- \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign }
- \l__siunitx_tmpa_tl
- {
- \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
- {
- \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-sign }
- \prop_put:NnV \l__siunitx_number_in_prop { complex-sign }
- \l__siunitx_tmpa_tl
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert:n #1 {
- \prop_remove:Nn \l__siunitx_number_in_prop { complex }
- \prop_remove:Nn \l__siunitx_number_in_prop { complex-decimal-marker }
- \prop_remove:Nn \l__siunitx_number_in_prop { complex-sign }
- \prop_put:Nnn \l__siunitx_number_in_prop { uncertainty } { true }
- \prop_get:NnNTF \l__siunitx_number_in_prop { complex-integer }
- \l__siunitx_number_uncert_tl
- {
- \tl_if_single:NTF \l__siunitx_number_uncert_tl
- {
- \int_compare:nNnTF \l__siunitx_number_uncert_tl = 0
- { \__siunitx_number_in_complex_to_uncert_dec:n {#1} }
- { \__siunitx_number_in_complex_to_uncert_int: }
- }
- { \__siunitx_number_in_complex_to_uncert_int: }
- }
- { \__siunitx_number_in_complex_to_uncert_dec:n {#1} }
- \prop_remove:Nn \l__siunitx_number_in_prop { complex-integer }
- \prop_remove:Nn \l__siunitx_number_in_prop { complex-decimal }
-}
-\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_int: {
- \prop_get:NnNF \l__siunitx_number_in_prop { complex-decimal }
- \l__siunitx_tmpa_tl
- { \tl_clear:N \l__siunitx_tmpa_tl }
- \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
- \l__siunitx_tmpb_tl
- { \tl_clear:N \l__siunitx_tmpb_tl }
- \__siunitx_number_in_complex_to_uncert_pad:
-}
-\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_dec:n
- #1
- {
- \tl_clear:N \l__siunitx_number_uncert_tl
- \prop_get:NnNTF \l__siunitx_number_in_prop { complex-decimal }
- \l__siunitx_tmpa_tl
- {
- \prop_get:NnN \l__siunitx_number_in_prop { mantissa-decimal }
- \l__siunitx_tmpb_tl
- \quark_if_no_value:NT \l__siunitx_tmpb_tl
- { \tl_clear:N \l__siunitx_tmpb_tl }
- \tl_map_function:NN
- \l__siunitx_tmpa_tl
- \__siunitx_number_in_complex_to_uncert_dec_loop:N
- \__siunitx_number_in_complex_to_uncert_pad:
- }
- { \__siunitx_error:nx { misplaced-sign-token } { \exp_not:n {#1} } }
+ \group_end:
}
-\cs_new_protected:Npn
- \__siunitx_number_in_complex_to_uncert_dec_loop:N #1
+\cs_new_protected:Npn \__siunitx_compound_print:N #1
{
- \str_if_eq:nnTF {#1} { 0 }
+ \bool_lazy_and:nnTF
+ { \l__siunitx_compound_exp_bracket_bool }
+ { ! \tl_if_empty_p:N \l__siunitx_compound_exp_tl }
{
- \tl_set:Nx \l__siunitx_tmpa_tl
- { \tl_tail:N \l__siunitx_tmpa_tl }
- \tl_if_empty:NF \l__siunitx_tmpb_tl
+ \__siunitx_compound_print:xxN
+ { \exp_not:V \l__siunitx_compound_bracket_open_tl }
{
- \tl_set:Nx \l__siunitx_tmpb_tl
- { \tl_tail:N \l__siunitx_tmpb_tl }
+ \exp_not:V \l__siunitx_compound_bracket_close_tl
+ \exp_not:V \l__siunitx_compound_exp_tl
}
+ #1
}
- { \tl_map_break: }
+ { \__siunitx_compound_print:xxN { } { \exp_not:V \l__siunitx_compound_exp_tl } #1 }
}
-\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_pad:
+\cs_new_protected:Npn \__siunitx_compound_print:nnN #1#2#3
{
- \int_set:Nn \l__siunitx_number_uncert_length_int
- { \tl_count:N \l__siunitx_tmpa_tl }
- \int_set:Nn \l__siunitx_number_mantissa_length_int
- { \tl_count:N \l__siunitx_tmpb_tl }
- \int_compare:nNnTF
- { \l__siunitx_number_mantissa_length_int }
- > { \l__siunitx_number_uncert_length_int }
+ \exp_args:Nx \__siunitx_compound_print:nnnN
+ { \seq_count:N \l__siunitx_compound_tmp_seq } {#1} {#2} #3
+ }
+\cs_generate_variant:Nn \__siunitx_compound_print:nnN { xx }
+\cs_new_protected:Npn \__siunitx_compound_print:nnnN #1#2#3#4
+ {
+ \int_case:nnF {#1}
{
- \tl_set:Nx \l__siunitx_tmpa_tl
+ { 0 } { }
+ { 1 }
+ {
+ #4
+ { \seq_item:Nn \l__siunitx_compound_tmp_seq { 1 } }
+ }
+ { 2 }
{
- \exp_not:V \l__siunitx_tmpa_tl
- \prg_replicate:nn
+ #4
+ {
+ \exp_not:n {#2}
+ \seq_item:Nn \l__siunitx_compound_tmp_seq { 1 }
+ }
+ \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_pair_tl
+ #4
{
- \l__siunitx_number_mantissa_length_int
- - \l__siunitx_number_uncert_length_int
+ \seq_item:Nn \l__siunitx_compound_tmp_seq { 2 }
+ \exp_not:n {#3}
}
- { 0 }
}
}
{
- \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
- \l__siunitx_tmpb_tl
- { \tl_clear:N \l__siunitx_tmpb_tl }
- \tl_set:Nx \l__siunitx_tmpb_tl
+ \int_set:Nn \l__siunitx_compound_count_int {#1}
+ \tl_set:Nn \l__siunitx_compound_start_tl {#2}
+ \tl_set:Nn \l__siunitx_compound_end_tl {#3}
+ \cs_set_eq:NN \__siunitx_compound_print_aux:n #4
+ \seq_map_indexed_function:NN
+ \l__siunitx_compound_tmp_seq
+ \__siunitx_compound_print_aux:nn
+ }
+ }
+\cs_new_protected:Npn \__siunitx_compound_print_aux:n #1 { }
+\cs_new_protected:Npn \__siunitx_compound_print_aux:nn #1#2
+ {
+ \int_case:nnF {#1}
+ {
+ { 1 }
{
- \exp_not:V \l__siunitx_tmpb_tl
- \prg_replicate:nn
+ \__siunitx_compound_print_aux:n
{
- \l__siunitx_number_uncert_length_int
- - \l__siunitx_number_mantissa_length_int
+ \exp_not:V \l__siunitx_compound_start_tl
+ \exp_not:n {#2}
}
- { 0 }
+ \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_tl
+ }
+ { \l__siunitx_compound_count_int - 1 }
+ {
+ \__siunitx_compound_print_aux:n { \exp_not:n {#2} }
+ \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_final_tl
}
- \tl_if_empty:NF \l__siunitx_tmpb_tl
+ { \l__siunitx_compound_count_int }
{
- \prop_put:NnV \l__siunitx_number_in_prop { mantissa-decimal }
- \l__siunitx_tmpb_tl
- \prop_if_in:NnF \l__siunitx_number_in_prop
- { mantissa-decimal-marker }
+ \__siunitx_compound_print_aux:n
{
- \prop_put:Nnn \l__siunitx_number_in_prop
- { mantissa-decimal-marker } { . }
+ \exp_not:n {#2}
+ \exp_not:V \l__siunitx_compound_end_tl
}
}
}
- \tl_put_right:NV \l__siunitx_number_uncert_tl \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_in_prop { mantissa-uncertainty }
- \l__siunitx_number_uncert_tl
- }
-\int_new:N \l__siunitx_round_int
-\tl_new:N \l__siunitx_round_tl
-\bool_new:N \l__siunitx_round_bool
-\tl_new:N \l__siunitx_round_decimal_in_tl
-\tl_new:N \l__siunitx_round_decimal_out_tl
-\tl_new:N \l__siunitx_round_discard_tl
-\tl_new:N \l__siunitx_round_even_bool
-\tl_new:N \l__siunitx_round_integer_in_tl
-\tl_new:N \l__siunitx_round_integer_out_tl
-\bool_new:N \l__siunitx_round_half_up_bool
-\int_new:N \l__siunitx_process_decimal_int
-\int_new:N \l__siunitx_process_uncertainty_int
-\tl_new:N \l__siunitx_uncertainty_decimal_tl
-\tl_new:N \l__siunitx_uncertainty_integer_tl
-\bool_new:N \l__siunitx_process_fixed_bool
-\bool_new:N \l__siunitx_process_engineering_bool
-\bool_new:N \l__siunitx_process_scientific_bool
-\bool_new:N \l__siunitx_process_drop_exponent_bool
+ {
+ \__siunitx_compound_print_aux:n { \exp_not:n {#2} }
+ \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_tl
+ }
+ }
+\cs_new_protected:Npn \__siunitx_compound_print_quantity:n #1
+ { \siunitx_quantity_print:nV {#1} \l__siunitx_compound_unit_tl }
+\cs_new_protected:Npn \__siunitx_compound_print_separator:n #1
+ {
+ \bool_if:NTF \l__siunitx_compound_separator_text_bool
+ { #1 }
+ { \siunitx_print_number:n {#1} }
+ }
+\cs_generate_variant:Nn \__siunitx_compound_print_separator:n { V }
+\tl_new:N \l__siunitx_list_exp_tl
+\tl_new:N \l__siunitx_list_units_tl
\keys_define:nn { siunitx }
{
- add-decimal-zero .bool_set:N = \l__siunitx_process_decimal_zero_bool,
- add-integer-zero .bool_set:N = \l__siunitx_process_integer_zero_bool,
- explicit-sign .tl_set:N = \l__siunitx_process_sign_tl,
- fixed-exponent .int_set:N = \l__siunitx_process_fixed_int,
- minimum-integer-digits .int_set:N =
- \l__siunitx_process_integer_min_int,
- retain-explicit-plus .bool_set:N = \l__siunitx_process_plus_bool,
- omit-uncertainty .bool_set:N = \l__siunitx_omit_uncert_bool,
- retain-unity-mantissa .bool_set:N =
- \l__siunitx_process_unity_mantissa_bool,
- retain-zero-exponent .bool_set:N =
- \l__siunitx_process_zero_exponent_bool,
- round-half .choice:,
- round-half / even .code:n =
- { \bool_set_false:N \l__siunitx_round_half_up_bool },
- round-half / up .code:n =
- { \bool_set_true:N \l__siunitx_round_half_up_bool },
- round-integer-to-decimal .bool_set:N =
- \l__siunitx_process_int_to_dec_bool,
- round-minimum .tl_set:N = \l__siunitx_process_round_min_tl,
- round-mode .choice: ,
- round-mode / figures .code:n =
- { \tl_set:Nn \l__siunitx_round_tl { figures } },
- round-mode / off .code:n = { \tl_clear:N \l__siunitx_round_tl },
- round-mode / places .code:n =
- { \tl_set:Nn \l__siunitx_round_tl { places } },
- round-precision .int_set:N = \l__siunitx_process_precision_int,
- scientific-notation .choice: ,
- scientific-notation
- / false .code:n =
+ list-exponents .choices:nn =
+ { combine , combine-bracket , individual }
+ { \tl_set_eq:NN \l__siunitx_list_exp_tl \l_keys_choice_tl } ,
+ list-final-separator .tl_set:N = \l_siunitx_list_separator_final_tl ,
+ list-pair-separator .tl_set:N = \l_siunitx_list_separator_pair_tl ,
+ list-separator .tl_set:N = \l_siunitx_list_separator_tl ,
+ list-units .choices:nn =
+ { bracket , repeat , single }
+ { \tl_set_eq:NN \l__siunitx_list_units_tl \l_keys_choice_tl }
+ }
+\cs_new_protected:Npn \siunitx_number_list:nn #1
+ {
+ \group_begin:
+ \__siunitx_list_aux:
+ \siunitx_compound_number:n {#1}
+ \group_end:
+ }
+\cs_new_protected:Npn \siunitx_quantity_list:nn #1#2
+ {
+ \group_begin:
+ \__siunitx_list_aux:
+ \siunitx_compound_quantity:nn {#1} {#2}
+ \group_end:
+ }
+\cs_new_protected:Npn \__siunitx_list_aux:
+ {
+ \keys_set:nx { siunitx }
{
- \bool_set_false:N \l__siunitx_process_fixed_bool
- \bool_set_false:N \l__siunitx_process_engineering_bool
- \bool_set_false:N \l__siunitx_process_scientific_bool
- },
- scientific-notation
- / engineering .code:n =
+ compound-exponents = \l__siunitx_list_exp_tl ,
+ compound-final-separator =
+ { \exp_not:V \l_siunitx_list_separator_final_tl } ,
+ compound-pair-separator =
+ { \exp_not:V \l_siunitx_list_separator_pair_tl } ,
+ compound-separator =
+ { \exp_not:V \l_siunitx_list_separator_tl } ,
+ compound-separator-mode = text ,
+ compound-units = \l__siunitx_list_units_tl
+ }
+ }
+\tl_new:N \l__siunitx_product_exp_tl
+\bool_new:N \l__siunitx_product_phrase_bool
+\tl_new:N \l__siunitx_product_units_tl
+\keys_define:nn { siunitx }
+ {
+ product-exponents .choices:nn =
+ { combine , combine-bracket , individual }
+ { \tl_set_eq:NN \l__siunitx_product_exp_tl \l_keys_choice_tl } ,
+ product-mode .choice: ,
+ product-mode / phrase .code:n =
+ { \bool_set_true:N \l__siunitx_product_phrase_bool } ,
+ product-mode / symbol .code:n =
+ { \bool_set_false:N \l__siunitx_product_phrase_bool } ,
+ product-phrase .tl_set:N = \l__siunitx_product_phrase_tl ,
+ product-symbol .tl_set:N = \l__siunitx_product_symbol_tl ,
+ product-units .choices:nn =
+ { bracket , bracket-power , power , repeat , single }
+ { \tl_set_eq:NN \l__siunitx_product_units_tl \l_keys_choice_tl }
+ }
+\cs_new_protected:Npn \siunitx_number_product:n #1
+ {
+ \group_begin:
+ \__siunitx_product_aux:
+ \siunitx_compound_number:n {#1}
+ \group_end:
+ }
+\cs_new_protected:Npn \siunitx_quantity_product:nn #1#2
+ {
+ \group_begin:
+ \__siunitx_product_aux:
+ \siunitx_compound_quantity:nn {#1} {#2}
+ \group_end:
+ }
+\cs_new_protected:Npn \__siunitx_product_aux:
+ {
+ \bool_if:NTF \l__siunitx_product_phrase_bool
+ { \__siunitx_product_aux:x { \exp_not:V \l__siunitx_product_phrase_tl } }
+ { \__siunitx_product_aux:x { { } \exp_not:V \l__siunitx_product_symbol_tl { } } }
+ }
+\cs_new_protected:Npn \__siunitx_product_aux:n #1
+ {
+ \keys_set:nx { siunitx }
{
- \bool_set_false:N \l__siunitx_process_fixed_bool
- \bool_set_true:N \l__siunitx_process_engineering_bool
- \bool_set_true:N \l__siunitx_process_scientific_bool
- },
- scientific-notation
- / fixed .code:n =
+ compound-exponents = \l__siunitx_product_exp_tl ,
+ compound-final-separator = { \exp_not:n {#1} } ,
+ compound-pair-separator = { \exp_not:n {#1} } ,
+ compound-separator = { \exp_not:n {#1} } ,
+ compound-separator-mode =
+ \bool_if:NTF \l__siunitx_product_phrase_bool { text } { number } ,
+ compound-units = \l__siunitx_product_units_tl
+ }
+ }
+\cs_generate_variant:Nn \__siunitx_product_aux:n { x }
+\tl_new:N \l__siunitx_range_exp_tl
+\tl_new:N \l__siunitx_range_units_tl
+\keys_define:nn { siunitx }
+ {
+ range-exponents .choices:nn =
+ { combine , combine-bracket , individual }
+ { \tl_set_eq:NN \l__siunitx_range_exp_tl \l_keys_choice_tl } ,
+ range-phrase .tl_set:N = \l_siunitx_range_phrase_tl ,
+ range-units .choices:nn =
+ { bracket , repeat , single }
+ { \tl_set_eq:NN \l__siunitx_range_units_tl \l_keys_choice_tl }
+ }
+\cs_new_protected:Npn \siunitx_number_range:nn #1#2
+ {
+ \group_begin:
+ \__siunitx_range_aux:
+ \siunitx_compound_number:n { {#1} {#2} }
+ \group_end:
+ }
+\cs_new_protected:Npn \siunitx_quantity_range:nnn #1#2#3
+ {
+ \group_begin:
+ \__siunitx_range_aux:
+ \siunitx_compound_quantity:nn { {#1} {#2} } {#3}
+ \group_end:
+ }
+\cs_new_protected:Npn \__siunitx_range_aux:
+ {
+ \keys_set:nx { siunitx }
{
- \bool_set_true:N \l__siunitx_process_fixed_bool
- \bool_set_false:N \l__siunitx_process_engineering_bool
- \bool_set_false:N \l__siunitx_process_scientific_bool
- },
- scientific-notation
- / true .code:n =
+ compound-exponents = \l__siunitx_range_exp_tl ,
+ compound-pair-separator = { \exp_not:V \l_siunitx_range_phrase_tl } ,
+ compound-separator-mode = text ,
+ compound-units = \l__siunitx_range_units_tl
+ }
+ }
+\keys_set:nn { siunitx }
+ {
+ compound-exponents = individual ,
+ compound-final-separator =
+ {
+ \ifmmode \ \else \space \fi
+ \text { and }
+ \ifmmode \ \else \space \fi
+ } ,
+ compound-pair-separator =
+ {
+ \ifmmode \ \else \space \fi
+ \text { and }
+ \ifmmode \ \else \space \fi
+ } ,
+ compound-separator =
+ { , \ifmmode \ \else \space \fi } ,
+ compound-separator-mode = text ,
+ compound-units = repeat ,
+ list-exponents = individual ,
+ list-final-separator =
+ {
+ \ifmmode \ \else \space \fi
+ \text { and }
+ \ifmmode \ \else \space \fi
+ } ,
+ list-pair-separator =
+ {
+ \ifmmode \ \else \space \fi
+ \text { and }
+ \ifmmode \ \else \space \fi
+ } ,
+ list-separator =
+ { , \ifmmode \ \else \space \fi } ,
+ list-units = repeat ,
+ product-exponents = individual ,
+ product-mode = symbol ,
+ product-phrase =
+ {
+ \ifmmode \ \else \space \fi
+ \text { by }
+ \ifmmode \ \else \space \fi
+ } ,
+ product-symbol = \times ,
+ product-units = repeat ,
+ range-exponents = individual ,
+ range-phrase =
+ {
+ \ifmmode \ \else \space \fi
+ \text { to }
+ \ifmmode \ \else \space \fi
+ } ,
+ range-units = repeat
+ }
+\keys_define:nn { siunitx }
+ {
+ locale .choice: ,
+ locale / DE .meta:n =
+ {
+ exponent-product = \cdot ,
+ inter-unit-product = \, ,
+ output-decimal-marker = { , }
+ } ,
+ locale / FR .meta:n =
+ {
+ exponent-product = \times ,
+ inter-unit-product = \, ,
+ output-decimal-marker = { , }
+ } ,
+ locale / UK .meta:n =
{
- \bool_set_false:N \l__siunitx_process_fixed_bool
- \bool_set_false:N \l__siunitx_process_engineering_bool
- \bool_set_true:N \l__siunitx_process_scientific_bool
+ exponent-product = \times ,
+ inter-unit-product = \, ,
+ output-decimal-marker = .
},
- zero-decimal-to-integer .bool_set:N =
- \l__siunitx_zero_decimal_to_integer_bool
+ locale / US .meta:n =
+ {
+ exponent-product = \times ,
+ inter-unit-product = \, ,
+ output-decimal-marker = .
+ } ,
+ locale / ZA .meta:n =
+ {
+ exponent-product = \times ,
+ inter-unit-product = \cdot ,
+ output-decimal-marker = { , }
+ }
}
-\keys_set:nn { siunitx }
+\file_if_exist:nT { translations.sty }
+ {
+ \RequirePackage { translations }
+ \DeclareTranslation { English } { to~(numerical~range) } { to }
+ \DeclareTranslation { French } { to~(numerical~range) } { á }
+ \DeclareTranslation { German } { to~(numerical~range) } { bis }
+ \DeclareTranslation { Spanish } { to~(numerical~range) } { a }
+ \keys_set:nn { siunitx }
+ {
+ list-final-separator =
+ {
+ \ifmmode \ \else \space \fi
+ \text { \GetTranslation { and } }
+ \ifmmode \ \else \space \fi
+ } ,
+ list-pair-separator =
+ {
+ \ifmmode \ \else \space \fi
+ \text { \GetTranslation { and } }
+ \ifmmode \ \else \space \fi
+ } ,
+ range-phrase =
+ {
+ \ifmmode \ \else \space \fi
+ \text { \GetTranslation { to~(numerical~range) } }
+ \ifmmode \ \else \space \fi
+ }
+ }
+ }
+\cs_generate_variant:Nn \tl_if_blank:nTF { f }
+\cs_generate_variant:Nn \tl_if_blank_p:n { f }
+\cs_generate_variant:Nn \tl_if_in:NnTF { NV }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
+\tl_new:N \l__siunitx_number_tmp_tl
+\tl_new:N \l__siunitx_number_outputted_tl
+\tl_new:N \l_siunitx_number_parse_bool
+\keys_define:nn { siunitx }
{
- add-decimal-zero = true,
- add-integer-zero = true,
- retain-unity-mantissa = true,
- round-half = up,
- round-minimum = 0,
- round-precision = 2
+ parse-numbers .bool_set:N = \l_siunitx_number_parse_bool
}
-\cs_new_protected:Npn \__siunitx_number_process:
+\cs_new_protected:Npn \siunitx_number_format:nN #1#2
{
- \__siunitx_number_process_sign:
- \__siunitx_number_process_zero_fill:
- \__siunitx_number_process_mantissa:
- \prop_if_in:NnF \l__siunitx_number_in_prop { symbolic }
+ \group_begin:
+ \bool_if:NTF \l_siunitx_number_parse_bool
+ {
+ \siunitx_number_parse:nN {#1} \l__siunitx_number_parsed_tl
+ \siunitx_number_process:NN \l__siunitx_number_parsed_tl \l__siunitx_number_parsed_tl
+ \tl_set:Nx \l__siunitx_number_outputted_tl
+ { \siunitx_number_output:N \l__siunitx_number_parsed_tl }
+ }
+ { \tl_set:Nn \l__siunitx_number_outputted_tl { \ensuremath {#1} } }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #2 \l__siunitx_number_outputted_tl
+ }
+\tl_new:N \l_siunitx_number_input_decimal_tl
+\keys_define:nn { siunitx }
+ {
+ evaluate-expression .bool_set:N =
+ \l__siunitx_number_expression_bool ,
+ expression .code:n =
+ \cs_set:Npn \__siunitx_number_expression:n ##1 {#1} ,
+ input-close-uncertainty .tl_set:N =
+ \l__siunitx_number_input_uncert_close_tl ,
+ input-comparators .tl_set:N =
+ \l_siunitx_number_input_comparator_tl ,
+ input-decimal-markers .tl_set:N =
+ \l_siunitx_number_input_decimal_tl ,
+ input-digits .tl_set:N =
+ \l__siunitx_number_input_digit_tl ,
+ input-exponent-markers .tl_set:N =
+ \l_siunitx_number_input_exponent_tl ,
+ input-ignore .tl_set:N =
+ \l__siunitx_number_input_ignore_tl ,
+ input-open-uncertainty .tl_set:N =
+ \l__siunitx_number_input_uncert_open_tl ,
+ input-signs .tl_set:N =
+ \l_siunitx_number_input_sign_tl ,
+ input-uncertainty-signs .code:n =
+ {
+ \tl_set:Nn \l__siunitx_number_input_uncert_sign_tl {#1}
+ \tl_map_inline:nn {#1}
+ {
+ \tl_if_in:NnF \l_siunitx_number_input_sign_tl {##1}
+ { \tl_put_right:Nn \l_siunitx_number_input_sign_tl {##1} }
+ }
+ } ,
+ parse-numbers .bool_set:N =
+ \l_siunitx_number_parse_bool ,
+ retain-explicit-plus .bool_set:N =
+ \l__siunitx_number_explicit_plus_bool ,
+ retain-zero-uncertainty .bool_set:N =
+ \l__siunitx_number_zero_uncert_bool
+ }
+\cs_new:Npn \__siunitx_number_expression:n #1 { }
+\tl_new:N \l__siunitx_number_input_uncert_sign_tl
+\tl_new:N \l__siunitx_number_arg_tl
+\tl_new:N \l__siunitx_number_comparator_tl
+\tl_new:N \l__siunitx_number_exponent_tl
+\tl_new:N \l__siunitx_number_flex_tl
+\tl_new:N \l__siunitx_number_parsed_tl
+\tl_new:N \l__siunitx_number_input_tl
+\tl_new:N \l__siunitx_number_partial_tl
+\bool_new:N \l__siunitx_number_validate_bool
+\cs_new_protected:Npn \siunitx_number_normalize_symbols:N #1
+ {
+ \__siunitx_number_normalize_minus:N #1
+ \exp_after:wN \__siunitx_number_normalize_aux:NnN \exp_after:wN #1
+ \c__siunitx_number_normalize_tl
+ { ? } \q_recursion_tail
+ \q_recursion_stop
+ }
+\cs_set_protected:Npn \__siunitx_number_normalize_aux:NnN #1#2#3
+ {
+ \quark_if_recursion_tail_stop:N #3
+ \tl_replace_all:Nnn #1 {#2} {#3}
+ \__siunitx_number_normalize_aux:NnN #1
+ }
+\tl_const:Nn \c__siunitx_number_normalize_tl
+ {
+ { -+ } \mp
+ { +- } \pm
+ { << } \ll
+ { <= } \le
+ { >> } \gg
+ { >= } \ge
+ }
+\group_begin:
+ \char_set_catcode_active:N \-
+ \cs_new_protected:Npx \__siunitx_number_normalize_minus:N #1
+ {
+ \tl_replace_all:Nnn #1
+ { \exp_not:N - } { \token_to_str:N - }
+ }
+\group_end:
+\cs_new_protected:Npn \siunitx_number_parse:nN #1#2
+ {
+ \bool_if:NTF \l_siunitx_number_parse_bool
+ { \__siunitx_number_parse:nN {#1} #2 }
+ { \tl_clear:N #2 }
+ }
+\cs_generate_variant:Nn \siunitx_number_parse:nN { V }
+\cs_new_protected:Npn \__siunitx_number_parse:nN #1#2
+ {
+ \group_begin:
+ \tl_clear:N \l__siunitx_number_parsed_tl
+ \protected@edef \l__siunitx_number_arg_tl
+ {
+ \bool_if:NTF \l__siunitx_number_expression_bool
+ { \fp_eval:n { \__siunitx_number_expression:n {#1} } }
+ {#1}
+ }
+ \tl_set_eq:NN \l__siunitx_number_input_tl \l__siunitx_number_arg_tl
+ \siunitx_number_normalize_symbols:N \l__siunitx_number_arg_tl
+ \tl_if_empty:NF \l__siunitx_number_arg_tl
+ { \__siunitx_number_parse_comparator: }
+ \__siunitx_number_parse_check:
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #2 \l__siunitx_number_parsed_tl
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_check:
+ {
+ \tl_if_empty:NF \l__siunitx_number_flex_tl
{
- \bool_if:NTF \l__siunitx_process_fixed_bool
- { \__siunitx_number_process_fixed: }
+ \bool_lazy_and:nnTF
{
- \bool_if:NT \l__siunitx_process_scientific_bool
- { \__siunitx_number_process_scientific: }
+ \tl_if_blank_p:f
+ { \exp_after:wN \use_iv:nnnn \l__siunitx_number_parsed_tl }
}
- \__siunitx_number_process_exponent:
- \__siunitx_number_process_uncertainty:
- \bool_if:NT \l__siunitx_exp_to_prefix_bool
{
- \tl_if_empty:NF \l__siunitx_unit_tl
- { \__siunitx_number_exp_to_prefix: }
+ \tl_if_blank_p:f
+ { \exp_after:wN \use_iv:nnnn \l__siunitx_number_flex_tl }
}
- \prop_if_in:NnTF \l__siunitx_number_in_prop { uncertainty }
{
- \bool_if:NT \l__siunitx_omit_uncert_bool
- {
- \prop_remove:Nn \l__siunitx_number_in_prop { uncertainty }
- \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-uncertainty }
- }
+ \tl_set:Nx \l__siunitx_number_tmp_tl
+ { \exp_after:wN \use_i:nnnn \l__siunitx_number_flex_tl }
+ \tl_if_in:NVTF \l__siunitx_number_input_uncert_sign_tl
+ \l__siunitx_number_tmp_tl
+ { \__siunitx_number_parse_combine_uncert: }
+ { \tl_clear:N \l__siunitx_number_parsed_tl }
}
- { \__siunitx_number_process_round: }
+ { \tl_clear:N \l__siunitx_number_parsed_tl }
}
- \__siunitx_number_process_zero_to_integer:
- \__siunitx_number_process_integer_digits:
- \bool_if:NT \l__siunitx_process_drop_exponent_bool
+ \tl_if_empty:NTF \l__siunitx_number_parsed_tl
{
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
+ \bool_if:NF \l__siunitx_number_validate_bool
+ {
+ \msg_error:nnx { siunitx } { invalid-number }
+ { \exp_not:V \l__siunitx_number_input_tl }
+ }
}
+ { \__siunitx_number_parse_finalise: }
}
-\cs_new_protected:Npn \__siunitx_number_process_exponent: {
- \bool_if:NF \l__siunitx_process_zero_exponent_bool
- {
- \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
+\cs_new_protected:Npn \__siunitx_number_parse_combine_uncert:
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \__siunitx_number_parse_combine_uncert_auxi:nnnnnnnn
+ \exp_after:wN \l__siunitx_number_parsed_tl \l__siunitx_number_flex_tl
+ }
+\cs_new_protected:Npn
+ \__siunitx_number_parse_combine_uncert_auxi:nnnnnnnn #1#2#3#4#5#6#7#8
+ {
+ \int_compare:nNnTF { \tl_count:n {#6} } > { \tl_count:n {#2} }
+ {
+ \tl_clear:N \l__siunitx_number_parsed_tl
+ \tl_clear:N \l__siunitx_number_flex_tl
+ }
+ {
+ \__siunitx_number_parse_combine_uncert_auxii:fnnnn
+ { \int_eval:n { \tl_count:n {#3} - \tl_count:n {#7} } }
+ {#2} {#3} {#6} {#7}
+ }
+ }
+\cs_new_protected:Npn
+ \__siunitx_number_parse_combine_uncert_auxii:nnnnn #1
+ {
+ \__siunitx_number_parse_combine_uncert_auxiii:fnnnnn
+ { \prg_replicate:nn { \int_abs:n {#1} } { 0 } }
+ {#1}
+ }
+\cs_generate_variant:Nn \__siunitx_number_parse_combine_uncert_auxii:nnnnn { f }
+\cs_new_protected:Npn
+ \__siunitx_number_parse_combine_uncert_auxiii:nnnnnn #1#2#3#4#5#6
+ {
+ \int_compare:nNnTF {#2} > 0
+ {
+ \__siunitx_number_parse_combine_uncert_auxiv:nnnn
+ {#3} {#4} {#5} { #6 #1 }
+ }
+ {
+ \__siunitx_number_parse_combine_uncert_auxiv:nnnn
+ {#3} { #4 #1 } {#5} {#6}
+ }
+ }
+\cs_generate_variant:Nn
+ \__siunitx_number_parse_combine_uncert_auxiii:nnnnnn { f }
+\cs_new_protected:Npn
+ \__siunitx_number_parse_combine_uncert_auxiv:nnnn #1#2#3#4
+ {
+ \tl_set:Nx \l__siunitx_number_parsed_tl
+ {
+ { \tl_head:V \l__siunitx_number_parsed_tl }
+ { \exp_not:n {#1} }
{
- \bool_set_false:N \l__siunitx_tmp_bool
- \__siunitx_number_process_exponent_aux:n { integer }
- \bool_if:NF \l__siunitx_tmp_bool
- { \__siunitx_number_process_exponent_aux:n { decimal } }
- \bool_if:NF \l__siunitx_tmp_bool
- {
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
- \prop_remove:Nn \l__siunitx_number_in_prop
- { exponent-integer }
- \prop_remove:Nn \l__siunitx_number_in_prop
- { exponent-decimal }
- \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
- {
- \prop_put:Nnn \l__siunitx_number_in_prop { mantissa } { true }
- \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-integer } { 1 }
- }
- }
+ \bool_lazy_and:nnTF
+ { \tl_if_blank_p:n {#2} }
+ { ! \tl_if_blank_p:n {#4} }
+ { 0 }
+ { \exp_not:n {#2} }
}
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_exponent_aux:n #1 {
- \prop_get:NnNT \l__siunitx_number_in_prop { exponent- #1 }
- \l__siunitx_tmpa_tl
- {
- \int_compare:nNnF { \l__siunitx_tmpa_tl } = { 0 }
- { \bool_set_true:N \l__siunitx_tmp_bool }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_figures:n #1
+ {
+ \__siunitx_number_parse_combine_uncert_auxv:w #3#4
+ \q_recursion_tail \q_recursion_stop
+ }
+ }
+ }
+\cs_new:Npn \__siunitx_number_parse_combine_uncert_auxv:w #1
{
- \int_compare:nNnTF \l__siunitx_process_precision_int > 0
+ \quark_if_recursion_tail_stop_do:Nn #1
{
- \prop_if_in:NnT \l__siunitx_number_in_prop {#1}
- { \__siunitx_number_process_figures_aux:n {#1} }
+ \bool_if:NT \l__siunitx_number_zero_uncert_bool
+ { { S } { 0 } }
}
+ \str_if_eq:nnTF {#1} { 0 }
+ { \__siunitx_number_parse_combine_uncert_auxv:w }
+ { \__siunitx_number_parse_combine_uncert_auxvi:w #1 }
+ }
+\cs_new:Npn \__siunitx_number_parse_combine_uncert_auxvi:w
+ #1 \q_recursion_tail \q_recursion_stop
+ { { S } { \exp_not:n {#1} } }
+\cs_new_protected:Npn \__siunitx_number_parse_comparator:
+ {
+ \exp_after:wN \__siunitx_number_parse_comparator_aux:Nw
+ \l__siunitx_number_arg_tl \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_comparator_aux:Nw #1#2 \q_stop
+ {
+ \tl_if_in:NnTF \l_siunitx_number_input_comparator_tl {#1}
{
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -sign }
- \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
- \bool_if:NF \l__siunitx_process_int_to_dec_bool
- { \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker } }
+ \tl_set:Nn \l__siunitx_number_comparator_tl {#1}
+ \tl_set:Nn \l__siunitx_number_arg_tl {#2}
}
+ { \tl_clear:N \l__siunitx_number_comparator_tl }
+ \tl_if_empty:NF \l__siunitx_number_arg_tl
+ { \__siunitx_number_parse_sign: }
}
-\cs_new_protected:Npn \__siunitx_number_process_figures_aux:n #1
+\cs_new_protected:Npn \__siunitx_number_parse_exponent:
{
- \__siunitx_number_process_figures_init:n {#1}
- \__siunitx_number_process_figures_count:n { integer }
- \__siunitx_number_process_figures_count:n { decimal }
- \bool_if:NTF \l__siunitx_round_bool
+ \tl_if_empty:NTF \l_siunitx_number_input_exponent_tl
{
- \bool_set_false:N \l__siunitx_round_bool
- \int_compare:nNnTF
- \l__siunitx_round_int > \l__siunitx_process_precision_int
+ \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 }
+ \tl_if_empty:NF \l__siunitx_number_parsed_tl
+ { \__siunitx_number_parse_loop: }
+ }
+ {
+ \tl_set:Nx \l__siunitx_number_tmp_tl
+ { \tl_head:V \l_siunitx_number_input_exponent_tl }
+ \tl_map_inline:Nn \l_siunitx_number_input_exponent_tl
+ {
+ \tl_replace_all:NnV \l__siunitx_number_arg_tl
+ {##1} \l__siunitx_number_tmp_tl
+ }
+ \use:x
{
- \__siunitx_number_process_figures_round:
- \__siunitx_number_process_round_tidy:n {#1}
+ \cs_set_protected:Npn
+ \exp_not:N \__siunitx_number_parse_exponent_auxi:w
+ ####1 \exp_not:V \l__siunitx_number_tmp_tl
+ ####2 \exp_not:V \l__siunitx_number_tmp_tl
+ ####3 \exp_not:N \q_stop
+ }
+ { \__siunitx_number_parse_exponent_auxii:nn {##1} {##2} }
+ \use:x
+ {
+ \__siunitx_number_parse_exponent_auxi:w
+ \exp_not:V \l__siunitx_number_arg_tl
+ \exp_not:V \l__siunitx_number_tmp_tl \exp_not:N \q_nil
+ \exp_not:V \l__siunitx_number_tmp_tl \exp_not:N \q_stop
}
- { \__siunitx_number_process_figures_pad:n {#1} }
}
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_exponent_auxi:w { }
+\cs_new_protected:Npn \__siunitx_number_parse_exponent_auxii:nn #1#2
+ {
+ \quark_if_nil:nTF {#2}
+ { \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 } }
{
- \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
+ \tl_set:Nn \l__siunitx_number_arg_tl {#1}
+ \tl_if_blank:nTF {#2}
+ { \tl_clear:N \l__siunitx_number_parsed_tl }
+ { \__siunitx_number_parse_exponent_auxiii:Nw #2 \q_stop }
}
+ \tl_if_empty:NF \l__siunitx_number_parsed_tl
+ { \__siunitx_number_parse_loop: }
}
-\cs_new_protected:Npn \__siunitx_number_process_figures_init:n #1
+\cs_new_protected:Npn \__siunitx_number_parse_exponent_auxiii:Nw #1#2 \q_stop
{
- \int_zero:N \l__siunitx_round_int
- \bool_set_false:N \l__siunitx_round_bool
- \bool_set_false:N \l__siunitx_round_even_bool
- \prop_get:NnNF \l__siunitx_number_in_prop { #1 -decimal }
- \l__siunitx_round_decimal_in_tl
- { \tl_clear:N \l__siunitx_round_decimal_in_tl }
- \prop_get:NnNF \l__siunitx_number_in_prop { #1 -integer }
- \l__siunitx_round_integer_in_tl
- { \tl_clear:N \l__siunitx_round_integer_in_tl }
- \tl_clear:N \l__siunitx_round_decimal_out_tl
- \tl_clear:N \l__siunitx_round_integer_out_tl
- \tl_clear:N \l__siunitx_round_discard_tl
+ \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#1}
+ { \__siunitx_number_parse_exponent_auxiv:nn {#1} {#2} }
+ { \__siunitx_number_parse_exponent_auxiv:nn { } {#1#2} }
+ \tl_if_empty:NT \l__siunitx_number_exponent_tl
+ { \tl_clear:N \l__siunitx_number_parsed_tl }
}
-\cs_new_protected:Npn \__siunitx_number_process_figures_count:n #1
+\cs_new_protected:Npn \__siunitx_number_parse_exponent_auxiv:nn #1#2
{
- \tl_if_empty:cF { l__siunitx_round_ #1 _in_tl }
+ \bool_lazy_or:nnTF
+ { \l__siunitx_number_explicit_plus_bool }
+ { ! \str_if_eq_p:nn {#1} { + } }
+ { \tl_set:Nn \l__siunitx_number_exponent_tl { {#1} } }
+ { \tl_set:Nn \l__siunitx_number_exponent_tl { { } } }
+ \tl_if_blank:nTF {#2}
+ { \tl_clear:N \l__siunitx_number_parsed_tl }
{
- \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -uncertainty }
- { \__siunitx_number_process_figures_count_aux:n {#1} }
+ \__siunitx_number_parse_exponent_zero_test:N #2
+ \q_recursion_tail \q_recursion_stop
}
}
-\cs_new_protected:Npn \__siunitx_number_process_figures_count_aux:n #1
+\cs_new_protected:Npn \__siunitx_number_parse_exponent_zero_test:N #1
+ {
+ \quark_if_recursion_tail_stop_do:Nn #1
+ { \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 } }
+ \str_if_eq:nnTF {#1} { 0 }
+ { \__siunitx_number_parse_exponent_zero_test:N }
+ { \__siunitx_number_parse_exponent_check:N #1 }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_exponent_check:N #1
{
- \int_set:Nn \l__siunitx_tmp_int
- { \tl_head:v { l__siunitx_round_ #1 _in_tl } }
- \tl_set:cx { l__siunitx_round_ #1 _in_tl }
- { \tl_tail:v { l__siunitx_round_ #1 _in_tl } }
- \tl_put_left:cV { l__siunitx_round_ #1 _out_tl } \l__siunitx_tmp_int
- \bool_if:NF \l__siunitx_round_bool
+ \quark_if_recursion_tail_stop:N #1
+ \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#1}
{
- \int_compare:nNnF \l__siunitx_tmp_int = 0
- { \bool_set_true:N \l__siunitx_round_bool }
+ \tl_put_right:Nn \l__siunitx_number_exponent_tl {#1}
+ \__siunitx_number_parse_exponent_check:N
}
- \bool_if:NT \l__siunitx_round_bool
- { \int_incr:N \l__siunitx_round_int }
- \tl_if_empty:cTF { l__siunitx_round_ #1 _in_tl }
+ { \__siunitx_number_parse_exponent_cleanup:wN }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_exponent_cleanup:wN
+ #1 \q_recursion_stop
+ { \tl_clear:N \l__siunitx_number_parsed_tl }
+\cs_new_protected:Npn \__siunitx_number_parse_finalise:
+ {
+ \tl_if_empty:NF \l__siunitx_number_parsed_tl
{
- \tl_set_eq:cc { l__siunitx_round_ #1 _in_tl }
- { l__siunitx_round_ #1 _out_tl }
- \tl_clear:c { l__siunitx_round_ #1 _out_tl }
+ \tl_set:Nx \l__siunitx_number_parsed_tl
+ {
+ { \exp_not:V \l__siunitx_number_comparator_tl }
+ \exp_not:V \l__siunitx_number_parsed_tl
+ \exp_after:wN \__siunitx_number_parse_finalise:nw
+ \l__siunitx_number_exponent_tl \q_stop
+ }
}
- { \__siunitx_number_process_figures_count_aux:n {#1} }
}
-\cs_new_protected:Npn \__siunitx_number_process_figures_round:
+\cs_new:Npn \__siunitx_number_parse_finalise:nw #1#2 \q_stop
{
- \int_set:Nn \l__siunitx_round_int
- { \l__siunitx_round_int - \l__siunitx_process_precision_int }
- \tl_if_empty:NF \l__siunitx_round_decimal_in_tl
- { \__siunitx_number_process_figures_round_loop: }
- \tl_if_empty:NF \l__siunitx_round_integer_in_tl
- { \__siunitx_number_process_figures_integer: }
- \bool_if:NT \l__siunitx_round_bool
- { \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 1 } }
+ { \exp_not:n {#1} }
+ { \exp_not:n {#2} }
}
-\cs_new_protected:Npn \__siunitx_number_process_figures_round_loop:
+\cs_new_protected:Npn \__siunitx_number_parse_loop:
{
- \__siunitx_number_process_round_decimal:
- \tl_if_empty:NF \l__siunitx_round_decimal_in_tl
- { \__siunitx_number_process_figures_round_loop: }
+ \tl_clear:N \l__siunitx_number_partial_tl
+ \exp_after:wN \__siunitx_number_parse_loop_first:NNN
+ \exp_after:wN \l__siunitx_number_parsed_tl \exp_after:wN \c_true_bool
+ \l__siunitx_number_arg_tl
+ \q_recursion_tail \q_recursion_stop
}
-\cs_new_protected:Npn \__siunitx_number_process_figures_integer:
+\cs_new_protected:Npn \__siunitx_number_parse_loop_first:NNN #1#2#3
{
- \int_compare:nNnT \l__siunitx_round_int > 0
- { \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 0 } }
- \int_compare:nNnF \l__siunitx_round_int > 1
+ \quark_if_recursion_tail_stop_do:Nn #3
{
- \int_set:Nn \l__siunitx_tmp_int
- { \tl_head:N \l__siunitx_round_integer_in_tl }
- \__siunitx_number_process_round_up:
- \int_compare:nNnTF \l__siunitx_round_int = 1
+ \bool_if:NTF #2
+ { \tl_put_right:Nn #1 { { 1 } { } { } } }
+ { \__siunitx_number_parse_loop_break:wN \q_recursion_stop }
+ }
+ \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#3}
+ {
+ \__siunitx_number_parse_loop_main:NNNNN
+ #1 \c_true_bool \c_false_bool #2 #3
+ }
+ {
+ \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#3}
+ {
+ \tl_put_right:Nn #1 { { 0 } }
+ \__siunitx_number_parse_loop_after_decimal:NNN #1 #2
+ }
+ { \__siunitx_number_parse_loop_break:wN }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_main:NNNNN #1#2#3#4#5
+ {
+ \quark_if_recursion_tail_stop_do:Nn #5
+ { \__siunitx_number_parse_loop_main_end:NN #1#2 }
+ \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#5}
+ { \__siunitx_number_parse_loop_main_digit:NNNNN #1#2#3#4#5 }
+ {
+ \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#5}
{
- \int_compare:nNnT \l__siunitx_tmp_int > 4
- { \bool_set_true:N \l__siunitx_round_bool }
+ \bool_if:NTF #2
+ { \__siunitx_number_parse_loop_main_decimal:NN #1 #4 }
+ { \__siunitx_number_parse_loop_break:wN }
}
{
- \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
+ \tl_if_in:NnTF \l__siunitx_number_input_uncert_open_tl {#5}
+ { \__siunitx_number_parse_loop_main_uncert:NNN #1#2 #4 }
{
- \bool_set_true:N \l__siunitx_round_bool
- \int_zero:N \l__siunitx_tmp_int
+ \bool_if:NTF #4
+ {
+ \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#5}
+ {
+ \__siunitx_number_parse_loop_main_sign:NNN
+ #1#2 #5
+ }
+ { \__siunitx_number_parse_loop_break:wN }
+ }
+ { \__siunitx_number_parse_loop_break:wN }
}
- \tl_put_left:NV \l__siunitx_round_integer_out_tl
- \l__siunitx_tmp_int
- }
- }
- \int_decr:N \l__siunitx_round_int
- \tl_set:Nx \l__siunitx_round_integer_in_tl
- { \tl_tail:N \l__siunitx_round_integer_in_tl }
- \tl_if_empty:NF \l__siunitx_round_integer_in_tl
- { \__siunitx_number_process_figures_integer: }
- }
-\cs_new_protected:Npn \__siunitx_number_process_figures_pad:n #1 {
- \prop_get:NnN \l__siunitx_number_in_prop { #1 -integer }
- \l__siunitx_round_integer_in_tl
- \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal }
- \l__siunitx_round_decimal_in_tl
- \int_set:Nn \l__siunitx_round_int
- { \l__siunitx_process_precision_int - \l__siunitx_round_int }
- \__siunitx_number_process_pad:n {#1}
-}
-\cs_new_protected:Npn \__siunitx_number_process_fixed: {
- \prop_if_in:NnF \l__siunitx_number_in_prop { complex }
- {
- \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-integer }
- \l__siunitx_tmpa_tl
- { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
- \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
- \l__siunitx_tmpb_tl
- { \tl_clear:N \l__siunitx_tmpb_tl }
- \tl_set:Nx \l__siunitx_tmpa_tl
- { { \l__siunitx_tmpa_tl } { \l__siunitx_tmpb_tl } }
- \prop_get:NnNF \l__siunitx_number_in_prop { exponent-integer }
- \l__siunitx_tmpb_tl
- { \tl_set:Nn \l__siunitx_tmpb_tl { 0 } }
- \group_begin:
- \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
- \l__siunitx_tmpa_tl
+ }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_main_end:NN #1#2
+ {
+ \bool_lazy_and:nnT
+ {#2} { \tl_if_empty_p:N \l__siunitx_number_partial_tl }
+ { \tl_set:Nn \l__siunitx_number_partial_tl { 0 } }
+ \tl_put_right:Nx #1
+ {
+ { \exp_not:V \l__siunitx_number_partial_tl }
+ \bool_if:NT #2 { { } }
+ { }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_main_digit:NNNNN #1#2#3#4#5
+ {
+ \bool_lazy_or:nnTF
+ {#3} { ! \str_if_eq_p:nn {#5} { 0 } }
+ {
+ \tl_put_right:Nn \l__siunitx_number_partial_tl {#5}
+ \__siunitx_number_parse_loop_main:NNNNN #1 #2 \c_true_bool #4
+ }
+ { \__siunitx_number_parse_loop_main:NNNNN #1 #2 \c_false_bool #4 }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_main_decimal:NN #1#2
+ {
+ \__siunitx_number_parse_loop_main_store:NNN #1 \c_false_bool \c_false_bool
+ \__siunitx_number_parse_loop_after_decimal:NNN #1 #2
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_main_uncert:NNN #1#2#3
+ {
+ \__siunitx_number_parse_loop_main_store:NNN #1 #2 \c_false_bool
+ \__siunitx_number_parse_uncert:NN #1
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_main_sign:NNN #1#2#3
+ {
+ \__siunitx_number_parse_loop_main_store:NNN #1 #2 \c_true_bool
+ \tl_set:Nn \l__siunitx_number_flex_tl { {#3} }
+ \__siunitx_number_parse_loop_first:NNN
+ \l__siunitx_number_flex_tl \c_false_bool
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_main_store:NNN #1#2#3
+ {
+ \tl_if_empty:NT \l__siunitx_number_partial_tl
+ { \tl_set:Nn \l__siunitx_number_partial_tl { 0 } }
+ \tl_put_right:Nx #1
+ {
+ { \exp_not:V \l__siunitx_number_partial_tl }
+ \bool_if:NT #2 { { } }
+ \bool_if:NT #3 { { } }
+ }
+ \tl_clear:N \l__siunitx_number_partial_tl
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_after_decimal:NNN #1#2#3
+ {
+ \tl_if_blank:fTF { \exp_after:wN \use_none:n #1 }
+ {
+ \quark_if_recursion_tail_stop_do:Nn #3
+ { \__siunitx_number_parse_loop_break:wN \q_recursion_stop }
+ \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#1}
{
- \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
+ \tl_put_right:Nn \l__siunitx_number_partial_tl {#3}
+ \__siunitx_number_parse_loop_main:NNNNN
+ #1 \c_false_bool \c_true_bool #2
}
- \exp_args:NNNV \group_end:
- \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_tmpb_tl
- \tl_set:Nx \l__siunitx_tmpa_tl
- { \l__siunitx_tmpa_tl { \l__siunitx_tmpb_tl } }
- \exp_after:wN \__siunitx_number_process_fixed_aux_i:nnn
- \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_fixed_aux_i:nnn #1#2#3
+ { \__siunitx_number_parse_loop_break:wN }
+ }
+ {
+ \__siunitx_number_parse_loop_main:NNNNN
+ #1 \c_false_bool \c_true_bool #2 #3
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_loop_break:wN
+ #1 \q_recursion_stop
+ {
+ \tl_clear:N \l__siunitx_number_flex_tl
+ \tl_clear:N \l__siunitx_number_parsed_tl
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_sign:
+ {
+ \exp_after:wN \__siunitx_number_parse_sign_aux:Nw
+ \l__siunitx_number_arg_tl \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_sign_aux:Nw #1#2 \q_stop
{
- \prop_put:Nnn \l__siunitx_number_in_prop { exponent } { true }
- \int_compare:nNnTF \l__siunitx_process_fixed_int > 0
+ \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#1}
{
- \prop_put:NnV \l__siunitx_number_in_prop { exponent-integer }
- \l__siunitx_process_fixed_int
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
+ \tl_set:Nn \l__siunitx_number_arg_tl {#2}
+ \bool_lazy_and:nnTF
+ { \token_if_eq_charcode_p:NN #1 + }
+ { ! \l__siunitx_number_explicit_plus_bool }
+ { \tl_set:Nn \l__siunitx_number_parsed_tl { { } } }
+ { \tl_set:Nn \l__siunitx_number_parsed_tl { {#1} } }
}
+ { \tl_set:Nn \l__siunitx_number_parsed_tl { { } } }
+ \tl_if_empty:NTF \l__siunitx_number_arg_tl
+ { \tl_clear:N \l__siunitx_number_parsed_tl }
+ { \__siunitx_number_parse_exponent: }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_uncert:NN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2
+ { \__siunitx_number_parse_loop_break:wN \q_recursion_stop }
+ \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2}
+ { \__siunitx_number_parse_loop_break:wN }
{
- \prop_put:Nnx \l__siunitx_number_in_prop { exponent-integer }
- { \int_eval:n { - \l__siunitx_process_fixed_int } }
- \prop_put:Nnn \l__siunitx_number_in_prop { exponent-sign } { - }
+ \__siunitx_number_parse_uncert:NNNN
+ #1 \c_false_bool \__siunitx_number_parse_uncert_auxi:NN #2
}
- \__siunitx_number_process_fixed_aux_ii:nnn {#1} {#2} {#3}
}
-\cs_new_protected:Npn \__siunitx_number_process_fixed_aux_ii:nnn #1#2#3
+\cs_new_protected:Npn \__siunitx_number_parse_uncert:NNNN #1#2#3#4
{
- \bool_set_true:N \l__siunitx_tmp_bool
- \tl_map_inline:nn {#1#2}
+ \quark_if_recursion_tail_stop_do:Nn #4
+ { \__siunitx_number_parse_loop_break:wN \q_recursion_stop }
+ \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#4}
{
- \str_if_eq:nnF {##1} { 0 }
+ \bool_lazy_or:nnTF
+ {#2} { ! \str_if_eq_p:nn {#4} { 0 } }
{
- \bool_set_false:N \l__siunitx_tmp_bool
- \tl_map_break:
+ \tl_put_right:Nn \l__siunitx_number_partial_tl {#4}
+ \__siunitx_number_parse_uncert:NNNN #1 \c_true_bool #3
}
- }
- \bool_if:NF \l__siunitx_tmp_bool
- { \__siunitx_number_process_fixed_aux_iii:nnn {#1} {#2} {#3} }
+ { \__siunitx_number_parse_uncert:NNNN #1 \c_false_bool #3 }
+ }
+ { #3 #1#4 }
}
-\cs_new_protected:Npn
- \__siunitx_number_process_fixed_aux_iii:nnn #1#2#3 {
- \int_compare:nNnTF {#3} > { \l__siunitx_process_fixed_int }
- { \__siunitx_number_process_fixed_large:nnn {#1} {#2} {#3} }
- {
- \int_compare:nNnTF {#3} < { \l__siunitx_process_fixed_int }
- { \__siunitx_number_process_fixed_small:nnn {#1} {#2} {#3} }
- {
- \prop_put:Nnn \l__siunitx_number_in_prop
- { mantissa-integer } {#1}
- \tl_if_empty:nTF {#2}
- {
- \prop_remove:Nn \l__siunitx_number_in_prop
- { mantissa-decimal }
- \prop_remove:Nn \l__siunitx_number_in_prop
- { mantissa-decimal-marker }
- }
+\cs_new_protected:Npn \__siunitx_number_parse_uncert_auxi:NN #1#2
+ {
+ \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2}
+ {
+ \__siunitx_number_parse_uncert_auxiii:N #1
+ \__siunitx_number_parse_uncert_after:N
+ }
+ {
+ \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#2}
+ { \__siunitx_number_parse_uncert_marker:N #1 }
+ { \__siunitx_number_parse_loop_break:wN }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_uncert_auxii:NN #1#2
+ {
+ \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2}
+ {
+ \__siunitx_number_parse_uncert_auxiii:N #1
+ \__siunitx_number_parse_uncert_after:N
+ }
+ { \__siunitx_number_parse_loop_break:wN }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_uncert_auxiii:N #1
+ {
+ \tl_if_empty:NTF \l__siunitx_number_partial_tl
+ {
+ \tl_put_right:Nx #1
+ {
{
- \prop_put:Nnn \l__siunitx_number_in_prop
- { mantissa-decimal } {#2}
- \prop_if_in:NnF \l__siunitx_number_in_prop
- { mantissa-decimal-marker }
- {
- \prop_put:Nnn \l__siunitx_number_in_prop
- { mantissa-decimal-marker } { . }
- }
+ \bool_if:NT \l__siunitx_number_zero_uncert_bool
+ { { S } { 0 } }
}
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_fixed_large:nnn #1
+ }
+ }
+ {
+ \tl_set:Nx \l__siunitx_number_partial_tl
+ { { S } { \exp_not:V \l__siunitx_number_partial_tl } }
+ \__siunitx_number_parse_loop_main_store:NNN #1
+ \c_false_bool \c_false_bool
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:N #1
+ { \exp_after:wN \__siunitx_number_parse_uncert_marker:nnnN #1 #1 }
+\cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:nnnN #1#2#3#4
{
- \__siunitx_number_if_zero:nTF {#1}
- { \__siunitx_number_process_fixed_large_aux:nnn { } }
- { \__siunitx_number_process_fixed_large_aux:nnn {#1} }
+ \int_compare:nNnTF
+ { \tl_count:N \l__siunitx_number_partial_tl } > { \tl_count:n {#2} }
+ { \__siunitx_number_parse_loop_break:wN }
+ { \__siunitx_number_parse_uncert_marker:nNw {#3} #4 }
}
-\cs_new_protected:Npn \__siunitx_number_process_fixed_large_aux:nnn #1#2#3
+\cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:nNw
+ #1#2#3 \q_recursion_tail \q_recursion_stop
{
- \cs_set_protected:Npn
- \__siunitx_number_process_fixed_large_aux:w ##1##2 \q_stop
+ \int_compare:nNnTF
+ { \tl_count:n {#3} - 1 } = { \tl_count:n {#1} }
{
- \tl_if_empty:nTF {##2}
+ \str_if_eq:eeTF
+ { \exp_not:V \l__siunitx_number_partial_tl }
+ { \prg_replicate:nn { \tl_count:N \l__siunitx_number_partial_tl } { 0 } }
{
- \int_compare:nNnTF
- { #3 - 1 } = { \l__siunitx_process_fixed_int }
- {
- \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
- { } { #3 - 1 }
- }
- {
- \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
- { 0 } { #3 - 1 }
- }
+ \__siunitx_number_parse_uncert:NNNN
+ #2 \c_false_bool
}
{
- \__siunitx_number_if_zero:nTF {#1}
- {
- \__siunitx_number_process_fixed_aux_ii:nnn {##1} {##2}
- { #3 - 1 }
- }
- {
- \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
- {##2} { #3 - 1 }
- }
+ \__siunitx_number_parse_uncert:NNNN
+ #2 \c_true_bool
}
+ \__siunitx_number_parse_uncert_auxii:NN
}
- \tl_if_empty:nTF {#2}
- { \__siunitx_number_process_fixed_aux_ii:nnn { #1 0 } { } { #3 - 1 } }
- { \__siunitx_number_process_fixed_large_aux:w #2 \q_stop }
-}
-\cs_new_protected:Npn \__siunitx_number_process_fixed_large_aux:w
- { }
-\cs_new_protected:Npn
- \__siunitx_number_process_fixed_small:nnn #1#2#3 {
- \cs_set_protected:Npn
- \__siunitx_number_process_fixed_small_aux:w ##1##2 \q_stop ##3
- {
- \tl_if_empty:nTF {##2}
- {
- \tl_if_empty:nTF {##3}
- {
- \__siunitx_number_process_fixed_aux_ii:nnn { 0 }
- { ##1 #2 } { #3 + 1 }
- }
- {
- \__siunitx_number_process_fixed_aux_ii:nnn {##3}
- { ##1 #2 } { #3 + 1 }
- }
- }
+ { \__siunitx_number_parse_loop_break:wN }
+ #3 \q_recursion_tail \q_recursion_stop
+ }
+\cs_new_protected:Npn \__siunitx_number_parse_uncert_after:N #1
+ {
+ \quark_if_recursion_tail_stop:N #1
+ \__siunitx_number_parse_loop_break:wN
+ }
+\keys_define:nn { siunitx }
+ {
+ drop-exponent .bool_set:N =
+ \l__siunitx_number_drop_exponent_bool ,
+ drop-uncertainty .bool_set:N =
+ \l__siunitx_number_drop_uncertainty_bool ,
+ drop-zero-decimal .bool_set:N =
+ \l__siunitx_number_drop_zero_decimal_bool ,
+ exponent-mode .choices:nn =
+ { engineering , fixed , input , scientific }
+ { \tl_set_eq:NN \l__siunitx_number_exponent_mode_tl \l_keys_choice_tl } ,
+ fixed-exponent .int_set:N =
+ \l__siunitx_number_exponent_fixed_int ,
+ minimum-decimal-digits .int_set:N =
+ \l__siunitx_number_min_decimal_int ,
+ minimum-integer-digits .int_set:N =
+ \l__siunitx_number_min_integer_int ,
+ round-half .choice: ,
+ round-half / even .code:n =
+ { \bool_set_true:N \l__siunitx_number_round_half_even_bool } ,
+ round-half / up .code:n =
+ { \bool_set_false:N \l__siunitx_number_round_half_even_bool } ,
+ round-minimum .code:n =
+ { \__siunitx_number_set_round_min:n {#1} } ,
+ round-mode .choices:nn =
+ { figures , none , places, uncertainty }
+ { \tl_set_eq:NN \l__siunitx_number_round_mode_tl \l_keys_choice_tl } ,
+ round-pad .bool_set:N =
+ \l__siunitx_number_round_pad_bool ,
+ round-precision .int_set:N =
+ \l__siunitx_number_round_precision_int ,
+ }
+\bool_new:N \l__siunitx_number_round_half_even_bool
+\tl_new:N \l__siunitx_number_exponent_mode_tl
+\tl_new:N \l__siunitx_number_round_mode_tl
+\tl_new:N \l__siunitx_number_round_min_tl
+\cs_new_protected:Npn \__siunitx_number_set_round_min:n #1
+ {
+ \siunitx_number_parse:nN {#1} \l__siunitx_number_tmp_tl
+ \exp_after:wN \__siunitx_number_set_round_min:nnnnnnn \l__siunitx_number_tmp_tl
+ }
+\cs_new:Npn \__siunitx_number_set_round_min:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \tl_set:Nx \l__siunitx_number_round_min_tl
+ {
+ \bool_lazy_and:nnF
+ { \str_if_eq_p:nn {#3} { 0 } }
{
- \__siunitx_number_process_fixed_small_aux:w ##2 \q_stop
- { ##3 ##1 }
+ \str_if_eq_p:ee
+ { \exp_not:n {#4} }
+ { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
}
+ { \exp_not:n { {#3} {#4} } }
}
- \__siunitx_number_process_fixed_small_aux:w #1 \q_stop { }
-}
-\cs_new_protected:Npn \__siunitx_number_process_fixed_small_aux:w
- { }
-\cs_new_protected:Npn \__siunitx_number_process_integer_digits: {
- \int_compare:nNnT \l__siunitx_process_integer_min_int > 0
- {
- \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
- \l__siunitx_tmpa_tl
- {
- \int_set:Nn \l__siunitx_tmp_int
- {
- \l__siunitx_process_integer_min_int
- - \tl_count:N \l__siunitx_tmpa_tl
- }
- \int_compare:nNnT \l__siunitx_tmp_int > 0
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- {
- \prg_replicate:nn { \l__siunitx_tmp_int } { 0 }
- \exp_not:V \l__siunitx_tmpa_tl
- }
- \prop_put:NnV \l__siunitx_number_in_prop
- { mantissa-integer } \l__siunitx_tmpa_tl
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_mantissa: {
- \bool_if:NF \l__siunitx_process_unity_mantissa_bool
- {
- \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
- {
- \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
- \l__siunitx_tmpa_tl
- {
- \tl_if_eq:NNT \c__siunitx_unity_tl \l__siunitx_tmpa_tl
- {
- \prop_if_in:NnF \l__siunitx_number_in_prop
- { mantissa-decimal-marker }
- {
- \prop_remove:Nn \l__siunitx_number_in_prop
- { mantissa }
- \prop_remove:Nn \l__siunitx_number_in_prop
- { mantissa-integer }
- }
- }
- }
- }
- }
-}
-\tl_const:Nn \c__siunitx_unity_tl { 1 }
-\cs_new_protected:Npn \__siunitx_number_process_pad:n #1 {
- \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal }
- \l__siunitx_tmpa_tl
- {
- \int_while_do:nNnn { \l__siunitx_round_int } > { 0 }
- {
- \tl_put_right:Nn \l__siunitx_tmpa_tl { 0 }
- \int_decr:N \l__siunitx_round_int
- }
- \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
- \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_places:n #1
+ }
+\cs_new_protected:Npn \siunitx_number_process:NN #1#2
{
- \prop_if_in:NnT \l__siunitx_number_in_prop {#1}
+ \tl_if_empty:NTF #1
+ { \tl_clear:N #2 }
{
- \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -uncertainty }
- { \__siunitx_number_process_places_aux_i:n {#1} }
+ \__siunitx_number_drop_uncertainty:NN #1 #2
+ \exp_after:wN \__siunitx_number_process:nnnnnnnNN #2 #2 #2
+ \__siunitx_number_drop_exponent:NN #2 #2
+ \__siunitx_number_zero_decimal:NN #2 #2
+ \__siunitx_number_digits:NN #2 #2
}
}
-\cs_new_protected:Npn \__siunitx_number_process_places_aux_i:n #1
+\cs_new_protected:Npn \__siunitx_number_process:nnnnnnnNN #1#2#3#4#5#6#7#8#9
{
- \int_compare:nNnTF \l__siunitx_process_precision_int = 0
- { \__siunitx_number_process_places_none:n {#1} }
+ \bool_lazy_and:nnF
+ { \str_if_eq_p:nn {#3} { 0 } }
{
- \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal }
- \l__siunitx_tmpa_tl
+ \str_if_eq_p:ee
+ { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
+ }
+ {
+ \__siunitx_number_exponent:NN #8 #9
+ \__siunitx_number_round:NN #9 #9
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_exponent:NN #1#2
+ {
+ \tl_set:Nx #2
+ {
+ \cs:w
+ __siunitx_number_exponent_ \l__siunitx_number_exponent_mode_tl :nnnnnnn
+ \exp_after:wN
+ \cs_end: #1
+ }
+ \str_if_eq:VnT \l__siunitx_number_exponent_mode_tl { engineering }
+ {
+ \tl_set:Nx #2
+ { \exp_after:wN \__siunitx_number_exponent_engineering_aux:nnnnnnn #2 }
+ }
+ }
+\cs_new:Npn \__siunitx_number_exponent_fixed:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \exp_args:Nf \__siunitx_number_exponent_fixed:nnnnnnnn
+ { \int_eval:n { \l__siunitx_number_exponent_fixed_int - (#6#7) } }
+ {#1} {#2} {#3} {#4} {#5} {#6} {#7}
+ }
+\cs_new:Npn \__siunitx_number_exponent_fixed:nnnnnnnn #1#2#3#4#5#6#7#8
+ {
+ \exp_not:n { {#2} {#3} }
+ \__siunitx_number_exponent_shift:nnn {#1} {#4} {#5}
+ \__siunitx_number_exponent_uncert:n {#6}
+ \exp_not:n { {#7} } { \int_use:N \l__siunitx_number_exponent_fixed_int }
+ }
+\cs_new:Npn \__siunitx_number_exponent_input:nnnnnnn #1#2#3#4#5#6#7
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
+\cs_new:Npn \__siunitx_number_exponent_scientific:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \exp_args:Nf \__siunitx_number_exponent_scientific:nnnnnnnn
+ { \int_eval:n { \tl_count:n {#3} } }
+ {#1} {#2} {#3} {#4} {#5} {#6} {#7}
+ }
+\cs_new:Npn \__siunitx_number_exponent_scientific:nnnnnnnn #1#2#3#4#5#6#7#8
+ {
+ \exp_not:n { {#2} {#3} }
+ \int_compare:nNnTF {#1} = 1
+ {
+ \str_if_eq:nnTF {#4} { 0 }
{
- \tl_if_empty:NT \l__siunitx_tmpa_tl
- { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
- \__siunitx_number_process_places_aux_i:TF
- {
- \prop_put:Nnn \l__siunitx_number_in_prop { #1 -decimal } { }
- \int_set:Nn \l__siunitx_round_int
- { \l__siunitx_process_precision_int }
- \__siunitx_number_process_pad:n {#1}
- }
- {
- \int_set:Nn \l__siunitx_round_int
- { \tl_count:N \l__siunitx_tmpa_tl }
- \__siunitx_number_process_places_aux_ii:n {#1}
- }
+ \__siunitx_number_exponent_scientific:nnnw
+ { 0 } {#6} { #7#8 } #5 \q_stop
}
+ { \exp_not:n { {#4} {#5} {#6} {#7} {#8} } }
+ }
+ {
+ \__siunitx_number_exponent_shift:nnn { #1 - 1 } {#4} {#5}
+ \__siunitx_number_exponent_uncert:n {#6}
+ \__siunitx_number_exponent_finalise:n { #1 + #7#8 - 1 }
}
}
-\cs_new_protected:Npn \__siunitx_number_process_places_aux_i:TF
+\cs_new_eq:NN \__siunitx_number_exponent_engineering:nnnnnnn
+ \__siunitx_number_exponent_scientific:nnnnnnn
+\cs_new:Npn \__siunitx_number_exponent_scientific:nnnw #1#2#3#4#5 \q_stop
{
- \bool_set_true:N \l__siunitx_tmp_bool
- \tl_map_inline:Nn \l__siunitx_tmpa_tl
+ \str_if_eq:nnTF {#4} { 0 }
+ {
+ \__siunitx_number_exponent_scientific:nnnw
+ { #1 - 1 } {#2} {#3} #5 \q_stop
+ }
{
- \int_compare:nNnF {##1} = 0
+ \exp_not:n { {#4} {#5} {#2} }
+ \__siunitx_number_exponent_finalise:n { #1 + #3 - 1 }
+ }
+ }
+\cs_new:Npn \__siunitx_number_exponent_shift:nnn #1#2#3
+ {
+ \int_compare:nNnTF {#1} > 0
+ { \__siunitx_number_exponent_shift_down:nnnw {#1} {#3} { } #2 \q_stop }
+ {
+ \int_compare:nNnTF {#1} < 0
+ { \__siunitx_number_exponent_shift_up:nnn {#1} {#2} {#3} }
+ { {#2} {#3} }
+ }
+ }
+\cs_generate_variant:Nn \__siunitx_number_exponent_shift:nnn { nnf }
+\cs_new:Npn \__siunitx_number_exponent_shift_down:nnnw #1#2#3#4#5 \q_stop
+ {
+ \tl_if_blank:nTF {#5}
+ { \__siunitx_number_exponent_shift_down:nnn {#1} { #4 #3 } {#2} }
+ { \__siunitx_number_exponent_shift_down:nnnw {#1} {#2} { #4 #3 } #5 \q_stop }
+ }
+\cs_new:Npn \__siunitx_number_exponent_shift_down:nnn #1#2#3
+ {
+ \int_compare:nNnTF {#1} = 0
+ { { \tl_reverse:n {#2} } \exp_not:n { {#3} } }
+ { \__siunitx_number_exponent_shift_down:nw {#1} #2 \q_stop {#3} }
+ }
+\cs_new:Npn \__siunitx_number_exponent_shift_down:nw #1#2#3 \q_stop #4
+ {
+ \tl_if_blank:nTF {#3}
+ { \__siunitx_number_exponent_shift_down:nnn { #1 - 1 } { 0 } { #2#4 } }
+ { \__siunitx_number_exponent_shift_down:nnn { #1 - 1 } {#3} { #2#4 } }
+ }
+\cs_new:Npn \__siunitx_number_exponent_shift_up:nnn #1#2#3
+ {
+ \tl_if_blank:nTF {#3}
+ {
+ \__siunitx_number_exponent_shift_up_aux:ffn
+ { \int_eval:n { #1 + 1 } }
+ { \str_if_eq:nnF {#2} { 0 } {#2} 0 }
+ { }
+ \__siunitx_number_exponent_shift_uncert:nw { 1 }
+ }
+ { \__siunitx_number_exponent_shift_up:nnw {#1} {#2} #3 \q_stop }
+ }
+\cs_new:Npn \__siunitx_number_exponent_shift_up:nnw #1#2#3#4 \q_stop
+ {
+ \__siunitx_number_exponent_shift_up_aux:ffn
+ { \int_eval:n { #1 + 1 } }
+ { \str_if_eq:nnF {#2} { 0 } {#2} #3 }
+ {#4}
+ }
+\cs_new:Npn \__siunitx_number_exponent_shift_up_aux:nnn #1#2#3
+ {
+ \int_compare:nNnTF {#1} = 0
+ { \exp_not:n { {#2} {#3} } }
+ {
+ \tl_if_blank:nTF {#3}
{
- \bool_set_false:N \l__siunitx_tmp_bool
- \tl_map_break:
- }
+ {
+ \exp_not:n {#2}
+ \prg_replicate:nn { \int_abs:n {#1} } { 0 }
+ }
+ { }
+ \__siunitx_number_exponent_shift_uncert:nw { \int_abs:n {#1} }
+ }
+ { \__siunitx_number_exponent_shift_up:nnn {#1} {#2} {#3} }
}
- \bool_if:NTF \l__siunitx_tmp_bool
}
-\cs_new_protected:Npn \__siunitx_number_process_places_none:n #1
+\cs_generate_variant:Nn \__siunitx_number_exponent_shift_up_aux:nnn { f , ff }
+\cs_new:Npn \__siunitx_number_exponent_shift_uncert:nw
+ #1#2 \__siunitx_number_exponent_uncert:n #3
{
- \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal } \l__siunitx_tmpa_tl
+ \tl_if_blank:nTF {#3}
+ {
+ #2
+ \__siunitx_number_exponent_uncert:n { }
+ }
{
- \int_compare:nNnTF { \tl_head:N \l__siunitx_tmpa_tl } > 4
+ \str_if_eq:nnTF {#3} { 0 }
{
- \prop_get:NnNTF \l__siunitx_number_in_prop { #1 -integer }
- \l__siunitx_tmpb_tl
- {
- \tl_set:Nx \l__siunitx_tmpb_tl
- { \int_eval:n { \l__siunitx_tmpb_tl + 1 } }
- \bool_if:NF \l__siunitx_round_half_up_bool
- {
- \bool_lazy_and:nnT
- {
- \int_compare_p:nNn
- { 0 \tl_head:N \l__siunitx_tmpa_tl } = 5
- }
- {
- \int_compare_p:nNn
- { 0 \tl_tail:N \l__siunitx_tmpa_tl } = 0
- }
- {
- \int_if_odd:nT \l__siunitx_tmpb_tl
- {
- \tl_set:Nx \l__siunitx_tmpb_tl
- { \int_eval:n { \l__siunitx_tmpb_tl - 1 } }
- }
- }
- }
- }
- { \tl_set:Nn \l__siunitx_tmpb_tl { 1 } }
- \prop_put:NnV \l__siunitx_number_in_prop
- { #1 -integer } \l__siunitx_tmpb_tl
+ #2
+ \__siunitx_number_exponent_uncert:n { { S } { 0 } }
}
{
- \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -integer }
- {
- \prop_put:Nnn \l__siunitx_number_in_prop
- { #1 -integer } { 0 }
- }
+ \use:c { __siunitx_number_exponent_shift_uncert_ \use_i:nn #3 :fnnn }
+ { \prg_replicate:nn {#1} { 0 } }
+ {#2}
+ #3
}
}
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
- \bool_if:NF \l__siunitx_process_int_to_dec_bool
- { \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker } }
}
-\cs_new_protected:Npn \__siunitx_number_process_places_aux_ii:n #1
+\cs_new:Npn \__siunitx_number_exponent_shift_uncert_S:nnnn #1#2#3#4
+ {
+ #2
+ \__siunitx_number_exponent_uncert:n { { S } { #4#1 } }
+ }
+\cs_generate_variant:Nn \__siunitx_number_exponent_shift_uncert_S:nnnn { f }
+\cs_new:Npn \__siunitx_number_exponent_uncert:n #1 { { \exp_not:n {#1} } }
+\cs_new:Npn \__siunitx_number_exponent_finalise:n #1
+ {
+ \int_compare:nNnTF {#1} < 0
+ { { - } }
+ { { } }
+ { \int_abs:n {#1} }
+ }
+\cs_new:Npn \__siunitx_number_exponent_engineering_aux:nnnnnnn #1#2#3#4#5#6#7
{
- \int_sub:Nn \l__siunitx_round_int
- { \l__siunitx_process_precision_int }
- \int_compare:nNnTF \l__siunitx_round_int < 0
+ \exp_not:n { {#1} {#2} }
+ \use:c
{
- \int_set:Nn \l__siunitx_round_int { - \l__siunitx_round_int }
- \__siunitx_number_process_pad:n {#1}
+ __siunitx_number_exponent_engineering_
+ \int_compare:nNnTF {#6#7} < 0
+ {
+ \int_case:nnF { \int_mod:nn { #7 } { 3 } }
+ {
+ { 1 } { 2 }
+ { 2 } { 1 }
+ }
+ { 0 }
+ }
+ { \int_mod:nn {#7} { 3 } }
+ :nnnn
+ }
+ {#3} {#4} {#5} {#6#7}
+ }
+\cs_new:cpn { __siunitx_number_exponent_engineering_0:nnnn } #1#2#3#4
+ {
+ \exp_not:n { {#1} {#2} {#3} }
+ \__siunitx_number_exponent_finalise:n {#4}
+ }
+\cs_new:cpn { __siunitx_number_exponent_engineering_1:nnnn } #1#2#3#4
+ {
+ \tl_if_blank:nTF {#2}
+ {
+ { \exp_not:n { #1 0 } } { }
+ { \__siunitx_number_exponent_engineering_uncert:nn {#3} { 0 } }
}
{
- \__siunitx_number_process_places_init:n {#1}
- \__siunitx_number_process_places_loop:n {#1}
- \__siunitx_number_process_round_tidy:n {#1}
+ { \exp_not:n {#1} \exp_not:o { \tl_head:w #2 \q_stop } }
+ { \exp_not:f { \tl_tail:n {#2} } }
+ { \exp_not:n {#3} }
}
+ \__siunitx_number_exponent_finalise:n { #4 - 1 }
}
-\cs_new_protected:Npn \__siunitx_number_process_places_init:n #1
+\cs_new:cpn { __siunitx_number_exponent_engineering_2:nnnn } #1#2#3#4
{
- \prop_get:NnNF \l__siunitx_number_in_prop { #1 -integer }
- \l__siunitx_round_integer_in_tl
- { \tl_clear:N \l__siunitx_round_integer_in_tl }
- \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal }
- \l__siunitx_round_decimal_in_tl
- \tl_reverse:N \l__siunitx_round_integer_in_tl
- \tl_reverse:N \l__siunitx_round_decimal_in_tl
- \tl_clear:N \l__siunitx_round_integer_out_tl
- \tl_clear:N \l__siunitx_round_decimal_out_tl
- \tl_clear:N \l__siunitx_round_discard_tl
- \bool_set_false:N \l__siunitx_round_bool
- \bool_set_false:N \l__siunitx_round_even_bool
+ \tl_if_blank:nTF {#2}
+ {
+ { \exp_not:n { #1 00 } } { }
+ { \__siunitx_number_exponent_engineering_uncert:nn {#3} { 00 } }
+ }
+ {\__siunitx_number_exponent_engineering:nnNw {#1} {#3} #2 \q_stop }
+ \__siunitx_number_exponent_finalise:n { #4 - 2 }
}
-\cs_new_protected:Npn \__siunitx_number_process_places_loop:n #1
+\cs_new:Npn \__siunitx_number_exponent_engineering:nnNw #1#2#3#4 \q_stop
{
- \tl_if_empty:NTF \l__siunitx_round_decimal_in_tl
+ \tl_if_blank:nTF {#4}
{
- \tl_if_empty:NF \l__siunitx_round_integer_in_tl
- {
- \__siunitx_number_process_places_integer:n {#1}
- \__siunitx_number_process_places_loop:n {#1}
- }
- \bool_if:NT \l__siunitx_round_bool
- {
- \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 1 }
- \bool_set_false:N \l__siunitx_round_bool
- }
+ { \exp_not:n { #1#3 0 } } { }
+ { { \__siunitx_number_exponent_engineering_uncert:nn {#2} { 0 } } }
}
{
- \__siunitx_number_process_round_decimal:
- \__siunitx_number_process_places_loop:n {#1}
+ { \exp_not:n {#1#3} \exp_not:o { \tl_head:w #4 \q_stop } }
+ { \exp_not:f { \tl_tail:n {#4} } }
+ { \exp_not:n {#2} }
}
}
-\cs_new_protected:Npn \__siunitx_number_process_places_integer:n #1
+\cs_new:Npn \__siunitx_number_exponent_engineering_uncert:nn #1#2
{
- \int_set:Nn \l__siunitx_tmp_int
- { \tl_head:N \l__siunitx_round_integer_in_tl }
- \tl_set:Nx \l__siunitx_round_integer_in_tl
- { \tl_tail:N \l__siunitx_round_integer_in_tl }
- \__siunitx_number_process_round_up:
- \bool_set_false:N \l__siunitx_round_bool
- \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
+ \tl_if_blank:nF {#1}
{
- \int_zero:N \l__siunitx_tmp_int
- \bool_set_true:N \l__siunitx_round_bool
+ \use:c { __siunitx_number_exponent_engineering_uncert_ \use_i:nn #1 :nnn }
+ #1 {#2}
}
- \tl_put_left:NV \l__siunitx_round_integer_out_tl \l__siunitx_tmp_int
}
-\cs_new_protected:Npn \__siunitx_number_process_round:
+\cs_new:Npn \__siunitx_number_exponent_engineering_uncert_S:nnn #1#2#3
+ {
+ { S }
+ {
+ \exp_not:n {#2}
+ \str_if_eq:nnF {#2} { 0 } {#3}
+ }
+ }
+\cs_new_protected:Npn \__siunitx_number_digits:NN #1#2
+ {
+ \tl_set:Nx #2
+ { \exp_after:wN \__siunitx_number_digits:nnnnnnn #1 }
+ }
+\cs_new:Npn \__siunitx_number_digits:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \exp_not:n { {#1} {#2} }
+ {
+ \__siunitx_number_digits:Nn \l__siunitx_number_min_integer_int {#3}
+ \exp_not:n {#3}
+ }
+ {
+ \exp_not:n {#4}
+ \__siunitx_number_digits:Nn \l__siunitx_number_min_decimal_int {#4}
+ }
+ { \tl_if_blank:nF {#5} { \__siunitx_number_digits_uncert:nn #5 } }
+ \exp_not:n { {#6} {#7} }
+ }
+\cs_new:Npn \__siunitx_number_digits:Nn #1#2
+ {
+ \int_compare:nNnT
+ { #1 - \tl_count:n {#2} } > 0
+ { \prg_replicate:nn { #1 - \tl_count:n {#2} } { 0 } }
+ }
+\cs_new:Npn \__siunitx_number_digits_uncert:nn #1#2
+ {
+ { #1 }
+ { \use:c { __siunitx_number_digits_uncert_ #1 :n } {#2} }
+ }
+\cs_new:Npn \__siunitx_number_digits_uncert_S:n #1
{
- \tl_if_empty:NF \l__siunitx_round_tl
+ \exp_not:n {#1}
+ \__siunitx_number_digits:Nn \l__siunitx_number_min_decimal_int {#1}
+ }
+\cs_new_protected:Npn \__siunitx_number_drop_exponent:NN #1#2
+ {
+ \bool_if:NT \l__siunitx_number_drop_exponent_bool
{
- \bool_if:NT \l__siunitx_process_int_to_dec_bool
- {
- \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa-decimal }
- {
- \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-decimal }
- { 0 }
- }
- \prop_if_in:NnF \l__siunitx_number_in_prop
- { mantissa-decimal-marker }
- {
- \prop_put:Nnn \l__siunitx_number_in_prop
- { mantissa-decimal-marker } { . }
- }
- }
- \clist_map_function:nc { mantissa , complex }
- { __siunitx_number_process_ \l__siunitx_round_tl :n }
+ \tl_set:Nx #2
+ { \exp_after:wN \__siunitx_number_drop_exponent:nnnnnnn #1 }
+ }
+ }
+\cs_new:Npn \__siunitx_number_drop_exponent:nnnnnnn #1#2#3#4#5#6#7
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} { } { 0 } } }
+\cs_new_protected:Npn \__siunitx_number_drop_uncertainty:NN #1#2
+ {
+ \bool_if:NTF \l__siunitx_number_drop_uncertainty_bool
+ {
+ \tl_set:Nx #2
+ { \exp_after:wN \__siunitx_number_drop_uncertainty:nnnnnnn #1 }
+ }
+ { \tl_set_eq:NN #2 #1 }
+
+ }
+\cs_new:Npn \__siunitx_number_drop_uncertainty:nnnnnnn #1#2#3#4#5#6#7
+ { \exp_not:n { {#1} {#2} {#3} {#4} { } {#6} {#7} } }
+\cs_new_protected:Npn \__siunitx_number_round:NN #1#2
+ {
+ \tl_set:Nx #2
+ {
+ \cs:w
+ __siunitx_number_round_ \l__siunitx_number_round_mode_tl :nnnnnnn
+ \exp_after:wN
+ \cs_end: #1
}
}
-\cs_new_protected:Npn \__siunitx_number_process_round_decimal:
+\cs_new:Npn \__siunitx_number_round_none:nnnnnnn #1#2#3#4#5#6#7
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
+\cs_new:Npn \__siunitx_number_round:nnn #1#2#3
+ {
+ \__siunitx_number_round_auxi:nnnN {#1} {#2} { }
+ #3 \q_recursion_tail \q_recursion_stop
+ }
+\cs_generate_variant:Nn \__siunitx_number_round:nnn { f }
+\cs_new:Npn \__siunitx_number_round_auxi:nnnN #1#2#3#4
{
- \int_compare:nNnF \l__siunitx_round_int > 1
- { \__siunitx_number_process_round_decimal_aux: }
- \tl_put_right:Nx \l__siunitx_round_discard_tl
- { \tl_head:N \l__siunitx_round_decimal_in_tl }
- \tl_set:Nx \l__siunitx_round_decimal_in_tl
- { \tl_tail:N \l__siunitx_round_decimal_in_tl }
- \int_decr:N \l__siunitx_round_int
+ \quark_if_recursion_tail_stop_do:Nn #4
+ {
+ \__siunitx_number_round_auxii:nnnN {#1} {#3} { } #2
+ \q_recursion_tail \q_recursion_stop
+ }
+ \__siunitx_number_round_auxi:nnnN {#1} {#2} {#4#3}
}
-\cs_new_protected:Npn \__siunitx_number_process_round_decimal_aux:
+\cs_new:Npn \__siunitx_number_round_auxii:nnnN #1#2#3#4
{
- \int_set:Nn \l__siunitx_tmp_int
- { \tl_head:N \l__siunitx_round_decimal_in_tl }
- \__siunitx_number_process_round_up:
- \int_compare:nNnTF \l__siunitx_round_int = 1
+ \quark_if_recursion_tail_stop_do:Nn #4
{
- \int_compare:nNnT \l__siunitx_tmp_int > 4
+ \tl_if_blank:nTF {#2}
{
- \bool_set_true:N \l__siunitx_round_bool
- \bool_if:NF \l__siunitx_round_half_up_bool
- {
- \int_compare:nNnT
- { \l__siunitx_round_discard_tl \int_use:N \l__siunitx_tmp_int } = 5
- { \bool_set_true:N \l__siunitx_round_even_bool }
- }
+ \__siunitx_number_round_auxiv:nnnN {#1} { } { } #3
+ \q_recursion_tail \q_recursion_stop
}
+ {
+ \__siunitx_number_round_auxiii:nnnN {#1} {#3} { } #2
+ \q_recursion_tail \q_recursion_stop
+ }
+ }
+ \__siunitx_number_round_auxii:nnnN {#1} {#2} {#4#3}
+ }
+\cs_new:Npn \__siunitx_number_round_auxiii:nnnN #1#2#3#4
+ {
+ \quark_if_recursion_tail_stop_do:Nn #4
+ {
+ \__siunitx_number_round_auxiv:nnnN {#1} { } {#3} #2
+ \q_recursion_tail \q_recursion_stop
+ }
+ \int_compare:nNnTF {#1} > 0
+ {
+ \exp_args:Nf \__siunitx_number_round_auxiii:nnnN
+ { \int_eval:n { #1 - 1 } } {#2} { #4#3 }
}
+ { \__siunitx_number_round_auxv:nnN {#3} {#2} #4 }
+ }
+\cs_new:Npn \__siunitx_number_round_auxiv:nnnN #1#2#3#4
+ {
+ \quark_if_recursion_tail_stop_do:Nn #4
+ { { 0 } { } }
+ \int_compare:nNnTF {#1} > 0
+ {
+ \exp_args:Nf \__siunitx_number_round_auxiv:nnnN
+ { \int_eval:n { #1 - 1 } } { #2 0 } { #4#3 }
+ }
+ { \__siunitx_number_round_auxvi:nnnN {#3} {#2} #4 }
+ }
+\cs_new:Npn \__siunitx_number_round_auxv:nnN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #3
+ {
+ \__siunitx_number_round_auxvi:nnN
+ {#1} { } #2 \q_recursion_tail \q_recursion_stop
+ }
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn { 0 \tl_head:n {#1} } < 5 }
{
- \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
+ \bool_lazy_all_p:n
{
- \bool_set_true:N \l__siunitx_round_bool
- \int_zero:N \l__siunitx_tmp_int
+ { \l__siunitx_number_round_half_even_bool }
+ { \int_if_odd_p:n {#3} }
+ { \__siunitx_number_round_if_half_p:n {#1} }
}
- \tl_put_left:NV \l__siunitx_round_decimal_out_tl
- \l__siunitx_tmp_int
}
+ { \__siunitx_number_round_final_decimal:nnw }
+ { \__siunitx_number_round_auxvii:nnN }
+ {#2} { } #3
}
-\cs_new_protected:Npn \__siunitx_number_process_round_up:
+\cs_new:Npn \__siunitx_number_round_auxvi:nnnN #1#2#3
{
- \bool_if:NT \l__siunitx_round_bool
+ \quark_if_recursion_tail_stop_do:Nn #3
+ { { 0 } { } }
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn { 0 \tl_head:n {#1} } < 5 }
{
- \bool_if:NTF \l__siunitx_round_even_bool
+ \bool_lazy_all_p:n
{
- \bool_set_false:N \l__siunitx_round_even_bool
- \int_if_even:nF \l__siunitx_tmp_int
- { \int_incr:N \l__siunitx_tmp_int }
+ { \l__siunitx_number_round_half_even_bool }
+ { \int_if_odd_p:n {#3} }
+ { \__siunitx_number_round_if_half_p:n {#1} }
}
- { \int_incr:N \l__siunitx_tmp_int }
}
- \bool_set_false:N \l__siunitx_round_bool
+ { \__siunitx_number_round_final_integer:nnw }
+ { \__siunitx_number_round_auxviii:nnN }
+ { } {#2} #3
}
-\cs_new_protected:Npn \__siunitx_number_process_round_tidy:n #1
+\cs_new:Npn \__siunitx_number_round_auxvii:nnN #1#2#3
{
- \bool_lazy_and:nnTF
- { \__siunitx_number_if_zero_p:V \l__siunitx_round_integer_out_tl }
- { \__siunitx_number_if_zero_p:V \l__siunitx_round_decimal_out_tl }
+ \quark_if_recursion_tail_stop_do:Nn #3
{
- \str_if_eq:VnTF \l__siunitx_process_round_min_tl { 0 }
+ \str_if_eq:nnTF {#1} { 0 }
{
- \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
- \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
- \l__siunitx_round_decimal_out_tl
+ \__siunitx_number_round_final_output:ff
+ { 1 }
+ { \__siunitx_number_round_truncate:n {#2} }
}
{
- \exp_after:wN \__siunitx_number_process_round_tidy_aux:w
- \l__siunitx_process_round_min_tl . . \q_stop {#1}
+ \__siunitx_number_round_auxviii:nnN {#2} { } #1
+ \q_recursion_tail \q_recursion_stop
}
}
+ \int_compare:nNnTF {#3} = 9
+ { \__siunitx_number_round_auxvii:nnN {#1} { 0 #2 } }
{
- \prop_put:NnV \l__siunitx_number_in_prop { #1 -integer }
- \l__siunitx_round_integer_out_tl
- \tl_if_empty:NTF \l__siunitx_round_decimal_out_tl
+ \int_compare:nNnTF {#3} = 0
{
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker }
+ \__siunitx_number_round_final_decimal:nnw
+ {#1} { 1 \__siunitx_number_round_truncate:n {#2} }
}
{
- \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
- \l__siunitx_round_decimal_out_tl
+ \__siunitx_number_round_final:fn
+ { \int_eval:n { #3 + 1 } }
+ { \__siunitx_number_round_final_decimal:nnw {#1} {#2} }
}
- }
- }
-\cs_new_protected:Npn \__siunitx_number_process_round_tidy_aux:w
- #1 . #2 . #3 \q_stop #4
- {
- \prop_put:Nnn \l__siunitx_number_in_prop { comparator } { < }
- \prop_put:Nnn \l__siunitx_number_in_prop { #4 -integer } {#1}
- \tl_if_empty:nTF {#2}
- { \prop_remove:Nn \l__siunitx_number_in_prop { #4 -decimal } }
- { \prop_put:Nnn \l__siunitx_number_in_prop { #4 -decimal } {#2} }
+ }
}
-\cs_new_protected:Npn \__siunitx_number_process_scientific: {
- \prop_if_in:NnF \l__siunitx_number_in_prop { complex }
- {
- \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-integer }
- \l__siunitx_tmpa_tl
- { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
- \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
- \l__siunitx_tmpb_tl
- { \tl_clear:N \l__siunitx_tmpb_tl }
- \tl_set:Nx \l__siunitx_tmpa_tl
- { { \l__siunitx_tmpa_tl } { \l__siunitx_tmpb_tl } }
- \prop_get:NnNF \l__siunitx_number_in_prop { exponent-integer }
- \l__siunitx_tmpb_tl
- { \tl_set:Nn \l__siunitx_tmpb_tl { 0 } }
- \group_begin:
- \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
- \l__siunitx_tmpa_tl
- { \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
- \exp_args:NNNV \group_end:
- \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_tmpb_tl
- \tl_set:Nx \l__siunitx_tmpa_tl
- { \l__siunitx_tmpa_tl { \l__siunitx_tmpb_tl } }
- \exp_after:wN \__siunitx_number_process_scientific_aux_i:nnn
- \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_scientific_aux_i:nnn #1#2#3
+\cs_new:Npn \__siunitx_number_round_auxviii:nnN #1#2#3
{
- \bool_set_true:N \l__siunitx_tmp_bool
- \tl_map_inline:nn {#1#2}
+ \quark_if_recursion_tail_stop_do:Nn #3
{
- \str_if_eq:nnF {##1} { 0 }
+ \tl_if_blank:nTF {#1}
{
- \bool_set_false:N \l__siunitx_tmp_bool
- \tl_map_break:
+ \__siunitx_number_round_final_shift:ff
+ {
+ \exp_last_unbraced:Nf 1
+ { \__siunitx_number_round_truncate_direct:n {#2} } 0
+ }
+ { }
}
- }
- \bool_if:NF \l__siunitx_tmp_bool
- { \__siunitx_number_process_scientific_aux_ii:nnn {#1} {#2} {#3} }
+ {
+ \__siunitx_number_round_final_shift:ff
+ { 1 #2 }
+ { \__siunitx_number_round_truncate:n {#1} }
+ }
+ }
+ \int_compare:nNnTF {#3} = 9
+ { \__siunitx_number_round_auxviii:nnN {#1} { 0 #2 } }
+ {
+ \__siunitx_number_round_final:fn
+ { \int_eval:n { #3 + 1 } }
+ { \__siunitx_number_round_final_integer:nnw {#1} {#2} }
+ }
}
-\cs_new_protected:Npn
- \__siunitx_number_process_scientific_aux_ii:nnn #1#2#3 {
- \int_compare:nNnTF { \tl_count:n {#1} } > 1
- { \__siunitx_number_process_scientific_large:nnn {#1} {#2} {#3} }
+\cs_new:Npn \__siunitx_number_round_final_decimal:nnw
+ #1#2#3 \q_recursion_tail \q_recursion_stop
+ {
+ \__siunitx_number_round_final_output:ff
+ { \tl_reverse:n {#1} }
+ { \tl_reverse:n {#3} #2 }
+ }
+\cs_new:Npn \__siunitx_number_round_final_integer:nnw
+ #1#2#3 \q_recursion_tail \q_recursion_stop
+ {
+ \__siunitx_number_round_final_output:ff
+ { \tl_reverse:n {#3} #2 }
+ {#1}
+ }
+\cs_new:Npn \__siunitx_number_round_final_output:nn #1#2 { {#1} {#2} }
+\cs_generate_variant:Nn \__siunitx_number_round_final_output:nn { ff }
+\cs_new:Npn \__siunitx_number_round_final:nn #1#2
+ { #2 #1 }
+\cs_generate_variant:Nn \__siunitx_number_round_final:nn { f }
+\cs_new:Npn \__siunitx_number_round_final_shift:nn #1#2
+ {
+ \str_if_eq:VnTF \l__siunitx_number_round_mode_tl { places }
+ {
+ \use:c
+ { __siunitx_number_round_ \l__siunitx_number_exponent_mode_tl :nn }
+ {#1} {#2}
+ }
+ { {#1} {#2} }
+ }
+\cs_generate_variant:Nn \__siunitx_number_round_final_shift:nn { ff }
+\cs_new:Npn \__siunitx_number_round_engineering:nn #1#2
+ {
+ \int_compare:nNnTF { \tl_count:n {#1} } = 4
+ {
+ \__siunitx_number_round_engineering:NNNNn #1 {#2}
+ { }
+ \__siunitx_number_round_final_shift:Nw 3
+ }
+ { {#1} {#2} }
+ }
+\cs_new:Npn \__siunitx_number_round_engineering:NNNNn #1#2#3#4#5
+ {
+ {#1}
+ \exp_args:NV \__siunitx_number_round_engineering:nnN
+ { \l__siunitx_number_round_precision_int } { }
+ #2#3#4#5 \q_recursion_tail \q_recursion_stop
+ }
+\cs_new:Npn \__siunitx_number_round_engineering:nnN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #3 { {#2} }
+ \int_compare:nNnTF {#1} = { 0 }
+ { \use_i_delimit_by_q_recursion_stop:nw { {#2} } }
+ { \__siunitx_number_round_engineering:nnN { #1 - 1 } { #2#3 } }
+ }
+\cs_new:Npn \__siunitx_number_round_fixed:nn #1#2 { {#1} {#2} }
+\cs_new:Npn \__siunitx_number_round_input:nn #1#2 { {#1} {#2} }
+\cs_new:Npn \__siunitx_number_round_scientific:nn #1#2
+ {
+ \__siunitx_number_exponent_shift:nnf
+ { 1 } {#1} { \__siunitx_number_round_truncate_direct:n {#2} }
+ { }
+ \__siunitx_number_round_final_shift:Nw 1
+ }
+\cs_new:Npn \__siunitx_number_round_final_shift:Nw #1#2 \__siunitx_number_round_places_end:nn #3#4
+ { \__siunitx_number_exponent_finalise:n { #3#4 + #1 } }
+\cs_new:Npn \__siunitx_number_round_truncate:n #1
+ {
+ \str_if_eq:VnTF \l__siunitx_number_round_mode_tl { figures }
+ { \__siunitx_number_round_truncate_direct:n {#1} }
+ {#1}
+ }
+\cs_new:Npn \__siunitx_number_round_truncate_direct:n #1
+ {
+ \__siunitx_number_round_truncate:nnN { } { }
+ #1 \q_recursion_tail \q_recursion_stop
+ }
+\cs_new:Npn \__siunitx_number_round_truncate:nnN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #3 { #1 }
+ \__siunitx_number_round_truncate:nnN {#1#2} {#3}
+ }
+\prg_new_conditional:Npnn \__siunitx_number_round_if_half:n #1 { p }
+ {
+ \int_compare:nNnTF { \tl_head:n { #1 0 } } = 5
+ {
+ \exp_after:wN \__siunitx_number_round_if_half:N \use_none:n #1 0
+ \q_recursion_tail \q_recursion_stop
+ }
+ { \prg_return_false: }
+ }
+\cs_new:Npn \__siunitx_number_round_if_half:N #1
+ {
+ \quark_if_recursion_tail_stop_do:Nn #1
+ { \prg_return_true: }
+ \int_compare:nNnTF {#1} = 0
+ { \__siunitx_number_round_if_half:N }
+ { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_false: } }
+ }
+\cs_new:Npn \__siunitx_number_round_pad:nnn #1#2#3
+ {
+ {#2}
{
- \__siunitx_number_if_zero:nTF {#1}
- {
- \__siunitx_number_process_scientific_small:wn
- #2 \q_stop {#3}
- }
- {
- \bool_if:NTF \l__siunitx_process_engineering_bool
- { \__siunitx_number_process_scientific_engineering:nnn }
- { \__siunitx_number_process_scientific_store:nnn }
- {#1} {#2} {#3}
- }
-
+ #3
+ \bool_if:NT \l__siunitx_number_round_pad_bool
+ { \prg_replicate:nn {#1} { 0 } }
}
-}
-\cs_new_protected:Npn \__siunitx_number_process_scientific_large:nnn #1#2#3
+ }
+\cs_new:Npn \__siunitx_number_round_figures:nnnnnnn #1#2#3#4#5#6#7
{
- \cs_set_protected:Npn \__siunitx_number_process_scientific_large_loop:nNN
- ##1##2##3
+ \tl_if_blank:nTF {#5}
{
- \quark_if_recursion_tail_stop_do:Nn ##3
+ \int_compare:nNnTF \l__siunitx_number_round_precision_int > 0
{
- \__siunitx_number_process_scientific_aux_ii:nnn {##1} { ##2 #2 }
- { #3 + 1 }
+ \exp_not:n { {#1} {#2} }
+ \__siunitx_number_round_figures_count:nnN {#3} {#4} #3#4
+ \q_recursion_tail \q_recursion_stop
+ \exp_not:n { { } {#6} {#7} }
}
- \__siunitx_number_process_scientific_large_loop:nNN { ##1 ##2 } ##3
+ { { } { } { 0 } { } { } { } { 0 } }
}
- \__siunitx_number_process_scientific_large_loop:nNN { } #1
- \q_recursion_tail \q_recursion_stop
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
}
-\cs_new_protected:Npn
- \__siunitx_number_process_scientific_small:wn #1#2 \q_stop #3
- { \__siunitx_number_process_scientific_aux_ii:nnn {#1} {#2} { #3 - 1 } }
-\cs_new_protected:Npn
- \__siunitx_number_process_scientific_store:nnn #1#2#3
+\cs_new:Npn \__siunitx_number_round_figures_count:nnN #1#2#3
+ {
+ \quark_if_recursion_tail_stop_do:Nn #3
+ { { } { } { 0 } { } { } { } { 0 } }
+ \int_compare:nNnTF {#3} = 0
+ { \__siunitx_number_round_figures_count:nnN {#1} {#2} }
+ { \__siunitx_number_round_figures_count:nnnN { 1 } {#1} {#2} }
+ }
+\cs_new:Npn \__siunitx_number_round_figures_count:nnnN #1#2#3#4
{
- \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-integer } {#1}
- \tl_if_empty:nTF {#2}
+ \quark_if_recursion_tail_stop_do:Nn #4
{
- \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-decimal }
- \prop_remove:Nn \l__siunitx_number_in_prop
- { mantissa-decimal-marker }
+ \int_compare:nNnTF {#1} > \l__siunitx_number_round_precision_int
+ {
+ \__siunitx_number_round:fnn
+ { \int_eval:n { #1 - \l__siunitx_number_round_precision_int } }
+ {#2} {#3}
+ }
+ {
+ \__siunitx_number_round_pad:nnn
+ { \l__siunitx_number_round_precision_int - (#1) } {#2} {#3}
+ }
}
+ \exp_args:Nf \__siunitx_number_round_figures_count:nnnN
+ { \int_eval:n { #1 + 1 } } {#2} {#3}
+ }
+\cs_new:Npn \__siunitx_number_round_places:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \tl_if_blank:nTF {#5}
{
- \prop_put:Nnn \l__siunitx_number_in_prop
- { mantissa-decimal } {#2}
- \prop_if_in:NnF \l__siunitx_number_in_prop
- { mantissa-decimal-marker }
+ \exp_args:Ne \__siunitx_number_round_places_finalise:n
{
- \prop_put:Nnn \l__siunitx_number_in_prop
- { mantissa-decimal-marker } { . }
+ \exp_not:n { {#1} {#2} }
+ \int_compare:nNnTF \l__siunitx_number_round_precision_int > 0
+ { \__siunitx_number_round_places_decimal:nn }
+ { \__siunitx_number_round_places_integer:nn }
+ {#3} {#4}
+ \__siunitx_number_round_places_end:nn {#6} {#7}
}
}
- \int_compare:nNnTF {#3} = { 0 }
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
+ }
+\cs_new:Npn \__siunitx_number_round_places_end:nn #1#2 { { } \exp_not:n { {#1} {#2} } }
+\cs_new:Npn \__siunitx_number_round_places_decimal:nn #1#2
+ {
+ \int_compare:nNnTF
+ { \l__siunitx_number_round_precision_int - 0 \tl_count:n {#2} } > 0
+ {
+ \__siunitx_number_round_pad:nnn
+ { \l__siunitx_number_round_precision_int - 0 \tl_count:n {#2} }
+ {#1} {#2}
+ }
+ {
+ \__siunitx_number_round:fnn
+ {
+ \int_eval:n
+ { 0 \tl_count:n {#2} - \l__siunitx_number_round_precision_int }
+ }
+ {#1} {#2}
+ }
+ }
+\cs_new:Npn \__siunitx_number_round_places_integer:nn #1#2
+ {
+ \__siunitx_number_round:fnn
+ {
+ \int_eval:n
+ { 0 \tl_count:n {#2} - \l__siunitx_number_round_precision_int }
+ }
+ {#1} {#2}
+ }
+\cs_new:Npn \__siunitx_number_round_places_finalise:n #1
+ { \__siunitx_number_round_places_finalise:nnnnnnn #1 }
+\cs_new:Npn \__siunitx_number_round_places_finalise:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \bool_lazy_and:nnTF
+ { \str_if_eq_p:nn {#3} { 0 } }
{
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
+ \str_if_eq_p:ee
+ { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
}
{
- \prop_put:Nnn \l__siunitx_number_in_prop { exponent } { true }
- \int_compare:nNnTF {#3} > { 0 }
+ \tl_if_empty:NTF \l__siunitx_number_round_min_tl
{
- \int_set:Nn \l__siunitx_tmp_int {#3}
- \prop_put:NnV \l__siunitx_number_in_prop
- { exponent-integer } \l__siunitx_tmp_int
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
+ \exp_not:n { {#1} }
+ { \str_if_eq:nnF {#2} { - } { \exp_not:n {#2} } }
+ \exp_not:n { {#3} {#4} {#5} {#6} {#7} }
}
{
- \int_set:Nn \l__siunitx_tmp_int { 0 - (#3) }
- \prop_put:NnV \l__siunitx_number_in_prop
- { exponent-integer } \l__siunitx_tmp_int
- \prop_put:Nnn \l__siunitx_number_in_prop { exponent-sign }
- { - }
+ \exp_after:wN \__siunitx_number_round_places_finalise:nnnnn
+ \l__siunitx_number_round_min_tl {#2} {#6} {#7}
}
}
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
}
-\cs_new_protected:Npn
- \__siunitx_number_process_scientific_engineering:nnn #1#2#3
+\cs_new:Npn \__siunitx_number_round_places_finalise:nnnnn #1#2#3#4#5
{
- \use:c
- {
- __siunitx_number_process_scientific_engineering_
- \int_compare:nNnTF {#3} < { 0 }
+ {
+ \str_if_eq:nnTF {#3} { - }
+ { > }
+ { < }
+ }
+ \exp_not:n { {#3} {#1} {#2} { } {#4} {#5} }
+ }
+\cs_new:Npn \__siunitx_number_round_uncertainty:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \bool_lazy_or:nnTF
+ { \tl_if_blank_p:n {#5} }
+ { ! \int_compare_p:nNn \l__siunitx_number_round_precision_int > 0 }
+ { \exp_not:n { {#1} #2 {#3} {#4} { } #6 {#7} } }
{
- \int_case:nnF { \int_mod:nn { 0 - (#3) } { 3 } }
+ \str_if_eq:eeTF { \tl_head:n {#5} } { S }
{
- { 1 } { 2 }
- { 2 } { 1 }
+ \exp_not:n { {#1} {#2} }
+ \exp_args:Nnno \__siunitx_number_round_uncertainty:nnn
+ {#3} {#4} { \use_ii:nn #5 }
+ \exp_not:n { {#6} {#7} }
}
- { 0 }
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
}
- { \int_mod:nn {#3} { 3 } }
- :nnn
+ }
+\cs_new:Npn \__siunitx_number_round_uncertainty:nnn #1#2#3
+ {
+ \exp_last_unbraced:Nf \__siunitx_number_round_uncertainty:nnnnn
+ {
+ \__siunitx_number_round:fnn
+ { \tl_count:n {#3} - \l__siunitx_number_round_precision_int } { } {#3}
}
{#1} {#2} {#3}
}
-\cs_new_eq:cN
- { __siunitx_number_process_scientific_engineering_0:nnn }
- \__siunitx_number_process_scientific_store:nnn
-\cs_new_protected:cpn
- { __siunitx_number_process_scientific_engineering_1:nnn } #1#2#3
+\cs_new:Npn \__siunitx_number_round_uncertainty:nnnnn #1#2#3#4#5
{
- \tl_if_empty:nTF {#2}
+ \tl_if_blank:nTF {#1}
{
- \__siunitx_number_process_scientific_store:nnn { #1 0 } { }
- { #3 - 1 }
+ \__siunitx_number_round:fnn
+ { \tl_count:n {#5} - \tl_count:n {#2} } {#3} {#4}
+ { { S } {#2} }
}
{
- \use:c
- { __siunitx_number_process_scientific_engineering_1:nw }
- {#1} #2 \q_stop {#3}
+ \__siunitx_number_round:fnn
+ { \tl_count:n {#5} - \tl_count:n {#2} + 1 } {#3} {#4}
+ { { S } { #1 \__siunitx_number_round_truncate_direct:n {#2} } }
}
}
-\cs_new_protected:cpn
- { __siunitx_number_process_scientific_engineering_1:nw }
- #1#2#3 \q_stop #4
+\cs_new_protected:Npn \__siunitx_number_zero_decimal:NN #1#2
{
- \__siunitx_number_process_scientific_store:nnn
- {#1#2} {#3} { #4 - 1 }
+ \bool_if:NT \l__siunitx_number_drop_zero_decimal_bool
+ {
+ \tl_set:Nx #2
+ { \exp_after:wN \__siunitx_number_zero_decimal:nnnnnnn #1 }
+ }
+ }
+\cs_new:Npn \__siunitx_number_zero_decimal:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \exp_not:n { {#1} {#2} {#3} }
+ \str_if_eq:eeTF
+ { \exp_not:n {#4} }
+ { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
+ { { } }
+ { \exp_not:n { {#4} } }
+ \exp_not:n { {#5} {#6} {#7} }
+ }
+\cs_new:Npn \siunitx_number_adjust_exponent:nn #1#2
+ { \__siunitx_number_adjust_exp:nnnnnnnn #1 {#2} }
+\cs_new:Npn \siunitx_number_adjust_exponent:Nn #1#2
+ {
+ \tl_if_empty:NF #1
+ { \exp_args:NV \siunitx_number_adjust_exponent:nn #1 {#2} }
+ }
+\cs_new:Npn \__siunitx_number_adjust_exp:nnnnnnnn #1#2#3#4#5#6#7#8
+ {
+ \exp_not:n { {#1} {#2} {#3} {#4} {#5} }
+ \exp_args:Ne \__siunitx_number_adjust_exp:nn { \fp_eval:n { #6#7 + #8 } } {#6}
}
-\cs_new_protected:cpn
- { __siunitx_number_process_scientific_engineering_2:nnn } #1#2#3
+\cs_new:Npn \__siunitx_number_adjust_exp:nn #1#2
+ { \__siunitx_number_adjust_exp:nNw {#2} #1 \q_stop }
+\cs_new:Npn \__siunitx_number_adjust_exp:nNw #1#2#3 \q_stop
{
- \tl_if_empty:nTF {#2}
+ \token_if_eq_meaning:NNTF #2 -
+ { { - } { \exp_not:n {#3} } }
+ { { \str_if_eq:nnT {#1} { + } { + } } { \exp_not:n {#2#3} } }
+ }
+\tl_new:N \l__siunitx_number_bracket_close_tl
+\tl_new:N \l__siunitx_number_bracket_open_tl
+\tl_set:Nn \l__siunitx_number_bracket_open_tl { ( }
+\tl_set:Nn \l__siunitx_number_bracket_close_tl { ) }
+\bool_new:N \l_siunitx_number_bracket_ambiguous_bool
+\tl_new:N \l_siunitx_number_output_decimal_tl
+\keys_define:nn { siunitx }
+ {
+ bracket-ambiguous-numbers .bool_set:N =
+ \l_siunitx_number_bracket_ambiguous_bool ,
+ bracket-negative-numbers .bool_set:N =
+ \l__siunitx_number_bracket_negative_bool ,
+ exponent-base .tl_set:N =
+ \l__siunitx_number_exponent_base_tl ,
+ exponent-product .tl_set:N =
+ \l__siunitx_number_exponent_product_tl ,
+ group-digits .choice: ,
+ group-digits / all .code:n =
+ {
+ \bool_set_true:N \l__siunitx_number_group_decimal_bool
+ \bool_set_true:N \l__siunitx_number_group_integer_bool
+ } ,
+ group-digits / decimal .code:n =
+ {
+ \bool_set_true:N \l__siunitx_number_group_decimal_bool
+ \bool_set_false:N \l__siunitx_number_group_integer_bool
+ } ,
+ group-digits / integer .code:n =
+ {
+ \bool_set_false:N \l__siunitx_number_group_decimal_bool
+ \bool_set_true:N \l__siunitx_number_group_integer_bool
+ } ,
+ group-digits / none .code:n =
+ {
+ \bool_set_false:N \l__siunitx_number_group_decimal_bool
+ \bool_set_false:N \l__siunitx_number_group_integer_bool
+ } ,
+ group-digits .default:n = all ,
+ group-minimum-digits .int_set:N =
+ \l__siunitx_number_group_minimum_int ,
+ group-separator .tl_set:N =
+ \l__siunitx_number_group_separator_tl ,
+ negative-color .tl_set:N =
+ \l__siunitx_number_negative_color_tl ,
+ output-close-uncertainty .tl_set:N =
+ \l__siunitx_number_output_uncert_close_tl ,
+ output-decimal-marker .tl_set:N =
+ \l_siunitx_number_output_decimal_tl ,
+ output-open-uncertainty .tl_set:N =
+ \l__siunitx_number_output_uncert_open_tl ,
+ print-implicit-plus .bool_set:N =
+ \l__siunitx_number_implicit_plus_bool ,
+ print-unity-mantissa .bool_set:N =
+ \l__siunitx_number_unity_mantissa_bool ,
+ print-zero-exponent .bool_set:N =
+ \l__siunitx_number_zero_exponent_bool ,
+ tight-spacing .bool_set:N =
+ \l__siunitx_number_tight_bool ,
+ uncertainty-mode .choices:nn =
+ { compact , compact-marker , full , separate }
+ { \tl_set_eq:NN \l__siunitx_number_uncert_mode_tl \l_keys_choice_tl } ,
+ uncertainty-separator .tl_set:N =
+ \l__siunitx_number_uncert_separator_tl
+ }
+\bool_new:N \l__siunitx_number_group_decimal_bool
+\bool_new:N \l__siunitx_number_group_integer_bool
+\tl_new:N \l__siunitx_number_uncert_mode_tl
+\cs_new:Npn \siunitx_number_output:N #1
+ { \__siunitx_number_output:Nn #1 { } }
+\cs_new:Npn \siunitx_number_output:n #1
+ { \__siunitx_number_output:nn #1 { } }
+\cs_new:Npn \siunitx_number_output:NN #1#2
+ { \__siunitx_number_output:Nn #1 {#2} }
+\cs_new:Npn \siunitx_number_output:nN #1#2
+ { \__siunitx_number_output:nn #1 {#2} }
+\cs_new:Npn \__siunitx_number_output:Nn #1#2
+ {
+ \tl_if_empty:NF #1
+ { \exp_after:wN \__siunitx_number_output:nnnnnnn #1 {#2} }
+ }
+\cs_new:Npn \__siunitx_number_output:nn #1#2
+ {
+ \tl_if_empty:nF {#1}
+ { \__siunitx_number_output:nnnnnnn #1 {#2} }
+ }
+\cs_new:Npn \__siunitx_number_output:nnnnnnn #1#2#3#4#5#6#7#8
+ {
+ \__siunitx_number_output_comparator:nn {#1} {#8}
+ \__siunitx_number_output_bracket:nn {#5} {#7}
+ \__siunitx_number_output_sign:nnn {#1} {#2} {#8}
+ \__siunitx_number_output_integer:nnn {#3} {#4} {#7}
+ \__siunitx_number_output_decimal:nn {#4} {#8}
+ \__siunitx_number_output_uncertainty:nnn {#5} {#4} {#8}
+ \__siunitx_number_output_exponent:nnnn {#6} {#7} { #3 . #4 } {#8}
+ \__siunitx_number_output_end:
+ }
+\cs_new:Npn \__siunitx_number_output_bracket:nn #1#2
+ {
+ \bool_lazy_all:nT
+ {
+ { \str_if_eq_p:Vn \l__siunitx_number_uncert_mode_tl { separate } }
+ { \l_siunitx_number_bracket_ambiguous_bool }
+ { ! \tl_if_blank_p:n {#1} }
+ {
+ \bool_lazy_or_p:nn
+ { \l__siunitx_number_zero_exponent_bool }
+ { ! \str_if_eq_p:nn {#2} { 0 } }
+ }
+ }
+ \__siunitx_number_output_bracket:w
+ }
+\cs_new:Npn \__siunitx_number_output_bracket:w #1 \__siunitx_number_output_exponent:nnnn
+ {
+ \exp_not:V \l__siunitx_number_bracket_open_tl
+ #1
+ \exp_not:V \l__siunitx_number_bracket_close_tl
+ \__siunitx_number_output_exponent:nnnn
+ }
+\cs_new:Npn \__siunitx_number_output_comparator:nn #1#2
+ {
+ \tl_if_blank:nF {#1}
+ { \exp_not:n { \mathord {#1} } }
+ \exp_not:n {#2}
+ }
+\cs_new:Npn \__siunitx_number_output_sign:nnn #1#2#3
+ {
+ \tl_if_blank:nTF {#2}
{
- \__siunitx_number_process_scientific_store:nnn { #1 00 } { }
- { #3 - 2 }
+ \bool_if:NT \l__siunitx_number_implicit_plus_bool
+ { \__siunitx_number_output_sign:nN {#1} + }
}
{
- \use:c
- { __siunitx_number_process_scientific_engineering_2_i:nw }
- {#1} #2 \q_stop {#3}
+ \str_if_eq:nnTF {#2} { - }
+ {
+ \tl_if_empty:NF \l__siunitx_number_negative_color_tl
+ { \__siunitx_number_output_sign_color:w }
+ \bool_if:NTF \l__siunitx_number_bracket_negative_bool
+ { \__siunitx_number_output_sign_brackets:w }
+ { \__siunitx_number_output_sign:nN {#1} #2 }
+ }
+ { \__siunitx_number_output_sign:nN {#1} #2 }
}
+ \exp_not:n {#3}
}
-\cs_new_protected:cpn
- { __siunitx_number_process_scientific_engineering_2_i:nw }
- #1#2#3 \q_stop #4
+\cs_new:Npn \__siunitx_number_output_sign:nN #1#2
{
- \tl_if_empty:nTF {#3}
- {
- \__siunitx_number_process_scientific_store:nnn { #1#2 0 } { }
- { #4 - 2 }
- }
- {
- \use:c
- { __siunitx_number_process_scientific_engineering_2_ii:nw }
- {#1#2} #3 \q_stop {#4}
- }
+ \tl_if_blank:nTF {#1}
+ { \__siunitx_number_output_sign:N #2 }
+ { \exp_not:n { \mathord {#2} } }
}
-\cs_new_protected:cpn
- { __siunitx_number_process_scientific_engineering_2_ii:nw }
- #1#2#3 \q_stop #4
+\cs_new:Npn \__siunitx_number_output_sign:N #1
{
- \__siunitx_number_process_scientific_store:nnn { #1#2 } {#3}
- { #4 - 2 }
+ \bool_if:NTF \l__siunitx_number_tight_bool
+ { \exp_not:n { \mathord {#1} } }
+ { \exp_not:n {#1} }
}
-\cs_new_protected:Npn \__siunitx_number_process_sign: {
- \bool_if:NF \l__siunitx_process_plus_bool
- {
- \prop_if_in:NnTF \l__siunitx_number_in_prop { mantissa-sign }
- { \__siunitx_number_process_sign_plus:n { mantissa } }
- {
- \prop_if_in:NnT \l__siunitx_number_in_prop { complex-sign }
- {
- \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
- { \__siunitx_number_process_sign_plus:n { complex } }
- }
- }
- \prop_if_in:NnT \l__siunitx_number_in_prop { exponent-sign }
- { \__siunitx_number_process_sign_plus:n { exponent } }
- }
- \tl_if_empty:NF \l__siunitx_process_sign_tl
- {
- \__siunitx_number_process_sign_add:n { mantissa }
- \prop_if_in:NnTF \l__siunitx_number_in_prop { complex }
- { \__siunitx_number_process_sign_add:n { complex } }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_sign_add:n #1 {
- \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -sign }
- {
- \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -had-sign }
- {
- \prop_get:NnN \l__siunitx_number_in_prop {#1}
- \l__siunitx_tmpa_tl
- \tl_if_empty:NTF \l__siunitx_tmpa_tl
- {
- \prop_put:NnV \l__siunitx_number_in_prop { sign }
- \l__siunitx_process_sign_tl
- }
- {
- \prop_put:NnV \l__siunitx_number_in_prop { #1 -sign }
- \l__siunitx_process_sign_tl
- }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_sign_plus:n #1 {
- \prop_get:NnN \l__siunitx_number_in_prop { #1 -sign }
- \l__siunitx_tmpa_tl
- \tl_if_eq:NNT \c__siunitx_plus_tl \l__siunitx_tmpa_tl
- {
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -sign }
- \prop_put:Nnn \l__siunitx_number_in_prop { #1 -had-sign } { true }
- }
-}
-\tl_const:Nn \c__siunitx_plus_tl { + }
-\cs_new_protected:Npn \__siunitx_number_process_uncertainty: {
- \clist_map_function:nN { mantissa , complex }
- \__siunitx_number_process_uncertainty_aux:n
-}
-\cs_new_protected:Npn
- \__siunitx_number_process_uncertainty_aux:n #1 {
- \prop_if_in:NnT \l__siunitx_number_in_prop { #1 -uncertainty }
- {
- \prop_if_in:NnTF \l__siunitx_number_in_prop { #1 -decimal-marker }
- { \__siunitx_number_process_uncertainty_decimal:n {#1} }
- { \__siunitx_number_process_uncertainty_integer:n {#1} }
- }
-}
-\cs_new_protected:Npn
- \__siunitx_number_process_uncertainty_decimal:n #1 {
- \__siunitx_number_process_uncertainty_count:nn {#1} { decimal }
- \__siunitx_number_process_uncertainty_count:nn {#1} { uncertainty }
- \tl_clear:N \l__siunitx_uncertainty_decimal_tl
- \tl_clear:N \l__siunitx_uncertainty_integer_tl
- \int_compare:nNnTF
- { \l__siunitx_process_uncertainty_int } >
- { \l__siunitx_process_decimal_int }
- { \__siunitx_number_process_uncertainty_separate: }
- { \__siunitx_number_process_uncertainty_pad: }
- \tl_if_empty:NF \l__siunitx_uncertainty_integer_tl
- {
- \prop_put:NnV \l__siunitx_number_in_prop
- { #1 -uncertainty-integer }
- \l__siunitx_uncertainty_integer_tl
- }
- \prop_put:NnV \l__siunitx_number_in_prop { #1 -uncertainty-decimal }
- \l__siunitx_uncertainty_decimal_tl
- \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal-marker }
- \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_in_prop
- { #1 -uncertainty-decimal-marker } \l__siunitx_tmpa_tl
-}
-\cs_new_protected:Npn
- \__siunitx_number_process_uncertainty_count:nn #1#2 {
- \prop_get:NnN \l__siunitx_number_in_prop { #1 - #2 }
- \l__siunitx_tmpa_tl
- \int_set:cn { l__siunitx_process_ #2 _int }
- { \tl_count:N \l__siunitx_tmpa_tl }
-}
-\cs_new_protected:Npn \__siunitx_number_process_uncertainty_pad: {
- \int_while_do:nNnn
- { \l__siunitx_process_uncertainty_int } <
- { \l__siunitx_process_decimal_int }
- {
- \tl_put_right:Nn \l__siunitx_uncertainty_decimal_tl {0}
- \int_incr:N \l__siunitx_process_uncertainty_int
- }
- \tl_put_right:NV \l__siunitx_uncertainty_decimal_tl
- \l__siunitx_tmpa_tl
-}
-\cs_new_protected:Npn
- \__siunitx_number_process_uncertainty_separate: {
- \tl_map_function:NN \l__siunitx_tmpa_tl
- \__siunitx_number_process_uncertainty_separate_aux:N
-}
-\cs_new_protected:Npn
- \__siunitx_number_process_uncertainty_separate_aux:N #1 {
- \int_compare:nNnTF
- { \l__siunitx_process_uncertainty_int } >
- { \l__siunitx_process_decimal_int }
- { \tl_put_right:Nn \l__siunitx_uncertainty_integer_tl {#1} }
- { \tl_put_right:Nn \l__siunitx_uncertainty_decimal_tl {#1} }
- \int_decr:N \l__siunitx_process_uncertainty_int
-}
-\cs_new_protected:Npn
- \__siunitx_number_process_uncertainty_integer:n #1 {
- \prop_get:NnN \l__siunitx_number_in_prop { #1 -uncertainty }
- \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_in_prop { #1 -uncertainty-integer }
- \l__siunitx_tmpa_tl
-}
-\cs_new_protected:Npn \__siunitx_number_process_zero_fill: {
- \__siunitx_number_process_zero_fill_aux:n { integer }
- \__siunitx_number_process_zero_fill_aux:n { decimal }
-}
-\cs_new:Npn \__siunitx_number_process_zero_fill_aux:n #1 {
- \bool_if:cT { l__siunitx_process_ #1 _zero_bool }
- {
- \__siunitx_number_process_zero_fill_aux:nn { mantissa } {#1}
- \__siunitx_number_process_zero_fill_aux:nn { complex } {#1}
- \__siunitx_number_process_zero_fill_aux:nn { exponent } {#1}
- }
-}
-\cs_new_protected:Npn
- \__siunitx_number_process_zero_fill_aux:nn #1#2 {
- \prop_if_in:NnT \l__siunitx_number_in_prop { #1 -decimal-marker }
- {
- \prop_if_in:NnF \l__siunitx_number_in_prop { #1 - #2 }
- { \prop_put:Nnn \l__siunitx_number_in_prop { #1 - #2 } { 0 } }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_process_zero_to_integer:
+\cs_new:Npn
+ \__siunitx_number_output_sign_color:w #1 \__siunitx_number_output_end:
+ {
+ \exp_not:N \textcolor { \exp_not:V \l__siunitx_number_negative_color_tl }
+ {
+ #1
+ \__siunitx_number_output_end:
+ }
+ }
+\cs_new:Npn
+ \__siunitx_number_output_sign_brackets:w #1 \__siunitx_number_output_end:
+ {
+ \exp_not:V \l__siunitx_number_bracket_open_tl
+ #1
+ \exp_not:V \l__siunitx_number_bracket_close_tl
+ \__siunitx_number_output_end:
+ }
+\cs_new:Npn \__siunitx_number_output_integer:nnn #1#2#3
{
- \bool_if:NT \l__siunitx_zero_decimal_to_integer_bool
+ \bool_lazy_all:nF
{
- \__siunitx_number_process_zero_to_integer_aux:n { mantissa }
- \__siunitx_number_process_zero_to_integer_aux:n { complex }
+ { \str_if_eq_p:nn {#1} { 1 } }
+ { \tl_if_blank_p:n {#2} }
+ { ! \str_if_eq_p:nn {#3} { 0 } }
+ { ! \l__siunitx_number_unity_mantissa_bool }
}
+ { \__siunitx_number_output_digits:nn { integer } {#1} }
}
-\cs_new_protected:Npn \__siunitx_number_process_zero_to_integer_aux:n #1
+\cs_new:Npn \__siunitx_number_output_decimal:nn #1#2
{
- \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal } \l__siunitx_tmpa_tl
+ \exp_not:n {#2}
+ \tl_if_blank:nF {#1}
{
- \bool_set_true:N \l__siunitx_tmp_bool
- \tl_map_inline:Nn \l__siunitx_tmpa_tl
+ \str_if_eq:VnTF \l_siunitx_number_output_decimal_tl { , }
+ { \exp_not:N \mathord }
+ { \use:n }
+ { \exp_not:V \l_siunitx_number_output_decimal_tl }
+ }
+ \exp_not:n {#2}
+ \__siunitx_number_output_digits:nn { decimal } {#1}
+ }
+\cs_generate_variant:Nn \__siunitx_number_output_decimal:nn { f }
+\cs_new:Npn \__siunitx_number_output_digits:nn #1#2
+ {
+ \bool_if:cTF { l__siunitx_number_group_ #1 _ bool }
+ {
+ \int_compare:nNnTF
+ { \tl_count:n {#2} } < \l__siunitx_number_group_minimum_int
+ { \exp_not:n {#2} }
+ { \use:c { __siunitx_number_output_ #1 _aux:n } {#2} }
+ }
+ { \exp_not:n {#2} }
+ }
+\cs_new:Npn \__siunitx_number_output_integer_aux:n #1
+ {
+ \use:c
+ {
+ __siunitx_number_output_integer_aux_
+ \int_eval:n { \int_mod:nn { \tl_count:n {#1} } { 3 } }
+ :n
+ } {#1}
+ }
+\cs_new:cpn { __siunitx_number_output_integer_aux_0:n } #1
+ { \__siunitx_number_output_integer_first:nnNN #1 \q_nil }
+\cs_new:cpn { __siunitx_number_output_integer_aux_1:n } #1
+ { \__siunitx_number_output_integer_first:nnNN { } { } #1 \q_nil }
+\cs_new:cpn { __siunitx_number_output_integer_aux_2:n } #1
+ { \__siunitx_number_output_integer_first:nnNN { } #1 \q_nil }
+\cs_new:Npn \__siunitx_number_output_integer_first:nnNN #1#2#3#4
+ {
+ \exp_not:n {#1#2#3}
+ \quark_if_nil:NF #4
+ { \__siunitx_number_output_integer_loop:NNNN #4 }
+ }
+\cs_new:Npn \__siunitx_number_output_integer_loop:NNNN #1#2#3#4
+ {
+ \str_if_eq:VnTF \l__siunitx_number_group_separator_tl { , }
+ { \exp_not:N \mathord }
+ { \use:n }
+ { \exp_not:V \l__siunitx_number_group_separator_tl }
+ \exp_not:n {#1#2#3}
+ \quark_if_nil:NF #4
+ { \__siunitx_number_output_integer_loop:NNNN #4 }
+ }
+\cs_new:Npn \__siunitx_number_output_decimal_aux:n #1
+ {
+ \__siunitx_number_output_decimal_loop:NNNN \c_empty_tl
+ #1 \q_nil \q_nil \q_nil
+ }
+\cs_new:Npn \__siunitx_number_output_decimal_loop:NNNN #1#2#3#4
+ {
+ \quark_if_nil:NF #2
+ {
+ \exp_not:V #1
+ \exp_not:n {#2}
+ \quark_if_nil:NTF #3
+ { \use_none:n }
{
- \str_if_eq:nnF {##1} { 0 }
+ \exp_not:n {#3}
+ \quark_if_nil:NTF #4
+ { \use_none:nn }
{
- \bool_set_false:N \l__siunitx_tmp_bool
- \tl_map_break:
+ \exp_not:n {#4}
+ \__siunitx_number_output_decimal_loop:NNNN
+ \l__siunitx_number_group_separator_tl
}
}
- \bool_if:NT \l__siunitx_tmp_bool
- {
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker }
- }
}
}
-\cs_new_protected:Npn \__siunitx_number_exp_to_prefix:
+\cs_new:Npn \__siunitx_number_output_uncertainty:nnn #1#2#3
{
- \prop_set_eq:NN \l__siunitx_unit_prop \l__siunitx_unit_saved_prop
- \prop_get:NnNT \l__siunitx_number_in_prop { exponent-integer }
- \l__siunitx_tmpa_tl
+ \tl_if_blank:nTF {#1}
+ { \__siunitx_number_output_uncertainty_unaligned:n {#3} }
{
- \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
- \l__siunitx_tmpb_tl
- { \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
- \prop_if_in:NnT \l__siunitx_unit_prop { per-1 }
+ \use:c { __siunitx_number_output_uncert_ \tl_head:n {#1} :nnnw }
+ {#2} {#3} #1
+ }
+ }
+\cs_new:Npn \__siunitx_number_output_uncertainty_unaligned:n #1
+ { \exp_not:n { #1 #1 #1 #1 } }
+\cs_new:Npn \__siunitx_number_output_uncert_S:nnnw #1#2#3#4
+ {
+ \str_if_eq:VnTF \l__siunitx_number_uncert_mode_tl { separate }
+ {
+ \exp_not:n {#2}
+ \__siunitx_number_output_sign:N \pm
+ \exp_not:n {#2}
+ \__siunitx_number_output_uncert_S_aux:nnn
+ { \int_eval:n { \tl_count:n {#4} - \tl_count:n {#1} } }
+ {#4} {#2}
+ }
+ {
+ \exp_not:V \l__siunitx_number_uncert_separator_tl
+ \exp_not:V \l__siunitx_number_output_uncert_open_tl
+ \use:c { __siunitx_number_output_uncert_S_ \l__siunitx_number_uncert_mode_tl :nn } {#1} {#4}
+ \exp_not:V \l__siunitx_number_output_uncert_close_tl
+ \__siunitx_number_output_uncertainty_unaligned:n {#2}
+ }
+ }
+\cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnn #1#2#3
+ {
+ \int_compare:nNnTF {#1} > 0
+ {
+ \__siunitx_number_output_uncert_S_aux:fnnw
+ { \int_eval:n { #1 - 1 } }
+ {#3}
+ { }
+ #2 \q_nil
+ }
+ {
+ 0
+ \__siunitx_number_output_decimal:fn
{
- \tl_set:Nx \l__siunitx_tmpa_tl
- { \int_eval:n { - \l__siunitx_tmpa_tl } }
+ \prg_replicate:nn { \int_abs:n {#1} } { 0 }
+ #2
}
- \prop_get:NnNT \l__siunitx_unit_prop { prefix-1 } \l__siunitx_tmpb_tl
+ {#3}
+ }
+ }
+\cs_generate_variant:Nn \__siunitx_number_output_uncert_S_aux:nnn { f }
+\cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnnw #1#2#3#4
+ {
+ \quark_if_nil:NF #4
+ {
+ \int_compare:nNnTF {#1} = 0
+ { \__siunitx_number_output_uncert_S_aux:nnw {#3#4} {#2} }
{
- \prop_remove:Nn \l__siunitx_unit_prop { prefix-1 }
- \prop_remove:Nn \l__siunitx_unit_prop { prefix-symbol-1 }
- \prop_get:NVN \l__siunitx_prefix_forward_prop \l__siunitx_tmpb_tl
- \l__siunitx_tmpb_tl
- \tl_set:Nx \l__siunitx_tmpa_tl
- { \int_eval:n { \l__siunitx_tmpa_tl + \l__siunitx_tmpb_tl } }
+ \__siunitx_number_output_uncert_S_aux:fnnw
+ { \int_eval:n { #1 - 1 } }
+ {#2}
+ {#3#4}
}
- \prop_get:NnNT \l__siunitx_unit_prop { power-1 } \l__siunitx_tmpb_tl
+ }
+ }
+\cs_generate_variant:Nn \__siunitx_number_output_uncert_S_aux:nnnw { f }
+\cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnw #1#2#3 \q_nil
+ {
+ \__siunitx_number_output_digits:nn { integer } {#1}
+ \__siunitx_number_output_decimal:nn {#3} {#2}
+ }
+\cs_new:Npn \__siunitx_number_output_uncert_S_compact:nn #1#2
+ { \exp_not:n {#2} }
+\cs_new:cpn { __siunitx_number_output_uncert_S_compact-marker:nn } #1#2
+ {
+ \bool_lazy_or:nnTF
+ { \tl_if_blank_p:n {#1} }
+ { ! \int_compare_p:nNn { \tl_count:n {#2} } > { \tl_count:n {#1} } }
+ { \__siunitx_number_output_uncert_S_compact:nn }
+ { \__siunitx_number_output_uncert_S_full:nn }
+ {#1} {#2}
+ }
+\cs_new:Npn \__siunitx_number_output_uncert_S_full:nn #1#2
+ {
+ \__siunitx_number_output_uncert_S_aux:fnn
+ { \int_eval:n { \tl_count:n {#2} - \tl_count:n {#1} } }
+ {#2} { }
+ }
+\cs_new:Npn \__siunitx_number_output_exponent:nnnn #1#2#3#4
+ {
+ \exp_not:n {#4}
+ \bool_lazy_or:nnTF
+ { \l__siunitx_number_zero_exponent_bool }
+ { ! \str_if_eq_p:nn {#2} { 0 } }
+ {
+ \bool_lazy_and:nnTF
+ { \str_if_eq_p:nn {#3} { 1. } }
+ { ! \l__siunitx_number_unity_mantissa_bool }
+ { \exp_not:n {#4} }
{
- \tl_set:Nx \l__siunitx_tmpa_tl
- { \int_eval:n { \l__siunitx_tmpa_tl / \l__siunitx_tmpb_tl } }
+ \bool_if:NTF \l__siunitx_number_tight_bool
+ { \exp_not:N \mathord }
+ { \use:n }
+ { \exp_not:V \l__siunitx_number_exponent_product_tl }
+ \exp_not:n {#4}
}
- \prop_get:NVNTF \l__siunitx_prefix_reverse_prop \l__siunitx_tmpa_tl
- \l__siunitx_tmpb_tl
+ \exp_not:V \l__siunitx_number_exponent_base_tl
+ ^
{
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
- \use:c
+ \tl_if_blank:nTF {#1}
{
- __siunitx_ \exp_after:wN \token_to_str:N \l__siunitx_tmpb_tl
- _function:w
+ \bool_if:NT \l__siunitx_number_implicit_plus_bool
+ { \__siunitx_number_output_sign:N + }
}
- \prop_get:NnN \l__siunitx_unit_prop { total-units } \l__siunitx_tmpa_tl
- \int_set:Nn \l__siunitx_unit_int \l__siunitx_tmpa_tl
- \cs_set_eq:NN \__siunitx_pm: \pm
- \__siunitx_unit_format:
- \cs_set_eq:NN \pm \__siunitx_pm:
- }
- {
- \msg_error:nnx { siunitx } { non-convertible-exponent }
- { \l__siunitx_tmpa_tl }
- }
- }
- }
-\prop_new:N \l__siunitx_number_out_prop
-\tl_new:N \l__siunitx_group_sep_tl
-\tl_new:N \l__siunitx_output_decimal_tl
-\bool_new:N \l__siunitx_complex_after_bool
-\bool_new:N \l__siunitx_group_decimal_bool
-\bool_new:N \l__siunitx_group_integer_bool
-\keys_define:nn { siunitx } {
- bracket-negative-numbers .bool_set:N =
- \l__siunitx_negative_bracket_bool ,
- bracket-numbers .bool_set:N = \l__siunitx_brackets_bool,
- close-bracket .tl_set:N = \l__siunitx_bracket_close_tl,
- complex-root-position .choice:,
- complex-root-position
- / after-number .code:n =
- { \bool_set_true:N \l__siunitx_complex_after_bool } ,
- complex-root-position
- / before-number .code:n =
- { \bool_set_false:N \l__siunitx_complex_after_bool } ,
- copy-complex-root .bool_set:N =
- \l__siunitx_output_complex_copy_bool,
- copy-decimal-marker .bool_set:N =
- \l__siunitx_output_decimal_copy_bool,
- exponent-base .tl_set:N = \l__siunitx_exponent_base_tl,
- exponent-product .tl_set:N =
- \l__siunitx_exponent_product_tl,
- group-decimal-digits .meta:n = { group-digits = decimal },
- group-digits .choice: ,
- group-digits /
- decimal .code:n =
- {
- \bool_set_true:N \l__siunitx_group_decimal_bool
- \bool_set_false:N \l__siunitx_group_integer_bool
- },
- group-digits /
- false .code:n =
- {
- \bool_set_false:N \l__siunitx_group_decimal_bool
- \bool_set_false:N \l__siunitx_group_integer_bool
- },
- group-digits /
- integer .code:n =
- {
- \bool_set_false:N \l__siunitx_group_decimal_bool
- \bool_set_true:N \l__siunitx_group_integer_bool
- },
- group-digits /
- true .code:n =
- {
- \bool_set_true:N \l__siunitx_group_decimal_bool
- \bool_set_true:N \l__siunitx_group_integer_bool
- },
- group-digits .default:n = true ,
- group-four-digits .choice:,
- group-four-digits /
- false .meta:n = { group-minimum-digits = 5 },
- group-four-digits /
- true .meta:n = { group-minimum-digits = 4 },
- group-four-digits .default:n = true,
- group-integer-digits .meta:n = { group-digits = integer },
- group-minimum-digits .int_set:N = \l__siunitx_group_min_int,
- group-separator .code:n =
- { \tl_set:Nn \l__siunitx_group_sep_tl { {#1} } },
- negative-color .tl_set:N = \l__siunitx_negative_color_tl,
- open-bracket .tl_set:N = \l__siunitx_bracket_open_tl,
- output-close-uncertainty .tl_set:N =
- \l__siunitx_output_uncert_close_tl,
- output-complex-root .tl_set:N = \l__siunitx_output_complex_tl ,
- output-decimal-marker .code:n =
- { \tl_set:Nn \l__siunitx_output_decimal_tl { {#1} } },
- output-exponent-marker .tl_set:N = \l__siunitx_output_exponent_tl,
- output-open-uncertainty .tl_set:N =
- \l__siunitx_output_uncert_open_tl,
- separate-uncertainty .bool_set:N = \l__siunitx_uncert_sep_bool,
- tight-spacing .bool_set:N = \l__siunitx_tight_bool,
- uncertainty-separator .tl_set:N = \l__siunitx_uncert_sep_tl,
-}
-\keys_set:nn { siunitx }
+ { \__siunitx_number_output_sign:N #1 }
+ \__siunitx_number_output_digits:nn { integer } {#2}
+ }
+ }
+ { \exp_not:n {#4} }
+ }
+\cs_new:Npn \__siunitx_number_output_end: { }
+\tl_new:N \l__siunitx_number_valid_tl
+\prg_new_protected_conditional:Npnn \siunitx_if_number:n #1
+ { T , F , TF }
{
- bracket-numbers = true , % (
- close-bracket = ) ,
- complex-root-position = after-number ,
- copy-decimal-marker = false ,
- exponent-base = 10 ,
- exponent-product = \times ,
- group-digits = true ,
- group-minimum-digits = 5 ,
- group-separator = \, ,
- open-bracket = ( , % ) (
- output-close-uncertainty = ) ,
- output-complex-root = \ensuremath { \mathrm { i } } ,
- output-decimal-marker = . ,
- output-open-uncertainty = ( % )
- }
-\cs_new_protected:Npn \__siunitx_number_format: {
- \prop_if_empty:NF \l__siunitx_number_in_prop
- {
- \prop_clear:N \l__siunitx_number_out_prop
- \__siunitx_number_format_reassemble:
- \__siunitx_number_format_complex:
- \__siunitx_number_format_sign:n { mantissa }
- \__siunitx_number_format_sign:n { exponent }
- \__siunitx_number_format_relation:
- \__siunitx_number_format_color:
- \__siunitx_number_format_final:
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_brackets:n #1 {
- \bool_if:NT \l__siunitx_brackets_bool
- {
- \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -bracket }
- {
- \__siunitx_number_format_brackets_aux:n {#1}
- \prop_remove:Nn \l__siunitx_number_out_prop { #1 -bracket }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_brackets_aux:n #1 {
- \prop_get:NnNF \l__siunitx_number_out_prop { #1 -result }
- \l__siunitx_tmpa_tl
- {
- \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
- }
- \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_open_tl
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_close_tl
- \str_if_eq:nnTF {#1} { result }
- { \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl }
- {
- \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
- \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_color: {
- \tl_if_empty:NF \l__siunitx_negative_color_tl
- {
- \__siunitx_number_format_color_aux:n { mantissa-sign }
- \__siunitx_number_format_color_aux:n { sign }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_color_aux:n #1 {
- \prop_get:NnNT \l__siunitx_number_in_prop {#1} \l__siunitx_tmpa_tl
- {
- \str_if_eq:VnT \l__siunitx_tmpa_tl { - }
- {
- \prop_put:NnV \l__siunitx_number_out_prop { color }
- \l__siunitx_negative_color_tl
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_complex: {
- \prop_if_in:NnT \l__siunitx_number_in_prop { complex-root }
- {
- \prop_if_in:NnTF \l__siunitx_number_out_prop { complex }
- {
- \__siunitx_number_format_brackets:n { complex }
- \__siunitx_number_format_complex_aux:n { complex }
- \__siunitx_number_format_complex_aux:n { complex-result }
- \prop_if_in:NnT \l__siunitx_number_out_prop
- { complex-uncertainty }
- {
- \__siunitx_number_format_complex_aux:n
- { complex-uncertainty }
- }
- }
- {
- \prop_put:NnV \l__siunitx_number_out_prop { complex }
- \l__siunitx_output_complex_tl
- }
- \__siunitx_number_format_join_complex:
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_complex_aux:n #1 {
- \bool_if:NTF \l__siunitx_output_complex_copy_bool
- {
- \prop_get:NnN \l__siunitx_number_in_prop { complex-root }
- \l__siunitx_tmpa_tl
- }
- { \tl_set_eq:NN \l__siunitx_tmpa_tl \l__siunitx_output_complex_tl }
- \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
- \bool_if:NTF \l__siunitx_complex_after_bool
- { \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
- { \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
- \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
-}
-\cs_new_protected:Npn \__siunitx_number_format_copy:n #1 {
- \prop_get:NnN \l__siunitx_number_in_prop {#1} \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
-}
-\cs_new_protected:Npn \__siunitx_number_format_copy:nn #1#2 {
- \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_out_prop {#2} \l__siunitx_tmpa_tl
-}
-\cs_new_protected:Npn \__siunitx_number_format_final: {
- \prop_if_in:NnT \l__siunitx_number_out_prop { complex }
- {
- \prop_if_in:NnF \l__siunitx_number_out_prop { mantissa-result }
- {
- \__siunitx_number_format_copy:nn { complex }
- { mantissa-result }
- }
- }
- \prop_if_in:NnTF \l__siunitx_number_out_prop { exponent }
- {
- \__siunitx_number_format_final_exponent:
- \prop_if_in:NnTF \l__siunitx_number_out_prop { mantissa-result }
- { \__siunitx_number_format_final_combined: }
- { \__siunitx_number_format_final_exponent_only: }
- }
- { \__siunitx_number_format_copy:nn { mantissa-result } { result } }
- \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-bracket }
- {
- \prop_put:Nnn \l__siunitx_number_out_prop { result-bracket }
- { true }
- \prop_remove:Nn \l__siunitx_number_out_prop { mantissa-bracket }
- }
- \prop_if_in:NnT \l__siunitx_number_out_prop { comparator }
- {
- \__siunitx_number_format_brackets:n { result }
- \prop_get:NnN \l__siunitx_number_out_prop { comparator }
- \l__siunitx_tmpa_tl
- \prop_get:NnN \l__siunitx_number_out_prop { result }
- \l__siunitx_tmpb_tl
- \tl_set:Nx \l__siunitx_tmpa_tl
- {
- \exp_not:N \mathord
- \exp_not:V \l__siunitx_tmpa_tl
- \exp_not:V \l__siunitx_tmpb_tl
- }
- \prop_put:NnV \l__siunitx_number_out_prop { result }
- \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_final_combined: {
- \__siunitx_number_format_brackets:n { mantissa }
- \prop_get:NnN \l__siunitx_number_out_prop { mantissa-result }
- \l__siunitx_tmpa_tl
- \tl_if_empty:NT \l__siunitx_output_exponent_tl
- {
- \tl_put_right:Nx \l__siunitx_tmpa_tl
- {
- \exp_not:N \ensuremath
- {
- \bool_if:NTF \l__siunitx_tight_bool
- { { \exp_not:V \l__siunitx_exponent_product_tl } }
- { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
- }
- }
- }
- \prop_get:NnN \l__siunitx_number_out_prop { exponent-result }
- \l__siunitx_tmpb_tl
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \prop_put:NnV \l__siunitx_number_out_prop { result }
- \l__siunitx_tmpa_tl
- \prop_put:Nnn \l__siunitx_number_out_prop
- { result-bracket-exponent } { true }
-}
-\cs_new_protected:Npn \__siunitx_number_format_final_exponent: {
- \prop_get:NnN \l__siunitx_number_out_prop { exponent }
- \l__siunitx_tmpa_tl
- \tl_if_empty:NTF \l__siunitx_output_exponent_tl
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { ^ { \exp_not:V \l__siunitx_tmpa_tl } }
- \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_exponent_base_tl
- }
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
+ \group_begin:
+ \bool_set_true:N \l__siunitx_number_validate_bool
+ \bool_set_true:N \l_siunitx_number_parse_bool
+ \siunitx_number_parse:nN {#1} \l__siunitx_number_parsed_tl
+ \tl_if_empty:NTF \l__siunitx_number_parsed_tl
{
- \exp_not:V \l__siunitx_output_exponent_tl
- \exp_not:N \mathord
- \exp_not:V \l__siunitx_tmpa_tl
+ \group_end:
+ \prg_return_false:
}
- }
- \prop_put:NnV \l__siunitx_number_out_prop { exponent-result }
- \l__siunitx_tmpa_tl
-}
-\cs_new_protected:Npn
- \__siunitx_number_format_final_exponent_only: {
- \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign }
- \l__siunitx_tmpa_tl
- {
- \prop_get:NnN \l__siunitx_number_out_prop { exponent-result }
- \l__siunitx_tmpb_tl
- \__siunitx_tl_put_left_math:NV \l__siunitx_tmpb_tl
- \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_out_prop { exponent-result }
- \l__siunitx_tmpb_tl
- }
- \__siunitx_number_format_copy:nn { exponent-result } { result }
-}
-\cs_new_protected:Npn \__siunitx_number_format_group:n #1 {
- \__siunitx_number_format_group_aux:nn {#1} { integer }
- \__siunitx_number_format_group_aux:nn {#1} { decimal }
- \prop_if_in:NnTF \l__siunitx_number_out_prop { #1 -integer }
- { \__siunitx_number_format_copy:nn { #1 -integer } {#1} }
- { \tl_clear:N \l__siunitx_tmpa_tl }
- \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal-marker }
- \l__siunitx_tmpb_tl
- {
- \bool_if:NTF \l__siunitx_output_decimal_copy_bool
- { \tl_set:Nx \l__siunitx_tmpb_tl { { \l__siunitx_tmpb_tl } } }
{
- \tl_set_eq:NN \l__siunitx_tmpb_tl
- \l__siunitx_output_decimal_tl
+ \group_end:
+ \prg_return_true:
}
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \prop_put:NnV \l__siunitx_number_out_prop { #1 -decimal-marker }
- \l__siunitx_tmpb_tl
- \prop_get:NnNF \l__siunitx_number_out_prop { #1 -decimal }
- \l__siunitx_tmpb_tl
- { \tl_clear:N \l__siunitx_tmpb_tl }
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_group_aux:nn #1#2 {
- \prop_if_in:NnT \l__siunitx_number_in_prop { #1 - #2 }
- {
- \bool_if:cTF { l__siunitx_group_ #2 _bool }
- { \__siunitx_number_format_group:nn {#1} {#2} }
- { \__siunitx_number_format_copy:n { #1 - #2 } }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_group:nn #1#2
+ }
+\prg_new_conditional:Npnn \siunitx_if_number_token:N #1
+ { p , T , F , TF }
+ {
+ \__siunitx_number_token_auxi:NN #1
+ \l_siunitx_number_input_decimal_tl
+ \l__siunitx_number_input_uncert_close_tl
+ \l_siunitx_number_input_comparator_tl
+ \l__siunitx_number_input_digit_tl
+ \l_siunitx_number_input_exponent_tl
+ \l__siunitx_number_input_ignore_tl
+ \l__siunitx_number_input_uncert_open_tl
+ \l_siunitx_number_input_sign_tl
+ \l__siunitx_number_input_uncert_sign_tl
+ \q_recursion_tail
+ \q_recursion_stop
+ }
+\cs_new:Npn \__siunitx_number_token_auxi:NN #1#2
{
- \prop_get:NnN \l__siunitx_number_in_prop { #1 - #2 } \l__siunitx_tmpa_tl
- \int_compare:nNnTF
- { \tl_count:N \l__siunitx_tmpa_tl } < \l__siunitx_group_min_int
- { \__siunitx_number_format_copy:n { #1 - #2 } }
+ \quark_if_recursion_tail_stop_do:Nn #2 { \prg_return_false: }
+ \__siunitx_number_token_auxii:NN #1 #2
+ \__siunitx_number_token_auxi:NN #1
+ }
+\cs_new:Npn \__siunitx_number_token_auxii:NN #1#2
+ {
+ \exp_after:wN \__siunitx_number_token_auxiii:NN \exp_after:wN #1
+ #2 \q_recursion_tail \q_recursion_stop
+ }
+\cs_new:Npn \__siunitx_number_token_auxiii:NN #1#2
+ {
+ \quark_if_recursion_tail_stop:N #2
+ \str_if_eq:nnT {#1} {#2}
{
- \tl_clear:N \l__siunitx_tmpb_tl
- \use:c { __siunitx_number_format_group_ #2 : }
- \prop_put:NnV \l__siunitx_number_out_prop { #1 - #2 } \l__siunitx_tmpb_tl
+ \use_i_delimit_by_q_recursion_stop:nw
+ {
+ \use_i_delimit_by_q_recursion_stop:nw
+ { \prg_return_true: }
+ }
}
+ \__siunitx_number_token_auxiii:NN #1
}
-\cs_new_protected:Npn \__siunitx_number_format_group_decimal: {
- \tl_if_empty:NF \l__siunitx_tmpa_tl
- {
- \exp_after:wN \__siunitx_number_format_group_decimal_aux:NNNN
- \l__siunitx_tmpa_tl { } { } { }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_group_decimal_aux:NNNN
- #1#2#3#4 {
- \tl_if_empty:nTF {#2}
- { \tl_put_right:Nn \l__siunitx_tmpb_tl {#1} }
- {
- \tl_if_empty:nTF {#3}
- { \tl_put_right:Nn \l__siunitx_tmpb_tl { #1 #2 } }
+\msg_new:nnnn { siunitx } { invalid-number }
+ { Invalid~number~'#1'. }
+ {
+ The~input~'#1'~could~not~be~parsed~as~a~number~following~the~
+ format~defined~in~module~documentation.
+ }
+\keys_set:nn { siunitx }
+ {
+ bracket-ambiguous-numbers = true ,
+ bracket-negative-numbers = false ,
+ drop-exponent = false ,
+ drop-uncertainty = false ,
+ drop-zero-decimal = false ,
+ evaluate-expression = false ,
+ exponent-base = 10 ,
+ exponent-mode = input ,
+ exponent-product = \times ,
+ expression = #1 ,
+ fixed-exponent = 0 ,
+ group-digits = all ,
+ group-minimum-digits = 4 ,
+ group-separator = \, , % (
+ input-close-uncertainty = ) ,
+ input-comparators = { <=>\approx\ge\geq\gg\le\leq\ll\sim } ,
+ input-decimal-markers = { ., } ,
+ input-digits = 0123456789 ,
+ input-exponent-markers = dDeE ,
+ input-ignore = \, ,
+ input-open-uncertainty = ( , % )
+ input-signs = +-\mp\pm ,
+ input-uncertainty-signs = \pm ,
+ minimum-decimal-digits = 0 ,
+ minimum-integer-digits = 0 ,
+ negative-color = , % (
+ output-close-uncertainty = ) ,
+ output-decimal-marker = . ,
+ output-open-uncertainty = ( , % )
+ parse-numbers = true ,
+ print-implicit-plus = false ,
+ print-unity-mantissa = true ,
+ print-zero-exponent = false ,
+ retain-explicit-plus = false ,
+ retain-zero-uncertainty = false ,
+ round-half = up ,
+ round-minimum = 0 ,
+ round-mode = none ,
+ round-pad = true ,
+ round-precision = 2 ,
+ tight-spacing = false ,
+ uncertainty-mode = compact ,
+ uncertainty-separator =
+ }
+\RequirePackage { amstext }
+\RequirePackage { color }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { NV }
+\box_new:N \l__siunitx_print_tmp_box
+\tl_new:N \l__siunitx_print_tmp_tl
+\IfFormatAtLeastTF { 2020-10-01 }
+ { \hook_gput_code:nnn { begindocument/end } { siunitx } }
+ { \tl_put_right:Nn \document }
+ {
+ \__siunitx_print_store_fam:n { rm }
+ \__siunitx_print_store_fam:n { sf }
+ \__siunitx_print_store_fam:n { tt }
+ }
+\IfFormatAtLeastTF { 2020-10-01 }
+ { }
+ { \tl_put_right:Nn \document { \ignorespaces } }
+\cs_new_protected:Npn \__siunitx_print_store_fam:n #1
+ {
+ \group_begin:
+ \hbox_set:Nn \l__siunitx_print_tmp_box
{
- \tl_put_right:Nn \l__siunitx_tmpb_tl { #1 #2 #3 }
- \tl_if_empty:nF {#4}
+ \ensuremath
{
- \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_group_sep_tl
- \__siunitx_number_format_group_decimal_aux:NNNN #4
+ \use:c { math #1 }
+ { \int_const:cn { c__siunitx_print_math #1 _int } { \fam } }
}
}
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_group_integer: {
- \tl_if_empty:NF \l__siunitx_tmpa_tl
- {
- \__siunitx_number_format_group_integer_setup:V \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_group_integer_setup:n #1 {
- \__siunitx_number_format_group_integer_setup_aux:NNNN
- { } #1 { } { } { }
-}
-\cs_generate_variant:Nn \__siunitx_number_format_group_integer_setup:n
- { V }
-\cs_new_protected:Npn
- \__siunitx_number_format_group_integer_setup_aux:NNNN #1#2#3#4 {
- \tl_if_empty:nTF {#2}
- { \__siunitx_number_format_group_integer_aux:NNNN #1 \q_nil }
- {
- \tl_if_empty:nTF {#3}
- {
- \__siunitx_number_format_group_integer_aux:NNNN { } { } #1#2
- \q_nil
- }
+ \group_end:
+ }
+\tl_new:N \l__siunitx_print_number_mode_tl
+\tl_new:N \l__siunitx_print_unit_mode_tl
+\keys_define:nn { siunitx }
+ {
+ color .meta:n =
+ { number-color = #1 , unit-color = #1 } ,
+ mode .meta:n =
+ { number-mode = #1 , unit-mode = #1 } ,
+ number-color .tl_set:N =
+ \l__siunitx_print_number_color_tl ,
+ number-mode .choices:nn =
+ { match , math , text }
+ {
+ \tl_set_eq:NN
+ \l__siunitx_print_number_mode_tl \l_keys_choice_tl
+ } ,
+ propagate-math-font .bool_set:N =
+ \l__siunitx_print_math_font_bool ,
+ reset-math-version .bool_set:N =
+ \l__siunitx_print_math_version_bool ,
+ reset-text-family .bool_set:N =
+ \l__siunitx_print_text_family_bool ,
+ reset-text-series .bool_set:N =
+ \l__siunitx_print_text_series_bool ,
+ reset-text-shape .bool_set:N =
+ \l__siunitx_print_text_shape_bool ,
+ text-family-to-math .bool_set:N =
+ \l__siunitx_print_math_family_bool ,
+ text-font-command .tl_set:N =
+ \l__siunitx_print_text_font_tl ,
+ text-series-to-math .bool_set:N =
+ \l__siunitx_print_math_weight_bool ,
+ unit-color .tl_set:N =
+ \l__siunitx_print_unit_color_tl ,
+ unit-mode .choices:nn =
+ { match , math , text }
+ {
+ \tl_set_eq:NN
+ \l__siunitx_print_unit_mode_tl \l_keys_choice_tl
+ }
+ }
+\keys_define:nn { siunitx / series-version-mapping }
+ {
+ ul . tl_set:N = \l__siunitx_print_version_ul_tl ,
+ el . tl_set:N = \l__siunitx_print_version_el_tl ,
+ l . tl_set:N = \l__siunitx_print_version_l_tl ,
+ sl . tl_set:N = \l__siunitx_print_version_sl_tl ,
+ m . tl_set:N = \l__siunitx_print_version_m_tl ,
+ sb . tl_set:N = \l__siunitx_print_version_sb_tl ,
+ b . tl_set:N = \l__siunitx_print_version_b_tl ,
+ eb . tl_set:N = \l__siunitx_print_version_eb_tl ,
+ ub . tl_set:N = \l__siunitx_print_version_ub_tl
+ }
+\cs_new_protected:Npn \siunitx_print_number:n #1
+ { \__siunitx_print_aux:nn { number } {#1} }
+\cs_generate_variant:Nn \siunitx_print_number:n { V , x }
+\cs_new_protected:Npn \siunitx_print_unit:n #1
+ { \__siunitx_print_aux:nn { unit } {#1} }
+\cs_generate_variant:Nn \siunitx_print_unit:n { V , x }
+\cs_new_protected:Npn \__siunitx_print_aux:nn #1#2
+ {
+ \tl_if_empty:cTF { l__siunitx_print_ #1 _color_tl }
+ { \use:n }
+ { \exp_args:Nv \textcolor { l__siunitx_print_ #1 _color_tl } }
{
- \tl_if_empty:nTF {#4}
- {
- \__siunitx_number_format_group_integer_aux:NNNN { } #1#2#3
- \q_nil
- }
+ \use:c
{
- \__siunitx_number_format_group_integer_setup_aux:NNNN
- {#1#2#3#4}
+ siunitx_print_
+ \tl_use:c { l__siunitx_print_ #1 _mode_tl } :n
}
+ {#2}
}
- }
-}
-\cs_new_protected:Npn
- \__siunitx_number_format_group_integer_aux:NNNN #1#2#3#4 {
- \tl_put_right:Nn \l__siunitx_tmpb_tl {#1#2#3}
- \quark_if_nil:nF {#4}
- {
- \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_group_sep_tl
- \__siunitx_number_format_group_integer_aux:NNNN #4
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_join_complex: {
- \__siunitx_number_format_sign_complex:
- \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
- {
- \__siunitx_number_format_brackets:n { mantissa }
- \prop_get:NnN \l__siunitx_number_out_prop { mantissa-result }
- \l__siunitx_tmpa_tl
- \prop_get:NnNF \l__siunitx_number_out_prop { complex-result }
- \l__siunitx_tmpb_tl
- {
- \prop_get:NnN \l__siunitx_number_out_prop { complex }
- \l__siunitx_tmpb_tl
- }
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \prop_put:NnV \l__siunitx_number_out_prop { mantissa-result }
- \l__siunitx_tmpa_tl
- \prop_put:Nnn \l__siunitx_number_out_prop { mantissa-bracket }
- { true }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_join_uncert: {
- \__siunitx_number_format_join_uncert:n { mantissa }
- \__siunitx_number_format_join_uncert:n { complex }
-}
-\cs_new_protected:Npn \__siunitx_number_format_join_uncert:n #1 {
- \prop_get:NnNT \l__siunitx_number_out_prop {#1}
- \l__siunitx_tmpa_tl
- {
- \prop_get:NnNTF \l__siunitx_number_out_prop { #1 -uncertainty }
- \l__siunitx_tmpb_tl
- {
- \bool_if:NT \l__siunitx_uncert_sep_bool
- { \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpb_tl }
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
- \l__siunitx_tmpa_tl
- \prop_put:Nnn \l__siunitx_number_out_prop { #1 -bracket }
- { true }
- }
- { \__siunitx_number_format_copy:nn {#1} { #1 -result } }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_join_uncert_pm:N #1
+ }
+\cs_new_protected:Npn \siunitx_print_match:n #1
{
- \bool_if:NTF \l__siunitx_tight_bool
- { \tl_put_left:Nn #1 { \ensuremath { { \pm } } } }
- { \tl_put_left:Nn #1 { \ensuremath { { } \pm { } } } }
+ \mode_if_math:TF
+ { \siunitx_print_math:n {#1} }
+ { \siunitx_print_text:n {#1} }
}
-\cs_new_protected:Npn \__siunitx_number_format_reassemble: {
- \prop_if_in:NnT \l__siunitx_number_in_prop { mantissa }
- {
- \__siunitx_number_format_group:n { mantissa }
- \__siunitx_number_format_uncertainty:n { mantissa }
- }
- \prop_if_in:NnT \l__siunitx_number_in_prop { complex }
- {
- \__siunitx_number_format_group:n { complex }
- \__siunitx_number_format_uncertainty:n { complex }
- }
- \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
- { \__siunitx_number_format_group:n { exponent } }
-}
-\cs_new_protected:Npn \__siunitx_number_format_relation: {
- \prop_get:NnNT \l__siunitx_number_in_prop { comparator }
- \l__siunitx_tmpa_tl
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- {
- \exp_not:N \ensuremath
- { \exp_not:V \l__siunitx_tmpa_tl }
- }
- \prop_put:NnV \l__siunitx_number_out_prop { comparator }
- \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_sign:n #1 {
- \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
- {
- \prop_get:NnNT \l__siunitx_number_in_prop { #1 -sign }
- \l__siunitx_tmpa_tl
- {
- \bool_if:NTF \l__siunitx_negative_bracket_bool
- {
- \str_if_eq:VnTF \l__siunitx_tmpa_tl { - }
- { \__siunitx_number_format_sign_negative_brackets:n {#1} }
- { \__siunitx_number_format_sign_aux:n {#1} }
- }
- { \__siunitx_number_format_sign_aux:n {#1} }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_sign_aux:n #1 {
- \tl_clear:N \l__siunitx_tmpb_tl
- \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_out_prop { #1 -sign }
- \l__siunitx_tmpb_tl
- \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
- \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
- \prop_get:NnNT \l__siunitx_number_out_prop { #1 -result }
- \l__siunitx_tmpa_tl
- {
- \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
- \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn
- \__siunitx_number_format_sign_negative_brackets:n #1
+\cs_new_protected:Npn \__siunitx_print_replace_font:N #1
{
- \__siunitx_number_format_brackets_aux:n {#1}
- \prop_get:NnNT \l__siunitx_number_out_prop { #1 }
- \l__siunitx_tmpa_tl
+ \tl_if_empty:NF \l_siunitx_unit_font_tl
{
- \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_open_tl
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_close_tl
- \prop_put:NnV \l__siunitx_number_out_prop { #1 }
- \l__siunitx_tmpa_tl
+ \tl_replace_all:NVn #1
+ \l_siunitx_unit_font_tl
+ { \use:n }
}
}
-\cs_new_protected:Npn \__siunitx_number_format_sign_complex: {
- \__siunitx_number_format_sign_complex:n { complex }
- \__siunitx_number_format_sign_complex:n { complex-result }
-}
-\cs_new_protected:Npn \__siunitx_number_format_sign_complex:n #1 {
- \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
- {
- \prop_get:NnNT \l__siunitx_number_in_prop { complex-sign }
- \l__siunitx_tmpa_tl
- {
- \bool_if:NTF \l__siunitx_tight_bool
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { \exp_not:N \mathord \exp_not:V \l__siunitx_tmpa_tl }
- }
- {
- \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { { } \exp_not:V \l__siunitx_tmpa_tl { } }
- }
- }
- \tl_clear:N \l__siunitx_tmpb_tl
- \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_out_prop { complex-sign }
- \l__siunitx_tmpb_tl
- \prop_get:NnN \l__siunitx_number_out_prop {#1}
- \l__siunitx_tmpa_tl
- \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \prop_put:NnV \l__siunitx_number_out_prop {#1}
- \l__siunitx_tmpa_tl
+\clist_map_inline:nn { uc , ec , c , sc , sx , x , ex , ux }
+ { \tl_const:cn { c__siunitx_print_weight_ #1 _tl } { m } }
+\clist_map_inline:nn { l , m , b }
+ { \tl_const:cn { c__siunitx_print_weight_ #1 _tl } { #1 } }
+\cs_new_protected:Npn \siunitx_print_math:n #1
+ {
+ \bool_if:NTF \l__siunitx_print_math_weight_bool
+ {
+ \tl_set:Nx \l__siunitx_print_tmp_tl
+ { \exp_after:wN \__siunitx_print_extract_series:Nw \f@series ? \q_stop }
+ \tl_if_empty:NTF \l__siunitx_print_tmp_tl
+ { \__siunitx_print_math_auxi:n {#1} }
+ { \__siunitx_print_math_version:Vn \l__siunitx_print_tmp_tl {#1} }
}
- }
-}
-\cs_new_protected:Npn \__siunitx_number_format_uncertainty:n #1 {
- \prop_if_in:NnTF \l__siunitx_number_in_prop { #1 -uncertainty }
- {
- \bool_if:NTF \l__siunitx_uncert_sep_bool
- { \__siunitx_number_format_uncertainty_sep:n {#1} }
- { \__siunitx_number_format_uncertainty_joined:n {#1} }
- \__siunitx_number_format_join_uncert:
- }
- { \__siunitx_number_format_copy:nn {#1} { #1 -result } }
-}
-\cs_new_protected:Npn
- \__siunitx_number_format_uncertainty_joined:n #1 {
- \prop_get:NnN \l__siunitx_number_in_prop { #1 -uncertainty }
- \l__siunitx_tmpa_tl
- \prop_remove:Nn \l__siunitx_number_in_prop { #1 -uncertainty }
- \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_output_uncert_open_tl
- \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_uncert_sep_tl
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_output_uncert_close_tl
- \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
- \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
- \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
-}
-\cs_new_protected:Npn
- \__siunitx_number_format_uncertainty_sep:n #1 {
- \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -integer }
- {
- \prop_if_in:NnF \l__siunitx_number_out_prop
- { #1 -uncertainty-integer }
- {
- \prop_put:Nnn \l__siunitx_number_out_prop
- { #1 -uncertainty-integer } { 0 }
- }
- }
- \__siunitx_number_format_group:n { #1 -uncertainty }
- \prop_put:NnV \l__siunitx_number_out_prop { #1 -uncertainty }
- \l__siunitx_tmpa_tl
-}
-\tl_new:N \l__siunitx_number_out_tl
-\tl_new:N \l__siunitx_number_out_saved_tl
-\tl_new:N \l__siunitx_number_fraction_tl
-\bool_new:N \l__siunitx_number_compound_bool
-\tl_new:N \l__siunitx_quotient_mode_tl
-\cs_new_protected:Npn \__siunitx_fraction:nn { }
-\keys_define:nn { siunitx } {
- fraction-function .code:n =
- { \cs_set_protected:Npn \__siunitx_fraction:nn {#1} },
- output-product .tl_set:N = \l__siunitx_output_product_tl,
- output-quotient .tl_set:N = \l__siunitx_output_quotient_tl,
- parse-numbers .bool_set:N = \l__siunitx_number_parse_bool,
- quotient-mode .choice:,
- quotient-mode / fraction .code:n =
- { \tl_set:Nn \l__siunitx_quotient_mode_tl { fraction } },
- quotient-mode / symbol .code:n =
- { \tl_set:Nn \l__siunitx_quotient_mode_tl { symbol } },
-}
-\keys_set:nn { siunitx } {
- fraction-function = \frac ,
- output-product = \times ,
- output-quotient = / ,
- parse-numbers = true ,
- quotient-mode = symbol
-}
-\cs_new_protected:Npn \__siunitx_number_output:n #1 {
- \tl_clear:N \l__siunitx_unit_tl
- \tl_clear:N \l__siunitx_preunit_tl
- \__siunitx_combined_output:n {#1}
-}
-\cs_generate_variant:Nn \__siunitx_number_output:n { V }
-\cs_new_protected:Npn \__siunitx_number_output_bracket: {
- \bool_if:NF \l__siunitx_error_bool
- {
- \bool_if:NT \l__siunitx_number_compound_bool
- { \__siunitx_number_format_brackets:n { result } }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_output_color: {
- \prop_if_in:NnT \l__siunitx_number_out_prop { color }
- {
- \prop_get:NnN \l__siunitx_number_out_prop { color }
- \l__siunitx_number_color_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_number_output_parse:n #1 {
- \__siunitx_number_preprocess:n {#1}
- \bool_if:NF \l__siunitx_error_bool
- {
- \tl_if_empty:NTF \l__siunitx_number_multi_tl
- { \__siunitx_number_output_parse_aux: }
- {
- \use:c
- { __siunitx_number_output_ \l__siunitx_number_multi_tl : }
- }
- }
-}
-\cs_generate_variant:Nn \__siunitx_number_output_parse:n { V }
-\cs_new_protected:Npn \__siunitx_number_output_parse_aux: {
- \__siunitx_number_in_parse:V \l__siunitx_number_arg_tl
- \bool_if:NF \l__siunitx_error_bool
- {
- \__siunitx_number_process:
- \__siunitx_number_format:
- \__siunitx_number_output_color:
- \bool_if:NTF \l__siunitx_brackets_bool
- { \__siunitx_number_output_single: }
- {
- \prop_if_in:NnTF \l__siunitx_number_out_prop
- { result-bracket }
- { \__siunitx_number_output_parts: }
- { \__siunitx_number_output_single: }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_output_parts: {
- \bool_lazy_and:nnTF
- { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
- { \tl_if_empty_p:N \l__siunitx_unit_tl }
- { \__siunitx_number_output_single: }
- { \__siunitx_number_output_parts_aux: }
-}
-\cs_new_protected:Npn \__siunitx_number_output_parts_aux: {
- \bool_if:NTF \l__siunitx_multi_repeat_bool
- {
- \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-result }
- {
- \__siunitx_number_output_parts_aux:n { mantissa }
- \__siunitx_number_output_parts_aux:n { complex }
- }
- \prop_get:NnNT \l__siunitx_number_out_prop { exponent-result }
- \l__siunitx_tmpa_tl
- {
- \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-result }
- {
- \tl_put_left:Nx \l__siunitx_tmpa_tl
- {
- \exp_not:N \ensuremath
- {
- \bool_if:NTF \l__siunitx_tight_bool
- { { \exp_not:V \l__siunitx_exponent_product_tl } }
- { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
- }
- }
- \prop_put:NnV \l__siunitx_number_out_prop { exponent }
- \l__siunitx_tmpa_tl
- }
- \__siunitx_number_output_parts_print:n { exponent }
- }
- }
- { \__siunitx_number_output_single: }
-}
-\cs_new_protected:Npn \__siunitx_number_output_parts_aux:n #1 {
- \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
- { \__siunitx_number_output_parts_print:n {#1} }
- \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -uncertainty }
- {
- \bool_if:NTF \l__siunitx_tight_bool
- { \__siunitx_print:nn { number } { \ensuremath { { \pm } } } }
- { \__siunitx_print:nn { number } { \ensuremath { { } \pm { } } } }
- \__siunitx_number_output_parts_print:n { #1 -uncertainty }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_output_parts_print:n #1 {
- \__siunitx_unit_output_pre_print:
- \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
- \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
- \__siunitx_unit_output_print:
-}
-\cs_new_protected:Npn \__siunitx_number_output_product: {
- \bool_if:NTF \l__siunitx_product_brackets_bool
- {
- \bool_lazy_and:nnTF
- { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
- { \tl_if_empty_p:N \l__siunitx_unit_tl }
- { \__siunitx_number_output_product_aux: }
- { \__siunitx_number_output_product_brackets: }
- }
- {
- \bool_if:NTF \l__siunitx_product_repeat_bool
- { \__siunitx_number_output_product_aux: }
- {
- \__siunitx_unit_output_pre_print:
- \tl_set_eq:NN \l__siunitx_unit_saved_tl \l__siunitx_unit_tl
- \tl_clear:N \l__siunitx_pre_unit_tl
- \tl_clear:N \l__siunitx_unit_tl
- \group_begin:
- \__siunitx_number_output_product_aux:
- \group_end:
- \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_saved_tl
- \__siunitx_unit_output_print:
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_output_product_brackets: {
- \__siunitx_unit_output_pre_print:
- \__siunitx_print:nV { number } \l__siunitx_bracket_open_tl
- \nobreak
- \tl_set_eq:NN \l__siunitx_unit_saved_tl \l__siunitx_unit_tl
- \tl_clear:N \l__siunitx_pre_unit_tl
- \tl_clear:N \l__siunitx_unit_tl
- \__siunitx_number_output_product_aux:
- \nobreak
- \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_saved_tl
- \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl
- \__siunitx_unit_output_print:
-}
-\cs_new_protected:Npn \__siunitx_number_output_product_aux: {
- \bool_set_true:N \l__siunitx_number_compound_bool
- \__siunitx_number_preprocess:V \l__siunitx_number_arg_tl
- \bool_if:NF \l__siunitx_error_bool
- {
- \tl_if_empty:NTF \l__siunitx_number_multi_tl
- { \__siunitx_number_output_parse_aux: }
- { \__siunitx_number_output_quotient: }
- \tl_if_empty:NF \l__siunitx_number_next_tl
- {
- \bool_if:NTF \l__siunitx_tight_bool
- {
- \__siunitx_print:nn { number }
- { \ensuremath { \l__siunitx_output_product_tl } }
- }
+ { \__siunitx_print_math_auxi:n {#1} }
+ }
+\cs_new:Npn \__siunitx_print_extract_series:Nw #1#2 ? #3 \q_stop
+ {
+ \cs_if_exist:cTF { c__siunitx_print_weight_ #1#2 _tl }
+ { \__siunitx_print_convert_series:v { c__siunitx_print_weight_ #1#2 _tl } }
+ {
+ \cs_if_exist:cTF { c__siunitx_print_weight_ #1 _tl }
+ { \__siunitx_print_convert_series:v { c__siunitx_print_weight_ #1 _tl } }
+ { \__siunitx_print_convert_series:n {#1#2} }
+ }
+ }
+\cs_new:Npn \__siunitx_print_convert_series:n #1
+ { \tl_use:c { l__siunitx_print_version_ #1 _tl } }
+\cs_generate_variant:Nn \__siunitx_print_convert_series:n { v }
+\cs_new_protected:Npn \__siunitx_print_math_auxi:n #1
+ {
+ \bool_if:NTF \l__siunitx_print_math_version_bool
+ { \__siunitx_print_math_version:nn { normal } {#1} }
+ { \__siunitx_print_math_auxii:n {#1} }
+ }
+\cs_new_protected:Npn \__siunitx_print_math_version:nn #1#2
+ {
+ \str_if_eq:VnTF \math@version { #1 }
+ { \__siunitx_print_math_auxii:n {#2} }
+ {
+ \mode_if_math:TF
+ { \text }
+ { \use:n }
{
- \__siunitx_print:nn { number }
- { \ensuremath { { } \l__siunitx_output_product_tl { } } }
+ \mathversion {#1}
+ \__siunitx_print_math_auxii:n {#2}
}
- \__siunitx_number_output_parse:V \l__siunitx_number_next_tl
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_number_output_quotient: {
- \use:c
- { __siunitx_number_output_quotient_ \l__siunitx_quotient_mode_tl : }
-}
-\cs_new_protected:Npn \__siunitx_number_output_quotient_fraction: {
- \bool_set_false:N \l__siunitx_number_compound_bool
- \__siunitx_number_output_quotient_aux_i:
- \tl_set:Nx \l__siunitx_number_out_tl
- { { \exp_not:V \l__siunitx_number_numerator_tl } }
- \tl_set:Nx \l__siunitx_tmpa_tl
- { { \exp_not:V \l__siunitx_number_denominator_tl } }
- \tl_put_right:NV \l__siunitx_number_out_tl \l__siunitx_tmpa_tl
- \tl_put_left:Nn \l__siunitx_number_out_tl { \__siunitx_fraction:nn }
- \tl_set:Nx \l__siunitx_number_out_tl
- {
- \exp_not:N \ensuremath
- { \exp_not:V \l__siunitx_number_out_tl }
- }
- \__siunitx_number_output_single_aux:
-}
-\cs_new_protected:Npn \__siunitx_number_output_quotient_symbol: {
- \bool_set_true:N \l__siunitx_number_compound_bool
- \__siunitx_number_output_quotient_aux_i:
- \tl_set_eq:NN \l__siunitx_number_out_tl
- \l__siunitx_number_numerator_tl
- \tl_put_right:NV \l__siunitx_number_out_tl \l__siunitx_output_quotient_tl
- \tl_put_right:NV \l__siunitx_number_out_tl
- \l__siunitx_number_denominator_tl
- \__siunitx_number_output_single_aux:
-}
-\cs_new_protected:Npn \__siunitx_number_output_quotient_aux_i: {
- \__siunitx_number_in_parse:V \l__siunitx_number_numerator_tl
- \__siunitx_number_output_quotient_aux_ii:
- \__siunitx_number_output_color:
- \prop_if_in:NnT \l__siunitx_number_out_prop { complex }
- {
- \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
- {
- \prop_put:Nnn \l__siunitx_number_out_prop
- { result-bracket } { true }
- \__siunitx_number_format_brackets:n { result }
- }
- }
- \prop_get:NnN \l__siunitx_number_out_prop { result }
- \l__siunitx_number_numerator_tl
- \__siunitx_number_in_parse:V \l__siunitx_number_denominator_tl
- \__siunitx_number_output_quotient_aux_ii:
- \prop_if_in:NnT \l__siunitx_number_out_prop
- { result-bracket-exponent }
- {
- \prop_put:Nnn \l__siunitx_number_out_prop { result-bracket }
- { true }
- }
- \__siunitx_number_output_bracket:
- \prop_get:NnN \l__siunitx_number_out_prop { result }
- \l__siunitx_number_denominator_tl
-}
-\cs_new_protected:Npn \__siunitx_number_output_quotient_aux_ii: {
- \__siunitx_number_process:
- \__siunitx_number_format:
-}
-\cs_new_protected:Npn \__siunitx_number_output_single: {
- \bool_lazy_and:nnF
- { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
- { \tl_if_empty_p:N \l__siunitx_unit_tl }
- {
- \prop_if_in:NnF \l__siunitx_number_out_prop { exponent }
- { \__siunitx_number_format_brackets:n { result } }
- }
- \__siunitx_number_output_bracket:
- \prop_get:NnN \l__siunitx_number_out_prop { result }
- \l__siunitx_number_out_tl
- \__siunitx_number_output_single_aux:
-}
-\cs_new_protected:Npn \__siunitx_number_output_single_aux: {
- \__siunitx_unit_output_pre_print:
- \quark_if_no_value:NTF \l__siunitx_number_out_tl
- { \tl_clear:N \l__siunitx_number_unit_product_tl }
- { \__siunitx_print:nV { number } \l__siunitx_number_out_tl }
- \__siunitx_unit_output_print:
-}
-\bool_new:N \l__siunitx_angle_degree_space_bool
-\bool_new:N \l__siunitx_angle_minute_space_bool
-\box_new:N \l__siunitx_angle_marker_box
-\box_new:N \l__siunitx_angle_unit_box
-\dim_new:N \l__siunitx_angle_marker_dim
-\dim_new:N \l__siunitx_angle_unit_dim
-\prop_new:N \l__siunitx_angle_degree_prop
-\prop_new:N \l__siunitx_angle_minute_prop
-\prop_new:N \l__siunitx_angle_second_prop
-\keys_define:nn { siunitx } {
- add-arc-degree-zero .bool_set:N =
- \l__siunitx_angle_degree_zero_bool ,
- add-arc-minute-zero .bool_set:N =
- \l__siunitx_angle_minute_zero_bool ,
- add-arc-second-zero .bool_set:N =
- \l__siunitx_angle_second_zero_bool ,
- angle-symbol-over-decimal .bool_set:N =
- \l__siunitx_angle_astronomy_bool ,
- arc-separator .tl_set:N =
- \l__siunitx_angle_arc_separator_tl ,
- number-angle-product .tl_set:N =
- \l__siunitx_angle_unit_product_tl ,
- number-angle-separator .tl_set:N =
- \l__siunitx_angle_unit_product_tl ,
-}
-\cs_new_protected:Npn \__siunitx_angle_output:nnn #1#2#3 {
- \__siunitx_angle_init:
- \IfNoValueTF {#2}
- {
- \bool_set_false:N \l__siunitx_angle_minute_zero_bool
- \bool_set_false:N \l__siunitx_angle_second_zero_bool
- \__siunitx_angle_output_aux:nnn {#1} { } { }
- }
- {
- \IfNoValueTF {#3}
- { \__siunitx_error:nx { invalid-arc-format } { #1 ; #2 } }
- { \__siunitx_angle_output_aux:nnn {#1} {#2} {#3} }
- }
-}
-\cs_new_protected:Npn \__siunitx_angle_output_aux:nnn #1#2#3 {
- \tl_if_empty:nTF { #1#2#3 }
- { \__siunitx_error:n { empty-arc } }
- {
- \bool_if:NTF \l__siunitx_number_parse_bool
- { \__siunitx_angle_parse:nnn {#1} {#2} {#3} }
- { \__siunitx_angle_direct:nnn {#1} {#2} {#3} }
- }
-}
-\cs_new_protected:Npn \__siunitx_angle_init: {
- \bool_set_false:N \l__siunitx_angle_degree_space_bool
- \bool_set_false:N \l__siunitx_angle_minute_space_bool
- \prop_clear:N \l__siunitx_angle_degree_prop
- \prop_clear:N \l__siunitx_angle_minute_prop
- \prop_clear:N \l__siunitx_angle_second_prop
- \tl_clear:N \l__siunitx_preunit_tl
- \tl_set_eq:NN \l__siunitx_number_unit_product_tl
- \l__siunitx_angle_unit_product_tl
- \cs_set_eq:NN \__siunitx_number_in_parse_more:N
- \__siunitx_number_in_parse_restricted:N
-}
-\cs_new_protected:Npn \__siunitx_angle_direct:nnn #1 {
- \tl_if_empty:nTF {#1}
- {
- \bool_if:NTF \l__siunitx_angle_degree_zero_bool
- { \__siunitx_angle_direct_aux_i:nnn { 0 } }
- { \__siunitx_angle_direct_aux_i:nnn { } }
- }
- { \__siunitx_angle_direct_aux_i:nnn {#1} }
-}
-\cs_new_protected:Npn \__siunitx_angle_direct_aux_i:nnn #1#2 {
- \tl_if_empty:nTF {#2}
- {
- \bool_if:NTF \l__siunitx_angle_minute_zero_bool
- { \__siunitx_angle_direct_aux_ii:nnn {#1} { 0 } }
- { \__siunitx_angle_direct_aux_ii:nnn {#1} { } }
- }
- { \__siunitx_angle_direct_aux_ii:nnn {#1} {#2} }
-}
-\cs_new_protected:Npn \__siunitx_angle_direct_aux_ii:nnn #1#2#3 {
- \tl_if_empty:nTF {#3}
- {
- \bool_if:NTF \l__siunitx_angle_second_zero_bool
- { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} { 0 } }
- { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} { } }
- }
- { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} {#3} }
-}
-\cs_new_protected:Npn \__siunitx_angle_direct_aux_iii:nnn #1#2#3 {
- \tl_if_empty:nF {#1}
- {
- \tl_if_empty:nF {#2#3}
- { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
- }
- \tl_if_empty:nF {#2}
- {
- \tl_if_empty:nF {#3}
- { \bool_set_true:N \l__siunitx_angle_minute_space_bool }
- }
- \__siunitx_angle_print_direct:nnn {#1} {#2} {#3}
-}
-\cs_new_protected:Npn \__siunitx_angle_parse:nnn #1#2#3 {
- \__siunitx_angle_parse_aux:nn {#1} { degree }
- \__siunitx_angle_parse_aux:nn {#2} { minute }
- \__siunitx_angle_parse_aux:nn {#3} { second }
- \__siunitx_angle_check_sign:
- \__siunitx_angle_zero_fill:
- \prop_if_empty:NF \l__siunitx_angle_degree_prop
- {
- \prop_if_empty:NF \l__siunitx_angle_minute_prop
- { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
- \prop_if_empty:NF \l__siunitx_angle_second_prop
- { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
- }
- \prop_if_empty:NF \l__siunitx_angle_minute_prop
- {
- \prop_if_empty:NF \l__siunitx_angle_second_prop
- { \bool_set_true:N \l__siunitx_angle_minute_space_bool }
- }
- \__siunitx_angle_print:
-}
-\cs_new_protected:Npn \__siunitx_angle_parse_aux:nn #1#2 {
- \prop_clear:N \l__siunitx_number_in_prop
- \tl_if_empty:nF {#1}
- {
- \__siunitx_number_in_init:
- \__siunitx_number_in_parse_aux:n {#1}
- }
- \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign-deleted }
- \l__siunitx_tmpa_tl
- {
- \prop_put:NnV \l__siunitx_number_in_prop { mantissa-sign }
- \l__siunitx_tmpa_tl
- }
- \__siunitx_number_process:
- \prop_set_eq:cN { l__siunitx_angle_ #2 _prop }
- \l__siunitx_number_in_prop
-}
-\cs_new_protected:Npn \__siunitx_angle_check_sign: {
- \prop_if_empty:NTF \l__siunitx_angle_degree_prop
- {
- \prop_if_empty:NF \l__siunitx_angle_minute_prop
- { \__siunitx_angle_check_sign_aux:n { second } }
- }
- {
- \__siunitx_angle_check_sign_aux:n { minute }
- \__siunitx_angle_check_sign_aux:n { second }
- }
-}
-\cs_new_protected:Npn \__siunitx_angle_check_sign_aux:n #1 {
- \prop_if_in:cnTF { l__siunitx_angle_ #1 _prop }
- { mantissa-sign }
- { \msg_error:nn { siunitx } { bad-arc-sign } }
- {
- \prop_if_in:cnT { l__siunitx_angle_ #1 _prop }
- { mantissa-sign-deleted }
- { \msg_error:nn { siunitx } { bad-arc-sign } }
- }
-}
-\cs_new_protected:Npn \__siunitx_angle_zero_fill: {
- \bool_lazy_and:nnT
- { \l__siunitx_angle_second_zero_bool }
- { \prop_if_empty_p:N \l__siunitx_angle_second_prop }
- {
- \prop_put:Nnn \l__siunitx_angle_second_prop { mantissa }
- { true }
- \prop_put:Nnn \l__siunitx_angle_second_prop { mantissa-integer }
- { 0 }
- }
- \bool_lazy_and:nnT
- { \l__siunitx_angle_minute_zero_bool }
- { \prop_if_empty_p:N \l__siunitx_angle_minute_prop }
- {
- \prop_put:Nnn \l__siunitx_angle_minute_prop { mantissa }
- { true }
- \prop_put:Nnn \l__siunitx_angle_minute_prop { mantissa-integer }
- { 0 }
- \__siunitx_angle_sign_shuffle:nn { second } { minute }
- }
- \bool_lazy_and:nnT
- { \l__siunitx_angle_degree_zero_bool }
- { \prop_if_empty_p:N \l__siunitx_angle_degree_prop }
- {
- \prop_put:Nnn \l__siunitx_angle_degree_prop { mantissa }
- { true }
- \prop_put:Nnn \l__siunitx_angle_degree_prop { mantissa-integer }
- { 0 }
- \__siunitx_angle_sign_shuffle:nn { second } { degree }
- \__siunitx_angle_sign_shuffle:nn { minute } { degree }
- }
-}
-\cs_new_protected:Npn \__siunitx_angle_sign_shuffle:nn #1#2 {
- \__siunitx_angle_sign_shuffle_aux:nnn {#1} {#2} { }
- \__siunitx_angle_sign_shuffle_aux:nnn {#1} {#2} { -deleted }
-}
-\cs_new_protected:Npn \__siunitx_angle_sign_shuffle_aux:nnn
- #1#2#3 {
- \prop_get:cnN { l__siunitx_angle_ #1 _prop } { mantissa-sign #3 }
- \l__siunitx_tmpa_tl
- \prop_remove:cn { l__siunitx_angle_ #1 _prop } { mantissa-sign #3 }
- \quark_if_no_value:NF \l__siunitx_tmpa_tl
- {
- \prop_put:cnV { l__siunitx_angle_ #2 _prop } { mantissa-sign #3 }
- \l__siunitx_tmpa_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_angle_print: {
- \__siunitx_angle_print_aux:nn { degree } { \SIUnitSymbolDegree }
- \bool_if:NT \l__siunitx_angle_degree_space_bool
- {
- \nobreak
- \l__siunitx_angle_arc_separator_tl
- }
- \__siunitx_angle_print_aux:nn { minute } { \SIUnitSymbolArcminute }
- \bool_if:NT \l__siunitx_angle_minute_space_bool
- {
- \nobreak
- \l__siunitx_angle_arc_separator_tl
- }
- \__siunitx_angle_print_aux:nn { second } { \SIUnitSymbolArcsecond }
-}
-\cs_new_protected:Npn \__siunitx_angle_print_aux:nn #1#2 {
- \prop_if_empty:cF { l__siunitx_angle_ #1 _prop }
- {
- \prop_set_eq:Nc \l__siunitx_number_in_prop
- { l__siunitx_angle_ #1 _prop }
- \tl_set:Nn \l__siunitx_unit_tl {#2}
- \tl_clear:N \l__siunitx_number_out_tl
- \__siunitx_number_format:
- \__siunitx_number_output_color:
- \bool_if:NTF \l__siunitx_angle_astronomy_bool
- { \__siunitx_angle_print_astronomy: }
- { \__siunitx_number_output_single: }
- }
-}
-\cs_new_protected:Npn \__siunitx_angle_print_astronomy: {
- \prop_if_in:NnTF \l__siunitx_number_in_prop
- { mantissa-decimal-marker }
- { \__siunitx_angle_print_astronomy_aux: }
- { \__siunitx_number_output_single: }
-}
-\cs_new_protected:Npn \__siunitx_angle_print_astronomy_aux: {
- \prop_get:NnNF \l__siunitx_number_out_prop { mantissa-sign }
- \l__siunitx_tmpa_tl
- { \tl_clear:N \l__siunitx_tmpa_tl }
- \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
- \l__siunitx_tmpb_tl
- {
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
- }
- \hbox_set:Nn \l__siunitx_angle_marker_box
- {
- \__siunitx_print:nn { number } { { \l__siunitx_output_decimal_tl } }
- }
- \hbox_set:Nn \l__siunitx_angle_unit_box
- {
- \__siunitx_print:nV { unit } \l__siunitx_unit_tl
- \skip_horizontal:n { -\scriptspace }
- }
- \__siunitx_angle_print_astronomy_aux:n { marker }
- \__siunitx_angle_print_astronomy_aux:n { unit }
- \hbox_set:Nn \l__siunitx_angle_marker_box
- {
- \box_use:N \l__siunitx_angle_marker_box
- \box_use:N \l__siunitx_angle_unit_box
- }
- \dim_compare:nNnTF
- { \l__siunitx_angle_marker_dim } > { \l__siunitx_angle_unit_dim }
- { \__siunitx_angle_print_astronomy_marker: }
- { \__siunitx_angle_print_astronomy_unit: }
- \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-decimal }
- \l__siunitx_tmpa_tl
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
-}
-\cs_new_protected:Npn \__siunitx_angle_print_astronomy_aux:n #1 {
- \dim_set:cn { l__siunitx_angle_ #1 _dim }
- { \box_wd:c { l__siunitx_angle_ #1 _box } }
- \hbox_set_to_wd:cnn { l__siunitx_angle_ #1 _box } { \c_zero_skip }
- {
- \tex_hss:D
- \hbox_unpack:c { l__siunitx_angle_ #1_box }
- \tex_hss:D
- }
-}
-\cs_new_protected:Npn \__siunitx_angle_print_astronomy_marker: {
- \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box
- { \l__siunitx_angle_marker_dim }
- {
- \tex_hss:D
- \hbox_unpack:N \l__siunitx_angle_marker_box
- \tex_hss:D
- }
- \box_use:N \l__siunitx_angle_marker_box
-}
-\cs_new_protected:Npn \__siunitx_angle_print_astronomy_unit: {
- \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box
- { \l__siunitx_angle_unit_dim }
- {
- \tex_hss:D
- \hbox_unpack:N \l__siunitx_angle_marker_box
- \tex_hss:D
- }
- \box_use:N \l__siunitx_angle_marker_box
- \skip_horizontal:N \scriptspace
-}
-\cs_new_protected:Npn \__siunitx_angle_print_direct:nnn #1#2#3 {
- \__siunitx_angle_print_direct_aux:nn {#1} { \SIUnitSymbolDegree }
- \bool_if:NT \l__siunitx_angle_degree_space_bool
- {
- \nobreak
- \l__siunitx_angle_arc_separator_tl
- }
- \__siunitx_angle_print_direct_aux:nn {#2} { \SIUnitSymbolArcminute }
- \bool_if:NT \l__siunitx_angle_minute_space_bool
- {
- \nobreak
- \l__siunitx_angle_arc_separator_tl
- }
- \__siunitx_angle_print_direct_aux:nn {#3} { \SIUnitSymbolArcsecond }
-}
-\cs_new_protected:Npn \__siunitx_angle_print_direct_aux:nn #1#2 {
- \tl_if_empty:nF {#1}
- {
- \tl_set:Nn \l__siunitx_unit_tl {#2}
- \__siunitx_print:nn { number } { \ensuremath {#1} }
- \__siunitx_unit_output_print:
- }
-}
-\seq_new:N \l_siunitx_unit_symbolic_seq
-\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \of }
-\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \highlight }
-\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \per }
-\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \raiseto }
-\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \tothe }
-\cs_new_protected:Npn \__siunitx_declare_power_after:Nn #1#2 {
- \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w }
- { \__siunitx_textsuperscript:n {#2} }
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
- { \__siunitx_unit_parse_power_after:n {#2} }
-}
-\cs_new_protected:Npn \__siunitx_declare_power_before:Nn #1#2 {
- \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } ##1
- { ##1 \__siunitx_textsuperscript:n {#2} }
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
- { \__siunitx_unit_parse_power_before:n {#2} }
-}
-\cs_new_protected:Npn \__siunitx_declare_prefix:Nnnn #1#2#3#4
+ }
+ }
+\cs_generate_variant:Nn \__siunitx_print_math_version:nn { V }
+\cs_new_protected:Npn \__siunitx_print_math_auxii:n #1
+ { \ensuremath { \__siunitx_print_math_auxiii:n {#1} } }
+\cs_new_protected:Npn \__siunitx_print_math_auxiii:n #1
{
- \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
- \prop_put:Nnn \l__siunitx_prefix_forward_prop {#1} {#4}
- \prop_put:Nnn \l__siunitx_prefix_reverse_prop {#4} {#1}
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } {#2}
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
- {
- \bool_if:NTF \l__siunitx_prefix_symbols_bool
- { \__siunitx_unit_parse_prefix:Nn #1 {#2} }
- { \__siunitx_unit_parse_prefix:nn {#3} {#4} }
- }
- }
-\prop_new:N \l__siunitx_prefix_forward_prop
-\prop_new:N \l__siunitx_prefix_reverse_prop
-\cs_new_protected:Npn \__siunitx_declare_qualifier:Nn #1#2 {
- \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w }
- { \text { ~ } ( #2 ) }
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
- { \__siunitx_unit_parse_qualifier:n {#2} }
-}
-\cs_new_protected:Npn \__siunitx_declare_unit:Nnn #1#2#3 {
- \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
- \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } {#2}
- \cs_set_protected:cpn { __siunitx_ \token_to_str:N #1 _function:w }
- {
- \__siunitx_unit_if_literal:nTF {#2}
- { \__siunitx_unit_parse_unit:Nn #1 {#2} }
- {#2}
- }
- \tl_if_empty:nTF {#3}
- { \cs_undefine:c { l__siunitx_ \token_to_str:N #1 _options_tl } }
- {
- \tl_clear_new:c { l__siunitx_ \token_to_str:N #1 _options_tl }
- \tl_set:cn { l__siunitx_ \token_to_str:N #1 _options_tl } {#3}
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_first_token:n #1 {
- \exp_last_unbraced:No \token_to_str:N { \tl_head:w #1 \q_stop }
-}
-\cs_new:cpn { __siunitx_ \token_to_str:N \per _literal:w } { / }
-\cs_new_protected:cpn { __siunitx_ \token_to_str:N \per _function:w } {
- \bool_set_true:N \l__siunitx_per_bool
- \__siunitx_unit_parse_per:
-}
-\cs_new:cpn { __siunitx_ \token_to_str:N \raiseto _literal:w } #1#2 {
- #2
- \__siunitx_textsuperscript:n {#1}
-}
-\cs_new_protected:cpn { __siunitx_ \token_to_str:N \raiseto _function:w }
- #1 {
- \__siunitx_unit_parse_power_before:n {#1}
-}
-\cs_new:cpn { __siunitx_ \token_to_str:N \tothe _literal:w } #1 {
- \__siunitx_textsuperscript:n {#1}
-}
-\cs_new_protected:cpn { __siunitx_ \token_to_str:N \tothe _function:w }
- #1 {
- \__siunitx_unit_parse_power_after:n {#1}
-}
-\cs_new:cpn { __siunitx_ \token_to_str:N \of _literal:w } #1 {
- \text { ~ } ( #1 )
-}
-\cs_new_protected:cpn { __siunitx_ \token_to_str:N \of _function:w } #1 {
- \__siunitx_unit_parse_qualifier:n {#1}
-}
-\AtBeginDocument {
- \cs_if_exist:NT \cancel
- {
- \cs_set_protected:Npn \__siunitx_cancel:n #1
- { \__siunitx__real_cancel:n { \__siunitx_print:nn { unit } {#1} } }
- \cs_set_eq:NN \__siunitx__real_cancel:n \cancel
- \seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \cancel }
- \cs_new_protected:cpn
- { __siunitx_ \token_to_str:N \cancel _function:w }
- { \__siunitx_unit_parse_special:n { \__siunitx_cancel:n } }
- }
-}
-\cs_new:cpn
- { __siunitx_ \token_to_str:N \highlight _literal:w } #1
- { \__siunitx_textcolor:n {#1} }
-\cs_new_protected:cpn
- { __siunitx_ \token_to_str:N \highlight _function:w } #1
- { \__siunitx_unit_parse_special:n { \__siunitx_textcolor:n {#1} } }
-\keys_define:nn { siunitx } {
- free-standing-units .bool_set:N = \l__siunitx_create_free_bool ,
- overwrite-functions .bool_set:N = \l__siunitx_create_overwrite_bool,
- space-before-unit .bool_set:N = \l__siunitx_create_prespace_bool ,
- unit-optional-argument .bool_set:N = \l__siunitx_create_optional_bool ,
- use-xspace .bool_set:N = \l__siunitx_create_xspace_bool ,
-}
-\__siunitx_option_deactivate:n {
- free-standing-units ,
- overwrite-functions ,
- space-before-unit ,
- unit-optional-argument ,
- use-xspace ,
-}
-\cs_new_protected:Npn \__siunitx_unit_create_empty_functions:
- {
- \__siunitx_unit_create_functions_aux_i:
- \seq_map_function:NN \l_siunitx_unit_symbolic_seq
- \__siunitx_unit_create_empty_functions_aux:N
- \__siunitx_unit_create_functions_aux_ii:
- }
-\cs_new_protected:Npn \__siunitx_unit_create_empty_functions_aux:N #1
- {
- \cs_if_free:NT #1
- { \cs_set_protected:Npn #1 { \ERROR } }
- }
-\cs_new_protected:Npn \__siunitx_unit_create_functions:
- {
- \__siunitx_unit_create_functions_aux_i:
- \bool_if:NT \l__siunitx_create_overwrite_bool
- { \seq_map_function:NN \l_siunitx_unit_symbolic_seq \cs_undefine:N }
- \bool_if:NTF \l__siunitx_create_optional_bool
- {
- \seq_map_function:NN \l_siunitx_unit_symbolic_seq
- \__siunitx_unit_create_with_arg:N
- }
- {
- \seq_map_function:NN \l_siunitx_unit_symbolic_seq
- \__siunitx_unit_create:N
- }
- \__siunitx_unit_create_functions_aux_ii:
- \bool_if:NT \l__siunitx_create_xspace_bool
- { \RequirePackage { xspace } }
+ \bool_if:NTF \l__siunitx_print_math_family_bool
+ {
+ \str_case_e:nnF { \f@family }
+ {
+ { \rmdefault } { \__siunitx_print_math_auxv:n }
+ { \sfdefault } { \__siunitx_print_math_aux:Nn \mathsf }
+ { \ttdefault } { \__siunitx_print_math_aux:Nn \mathtt }
+ }
+ { \__siunitx_print_math_auxiv:n }
+ }
+ { \__siunitx_print_math_auxiv:n }
+ {#1}
}
-\cs_new_protected:Npn \__siunitx_unit_create_functions_aux_i:
+\cs_new_protected:Npn \__siunitx_print_math_auxiv:n #1
{
- \@ifpackageloaded { soulpos }
+ \bool_if:NTF \l__siunitx_print_math_font_bool
{
- \@ifpackageloaded { soul }
- { }
+ \int_case:nnF \fam
{
- \cs_set_protected:Npn \__siunitx_unit_create_functions_aux_ii:
- {
- \cs_undefine:N \hl
- \cs_undefine:N \ul
- }
+ \c__siunitx_print_mathsf_int { \__siunitx_print_math_aux:Nn \mathsf }
+ \c__siunitx_print_mathtt_int { \__siunitx_print_math_aux:Nn \mathtt }
+ }
+ { \use:n }
+ }
+ { \__siunitx_print_math_auxv:n }
+ {#1}
+ }
+\cs_new_protected:Npn \__siunitx_print_math_auxv:n #1
+ {
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn \fam = { -1 } }
+ { \int_compare_p:nNn \fam = \c__siunitx_print_mathrm_int }
+ { \use:n }
+ { \mathrm }
+ {#1}
+ }
+\cs_new_protected:Npx \__siunitx_print_math_aux:Nn #1#2
+ {
+ \group_begin:
+ \tl_set:Nn \exp_not:N \l__siunitx_print_tmp_tl {#2}
+ \__siunitx_print_replace_font:N \exp_not:N \l__siunitx_print_tmp_tl
+ \tl_replace_all:Nnn \exp_not:N \l__siunitx_print_tmp_tl
+ { \char_generate:nn { `\_ } { 8 } }
+ { \exp_not:N \__siunitx_print_math_sub:n }
+ \tl_replace_all:Nnn \exp_not:N \l__siunitx_print_tmp_tl
+ { ^ }
+ { \exp_not:N \__siunitx_print_math_super:n }
+ #1 { \exp_not:N \tl_use:N \exp_not:N \l__siunitx_print_tmp_tl }
+ \group_end:
+ }
+\cs_generate_variant:Nn \__siunitx_print_math_aux:Nn { c }
+\cs_new_protected:Npx \__siunitx_print_math_sub:n #1
+ {
+ \char_generate:nn { `\_ } { 8 }
+ { \exp_not:N \__siunitx_print_math_script:n {#1} }
+ }
+\cs_new_protected:Npn \__siunitx_print_math_super:n #1
+ { ^ { \__siunitx_print_math_script:n {#1} } }
+\cs_new_protected:Npn \__siunitx_print_math_script:n #1
+ {
+ \group_begin:
+ \tl_set:Nn \l__siunitx_print_tmp_tl {#1}
+ \__siunitx_print_replace_font:N \l__siunitx_print_tmp_tl
+ \tl_use:N \l__siunitx_print_tmp_tl
+ \group_end:
+ }
+\AtBeginDocument
+ {
+ \@ifpackageloaded { tex4ht }
+ {
+ \cs_set_protected:Npn \__siunitx_print_math_auxii:n #1
+ {
+ \tl_set:Nn \l__siunitx_print_tmp_tl {#1}
+ \exp_args:NNnx \tl_replace_all:Nnn \l__siunitx_print_tmp_tl
+ { ^ } { \token_to_str:N ^ }
+ \ensuremath { \exp_args:NV \__siunitx_print_math_auxiii:n \l__siunitx_print_tmp_tl }
}
}
{ }
}
-\cs_new_protected:Npn \__siunitx_unit_create_functions_aux_ii: { }
-\cs_new_protected:Npn \__siunitx_unit_create:N #1 {
- \cs_if_free:NT #1
- {
- \cs_set:Npx \__siunitx_tmp:w
- {
- \ProvideDocumentCommand \exp_not:N #1 { }
- {
- \group_begin:
- \exp_not:N \cs_if_free:NF
- \exp_not:c
- { l__siunitx_ \token_to_str:N #1 _options_tl }
- {
- \keys_set:nV { siunitx }
- \exp_not:c
- { l__siunitx_ \token_to_str:N #1 _options_tl }
- }
- \bool_if:NT \l__siunitx_create_prespace_bool
- { \exp_not:N \l__siunitx_number_unit_product_tl }
- \exp_not:n { \__siunitx_unit_output:nn {#1} { } }
- \group_end:
- \bool_if:NT \l__siunitx_create_xspace_bool
- { \exp_not:N \xspace }
- }
- }
- \__siunitx_tmp:w
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_create_with_arg:N #1 {
- \cs_if_free:NT #1
- {
- \cs_set:Npx \__siunitx_tmp:w
- {
- \ProvideDocumentCommand \exp_not:N #1 { o }
- {
- \group_begin:
- \exp_not:N \cs_if_free:NF
- \exp_not:c
- { l__siunitx_ \token_to_str:N #1 _options_tl }
- {
- \keys_set:nV { siunitx }
- \exp_not:c
- {
- l__siunitx_ \token_to_str:N #1 _options_tl
- }
- }
- \exp_not:N \IfNoValueTF {####1}
- {
- \bool_if:NT \l__siunitx_create_prespace_bool
- { \exp_not:N \l__siunitx_number_unit_product_tl }
- \exp_not:n { \__siunitx_unit_output:nn {#1} { } }
- }
- { \SI {####1} { \exp_not:N #1 } }
- \group_end:
- \bool_if:NT \l__siunitx_create_xspace_bool
- { \exp_not:N \xspace }
- }
- }
- \__siunitx_tmp:w
- }
-}
-\AtBeginDocument {
- \cs_if_eq:NNT \color \use_none:n
- { \cs_set_protected:Npn \color #1 { } }
- \cs_set:Npn \__siunitx_tmp:w #1 { }
- \cs_if_eq:NNT \color \__siunitx_tmp:w
- { \cs_set_protected:Npn \color #1 { } }
- \tl_map_function:nN { \bar \color \ng \pm \array@row@rst }
- \__siunitx_protect_symbols:N
-}
-\__siunitx_if_hooks:TF
+\cs_new_protected:Npn \siunitx_print_text:n #1
{
- \AddToHook { begindocument / end } [ siunitx ]
- { \__siunitx_protect_symbols:N \fg }
+ \text
+ {
+ \bool_if:NT \l__siunitx_print_text_family_bool
+ { \fontfamily { \familydefault } }
+ \bool_if:NT \l__siunitx_print_text_series_bool
+ { \fontseries { \seriesdefault } }
+ \bool_if:NT \l__siunitx_print_text_shape_bool
+ { \fontshape { \shapedefault } }
+ \bool_lazy_any:nT
+ {
+ { \l__siunitx_print_text_family_bool }
+ { \l__siunitx_print_text_series_bool }
+ { \l__siunitx_print_text_shape_bool }
+ }
+ { \selectfont }
+ \tl_use:N \l__siunitx_print_text_font_tl
+ \__siunitx_print_text_replace:n {#1}
+ }
}
+\cs_new_protected:Npn \__siunitx_print_text_replace:n #1
{
- \tl_put_right:Nn \document
+ \group_begin:
+ \tl_set:Nn \l__siunitx_print_tmp_tl {#1}
+ \__siunitx_print_text_replace:N \l__siunitx_print_tmp_tl
+ \tl_use:N \l__siunitx_print_tmp_tl
+ \group_end:
+ }
+\cs_new_protected:Npx \__siunitx_print_text_replace:N #1
+ {
+ \__siunitx_print_replace_font:N #1
+ \exp_not:N \__siunitx_print_text_replace:NNn #1
+ \exp_not:N \mathord { }
+ \exp_not:N \pm
+ { \exp_not:N \textpm }
+ \exp_not:N \mp
+ { \exp_not:n { \ensuremath { \mp } } }
+ -
+ { \exp_not:N \textminus }
+ \char_generate:nn { `\_ } { 8 }
+ { \exp_not:N \__siunitx_print_text_sub:n }
+ ^
+ { \exp_not:N \__siunitx_print_text_super:n }
+ \exp_not:N \q_recursion_tail
+ { ? }
+ \exp_not:N \q_recursion_stop
+ }
+\cs_new_protected:Npn \__siunitx_print_text_replace:NNn #1#2#3
+ {
+ \quark_if_recursion_tail_stop:N #2
+ \tl_replace_all:Nnn #1 {#2} {#3}
+ \__siunitx_print_text_replace:NNn #1
+ }
+\sys_if_engine_xetex:T
+ {
+ \AtBeginDocument
{
- \__siunitx_protect_symbols:N \fg
- \ignorespaces
+ \@ifpackageloaded { bidi }
+ {
+ \cs_set_protected:Npn \__siunitx_print_text_replace:n #1
+ {
+ \group_begin:
+ \tl_set:Nn \l__siunitx_print_tmp_tl {#1}
+ \__siunitx_print_text_replace:N \l__siunitx_print_tmp_tl
+ \LRE { \tl_use:N \l__siunitx_print_tmp_tl }
+ \group_end:
+ }
+ }
+ { }
}
}
-\cs_new_protected:Npn \__siunitx_protect_symbols:N #1 {
- \cs_if_exist:NT #1
- {
- \tl_if_empty:fT { \cs_prefix_spec:N #1 }
- { \cs_set_protected:Npx #1 { \exp_not:V #1 } }
- }
-}
-\keys_define:nn { siunitx } {
- forbid-literal-units .bool_set:N =
- \l__siunitx_unit_forbid_literal_bool,
- parse-units .bool_set:N = \l__siunitx_unit_parse_bool
-}
-\keys_set:nn { siunitx } {
- forbid-literal-units = false,
- parse-units = true
-}
-\cs_new_protected:Npn \__siunitx_unit_in:nn #1#2 {
- \bool_if:NTF \l__siunitx_unit_parse_bool
- {
- \tl_if_empty:nF {#1}
- {
- \__siunitx_unit_if_literal:nTF {#1}
- {
- \tl_clear:N \l__siunitx_per_mode_tl
- \bool_if:NTF \l__siunitx_unit_forbid_literal_bool
- {
- \msg_error:nnx { siunitx } { literal-unit }
- { \exp_not:n {#1} }
- }
- {
- \cs_set_eq:NN \__siunitx_pm: \pm
- \__siunitx_unit_format_literal:n {#1}
- \cs_set_eq:NN \pm \__siunitx_pm:
- }
- }
- {
- \cs_set_eq:NN \__siunitx_pm: \pm
- \__siunitx_unit_parse:nn {#1} {#2}
- \__siunitx_unit_format:
- \prop_set_eq:NN \l__siunitx_unit_saved_prop \l__siunitx_unit_prop
- \cs_set_eq:NN \pm \__siunitx_pm:
- }
+\cs_new_protected:Npn \__siunitx_print_text_sub:n #1
+ {
+ \__siunitx_print_text_scripts:NnN
+ \textsubscript {#1} \__siunitx_print_text_super:n
+ }
+\cs_new_protected:Npn \__siunitx_print_text_super:n #1
+ {
+ \__siunitx_print_text_scripts:NnN
+ \textsuperscript {#1} \__siunitx_print_text_sub:n
+ }
+\cs_new_protected:Npn \__siunitx_print_text_scripts:NnN #1#2#3
+ {
+ \cs_set_protected:Npn \__siunitx_print_text_scripts:
+ {
+ \if_meaning:w \l_peek_token #3
+ \exp_after:wN \__siunitx_print_text_scripts_two:NnNn
+ \else:
+ \exp_after:wN \__siunitx_print_text_scripts_one:Nn
+ \fi:
+ #1 {#2}
}
+ \peek_after:Nw \__siunitx_print_text_scripts:
}
- { \__siunitx_unit_format_literal:n {#1} }
-}
-\cs_generate_variant:Nn \__siunitx_unit_in:nn { V }
-\cs_new:Npn \__siunitx_pm: { }
-\cs_new_protected:Npn \__siunitx_unit_if_literal:nTF #1#2#3 {
- \group_begin:
- \seq_map_function:NN \l_siunitx_unit_symbolic_seq
- \__siunitx_unit_if_literal_aux:N
- \cs_set_eq:NN \of \use_none:n
- \cs_set_eq:NN \highlight \use_none:n
- \cs_set_eq:NN \raiseto \use_none:n
- \cs_set_eq:NN \tothe \use_none:n
- \protected@edef \l__siunitx_tmpa_tl {#1}
- \exp_args:NNNV \group_end:
- \tl_set:Nn \l__siunitx_tmpa_tl \l__siunitx_tmpa_tl
- \tl_if_blank:VTF \l__siunitx_tmpa_tl {#3} {#2}
-}
-\cs_new_protected:Npn \__siunitx_unit_if_literal_aux:N #1 {
- \cs_set_eq:NN #1 \prg_do_nothing:
-}
-\int_new:N \l__siunitx_unit_int
-\prop_new:N \l__siunitx_unit_prop
-\prop_new:N \l__siunitx_unit_saved_prop
-\bool_new:N \l__siunitx_per_bool
-\keys_define:nn { siunitx }
+\cs_new_protected:Npn \__siunitx_print_text_scripts: { }
+\cs_new_protected:Npn \__siunitx_print_text_scripts_one:Nn #1#2
{
- exponent-to-prefix .bool_set:N = \l__siunitx_exp_to_prefix_bool ,
- prefixes-as-symbols .bool_set:N = \l__siunitx_prefix_symbols_bool ,
- sticky-per .bool_set:N = \l__siunitx_sticky_per_bool
- }
-\keys_set:nn { siunitx } { prefixes-as-symbols = true }
-\cs_new_protected:Npn \__siunitx_unit_parse:nn #1#2 {
- \__siunitx_unit_parse_init:
- \__siunitx_unit_parse_options:nn {#1} {#2}
- #1
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_init:
- {
- \prop_clear:N \l__siunitx_unit_prop
- \int_zero:N \l__siunitx_unit_int
- \bool_set_false:N \l__siunitx_per_bool
- \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
- { \cs_set_eq:Nc ##1 { __siunitx_ \token_to_str:N ##1 _function:w } }
+ \group_begin:
+ \tl_set:Nn \l__siunitx_print_tmp_tl {#2}
+ \__siunitx_print_text_replace:N \l__siunitx_print_tmp_tl
+ \exp_args:NNV \group_end:
+ #1 \l__siunitx_print_tmp_tl
}
-\cs_new_protected:Npn \__siunitx_unit_parse_options:nn #1#2 {
- \tl_if_single:nT {#1}
- {
- \cs_if_free:cF
- { l__siunitx_ \__siunitx_unit_first_token:n {#1} _options_tl }
- {
- \keys_set:nv { siunitx }
- { l__siunitx_ \__siunitx_unit_first_token:n {#1} _options_tl }
- \keys_set:nn { siunitx } {#2}
- }
+\cs_new_protected:Npn \__siunitx_print_text_scripts_two:NnNn #1#2#3#4
+ {
+ \cs_if_eq:NNTF #1 \textsubscript
+ { \__siunitx_print_text_scripts_two:nn {#4} {#2} }
+ { \__siunitx_print_text_scripts_two:nn {#2} {#4} }
}
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_power_before:n #1 {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { power- \int_eval:n { \l__siunitx_unit_int + 1 } }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_power_after:n #1 {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { power- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_prefix:Nn #1#2
+\cs_new_protected:Npx \__siunitx_print_text_scripts_two:nn #1#2
{
- \int_incr:N \l__siunitx_unit_int
- \tl_set:Nx \l__siunitx_tmpa_tl
- { prefix- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
- \tl_set:Nx \l__siunitx_tmpa_tl
- { prefix-symbol- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#2}
- }
-\cs_new_protected:Npn \__siunitx_unit_parse_prefix:nn #1#2
- {
- \__siunitx_unit_parse_prefix:Nn \ERROR {#2}
- \tl_set:Nx \l__siunitx_tmpa_tl
- { prefix-base- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
- }
-\cs_new_protected:Npn \__siunitx_unit_parse_per: {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { per- \int_eval:n { \l__siunitx_unit_int + 1 } }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
- \bool_if:NT \l__siunitx_sticky_per_bool
- { \cs_set_eq:NN \per \__siunitx_unit_parse_per_error: }
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_per_error: {
- \msg_error:nn { siunitx } { duplicate-sticky-per }
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_qualifier:n #1 {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { symbol- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- { \msg_error:nn { siunitx } { qualifier-before-unit } }
- \tl_set:Nx \l__siunitx_tmpa_tl
- { qualifier- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_special:n #1 {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { special- \int_eval:n { \l__siunitx_unit_int + 1 } }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_unit:Nn #1#2 {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { prefix-symbol- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { symbol- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- { \int_incr:N \l__siunitx_unit_int }
- }
- { \int_incr:N \l__siunitx_unit_int }
- \tl_set:Nx \l__siunitx_tmpa_tl
- { unit- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
- \tl_set:Nx \l__siunitx_tmpa_tl
- { symbol- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#2}
- \__siunitx_unit_parse_unit_per:
-}
-\cs_new_protected:Npn \__siunitx_unit_parse_unit_per: {
- \bool_if:NT \l__siunitx_sticky_per_bool
- {
- \bool_if:NT \l__siunitx_per_bool
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { per- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- { true }
- }
- }
-}
-\tl_new:N \l__siunitx_preunit_tl
-\tl_new:N \l__siunitx_unit_tl
-\tl_new:N \l__siunitx_unit_current_tl
-\tl_new:N \l__siunitx_unit_denominator_tl
-\tl_new:N \l__siunitx_unit_numerator_tl
-\tl_new:N \l__siunitx_unit_saved_tl
-\int_new:N \l__siunitx_unit_denominator_int
-\int_new:N \l__siunitx_unit_numerator_int
-\int_new:N \l__siunitx_unit_prefix_int
-\int_new:N \l__siunitx_unit_prefix_base_int
-\tl_new:N \l__siunitx_unit_prefix_current_tl
-\int_new:N \l__siunitx_unit_prefix_gram_int
-\bool_new:N \l__siunitx_omit_unit_space_bool
-\bool_new:N \l__siunitx_per_auto_bool
-\bool_new:N \l__siunitx_per_fraction_bool
-\tl_new:N \l__siunitx_per_mode_tl
-\bool_new:N \l__siunitx_power_number_bool
-\bool_new:N \l__siunitx_per_two_parts_bool
-\tl_new:N \l__siunitx_qualifier_mode_tl
-\keys_define:nn { siunitx } {
- bracket-unit-denominator .bool_set:N
- = \l__siunitx_unit_denominator_bracket_bool,
- inter-unit-product .tl_set:N = \l__siunitx_unit_product_tl ,
- inter-unit-separator .tl_set:N = \l__siunitx_unit_product_tl ,
- literal-superscript-as-power
- .bool_set:N = \l__siunitx_literal_power_bool,
- per-mode .choice:,
- per-mode / fraction .code:n =
- {
- \bool_set_false:N \l__siunitx_per_auto_bool
- \bool_set_true:N \l__siunitx_per_fraction_bool
- \bool_set_true:N \l__siunitx_per_two_parts_bool
- \tl_set:Nn \l__siunitx_per_mode_tl { fraction }
- },
- per-mode / power .meta:n = { per-mode = reciprocal } ,
- per-mode / power-positive-first .meta:n =
- { per-mode = reciprocal-positive-first } ,
- per-mode / reciprocal .code:n =
- {
- \bool_set_false:N \l__siunitx_per_auto_bool
- \bool_set_false:N \l__siunitx_per_fraction_bool
- \bool_set_false:N \l__siunitx_per_two_parts_bool
- \tl_clear:N \l__siunitx_per_mode_tl
- },
- per-mode / reciprocal-positive-first .code:n =
- {
- \bool_set_false:N \l__siunitx_per_auto_bool
- \bool_set_false:N \l__siunitx_per_fraction_bool
- \bool_set_true:N \l__siunitx_per_two_parts_bool
- \tl_clear:N \l__siunitx_per_mode_tl
- },
- per-mode / repeated-symbol .code:n =
- {
- \bool_set_false:N \l__siunitx_per_auto_bool
- \bool_set_false:N \l__siunitx_per_fraction_bool
- \bool_set_false:N \l__siunitx_per_two_parts_bool
- \tl_set:Nn \l__siunitx_per_mode_tl { repeat }
- },
- per-mode / symbol .code:n =
- {
- \bool_set_false:N \l__siunitx_per_auto_bool
- \bool_set_true:N \l__siunitx_per_fraction_bool
- \bool_set_true:N \l__siunitx_per_two_parts_bool
- \tl_set:Nn \l__siunitx_per_mode_tl { symbol }
- },
- per-mode / symbol-or-fraction .code:n =
- {
- \bool_set_true:N \l__siunitx_per_auto_bool
- \bool_set_true:N \l__siunitx_per_fraction_bool
- \bool_set_true:N \l__siunitx_per_two_parts_bool
- \tl_set:Nn \l__siunitx_per_mode_tl { symbol }
- },
- per-symbol .tl_set:N = \l__siunitx_per_symbol_tl,
- power-font .choice:,
- power-font / number .code:n =
- { \bool_set_true:N \l__siunitx_power_number_bool },
- power-font / unit .code:n =
- { \bool_set_false:N \l__siunitx_power_number_bool },
- qualifier-mode .choice:,
- qualifier-mode / brackets .code:n =
- { \tl_set:Nn \l__siunitx_qualifier_mode_tl { brackets } },
- qualifier-mode / phrase .code:n =
- { \tl_set:Nn \l__siunitx_qualifier_mode_tl { phrase } },
- qualifier-mode / space .code:n =
- { \tl_set:Nn \l__siunitx_qualifier_mode_tl { space } },
- qualifier-mode / subscript .code:n =
- { \tl_set:Nn \l__siunitx_qualifier_mode_tl { subscript } },
- qualifier-mode / text .code:n =
- { \tl_set:Nn \l__siunitx_qualifier_mode_tl { text } },
- qualifier-phrase .tl_set:N = \l__siunitx_qualifier_phrase_tl
-}
-\keys_set:nn { siunitx } {
- bracket-unit-denominator = true,
- inter-unit-product = \,,
- literal-superscript-as-power = true,
- per-mode = reciprocal,
- per-symbol = /,
- power-font = number,
- qualifier-mode = subscript,
- qualifier-phrase = { ~ of ~ }
-}
-\cs_new_protected:Npn \__siunitx_unit_format: {
- \prop_put:Nnx \l__siunitx_unit_prop { total-units }
- { \int_use:N \l__siunitx_unit_int }
- \__siunitx_unit_format_init:
- \int_while_do:nNnn { \l__siunitx_unit_int } > { 0 }
- {
- \__siunitx_unit_format_prefix:
- \__siunitx_unit_format_symbol:
- \__siunitx_unit_format_qualifier:
- \__siunitx_unit_format_power:
- \__siunitx_unit_format_add:
- \int_decr:N \l__siunitx_unit_int
- }
- \bool_if:NT \l__siunitx_per_two_parts_bool
- {
- \bool_if:NTF \l__siunitx_per_fraction_bool
- { \__siunitx_unit_format_fraction: }
- { \__siunitx_unit_format_sorted: }
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_add: {
- \bool_if:NTF \l__siunitx_per_two_parts_bool
- {
- \tl_set:Nx \l__siunitx_tmpb_tl
- { per- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpb_tl
- {
- \__siunitx_unit_format_add_aux:n { _denominator }
- \int_incr:N \l__siunitx_unit_denominator_int
- }
- {
- \__siunitx_unit_format_add_aux:n { _numerator }
- \int_incr:N \l__siunitx_unit_numerator_int
- }
- }
- { \__siunitx_unit_format_add_aux:n { } }
- \tl_clear:N \l__siunitx_unit_current_tl
-}
-\cs_new_protected:Npn \__siunitx_unit_format_add_aux:n #1 {
- \tl_if_empty:cF { l__siunitx_unit #1 _tl }
- {
- \str_if_eq:VnTF \l__siunitx_per_mode_tl { repeat }
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { per- \int_eval:n { \l__siunitx_unit_int + 1 } }
- \prop_if_in:NVF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- {
- \tl_put_right:NV \l__siunitx_unit_current_tl
- \l__siunitx_unit_product_tl
- }
- }
+ \group_begin:
+ \exp_not:N \m@th
+ \exp_not:N \ensuremath
{
- \tl_put_right:NV \l__siunitx_unit_current_tl
- \l__siunitx_unit_product_tl
+ ^ { \exp_not:N \__siunitx_print_text_scripts_two:n {#1} }
+ \char_generate:nn { `\_ } { 8 }
+ { \exp_not:N \__siunitx_print_text_scripts_two:n {#2} }
}
- }
- \tl_set:Nx \l__siunitx_tmpa_tl
- { special- \int_use:N \l__siunitx_unit_int }
- \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- \l__siunitx_tmpa_tl
+ \group_end:
+ }
+\cs_new_protected:Npn \__siunitx_print_text_scripts_two:n #1
{
- \tl_put_left:cx { l__siunitx_unit #1 _tl }
+ \mbox
{
- \exp_not:V \l__siunitx_tmpa_tl
- { \exp_not:V \l__siunitx_unit_current_tl }
+ \fontsize \sf@size \z@ \selectfont
+ \__siunitx_print_text_scripts_one:Nn \use:n {#1}
}
}
+\keys_set:nn { siunitx }
{
- \tl_put_left:cV { l__siunitx_unit #1 _tl }
- \l__siunitx_unit_current_tl
+ color = ,
+ mode = math ,
+ number-color = ,
+ number-mode = math ,
+ propagate-math-font = false ,
+ reset-math-version = true ,
+ reset-text-shape = true ,
+ reset-text-series = true ,
+ reset-text-family = true ,
+ text-family-to-math = false ,
+ text-font-command = ,
+ text-series-to-math = false ,
+ unit-color = ,
+ unit-mode = math
+ }
+\keys_set:nn { siunitx / series-version-mapping }
+ {
+ ul = light ,
+ el = light ,
+ l = light ,
+ sl = light ,
+ m = normal ,
+ sb = bold ,
+ b = bold ,
+ eb = bold ,
+ ub = bold
+ }
+\box_new:N \l__siunitx_table_tmp_box
+\dim_new:N \l__siunitx_table_tmp_dim
+\tl_new:N \l__siunitx_table_tmp_tl
+\bool_new:N \l__siunitx_table_text_bool
+\cs_new_protected:Npn \siunitx_cell_begin:w
+ {
+ \bool_set_false:N \l__siunitx_table_text_bool
+ \bool_if:NTF \l_siunitx_number_parse_bool
+ { \__siunitx_table_collect_begin: }
+ { \__siunitx_table_direct_begin: }
+ }
+\cs_new_protected:Npn \siunitx_cell_end:
+ {
+ \bool_if:NF \l__siunitx_table_text_bool
+ {
+ \bool_if:NTF \l_siunitx_number_parse_bool
+ { \__siunitx_table_collect_end: }
+ { \__siunitx_table_direct_end: }
+ }
}
-}
-\cs_new_protected:Npn \__siunitx_unit_format_fraction: {
- \int_compare:nNnT { \l__siunitx_unit_numerator_int } = { 0 }
- {
- \str_if_eq:VnT \l__siunitx_per_mode_tl { symbol }
- { \bool_set_true:N \l__siunitx_omit_unit_space_bool }
- }
- \int_compare:nNnTF { \l__siunitx_unit_denominator_int } > { 0 }
- {
- \bool_if:NTF \l__siunitx_per_auto_bool
- { \__siunitx_unit_format_fraction_auto: }
+\tl_new:N \l__siunitx_table_collect_tl
+\cs_new_protected:Npn \__siunitx_table_collect_begin:
+ {
+ \group_begin:
+ \tl_clear:N \l__siunitx_table_collect_tl
+ \if_false: { \fi:
+ \cs_set_protected:Npn \cr
{
- \use:c
- { __siunitx_unit_format_fraction_ \l__siunitx_per_mode_tl : }
+ \__siunitx_table_collect_loop:
+ \tex_cr:D
}
- }
- { \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_fraction_fraction: {
- \tl_if_empty:NT \l__siunitx_unit_numerator_tl
- { \tl_set:Nn \l__siunitx_unit_numerator_tl { 1 } }
- \tl_set:Nx \l__siunitx_unit_numerator_tl
- { { \exp_not:V \l__siunitx_unit_numerator_tl } }
- \tl_put_left:Nn \l__siunitx_unit_numerator_tl
- { \__siunitx_print:nn { unit } }
- \tl_set:Nx \l__siunitx_unit_numerator_tl
- { { \exp_not:V \l__siunitx_unit_numerator_tl } }
- \tl_set:Nx \l__siunitx_unit_denominator_tl
- { { \exp_not:V \l__siunitx_unit_denominator_tl } }
- \tl_put_left:Nn \l__siunitx_unit_denominator_tl
- { \__siunitx_print:nn { unit } }
- \tl_set:Nx \l__siunitx_unit_denominator_tl
- { { \exp_not:V \l__siunitx_unit_denominator_tl } }
- \tl_set:Nn \l__siunitx_unit_tl { \__siunitx_fraction:nn }
- \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl
- \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_denominator_tl
- \tl_set:Nx \l__siunitx_unit_tl
- { \exp_not:N \ensuremath { \exp_not:V \l__siunitx_unit_tl } }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_fraction_auto: {
- \mode_if_math:TF
+ \if_false: } \fi:
+ \__siunitx_table_collect_begin:w
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_begin:w #1 \ignorespaces
+ { \__siunitx_table_collect_loop: #1 }
+\cs_new_protected:Npn \__siunitx_table_collect_loop:
+ {
+ \peek_catcode_ignore_spaces:NTF \c_group_begin_token
+ { \__siunitx_table_collect_group:n }
+ { \__siunitx_table_collect_token:N }
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_group:n #1
+ {
+ \tl_put_right:Nn \l__siunitx_table_collect_tl { {#1} }
+ \__siunitx_table_collect_loop:
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_token:N #1
+ {
+ \__siunitx_table_collect_search:NnF #1
{
- \group_begin:
- \__siunitx_unit_format_fraction_fraction:
- \exp_args:NNNV \group_end:
- \tl_set:Nn \l__siunitx_tmpa_tl \l__siunitx_unit_tl
- \group_begin:
- \__siunitx_unit_format_fraction_symbol:
- \exp_args:NNNV \group_end:
- \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_unit_tl
- \tl_set:Nx \l__siunitx_tmpb_tl
- {
- \__siunitx_print:nn { unit }
- { \exp_not:V \l__siunitx_tmpb_tl }
- }
- \tl_set:Nx \l__siunitx_unit_tl
- {
- \exp_not:N \ensuremath {
- \tex_mathchoice:D
- { \exp_not:V \l__siunitx_tmpa_tl }
- { \exp_not:V \l__siunitx_tmpb_tl }
- { \exp_not:V \l__siunitx_tmpb_tl }
- { \exp_not:V \l__siunitx_tmpb_tl }
- }
- }
+ \unskip { \__siunitx_table_collect_loop: }
+ \end { \tabularnewline \end }
+ \relax { \relax }
+ \tabularnewline { \tabularnewline }
+ \siunitx_cell_end: { \siunitx_cell_end: }
+ }
+ {
+ \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
+ \__siunitx_table_collect_loop:
}
- { \__siunitx_unit_format_fraction_symbol: }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_fraction_symbol: {
- \__siunitx_unit_format_fraction_symbol_aux:
- \int_compare:nNnT { \l__siunitx_unit_denominator_int } > { 1 }
- {
- \bool_if:NT \l__siunitx_unit_denominator_bracket_bool
- {
- \tl_put_left:NV \l__siunitx_unit_denominator_tl \l__siunitx_bracket_open_tl
- \tl_put_right:NV \l__siunitx_unit_denominator_tl \l__siunitx_bracket_close_tl
- }
- }
- \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl
- \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_per_symbol_tl
- \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_denominator_tl
-}
-\cs_new_protected:Npn
- \__siunitx_unit_format_fraction_symbol_aux: { }
-\cs_new_protected:Npn
- \__siunitx_unit_format_fraction_symbol_aux_alt: {
- \tl_if_empty:NT \l__siunitx_unit_numerator_tl
- { \tl_set:Nn \l__siunitx_unit_numerator_tl { 1 } }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_init: {
- \bool_set_false:N \l__siunitx_omit_unit_space_bool
- \tl_clear:N \l__siunitx_unit_tl
- \tl_clear:N \l__siunitx_unit_current_tl
- \tl_clear:N \l__siunitx_unit_denominator_tl
- \int_zero:N \l__siunitx_unit_prefix_gram_int
- \tl_clear:N \l__siunitx_unit_numerator_tl
- \int_zero:N \l__siunitx_unit_prefix_base_int
- \int_zero:N \l__siunitx_unit_prefix_int
- \int_zero:N \l__siunitx_unit_denominator_int
- \int_zero:N \l__siunitx_unit_numerator_int
- \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
- { \__siunitx_unit_print_literal_aux:N ##1 }
-}
-\group_begin:
- \char_set_catcode_active:N \~
- \cs_new_protected:Npn \__siunitx_unit_format_literal:n #1
- {
- \int_zero:N \l__siunitx_unit_prefix_int
- \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
- { \__siunitx_unit_print_literal_aux:N ##1 }
- \tl_set:Nn \l__siunitx_unit_tl {#1}
- \tl_replace_all:NnV \l__siunitx_unit_tl { . }
- \l__siunitx_unit_product_tl
- \tl_replace_all:NnV \l__siunitx_unit_tl { ~ }
- \l__siunitx_unit_product_tl
- \bool_if:NT \l__siunitx_literal_power_bool
- {
- \tl_replace_all:Nnn \l__siunitx_unit_tl { ^ }
- { \__siunitx_unit_format_literal_power:n }
- \tl_replace_all:Non \l__siunitx_unit_tl { \token_to_str:N ^ }
- { \__siunitx_unit_format_literal_power:n }
- }
- \__siunitx_unit_format_literal_extras:
- }
-\group_end:
-\cs_new_protected:Npn \__siunitx_unit_print_literal_aux:N #1
- { \cs_set_eq:Nc #1 { __siunitx_ \token_to_str:N #1 _literal:w } }
-\cs_new_protected:Npn \__siunitx_unit_format_literal_power:n #1
- { \PrintSuperscript { \__siunitx_unit_format_power_aux:n {#1} } }
- %\end{macro}
-\cs_new_protected:Npn \__siunitx_unit_format_literal_extras:
- {
- \__siunitx_unit_format_literal_extras_aux:nN { 176 }
- \SIUnitSymbolDegree
- \__siunitx_unit_format_literal_extras_aux:nN { 181 }
- \SIUnitSymbolMicro
- \__siunitx_unit_format_literal_extras_aux:nN { 197 }
- \SIUnitSymbolAngstrom
- }
-\cs_new_protected:Npn \__siunitx_unit_format_literal_extras_aux:nN #1#2
- {
- \tl_replace_all:Nxn \l__siunitx_unit_tl
- { \char_generate:nn { #1 } { 12 } }
- {#2}
}
-\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: }
+\AtBeginDocument
{
- \AtBeginDocument
+ \@ifpackageloaded { mdwtab }
{
- \cs_if_exist:NTF \inputencodingname
+ \cs_set_protected:Npn \__siunitx_table_collect_token:N #1
{
- \tl_set:Nn \l__siunitx_tmpa_tl { latin1 , latin5 , latin9 }
- \clist_if_in:NVF \l__siunitx_tmpa_tl \inputencodingname
+ \__siunitx_table_collect_search:NnF #1
+ {
+ \@maybe@unskip { \__siunitx_table_collect_loop: }
+ \tab@setcr { \__siunitx_table_collect_loop: }
+ \unskip { \__siunitx_table_collect_loop: }
+ \end { \tabularnewline \end }
+ \relax { \relax }
+ \tabularnewline { \tabularnewline }
+ \siunitx_cell_end: { \siunitx_cell_end: }
+ }
{
- \cs_set_eq:NN \__siunitx_unit_format_literal_extras:
- \scan_stop:
+ \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
+ \__siunitx_table_collect_loop:
}
}
+ }
+ { }
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_search:NnF #1#2#3
+ {
+ \__siunitx_table_collect_search_aux:NNn #1
+ #2
+ #1 {#3}
+ \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_search_aux:NNn #1#2#3
+ {
+ \token_if_eq_meaning:NNTF #1 #2
+ { \use_i_delimit_by_q_stop:nw {#3} }
+ { \__siunitx_table_collect_search_aux:NNn #1 }
+ }
+\tl_new:N \l__siunitx_table_before_tl
+\tl_new:N \l__siunitx_table_number_tl
+\tl_new:N \l__siunitx_table_after_tl
+\cs_new_protected:Npn \__siunitx_table_collect_end:
+ {
+ \exp_args:NNV \group_end:
+ \__siunitx_table_collect_end:n \l__siunitx_table_collect_tl
+ \exp_args:NV \__siunitx_table_split:nNNN
+ \l__siunitx_table_collect_tl
+ \l__siunitx_table_before_tl
+ \l__siunitx_table_number_tl
+ \l__siunitx_table_after_tl
+ \tl_if_empty:NTF \l__siunitx_table_number_tl
+ { \__siunitx_table_print_text:V \l__siunitx_table_before_tl }
+ {
+ \__siunitx_table_print:VVV
+ \l__siunitx_table_before_tl
+ \l__siunitx_table_number_tl
+ \l__siunitx_table_after_tl
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_collect_end:n #1
+ {
+ \str_if_eq:eeTF { \exp_not:n {#1} }
+ { { \__siunitx_table_collect_end_aux:n {#1} } }
+ { \tl_set:Nn }
+ { \protected@edef }
+ \l__siunitx_table_collect_tl {#1}
+ }
+\cs_new:Npn \__siunitx_table_collect_end_aux:n #1
+ { \exp_after:wN \__siunitx_table_collect_end:w #1 \q_stop }
+\cs_new:Npn \__siunitx_table_collect_end:w #1 \q_stop
+ { \exp_not:n {#1} }
+\cs_new_protected:Npn \__siunitx_table_split:nNNN #1#2#3#4
+ {
+ \tl_clear:N #2
+ \tl_clear:N #3
+ \tl_clear:N #4
+ \__siunitx_table_split_loop:NNN #2#3#4 #1 \q_recursion_tail \q_recursion_stop
+ \__siunitx_table_split_tidy:N #2
+ \__siunitx_table_split_tidy:N #4
+ }
+\cs_new_protected:Npn \__siunitx_table_split_loop:NNN #1#2#3
+ {
+ \peek_catcode_ignore_spaces:NTF \c_group_begin_token
+ { \__siunitx_table_split_group:NNNn #1#2#3 }
+ { \__siunitx_table_split_token:NNNN #1#2#3 }
+ }
+\cs_new_protected:Npn \__siunitx_table_split_group:NNNn #1#2#3#4
+ {
+ \tl_if_empty:NTF #2
+ { \tl_put_right:Nn #1 { {#4} } }
+ { \tl_put_right:Nn #3 { {#4} } }
+ \__siunitx_table_split_loop:NNN #1#2#3
+ }
+\cs_new_protected:Npn \__siunitx_table_split_token:NNNN #1#2#3#4
+ {
+ \quark_if_recursion_tail_stop:N #4
+ \tl_if_empty:NTF \l__siunitx_table_after_tl
+ {
+ \siunitx_if_number_token:NTF #4
+ { \tl_put_right:Nn #2 {#4} }
{
- \cs_set_eq:NN \__siunitx_unit_format_literal_extras:
- \scan_stop:
+ \tl_if_empty:NTF #2
+ { \tl_put_right:Nn #1 {#4} }
+ { \tl_put_right:Nn #3 {#4} }
}
}
+ { \tl_put_right:Nn #3 {#4} }
+ \__siunitx_table_split_loop:NNN #1#2#3
}
-\cs_new_protected:Npn \__siunitx_unit_format_power: {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { power- \int_use:N \l__siunitx_unit_int }
- \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- \l__siunitx_tmpa_tl
- { \__siunitx_unit_format_power_aux: }
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { per- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- {
- \tl_set:Nn \l__siunitx_tmpa_tl { 1 }
- \__siunitx_unit_format_power_aux:
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_power_aux: {
- \str_if_eq:VnTF \l__siunitx_per_mode_tl { repeat }
- { \__siunitx_unit_format_power_repeat: }
- { \__siunitx_unit_format_power_per: }
- \str_if_eq:VnF \l__siunitx_tmpa_tl { 1 }
- {
- \__siunitx_unit_format_power_brackets:
- \tl_put_right:Nx \l__siunitx_unit_current_tl
+\cs_new_protected:Npn \__siunitx_table_split_tidy:N #1
+ {
+ \tl_if_empty:NF #1
+ { \__siunitx_table_split_tidy:NV #1 #1 }
+ }
+\cs_new_protected:Npn \__siunitx_table_split_tidy:Nn #1#2
+ {
+ \str_if_eq:onT { \exp_after:wN { \use:n #2 } } {#2}
+ { \tl_set:No #1 { \use:n #2 } }
+ }
+\cs_generate_variant:Nn \__siunitx_table_split_tidy:Nn { NV }
+\cs_new_protected:Npn \__siunitx_table_skip:n #1
+ {
+ \skip_horizontal:n {#1}
+ \tex_kern:D \c_zero_skip
+ }
+\keys_define:nn { siunitx }
+ {
+ table-column-width .dim_set:N =
+ \l__siunitx_table_column_width_dim ,
+ table-fixed-width .bool_set:N =
+ \l__siunitx_table_fixed_width_bool
+ }
+\cs_new_protected:Npn \__siunitx_table_align_center:n #1
+ { \__siunitx_table_align_auxi:nn {#1} { 0pt~plus~0.5fill } }
+\cs_new_protected:Npn \__siunitx_table_align_left:n #1
+ { \__siunitx_table_align_auxi:nn {#1} { 0pt } }
+\cs_new_protected:Npn \__siunitx_table_align_right:n #1
+ { \__siunitx_table_align_auxi:nn {#1} { 0pt~plus~1fill } }
+\cs_new_protected:Npn \__siunitx_table_align_auxi:nn #1#2
+ {
+ \bool_if:NTF \l__siunitx_table_fixed_width_bool
+ { \hbox_to_wd:nn \l__siunitx_table_column_width_dim }
+ { \use:n }
{
- \exp_not:N \PrintSuperscript
- {
- \__siunitx_unit_format_power_aux:n
- {
- \exp_after:wN \__siunitx_unit_format_power:w
- \l__siunitx_tmpa_tl . . \q_stop
- }
- }
+ \__siunitx_table_skip:n {#2}
+ #1
+ \__siunitx_table_skip:n { 0pt~plus~1fill - #2 }
}
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_power_aux:n #1 {
- \bool_if:NTF \l__siunitx_power_number_bool
- { \__siunitx_unit_format_power_aux:nn { number } {#1} }
- { \__siunitx_unit_format_power_aux:nn { unit } {#1} }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_power_aux:nn #1#2 {
- \bool_if:cTF { l__siunitx_ #1 _math_mode_bool }
- { \__siunitx_print:nn {#1} {#2} }
- {
- \tl_set:Nn \l__siunitx_tmpa_tl {#2}
- \tl_replace_all:Nnn \l__siunitx_tmpa_tl { - }
- { \text { \textminus } }
- \__siunitx_print:nV {#1} \l__siunitx_tmpa_tl
- }
-}
-\cs_new:Npn \__siunitx_unit_format_power:w #1 . #2 . #3 \q_stop
+ }
+\AtBeginDocument
{
- \exp_not:n {#1}
- \tl_if_blank:nF {#2}
+ \@ifpackageloaded { colortbl }
{
- \exp_not:V \l__siunitx_output_decimal_tl
- \exp_not:n {#2}
+ \cs_new_eq:NN
+ \__siunitx_table_align_auxii:nn
+ \__siunitx_table_align_auxi:nn
+ \cs_set_protected:Npn \__siunitx_table_align_auxi:nn #1#2
+ {
+ \__siunitx_table_skip:n{ 0pt~plus~-0.5fill }
+ \__siunitx_table_align_auxii:nn {#1} {#2}
+ \__siunitx_table_skip:n { 0pt~plus~-0.5fill }
+ }
}
+ { }
}
-\cs_new_protected:Npn \__siunitx_unit_format_power_brackets: {
- \tl_set:Nx \l__siunitx_tmpb_tl
- { bracket- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
- {
- \tl_put_left:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_open_tl
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_close_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_power_per: {
- \tl_set:Nx \l__siunitx_tmpb_tl
- { per- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
- {
- \bool_if:NF \l__siunitx_per_fraction_bool
- {
- \tl_if_in:NnTF \l__siunitx_tmpa_tl { - }
- {
- \cs_set:Npn \__siunitx_tmp:w ##1 - ##2 \q_stop
- { \tl_set:Nn \l__siunitx_tmpa_tl {##2} }
- \exp_after:wN \__siunitx_tmp:w \l__siunitx_tmpa_tl \q_stop
- }
- { \tl_put_left:Nn \l__siunitx_tmpa_tl { - } }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_power_repeat: {
- \tl_set:Nx \l__siunitx_tmpb_tl
- { per- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
- {
- \tl_put_left:NV \l__siunitx_unit_current_tl \l__siunitx_per_symbol_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_prefix: {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { prefix-symbol- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- {
- \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- \l__siunitx_unit_prefix_current_tl
- \bool_if:NTF \l__siunitx_prefix_symbols_bool
- { \__siunitx_unit_format_prefix_symbol: }
- { \__siunitx_unit_format_prefix_number: }
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_prefix_number: {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { prefix-base- \int_use:N \l__siunitx_unit_int }
- \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- \l__siunitx_tmpa_tl
- \int_compare:nNnT { \l__siunitx_unit_prefix_base_int } = { 0 }
- {
- \int_set:Nn \l__siunitx_unit_prefix_base_int
- { \l__siunitx_tmpa_tl }
- }
- \int_compare:nNnTF
- { \l__siunitx_unit_prefix_base_int } = { \l__siunitx_tmpa_tl }
- { \__siunitx_unit_format_prefix_number_calc: }
- { \msg_error:nn { siunitx } { prefix-base-mismatch } }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_prefix_number_calc: {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { power- \int_use:N \l__siunitx_unit_int }
- \prop_get:NVNF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- \l__siunitx_tmpa_tl
- { \tl_set:Nn \l__siunitx_tmpa_tl { 1 } }
- \tl_set:Nx \l__siunitx_tmpb_tl
- { unit- \int_use:N \l__siunitx_unit_int }
- \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpb_tl
- \l__siunitx_tmpb_tl
- \str_if_eq:VnT \l__siunitx_tmpb_tl { \gram }
- {
- \tl_set:Nx \l__siunitx_unit_prefix_current_tl
- { \int_eval:n { \l__siunitx_unit_prefix_current_tl - 3 } }
- \tl_set:Nx \l__siunitx_tmpb_tl
- { symbol- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpb_tl { kg }
- }
- \tl_set:Nx \l__siunitx_unit_prefix_current_tl
- {
- \int_eval:n
- { \l__siunitx_unit_prefix_current_tl * \l__siunitx_tmpa_tl }
- }
- \tl_set:Nx \l__siunitx_tmpa_tl
- { per- \int_use:N \l__siunitx_unit_int }
- \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- {
- \int_set:Nn \l__siunitx_unit_prefix_int
- {
- \l__siunitx_unit_prefix_int
- - \l__siunitx_unit_prefix_current_tl
- }
- }
- {
- \int_set:Nn \l__siunitx_unit_prefix_int
- {
- \l__siunitx_unit_prefix_int
- + \l__siunitx_unit_prefix_current_tl
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_prefix_symbol: {
- \tl_set_eq:NN \l__siunitx_unit_current_tl
- \l__siunitx_unit_prefix_current_tl
-}
-\cs_new_protected:Npn \__siunitx_unit_format_qualifier: {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { qualifier- \int_use:N \l__siunitx_unit_int }
- \prop_get:NVNT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- \l__siunitx_tmpa_tl
- {
- \use:c
- {
- __siunitx_unit_format_qualifier_
- \l__siunitx_qualifier_mode_tl :
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_qualifier_brackets: {
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_open_tl
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_close_tl
-}
-\cs_new_protected:Npn \__siunitx_unit_format_qualifier_phrase:
+\keys_define:nn { siunitx }
{
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_qualifier_phrase_tl
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
- \tl_set:Nx \l__siunitx_tmpa_tl
- { bracket- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
- }
-\char_set_catcode_active:N \~
-\cs_new_protected:Npn \__siunitx_unit_format_qualifier_space: {
- \tl_put_right:Nn \l__siunitx_unit_current_tl { \text { ~ } }
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
- \tl_set:Nx \l__siunitx_tmpa_tl
- { bracket- \int_use:N \l__siunitx_unit_int }
- \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
-}
-\char_set_catcode_space:N \~
-\cs_new_protected:Npn \__siunitx_unit_format_qualifier_subscript: {
- \tl_put_right:Nx \l__siunitx_unit_current_tl
- { \exp_not:N \PrintSubscript { \exp_not:V \l__siunitx_tmpa_tl } }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_qualifier_text: {
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
-}
-\cs_new_protected:Npn \__siunitx_unit_format_sorted:
- {
- \tl_set:Nx \l__siunitx_unit_tl
- {
- \exp_not:V \l__siunitx_unit_numerator_tl
- \bool_lazy_or:nnF
- { \tl_if_empty_p:N \l__siunitx_unit_numerator_tl }
- { \tl_if_empty_p:N \l__siunitx_unit_denominator_tl }
- {
- \exp_not:N \l__siunitx_unit_product_tl
- }
- \exp_not:V \l__siunitx_unit_denominator_tl
- }
- }
-\cs_new_protected:Npn \__siunitx_unit_format_symbol: {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { symbol- \int_use:N \l__siunitx_unit_int }
- \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
- \l__siunitx_tmpa_tl
- {
- \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
- }
- { \__siunitx_unit_format_symbol_aux: }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_symbol_aux: {
- \msg_error:nn { siunitx } { prefix-only }
-}
-\cs_new_protected:Npn \__siunitx_unit_format_symbol_aux_alt: {
- \int_compare:nNnTF { \l__siunitx_unit_int } = { 1 }
- {
- \prop_remove:Nn \l__siunitx_unit_prop { prefix-1 }
- \prop_remove:Nn \l__siunitx_unit_prop { prefix-symbol-1 }
- \prop_remove:Nn \l__siunitx_unit_prop { prefix-base-1 }
- \prop_remove:Nn \l__siunitx_unit_prop { total-units }
- \prop_if_empty:NF \l__siunitx_unit_prop
- { \msg_error:nn { siunitx } { prefix-only } }
- }
- { \msg_error:nn { siunitx } { prefix-only } }
-}
-\bool_new:N \l__siunitx_multi_brackets_bool
-\bool_new:N \l__siunitx_multi_repeat_bool
-\bool_new:N \l__siunitx_product_brackets_bool
-\bool_new:N \l__siunitx_product_power_bool
-\bool_new:N \l__siunitx_product_repeat_bool
-\bool_new:N \l__siunitx_number_unit_repeat_bool
-\keys_define:nn { siunitx } {
- allow-number-unit-breaks .bool_set:N =
- \l__siunitx_number_unit_breaks_bool,
- multi-part-units .choice:,
- multi-part-units
- / brackets .code:n =
- {
- \bool_set_true:N \l__siunitx_multi_brackets_bool
- \bool_set_false:N \l__siunitx_multi_repeat_bool
- },
- multi-part-units
- / repeat .code:n =
- {
- \bool_set_false:N \l__siunitx_multi_brackets_bool
- \bool_set_true:N \l__siunitx_multi_repeat_bool
- },
- multi-part-units
- / single .code:n =
- {
- \bool_set_false:N \l__siunitx_multi_brackets_bool
- \bool_set_false:N \l__siunitx_multi_repeat_bool
- },
- number-unit-product .tl_set:N =
- \l__siunitx_number_unit_product_tl,
- number-unit-separator .tl_set:N =
- \l__siunitx_number_unit_product_tl,
- product-units .choice:,
- product-units
- / brackets .code:n =
- {
- \bool_set_true:N \l__siunitx_product_brackets_bool
- \bool_set_false:N \l__siunitx_product_power_bool
- \bool_set_false:N \l__siunitx_product_repeat_bool
- },
- product-units
- / brackets-power .code:n =
+ table-text-alignment .choices:nn =
+ { center , left , right }
+ { \tl_set:Nn \l__siunitx_table_align_text_tl {#1} } ,
+ }
+\tl_new:N \l__siunitx_table_align_text_tl
+\cs_new_protected:Npn \__siunitx_table_print_text:n #1
+ {
+ \bool_set_true:N \l__siunitx_table_text_bool
+ \use:c { __siunitx_table_align_ \l__siunitx_table_align_text_tl :n } {#1}
+ }
+\cs_generate_variant:Nn \__siunitx_table_print_text:n { V }
+\box_new:N \l__siunitx_table_integer_box
+\box_new:N \l__siunitx_table_decimal_box
+\cs_new_eq:NN \__siunitx_table_fil: \tex_hfil:D
+\cs_new:Npn \__siunitx_table_cleanup_decimal:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil
+ { #1#2#3#4#5#6#7 }
+\cs_new_protected:Npn \__siunitx_table_center_marker:
+ {
+ \dim_compare:nNnTF
+ { \box_wd:N \l__siunitx_table_integer_box }
+ > { \box_wd:N \l__siunitx_table_decimal_box }
{
- \bool_set_true:N \l__siunitx_product_brackets_bool
- \bool_set_true:N \l__siunitx_product_power_bool
- \bool_set_false:N \l__siunitx_product_repeat_bool
- },
- product-units
- / power .code:n =
+ \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box
+ { \box_wd:N \l__siunitx_table_integer_box }
+ {
+ \hbox_unpack:N \l__siunitx_table_decimal_box
+ \__siunitx_table_fil:
+ }
+ }
{
- \bool_set_false:N \l__siunitx_product_brackets_bool
- \bool_set_true:N \l__siunitx_product_power_bool
- \bool_set_false:N \l__siunitx_product_repeat_bool
- },
- product-units
- / repeat .code:n =
+ \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box
+ { \box_wd:N \l__siunitx_table_decimal_box }
+ {
+ \__siunitx_table_fil:
+ \hbox_unpack:N \l__siunitx_table_integer_box
+ }
+ }
+ }
+\keys_define:nn { siunitx }
+ {
+ table-alignment .meta:n =
+ { table-number-alignment = #1 , table-text-alignment = #1 },
+ table-alignment-mode .choices:nn =
+ { none , format , marker }
+ { \tl_set_eq:NN \l__siunitx_table_align_mode_tl \l_keys_choice_tl } ,
+ table-auto-round .bool_set:N =
+ \l__siunitx_table_auto_round_bool ,
+ table-format .code:n =
+ {
+ \__siunitx_table_split:nNNN {#1}
+ \l__siunitx_table_before_model_tl
+ \l__siunitx_table_model_tl
+ \l__siunitx_table_after_model_tl
+ \exp_args:NV \__siunitx_table_generate_model:n \l__siunitx_table_model_tl
+ \tl_set:Nn \l__siunitx_table_align_mode_tl { format }
+ } ,
+ table-number-alignment .choices:nn =
+ { center , left , right }
+ { \tl_set_eq:NN \l__siunitx_table_align_number_tl \l_keys_choice_tl }
+ }
+\tl_new:N \l__siunitx_table_align_mode_tl
+\tl_new:N \l__siunitx_table_align_number_tl
+\tl_new:N \l__siunitx_table_format_tl
+\tl_new:N \l__siunitx_table_before_model_tl
+\tl_new:N \l__siunitx_table_model_tl
+\tl_new:N \l__siunitx_table_after_model_tl
+\cs_new_protected:Npn \__siunitx_table_generate_model:n #1
+ {
+ \group_begin:
+ \bool_set_true:N \l_siunitx_number_parse_bool
+ \keys_set:nn { siunitx } { retain-explicit-plus = true }
+ \siunitx_number_parse:nN {#1} \l__siunitx_table_format_tl
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_table_format_tl \l__siunitx_table_format_tl
+ \tl_if_empty:NF \l__siunitx_table_format_tl
{
- \bool_set_false:N \l__siunitx_product_brackets_bool
- \bool_set_false:N \l__siunitx_product_power_bool
- \bool_set_true:N \l__siunitx_product_repeat_bool
- },
- product-units
- / single .code:n =
+ \exp_after:wN \__siunitx_table_generate_model:nnnnnnn
+ \l__siunitx_table_format_tl
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_generate_model:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \tl_set:Nx \l__siunitx_table_model_tl
{
- \bool_set_false:N \l__siunitx_product_brackets_bool
- \bool_set_false:N \l__siunitx_product_power_bool
- \bool_set_false:N \l__siunitx_product_repeat_bool
- },
-}
-\keys_set:nn { siunitx } {
- multi-part-units = brackets,
- number-unit-product = \, ,
- product-units = repeat
-}
-\cs_new_protected:Npn \__siunitx_unit_output:nn #1#2 {
- \cs_set_eq:NN \__siunitx_unit_format_symbol_aux:
- \__siunitx_unit_format_symbol_aux_alt:
- \cs_set_eq:NN \__siunitx_unit_format_fraction_symbol_aux_ii:
- \__siunitx_unit_format_fraction_symbol_aux_alt:
- \__siunitx_unit_in:nn {#1} {#2}
- \int_compare:nNnTF { \l__siunitx_unit_prefix_int } = { 0 }
- {
- \str_if_eq:VnT \l__siunitx_per_mode_tl { symbol }
+ \exp_not:n { {#1} {#2} }
+ { \prg_replicate:nn {#3} { 8 } }
+ { \prg_replicate:nn { 0 #4 } { 8 } }
{
- \int_compare:nNnT { \l__siunitx_unit_numerator_int } = { 0 }
+ \tl_if_blank:nF {#5}
{
- \bool_if:NT \l__siunitx_unit_parse_bool
- { \__siunitx_print:nn { unit } { 1 } }
+ \use:c { __siunitx_table_generate_model_ \tl_head:n {#5} :nnw }
+ {#4} #5
}
}
- }
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
+ \exp_not:n { {#6} }
{
- \int_use:N \l__siunitx_unit_prefix_base_int
- \exp_not:N \PrintSuperscript
- { \int_use:N \l__siunitx_unit_prefix_int }
+ \int_compare:nNnTF {#7} = 0
+ { 0 }
+ { \prg_replicate:nn {#7} { 8 } }
}
- \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
- \__siunitx_unit_output_number_sep:
- }
- \__siunitx_print:nV { unit } \l__siunitx_unit_tl
-}
-\cs_generate_variant:Nn \__siunitx_unit_output:nn { V }
-\cs_new_protected:Npn \__siunitx_unit_output_number_sep: {
- \bool_if:NTF \l__siunitx_number_unit_breaks_bool
- { \penalty \binoppenalty } { \nobreak }
- \bool_if:NTF \l__siunitx_per_auto_bool
- {
- \mode_if_math:TF
- {
- \tex_mathchoice:D
- { \l__siunitx_number_unit_product_tl }
- { \__siunitx_unit_output_number_sep_aux: }
- { \__siunitx_unit_output_number_sep_aux: }
- { \__siunitx_unit_output_number_sep_aux: }
- }
- { \__siunitx_unit_output_number_sep_aux: }
- }
- { \__siunitx_unit_output_number_sep_aux: }
-}
-\cs_new_protected:Npn \__siunitx_unit_output_number_sep_aux: {
- \bool_if:NF \l__siunitx_omit_unit_space_bool
- { \l__siunitx_number_unit_product_tl }
-}
-\cs_new_protected:Npn \__siunitx_unit_output_pre_print: {
- \tl_if_empty:NF \l__siunitx_pre_unit_tl
- {
- \nobreak
- \__siunitx_print:nV { unit } \l__siunitx_pre_unit_tl
- }
-}
-\cs_new_protected:Npn \__siunitx_unit_output_print: {
- \int_compare:nNnF { \l__siunitx_unit_prefix_int } = { 0 }
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- {
- \bool_if:NTF \l__siunitx_tight_bool
- {
- \exp_not:N \ensuremath
- { { \exp_not:V \l__siunitx_exponent_product_tl } }
- }
- {
- \exp_not:N \ensuremath
- { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
- }
- \int_use:N \l__siunitx_unit_prefix_base_int
- ^ { \int_use:N \l__siunitx_unit_prefix_int }
- }
- \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
- }
- \tl_if_empty:NF \l__siunitx_unit_tl
- {
- \__siunitx_unit_output_number_sep:
- \__siunitx_print:nV { unit } \l__siunitx_unit_tl
- }
-}
-\keys_define:nn { siunitx } {
- preunit .tl_set:N = \l__siunitx_preunit_tl ,
-}
-\tl_new:N \l__siunitx_pre_unit_tl
-\int_new:N \l__siunitx_number_product_int
-\cs_new_protected:Npn \__siunitx_combined:nnnn #1#2#3#4 {
- \IfNoValueTF {#3}
- { \tl_clear:N \l__siunitx_pre_unit_tl }
- {
- \group_begin:
- \__siunitx_unit_in:nn {#3} {#1}
- \cs_set_eq:NN \l__siunitx_pre_unit_tl \l__siunitx_unit_tl
- \exp_args:NNNo \group_end:
- \tl_set:Nn \l__siunitx_pre_unit_tl { \l__siunitx_unit_tl }
- }
- \cs_set_eq:NN \l__siunitx_brackets_bool
- \l__siunitx_multi_brackets_bool
- \__siunitx_combined_unit:nnn {#2} {#4} {#1}
- \__siunitx_combined_output:n {#2}
-}
-\cs_new_protected:Npn \__siunitx_combined_output:n #1 {
- \bool_if:NTF \l__siunitx_number_parse_bool
- {
- \tl_clear:N \l__siunitx_number_out_tl
- \bool_set_false:N \l__siunitx_number_compound_bool
- \__siunitx_number_output_parse:n {#1}
- }
+ }
+ }
+\cs_new:Npn \__siunitx_table_generate_model_S:nnw #1#2#3
+ {
+ { S }
{
- \__siunitx_unit_output_pre_print:
- \__siunitx_print:nn { number } { \ensuremath {#1} }
- \__siunitx_unit_output_print:
+ \exp_args:Nff \__siunitx_table_generate_model_S:nnn
+ { \tl_count:n {#1} } { \tl_count:n {#3} }
+ {#3}
}
-}
-\cs_new_protected:Npn \__siunitx_combined_unit:nnn #1#2#3 {
- \bool_if:NTF \l__siunitx_product_power_bool
- {
- \__siunitx_combined_product_count:n {#1}
- \int_compare:nNnTF { \l__siunitx_number_product_int } > { 0 }
+ }
+\cs_new:Npn \__siunitx_table_generate_model_S:nnn #1#2#3
+ {
+ \prg_replicate:nn
+ {
+ \int_compare:nNnTF {#2} > {#1}
+ {
+ \str_range:nnn {#3} { 1 } {#1}
+ +
+ \str_range:nnn {#3} { 1 + #1 } {#2}
+ }
+ {#3}
+ }
+ { 8 }
+ }
+\cs_new_protected:Npn \__siunitx_table_direct_begin:
+ { \__siunitx_table_direct_begin:w }
+\cs_new_protected:Npn \__siunitx_table_direct_begin:w #1 \ignorespaces
+ {
+ #1
+ \peek_catcode_ignore_spaces:NTF \c_group_begin_token
+ { \__siunitx_table_print_text:n }
+ {
+ \m@th
+ \use:c { __siunitx_table_direct_ \l__siunitx_table_align_mode_tl : }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_table_direct_end:
+ { \use:c { __siunitx_table_direct_ \l__siunitx_table_align_mode_tl _end: } }
+\cs_new_protected:Npn \__siunitx_table_direct_marker:
+ {
+ \hbox_set:Nn \l__siunitx_table_tmp_box
+ { \ensuremath { \mathord { \l_siunitx_number_output_decimal_tl } } }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box
+ { \box_wd:N \l__siunitx_table_tmp_box }
+ { \__siunitx_table_fil: }
+ \hbox_set:Nw \l__siunitx_table_integer_box
+ \c_math_toggle_token
+ \tl_map_inline:Nn \l_siunitx_number_input_decimal_tl
{
- \int_incr:N \l__siunitx_number_product_int
- \tl_set:Nn \l__siunitx_tmpa_tl {#2}
- \tl_set:Nx \l__siunitx_tmpb_tl
- { \tothe { \exp_not:V \l__siunitx_number_product_int } }
- \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
- \__siunitx_unit_in:Vn \l__siunitx_tmpa_tl {#3}
+ \char_set_active_eq:NN ##1 \__siunitx_table_direct_marker_switch:
+ \char_set_mathcode:nn { `##1 } { "8000 }
}
- { \__siunitx_unit_in:nn {#2} {#3} }
- }
- { \__siunitx_unit_in:nn {#2} {#3} }
-}
-\cs_new_protected:Npn \__siunitx_combined_product_count:n #1 {
- \int_zero:N \l__siunitx_number_product_int
- \tl_set:Nn \l__siunitx_tmpa_tl {#1}
- \tl_map_function:NN \l__siunitx_input_product_tl
- \__siunitx_combined_product_count_aux:N
-}
-\cs_new_protected:Npn \__siunitx_combined_product_count_aux:N #1 {
- \tl_if_in:NnT \l__siunitx_tmpa_tl {#1}
- {
- \int_incr:N \l__siunitx_number_product_int
- \tl_remove_once:Nn \l__siunitx_tmpa_tl {#1}
- \__siunitx_combined_product_count_aux:N #1
- }
-}
-\bool_new:N \l__siunitx_list_brackets_bool
-\bool_new:N \l__siunitx_list_repeat_bool
-\tl_new:N \l__siunitx_list_current_tl
-\tl_new:N \l__siunitx_list_tl
-\keys_define:nn { siunitx }
+ }
+\cs_new_protected:Npn \__siunitx_table_direct_marker_switch:
{
- list-final-separator .tl_set:N = \l__siunitx_list_separator_final_tl ,
- list-pair-separator .tl_set:N = \l__siunitx_list_separator_pair_tl ,
- list-separator .tl_set:N = \l__siunitx_list_separator_tl ,
- list-units .choice:,
- list-units
- / brackets .code:n =
- {
- \bool_set_true:N \l__siunitx_list_brackets_bool
- \bool_set_false:N \l__siunitx_list_repeat_bool
- },
- list-units
- / repeat .code:n =
- {
- \bool_set_false:N \l__siunitx_list_brackets_bool
- \bool_set_true:N \l__siunitx_list_repeat_bool
- },
- list-units
- / single .code:n =
+ \c_math_toggle_token
+ \hbox_set_end:
+ \hbox_set:Nw \l__siunitx_table_decimal_box
+ \c_math_toggle_token
+ \l_siunitx_number_output_decimal_tl
+ }
+\cs_new_protected:Npn \__siunitx_table_direct_marker_end:
+ {
+ \c_math_toggle_token
+ \hbox_set_end:
+ \__siunitx_table_center_marker:
+ \box_use_drop:N \l__siunitx_table_integer_box
+ \box_use_drop:N \l__siunitx_table_decimal_box
+ }
+\cs_new_protected:Npn \__siunitx_table_direct_format:
+ {
+ \tl_set:Nx \l__siunitx_table_tmp_tl
+ { \siunitx_number_output:NN \l__siunitx_table_model_tl \q_nil }
+ \exp_after:wN \__siunitx_table_direct_format_aux:w
+ \l__siunitx_table_tmp_tl \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_table_direct_format_aux:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_stop
+ {
+ \hbox_set:Nn \l__siunitx_table_tmp_box
+ { \ensuremath { \__siunitx_table_cleanup_decimal:w #4 } }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box
+ { \box_wd:N \l__siunitx_table_tmp_box }
+ { \__siunitx_table_fil: }
+ \hbox_set:Nn \l__siunitx_table_tmp_box { \ensuremath { #1#2#3 } }
+ \hbox_set_to_wd:Nnw \l__siunitx_table_integer_box
+ { \box_wd:N \l__siunitx_table_tmp_box }
+ \c_math_toggle_token
+ \tl_map_inline:Nn \l_siunitx_number_input_decimal_tl
{
- \bool_set_false:N \l__siunitx_list_brackets_bool
- \bool_set_false:N \l__siunitx_list_repeat_bool
+ \char_set_active_eq:NN ##1 \__siunitx_table_direct_format_switch:
+ \char_set_mathcode:nn { `##1 } { "8000 }
}
+ \__siunitx_table_fil:
}
-\keys_set:nn { siunitx }
+\cs_new_protected:Npn \__siunitx_table_direct_format_switch:
{
- list-final-separator = { ~ and ~ } ,
- list-pair-separator = { ~ and ~ } ,
- list-separator = { , ~ } ,
- list-units = repeat
-}
-\cs_new_protected:Npn \__siunitx_list_numbers:n #1
+ \c_math_toggle_token
+ \hbox_set_end:
+ \hbox_set_to_wd:Nnw \l__siunitx_table_decimal_box
+ { \box_wd:N \l__siunitx_table_decimal_box }
+ \c_math_toggle_token
+ \mathord { \l_siunitx_number_output_decimal_tl }
+ }
+\cs_new_protected:Npn \__siunitx_table_direct_format_end:
{
- \tl_clear:N \l__siunitx_unit_tl
- \tl_clear:N \l__siunitx_preunit_tl
- \__siunitx_list_numbers_aux_i:n {#1}
+ \c_math_toggle_token
+ \__siunitx_table_fil:
+ \hbox_set_end:
+ \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n }
+ {
+ \box_use_drop:N \l__siunitx_table_integer_box
+ \box_use_drop:N \l__siunitx_table_decimal_box
+ }
}
-\cs_new_protected:Npn \__siunitx_list_numbers_aux_i:n #1
+\cs_new_protected:Npn \__siunitx_table_direct_none: { \c_math_toggle_token }
+\cs_new_protected:Npn \__siunitx_table_direct_none_end: { \c_math_toggle_token }
+\box_new:N \l__siunitx_table_before_box
+\box_new:N \l__siunitx_table_after_box
+\dim_new:N \l__siunitx_table_carry_dim
+\keys_define:nn { siunitx }
{
- \bool_set_true:N \l__siunitx_list_first_bool
- \tl_clear:N \l__siunitx_list_current_tl
- \int_compare:nNnTF { \tl_count:n {#1} } > 2
+ table-align-comparator .bool_set:N =
+ \l__siunitx_table_align_comparator_bool ,
+ table-align-exponent .bool_set:N =
+ \l__siunitx_table_align_exponent_bool ,
+ table-align-text-after .bool_set:N =
+ \l__siunitx_table_align_after_bool ,
+ table-align-text-before .bool_set:N =
+ \l__siunitx_table_align_before_bool ,
+ table-align-uncertainty .bool_set:N =
+ \l__siunitx_table_align_uncertainty_bool
+ }
+\cs_new_protected:Npn \__siunitx_table_print:nnn #1#2#3
+ { \use:c { __siunitx_table_print_ \l__siunitx_table_align_mode_tl :nnn } {#1} {#2} {#3} }
+\cs_generate_variant:Nn \__siunitx_table_print:nnn { VVV }
+\cs_new_protected:Npn \__siunitx_table_print_marker:nnn #1#2#3
+ {
+ \hbox_set:Nn \l__siunitx_table_before_box {#1}
+ \dim_compare:nNnT { \box_wd:N \l__siunitx_table_before_box } = { 0pt }
+ {
+ \box_clear:N \l__siunitx_table_before_box
+ #1
+ }
+ \hbox_set:Nn \l__siunitx_table_after_box {#3}
+ \dim_compare:nNnTF
+ { \box_wd:N \l__siunitx_table_after_box }
+ > { \box_wd:N \l__siunitx_table_before_box }
{
- \tl_map_function:nN {#1} \__siunitx_list_numbers_aux_ii:n
- \l__siunitx_list_tl
- \l__siunitx_list_separator_final_tl
- \l__siunitx_list_current_tl
+ \hbox_set_to_wd:Nnn \l__siunitx_table_before_box
+ { \box_wd:N \l__siunitx_table_after_box }
+ {
+ \__siunitx_table_fil:
+ \hbox_unpack:N \l__siunitx_table_before_box
+ }
}
{
- \int_compare:nNnTF { \tl_count:n {#1} } = 2
- { \__siunitx_list_numbers_aux:nn #1 }
- { \__siunitx_combined_output:n #1 }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_after_box
+ { \box_wd:N \l__siunitx_table_before_box }
+ {
+ \hbox_unpack:N \l__siunitx_table_after_box
+ \__siunitx_table_fil:
+ }
}
+ \box_use_drop:N \l__siunitx_table_before_box
+ \siunitx_number_parse:nN {#2} \l__siunitx_table_tmp_tl
+ \siunitx_number_process:NN \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl
+ \tl_set:Nx \l__siunitx_table_tmp_tl
+ { \siunitx_number_output:NN \l__siunitx_table_tmp_tl \q_nil }
+ \exp_after:wN \__siunitx_table_print_marker:w
+ \l__siunitx_table_tmp_tl \q_stop
+ \box_use_drop:N \l__siunitx_table_after_box
}
-\cs_new_protected:Npn \__siunitx_list_numbers_aux_ii:n #1
+\cs_new_protected:Npn \__siunitx_table_print_marker:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_stop
{
- \tl_if_empty:NTF \l__siunitx_list_tl
- { \tl_set_eq:NN \l__siunitx_list_tl \l__siunitx_list_current_tl }
+ \hbox_set:Nn \l__siunitx_table_integer_box
+ { \siunitx_print_number:n { #1#2#3 } }
+ \hbox_set:Nn \l__siunitx_table_decimal_box
{
- \tl_put_right:NV \l__siunitx_list_tl \l__siunitx_list_separator_tl
- \tl_put_right:NV \l__siunitx_list_tl \l__siunitx_list_current_tl
+ \siunitx_print_number:x
+ { \__siunitx_table_print_marker_aux:w #4 }
}
- \tl_set:Nn \l__siunitx_list_current_tl { \__siunitx_combined_output:n {#1} }
+ \__siunitx_table_center_marker:
+ \box_use_drop:N \l__siunitx_table_integer_box
+ \box_use_drop:N \l__siunitx_table_decimal_box
}
-\cs_new_protected:Npn \__siunitx_list_numbers_aux:nn #1#2
+\cs_new:Npn \__siunitx_table_print_marker_aux:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil
{
- \__siunitx_combined_output:n {#1}
- \l__siunitx_list_separator_pair_tl
- \__siunitx_combined_output:n {#2}
+ \exp_not:n {#1#2#3#4#5}
+ \tl_if_blank:nT {#1#2#3#4#5} { { } }
+ \exp_not:n {#6#7}
}
-\cs_new_protected:Npn \__siunitx_list_units:nnn #1#2#3
+\cs_new_protected:Npn \__siunitx_table_print_format:nnn #1#2#3
{
- \__siunitx_unit_parse_options:nn {#2} {#3}
- \bool_if:NTF \l__siunitx_list_repeat_bool
+ \hbox_set:Nn \l__siunitx_table_tmp_box { \l__siunitx_table_before_model_tl }
+ \hbox_set:Nn \l__siunitx_table_before_box {#1}
+ \dim_compare:nNnT { \box_wd:N \l__siunitx_table_before_box } = { 0pt }
+ {
+ \box_clear:N \l__siunitx_table_before_box
+ #1
+ }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_before_box
+ { \box_wd:N \l__siunitx_table_tmp_box }
{
- \__siunitx_unit_in:nn {#2} {#3}
- \__siunitx_list_numbers_aux_i:n {#1}
+ \__siunitx_table_fil:
+ \hbox_unpack:N \l__siunitx_table_before_box
}
+ \siunitx_number_parse:nN {#2} \l__siunitx_table_tmp_tl
+ \group_begin:
+ \bool_if:NT \l__siunitx_table_auto_round_bool
+ {
+ \exp_args:Nx \keys_set:nn { siunitx }
+ {
+ round-mode = places ,
+ round-pad = true ,
+ round-precision =
+ \exp_after:wN \__siunitx_table_print_format:nnnnnn
+ \l__siunitx_table_format_tl
+ }
+ }
+ \siunitx_number_process:NN \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl
+ \tl_set:Nx \l__siunitx_table_tmp_tl
{
- \bool_if:NT \l__siunitx_process_fixed_bool
- { \bool_set_true:N \l__siunitx_process_drop_exponent_bool }
- \bool_if:NT \l__siunitx_list_brackets_bool
- { \__siunitx_print:nV { number } \l__siunitx_bracket_open_tl }
- \__siunitx_list_numbers:n {#1}
- \bool_if:NT \l__siunitx_list_brackets_bool
- { \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl }
- \__siunitx_range_exponent:
- \__siunitx_unit_output_number_sep:
- \__siunitx_unit_output:nn {#2} {#3}
+ \siunitx_number_output:NN \l__siunitx_table_model_tl \q_nil
+ \exp_not:N \q_mark
+ \siunitx_number_output:NN \l__siunitx_table_tmp_tl \q_nil
+ }
+ \exp_after:wN \__siunitx_table_print_format_auxi:w
+ \l__siunitx_table_tmp_tl \q_stop
+ \hbox_set:Nn \l__siunitx_table_tmp_box { \l__siunitx_table_after_model_tl }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_after_box
+ { \box_wd:N \l__siunitx_table_tmp_box + \l__siunitx_table_carry_dim }
+ {
+ \bool_if:NT \l__siunitx_table_align_after_bool
+ { \skip_horizontal:n { \l__siunitx_table_carry_dim } }
+ #3
+ \__siunitx_table_fil:
+ }
+ \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n }
+ {
+ \box_use_drop:N \l__siunitx_table_before_box
+ \box_use_drop:N \l__siunitx_table_integer_box
+ \box_use_drop:N \l__siunitx_table_decimal_box
+ \box_use_drop:N \l__siunitx_table_after_box
}
}
-\bool_new:N \l__siunitx_range_brackets_bool
-\bool_new:N \l__siunitx_range_repeat_bool
-\keys_define:nn { siunitx } {
- range-phrase .tl_set:N = \l__siunitx_range_phrase_tl,
- range-units .choice:,
- range-units
- / brackets .code:n =
+\cs_new:Npn \__siunitx_table_print_format:nnnnnn #1#2#3#4#5#6#7
+ { 0 #4 }
+\cs_new_protected:Npn \__siunitx_table_print_format_auxi:w
+ #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop
+ {
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1}
+ \bool_if:NTF \l__siunitx_table_align_before_bool
{
- \bool_set_true:N \l__siunitx_range_brackets_bool
- \bool_set_false:N \l__siunitx_range_repeat_bool
- },
- range-units
- / repeat .code:n =
+ \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box
+ { \box_wd:N \l__siunitx_table_tmp_box }
+ {
+ \__siunitx_table_fil:
+ \tl_if_blank:nF {#3}
+ { \siunitx_print_number:n {#3} }
+ }
+ }
{
- \bool_set_false:N \l__siunitx_range_brackets_bool
- \bool_set_true:N \l__siunitx_range_repeat_bool
- },
- range-units
- / single .code:n =
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_integer_box {#3}
+ \hbox_set_to_wd:Nnn \l__siunitx_table_before_box
+ {
+ \box_wd:N \l__siunitx_table_before_box
+ + \box_wd:N \l__siunitx_table_tmp_box
+ - \box_wd:N \l__siunitx_table_integer_box
+ }
+ {
+ \__siunitx_table_fil:
+ \hbox_unpack:N \l__siunitx_table_before_box
+ }
+ }
+ \__siunitx_table_print_format_auxii:w #2 \q_mark #4 \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_table_print_format_auxii:w
+ #1 \q_nil #2 \q_nil #3 \q_mark #4 \q_nil #5 \q_nil #6 \q_stop
+ {
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1#2}
+ \bool_lazy_and:nnTF
+ { \l__siunitx_table_align_comparator_bool }
+ { \dim_compare_p:nNn { \box_wd:N \l__siunitx_table_integer_box } > { 0pt } }
{
- \bool_set_false:N \l__siunitx_range_brackets_bool
- \bool_set_false:N \l__siunitx_range_repeat_bool
- },
-}
-\keys_set:nn { siunitx } {
- range-phrase = { ~ to ~ },
- range-units = repeat,
-}
-\cs_new_protected:Npn \__siunitx_range_numbers:nn #1#2
+ \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box
+ {
+ \box_wd:N \l__siunitx_table_integer_box
+ + \box_wd:N \l__siunitx_table_tmp_box
+ }
+ {
+ \hbox_unpack:N \l__siunitx_table_integer_box
+ \__siunitx_table_fil:
+ \siunitx_print_number:n {#4#5}
+ }
+ }
+ {
+ \bool_if:NTF \l__siunitx_table_align_before_bool
+ {
+ \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box
+ {
+ \box_wd:N \l__siunitx_table_integer_box
+ + \box_wd:N \l__siunitx_table_tmp_box
+ }
+ {
+ \__siunitx_table_fil:
+ \hbox_unpack:N \l__siunitx_table_integer_box
+ \siunitx_print_number:n {#4#5}
+ }
+ }
+ {
+ \dim_set:Nn \l__siunitx_table_tmp_dim
+ { \box_wd:N \l__siunitx_table_integer_box }
+ \hbox_set:Nn \l__siunitx_table_integer_box
+ {
+ \hbox_unpack:N \l__siunitx_table_integer_box
+ \siunitx_print_number:n {#4#5}
+ }
+ \hbox_set_to_wd:Nnn \l__siunitx_table_before_box
+ {
+ \box_wd:N \l__siunitx_table_before_box
+ + \box_wd:N \l__siunitx_table_tmp_box
+ + \l__siunitx_table_tmp_dim
+ - \box_wd:N \l__siunitx_table_integer_box
+ }
+ {
+ \__siunitx_table_fil:
+ \hbox_unpack:N \l__siunitx_table_before_box
+ }
+ }
+ }
+ \__siunitx_table_print_format_auxiii:w #3 \q_mark #6 \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_table_print_format_auxiii:w
+ #1 \q_nil #2 \q_nil #3 \q_mark #4 \q_nil #5 \q_nil #6 \q_stop
{
- \__siunitx_range_numbers_aux:n {#1}
- \l__siunitx_range_phrase_tl
- \__siunitx_range_numbers_aux:n {#2}
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1#2}
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_decimal_box {#4#5}
+ \dim_set:Nn \l__siunitx_table_carry_dim
+ {
+ \box_wd:N \l__siunitx_table_tmp_box
+ - \box_wd:N \l__siunitx_table_decimal_box
+ }
+ \__siunitx_table_print_format_auxiv:w #3 \q_mark #6 \q_stop
}
-\cs_new_protected:Npn \__siunitx_range_numbers_aux:n #1
+\cs_new_protected:Npn \__siunitx_table_print_format_auxiv:w
+ #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop
{
- \bool_if:NTF \l__siunitx_number_parse_bool
+ \tl_if_blank:nTF {#1}
+ { \__siunitx_table_print_format_auxv:w }
+ { \__siunitx_table_print_format_auxvi:w }
+ #1#2 \q_mark #3#4 \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_table_print_format_auxv:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_mark
+ #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop
+ { \__siunitx_table_print_format_auxvii:w #4 \q_mark #8 \q_stop }
+\cs_new_protected:Npn \__siunitx_table_print_format_auxvi:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_mark
+ #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop
+ {
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #1#2#3 }
+ \dim_set:Nn \l__siunitx_table_tmp_dim { \box_wd:N \l__siunitx_table_tmp_box }
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #5#6#7 }
+ \__siunitx_table_print_format_after:N \l__siunitx_table_align_uncertainty_bool
+ \__siunitx_table_print_format_auxvii:w #4 \q_mark #8 \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_table_print_format_auxvii:w
+ #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop
+ {
+ \tl_if_blank:nF {#2}
{
- \tl_clear:N \l__siunitx_number_out_tl
- \tl_clear:N \l__siunitx_number_out_saved_tl
- \bool_set_false:N \l__siunitx_number_compound_bool
- \__siunitx_number_output_parse:n {#1}
- \bool_if:NT \l__siunitx_number_compound_bool
- { \msg_error:nnx { siunitx } { multi-part-range } {#1} }
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #1#2 }
+ \dim_set:Nn \l__siunitx_table_tmp_dim { \box_wd:N \l__siunitx_table_tmp_box }
+ \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #3#4 }
+ \__siunitx_table_print_format_after:N \l__siunitx_table_align_exponent_bool
}
+ }
+\cs_new_protected:Npn \__siunitx_table_print_format_box:Nn #1#2
+ {
+ \hbox_set:Nn #1
{
- \__siunitx_unit_output_pre_print:
- \__siunitx_print:nn { number } {#1}
- \__siunitx_unit_output_print:
+ \tl_if_blank:nF {#2}
+ { \siunitx_print_number:n {#2} }
}
}
-\cs_new_protected:Npn \__siunitx_range_unit:nnnn #1#2#3#4 {
- \__siunitx_unit_parse_options:nn {#1} {#2}
- \bool_if:NTF \l__siunitx_range_repeat_bool
- {
- \__siunitx_unit_in:nn {#1} {#2}
- \__siunitx_range_numbers_aux:n {#3}
- \l__siunitx_range_phrase_tl
- \__siunitx_range_numbers_aux:n {#4}
- }
- {
- \bool_if:NT \l__siunitx_process_fixed_bool
- { \bool_set_true:N \l__siunitx_process_drop_exponent_bool }
- \bool_if:NT \l__siunitx_range_brackets_bool
- { \__siunitx_print:nV { number } \l__siunitx_bracket_open_tl }
- \__siunitx_range_numbers:nn {#3} {#4}
- \bool_if:NT \l__siunitx_range_brackets_bool
- { \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl }
- \__siunitx_range_exponent:
- \__siunitx_unit_output_number_sep:
- \__siunitx_unit_output:nn {#1} {#2}
- }
-}
-\cs_new_protected:Npn \__siunitx_range_exponent:
+\cs_new_protected:Npn \__siunitx_table_print_format_after:N #1
{
- \bool_if:NT \l__siunitx_process_fixed_bool
+ \bool_if:NTF #1
{
- \tl_set_eq:NN \l__siunitx_tmpa_tl \l__siunitx_exponent_product_tl
- \bool_if:NT \l__siunitx_tight_bool
+ \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box
+ {
+ \box_wd:N \l__siunitx_table_decimal_box
+ + \l__siunitx_table_carry_dim
+ + \box_wd:N \l__siunitx_table_tmp_box
+ }
{
- \tl_set:Nx \l__siunitx_tmpa_tl
- { \exp_not:N \mathord \exp_not:o \l__siunitx_tmpa_tl }
+ \hbox_unpack:N \l__siunitx_table_decimal_box
+ \__siunitx_table_fil:
+ \hbox_unpack:N \l__siunitx_table_tmp_box
}
- \tl_set:Nx \l__siunitx_tmpa_tl
+ \dim_set:Nn \l__siunitx_table_carry_dim
{
- \exp_not:N \ensuremath { { } \exp_not:o \l__siunitx_tmpa_tl { } }
- 10 \exp_not:N \PrintSuperscript
- { \int_use:N \l__siunitx_process_fixed_int }
+ \l__siunitx_table_tmp_dim
+ - \box_wd:N \l__siunitx_table_tmp_box
+ }
+ }
+ {
+ \hbox_set:Nn \l__siunitx_table_decimal_box
+ {
+ \hbox_unpack:N \l__siunitx_table_decimal_box
+ \hbox_unpack:N \l__siunitx_table_tmp_box
+ }
+ \dim_add:Nn \l__siunitx_table_carry_dim
+ {
+ \l__siunitx_table_tmp_dim
+ - \box_wd:N \l__siunitx_table_tmp_box
}
- \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
}
}
-\AtBeginDocument {
- \@ifpackageloaded { cellspace }
+\cs_new_protected:Npn \__siunitx_table_print_none:nnn #1#2#3
+ {
+ \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n }
{
- \cs_if_exist:NT \NC@find@S
+ #1
+ \siunitx_number_format:nN {#2} \l__siunitx_table_tmp_tl
+ \siunitx_print_number:V \l__siunitx_table_tmp_tl
+ #3
+ }
+ }
+\keys_set:nn { siunitx }
+ {
+ table-align-comparator = true ,
+ table-align-exponent = true ,
+ table-align-text-after = true ,
+ table-align-text-before = true ,
+ table-align-uncertainty = true ,
+ table-alignment = center ,
+ table-auto-round = false ,
+ table-column-width = 0pt ,
+ table-fixed-width = false ,
+ table-format = 2.2 ,
+ table-number-alignment = center ,
+ table-text-alignment = center ,
+ table-alignment-mode = marker
+ }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
+\fp_new:N \l__siunitx_unit_tmp_fp
+\int_new:N \l__siunitx_unit_tmp_int
+\tl_new:N \l__siunitx_unit_tmp_tl
+\tl_const:Nx \c__siunitx_unit_math_subscript_tl
+ { \char_generate:nn { `\_ } { 8 } }
+\bool_new:N \l__siunitx_unit_parsing_bool
+\bool_new:N \l__siunitx_unit_test_bool
+\prg_new_protected_conditional:Npnn \__siunitx_unit_if_symbolic:n #1 { TF }
+ {
+ \group_begin:
+ \bool_set_true:N \l__siunitx_unit_test_bool
+ \protected@edef \l__siunitx_unit_tmp_tl {#1}
+ \exp_args:NNV \group_end:
+ \tl_if_blank:nTF \l__siunitx_unit_tmp_tl
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\seq_new:N \l_siunitx_unit_symbolic_seq
+\seq_new:N \l_siunitx_unit_seq
+\cs_new_protected:Npn \__siunitx_unit_set_symbolic:Nnn #1
+ { \__siunitx_unit_set_symbolic:Nnnn #1 { } }
+\cs_new_protected:Npn \__siunitx_unit_set_symbolic:Npnn #1#2#
+ { \__siunitx_unit_set_symbolic:Nnnn #1 {#2} }
+\cs_new_protected:Npn \__siunitx_unit_set_symbolic:Nnnn #1#2#3#4
+ {
+ \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
+ \cs_set:cpn { __siunitx_unit_ \token_to_str:N #1 :w } #2
+ {
+ \bool_if:NF \l__siunitx_unit_test_bool
{
- \newcolumntype { C } [1]
- { > { \bcolumn #1 \@nil } #1 < { \ecolumn } }
- \cs_set:Npn \__siunitx_tmp:w #1 \NC@do S #2 \q_stop
- { \NC@list { #1 #2 } }
- \exp_after:wN \__siunitx_tmp:w \tex_the:D \NC@list \q_stop
- \cs_undefine:N \NC@find@S
- \msg_new:nnn { siunitx } { moved-cellspace-column }
- { Column~type~for~cellspace~package~moved~to~'#1'. }
- \msg_warning:nnn { siunitx } { moved-cellspace-column } { C }
- \ifcellspace@m
- \def \env@matrix
- {
- \hskip -\arraycolsep
- \let \@ifnextchar \new@ifnextchar
- \array
- {
- * { \c@MaxMatrixCols }
- { > { \bcolumn c \@nil $ } c < { $ \ecolumn } } @ { }
- }
- }
- \fi
- }
+ \bool_if:NTF \l__siunitx_unit_parsing_bool
+ {#4}
+ {#3}
+ }
}
- { }
-}
-\cs_new_protected:Npn \__siunitx_table_rewrite_create:N #1 {
- \newcolumntype {#1} { }
- \cs_set_protected:Npn
- \__siunitx_table_rewrite_create_aux:w \NC@do ##1##2 \NC@do #1
- { \NC@list { \NC@do ##1 \NC@do #1 ##2 } }
- \exp_after:wN \__siunitx_table_rewrite_create_aux:w \tex_the:D \NC@list
- \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [1] [ ]
- {
- \@temptokena \exp_after:wN
- {
- \tex_the:D \@temptokena
- > { \__siunitx_table_collect_begin:Nn #1 {##1} }
- c
- < { \__siunitx_table_print: }
- }
- \NC@find
- }
-}
-\AtBeginDocument
+ }
+\cs_new_protected:Npn \siunitx_declare_power:NNn #1#2#3
{
- \@ifpackageloaded { mdwtab }
+ \__siunitx_unit_set_symbolic:Nnn #1
+ { \__siunitx_unit_literal_power:nn {#3} }
+ { \__siunitx_unit_parse_power:nnN {#1} {#3} \c_true_bool }
+ \__siunitx_unit_set_symbolic:Nnn #2
+ { ^ {#3} }
+ { \__siunitx_unit_parse_power:nnN {#2} {#3} \c_false_bool }
+ }
+\cs_new_protected:Npn \siunitx_declare_prefix:Nn #1#2
+ {
+ \__siunitx_unit_set_symbolic:Nnn #1
+ {#2}
+ { \__siunitx_unit_parse_prefix:Nn #1 {#2} }
+ }
+\cs_new_protected:Npn \siunitx_declare_prefix:Nnn #1#2#3
+ {
+ \siunitx_declare_prefix:Nn #1 {#3}
+ \prop_put:Nnn \l__siunitx_unit_prefixes_forward_prop {#3} {#2}
+ \prop_put:Nnn \l__siunitx_unit_prefixes_reverse_prop {#2} {#3}
+ }
+\cs_generate_variant:Nn \siunitx_declare_prefix:Nnn { Nnx }
+\prop_new:N \l__siunitx_unit_prefixes_forward_prop
+\prop_new:N \l__siunitx_unit_prefixes_reverse_prop
+\cs_new_protected:Npn \siunitx_declare_qualifier:Nn #1#2
+ {
+ \__siunitx_unit_set_symbolic:Nnn #1
+ { ~ ( #2 ) }
+ { \__siunitx_unit_parse_qualifier:nn {#1} {#2} }
+ }
+\cs_new_protected:Npn \siunitx_declare_unit:Nn #1#2
+ { \siunitx_declare_unit:Nnn #1 {#2} { } }
+\cs_generate_variant:Nn \siunitx_declare_unit:Nn { Nx }
+\cs_new_protected:Npn \siunitx_declare_unit:Nnn #1#2#3
+ {
+ \seq_put_right:Nn \l_siunitx_unit_seq {#1}
+ \__siunitx_unit_set_symbolic:Nnn #1
+ {#2}
+ {
+ \__siunitx_unit_if_symbolic:nTF {#2}
+ {#2}
+ { \__siunitx_unit_parse_unit:Nn #1 {#2} }
+ }
+ \tl_clear_new:c { l__siunitx_unit_options_ \token_to_str:N #1 _tl }
+ \tl_if_empty:nF {#3}
+ { \tl_set:cn { l__siunitx_unit_options_ \token_to_str:N #1 _tl } {#3} }
+ }
+\cs_generate_variant:Nn \siunitx_declare_unit:Nnn { Nx }
+\bool_new:N \l__siunitx_unit_options_bool
+\cs_new_protected:Npn \siunitx_unit_options_apply:n #1
+ {
+ \bool_if:NF \l__siunitx_unit_options_bool
{
- \cs_set_protected:Npn \__siunitx_table_rewrite_create:N #1
+ \tl_if_single_token:nT {#1}
{
- \newcolumntype {#1} [1] []
+ \tl_if_exist:cT { l__siunitx_unit_options_ \token_to_str:N #1 _tl }
{
- > { \__siunitx_table_collect_begin:Nn #1 {##1} }
- c
- < { \__siunitx_table_print: }
+ \keys_set:nv { siunitx }
+ { l__siunitx_unit_options_ \token_to_str:N #1 _tl }
}
- }
+ }
}
- { }
+ \bool_set_true:N \l__siunitx_unit_options_bool
}
-\cs_new_protected:Npn \__siunitx_table_rewrite_create_aux:w { }
-\AtBeginDocument { \__siunitx_table_rewrite_create:N s }
-\AtBeginDocument { \__siunitx_table_rewrite_create:N S }
-\tl_new:N \l__siunitx_table_collect_tl
-\tl_new:N \l__siunitx_table_collect_pre_tl
-\tl_new:N \l__siunitx_table_collect_post_tl
-\tl_new:N \l__siunitx_number_valid_tl
-\bool_new:N \l__siunitx_table_math_bool
-\bool_new:N \l__siunitx_table_collect_pre_bool
-\bool_new:N \l__siunitx_table_collect_post_bool
-\cs_new_protected:Npn \__siunitx_table_collect_begin:Nn #1#2
+\__siunitx_unit_set_symbolic:Nnn \per
+ { / }
+ { \__siunitx_unit_parse_per: }
+\__siunitx_unit_set_symbolic:Npnn \cancel
+ { }
+ { \__siunitx_unit_parse_special:n { \cancel } }
+\__siunitx_unit_set_symbolic:Npnn \highlight #1
+ { \__siunitx_unit_literal_special:nN { \textcolor {#1} } }
+ { \__siunitx_unit_parse_special:n { \textcolor {#1} } }
+\__siunitx_unit_set_symbolic:Npnn \of #1
+ { \ ( #1 ) }
+ { \__siunitx_unit_parse_qualifier:nn { \of {#1} } {#1} }
+\__siunitx_unit_set_symbolic:Npnn \raiseto #1
+ { \__siunitx_unit_literal_power:nn {#1} }
+ { \__siunitx_unit_parse_power:nnN { \raiseto {#1} } {#1} \c_true_bool }
+\__siunitx_unit_set_symbolic:Npnn \tothe #1
+ { ^ {#1} }
+ { \__siunitx_unit_parse_power:nnN { \tothe {#1} } {#1} \c_false_bool }
+\keys_define:nn { siunitx }
{
- \keys_set:nn { siunitx } {#2}
- \__siunitx_table_collect_begin:Nw #1
- }
-\cs_new_protected:Npn \__siunitx_table_collect_begin:Nw #1#2 \ignorespaces
- { \use:c { __siunitx_table_collect_begin_ #1 : } #2 }
-\cs_new_protected:Npn \__siunitx_table_collect_begin_s: {
- \cs_set_eq:NN \__siunitx_table_collect_token:N
- \__siunitx_table_collect_token_s:N
- \cs_set_eq:NN \__siunitx_table_print: \__siunitx_table_print_s:
- \__siunitx_table_collect_init_s:
- \__siunitx_table_collect_get:
-}
-\cs_new_protected:Npn \__siunitx_table_collect_begin_S: {
- \cs_set_eq:NN \__siunitx_table_collect_token:N
- \__siunitx_table_collect_token_S:N
- \cs_set_eq:NN \__siunitx_table_print: \__siunitx_table_print_S:
- \__siunitx_table_collect_init_S:
- \__siunitx_detect_font:
- \bool_if:NTF \l__siunitx_number_parse_bool
- { \__siunitx_table_collect_get: }
- { \__siunitx_table_print_S_direct: }
-}
-\cs_new_protected:Npn \__siunitx_table_collect_braced:n #1 { }
-\cs_new_protected:Npn \__siunitx_table_collect_expand:N #1 {
- \cs_if_eq:NNTF #1 \color
- {
- \bool_if:NTF \l__siunitx_table_collect_pre_bool
- {
- \tl_clear:N \l__siunitx_number_color_tl
- \tl_clear:N \l__siunitx_unit_color_tl
- \tl_put_right:Nn \l__siunitx_table_collect_pre_tl {#1}
- }
- {
- \bool_set_true:N \l__siunitx_table_collect_post_bool
- \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1}
- }
- }
- {
- \__siunitx_cs_if_tl:NTF #1
- {
- \tl_use:N \l__siunitx_table_collect_pre_tl
- \tl_clear:N \l__siunitx_table_collect_pre_tl
- \cs_set:Npn \__siunitx_table_collect_next:
- { \exp_after:wN \__siunitx_table_collect_get: #1 }
- }
+ extract-mass-in-kilograms .bool_set:N =
+ \l__siunitx_unit_mass_kilogram_bool ,
+ inter-unit-product .tl_set:N =
+ \l__siunitx_unit_product_tl ,
+ unit-font-command .tl_set:N =
+ \l_siunitx_unit_font_tl
+ }
+\tl_new:N \l__siunitx_unit_formatted_tl
+\cs_new_protected:Npn \siunitx_unit_format:nN #1#2
+ {
+ \bool_set_false:N \l__siunitx_unit_prefix_exp_bool
+ \fp_zero:N \l__siunitx_unit_combine_exp_fp
+ \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp }
+ \__siunitx_unit_format:nNN {#1} #2 \l__siunitx_unit_tmp_fp
+ }
+\cs_new_protected:Npn \siunitx_unit_format_extract_prefixes:nNN #1#2#3
+ {
+ \bool_set_true:N \l__siunitx_unit_prefix_exp_bool
+ \fp_zero:N \l__siunitx_unit_combine_exp_fp
+ \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp }
+ \__siunitx_unit_format:nNN {#1} #2 #3
+ }
+\cs_new_protected:Npn \siunitx_unit_format_combine_exponent:nnN #1#2#3
+ {
+ \bool_set_false:N \l__siunitx_unit_prefix_exp_bool
+ \fp_set:Nn \l__siunitx_unit_combine_exp_fp {#2}
+ \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp }
+ \__siunitx_unit_format:nNN {#1} #3 \l__siunitx_unit_tmp_fp
+ }
+\cs_new_protected:Npn \siunitx_unit_format_multiply:nnN #1#2#3
+ {
+ \bool_set_false:N \l__siunitx_unit_prefix_exp_bool
+ \fp_zero:N \l__siunitx_unit_combine_exp_fp
+ \fp_set:Nn \l__siunitx_unit_multiple_fp {#2}
+ \__siunitx_unit_format:nNN {#1} #3 \l__siunitx_unit_tmp_fp
+ }
+\cs_new_protected:Npn \siunitx_unit_format_multiply_extract_prefixes:nnNN
+ #1#2#3#4
+ {
+ \bool_set_true:N \l__siunitx_unit_prefix_exp_bool
+ \fp_zero:N \l__siunitx_unit_combine_exp_fp
+ \fp_set:Nn \l__siunitx_unit_multiple_fp {#2}
+ \__siunitx_unit_format:nNN {#1} #3 #4
+ }
+\cs_new_protected:Npn \siunitx_unit_format_multiply_combine_exponent:nnnN
+ #1#2#3#4
+ {
+ \bool_set_false:N \l__siunitx_unit_prefix_exp_bool
+ \fp_set:Nn \l__siunitx_unit_combine_exp_fp {#3}
+ \fp_set:Nn \l__siunitx_unit_multiple_fp {#2}
+ \__siunitx_unit_format:nNN {#1} #4 \l__siunitx_unit_tmp_fp
+ }
+\cs_new_protected:Npn \__siunitx_unit_format:nNN #1#2#3
+ {
+ \group_begin:
+ \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
+ { \cs_set_eq:Nc ##1 { __siunitx_unit_ \token_to_str:N ##1 :w } }
+ \tl_clear:N \l__siunitx_unit_formatted_tl
+ \fp_zero:N \l__siunitx_unit_prefix_fp
+ \bool_if:NTF \l__siunitx_unit_parse_bool
{
- \bool_if:NTF \l__siunitx_table_collect_pre_bool
+ \__siunitx_unit_if_symbolic:nTF {#1}
{
- \tl_put_right:Nn \l__siunitx_table_collect_pre_tl {#1}
- \__siunitx_table_collect_expand_math:N #1
+ \__siunitx_unit_parse:n {#1}
+ \prop_if_empty:NF \l__siunitx_unit_parsed_prop
+ { \__siunitx_unit_format_parsed: }
}
{
- \bool_set_true:N \l__siunitx_table_collect_post_bool
- \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1}
+ \bool_if:NTF \l__siunitx_unit_forbid_literal_bool
+ { \msg_error:nnn { siunitx } { unit / literal } {#1} }
+ { \__siunitx_unit_format_literal:n {#1} }
}
}
- }
-}
-\cs_new_protected:Npn \__siunitx_table_collect_expand_math:N #1 {
- \token_if_math_toggle:NTF #1
- {
- \bool_if:NTF \l__siunitx_table_math_bool
- { \bool_set_false:N \l__siunitx_table_math_bool }
- { \bool_set_true:N \l__siunitx_table_math_bool }
- }
- {
- \cs_if_eq:NNTF #1 \( % \)
- { \bool_set_true:N \l__siunitx_table_math_bool }
- { % \(
- \cs_if_eq:NNT #1 \)
- { \bool_set_false:N \l__siunitx_table_math_bool }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_table_collect_get:
- {
- \cs_set_eq:NN \__siunitx_table_collect_next:
- \__siunitx_table_collect_get:
- \peek_catcode_ignore_spaces:NTF \c_group_begin_token
- { \__siunitx_table_collect_braced:n }
- { \__siunitx_table_collect_not_braced:N }
- }
-\cs_new_protected:Npn \__siunitx_table_collect_init: {
- \tl_clear:N \l__siunitx_table_collect_tl
- \tl_clear:N \l__siunitx_table_collect_pre_tl
- \tl_clear:N \l__siunitx_table_collect_post_tl
- \bool_set_false:N \l__siunitx_table_collect_post_bool
- \bool_set_false:N \l__siunitx_table_math_bool
-}
-\cs_new_protected:Npn \__siunitx_table_collect_init_s: {
- \__siunitx_table_collect_init:
- \bool_set_false:N \l__siunitx_table_collect_pre_bool
- \cs_set_protected:Npn \__siunitx_table_collect_braced:n ##1
- {
- \tl_put_right:Nn \l__siunitx_table_collect_tl { {##1} }
- \__siunitx_table_collect_next:
- }
-}
-\cs_new_protected:Npn \__siunitx_table_collect_init_S: {
- \__siunitx_number_in_init:
- \tl_set:Nx \l__siunitx_number_valid_tl
- {
- \exp_not:V \l__siunitx_input_complex_tl
- \exp_not:V \l__siunitx_input_decimal_tl
- \exp_not:V \l__siunitx_input_digit_tl
- \exp_not:V \l__siunitx_input_exponent_tl
- \exp_not:V \l__siunitx_input_ignore_tl
- \exp_not:V \l__siunitx_input_comparator_tl
- \exp_not:V \l__siunitx_input_uncert_close_tl
- \exp_not:V \l__siunitx_input_uncert_open_tl
- \exp_not:V \l__siunitx_input_sign_tl
- \exp_not:V \l__siunitx_input_symbol_tl
- }
- \bool_set_true:N \l__siunitx_table_collect_pre_bool
- \cs_set_protected:Npn \__siunitx_table_collect_braced:n ##1
- {
- \bool_if:NTF \l__siunitx_table_collect_pre_bool
- { \tl_put_right:Nn \l__siunitx_table_collect_pre_tl { {##1} } }
+ { \__siunitx_unit_format_literal:n {#1} }
+ \cs_set_protected:Npx \__siunitx_unit_format_aux:
{
- \bool_set_true:N \l__siunitx_table_collect_post_bool
- \tl_put_right:Nn \l__siunitx_table_collect_post_tl { {##1} }
+ \tl_set:Nn \exp_not:N #2
+ { \exp_not:V \l__siunitx_unit_formatted_tl }
+ \fp_set:Nn \exp_not:N #3
+ { \fp_use:N \l__siunitx_unit_prefix_fp }
}
- \__siunitx_table_collect_next:
- }
-}
-\cs_new_protected:Npn \__siunitx_table_collect_next: { }
-\cs_new_protected:Npn \__siunitx_table_collect_newline: {
- \__siunitx_table_print:
- \cs_set_eq:NN \__siunitx_table_print: \prg_do_nothing:
- \tabularnewline
-}
-\cs_new_protected:Npn \__siunitx_table_collect_end: {
- \__siunitx_table_print:
- \cs_set_eq:NN \__siunitx_table_print: \prg_do_nothing:
- \end
-}
-\cs_new_protected:Npn \__siunitx_table_collect_not_braced:N #1
- {
- \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D
- {
- \token_if_eq_meaning:NNF #1 \tex_unskip:D
- { \__siunitx_table_collect_not_braced_aux_i:N #1 }
- }
- \__siunitx_table_collect_next:
+ \exp_after:wN \group_end:
+ \__siunitx_unit_format_aux:
}
-\AtBeginDocument
- {
- \@ifpackageloaded { mdwtab }
- {
- \cs_set_protected:Npn \__siunitx_table_collect_not_braced:N #1
+\cs_new_protected:Npn \__siunitx_unit_format_aux: { }
+\cs_new:Npn \__siunitx_unit_literal_power:nn #1#2 { #2 ^ {#1} }
+\cs_new:Npn \__siunitx_unit_literal_special:nN #1#2 { #1 {#2} }
+\group_begin:
+ \char_set_catcode_active:n { `\~ }
+ \cs_new_protected:Npx \__siunitx_unit_format_literal:n #1
+ {
+ \group_begin:
+ \exp_not:n { \bool_set_false:N \l__siunitx_unit_parsing_bool }
+ \tl_set:Nn \exp_not:N \l__siunitx_unit_tmp_tl {#1}
+ \tl_replace_all:Nnn \exp_not:N \l__siunitx_unit_tmp_tl
+ { \token_to_str:N ^ } { ^ }
+ \tl_replace_all:Nnn \exp_not:N \l__siunitx_unit_tmp_tl
+ { \token_to_str:N _ } { \c__siunitx_unit_math_subscript_tl }
+ \char_set_active_eq:NN ^
+ \exp_not:N \__siunitx_unit_format_literal_superscript:
+ \char_set_active_eq:NN _
+ \exp_not:N \__siunitx_unit_format_literal_subscript:
+ \char_set_active_eq:NN \exp_not:N ~
+ \exp_not:N \__siunitx_unit_format_literal_tilde:
+ \exp_not:n
{
- \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D
+ \protected@edef \l__siunitx_unit_tmp_tl
+ { \l__siunitx_unit_tmp_tl }
+ \tl_clear:N \l__siunitx_unit_formatted_tl
+ \tl_if_empty:NF \l__siunitx_unit_tmp_tl
{
- \token_if_eq_meaning:NNF #1 \tex_unskip:D
+ \exp_after:wN \__siunitx_unit_format_literal_auxi:w
+ \l__siunitx_unit_tmp_tl .
+ \q_recursion_tail . \q_recursion_stop
+ }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_unit_formatted_tl
+ \l__siunitx_unit_formatted_tl
+ }
+ }
+\group_end:
+\cs_new:Npx \__siunitx_unit_format_literal_subscript: { \c__siunitx_unit_math_subscript_tl }
+\cs_new:Npn \__siunitx_unit_format_literal_superscript: { ^ }
+\cs_new:Npn \__siunitx_unit_format_literal_tilde: { . }
+\cs_new_protected:Npn \__siunitx_unit_format_literal_auxi:w #1 .
+ {
+ \quark_if_recursion_tail_stop:n {#1}
+ \__siunitx_unit_format_literal_auxii:n {#1}
+ \tl_set_eq:NN \l__siunitx_unit_separator_tl \l__siunitx_unit_product_tl
+ \__siunitx_unit_format_literal_auxi:w
+ }
+\cs_set_protected:Npn \__siunitx_unit_format_literal_auxii:n #1
+ {
+ \__siunitx_unit_format_literal_auxiii:w
+ #1 / \q_recursion_tail / \q_recursion_stop
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_literal_auxiii:w #1 /
+ {
+ \quark_if_recursion_tail_stop:n {#1}
+ \__siunitx_unit_format_literal_auxiv:w #1 ^ ^ \q_stop
+ \tl_set:Nn \l__siunitx_unit_separator_tl { / }
+ \__siunitx_unit_format_literal_auxiii:w
+ }
+\use:x
+ {
+ \cs_new_protected:Npn \exp_not:N \__siunitx_unit_format_literal_auxiv:w
+ ##1 ^ ##2 ^ ##3 \exp_not:N \q_stop
+ {
+ \exp_not:N \__siunitx_unit_format_literal_auxv:w
+ ##1
+ \c__siunitx_unit_math_subscript_tl
+ \c__siunitx_unit_math_subscript_tl
+ \exp_not:N \q_mark
+ ##2
+ \c__siunitx_unit_math_subscript_tl
+ \c__siunitx_unit_math_subscript_tl
+ \exp_not:N \q_stop
+ }
+ \cs_new_protected:Npn \exp_not:N \__siunitx_unit_format_literal_auxv:w
+ ##1 \c__siunitx_unit_math_subscript_tl
+ ##2 \c__siunitx_unit_math_subscript_tl ##3
+ \exp_not:N \q_mark
+ ##4 \c__siunitx_unit_math_subscript_tl
+ ##5 \c__siunitx_unit_math_subscript_tl ##6
+ \exp_not:N \q_stop
+ {
+ \tl_set:Nx \exp_not:N \l__siunitx_unit_formatted_tl
+ {
+ \exp_not:N \exp_not:V
+ \exp_not:N \l__siunitx_unit_formatted_tl
+ \exp_not:N \tl_if_empty:NF
+ \exp_not:N \l__siunitx_unit_formatted_tl
+ {
+ \exp_not:N \exp_not:V
+ \exp_not:N \l__siunitx_unit_separator_tl
+ }
+ \exp_not:N \tl_if_blank:nF {##1}
+ {
+ \exp_not:N \exp_not:V
+ \exp_not:N \l_siunitx_unit_font_tl
+ { \exp_not:N \exp_not:n {##1} }
+ }
+ \exp_not:N \tl_if_blank:nF {##4}
+ { ^ { \exp_not:N \exp_not:n {##4} } }
+ \exp_not:N \tl_if_blank:nF {##2##5}
+ {
+ \c__siunitx_unit_math_subscript_tl
{
- \token_if_eq_meaning:NNF #1 \tab@setcr
- {
- \token_if_eq_meaning:NNF #1 \@maybe@unskip
- { \__siunitx_table_collect_not_braced_aux_i:N #1 }
- }
+ \exp_not:N \exp_not:V
+ \exp_not:N \l_siunitx_unit_font_tl
+ { \exp_not:N \exp_not:n {##2##5} }
}
}
- \__siunitx_table_collect_next:
}
}
- { }
}
-\cs_new_protected:Npn \__siunitx_table_collect_not_braced_aux_i:N #1 {
- \cs_set:Npn \__siunitx_table_collect_not_braced_aux_ii:N ##1
- {
- \token_if_eq_meaning:NNT #1 ##1
- { \cs_set_eq:NN \__siunitx_table_collect_next: ##1 }
- }
- \tl_map_function:nN
- { \cs:w \scan_stop: \__siunitx_table_print: }
- \__siunitx_table_collect_not_braced_aux_ii:N
- \token_if_eq_meaning:NNT \__siunitx_table_collect_next:
- \__siunitx_table_collect_get:
- {
- \token_if_eq_meaning:NNTF #1 \tabularnewline
- {
- \cs_set_eq:NN \__siunitx_table_collect_next:
- \__siunitx_table_collect_newline:
- }
- {
- \token_if_eq_meaning:NNTF #1 \end
- {
- \cs_set_eq:NN \__siunitx_table_collect_next:
- \__siunitx_table_collect_end:
- }
- { \__siunitx_table_collect_token:N #1 }
- }
- }
-}
-\cs_new_protected:Npn \__siunitx_table_collect_not_braced_aux_ii:N #1 { }
-\cs_new_protected:Npn \__siunitx_table_collect_token:N #1 { }
-\cs_new_protected:Npn \__siunitx_table_collect_token_s:N #1 {
- \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
-}
-\cs_new_protected:Npn \__siunitx_table_collect_token_S:N #1 {
- \bool_if:NTF \l__siunitx_table_collect_post_bool
- { \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1} }
- {
- \tl_if_in:NnTF \l__siunitx_number_valid_tl {#1}
- {
- \bool_set_false:N \l__siunitx_table_collect_pre_bool
- \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
- }
- { \__siunitx_table_collect_expand:N #1 }
- }
-}
-\skip_const:Nn \c__siunitx_one_fill_skip { 0pt plus 1fill }
-\AtBeginDocument
+\tl_new:N \l__siunitx_unit_separator_tl
+\cs_new_protected:Npn \siunitx_unit_pdfstring_context:
{
- \@ifpackageloaded { colortbl }
+ \bool_set_false:N \l__siunitx_unit_parsing_bool
+ \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
+ { \cs_set_eq:Nc ##1 { __siunitx_unit_ \token_to_str:N ##1 :w } }
+ }
+\keys_define:nn { siunitx }
+ {
+ sticky-per .bool_set:N = \l__siunitx_unit_sticky_per_bool
+ }
+\prop_new:N \l__siunitx_unit_parsed_prop
+\bool_new:N \l__siunitx_unit_per_bool
+\int_new:N \l__siunitx_unit_position_int
+\cs_new_protected:Npn \__siunitx_unit_parse:n #1
+ {
+ \prop_clear:N \l__siunitx_unit_parsed_prop
+ \bool_set_true:N \l__siunitx_unit_parsing_bool
+ \bool_set_false:N \l__siunitx_unit_per_bool
+ \bool_set_false:N \l__siunitx_unit_test_bool
+ \int_zero:N \l__siunitx_unit_position_int
+ \siunitx_unit_options_apply:n {#1}
+ #1
+ \int_step_inline:nn \l__siunitx_unit_position_int
+ { \__siunitx_unit_parse_finalise:n {##1} }
+ \__siunitx_unit_parse_finalise:
+ }
+\cs_new_protected:Npn \__siunitx_unit_parse_add:nnnn #1#2#3#4
+ {
+ \tl_set:Nx \l__siunitx_unit_tmp_tl { #1 - #2 }
+ \prop_if_in:NVTF \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl
{
- \cs_new_protected:Npn \__siunitx_table_colortbl_correction:
+ \msg_error:nnxx { siunitx } { unit / duplicate-part }
+ { \exp_not:n {#1} } { \token_to_str:N #3 }
+ }
+ {
+ \prop_put:NVn \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl {#4}
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_parse_prefix:Nn #1#2
+ {
+ \int_set:Nn \l__siunitx_unit_tmp_int { \l__siunitx_unit_position_int + 1 }
+ \__siunitx_unit_parse_add:nnnn { prefix }
+ { \int_use:N \l__siunitx_unit_tmp_int } {#1} {#2}
+ }
+\cs_new_protected:Npn \__siunitx_unit_parse_power:nnN #1#2#3
+ {
+ \tl_set:Nx \l__siunitx_unit_tmp_tl
+ { unit- \int_use:N \l__siunitx_unit_position_int }
+ \bool_lazy_or:nnTF
+ {#3}
+ {
+ \prop_if_in_p:NV
+ \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
+ }
+ {
+ \__siunitx_unit_parse_add:nnnn { power }
{
- \skip_horizontal:n { 0pt plus -0.5fill }
- \tex_kern:D \c_zero_skip
+ \int_eval:n
+ { \l__siunitx_unit_position_int \bool_if:NT #3 { + 1 } }
}
+ {#1} {#2}
+ }
+ {
+ \msg_error:nnxx { siunitx }
+ { unit / part-before-unit } { power } { \token_to_str:N #1 }
}
- { \cs_new_protected:Npn \__siunitx_table_colortbl_correction: { } }
}
-\cs_new_protected:Npn \__siunitx_table_align_left:n #1
+\cs_new_protected:Npn \__siunitx_unit_parse_qualifier:nn #1#2
{
- \__siunitx_table_colortbl_correction:
- \skip_horizontal:n {#1}
- \tex_kern:D \c_zero_skip
+ \tl_set:Nx \l__siunitx_unit_tmp_tl
+ { unit- \int_use:N \l__siunitx_unit_position_int }
+ \prop_if_in:NVTF \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
+ {
+ \__siunitx_unit_parse_add:nnnn { qualifier }
+ { \int_use:N \l__siunitx_unit_position_int } {#1} {#2}
+ }
+ {
+ \msg_error:nnnn { siunitx }
+ { unit / part-before-unit } { qualifier } { \token_to_str:N #1 }
+ }
}
-\cs_new_protected:Npn \__siunitx_table_align_right:n #1
+\cs_new_protected:Npn \__siunitx_unit_parse_special:n #1
{
- \skip_horizontal:n { \c__siunitx_one_fill_skip - #1 }
- \tex_kern:D \c_zero_skip
- \__siunitx_table_colortbl_correction:
+ \__siunitx_unit_parse_add:nnnn { special }
+ { \int_eval:n { \l__siunitx_unit_position_int + 1 } }
+ {#1} {#1}
}
-\cs_new_eq:NN \__siunitx_table_column_begin:n \__siunitx_table_align_left:n
-\cs_new_eq:NN \__siunitx_table_column_end:n \__siunitx_table_align_right:n
-\keys_define:nn { siunitx }
+\cs_new_protected:Npn \__siunitx_unit_parse_unit:Nn #1#2
{
- table-column-width .code:n =
+ \int_incr:N \l__siunitx_unit_position_int
+ \tl_if_eq:nnT {#1} { \gram }
{
- \dim_compare:nNnTF {#1} = { \c_zero_dim }
- {
- \cs_set_eq:NN \__siunitx_table_column_begin:n
- \__siunitx_table_align_left:n
- \cs_set_eq:NN \__siunitx_table_column_end:n
- \__siunitx_table_align_right:n
- }
+ \__siunitx_unit_parse_add:nnnn { command }
+ { \int_use:N \l__siunitx_unit_position_int }
+ {#1} {#1}
+ }
+ \__siunitx_unit_parse_add:nnnn { unit }
+ { \int_use:N \l__siunitx_unit_position_int }
+ {#1} {#2}
+ \bool_if:NT \l__siunitx_unit_per_bool
+ {
+ \__siunitx_unit_parse_add:nnnn { per }
+ { \int_use:N \l__siunitx_unit_position_int }
+ { \per } { true }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_parse_per:
+ {
+ \bool_if:NTF \l__siunitx_unit_sticky_per_bool
+ {
+ \bool_set_true:N \l__siunitx_unit_per_bool
+ \cs_set_protected:Npn \per
+ { \msg_error:nn { siunitx } { unit / duplicate-sticky-per } }
+ }
+ {
+ \__siunitx_unit_parse_add:nnnn
+ { per } { \int_eval:n { \l__siunitx_unit_position_int + 1 } }
+ { \per } { true }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_parse_finalise:n #1
+ {
+ \tl_set:Nx \l__siunitx_unit_tmp_tl { per- #1 }
+ \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
+ {
+ \prop_remove:NV \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl
+ \tl_set:Nx \l__siunitx_unit_tmp_tl { power- #1 }
+ \prop_get:NVNTF
+ \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl
+ \l__siunitx_unit_part_tl
{
- \cs_set_protected:Npn \__siunitx_table_column_begin:n ##1
+ \tl_set:Nx \l__siunitx_unit_part_tl
+ { \fp_eval:n { \l__siunitx_unit_part_tl * -1 } }
+ \fp_compare:nNnTF \l__siunitx_unit_part_tl = 1
{
- \__siunitx_table_colortbl_correction:
- \tex_hbox:D to \dim_eval:n {#1}
- \c_group_begin_token
- \skip_horizontal:n {##1}
- \tex_kern:D \c_zero_skip
+ \prop_remove:NV \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl
}
- \cs_set_protected:Npn \__siunitx_table_column_end:n ##1
{
- \skip_horizontal:n { \c__siunitx_one_fill_skip - ##1 }
- \tex_kern:D \c_zero_skip
- \c_group_end_token
- \__siunitx_table_colortbl_correction:
+ \prop_put:NVV \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl \l__siunitx_unit_part_tl
}
}
+ {
+ \prop_put:NVn \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl { -1 }
+ }
}
}
-\skip_new:N \l__siunitx_table_unit_align_skip
-\keys_define:nn { siunitx }
+\cs_new_protected:Npn \__siunitx_unit_parse_finalise:
{
- table-unit-alignment .choice:,
- table-unit-alignment /
- center .code:n =
- {
- \skip_set:Nn \l__siunitx_table_unit_align_skip
- { 0pt plus 0.5fill }
- },
- table-unit-alignment /
- left .code:n =
- { \skip_set:Nn \l__siunitx_table_unit_align_skip { \c_zero_skip } },
- table-unit-alignment /
- right .code:n =
- {
- \skip_set:Nn \l__siunitx_table_unit_align_skip
- { 0pt plus 1fill }
- }
- }
-\keys_set:nn { siunitx } { table-unit-alignment = center }
-\cs_new_protected:Npn \__siunitx_table_print_s:
- {
- \__siunitx_table_column_begin:n { \l__siunitx_table_unit_align_skip }
- \tl_if_empty:NF \l__siunitx_table_collect_tl
- { \__siunitx_unit_output:Vn \l__siunitx_table_collect_tl { } }
- \__siunitx_table_column_end:n { \l__siunitx_table_unit_align_skip }
- }
-\prop_new:N \l__siunitx_table_model_prop
-\dim_new:N \l__siunitx_table_exponent_dim
-\dim_new:N \l__siunitx_table_integer_dim
-\dim_new:N \l__siunitx_table_mantissa_dim
-\dim_new:N \l__siunitx_table_marker_dim
-\dim_new:N \l__siunitx_table_result_dim
-\dim_new:N \l__siunitx_table_uncert_dim
-\dim_new:N \l__siunitx_table_fill_pre_dim
-\dim_new:N \l__siunitx_table_fill_post_dim
-\dim_new:N \l__siunitx_table_fill_mid_dim
-\box_new:N \l__siunitx_table_pre_box
-\box_new:N \l__siunitx_table_post_box
-\box_new:N \l__siunitx_table_mantissa_box
-\box_new:N \l__siunitx_table_result_box
-\skip_new:N \l__siunitx_table_number_align_skip
-\skip_new:N \l__siunitx_table_text_align_skip
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_main: { }
-\cs_new_protected:Npn \__siunitx_table_print_S_parsed: { }
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill:n #1 { }
+ \clist_map_inline:nn { per , power , prefix }
+ {
+ \tl_set:Nx \l__siunitx_unit_tmp_tl
+ { ##1 - \int_eval:n { \l__siunitx_unit_position_int + 1 } }
+ \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
+ { \msg_error:nnn { siunitx } { unit / dangling-part } { ##1 } }
+ }
+ }
\keys_define:nn { siunitx }
{
- table-align-comparator .choice:,
- table-align-comparator /
- false .code:n =
- {
- \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
- \__siunitx_table_print_S_reserved_store_fill_pre:n
- },
- table-align-comparator /
- true .code:n =
- {
- \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
- \__siunitx_table_print_S_reserved_store_fill_mid:n
- },
- table-align-comparator .default:n = true,
- table-align-exponent .bool_set:N =
- \l__siunitx_table_align_exponent_bool,
- table-align-text-pre .bool_set:N =
- \l__siunitx_table_align_text_pre_bool,
- table-align-text-post .bool_set:N =
- \l__siunitx_table_align_text_post_bool,
- table-align-uncertainty .bool_set:N = \l__siunitx_table_align_uncert_bool,
- table-auto-round .bool_set:N = \l__siunitx_table_auto_round_bool,
- table-number-alignment .choice:,
- table-number-alignment /
- center .code:n =
- {
- \skip_set:Nn \l__siunitx_table_number_align_skip
- { 0pt plus 0.5fill }
- \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
- \__siunitx_table_print_S_direct_reserved:
- \cs_set_eq:NN \__siunitx_table_print_S_parsed:
- \__siunitx_table_print_S_reserved:
- },
- table-number-alignment /
- center-decimal-marker .code:n =
- {
- \skip_set:Nn \l__siunitx_table_number_align_skip
- { 0pt plus 0.5fill }
- \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
- \__siunitx_table_print_S_direct_centered:
- \cs_set_eq:NN \__siunitx_table_print_S_parsed:
- \__siunitx_table_print_S_centered:
- },
- table-number-alignment /
- left .code:n =
- {
- \skip_zero:N \l__siunitx_table_number_align_skip
- \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
- \__siunitx_table_print_S_direct_reserved:
- \cs_set_eq:NN \__siunitx_table_print_S_parsed:
- \__siunitx_table_print_S_reserved:
- },
- table-number-alignment /
- right .code:n =
- {
- \skip_set:Nn \l__siunitx_table_number_align_skip
- { 0pt plus 1fill }
- \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
- \__siunitx_table_print_S_direct_reserved:
- \cs_set_eq:NN \__siunitx_table_print_S_parsed:
- \__siunitx_table_print_S_reserved:
- },
- table-omit-exponent .bool_set:N =
- \l__siunitx_table_omit_exponent_bool,
- table-text-alignment .choice:,
- table-text-alignment /
- center .code:n =
- {
- \skip_set:Nn \l__siunitx_table_text_align_skip
- { 0pt plus 0.5fill }
- },
- table-text-alignment /
- left .code:n =
- { \skip_zero:N \l__siunitx_table_text_align_skip },
- table-text-alignment /
- right .code:n =
- {
- \skip_set:Nn \l__siunitx_table_text_align_skip
- { 0pt plus 1fill }
- },
- table-comparator .choice:,
- table-comparator /
- false .code:n =
- { \prop_remove:Nn \l__siunitx_table_model_prop { comparator } },
- table-comparator /
- true .code:n =
- { \prop_put:Nnn \l__siunitx_table_model_prop { comparator } { > } },
- table-comparator .default:n = true,
- table-figures-decimal .code:n =
- {
- \int_compare:nNnTF {#1} = 0
+ bracket-unit-denominator .bool_set:N =
+ \l__siunitx_unit_denominator_bracket_bool ,
+ forbid-literal-units .bool_set:N =
+ \l__siunitx_unit_forbid_literal_bool ,
+ fraction-command .tl_set:N =
+ \l__siunitx_unit_fraction_function_tl ,
+ parse-units .bool_set:N =
+ \l__siunitx_unit_parse_bool ,
+ per-mode .choice: ,
+ per-mode / fraction .code:n =
+ {
+ \bool_set_false:N \l__siunitx_unit_autofrac_bool
+ \bool_set_false:N \l__siunitx_unit_per_symbol_bool
+ \bool_set_true:N \l__siunitx_unit_powers_positive_bool
+ \bool_set_true:N \l__siunitx_unit_two_part_bool
+ } ,
+ per-mode / power .code:n =
+ {
+ \bool_set_false:N \l__siunitx_unit_autofrac_bool
+ \bool_set_false:N \l__siunitx_unit_per_symbol_bool
+ \bool_set_false:N \l__siunitx_unit_powers_positive_bool
+ \bool_set_false:N \l__siunitx_unit_two_part_bool
+ } ,
+ per-mode / power-positive-first .code:n =
+ {
+ \bool_set_false:N \l__siunitx_unit_autofrac_bool
+ \bool_set_false:N \l__siunitx_unit_per_symbol_bool
+ \bool_set_false:N \l__siunitx_unit_powers_positive_bool
+ \bool_set_true:N \l__siunitx_unit_two_part_bool
+ } ,
+ per-mode / repeated-symbol .code:n =
+ {
+ \bool_set_false:N \l__siunitx_unit_autofrac_bool
+ \bool_set_true:N \l__siunitx_unit_per_symbol_bool
+ \bool_set_true:N \l__siunitx_unit_powers_positive_bool
+ \bool_set_false:N \l__siunitx_unit_two_part_bool
+ } ,
+ per-mode / symbol .code:n =
+ {
+ \bool_set_false:N \l__siunitx_unit_autofrac_bool
+ \bool_set_true:N \l__siunitx_unit_per_symbol_bool
+ \bool_set_true:N \l__siunitx_unit_powers_positive_bool
+ \bool_set_true:N \l__siunitx_unit_two_part_bool
+ } ,
+ per-mode / symbol-or-fraction .code:n =
+ {
+ \bool_set_true:N \l__siunitx_unit_autofrac_bool
+ \bool_set_true:N \l__siunitx_unit_per_symbol_bool
+ \bool_set_true:N \l__siunitx_unit_powers_positive_bool
+ \bool_set_true:N \l__siunitx_unit_two_part_bool
+ } ,
+ per-symbol .tl_set:N =
+ \l__siunitx_unit_per_symbol_tl ,
+ qualifier-mode .choices:nn =
+ { bracket , combine , phrase , subscript }
+ { \tl_set_eq:NN \l__siunitx_unit_qualifier_mode_tl \l_keys_choice_tl } ,
+ qualifier-phrase .tl_set:N =
+ \l__siunitx_unit_qualifier_phrase_tl
+ }
+\bool_new:N \l__siunitx_unit_bracket_bool
+\tl_new:N \l__siunitx_unit_bracket_open_tl
+\tl_new:N \l__siunitx_unit_bracket_close_tl
+\tl_set:Nn \l__siunitx_unit_bracket_open_tl { ( }
+\tl_set:Nn \l__siunitx_unit_bracket_close_tl { ) }
+\bool_new:N \l__siunitx_unit_font_bool
+\bool_new:N \l__siunitx_unit_autofrac_bool
+\bool_new:N \l__siunitx_unit_per_symbol_bool
+\bool_new:N \l__siunitx_unit_powers_positive_bool
+\bool_new:N \l__siunitx_unit_two_part_bool
+\bool_new:N \l__siunitx_unit_numerator_bool
+\tl_new:N \l__siunitx_unit_qualifier_mode_tl
+\fp_new:N \l__siunitx_unit_combine_exp_fp
+\bool_new:N \l__siunitx_unit_prefix_exp_bool
+\fp_new:N \l__siunitx_unit_prefix_fp
+\fp_new:N \l__siunitx_unit_multiple_fp
+\tl_new:N \l__siunitx_unit_current_tl
+\tl_new:N \l__siunitx_unit_part_tl
+\tl_new:N \l__siunitx_unit_denominator_tl
+\int_new:N \l__siunitx_unit_total_int
+\cs_new_protected:Npn \__siunitx_unit_format_parsed:
+ {
+ \int_set_eq:NN \l__siunitx_unit_total_int \l__siunitx_unit_position_int
+ \tl_clear:N \l__siunitx_unit_denominator_tl
+ \tl_clear:N \l__siunitx_unit_formatted_tl
+ \fp_zero:N \l__siunitx_unit_prefix_fp
+ \int_zero:N \l__siunitx_unit_position_int
+ \fp_compare:nNnF \l__siunitx_unit_combine_exp_fp = \c_zero_fp
+ { \__siunitx_unit_format_combine_exp: }
+ \fp_compare:nNnF \l__siunitx_unit_multiple_fp = \c_one_fp
+ { \__siunitx_unit_format_multiply: }
+ \bool_lazy_and:nnT
+ { \l__siunitx_unit_prefix_exp_bool }
+ { \l__siunitx_unit_mass_kilogram_bool }
+ { \__siunitx_unit_format_mass_to_kilogram: }
+ \int_do_while:nNnn
+ \l__siunitx_unit_position_int < \l__siunitx_unit_total_int
+ {
+ \bool_set_false:N \l__siunitx_unit_bracket_bool
+ \tl_clear:N \l__siunitx_unit_current_tl
+ \bool_set_false:N \l__siunitx_unit_font_bool
+ \bool_set_true:N \l__siunitx_unit_numerator_bool
+ \int_incr:N \l__siunitx_unit_position_int
+ \clist_map_inline:nn { prefix , unit , qualifier , power , special }
+ { \__siunitx_unit_format_parsed_aux:n {##1} }
+ \__siunitx_unit_format_output:
+ }
+ \__siunitx_unit_format_finalise:
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_parsed_aux:n #1
+ {
+ \tl_set:Nx \l__siunitx_unit_tmp_tl
+ { #1 - \int_use:N \l__siunitx_unit_position_int }
+ \prop_get:NVNT \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl \l__siunitx_unit_part_tl
+ { \use:c { __siunitx_unit_format_ #1 : } }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_combine_exp:
+ {
+ \prop_get:NnNF \l__siunitx_unit_parsed_prop { power-1 } \l__siunitx_unit_tmp_tl
+ { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } }
+ \fp_set:Nn \l__siunitx_unit_tmp_fp
+ { \l__siunitx_unit_combine_exp_fp / \l__siunitx_unit_tmp_tl }
+ \prop_get:NnNTF \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl
+ {
+ \prop_get:NVNF \l__siunitx_unit_prefixes_forward_prop
+ \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl
{
- \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-decimal }
- \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-decimal-raw }
- \prop_remove:Nn \l__siunitx_table_model_prop
- { mantissa-decimal-marker }
- \prop_if_in:NnTF \l__siunitx_table_model_prop { mantissa-integer }
- {
- \prop_put:Nnn \l__siunitx_table_model_prop { mantissa }
- { true }
- }
- { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa } }
+ \prop_get:NnN \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl
+ \msg_error:nnx { siunitx } { unit / non-numeric-exponent }
+ { \l__siunitx_unit_tmp_tl }
+ \tl_set:Nn \l__siunitx_unit_tmp_tl { 0 }
}
+ }
+ { \tl_set:Nn \l__siunitx_unit_tmp_tl { 0 } }
+ \tl_set:Nx \l__siunitx_unit_tmp_tl
+ { \fp_eval:n { \l__siunitx_unit_tmp_fp + \l__siunitx_unit_tmp_tl } }
+ \fp_compare:nNnTF \l__siunitx_unit_tmp_tl = \c_zero_fp
+ { \prop_remove:Nn \l__siunitx_unit_parsed_prop { prefix-1 } }
+ {
+ \prop_get:NVNTF \l__siunitx_unit_prefixes_reverse_prop
+ \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl
+ { \prop_put:NnV \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl }
{
- \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-decimal }
- { \prg_replicate:nn {#1} { 8 } }
- \prop_put:Nnn \l__siunitx_table_model_prop { mantissa-decimal-raw }
- {#1}
- \prop_put:Nnn \l__siunitx_table_model_prop { mantissa } { true }
- \prop_put:NnV \l__siunitx_table_model_prop
- { mantissa-decimal-marker } \l__siunitx_output_decimal_tl
+ \msg_error:nnx { siunitx } { unit / non-convertible-exponent }
+ { \l__siunitx_unit_tmp_tl }
}
- },
- table-figures-exponent .code:n =
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_multiply:
+ {
+ \int_step_inline:nn { \prop_count:N \l__siunitx_unit_parsed_prop }
{
- \int_compare:nNnTF {#1} = 0
- { \prop_remove:Nn \l__siunitx_table_model_prop { exponent-integer } }
+ \prop_get:NnNF \l__siunitx_unit_parsed_prop { power- ##1 } \l__siunitx_unit_tmp_tl
+ { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } }
+ \fp_set:Nn \l__siunitx_unit_tmp_fp
+ { \l__siunitx_unit_tmp_tl * \l__siunitx_unit_multiple_fp }
+ \fp_compare:nNnTF \l__siunitx_unit_tmp_fp = \c_one_fp
+ { \prop_remove:N \l__siunitx_unit_parsed_prop { power- ##1 } }
{
- \prop_put:Nnx \l__siunitx_table_model_prop { exponent-integer }
- { \prg_replicate:nn {#1} { 8 } }
- \prop_put:Nnn \l__siunitx_table_model_prop { exponent } { true }
+ \prop_put:Nnx \l__siunitx_unit_parsed_prop { power- ##1 }
+ { \fp_use:N \l__siunitx_unit_tmp_fp }
}
- },
- table-figures-integer .code:n =
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_mass_to_kilogram:
+ {
+ \int_step_inline:nn \l__siunitx_unit_total_int
{
- \int_compare:nNnTF {#1} = 0
+ \prop_if_in:NnT \l__siunitx_unit_parsed_prop { command- ##1 }
{
- \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-integer }
- \prop_if_in:NnTF \l__siunitx_table_model_prop { mantissa-decimal }
+ \prop_if_in:NnF \l__siunitx_unit_parsed_prop { prefix- ##1 }
{
- \prop_put:Nnn \l__siunitx_table_model_prop { mantissa }
- { true }
+ \group_begin:
+ \bool_set_false:N \l__siunitx_unit_parsing_bool
+ \tl_set:Nx \l__siunitx_unit_tmp_tl { \kilo }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl
+ \prop_put:NnV \l__siunitx_unit_parsed_prop { prefix- ##1 }
+ \l__siunitx_unit_tmp_tl
+ \prop_get:NnNF \l__siunitx_unit_parsed_prop { power- ##1 }
+ \l__siunitx_unit_tmp_tl
+ { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } }
+ \fp_set:Nn \l__siunitx_unit_prefix_fp
+ { \l__siunitx_unit_prefix_fp - 3 * \l__siunitx_unit_tmp_tl }
}
- { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa } }
- }
- {
- \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-integer }
- { \prg_replicate:nn {#1} { 8 } }
- \prop_put:Nnn \l__siunitx_table_model_prop { mantissa } { true }
}
- },
- table-figures-uncertainty .code:n =
- {
- \int_compare:nNnTF {#1} = 0
- { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-uncertainty } }
- {
- \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-uncertainty }
- { \prg_replicate:nn {#1} { 8 } }
- }
- },
- table-parse-only .bool_set:N = \l__siunitx_table_parse_only_bool,
- table-space-text-pre .tl_set:N = \l__siunitx_table_pre_tl,
- table-space-text-post .tl_set:N = \l__siunitx_table_post_tl,
- table-sign-exponent .choice:,
- table-sign-exponent / true .code:n =
- { \prop_put:Nnn \l__siunitx_table_model_prop { exponent-sign } { - } },
- table-sign-exponent / false .code:n =
- { \prop_remove:Nn \l__siunitx_table_model_prop { exponent-sign } },
- table-sign-exponent .default:n = true,
- table-sign-mantissa .choice:,
- table-sign-mantissa / true .code:n =
- { \prop_put:Nnn \l__siunitx_table_model_prop { mantissa-sign } { - } },
- table-sign-mantissa / false .code:n =
- { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-sign } },
- table-sign-mantissa .default:n = true,
+ }
}
-\keys_define:nn { siunitx }
+\cs_new:Npn \__siunitx_unit_format_bracket:N #1
{
- table-alignment .meta:n =
+ \bool_if:NTF \l__siunitx_unit_bracket_bool
{
- table-number-alignment = #1,
- table-text-alignment = #1,
- table-unit-alignment = #1
+ \exp_not:V \l__siunitx_unit_bracket_open_tl
+ \exp_not:V #1
+ \exp_not:V \l__siunitx_unit_bracket_close_tl
}
+ { \exp_not:V #1 }
}
-\keys_define:nn { siunitx }
+\cs_new_protected:Npn \__siunitx_unit_format_power:
{
- table-format .code:n =
+ \__siunitx_unit_format_font:
+ \exp_after:wN \__siunitx_unit_format_power_aux:wTF
+ \l__siunitx_unit_part_tl - \q_stop
+ { \__siunitx_unit_format_power_negative: }
+ { \__siunitx_unit_format_power_positive: }
+ }
+\cs_new:Npn \__siunitx_unit_format_power_aux:wTF #1 - #2 \q_stop
+ { \tl_if_empty:nTF {#1} }
+\cs_new_protected:Npn \__siunitx_unit_format_power_positive:
+ { \__siunitx_unit_format_power_superscript: }
+\cs_new_protected:Npn \__siunitx_unit_format_power_negative:
+ {
+ \bool_set_false:N \l__siunitx_unit_numerator_bool
+ \bool_if:NTF \l__siunitx_unit_powers_positive_bool
{
- \bool_set_eq:NN \l__siunitx_process_plus_saved_bool \l__siunitx_process_plus_bool
- \bool_set_true:N \l__siunitx_process_plus_bool
- \__siunitx_number_in_parse:n {#1}
- \prop_set_eq:NN \l__siunitx_table_model_prop \l__siunitx_number_in_prop
- \tl_clear:N \l__siunitx_tmpa_tl
- \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
- \l__siunitx_tmpb_tl
- {
- \tl_set:Nx \l__siunitx_tmpa_tl
- { table-figures-integer = \l__siunitx_tmpb_tl }
- }
- \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-decimal }
- \l__siunitx_tmpb_tl
- {
- \clist_put_right:Nx \l__siunitx_tmpa_tl
- { table-figures-decimal = \l__siunitx_tmpb_tl }
- }
- \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-uncertainty }
- \l__siunitx_tmpb_tl
+ \tl_set:Nx \l__siunitx_unit_part_tl
{
- \clist_put_right:Nx \l__siunitx_tmpa_tl
- { table-figures-uncertainty = \l__siunitx_tmpb_tl }
- }
- \prop_if_in:NnTF \l__siunitx_number_in_prop { mantissa-sign }
- {
- \clist_put_right:Nn \l__siunitx_tmpa_tl
- { table-sign-mantissa =true }
+ \exp_after:wN \__siunitx_unit_format_power_negative_aux:w
+ \l__siunitx_unit_part_tl \q_stop
}
+ \str_if_eq:VnF \l__siunitx_unit_part_tl { 1 }
+ { \__siunitx_unit_format_power_superscript: }
+ }
+ { \__siunitx_unit_format_power_superscript: }
+ }
+\cs_new:Npn \__siunitx_unit_format_power_negative_aux:w - #1 \q_stop
+ { \exp_not:n {#1} }
+\cs_new_protected:Npn \__siunitx_unit_format_power_superscript:
+ {
+ \exp_after:wN \__siunitx_unit_format_power_superscipt:w
+ \l__siunitx_unit_part_tl . . \q_stop
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_power_superscipt:w #1 . #2 . #3 \q_stop
+ {
+ \tl_if_blank:nTF {#2}
+ {
+ \tl_set:Nx \l__siunitx_unit_current_tl
{
- \clist_put_right:Nn \l__siunitx_tmpa_tl
- { table-sign-mantissa =false }
+ \__siunitx_unit_format_bracket:N \l__siunitx_unit_current_tl
+ ^ { \exp_not:n {#1} }
}
- \prop_get:NnNT \l__siunitx_number_in_prop { exponent-integer }
- \l__siunitx_tmpb_tl
+ }
+ {
+ \tl_set:Nx \l__siunitx_unit_tmp_tl
{
- \clist_put_right:Nx \l__siunitx_tmpa_tl
- { table-figures-exponent = \l__siunitx_tmpb_tl }
+ { }
+ \tl_if_head_eq_charcode:nNTF {#1} -
+ { { - } { \exp_not:o { \use_none:n #1 } } }
+ { { } { \exp_not:n {#1} } }
+ {#2}
+ { }
+ { }
+ { 0 }
}
- \prop_if_in:NnTF \l__siunitx_number_in_prop { exponent-sign }
+ \tl_set:Nx \l__siunitx_unit_current_tl
{
- \clist_put_right:Nn \l__siunitx_tmpa_tl
- { table-sign-exponent =true }
+ \__siunitx_unit_format_bracket:N \l__siunitx_unit_current_tl
+ ^ { \siunitx_number_output:N \l__siunitx_unit_tmp_tl }
}
+ }
+ \bool_set_false:N \l__siunitx_unit_bracket_bool
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_prefix:
+ {
+ \bool_if:NTF \l__siunitx_unit_prefix_exp_bool
+ { \__siunitx_unit_format_prefix_exp: }
+ { \__siunitx_unit_format_prefix_symbol: }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_prefix_exp:
+ {
+ \prop_get:NVNTF \l__siunitx_unit_prefixes_forward_prop
+ \l__siunitx_unit_part_tl \l__siunitx_unit_part_tl
+ {
+ \bool_if:NT \l__siunitx_unit_mass_kilogram_bool
{
- \clist_put_right:Nn \l__siunitx_tmpa_tl
- { table-sign-exponent =false }
+ \tl_set:Nx \l__siunitx_unit_tmp_tl
+ { command- \int_use:N \l__siunitx_unit_position_int }
+ \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
+ { \__siunitx_unit_format_prefix_gram: }
}
- \clist_put_right:Nn \l__siunitx_tmpa_tl
- { table-number-alignment = center }
- \keys_set:nV { siunitx } \l__siunitx_tmpa_tl
- \bool_set_eq:NN \l__siunitx_process_plus_bool \l__siunitx_process_plus_saved_bool
+ \tl_set:Nx \l__siunitx_unit_tmp_tl
+ { power- \int_use:N \l__siunitx_unit_position_int }
+ \prop_get:NVNF \l__siunitx_unit_parsed_prop
+ \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl
+ { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } }
+ \fp_add:Nn \l__siunitx_unit_prefix_fp
+ { \l__siunitx_unit_tmp_tl * \l__siunitx_unit_part_tl }
}
+ { \__siunitx_unit_format_prefix_symbol: }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_prefix_gram:
+ {
+ \tl_set:Nx \l__siunitx_unit_part_tl
+ { \int_eval:n { \l__siunitx_unit_part_tl - 3 } }
+ \group_begin:
+ \bool_set_false:N \l__siunitx_unit_parsing_bool
+ \tl_set:Nx \l__siunitx_unit_current_tl { \kilo }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_unit_current_tl \l__siunitx_unit_current_tl
}
-\bool_new:N \l__siunitx_process_plus_saved_bool
-\cs_new_protected:Npn \__siunitx_table_print_S:
+\cs_new_protected:Npn \__siunitx_unit_format_prefix_symbol:
+ { \tl_set_eq:NN \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl }
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier:
{
- \bool_if:NTF \l__siunitx_table_collect_pre_bool
+ \use:c
{
- \__siunitx_table_column_begin:n { \l__siunitx_table_text_align_skip }
- \l__siunitx_table_collect_pre_tl
- \__siunitx_table_column_end:n { \l__siunitx_table_text_align_skip }
+ __siunitx_unit_format_qualifier_
+ \l__siunitx_unit_qualifier_mode_tl :
}
+ \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_bracket:
+ {
+ \__siunitx_unit_format_font:
+ \tl_set:Nx \l__siunitx_unit_part_tl
{
- \__siunitx_table_column_begin:n { \l__siunitx_table_number_align_skip }
- \bool_if:NTF \l__siunitx_table_parse_only_bool
- { \__siunitx_table_print_S_no_alignment: }
- { \__siunitx_table_print_S_alignment: }
- \bool_if:NTF \l__siunitx_table_align_text_pre_bool
- { \__siunitx_table_print_S_pre_aligned: }
- { \__siunitx_table_print_S_pre_not_aligned: }
- \box_use:N \l__siunitx_table_result_box
- \bool_if:NTF \l__siunitx_table_align_text_post_bool
- { \__siunitx_table_print_S_post_aligned: }
- { \__siunitx_table_print_S_post_not_aligned: }
- \__siunitx_table_column_end:n { \l__siunitx_table_number_align_skip }
+ \exp_not:V \l__siunitx_unit_bracket_open_tl
+ \exp_not:V \l_siunitx_unit_font_tl
+ { \exp_not:V \l__siunitx_unit_part_tl }
+ \exp_not:V \l__siunitx_unit_bracket_close_tl
}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_no_alignment:
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_combine: { }
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_phrase:
{
- \l__siunitx_table_collect_pre_tl
- \__siunitx_number_output:V \l__siunitx_table_collect_tl
- \l__siunitx_table_collect_post_tl
+ \__siunitx_unit_format_font:
+ \tl_set:Nx \l__siunitx_unit_part_tl
+ {
+ \exp_not:V \l__siunitx_unit_qualifier_phrase_tl
+ \exp_not:V \l_siunitx_unit_font_tl
+ { \exp_not:V \l__siunitx_unit_part_tl }
+ }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_alignment:
- { \__siunitx_table_print_S_parsed: }
-\cs_new_protected:Npn \__siunitx_table_print_S_parse:
+\cs_new_protected:Npn \__siunitx_unit_format_qualifier_subscript:
{
- \bool_set_false:N \l__siunitx_error_bool
- \__siunitx_number_in_parse:V \l__siunitx_table_collect_tl
- \bool_if:NF \l__siunitx_error_bool
+ \__siunitx_unit_format_font:
+ \tl_set:Nx \l__siunitx_unit_part_tl
{
- \bool_if:NTF \l__siunitx_table_omit_exponent_bool
+ \c__siunitx_unit_math_subscript_tl
{
- \bool_set_true:N \l__siunitx_process_fixed_bool
- \__siunitx_number_process:
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
- \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
+ \exp_not:V \l_siunitx_unit_font_tl
+ { \exp_not:V \l__siunitx_unit_part_tl }
}
- { \__siunitx_number_process: }
- \__siunitx_number_format:
- \__siunitx_number_output_color:
}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_measure:NN #1#2
+\cs_new_protected:Npn \__siunitx_unit_format_special:
{
- \tl_if_empty:NTF #1
- { \dim_zero:N #2 }
+ \tl_set:Nx \l__siunitx_unit_current_tl
{
- \group_begin:
- \hbox_set:Nn \l__siunitx_tmp_box
- { \__siunitx_print:nV { number } #1 }
- \exp_args:NNNo \group_end:
- \dim_set:Nn #2 { \dim_use:N \box_wd:N \l__siunitx_tmp_box }
+ \exp_not:V \l__siunitx_unit_part_tl
+ {
+ \bool_if:NTF \l__siunitx_unit_font_bool
+ { \use:n }
+ { \exp_not:V \l_siunitx_unit_font_tl }
+ { \exp_not:V \l__siunitx_unit_current_tl }
+ }
}
+ \bool_set_true:N \l__siunitx_unit_font_bool
}
-\cs_new_protected:Npn \__siunitx_table_print_S_pre_aligned:
+\cs_new_protected:Npn \__siunitx_unit_format_unit:
{
- \box_use:N \l__siunitx_table_pre_box
- \hbox_to_wd:nn { \l__siunitx_table_fill_pre_dim } { \tex_hfil:D }
+ \tl_put_right:NV
+ \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_output:
+ {
+ \__siunitx_unit_format_font:
+ \bool_set_false:N \l__siunitx_unit_bracket_bool
+ \use:c
+ {
+ __siunitx_unit_format_output_
+ \bool_if:NTF \l__siunitx_unit_numerator_bool
+ { aux: }
+ { denominator: }
+ }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_pre_not_aligned:
+\cs_new_protected:Npn \__siunitx_unit_format_output_aux:
{
- \hbox_to_wd:nn { \l__siunitx_table_fill_pre_dim } { \tex_hfil:D }
- \box_use:N \l__siunitx_table_pre_box
+ \__siunitx_unit_format_output_aux:nV { formatted }
+ \l__siunitx_unit_product_tl
}
-\cs_new_protected:Npn \__siunitx_table_print_S_post_aligned:
+\cs_new_protected:Npn \__siunitx_unit_format_output_denominator:
{
- \hbox_to_wd:nn { \l__siunitx_table_fill_post_dim } { \tex_hfil:D }
- \box_use:N \l__siunitx_table_post_box
+ \bool_if:NTF \l__siunitx_unit_two_part_bool
+ {
+ \bool_lazy_and:nnT
+ { \l__siunitx_unit_denominator_bracket_bool }
+ { ! \tl_if_empty_p:N \l__siunitx_unit_denominator_tl }
+ { \bool_set_true:N \l__siunitx_unit_bracket_bool }
+ \__siunitx_unit_format_output_aux:nV { denominator }
+ \l__siunitx_unit_product_tl
+ }
+ {
+ \bool_lazy_and:nnT
+ { \l__siunitx_unit_per_symbol_bool }
+ { \tl_if_empty_p:N \l__siunitx_unit_formatted_tl }
+ { \tl_set:Nn \l__siunitx_unit_formatted_tl { 1 } }
+ \__siunitx_unit_format_output_aux:nv { formatted }
+ {
+ l__siunitx_unit_
+ \bool_if:NTF \l__siunitx_unit_per_symbol_bool
+ { per_symbol }
+ { product }
+ _tl
+ }
+ }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_post_not_aligned:
+\cs_new_protected:Npn \__siunitx_unit_format_output_aux:nn #1#2
{
- \box_use:N \l__siunitx_table_post_box
- \hbox_to_wd:nn { \l__siunitx_table_fill_post_dim } { \tex_hfil:D }
+ \tl_set:cx { l__siunitx_unit_ #1 _tl }
+ {
+ \exp_not:v { l__siunitx_unit_ #1 _tl }
+ \tl_if_empty:cF { l__siunitx_unit_ #1 _tl }
+ { \exp_not:n {#2} }
+ \exp_not:V \l__siunitx_unit_current_tl
+ }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_centered:
+\cs_generate_variant:Nn \__siunitx_unit_format_output_aux:nn { nV , nv }
+\cs_new_protected:Npn \__siunitx_unit_format_font:
{
- \__siunitx_table_print_S_centered_ends:
- \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
- \__siunitx_table_print_S_parse:
- \bool_if:NF \l__siunitx_error_bool
+ \bool_if:NF \l__siunitx_unit_font_bool
{
- \__siunitx_table_print_S_centered_measure:
- \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
- \dim_set:Nn \l__siunitx_table_fill_pre_dim
+ \tl_set:Nx \l__siunitx_unit_current_tl
{
- \l__siunitx_table_result_dim
- - \l__siunitx_table_integer_dim
- - \l__siunitx_table_marker_dim
+ \exp_not:V \l_siunitx_unit_font_tl
+ { \exp_not:V \l__siunitx_unit_current_tl }
}
- \dim_compare:nNnTF \l__siunitx_table_integer_dim >
- \l__siunitx_table_fill_pre_dim
- { \__siunitx_table_print_S_centered_integer: }
- { \__siunitx_table_print_S_centered_decimal: }
- }
+ \bool_set_true:N \l__siunitx_unit_font_bool
+ }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_centered_ends:
+\cs_new_protected:Npn \__siunitx_unit_format_finalise:
{
- \hbox_set:Nn \l__siunitx_table_pre_box
+ \tl_if_empty:NF \l__siunitx_unit_denominator_tl
{
- {
- \l__siunitx_table_collect_pre_tl
- \bool_if:NT \l__siunitx_table_math_bool
- {
- \scan_stop:
- \c_math_toggle_token
- }
- }
+ \bool_if:NTF \l__siunitx_unit_powers_positive_bool
+ { \__siunitx_unit_format_finalise_fractional: }
+ { \__siunitx_unit_format_finalise_power: }
}
- \dim_compare:nNnT
- { \box_wd:N \l__siunitx_table_pre_box } = \c_zero_dim
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_finalise_fractional:
+ {
+ \tl_if_empty:NT \l__siunitx_unit_formatted_tl
+ { \tl_set:Nn \l__siunitx_unit_formatted_tl { 1 } }
+ \bool_if:NTF \l__siunitx_unit_autofrac_bool
+ { \__siunitx_unit_format_finalise_autofrac: }
{
- \box_clear:N \l__siunitx_table_pre_box
- \l__siunitx_table_collect_pre_tl
- \bool_set_false:N \l__siunitx_font_set_bool
+ \bool_if:NTF \l__siunitx_unit_per_symbol_bool
+ { \__siunitx_unit_format_finalise_symbol: }
+ { \__siunitx_unit_format_finalise_fraction: }
}
- \hbox_set:Nn \l__siunitx_table_post_box
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_finalise_autofrac:
+ {
+ \group_begin:
+ \__siunitx_unit_format_finalise_fraction:
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__siunitx_unit_tmp_tl \l__siunitx_unit_formatted_tl
+ \__siunitx_unit_format_finalise_symbol:
+ \tl_set:Nx \l__siunitx_unit_formatted_tl
{
- \bool_if:NT \l__siunitx_table_math_bool
- {
- \c_math_toggle_token
- \scan_stop:
- }
- \l__siunitx_table_collect_post_tl
+ \mathchoice
+ { \exp_not:V \l__siunitx_unit_tmp_tl }
+ { \exp_not:V \l__siunitx_unit_formatted_tl }
+ { \exp_not:V \l__siunitx_unit_formatted_tl }
+ { \exp_not:V \l__siunitx_unit_formatted_tl }
}
- \dim_compare:nNnTF
- { \box_wd:N \l__siunitx_table_pre_box } >
- { \box_wd:N \l__siunitx_table_post_box }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_finalise_fraction:
+ {
+ \tl_set:Nx \l__siunitx_unit_formatted_tl
{
- \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
- { \box_wd:N \l__siunitx_table_pre_box }
- {
- \hbox_unpack:N \l__siunitx_table_post_box
- \tex_hfil:D
- }
+ \exp_not:V \l__siunitx_unit_fraction_function_tl
+ { \exp_not:V \l__siunitx_unit_formatted_tl }
+ { \exp_not:V \l__siunitx_unit_denominator_tl }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_finalise_symbol:
+ {
+ \tl_set:Nx \l__siunitx_unit_formatted_tl
+ {
+ \exp_not:V \l__siunitx_unit_formatted_tl
+ \exp_not:V \l__siunitx_unit_per_symbol_tl
+ \__siunitx_unit_format_bracket:N \l__siunitx_unit_denominator_tl
}
+ }
+\cs_new_protected:Npn \__siunitx_unit_format_finalise_power:
+ {
+ \tl_if_empty:NTF \l__siunitx_unit_formatted_tl
{
- \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
- { \box_wd:N \l__siunitx_table_post_box }
+ \tl_set_eq:NN
+ \l__siunitx_unit_formatted_tl
+ \l__siunitx_unit_denominator_tl
+ }
+ {
+ \tl_set:Nx \l__siunitx_unit_formatted_tl
{
- \tex_hfil:D
- \hbox_unpack:N \l__siunitx_table_pre_box
+ \exp_not:V \l__siunitx_unit_formatted_tl
+ \exp_not:V \l__siunitx_unit_product_tl
+ \exp_not:V \l__siunitx_unit_denominator_tl
}
}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure:
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \__siunitx_unit_non_latin:n #1
+ { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
+ }
+ {
+ \cs_new:Npn \__siunitx_unit_non_latin:n #1
+ {
+ \exp_last_unbraced:Nf \__siunitx_unit_non_latin:nnnn
+ { \char_to_utfviii_bytes:n {#1} }
+ }
+ \cs_new:Npn \__siunitx_unit_non_latin:nnnn #1#2#3#4
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#1} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#2} { 13 }
+ }
+ }
+\siunitx_declare_unit:Nn \kilogram { \kilo \gram }
+\siunitx_declare_unit:Nn \metre { m }
+\siunitx_declare_unit:Nn \meter { \metre }
+\siunitx_declare_unit:Nn \mole { mol }
+\siunitx_declare_unit:Nn \second { s }
+\siunitx_declare_unit:Nn \ampere { A }
+\siunitx_declare_unit:Nn \kelvin { K }
+\siunitx_declare_unit:Nn \candela { cd }
+\siunitx_declare_unit:Nn \gram { g }
+\siunitx_declare_prefix:Nnn \yocto { -24 } { y }
+\siunitx_declare_prefix:Nnn \zepto { -21 } { z }
+\siunitx_declare_prefix:Nnn \atto { -18 } { a }
+\siunitx_declare_prefix:Nnn \femto { -15 } { f }
+\siunitx_declare_prefix:Nnn \pico { -12 } { p }
+\siunitx_declare_prefix:Nnn \nano { -9 } { n }
+\siunitx_declare_prefix:Nnx \micro { -6 } { \__siunitx_unit_non_latin:n { "03BC } }
+\siunitx_declare_prefix:Nnn \milli { -3 } { m }
+\siunitx_declare_prefix:Nnn \centi { -2 } { c }
+\siunitx_declare_prefix:Nnn \deci { -1 } { d }
+\siunitx_declare_prefix:Nnn \deca { 1 } { da }
+\siunitx_declare_prefix:Nnn \deka { 1 } { da }
+\siunitx_declare_prefix:Nnn \hecto { 2 } { h }
+\siunitx_declare_prefix:Nnn \kilo { 3 } { k }
+\siunitx_declare_prefix:Nnn \mega { 6 } { M }
+\siunitx_declare_prefix:Nnn \giga { 9 } { G }
+\siunitx_declare_prefix:Nnn \tera { 12 } { T }
+\siunitx_declare_prefix:Nnn \peta { 15 } { P }
+\siunitx_declare_prefix:Nnn \exa { 18 } { E }
+\siunitx_declare_prefix:Nnn \zetta { 21 } { Z }
+\siunitx_declare_prefix:Nnn \yotta { 24 } { Y }
+\siunitx_declare_unit:Nn \becquerel { Bq }
+\siunitx_declare_unit:Nx \degreeCelsius { \__siunitx_unit_non_latin:n { "00B0 } C }
+\siunitx_declare_unit:Nn \coulomb { C }
+\siunitx_declare_unit:Nn \farad { F }
+\siunitx_declare_unit:Nn \gray { Gy }
+\siunitx_declare_unit:Nn \hertz { Hz }
+\siunitx_declare_unit:Nn \henry { H }
+\siunitx_declare_unit:Nn \joule { J }
+\siunitx_declare_unit:Nn \katal { kat }
+\siunitx_declare_unit:Nn \lumen { lm }
+\siunitx_declare_unit:Nn \lux { lx }
+\siunitx_declare_unit:Nn \newton { N }
+\siunitx_declare_unit:Nx \ohm { \__siunitx_unit_non_latin:n { "03A9 } }
+\siunitx_declare_unit:Nn \pascal { Pa }
+\siunitx_declare_unit:Nn \radian { rad }
+\siunitx_declare_unit:Nn \siemens { S }
+\siunitx_declare_unit:Nn \sievert { Sv }
+\siunitx_declare_unit:Nn \steradian { sr }
+\siunitx_declare_unit:Nn \tesla { T }
+\siunitx_declare_unit:Nn \volt { V }
+\siunitx_declare_unit:Nn \watt { W }
+\siunitx_declare_unit:Nn \weber { Wb }
+\siunitx_declare_unit:Nn \astronomicalunit { au }
+\siunitx_declare_unit:Nn \bel { B }
+\siunitx_declare_unit:Nn \decibel { \deci \bel }
+\siunitx_declare_unit:Nn \dalton { Da }
+\siunitx_declare_unit:Nn \day { d }
+\siunitx_declare_unit:Nn \electronvolt { eV }
+\siunitx_declare_unit:Nn \hectare { ha }
+\siunitx_declare_unit:Nn \hour { h }
+\siunitx_declare_unit:Nn \litre { L }
+\siunitx_declare_unit:Nn \liter { \litre }
+\siunitx_declare_unit:Nn \minute { min }
+\siunitx_declare_unit:Nn \neper { Np }
+\siunitx_declare_unit:Nn \tonne { t }
+\siunitx_declare_unit:Nx \arcminute { \__siunitx_unit_non_latin:n { "02B9 } }
+\siunitx_declare_unit:Nx \arcsecond { \__siunitx_unit_non_latin:n { "02BA } }
+\siunitx_declare_unit:Nx \degree { \__siunitx_unit_non_latin:n { "00B0 } }
+\siunitx_declare_unit:Nx \percent { \cs_to_str:N \% }
+\siunitx_declare_power:NNn \square \squared { 2 }
+\siunitx_declare_power:NNn \cubic \cubed { 3 }
+\msg_new:nnnn { siunitx } { unit / dangling-part }
+ { Found~#1~part~with~no~unit. }
+ {
+ Each~#1~part~must~be~associated~with~a~unit:~a~#1~part~was~found~
+ but~no~following~unit~was~given.
+ }
+\msg_new:nnnn { siunitx } { unit / duplicate-part }
+ { Duplicate~#1~part:~#2. }
+ {
+ Each~unit~may~have~only~one~#1:\\
+ the~additional~#1~part~'#2'~will~be~ignored.
+ }
+\msg_new:nnnn { siunitx } { unit / duplicate-sticky-per }
+ { Duplicate~\token_to_str:N \per. }
{
- \__siunitx_table_print_S_centered_measure_int_part:
- \__siunitx_table_print_S_centered_measure_marker:
- \__siunitx_table_print_S_centered_measure_result:
+ When~the~'sticky-per'~option~is~active,~only~one~
+ \token_to_str:N \per \ may~appear~in~a~unit.
}
-\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_int_part:
+\msg_new:nnnn { siunitx } { unit / literal }
+ { Literal~units~disabled. }
{
- \prop_get:NnNF \l__siunitx_number_out_prop { comparator } \l__siunitx_tmpa_tl
- { \tl_clear:N \l__siunitx_tmpa_tl }
- \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-sign }
- \l__siunitx_tmpb_tl
- { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
- \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
- \l__siunitx_tmpb_tl
- { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
- \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
- \l__siunitx_table_integer_dim
+ You~gave~the~literal~input~'#1'~
+ but~literal~unit~output~is~disabled.
}
-\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_marker:
+\msg_new:nnnn { siunitx } { unit / non-convertible-exponent }
+ { Exponent~'#1'~cannot~be~converted~into~a~symbolic~prefix. }
{
- \__siunitx_table_print_S_measure:NN \l__siunitx_output_decimal_tl
- \l__siunitx_table_marker_dim
+ The~exponent~'#1'~does~not~match~with~any~of~the~symbolic~prefixes~
+ set~up.
}
-\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_result:
+\msg_new:nnnn { siunitx } { unit / non-numeric-exponent }
+ { Prefix~'#1'~does~not~have~a~numerical~value. }
{
- \prop_get:NnN \l__siunitx_number_out_prop { result } \l__siunitx_tmpa_tl
- \hbox_set:Nn \l__siunitx_table_result_box
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
- \dim_set:Nn \l__siunitx_table_result_dim
- { \box_wd:N \l__siunitx_table_result_box }
+ The~prefix~'#1'~needs~to~be~combined~with~a~number,~but~it~has~no
+ numerical~value.
}
-\cs_new_protected:Npn \__siunitx_table_print_S_centered_integer:
+\msg_new:nnnn { siunitx } { unit / part-before-unit }
+ { Found~#1~part~before~first~unit:~#2. }
{
- \dim_set:Nn \l__siunitx_table_fill_post_dim
- { \l__siunitx_table_integer_dim - \l__siunitx_table_fill_pre_dim }
- \dim_zero:N \l__siunitx_table_fill_pre_dim
+ The~#1~part~'#2'~must~follow~after~a~unit:~
+ it~cannot~appear~before~any~units~and~will~therefore~be~ignored.
}
-\cs_new_protected:Npn \__siunitx_table_print_S_centered_decimal:
+\keys_set:nn { siunitx }
{
- \dim_sub:Nn \l__siunitx_table_fill_pre_dim
- { \l__siunitx_table_integer_dim }
- \dim_zero:N \l__siunitx_table_fill_post_dim
- }
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved:
+ bracket-unit-denominator = true ,
+ forbid-literal-units = false ,
+ fraction-command = \frac ,
+ inter-unit-product = \, ,
+ extract-mass-in-kilograms = true ,
+ parse-units = true ,
+ per-mode = power ,
+ per-symbol = / ,
+ qualifier-mode = subscript ,
+ qualifier-phrase = ,
+ sticky-per = false ,
+ unit-font-command = \mathrm
+ }
+\tl_new:N \l__siunitx_quantity_tmp_fp
+\tl_new:N \l__siunitx_quantity_tmp_tl
+\tl_new:N \l__siunitx_quantity_bracket_close_tl
+\tl_new:N \l__siunitx_quantity_bracket_open_tl
+\tl_set:Nn \l__siunitx_quantity_bracket_open_tl { ( }
+\tl_set:Nn \l__siunitx_quantity_bracket_close_tl { ) }
+\tl_new:N \l_siunitx_quantity_prefix_mode_tl
+\bool_new:N \l__siunitx_quantity_uncert_bracket_bool
+\bool_new:N \l__siunitx_quantity_uncert_repeat_bool
+\keys_define:nn { siunitx }
{
- \__siunitx_table_print_S_reserved_init:
- \__siunitx_table_print_S_reserved_ends:
- \bool_if:NT \l__siunitx_table_auto_round_bool
- { \__siunitx_table_print_S_reserved_round_auto: }
- \__siunitx_table_print_S_parse:
- \bool_if:NF \l__siunitx_error_bool
+ allow-quantity-breaks .bool_set:N =
+ \l__siunitx_quantity_break_bool ,
+ prefix-mode .choices:nn =
+ { combine-exponent , extract-exponent , input }
+ { \tl_set_eq:NN \l_siunitx_quantity_prefix_mode_tl \l_keys_choice_tl } ,
+ quantity-product .tl_set:N =
+ \l__siunitx_quantity_product_tl ,
+ separate-uncertainty-units .choice: ,
+ separate-uncertainty-units / bracket .code:n =
{
- \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
- \__siunitx_table_print_S_reserved_comparator:
- \__siunitx_table_print_S_reserved_mantissa:
- \__siunitx_table_print_S_reserved_exponent:
- \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
+ \bool_set_true:N \l__siunitx_quantity_uncert_bracket_bool
+ \bool_set_false:N \l__siunitx_quantity_uncert_repeat_bool
+ } ,
+ separate-uncertainty-units / repeat .code:n =
+ {
+ \bool_set_false:N \l__siunitx_quantity_uncert_bracket_bool
+ \bool_set_true:N \l__siunitx_quantity_uncert_repeat_bool
+ } ,
+ separate-uncertainty-units / single .code:n =
+ {
+ \bool_set_false:N \l__siunitx_quantity_uncert_bracket_bool
+ \bool_set_false:N \l__siunitx_quantity_uncert_repeat_bool
}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_init:
+\tl_new:N \l__siunitx_quantity_number_tl
+\tl_new:N \l__siunitx_quantity_unit_tl
+\cs_new_protected:Npn \siunitx_quantity:nn #1#2
{
- \dim_zero:N \l__siunitx_table_fill_mid_dim
- \dim_zero:N \l__siunitx_table_fill_post_dim
- \prop_set_eq:NN \l__siunitx_number_in_prop \l__siunitx_table_model_prop
- \__siunitx_number_process_sign:
- \__siunitx_number_process_zero_fill:
- \__siunitx_number_process_mantissa:
- \prop_if_in:NnF \l__siunitx_number_in_prop { symbolic }
- { \__siunitx_number_process_uncertainty: }
- \__siunitx_number_format:
- \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-decimal-raw }
- \l__siunitx_tmpa_tl
- {
- \prop_put:NnV \l__siunitx_number_out_prop { mantissa-decimal-raw }
- \l__siunitx_tmpa_tl
- }
- \prop_set_eq:NN \l__siunitx_table_model_prop \l__siunitx_number_out_prop
- }
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_ends:
- {
- \hbox_set:Nn \l__siunitx_table_pre_box
- {
+ \group_begin:
+ \siunitx_unit_options_apply:n {#2}
+ \tl_if_blank:nTF {#1}
{
- \l__siunitx_table_collect_pre_tl
- \bool_if:NT \l__siunitx_table_math_bool
- {
- \scan_stop:
- \c_math_toggle_token
- }
+ \siunitx_unit_format:nN {#2} \l__siunitx_quantity_unit_tl
+ \siunitx_print_unit:V \l__siunitx_quantity_unit_tl
}
- }
- \dim_compare:nNnT
- { \box_wd:N \l__siunitx_table_pre_box } = \c_zero_dim
- {
- \box_clear:N \l__siunitx_table_pre_box
- \l__siunitx_table_collect_pre_tl
- \bool_set_false:N \l__siunitx_font_set_bool
- }
- \hbox_set:Nn \l__siunitx_tmp_box { { \l__siunitx_table_pre_tl } }
- \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
- { \box_wd:N \l__siunitx_tmp_box }
- {
- \tex_hfil:D
- \hbox_unpack:N \l__siunitx_table_pre_box
- }
- \hbox_set:Nn \l__siunitx_tmp_box { \l__siunitx_table_post_tl }
- \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
- { \box_wd:N \l__siunitx_tmp_box }
- {
{
- \bool_if:NT \l__siunitx_table_math_bool
+ \bool_if:NTF \l_siunitx_number_parse_bool
+ { \__siunitx_quantity_parsed:nn {#1} {#2} }
{
- \c_math_toggle_token
- \scan_stop:
+ \tl_set:Nn \l__siunitx_quantity_number_tl { \ensuremath {#1} }
+ \siunitx_unit_format:nN {#2} \l__siunitx_quantity_unit_tl
+ \siunitx_quantity_print:VV
+ \l__siunitx_quantity_number_tl \l__siunitx_quantity_unit_tl
}
- \l__siunitx_table_collect_post_tl
}
- \tex_hfil:D
+ \group_end:
+ }
+\cs_new_protected:Npn \__siunitx_quantity_parsed:nn #1#2
+ {
+ \bool_set_false:N \l_siunitx_number_bracket_ambiguous_bool
+ \siunitx_number_parse:nN {#1} \l__siunitx_quantity_number_tl
+ \use:c { __siunitx_quantity_parsed_ \l_siunitx_quantity_prefix_mode_tl :n } {#2}
+ \tl_set:Nx \l__siunitx_quantity_number_tl
+ { \siunitx_number_output:NN \l__siunitx_quantity_number_tl \q_nil }
+ \exp_after:wN \__siunitx_quantity_parsed_aux:w \l__siunitx_quantity_number_tl \q_stop
+ }
+\cs_new_protected:cpn { __siunitx_quantity_parsed_combine-exponent:n } #1
+ {
+ \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl
+ \exp_args:NV \__siunitx_quantity_extract_exp:nNN
+ \l__siunitx_quantity_number_tl \l__siunitx_quantity_tmp_fp \l__siunitx_quantity_number_tl
+ \siunitx_unit_format_combine_exponent:nnN {#1}
+ \l__siunitx_quantity_tmp_fp \l__siunitx_quantity_unit_tl
+ }
+\cs_new_protected:cpn { __siunitx_quantity_parsed_extract-exponent:n } #1
+ {
+ \siunitx_unit_format_extract_prefixes:nNN {#1}
+ \l__siunitx_quantity_unit_tl \l__siunitx_quantity_tmp_fp
+ \tl_set:Nx \l__siunitx_quantity_number_tl
+ {
+ \siunitx_number_adjust_exponent:Nn
+ \l__siunitx_quantity_number_tl \l__siunitx_quantity_tmp_fp
}
+ \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_round_auto:
+\cs_new_protected:Npn \__siunitx_quantity_parsed_input:n #1
{
- \prop_get:NnNTF \l__siunitx_table_model_prop { mantissa-decimal-raw }
- \l__siunitx_tmpa_tl
- { \int_set:Nn \l__siunitx_process_precision_int { \l__siunitx_tmpa_tl } }
- { \int_zero:N \l__siunitx_process_precision_int }
- \tl_set:Nn \l__siunitx_round_tl { places }
+ \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl
+ \siunitx_unit_format:nN {#1} \l__siunitx_quantity_unit_tl
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_comparator:
+\cs_new_protected:Npn \__siunitx_quantity_parsed_aux:w
+ #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil
+ #8 \q_nil #9 \q_stop
+ { \__siunitx_quantity_parsed_aux:nnnw {#1} {#2#3#4#5} {#6#7#8} #9 \q_stop }
+\cs_new_protected:Npn \__siunitx_quantity_parsed_aux:nnnw
+ #1#2#3 #4 \q_nil #5 \q_nil #6 \q_stop
+ { \__siunitx_quantity_parsed_aux:nnnn {#1} {#2} {#3#4} {#5#6} }
+\cs_new_protected:Npn \__siunitx_quantity_parsed_aux:nnnn #1#2#3#4
{
- \prop_get:NnNTF \l__siunitx_table_model_prop { comparator }
- \l__siunitx_tmpa_tl
+ \tl_if_blank:nTF {#3}
+ { \siunitx_quantity_print:nV {#1#2#4} \l__siunitx_quantity_unit_tl }
{
- \hbox_set:Nn \l__siunitx_tmp_box
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
- \prop_get:NnNTF \l__siunitx_number_out_prop { comparator }
- \l__siunitx_tmpa_tl
+ \bool_if:NTF \l__siunitx_quantity_uncert_bracket_bool
{
- \hbox_set_to_wd:Nnn \l__siunitx_table_result_box
- { \box_wd:N \l__siunitx_tmp_box }
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
+ \siunitx_quantity_print:xV
+ {
+ \exp_not:n {#1}
+ \exp_not:V \l__siunitx_quantity_bracket_open_tl
+ \exp_not:n {#2#3}
+ \exp_not:V \l__siunitx_quantity_bracket_close_tl
+ \exp_not:n {#4}
+ }
+ \l__siunitx_quantity_unit_tl
}
{
- \dim_add:Nn \l__siunitx_table_fill_pre_dim
- { \box_wd:N \l__siunitx_tmp_box }
- \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
- \__siunitx_table_print_S_reserved_store_fill_pre:n
+ \bool_if:NTF \l__siunitx_quantity_uncert_repeat_bool
+ {
+ \siunitx_quantity_print:nV {#1#2}
+ \l__siunitx_quantity_unit_tl
+ \siunitx_quantity_print:nV { { } #3 }
+ \l__siunitx_quantity_unit_tl
+ \siunitx_print_number:n { { } #4 }
+ }
+ { \siunitx_quantity_print:nV {#1#2#3#4} \l__siunitx_quantity_unit_tl }
}
}
+ }
+\cs_new_protected:Npn \__siunitx_quantity_extract_exp:nNN #1#2#3
+ { \__siunitx_quantity_extract_exp:nnnnnnnNN #1 #2 #3 }
+\cs_new_protected:Npn \__siunitx_quantity_extract_exp:nnnnnnnNN #1#2#3#4#5#6#7#8#9
+ {
+ \fp_set:Nn #8 {#6#7}
+ \tl_set:Nx #9
+ { {#1} {#2} {#3} {#4} {#5} { } { 0 } }
+ }
+\cs_new_protected:Npn \siunitx_quantity_print:nn #1#2
+ {
+ \siunitx_print_number:n {#1}
+ \tl_if_blank:nF {#2}
{
- \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
- \__siunitx_table_print_S_reserved_store_fill_pre:n
- \prop_if_in:NnT \l__siunitx_number_out_prop { comparator }
- {
- \msg_error:nnx { siunitx } { table-partial-number }
- { a~comparator }
- }
+ \tl_use:N \l__siunitx_quantity_product_tl
+ \bool_if:NTF \l__siunitx_quantity_break_bool
+ { \penalty \binoppenalty }
+ { \nobreak }
+ \siunitx_print_unit:n {#2}
}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill_pre:n
- { \dim_add:Nn \l__siunitx_table_fill_pre_dim }
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill_mid:n
- { \dim_add:Nn \l__siunitx_table_fill_mid_dim }
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa:
+\cs_generate_variant:Nn \siunitx_quantity_print:nn { nV , VV , xV }
+\keys_set:nn { siunitx }
{
- \prop_get:NnNTF \l__siunitx_table_model_prop { mantissa }
- \l__siunitx_tmpa_tl
+ allow-quantity-breaks = false ,
+ prefix-mode = input ,
+ quantity-product = \, ,
+ separate-uncertainty-units = bracket
+ }
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \__siunitx_quantity_non_latin:n #1
+ { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
+ }
+ {
+ \cs_new:Npn \__siunitx_quantity_non_latin:n #1
{
- \hbox_set:Nn \l__siunitx_tmp_box
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
- \prop_get:NnNTF \l__siunitx_number_out_prop { mantissa }
- \l__siunitx_tmpa_tl
- {
- \dim_set:Nn \l__siunitx_table_mantissa_dim
- { \box_wd:N \l__siunitx_tmp_box }
- \hbox_set:Nn \l__siunitx_table_mantissa_box
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
- \__siunitx_table_print_S_reserved_mantissa_parts:
- }
- {
- \__siunitx_table_print_S_reserved_store_fill:n
- { \box_wd:N \l__siunitx_tmp_box }
- }
+ \exp_last_unbraced:Nf \__siunitx_quantity_non_latin:nnnn
+ { \char_to_utfviii_bytes:n {#1} }
}
+ \cs_new:Npn \__siunitx_quantity_non_latin:nnnn #1#2#3#4
{
- \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
- {
- \msg_error:nnx { siunitx } { table-partial-number }
- { a~mantissa }
- }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#1} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#2} { 13 }
}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_parts:
+\siunitx_declare_unit:Nxn \degree
+ { \__siunitx_quantity_non_latin:n { "00B0 } }
+ { quantity-product = { } }
+\tl_new:N \l__siunitx_symbol_tmpa_tl
+\tl_new:N \l__siunitx_symbol_tmpb_tl
+\AtBeginDocument
+ {
+ \cs_if_free:cT { T@TS1 }
+ { \RequirePackage { textcomp } }
+ }
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
{
- \__siunitx_table_print_S_reserved_mantissa_integer:
- \hbox_set:Nn \l__siunitx_table_result_box
+ \cs_new:Npn \__siunitx_symbol_non_latin:n #1
+ { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
+ }
+ {
+ \cs_new:Npn \__siunitx_symbol_non_latin:n #1
{
- \hbox_unpack:N \l__siunitx_table_result_box
- \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
- \hbox_unpack:N \l__siunitx_table_mantissa_box
+ \exp_last_unbraced:Nf \__siunitx_symbol_non_latin:nnnn
+ { \char_to_utfviii_bytes:n {#1} }
}
- \dim_set:Nn \l__siunitx_table_fill_mid_dim
+ \cs_new:Npn \__siunitx_symbol_non_latin:nnnn #1#2#3#4
{
- \l__siunitx_table_mantissa_dim
- - \box_wd:N \l__siunitx_table_mantissa_box
- - \l__siunitx_table_integer_dim
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#1} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#2} { 13 }
}
- \__siunitx_table_print_S_reserved_mantissa_uncert:
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_integer:
+\prg_new_protected_conditional:Npnn \__siunitx_symbol_if_replace:Nn #1#2 { T , TF }
{
- \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-sign }
- \l__siunitx_tmpa_tl
- { \tl_clear:N \l__siunitx_tmpa_tl }
- \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-integer }
- \l__siunitx_tmpb_tl
- { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
- \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
- \l__siunitx_table_integer_dim
- \prop_get:NnNF \l__siunitx_number_out_prop { mantissa-sign }
- \l__siunitx_tmpa_tl
- { \tl_clear:N \l__siunitx_tmpa_tl }
- \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
- \l__siunitx_tmpb_tl
- { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
- \tl_if_empty:NF \l__siunitx_tmpa_tl
- {
- \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
- \l__siunitx_tmp_dim
- \dim_sub:Nn \l__siunitx_table_integer_dim { \l__siunitx_tmp_dim }
- }
- \__siunitx_table_print_S_reserved_store_fill:n
- { \l__siunitx_table_integer_dim }
+ \group_begin:
+ \tl_set:Nx \l__siunitx_symbol_tmpa_tl { \__siunitx_symbol_non_latin:n {#2} }
+ \protected@edef \l__siunitx_symbol_tmpa_tl
+ { \exp_not:N \mathrm { \l__siunitx_symbol_tmpa_tl } }
+ \keys_set:nn { siunitx } { parse-units = false }
+ \siunitx_unit_format:nN {#1} \l__siunitx_symbol_tmpb_tl
+ \str_if_eq:VVTF \l__siunitx_symbol_tmpa_tl \l__siunitx_symbol_tmpb_tl
+ {
+ \group_end:
+ \prg_return_true:
+ }
+ {
+ \group_end:
+ \prg_return_false:
+ }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_uncert:
+\AtBeginDocument
{
- \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-uncertainty }
- \l__siunitx_tmpa_tl
+ \__siunitx_symbol_if_replace:NnT \arcminute { "02B9 }
+ {
+ \siunitx_declare_unit:Nn \arcminute
+ { \exp_not:N \ensuremath { { } ' } }
+ }
+ \__siunitx_symbol_if_replace:NnT \arcsecond { "02BA }
+ {
+ \siunitx_declare_unit:Nn \arcsecond
+ { \exp_not:N \ensuremath { { } '' } }
+ }
+ \__siunitx_symbol_if_replace:NnT \degree { "00B0 }
+ {
+ \@ifpackageloaded { fontspec }
+ { }
+ {
+ \siunitx_declare_unit:Nxn \degree
+ {
+ \siunitx_print_text:n
+ { \__siunitx_symbol_non_latin:n { "00B0 } }
+ }
+ { quantity-product = { } }
+ }
+ }
+ \group_begin:
+ \tl_set:Nx \l__siunitx_symbol_tmpa_tl { \__siunitx_symbol_non_latin:n { "00B0 } C }
+ \protected@edef \l__siunitx_symbol_tmpa_tl
+ { \exp_not:N \mathrm { \l__siunitx_symbol_tmpa_tl } }
+ \keys_set:nn { siunitx } { parse-units = false }
+ \siunitx_unit_format:nN { \degreeCelsius } \l__siunitx_symbol_tmpb_tl
+ \str_if_eq:VVTF \l__siunitx_symbol_tmpa_tl \l__siunitx_symbol_tmpb_tl
+ {
+ \group_end:
+ \@ifpackageloaded { fontspec }
+ { }
+ {
+ \siunitx_declare_unit:Nx \degreeCelsius
+ {
+ \siunitx_print_text:n
+ { \__siunitx_symbol_non_latin:n { "00B0 } } C
+ }
+ }
+ }
+ { \group_end: }
+ \__siunitx_symbol_if_replace:NnT \ohm { "03A9 }
{
- \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpa_tl
- \hbox_set:Nn \l__siunitx_tmp_box
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
- \prop_get:NnNTF \l__siunitx_number_out_prop { mantissa-uncertainty }
- \l__siunitx_tmpa_tl
+ \siunitx_declare_unit:Nx \ohm
{
- \dim_set:Nn \l__siunitx_table_uncert_dim
- { \box_wd:N \l__siunitx_tmp_box }
- \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpa_tl
- \hbox_set:Nn \l__siunitx_tmp_box
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
- \bool_if:NTF \l__siunitx_table_align_uncert_bool
- { \__siunitx_table_print_S_reserved_mantissa_uncert_aligned: }
- { \__siunitx_table_print_S_reserved_mantissa_uncert_not_aligned: }
+ \exp_not:N \ifmmode
+ \cs_if_exist:NTF \upOmega
+ { \exp_not:N \upOmega }
+ { \exp_not:N \Omega }
+ \exp_not:N \else
+ \siunitx_print_text:n
+ {
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ { \__siunitx_symbol_non_latin:n { "03A9 } }
+ { \exp_not:N \textohm }
+ }
+ \exp_not:N \fi
}
+ }
+ \__siunitx_symbol_if_replace:NnT \micro { "03BC }
+ {
+ \siunitx_declare_prefix:Nnx \micro { -6 }
{
- \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
- \__siunitx_table_print_S_reserved_store_fill_mid:n
- \__siunitx_table_print_S_reserved_store_fill:n
- { \box_wd:N \l__siunitx_tmp_box }
+ \siunitx_print_text:n
+ {
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ { \__siunitx_symbol_non_latin:n { "00B5 } }
+ { \exp_not:N \textmu }
+ }
}
}
}
-\cs_new_protected:Npn
- \__siunitx_table_print_S_reserved_mantissa_uncert_aligned:
+\AtBeginDocument
{
- \hbox_set:Nn \l__siunitx_table_result_box
+ \group_begin:
+ \tl_set:Nn \l__siunitx_symbol_tmpa_tl
+ { { } { } { 2 } { } { } { } { 1 } }
+ \tl_set:Nx \l__siunitx_symbol_tmpa_tl
+ { \siunitx_number_output:N \l__siunitx_symbol_tmpa_tl }
+ \tl_set:Nn \l__siunitx_symbol_tmpb_tl { 2 \times 10 ^ { 1 } }
+ \tl_if_eq:NNTF \l__siunitx_symbol_tmpa_tl \l__siunitx_symbol_tmpb_tl
+ {
+ \group_end:
+ \keys_set:nn { siunitx }
+ {
+ exponent-product =
+ \ifmmode \times \else \texttimes \fi ,
+ product-symbol =
+ \ifmmode \times \else \texttimes \fi
+ }
+ }
+ { \group_end: }
+ }
+\AtBeginDocument
+ {
+ \@ifpackageloaded { hyperref }
{
- \hbox_unpack:N \l__siunitx_table_result_box
- \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
- \hbox_unpack:N \l__siunitx_tmp_box
+ \exp_args:Nx \pdfstringdefDisableCommands
+ {
+ \cs_set_eq:NN \siunitx_print_text:n \exp_not:N \use:n
+ \siunitx_declare_unit:Nn \exp_not:N \ohm
+ { \__siunitx_symbol_non_latin:n { "03A9 } }
+ }
}
- \dim_set:Nn \l__siunitx_table_fill_mid_dim
- { \l__siunitx_table_uncert_dim - \box_wd:N \l__siunitx_tmp_box }
+ { }
}
-\cs_new_protected:Npn
- \__siunitx_table_print_S_reserved_mantissa_uncert_not_aligned:
+\siunitx_declare_unit:Nn \A { \ampere }
+\siunitx_declare_unit:Nn \pA { \pico \ampere }
+\siunitx_declare_unit:Nn \nA { \nano \ampere }
+\siunitx_declare_unit:Nn \uA { \micro \ampere }
+\siunitx_declare_unit:Nn \mA { \milli \ampere }
+\siunitx_declare_unit:Nn \kA { \kilo \ampere }
+\siunitx_declare_unit:Nn \Hz { \hertz }
+\siunitx_declare_unit:Nn \mHz { \milli \hertz }
+\siunitx_declare_unit:Nn \kHz { \kilo \hertz }
+\siunitx_declare_unit:Nn \MHz { \mega \hertz }
+\siunitx_declare_unit:Nn \GHz { \giga \hertz }
+\siunitx_declare_unit:Nn \THz { \tera \hertz }
+\siunitx_declare_unit:Nn \mol { \mole }
+\siunitx_declare_unit:Nn \fmol { \femto \mole }
+\siunitx_declare_unit:Nn \pmol { \pico \mole }
+\siunitx_declare_unit:Nn \nmol { \nano \mole }
+\siunitx_declare_unit:Nn \umol { \micro \mole }
+\siunitx_declare_unit:Nn \mmol { \milli \mole }
+\siunitx_declare_unit:Nn \kmol { \kilo \mole }
+\siunitx_declare_unit:Nn \V { \volt }
+\siunitx_declare_unit:Nn \pV { \pico \volt }
+\siunitx_declare_unit:Nn \nV { \nano \volt }
+\siunitx_declare_unit:Nn \uV { \micro \volt }
+\siunitx_declare_unit:Nn \mV { \milli \volt }
+\siunitx_declare_unit:Nn \kV { \kilo \volt }
+\siunitx_declare_unit:Nn \hl { \hecto \litre }
+\siunitx_declare_unit:Nn \l { \litre }
+\siunitx_declare_unit:Nn \ml { \milli \litre }
+\siunitx_declare_unit:Nn \ul { \micro \litre }
+\siunitx_declare_unit:Nn \hL { \hecto \liter }
+\siunitx_declare_unit:Nn \L { \liter }
+\siunitx_declare_unit:Nn \mL { \milli \liter }
+\siunitx_declare_unit:Nn \uL { \micro \liter }
+\siunitx_declare_unit:Nn \fg { \femto \gram }
+\siunitx_declare_unit:Nn \pg { \pico \gram }
+\siunitx_declare_unit:Nn \ng { \nano \gram }
+\siunitx_declare_unit:Nn \ug { \micro \gram }
+\siunitx_declare_unit:Nn \mg { \milli \gram }
+\siunitx_declare_unit:Nn \g { \gram }
+\siunitx_declare_unit:Nn \kg { \kilo \gram }
+\siunitx_declare_unit:Nn \W { \watt }
+\siunitx_declare_unit:Nn \uW { \micro \watt }
+\siunitx_declare_unit:Nn \mW { \milli \watt }
+\siunitx_declare_unit:Nn \kW { \kilo \watt }
+\siunitx_declare_unit:Nn \MW { \mega \watt }
+\siunitx_declare_unit:Nn \GW { \giga \watt }
+\siunitx_declare_unit:Nn \J { \joule }
+\siunitx_declare_unit:Nn \uJ { \micro \joule }
+\siunitx_declare_unit:Nn \mJ { \milli \joule }
+\siunitx_declare_unit:Nn \kJ { \kilo \joule }
+\siunitx_declare_unit:Nn \eV { \electronvolt }
+\siunitx_declare_unit:Nn \meV { \milli \electronvolt }
+\siunitx_declare_unit:Nn \keV { \kilo \electronvolt }
+\siunitx_declare_unit:Nn \MeV { \mega \electronvolt }
+\siunitx_declare_unit:Nn \GeV { \giga \electronvolt }
+\siunitx_declare_unit:Nn \TeV { \tera \electronvolt }
+\siunitx_declare_unit:Nnn \kWh { \kilo \watt \hour }
+ { inter-unit-product = }
+\siunitx_declare_unit:Nn \m { \metre }
+\siunitx_declare_unit:Nn \pm { \pico \metre }
+\siunitx_declare_unit:Nn \nm { \nano \metre }
+\siunitx_declare_unit:Nn \um { \micro \metre }
+\siunitx_declare_unit:Nn \mm { \milli \metre }
+\siunitx_declare_unit:Nn \cm { \centi \metre }
+\siunitx_declare_unit:Nn \dm { \deci \metre }
+\siunitx_declare_unit:Nn \km { \kilo \metre }
+\siunitx_declare_unit:Nn \K { \kelvin }
+\siunitx_declare_unit:Nn \dB { \deci \bel }
+\siunitx_declare_unit:Nn \F { \farad }
+\siunitx_declare_unit:Nn \fF { \femto \farad }
+\siunitx_declare_unit:Nn \pF { \pico \farad }
+\siunitx_declare_unit:Nn \nF { \nano \farad }
+\siunitx_declare_unit:Nn \uF { \micro \farad }
+\siunitx_declare_unit:Nn \H { \henry }
+\siunitx_declare_unit:Nn \mH { \milli \henry }
+\siunitx_declare_unit:Nn \uH { \micro \henry }
+\siunitx_declare_unit:Nn \N { \newton }
+\siunitx_declare_unit:Nn \mN { \milli \newton }
+\siunitx_declare_unit:Nn \kN { \kilo \newton }
+\siunitx_declare_unit:Nn \MN { \mega \newton }
+\siunitx_declare_unit:Nn \Pa { \pascal }
+\siunitx_declare_unit:Nn \kPa { \kilo \pascal }
+\siunitx_declare_unit:Nn \MPa { \mega \pascal }
+\siunitx_declare_unit:Nn \GPa { \giga \pascal }
+\siunitx_declare_unit:Nn \mohm { \milli \ohm }
+\siunitx_declare_unit:Nn \kohm { \kilo \ohm }
+\siunitx_declare_unit:Nn \Mohm { \mega \ohm }
+\siunitx_declare_unit:Nn \s { \second }
+\siunitx_declare_unit:Nn \as { \atto \second }
+\siunitx_declare_unit:Nn \fs { \femto \second }
+\siunitx_declare_unit:Nn \ps { \pico \second }
+\siunitx_declare_unit:Nn \ns { \nano \second }
+\siunitx_declare_unit:Nn \us { \micro \second }
+\siunitx_declare_unit:Nn \ms { \milli \second }
+\siunitx_declare_prefix:Nn \kibi { Ki }
+\siunitx_declare_prefix:Nn \mebi { Mi }
+\siunitx_declare_prefix:Nn \gibi { Gi }
+\siunitx_declare_prefix:Nn \tebi { Ti }
+\siunitx_declare_prefix:Nn \pebi { Pi }
+\siunitx_declare_prefix:Nn \exbi { Ei }
+\siunitx_declare_prefix:Nn \zebi { Zi }
+\siunitx_declare_prefix:Nn \yobi { Yi }
+\siunitx_declare_unit:Nn \bit { bit }
+\siunitx_declare_unit:Nn \byte { B }
+\tl_new:N \l__siunitx_command_tmp_tl
+\keys_define:nn { siunitx }
+ {
+ free-standing-units .bool_set:N =
+ \l__siunitx_command_create_bool ,
+ overwrite-commands .bool_set:N =
+ \l__siunitx_command_overwrite_bool ,
+ space-before-unit .bool_set:N =
+ \l__siunitx_command_prespace_bool ,
+ unit-optional-argument .bool_set:N =
+ \l__siunitx_command_optarg_bool ,
+ use-xspace .bool_set:N =
+ \l__siunitx_command_xspace_bool
+ }
+\AtBeginDocument
{
- \hbox_set:Nn \l__siunitx_table_result_box
+ \clist_map_inline:nn
{
- \hbox_unpack:N \l__siunitx_table_result_box
- \hbox_unpack:N \l__siunitx_tmp_box
+ free-standing-units ,
+ overwrite-commands ,
+ space-before-unit ,
+ unit-optional-argument ,
+ use-xspace
}
- \dim_add:Nn \l__siunitx_table_fill_mid_dim
{
- \l__siunitx_table_uncert_dim
- - \box_wd:N \l__siunitx_tmp_box
+ \keys_define:nn { siunitx }
+ {
+ #1 .code:n =
+ { \msg_warning:nnn { siunitx } { option-preamble-only } {#1} }
+ }
}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent:
+\msg_new:nnn { siunitx } { option-preamble-only }
+ { Option~'#1'~only~available~in~the~preamble. }
+\cs_new_protected:Npn \siunitx_command_create:
{
- \prop_get:NnNTF \l__siunitx_table_model_prop { exponent-result }
- \l__siunitx_tmpa_tl
+ \bool_if:NT \l__siunitx_command_create_bool
{
- \prop_if_in:NnT \l__siunitx_table_model_prop { mantissa }
- { \__siunitx_table_print_S_reserved_exponent_product: }
- \hbox_set:Nn \l__siunitx_tmp_box
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
- \prop_get:NnNTF \l__siunitx_number_out_prop { exponent-result }
- \l__siunitx_tmpa_tl
+ \__siunitx_command_create:
+ \@ifpackageloaded { soulpos }
{
- \dim_set:Nn \l__siunitx_table_exponent_dim
- { \box_wd:N \l__siunitx_tmp_box }
- \tl_if_empty:NT \l__siunitx_output_exponent_tl
+ \@ifpackageloaded { soul }
+ { }
{
- \prop_if_in:NnTF \l__siunitx_number_out_prop { mantissa }
- { \__siunitx_table_print_S_reserved_exponent_product: }
- { \__siunitx_table_print_S_reserved_exponent_product_correction: }
+ \cs_undefine:N \hl
+ \cs_undefine:N \ul
}
- \hbox_set:Nn \l__siunitx_tmp_box
- { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
- \bool_if:NTF \l__siunitx_table_align_exponent_bool
- { \__siunitx_table_print_S_reserved_exponent_aligned: }
- { \__siunitx_table_print_S_reserved_exponent_not_aligned: }
- }
- {
- \dim_set:Nn \l__siunitx_table_fill_post_dim
- { \l__siunitx_table_fill_mid_dim + \box_wd:N \l__siunitx_tmp_box }
}
+ { }
}
+ \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
{
- \prop_if_in:NnT \l__siunitx_number_out_prop { exponent-result }
- {
- \msg_error:nnx { siunitx } { table-partial-number }
- { an~exponent }
- }
- \dim_set_eq:NN \l__siunitx_table_fill_post_dim
- \l__siunitx_table_fill_mid_dim
+ \cs_if_free:NT ##1
+ { \cs_set_protected:Npn ##1 { \ERROR } }
}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent_product:
+\AtBeginDocument { \siunitx_command_create: }
+\cs_new_protected:Npn \__siunitx_command_create:
{
- \tl_set_eq:NN \l__siunitx_tmpb_tl \l__siunitx_exponent_product_tl
- \bool_if:NT \l__siunitx_tight_bool
+ \bool_if:NT \l__siunitx_command_xspace_bool
+ { \RequirePackage { xspace } }
+ \bool_if:NT \l__siunitx_command_overwrite_bool
{
- \tl_set:Nx \l__siunitx_tmpb_tl
- { \exp_not:N \mathord \exp_not:o \l__siunitx_tmpb_tl }
+ \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
+ { \cs_undefine:N ##1 }
}
- \tl_set:Nx \l__siunitx_tmpa_tl
+ \cs_set_protected:Npx \__siunitx_command_create:N ##1
{
- \exp_not:N \ensuremath { { } \exp_not:o \l__siunitx_tmpb_tl { } }
- \exp_not:o \l__siunitx_tmpa_tl
+ \ProvideDocumentCommand ##1 { \bool_if:NT \l__siunitx_command_optarg_bool { o } }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \bool_if:NTF \l__siunitx_command_optarg_bool
+ { \exp_not:N \IfNoValueTF {####1} }
+ { \use_i:nn }
+ {
+ \siunitx_unit_options_apply:n {##1}
+ \bool_if:NT \l__siunitx_command_prespace_bool { \exp_not:N \ }
+ \siunitx_unit_format:nN {##1}
+ \exp_not:N \l__siunitx_command_tmp_tl
+ \siunitx_print_unit:V
+ \exp_not:N \l__siunitx_command_tmp_tl
+ }
+ { \siunitx_quantity:nn {####1} {##1} }
+ \group_end:
+ \bool_if:NT \l__siunitx_command_xspace_bool { \exp_not:N \xspace }
+ }
}
+ \seq_map_function:NN \l_siunitx_unit_seq \__siunitx_command_create:N
}
-\cs_new_protected:Npn
- \__siunitx_table_print_S_reserved_exponent_product_correction:
+\cs_new_protected:Npn \__siunitx_command_create:N #1 { }
+\keys_set:nn { siunitx }
{
- \group_begin:
- \tl_clear:N \l__siunitx_tmpa_tl
- \__siunitx_table_print_S_reserved_exponent_product:
- \tl_set:Nx \l__siunitx_tmpa_tl
- { { } \exp_not:o \l__siunitx_tmpa_tl { } }
- \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl \l__siunitx_tmp_dim
- \exp_args:NNNo \group_end:
- \dim_set:Nn \l__siunitx_tmp_dim { \dim_use:N \l__siunitx_tmp_dim }
- \__siunitx_table_print_S_reserved_store_fill:n { \l__siunitx_tmp_dim }
- \dim_sub:Nn \l__siunitx_table_exponent_dim { \l__siunitx_tmp_dim }
+ free-standing-units = false ,
+ overwrite-commands = false ,
+ space-before-unit = false ,
+ unit-optional-argument = false ,
+ use-xspace = false
}
-\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent_aligned:
+\msg_new:nnn { siunitx } { option-deprecated }
{
- \hbox_set:Nn \l__siunitx_table_result_box
- {
- \hbox_unpack:N \l__siunitx_table_result_box
- \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
- \hbox_unpack:N \l__siunitx_tmp_box
- }
- \dim_set:Nn \l__siunitx_table_fill_post_dim
- {
- \l__siunitx_table_exponent_dim
- - \box_wd:N \l__siunitx_tmp_box
- }
+ Option~"#1"~has~been~deprecated~in~this~release.\\ \\
+ Use~"#2"~as~a~replacement.
}
-\cs_new_protected:Npn
- \__siunitx_table_print_S_reserved_exponent_not_aligned:
+\msg_new:nnn { siunitx } { option-removed }
+ { Option~"#1"~has~been~removed~in~this~release. }
+\cs_new_protected:Npn \__siunitx_option_deprecated:nn #1#2
{
- \hbox_set:Nn \l__siunitx_table_result_box
- {
- \hbox_unpack:N \l__siunitx_table_result_box
- \hbox_unpack:N \l__siunitx_tmp_box
- }
- \dim_set:Nn \l__siunitx_table_fill_post_dim
- {
- \l__siunitx_table_fill_mid_dim
- + \l__siunitx_table_exponent_dim
- - \box_wd:N \l__siunitx_tmp_box
- }
+ \msg_info:nnnn { siunitx } { option-deprecated } {#1} {#2}
+ \keys_set:nn { siunitx } {#2}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_direct:
+\cs_new_protected:Npn \__siunitx_option_deprecated:nnn #1#2#3
{
- \peek_catcode_ignore_spaces:NTF \c_group_begin_token
- { \__siunitx_table_print_S_direct_text:n }
- { \__siunitx_table_print_S_direct_main: }
+ \msg_info:nnnn { siunitx } { option-deprecated } {#1} {#2}
+ \keys_set:nn { siunitx } { #2 = #3 }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_text:n #1
+\cs_generate_variant:Nn \__siunitx_option_deprecated:nnn { nnV }
+\cs_new_protected:Npn \__siunitx_option_removed:n #1
{
- \__siunitx_table_column_begin:n { \l__siunitx_table_text_align_skip }
- #1
- \__siunitx_table_column_end:n { \l__siunitx_table_text_align_skip }
+ \msg_warning:nnx { siunitx } { option-removed }
+ {#1}
}
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered:
+\cs_generate_variant:Nn \__siunitx_option_removed:n { V }
+\clist_map_inline:nn { abbreviations , binary-units , version-1-compatibility }
{
- \cs_set_eq:NN \__siunitx_table_print:
- \__siunitx_table_print_S_direct_centered_end:
- \hbox_set:Nn \l__siunitx_tmp_box
- { \ensuremath { \l__siunitx_output_decimal_tl } }
- \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
- { \box_wd:N \l__siunitx_tmp_box }
- { \tex_hfil:D }
- \hbox_set:Nw \l__siunitx_table_pre_box
- \c_math_toggle_token
- \tl_map_function:NN \l__siunitx_input_decimal_tl
- \__siunitx_table_print_S_direct_centered_aux:N
+ \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_aux:N #1
+\keys_define:nn { siunitx }
{
- \char_set_active_eq:NN #1 \__siunitx_table_print_S_direct_centered_begin:
- \char_set_mathcode:nn { `#1 } { "8000 }
+ add-arc-degree-zero .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { add-arc-degree-zero }
+ { fill-angle-degrees }
+ \l_keys_value_tl
+ } ,
+ add-arc-degree-zero .default:n = true ,
+ add-arc-minute-zero .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { add-arc-minute-zero }
+ { fill-angle-minutes }
+ \l_keys_value_tl
+ } ,
+ add-arc-minute-zero .default:n = true ,
+ add-arc-second-zero .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { add-arc-second-zero }
+ { fill-angle-seconds }
+ \l_keys_value_tl
+ } ,
+ add-arc-second-zero .default:n = true ,
+ arc-separator .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { arc-separator }
+ { angle-separator }
+ \l_keys_value_tl
+ }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_begin:
+\keys_define:nn { siunitx }
{
- \c_math_toggle_token
- \hbox_set_end:
- \hbox_set:Nw \l__siunitx_table_post_box
- \c_math_toggle_token
- \l__siunitx_output_decimal_tl
+ list-units / brackets .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { list-units~=~brackets }
+ { list-units~=~bracket }
+ } ,
+ range-units / brackets .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { range-units~=~brackets }
+ { range-units~=~bracket }
+ } ,
+ product-units / brackets .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { product-units~=~brackets }
+ { product-units~=~bracket }
+ }
}
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_end:
+\keys_define:nn { siunitx }
{
- \c_math_toggle_token
- \hbox_set_end:
- \dim_compare:nNnTF
- { \box_wd:N \l__siunitx_table_pre_box } >
- { \box_wd:N \l__siunitx_table_post_box }
+ overwrite-functions .code:n =
{
- \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
- { \box_wd:N \l__siunitx_table_pre_box }
+ \__siunitx_option_deprecated:nnV
+ { overwrite-functions }
+ { overwrite-commands }
+ \l_keys_value_tl
+ } ,
+ overwrite-functions .default:n = true
+ }
+\keys_define:nn { siunitx }
+ {
+ detect-all .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { detect-all }
{
- \hbox_unpack:N \l__siunitx_table_post_box
- \tex_hfil:D
+ mode~=~match , ~
+ propagate-math-font~=~true , ~
+ reset-math-version~=~false , ~
+ reset-text-family~=~false , ~
+ reset-text-series~=~false , ~
+ text-family-to-math~=~true , ~
+ text-series-to-math~=~true
}
- }
+ } ,
+ detect-family .code:n =
{
- \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
- { \box_wd:N \l__siunitx_table_post_box }
+ \__siunitx_option_deprecated:nn
+ { detect-family }
{
- \tex_hfil:D
- \hbox_unpack:N \l__siunitx_table_pre_box
+ reset-text-family~=~false , ~
+ text-family-to-math~=~true
}
- }
- \box_use:N \l__siunitx_table_pre_box
- \box_use:N \l__siunitx_table_post_box
- }
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved:
- {
- \cs_set_eq:NN \__siunitx_table_print:
- \__siunitx_table_print_S_direct_reserved_end:
- \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-integer }
- \l__siunitx_tmpa_tl
- { \tl_clear:N \l__siunitx_tmpa_tl }
- \hbox_set:Nn \l__siunitx_tmp_box
+ } ,
+ detect-mode .code:n =
{
- \ensuremath
+ \__siunitx_option_deprecated:nn
+ { detect-mode }
+ { mode~=~match }
+ } ,
+ detect-none .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { detect-none }
{
- \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-sign }
- \l__siunitx_tmpb_tl
- { \l__siunitx_tmpb_tl }
- \l__siunitx_tmpa_tl
+ mode~=~math , ~
+ propagate-math-font~=~false , ~
+ reset-math-version~=~true , ~
+ reset-text-family~=~true , ~
+ reset-text-series~=~true , ~
+ text-family-to-math~=~false , ~
+ text-series-to-math~=~false
}
- }
- \dim_set:Nn \l__siunitx_table_integer_dim
- { \box_wd:N \l__siunitx_tmp_box }
- \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-decimal }
- \l__siunitx_tmpa_tl
- { \tl_clear:N \l__siunitx_tmpa_tl }
- \hbox_set:Nn \l__siunitx_tmp_box
+ } ,
+ detect-shape .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { detect-shape }
+ { reset-text-shape~=~false }
+ } ,
+ detect-weight .code:n =
{
- \ensuremath
+ \__siunitx_option_deprecated:nn
+ { detect-weight }
{
- \l__siunitx_output_decimal_tl
- \l__siunitx_tmpa_tl
+ reset-text-series~=~false , ~
+ text-series-to-math~=~true
}
}
- \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
- { \box_wd:N \l__siunitx_tmp_box }
- { \tex_hfil:D }
- \tex_setbox:D \l__siunitx_table_pre_box \tex_hbox:D to \l__siunitx_table_integer_dim
- \c_group_begin_token
- \c_math_toggle_token
- \tl_map_function:NN \l__siunitx_input_decimal_tl
- \__siunitx_table_print_S_direct_reserved_aux:N
- \tex_hfill:D
}
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_aux:N #1
+\clist_map_inline:nn
{
- \char_set_active_eq:NN #1 \__siunitx_table_print_S_direct_reserved_begin:
- \char_set_mathcode:nn { `#1 } { "8000 }
+ detect-display-math ,
+ detect-inline-family ,
+ detect-inline-weight
}
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_begin:
{
- \c_math_toggle_token
- \c_group_end_token
- \tex_setbox:D \l__siunitx_table_post_box \tex_hbox:D to \box_wd:N \l__siunitx_tmp_box
- \c_group_begin_token
- \c_math_toggle_token
- \l__siunitx_output_decimal_tl
- }
-\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_end:
+ \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
+ }
+\clist_map_inline:nn
{
- \c_math_toggle_token
- \tex_hfil:D
- \c_group_end_token
- \__siunitx_table_align_left:n { \l__siunitx_table_number_align_skip }
- \box_use:N \l__siunitx_table_pre_box
- \box_use:N \l__siunitx_table_post_box
- \__siunitx_table_align_right:n { \l__siunitx_table_number_align_skip }
+ math-rm ,
+ math-sf ,
+ math-tt ,
+ number-math-rm ,
+ number-math-sf ,
+ number-math-tt ,
+ number-text-rm ,
+ number-text-sf ,
+ number-text-tt ,
+ text-rm ,
+ text-sf ,
+ text-tt ,
+ unit-math-rm ,
+ unit-math-sf ,
+ unit-math-tt ,
+ unit-text-rm ,
+ unit-text-sf ,
+ unit-text-tt
}
-\keys_set:nn { siunitx }
{
- table-align-comparator = true,
- table-align-exponent = true,
- table-align-text-pre = true,
- table-align-text-post = true,
- table-align-uncertainty = true,
- table-omit-exponent = false,
- table-parse-only = false,
- table-number-alignment = center-decimal-marker,
- table-text-alignment = center,
- table-figures-decimal = 2,
- table-figures-integer = 3
+ \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
+ }
+\clist_map_inline:nn
+ {
+ math-angstrom ,
+ math-arcminute ,
+ math-arcsecond ,
+ math-celsius ,
+ math-degree ,
+ math-micro ,
+ math-ohm ,
+ text-angstrom ,
+ text-arcminute ,
+ text-arcsecond ,
+ text-celsius ,
+ text-degree ,
+ text-micro ,
+ text-ohm ,
+ }
+ {
+ \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
}
\keys_define:nn { siunitx }
- { redefine-symbols .bool_set:N = \l__siunitx_redefine_symbols_bool }
-\keys_set:nn { siunitx } { redefine-symbols = true }
-\AtBeginDocument
{
- \bool_if:NT \l__siunitx_redefine_symbols_bool
+ separate-uncertainty .choice: ,
+ separate-uncertainty / false .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { separate-uncertainty }
+ { uncertainty-mode~=~compact }
+ } ,
+ separate-uncertainty / true .code:n =
{
- \@ifpackageloaded { fourier }
+ \__siunitx_option_deprecated:nn
+ { separate-uncertainty }
+ { uncertainty-mode~=~separate }
+ } ,
+ separate-uncertainty .default:n = true
+ }
+\clist_map_inline:nn
+ {
+ input-protect-tokens ,
+ input-quotient ,
+ quotient-mode
+ }
+ {
+ \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
+ }
+\keys_define:nn { siunitx }
+ {
+ add-decimal-zero .choice: ,
+ add-decimal-zero / false .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { add-decimal-zero }
+ { minimum-decimal-digits~=~0 }
+ } ,
+ add-decimal-zero / true .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { add-decimal-zero }
+ { minimum-decimal-digits~=~1 }
+ } ,
+ add-decimal-zero .default:n = true ,
+ add-integer-zero .code:n =
+ { \__siunitx_option_removed:V \l_keys_key_tl } ,
+ close-bracket .code:n =
+ { \__siunitx_option_removed:V \l_keys_key_tl } ,
+ bracket-numbers .choice: ,
+ bracket-numbers / false .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { bracket-numbers }
+ { bracket-ambiguous-numbers~=~false }
+ } ,
+ bracket-numbers / true .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { bracket-numbers }
+ { bracket-ambiguous-numbers~=~true }
+ } ,
+ bracket-numbers .default:n = true ,
+ explicit-sign .code:n =
+ {
+ \str_if_eq:nnTF {#1} { + }
{
- \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_text_tl
- { \textohm }
- { \text { \ensuremath { \l__siunitx_ohm_math_tl } } }
+ \__siunitx_option_deprecated:nn
+ { explicit-sign }
+ { print-implicit-plus~=~true }
}
- { }
- \@ifpackageloaded { mathptmx }
+ { \__siunitx_option_removed:V \l_keys_key_tl }
+ } ,
+ omit-uncertainty .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { omit-uncertainty }
+ { drop-uncertainty }
+ \l_keys_value_tl
+ } ,
+ omit-uncertainty .default:n = true ,
+ open-bracket .code:n =
+ { \__siunitx_option_removed:V \l_keys_key_tl } ,
+ retain-unity-mantissa .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { retain-unity-mantissa }
+ { print-unity-mantissa }
+ \l_keys_value_tl
+ } ,
+ retain-unity-mantisa .default:n = true ,
+ retain-zero-exponent .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { retain-zero-exponent }
+ { print-zero-exponent }
+ \l_keys_value_tl
+ } ,
+ retain-zero-exponent .default:n = true ,
+ round-integer-to-decimal .code:n =
+ { \__siunitx_option_removed:V \l_keys_key_tl } ,
+ scientific-notation .choice: ,
+ scientific-notation / engineering .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { scientific-notation~=~engineering }
+ { exponent-mode~=~engineering }
+ } ,
+ scientific-notation / fixed .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { scientific-notation~=~fixed }
+ { exponent-mode~=~fixed }
+ } ,
+ scientific-notation / false .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { scientific-notation~=~false }
+ { exponent-mode~=~input }
+ } ,
+ scientific-notation / true .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { scientific-notation~=~true }
+ { exponent-mode~=~scientific }
+ } ,
+ scientific-notation .default:n = true ,
+ zero-decimal-to-integer .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { zero-decimal-to-integer }
+ { drop-zero-decimal }
+ \l_keys_value_tl
+ } ,
+ zero-decimal-to-integer .default:n = true
+ }
+\keys_define:nn { siunitx }
+ {
+ table-align-text-post .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { table-align-text-post }
+ { table-align-text-after }
+ \l_keys_value_tl
+ } ,
+ table-align-text-post .default:n = true ,
+ table-align-text-pre .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { table-align-text-pre }
+ { table-align-text-before }
+ \l_keys_value_tl
+ } ,
+ table-align-text-pre .default:n = true ,
+ table-number-alignment / center-decimal-marker .code:n =
+ {
+ \msg_info:nnnn { siunitx } { option-deprecated }
+ { table-number-alignment~=~center-decimal-marker }
+ { table-alignment-mode~=~marker }
+ \keys_set:nn
+ { siunitx }
+ { table-alignment-mode = marker }
+ } ,
+ table-omit-exponent .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { table-omit-exponent }
+ { drop-exponent }
+ \l_keys_value_tl
+ } ,
+ table-omit-exponent .default:n = true ,
+ table-parse-only .code:n =
+ {
+ \msg_info:nnnn { siunitx } { option-deprecated }
+ { table-parse-only }
+ { table-alignment-mode~=~none }
+ \str_if_eq:VnTF \l_keys_value_tl { false }
{
- \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_text_tl
- { \textohm }
- { \text { \ensuremath { \l__siunitx_ohm_math_tl } } }
+ \keys_set:nn
+ { siunitx }
+ { table-alignment-mode = marker }
}
- { }
- \str_if_eq:VnT \encodingdefault { OT1 }
{
- \__siunitx_option_unchanged:Nnn \l__siunitx_angstrom_math_tl
- { \text { \AA } }
- { \text { \capitalring { A } } }
- \__siunitx_option_unchanged:Nnn \l__siunitx_angstrom_text_tl
- { \AA }
- { \capitalring { A } }
+ \keys_set:nn
+ { siunitx }
+ { table-alignment-mode = none }
}
- \@ifpackageloaded { unicode-math }
+ } ,
+ table-space-text-post .code:n =
+ {
+ \msg_info:nnnn { siunitx } { option-deprecated }
+ { table-space-text-post }
+ { table-format }
+ \tl_set:Nn \l__siunitx_table_after_model_tl {#1}
+ } ,
+ table-space-text-pre .code:n =
+ {
+ \msg_info:nnnn { siunitx } { option-deprecated }
+ { table-space-text-post }
+ { table-format }
+ \tl_set:Nn \l__siunitx_table_before_model_tl {#1}
+ }
+ }
+\cs_new_protected:Npn \__siunitx_option_table_format:n #1
+ {
+ \msg_info:nnnn { siunitx } { option-deprecated }
+ { table- #1 }
+ { table-format }
+ \tl_set:Nx \l__siunitx_table_format_tl
+ {
+ \cs:w __siunitx_option_table_ #1 :nnnnnnnn
+ \exp_after:wN \exp_after:wN \exp_after:wN \cs_end:
+ \exp_after:wN \l__siunitx_table_format_tl
+ \exp_after:wN { \l_keys_value_tl }
+ }
+ \exp_after:wN \__siunitx_table_generate_model:nnnnnnn
+ \l__siunitx_table_format_tl
+ }
+\cs_new:Npn \__siunitx_option_table_comparator:nnnnnnnn #1#2#3#4#5#6#7#8
+ { \exp_not:n { {#8} {#2} {#3} {#4} {#5} {#6} {#7} } }
+\cs_new:cpn { __siunitx_option_table_figures-decimal:nnnnnnnn }
+ #1#2#3#4#5#6#7#8
+ { \exp_not:n { {#1} {#2} {#3} {#8} {#5} {#6} {#7} } }
+\cs_new:cpn { __siunitx_option_table_figures-exponent:nnnnnnnn }
+ #1#2#3#4#5#6#7#8
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#8} } }
+\cs_new:cpn { __siunitx_option_table_figures-integer:nnnnnnnn }
+ #1#2#3#4#5#6#7#8
+ { \exp_not:n { {#1} {#2} {#8} {#4} {#5} {#6} {#7} } }
+\cs_new:cpn { __siunitx_option_table_figures-uncertainty:nnnnnnnn }
+ #1#2#3#4#5#6#7#8
+ { \exp_not:n { {#1} {#2} {#3} {#4} { { S } {#8} } {#6} {#7} } }
+\cs_new:cpn { __siunitx_option_table_sign-exponent:nnnnnnnn }
+ #1#2#3#4#5#6#7#8
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#8} {#7} } }
+\cs_new:cpn { __siunitx_option_table_sign-mantissa:nnnnnnnn }
+ #1#2#3#4#5#6#7#8
+ { \exp_not:n { {#1} {#8} {#3} {#4} {#5} {#6} {#7} } }
+\keys_define:nn { siunitx }
+ {
+ table-comparator .code:n =
+ { \__siunitx_option_table_format:n { comparator } } ,
+ table-figures-decimal .code:n =
+ { \__siunitx_option_table_format:n { figures-decimal } } ,
+ table-figures-exponent .code:n =
+ { \__siunitx_option_table_format:n { figures-exponent } } ,
+ table-figures-integer .code:n =
+ { \__siunitx_option_table_format:n { figures-integer } } ,
+ table-figures-uncertainty .code:n =
+ { \__siunitx_option_table_format:n { figures-uncertainty } } ,
+ table-sign-exponent .code:n =
+ { \__siunitx_option_table_format:n { sign-exponent } } ,
+ table-sign-mantissa .code:n =
+ { \__siunitx_option_table_format:n { sign-mantissa } }
+ }
+\keys_define:nn { siunitx }
+ {
+ fraction-function .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { fraction-function }
+ { fraction-command }
+ \l_keys_value_tl
+ } ,
+ literal-superscript-as-power .code:n =
+ { \__siunitx_option_removed:V \l_keys_key_tl } ,
+ per-mode / reciprocal .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { per-mode~=~reciprocal }
+ { per-mode~=~power }
+ } ,
+ per-mode / reciprocal-positive-first .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { per-mode~=~reciprocal-positive-first }
+ { per-mode~=~power-positive-first }
+ } ,
+ power-font .code:n =
+ { \__siunitx_option_removed:V \l_keys_key_tl } ,
+ qualifier-mode / brackets .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { qualifier-mode~=~brackets }
+ { qualifier-mode~=~bracket }
+ } ,
+ qualifier-mode / space .code:n =
+ {
+ \msg_info:nnnn { siunitx } { option-deprecated }
+ { qualifier-mode~=~space }
+ { qualifier-mode~=~phrase"~plus~"qualifier-phrase=\ }
+ \keys_set:nn
+ { siunitx }
+ { qualifier-mode = phrase, qualifier-phrase = \ }
+ } ,
+ qualifier-mode / text .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { qualifier-mode~=~text }
+ { qualifier-mode~=~combine }
+ }
+ }
+\keys_define:nn { siunitx }
+ {
+ allow-number-unit-breaks .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { allow-number-unit-breaks }
+ { allow-quantity-breaks }
+ \l_keys_value_tl
+ } ,
+ allow-number-unit-breaks .default:n = true ,
+ exponent-to-prefix .choice: ,
+ exponent-to-prefix / false .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { exponent-to-prefix~=~false }
+ { prefix-mode~=~input }
+ } ,
+ exponent-to-prefix / true .code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { exponent-to-prefix~=~true }
+ { prefix-mode~=~combine-exponent }
+ } ,
+ exponent-to-prefix .default:n = true ,
+ multi-part-units .choice: ,
+ multi-part-units / brackets . code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { multi-part-units~=~brackets }
+ { separate-uncertainty-units~=~bracket }
+ } ,
+ multi-part-units / repeat . code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { multi-part-units~=~repeat }
+ { separate-uncertainty-units~=~repeat }
+ } ,
+ multi-part-units / single . code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { multi-part-units~=~single }
+ { separate-uncertainty-units~=~single }
+ } ,
+ number-unit-product .code:n =
+ {
+ \__siunitx_option_deprecated:nnV
+ { number-unit-product }
+ { quantity-product }
+ \l_keys_value_tl
+ } ,
+ prefixes-as-symbols .choice: ,
+ prefixes-as-symbols / false . code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { prefixes-as-symbols~=~false }
+ { prefix-mode~=~extract-exponent }
+ } ,
+ prefixes-as-symbols / true . code:n =
+ {
+ \__siunitx_option_deprecated:nn
+ { prefixes-as-symbols~=~true }
+ { prefix-mode~=~input }
+ } ,
+ prefixes-as-symbols .default:n = true
+ }
+\keys_define:nn { siunitx }
+ {
+ table-column-type .tl_set:N =
+ \l__siunitx_column_type_tl
+ }
+\keys_set:nn { siunitx }
+ {
+ table-column-type = S
+ }
+\RequirePackage { l3keys2e }
+\ProcessKeysOptions { siunitx }
+\NewDocumentCommand \DeclareBinaryPrefix { +m m m }
+ {
+ \siunitx_declare_prefix:Nn #1 {#2}
+ }
+\NewDocumentCommand \DeclareSIPrePower { +m m }
+ {
+ \siunitx_declare_power:NNn #1 \__siunitx_tmp:w {#2}
+ \seq_remove_all:Nn \l_siunitx_unit_symbolic_seq { \__siunitx_tmp:w }
+ }
+\NewDocumentCommand \DeclareSIPostPower { +m m }
+ {
+ \siunitx_declare_power:NNn \__siunitx_tmp:w #1 {#2}
+ \seq_remove_all:Nn \l_siunitx_unit_symbolic_seq { \__siunitx_tmp:w }
+ }
+\NewDocumentCommand \si { O { } m }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_unit_format:nN {#2} \l__siunitx_tmp_tl
+ \siunitx_print_unit:V \l__siunitx_tmp_tl
+ \group_end:
+ }
+\NewDocumentCommand \SI { O { } m o m }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \IfNoValueF {#3}
+ {
+ \siunitx_unit_format:nN {#3} \l__siunitx_tmp_tl
+ \siunitx_print_unit:V \l__siunitx_tmp_tl
+ \nobreak
+ }
+ \siunitx_quantity:nn {#2} {#4}
+ \group_end:
+ }
+\NewDocumentCommand \SIlist
+ { O { } > { \SplitList { ; } } m > { \TrimSpaces } m }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \siunitx_unit_options_apply:n {#3}
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_quantity_list:nn {#2} {#3}
+ \group_end:
+ }
+\NewDocumentCommand \SIrange { O { } m m > { \TrimSpaces } m }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \siunitx_unit_options_apply:n {#4}
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_quantity_range:nnn {#2} {#3} {#4}
+ \group_end:
+ }
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \__siunitx_emulation_non_latin:n #1
+ { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
+ }
+ {
+ \cs_new:Npn \__siunitx_emulation_non_latin:n #1
+ {
+ \exp_last_unbraced:Nf \__siunitx_emulation_non_latin:nnnn
+ { \char_to_utfviii_bytes:n {#1} }
+ }
+ \cs_new:Npn \__siunitx_emulation_non_latin:nnnn #1#2#3#4
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#1} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#2} { 13 }
+ }
+ }
+\AtBeginDocument
+ {
+ \cs_new_protected:Npn \SIUnitSymbolArcminute
+ { \ensuremath { { } ' } }
+ \cs_new_protected:Npn \SIUnitSymbolArcsecond
+ { \ensuremath { { } '' } }
+ \@ifpackageloaded { fontspec }
+ {
+ \cs_new_protected:Npx \SIUnitSymbolAngstrom
+ { \__siunitx_emulation_non_latin:n { "00C5 } }
+ \cs_new_protected:Npx \SIUnitSymbolDegree
+ { \__siunitx_emulation_non_latin:n { "00B0 } }
+ \cs_new_protected:Npx \SIUnitSymbolCelsius
+ { \__siunitx_emulation_non_latin:n { "00B0 } C }
+ }
+ {
+ \cs_new_protected:Npx \SIUnitSymbolAngstrom
{
- \exp_args:NNnx
- \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
- { \text { \ensuremath { \Omega } } }
- { \char_generate:nn { "03A9 } { 12 } }
+ \siunitx_print_text:n
+ { \__siunitx_emulation_non_latin:n { "00C5 } }
}
- { }
- \@ifpackageloaded { upgreek }
+ \cs_new_protected:Npx \SIUnitSymbolCelsius
{
- \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
- { \text { \ensuremath { \Omega } } }
- { \text { \ensuremath { \Upomega } } }
+ \siunitx_print_text:n
+ { \__siunitx_emulation_non_latin:n { "00B0 } } C
}
+ \cs_new_protected:Npx \SIUnitSymbolDegree
{
- \cs_if_exist:NT \upOmega
- {
- \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
- { \text { \ensuremath { \Omega } } }
- { \text { \ensuremath { \upOmega } } }
- }
+ \siunitx_print_text:n
+ { \__siunitx_emulation_non_latin:n { "00B0 } }
}
}
+ \cs_new_protected:Npx \SIUnitSymbolMicro
+ {
+ \siunitx_print_text:n
+ {
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ { \__siunitx_emulation_non_latin:n { "00B5 } }
+ { \exp_not:N \textmu }
+ }
+ }
+ \cs_new_protected:Npx \SIUnitSymbolOhm
+ {
+ \exp_not:N \ifmmode
+ \cs_if_exist:NTF \upOmega
+ { \exp_not:N \upOmega }
+ { \exp_not:N \Omega }
+ \exp_not:N \else
+ \siunitx_print_text:n
+ {
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ { \__siunitx_emulation_non_latin:n { "03A9 } }
+ { \exp_not:N \textohm }
+ }
+ \exp_not:N \fi
+ }
}
-\keys_define:nn { siunitx } {
- math-angstrom .tl_set:N = \l__siunitx_angstrom_math_tl,
- math-arcminute .tl_set:N = \l__siunitx_arcminute_math_tl,
- math-arcsecond .tl_set:N = \l__siunitx_arcsecond_math_tl,
- math-celsius .tl_set:N = \l__siunitx_celsius_math_tl,
- math-degree .tl_set:N = \l__siunitx_degree_math_tl,
- math-micro .tl_set:N = \l__siunitx_micro_math_tl,
- math-ohm .tl_set:N = \l__siunitx_ohm_math_tl
-}
-\keys_set:nn { siunitx } {
- math-angstrom = \text { \AA },
- math-arcminute = { } ^ { \prime },
- math-arcsecond = { } ^ { \prime \prime },
- math-celsius = \text { \textdegree } \__siunitx_unit_mathrm:n { C } ,
- math-degree = \text { \textdegree },
- math-micro = \text { \textmu },
- math-ohm = \text { \ensuremath { \Omega } },
-}
-\keys_define:nn { siunitx } {
- text-angstrom .tl_set:N = \l__siunitx_angstrom_text_tl,
- text-arcminute .tl_set:N = \l__siunitx_arcminute_text_tl,
- text-arcsecond .tl_set:N = \l__siunitx_arcsecond_text_tl,
- text-celsius .tl_set:N = \l__siunitx_celsius_text_tl,
- text-degree .tl_set:N = \l__siunitx_degree_text_tl,
- text-micro .tl_set:N = \l__siunitx_micro_text_tl,
- text-ohm .tl_set:N = \l__siunitx_ohm_text_tl,
-}
-\keys_set:nn { siunitx } {
- text-angstrom = \AA,
- text-arcminute = \ensuremath { { } ^ { \prime } },
- text-arcsecond = \ensuremath { { } ^ { \prime \prime } },
- text-celsius = \text { \textdegree } C,
- text-degree = \text { \textdegree },
- text-micro = \textmu ,
- text-ohm = \textohm
-}
-\cs_new_protected:Npn \__siunitx_symbol_new:n #1
- {
- \cs_set_protected:cpn { SIUnitSymbol #1 }
- {
- \use:c
- {
- l__siunitx_
- \str_foldcase:n {#1}
- _
- \mode_if_math:TF { math } { text }
- _tl
- }
+\IfFormatAtLeastTF { 2020-10-01 }
+ { }
+ { \RequirePackage { xparse } }
+\NewDocumentCommand \DeclareSIPower { +m +m m }
+ {
+ \siunitx_declare_power:NNn #1 #2 {#3}
+ }
+\NewDocumentCommand \DeclareSIPrefix { +m m m }
+ {
+ \siunitx_declare_prefix:Nnn #1 {#2} {#3}
+ }
+\NewDocumentCommand \DeclareSIQualifier { +m m }
+ {
+ \siunitx_declare_qualifier:Nn #1 {#2}
+ }
+\NewDocumentCommand \DeclareSIUnit { o +m m }
+ {
+ \IfNoValueTF {#1}
+ { \siunitx_declare_unit:Nn #2 {#3} }
+ { \siunitx_declare_unit:Nnn #2 {#3} {#1} }
+ }
+\@ifpackageloaded { physics }
+ {
+ \msg_new:nnn { siunitx } { physics-pkg }
+ {
+ Detected~the~"physics"~package: \\
+ Omitting~definition~of~\token_to_str:N \qty.
}
+ \msg_warning:nn { siunitx } { physics-pkg }
+ \use_none:nnnn
}
-\__siunitx_symbol_new:n { Angstrom }
-\__siunitx_symbol_new:n { Arcminute }
-\__siunitx_symbol_new:n { Arcsecond }
-\__siunitx_symbol_new:n { Celsius }
-\__siunitx_symbol_new:n { Degree }
-\__siunitx_symbol_new:n { Micro }
-\__siunitx_symbol_new:n { Ohm }
-\clist_new:N \l__siunitx_pgf_link_clist
-\cs_new_protected:Npn \__siunitx_pgf_link: {
- \clist_clear:N \l__siunitx_pgf_link_clist
- \str_if_eq:VnT \l__siunitx_round_tl { figure }
- {
- \clist_put_right:Nn \l__siunitx_pgf_link_clist { fixed }
- \clist_put_right:Nn \l__siunitx_pgf_link_clist
- { fixed~zerofill = true }
- }
- \clist_put_right:Nx \l__siunitx_pgf_link_clist
- { precision = \int_use:N \l__siunitx_process_precision_int }
- \clist_put_right:Nx \l__siunitx_pgf_link_clist
- {
- set~decimal~separator =
- { { \exp_not:V \l__siunitx_output_decimal_tl } }
- }
- \clist_put_right:Nx \l__siunitx_pgf_link_clist
- { set~thousands~separator = { \exp_not:V \l__siunitx_group_sep_tl } }
- \clist_put_right:Nx \l__siunitx_pgf_link_clist
- {
- min~exponent~for~1000~sep = \int_eval:n { \l__siunitx_group_min_int - 1 }
- }
- \bool_lazy_or:nnF
- { \l__siunitx_group_decimal_bool } { \l__siunitx_group_integer_bool }
- {
- \clist_put_right:Nn \l__siunitx_pgf_link_clist
- { min~exponent~for~1000~sep = 999 }
- }
- \bool_if:NTF \l__siunitx_process_integer_zero_bool
- {
- \clist_put_right:Nn \l__siunitx_pgf_link_clist
- { skip~0. = false }
- }
- {
- \clist_put_right:Nn \l__siunitx_pgf_link_clist
- { skip~0. = true }
- }
- \str_if_eq:VnTF \l__siunitx_process_sign_tl { + }
- {
- \clist_put_right:Nn \l__siunitx_pgf_link_clist
- { showpos = true }
- }
- {
- \clist_put_right:Nn \l__siunitx_pgf_link_clist
- { showpos = false }
- }
- \use:x
- {
- \exp_not:N \pgfqkeys
- { /pgf/number~format }
- { \exp_not:V \l__siunitx_pgf_link_clist }
- }
-}
-\msg_new:nnnn { siunitx } { bad-arc-sign }
- { Incorrect~use~of~sign~in~degree-minute-second~angle. }
- { Only~the~highest~value~part~of~an~angle~can~have~a~sign. }
-\msg_new:nnnn { siunitx } { color-not-loaded }
- { Package~"color"~not~loaded. }
- { The~command~\token_to_str:N \color \ is~not~available. }
-\msg_new:nnnn { siunitx } { duplicate-complex-root-token }
- { Duplicate~complex~root~token~'#1'~in~input. }
- { Only~one~complex~root~token~can~appear~in~a~single~number. }
-\msg_new:nnnn { siunitx } { duplicate-decimal-token }
- { Duplicate~decimal~marker~token~'#1'~in~input. }
- { Only~one~decimal~marker~token~can~appear~in~a~single~number. }
-\msg_new:nnnn { siunitx } { duplicate-exponent-token }
- { Duplicate~exponent~marker~token~'#1'~in~input. }
- { Only~one~exponent~marker~token~can~appear~in~a~single~number. }
-\msg_new:nnnn { siunitx } { duplicate-quotient-token }
- { Duplicate~quotient~token. }
- { Only~one~quotient~token~can~appear~in~a~single~number. }
-\msg_new:nnnn { siunitx } { duplicate-sticky-per }
- { Duplicate~\token_to_str:N \per. }
+ { }
+\NewDocumentCommand \qty { O { } m > { \TrimSpaces } m }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \siunitx_unit_options_apply:n {#3}
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_quantity:nn {#2} {#3}
+ \group_end:
+ }
+\NewDocumentCommand \ang { O { } > { \SplitArgument { 2 } { ; } } m }
{
- When~the~'sticky-per'~option~is~active,~only~one
- \token_to_str:N \per may~appear~in~a~unit.
- }
-\msg_new:nnnn { siunitx } { empty-arc }
- { Empty~degree-minute-second~angle. }
- { The~angle~given~does~not~contain~any~numbers. }
-\msg_new:nnnn { siunitx } { empty-uncertainty }
- { Empty~uncertainty~given~in~'#1'. }
- { The~number~given~contains~an~empty~uncertainty. }
-\msg_new:nnnn { siunitx } { ending-product-token }
- { Misplaced~product~token. }
- { A~number~cannot~end~with~a~product~token. }
-\msg_new:nnnn { siunitx } { ending-quotient-token }
- { Misplaced~quotient~token. }
- { A~number~cannot~end~with~a~quotient~token. }
-\msg_new:nnnn { siunitx } { invalid-arc-format }
- { Invalid~degree-minute-second angle~'#1'. }
- {
- Angles~given~in~degree-minute-second~format~should~contain~two~';'
- symbols~to~divide~up~the~parts~of~the~input.
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \__siunitx_angle:nnn #2
+ \group_end:
}
-\msg_new:nnnn { siunitx } { invalid-number }
- { Invalid~numerical~input~'#1'. }
+\NewDocumentCommand \num { O { } m }
{
- The~input~given~as~a~number~does~not~make~logical~sense.~
- This~happens,~for~example,~if~a~number~only~contains~a~sign.
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_number_format:nN {#2} \l__siunitx_tmp_tl
+ \siunitx_print_number:V \l__siunitx_tmp_tl
+ \group_end:
}
-\msg_new:nnnn { siunitx } { invalid-token-in-exponent }
- { Invalid~exponent~in~numerical~input~'#1'. }
+\NewDocumentCommand \unit { O { } > { \TrimSpaces } m }
{
- The~exponent~part~of~a~number~cannot~contain~an~uncertainty~or~
- complex~part: \\
- the~input~given~appears~to~contain~one~of~these~in~the~exponent.
+ \mode_leave_vertical:
+ \group_begin:
+ \siunitx_unit_options_apply:n {#2}
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_unit_format:nN {#2} \l__siunitx_tmp_tl
+ \siunitx_print_unit:V \l__siunitx_tmp_tl
+ \group_end:
}
-\msg_new:nnnn { siunitx } { invalid-token-in-number }
- { Invalid~token~'#1'~in~numerical~input. }
+\NewDocumentCommand \qtylist
+ { O { } > { \SplitList { ; } } m > { \TrimSpaces } m }
{
- Numbers~can~only~contain~tokens~defined~using~the~
- 'input-...'~options:\\
- the~token~'#1'~is~not~set~up~as~a~valid~part~of~a~number.
+ \mode_leave_vertical:
+ \group_begin:
+ \siunitx_unit_options_apply:n {#3}
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_quantity_list:nn {#2} {#3}
+ \group_end:
}
-\msg_new:nnnn { siunitx } { invalid-token-in-uncertainty }
- { Invalid~uncertainty~in~numerical~input~'#1'. }
+\NewDocumentCommand \numlist { O { } > { \SplitList { ; } } m }
{
- The~uncertainty~part~of~a~number~may~only~contain~digits~or~
- symbols.
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_number_list:nn {#2}
+ \group_end:
}
-\msg_new:nnnn { siunitx } { literal-unit }
- { Literal~units~disabled. }
+\NewDocumentCommand \qtyproduct
+ { O { } > { \SplitList { x } } m > { \TrimSpaces } m }
{
- You~gave~the~literal~input~'#1'~
- but~literal~unit~output~is~disabled.
+ \mode_leave_vertical:
+ \group_begin:
+ \siunitx_unit_options_apply:n {#3}
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_quantity_product:nn {#2} {#3}
+ \group_end:
}
-\msg_new:nnnn { siunitx } { misplaced-sign-token }
- { Misplaced~sign~token~'#1'. }
- { Sign~tokens~can~only~come~at~the~beginning~of~a~number. }
-\msg_new:nnnn { siunitx } { misplaced-complex-root-token }
- { Misplaced~complex~token~in~numerical~input~'#1'. }
+\NewDocumentCommand \numproduct
+ { O { } > { \SplitList { x } } > { \TrimSpaces } m }
{
- The~root~token~must~come~either~before~or~after~the~real~digits~
- of~the~complex~part.
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_number_product:n {#2}
+ \group_end:
}
-\msg_new:nnnn { siunitx } { misplaced-uncertainty-token }
- { Misplaced~uncertainty~token~'#1'. }
+\NewDocumentCommand \qtyrange { O { } m m > { \TrimSpaces } m }
{
- The~uncertainty~in~a~number~must~be~given~between~a~set~of~
- delimiters~as~defined~by~the\\
- \ \ 'input-open-uncertainty'~and~'input-close-uncertainty'~
- options.
+ \mode_leave_vertical:
+ \group_begin:
+ \siunitx_unit_options_apply:n {#4}
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_quantity_range:nnn {#2} {#3} {#4}
+ \group_end:
}
-\msg_new:nnnn { siunitx } { multi-part-range }
- { Numerical~range~with~multiple~parts. }
+\NewDocumentCommand \numrange { O { } m m }
{
- The~input~'#1'~is~a~number~which~has~more~than~one~part: \\
- ranges~can~only~contain~one~number~in~each~part.
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_number_range:nn {#2} {#3}
+ \group_end:
}
-\msg_new:nnn { siunitx } { non-convertible-exponent }
- { Exponent~'#1'~cannot~be~converted~into~a~symbolic~prefix. }
-\msg_new:nnn { siunitx } { option-not-available }
- { Option~'#1'~not~available~in~strict~mode. }
-\msg_new:nnn { siunitx } { option-preamble-only }
- { Option~'#1'~only~available~in~the~preamble. }
-\msg_new:nnnn { siunitx } { prefix-base-mismatch }
- { Prefix~bases~do~not~match. }
- {
- You~have~asked~for~prefixes~to~be~converted~into~a~power,~
- but~the~bases~do~not~match.
- }
-\msg_new:nnn { siunitx } { prefix-only }
- { Prefix~with~no~unit. }
-\msg_new:nnnn { siunitx } { qualifier-before-unit }
- { Qualifier~before~unit. }
- { Unit~qualifiers~have~to~follow~after~units,~not~before~them. }
-\msg_new:nnnn { siunitx } { restricted-number }
- { Token~'#1'~forbidden~in~restricted~numerical~input. }
- {
- The~current~input~must~be~a~real~number~and~cannot~contain: \\
- \ -~an~exponent; \\
- \ -~an~uncertainty; \\
- \ -~a~complex~part.
- }
-\msg_new:nnnn { siunitx } { starting-product-token }
- { Misplaced~product~token. }
- { A~number~cannot~begin~with~a~product~token. }
-\msg_new:nnnn { siunitx } { starting-quotient-token }
- { Misplaced~quotient~token. }
- { A~number~cannot~begin~with~a~quotient~token. }
-\msg_new:nnnn { siunitx } { table-partial-number }
- { No~space~reserved~for~#1~\msg_line_context:. }
- {
- The~number~in~the~current~table~cell~contains~#1~part,
- but~you~did~not~reserve~any~space~to~print~it: \\
- it~will~be~missing~in~the~output.
- }
-\msg_new:nnnn { siunitx } { unknown-option }
- { Unknown~option~'#1'. }
- {
- The~option~file~'#1'~is~not~known~by~siunitx:
- perhaps~it~is~spelled~incorrectly.
- }
-\msg_new:nnnn { siunitx } { version-1-option }
- { Version~1~option~'#1'~detected. }
- {
- Use: \\
- \ \ \token_to_str:N \usepackage [ version-1-compatibility ]
- \iow_char:N \{ siunitx \token_to_str:N \iow_char:N \} \\
- in~the~preamble~to~load~the~appropriate~code.
- }
-\NewDocumentCommand \DeclareBinaryPrefix { m m m } {
- \__siunitx_declare_prefix:Nnnn #1 {#2} { 2 } {#3}
-}
-\NewDocumentCommand \DeclareSIPostPower { m m } {
- \__siunitx_declare_power_after:Nn #1 {#2}
-}
-\NewDocumentCommand \DeclareSIPrefix { m m m } {
- \__siunitx_declare_prefix:Nnnn #1 {#2} { 10 } {#3}
-}
-\NewDocumentCommand \DeclareSIPrePower { m m } {
- \__siunitx_declare_power_before:Nn #1 {#2}
-}
-\NewDocumentCommand \DeclareSIQualifier { m m } {
- \__siunitx_declare_qualifier:Nn #1 {#2}
-}
-\NewDocumentCommand \DeclareSIUnit { O { } m m } {
- \__siunitx_declare_unit:Nnn #2 {#3} {#1}
-}
-\NewDocumentCommand \DeclareSIUnitWithOptions { m m m } {
- \__siunitx_declare_unit:Nnn #1 {#2} {#3}
-}
-\@onlypreamble \DeclareBinaryPrefix
-\@onlypreamble \DeclareSIPostPower
-\@onlypreamble \DeclareSIPrefix
-\@onlypreamble \DeclareSIPrePower
-\@onlypreamble \DeclareSIQualifier
-\@onlypreamble \DeclareSIUnit
-\@onlypreamble \DeclareSIUnitWithOptions
-\cs_new_protected:Npn \SendSettingsToPgf { \__siunitx_pgf_link: }
-\NewDocumentCommand \ang { o > { \SplitArgument { 2 } { ; } } m } {
- \group_begin:
- \IfNoValueF {#1}
- { \keys_set:nn { siunitx } {#1} }
- \__siunitx_angle_output:nnn #2
- \group_end:
-}
-\NewDocumentCommand \num { o m } {
- \leavevmode
- \group_begin:
- \bool_set_false:N \l__siunitx_font_set_bool
- \IfNoValueF {#1}
- { \keys_set:nn { siunitx } {#1} }
- \__siunitx_number_output:n {#2}
- \group_end:
-}
-\NewDocumentCommand \numlist { o > { \SplitList { ; } } m } {
- \leavevmode
- \group_begin:
- \bool_set_false:N \l__siunitx_font_set_bool
- \IfNoValueF {#1}
- { \keys_set:nn { siunitx } {#1} }
- \__siunitx_list_numbers:n {#2}
- \group_end:
-}
-\NewDocumentCommand \numrange { o m m } {
- \leavevmode
- \group_begin:
- \bool_set_false:N \l__siunitx_font_set_bool
- \IfNoValueF {#1}
- { \keys_set:nn { siunitx } {#1} }
- \__siunitx_range_numbers:nn {#2} {#3}
- \group_end:
-}
-\NewDocumentCommand \SIlist { o > { \SplitList { ; } } m m } {
- \leavevmode
- \group_begin:
- \bool_set_false:N \l__siunitx_font_set_bool
- \IfNoValueTF {#1}
- { \__siunitx_list_units:nnn {#2} {#3} { } }
+\NewDocumentCommand \complexnum { O { } m }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_complex_number:n {#2} \l__siunitx_tmp_tl
+ \group_end:
+ }
+\NewDocumentCommand \complexqty { O { } m m }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \siunitx_unit_options_apply:n {#3}
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_complex_quantity:nn {#2} {#3}
+ \group_end:
+ }
+\NewDocumentCommand \tablenum { O { } m }
+ {
+ \mode_leave_vertical:
+ \group_begin:
+ \keys_set:nn { siunitx } {#1}
+ \siunitx_cell_begin:w
+ \ignorespaces #2
+ \siunitx_cell_end:
+ \group_end:
+ }
+\NewDocumentCommand \sisetup { m }
+ { \keys_set:nn { siunitx } {#1} }
+\cs_new_protected:Npn \__siunitx_angle:nnn #1#2#3
+ {
+ \tl_if_novalue:nTF {#2}
+ { \siunitx_angle:n {#1} }
{
- \keys_set:nn { siunitx } {#1}
- \__siunitx_list_units:nnn {#2} {#3} {#1}
+ \tl_if_novalue:nTF {#3}
+ { \siunitx_angle:nnn {#1} {#2} { } }
+ { \siunitx_angle:nnn {#1} {#2} {#3} }
}
- \group_end:
-}
-\NewDocumentCommand \SIrange { o m m m } {
- \leavevmode
- \group_begin:
- \bool_set_false:N \l__siunitx_font_set_bool
- \IfNoValueTF {#1}
- { \__siunitx_range_unit:nnnn {#4} { } {#2} {#3} }
+ }
+\RequirePackage { array }
+\cs_new_protected:Npn \__siunitx_declare_column:Nnn #1#2#3
+ {
+ \cs_if_exist:cT { NC@find@ #1 }
{
- \keys_set:nn { siunitx } {#1}
- \__siunitx_range_unit:nnnn {#4} {#1} {#2} {#3}
+ \cs_undefine:c { NC@find@ #1 }
+ \msg_warning:nnn { siunitx } { column-overwritten } {#1}
}
- \group_end:
-}
-\NewDocumentCommand \SI { o m o m } {
- \leavevmode
- \group_begin:
- \bool_set_false:N \l__siunitx_font_set_bool
- \IfNoValueTF {#1}
- { \__siunitx_combined:nnnn { } {#2} {#3} {#4} }
- {
- \keys_set:nn { siunitx } {#1}
- \__siunitx_combined:nnnn {#1} {#2} {#3} {#4}
- }
- \group_end:
-}
-\NewDocumentCommand \sisetup { m } {
- \keys_set:nn { siunitx } {#1}
-}
-\NewDocumentCommand \tablenum { o m } {
- \leavevmode
- \group_begin:
- \bool_set_false:N \l__siunitx_font_set_bool
- \IfNoValueF {#1}
- { \keys_set:nn { siunitx } {#1} }
- \bool_if:NTF \l__siunitx_number_parse_bool
- {
- \tl_set:Nn \l__siunitx_table_collect_tl {#2}
- \bool_set_false:N \l__siunitx_table_collect_pre_bool
- \__siunitx_table_print_S:
- }
- { \__siunitx_table_print_S_direct: #2 \__siunitx_table_print: }
- \group_end:
-}
-\NewDocumentCommand \si { o m } {
- \leavevmode
- \group_begin:
- \bool_set_false:N \l__siunitx_font_set_bool
- \IfNoValueTF {#1}
- { \__siunitx_unit_output:nn {#2} { } }
+ \newcolumntype {#1} { }
+ \cs_set_protected:Npn \__siunitx_tmp:w \NC@do ##1##2 \NC@do #1
+ { \NC@list { \NC@do ##1 \NC@do #1 ##2 } }
+ \exp_after:wN \__siunitx_tmp:w \the \NC@list
+ \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [ 1 ] [ ]
{
- \keys_set:nn { siunitx } {#1}
- \__siunitx_unit_output:nn {#2} {#1}
+ \@temptokena \expandafter
+ {
+ \the \@temptokena
+ > {#2} c < {#3}
+ }
+ \NC@find
}
- \group_end:
-}
-\cs_new_protected:Npn \__siunitx_contents_bookmarks:
+ }
+\msg_new:nnn { siunitx } { column-overwritten }
+ { Tabular~column~type~"#1"~overwritten~with~siunitx~definition. }
+\AtBeginDocument
{
- \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
- { \__siunitx_unit_print_literal_aux:N ##1 }
- \cs_if_exist:NT \FB@fg
- { \cs_set_eq:NN \fg \FB@fg }
- \msg_redirect_name:nnn { xparse } { redefine-command } { none }
- \cs_set_eq:NN \num \numInBookmark
- \cs_set_eq:NN \numrange \numrangeInBookmark
- \cs_set_eq:NN \si \siInBookmark
- \cs_set_eq:NN \SI \SIInBookmark
- \cs_set_eq:NN \SIrange \SIrangeInBookmark
- \cs_set_eq:NN \si \siInBookmark
- \cs_set_eq:NN \highlight \use_ii:nn
- \cs_set_eq:NN \__siunitx_textsuperscript:n \use:n
- \cs_set:Npn \SIUnitSymbolAngstrom { \AA }
- \cs_set:Npn \SIUnitSymbolArcminute { ' }
- \cs_set:Npn \SIUnitSymbolArcsecond { '' }
- \cs_set:Npn \SIUnitSymbolCelsius { \textcelsius }
- \cs_set:Npn \SIUnitSymbolDegree { \textdegree }
- \cs_set:Npn \SIUnitSymbolMicro { \textmu }
- \cs_set:Npn \SIUnitSymbolOhm { \textohm }
- }
-\DeclareExpandableDocumentCommand \numInBookmark { o m } {#2}
-\DeclareExpandableDocumentCommand \numrangeInBookmark { o m m }
- { #2 \l__siunitx_range_phrase_tl #3 }
-\DeclareExpandableDocumentCommand \SIInBookmark { o m o m }
- { \IfNoValueF {#3} {#3} #2 ~ #4 }
-\DeclareExpandableDocumentCommand \SIlistInBookmark
- { o m m } { \__siunitx_bookmark_SIlist_map:nn {#1} {#2} }
-\DeclareExpandableDocumentCommand \SIrangeInBookmark
- { o m m m } { #2 ~ #4 \l__siunitx_range_phrase_tl #3 ~ #4 }
-\DeclareExpandableDocumentCommand \siInBookmark { o m } {#2}
-\cs_new:Npn \__siunitx_bookmark_SIlist_map:nn #1#2 {
- \__siunitx_bookmark_SIlist_map_aux:nw {#2} #1 ; \q_recursion_tail ;
- \q_recursion_tail ; \q_recursion_stop
-}
-\cs_new:Npn \__siunitx_bookmark_SIlist_map_aux:nw #1#2 ; #3 ; #4 {
- #2 ~ #1
- \quark_if_recursion_tail_stop:n {#3}
- \quark_if_recursion_tail_stop_do:nn {#4}
- {
- \l__siunitx_list_separator_final_tl
- #3 ~ #1
- }
- \l__siunitx_list_separator_tl
- \__siunitx_bookmark_SIlist_map_aux:nw {#1} #3 ; #4
-}
-\AtBeginDocument {
- \@ifpackageloaded { hyperref }
- { \pdfstringdefDisableCommands { \__siunitx_contents_bookmarks: } }
- { }
-}
-\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 \degreeCelsius { \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 [ number-unit-product = ] \arcmin { \arcminute }
-\DeclareSIUnit [ number-unit-product = ]
- \arcminute { \SIUnitSymbolArcminute }
-\DeclareSIUnit [ number-unit-product = ]
- \arcsecond { \SIUnitSymbolArcsecond }
-\DeclareSIUnit \day { d }
-\DeclareSIUnit[ number-unit-product = ] \degree { \SIUnitSymbolDegree }
-\DeclareSIUnit \hectare { ha }
-\DeclareSIUnit \hour { h }
-\DeclareSIUnit \litre { l }
-\DeclareSIUnit \liter { L }
-\DeclareSIUnit \minute { min }
-\DeclareSIUnit \percent { \char 37 }
-\DeclareSIUnit \tonne { t }
-\DeclareSIUnit \astronomicalunit { au }
-\DeclareSIUnit \atomicmassunit { u }
-\DeclareSIUnit \electronvolt { eV }
-\DeclareSIUnit \dalton { Da }
-\group_begin:
-\cs_set_eq:NN \endgroup \group_end:
-\char_set_catcode_math_subscript:N \_
-\use:n
+ \@ifpackageloaded { mdwtab }
+ {
+ \cs_set_protected:Npn \__siunitx_declare_column:Nnn #1#2#3
+ {
+ \cs_if_exist:cT { NC@find@ #1 }
+ {
+ \cs_undefine:c { NC@find@ #1 }
+ \msg_warning:nnn { siunitx } { column-overwritten } {#1}
+ }
+ \newcolumntype {#1} [ 1 ] [ ]
+ { > {#2} c < {#3} }
+ }
+ }
+ { }
+ \tl_map_inline:Nn \l__siunitx_column_type_tl
+ {
+ \__siunitx_declare_column:Nnn #1
+ {
+ \keys_set:nn { siunitx } {##1}
+ \siunitx_cell_begin:w
+ }
+ { \siunitx_cell_end: }
+ }
+ }
+\cs_new_protected:Npn \__siunitx_bookmark_cmd:Nnn #1#2#3
{
- \endgroup
- \DeclareSIUnit \clight { \text { \ensuremath { c _ { 0 } } } }
- \DeclareSIUnit \electronmass
- { \text { \ensuremath { m _ { \textup { e } } } } }
+ \exp_args:Nc \DeclareExpandableDocumentCommand
+ { \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) }
+ {#2} {#3}
}
-\DeclareSIUnit \planckbar { \text { \ensuremath { \hbar } } }
-\DeclareSIUnit \elementarycharge { \text { \ensuremath { e } } }
-\group_begin:
-\cs_set_eq:NN \endgroup \group_end:
-\char_set_catcode_math_subscript:N \_
-\use:n
- {
- \endgroup
- \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 }
-\DeclareSIPrePower \square { 2 }
-\DeclareSIPostPower \squared { 2 }
-\DeclareSIPrePower \cubic { 3 }
-\DeclareSIPostPower \cubed { 3 }
-\keys_define:nn { siunitx } {
- strict .code:n =
- {
- \keys_set:nn { siunitx }
- {
- bracket-numbers = true,
- detect-family = false,
- detect-mode = false,
- detect-shape = false,
- detect-weight = false,
- multi-part-units = brackets,
- parse-numbers = true,
- parse-units = true,
- product-units = repeat
- }
- \__siunitx_strict_option:n
- {
- bracket-numbers ,
- detect-family ,
- detect-italic ,
- detect-mode ,
- detect-shape ,
- detect-weight ,
- multi-part-units ,
- parse-numbers ,
- parse-units ,
- product-units
- }
- \keys_define:nn { siunitx }
- {
- per-mode / repeated-symbol .code:n =
- {
- \msg_warning:nnx { siunitx } { option-not-available }
- { per-mode~=~repeated-symbol }
- }
- }
- }
-}
-\__siunitx_option_deactivate:n { strict }
-\cs_new_protected:Npn \__siunitx_strict_option:n #1 {
- \clist_map_function:nN {#1} \__siunitx_strict_option_aux:n
-}
-\cs_new_protected:Npn \__siunitx_strict_option_aux:n #1 {
- \keys_define:nn { siunitx }
- { #1 .code:n =
- { \msg_warning:nnx { siunitx } { option-not-available } {#1} }
- }
-}
-\keys_define:nn { siunitx } {
- locale .choice:,
- locale /
- DE .meta:n =
- {
- exponent-product = \ensuremath { \cdot } ,
- inter-unit-product = \, ,
- output-decimal-marker = { , }
- },
- locale /
- FR .meta:n =
+\__siunitx_bookmark_cmd:Nnn \qty { o m m } { #2 ~ #3 }
+\__siunitx_bookmark_cmd:Nnn \ang { m } { \__siunitx_angle:n {#1} }
+\__siunitx_bookmark_cmd:Nnn \num { o m } { #2 }
+\__siunitx_bookmark_cmd:Nnn \unit { o m } { #2 }
+\__siunitx_bookmark_cmd:Nnn \numlist { o m }
+ {
+ \__siunitx_list_use:nnVVV {#2} { }
+ \l_siunitx_list_separator_pair_tl
+ \l_siunitx_list_separator_tl
+ \l_siunitx_list_separator_final_tl
+ }
+\__siunitx_bookmark_cmd:Nnn \qtylist { o m m }
+ {
+ \__siunitx_list_use:nnVVV {#2} {#3}
+ \l_siunitx_list_separator_pair_tl
+ \l_siunitx_list_separator_tl
+ \l_siunitx_list_separator_final_tl
+ }
+\__siunitx_bookmark_cmd:Nnn \numproduct { o m } { }
+\__siunitx_bookmark_cmd:Nnn \qtyproduct { o m m } { }
+\__siunitx_bookmark_cmd:Nnn \numrange { o m m }
+ { #2 \tl_use:N \l_siunitx_range_phrase_tl #3 }
+\__siunitx_bookmark_cmd:Nnn \qtyrange { o m m m }
+ { #2 ~ #4 \tl_use:N \l_siunitx_range_phrase_tl #3 ~ #4 }
+\__siunitx_bookmark_cmd:Nnn \si { o m } { #2 }
+\__siunitx_bookmark_cmd:Nnn \SI { o m O { } m } { #3 #2 ~ #4 }
+\__siunitx_bookmark_cmd:Nnn \SIlist { o m m }
+ {
+ \__siunitx_list_use:nnVVV {#2} {#3}
+ \l_siunitx_list_separator_pair_tl
+ \l_siunitx_list_separator_tl
+ \l_siunitx_list_separator_final_tl
+ }
+\__siunitx_bookmark_cmd:Nnn \SIrange { o m m m }
+ { #2 ~ #4 \tl_use:N \l_siunitx_range_phrase_tl #3 ~ #4 }
+\seq_const_from_clist:Nn \c__siunitx_bookmark_seq
+ {
+ \ang , \qty , \num , \unit ,
+ \numlist , \qtylist ,
+ \numrange , \qtyrange ,
+ \si , \SI , \SIlist , \SIrange
+ }
+\AtBeginDocument
+ {
+ \@ifpackageloaded { hyperref }
{
- exponent-product = \ensuremath { \times } ,
- inter-unit-product = \, ,
- output-decimal-marker = { , }
- },
- locale /
- UK .meta:n =
+ \pdfstringdefDisableCommands
+ {
+ \seq_map_inline:Nn \c__siunitx_bookmark_seq
+ {
+ \cs_set_eq:Nc #1
+ { \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) }
+ }
+ }
+ \pdfstringdefDisableCommands
+ {
+ \siunitx_unit_pdfstring_context:
+ \cs_if_exist:NT \FB@fg { \def \fg { \FB@fg } }
+ \edef \H
+ {
+ \exp_not:c { PU-cmd }
+ \exp_not:N \H
+ \exp_not:c { PU \token_to_str:N \H }
+ }
+ }
+ }
+ { }
+ }
+\cs_new:Npn \__siunitx_angle:n #1
+ { \__siunitx_angle:w #1 ; ; ; \q_stop }
+\cs_new:Npn \__siunitx_angle:w #1 ; #2 ; #3 ; #4 \q_stop
+ {
+ \tl_if_blank:nF {#1}
+ { #1 \degree }
+ \tl_if_blank:nF {#2}
{
- exponent-product = \ensuremath { \times } ,
- inter-unit-product = \, ,
- output-decimal-marker = .
- },
- locale /
- US .meta:n = { locale = UK },
- locale /
- USA .meta:n = { locale = UK },
- locale /
- ZA .meta:n =
- {
- exponent-product = \ensuremath { \times } ,
- inter-unit-product = \ensuremath { \cdot } ,
- output-decimal-marker = { , }
- },
-}
-\file_if_exist:nT { translator.sty }
- {
- \RequirePackage { translator }
- \usedictionary { translator-basic-dictionary }
- \providetranslation [ to = English ]
- { to~(numerical~range) } { to }
- \providetranslation [ to = French ]
- { to~(numerical~range) } { \`a }
- \providetranslation [ to = German ]
- { to~(numerical~range) } { bis }
- \providetranslation [ to = Spanish ]
- { to~(numerical~range) } { a }
- \sisetup
- {
- list-final-separator = { ~ \translate { and } ~ },
- list-pair-separator = { ~ \translate { and } ~ },
- range-phrase = { ~ \translate { to~(numerical~range) } ~ }
- }
- }
-\tl_const:Nn \c__siunitx_configuration_ext_tl { cfg }
-\keys_define:nn { siunitx }
+ \tl_if_blank:nF {#1} { \c_space_tl }
+ #2 \arcminute
+ }
+ \tl_if_blank:nF {#3}
+ {
+ \tl_if_blank:nF {#1#2} { \c_space_tl }
+ #3 \arcsecond
+ }
+ }
+\cs_new:Npn \__siunitx_list_use:nnnnn #1#2#3#4#5
{
- abbreviations .choice:,
- abbreviations /
- true .code:n = { \__siunitx_load_abbreviations: },
- abbreviations /
- false .code:n =
- { \cs_set_eq:NN \__siunitx_load_abbreviations: \prg_do_nothing: } ,
- abbreviations .default:n = true ,
- binary-units .choice:,
- binary-units /
- true .code:n = { \AtBeginDocument { \__siunitx_load_binary: } },
- binary-units /
- false .code:n =
- { \cs_set_eq:NN \__siunitx_load_binary: \prg_do_nothing: } ,
- binary-units .default:n = true
- }
-\cs_new_protected:Npn \__siunitx_load_abbreviations:
- {
- \@onefilewithoptions { siunitx-abbreviations } [ ] [ ]
- \c__siunitx_configuration_ext_tl
- }
-\cs_new_protected:Npn \__siunitx_load_binary:
- {
- \@onefilewithoptions { siunitx-binary } [ ] [ ]
- \c__siunitx_configuration_ext_tl
- }
-\AtBeginDocument { \__siunitx_load_abbreviations: }
-\__siunitx_option_deactivate:n { abbreviations , binary }
-\keys_define:nn { siunitx }
+ \tl_if_blank:nTF {#2}
+ { \__siunitx_list_use_aux:nnnnn {#1} { } }
+ { \__siunitx_list_use_aux:nnnnn {#1} { ~ #2 } }
+ {#3} {#4} {#5}
+ }
+\cs_generate_variant:Nn \__siunitx_list_use:nnnnn { nnVVV }
+\cs_new:Npn \__siunitx_list_use_aux:nnnnn #1#2#3#4#5
{
- version-1-compatibility .choice: ,
- version-1-compatibility /
- true .code:n =
- {
- \@onefilewithoptions { siunitx-version-1 } [ ] [ ]
- \c__siunitx_configuration_ext_tl
- },
- version-1-compatibility /
- false .code:n = { } ,
- version-1-compatibility .default:n = true
- }
-\__siunitx_option_deactivate:n { version-1-compatibility }
-\keys_define:nn { siunitx } {
- load-configurations .code:n =
- {
- \clist_if_in:nnT {#1} { version-1 }
- {
- \@onefilewithoptions { siunitx-version-1 } [ ] [ ]
- \c__siunitx_configuration_ext_tl
- }
- }
-}
-\__siunitx_option_deactivate:n { load-configurations }
-\file_if_exist:nT { siunitx . \c__siunitx_configuration_ext_tl }
+ \int_case:nnF { \__siunitx_list_count:n {#1} }
+ {
+ { 0 } { }
+ { 1 } { \__siunitx_list_use_auxi:nw {#2} #1 ; ; { } }
+ { 2 } { \__siunitx_list_use_auxi:nw {#2} #1 ; {#3} }
+ }
+ {
+ \__siunitx_list_use_auxii:nnw {#2} { } #1 ;
+ \q_mark ; { \__siunitx_list_use_auxii:nnw {#2} {#4} }
+ \q_mark ; { \__siunitx_list_use_auxiii:nnw {#2} {#5} }
+ \q_stop { }
+ }
+ }
+\cs_new:Npn \__siunitx_list_use_auxi:nw #1#2 ; #3 ; #4
+ { #2 #1 #4 #3 \tl_if_blank:nF {#3} {#1} }
+\cs_new:Npn \__siunitx_list_use_auxii:nnw
+ #1#2#3 ; #4 ; #5 ; #6 \q_mark ; #7#8 \q_stop #9
+ { #7 {#4} ; {#5} ; #6 \q_mark ; {#7} #8 \q_stop { #9 #2 #3 #1 } }
+\cs_new:Npn \__siunitx_list_use_auxiii:nnw #1#2#3 ; #4 \q_stop #5
+ { #5 #2 #3 #1 }
+\cs_new:Npx \__siunitx_list_count:n #1
+ {
+ \exp_not:N \int_eval:n
+ {
+ 0
+ \exp_not:N \__siunitx_list_count:w \c_space_tl
+ #1 \exp_not:n { ; \q_recursion_tail ; \q_recursion_stop }
+ }
+ }
+\cs_new:Npx \__siunitx_list_count:w #1 ;
{
- \@onefilewithoptions { siunitx } [ ] [ ]
- \c__siunitx_configuration_ext_tl
+ \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1}
+ \exp_not:N \tl_if_blank:nF {#1} { + 1 }
+ \exp_not:N \__siunitx_list_count:w \c_space_tl
}
-\ProcessKeysOptions { siunitx }
-\AtBeginDocument {
- \bool_if:NTF \l__siunitx_create_free_bool
- { \__siunitx_unit_create_functions: }
- { \__siunitx_unit_create_empty_functions: }
-}
%% Copyright (C) 2008-2021 by
%% Joseph Wright <joseph.wright@morningstar2.co.uk>
%%
@@ -7639,14 +7336,37 @@
%% 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
+%%
+%% https://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
+%% This work consists of the files siunitx.dtx,
+%% siunitx.ins,
+%% siunitx.tex,
+%% siunitx-abbreviation.cfg,
+%% siunitx-abbreviation.dtx,
+%% siunitx-angle.dtx,
+%% siunitx-binary.cfg,
+%% siunitx-binary.dtx,
+%% siunitx-code.tex,
+%% siunitx-command.dtx,
+%% siunix-complex.dtx,
+%% siunitx-compound.dtx,
+%% siunitx-emulation.dtx,
+%% siunitx-locale.dtx,
+%% siunitx-number.dtx,
+%% siunitx-print.dtx,
+%% siunitx-quantity.dtx,
+%% siunitx-symbol.dtx,
+%% siunitx-table.dtx,
+%% siunitx-unit.dtx,
+%% siunitx-v2.sty and
+%% siunitx-version-1.cfg,
%% and the derived files siunitx.pdf,
%% siunitx.sty and
-%% siunitx.ins.
+%% siunitx-code.pdf.
+%%
%%
%% End of file `siunitx.sty'.