diff options
author | Karl Berry <karl@freefriends.org> | 2021-05-17 20:38:21 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-05-17 20:38:21 +0000 |
commit | 02d9f17ba92ad3f076e2dc14711462e1dfea6ec0 (patch) | |
tree | 1d9b453be69b5988dfe2bc0584d6425547563f69 /Master/texmf-dist/tex/latex | |
parent | 00085afeded239f44fcdb90c9f1ba8ec7f3680be (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.cfg | 124 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/siunitx/siunitx-binary.cfg | 2 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/siunitx/siunitx-v2.sty | 7652 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/siunitx/siunitx-version-1.cfg | 2 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/siunitx/siunitx.sty | 13380 |
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'. |