%% %% This is file `siunitx.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% siunitx.dtx (with options: `package') %% --------------------------------------------------------------- %% The siunitx package --- A comprehensive (SI) units package %% Maintained by Joseph Wright %% E-mail: joseph.wright@morningstar2.co.uk %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% --------------------------------------------------------------- %% \RequirePackage{expl3} \ProvidesExplPackage {siunitx} {2011/02/10} {2.1l} {A comprehensive (SI) units package} \cs_if_exist:NTF \msg_set:nnnn { \msg_set:nnnn { siunitx } { support-outdated } { Support~package~#1~too~old. } { Please~install~an~up~to~date~version~of~#1. \\ Loading~siunitx~will~abort! } } { \PackageError { siunitx } { Support~package~expl3~too~old. } { Please~install~an~up~to~date~version~of~expl3. \\ Loading~siunitx~will~abort! } \tex_endinput:D } \@ifpackagelater { expl3 } { 2010/11/13 } { } { \msg_error:nnx { siunitx } { support-outdated } { expl3 } \tex_endinput:D } \msg_set:nnnn { siunitx } { incompatible-package } { Package~'#1'~incompatible. } { The~#1~package~and~siunitx~are~incompatible. } \cs_new_protected_nopar: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{ xparse } \@ifpackagelater { xparse } { 2010/10/13 } { } { \msg_error:nnx { siunitx } { support-outdated } { xparse } \tex_endinput:D } \RequirePackage{ amstext , array , l3keys2e } \cs_new:Npn \siunitx_tmp:w { } \bool_new:N \l_siunitx_tmp_bool \box_new:N \l_siunitx_tmp_box \int_new:N \l_siunitx_tmp_int \tl_new:N \l_siunitx_tmpa_tl \tl_new:N \l_siunitx_tmpb_tl \bool_new:N \l_siunitx_error_bool \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} { } { } } \AtBeginDocument { \cs_if_free:cT { T@TS1 } { \DeclareFontEncoding { TS1 } { } { } \DeclareFontSubstitution { TS1 } { cmr } { m } { n } } } \DeclareTextSymbolDefault \c_siunitx_minus_tl { TS1 } \DeclareTextSymbol \c_siunitx_minus_tl { TS1 } { 61 } \AtBeginDocument { \@ifpackageloaded { fontspec } { \int_const:Nn \c_siunitx_minus_int { 8722 } \tl_set:Nn \c_siunitx_minus_tl { \char \c_siunitx_minus_int } } { } } \DeclareTextSymbol \c_siunitx_mu_tl { TS1 } { 181 } \DeclareTextSymbolDefault \c_siunitx_mu_tl { TS1 } \AtBeginDocument { \@ifpackageloaded { fontspec } { \tl_set:Nx \c_siunitx_mu_tl { \char 181 } } { } } \tl_new:N \c_siunitx_omega_tl \tl_set:Nn \c_siunitx_omega_tl { \Omega } \AtBeginDocument { \cs_if_exist:NT \upOmega { \tl_set:Nn \c_siunitx_omega_tl { \upOmega } } } \cs_new_protected:Npn \siunitx_tl_put_left_math:Nn #1#2 { \tl_put_left:Nn #1 { \siunitx_ensuremath:n {#2} } } \cs_generate_variant:Nn \siunitx_tl_put_left_math:Nn { NV } \cs_generate_variant:Nn \siunitx_tl_put_left_math:Nn { cV } \cs_new_protected:Npn \siunitx_tl_put_right_math:Nn #1#2 { \tl_put_right:Nn #1 { \siunitx_ensuremath:n {#2} } } \cs_generate_variant:Nn \siunitx_tl_put_right_math:Nn { NV } \cs_generate_variant:Nn \siunitx_tl_put_right_math:Nn { cV } \seq_new:N \c_siunitx_old_options_seq \cs_set_protected_nopar:Npn \siunitx_tmp:w #1 { \seq_put_right:No \c_siunitx_old_options_seq { \tl_to_str:n {#1} } } \siunitx_tmp:w { addsign } \siunitx_tmp:w { allowlitunits } \siunitx_tmp:w { allowoptarg } \siunitx_tmp:w { allowzeroexp } \siunitx_tmp:w { alsoload } \siunitx_tmp:w { angformat } \siunitx_tmp:w { anglesep } \siunitx_tmp:w { astroang } \siunitx_tmp:w { closeerr } \siunitx_tmp:w { closrfrac } \siunitx_tmp:w { closerange } \siunitx_tmp:w { colour } \siunitx_tmp:w { colorall } \siunitx_tmp:w { colourall } \siunitx_tmp:w { colorneg } \siunitx_tmp:w { colourneg } \siunitx_tmp:w { colourunits } \siunitx_tmp:w { colourunits } \siunitx_tmp:w { colorvalues } \siunitx_tmp:w { colourvalues } \siunitx_tmp:w { decimalsymbol } \siunitx_tmp:w { debug } \siunitx_tmp:w { detectdisplay } \siunitx_tmp:w { digitsep } \siunitx_tmp:w { dp } \siunitx_tmp:w { emulate } \siunitx_tmp:w { errspace } \siunitx_tmp:w { eVcorra } \siunitx_tmp:w { eVcorrb } \siunitx_tmp:w { expbase } \siunitx_tmp:w { expproduct } \siunitx_tmp:w { fixdp } \siunitx_tmp:w { fixsf } \siunitx_tmp:w { fraction } \siunitx_tmp:w { inlinebold } \siunitx_tmp:w { loctolang } \siunitx_tmp:w { log } \siunitx_tmp:w { load } \siunitx_tmp:w { mathOmega } \siunitx_tmp:w { mathcelsius } \siunitx_tmp:w { mathdegree } \siunitx_tmp:w { mathminute } \siunitx_tmp:w { mathmu } \siunitx_tmp:w { mathringA } \siunitx_tmp:w { mathrm } \siunitx_tmp:w { mathsOmega } \siunitx_tmp:w { mathscelsius } \siunitx_tmp:w { mathsdegree } \siunitx_tmp:w { mathsecond } \siunitx_tmp:w { mathsf } \siunitx_tmp:w { mathsminute } \siunitx_tmp:w { mathsmu } \siunitx_tmp:w { mathsringA } \siunitx_tmp:w { mathsrm } \siunitx_tmp:w { mathssecond } \siunitx_tmp:w { mathssf } \siunitx_tmp:w { mathstt } \siunitx_tmp:w { mathtt } \siunitx_tmp:w { negcolor } \siunitx_tmp:w { negcolour } \siunitx_tmp:w { noload } \siunitx_tmp:w { numaddn } \siunitx_tmp:w { numcloseerr } \siunitx_tmp:w { numdecimal } \siunitx_tmp:w { numdigits } \siunitx_tmp:w { numdiv } \siunitx_tmp:w { numexp } \siunitx_tmp:w { numgobble } \siunitx_tmp:w { numopenerr } \siunitx_tmp:w { numprod } \siunitx_tmp:w { numsign } \siunitx_tmp:w { obeyall } \siunitx_tmp:w { obeybold } \siunitx_tmp:w { obeyfamily } \siunitx_tmp:w { obeymode } \siunitx_tmp:w { obeyitalic } \siunitx_tmp:w { openerr } \siunitx_tmp:w { openfrac } \siunitx_tmp:w { openrange } \siunitx_tmp:w { padangle } \siunitx_tmp:w { padnumber } \siunitx_tmp:w { per } \siunitx_tmp:w { prefixbase } \siunitx_tmp:w { prefixproduct } \siunitx_tmp:w { prefixsymbolic } \siunitx_tmp:w { prespace } \siunitx_tmp:w { redefsymbols } \siunitx_tmp:w { repeatunits } \siunitx_tmp:w { retainplus } \siunitx_tmp:w { seperr } \siunitx_tmp:w { sepfour } \siunitx_tmp:w { sf } \siunitx_tmp:w { sign } \siunitx_tmp:w { slash } \siunitx_tmp:w { stickyper } \siunitx_tmp:w { strictarc } \siunitx_tmp:w { tabalign } \siunitx_tmp:w { tabalignexp } \siunitx_tmp:w { tabautofit } \siunitx_tmp:w { tabexpalign } \siunitx_tmp:w { tabformat } \siunitx_tmp:w { tabnumalign } \siunitx_tmp:w { tabparseonly } \siunitx_tmp:w { tabtextalign } \siunitx_tmp:w { textOmega } \siunitx_tmp:w { textcelsius } \siunitx_tmp:w { textdegree } \siunitx_tmp:w { textminute } \siunitx_tmp:w { textmode } \siunitx_tmp:w { textmu } \siunitx_tmp:w { textringA } \siunitx_tmp:w { textrm } \siunitx_tmp:w { textsecond } \siunitx_tmp:w { textsf } \siunitx_tmp:w { texttt } \siunitx_tmp:w { tightpm } \siunitx_tmp:w { tophrase } \siunitx_tmp:w { trapamigerr } \siunitx_tmp:w { trapambigfrac } \siunitx_tmp:w { trapambigrange } \siunitx_tmp:w { unitcolor } \siunitx_tmp:w { unitcolour } \siunitx_tmp:w { unitmathrm } \siunitx_tmp:w { unitmathsf } \siunitx_tmp:w { unitmathsrm } \siunitx_tmp:w { unitmathssf } \siunitx_tmp:w { unitmathstt } \siunitx_tmp:w { unitmathtt } \siunitx_tmp:w { unitmode } \siunitx_tmp:w { unitsep } \siunitx_tmp:w { unitspace } \siunitx_tmp:w { valuecolor } \siunitx_tmp:w { valuecolour } \siunitx_tmp:w { valuemathrm } \siunitx_tmp:w { valuemathsf } \siunitx_tmp:w { valuemathsrm } \siunitx_tmp:w { valuemathssf } \siunitx_tmp:w { valuemathstt } \siunitx_tmp:w { valuemathtt } \siunitx_tmp:w { valuemode } \siunitx_tmp:w { valuesep } \siunitx_tmp:w { xpace } \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 } { load-configurations = version-1 } \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 } } } } } \clist_new:N \l_siunitx_option_deactivate_clist \cs_new_protected_nopar:Npn \siunitx_option_deactivate:n #1 { \clist_put_right:Nn \l_siunitx_option_deactivate_clist {#1} } \cs_new_protected_nopar: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 } \cs_generate_variant:Nn \prop_del:Nn { c } \cs_generate_variant:Nn \prop_put:Nnn { cnV } \cs_generate_variant:Nn \tl_replace_all_in:Nnn { NnV } \group_begin: \tl_map_inline:nn { \M \A \C \R \O } { \char_make_other:n { `#1 } } \tl_map_inline:nn { \F \N \T } { \char_set_lccode:nn { `#1 } { `#1 } } \tl_to_lowercase:n { \group_end: \prg_new_conditional:Npnn \siunitx_cs_if_tl:N #1 { T , F, TF , p } { \exp_last_unbraced:No \siunitx_cs_if_tl_aux:w { \token_to_meaning:N #1 MACRO \q_stop } { \cs_if_exist:cTF { \cs_to_str:N #1 ~ } { \prg_return_false: } { \prg_return_true: } } { \prg_return_false: } } \cs_new_nopar:Npn \siunitx_cs_if_tl_aux:w #1 MACRO #2 \q_stop { \tl_if_empty:nTF {#1} } \prg_new_conditional:Npnn \siunitx_cs_if_macro:N #1 { T , F , TF , p } { \exp_last_unbraced:No \siunitx_cs_if_tl_aux:w { \token_to_meaning:N #1 MACRO \q_stop } { \prg_return_true: } { \prg_return_false: } } } \cs_new_eq:NN \siunitx_ensuremath:n \ensuremath \AtBeginDocument { \@ifpackageloaded { tex4ht } { \cs_set_eq:NN \siunitx_ensuremath:n \use:n \keys_set:nn { siunitx } { mode = text } } { } } \bool_new:N \l_siunitx_display_math_bool \toks_put_right:Nn \tex_everydisplay:D { \bool_set_true:N \l_siunitx_display_math_bool } \cs_new_protected_nopar:Npn \siunitx_set_math_fam:n #1 { \int_new:c { c_siunitx_math #1 _int } \group_begin: \hbox_set:Nn \l_siunitx_tmp_box { \ensuremath { \use:c { math #1 } { \int_gset:cn { c_siunitx_math #1 _int } { \fam } } } } \group_end: } \tl_put_right:Nn \document { \siunitx_set_math_fam:n { sf } \siunitx_set_math_fam:n { tt } } \cs_new_protected_nopar:Npn \siunitx_set_text_fam:n #1 { \tl_new:c { c_siunitx_text #1 _tl } \tl_set: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 \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:, 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:, 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_nopar:Npn \siunitx_font_shape: { } \cs_new_nopar:Npn \siunitx_font_weight: { } \cs_new_protected_nopar: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_nopar: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_nopar: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_nopar: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_nopar:Npn \siunitx_detect_font_weight_text: { \tl_set:Nx \l_siunitx_tmpa_tl { \tl_head:V \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_nopar: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_nopar: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_nopar: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_nopar:Npn \siunitx_detect_font_shape: { \str_if_eq:VnT \f@shape { it } { \cs_set_nopar:Npn \siunitx_font_shape: { \itshape } } \str_if_eq:VnT \f@shape { sl } { \cs_set_nopar:Npn \siunitx_font_shape: { \slshape } } } \cs_new_protected_nopar: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_nopar:Npn \siunitx_number_textrm: { } \cs_new_nopar:Npn \siunitx_number_textsf: { } \cs_new_nopar: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_nopar:Npn \siunitx_number_mathrm:n ##1 { #1 {##1} } }, number-math-sf .code:n = { \cs_set_nopar:Npn \siunitx_number_mathsf:n ##1 { #1 {##1} } }, number-math-tt .code:n = { \cs_set_nopar: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_nopar:Npn \siunitx_number_textrm: {#1} }, number-text-sf .code:n = { \cs_set_nopar:Npn \siunitx_number_textsf: {#1} }, number-text-tt .code:n = { \cs_set_nopar:Npn \siunitx_number_texttt: {#1} } } \cs_new_nopar:Npn \siunitx_unit_mathrm: { } \cs_new_nopar:Npn \siunitx_unit_mathsf: { } \cs_new_nopar:Npn \siunitx_unit_mathtt: { } \cs_new_nopar:Npn \siunitx_unit_textrm: { } \cs_new_nopar:Npn \siunitx_unit_textsf: { } \cs_new_nopar: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_nopar:Npn \siunitx_unit_mathrm:n ##1 { #1 {##1} } }, unit-math-sf .code:n = { \cs_set_nopar:Npn \siunitx_unit_mathsf:n ##1 { #1 {##1} } }, unit-math-tt .code:n = { \cs_set_nopar: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_nopar:Npn \siunitx_unit_textrm: {#1} }, unit-text-sf .code:n = { \cs_set_nopar:Npn \siunitx_unit_textsf: {#1} }, unit-text-tt .code:n = { \cs_set_nopar: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, number-mode = math, text-rm = \rmfamily, text-sf = \sffamily, text-tt = \ttfamily, } \AtBeginDocument { \tl_set:Nx \l_siunitx_tmpa_tl { \familydefault } \tl_if_eq:NNT \l_siunitx_tmpa_tl \c_siunitx_textsf_tl { \@ifpackageloaded { cmbright } { } { \keys_set:nn { siunitx } { math-rm = \mathsf } } \keys_set:nn { siunitx } { text-rm = \sffamily } } \tl_if_eq:NNT \l_siunitx_tmpa_tl \c_siunitx_texttt_tl { \keys_set:nn { siunitx } { math-rm = \mathtt, 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_nopar:Npn \siunitx_print_aux: { \text { \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: } } } \cs_new_protected_nopar: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_set_eq:NN \siunitx_print_color: \scan_stop: } } \group_begin: \char_set_lccode:nn { `\@ } { `\_ } \char_make_math_subscript:N \@ \char_set_lccode:nn { `\! } { `\_ } \char_make_active:N \! \tl_to_lowercase:n { \group_end: \cs_set_protected_nopar:Npn \siunitx_print_math: { \ensuremath { \use:c { siunitx_ \l_siunitx_print_type_tl _ math \l_siunitx_font_family_tl :n } { \l_siunitx_print_arg_tl } } } \cs_set_protected_nopar:Npn \siunitx_print_text: { \tl_replace_all_in:Nnn \l_siunitx_print_arg_tl { @ } { \siunitx_print_text_sub:n } \tl_replace_all_in:Nnn \l_siunitx_print_arg_tl { ! } { \siunitx_print_text_sub:n } \tl_replace_all_in:Nnn \l_siunitx_print_arg_tl { ^ } { \siunitx_print_text_super:n } \l_siunitx_print_arg_tl } } \group_begin: \char_set_lccode:nn { `\@ } { `\_ } \char_make_math_subscript:N \@ \tl_to_lowercase:n { \group_end: \cs_set_protected:Npn \siunitx_print_text_sub:n #1 { \cs_set:Npn \siunitx_print_text_sub_super:n ##1 { \ensuremath { @ { \text {#1} } ^ { \text {##1} } } } \peek_meaning_remove:NTF \siunitx_print_text_super:n { \siunitx_print_text_sub_super:n } { \ensuremath { @ { \text {#1} } } } } } \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_in:Nnn \l_siunitx_tmpa_tl { - } { \c_siunitx_minus_tl } \tl_set:Nx \l_siunitx_tmpa_tl { \exp_not:N \ensuremath { ^ { \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_nopar:Npn \siunitx_number_preprocess_init: { \bool_set_false:N \l_siunitx_error_bool \tl_clear:N \l_siunitx_number_multi_tl } \cs_new_protected_nopar: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_last_unbraced:NV \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_nopar: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_last_unbraced:NV \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_new:N \c_siunitx_number_part_complex_tl \tl_set: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 \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, } \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\ge\geq\gg\le\leg\ll\mp\pi\pm\sim, input-signs = +-\mp\pm, input-symbols = \pi, } \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 } \cs_new_protected:Npn \siunitx_number_in_parse_aux:n #1 { \tl_set_rescan:Nnx \l_siunitx_number_arg_tl { \siunitx_number_in_protect: \char_make_ignore:N \~ \char_make_other:N \, \char_make_other:N \. \cs_set_eq:NN \, \prg_do_nothing: } {#1} \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} } \cs_new_protected_nopar: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_nopar: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_nopar: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_nopar:Npn \siunitx_number_in_sign_replace:N #1 { \tl_replace_all_in:Nnn #1 { -+ } { \mp } \tl_replace_all_in:Nnn #1 { +- } { \pm } \tl_replace_all_in:Nnn #1 { << } { \ll } \tl_replace_all_in:Nnn #1 { <= } { \le } \tl_replace_all_in:Nnn #1 { >> } { \gg } \tl_replace_all_in:Nnn #1 { >= } { \ge } } \cs_new_protected:Npn \siunitx_number_in_parse_error:nx #1#2 { \siunitx_error:nx {#1} { \exp_not:n {#2} } \tl_map_break: } \cs_generate_variant:Nn \siunitx_number_in_parse_error:nx { 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_last_unbraced:NV \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:nx { 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:nx { 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:nx { 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:nx { 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 { \ensuremath {#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:nx { 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:nx { 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:nx { 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_del: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:NnT \l_siunitx_number_in_prop { complex-sign } { \bool_set_true:N \l_siunitx_number_in_sign_bool } } } \cs_new_protected_nopar:Npn \siunitx_number_in_complex_aux:nn #1#2 { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \prop_del: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:nx { duplicate-decimal-token } { \token_to_str:N #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:nx { 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:nx { misplaced-sign-token } {#1} } { \bool_if:NTF \l_siunitx_number_in_complex_bool { \siunitx_number_in_parse_error:nx { 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_nopar: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_nopar:Npn \siunitx_number_in_check:n #1 { } \cs_new_protected_nopar: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:NVN \l_siunitx_number_in_prop \l_siunitx_number_part_sign_tl \l_siunitx_tmpa_tl \quark_if_no_value:NF \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_del:NV \l_siunitx_number_in_prop \l_siunitx_number_part_sign_tl } } } \cs_new_protected_nopar: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 \siunitx_error:nx { misplaced-sign-token } { \exp_not:V \l_siunitx_tmpa_tl } } \prop_get:NnN \l_siunitx_number_in_prop { mantissa-sign } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \prop_if_in:NnF \l_siunitx_number_in_prop { mantissa } { \prop_del:Nn \l_siunitx_number_in_prop { mantissa-sign } \prop_put:NnV \l_siunitx_number_in_prop { complex-sign } \l_siunitx_tmpa_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_integer_in_tl \tl_new:N \l_siunitx_round_integer_out_tl \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_scientific_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, retain-explicit-plus .bool_set:N = \l_siunitx_process_plus_tl, 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-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_scientific_bool }, scientific-notation / fixed .code:n = { \bool_set_true:N \l_siunitx_process_fixed_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_true:N \l_siunitx_process_scientific_bool }, } \keys_set:nn { siunitx } { add-decimal-zero = true, add-integer-zero = true, retain-unity-mantissa = true, round-precision = 2, } \cs_new_protected_nopar: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 } { \siunitx_number_process_exponent: \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_uncertainty: \prop_if_in:NnF \l_siunitx_number_in_prop { uncertainty } { \siunitx_number_process_round: } } } \cs_new_protected_nopar: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_del:Nn \l_siunitx_number_in_prop { exponent } \prop_del:Nn \l_siunitx_number_in_prop { exponent-integer } \prop_del:Nn \l_siunitx_number_in_prop { exponent-decimal } } } } } \cs_new_protected_nopar:Npn \siunitx_number_process_exponent_aux:n #1 { \prop_get:NnN \l_siunitx_number_in_prop { exponent- #1 } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \int_compare:nNnF { \l_siunitx_tmpa_tl } = { 0 } { \bool_set_true:N \l_siunitx_tmp_bool } } } \cs_new_protected_nopar:Npn \siunitx_number_process_figures:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \siunitx_number_process_figures_aux:n {#1} } } \cs_new_protected_nopar: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_del:Nn \l_siunitx_number_in_prop { #1 -decimal } } } \cs_new_protected_nopar:Npn \siunitx_number_process_figures_init:n #1 { \int_zero:N \l_siunitx_round_int \bool_set_false:N \l_siunitx_round_bool \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_round_decimal_in_tl \quark_if_no_value:NT \l_siunitx_round_decimal_in_tl { \tl_clear:N \l_siunitx_round_decimal_in_tl } \prop_get:NnN \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_round_integer_in_tl \quark_if_no_value:NT \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 } \cs_new_protected_nopar: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_nopar: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_nopar: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 } \tl_if_empty:NF \l_siunitx_round_decimal_out_tl { \tl_reverse:N \l_siunitx_round_decimal_out_tl \tl_set:Nx \l_siunitx_round_decimal_out_tl { \tl_tail:n \l_siunitx_round_decimal_out_tl } \tl_reverse:N \l_siunitx_round_decimal_out_tl } } } \cs_new_protected_nopar: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_nopar: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:V \l_siunitx_round_integer_in_tl } \bool_if:NT \l_siunitx_round_bool { \int_incr:N \l_siunitx_tmp_int } \bool_set_false:N \l_siunitx_round_bool \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:V \l_siunitx_round_integer_in_tl } \tl_if_empty:NF \l_siunitx_round_integer_in_tl { \siunitx_number_process_figures_integer: } } \cs_new_protected_nopar: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_nopar:Npn \siunitx_number_process_fixed: { \prop_if_in:NnF \l_siunitx_number_in_prop { complex } { \prop_get:NnN \l_siunitx_number_in_prop { mantissa-integer } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_set:Nn \l_siunitx_tmpa_tl { 0 } } \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_set:Nx \l_siunitx_tmpa_tl { { \l_siunitx_tmpa_tl } { \l_siunitx_tmpb_tl } } \prop_get:NnN \l_siunitx_number_in_prop { exponent-integer } \l_siunitx_tmpb_tl \quark_if_no_value:NT \l_siunitx_tmpb_tl { \tl_set:Nn \l_siunitx_tmpb_tl { 0 } } \tl_set:Nx \l_siunitx_tmpa_tl { \l_siunitx_tmpa_tl { \l_siunitx_tmpb_tl } } \exp_last_unbraced:NV \siunitx_number_process_fixed_aux_i:nnn \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_number_process_fixed_aux_i:nnn #1#2#3 { \prop_put:Nnn \l_siunitx_number_in_prop { exponent } { true } \prop_put:NnV \l_siunitx_number_in_prop { exponent-integer } \l_siunitx_process_fixed_int \int_compare:nNnF { #1 + 0 #2 } = { 0 } { \siunitx_number_process_fixed_aux_ii:nnn {#1} {#2} {#3} } } \cs_new_protected_nopar:Npn \siunitx_number_process_fixed_aux_ii: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_del:Nn \l_siunitx_number_in_prop { mantissa-decimal } \prop_del: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_nopar:Npn \siunitx_number_process_fixed_large:nnn #1#2#3 { \cs_set_protected_nopar: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 } } } { \int_compare:nNnTF {#1} = { 0 } { \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_nopar:Npn \siunitx_number_process_fixed_large_aux:w { } \cs_new_protected_nopar:Npn \siunitx_number_process_fixed_small:nnn #1#2#3 { \cs_set_protected_nopar: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_nopar:Npn \siunitx_number_process_fixed_small_aux:w { } \tl_new:N \c_siunitx_unity_tl \tl_set:Nn \c_siunitx_unity_tl { 1 } \cs_new_protected_nopar: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:NnN \l_siunitx_number_in_prop { mantissa-integer } \l_siunitx_tmpa_tl \quark_if_no_value:NF \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_del:Nn \l_siunitx_number_in_prop { mantissa } \prop_del:Nn \l_siunitx_number_in_prop { mantissa-integer } } } } } } } \cs_new_protected_nopar:Npn \siunitx_number_process_pad:n #1 { \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_tmpa_tl \quark_if_no_value:NF \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_nopar: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_nopar:Npn \siunitx_number_process_places_aux_i:n #1 { \int_compare:nNnTF { \l_siunitx_process_precision_int } = { 0 } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \int_compare:nNnT { \tl_head:V \l_siunitx_tmpa_tl } > { 4 } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_tmpa_tl \quark_if_no_value:NTF \l_siunitx_tmpa_tl { \prop_put:Nnn \l_siunitx_number_in_prop { #1 -integer } { 1 } } { \tl_set:Nx \l_siunitx_tmpa_tl { \int_eval:n { \l_siunitx_tmpa_tl + 1 } } \prop_put:NnV \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_tmpa_tl } } } \prop_del:Nn \l_siunitx_number_in_prop { #1 -decimal } \prop_del:Nn \l_siunitx_number_in_prop { #1 -decimal-marker } } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \tl_if_empty:NT \l_siunitx_tmpa_tl { \tl_set:Nn \l_siunitx_tmpa_tl { 0 } } \int_compare:nNnTF { \l_siunitx_tmpa_tl } = { 0 } { \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_elt_count:N \l_siunitx_tmpa_tl } \siunitx_number_process_places_aux_ii:n {#1} } } } } \cs_new_protected_nopar: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_nopar:Npn \siunitx_number_process_places_init:n #1 { \prop_get:NnN \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_round_integer_in_tl \quark_if_no_value:NT \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 \bool_set_false:N \l_siunitx_round_bool } \cs_new_protected_nopar: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_nopar:Npn \siunitx_number_process_places_integer:n #1 { \int_set:Nn \l_siunitx_tmp_int { \tl_head:V \l_siunitx_round_integer_in_tl } \tl_set:Nx \l_siunitx_round_integer_in_tl { \tl_tail:V \l_siunitx_round_integer_in_tl } \bool_if:NT \l_siunitx_round_bool { \int_incr:N \l_siunitx_tmp_int } \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_nopar: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 } { . } } } \cs_set_nopar:Npx \siunitx_tmp:w { \exp_not:N \clist_map_function:nN { mantissa , complex } \exp_not:c { siunitx_number_process_ \l_siunitx_round_tl :n } } \siunitx_tmp:w } } \cs_new_protected_nopar:Npn \siunitx_number_process_round_decimal: { \int_compare:nNnF { \l_siunitx_round_int } > { 1 } { \siunitx_number_process_round_decimal_aux: } \tl_set:Nx \l_siunitx_round_decimal_in_tl { \tl_tail:V \l_siunitx_round_decimal_in_tl } \int_decr:N \l_siunitx_round_int } \cs_new_protected_nopar:Npn \siunitx_number_process_round_decimal_aux: { \int_set:Nn \l_siunitx_tmp_int { \tl_head:V \l_siunitx_round_decimal_in_tl } \bool_if:NT \l_siunitx_round_bool { \int_incr:N \l_siunitx_tmp_int } \bool_set_false:N \l_siunitx_round_bool \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_decimal_out_tl \l_siunitx_tmp_int } } \cs_new_protected_nopar:Npn \siunitx_number_process_round_tidy:n #1 { \int_compare:nNnTF { 0 \l_siunitx_round_integer_out_tl + 0 \l_siunitx_round_decimal_out_tl } = { 0 } { \fp_compare:nNnTF { \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_last_unbraced:NV \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_del:Nn \l_siunitx_number_in_prop { #1 -decimal } \prop_del: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_nopar: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_del:Nn \l_siunitx_number_in_prop { #4 -decimal } } { \prop_put:Nnn \l_siunitx_number_in_prop { #4 -decimal } {#2} } } \cs_new_protected_nopar:Npn \siunitx_number_process_scientific: { \prop_if_in:NnF \l_siunitx_number_in_prop { complex } { \prop_get:NnN \l_siunitx_number_in_prop { mantissa-integer } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_set:Nn \l_siunitx_tmpa_tl { 0 } } \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_set:Nx \l_siunitx_tmpa_tl { { \l_siunitx_tmpa_tl } { \l_siunitx_tmpb_tl } } \prop_get:NnN \l_siunitx_number_in_prop { exponent-integer } \l_siunitx_tmpb_tl \quark_if_no_value:NT \l_siunitx_tmpb_tl { \tl_set:Nn \l_siunitx_tmpb_tl { 0 } } \tl_set:Nx \l_siunitx_tmpa_tl { \l_siunitx_tmpa_tl { \l_siunitx_tmpb_tl } } \exp_last_unbraced:NV \siunitx_number_process_scientific_aux_i:nnn \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_number_process_scientific_aux_i:nnn #1#2#3 { \int_compare:nNnF { #1 + 0 #2 } = { 0 } { \siunitx_number_process_scientific_aux_ii:nnn {#1} {#2} {#3} } } \cs_new_protected_nopar:Npn \siunitx_number_process_scientific_aux_ii:nnn #1#2#3 { \int_compare:nNnTF {#1} > { 9 } { \siunitx_number_process_scientific_large:nnn {#1} {#2} {#3} } { \int_compare:nNnTF {#1} > { 0 } { \prop_put:Nnn \l_siunitx_number_in_prop { mantissa-integer } {#1} \tl_if_empty:nTF {#2} { \prop_del:Nn \l_siunitx_number_in_prop { mantissa-decimal } \prop_del: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:nNnF {#3} = { 0 } { \int_set:Nn \l_siunitx_tmp_int {#3} \prop_put:Nnn \l_siunitx_number_in_prop { exponent } { true } \prop_put:NnV \l_siunitx_number_in_prop { exponent-integer } \l_siunitx_tmp_int } } { \siunitx_number_process_scientific_small:wn #2 \q_stop {#3} } } } \cs_new_protected_nopar:Npn \siunitx_number_process_scientific_large:nnn #1#2#3 { \int_set:Nn \l_siunitx_tmp_int { \int_div_truncate:nn {#1} { 10 } } \tl_set:Nx \l_siunitx_tmpa_tl { \int_use:N \l_siunitx_tmp_int } \int_set:Nn \l_siunitx_tmp_int { #1 - 10 * \l_siunitx_tmp_int } \tl_set:Nx \l_siunitx_tmpa_tl { { \l_siunitx_tmpa_tl } { \int_use:N \l_siunitx_tmp_int #2 } { #3 + 1 } } \exp_last_unbraced:NV \siunitx_number_process_scientific_aux_ii:nnn \l_siunitx_tmpa_tl } \cs_new_protected_nopar: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_nopar:Npn \siunitx_number_process_sign: { \bool_if:NF \l_siunitx_process_plus_tl { \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 { \prop_if_in:NnTF \l_siunitx_number_in_prop { mantissa } { \siunitx_number_process_sign_add:n { mantissa } } { \prop_if_in:NnT \l_siunitx_number_in_prop { complex } { \siunitx_number_process_sign_add:n { complex } } } \prop_if_in:NnT \l_siunitx_number_in_prop { exponent } { \siunitx_number_process_sign_add:n { exponent } } } } \cs_new_protected_nopar: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 } } } } \tl_new:N \c_siunitx_plus_tl \tl_set:Nn \c_siunitx_plus_tl { + } \cs_new_protected_nopar: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_del:Nn \l_siunitx_number_in_prop { #1 -sign } \prop_put:Nnn \l_siunitx_number_in_prop { #1 -had-sign } { true } } } \cs_new_protected_nopar:Npn \siunitx_number_process_uncertainty: { \clist_map_function:nN { mantissa , complex } \siunitx_number_process_uncertainty_aux:n } \cs_new_protected_nopar: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_nopar: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_nopar: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_elt_count:N \l_siunitx_tmpa_tl } } \cs_new_protected_nopar: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_nopar: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_nopar: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_nopar:Npn \siunitx_number_process_zero_fill: { \siunitx_number_process_zero_fill_aux:n { integer } \siunitx_number_process_zero_fill_aux:n { decimal } } \cs_new_nopar: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_nopar: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 } } } } \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 \keys_define:nn { siunitx } { 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 .bool_set:N = \l_siunitx_group_decimal_bool, group-digits .meta:n = { group-decimal-digits = #1, group-integer-digits = #1 }, group-four-digits .bool_set:N = \l_siunitx_group_four_bool, group-integer-digits .bool_set:N = \l_siunitx_group_integer_bool, 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-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-decimal-digits = true, group-integer-digits = true, group-separator = \,, open-bracket = (, % ) ( output-close-uncertainty = ), output-complex-root = \mathrm { i }, output-decimal-marker = ., output-open-uncertainty = (, % ) } \cs_new_protected_nopar: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_nopar: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_del:Nn \l_siunitx_number_out_prop { #1 -bracket } } } } \cs_new_protected_nopar:Npn \siunitx_number_format_brackets_aux:n #1 { \prop_get:NnN \l_siunitx_number_out_prop { #1 -result } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \prop_get:NnN \l_siunitx_number_out_prop {#1} \l_siunitx_tmpa_tl } \siunitx_tl_put_left_math:NV \l_siunitx_tmpa_tl \l_siunitx_bracket_open_tl \siunitx_tl_put_right_math: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_nopar: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_nopar:Npn \siunitx_number_format_color_aux:n #1 { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \quark_if_no_value:NF \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_nopar: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 } } } { \tl_set:Nx \l_siunitx_tmpa_tl { \exp_not:N \siunitx_ensuremath:n { \exp_not:V \l_siunitx_output_complex_tl } } \prop_put:NnV \l_siunitx_number_out_prop { complex } \l_siunitx_tmpa_tl } \siunitx_number_format_join_complex: } } \cs_new_protected_nopar:Npn \siunitx_number_format_complex_aux:n #1 { \siunitx_number_format_complex_aux: \prop_get:NnN \l_siunitx_number_out_prop {#1} \l_siunitx_tmpb_tl \bool_if:NTF \l_siunitx_complex_after_bool { \siunitx_tl_put_right_math:NV \l_siunitx_tmpb_tl \l_siunitx_tmpa_tl } { \siunitx_tl_put_left_math: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_nopar:Npn \siunitx_number_format_complex_aux: { \tl_set:Nn \l_siunitx_tmpa_tl { \use:c { siunitx_ \l_siunitx_print_type_tl _ math \l_siunitx_font_family_tl :n } } \bool_if:NTF \l_siunitx_output_complex_copy_bool { \prop_get:NnN \l_siunitx_number_in_prop { complex-root } \l_siunitx_tmpb_tl \tl_put_right:Nx \l_siunitx_tmpa_tl { { \exp_not:V \l_siunitx_tmpb_tl } } } { \tl_put_right:Nx \l_siunitx_tmpa_tl { { \exp_not:V \l_siunitx_output_complex_tl } } } } \cs_new_protected_nopar: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_nopar: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_nopar: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_del: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_put_right:No \l_siunitx_tmpa_tl { \l_siunitx_tmpb_tl } \prop_put:NnV \l_siunitx_number_out_prop { result } \l_siunitx_tmpa_tl } } \cs_new_protected_nopar: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 \bool_if:NTF \l_siunitx_tight_bool { \tl_set:Nx \l_siunitx_tmpb_tl { { \exp_not:V \l_siunitx_exponent_product_tl } } } { \tl_set:Nx \l_siunitx_tmpb_tl { { } \exp_not:V \l_siunitx_exponent_product_tl { } } } \siunitx_tl_put_right_math:NV \l_siunitx_tmpa_tl \l_siunitx_tmpb_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_nopar:Npn \siunitx_number_format_final_exponent: { \prop_get:NnN \l_siunitx_number_out_prop { exponent } \l_siunitx_tmpa_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 \prop_put:NnV \l_siunitx_number_out_prop { exponent-result } \l_siunitx_tmpa_tl } \cs_new_protected_nopar:Npn \siunitx_number_format_final_exponent_only: { \prop_get:NnN \l_siunitx_number_in_prop { mantissa-sign } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \bool_if:NT \l_siunitx_tight_bool { \tl_set:Nx \l_siunitx_tmpa_tl { { \exp_not:V \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_nopar: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:NnN \l_siunitx_number_in_prop { #1 -decimal-marker } \l_siunitx_tmpb_tl \quark_if_no_value:NF \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_set:Nx \l_siunitx_tmpb_tl { \exp_not:N \siunitx_ensuremath:n { \exp_not:V \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 -decimal-marker } \l_siunitx_tmpb_tl \prop_get:NnN \l_siunitx_number_out_prop { #1 -decimal } \l_siunitx_tmpb_tl \quark_if_no_value:NT \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_nopar:Npn \siunitx_number_format_group_aux:nn #1#2 { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 - #2 } { \prop_if_in:NnTF \l_siunitx_number_in_prop { symbolic } { \siunitx_number_format_copy:n { #1 - #2 } } { \bool_if:cTF { l_siunitx_group_ #2 _bool } { \siunitx_number_format_group_four:nn {#1} {#2} } { \siunitx_number_format_copy:n { #1 - #2 } } } } } \cs_new_protected_nopar:Npn \siunitx_number_format_group_four:nn #1#2 { \prop_get:NnN \l_siunitx_number_in_prop { #1 - #2 } \l_siunitx_tmpa_tl \bool_if:NTF \l_siunitx_group_four_bool { \siunitx_number_format_group_four_aux:nn {#1} {#2} } { \exp_last_unbraced:NV \siunitx_number_format_group_four_aux:NNNNNNw \l_siunitx_tmpa_tl \q_no_value \q_no_value \q_no_value \q_no_value \q_no_value \q_stop { \siunitx_number_format_copy:n {#1 - #2} } { \siunitx_number_format_group_four_aux:nn {#1} {#2} } } } \cs_new_protected:Npn \siunitx_number_format_group_four_aux:NNNNNNw #1#2#3#4#5#6 \q_stop { \quark_if_no_value:NTF #5 } \cs_new_protected_nopar:Npn \siunitx_number_format_group_four_aux:nn #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_nopar:Npn \siunitx_number_format_group_decimal: { \tl_if_empty:NF \l_siunitx_tmpa_tl { \exp_last_unbraced:NV \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} { \siunitx_tl_put_right_math:NV \l_siunitx_tmpb_tl \l_siunitx_group_sep_tl \siunitx_number_format_group_decimal_aux:NNNN #4 } } } } \cs_new_protected_nopar: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} { \siunitx_tl_put_right_math:NV \l_siunitx_tmpb_tl \l_siunitx_group_sep_tl \siunitx_number_format_group_integer_aux:NNNN #4 } } \cs_new_protected_nopar: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:NnN \l_siunitx_number_out_prop { complex-result } \l_siunitx_tmpb_tl \quark_if_no_value:NT \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_nopar:Npn \siunitx_number_format_join_uncert: { \siunitx_number_format_join_uncert:n { mantissa } \siunitx_number_format_join_uncert:n { complex } } \cs_new_protected_nopar:Npn \siunitx_number_format_join_uncert:n #1 { \prop_get:NnN \l_siunitx_number_out_prop {#1} \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \prop_get:NnN \l_siunitx_number_out_prop { #1 -uncertainty } \l_siunitx_tmpb_tl \quark_if_no_value:NTF \l_siunitx_tmpb_tl { \siunitx_number_format_copy:nn {#1} { #1 -result } } { \bool_if:NT \l_siunitx_uncert_sep_bool { \siunitx_number_format_join_uncert_pm: } \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 } } } } \cs_new_protected_nopar:Npn \siunitx_number_format_join_uncert_pm: { \bool_if:NTF \l_siunitx_tight_bool { \tl_put_left:Nn \l_siunitx_tmpb_tl { \siunitx_ensuremath:n { { \pm } } } } { \tl_put_left:Nn \l_siunitx_tmpb_tl { \siunitx_ensuremath:n { { } \pm { } } } } } \cs_new_protected_nopar: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_nopar:Npn \siunitx_number_format_relation: { \prop_get:NnN \l_siunitx_number_in_prop { comparator } \l_siunitx_tmpa_tl \quark_if_no_value:NF \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_nopar:Npn \siunitx_number_format_sign:n #1 { \prop_if_in:NnT \l_siunitx_number_out_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop { #1 -sign } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \bool_if:NT \l_siunitx_tight_bool { \tl_set:Nx \l_siunitx_tmpa_tl { { \exp_not:V \l_siunitx_tmpa_tl } } } \tl_clear:N \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 { #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:NnN \l_siunitx_number_out_prop { #1 -result } \l_siunitx_tmpa_tl \quark_if_no_value:NF \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_nopar:Npn \siunitx_number_format_sign_complex: { \siunitx_number_format_sign_complex:n { complex } \siunitx_number_format_sign_complex:n { complex-result } } \cs_new_protected_nopar:Npn \siunitx_number_format_sign_complex:n #1 { \prop_if_in:NnT \l_siunitx_number_out_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop { complex-sign } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \bool_if:NTF \l_siunitx_tight_bool { \tl_set:Nx \l_siunitx_tmpa_tl { { \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 \siunitx_tl_put_left_math: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_nopar: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_nopar:Npn \siunitx_number_format_uncertainty_joined:n #1 { \prop_get:NnN \l_siunitx_number_in_prop { #1 -uncertainty } \l_siunitx_tmpa_tl \prop_del:Nn \l_siunitx_number_in_prop { #1 -uncertainty } \siunitx_tl_put_left_math:NV \l_siunitx_tmpa_tl \l_siunitx_output_uncert_open_tl \siunitx_tl_put_left_math:NV \l_siunitx_tmpa_tl \l_siunitx_uncert_sep_tl \siunitx_tl_put_right_math: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_nopar: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_eq:NN \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_nopar: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_nopar: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_nopar: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_nopar:Npn \siunitx_number_output_parts: { \bool_if:nTF { \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_nopar: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:NnN \l_siunitx_number_out_prop { exponent-result } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \prop_if_in:NnT \l_siunitx_number_out_prop { mantissa-result } { \bool_if:NTF \l_siunitx_tight_bool { \tl_set:Nx \l_siunitx_tmpb_tl { { \exp_not:V \l_siunitx_exponent_product_tl } } } { \tl_set:Nx \l_siunitx_tmpb_tl { { } \exp_not:V \l_siunitx_exponent_product_tl { } } } \siunitx_tl_put_left_math:NV \l_siunitx_tmpa_tl \l_siunitx_tmpb_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_nopar: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 } { \siunitx_ensuremath:n { { \pm } } } } { \siunitx_print:nn { number } { \siunitx_ensuremath:n { { } \pm { } } } } \siunitx_number_output_parts_print:n { #1 -uncertainty } } } \cs_new_protected_nopar: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_nopar:Npn \siunitx_number_output_product: { \bool_if:NTF \l_siunitx_product_brackets_bool { \bool_if:nTF { \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_nopar:Npn \siunitx_number_output_product_brackets: { \siunitx_unit_output_pre_print: \siunitx_print:nn { number } { \siunitx_ensuremath:n { \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:nn { number } { \siunitx_ensuremath:n { \l_siunitx_bracket_close_tl } } \siunitx_unit_output_print: } \cs_new_protected_nopar: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 } { \siunitx_ensuremath:n { \l_siunitx_output_product_tl } } } { \siunitx_print:nn { number } { \siunitx_ensuremath:n { { } \l_siunitx_output_product_tl { } } } } \siunitx_number_output_parse:V \l_siunitx_number_next_tl } } } \cs_new_protected_nopar:Npn \siunitx_number_output_quotient: { \use:c { siunitx_number_output_quotient_ \l_siunitx_quotient_mode_tl : } } \cs_new_protected_nopar: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_nopar: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 \siunitx_tl_put_right_math: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_nopar: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_nopar:Npn \siunitx_number_output_quotient_aux_ii: { \siunitx_number_process: \siunitx_number_format: } \cs_new_protected_nopar:Npn \siunitx_number_output_single: { \bool_if:nF { \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_nopar: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_separator_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-separator .tl_set:N = \l_siunitx_angle_unit_separator_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_nopar: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_separator_tl \l_siunitx_angle_unit_separator_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_minte_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:NnN \l_siunitx_number_in_prop { mantissa-sign-deleted } \l_siunitx_tmpa_tl \quark_if_no_value:NF \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_nopar: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_nopar: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_nopar:Npn \siunitx_angle_zero_fill: { \bool_if:nT { \prop_if_empty_p:N \l_siunitx_angle_second_prop && \l_siunitx_angle_second_zero_bool } { \prop_put:Nnn \l_siunitx_angle_second_prop { mantissa } { true } \prop_put:Nnn \l_siunitx_angle_second_prop { mantissa-integer } { 0 } } \bool_if:nT { \prop_if_empty_p:N \l_siunitx_angle_minute_prop && \l_siunitx_angle_minute_zero_bool } { \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_if:nT { \prop_if_empty_p:N \l_siunitx_angle_degree_prop && \l_siunitx_angle_degree_zero_bool } { \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_nopar: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_nopar: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_del: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_nopar:Npn \siunitx_angle_print: { \siunitx_angle_print_aux:nn { degree } { \SIUnitSymbolDegree } \bool_if:NT \l_siunitx_angle_degree_space_bool { \nobreak \siunitx_ensuremath:n { \l_siunitx_angle_arc_separator_tl } } \siunitx_angle_print_aux:nn { minute } { \SIUnitSymbolArcminute } \bool_if:NT \l_siunitx_angle_minute_space_bool { \nobreak \siunitx_ensuremath:n { \l_siunitx_angle_arc_separator_tl } } \siunitx_angle_print_aux:nn { second } { \SIUnitSymbolArcsecond } } \cs_new_protected_nopar: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_nopar: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_nopar:Npn \siunitx_angle_print_astronomy_aux: { \prop_get:NnN \l_siunitx_number_out_prop { mantissa-integer } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \siunitx_print:nV { number } \l_siunitx_tmpa_tl } \hbox_set:Nn \l_siunitx_angle_marker_box { \siunitx_print:nn { number } { \siunitx_ensuremath:n { { \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:NnN \l_siunitx_number_out_prop { mantissa-decimal } \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \siunitx_print:nV { number } \l_siunitx_tmpa_tl } } \cs_new_protected_nopar: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_nopar: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_nopar: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 \siunitx_ensuremath:n { \l_siunitx_angle_arc_separator_tl } } \siunitx_angle_print_direct_aux:nn {#2} { \SIUnitSymbolArcminute } \bool_if:NT \l_siunitx_angle_minute_space_bool { \nobreak \siunitx_ensuremath:n { \l_siunitx_angle_arc_separator_tl } } \siunitx_angle_print_direct_aux:nn {#3} { \SIUnitSymbolArcsecond } } \cs_new_protected_nopar: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 } { \siunitx_ensuremath:n {#1} } \siunitx_unit_output_print: } } \tl_new:N \l_siunitx_declare_list_tl \tl_set:Nn \l_siunitx_declare_list_tl { \of \per \raiseto \tothe } \cs_new_protected:Npn \siunitx_declare_power_after:Nn #1#2 { \tl_put_right:Nn \l_siunitx_declare_list_tl {#1} \cs_set:cpn { siunitx_ \token_to_str:N #1 _literal:w } { \textsuperscript {#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 { \tl_put_right:Nn \l_siunitx_declare_list_tl {#1} \cs_set:cpn { siunitx_ \token_to_str:N #1 _literal:w } ##1 { ##1 \textsuperscript {#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 { \tl_put_right:Nn \l_siunitx_declare_list_tl {#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:n {#2} } { \siunitx_unit_parse_prefix:nn {#3} {#4} } } } \cs_new_protected:Npn \siunitx_declare_qualifier:Nn #1#2 { \tl_put_right:Nn \l_siunitx_declare_list_tl {#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 { \tl_put_right:Nn \l_siunitx_declare_list_tl {#1} \cs_set:cpn { siunitx_ \token_to_str:N #1 _literal:w } {#2} \cs_set: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_if_free:cF { l_siunitx_ \token_to_str:N #1 _options_tl } { \cs_gundefine:c { l_siunitx_ \token_to_str:N #1 _options_tl } } } { \cs_if_free:cT { l_siunitx_ \token_to_str:N #1 _options_tl } { \tl_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 \textsuperscript {#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 { \textsuperscript {#1} } \cs_new_protected:cpn { siunitx_ \token_to_str:N \tothe _function:w } #1 { \siunitx_unit_parse_power_after:n {#1} } \cs_new_protected: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} } \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 } \AtBeginDocument { \bool_if:NTF \l_siunitx_create_free_bool { \siunitx_unit_create_functions: } { \siunitx_unit_create_empty_functions: } } \cs_new_protected_nopar:Npn \siunitx_unit_create_empty_functions: { \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_unit_create_empty_functions_aux:N } \cs_new_protected_nopar:Npn \siunitx_unit_create_empty_functions_aux:N #1 { \cs_if_free:NT #1 { \cs_set_protected_nopar:Npn #1 { \ERROR } } } \cs_new_protected_nopar:Npn \siunitx_unit_create_functions: { \bool_if:NT \l_siunitx_create_overwrite_bool { \tl_map_function:NN \l_siunitx_declare_list_tl \cs_gundefine:N } \bool_if:NTF \l_siunitx_create_optional_bool { \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_unit_create_with_arg:N } { \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_unit_create:N } \bool_if:NT \l_siunitx_create_xspace_bool { \RequirePackage { xspace } } } \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 { \siunitx_ensuremath:n { \l_siunitx_number_unit_separator_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 { \siunitx_ensuremath:n { \l_siunitx_number_unit_separator_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_nopar: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 } \tl_put_right:Nn \document { \siunitx_protect_symbols:N \fg } \cs_new_protected_nopar:Npn \siunitx_protect_symbols:N #1 { \cs_if_exist:NT #1 { \siunitx_cs_if_macro:NT #1 { \cs_set_protected_nopar: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} { \bool_if:NTF \l_siunitx_unit_forbid_literal_bool { \msg_error:nnx { siunitx } { literal-unit } {#1} } { \siunitx_unit_format_literal:n {#1} } } { \cs_set_eq:NN \siunitx_pm: \pm \siunitx_unit_parse:nn {#1} {#2} \siunitx_unit_format: \cs_set_eq:NN \pm \siunitx_pm: } } } { \siunitx_unit_format_literal:n {#1} } } \cs_generate_variant:Nn \siunitx_unit_in:nn { V } \cs_new_nopar:Npn \siunitx_pm: { } \cs_new_protected:Npn \siunitx_unit_if_literal:nTF #1#2#3 { \group_begin: \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_unit_if_literal_aux:N \cs_set_eq:NN \of \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_empty:NTF \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 \bool_new:N \l_siunitx_per_bool \keys_define:nn { siunitx } { 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_nopar: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 \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_unit_parse_init_aux:N } \cs_new_protected:Npn \siunitx_unit_parse_init_aux:N #1 { \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:n #1 { \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} } \cs_new_protected:Npn \siunitx_unit_parse_prefix:nn #1#2 { \siunitx_unit_parse_prefix:n {#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_nopar: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_nopar: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_unit:Nn #1#2 { \tl_set:Nx \l_siunitx_tmpa_tl { prefix- \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_nopar: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_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-separator .tl_set:N = \l_siunitx_unit_separator_tl , 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 / 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 } }, } \keys_set:nn { siunitx } { bracket-unit-denominator = true, inter-unit-separator = \,, per-mode = reciprocal, per-symbol = /, power-font = number, qualifier-mode = subscript } \cs_new_protected_nopar:Npn \siunitx_unit_format: { \siunitx_unit_format_init: \int_compare:nNnT { \l_siunitx_unit_int } = { 1 } { \str_if_eq:VnT \l_siunitx_per_mode_tl { symbol } { \prop_if_in:NnT \l_siunitx_unit_prop { per-1 } { \bool_set_true:N \l_siunitx_omit_unit_space_bool } } } \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_nopar: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_nopar: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 { \siunitx_tl_put_right_math:NV \l_siunitx_unit_current_tl \l_siunitx_unit_separator_tl } } { \siunitx_tl_put_right_math:NV \l_siunitx_unit_current_tl \l_siunitx_unit_separator_tl } } \tl_put_left:cV { l_siunitx_unit #1 _tl } \l_siunitx_unit_current_tl } \cs_new_protected_nopar:Npn \siunitx_unit_format_fraction: { \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_nopar: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_nopar: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_nopar: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 { \siunitx_tl_put_left_math:NV \l_siunitx_unit_denominator_tl \l_siunitx_bracket_open_tl \siunitx_tl_put_right_math:NV \l_siunitx_unit_denominator_tl \l_siunitx_bracket_close_tl } } \tl_set_eq:NN \l_siunitx_unit_tl \l_siunitx_unit_numerator_tl \siunitx_tl_put_right_math: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_nopar:Npn \siunitx_unit_format_fraction_symbol_aux: { } \cs_new_protected_nopar: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_nopar: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 \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_unit_print_literal_aux:N } \char_make_active:N \~ \cs_new_protected:Npn \siunitx_unit_format_literal:n #1 { \int_zero:N \l_siunitx_unit_prefix_int \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_unit_print_literal_aux:N \tl_set:Nn \l_siunitx_unit_tl {#1} \tl_set:Nx \l_siunitx_tmpa_tl { \exp_not:N \siunitx_ensuremath:n { \exp_not:V \l_siunitx_unit_separator_tl } } \tl_replace_all_in:NnV \l_siunitx_unit_tl { . } \l_siunitx_tmpa_tl \tl_replace_all_in:NnV \l_siunitx_unit_tl { ~ } \l_siunitx_tmpa_tl \siunitx_unit_format_literal_extras: } \cs_new_protected:Npn \siunitx_unit_print_literal_aux:N #1 { \cs_set_eq:Nc #1 { siunitx_ \token_to_str:N #1 _literal:w } } \char_make_space:N \~ \cs_new_protected_nopar: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_nopar:Npn \siunitx_unit_format_literal_extras_aux:nN #1#2 { \char_set_lccode:nn { `\@ } {#1} \tl_to_lowercase:n { \tl_replace_all_in:NnV \l_siunitx_unit_tl { @ } \l_siunitx_unit_tl } } \xetex_if_engine:F { \luatex_if_engine:F { \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_nopar:Npn \siunitx_unit_format_power: { \tl_set:Nx \l_siunitx_tmpa_tl { power- \int_use:N \l_siunitx_unit_int } \prop_get:NVN \l_siunitx_unit_prop \l_siunitx_tmpa_tl \l_siunitx_tmpa_tl \quark_if_no_value:NTF \l_siunitx_tmpa_tl { \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: } } { \siunitx_unit_format_power_aux: } } \cs_new_protected_nopar: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 { ^ { \siunitx_unit_format_power_aux:n { \exp_not:V \l_siunitx_tmpa_tl } } } } } \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_in:Nnn \l_siunitx_tmpa_tl { - } { \text { \c_siunitx_minus_tl } } \siunitx_print:nV {#1} \l_siunitx_tmpa_tl } } \cs_new_protected_nopar: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 { \siunitx_tl_put_left_math:NV \l_siunitx_unit_current_tl \l_siunitx_bracket_open_tl \siunitx_tl_put_right_math:NV \l_siunitx_unit_current_tl \l_siunitx_bracket_close_tl } } \cs_new_protected_nopar: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_last_unbraced:NV \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop } { \tl_put_left:Nn \l_siunitx_tmpa_tl { - } } } } } \cs_new_protected_nopar: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 { \siunitx_tl_put_left_math:NV \l_siunitx_unit_current_tl \l_siunitx_per_symbol_tl } } \cs_new_protected_nopar:Npn \siunitx_unit_format_prefix: { \tl_set:Nx \l_siunitx_tmpa_tl { prefix- \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_nopar: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_nopar:Npn \siunitx_unit_format_prefix_number_calc: { \tl_set:Nx \l_siunitx_tmpa_tl { power- \int_use:N \l_siunitx_unit_int } \prop_get:NVN \l_siunitx_unit_prop \l_siunitx_tmpa_tl \l_siunitx_tmpa_tl \quark_if_no_value:NT \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_nopar:Npn \siunitx_unit_format_prefix_symbol: { \tl_set_eq:NN \l_siunitx_unit_current_tl \l_siunitx_unit_prefix_current_tl } \cs_new_protected_nopar:Npn \siunitx_unit_format_qualifier: { \tl_set:Nx \l_siunitx_tmpa_tl { qualifier- \int_use:N \l_siunitx_unit_int } \prop_get:NVN \l_siunitx_unit_prop \l_siunitx_tmpa_tl \l_siunitx_tmpa_tl \quark_if_no_value:NF \l_siunitx_tmpa_tl { \use:c { siunitx_unit_format_qualifier_ \l_siunitx_qualifier_mode_tl : } } } \cs_new_protected_nopar:Npn \siunitx_unit_format_qualifier_brackets: { \siunitx_tl_put_right_math:NV \l_siunitx_unit_current_tl \l_siunitx_bracket_open_tl \tl_put_right:NV \l_siunitx_unit_current_tl \l_siunitx_tmpa_tl \siunitx_tl_put_right_math:NV \l_siunitx_unit_current_tl \l_siunitx_bracket_close_tl } \char_make_active:N \~ \cs_new_protected_nopar: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_make_space:N \~ \group_begin: \char_set_lccode:nn { `\@ } { `\_ } \char_make_math_subscript:N \@ \tl_to_lowercase:n { \group_end: \cs_set_protected_nopar:Npn \siunitx_unit_format_qualifier_subscript: { \tl_put_right:Nx \l_siunitx_unit_current_tl { @ { \exp_not:V \l_siunitx_tmpa_tl } } } } \cs_new_protected_nopar:Npn \siunitx_unit_format_qualifier_text: { \tl_put_right:NV \l_siunitx_unit_current_tl \l_siunitx_tmpa_tl } \cs_new_protected_nopar:Npn \siunitx_unit_format_sorted: { \tl_set_eq:NN \l_siunitx_unit_tl \l_siunitx_unit_numerator_tl \tl_if_empty:NF \l_siunitx_unit_tl { \tl_if_empty:NF \l_siunitx_unit_denominator_tl { \siunitx_tl_put_right_math:NV \l_siunitx_unit_tl \l_siunitx_unit_separator_tl } } \tl_put_right:NV \l_siunitx_unit_tl \l_siunitx_unit_denominator_tl } \cs_new_protected_nopar:Npn \siunitx_unit_format_symbol: { \tl_set:Nx \l_siunitx_tmpa_tl { symbol- \int_use:N \l_siunitx_unit_int } \prop_get:NVN \l_siunitx_unit_prop \l_siunitx_tmpa_tl \l_siunitx_tmpa_tl \quark_if_no_value:NTF \l_siunitx_tmpa_tl { \siunitx_unit_format_symbol_aux: } { \tl_put_right:NV \l_siunitx_unit_current_tl \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_unit_format_symbol_aux: { \msg_error:nn { siunitx } { prefix-only } } \cs_new_protected_nopar:Npn \siunitx_unit_format_symbol_aux_alt: { \int_compare:nNnTF { \l_siunitx_unit_int } = { 1 } { \prop_del:Nn \l_siunitx_unit_prop { prefix-1 } \prop_del:Nn \l_siunitx_unit_prop { prefix-base-1 } \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_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-separator .tl_set:N = \l_siunitx_number_unit_separator_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-separator = \,, 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:nNnF { \l_siunitx_unit_prefix_int } = { 0 } { \tl_set:Nx \l_siunitx_tmpa_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 \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_nopar: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 { \ensuremath { \tex_mathchoice:D { \l_siunitx_number_unit_separator_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_nopar:Npn \siunitx_unit_output_number_sep_aux: { \bool_if:NF \l_siunitx_omit_unit_space_bool { \siunitx_ensuremath:n { \l_siunitx_number_unit_separator_tl } } } \cs_new_protected_nopar: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_nopar: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 } } \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 } { \siunitx_unit_in:nn {#3} {#1} \cs_set_eq: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 } { \siunitx_ensuremath:n {#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_in: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-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-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 { \tl_clear:N \l_siunitx_list_tl \tl_clear:N \l_siunitx_list_current_tl \tl_map_function:nN {#1} \siunitx_list_numbers_aux_ii:n \tl_put_right:NV \l_siunitx_list_tl \l_siunitx_list_separator_final_tl \tl_put_right:NV \l_siunitx_list_tl \l_siunitx_list_current_tl \tl_use:N \l_siunitx_list_tl } \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_units:nnn #1#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_list_brackets_bool { \siunitx_print:nn { number } { \siunitx_ensuremath:n { \l_siunitx_bracket_open_tl } } } \siunitx_list_numbers:n {#1} \bool_if:NT \l_siunitx_list_brackets_bool { \siunitx_print:nn { number } { \siunitx_ensuremath:n { \l_siunitx_bracket_close_tl } } } \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} \tl_use:N \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 { \bool_if:NTF \l_siunitx_range_repeat_bool { \siunitx_unit_in:nn {#1} {#2} \siunitx_range_numbers_aux:n {#3} \text { \l_siunitx_range_phrase_tl } \siunitx_range_numbers_aux:n {#4} } { \bool_if:NT \l_siunitx_range_brackets_bool { \siunitx_print:nn { number } { \siunitx_ensuremath:n { \l_siunitx_bracket_open_tl } } } \siunitx_range_numbers:nn {#3} {#4} \bool_if:NT \l_siunitx_range_brackets_bool { \siunitx_print:nn { number } { \siunitx_ensuremath:n { \l_siunitx_bracket_close_tl } } } \siunitx_unit_output_number_sep: \siunitx_unit_output:nn {#1} {#2} } } \AtBeginDocument { \@ifpackageloaded { cellspace } { \newcolumntype { C } [1] { > { \bcolumn #1 \@nil } #1 < { \ecolumn } } \cs_set:Npn \siunitx_tmp:w #1 \NC@do S #2 \q_stop { \toks_set:Nn \NC@list { #1 #2 } } \exp_last_unbraced:NV \siunitx_tmp:w \NC@list \q_stop \cs_gundefine:N \NC@find@S } { } } \cs_new_protected_nopar:Npn \siunitx_table_rewrite_create:N #1 { \tl_set:Nn \l_siunitx_tmpa_tl { \NC@do #1 } \tl_put_right:NV \l_siunitx_tmpa_tl \NC@list \newcolumntype {#1} { } \toks_set:NV \NC@list \l_siunitx_tmpa_tl \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [1] [ ] { \toks_put_right:Nn \@temptokena { > { \siunitx_table_collect_begin:Nn #1 {##1} } c < { \siunitx_table_print: } } \NC@find } } \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} \use:c { siunitx_table_collect_begin_ #1 : } } \cs_new_protected_nopar: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_nopar: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: \bool_if:NTF \l_siunitx_number_parse_bool { \siunitx_table_collect_get: } { \siunitx_table_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_nopar:Npx \siunitx_table_collect_next: { \exp_not:N \siunitx_table_collect_get: \exp_not:V #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_shift: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_nopar:Npn \siunitx_table_collect_get: { \cs_set_eq:NN \siunitx_table_collect_next: \siunitx_table_collect_get: \cs_set_nopar:Npn \peek_execute_branches: { \if_catcode:w \exp_not:N \l_peek_token \c_group_begin_token \exp_after:wN \siunitx_table_collect_braced:n \else: \exp_after:wN \siunitx_table_collect_not_braced:N \fi: } \peek_after:NN \peek_ignore_spaces_execute_branches: } \cs_new_protected_nopar: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_nopar:Npn \siunitx_table_collect_init_s: { \siunitx_table_collect_init: \bool_set_false:N \l_siunitx_table_collect_pre_bool \cs_set:Npn \siunitx_table_collect_braced:n ##1 { \tl_put_right:Nn \l_siunitx_table_collect_tl { {##1} } \siunitx_table_collect_next: } } \cs_new_protected_nopar: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: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_nopar:Npn \siunitx_table_collect_next: { } \cs_new_protected_nopar: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_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: } \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 \end \endtabular \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: } { \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_new:N \c_siunitx_one_fill_skip \skip_set:Nn \c_siunitx_one_fill_skip { \c_zero_skip plus 1 fill } \skip_new:N \c_siunitx_table_correction_skip \AtBeginDocument { \@ifpackageloaded { colortbl } { \skip_set:Nn \c_siunitx_table_correction_skip { \c_zero_skip plus -0.5 fill } } { \skip_set:Nn \c_siunitx_table_correction_skip { \c_zero_skip } } } \cs_new_protected_nopar:Npn \siunitx_table_colortbl_correction: { \skip_horizontal:n { \c_siunitx_table_correction_skip } \tex_kern:D \c_zero_skip } \cs_new_protected_nopar:Npn \siunitx_table_align_left:n #1 { \siunitx_table_colortbl_correction: \skip_horizontal:n {#1} \tex_kern:D \c_zero_skip } \cs_new_protected_nopar: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: } \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 { \c_zero_skip plus 0.5 fill } }, 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 { \c_zero_skip plus 1 fill } }, } \keys_set:nn { siunitx } { table-unit-alignment = center } \cs_new_protected_nopar:Npn \siunitx_table_print_s: { \siunitx_table_align_left:n { \l_siunitx_table_unit_align_skip } \siunitx_unit_output:Vn \l_siunitx_table_collect_tl { } \siunitx_table_align_right:n { \l_siunitx_table_unit_align_skip } } \bool_new:N \l_siunitx_table_center_decimal_bool \box_new:N \l_siunitx_table_fill_box \dim_new:N \l_siunitx_table_fill_dim \box_new:N \l_siunitx_table_pre_box \box_new:N \l_siunitx_table_post_box \box_new:N \l_siunitx_table_result_box \dim_new:N \l_siunitx_table_comparator_dim \dim_new:N \l_siunitx_table_decimal_dim \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_gap_dim \prop_new:N \l_siunitx_table_model_prop \dim_new:N \l_siunitx_table_space_dim \skip_new:N \l_siunitx_table_number_align_skip \skip_new:N \l_siunitx_table_text_align_skip \keys_define:nn { siunitx } { table-align-exponent .bool_set:N = \l_siunitx_table_align_exp_bool, table-align-text-post .bool_set:N = \l_siunitx_table_align_post_bool, table-align-uncertainty .bool_set:N = \l_siunitx_table_align_uncert_bool, table-number-alignment .choice:, table-number-alignment / center .code:n = { \skip_set:Nn \l_siunitx_table_number_align_skip { \c_zero_skip plus 0.5 fill } \bool_set_false:N \l_siunitx_table_center_decimal_bool }, table-number-alignment / center-decimal-marker .code:n = { \skip_set:Nn \l_siunitx_table_number_align_skip { \c_zero_skip plus 0.5 fill } \bool_set_true:N \l_siunitx_table_center_decimal_bool }, table-number-alignment / left .code:n = { \skip_set:Nn \l_siunitx_table_number_align_skip { \c_zero_skip } \bool_set_false:N \l_siunitx_table_center_decimal_bool }, table-number-alignment / right .code:n = { \skip_set:Nn \l_siunitx_table_number_align_skip { \c_zero_skip plus 1 fill } \bool_set_false:N \l_siunitx_table_center_decimal_bool }, table-omit-exponent .bool_set:N = \l_siunitx_table_omit_exp_bool , table-text-alignment .choice:, table-text-alignment / center .code:n = { \skip_set:Nn \l_siunitx_table_text_align_skip { \c_zero_skip plus 0.5 fill } }, table-text-alignment / left .code:n = { \skip_set:Nn \l_siunitx_table_text_align_skip { \c_zero_skip } }, table-text-alignment / right .code:n = { \skip_set:Nn \l_siunitx_table_text_align_skip { \c_zero_skip plus 1 fill } }, table-auto-round .bool_set:N = \l_siunitx_table_auto_bool, table-comparator .bool_set:N = \l_siunitx_table_comparator_bool, table-figures-decimal .int_set:N = \l_siunitx_table_decimal_int, table-figures-exponent .int_set:N = \l_siunitx_table_exponent_int, table-figures-integer .int_set:N = \l_siunitx_table_integer_int, table-figures-uncertainty .int_set:N = \l_siunitx_table_uncert_int , 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 .bool_set:N = \l_siunitx_table_sign_exponent_bool, table-sign-mantissa .bool_set:N = \l_siunitx_table_sign_mantissa_bool } \keys_set:nn { siunitx } { table-align-exponent = true, table-align-text-post = true, table-align-uncertainty = true, table-number-alignment = center-decimal-marker, table-text-alignment = center, table-figures-decimal = 2, table-figures-integer = 3 } \keys_define:nn { siunitx } { table-alignment .meta:n = { table-number-alignment = #1, table-text-alignment = #1, table-unit-alignment = #1 } } \cs_new_protected_nopar:Npn \siunitx_table_format_convert:nn #1#2 { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \quark_if_no_value:NTF \l_siunitx_tmpa_tl { \int_set:cn { l_siunitx_table_ #2 _int } { 0 } } { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \int_set:cn { l_siunitx_table_ #2 _int } { \l_siunitx_tmpa_tl } } } \keys_define:nn { siunitx } { table-format .code:n = { \siunitx_number_in_parse:n {#1} \siunitx_table_format_convert:nn { mantissa-integer } { integer } \siunitx_table_format_convert:nn { mantissa-decimal } { decimal } \siunitx_table_format_convert:nn { mantissa-uncertainty } { uncert } \siunitx_table_format_convert:nn { exponent-integer } { exponent } \prop_if_in:NnTF \l_siunitx_number_in_prop { comparator } { \bool_set_true:N \l_siunitx_table_comparator_bool } { \bool_set_false:N \l_siunitx_table_comparator_bool } \prop_if_in:NnTF \l_siunitx_number_in_prop { mantissa-sign } { \bool_set_true:N \l_siunitx_table_sign_mantissa_bool } { \bool_set_false:N \l_siunitx_table_sign_mantissa_bool } \prop_if_in:NnTF \l_siunitx_number_in_prop { exponent-sign } { \bool_set_true:N \l_siunitx_table_sign_exponent_bool } { \bool_set_false:N \l_siunitx_table_sign_exponent_bool } \keys_set:nn { siunitx } { table-number-alignment = center } }, } \cs_new_protected_nopar:Npn \siunitx_table_print_S: { \bool_if:NTF \l_siunitx_table_collect_pre_bool { \siunitx_table_align_left:n { \l_siunitx_table_text_align_skip } \tl_use:N \l_siunitx_table_collect_pre_tl \siunitx_table_align_right:n { \l_siunitx_table_text_align_skip } } { \siunitx_table_align_left:n { \l_siunitx_table_number_align_skip } \siunitx_table_print_S_aux: \siunitx_table_align_right:n { \l_siunitx_table_number_align_skip } } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_aux: { \bool_if:NTF \l_siunitx_table_parse_only_bool { \tl_use:N \l_siunitx_table_collect_pre_tl \siunitx_number_output:V \l_siunitx_table_collect_tl \tl_use:N \l_siunitx_table_collect_post_tl } { \bool_if:NTF \l_siunitx_table_center_decimal_bool { \siunitx_table_print_S_centered: } { \siunitx_table_print_S_reserved: } } } \cs_new_protected_nopar: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:NT \l_siunitx_table_omit_exp_bool { \bool_set_true:N \l_siunitx_process_fixed_bool } \siunitx_number_process: \bool_if:NT \l_siunitx_table_omit_exp_bool { \prop_del:Nn \l_siunitx_number_in_prop { exponent } \prop_del:Nn \l_siunitx_number_in_prop { exponent-integer } } \siunitx_number_format: \siunitx_number_output_color: } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_centered: { \siunitx_table_print_S_centered_ends: \dim_compare:nNnTF { \box_wd:N \l_siunitx_table_pre_box } = { \c_zero_skip } { \tl_use:N \l_siunitx_table_collect_pre_tl } { \box_use:N \l_siunitx_table_pre_box } \bool_if:NT \l_siunitx_table_math_bool { \c_math_shift_token } \siunitx_table_print_S_parse: \siunitx_table_print_S_measure:Nnn \l_siunitx_number_out_prop { integer } { mantissa } \siunitx_table_print_S_measure:Nnn \l_siunitx_number_out_prop { marker } { mantissa } \siunitx_table_print_S_measure:Nnn \l_siunitx_number_out_prop { result } { } \box_set_eq:NN \l_siunitx_table_result_box \l_siunitx_tmp_box \dim_set:Nn \l_siunitx_table_fill_dim { \l_siunitx_table_result_dim - \l_siunitx_table_integer_dim } \prop_if_in:NnT \l_siunitx_number_out_prop { mantissa-decimal-marker } { \dim_set:Nn \l_siunitx_table_fill_dim { \l_siunitx_table_fill_dim - \l_siunitx_table_marker_dim } } \dim_compare:nNnTF { \l_siunitx_table_integer_dim } > { \l_siunitx_table_fill_dim } { \siunitx_table_print_S_centered_integer: } { \siunitx_table_print_S_centered_decimal: } \bool_if:NT \l_siunitx_table_math_bool { \c_math_shift_token } \bool_if:NTF \l_siunitx_table_align_post_bool { \box_use:N \l_siunitx_table_post_box } { \dim_set:Nn \l_siunitx_table_fill_dim { - \dim_use:N \l_siunitx_table_fill_dim } \skip_horizontal:N \l_siunitx_table_fill_dim \box_use:N \l_siunitx_table_post_box \box_use:N \l_siunitx_table_fill_box } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_centered_ends: { \hbox_set:Nn \l_siunitx_table_pre_box { { \tl_use:N \l_siunitx_table_collect_pre_tl \bool_if:NT \l_siunitx_table_math_bool { \scan_stop: \c_math_shift_token } } } \hbox_set:Nn \l_siunitx_table_post_box { \bool_if:NT \l_siunitx_table_math_bool { \c_math_shift_token \scan_stop: } \tl_use:N \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_nopar:Npn \siunitx_table_print_S_centered_integer: { \dim_set:Nn \l_siunitx_table_fill_dim { \l_siunitx_table_integer_dim - \l_siunitx_table_fill_dim } \hbox_set_to_wd:Nnn \l_siunitx_table_fill_box { \l_siunitx_table_fill_dim } { \tex_hfil:D } \box_use:N \l_siunitx_table_result_box \box_use:N \l_siunitx_table_fill_box } \cs_new_protected_nopar:Npn \siunitx_table_print_S_centered_decimal: { \dim_set:Nn \l_siunitx_table_fill_dim { \l_siunitx_table_fill_dim - \l_siunitx_table_integer_dim } \hbox_set_to_wd:Nnn \l_siunitx_table_fill_box { \l_siunitx_table_fill_dim } { \tex_hfil:D } \box_use:N \l_siunitx_table_fill_box \box_use:N \l_siunitx_table_result_box } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved: { \dim_zero:N \l_siunitx_table_gap_dim \dim_zero:N \l_siunitx_table_space_dim \siunitx_table_print_S_reserved_ends: \dim_compare:nNnTF { \box_wd:N \l_siunitx_table_pre_box } = { \c_zero_skip } { \tl_use:N \l_siunitx_table_collect_pre_tl } { \box_use:N \l_siunitx_table_pre_box \bool_if:NT \l_siunitx_table_math_bool { \c_math_shift_token } } \siunitx_table_print_S_model_create: \bool_if:NT \l_siunitx_table_auto_bool { \int_set:Nn \l_siunitx_process_precision_int { \l_siunitx_table_decimal_int } \tl_set:Nn \l_siunitx_round_tl { places } } \siunitx_table_print_S_parse: \bool_if:NTF \l_siunitx_table_comparator_bool { \siunitx_table_print_S_reserved_comparator: } { \prop_if_in:NnT \l_siunitx_number_out_prop { comparator } { \msg_error:nnx { siunitx } { table-partial-number } { a~comparator } } } \int_compare:nNnTF { \l_siunitx_table_integer_int + \l_siunitx_table_decimal_int } > { 0 } { \siunitx_table_print_S_reserved_mantissa: } { \prop_if_in:NnT \l_siunitx_number_out_prop { mantissa-result } { \msg_error:nnx { siunitx } { table-partial-number } { a~mantissa } } } \prop_if_in:NnT \l_siunitx_number_out_prop { complex-result } { \msg_error:nnx { siunitx } { table-partial-number } { a~complex } } \int_compare:nNnTF { \l_siunitx_table_exponent_int } > { 0 } { \siunitx_table_print_S_reserved_exponent: } { \prop_if_in:NnT \l_siunitx_number_out_prop { exponent-result } { \msg_error:nnx { siunitx } { table-partial-number } { an~exponent } } } \bool_if:NT \l_siunitx_table_math_bool { \c_math_shift_token } \bool_if:NTF \l_siunitx_table_align_post_bool { \box_use:N \l_siunitx_table_post_box } { \hbox_set_to_wd:Nnn \l_siunitx_table_fill_box { \dim_use:N \l_siunitx_table_gap_dim } { \tex_hfil:D } \dim_set:Nn \l_siunitx_table_gap_dim { - \dim_use:N \l_siunitx_table_gap_dim } \skip_horizontal:N \l_siunitx_table_gap_dim \box_use:N \l_siunitx_table_post_box \box_use:N \l_siunitx_table_fill_box } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_ends: { \hbox_set:Nn \l_siunitx_tmp_box { \l_siunitx_table_pre_tl \bool_if:NT \l_siunitx_table_math_bool { \scan_stop: \c_math_shift_token } } \hbox_set_to_wd:Nnn \l_siunitx_table_pre_box { \box_wd:N \l_siunitx_tmp_box } { \tex_hfil:D { \tl_use:N \l_siunitx_table_collect_pre_tl } } \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_shift_token \scan_stop: } \tl_use:N \l_siunitx_table_collect_post_tl \tex_hfil:D } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_model_create: { \prop_clear:N \l_siunitx_number_in_prop \bool_if:NT \l_siunitx_table_comparator_bool { \prop_put:Nnn \l_siunitx_number_in_prop { comparator } { \ll } } \siunitx_table_print_S_model_aux:nn { integer } { mantissa-integer } \siunitx_table_print_S_model_aux:nn { decimal } { mantissa-decimal } \siunitx_table_print_S_model_aux:nn { uncert } { mantissa-uncertainty } \siunitx_table_print_S_model_aux:nn { exponent } { exponent-integer } \int_compare:nNnF { \l_siunitx_table_integer_int + \l_siunitx_table_decimal_int } = { 0 } { \prop_put:Nnn \l_siunitx_number_in_prop { mantissa } { true } } \int_compare:nNnT { \l_siunitx_table_decimal_int } > { 0 } { \prop_put:NnV \l_siunitx_number_in_prop { mantissa-decimal-marker } \l_siunitx_output_decimal_tl } \bool_if:NT \l_siunitx_table_sign_mantissa_bool { \prop_put:Nnn \l_siunitx_number_in_prop { mantissa-sign } { - } } \int_compare:nNnT { \l_siunitx_table_exponent_int } > { 0 } { \bool_if:NT \l_siunitx_table_sign_exponent_bool { \prop_put:Nnn \l_siunitx_number_in_prop { exponent-sign } { - } } } \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_set_eq:NN \l_siunitx_table_model_prop \l_siunitx_number_out_prop } \cs_new_protected_nopar:Npn \siunitx_table_print_S_model_aux:nn #1#2 { \tl_set:Nx \l_siunitx_tmpa_tl { \prg_replicate:nn { \int_use:c { l_siunitx_table_ #1 _int } } { 8 } } \tl_if_empty:NF \l_siunitx_tmpa_tl { \prop_put:NnV \l_siunitx_number_in_prop {#2} \l_siunitx_tmpa_tl \prop_put:Nnn \l_siunitx_number_in_prop {#1} { true } } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_comparator: { \siunitx_table_print_S_measure:Nnn \l_siunitx_table_model_prop { comparator } { } \siunitx_table_print_S_get_comparator:Nn \l_siunitx_number_out_prop { } \hbox_set_to_wd:Nnn \l_siunitx_table_result_box { \l_siunitx_table_comparator_dim } { \siunitx_print:nV { number } \l_siunitx_tmpa_tl \tex_hfil:D } \box_use:N \l_siunitx_table_result_box } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_mantissa: { \siunitx_table_print_S_reserved_mantissa_aux:n { mantissa } \siunitx_table_print_S_measure:Nnn \l_siunitx_table_model_prop { mantissa } { } \siunitx_table_print_S_get_mantissa:Nn \l_siunitx_number_out_prop { } \dim_set:Nn \l_siunitx_table_space_dim { \l_siunitx_table_mantissa_dim } \hbox_set:Nn \l_siunitx_table_result_box { \box_use:N \l_siunitx_table_fill_box \siunitx_print:nV { number } \l_siunitx_tmpa_tl } \dim_sub:Nn \l_siunitx_table_space_dim { \box_wd:N \l_siunitx_table_result_box } \hbox_set_to_wd:Nnn \l_siunitx_table_result_box { \l_siunitx_table_mantissa_dim } { \box_use:N \l_siunitx_table_result_box \tex_hfil:D } \box_use:N \l_siunitx_table_result_box \siunitx_table_print_S_reserved_uncert:n { mantissa } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_mantissa_aux:n #1 { \siunitx_table_print_S_measure:Nnn \l_siunitx_table_model_prop { integer } {#1} \siunitx_table_print_S_get_integer:Nn \l_siunitx_number_out_prop {#1} \box_clear:N \l_siunitx_tmp_box \tl_if_empty:NF \l_siunitx_tmpa_tl { \hbox_set:Nn \l_siunitx_tmp_box { \siunitx_print:nV { number } \l_siunitx_tmpa_tl } } \hbox_set_to_wd:Nnn \l_siunitx_table_fill_box { \l_siunitx_table_integer_dim - \box_wd:N \l_siunitx_tmp_box } { \tex_hfil:D } \siunitx_table_print_S_measure:Nnn \l_siunitx_table_model_prop { decimal } {#1} \box_clear:N \l_siunitx_tmp_box \siunitx_table_print_S_get_decimal:Nn \l_siunitx_number_out_prop {#1} \tl_if_empty:NF \l_siunitx_tmpa_tl { \hbox_set:Nn \l_siunitx_tmp_box { \siunitx_print:nV { number } \l_siunitx_tmpa_tl } } \dim_set:Nn \l_siunitx_table_gap_dim { \dim_use:N \l_siunitx_table_decimal_dim - \box_wd:N \l_siunitx_tmp_box } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_uncert:n #1 { \bool_if:NT \l_siunitx_uncert_sep_bool { \int_compare:nNnTF { \l_siunitx_table_uncert_int } > { 0 } { \siunitx_table_print_S_reserved_uncert_aux:n {#1} } { \prop_if_in:NnT \l_siunitx_number_out_prop { #1 -uncertainty } { \msg_error:nn { siunitx } { table-partial-number } { an~uncertainty } } } } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_uncert_aux:n #1 { \siunitx_table_print_S_reserved_uncert_pm:n {#1} \siunitx_table_print_S_reserved_mantissa_aux:n { #1 -uncertainty } \siunitx_table_print_S_measure:Nnn \l_siunitx_table_model_prop { uncert } {#1} \siunitx_table_print_S_get_uncert:Nn \l_siunitx_number_out_prop {#1} \hbox_set_to_wd:Nnn \l_siunitx_table_result_box { \l_siunitx_table_uncert_dim } { \box_use:N \l_siunitx_table_fill_box \siunitx_print:nV { number } \l_siunitx_tmpa_tl \tex_hfil:D } \box_use:N \l_siunitx_table_result_box \bool_if:NF \l_siunitx_table_align_uncert_bool { \tex_hskip:D \l_siunitx_table_space_dim \dim_zero:N \l_siunitx_table_space_dim } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_uncert_pm:n #1 { \tl_clear:N \l_siunitx_tmpb_tl \siunitx_number_format_join_uncert_pm: \tl_set:Nx \l_siunitx_tmpb_tl { { } \exp_not:V \l_siunitx_tmpb_tl { } } \hbox_set:Nn \l_siunitx_table_result_box { \siunitx_print:nV { number } \l_siunitx_tmpb_tl } \prop_if_in:NnF \l_siunitx_number_out_prop { #1 -uncertainty } { \hbox_set_to_wd:Nnn \l_siunitx_table_result_box { \box_wd:N \l_siunitx_table_result_box } { \tex_hfil:D } } \bool_if:NF \l_siunitx_table_align_uncert_bool { \tex_hskip:D -\l_siunitx_table_space_dim } \box_use:N \l_siunitx_table_result_box } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_exponent: { \dim_zero:N \l_siunitx_table_gap_dim \siunitx_table_print_S_reserved_exponent_product: \siunitx_table_print_S_measure:Nnn \l_siunitx_table_model_prop { exponent } { } \siunitx_table_print_S_get_exponent:Nn \l_siunitx_number_out_prop { } \hbox_set_to_wd:Nnn \l_siunitx_table_result_box { \l_siunitx_table_exponent_dim } { \siunitx_print:nV { number } \l_siunitx_tmpa_tl \tex_hfil:D } \box_use:N \l_siunitx_table_result_box \bool_if:NF \l_siunitx_table_align_exp_bool { \tex_hskip:D \l_siunitx_table_space_dim } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_exponent_product: { \tl_clear:N \l_siunitx_tmpa_tl \box_clear:N \l_siunitx_table_result_box \prop_if_in:NnTF \l_siunitx_table_model_prop { mantissa-result } { \siunitx_table_print_S_reserved_exponent_product_aux_i: } { \prop_if_in:NnT \l_siunitx_table_model_prop { complex-result } { \siunitx_table_print_S_reserved_exponent_product_aux_i: } } \bool_if:NF \l_siunitx_table_align_exp_bool { \tex_hskip:D -\l_siunitx_table_space_dim } \box_use:N \l_siunitx_table_result_box } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_exponent_product_aux_i: { \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:V \l_siunitx_tmpa_tl } } } \tl_set:Nx \l_siunitx_tmpa_tl { \exp_not:N \siunitx_ensuremath:n { { } \exp_not:V \l_siunitx_tmpa_tl { } } } \hbox_set:Nn \l_siunitx_table_result_box { \siunitx_print:nV { number } \l_siunitx_tmpa_tl } \prop_if_in:NnTF \l_siunitx_number_out_prop { exponent-result } { \prop_if_in:NnF \l_siunitx_number_out_prop { mantissa-result } { \prop_if_in:NnF \l_siunitx_number_out_prop { complex-result } { \siunitx_table_print_S_reserved_exponent_product_aux_ii: } } } { \siunitx_table_print_S_reserved_exponent_product_aux_ii: } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_reserved_exponent_product_aux_ii: { \hbox_set_to_wd:Nnn \l_siunitx_table_result_box { \box_wd:N \l_siunitx_table_result_box } { \tex_hfil:D } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_measure:Nnn #1#2#3 { \use:c { siunitx_table_print_S_get_ #2 :Nn } #1 {#3} \tl_if_empty:NTF \l_siunitx_tmpa_tl { \dim_set:cn { l_siunitx_table_ #2 _dim } { \c_zero_skip } } { \hbox_set:Nn \l_siunitx_tmp_box { \siunitx_print:nV { number } \l_siunitx_tmpa_tl } \dim_set:cn { l_siunitx_table_ #2 _dim } { \box_wd:N \l_siunitx_tmp_box } } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_get_comparator:Nn #1#2 { \prop_get:NnN #1 { comparator } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_clear:N \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_get_decimal:Nn #1#2 { \prop_get:NnN #1 { #2 -decimal } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_clear:N \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_get_exponent:Nn #1#2 { \prop_get:NnN #1 { exponent-result } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_clear:N \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_get_integer:Nn #1#2 { \prop_get:NnN #1 { #2 -sign } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_clear:N \l_siunitx_tmpa_tl } \prop_get:NnN #1 { #2 -integer } \l_siunitx_tmpb_tl \quark_if_no_value:NT \l_siunitx_tmpb_tl { \tl_clear:N \l_siunitx_tmpb_tl } \tl_put_right:NV \l_siunitx_tmpa_tl \l_siunitx_tmpb_tl } \cs_new_protected_nopar:Npn \siunitx_table_print_S_get_mantissa:Nn #1#2 { \prop_get:NnN #1 { mantissa } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_clear:N \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_get_marker:Nn #1#2 { \tl_set:Nx \l_siunitx_tmpa_tl { \exp_not:N \siunitx_ensuremath:n { \exp_not:V \l_siunitx_output_decimal_tl } } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_get_result:Nn #1#2 { \prop_get:NnN #1 { result } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_clear:N \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_table_print_S_get_uncert:Nn #1#2 { \prop_get:NnN #1 { #2 -uncertainty } \l_siunitx_tmpa_tl \quark_if_no_value:NT \l_siunitx_tmpa_tl { \tl_clear:N \l_siunitx_tmpa_tl } } \cs_new_protected_nopar:Npn \siunitx_table_direct: { \m@th \bool_if:NTF \l_siunitx_table_center_decimal_bool { \siunitx_table_direct_centered: } { \siunitx_table_direct_reserved: } } \char_make_active:N \@ \cs_new_protected_nopar:Npn \siunitx_table_direct_centered: { \cs_set_eq:NN \siunitx_table_print: \siunitx_table_direct_centered_end: \hbox_set:Nn \l_siunitx_tmp_box { \siunitx_ensuremath:n { \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:Nn \l_siunitx_table_pre_box \c_group_begin_token \c_math_shift_token \tl_map_function:NN \l_siunitx_input_decimal_tl \siunitx_table_direct_centered_aux:N } \cs_new_protected_nopar:Npn \siunitx_table_direct_centered_aux:N #1 { \char_set_lccode:nn { `\@ } { `#1 } \char_set_mathcode:nn { `#1 } { 32768 } \tl_to_lowercase:n { \cs_set_nopar:Npn @ } { \c_math_shift_token \c_group_end_token \hbox_set:Nn \l_siunitx_table_post_box \c_group_begin_token \c_math_shift_token \l_siunitx_output_decimal_tl } } \char_make_letter:N \@ \cs_new_protected_nopar:Npn \siunitx_table_direct_centered_end: { \c_math_shift_token \c_group_end_token \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 } \char_make_active:N \@ \cs_new_protected_nopar:Npn \siunitx_table_direct_reserved: { \cs_set_eq:NN \siunitx_table_print: \siunitx_table_direct_reserved_end: \tl_set:Nx \l_siunitx_tmpa_tl { \prg_replicate:nn { \l_siunitx_table_integer_int } { 8 } } \hbox_set:Nn \l_siunitx_tmp_box { \siunitx_ensuremath:n { \bool_if:NT \l_siunitx_table_sign_mantissa_bool { - } \l_siunitx_tmpa_tl } } \dim_set:Nn \l_siunitx_table_integer_dim { \box_wd:N \l_siunitx_tmp_box } \tl_set:Nx \l_siunitx_tmpa_tl { \prg_replicate:nn { \l_siunitx_table_decimal_int } { 8 } } \hbox_set:Nn \l_siunitx_tmp_box { \siunitx_ensuremath:n { \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 } \hbox_set_to_wd:Nnn \l_siunitx_table_pre_box { \l_siunitx_table_integer_dim } \c_group_begin_token \c_math_shift_token \tl_map_function:NN \l_siunitx_input_decimal_tl \siunitx_table_direct_reserved_aux:N \tex_hfill:D } \cs_new_protected_nopar:Npn \siunitx_table_direct_reserved_aux:N #1 { \char_set_lccode:nn { `\@ } { `#1 } \char_set_mathcode:nn { `#1 } { 32768 } \tl_to_lowercase:n { \cs_set_nopar:Npn @ } { \c_math_shift_token \c_group_end_token \hbox_set_to_wd:Nnn \l_siunitx_table_post_box { \box_wd:N \l_siunitx_tmp_box } \c_group_begin_token \c_math_shift_token \l_siunitx_output_decimal_tl } } \char_make_letter:N \@ \cs_new_protected_nopar:Npn \siunitx_table_direct_reserved_end: { \c_math_shift_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_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 { textcomp } { \keys_set:nn { siunitx } { math-degree = \text { \textdegree }, text-degree = \textdegree, } \@ifpackageloaded { mathptmx } { } { \keys_set:nn { siunitx } { text-micro = \textmu } \@ifpackageloaded { fourier } { } { \keys_set:nn { siunitx } { text-ohm = \textohm } } } \str_if_eq:VnT \encodingdefault { OT1 } { \keys_set:nn { siunitx } { math-angstrom = \text { \capitalring { A } }, text-angstrom = \capitalring { A } } } } { } \@ifpackageloaded { upgreek } { \keys_set:nn { siunitx } { math-ohm = \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 = { } ^ { \circ } \kern - \scriptspace \mathrm { C }, math-degree = { } ^ { \circ }, math-micro = \text { \c_siunitx_mu_tl }, math-ohm = \text { \ensuremath { \c_siunitx_omega_tl } }, } \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 = \ensuremath { { } ^ { \circ } \kern - \scriptspace \text { C } }, text-degree = \ensuremath { { } ^ { \circ } }, text-micro = \c_siunitx_mu_tl , text-ohm = \ensuremath { \c_siunitx_omega_tl }, } \cs_new_protected:Npn \siunitx_symbol_new:n #1 { \cs_set_protected_nopar:cpn { SIUnitSymbol #1 } { \mode_if_math:TF { \tl_to_lowercase:n { \use:c { l_siunitx_ #1 _math_tl } } } { \tl_to_lowercase:n { \use:c { l_siunitx_ #1 _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_nopar: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 } } \bool_if:NTF \l_siunitx_group_four_bool { \clist_put_right:Nn \l_siunitx_pgf_link_clist { min~exponent~for~1000~sep = 3 } } { \clist_put_right:Nn \l_siunitx_pgf_link_clist { min~exponent~for~1000~sep = 4 } } \bool_if:nF { \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 } } \group_begin: \cs_set_nopar:Npx \siunitx_tmp:w { \group_end: \exp_not:N \pgfqkeys { /pgf/number~format } { \exp_not:V \l_siunitx_pgf_link_clist } } \siunitx_tmp:w } \msg_set: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_set: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_set:nnnn { siunitx } { duplicate-decimal-token } { Duplicate~decimal~marker~token~'#1'~in~input. } { Only one decimal marker token can appear in a single number. } \msg_set:nnnn { siunitx } { duplicate-exponent-token } { Duplicate~exponent~marker~token~'#1'~in~input. } { Only~one~exponent~marker~token~can~appear~in~a~single~number. } \msg_set:nnnn { siunitx } { duplicate-quotient-token } { Duplicate~quotient~token. } { Only~one~quotient~token~can~appear~in~a~single~number. } \msg_set: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_set:nnnn { siunitx } { empty-arc } { Empty~degree-minute-second~angle. } { The~angle~given~does~not~contain~any~numbers. } \msg_set:nnnn { siunitx } { empty-uncertainty } { Empty~uncertainty~given~in~'#1'. } { The~number~given~contains~an~empty~uncertainty. } \msg_set:nnnn { siunitx } { ending-product-token } { Misplaced~product~token. } { A~number~cannot~end~with~a~product~token. } \msg_set:nnnn { siunitx } { ending-quotient-token } { Misplaced~quotient~token. } { A~number~cannot~end~with~a~quotient~token. } \msg_set: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_set: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_set: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_set: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_set: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_set:nnnn { siunitx } { literal-unit } { Literal~units~disabled. } { You~gave~the~literal~input~'#1'\\ but~literal~unit~output~is~disabled. } \msg_set:nnnn { siunitx } { misplaced-sign-token } { Misplaced~sign~token~'#1'. } { Sign~tokens~can~only~come~at~the~beginning~of~a~number. } \msg_set: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_set: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\\ \c_space_tl \c_space_tl 'input-open-uncertainty'~and~'input-close-uncertainty'\\ options. } \msg_set: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_set:nnn { siunitx } { option-not-available } { Option~'#1'~not~available~in~strict~mode. } \msg_set:nnn { siunitx } { option-preamble-only } { Option~'#1'~only~available~in~the~preamble. } \msg_set: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_set:nnn { siunitx } { prefix-only } { Prefix~with~no~unit. } \msg_set:nnnn { siunitx } { qualifier-before-unit } { Qualifier~before~unit. } { Unit~qualifiers~have~to~follow~after~units,~not~before~them. } \msg_set:nnnn { siunitx } { restricted-number } { Token~'#1'~forbidden~in~restricted~numerical~input. } { The~current~input~must~be~a~real~number~and~cannot~contain: \\ \c_space_tl -~an~exponent; \\ \c_space_tl -~an~uncertainty; \\ \c_space_tl -~a~complex~part. } \msg_set:nnnn { siunitx } { starting-product-token } { Misplaced~product~token. } { A~number~cannot~begin~with~a~product~token. } \msg_set:nnnn { siunitx } { starting-quotient-token } { Misplaced~quotient~token. } { A~number~cannot~begin~with~a~quotient~token. } \msg_set: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_set:nnnn { siunitx } { unknown-configuration-file } { Unknown~configuration~'#1'. } { The~configuration~file~'siunitx-#1.cfg'~was~not~found. } \msg_set:nnnn { siunitx } { unknown-option } { Unknown~option~'#1'. } { The~option~file~'#1'~is~not~known~by~siunitx: \\ perhaps~it~is~spelled~incorrectly. } \msg_set:nnnn { siunitx } { version-1-option } { Version~1~option~'#1'~detected. } { Use: \\ \c_space_tl \c_space_tl \token_to_str:N \usepackage[load-configurations = version-1] \token_to_str:N { siunitx \token_to_str:N } \\ in~the~preamble~to~load~the~appropriate~code. } \cs_new_protected_nopar:Npn \DeclareBinaryPrefix #1#2#3 { \siunitx_declare_prefix:Nnnn #1 {#2} { 2 } {#3} } \cs_new_protected_nopar:Npn \DeclareSIPostPower #1#2 { \siunitx_declare_power_after:Nn #1 {#2} } \cs_new_protected_nopar:Npn \DeclareSIPrefix #1#2#3 { \siunitx_declare_prefix:Nnnn #1 {#2} { 10 } {#3} } \cs_new_protected_nopar:Npn \DeclareSIPrePower #1#2 { \siunitx_declare_power_before:Nn #1 {#2} } \cs_new_protected_nopar:Npn \DeclareSIQualifier #1#2 { \siunitx_declare_qualifier:Nn #1 {#2} } \cs_new_protected_nopar:Npn \DeclareSIUnit #1#2 { \siunitx_declare_unit:Nnn #1 {#2} { } } \cs_new_protected_nopar:Npn \DeclareSIUnitWithOptions #1#2#3 { \siunitx_declare_unit:Nnn #1 {#2} {#3} } \@onlypreamble \DeclareBinaryPrefix \@onlypreamble \DeclareSIPostPower \@onlypreamble \DeclareSIPrefix \@onlypreamble \DeclareSIPrePower \@onlypreamble \DeclareSIQualifier \@onlypreamble \DeclareSIUnit \@onlypreamble \DeclareSIUnitWithOptions \cs_new_protected_nopar: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 } { \group_begin: \IfNoValueF {#1} { \keys_set:nn { siunitx } {#1} } \siunitx_number_output:n {#2} \group_end: } \NewDocumentCommand \numlist { o > { \SplitList { ; } } m } { \group_begin: \IfNoValueF {#1} { \keys_set:nn { siunitx } {#1} } \siunitx_list_numbers:n {#2} \group_end: } \NewDocumentCommand \numrange { o m m } { \group_begin: \IfNoValueF {#1} { \keys_set:nn { siunitx } {#1} } \siunitx_range_numbers:nn {#2} {#3} \group_end: } \NewDocumentCommand \si { o m } { \group_begin: \IfNoValueTF {#1} { \siunitx_unit_output:nn {#2} { } } { \keys_set:nn { siunitx } {#1} \siunitx_unit_output:nn {#2} {#1} } \group_end: } \NewDocumentCommand \SIlist { o > { \SplitList { ; } } m m } { \group_begin: \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 } { \group_begin: \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 } { \group_begin: \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} } \AtBeginDocument { \cs_set:Npn \addtocontents #1#2 { \protected@write \@auxout { \cs_set_eq:NN \label \use_none:n \cs_set_eq:NN \index \use_none:n \cs_set_eq:NN \glossary\use_none:n \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_contents_add:N } { \token_to_str:N \@writefile {#1} {#2} } } } \cs_new_protected_nopar:Npn \siunitx_contents_add:N #1 { \cs_set_nopar:Npn #1 { \token_to_str:N #1 } } \cs_new_protected_nopar:Npn \siunitx_contents_bookmarks: { \tl_map_function:NN \l_siunitx_declare_list_tl \siunitx_unit_print_literal_aux:N \msg_redirect_name:nnn { LaTeX / xparse } { redefine-command } { none } \cs_set_eq:NN \num \siunitx_bookmark_num:w \cs_set_eq:NN \numrange \siunitx_bookmark_numrange:w \cs_set_eq:NN \si \siunitx_bookmark_si:w \cs_set_eq:NN \SI \siunitx_bookmark_SI:w \cs_set_eq:NN \SIrange \siunitx_bookmark_SIrange:w \cs_set_nopar:Npn \SIUnitSymbolAngstrom { \AA } \cs_set_nopar:Npn \SIUnitSymbolArcminute { ' } \cs_set_nopar:Npn \SIUnitSymbolArcsecond { '' } \cs_set_nopar:Npn \SIUnitSymbolCelsius { \textcelsius } \cs_set_nopar:Npn \SIUnitSymbolDegree { \textdegree } \cs_set_nopar:Npn \SIUnitSymbolMicro { \textmu } \cs_set_nopar:Npn \SIUnitSymbolOhm { [ohm] } } \DeclareExpandableDocumentCommand \siunitx_bookmark_num:w { o m } {#2} \DeclareExpandableDocumentCommand \siunitx_bookmark_numrange:w { o m m } { #2 \l_siunitx_range_phrase_tl #3 } \DeclareExpandableDocumentCommand \siunitx_bookmark_si:w { o m } {#2} \DeclareExpandableDocumentCommand \siunitx_bookmark_SI:w { o m o m } { \IfNoValueF {#3} {#3} #2 ~ #4 } \DeclareExpandableDocumentCommand \siunitx_bookmark_SIrange:w { o m m m } { #2 ~ #4 \l_siunitx_range_phrase_tl #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 } \DeclareSIUnitWithOptions \arcmin { \arcminute } { number-unit-separator = } \DeclareSIUnitWithOptions \arcminute { \SIUnitSymbolArcminute } { number-unit-separator = } \DeclareSIUnitWithOptions \arcsecond { \SIUnitSymbolArcsecond } { number-unit-separator = } \DeclareSIUnit \day { d } \DeclareSIUnitWithOptions \degree { \SIUnitSymbolDegree } { number-unit-separator = } \DeclareSIUnit \hectare { ha } \DeclareSIUnit \hour { h } \DeclareSIUnit \litre { l } \DeclareSIUnit \liter { L } \DeclareSIUnit \minute { min } \DeclareSIUnit \percent { \char 37 } \DeclareSIUnit \tonne { t } \DeclareSIUnit \astronomicalunit { ua } \DeclareSIUnit \atomicmassunit { u } \DeclareSIUnit \electronvolt { eV } \DeclareSIUnit \dalton { Da } \group_begin: \char_set_lccode:nn { `\@ } { `\_ } \char_make_math_subscript:N \@ \tl_to_lowercase:n { \group_end: \DeclareSIUnit \clight { \text { \ensuremath { c @ { 0 } } } } \DeclareSIUnit \electronmass { \text { \ensuremath { m @ { \text { e } } } } } } \DeclareSIUnit \planckbar { \text { \ensuremath { \hbar } } } \DeclareSIUnit \elementarycharge { \text { \ensuremath { e } } } \group_begin: \char_set_lccode:nn { `\@ } { `\_ } \char_set_lccode:nn { `\E } { `\E } \char_make_math_subscript:N \@ \tl_to_lowercase:n { \group_end: \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-mode = false, detect-shape = false, detect-weight = false, multi-part-units = bracket, parse-numbers = true, parse-units = true, product-units = repeat, } \siunitx_strict_option:n { bracket-numbers , 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_nopar:Npn \siunitx_strict_option:n #1 { \clist_map_function:nN {#1} \siunitx_strict_option_aux:n } \cs_new_protected_nopar: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 = \cdot , inter-unit-separator = { \, } , output-decimal-marker = { , } , }, locale / FR .meta:n = { exponent-product = \times , inter-unit-separator = { \, } , output-decimal-marker = { , } , }, locale / UK .meta:n = { exponent-product = \times , inter-unit-separator = \, , output-decimal-marker = . , }, locale / US .meta:n = { locale = UK }, locale / USA .meta:n = { locale = UK }, locale / ZA .meta:n = { exponent-product = \times , inter-unit-separator = \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 } \sisetup { list-final-separator = { ~ \translate { and } ~ }, range-phrase = { ~ \translate { to~(numerical~range) } ~ }, } } \keys_define:nn { siunitx } { load-configurations .code:n = { \siunitx_load_configuration:n {#1} } } \cs_new_protected:Npn \siunitx_load_configuration:n #1 { \tl_set_rescan:Nnn \l_siunitx_tmpa_tl { \char_make_ignore:N \ } {#1} \clist_map_function:NN \l_siunitx_tmpa_tl \siunitx_load_configuration_aux:n } \cs_new_protected:Npn \siunitx_load_configuration_aux:n #1 { \tl_if_empty:nF {#1} { \file_if_exist:nTF { siunitx- #1 . \c_siunitx_configuration_ext_tl } { \@onefilewithoptions { siunitx- #1 } [ ] [ ] \c_siunitx_configuration_ext_tl } { \msg_error:nnx { siunitx } { unknown-configuration-file } {#1} } } } \tl_new:N \c_siunitx_configuration_ext_tl \tl_set:Nn \c_siunitx_configuration_ext_tl { cfg } \file_if_exist:nT { siunitx . \c_siunitx_configuration_ext_tl } { \@onefilewithoptions { siunitx } [ ] [ ] \c_siunitx_configuration_ext_tl } \ProcessKeysOptions { siunitx } %% %% Copyright (C) 2008-2011 by %% Joseph Wright %% %% It may be distributed and/or modified under the conditions of %% the LaTeX Project Public License (LPPL), either version 1.3c of %% this license or (at your option) any later version. The latest %% version of this license is in the file: %% %% http://www.latex-project.org/lppl.txt %% %% This work is "maintained" (as per LPPL maintenance status) by %% Joseph Wright. %% %% This work consists of the file siunitx.dtx %% and the derived files siunitx.pdf, %% siunitx.sty and %% siunitx.ins. %% %% %% End of file `siunitx.sty'.