%% %% 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} \GetIdInfo$Id: siunitx.dtx 182 2009-11-23 06:58:25Z josephwright $ {A comprehensive (SI) units package} \ProvidesExplPackage {\filename}{\filedate}{\fileversion}{\filedescription} \msg_new:nnnn { siunitx } { incompatible-package } {Package `#1' incompatible.} {% The #1 package and siunitx are incompatible.\\% Use the `emulate=#1' package option when loading siunitx.% } \cs_new_nopar:Npn \siunitx_load_check: { \clist_map_function:nN { SIunits, sistyle, siunits, SIstyle } \siunitx_load_check_aux:n } \cs_new_nopar:Npn \siunitx_load_check_aux: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_aux:n \AtBeginDocument { \siunitx_load_check: } \RequirePackage{ amstext, array, xparse } \cs_new:Npn \siunitx_tmp:w { } \bool_new:N \l_siunitx_tmp_bool \int_new:N \l_siunitx_tmp_int \tl_new:N \l_siunitx_tmpa_tl \bool_new:N \l_siunitx_error_bool \cs_new:Npn \siunitx_error:nxx #1#2#3 { \bool_set_true:N \l_siunitx_error_bool \msg_error:nnxx { siunitx } {#1} {#2} {#3} } \cs_new:Npn \siunitx_error:nx #1#2 { \siunitx_error:nxx {#1} {#2} { } } \cs_new:Npn \siunitx_error:n #1 { \siunitx_error:nxx {#1} { } { } } \cs_new_nopar:Npn \siunitx_encoding_ts_one: { \cs_if_free:cT { T@TS1 } { \DeclareFontEncoding { TS1 } { } { } \DeclareFontSubstitution { TS1 } { cmr } { m } { n } } } \AtBeginDocument { \siunitx_encoding_ts_one: } \DeclareTextSymbolDefault \c_siunitx_minus_tl { TS1 } \DeclareTextSymbol \c_siunitx_minus_tl { TS1 } { 61 } \DeclareTextSymbol \c_siunitx_mu_tl { TS1 } { 181 } \DeclareTextSymbolDefault \c_siunitx_mu_tl { TS1 } \tl_new:Nn \c_siunitx_omega_tl { \Omega } \cs_new_nopar:Npn \siunitx_check_omega: { \cs_if_exist:NT \upOmega { \tl_set:Nn \c_siunitx_omega_tl { \upOmega } } } \AtBeginDocument { \siunitx_check_omega: } \cs_new:Npn \siunitx_tl_put_left_maths:Nn #1#2 { \tl_put_left:Nn #1 { \ensuremath {#2} } } \cs_generate_variant:Nn \siunitx_tl_put_left_maths:Nn { NV, cV } \cs_new:Npn \siunitx_tl_put_right_maths:Nn #1#2 { \tl_put_right:Nn #1 { \ensuremath {#2} } } \cs_generate_variant:Nn \siunitx_tl_put_right_maths:Nn { NV, cV } \clist_new:N \l_siunitx_option_deactivate_clist \cs_new_nopar:Npn \siunitx_option_deactivate:n #1 { \clist_put_right:Nn \l_siunitx_option_deactivate_clist {#1} } \cs_new_nopar:Npn \siunitx_options_deactivate: { \clist_map_function:NN \l_siunitx_option_deactivate_clist \siunitx_options_deactivate_aux:n } \cs_new_nopar:Npn \siunitx_options_deactivate_aux:n #1 { \keys_define:nn { siunitx } { #1 .code:n = { \msg_warning:nnx { siunitx } { option-preamble-only } {#1} } } } \AtBeginDocument { \siunitx_options_deactivate: } \cs_generate_variant:Nn \tl_put_right:Nn { cv } \cs_generate_variant:Nn \tl_if_eq:nnTF { nv } \cs_generate_variant:Nn \tl_replace_all_in:Nnn { NnV } \cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV } \group_begin: \tl_map_inline:nn { \M \A \C \R \O } { \char_set_catcode:nn { `#1 } { \c_twelve } } \tl_map_inline:nn { \F \N \T } { \char_set_lccode:nn { `#1 } { `#1 } } \tl_to_lowercase:n { \group_end: \prg_new_conditional:Nnn \siunitx_if_tl:N { TF } { \exp_after:wN \siunitx_if_tl_aux:w \token_to_meaning:N #1 MACRO \q_nil } \cs_new_nopar:Npn \siunitx_if_tl_aux:w #1 MACRO #2 \q_nil { \tl_if_empty:nTF {#1} { \prg_return_true: } { \prg_return_false: } } } \cs_new_nopar:Npn \siunitx_set_maths_fam:n #1 { \group_begin: \hbox_set:Nn \l_tmpa_box { \ensuremath { \use:c { math #1 } { \exp_after:wN \pref_global:D \exp_after:wN \tex_chardef:D \cs:w c_siunitx_math #1 _int \cs_end: \fam \scan_stop: } } } \group_end: } \tl_put_right:Nn \document { \siunitx_set_maths_fam:n { sf } \siunitx_set_maths_fam:n { tt } } \cs_new_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 } } \bool_new:N \l_siunitx_detect_inline_bold_bool \keys_define:nn { siunitx } { detect-all .choice:, detect-all .default:n = true, detect-all / false .meta:n = { detect-bold = false, detect-family = false, detect-italic = false, detect-mode = false }, detect-all / true .meta:n = { detect-bold = true, detect-family = true, detect-italic = true, detect-mode = true }, detect-bold .bool_set:N = \l_siunitx_detect_bold_bool, detect-display-math .bool_set:N = \l_siunitx_detect_display_maths_bool, detect-display-maths .bool_set:N = \l_siunitx_detect_display_maths_bool, detect-family .bool_set:N = \l_siunitx_detect_family_bool, detect-inline-bold .choice:, detect-inline-bold .value_required:, detect-inline-bold / math .code:n = { \bool_set_true:N \l_siunitx_detect_inline_bold_bool }, detect-inline-bold / maths .code:n = { \bool_set_true:N \l_siunitx_detect_inline_bold_bool }, detect-inline-bold / text .code:n = { \bool_set_false:N \l_siunitx_detect_inline_bold_bool }, detect-italic .bool_set:N = \l_siunitx_detect_italic_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-bold = true, detect-family = true, detect-italic = true, detect-mode = true }, detect-none / true .meta:n = { detect-bold = false, detect-family = false, detect-italic = false, detect-mode = false } } \bool_new:N \l_siunitx_font_set_bool \bool_new:N \l_siunitx_font_maths_mode_bool \tl_new:N \l_siunitx_font_family_tl \cs_new_nopar:Npn \siunitx_font_bold: { } \cs_new_nopar:Npn \siunitx_font_italic: { } \cs_new_nopar:Npn \siunitx_detect_font: { \bool_if:NF \l_siunitx_font_set_bool { \siunitx_detect_font_init: \bool_if:NT \l_siunitx_detect_bold_bool { \siunitx_detect_font_bold: } \bool_if:NT \l_siunitx_detect_family_bool { \siunitx_detect_font_family: } \bool_if:NT \l_siunitx_detect_italic_bool { \siunitx_detect_font_italic: } \bool_if:NT \l_siunitx_detect_mode_bool { \siunitx_detect_font_mode: } } } \cs_new_nopar:Npn \siunitx_detect_font_init: { \bool_set_true:N \l_siunitx_font_set_bool \cs_set:Npn \siunitx_font_bold: { \unboldmath \mdseries } \cs_set:Npn \siunitx_font_italic: { \upshape } \tl_set:Nn \l_siunitx_font_family_tl { rm } \bool_set_true:N \l_siunitx_font_maths_mode_bool } \cs_new_nopar:Npn \siunitx_detect_font_bold: { \mode_if_math:TF { \mode_if_inner:TF { \bool_if:NTF \l_siunitx_detect_inline_bold_bool { \siunitx_detect_font_bold_maths: } { \siunitx_detect_font_bold_text: } } { \bool_if:NTF \l_siunitx_detect_display_maths_bool { \siunitx_detect_font_bold_maths: } { \siunitx_detect_font_bold_text: } } } { \siunitx_detect_font_bold_text: } } \cs_new_nopar:Npn \siunitx_detect_font_bold_maths: { \tl_if_eq:nVT { bold } \math@version { \cs_set:Npn \siunitx_font_bold: { \boldmath \bfseries } } } \cs_new_nopar:Npn \siunitx_detect_font_bold_text: { \tl_if_eq:nxT { b } { \exp_args:NV \tl_head_i:n \f@series } { \cs_set:Npn \siunitx_font_bold: { \boldmath \bfseries } } } \cs_new_nopar:Npn \siunitx_detect_font_family: { \siunitx_detect_font_family_text: \bool_if:NT \l_siunitx_detect_display_maths_bool { \mode_if_math:T { \mode_if_inner:F { \siunitx_detect_font_family_maths: } } } } \cs_new_nopar:Npn \siunitx_detect_font_family_maths: { \tl_set:Nn \l_siunitx_font_family_tl { rm } \intexpr_compare:nT { \int_use:N \fam = \c_siunitx_mathsf_int } { \tl_set:Nn \l_siunitx_font_family_tl { sf } } \intexpr_compare:nT { \int_use:N \fam = \c_siunitx_mathtt_int } { \tl_set:Nn \l_siunitx_font_family_tl { tt } } } \cs_new_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_nopar:Npn \siunitx_detect_font_italic: { \tl_if_eq:nVT { it } \f@shape { \cs_nopar_set:Npn \siunitx_font_italic: { \itshape } } } \cs_new_nopar:Npn \siunitx_detect_font_mode: { \mode_if_math:F { \bool_set_false:N \l_siunitx_font_maths_mode_bool } } \bool_new:N \l_siunitx_number_maths_mode_bool \bool_new:N \l_siunitx_unit_maths_mode_bool \cs_new_nopar:Npn \siunitx_number_mathrm: { } \cs_new_nopar:Npn \siunitx_number_mathsf: { } \cs_new_nopar:Npn \siunitx_number_mathtt: { } \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 .meta:n = { number-colour = #1 }, number-colour .tl_set:N = \l_siunitx_number_colour_tl, number-math-rm .code:n = { \cs_set_nopar:Npn \siunitx_number_mathrm: {#1} }, number-maths-rm .code:n = { \cs_set_nopar:Npn \siunitx_number_mathrm: {#1} }, number-math-sf .code:n = { \cs_set_nopar:Npn \siunitx_number_mathsf: {#1} }, number-maths-sf .code:n = { \cs_set_nopar:Npn \siunitx_number_mathsf: {#1} }, number-math-tt .code:n = { \cs_set_nopar:Npn \siunitx_number_mathtt: {#1} }, number-maths-tt .code:n = { \cs_set_nopar:Npn \siunitx_number_mathtt: {#1} }, number-mode .choice:, number-mode / math .code:n = { \bool_set_true:N \l_siunitx_number_maths_mode_bool }, number-mode / maths .code:n = { \bool_set_true:N \l_siunitx_number_maths_mode_bool }, number-mode / text .code:n = { \bool_set_false:N \l_siunitx_number_maths_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 .meta:n = { unit-colour = #1 }, unit-colour .tl_set:N = \l_siunitx_unit_colour_tl, unit-math-rm .code:n = { \cs_set_nopar:Npn \siunitx_unit_mathrm: {#1} }, unit-maths-rm .code:n = { \cs_set_nopar:Npn \siunitx_unit_mathrm: {#1} }, unit-math-sf .code:n = { \cs_set_nopar:Npn \siunitx_unit_mathsf: {#1} }, unit-maths-sf .code:n = { \cs_set_nopar:Npn \siunitx_unit_mathsf: {#1} }, unit-math-tt .code:n = { \cs_set_nopar:Npn \siunitx_unit_mathtt: {#1} }, unit-maths-tt .code:n = { \cs_set_nopar:Npn \siunitx_unit_mathtt: {#1} }, unit-mode .choice:, unit-mode / math .code:n = { \bool_set_true:N \l_siunitx_unit_maths_mode_bool }, unit-mode / maths .code:n = { \bool_set_true:N \l_siunitx_unit_maths_mode_bool }, unit-mode / text .code:n = { \bool_set_false:N \l_siunitx_unit_maths_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 }, colour .meta:n = { number-colour = #1, unit-colour = #1 }, math-rm .meta:n = { number-math-rm = #1, unit-math-rm = #1 }, maths-rm .meta:n = { number-maths-rm = #1, unit-maths-rm = #1 }, math-sf .meta:n = { number-math-sf = #1, unit-math-sf = #1 }, maths-sf .meta:n = { number-maths-sf = #1, unit-maths-sf = #1 }, math-tt .meta:n = { number-math-tt = #1, unit-math-tt = #1 }, maths-tt .meta:n = { number-maths-tt = #1, unit-maths-tt = #1 }, mode .choice:, mode / math .meta:n = { number-mode = math, unit-mode = math }, mode / maths .meta:n = { number-mode = maths, unit-mode = maths }, 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 } { maths-rm = \mathrm, maths-sf = \mathsf, maths-tt = \mathtt, number-mode = maths, text-rm = \rmfamily, text-sf = \sffamily, text-tt = \ttfamily } \tl_new:N \l_siunitx_print_arg_tl \tl_new:N \l_siunitx_print_type_tl \cs_new: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 _maths_mode_bool } { \bool_set_true:N \l_siunitx_font_maths_mode_bool } { \bool_set_false:N \l_siunitx_font_maths_mode_bool } } \siunitx_print_aux: \group_end: } \cs_generate_variant:Nn \siunitx_print:nn { nV } \cs_new_nopar:Npn \siunitx_print_aux: { \text { \siunitx_print_colour: \siunitx_font_bold: \siunitx_font_italic: \use:c { siunitx_ \l_siunitx_print_type_tl _ text \l_siunitx_font_family_tl : } \bool_if:NTF \l_siunitx_font_maths_mode_bool { \siunitx_print_maths: } { \siunitx_print_text: } } } \cs_new_nopar:Npn \siunitx_print_colour: { \tl_if_empty:cF { l_siunitx_ \l_siunitx_print_type_tl _colour_tl } { \color { \tl_use:c { l_siunitx_ \l_siunitx_print_type_tl _colour_tl } } } } \cs_new_nopar:Npn \siunitx_colour_check: { \@ifpackageloaded { color } { } { \cs_set_eq:NN \siunitx_print_colour: \scan_stop: } } \AtBeginDocument { \siunitx_colour_check: } \group_begin: \char_set_lccode:nn { `\@ } { `\_ } \char_make_math_subscript:N \@ \char_set_lccode:nn { `\! } { `\_ } \char_make_active:N \! \char_make_active:N \- \tl_to_lowercase:n { \group_end: \cs_new_nopar:Npn \siunitx_print_maths: { \ensuremath { \use:c { siunitx_ \l_siunitx_print_type_tl _ math \l_siunitx_font_family_tl : } \l_siunitx_print_arg_tl } } \cs_new_nopar:Npn \siunitx_print_text: { \group_begin: \char_make_active:N \- \cs_set:Npn - { \text { \c_siunitx_minus_tl } } \tl_set_rescan:NnV \l_siunitx_print_arg_tl { } \l_siunitx_print_arg_tl \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_end: } } \group_begin: \char_set_lccode:nn { `\@ } { `\_ } \char_make_math_subscript:N \@ \tl_to_lowercase:n { \group_end: \cs_new:Npn \siunitx_print_text_sub:n #1 { \ensuremath { @ { \text {#1} } } } } \cs_new:Npn \siunitx_print_text_super:n #1 { \ensuremath { ^ { \text {#1} } } } \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: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_nopar:Npn \siunitx_number_preprocess_init: { \bool_set_false:N \l_siunitx_error_bool \tl_clear:N \l_siunitx_number_multi_tl } \cs_new_nopar:Npn \siunitx_number_preprocess_product: { \tl_map_function:NN \l_siunitx_input_product_tl \siunitx_number_preprocess_product_aux:N } \cs_new:Npn \siunitx_number_preprocess_product_aux:N #1 { \tl_if_in:NnT \l_siunitx_number_arg_tl {#1} { \cs_set:Npn \siunitx_tmp:w ##1 #1 ##2 \q_stop { \tl_set:Nn \l_siunitx_number_arg_tl {##1} \tl_set:Nn \l_siunitx_number_next_tl {##2} \tl_set:Nn \l_siunitx_number_multi_tl { product } } \exp_after:wN \siunitx_tmp:w \l_siunitx_number_arg_tl \q_stop \tl_if_empty:NT \l_siunitx_number_arg_tl { \siunitx_error:n { starting-product-token } } \tl_if_empty:NT \l_siunitx_number_next_tl { \siunitx_error:n { ending-product-token } } \tl_map_break: } } \cs_new_nopar:Npn \siunitx_number_preprocess_quotient: { \tl_map_function:NN \l_siunitx_input_quotient_tl \siunitx_number_preprocess_quotient_aux:N } \cs_new:Npn \siunitx_number_preprocess_quotient_aux:N #1 { \tl_if_in:NnT \l_siunitx_number_arg_tl {#1} { \cs_set:Npn \siunitx_tmp:w ##1 #1 ##2 \q_stop { \tl_set:Nn \l_siunitx_number_numerator_tl {##1} \tl_set:Nn \l_siunitx_number_denominator_tl {##2} \tl_set:Nn \l_siunitx_number_multi_tl { quotient } } \exp_after:wN \siunitx_tmp:w \l_siunitx_number_arg_tl \q_stop \tl_if_empty:NT \l_siunitx_number_numerator_tl { \siunitx_error:n { starting-quotient-token } } \tl_if_empty:NT \l_siunitx_number_denominator_tl { \siunitx_error:n { ending-quotient-token } } \tl_if_in:NnT \l_siunitx_number_denominator_tl {#1} { \siunitx_error:n { duplicate-quotient-token } } \tl_map_break: } } \prop_new:N \l_siunitx_number_in_prop \tl_new:N \l_siunitx_number_valid_tl \clist_new:N \c_siunitx_number_parts_clist \clist_put_right:Nn \c_siunitx_number_parts_clist { mantissa } \clist_put_right:Nn \c_siunitx_number_parts_clist { mantissa-complex } \clist_put_right:Nn \c_siunitx_number_parts_clist { exponent } \clist_put_right:Nn \c_siunitx_number_parts_clist { exponent-complex} \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-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-decimal-markers = {.,}, input-digits = 0123456789, input-exponent-markers = dDeE, input-open-uncertainty = (, % ) input-protect-tokens = \mp\pi\pm, input-signs = +-\mp\pm, input-symbols = \pi, } \cs_new:Npn \siunitx_number_in_parse:n #1 { \siunitx_number_in_init: \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} \tl_if_empty:NF \l_siunitx_number_arg_tl { \siunitx_number_in_loop:V \l_siunitx_number_arg_tl \bool_if:NF \l_siunitx_error_bool { \siunitx_number_in_separate: } \bool_if:NF \l_siunitx_error_bool { \siunitx_number_in_tidy: } \bool_if:NF \l_siunitx_error_bool { \siunitx_number_in_check: } } } \cs_generate_variant:Nn \siunitx_number_in_parse:n { V } \cs_new_nopar:Npn \siunitx_number_in_check: { \clist_map_function:NN \c_siunitx_number_parts_clist \siunitx_number_in_check_uncertainty:n \prop_if_in:NnT \l_siunitx_number_in_prop { exponent } { \prop_if_in:NnF \l_siunitx_number_in_prop { exponent-integer } { \prop_if_in:NnF \l_siunitx_number_in_prop { exponent-decimal } { \prop_if_in:NnF \l_siunitx_number_in_prop { exponent-complex } { \siunitx_error:n { empty-exponent } } } } } } \cs_new_nopar:Npn \siunitx_number_in_check_uncertainty:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -uncertainty } { \prop_if_in:NnF \l_siunitx_number_in_prop { #1 -integer } { \prop_if_in:NnF \l_siunitx_number_in_prop { #1 -decimal } { \siunitx_error:n { uncertainty-only } } } } } \cs_new_nopar:Npn \siunitx_number_in_complex:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \cs_set:Npn \siunitx_number_in_complex_aux:N ##1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {##1} { \siunitx_number_in_complex_check:N ##1 \prop_put:Nnn \l_siunitx_number_in_prop { #1 -complex } { } \tl_map_break: } } \tl_map_function:NN \l_siunitx_input_complex_tl \siunitx_number_in_complex_aux:N \bool_if:NF \l_siunitx_error_bool { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -complex } { \prop_del:Nn \l_siunitx_number_in_prop {#1} \prop_del:Nn \l_siunitx_number_in_prop { #1 -complex } \siunitx_number_in_complex_separate:n {#1} \siunitx_number_in_complex_tidy:n {#1} } } \bool_if:NF \l_siunitx_error_bool { \siunitx_number_in_complex_check:n {#1} } } } \cs_new:Npn \siunitx_number_in_complex_aux:N #1 { } \cs_new:Npn \siunitx_number_in_complex_check:N #1 { \cs_set:Npn \siunitx_tmp:w ##1 #1 ##2 \q_stop { \tl_if_empty:nTF {##2} { \tl_set:Nn \l_siunitx_tmpa_tl {##1} } { \siunitx_error:nx { misplaced-complex-root } {#1} } } \exp_after:wN \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop } \cs_new_nopar:Npn \siunitx_number_in_complex_separate:n #1 { \cs_set:Npn \siunitx_number_in_complex_seperate_aux:N ##1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {##1} { \cs_set:Npn \siunitx_tmp:w ####1 ##1 ####2 \q_stop { \tl_if_empty:nF {####1} { \prop_put:Nnn \l_siunitx_number_in_prop {#1} {####1} } \prop_put:Nnn \l_siunitx_number_in_prop { #1 -complex-sign } {##1} \prop_put:Nnn \l_siunitx_number_in_prop { #1 -complex } {####2} } \exp_after:wN \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop } } \tl_map_function:NN \l_siunitx_input_sign_tl \siunitx_number_in_complex_seperate_aux:N } \cs_new:Npn \siunitx_number_in_complex_seperate_aux:N #1 { } \cs_new_nopar:Npn \siunitx_number_in_complex_tidy:n #1 { \prop_if_in:NnF \l_siunitx_number_in_prop { #1 -complex } { \prop_put:NnV \l_siunitx_number_in_prop { #1 -complex } \l_siunitx_tmpa_tl \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -sign } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -sign } \l_siunitx_tmpa_tl \prop_del:Nn \l_siunitx_number_in_prop { #1 -sign } \prop_put:NnV \l_siunitx_number_in_prop { #1 -complex-sign } \l_siunitx_tmpa_tl } } } \cs_new_nopar:Npn \siunitx_number_in_complex_check:n #1 { \siunitx_number_in_complex_check_aux:n {#1} \siunitx_number_in_complex_check_aux:n { #1 -complex } } \cs_new_nopar:Npn \siunitx_number_in_complex_check_aux:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \cs_set:Npn \siunitx_number_in_complex_check_aux:N ##1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {##1} { \siunitx_error:nx { misplaced-sign } {##1} \tl_map_break: } } \tl_map_function:NN \l_siunitx_input_sign_tl \siunitx_number_in_uncertainty_check_aux:N \cs_set:Npn \siunitx_number_in_complex_check_aux:N ##1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {##1} { \siunitx_error:nx { misplaced-complex-root } {##1} \tl_map_break: } } \tl_map_function:NN \l_siunitx_input_complex_tl \siunitx_number_in_uncertainty_check_aux:N } } \cs_new:Npn \siunitx_number_in_complex_check_aux:N #1 { } \cs_new_nopar:Npn \siunitx_number_in_decimal:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \siunitx_number_in_decimal_aux:n {#1} } } \cs_new_nopar:Npn \siunitx_number_in_decimal_complex:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -complex } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -complex } \l_siunitx_tmpa_tl \tl_if_empty:NTF \l_siunitx_tmpa_tl { \prop_put:Nnn \l_siunitx_number_in_prop { #1 -complex-integer } { } } { \siunitx_number_in_decimal_aux:n { #1 -complex } } } } \cs_new_nopar:Npn \siunitx_number_in_decimal_aux:n #1 { \tl_if_empty:NF \l_siunitx_tmpa_tl { \prop_put:NnV \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_tmpa_tl } \cs_set:Npn \siunitx_number_in_decimal_aux:N ##1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {##1} { \cs_set:Npn \siunitx_tmp:w ####1 ##1 ####2 \q_stop { \tl_if_empty:nTF {####1} { \prop_del:Nn \l_siunitx_number_in_prop { #1 -integer } } { \prop_put:Nnn \l_siunitx_number_in_prop { #1 -integer } {####1} } \prop_put:Nnn \l_siunitx_number_in_prop { #1 -decimal } {####2} \prop_put:Nnn \l_siunitx_number_in_prop { #1 -decimal-symbol } {##1} } \exp_after:wN \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop \tl_map_break: } } \tl_map_function:NN \l_siunitx_input_decimal_tl \siunitx_number_in_decimal_aux:N \siunitx_number_in_decimal_check:n { #1 -integer } \siunitx_number_in_decimal_check:n { #1 -decimal } } \cs_new:Npn \siunitx_number_in_decimal_aux:N #1 { } \cs_new_nopar:Npn \siunitx_number_in_decimal_check:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \tl_map_function:NN \l_siunitx_input_decimal_tl \siunitx_number_in_decimal_check:N } } \cs_new:Npn \siunitx_number_in_decimal_check:N #1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {#1} { \siunitx_error:n { duplicate-decimal-token } \tl_map_break: } } \cs_new_nopar:Npn \siunitx_number_in_exponent: { \tl_map_function:NN \l_siunitx_input_exponent_tl \siunitx_number_in_exponent_aux:N } \cs_new:Npn \siunitx_number_in_exponent_aux:N #1 { \prop_put:NnV \l_siunitx_number_in_prop { mantissa } \l_siunitx_number_arg_tl \tl_if_in:NnT \l_siunitx_number_arg_tl {#1} { \cs_set:Npn \siunitx_tmp:w ##1 #1 ##2 \q_stop { \prop_put:Nnn \l_siunitx_number_in_prop { mantissa } {##1} \prop_put:Nnn \l_siunitx_number_in_prop { exponent } {##2} \tl_set:Nn \l_siunitx_tmpa_tl {##2} \tl_if_empty:nT {##1} { \tl_if_empty:nT {##2} { \siunitx_error:n { empty-number } } } } \exp_after:wN \siunitx_tmp:w \l_siunitx_number_arg_tl \q_stop \tl_if_in:NnT \l_siunitx_tmpa_tl {#1} { \siunitx_error:n { duplicate-exponent-token } } \tl_map_break: } } \cs_new_nopar:Npn \siunitx_number_in_init: { \bool_set_false:N \l_siunitx_error_bool \prop_clear:N \l_siunitx_number_in_prop \group_begin: \siunitx_number_in_protect: \tl_set:Nx \l_siunitx_number_valid_tl { \l_siunitx_input_sign_tl \l_siunitx_input_ignore_tl \l_siunitx_input_digit_tl \l_siunitx_input_decimal_tl \l_siunitx_input_exponent_tl \l_siunitx_input_complex_tl \l_siunitx_input_symbol_tl \l_siunitx_input_uncert_open_tl \l_siunitx_input_uncert_close_tl } \exp_args:NNNV \group_end: \tl_set:Nn \l_siunitx_number_valid_tl \l_siunitx_number_valid_tl } \cs_new:Npn \siunitx_number_in_loop:n #1 { \tl_clear:N \l_siunitx_number_arg_tl \tl_map_function:nN {#1} \siunitx_number_in_loop_aux:N } \cs_generate_variant:Nn \siunitx_number_in_loop:n { V } \cs_new:Npn \siunitx_number_in_loop_aux:N #1 { \tl_if_in:NnF \l_siunitx_number_valid_tl {#1} { \siunitx_error:nxx { invalid-token-in-number } {#1} { \l_siunitx_number_valid_tl } \tl_map_break: } \tl_if_in:NnF \l_siunitx_input_ignore_tl {#1} { \tl_put_right:Nn \l_siunitx_number_arg_tl {#1} } \tl_if_in:NnT \l_siunitx_input_symbol_tl {#1} { \prop_put:Nnn \l_siunitx_number_in_prop { symbolic } { true } } } \cs_new_nopar:Npn \siunitx_number_in_protect: { \tl_map_function:NN \l_siunitx_input_protect_tl \siunitx_number_in_protect_aux:N } \cs_new:Npn \siunitx_number_in_protect_aux:N #1 { \cs_set_eq:NN #1 \scan_stop: } \cs_new_nopar:Npn \siunitx_number_in_separate: { \siunitx_number_in_exponent: \siunitx_number_in_separate_aux:n { exponent } \siunitx_number_in_separate_aux:n { mantissa } } \cs_new_nopar:Npn \siunitx_number_in_separate_aux:n #1 { \bool_if:NF \l_siunitx_error_bool { \siunitx_number_in_sign:n {#1} \siunitx_number_in_complex:n {#1} } \bool_if:NF \l_siunitx_error_bool { \siunitx_number_in_decimal:n {#1} \siunitx_number_in_decimal_complex:n {#1} } \bool_if:NF \l_siunitx_error_bool { \siunitx_number_in_uncertainty:n {#1} \siunitx_number_in_uncertainty:n { #1 -complex } } } \cs_new_nopar:Npn \siunitx_number_in_sign:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \tl_replace_all_in:Nnn \l_siunitx_tmpa_tl { -+ } { \mp } \tl_replace_all_in:Nnn \l_siunitx_tmpa_tl { +- } { \pm } \cs_set:Npn \siunitx_tmp:w ##1##2 \q_stop { \tl_if_in:NnTF \l_siunitx_input_sign_tl {##1} { \prop_put:Nnn \l_siunitx_number_in_prop { #1 -sign } { ##1 } \prop_put:Nnn \l_siunitx_number_in_prop {#1} { ##2 } } { \prop_put:Nnn \l_siunitx_number_in_prop {#1} { ##1 ##2 } } } \tl_if_empty:NF \l_siunitx_tmpa_tl { \exp_after:wN \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop } } } \cs_new_nopar:Npn \siunitx_number_in_tidy: { \clist_map_function:NN \c_siunitx_number_parts_clist \siunitx_number_in_tidy_zeros:n \prop_if_in:NnT \l_siunitx_number_in_prop { mantissa } { \prop_if_in:NnT \l_siunitx_number_in_prop { mantissa-sign } { \prop_get:NnN \l_siunitx_number_in_prop { mantissa } \l_siunitx_tmpa_tl \tl_if_empty:NT \l_siunitx_tmpa_tl { \prop_del:Nn \l_siunitx_number_in_prop { mantissa } \prop_get:NnN \l_siunitx_number_in_prop { mantissa-sign } \l_siunitx_tmpa_tl \prop_del:Nn \l_siunitx_number_in_prop { mantissa-sign } \prop_put:NnV \l_siunitx_number_in_prop { sign } \l_siunitx_tmpa_tl } } } \siunitx_number_in_tidy_sign:n { mantissa } \siunitx_number_in_tidy_sign:n { exponent } } \cs_new_nopar:Npn \siunitx_number_in_tidy_zeros:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -integer } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_tmpa_tl \tl_if_in:NnT \l_siunitx_tmpa_tl { 0 } { \cs_set:Npn \siunitx_tmp:w ##1 0 ##2 \q_stop { \tl_if_empty:nTF {##1} { \tl_if_in:nnTF {##2} { 0 } { \siunitx_tmp:w ##2 \q_stop } { \tl_set:Nn \l_siunitx_tmpa_tl {##2} \prop_put:Nnn \l_siunitx_number_in_prop { #1 -integer } {##2} } } { \prop_put:Nnn \l_siunitx_number_in_prop { #1 -integer } { ##1 0 ##2 } } } \exp_after:wN \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop \tl_if_empty:NT \l_siunitx_tmpa_tl { \prop_put:Nnn \l_siunitx_number_in_prop { #1 -integer } { 0 } } } } } \cs_new_nopar:Npn \siunitx_number_in_tidy_sign:n #1 { \prop_if_in:NnTF \l_siunitx_number_in_prop {#1} { \siunitx_number_in_tidy_sign_aux_i:n {#1} } { \siunitx_number_in_tidy_sign_aux_i:n { #1 -complex } } } \cs_new_nopar:Npn \siunitx_number_in_tidy_sign_aux_i:n #1 { \prop_if_in:NnTF \l_siunitx_number_in_prop { #1 -integer } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_tmpa_tl \tl_if_eq:nVTF { 0 } \l_siunitx_tmpa_tl { \siunitx_number_in_tidy_sign_aux_ii:n {#1} } { \tl_if_empty:NT \l_siunitx_tmpa_tl { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -decimal } { \siunitx_number_in_tidy_sign_aux_ii:n {#1} } } } } { \siunitx_number_in_tidy_sign_aux_ii:n {#1} } } \cs_new_nopar:Npn \siunitx_number_in_tidy_sign_aux_ii:n #1 { \prop_if_in:NnTF \l_siunitx_number_in_prop { #1 -decimal } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_tmpa_tl \cs_set:Npn \siunitx_tmp:w ##1 { \tl_if_eq:nnF {##1} { 0 } { \tl_clear:N \l_siunitx_tmpa_tl \tl_map_break: } } \tl_reverse:N \l_siunitx_tmpa_tl \tl_map_function:NN \l_siunitx_tmpa_tl \siunitx_tmp:w \tl_if_empty:NF \l_siunitx_tmpa_tl { \prop_del:Nn \l_siunitx_number_in_prop { #1 -sign } } } { \prop_del:Nn \l_siunitx_number_in_prop { #1 -sign } } } \cs_new_nopar:Npn \siunitx_number_in_uncertainty:n #1 { \prop_if_in:NnTF \l_siunitx_number_in_prop { #1 -decimal } { \siunitx_number_in_uncertainty_close:nn {#1} { decimal } } { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -integer } { \siunitx_number_in_uncertainty_close:nn {#1} { integer } } } \siunitx_number_in_uncertainty_check:n {#1} } \cs_new_nopar:Npn \siunitx_number_in_uncertainty_close:nn #1#2 { \prop_get:NnN \l_siunitx_number_in_prop { #1 - #2 } \l_siunitx_tmpa_tl \cs_set:Npn \siunitx_number_in_uncertainty_close:N ##1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {##1} { \cs_set:Npn \siunitx_tmp:w ####1 ##1 ####2 \q_stop { \tl_if_empty:nTF {####2} { \prop_put:Nnn \l_siunitx_number_in_prop { #1 -uncertainty } { } \tl_set:Nn \l_siunitx_tmpa_tl {####1} } { \siunitx_error:nx { misplaced-closing-uncertainty } {##1} } } \exp_after:wN \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop \tl_map_break: } } \tl_map_function:NN \l_siunitx_input_uncert_close_tl \siunitx_number_in_uncertainty_close:N \prop_if_in:NnT \l_siunitx_number_in_prop { #1 - uncertainty } { \siunitx_number_in_uncertainty_open:nn {#1} {#2} } } \cs_new:Npn \siunitx_number_in_uncertainty_close:N #1 { } \cs_new_nopar:Npn \siunitx_number_in_uncertainty_open:nn #1#2 { \cs_set:Npn \siunitx_number_in_uncertainty_open:N ##1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {##1} { \cs_set:Npn \siunitx_tmp:w ####1 ##1 ####2 \q_stop { \prop_put:Nnn \l_siunitx_number_in_prop { #1 - #2 } {####1} \prop_put:Nnn \l_siunitx_number_in_prop { #1 -uncertainty } {####2} \tl_if_empty:nT {####2} { \siunitx_error:n { empty-uncertainty } } } \exp_after:wN \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop \tl_map_break: } } \tl_map_function:NN \l_siunitx_input_uncert_open_tl \siunitx_number_in_uncertainty_open:N } \cs_new:Npn \siunitx_number_in_uncertainty_open:N #1 { } \cs_new_nopar:Npn \siunitx_number_in_uncertainty_check:n #1 { \siunitx_number_in_uncertainty_check_aux:n { #1 -integer } \siunitx_number_in_uncertainty_check_aux:n { #1 -decimal } \siunitx_number_in_uncertainty_check_aux:n { #1 -uncertainty } } \cs_new_nopar:Npn \siunitx_number_in_uncertainty_check_aux:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \tl_map_function:NN \l_siunitx_input_uncert_open_tl \siunitx_number_in_uncertainty_check_aux:N \tl_map_function:NN \l_siunitx_input_uncert_close_tl \siunitx_number_in_uncertainty_check_aux:N } } \cs_new:Npn \siunitx_number_in_uncertainty_check_aux:N #1 { \tl_if_in:NnT \l_siunitx_tmpa_tl {#1} { \siunitx_error:nx { misplaced-uncertainty } {#1} \tl_map_break: } } \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 \keys_define:nn { siunitx } { add-zero-decimal .bool_set:N = \l_siunitx_process_decimal_zero_bool, add-zero-integer .bool_set:N = \l_siunitx_process_integer_zero_bool, explicit-sign .tl_set:N = \l_siunitx_process_sign_tl, 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-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-figures .tl_set:N = \l_siunitx_process_figures_int, round-places .tl_set:N = \l_siunitx_process_places_int, } \keys_set:nn { siunitx } { add-zero-decimal = true, add-zero-integer = true, retain-unity-mantissa = true, round-figures = 2, round-places = 2 } \cs_new_nopar:Npn \siunitx_number_process: { \siunitx_number_process_sign: \siunitx_number_process_zero_fill: \siunitx_number_process_mantissa: \siunitx_number_process_exponent: \prop_if_in:NnF \l_siunitx_number_in_prop { symbolic } { \siunitx_number_process_round: \siunitx_number_process_uncertainty: } } \cs_new_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 } { \prop_if_in:NnF \l_siunitx_number_in_prop { symbolic } { \bool_set_false:N \l_siunitx_tmp_bool \siunitx_number_process_exponent_aux_i:n { } \siunitx_number_process_exponent_aux_i:n { complex- } \bool_if:NF \l_siunitx_tmp_bool { \prop_del:Nn \l_siunitx_number_in_prop { exponent } \siunitx_number_process_exponent_clear:n { } \siunitx_number_process_exponent_clear:n { complex- } } } } } } \cs_new_nopar:Npn \siunitx_number_process_exponent_aux_i:n #1 { \siunitx_number_process_exponent_aux_ii:n { #1 integer } \siunitx_number_process_exponent_aux_ii:n { #1 decimal } \siunitx_number_process_exponent_aux_ii:n { #1 uncertainty } } \cs_new_nopar:Npn \siunitx_number_process_exponent_aux_ii:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop { exponent- #1 } { \prop_get:NnN \l_siunitx_number_in_prop { exponent- #1 } \l_siunitx_tmpa_tl \intexpr_compare:nF { \l_siunitx_tmpa_tl = \c_zero } { \bool_set_true:N \l_siunitx_tmp_bool } } } \cs_new_nopar:Npn \siunitx_number_process_exponent_clear:n #1 { \prop_del:Nn \l_siunitx_number_in_prop { exponent- #1 sign } \prop_del:Nn \l_siunitx_number_in_prop { exponent- #1 integer } \prop_del:Nn \l_siunitx_number_in_prop { exponent- #1 decimal } \prop_del:Nn \l_siunitx_number_in_prop { exponent- #1 uncertainty } \prop_del:Nn \l_siunitx_number_in_prop { exponent- #1 complex } } \cs_new_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_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 \intexpr_compare:nTF { \l_siunitx_round_int > \l_siunitx_process_figures_int } { \siunitx_number_process_figures_round: } { \siunitx_number_process_figures_pad:n {#1} } \siunitx_number_process_round_tidy: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_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_if_in:NnTF \l_siunitx_number_in_prop { #1 -decimal } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_round_decimal_in_tl } { \tl_clear:N \l_siunitx_round_decimal_in_tl } \prop_if_in:NnTF \l_siunitx_number_in_prop { #1 -integer } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_round_integer_in_tl } { \tl_clear:N \l_siunitx_round_integer_in_tl } \tl_clear:N \l_siunitx_round_decimal_out_tl \tl_clear:N \l_siunitx_round_integer_out_tl } \cs_new_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_nopar:Npn \siunitx_number_process_figures_count_aux:n #1 { \int_set:Nn \l_siunitx_tmp_int { \exp_args:Nv \tl_head_i:n { l_siunitx_round_ #1 _in_tl } } \tl_set:cx { l_siunitx_round_ #1 _in_tl } { \exp_args:Nv \tl_tail:n { 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 { \intexpr_compare:nF { \l_siunitx_tmp_int = \c_zero } { \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_nopar:Npn \siunitx_number_process_figures_round: { \int_set:Nn \l_siunitx_round_int { \l_siunitx_round_int - \l_siunitx_process_figures_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_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_nopar:Npn \siunitx_number_process_figures_integer: { \intexpr_compare:nT { \l_siunitx_round_int > \c_zero } { \tl_put_left:Nn \l_siunitx_round_integer_out_tl { 0 } } \intexpr_compare:nF { \l_siunitx_round_int > \c_one } { \int_set:Nn \l_siunitx_tmp_int { \exp_args:NV \tl_head_i:n \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 \intexpr_compare:nTF { \l_siunitx_round_int = \c_one } { \intexpr_compare:nT { \l_siunitx_tmp_int > \c_four } { \bool_set_true:N \l_siunitx_round_bool } } { \intexpr_compare:nT { \l_siunitx_tmp_int > \c_ten } { \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 { \exp_args:NV \tl_tail:n \l_siunitx_round_integer_in_tl } \tl_if_empty:NF \l_siunitx_round_integer_in_tl { \siunitx_number_process_figures_integer: } } \cs_new_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_figures_int - \l_siunitx_round_int } \siunitx_number_process_pad:n {#1} } \cs_new_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_if_in:NnT \l_siunitx_number_in_prop { mantissa } { \prop_get:NnN \l_siunitx_number_in_prop { mantissa } \l_siunitx_tmpa_tl \tl_if_eq:nVT { 1 } \l_siunitx_tmpa_tl { \prop_del:Nn \l_siunitx_number_in_prop { mantissa } \prop_del:Nn \l_siunitx_number_in_prop { mantissa-integer } } } } } } \cs_new_nopar:Npn \siunitx_number_process_pad:n #1 { \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_tmpa_tl \intexpr_while_do:nn { \l_siunitx_round_int > \c_zero } { \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_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_nopar:Npn \siunitx_number_process_places_aux_i:n #1 { \intexpr_compare:nTF { \l_siunitx_process_places_int = \c_zero } { \prop_del:Nn \l_siunitx_number_in_prop { #1 -decimal } } { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -decimal } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_tmpa_tl \tl_if_empty:NT \l_siunitx_tmpa_tl { \tl_set:Nn \l_siunitx_tmpa_tl { 0 } } \intexpr_compare:nTF { \l_siunitx_tmpa_tl = \c_zero } { \prop_put:Nnn \l_siunitx_number_in_prop { #1 -decimal } { } \int_set_eq:NN \l_siunitx_round_int \l_siunitx_process_places_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_nopar:Npn \siunitx_number_process_places_aux_ii:n #1 { \int_sub:Nn \l_siunitx_round_int { \l_siunitx_process_places_int } \intexpr_compare:nTF { \l_siunitx_round_int < \c_zero } { \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_nopar:Npn \siunitx_number_process_places_init:n #1 { \prop_if_in:NnTF \l_siunitx_number_in_prop { #1 -integer } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_round_integer_in_tl } { \tl_clear:N \l_siunitx_round_integer_in_tl } \prop_get:NnN \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_round_decimal_in_tl \tl_reverse:N \l_siunitx_round_integer_in_tl \tl_reverse:N \l_siunitx_round_decimal_in_tl \tl_clear:N \l_siunitx_round_integer_out_tl \tl_clear:N \l_siunitx_round_decimal_out_tl \bool_set_false:N \l_siunitx_round_bool } \cs_new_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_nopar:Npn \siunitx_number_process_places_integer:n #1 { \int_set:Nn \l_siunitx_tmp_int { \exp_args:NV \tl_head_i:n \l_siunitx_round_integer_in_tl } \tl_set:Nx \l_siunitx_round_integer_in_tl { \exp_args:NV \tl_tail:n \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 \intexpr_compare:nT { \l_siunitx_tmp_int = \c_ten } { \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_nopar:Npn \siunitx_number_process_round: { \tl_if_empty:NF \l_siunitx_round_tl { \exp_args:NNc \clist_map_function:NN \c_siunitx_number_parts_clist { siunitx_number_process_ \l_siunitx_round_tl :n } } } \cs_new_nopar:Npn \siunitx_number_process_round_decimal: { \intexpr_compare:nF { \l_siunitx_round_int > \c_one } { \siunitx_number_process_round_decimal_aux: } \tl_set:Nx \l_siunitx_round_decimal_in_tl { \exp_args:NV \tl_tail:n \l_siunitx_round_decimal_in_tl } \int_decr:N \l_siunitx_round_int } \cs_new_nopar:Npn \siunitx_number_process_round_decimal_aux: { \int_set:Nn \l_siunitx_tmp_int { \exp_args:NV \tl_head_i:n \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 \intexpr_compare:nTF { \l_siunitx_round_int = \c_one } { \intexpr_compare:nT { \l_siunitx_tmp_int > \c_four } { \bool_set_true:N \l_siunitx_round_bool } } { \intexpr_compare:nT { \l_siunitx_tmp_int = \c_ten } { \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_nopar:Npn \siunitx_number_process_round_tidy:n #1 { \prop_put:NnV \l_siunitx_number_in_prop { #1 -integer } \l_siunitx_round_integer_out_tl \prop_put:NnV \l_siunitx_number_in_prop { #1 -decimal } \l_siunitx_round_decimal_out_tl } \cs_new_nopar:Npn \siunitx_number_process_sign: { \bool_if:NF \l_siunitx_process_plus_tl { \siunitx_number_process_sign_plus:n { exponent } \siunitx_number_process_sign_plus:n { mantissa } } \tl_if_empty:NF \l_siunitx_process_sign_tl { \siunitx_number_process_sign_add:n { exponent } \siunitx_number_process_sign_add:n { mantissa } } } \cs_new_nopar:Npn \siunitx_number_process_sign_add:n #1 { \prop_if_in:NnTF \l_siunitx_number_in_prop {#1} { \siunitx_number_process_sign_add_aux:n {#1} } { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -complex } { \siunitx_number_process_sign_add_aux:n { #1 -complex } } } } \cs_new_nopar:Npn \siunitx_number_process_sign_add_aux:n #1 { \prop_if_in:NnF \l_siunitx_number_in_prop { #1 -sign } { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \tl_if_empty:NTF \l_siunitx_tmpa_tl { \prop_put:NnV \l_siunitx_number_in_prop { sign } \l_siunitx_process_sign_tl } { \prop_put:NnV \l_siunitx_number_in_prop { #1 -sign } \l_siunitx_process_sign_tl } } } } \cs_new_nopar:Npn \siunitx_number_process_sign_plus:n #1 { \prop_if_in:NnTF \l_siunitx_number_in_prop {#1} { \siunitx_number_process_sign_plus_aux:n {#1} } { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -complex } { \siunitx_number_process_sign_plus_aux:n { #1 -complex } } } } \cs_new_nopar:Npn \siunitx_number_process_sign_plus_aux:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -sign } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -sign } \l_siunitx_tmpa_tl \tl_if_eq:nVT { + } \l_siunitx_tmpa_tl { \prop_del:Nn \l_siunitx_number_in_prop { #1 -sign } } } } \cs_new_nopar:Npn \siunitx_number_process_uncertainty: { \clist_map_function:NN \c_siunitx_number_parts_clist \siunitx_number_process_uncertainty_aux:n } \cs_new_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 } { \siunitx_number_process_uncertainty_decimal:n {#1} } { \siunitx_number_process_uncertainty_integer:n {#1} } } } \cs_new_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 \intexpr_compare:nTF { \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 } \cs_new_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_nopar:Npn \siunitx_number_process_uncertainty_pad: { \intexpr_while_do:nn { \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_nopar:Npn \siunitx_number_process_uncertainty_separate: { \tl_map_function:NN \l_siunitx_tmpa_tl \siunitx_number_process_uncertainty_separate_aux:N } \cs_new:Npn \siunitx_number_process_uncertainty_separate_aux:N #1 { \intexpr_compare:nTF { \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_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_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 { mantissa-complex } {#1} \siunitx_number_process_zero_fill_aux:nn { exponent } {#1} \siunitx_number_process_zero_fill_aux:nn { exponent-complex } {#1} } } \cs_new_nopar:Npn \siunitx_number_process_zero_fill_aux:nn #1#2 { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -decimal } { \prop_if_in:NnTF \l_siunitx_number_in_prop { #1 - #2 } { \prop_get:NnN \l_siunitx_number_in_prop { #1 - #2 } \l_siunitx_tmpa_tl \tl_if_empty:NT \l_siunitx_tmpa_tl { \prop_put:Nnn \l_siunitx_number_in_prop { #1 - #2 } { 0 } } } { \prop_put:Nnn \l_siunitx_number_in_prop { #1 - #2 } { 0 } } } } \prop_new:N \l_siunitx_number_out_prop \keys_define:nn { siunitx } { close-bracket .tl_set:N = \l_siunitx_bracket_close_tl, %( 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 .tl_set:N = \l_siunitx_group_sep_tl, negative-color .meta:n = { negative-colour = #1 }, negative-colour .tl_set:N = \l_siunitx_negative_colour_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 .tl_set:N = \l_siunitx_output_decimal_tl, output-open-uncertainty .tl_set:N = \l_siunitx_output_uncert_open_tl, separate-uncertainty .bool_set:N = \l_siunitx_uncert_sep_bool, tight-spacing .bool_set:N = \l_siunitx_tight_bool, uncertainty-separator .tl_set:N = \l_siunitx_uncert_sep_tl, use-brackets .bool_set:N = \l_siunitx_brackets_bool, } \keys_set:nn { siunitx } { % ( close-bracket = ), exponent-base = 10, exponent-product = \times, group-decimal-digits = true, group-integer-digits = true, group-separator = \,, open-bracket = (, % ) ( output-close-uncertainty = ), output-complex-root = i, output-decimal-marker = ., output-open-uncertainty = (, % ) use-brackets = true } \cs_new_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_join_uncert: \siunitx_number_format_aux:n { mantissa } \siunitx_number_format_aux:n { exponent } \siunitx_number_format_colour: \siunitx_number_format_final: } } \cs_new_nopar:Npn \siunitx_number_format_aux:n #1 { \siunitx_number_format_complex:nn {#1} { } \siunitx_number_format_join_complex:n {#1} \siunitx_number_format_sign:n {#1} } \cs_new_nopar:Npn \siunitx_number_format_parts: { % TEMP \prop_if_empty:NF \l_siunitx_number_in_prop { \prop_clear:N \l_siunitx_number_out_prop \siunitx_number_format_reassemble: \siunitx_number_format_join_uncert:n { exponent } \siunitx_number_format_complex:nn { mantissa } { } \siunitx_number_format_complex:nn { mantissa } { -uncertainty } \siunitx_number_format_complex:nn { exponent } { } \siunitx_number_format_join_complex:n { exponent } \siunitx_number_format_sign:n { mantissa } \siunitx_number_format_sign:n { mantissa-complex } \siunitx_number_format_sign:n { exponent } { } \siunitx_number_format_colour: \siunitx_number_format_final_exponent: } } \cs_new_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_nopar:Npn \siunitx_number_format_brackets_aux:n #1 { \prop_if_in:NnTF \l_siunitx_number_out_prop { #1 -result } { \prop_get:NnN \l_siunitx_number_out_prop { #1 -result } \l_siunitx_tmpa_tl } { \prop_get:NnN \l_siunitx_number_out_prop {#1} \l_siunitx_tmpa_tl } \siunitx_tl_put_left_maths:NV \l_siunitx_tmpa_tl \l_siunitx_bracket_open_tl \siunitx_tl_put_right_maths:NV \l_siunitx_tmpa_tl \l_siunitx_bracket_close_tl \prop_put:NnV \l_siunitx_number_out_prop { #1 -result } \l_siunitx_tmpa_tl } \cs_new_nopar:Npn \siunitx_number_format_colour: { \tl_if_empty:NF \l_siunitx_negative_colour_tl { \siunitx_number_format_colour_aux:n { mantissa-sign } \siunitx_number_format_colour_aux:n { sign } } } \cs_new_nopar:Npn \siunitx_number_format_colour_aux:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \prop_get:NnN \l_siunitx_number_in_prop {#1} \l_siunitx_tmpa_tl \tl_if_eq:nVT { - } \l_siunitx_tmpa_tl { \prop_put:NnV \l_siunitx_number_out_prop { colour } \l_siunitx_negative_colour_tl } } } \cs_new_nopar:Npn \siunitx_number_format_complex:nn #1#2 { \prop_if_in:NnT \l_siunitx_number_out_prop { #1 -complex #2 } { \siunitx_number_format_brackets:n { #1 -complex #2 } \prop_get:NnN \l_siunitx_number_out_prop { #1 -complex #2 } \l_siunitx_tmpa_tl \siunitx_tl_put_right_maths:NV \l_siunitx_tmpa_tl \l_siunitx_output_complex_tl \prop_put:NnV \l_siunitx_number_out_prop { #1 -complex #2 } \l_siunitx_tmpa_tl } } \cs_new_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_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_nopar:Npn \siunitx_number_format_final: { \prop_if_in:NnTF \l_siunitx_number_out_prop { mantissa } { \prop_if_in:NnTF \l_siunitx_number_out_prop { exponent } { \siunitx_number_format_final_mantissa: \siunitx_number_format_final_exponent_aux: \siunitx_number_format_final_join_exp: } { \prop_if_in:NnTF \l_siunitx_number_out_prop { mantissa-result } { \siunitx_number_format_copy:nn { mantissa-result } { result } } { \siunitx_number_format_copy:nn { mantissa } { result } } } } { \siunitx_number_format_final_exponent: } \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 } } } \cs_new_nopar:Npn \siunitx_number_format_final_exponent: { \siunitx_number_format_final_exponent_aux: \prop_if_in:NnTF \l_siunitx_number_in_prop { mantissa-sign } { \prop_get:NnN \l_siunitx_number_in_prop { mantissa-sign } \l_siunitx_tmpa_tl \tl_clear:N \l_siunitx_tmpb_tl \siunitx_tl_put_right_maths:NV \l_siunitx_tmpb_tl \l_siunitx_tmpa_tl \prop_put:NnV \l_siunitx_number_out_prop { result } \l_siunitx_tmpb_tl } { \prop_put:Nnn \l_siunitx_number_out_prop { result } { } } \siunitx_number_format_final_join_exp: } \cs_new_nopar:Npn \siunitx_number_format_final_exponent_aux: { \prop_if_in:NnTF \l_siunitx_number_out_prop { exponent-result } { \siunitx_number_format_final_exponent_aux:n { exponent-result } } { \prop_if_in:NnT \l_siunitx_number_out_prop { exponent } { \siunitx_number_format_final_exponent_aux:n { exponent } } } } \cs_new_nopar:Npn \siunitx_number_format_final_exponent_aux:n #1 { \prop_get:NnN \l_siunitx_number_out_prop {#1} \l_siunitx_tmpa_tl \tl_set:No \l_siunitx_tmpa_tl { \exp_after:wN ^ \exp_after:wN { \l_siunitx_tmpa_tl } } \tl_put_left:NV \l_siunitx_tmpa_tl \l_siunitx_exponent_base_tl \prop_if_in:NnT \l_siunitx_number_in_prop { sign } { \prop_get:NnN \l_siunitx_number_in_prop { sign } \l_siunitx_tmpb_tl \siunitx_tl_put_left_maths:NV \l_siunitx_tmpa_tl \l_siunitx_tmpb_tl } \prop_put:NnV \l_siunitx_number_out_prop { exponent } \l_siunitx_tmpa_tl } \cs_new_nopar:Npn \siunitx_number_format_final_join_exp: { \prop_if_in:NnT \l_siunitx_number_out_prop { result } { \prop_get:NnN \l_siunitx_number_out_prop { result } \l_siunitx_tmpb_tl \tl_put_left:NV \l_siunitx_tmpa_tl \l_siunitx_tmpb_tl \prop_put:NnV \l_siunitx_number_out_prop { result } \l_siunitx_tmpa_tl \prop_if_in:NnT \l_siunitx_number_out_prop { mantissa } { \prop_put:Nnn \l_siunitx_number_out_prop { result-bracket } { true } } } } \cs_new_nopar:Npn \siunitx_number_format_final_mantissa: { \siunitx_number_format_brackets:n { mantissa } \prop_if_in:NnTF \l_siunitx_number_out_prop { mantissa-result } { \prop_get:NnN \l_siunitx_number_out_prop { mantissa-result } \l_siunitx_tmpa_tl } { \prop_get:NnN \l_siunitx_number_out_prop { mantissa } \l_siunitx_tmpa_tl } \tl_set_eq:NN \l_siunitx_tmpb_tl \l_siunitx_exponent_product_tl \bool_if:NT \l_siunitx_tight_bool { \tl_set:No \l_siunitx_tmpb_tl { \exp_after:wN { \l_siunitx_tmpb_tl } } } \siunitx_tl_put_right_maths:NV \l_siunitx_tmpa_tl \l_siunitx_tmpb_tl \prop_put:NnV \l_siunitx_number_out_prop { result } \l_siunitx_tmpa_tl } \cs_new_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_if_in:NnT \l_siunitx_number_out_prop { #1 -decimal } { \prop_get:NnN \l_siunitx_number_out_prop { #1 -decimal } \l_siunitx_tmpb_tl \siunitx_tl_put_right_maths:NV \l_siunitx_tmpa_tl \l_siunitx_output_decimal_tl \tl_put_right:NV \l_siunitx_tmpa_tl \l_siunitx_tmpb_tl \prop_put:NnV \l_siunitx_number_out_prop {#1} \l_siunitx_tmpa_tl } } \cs_new_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_nopar:Npn \siunitx_number_format_group_four:nn #1#2 { \prop_get:NnN \l_siunitx_number_in_prop { #1 - #2 } \l_siunitx_tmpa_tl \tl_if_empty:NTF \l_siunitx_tmpa_tl { \prop_put:Nnn \l_siunitx_number_in_prop { #1 - #2 } { } } { \bool_if:NTF \l_siunitx_group_four_bool { \siunitx_number_format_group_four_aux:nn {#1} {#2} } { \int_set:Nn \l_siunitx_tmp_int { \tl_elt_count:N \l_siunitx_tmpa_tl } \intexpr_compare:nTF { \l_siunitx_tmp_int > \c_four } { \siunitx_number_format_group_four_aux:nn {#1} {#2} } { \siunitx_number_format_copy:n {#1 - #2} } } } } \cs_new_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_nopar:Npn \siunitx_number_format_group_decimal: { \tl_if_empty:NF \l_siunitx_tmpa_tl { \exp_after:wN \siunitx_number_format_group_decimal_aux:NNNN \l_siunitx_tmpa_tl { } { } { } } } \cs_new: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_maths:NV \l_siunitx_tmpb_tl \l_siunitx_group_sep_tl \siunitx_number_format_group_decimal_aux:NNNN #4 } } } } %%\begin{macro}[aux]{\siunitx_number_format_group_integer_aux:NNNN} \cs_new_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: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: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: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_maths:NV \l_siunitx_tmpb_tl \l_siunitx_group_sep_tl \siunitx_number_format_group_integer_aux:NNNN #4 } } \cs_new_nopar:Npn \siunitx_number_format_join_complex:n #1 { \prop_if_in:NnT \l_siunitx_number_out_prop {#1} { \prop_if_in:NnT \l_siunitx_number_out_prop { #1 -complex } { \siunitx_number_format_brackets:n {#1} \siunitx_number_format_sign:n { #1 -complex } \prop_if_in:NnTF \l_siunitx_number_out_prop { #1 -result } { \prop_get:NnN \l_siunitx_number_out_prop { #1 -result } \l_siunitx_tmpa_tl } { \prop_get:NnN \l_siunitx_number_out_prop {#1} \l_siunitx_tmpa_tl } \prop_get:NnN \l_siunitx_number_out_prop { #1 -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 { #1 -result } \l_siunitx_tmpa_tl \prop_put:Nnn \l_siunitx_number_out_prop { #1 -bracket } { true } } } } \cs_new_nopar:Npn \siunitx_number_format_join_uncert: { \clist_map_function:NN \c_siunitx_number_parts_clist \siunitx_number_format_join_uncert:n } \cs_new_nopar:Npn \siunitx_number_format_join_uncert:n #1 { \prop_if_in:NnT \l_siunitx_number_out_prop {#1} { \prop_if_in:NnT \l_siunitx_number_out_prop { #1 -uncertainty } { \prop_get:NnN \l_siunitx_number_out_prop {#1} \l_siunitx_tmpa_tl \prop_get:NnN \l_siunitx_number_out_prop { #1 -uncertainty } \l_siunitx_tmpb_tl \tl_put_right:NV \l_siunitx_tmpa_tl \l_siunitx_tmpb_tl \prop_put:NnV \l_siunitx_number_out_prop { #1 -result } \l_siunitx_tmpa_tl \prop_put:Nnn \l_siunitx_number_out_prop { #1 -bracket } { true } } } } \cs_new_nopar:Npn \siunitx_number_format_reassemble: { \clist_map_function:NN \c_siunitx_number_parts_clist \siunitx_number_format_reassemble_aux:n } \cs_new_nopar:Npn \siunitx_number_format_reassemble_aux:n #1 { \prop_if_in:NnT \l_siunitx_number_in_prop {#1} { \siunitx_number_format_group:n {#1} \siunitx_number_format_uncertainty:n {#1} } } \cs_new_nopar:Npn \siunitx_number_format_sign:n #1 { \prop_if_in:NnT \l_siunitx_number_out_prop {#1} { \prop_if_in:NnT \l_siunitx_number_in_prop { #1 -sign } { \prop_get:NnN \l_siunitx_number_in_prop { #1 -sign } \l_siunitx_tmpa_tl \bool_if:NT \l_siunitx_tight_bool { \tl_set:No \l_siunitx_tmpb_tl { \exp_after:wN { \l_siunitx_tmpa_tl } } } \tl_clear:N \l_siunitx_tmpb_tl \siunitx_tl_put_left_maths: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_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_nopar:Npn \siunitx_number_format_uncertainty:n #1 { \prop_if_in:NnT \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} } } } \cs_new_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_maths:NV \l_siunitx_tmpa_tl \l_siunitx_output_uncert_open_tl \siunitx_tl_put_left_maths:NV \l_siunitx_tmpa_tl \l_siunitx_uncert_sep_tl \siunitx_tl_put_right_maths: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_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 } \siunitx_number_format_uncertainty_pm: \prop_put:NnV \l_siunitx_number_out_prop { #1 -uncertainty } \l_siunitx_tmpa_tl } \cs_new_nopar:Npn \siunitx_number_format_uncertainty_pm: { \bool_if:NTF \l_siunitx_tight_bool { \tl_put_left:Nn \l_siunitx_tmpa_tl { \ensuremath { { \pm } } } } { \tl_put_left:Nn \l_siunitx_tmpa_tl { \ensuremath { \pm } } } } \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 \bool_new:N \l_siunitx_calculate_product_bool \bool_new:N \l_siunitx_calculate_quotient_bool \keys_define:nn { siunitx } { 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, product-mode .choice:, product-mode / calculate .code:n = { \bool_set_true:N \l_siunitx_calculate_product_bool }, product-mode / symbol .code:n = { \bool_set_false:N \l_siunitx_calculate_product_bool }, quotient-mode .choice:, quotient-mode / calculate .code:n = { \bool_set_true:N \l_siunitx_calculate_quotient_bool }, quotient-mode / fraction .code:n = { \bool_set_false:N \l_siunitx_calculate_quotient_bool \tl_set:Nn \l_siunitx_quotient_mode_tl { fraction } }, quotient-mode / symbol .code:n = { \bool_set_false:N \l_siunitx_calculate_quotient_bool \tl_set:Nn \l_siunitx_quotient_mode_tl { symbol } }, } \keys_set:nn { siunitx } { output-product = \times, output-quotient = /, parse-numbers = true, quotient-mode = symbol } \cs_new:Npn \siunitx_number_output: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} \siunitx_number_output_print: } { \siunitx_print:nn { number } {#1} } } \cs_new_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_nopar:Npn \siunitx_number_output_colour: { \prop_if_in:NnT \l_siunitx_number_out_prop { colour } { \prop_get:NnN \l_siunitx_number_out_prop { colour } \l_siunitx_number_colour_tl } } \cs_new_nopar:Npn \siunitx_number_output_compound:n #1 { \bool_if:cTF { l_siunitx_calculate_ #1 _bool } { \siunitx_number_output_calculate:n {#1} } { \use:c { siunitx_number_output_ #1 : } } } \cs_generate_variant:Nn \siunitx_number_output_compound:n { V } \cs_new: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_single: } { \siunitx_number_output_compound:V \l_siunitx_number_multi_tl } } } \cs_generate_variant:Nn \siunitx_number_output_parse:n { V } \cs_new_nopar:Npn \siunitx_number_output_print: { \bool_if:NF \l_siunitx_error_bool { \tl_if_eq:nVF { quotient } \l_siunitx_number_multi_tl { \tl_if_empty:NF \l_siunitx_number_out_saved_tl { \tl_put_left:NV \l_siunitx_number_out_tl \l_siunitx_number_out_saved_tl } } \siunitx_print:nV { number } \l_siunitx_number_out_tl } } \cs_new_nopar:Npn \siunitx_number_output_product: { \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 { \tl_set_eq:NN \l_siunitx_number_out_saved_tl \l_siunitx_number_out_tl \siunitx_number_output_single: \tl_put_left:NV \l_siunitx_number_out_tl \l_siunitx_number_out_saved_tl } { \siunitx_number_output_compound:n { quotient } } } \siunitx_tl_put_right_maths:NV \l_siunitx_number_out_tl \l_siunitx_output_product_tl \tl_set_eq:NN \l_siunitx_number_out_saved_tl \l_siunitx_number_out_tl \siunitx_number_output_parse:V \l_siunitx_number_next_tl } \cs_new_nopar:Npn \siunitx_number_output_quotient: { \use:c { siunitx_number_output_quotient_ \l_siunitx_quotient_mode_tl : } } \cs_new_nopar:Npn \siunitx_number_output_quotient_fraction: { \bool_set_false:N \l_siunitx_number_compound_bool \siunitx_number_output_quotient_aux_i: \tl_set:No \l_siunitx_number_fraction_tl { \exp_after:wN { \l_siunitx_number_numerator_tl } } \tl_set:No \l_siunitx_tmpa_tl { \exp_after:wN { \l_siunitx_number_denominator_tl } } \tl_put_right:NV \l_siunitx_number_fraction_tl \l_siunitx_tmpa_tl \tl_put_left:Nn \l_siunitx_number_fraction_tl { \frac } \tl_set:No \l_siunitx_number_fraction_tl { \exp_after:wN \ensuremath \exp_after:wN { \l_siunitx_number_fraction_tl } } \tl_put_right:NV \l_siunitx_number_out_tl \l_siunitx_number_fraction_tl } \cs_new_nopar:Npn \siunitx_number_output_quotient_symbol: { \bool_set_true:N \l_siunitx_number_compound_bool \siunitx_number_output_quotient_aux_i: \tl_put_right:NV \l_siunitx_number_out_tl \l_siunitx_number_numerator_tl \siunitx_tl_put_right_maths: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 } \cs_new_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_colour: \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_get:NnN \l_siunitx_number_out_prop { result } \l_siunitx_number_denominator_tl } \cs_new_nopar:Npn \siunitx_number_output_quotient_aux_ii: { \siunitx_number_process: \siunitx_number_format: \siunitx_number_output_bracket: } \cs_new_nopar:Npn \siunitx_number_output_single: { \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_colour: \siunitx_number_output_bracket: \prop_get:NnN \l_siunitx_number_out_prop { result } \l_siunitx_number_out_tl } } \tl_new:Nn \l_siunitx_declare_list_tl { \per \raiseto \tothe } \cs_new: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: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: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: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: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 } { \cs_if_exist:cTF { siunitx_ \siunitx_unit_first_token:n {#2} _function:w } {#2} { \siunitx_unit_parse_unit:n {#2} } } \cs_if_free:cTF { l_siunitx_ \token_to_str:N #1 _options_tl } { \tl_new:cn { l_siunitx_ \token_to_str:N #1 _options_tl } {#3} } { \tl_set:cn { l_siunitx_ \token_to_str:N #1 _options_tl } {#3} } } \cs_new:Npn \siunitx_unit_first_token:n #1 { \exp_after:wN \token_to_str:N \tl_head_i:w #1 \q_nil } \cs_new:cpn { siunitx_ \token_to_str:N \per _literal:w } { / } \cs_new: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: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:cpn { siunitx_ \token_to_str:N \tothe _function:w } #1 { \siunitx_unit_parse_power_after:n {#1} } \keys_define:nn { siunitx } { free-standing-units .bool_set:N = \l_siunitx_create_free_bool, overwrite-functions .bool_set:N = \l_siunitx_create_overwrite_bool, space-before-unit .bool_set:N = \l_siunitx_create_prespace_bool, unit-optional-argument .bool_set:N = \l_siunitx_create_optional_bool, use-xspace .bool_set:N = \l_siunitx_create_xspace_bool } \siunitx_option_deactivate:n { free-standing-units, overwrite-functions, space-before-unit, unit-optional-argument, use-xspace } \cs_new_nopar:Npn \siunitx_unit_create_check: { \bool_if:NT \l_siunitx_create_free_bool { \siunitx_unit_create_functions: } } \AtBeginDocument { \siunitx_unit_create_check: } \cs_new_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:Npn \siunitx_unit_create:N #1 { \cs_if_free:NT #1 { \cs_set:Npx \siunitx_tmp:w { \DeclareDocumentCommand \exp_not:N #1 { } { \bool_if:NT \l_siunitx_create_prespace_bool { \exp_not:n { \ensuremath { \l_siunitx_number_unit_sep_tl } } } \exp_not:n { \siunitx_unit_in:nn {#1} { } } \bool_if:NT \l_siunitx_create_xspace_bool { \exp_not:N \xspace } } } \siunitx_tmp:w } } \cs_new:Npn \siunitx_unit_create_with_arg:N #1 { \cs_if_free:NT #1 { \cs_set:Npx \siunitx_tmp:w { \DeclareDocumentCommand \exp_not:N #1 { o } { \exp_not:N \IfNoValueTF {####1} { \exp_not:n { \siunitx_unit_in:nn {#1} { } } } { \bool_if:NT \l_siunitx_create_prespace_bool { \exp_not:n { \ensuremath { \l_siunitx_number_unit_sep_tl } } } \SI {####1} { \exp_not:N #1 } } \bool_if:NT \l_siunitx_create_xspace_bool { \exp_not:N \xspace } } } \siunitx_tmp:w } } \keys_define:nn { siunitx } { allow-literal-units .bool_set:N = \l_siunitx_unit_allow_literal_bool, } \keys_set:nn { siunitx } { allow-literal-units = true } \cs_new:Npn \siunitx_unit_in:nn #1#2 { \siunitx_unit_if_literal:nTF {#1} { \bool_if:NTF \l_siunitx_unit_allow_literal_bool { \siunitx_unit_format_literal:n {#1} } { \msg_error:nnx { siunitx } { literal-unit } {#1} } } { \siunitx_unit_parse:nn {#1} {#2} \siunitx_unit_format: } } \cs_generate_variant:Nn \siunitx_unit_in:nn { Vn } \cs_new: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 \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: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:Npn \siunitx_unit_parse:nn #1#2 { \siunitx_unit_parse_init: \siunitx_unit_parse_options:nn {#1} {#2} #1 } \cs_new_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:Npn \siunitx_unit_parse_init_aux:N #1 { \cs_set_eq:Nc #1 { siunitx_ \token_to_str:N #1 _function:w } } \cs_new:Npn \siunitx_unit_parse_options:nn #1#2 { \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:Npn \siunitx_unit_parse_power_before:n #1 { \tl_set:Nx \l_siunitx_tmpa_tl { power- \intexpr_eval:n { \l_siunitx_unit_int + 1 } } \prop_put:NVn \l_siunitx_unit_prop \l_siunitx_tmpa_tl {#1} } \cs_new: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: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: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_nopar:Npn \siunitx_unit_parse_per: { \tl_set:Nx \l_siunitx_tmpa_tl { per- \intexpr_eval:n { \l_siunitx_unit_int + 1 } } \prop_put:NVn \l_siunitx_unit_prop \l_siunitx_tmpa_tl { true } } \cs_new: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:Npn \siunitx_unit_parse_unit:n #1 { \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 { symbol- \int_use:N \l_siunitx_unit_int } \prop_put:NVn \l_siunitx_unit_prop \l_siunitx_tmpa_tl {#1} \siunitx_unit_parse_unit_per: } \cs_new_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_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 \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 \bool_new:N \l_siunitx_per_fraction_bool \tl_new:N \l_siunitx_per_mode_tl \tl_new:N \l_siunitx_qualifier_mode_tl \keys_define:nn { siunitx } { inter-unit-separator .tl_set:N = \l_siunitx_unit_separator_tl , per-mode .choice:, per-mode / fraction .code:n = { \bool_set_true:N \l_siunitx_per_fraction_bool \tl_set:Nn \l_siunitx_per_mode_tl { fraction } }, per-mode / power .code:n = { \bool_set_false:N \l_siunitx_per_fraction_bool \tl_clear:N \l_siunitx_per_mode_tl }, per-mode / repeated-symbol .code:n = { \bool_set_false:N \l_siunitx_per_fraction_bool \tl_set:Nn \l_siunitx_per_mode_tl { repeat } }, per-mode / symbol .code:n = { \bool_set_true:N \l_siunitx_per_fraction_bool \tl_set:Nn \l_siunitx_per_mode_tl { symbol } }, per-symbol .tl_set:N = \l_siunitx_per_symbol_tl, 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 } }, } \keys_set:nn { siunitx } { inter-unit-separator = \,, per-mode = power, per-symbol = /, qualifier-mode = subscript } \cs_new_nopar:Npn \siunitx_unit_format: { \siunitx_unit_format_init: \intexpr_compare:nT { \l_siunitx_unit_int > \c_zero } {\siunitx_unit_format_loop: } \bool_if:NT \l_siunitx_per_fraction_bool { \siunitx_unit_format_fraction: } } \cs_new_nopar:Npn \siunitx_unit_format_add: { \bool_if:NTF \l_siunitx_per_fraction_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_nopar:Npn \siunitx_unit_format_add_aux:n #1 { \tl_if_empty:cF { l_siunitx_unit #1 _tl } { \tl_if_eq:nVTF { repeat } \l_siunitx_per_mode_tl { \tl_set:Nx \l_siunitx_tmpa_tl { per- \intexpr_eval:n { \l_siunitx_unit_int + 1 } } \prop_if_in:NVF \l_siunitx_unit_prop \l_siunitx_tmpa_tl { \siunitx_tl_put_right_maths:NV \l_siunitx_unit_current_tl \l_siunitx_unit_separator_tl } } { \siunitx_tl_put_right_maths: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_nopar:Npn \siunitx_unit_format_fraction: { \intexpr_compare:nTF { \l_siunitx_unit_denominator_int > \c_zero } { \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_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:No \l_siunitx_unit_numerator_tl { \exp_after:wN { \l_siunitx_unit_numerator_tl } } \tl_put_left:Nn \l_siunitx_unit_numerator_tl { \PrintSIUnit } \tl_set:No \l_siunitx_unit_numerator_tl { \exp_after:wN { \l_siunitx_unit_numerator_tl } } \tl_set:No \l_siunitx_unit_denominator_tl { \exp_after:wN { \l_siunitx_unit_denominator_tl } } \tl_put_left:Nn \l_siunitx_unit_denominator_tl { \PrintSIUnit } \tl_set:No \l_siunitx_unit_denominator_tl { \exp_after:wN { \l_siunitx_unit_denominator_tl } } \tl_set:Nn \l_siunitx_unit_tl { \frac } \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:No \l_siunitx_unit_tl { \exp_after:wN \ensuremath \exp_after:wN { \l_siunitx_unit_tl } } } \cs_new_nopar:Npn \siunitx_unit_format_fraction_symbol: { \siunitx_unit_format_fraction_symbol_aux:n { numerator } \siunitx_unit_format_fraction_symbol_aux:n { denominator } \tl_set_eq:NN \l_siunitx_unit_tl \l_siunitx_unit_numerator_tl \siunitx_tl_put_right_maths: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_nopar:Npn \siunitx_unit_format_fraction_symbol_aux:n #1 { \intexpr_compare:nT { \int_use:c { l_siunitx_unit_ #1 _int } > \c_one } { \bool_if:NT \l_siunitx_brackets_bool { \siunitx_tl_put_left_maths:cV { l_siunitx_unit_ #1 _tl } \l_siunitx_bracket_open_tl \siunitx_tl_put_right_maths:cV { l_siunitx_unit_ #1 _tl } \l_siunitx_bracket_close_tl } } } \cs_new_nopar:Npn \siunitx_unit_format_init: { \tl_clear:N \l_siunitx_unit_tl \tl_clear:N \l_siunitx_unit_current_tl \tl_clear:N \l_siunitx_unit_denominator_tl \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 } \char_make_active:N \~ \cs_new: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:No \l_sunitx_tmpa_tl { \exp_after:wN \ensuremath \exp_after:wN { \l_siunitx_unit_separator_tl } } \tl_replace_all_in:NnV \l_siunitx_unit_tl { . } \l_sunitx_tmpa_tl \tl_replace_all_in:NnV \l_siunitx_unit_tl { ~ } \l_sunitx_tmpa_tl } \cs_new:Npn \siunitx_unit_print_literal_aux:N #1 { \cs_set_eq:Nc #1 { siunitx_ \token_to_str:N #1 _literal:w } } \char_make_ignore:N \~ \cs_new_nopar:Npn \siunitx_unit_format_loop: { \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 \intexpr_compare:nT { \l_siunitx_unit_int > \c_zero } { \siunitx_unit_format_loop: } } \cs_new_nopar:Npn \siunitx_unit_format_power: { \tl_set:Nx \l_siunitx_tmpa_tl { power- \int_use:N \l_siunitx_unit_int } \prop_if_in:NVTF \l_siunitx_unit_prop \l_siunitx_tmpa_tl { \prop_get:NVN \l_siunitx_unit_prop \l_siunitx_tmpa_tl \l_siunitx_tmpa_tl \siunitx_unit_format_power_aux: } { \tl_set:Nx \l_siunitx_tmpa_tl { per- \int_use:N \l_siunitx_unit_int } \prop_if_in:NVT \l_siunitx_unit_prop \l_siunitx_tmpa_tl { \tl_set:Nn \l_siunitx_tmpa_tl { 1 } \siunitx_unit_format_power_aux: } } } \cs_new_nopar:Npn \siunitx_unit_format_power_aux: { \tl_if_eq:nVTF { repeat } \l_siunitx_per_mode_tl { \siunitx_unit_format_power_repeat: } { \siunitx_unit_format_power_per: } \tl_if_eq:nVF { 1 } \l_siunitx_tmpa_tl { \siunitx_unit_format_power_brackets: \tl_put_right:Nx \l_siunitx_unit_current_tl { ^ { \PrintNumber { \exp_not:V \l_siunitx_tmpa_tl } } } } } \cs_new_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 { \bool_if:NT \l_siunitx_brackets_bool { \siunitx_tl_put_left_maths:NV \l_siunitx_unit_current_tl \l_siunitx_bracket_open_tl \siunitx_tl_put_right_maths:NV \l_siunitx_unit_current_tl \l_siunitx_bracket_close_tl } } } \cs_new_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_afer:wN \siunitx_tmp:w \l_siunitx_tmpa_tl \q_stop } { \tl_put_left:Nn \l_siunitx_tmpa_tl { - } } } } } \cs_new_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_maths:NV \l_siunitx_unit_current_tl \l_siunitx_per_symbol_tl } } \cs_new_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_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 \intexpr_compare:nT { \l_siunitx_unit_prefix_base_int = \c_zero } { \int_set:Nn \l_siunitx_unit_prefix_base_int { \l_siunitx_tmpa_tl } } \intexpr_compare:nTF { \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_nopar:Npn \siunitx_unit_format_prefix_number_calc: { \tl_set:Nx \l_siunitx_tmpa_tl { power- \int_use:N \l_siunitx_unit_int } \prop_if_in:NVTF \l_siunitx_unit_prop \l_siunitx_tmpa_tl { \prop_get:NVN \l_siunitx_unit_prop \l_siunitx_tmpa_tl \l_siunitx_tmpa_tl } { \tl_set:Nn \l_siunitx_tmpa_tl { 1 } } \tl_set:Nx \l_siunitx_unit_prefix_current_tl { \intexpr_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_nopar:Npn \siunitx_unit_format_prefix_symbol: { \tl_set_eq:NN \l_siunitx_unit_current_tl \l_siunitx_unit_prefix_current_tl } \cs_new_nopar:Npn \siunitx_unit_format_qualifier: { \tl_set:Nx \l_siunitx_tmpa_tl { qualifier- \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_tmpa_tl \use:c { siunitx_unit_format_qualifier_ \l_siunitx_qualifier_mode_tl : } } } \cs_new_nopar:Npn \siunitx_unit_format_qualifier_brackets: { \siunitx_tl_put_right_maths: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_maths:NV \l_siunitx_unit_current_tl \l_siunitx_bracket_close_tl } \char_make_active:N \~ \cs_new_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_new_nopar:Npn \siunitx_unit_format_qualifier_subscript: { \tl_put_right:No \l_siunitx_unit_current_tl { \exp_after:wN @ \exp_after:wN { \l_siunitx_tmpa_tl } } } } \cs_new_nopar:Npn \siunitx_unit_format_symbol: { \tl_set:Nx \l_siunitx_tmpa_tl { symbol- \int_use:N \l_siunitx_unit_int } \prop_if_in:NVTF \l_siunitx_unit_prop \l_siunitx_tmpa_tl { \prop_get:NVN \l_siunitx_unit_prop \l_siunitx_tmpa_tl \l_siunitx_tmpa_tl \tl_put_right:NV \l_siunitx_unit_current_tl \l_siunitx_tmpa_tl } { \msg_error:nn { siunitx } { prefix-only } } } \bool_new:N \l_siunitx_number_unit_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, number-unit-separator .tl_set:N = \l_siunitx_number_unit_separator_tl, repeated-units .choice:, repeated-units / false .code:n = { \bool_set_false:N \l_siunitx_number_unit_power_bool \bool_set_false:N \l_siunitx_number_unit_repeat_bool }, repeated-units / power .code:n = { \bool_set_true:N \l_siunitx_number_unit_power_bool \bool_set_false:N \l_siunitx_number_unit_repeat_bool }, repeated-units / true .code:n = { \bool_set_false:N \l_siunitx_number_unit_power_bool \bool_set_true:N \l_siunitx_number_unit_repeat_bool }, repeated-units .default:n = { true } } \keys_set:nn { siunitx } { number-unit-separator = \,, repeated-units = true } \cs_new:Npn \siunitx_unit_output:nn #1#2 { \siunitx_unit_in:nn {#1} {#2} \intexpr_compare:nF { \l_siunitx_unit_prefix_int = \c_zero } { \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_new_nopar:Npn \siunitx_unit_output_number_sep: { \bool_if:NTF \l_siunitx_number_unit_breaks_bool { \allowbreak } { \nobreak } \ensuremath { \l_siunitx_number_unit_separator_tl } } \tl_new:N \l_siunitx_pre_unit_tl \int_new:N \l_siunitx_number_product_int \cs_new: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 } \siunitx_combined_unit:nnn {#2} {#4} {#1} \siunitx_combined_loop:n {#2} } \cs_new:Npn \siunitx_combined_loop:n #1 { \intexpr_compare:nTF { \l_siunitx_unit_prefix_int = \c_zero } { \siunitx_number_output:n {#1} } { \tl_set:Nn \l_siunitx_tmpa_tl { #1 e } \tl_put_right:NV \l_siunitx_tmpa_tl \l_siunitx_unit_prefix_int \exp_args:NV \siunitx_number_output:n \l_siunitx_tmpa_tl } \siunitx_unit_output_number_sep: \siunitx_print:nV { unit } \l_siunitx_unit_tl } \cs_generate_variant:Nn \siunitx_combined_loop:n { V } \cs_new:Npn \siunitx_combined_number: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} \siunitx_number_output_print: } { \siunitx_print:nn { number } {#1} } } \cs_new:Npn \siunitx_combined_unit:nnn #1#2#3 { \bool_if:NTF \l_siunitx_number_unit_power_bool { \siunitx_combined_product_count:n {#1} \intexpr_compare:nTF { \l_siunitx_number_product_int > \c_zero } { \int_incr:N \l_siunitx_number_product_int \tl_set:Nn \l_siunitx_tmpa_tl {#2} \tl_set:No \l_siunitx_tmpb_tl { \exp_after:wN \tothe \exp_after:wN { \int_use:N \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: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: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 } } \keys_define:nn { siunitx } { range-phrase .tl_set:N = \l_siunitx_range_phrase_tl, } \keys_set:nn { siunitx } { range-phrase = { ~ to ~ } } \cs_new:Npn \siunitx_range_numbers:nn #1#2 { \siunitx_range_numbers_aux:n {#1} \text { \l_siunitx_range_phrase_tl } \siunitx_range_numbers_aux:n {#2} } \cs_new: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:NTF \l_siunitx_number_compound_bool { \msg_error:nnx { siunitx } { multi-part-range } {#1} } { \siunitx_number_output_print: } } { \siunitx_print:nn { number } {#1} } } \cs_new:Npn \siunitx_range_unit:nnnn #1#2#3#4 { \siunitx_unit_in:nn {#1} {#2} \siunitx_range_numbers_aux:n {#3} \siunitx_unit_output_number_sep: \siunitx_print:nV { unit } \l_siunitx_unit_tl \text { \l_siunitx_range_phrase_tl } \siunitx_range_numbers_aux:n {#4} \siunitx_unit_output_number_sep: \siunitx_print:nV { unit } \l_siunitx_unit_tl } \cs_new_nopar:Npn \siunitx_table_rewrite_cellspace: { \@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:N \NC@list { ##1 ##2 } } \exp_after:wN \siunitx_tmp:w \toks_use:N \NC@list \q_stop \cs_gundefine:N \NC@find@S } { } } \AtBeginDocument { \siunitx_table_rewrite_cellspace: } \cs_new_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: } } \use:c { siunitx_table_column_start_ #1 : } \NC@find } } \AtBeginDocument { \siunitx_table_rewrite_create:N S } \AtBeginDocument { \siunitx_table_rewrite_create:N s } \cs_new_nopar:Npn \siunitx_table_column_start_S: { } \cs_new_nopar:Npn \siunitx_table_column_start_s: { \group_execute_after:N \siunitx_table_column_start_s_aux: } \cs_new_nopar:Npn \siunitx_table_column_start_s_aux: { \bool_if:NF \l_siunitx_create_free_bool { \tl_map_inline:Nn \l_siunitx_declare_list_tl { \cs_set_protected_nopar:Npn ##1 { \ERROR } } } } \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 \bool_new:N \l_siunitx_table_collect_pre_bool \bool_new:N \l_siunitx_table_collect_post_bool \cs_new:Npn \siunitx_table_collect_begin:Nn #1#2 { \group_begin: \keys_set:nn { siunitx } {#2} \cs_set_eq:Nc \siunitx_table_collect_token:N { siunitx_table_collect_token_ #1 :N } \cs_set_eq:Nc \siunitx_table_print: { siunitx_table_print_ #1 : } \use:c { siunitx_table_collect_init_ #1 : } \siunitx_table_collect_get: } \cs_new:Npn \siunitx_table_collect_braced:n #1 { } \cs_new:Npn \siunitx_table_collect_expand:N #1 { \siunitx_if_tl:NTF #1 { \tl_use:N \siunitx_table_collect_pre_tl \tl_clear:N \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 \siunitx_table_collect_pre_bool { \tl_put_right:Nn \siunitx_table_collect_pre_tl {#1} } { \bool_set_true:N \siunitx_table_collect_post_bool \bool_set_false:N \siunitx_table_collect_pre_bool \tl_put_right:Nn \siunitx_table_collect_post_tl {#1} } } } \cs_new_nopar:Npn \siunitx_table_collect_get: { \cs_set_eq:NN \siunitx_table_collect_next: \siunitx_table_collect_get: \peek_charcode:NTF \c_group_begin_token { \siunitx_table_collect_braced:n } { \siunitx_table_collect_not_braced:N } } \cs_new_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 } \cs_new_nopar:Npn \siunitx_table_collect_init_s: { \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_nopar:Npn \siunitx_table_collect_init_S: { \siunitx_number_in_init: \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_nopar:Npn \siunitx_table_collect_next: { } \cs_new_nopar:Npn \siunitx_table_collect_newline: { \siunitx_table_print: \tabularnewline } \cs_new:Npn \siunitx_table_collect_not_braced:N #1 { \token_if_eq_meaning:NNF #1 \ignorespaces { \token_if_eq_meaning:NNF #1 \unskip { \siunitx_table_collect_not_braced_aux_i:N #1 } } \siunitx_table_collect_next: } \cs_new: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 { \csname \end \endtabular \relax \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:Npn \siunitx_table_collect_not_braced_aux_ii:N #1 { } \cs_new:Npn \siunitx_table_collect_token:N #1 { } \cs_new:Npn \siunitx_table_collect_token_s:N #1 { \tl_put_right:Nn \l_siunitx_table_collect_tl {#1} } \cs_new: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_tl \tl_put_right:Nn \l_siunitx_table_collect_tl {#1} } { \siunitx_table_collect_expand:N #1 } } } \keys_define:nn { siunitx } { redefine-symbols .bool_set:N = \l_siunitx_redefine_symbols_bool, } \keys_set:nn { siunitx } { redefine-symbols = true } \cs_new_nopar:Npn \siunitx_redefine_symbols: { \bool_if:NT \l_siunitx_redefine_symbols_bool { \@ifpackageloaded { textcomp } { \keys_set:nn { siunitx } { maths-degree = \text { \textdegree }, text-degree = \textdegree, } \@ifpackageloaded { mathptmx } { } { \keys_set:nn { siunitx } { text-micro = \textmu, text-ohm = \textohm } } \tl_if_eq:nVT { OT1 } \encodingdefault { \keys_set:nn { siunitx } { maths-angstrom = \text { \capitalring { A } }, text-angstrom = \capitalring { A } } } } { } \@ifpackageloaded { upgreek } { \keys_set:nn { siunitx } { maths-ohm = \Upomega } } { } } } \AtBeginDocument { \siunitx_redefine_symbols: } \keys_define:nn { siunitx } { math-angstrom .tl_set:N = \l_siunitx_angstrom_maths_tl, maths-angstrom .tl_set:N = \l_siunitx_angstrom_maths_tl, math-arcminute .tl_set:N = \l_siunitx_arcminute_maths_tl, maths-arcminute .tl_set:N = \l_siunitx_arcminute_maths_tl, math-arcsecond .tl_set:N = \l_siunitx_arcsecond_maths_tl, maths-arcsecond .tl_set:N = \l_siunitx_arcsecond_maths_tl, math-celsius .tl_set:N = \l_siunitx_celsius_maths_tl, maths-celsius .tl_set:N = \l_siunitx_celsius_maths_tl, math-degree .tl_set:N = \l_siunitx_degree_maths_tl, maths-degree .tl_set:N = \l_siunitx_degree_maths_tl, math-micro .tl_set:N = \l_siunitx_micro_maths_tl, maths-micro .tl_set:N = \l_siunitx_micro_maths_tl, math-ohm .tl_set:N = \l_siunitx_ohm_maths_tl, maths-ohm .tl_set:N = \l_siunitx_ohm_maths_tl, } \keys_set:nn { siunitx } { maths-angstrom = \text { \AA }, maths-arcminute = { } ^ { \prime }, maths-arcsecond = { } ^ { \prime \prime }, maths-celsius = { } ^ { \circ } \kern - \scriptspace C, maths-degree = { } ^ { \circ }, maths-micro = \text { \c_siunitx_mu_tl }, maths-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 C }, text-degree = \ensuremath { { } ^ { \circ } }, text-micro = \c_siunitx_mu_tl , text-ohm = \ensuremath { \c_siunitx_omega_tl }, } \cs_new:Npn \siunitx_symbol_new:n #1 { \exp_args:Nc \NewDocumentCommand { SIUnitSymbol #1 } { } { \mode_if_math:TF { \tl_to_lowercase:n { \use:c { l_siunitx_ #1 _maths_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 } \msg_new:nnnn { siunitx } { duplicate-decimal-token } {Duplicate decimal token.} {Only one decimal token can appear in a single number.} \msg_new:nnnn { siunitx } { duplicate-exponent-token } {Duplicate exponent token found.} {Only one exponent token can appear in a single number.} \msg_new:nnnn { siunitx } { duplicate-quotient-token } {Duplicate quotient token.} {Only one quotient token can appear in a single number.} \msg_new:nnnn { siunitx } { empty-exponent } {Empty exponent.} {The exponent contains no number.} \msg_new:nnnn { siunitx } { empty-number } {Empty numerical argument.} {The given `number' contains no information.} \msg_new:nnnn { siunitx } { empty-uncertainty } {Empty uncertainty given.} {The number given contains an empty uncertainty.} \msg_new:nnnn { siunitx } { ending-product-token } {Misplaced product token.} {A number cannot end with a product token.} \msg_new:nnnn { siunitx } { ending-quotient-token } {Misplaced quotient token.} {A number cannot end with a quotient token.} \msg_new:nnnn { siunitx } { invalid-token-in-number } {Invalid token `#1' in numerical input.} {% Only the tokens\\% \msg_space: \msg_space: #2\\% are valid for numerical input.% } \msg_new:nnnn { siunitx } { literal-unit } {Literal units disabled.} {% You gave the literal input `\exp_not:n {#1}'\\% but literal unit output is disabled.% } \msg_new:nnnn { siunitx } { multi-part-range } {Numerical range with multiple parts.} {% The input `#1' is a number which has more than one part.\\ Ranges can only contain one number in each part.% } \msg_new:nnnn { siunitx } { misplaced-complex-root } {Misplaced complex root.} {The complex root token `#1' can only come at the end of a number.} \msg_new:nnnn { siunitx } { misplaced-closing-uncertainty } {Misplaced closing uncertainty token.} {% The closing uncertainty token `#1' can only come at the end of a number.% } \msg_new:nnnn { siunitx } { misplaced-sign } {Misplaced sign token.} {The sign token `#1' can only come at the beginning of a number.} \msg_new:nnnn { siunitx } { misplaced-uncertainty } {Misplaced uncertainty token.} {The uncertainty token `#1' does not properly match another token.} \msg_new:nnn { siunitx } { option-preamble-only } {Option `#1' only available in the preamble.} \msg_new:nnnn { siunitx } { prefix-base-mismatch } {Prefix bases do not match.} {% You have asked for prefixes to be converted into a power,\\% but the bases do not match.% } \msg_new:nnn { siunitx } { prefix-only } {Prefix with no unit.} \msg_new:nnnn { siunitx } { qualifier-before-unit } {Qualifier before unit.} {Unit qualifiers have to follow after units, not before them.} \msg_new:nnnn { siunitx } { starting-product-token } {Misplaced product token.} {A number cannot begin with a product token.} \msg_new:nnnn { siunitx } { starting-quotient-token } {Misplaced quotient token.} {A number cannot begin with a quotient token.} \msg_new:nnnn { siunitx } { uncertainty-only } {Uncertainty but no number.} {A number contains an uncertainty part with no main value.} \DeclareDocumentCommand \DeclareSIPower { s m m } { \IfBooleanTF #1 { \siunitx_declare_power_after:Nn #2 {#3} } { \siunitx_declare_power_before:Nn #2 {#3} } } \DeclareDocumentCommand \DeclareSIPrefix { s m m m } { \IfBooleanTF #1 { \siunitx_declare_prefix:Nnnn #2 {#3} { 2 } {#4} } { \siunitx_declare_prefix:Nnnn #2 {#3} { 10 } {#4} } } \DeclareDocumentCommand \DeclareSIQualifier { m m } { \siunitx_declare_qualifier:Nn #1 {#2} } \DeclareDocumentCommand \DeclareSIUnit { o m m } { \IfNoValueTF {#1} { \siunitx_declare_unit:Nnn #2 {#3} { } } { \siunitx_declare_unit:Nnn #2 {#3} {#1} } } \@onlypreamble \DeclareSIPower \@onlypreamble \DeclareSIPrefix \@onlypreamble \DeclareSIQualifier \@onlypreamble \DeclareSIUnit \DeclareDocumentCommand \num { o m } { \group_begin: \IfNoValueF {#1} { \keys_set:nn { siunitx } {#1} } \siunitx_number_output:n {#2} \group_end: } \DeclareDocumentCommand \numrange { o m m } { \group_begin: \IfNoValueF {#1} { \keys_set:nn { siunitx } {#1} } \siunitx_range_numbers:nn {#2} {#3} \group_end: } \NewDocumentCommand \PrintNumber { m } { \siunitx_print:nn { number } {#1} } \NewDocumentCommand \PrintSIUnit { m } { \siunitx_print:nn { unit } {#1} } \DeclareDocumentCommand \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: } \DeclareDocumentCommand \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: } \DeclareDocumentCommand \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: } \DeclareDocumentCommand \sisetup { m } { \keys_set:nn { siunitx } {#1} } \cs_new_nopar:Npn \siunitx_contents_add_setup: { \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_aux:N } { \token_to_str:N \@writefile {##1} {##2} } } } \cs_new_nopar:Npn \siunitx_contents_add_aux:N #1 { \cs_set_nopar:Npn #1 { \token_to_str:N #1 } } \AtBeginDocument { \siunitx_contents_add_setup: } \cs_new_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 } \DeclareExpandableDocumentCommand \num { o m } {##2} \DeclareExpandableDocumentCommand \numrange { o m m } { ##2 \l_siunitx_range_phrase_tl ##3 } \DeclareExpandableDocumentCommand \si { o m } {##2} \DeclareExpandableDocumentCommand \SI { o m o m } { \IfNoValueF {##3} {##3} ##2~##4 } \DeclareExpandableDocumentCommand \SIrange { o m m m } { ##2~##4 \l_siunitx_range_phrase_tl ##3~##4 } \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] } } \cs_new_nopar:Npn \siunitx_hyperref_check: { \@ifpackageloaded { hyperref } { \pdfstringdefDisableCommands { \siunitx_contents_bookmarks: } } { } } \AtBeginDocument { \siunitx_hyperref_check: } \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 \degreeCelsius { \SIUnitSymbolCelsius } \DeclareSIUnit \coulomb { C } \DeclareSIUnit \farad { F } \DeclareSIUnit \gray { Gy } \DeclareSIUnit \hertz { Hz } \DeclareSIUnit \henry { H } \DeclareSIUnit \joule { J } \DeclareSIUnit \katal { kat } \DeclareSIUnit \lumen { lm } \DeclareSIUnit \lux { lx } \DeclareSIUnit \newton { N } \DeclareSIUnit \ohm { \SIUnitSymbolOhm } \DeclareSIUnit \pascal { Pa } \DeclareSIUnit \radian { rad } \DeclareSIUnit \siemens { S } \DeclareSIUnit \sievert { Sv } \DeclareSIUnit \steradian { sr } \DeclareSIUnit \tesla { T } \DeclareSIUnit \volt { V } \DeclareSIUnit \watt { W } \DeclareSIUnit \weber { Wb } \DeclareSIUnit[ number-unit-separator = ] \arcmin { \arcminute } \DeclareSIUnit[ number-unit-separator = ] \arcminute { \SIUnitSymbolArcminute } \DeclareSIUnit[ number-unit-separator = ] \arcsecond { \SIUnitSymbolArcsecond } \DeclareSIUnit \day { d } \DeclareSIUnit[ number-unit-separator = ] \degree { \SIUnitSymbolDegree } \DeclareSIUnit \hectare { ha } \DeclareSIUnit \hour { h } \DeclareSIUnit \litre { l } \DeclareSIUnit \liter { L } \DeclareSIUnit \minute { min } \DeclareSIUnit \percent { \char 37 } \DeclareSIUnit \tonne { t } \DeclareSIUnit \astronomicalunit { 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_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 } \DeclareSIPower \square { 2 } \DeclareSIPower* \squared { 2 } \DeclareSIPower \cubic { 3 } \DeclareSIPower* \cubed { 3 } \keys_define:nn { siunitx } { addsign .choice: , addsign / false .meta:n = { explicit-sign = }, addsign / true .meta:n = { explicit-sign = + }, allowlitunits .meta:n = { free-standing-units = #1 }, allowoptarg .meta:n = { unit-optional-argument = #1 }, allowzeroexp .meta:n = { retain-zero-exponent = #1 }, closeerr .meta:n = { close-bracket = #1 }, closefrac .meta:n = { close-bracket = #1 }, closerange .meta:n = { close-bracket = #1 }, colorall .code:n = , colourall .code:n = , colorneg .code:n = , colourneg .code:n = , colorunits .meta:n = , colourunits .meta:n = , colorvalues .meta:n = , colourvalues .meta:n = , decimalsymbol .choice: , decimalsymbol / cdot .code:n = { output-decimal-marker = { } \cdot { } }, decimalsymbol fullstop .code:n = { output-decimal-marker = { { . } } }, decimalsymbol / period .code:n = { output-decimal-marker = { { . } } }, decimalsymbol / stop .code:n = { output-decimal-marker = { { . } } }, decimalsymbol / tightcdot .code:n = { output-decimal-marker = \bgroup \cdot \egroup }, decimalsymbol / unknown .code:n = { output-decimal-marker = #1 }, debug .code:n = , detectdisplay .meta:n = { detect-display-maths = #1 }, digitsep .choice:, digitsep / cdot .code:n = { group-separator = { } \cdot { } }, digitsep / comma .code:n = { group-separator = { {,} } }, digitsep / fullstop .code:n = { group-separator = { { . } } }, digitsep / med .code:n = { group-separator = \: }, digitsep / medium .code:n = { group-separator = \: }, digitsep / none .code:n = { group-separator = }, digitsep / period .code:n = { group-separator = { { . } } }, digitsep / space .code:n = { group-separator = \text { ~ } }, digitsep / stop .code:n = { group-separator = { { . } } }, digitsep / thick .code:n = { group-separator = \; }, digitsep / thin .code:n = { group-separator = \, }, digitsep / tightcdot .code:n = { group-separator = \bgroup \cdot \egroup }, digitsep / tighttimes .code:n = { group-separator = \bgroup \times \egroup }, digitsep / times .code:n = { group-separator = \times }, digitsep / unknown .code:n = { group-separator = #1 }, dp .meta:n = { round-mode = places, round-places = #1, }, emulate .code:n = , errspace .choice: , errspace / med .code:n = { uncertainty-separator = \: }, errspace / medium .code:n = { uncertainty-separator = \: }, errspace / none .code:n = { uncertainty-separator = }, errspace / space .code:n = { uncertainty-separator = \text { ~ } }, errspace / thick .code:n = { uncertainty-separator = \; }, errspace / thin .code:n = { uncertainty-separator = \, }, errspace / unknown .code:n = { uncertainty-separator = #1 }, eVcorra .code:n = , eVcorrb .code:n = , expbase .choice: , expbase / ten .code:n = { exponent-base = 10 }, expbase / two .code:n = { exponent-base = 2 }, expbase / unknown .code:n = { exponent-base = #1 }, expproduct / cdot .code:n = { exponent-product = { } \cdot { } }, expproduct / tightcdot .code:n = { exponent-product = \bgroup \cdot \egroup }, expproduct / tighttimes .code:n = { exponent-product = \bgroup \times \egroup }, expproduct / times .code:n = { exponent-product = \times }, expproduct / unknown .code:n = { exponent-product = #1 }, fixdp .choice:, fixdp / false .meta:n = { round-mode = none }, fixdp / true .meta:n = { round-mode = places }, fixsf .choice: , fixsf / false .meta:n = { round-mode = none }, fixsf / true .meta:n = { round-mode = figures }, inlinebold .meta:n = { detect-inline-bold = #1 }, mathOmega .meta:n = { math-ohm = #1 }, mathcelsius .meta:n = { math-celsius = #1 }, mathdegree .meta:n = { math-degree = #1 }, mathminute .meta:n = { math-arcminute = #1 }, mathmu .meta:n = { math-micro = #1 }, mathringA .meta:n = { math-angstrom = #1 }, mathrm .meta:x = { math-rm = \exp_not:c {#1} }, mathsOmega .meta:n = { maths-ohm = #1 }, mathscelsius .meta:n = { maths-celsius = #1 }, mathsdegree .meta:n = { maths-degree = #1 }, mathsecond .meta:n = { math-arcsecond = #1 }, mathsf .meta:x = { math-sf = \exp_not:c {#1} }, mathsminute .meta:n = { maths-arcminute = #1 }, mathsmu .meta:n = { maths-micro = #1 }, mathsringA .meta:n = { maths-angstrom = #1 }, mathssecond .meta:n = { maths-arcsecond = #1 }, mathssf .meta:x = { maths-sf = \exp_not:c {#1} }, mathstt .meta:x = { maths-tt = \exp_not:c {#1} }, mathtt .meta:x = { math-tt = \exp_not:c {#1} }, negcolor .meta:n = { negative-color = #1 }, negcolour .meta:n = { negative-colour = #1 }, numaddn .meta:n = { input-symbols = #1 }, numcloseerr .meta:n = { input-close-uncertainty = #1 }, numdecimal .meta:n = { input-decimal-markers = #1 }, numdigits .meta:n = { input-digits = #1 }, numdiv .meta:n = { input-quotient = #1 }, numexp .meta:n = { input-exponent-markers = #1 }, numgobble .meta:n = { input-ignore = #1 }, numopenerr .meta:n = { input-open-uncertainty = #1 }, numprod .meta:n = { input-product = #1 }, numsign .meta:n = { input-signs = #1 }, obeyall .meta:n = { detect-all = #1 }, obeybold .meta:n = { detect-bold = #1 }, obeyitalic .meta:n = { detect-italic = #1 }, obeymode .meta:n = { detect-mode = #1 }, openerr .meta:n = { open-bracket = #1 }, openfrac .meta:n = { open-bracket = #1 }, openrange .meta:n = { open-bracket = #1 }, per .choice: , per / fraction .code:n = { per-mode = fraction }, per / reciprocal .code:n = { per-mode = reciprocal }, per / slash .code:n = { per-mode = symbol }, prefixsymbolic .meta:n = { prefixes-as-symbols = #1 }, prespace .meta:n = { space-before-unit = #1 }, redefsymbols .meta:n = { redefine-symbols = #1 }, retainplus .meta:n = { retain-explicit-plus = #1 }, seperr .meta:n = { separate-uncertainty = #1 }, seperr .meta:n = { separate-uncertainty = #1 }, sepfour .meta:n = { group-four-digits = true }, sf .meta:n = { round-mode = figures, round-places = #1, }, sign .meta:n = { explicit-sign = #1 }, slash .choice: , slash / slash .code:n = { per-symbol = / }, slash / unknown .code:n = { per symbol = #1 }, stickyper .meta:n = { sticky-per = #1 }, textOmega .meta:n = { text-ohm = #1 }, textcelsius .meta:n = { text-celsius = #1 }, textdegree .meta:n = { text-degree = #1 }, textminute .meta:n = { text-arcminute = #1 }, textmode .choice: , textmode / true .meta:n = { mode = text }, textmode / false .meta:n = { mode = maths }, textmode .default:n = { true }, textmu .meta:n = { text-micro = #1 }, textringA .meta:n = { text-angstrom = #1 }, textrm .meta:x = { text-rm = \exp_not:c {#1} }, textsecond .meta:n = { text-arcsecond = #1 }, textsf .meta:x = { text-sf = \exp_not:c {#1} }, texttt .meta:x = { text-tt = \exp_not:c {#1} }, tightpm .meta:n = { tight-spacing = #1 }, tophrase .meta:n = { range-phrase = #1 }, unitcolor .meta:n = { unit-color = #1 }, unitcolour .meta:n = { unit-colour = #1 }, unitmathrm .meta:x = { unit-math-rm = \exp_not:c {#1} }, unitmathsf .meta:x = { unit-math-sf = \exp_not:c {#1} }, unitmathsrm .meta:x = { unit-maths-rm = \exp_not:c {#1} }, unitmathssf .meta:x = { unit-maths-sf = \exp_not:c {#1} }, unitmathstt .meta:x = { unit-maths-tt = \exp_not:c {#1} }, unitmathtt .meta:x = { unit-math-tt = \exp_not:c {#1} }, unitmode .meta:n = { unit-mode = #1 }, unitsep .choice: , unitsep / cdot .code:n = { inter-unit-separator = { } \cdot { } }, unitsep / comma .code:n = { inter-unit-separator = { {,} } }, unitsep / fullstop .code:n = { inter-unit-separator = { { . } } }, unitsep / med .code:n = { inter-unit-separator = \: }, unitsep / medium .code:n = { inter-unit-separator = \: }, unitsep / none .code:n = { inter-unit-separator = }, unitsep / period .code:n = { inter-unit-separator = { { . } } }, unitsep / space .code:n = { inter-unit-separator = \text { ~ } }, unitsep / stop .code:n = { inter-unit-separator = { { . } } }, unitsep / thick .code:n = { inter-unit-separator = \; }, unitsep / thin .code:n = { inter-unit-separator = \, }, unitsep / tightcdot .code:n = { inter-unit-separator = \bgroup \cdot \egroup }, unitsep / tighttimes .code:n = { inter-unit-separator = \bgroup \times \egroup }, unitsep / times .code:n = { inter-unit-separator = \times }, unitsep / unknown .code:n = { inter-unit-separator = #1 }, unitspace .choice: , unitspace / med .code:n = { inter-unit-separator = \: }, unitspace / medium .code:n = { inter-unit-separator = \: }, unitspace / none .code:n = { inter-unit-separator = }, unitspace / space .code:n = { inter-unit-separator = \text { ~ } }, unitspace / thick .code:n = { inter-unit-separator = \; }, unitspace / thin .code:n = { inter-unit-separator = \, }, unitspace / unknown .code:n = { inter-unit-separator = #1 }, valuecolor .meta:n = { number-color = #1 }, valuecolour .meta:n = { number-colour = #1 }, valuemathrm .meta:x = { number-math-rm = \exp_not:c {#1} }, valuemathsf .meta:x = { number-math-sf = \exp_not:c {#1} }, valuemathsrm .meta:x = { number-maths-rm = \exp_not:c {#1} }, valuemathssf .meta:x = { number-maths-sf = \exp_not:c {#1} }, valuemathstt .meta:x = { number-maths-tt = \exp_not:c {#1} }, valuemathtt .meta:x = { number-math-tt = \exp_not:c {#1} }, valuemode .meta:n = { number-mode = #1 }, valuesep .choice: , valuesep / cdot .code:n = { unit-value-separator = { } \cdot { } }, valuesep / comma .code:n = { unit-value-separator = { {,} } }, valuesep / fullstop .code:n = { unit-value-separator = { { . } } }, valuesep / med .code:n = { unit-value-separator = \: }, valuesep / medium .code:n = { unit-value-separator = \: }, valuesep / none .code:n = { unit-value-separator = }, valuesep / period .code:n = { unit-value-separator = { { . } } }, valuesep / space .code:n = { unit-value-separator = \text { ~ } }, valuesep / stop .code:n = { unit-value-separator = { { . } } }, valuesep / thick .code:n = { unit-value-separator = \; }, valuesep / thin .code:n = { unit-value-separator = \, }, valuesep / tightcdot .code:n = { unit-value-separator = \bgroup \cdot \egroup }, valuesep / tighttimes .code:n = { unit-value-separator = \bgroup \times \egroup }, valuesep / times .code:n = { unit-value-separator = \times }, valuesep / unknown .code:n = { unit-value-separator = #1 }, xspace .meta:n = { use-xspace = #1 } } %% %% Copyright (C) 2008-2009 by %% Joseph Wright %% %% It may be distributed and/or modified under the conditions of %% the LaTeX Project Public License (LPPL), either version 1.3c of %% this license or (at your option) any later version. The latest %% version of this license is in the file: %% %% http://www.latex-project.org/lppl.txt %% %% This work is "maintained" (as per LPPL maintenance status) by %% Joseph Wright. %% %% This work consists of the file siunitx.dtx %% and the derived files siunitx.pdf, %% siunitx.sty and %% siunitx.ins. %% %% %% End of file `siunitx.sty'.