%% %% This is file `siunitx.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% siunitx.dtx (with options: `package,init') %% siunitx-angle.dtx (with options: `package') %% siunitx-complex.dtx (with options: `package') %% siunitx-compound.dtx (with options: `package') %% siunitx-locale.dtx (with options: `package') %% siunitx-number.dtx (with options: `package') %% siunitx-print.dtx (with options: `package') %% siunitx-table.dtx (with options: `package') %% siunitx-unit.dtx (with options: `package') %% siunitx-quantity.dtx (with options: `package') %% siunitx-symbol.dtx (with options: `package') %% siunitx-abbreviation.dtx (with options: `package') %% siunitx-binary.dtx (with options: `package') %% siunitx-command.dtx (with options: `package') %% siunitx-emulation.dtx (with options: `package,options') %% siunitx.dtx (with options: `package,options') %% siunitx.dtx (with options: `package,interfaces') %% siunitx-emulation.dtx (with options: `package,interfaces') %% \providecommand\DeclareRelease[3]{} \providecommand\DeclareCurrentRelease[2]{} \DeclareRelease{2}{2010-05-23}{siunitx-v2.sty} \DeclareRelease{v2}{2010-05-23}{siunitx-v2.sty} \DeclareCurrentRelease{}{2021-05-17} \@ifundefined{ExplLoaderFileDate} {\RequirePackage{expl3}} {} \@ifl@t@r\ExplLoaderFileDate{2020-01-09} {} {% \PackageError{siunitx}{Support package expl3 too old} {% You need to update your installation of the bundles 'l3kernel' and 'l3packages'.\MessageBreak Loading~siunitx~will~abort!% }% \endinput }% \ProvidesExplPackage {siunitx} {2021-10-26} {3.0.34} {A comprehensive (SI) units package} \msg_new:nnnn { siunitx } { incompatible-package } { Package~'#1'~incompatible. } { The~#1~package~and~siunitx~are~incompatible. } \cs_new_protected:Npn \__siunitx_load_check:n #1 { \@ifpackageloaded {#1} { \msg_error:nnx { siunitx } { incompatible-package } {#1} } { } } \clist_map_function:nN { SIunits , sistyle , unitsdef , fancyunits } \__siunitx_load_check:n \AtBeginDocument { \clist_map_function:nN { SIunits , sistyle } \__siunitx_load_check:n } \providecommand \IfFormatAtLeastTF { \@ifl@t@r \fmtversion } \tl_new:N \l__siunitx_tmp_tl \bool_new:N \l__siunitx_angle_tmp_bool \dim_new:N \l__siunitx_angle_tmp_dim \tl_new:N \l__siunitx_angle_tmp_tl \keys_define:nn { siunitx } { angle-mode .choice: , angle-mode / arc .code:n = { \bool_set_true:N \l__siunitx_angle_force_arc_bool \bool_set_false:N \l__siunitx_angle_force_decimal_bool } , angle-mode / decimal .code:n = { \bool_set_false:N \l__siunitx_angle_force_arc_bool \bool_set_true:N \l__siunitx_angle_force_decimal_bool } , angle-mode / input .code:n = { \bool_set_false:N \l__siunitx_angle_force_arc_bool \bool_set_false:N \l__siunitx_angle_force_decimal_bool } , angle-symbol-degree .tl_set:N = \l__siunitx_angle_symbol_degree_tl , angle-symbol-minute .tl_set:N = \l__siunitx_angle_symbol_minute_tl , angle-symbol-second .tl_set:N = \l__siunitx_angle_symbol_second_tl , angle-symbol-over-decimal .bool_set:N = \l__siunitx_angle_astronomy_bool , angle-separator .tl_set:N = \l__siunitx_angle_separator_tl , fill-angle-degrees .bool_set:N = \l__siunitx_angle_fill_degrees_bool , fill-angle-minutes .bool_set:N = \l__siunitx_angle_fill_minutes_bool , fill-angle-seconds .bool_set:N = \l__siunitx_angle_fill_seconds_bool , number-angle-product .tl_set:N = \l__siunitx_angle_product_tl } \bool_new:N \l__siunitx_angle_force_arc_bool \bool_new:N \l__siunitx_angle_force_decimal_bool \cs_new_protected:Npn \siunitx_angle:n #1 { \bool_if:NTF \l__siunitx_angle_force_arc_bool { \exp_args:Ne \__siunitx_angle_arc_convert:n { \fp_eval:n {#1} } } { \siunitx_number_parse:nN {#1} \l__siunitx_angle_degrees_tl \siunitx_number_process:NN \l__siunitx_angle_degrees_tl \l__siunitx_angle_degrees_tl \tl_set:Nx \l__siunitx_angle_degrees_tl { \siunitx_number_output:NN \l__siunitx_angle_degrees_tl \q_nil } \__siunitx_angle_arc_print:VVV \l__siunitx_angle_degrees_tl \c_empty_tl \c_empty_tl } } \cs_new_protected:Npn \siunitx_angle:nnn #1#2#3 { \bool_if:NTF \l__siunitx_angle_force_decimal_bool { \exp_args:Ne \siunitx_angle:n { \fp_eval:n { #1 + (#2) / 60 + (#3) / 3600 } } } { \__siunitx_angle_arc_sign:nnn {#1} {#2} {#3} } } \cs_new_protected:Npn \__siunitx_angle_arc_convert:n #1 { \use:x { \siunitx_angle:nnn { \fp_eval:n { trunc(#1,0) } } { \fp_eval:n { trunc((#1 - trunc(#1,0)) * 60,0) } } { \fp_eval:n { ( (#1 - trunc(#1,0)) * 60 - trunc((#1 - trunc(#1,0)) * 60,0) ) * 60 } } } } \tl_new:N \l__siunitx_angle_degrees_tl \tl_new:N \l__siunitx_angle_minutes_tl \tl_new:N \l__siunitx_angle_seconds_tl \tl_new:N \l__siunitx_angle_sign_tl \cs_new_protected:Npn \__siunitx_angle_arc_sign:nnn #1#2#3 { \group_begin: \keys_set:nn { siunitx } { input-close-uncertainty = , input-exponent-markers = , input-open-uncertainty = , input-uncertainty-signs = } \tl_clear:N \l__siunitx_angle_sign_tl \__siunitx_angle_arc_sign:nn {#1} { degrees } \__siunitx_angle_arc_sign:nn {#2} { minutes } \__siunitx_angle_arc_sign:nn {#3} { seconds } \tl_if_empty:NF \l__siunitx_angle_sign_tl { \clist_map_inline:nn { degrees , minutes , seconds } { \tl_if_empty:cF { l__siunitx_angle_ ##1 _tl } { \tl_set:cx { l__siunitx_angle_ ##1 _tl } { { } { \exp_not:V \l__siunitx_angle_sign_tl } \exp_after:wN \exp_after:wN \exp_after:wN \__siunitx_angle_sign:nnnnnnn \cs:w l__siunitx_angle_ ##1 _tl \cs_end: } \clist_map_break: } } } \clist_map_inline:nn { degrees , minutes , seconds } { \tl_if_empty:cF { l__siunitx_angle_ ##1 _tl } { \exp_args:Ncc \siunitx_number_process:NN { l__siunitx_angle_ ##1 _tl } { l__siunitx_angle_ ##1 _tl } \tl_set:cx { l__siunitx_angle_ ##1 _tl } { \exp_args:Nc \siunitx_number_output:NN { l__siunitx_angle_ ##1 _tl } \q_nil } } } \__siunitx_angle_arc_print:VVV \l__siunitx_angle_degrees_tl \l__siunitx_angle_minutes_tl \l__siunitx_angle_seconds_tl \group_end: } \cs_new_protected:Npn \__siunitx_angle_arc_sign:nn #1#2 { \tl_if_blank:nTF {#1} { \bool_if:cTF { l__siunitx_angle_fill_ #2 _bool } { \tl_set:cn { l__siunitx_angle_ #2 _tl } { { } { } { 0 } { } { } { } { 0 } } } { \tl_clear:c { l__siunitx_angle_ #2 _tl } } } { \siunitx_number_parse:nN {#1} \l__siunitx_angle_tmp_tl \exp_after:wN \__siunitx_angle_extract_sign:nnnnnnnn \l__siunitx_angle_tmp_tl {#2} } } \cs_new_protected:Npn \__siunitx_angle_extract_sign:nnnnnnnn #1#2#3#4#5#6#7#8 { \tl_if_blank:nTF {#2} { \tl_set_eq:cN { l__siunitx_angle_ #8 _tl } \l__siunitx_angle_tmp_tl } { \tl_set:cn { l__siunitx_angle_ #8 _tl } { {#1} { } {#3} {#4} {#5} {#6} {#7} } \tl_set:Nn \l__siunitx_angle_sign_tl {#2} \keys_set:nn { siunitx } { input-comparators = , input-signs = } } } \cs_new:Npn \__siunitx_angle_sign:nnnnnnn #1#2#3#4#5#6#7 { \exp_not:n { {#3} {#4} {#5} {#6} {#7} } } \box_new:N \l__siunitx_angle_marker_box \box_new:N \l__siunitx_angle_unit_box \cs_new_protected:Npn \__siunitx_angle_arc_print:nnn #1#2#3 { \__siunitx_angle_arc_print_auxi:nVn {#1} \l__siunitx_angle_symbol_degree_tl {#2#3} \__siunitx_angle_arc_print_auxi:nVn {#2} \l__siunitx_angle_symbol_minute_tl {#3} \__siunitx_angle_arc_print_auxi:nVn {#3} \l__siunitx_angle_symbol_second_tl { } } \cs_generate_variant:Nn \__siunitx_angle_arc_print:nnn { VVV } \cs_new_protected:Npn \__siunitx_angle_arc_print_auxi:nnn #1#2#3 { \tl_if_blank:nF {#1} { \bool_if:NTF \l__siunitx_angle_astronomy_bool { \__siunitx_angle_arc_print_auxii:nw {#2} #1 \q_stop } { \__siunitx_angle_arc_print_auxv:w #1 \q_stop \__siunitx_angle_arc_print_auxvi:n {#2} } \tl_if_blank:nF {#3} { \nobreak \l__siunitx_angle_separator_tl } } } \cs_generate_variant:Nn \__siunitx_angle_arc_print_auxi:nnn { nV } \cs_new_protected:Npn \__siunitx_angle_arc_print_auxii:nw #1#2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop { \mode_if_math:TF { \bool_set_true:N \l__siunitx_angle_tmp_bool } { \bool_set_false:N \l__siunitx_angle_tmp_bool } \siunitx_print_number:n {#2#3#4} \tl_if_blank:nTF {#6} { \__siunitx_angle_arc_print_auxvi:n {#1} } { \hbox_set:Nn \l__siunitx_angle_marker_box { \__siunitx_angle_arc_print_auxiii:n { \siunitx_print_number:n {#5} } } \hbox_set:Nn \l__siunitx_angle_unit_box { \__siunitx_angle_arc_print_auxiii:n { \siunitx_unit_format:nN {#1} \l__siunitx_angle_tmp_tl \siunitx_print_unit:V \l__siunitx_angle_tmp_tl \skip_horizontal:n { -\scriptspace } } } \dim_compare:nNnTF { \box_wd:N \l__siunitx_angle_marker_box } > { \box_wd:N \l__siunitx_angle_unit_box } { \__siunitx_angle_arc_print_auxiv:NN \l__siunitx_angle_marker_box \l__siunitx_angle_unit_box } { \__siunitx_angle_arc_print_auxiv:NN \l__siunitx_angle_unit_box \l__siunitx_angle_marker_box } \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box \l__siunitx_angle_tmp_dim { \hbox_overlap_right:n { \box_use_drop:N \l__siunitx_angle_marker_box } \hbox_overlap_right:n { \box_use_drop:N \l__siunitx_angle_unit_box } \tex_hfil:D } \box_use:N \l__siunitx_angle_marker_box \skip_horizontal:N \scriptspace \siunitx_print_number:n {#6} } } \cs_new_protected:Npn \__siunitx_angle_arc_print_auxiii:n #1 { \bool_if:NTF \l__siunitx_angle_tmp_bool { \ensuremath } { \use:n } {#1} } \cs_new_protected:Npn \__siunitx_angle_arc_print_auxiv:NN #1#2 { \dim_set:Nn \l__siunitx_angle_tmp_dim { \box_wd:N #1 } \hbox_set_to_wd:Nnn #2 \l__siunitx_angle_tmp_dim { \tex_hss:D \hbox_unpack_drop:N #2 \tex_hss:D } } \cs_new_protected:Npn \__siunitx_angle_arc_print_auxv:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_stop { \siunitx_print_number:n {#1#2#3#4#5} } \cs_new_protected:Npn \__siunitx_angle_arc_print_auxvi:n #1 { \nobreak \l__siunitx_angle_product_tl \siunitx_unit_format:nN {#1} \l__siunitx_angle_tmp_tl \siunitx_print_unit:V \l__siunitx_angle_tmp_tl } \keys_set:nn { siunitx } { angle-mode = input , angle-symbol-degree = \degree , angle-symbol-minute = \arcminute , angle-symbol-over-decimal = false , angle-symbol-second = \arcsecond , angle-separator = , fill-angle-degrees = false , fill-angle-minutes = false , fill-angle-seconds = false , number-angle-product = } \fp_new:N \l__siunitx_complex_tmp_fp \tl_new:N \l__siunitx_complex_tmp_tl \tl_new:N \l__siunitx_complex_input_tl \tl_new:N \l__siunitx_complex_comparator_tl \tl_new:N \l__siunitx_complex_exp_tl \tl_new:N \l__siunitx_complex_real_tl \tl_new:N \l__siunitx_complex_img_tl \tl_new:N \l__siunitx_complex_join_tl \tl_new:N \l__siunitx_complex_sign_tl \bool_new:N \l__siunitx_complex_root_after_bool \keys_define:nn { siunitx } { complex-root-position .choice: , complex-root-position / after-number .code:n = { \bool_set_true:N \l__siunitx_complex_root_after_bool } , complex-root-position / before-number .code:n = { \bool_set_false:N \l__siunitx_complex_root_after_bool } , input-complex-root .tl_set:N = \l__siunitx_complex_input_root_tl , output-complex-root .tl_set:N = \l__siunitx_complex_output_root_tl } \cs_new_protected:Npn \__siunitx_complex_parse:nNN #1#2#3 { \group_begin: \__siunitx_complex_parse_clear: \protected@edef \l__siunitx_complex_arg_tl {#1} \tl_set_eq:NN \l__siunitx_complex_input_tl \l__siunitx_complex_arg_tl \siunitx_number_normalize_symbols:N \l__siunitx_complex_arg_tl \tl_if_empty:NF \l__siunitx_complex_arg_tl { \__siunitx_complex_parse_comparator: } \__siunitx_complex_parse_check: \cs_set_protected:Npx \__siunitx_complex_parse_end: { \tl_set:Nn \exp_not:N #2 { \exp_not:V \l__siunitx_complex_real_tl } \tl_set:Nn \exp_not:N #3 { \exp_not:V \l__siunitx_complex_img_tl } } \exp_after:wN \group_end: \__siunitx_complex_parse_end: } \cs_new_protected:Npn \__siunitx_complex_parse_end: { } \cs_new_protected:Npn \__siunitx_complex_parse_clear: { \tl_clear:N \l__siunitx_complex_real_tl \tl_clear:N \l__siunitx_complex_img_tl \tl_clear:N \l__siunitx_complex_exp_tl \tl_clear:N \l__siunitx_complex_sign_tl \tl_clear:N \l__siunitx_complex_join_tl } \cs_new_protected:Npn \__siunitx_complex_parse_check: { \bool_lazy_all:nTF { { \tl_if_empty_p:N \l__siunitx_complex_real_tl } { \tl_if_empty_p:N \l__siunitx_complex_img_tl } { \tl_if_empty_p:N \l__siunitx_complex_exp_tl } } { \msg_error:nnx { siunitx } { invalid-complex-number } { \exp_not:V \l__siunitx_complex_input_tl } } { \__siunitx_complex_parse_finalise: } } \cs_new_protected:Npn \__siunitx_complex_parse_finalise: { \tl_if_empty:NTF \l__siunitx_complex_img_tl { \__siunitx_complex_parse_finalise:N \l__siunitx_complex_real_tl } { \tl_if_empty:NTF \l__siunitx_complex_real_tl { \__siunitx_complex_parse_finalise:N \l__siunitx_complex_img_tl } { \__siunitx_complex_parse_finalise:N \l__siunitx_complex_real_tl \tl_set_eq:NN \l__siunitx_complex_sign_tl \l__siunitx_complex_join_tl \__siunitx_complex_parse_finalise:N \l__siunitx_complex_img_tl } } } \cs_new_protected:Npn \__siunitx_complex_parse_finalise:N #1 { \tl_set:Nx #1 { \exp_not:V \l__siunitx_complex_comparator_tl \exp_not:V \l__siunitx_complex_sign_tl \exp_not:V #1 \exp_not:V \l__siunitx_complex_exp_tl } \tl_clear:N \l__siunitx_complex_comparator_tl \tl_clear:N \l__siunitx_complex_sign_tl \siunitx_number_parse:VN #1 #1 } \cs_new_protected:Npn \__siunitx_complex_parse_comparator: { \exp_after:wN \__siunitx_complex_parse_comparator_aux:Nw \l__siunitx_complex_arg_tl \q_stop } \cs_new_protected:Npn \__siunitx_complex_parse_comparator_aux:Nw #1#2 \q_stop { \tl_if_in:NnTF \l_siunitx_number_input_comparator_tl {#1} { \tl_set:Nn \l__siunitx_complex_comparator_tl {#1} \tl_set:Nn \l__siunitx_complex_arg_tl {#2} } { \tl_clear:N \l__siunitx_complex_comparator_tl } \tl_if_empty:NF \l__siunitx_complex_arg_tl { \__siunitx_complex_parse_sign: } } \cs_new_protected:Npn \__siunitx_complex_parse_exponent: { \tl_if_empty:NTF \l_siunitx_number_input_exponent_tl { \__siunitx_complex_parse_root: } { \tl_set:Nx \l__siunitx_complex_tmp_tl { \tl_head:V \l_siunitx_number_input_exponent_tl } \tl_map_inline:Nn \l_siunitx_number_input_exponent_tl { \tl_replace_all:NnV \l__siunitx_complex_arg_tl {##1} \l__siunitx_complex_tmp_tl } \use:x { \cs_set_protected:Npn \exp_not:N \__siunitx_complex_parse_exponent_auxi:w ####1 \exp_not:V \l__siunitx_complex_tmp_tl ####2 \exp_not:V \l__siunitx_complex_tmp_tl ####3 \exp_not:N \q_stop } { \__siunitx_complex_parse_exponent_auxii:nn {##1} {##2} } \use:x { \__siunitx_complex_parse_exponent_auxi:w \exp_not:V \l__siunitx_complex_arg_tl \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_nil \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_stop } } } \cs_new_protected:Npn \__siunitx_complex_parse_exponent_auxi:w { } \cs_new_protected:Npn \__siunitx_complex_parse_exponent_auxii:nn #1#2 { \quark_if_nil:nF {#2} { \tl_set:Nn \l__siunitx_complex_arg_tl {#1} \tl_set:Nx \l__siunitx_complex_exp_tl { \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:n {#2} } } \__siunitx_complex_parse_root: } \cs_new_protected:Npn \__siunitx_complex_parse_root: { \tl_if_empty:NTF \l__siunitx_complex_input_root_tl { \tl_set_eq:NN \l__siunitx_complex_real_tl \l__siunitx_complex_arg_tl } { \tl_set:Nx \l__siunitx_complex_tmp_tl { \tl_head:V \l__siunitx_complex_input_root_tl } \tl_map_inline:Nn \l__siunitx_complex_input_root_tl { \tl_replace_all:NnV \l__siunitx_complex_arg_tl {##1} \l__siunitx_complex_tmp_tl } \use:x { \cs_set_protected:Npn \exp_not:N \__siunitx_complex_parse_root_auxi:w ####1 \exp_not:V \l__siunitx_complex_tmp_tl ####2 \exp_not:V \l__siunitx_complex_tmp_tl ####3 \exp_not:N \q_stop } { \__siunitx_complex_parse_root_auxii:nn {##1} {##2} } \use:x { \__siunitx_complex_parse_root_auxi:w \exp_not:V \l__siunitx_complex_arg_tl \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_nil \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_stop } } } \cs_new_protected:Npn \__siunitx_complex_parse_root_auxi:w { } \cs_new_protected:Npn \__siunitx_complex_parse_root_auxii:nn #1#2 { \quark_if_nil:nTF {#2} { \tl_set:Nn \l__siunitx_complex_real_tl {#1} } { \tl_set:Nn \l__siunitx_complex_img_tl {#2} \tl_if_blank:nTF {#1} { \tl_if_blank:nT {#2} { \tl_set:Nn \l__siunitx_complex_img_tl { 1 } } } { \tl_if_blank:nTF {#2} { \__siunitx_complex_parse_split:n {#1} } { \__siunitx_complex_parse_sign_check:n {#1} } } } } \cs_new_protected:Npn \__siunitx_complex_parse_sign: { \exp_after:wN \__siunitx_complex_parse_sign_aux:Nw \l__siunitx_complex_arg_tl \q_stop } \cs_new_protected:Npn \__siunitx_complex_parse_sign_aux:Nw #1#2 \q_stop { \tl_if_in:NnT \l_siunitx_number_input_sign_tl {#1} { \tl_set:Nn \l__siunitx_complex_sign_tl {#1} \tl_set:Nn \l__siunitx_complex_arg_tl {#2} } \tl_if_empty:NF \l__siunitx_complex_arg_tl { \__siunitx_complex_parse_exponent: } } \cs_new_protected:Npn \__siunitx_complex_parse_sign_check:n #1 { \__siunitx_complex_parse_sign_check:nN { } #1 \q_recursion_tail \q_recursion_stop } \cs_new_protected:Npn \__siunitx_complex_parse_sign_check:nN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 { \__siunitx_complex_parse_clear: } \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#2} { \__siunitx_complex_parse_sign_check:nNw {#1} #2 } { \__siunitx_complex_parse_sign_check:nN {#1#2} } } \cs_new_protected:Npn \__siunitx_complex_parse_sign_check:nNw #1#2 #3 \q_recursion_tail \q_recursion_stop { \tl_if_blank:nTF {#3} { \tl_if_blank:nTF {#1} { \__siunitx_complex_parse_clear: } { \tl_set:Nn \l__siunitx_complex_real_tl {#1} \tl_set:Nn \l__siunitx_complex_join_tl {#2} } } { \__siunitx_complex_parse_clear: } } \cs_new_protected:Npn \__siunitx_complex_parse_split:n #1 { \__siunitx_complex_parse_split:nN { } #1 \q_recursion_tail \q_recursion_stop } \cs_new_protected:Npn \__siunitx_complex_parse_split:nN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 { \tl_set:Nn \l__siunitx_complex_img_tl {#1} } \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#2} { \tl_set:Nn \l__siunitx_complex_real_tl {#1} \tl_set:Nn \l__siunitx_complex_join_tl {#2} \__siunitx_complex_parse_split:w } { \__siunitx_complex_parse_split:nN {#1#2} } } \cs_new_protected:Npn \__siunitx_complex_parse_split:w #1 \q_recursion_tail \q_recursion_stop { \tl_set:Nx \l__siunitx_complex_img_tl { \tl_if_blank:nTF {#1} { 1 } { \exp_not:n {#1} } } \tl_if_empty:NT \l__siunitx_complex_real_tl { \__siunitx_complex_parse_clear: } } \tl_new:N \l__siunitx_complex_bracket_close_tl \tl_new:N \l__siunitx_complex_bracket_open_tl \tl_set:Nn \l__siunitx_complex_bracket_open_tl { ( } \tl_set:Nn \l__siunitx_complex_bracket_close_tl { ) } \tl_new:N \l__siunitx_complex_unit_tl \cs_new_protected:Npn \siunitx_complex_number:n #1 { \group_begin: \bool_if:NTF \l_siunitx_number_parse_bool { \__siunitx_complex_parse:nNN {#1} \l__siunitx_complex_real_tl \l__siunitx_complex_img_tl \__siunitx_complex_format:n { } } { \siunitx_number_format:nN {#1} \l__siunitx_complex_tmp_tl \siunitx_print_number:V \l__siunitx_complex_tmp_tl } \group_end: } \cs_new_protected:Npn \siunitx_complex_quantity:nn #1#2 { \group_begin: \bool_if:NTF \l_siunitx_number_parse_bool { \__siunitx_complex_parse:nNN {#1} \l__siunitx_complex_real_tl \l__siunitx_complex_img_tl \__siunitx_complex_format:n {#2} } { \siunitx_quantity:nn {#1} {#2} } \group_end: } \cs_new_protected:Npn \__siunitx_complex_format:n #1 { \bool_lazy_and:nnF { \tl_if_empty_p:N \l__siunitx_complex_real_tl } { \tl_if_empty_p:N \l__siunitx_complex_img_tl } { \__siunitx_complex_format_auxi:n {#1} } } \cs_new_protected:Npn \__siunitx_complex_format_auxi:n #1 { \tl_clear:N \l__siunitx_complex_tmp_tl \tl_if_empty:NTF \l__siunitx_complex_img_tl { \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl \tl_set:Nx \l__siunitx_complex_tmp_tl { \siunitx_number_output:N \l__siunitx_complex_real_tl } } { \__siunitx_complex_format_auxii:n {#1} } \tl_if_blank:nTF {#1} { \siunitx_print_number:V \l__siunitx_complex_tmp_tl } { \siunitx_quantity_print:VV \l__siunitx_complex_tmp_tl \l__siunitx_complex_unit_tl } } \cs_new_protected:Npn \__siunitx_complex_format_auxii:n #1 { \__siunitx_complex_format_units:n {#1} \tl_if_empty:NF \l__siunitx_complex_real_tl { \exp_after:wN \__siunitx_complex_drop_exponent:nnnnnnn \l__siunitx_complex_real_tl } \exp_after:wN \__siunitx_complex_format_sign:nnnnnnn \l__siunitx_complex_img_tl \exp_after:wN \__siunitx_complex_format_unary:nnnnnnn \l__siunitx_complex_img_tl \tl_set:Nx \l__siunitx_complex_tmp_tl { \siunitx_number_output:NN \l__siunitx_complex_img_tl \q_nil } \exp_after:wN \__siunitx_complex_extract_exponent:w \l__siunitx_complex_tmp_tl \q_stop \tl_set:Nx \l__siunitx_complex_tmp_tl { \bool_lazy_or:nnTF { \bool_lazy_and_p:nn { \l_siunitx_number_bracket_ambiguous_bool } { ! \tl_if_empty_p:N \l__siunitx_complex_exp_tl } } { ! \bool_lazy_any_p:n { { \tl_if_blank_p:n {#1} } { \tl_if_empty_p:N \l__siunitx_complex_real_tl } { \tl_if_empty_p:N \l__siunitx_complex_img_tl } } } { \__siunitx_complex_format_bracket:n } { \use:n } { \siunitx_number_output:N \l__siunitx_complex_real_tl \exp_not:V \l__siunitx_complex_sign_tl \bool_if:NF \l__siunitx_complex_root_after_bool { \exp_not:V \l__siunitx_complex_output_root_tl } \exp_not:V \l__siunitx_complex_tmp_tl \bool_if:NT \l__siunitx_complex_root_after_bool { \exp_not:V \l__siunitx_complex_output_root_tl } } \exp_not:V \l__siunitx_complex_exp_tl } } \cs_new_protected:Npn \__siunitx_complex_drop_exponent:nnnnnnn #1#2#3#4#5#6#7 { \tl_set:Nn \l__siunitx_complex_real_tl { {#1} {#2} {#3} {#4} {#5} { } { 0 } } } \cs_new_protected:Npn \__siunitx_complex_format_sign:nnnnnnn #1#2#3#4#5#6#7 { \tl_set:Nx \l__siunitx_complex_img_tl { { } { \tl_if_blank:nTF {#2} { \tl_if_empty:NF \l__siunitx_complex_real_tl { + } } { \exp_not:n {#2} } } \tl_if_blank:nTF {#4} { \str_if_eq:nnTF {#3} { 1 } { { } { } } { \exp_not:n { {#3} {#4} } } } { \exp_not:n { {#3} {#4} } } \exp_not:n { {#5} {#6} {#7} } } } \cs_new_protected:Npn \__siunitx_complex_extract_exponent:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_nil #9 \q_stop { \tl_set:Nn \l__siunitx_complex_sign_tl {#1#2} \__siunitx_complex_extract_exponent_aux:nw {#3#4#5#6#7#8} #9 \q_stop } \cs_new:Npn \__siunitx_complex_extract_exponent_aux:nw #1#2 \q_nil #3 \q_nil #4 \q_stop { \tl_set:Nn \l__siunitx_complex_tmp_tl {#1#2} \tl_set:Nn \l__siunitx_complex_exp_tl {#3#4} } \cs_new_protected:Npn \__siunitx_complex_format_unary:nnnnnnn #1#2#3#4#5#6#7 { \tl_set:Nx \l__siunitx_complex_img_tl { \exp_not:n { {#1} {#2} } \tl_if_blank:nTF {#4} { \str_if_eq:nnTF {#3} { 1 } { { } { } } { \exp_not:n { {#3} {#4} } } } { \exp_not:n { {#3} {#4} } } \exp_not:n { {#5} {#6} {#7} } } } \cs_new_protected:Npn \__siunitx_complex_format_bracket:n #1 { \exp_not:V \l__siunitx_complex_bracket_open_tl #1 \exp_not:V \l__siunitx_complex_bracket_close_tl } \cs_new_protected:Npn \__siunitx_complex_format_units:n #1 { \tl_if_blank:nTF {#1} { \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl } { \use:c { __siunitx_complex_format_ \l_siunitx_quantity_prefix_mode_tl :n } {#1} } } \cs_new_protected:cpn { __siunitx_complex_format_combine-exponent:n } #1 { \tl_if_empty:NF \l__siunitx_complex_real_tl { \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl } \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl \fp_set:Nn \l__siunitx_complex_tmp_fp { \exp_after:wN \__siunitx_complex_extract_exp:nnnnnnn \l__siunitx_complex_img_tl } \__siunitx_complex_drop_exp:N \l__siunitx_complex_real_tl \__siunitx_complex_drop_exp:N \l__siunitx_complex_img_tl \siunitx_unit_format_combine_exponent:nnN {#1} \l__siunitx_complex_tmp_fp \l__siunitx_complex_unit_tl } \cs_new_protected:cpx { __siunitx_complex_format_extract-exponent:n } #1 { \exp_not:N \siunitx_unit_format_extract_prefixes:nNN {#1} \exp_not:N \l__siunitx_complex_unit_tl \exp_not:N \l__siunitx_complex_tmp_fp \exp_not:c { __siunitx_complex_format_extract-exponent:N } \exp_not:N \l__siunitx_complex_img_tl \exp_not:N \tl_if_empty:NF \exp_not:N \l__siunitx_complex_real_tl { \exp_not:c { __siunitx_complex_format_extract-exponent:N } \exp_not:N \l__siunitx_complex_real_tl } } \cs_new_protected:cpn { __siunitx_complex_format_extract-exponent:N } #1 { \tl_set:Nx #1 { \siunitx_number_adjust_exponent:Nn #1 \l__siunitx_complex_tmp_fp } \siunitx_number_process:NN #1 #1 } \cs_new_protected:Npn \__siunitx_complex_format_input:n #1 { \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl \siunitx_unit_format:nN {#1} \l__siunitx_complex_unit_tl } \cs_new:Npn \__siunitx_complex_extract_exp:nnnnnnn #1#2#3#4#5#6#7 { #6#7 } \cs_new_protected:Npn \__siunitx_complex_drop_exp:N #1 { \exp_after:wN \__siunitx_complex_drop_exp:nnnnnnnN #1 #1 } \cs_new_protected:Npn \__siunitx_complex_drop_exp:nnnnnnnN #1#2#3#4#5#6#7#8 { \tl_set:Nn #8 { {#1} {#2} {#3} {#4} {#5} { } { 0 } } } \msg_new:nnnn { siunitx } { invalid-complex-number } { Invalid~complex-number~'#1'. } { The~input~'#1'~could~not~be~parsed~as~a~complex|number~following~the~ format~defined~in~module~documentation. } \keys_set:nn { siunitx } { complex-root-position = after-number , input-complex-root = ij , output-complex-root = \mathrm { i } } \cs_generate_variant:Nn \keys_set:nn { nx } \fp_new:N \l__siunitx_compound_tmp_fp \seq_new:N \l__siunitx_compound_tmp_seq \tl_new:N \l__siunitx_compound_tmp_tl \tl_new:N \l__siunitx_compound_first_tl \tl_new:N \l__siunitx_compound_exp_tl \tl_new:N \l__siunitx_compound_start_tl \tl_new:N \l__siunitx_compound_end_tl \int_new:N \l__siunitx_compound_count_int \bool_new:N \l__siunitx_compound_unit_bool \tl_new:N \l__siunitx_compound_unit_tl \tl_new:N \l__siunitx_compound_bracket_close_tl \tl_new:N \l__siunitx_compound_bracket_open_tl \tl_set:Nn \l__siunitx_compound_bracket_open_tl { ( } \tl_set:Nn \l__siunitx_compound_bracket_close_tl { ) } \bool_new:N \l__siunitx_compound_exp_bracket_bool \bool_new:N \l__siunitx_compound_exp_combine_bool \bool_new:N \l__siunitx_compound_separator_text_bool \bool_new:N \l__siunitx_compound_unit_bracket_bool \bool_new:N \l__siunitx_compound_unit_power_bool \bool_new:N \l__siunitx_compound_unit_repeat_bool \keys_define:nn { siunitx } { compound-exponents .choice: , compound-exponents / combine .code:n = { \bool_set_false:N \l__siunitx_compound_exp_bracket_bool \bool_set_true:N \l__siunitx_compound_exp_combine_bool } , compound-exponents / combine-bracket .code:n = { \bool_set_true:N \l__siunitx_compound_exp_bracket_bool \bool_set_true:N \l__siunitx_compound_exp_combine_bool } , compound-exponents / individual .code:n = { \bool_set_false:N \l__siunitx_compound_exp_bracket_bool \bool_set_false:N \l__siunitx_compound_exp_combine_bool } , compound-final-separator .tl_set:N = \l__siunitx_compound_separator_final_tl , compound-pair-separator .tl_set:N = \l__siunitx_compound_separator_pair_tl , compound-separator .tl_set:N = \l__siunitx_compound_separator_tl , compound-separator-mode .choice: , compound-separator-mode / number .code:n = { \bool_set_false:N \l__siunitx_compound_separator_text_bool } , compound-separator-mode / text .code:n = { \bool_set_true:N \l__siunitx_compound_separator_text_bool } , compound-units .choice: , compound-units / bracket .code:n = { \bool_set_true:N \l__siunitx_compound_unit_bracket_bool \bool_set_false:N \l__siunitx_compound_unit_power_bool \bool_set_false:N \l__siunitx_compound_unit_repeat_bool } , compound-units / bracket-power .code:n = { \bool_set_true:N \l__siunitx_compound_unit_bracket_bool \bool_set_true:N \l__siunitx_compound_unit_power_bool \bool_set_false:N \l__siunitx_compound_unit_repeat_bool } , compound-units / power .code:n = { \bool_set_false:N \l__siunitx_compound_unit_bracket_bool \bool_set_true:N \l__siunitx_compound_unit_power_bool \bool_set_false:N \l__siunitx_compound_unit_repeat_bool } , compound-units / repeat .code:n = { \bool_set_false:N \l__siunitx_compound_unit_bracket_bool \bool_set_false:N \l__siunitx_compound_unit_power_bool \bool_set_true:N \l__siunitx_compound_unit_repeat_bool } , compound-units / single .code:n = { \bool_set_false:N \l__siunitx_compound_unit_bracket_bool \bool_set_false:N \l__siunitx_compound_unit_power_bool \bool_set_false:N \l__siunitx_compound_unit_repeat_bool } } \cs_new_protected:Npn \siunitx_compound_number:n #1 { \group_begin: \bool_set_false:N \l__siunitx_compound_unit_bool \__siunitx_compound_format:nn {#1} { } \__siunitx_compound_print:N \siunitx_print_number:x \group_end: } \cs_new_protected:Npn \__siunitx_compound_format:nn #1#2 { \seq_clear:N \l__siunitx_compound_tmp_seq \bool_if:NTF \l_siunitx_number_parse_bool { \exp_args:Nxx \__siunitx_compound_format:nnn { \tl_head:n {#1} } { \tl_tail:n {#1} } {#2} } { \tl_map_function:nN {#1} \__siunitx_compound_unparsed:n } } \cs_new_protected:Npn \__siunitx_compound_format:nnn #1#2#3 { \siunitx_number_parse:nN {#1} \l__siunitx_compound_tmp_tl \bool_if:NTF \l__siunitx_compound_unit_bool { \__siunitx_compound_format_units:nn {#2} {#3} } { \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl } \bool_lazy_and:nnTF { \l__siunitx_compound_exp_combine_bool } { \int_compare_p:nNn { \tl_count:n {#2} } > 0 } { \__siunitx_compound_extract_exponents: } { \bool_if:NTF \l__siunitx_compound_unit_bool { \tl_set:Nx \l__siunitx_compound_tmp_tl { \siunitx_number_output:NN \l__siunitx_compound_first_tl \q_nil } \tl_set:Nx \l__siunitx_compound_tmp_tl { \__siunitx_compound_uncert_bracket:N \l__siunitx_compound_tmp_tl } } { \tl_set:Nx \l__siunitx_compound_tmp_tl { \siunitx_number_output:N \l__siunitx_compound_first_tl } } \seq_put_right:NV \l__siunitx_compound_tmp_seq \l__siunitx_compound_tmp_tl } \tl_map_function:nN {#2} \__siunitx_compound_parsed:n } \cs_new_protected:Npn \__siunitx_compound_extract_exponents: { \tl_set:Nx \l__siunitx_compound_tmp_tl { \siunitx_number_output:NN \l__siunitx_compound_first_tl \q_nil } \exp_after:wN \__siunitx_compound_extract_exponents_auxi:w \l__siunitx_compound_tmp_tl \q_stop } \cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxi:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_nil #9 \q_stop { \__siunitx_compound_extract_exponents_auxii:nw {#1#2#3#4#5#6#7#8} #9 \q_stop } \cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxii:nw #1#2 \q_nil #3 \q_nil #4 \q_stop { \seq_put_right:Nn \l__siunitx_compound_tmp_seq { #1#2 } \tl_set:Nn \l__siunitx_compound_exp_tl { #3#4 } \exp_after:wN \__siunitx_compound_extract_exponents_auxiii:nnnnnnn \l__siunitx_compound_first_tl } \cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxiii:nnnnnnn #1#2#3#4#5#6#7 { \keys_set:nn { siunitx } { drop-exponent = true , exponent-mode = fixed , fixed-exponent = #6#7 } } \cs_new_protected:Npn \__siunitx_compound_parsed:n #1 { \bool_if:NTF \l__siunitx_compound_unit_bool { \siunitx_number_parse:nN {#1} \l__siunitx_compound_tmp_tl \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_tmp_tl \tl_set:Nx \l__siunitx_compound_tmp_tl { \siunitx_number_output:NN \l__siunitx_compound_tmp_tl \q_nil } \tl_set:Nx \l__siunitx_compound_tmp_tl { \__siunitx_compound_uncert_bracket:N \l__siunitx_compound_tmp_tl } } { \siunitx_number_format:nN {#1} \l__siunitx_compound_tmp_tl } \seq_put_right:NV \l__siunitx_compound_tmp_seq \l__siunitx_compound_tmp_tl } \cs_new_protected:Npn \__siunitx_compound_unparsed:n #1 { \seq_put_right:Nn \l__siunitx_compound_tmp_seq { \ensuremath {#1} } } \cs_new_protected:Npn \__siunitx_compound_format_units:nn #1#2 { \bool_if:NTF \l__siunitx_compound_unit_power_bool { \use:c { __siunitx_compound_format_ \l_siunitx_quantity_prefix_mode_tl :nn } {#2} { \tl_count:n {#1} + 1 } } { \use:c { __siunitx_compound_format_ \l_siunitx_quantity_prefix_mode_tl :n } {#2} } } \cs_new_protected:cpx { __siunitx_compound_format_combine-exponent:n } #1 { \exp_not:c { __siunitx_compound_format_combine-exponent_aux:n } { \exp_not:N \siunitx_unit_format_combine_exponent:nnN {#1} } } \cs_new_protected:cpx { __siunitx_compound_format_combine-exponent:nn } #1#2 { \exp_not:c { __siunitx_compound_format_combine-exponent_aux:n } { \exp_not:N \siunitx_unit_format_multiply_combine_exponent:nnnN {#1} {#2} } } \cs_new_protected:cpn { __siunitx_compound_format_combine-exponent_aux:n } #1 { \bool_set_true:N \l__siunitx_compound_exp_combine_bool \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl \exp_args:NV \__siunitx_compound_extract_exp:nN \l__siunitx_compound_first_tl \l__siunitx_compound_tmp_fp #1 \l__siunitx_compound_tmp_fp \l__siunitx_compound_unit_tl } \cs_new_protected:cpx { __siunitx_compound_format_extract-exponent:n } #1 { \exp_not:c { __siunitx_compound_format_extract-exponent_aux:n } { \exp_not:N \siunitx_unit_format_extract_prefixes:nNN {#1} } } \cs_new_protected:cpx { __siunitx_compound_format_extract-exponent:nn } #1#2 { \exp_not:c { __siunitx_compound_format_extract-exponent_aux:n } { \exp_not:N \siunitx_unit_format_multiply_extract_prefixes:nnNN {#1} {#2} } } \cs_new_protected:cpn { __siunitx_compound_format_extract-exponent_aux:n } #1 { #1 \l__siunitx_compound_unit_tl \l__siunitx_compound_tmp_fp \tl_set:Nx \l__siunitx_compound_tmp_tl { \siunitx_number_adjust_exponent:Nn \l__siunitx_compound_tmp_tl \l__siunitx_compound_tmp_fp } \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl \bool_set_true:N \l__siunitx_compound_exp_combine_bool } \cs_new_protected:Npn \__siunitx_compound_format_input:n #1 { \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl \siunitx_unit_format:nN {#1} \l__siunitx_compound_unit_tl } \cs_new_protected:Npn \__siunitx_compound_format_input:nn #1#2 { \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl \siunitx_unit_format_multiply:nnN {#1} {#2} \l__siunitx_compound_unit_tl } \cs_new_protected:Npn \__siunitx_compound_extract_exp:nN #1#2 { \__siunitx_compound_extract_exp:nnnnnnnN #1 #2 } \cs_new_protected:Npn \__siunitx_compound_extract_exp:nnnnnnnN #1#2#3#4#5#6#7#8 { \fp_set:Nn #8 {#6#7} } \cs_new_protected:Npn \siunitx_compound_quantity:nn #1#2 { \group_begin: \bool_if:NT \l__siunitx_compound_unit_bracket_bool { \bool_set_true:N \l__siunitx_compound_exp_bracket_bool } \bool_if:NT \l__siunitx_compound_unit_repeat_bool { \bool_set_false:N \l__siunitx_compound_exp_combine_bool } \bool_lazy_or:nnT { \l__siunitx_compound_unit_bracket_bool } { ! \l__siunitx_compound_unit_repeat_bool } { \bool_set_false:N \l_siunitx_number_bracket_ambiguous_bool } \bool_set_true:N \l__siunitx_compound_unit_bool \__siunitx_compound_format:nn {#1} {#2} \bool_if:NF \l_siunitx_number_parse_bool { \siunitx_unit_format:nN {#2} \l__siunitx_compound_unit_tl } \str_if_eq:VnT \l_siunitx_quantity_prefix_mode_tl { combine-exponent } { \tl_clear:N \l__siunitx_compound_exp_tl } \bool_if:NTF \l__siunitx_compound_unit_repeat_bool { \__siunitx_compound_print:N \__siunitx_compound_print_quantity:x } { \bool_lazy_and:nnTF { \l__siunitx_compound_unit_bracket_bool } { \tl_if_empty_p:N \l__siunitx_compound_exp_tl } { \siunitx_print_number:V \l__siunitx_compound_bracket_open_tl \__siunitx_compound_print:N \siunitx_print_number:x \siunitx_print_number:V \l__siunitx_compound_bracket_close_tl } { \__siunitx_compound_print:N \siunitx_print_number:x } \__siunitx_compound_print_quantity:n { } } \group_end: } \cs_new_protected:Npn \__siunitx_compound_print:N #1 { \bool_lazy_and:nnTF { \l__siunitx_compound_exp_bracket_bool } { ! \tl_if_empty_p:N \l__siunitx_compound_exp_tl } { \__siunitx_compound_print:xxN { \exp_not:V \l__siunitx_compound_bracket_open_tl } { \exp_not:V \l__siunitx_compound_bracket_close_tl \exp_not:V \l__siunitx_compound_exp_tl } #1 } { \__siunitx_compound_print:xxN { } { \exp_not:V \l__siunitx_compound_exp_tl } #1 } } \cs_new_protected:Npn \__siunitx_compound_print:nnN #1#2#3 { \exp_args:Nx \__siunitx_compound_print:nnnN { \seq_count:N \l__siunitx_compound_tmp_seq } {#1} {#2} #3 } \cs_generate_variant:Nn \__siunitx_compound_print:nnN { xx } \cs_new_protected:Npn \__siunitx_compound_print:nnnN #1#2#3#4 { \int_case:nnF {#1} { { 0 } { } { 1 } { #4 { \seq_item:Nn \l__siunitx_compound_tmp_seq { 1 } } } { 2 } { #4 { \exp_not:n {#2} \seq_item:Nn \l__siunitx_compound_tmp_seq { 1 } } \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_pair_tl #4 { \seq_item:Nn \l__siunitx_compound_tmp_seq { 2 } \exp_not:n {#3} } } } { \int_set:Nn \l__siunitx_compound_count_int {#1} \tl_set:Nn \l__siunitx_compound_start_tl {#2} \tl_set:Nn \l__siunitx_compound_end_tl {#3} \cs_set_eq:NN \__siunitx_compound_print_aux:n #4 \seq_map_indexed_function:NN \l__siunitx_compound_tmp_seq \__siunitx_compound_print_aux:nn } } \cs_new_protected:Npn \__siunitx_compound_print_aux:n #1 { } \cs_new_protected:Npn \__siunitx_compound_print_aux:nn #1#2 { \int_case:nnF {#1} { { 1 } { \__siunitx_compound_print_aux:n { \exp_not:V \l__siunitx_compound_start_tl \exp_not:n {#2} } \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_tl } { \l__siunitx_compound_count_int - 1 } { \__siunitx_compound_print_aux:n { \exp_not:n {#2} } \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_final_tl } { \l__siunitx_compound_count_int } { \__siunitx_compound_print_aux:n { \exp_not:n {#2} \exp_not:V \l__siunitx_compound_end_tl } } } { \__siunitx_compound_print_aux:n { \exp_not:n {#2} } \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_tl } } \cs_new_protected:Npn \__siunitx_compound_print_quantity:n #1 { \siunitx_quantity_print:nV {#1} \l__siunitx_compound_unit_tl } \cs_generate_variant:Nn \__siunitx_compound_print_quantity:n { x } \cs_new_protected:Npn \__siunitx_compound_print_separator:n #1 { \bool_if:NTF \l__siunitx_compound_separator_text_bool { #1 } { \siunitx_print_number:n {#1} } } \cs_generate_variant:Nn \__siunitx_compound_print_separator:n { V } \cs_new:Npn \__siunitx_compound_uncert_bracket:N #1 { \exp_after:wN \__siunitx_compound_uncert_bracket:w #1 \q_stop } \cs_new:Npn \__siunitx_compound_uncert_bracket:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_nil #9 \q_stop { \__siunitx_compound_uncert_bracket:nnw {#1#2#3#4#5#6} {#7#8} #9 \q_stop } \cs_new:Npn \__siunitx_compound_uncert_bracket:nnw #1#2 #3 \q_nil #4 \q_nil #5 \q_stop { \bool_lazy_or:nnTF { \tl_if_blank_p:n {#2#3} } { ! \tl_if_blank_p:n {#5} } { \exp_not:n {#1#2#3#4#5} } { \exp_not:V \l__siunitx_compound_bracket_open_tl \exp_not:n {#1#2#3} \exp_not:V \l__siunitx_compound_bracket_close_tl \exp_not:n {#4#5} } } \tl_new:N \l__siunitx_list_exp_tl \tl_new:N \l__siunitx_list_units_tl \keys_define:nn { siunitx } { list-exponents .choices:nn = { combine , combine-bracket , individual } { \tl_set_eq:NN \l__siunitx_list_exp_tl \l_keys_choice_tl } , list-final-separator .tl_set:N = \l_siunitx_list_separator_final_tl , list-pair-separator .tl_set:N = \l_siunitx_list_separator_pair_tl , list-separator .tl_set:N = \l_siunitx_list_separator_tl , list-units .choices:nn = { bracket , repeat , single } { \tl_set_eq:NN \l__siunitx_list_units_tl \l_keys_choice_tl } } \cs_new_protected:Npn \siunitx_number_list:nn #1 { \group_begin: \__siunitx_list_aux: \siunitx_compound_number:n {#1} \group_end: } \cs_new_protected:Npn \siunitx_quantity_list:nn #1#2 { \group_begin: \__siunitx_list_aux: \siunitx_compound_quantity:nn {#1} {#2} \group_end: } \cs_new_protected:Npn \__siunitx_list_aux: { \keys_set:nx { siunitx } { compound-exponents = \l__siunitx_list_exp_tl , compound-final-separator = { \exp_not:V \l_siunitx_list_separator_final_tl } , compound-pair-separator = { \exp_not:V \l_siunitx_list_separator_pair_tl } , compound-separator = { \exp_not:V \l_siunitx_list_separator_tl } , compound-separator-mode = text , compound-units = \l__siunitx_list_units_tl } } \tl_new:N \l__siunitx_product_exp_tl \bool_new:N \l__siunitx_product_phrase_bool \tl_new:N \l__siunitx_product_units_tl \keys_define:nn { siunitx } { product-exponents .choices:nn = { combine , combine-bracket , individual } { \tl_set_eq:NN \l__siunitx_product_exp_tl \l_keys_choice_tl } , product-mode .choice: , product-mode / phrase .code:n = { \bool_set_true:N \l__siunitx_product_phrase_bool } , product-mode / symbol .code:n = { \bool_set_false:N \l__siunitx_product_phrase_bool } , product-phrase .tl_set:N = \l__siunitx_product_phrase_tl , product-symbol .tl_set:N = \l__siunitx_product_symbol_tl , product-units .choices:nn = { bracket , bracket-power , power , repeat , single } { \tl_set_eq:NN \l__siunitx_product_units_tl \l_keys_choice_tl } } \cs_new_protected:Npn \siunitx_number_product:n #1 { \group_begin: \__siunitx_product_aux: \siunitx_compound_number:n {#1} \group_end: } \cs_new_protected:Npn \siunitx_quantity_product:nn #1#2 { \group_begin: \__siunitx_product_aux: \siunitx_compound_quantity:nn {#1} {#2} \group_end: } \cs_new_protected:Npn \__siunitx_product_aux: { \bool_if:NTF \l__siunitx_product_phrase_bool { \__siunitx_product_aux:x { \exp_not:V \l__siunitx_product_phrase_tl } } { \__siunitx_product_aux:x { { } \exp_not:V \l__siunitx_product_symbol_tl { } } } } \cs_new_protected:Npn \__siunitx_product_aux:n #1 { \keys_set:nx { siunitx } { compound-exponents = \l__siunitx_product_exp_tl , compound-final-separator = { \exp_not:n {#1} } , compound-pair-separator = { \exp_not:n {#1} } , compound-separator = { \exp_not:n {#1} } , compound-separator-mode = \bool_if:NTF \l__siunitx_product_phrase_bool { text } { number } , compound-units = \l__siunitx_product_units_tl } } \cs_generate_variant:Nn \__siunitx_product_aux:n { x } \tl_new:N \l__siunitx_range_exp_tl \tl_new:N \l__siunitx_range_units_tl \keys_define:nn { siunitx } { range-exponents .choices:nn = { combine , combine-bracket , individual } { \tl_set_eq:NN \l__siunitx_range_exp_tl \l_keys_choice_tl } , range-phrase .tl_set:N = \l_siunitx_range_phrase_tl , range-units .choices:nn = { bracket , repeat , single } { \tl_set_eq:NN \l__siunitx_range_units_tl \l_keys_choice_tl } } \cs_new_protected:Npn \siunitx_number_range:nn #1#2 { \group_begin: \__siunitx_range_aux: \siunitx_compound_number:n { {#1} {#2} } \group_end: } \cs_new_protected:Npn \siunitx_quantity_range:nnn #1#2#3 { \group_begin: \__siunitx_range_aux: \siunitx_compound_quantity:nn { {#1} {#2} } {#3} \group_end: } \cs_new_protected:Npn \__siunitx_range_aux: { \keys_set:nx { siunitx } { compound-exponents = \l__siunitx_range_exp_tl , compound-pair-separator = { \exp_not:V \l_siunitx_range_phrase_tl } , compound-separator-mode = text , compound-units = \l__siunitx_range_units_tl } } \keys_set:nn { siunitx } { compound-exponents = individual , compound-final-separator = { \ifmmode \ \else \space \fi \text { and } \ifmmode \ \else \space \fi } , compound-pair-separator = { \ifmmode \ \else \space \fi \text { and } \ifmmode \ \else \space \fi } , compound-separator = { , \ifmmode \ \else \space \fi } , compound-separator-mode = text , compound-units = repeat , list-exponents = individual , list-final-separator = { \ifmmode \ \else \space \fi \text { and } \ifmmode \ \else \space \fi } , list-pair-separator = { \ifmmode \ \else \space \fi \text { and } \ifmmode \ \else \space \fi } , list-separator = { , \ifmmode \ \else \space \fi } , list-units = repeat , product-exponents = individual , product-mode = symbol , product-phrase = { \ifmmode \ \else \space \fi \text { by } \ifmmode \ \else \space \fi } , product-symbol = \times , product-units = repeat , range-exponents = individual , range-phrase = { \ifmmode \ \else \space \fi \text { to } \ifmmode \ \else \space \fi } , range-units = repeat } \keys_define:nn { siunitx } { locale .choice: , locale / DE .meta:n = { exponent-product = \cdot , inter-unit-product = \, , output-decimal-marker = { , } } , locale / FR .meta:n = { exponent-product = \times , inter-unit-product = \, , output-decimal-marker = { , } } , locale / UK .meta:n = { exponent-product = \times , inter-unit-product = \, , output-decimal-marker = . }, locale / US .meta:n = { exponent-product = \times , inter-unit-product = \, , output-decimal-marker = . } , locale / ZA .meta:n = { exponent-product = \times , inter-unit-product = \cdot , output-decimal-marker = { , } } } \file_if_exist:nT { translations.sty } { \RequirePackage { translations } \DeclareTranslation { Catalan } { and } { i } \DeclareTranslation { Catalan } { to~(numerical~range) } { a } \DeclareTranslation { English } { to~(numerical~range) } { to } \DeclareTranslation { French } { to~(numerical~range) } { à } \DeclareTranslation { German } { to~(numerical~range) } { bis } \DeclareTranslation { Spanish } { to~(numerical~range) } { a } \keys_set:nn { siunitx } { list-final-separator = { \ifmmode \ \else \space \fi \text { \GetTranslation { and } } \ifmmode \ \else \space \fi } , list-pair-separator = { \ifmmode \ \else \space \fi \text { \GetTranslation { and } } \ifmmode \ \else \space \fi } , range-phrase = { \ifmmode \ \else \space \fi \text { \GetTranslation { to~(numerical~range) } } \ifmmode \ \else \space \fi } } } \cs_generate_variant:Nn \tl_if_blank:nTF { f } \cs_generate_variant:Nn \tl_if_blank_p:n { f } \cs_generate_variant:Nn \tl_if_in:NnTF { NV } \cs_generate_variant:Nn \tl_remove_all:Nn { NV } \cs_generate_variant:Nn \tl_replace_all:Nnn { NnV } \tl_new:N \l__siunitx_number_tmp_tl \tl_new:N \l__siunitx_number_outputted_tl \tl_new:N \l_siunitx_number_parse_bool \keys_define:nn { siunitx } { parse-numbers .bool_set:N = \l_siunitx_number_parse_bool } \cs_new_protected:Npn \siunitx_number_format:nN #1#2 { \group_begin: \bool_if:NTF \l_siunitx_number_parse_bool { \siunitx_number_parse:nN {#1} \l__siunitx_number_parsed_tl \siunitx_number_process:NN \l__siunitx_number_parsed_tl \l__siunitx_number_parsed_tl \tl_set:Nx \l__siunitx_number_outputted_tl { \siunitx_number_output:N \l__siunitx_number_parsed_tl } } { \tl_set:Nn \l__siunitx_number_outputted_tl { \ensuremath {#1} } } \exp_args:NNNV \group_end: \tl_set:Nn #2 \l__siunitx_number_outputted_tl } \tl_new:N \l_siunitx_number_input_decimal_tl \keys_define:nn { siunitx } { evaluate-expression .bool_set:N = \l__siunitx_number_expression_bool , expression .code:n = \cs_set:Npn \__siunitx_number_expression:n ##1 {#1} , input-close-uncertainty .tl_set:N = \l__siunitx_number_input_uncert_close_tl , input-comparators .tl_set:N = \l_siunitx_number_input_comparator_tl , input-decimal-markers .tl_set:N = \l_siunitx_number_input_decimal_tl , input-digits .tl_set:N = \l__siunitx_number_input_digit_tl , input-exponent-markers .tl_set:N = \l_siunitx_number_input_exponent_tl , input-ignore .tl_set:N = \l__siunitx_number_input_ignore_tl , input-open-uncertainty .tl_set:N = \l__siunitx_number_input_uncert_open_tl , input-signs .tl_set:N = \l_siunitx_number_input_sign_tl , input-uncertainty-signs .code:n = { \tl_set:Nn \l__siunitx_number_input_uncert_sign_tl {#1} \tl_map_inline:nn {#1} { \tl_if_in:NnF \l_siunitx_number_input_sign_tl {##1} { \tl_put_right:Nn \l_siunitx_number_input_sign_tl {##1} } } } , parse-numbers .bool_set:N = \l_siunitx_number_parse_bool , retain-explicit-plus .bool_set:N = \l__siunitx_number_explicit_plus_bool , retain-zero-uncertainty .bool_set:N = \l__siunitx_number_zero_uncert_bool } \cs_new:Npn \__siunitx_number_expression:n #1 { } \tl_new:N \l__siunitx_number_input_uncert_sign_tl \tl_new:N \l__siunitx_number_arg_tl \tl_new:N \l__siunitx_number_comparator_tl \tl_new:N \l__siunitx_number_exponent_tl \tl_new:N \l__siunitx_number_flex_tl \tl_new:N \l__siunitx_number_parsed_tl \tl_new:N \l__siunitx_number_input_tl \tl_new:N \l__siunitx_number_partial_tl \bool_new:N \l__siunitx_number_validate_bool \cs_new_protected:Npn \siunitx_number_normalize_symbols:N #1 { \__siunitx_number_normalize_minus:N #1 \exp_after:wN \__siunitx_number_normalize_aux:NnN \exp_after:wN #1 \c__siunitx_number_normalize_tl { ? } \q_recursion_tail \q_recursion_stop } \cs_set_protected:Npn \__siunitx_number_normalize_aux:NnN #1#2#3 { \quark_if_recursion_tail_stop:N #3 \tl_replace_all:Nnn #1 {#2} {#3} \__siunitx_number_normalize_aux:NnN #1 } \tl_const:Nn \c__siunitx_number_normalize_tl { { -+ } \mp { +- } \pm { << } \ll { <= } \le { >> } \gg { >= } \ge } \group_begin: \char_set_catcode_active:N \- \cs_new_protected:Npx \__siunitx_number_normalize_minus:N #1 { \tl_replace_all:Nnn #1 { \exp_not:N - } { \token_to_str:N - } } \group_end: \cs_new_protected:Npn \siunitx_number_parse:nN #1#2 { \bool_if:NTF \l_siunitx_number_parse_bool { \__siunitx_number_parse:nN {#1} #2 } { \tl_clear:N #2 } } \cs_generate_variant:Nn \siunitx_number_parse:nN { V } \cs_new_protected:Npn \__siunitx_number_parse:nN #1#2 { \group_begin: \tl_clear:N \l__siunitx_number_parsed_tl \tl_map_inline:Nn \l__siunitx_number_input_ignore_tl { \token_if_macro:NT ##1 { \cs_set_eq:NN ##1 \scan_stop: } } \protected@edef \l__siunitx_number_arg_tl { \bool_if:NTF \l__siunitx_number_expression_bool { \fp_eval:n { \__siunitx_number_expression:n {#1} } } {#1} } \tl_set_eq:NN \l__siunitx_number_input_tl \l__siunitx_number_arg_tl \siunitx_number_normalize_symbols:N \l__siunitx_number_arg_tl \tl_map_inline:Nn \l__siunitx_number_input_ignore_tl { \tl_remove_all:Nn \l__siunitx_number_arg_tl {##1} } \tl_if_empty:NF \l__siunitx_number_arg_tl { \__siunitx_number_parse_comparator: } \__siunitx_number_parse_check: \exp_args:NNNV \group_end: \tl_set:Nn #2 \l__siunitx_number_parsed_tl } \cs_new_protected:Npn \__siunitx_number_parse_check: { \tl_if_empty:NF \l__siunitx_number_flex_tl { \bool_lazy_and:nnTF { \tl_if_blank_p:f { \exp_after:wN \use_iv:nnnn \l__siunitx_number_parsed_tl } } { \tl_if_blank_p:f { \exp_after:wN \use_iv:nnnn \l__siunitx_number_flex_tl } } { \tl_set:Nx \l__siunitx_number_tmp_tl { \exp_after:wN \use_i:nnnn \l__siunitx_number_flex_tl } \tl_if_in:NVTF \l__siunitx_number_input_uncert_sign_tl \l__siunitx_number_tmp_tl { \__siunitx_number_parse_combine_uncert: } { \tl_clear:N \l__siunitx_number_parsed_tl } } { \tl_clear:N \l__siunitx_number_parsed_tl } } \tl_if_empty:NTF \l__siunitx_number_parsed_tl { \bool_if:NF \l__siunitx_number_validate_bool { \msg_error:nnx { siunitx } { invalid-number } { \exp_not:V \l__siunitx_number_input_tl } } } { \__siunitx_number_parse_finalise: } } \cs_new_protected:Npn \__siunitx_number_parse_combine_uncert: { \exp_after:wN \exp_after:wN \exp_after:wN \__siunitx_number_parse_combine_uncert_auxi:nnnnnnnn \exp_after:wN \l__siunitx_number_parsed_tl \l__siunitx_number_flex_tl } \cs_new_protected:Npn \__siunitx_number_parse_combine_uncert_auxi:nnnnnnnn #1#2#3#4#5#6#7#8 { \__siunitx_number_parse_combine_uncert_auxii:fnnnn { \int_eval:n { \tl_count:n {#3} - \tl_count:n {#7} } } {#2} {#3} {#6} {#7} } \cs_new_protected:Npn \__siunitx_number_parse_combine_uncert_auxii:nnnnn #1 { \__siunitx_number_parse_combine_uncert_auxiii:fnnnnn { \prg_replicate:nn { \int_abs:n {#1} } { 0 } } {#1} } \cs_generate_variant:Nn \__siunitx_number_parse_combine_uncert_auxii:nnnnn { f } \cs_new_protected:Npn \__siunitx_number_parse_combine_uncert_auxiii:nnnnnn #1#2#3#4#5#6 { \int_compare:nNnTF {#2} > 0 { \__siunitx_number_parse_combine_uncert_auxiv:nnnn {#3} {#4} {#5} { #6 #1 } } { \__siunitx_number_parse_combine_uncert_auxiv:nnnn {#3} { #4 #1 } {#5} {#6} } } \cs_generate_variant:Nn \__siunitx_number_parse_combine_uncert_auxiii:nnnnnn { f } \cs_new_protected:Npn \__siunitx_number_parse_combine_uncert_auxiv:nnnn #1#2#3#4 { \tl_set:Nx \l__siunitx_number_parsed_tl { { \tl_head:V \l__siunitx_number_parsed_tl } { \exp_not:n {#1} } { \bool_lazy_and:nnTF { \tl_if_blank_p:n {#2} } { ! \tl_if_blank_p:n {#4} } { 0 } { \exp_not:n {#2} } } { \__siunitx_number_parse_combine_uncert_auxv:w #3#4 \q_recursion_tail \q_recursion_stop } } } \cs_new:Npn \__siunitx_number_parse_combine_uncert_auxv:w #1 { \quark_if_recursion_tail_stop_do:Nn #1 { \bool_if:NT \l__siunitx_number_zero_uncert_bool { { S } { 0 } } } \str_if_eq:nnTF {#1} { 0 } { \__siunitx_number_parse_combine_uncert_auxv:w } { \__siunitx_number_parse_combine_uncert_auxvi:w #1 } } \cs_new:Npn \__siunitx_number_parse_combine_uncert_auxvi:w #1 \q_recursion_tail \q_recursion_stop { { S } { \exp_not:n {#1} } } \cs_new_protected:Npn \__siunitx_number_parse_comparator: { \exp_after:wN \__siunitx_number_parse_comparator_aux:Nw \l__siunitx_number_arg_tl \q_stop } \cs_new_protected:Npn \__siunitx_number_parse_comparator_aux:Nw #1#2 \q_stop { \tl_if_in:NnTF \l_siunitx_number_input_comparator_tl {#1} { \tl_set:Nn \l__siunitx_number_comparator_tl {#1} \tl_set:Nn \l__siunitx_number_arg_tl {#2} } { \tl_clear:N \l__siunitx_number_comparator_tl } \tl_if_empty:NF \l__siunitx_number_arg_tl { \__siunitx_number_parse_sign: } } \cs_new_protected:Npn \__siunitx_number_parse_exponent: { \tl_if_empty:NTF \l_siunitx_number_input_exponent_tl { \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 } \tl_if_empty:NF \l__siunitx_number_parsed_tl { \__siunitx_number_parse_loop: } } { \tl_set:Nx \l__siunitx_number_tmp_tl { \tl_head:V \l_siunitx_number_input_exponent_tl } \tl_map_inline:Nn \l_siunitx_number_input_exponent_tl { \tl_replace_all:NnV \l__siunitx_number_arg_tl {##1} \l__siunitx_number_tmp_tl } \use:x { \cs_set_protected:Npn \exp_not:N \__siunitx_number_parse_exponent_auxi:w ####1 \exp_not:V \l__siunitx_number_tmp_tl ####2 \exp_not:V \l__siunitx_number_tmp_tl ####3 \exp_not:N \q_stop } { \__siunitx_number_parse_exponent_auxii:nn {##1} {##2} } \use:x { \__siunitx_number_parse_exponent_auxi:w \exp_not:V \l__siunitx_number_arg_tl \exp_not:V \l__siunitx_number_tmp_tl \exp_not:N \q_nil \exp_not:V \l__siunitx_number_tmp_tl \exp_not:N \q_stop } } } \cs_new_protected:Npn \__siunitx_number_parse_exponent_auxi:w { } \cs_new_protected:Npn \__siunitx_number_parse_exponent_auxii:nn #1#2 { \quark_if_nil:nTF {#2} { \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 } } { \tl_set:Nn \l__siunitx_number_arg_tl {#1} \tl_if_blank:nTF {#2} { \tl_clear:N \l__siunitx_number_parsed_tl } { \__siunitx_number_parse_exponent_auxiii:Nw #2 \q_stop } } \tl_if_empty:NF \l__siunitx_number_parsed_tl { \__siunitx_number_parse_loop: } } \cs_new_protected:Npn \__siunitx_number_parse_exponent_auxiii:Nw #1#2 \q_stop { \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#1} { \__siunitx_number_parse_exponent_auxiv:nn {#1} {#2} } { \__siunitx_number_parse_exponent_auxiv:nn { } {#1#2} } \tl_if_empty:NT \l__siunitx_number_exponent_tl { \tl_clear:N \l__siunitx_number_parsed_tl } } \cs_new_protected:Npn \__siunitx_number_parse_exponent_auxiv:nn #1#2 { \bool_lazy_or:nnTF { \l__siunitx_number_explicit_plus_bool } { ! \str_if_eq_p:nn {#1} { + } } { \tl_set:Nn \l__siunitx_number_exponent_tl { {#1} } } { \tl_set:Nn \l__siunitx_number_exponent_tl { { } } } \tl_if_blank:nTF {#2} { \tl_clear:N \l__siunitx_number_parsed_tl } { \__siunitx_number_parse_exponent_zero_test:N #2 \q_recursion_tail \q_recursion_stop } } \cs_new_protected:Npn \__siunitx_number_parse_exponent_zero_test:N #1 { \quark_if_recursion_tail_stop_do:Nn #1 { \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 } } \str_if_eq:nnTF {#1} { 0 } { \__siunitx_number_parse_exponent_zero_test:N } { \__siunitx_number_parse_exponent_check:N #1 } } \cs_new_protected:Npn \__siunitx_number_parse_exponent_check:N #1 { \quark_if_recursion_tail_stop:N #1 \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#1} { \tl_put_right:Nn \l__siunitx_number_exponent_tl {#1} \__siunitx_number_parse_exponent_check:N } { \__siunitx_number_parse_exponent_cleanup:wN } } \cs_new_protected:Npn \__siunitx_number_parse_exponent_cleanup:wN #1 \q_recursion_stop { \tl_clear:N \l__siunitx_number_parsed_tl } \cs_new_protected:Npn \__siunitx_number_parse_finalise: { \tl_if_empty:NF \l__siunitx_number_parsed_tl { \tl_set:Nx \l__siunitx_number_parsed_tl { { \exp_not:V \l__siunitx_number_comparator_tl } \exp_not:V \l__siunitx_number_parsed_tl \exp_after:wN \__siunitx_number_parse_finalise:nw \l__siunitx_number_exponent_tl \q_stop } } } \cs_new:Npn \__siunitx_number_parse_finalise:nw #1#2 \q_stop { { \exp_not:n {#1} } { \exp_not:n {#2} } } \cs_new_protected:Npn \__siunitx_number_parse_loop: { \tl_clear:N \l__siunitx_number_partial_tl \exp_after:wN \__siunitx_number_parse_loop_first:NNN \exp_after:wN \l__siunitx_number_parsed_tl \exp_after:wN \c_true_bool \l__siunitx_number_arg_tl \q_recursion_tail \q_recursion_stop } \cs_new_protected:Npn \__siunitx_number_parse_loop_first:NNN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 { \bool_if:NTF #2 { \tl_put_right:Nn #1 { { 1 } { } { } } } { \__siunitx_number_parse_loop_break:wN \q_recursion_stop } } \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#3} { \__siunitx_number_parse_loop_main:NNNNN #1 \c_true_bool \c_false_bool #2 #3 } { \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#3} { \tl_put_right:Nn #1 { { 0 } } \__siunitx_number_parse_loop_after_decimal:NNN #1 #2 } { \__siunitx_number_parse_loop_break:wN } } } \cs_new_protected:Npn \__siunitx_number_parse_loop_main:NNNNN #1#2#3#4#5 { \quark_if_recursion_tail_stop_do:Nn #5 { \__siunitx_number_parse_loop_main_end:NN #1#2 } \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#5} { \__siunitx_number_parse_loop_main_digit:NNNNN #1#2#3#4#5 } { \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#5} { \bool_if:NTF #2 { \__siunitx_number_parse_loop_main_decimal:NN #1 #4 } { \__siunitx_number_parse_loop_break:wN } } { \tl_if_in:NnTF \l__siunitx_number_input_uncert_open_tl {#5} { \__siunitx_number_parse_loop_main_uncert:NNN #1#2 #4 } { \bool_if:NTF #4 { \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#5} { \__siunitx_number_parse_loop_main_sign:NNN #1#2 #5 } { \__siunitx_number_parse_loop_break:wN } } { \__siunitx_number_parse_loop_break:wN } } } } } \cs_new_protected:Npn \__siunitx_number_parse_loop_main_end:NN #1#2 { \bool_lazy_and:nnT {#2} { \tl_if_empty_p:N \l__siunitx_number_partial_tl } { \tl_set:Nn \l__siunitx_number_partial_tl { 0 } } \tl_put_right:Nx #1 { { \exp_not:V \l__siunitx_number_partial_tl } \bool_if:NT #2 { { } } { } } } \cs_new_protected:Npn \__siunitx_number_parse_loop_main_digit:NNNNN #1#2#3#4#5 { \bool_lazy_or:nnTF {#3} { ! \str_if_eq_p:nn {#5} { 0 } } { \tl_put_right:Nn \l__siunitx_number_partial_tl {#5} \__siunitx_number_parse_loop_main:NNNNN #1 #2 \c_true_bool #4 } { \__siunitx_number_parse_loop_main:NNNNN #1 #2 \c_false_bool #4 } } \cs_new_protected:Npn \__siunitx_number_parse_loop_main_decimal:NN #1#2 { \__siunitx_number_parse_loop_main_store:NNN #1 \c_false_bool \c_false_bool \__siunitx_number_parse_loop_after_decimal:NNN #1 #2 } \cs_new_protected:Npn \__siunitx_number_parse_loop_main_uncert:NNN #1#2#3 { \__siunitx_number_parse_loop_main_store:NNN #1 #2 \c_false_bool \__siunitx_number_parse_uncert:NN #1 } \cs_new_protected:Npn \__siunitx_number_parse_loop_main_sign:NNN #1#2#3 { \__siunitx_number_parse_loop_main_store:NNN #1 #2 \c_true_bool \tl_set:Nn \l__siunitx_number_flex_tl { {#3} } \__siunitx_number_parse_loop_first:NNN \l__siunitx_number_flex_tl \c_false_bool } \cs_new_protected:Npn \__siunitx_number_parse_loop_main_store:NNN #1#2#3 { \tl_if_empty:NT \l__siunitx_number_partial_tl { \tl_set:Nn \l__siunitx_number_partial_tl { 0 } } \tl_put_right:Nx #1 { { \exp_not:V \l__siunitx_number_partial_tl } \bool_if:NT #2 { { } } \bool_if:NT #3 { { } } } \tl_clear:N \l__siunitx_number_partial_tl } \cs_new_protected:Npn \__siunitx_number_parse_loop_after_decimal:NNN #1#2#3 { \tl_if_blank:fTF { \exp_after:wN \use_none:n #1 } { \quark_if_recursion_tail_stop_do:Nn #3 { \__siunitx_number_parse_loop_break:wN \q_recursion_stop } \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#1} { \tl_put_right:Nn \l__siunitx_number_partial_tl {#3} \__siunitx_number_parse_loop_main:NNNNN #1 \c_false_bool \c_true_bool #2 } { \__siunitx_number_parse_loop_break:wN } } { \__siunitx_number_parse_loop_main:NNNNN #1 \c_false_bool \c_true_bool #2 #3 } } \cs_new_protected:Npn \__siunitx_number_parse_loop_break:wN #1 \q_recursion_stop { \tl_clear:N \l__siunitx_number_flex_tl \tl_clear:N \l__siunitx_number_parsed_tl } \cs_new_protected:Npn \__siunitx_number_parse_sign: { \exp_after:wN \__siunitx_number_parse_sign_aux:Nw \l__siunitx_number_arg_tl \q_stop } \cs_new_protected:Npn \__siunitx_number_parse_sign_aux:Nw #1#2 \q_stop { \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#1} { \tl_set:Nn \l__siunitx_number_arg_tl {#2} \bool_lazy_and:nnTF { \token_if_eq_charcode_p:NN #1 + } { ! \l__siunitx_number_explicit_plus_bool } { \tl_set:Nn \l__siunitx_number_parsed_tl { { } } } { \tl_set:Nn \l__siunitx_number_parsed_tl { {#1} } } } { \tl_set:Nn \l__siunitx_number_parsed_tl { { } } } \tl_if_empty:NTF \l__siunitx_number_arg_tl { \tl_clear:N \l__siunitx_number_parsed_tl } { \__siunitx_number_parse_exponent: } } \cs_new_protected:Npn \__siunitx_number_parse_uncert:NN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 { \__siunitx_number_parse_loop_break:wN \q_recursion_stop } \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2} { \__siunitx_number_parse_loop_break:wN } { \__siunitx_number_parse_uncert:NNNN #1 \c_false_bool \__siunitx_number_parse_uncert_auxi:NN #2 } } \cs_new_protected:Npn \__siunitx_number_parse_uncert:NNNN #1#2#3#4 { \quark_if_recursion_tail_stop_do:Nn #4 { \__siunitx_number_parse_loop_break:wN \q_recursion_stop } \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#4} { \bool_lazy_or:nnTF {#2} { ! \str_if_eq_p:nn {#4} { 0 } } { \tl_put_right:Nn \l__siunitx_number_partial_tl {#4} \__siunitx_number_parse_uncert:NNNN #1 \c_true_bool #3 } { \__siunitx_number_parse_uncert:NNNN #1 \c_false_bool #3 } } { #3 #1#4 } } \cs_new_protected:Npn \__siunitx_number_parse_uncert_auxi:NN #1#2 { \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2} { \__siunitx_number_parse_uncert_auxiii:N #1 \__siunitx_number_parse_uncert_after:N } { \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#2} { \__siunitx_number_parse_uncert_marker:N #1 } { \__siunitx_number_parse_loop_break:wN } } } \cs_new_protected:Npn \__siunitx_number_parse_uncert_auxii:NN #1#2 { \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2} { \__siunitx_number_parse_uncert_auxiii:N #1 \__siunitx_number_parse_uncert_after:N } { \__siunitx_number_parse_loop_break:wN } } \cs_new_protected:Npn \__siunitx_number_parse_uncert_auxiii:N #1 { \tl_if_empty:NTF \l__siunitx_number_partial_tl { \tl_put_right:Nx #1 { { \bool_if:NT \l__siunitx_number_zero_uncert_bool { { S } { 0 } } } } } { \tl_set:Nx \l__siunitx_number_partial_tl { { S } { \exp_not:V \l__siunitx_number_partial_tl } } \__siunitx_number_parse_loop_main_store:NNN #1 \c_false_bool \c_false_bool } } \cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:N #1 { \exp_after:wN \__siunitx_number_parse_uncert_marker:nnnN #1 #1 } \cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:nnnN #1#2#3#4 { \int_compare:nNnTF { \tl_count:N \l__siunitx_number_partial_tl } > { \tl_count:n {#2} } { \__siunitx_number_parse_loop_break:wN } { \__siunitx_number_parse_uncert_marker:nNw {#3} #4 } } \cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:nNw #1#2#3 \q_recursion_tail \q_recursion_stop { \int_compare:nNnTF { \tl_count:n {#3} - 1 } = { \tl_count:n {#1} } { \str_if_eq:eeTF { \exp_not:V \l__siunitx_number_partial_tl } { \prg_replicate:nn { \tl_count:N \l__siunitx_number_partial_tl } { 0 } } { \__siunitx_number_parse_uncert:NNNN #2 \c_false_bool } { \__siunitx_number_parse_uncert:NNNN #2 \c_true_bool } \__siunitx_number_parse_uncert_auxii:NN } { \exp_after:wN \__siunitx_number_parse_uncert_extend:nnnN #2 #2 } #3 \q_recursion_tail \q_recursion_stop } \cs_new_protected:Npn \__siunitx_number_parse_uncert_extend:nnnN #1#2#3#4 { \tl_set:Nn #4 { {#1} {#2} { #3 0 } } \__siunitx_number_parse_uncert:NNNN #4 \c_true_bool \__siunitx_number_parse_uncert_auxii:NN } \cs_new_protected:Npn \__siunitx_number_parse_uncert_after:N #1 { \quark_if_recursion_tail_stop:N #1 \__siunitx_number_parse_loop_break:wN } \keys_define:nn { siunitx } { drop-exponent .bool_set:N = \l__siunitx_number_drop_exponent_bool , drop-uncertainty .bool_set:N = \l__siunitx_number_drop_uncertainty_bool , drop-zero-decimal .bool_set:N = \l__siunitx_number_drop_zero_decimal_bool , exponent-mode .choices:nn = { engineering , fixed , input , scientific } { \tl_set_eq:NN \l__siunitx_number_exponent_mode_tl \l_keys_choice_tl } , fixed-exponent .int_set:N = \l__siunitx_number_exponent_fixed_int , minimum-decimal-digits .int_set:N = \l__siunitx_number_min_decimal_int , minimum-integer-digits .int_set:N = \l__siunitx_number_min_integer_int , round-half .choice: , round-half / even .code:n = { \bool_set_true:N \l__siunitx_number_round_half_even_bool } , round-half / up .code:n = { \bool_set_false:N \l__siunitx_number_round_half_even_bool } , round-minimum .code:n = { \__siunitx_number_set_round_min:n {#1} } , round-mode .choices:nn = { figures , none , places, uncertainty } { \tl_set_eq:NN \l__siunitx_number_round_mode_tl \l_keys_choice_tl } , round-pad .bool_set:N = \l__siunitx_number_round_pad_bool , round-precision .int_set:N = \l__siunitx_number_round_precision_int , } \bool_new:N \l__siunitx_number_round_half_even_bool \tl_new:N \l__siunitx_number_exponent_mode_tl \tl_new:N \l__siunitx_number_round_mode_tl \tl_new:N \l__siunitx_number_round_min_tl \cs_new_protected:Npn \__siunitx_number_set_round_min:n #1 { \siunitx_number_parse:nN {#1} \l__siunitx_number_tmp_tl \exp_after:wN \__siunitx_number_set_round_min:nnnnnnn \l__siunitx_number_tmp_tl } \cs_new:Npn \__siunitx_number_set_round_min:nnnnnnn #1#2#3#4#5#6#7 { \tl_set:Nx \l__siunitx_number_round_min_tl { \bool_lazy_and:nnF { \str_if_eq_p:nn {#3} { 0 } } { \str_if_eq_p:ee { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } } } { \exp_not:n { {#3} {#4} } } } } \cs_new_protected:Npn \siunitx_number_process:NN #1#2 { \tl_if_empty:NTF #1 { \tl_clear:N #2 } { \__siunitx_number_drop_uncertainty:NN #1 #2 \exp_after:wN \__siunitx_number_process:nnnnnnnNN #2 #2 #2 \__siunitx_number_drop_exponent:NN #2 #2 \__siunitx_number_zero_decimal:NN #2 #2 \__siunitx_number_digits:NN #2 #2 } } \cs_new_protected:Npn \__siunitx_number_process:nnnnnnnNN #1#2#3#4#5#6#7#8#9 { \bool_lazy_and:nnTF { \str_if_eq_p:nn {#3} { 0 } } { \str_if_eq_p:ee { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } } } { \__siunitx_number_round:NN #8 #9 } { \__siunitx_number_exponent:NN #8 #9 \__siunitx_number_round:NN #9 #9 } } \cs_new_protected:Npn \__siunitx_number_exponent:NN #1#2 { \tl_set:Nx #2 { \cs:w __siunitx_number_exponent_ \l__siunitx_number_exponent_mode_tl :nnnnnnn \exp_after:wN \cs_end: #1 } \str_if_eq:VnT \l__siunitx_number_exponent_mode_tl { engineering } { \tl_set:Nx #2 { \exp_after:wN \__siunitx_number_exponent_engineering_aux:nnnnnnn #2 } } } \cs_new:Npn \__siunitx_number_exponent_fixed:nnnnnnn #1#2#3#4#5#6#7 { \exp_args:Nf \__siunitx_number_exponent_fixed:nnnnnnnn { \int_eval:n { \l__siunitx_number_exponent_fixed_int - (#6#7) } } {#1} {#2} {#3} {#4} {#5} {#6} {#7} } \cs_new:Npn \__siunitx_number_exponent_fixed:nnnnnnnn #1#2#3#4#5#6#7#8 { \exp_not:n { {#2} {#3} } \__siunitx_number_exponent_shift:nnn {#1} {#4} {#5} \__siunitx_number_exponent_uncert:n {#6} \exp_not:n { {#7} } { \int_use:N \l__siunitx_number_exponent_fixed_int } } \cs_new:Npn \__siunitx_number_exponent_input:nnnnnnn #1#2#3#4#5#6#7 { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } } \cs_new:Npn \__siunitx_number_exponent_scientific:nnnnnnn #1#2#3#4#5#6#7 { \exp_args:Nf \__siunitx_number_exponent_scientific:nnnnnnnn { \int_eval:n { \tl_count:n {#3} } } {#1} {#2} {#3} {#4} {#5} {#6} {#7} } \cs_new:Npn \__siunitx_number_exponent_scientific:nnnnnnnn #1#2#3#4#5#6#7#8 { \exp_not:n { {#2} {#3} } \int_compare:nNnTF {#1} = 1 { \str_if_eq:nnTF {#4} { 0 } { \__siunitx_number_exponent_scientific:nnnw { 0 } {#6} { #7#8 } #5 \q_stop } { \exp_not:n { {#4} {#5} {#6} {#7} {#8} } } } { \__siunitx_number_exponent_shift:nnn { #1 - 1 } {#4} {#5} \__siunitx_number_exponent_uncert:n {#6} \__siunitx_number_exponent_finalise:n { #1 + #7#8 - 1 } } } \cs_new_eq:NN \__siunitx_number_exponent_engineering:nnnnnnn \__siunitx_number_exponent_scientific:nnnnnnn \cs_new:Npn \__siunitx_number_exponent_scientific:nnnw #1#2#3#4#5 \q_stop { \str_if_eq:nnTF {#4} { 0 } { \__siunitx_number_exponent_scientific:nnnw { #1 - 1 } {#2} {#3} #5 \q_stop } { \exp_not:n { {#4} {#5} {#2} } \__siunitx_number_exponent_finalise:n { #1 + #3 - 1 } } } \cs_new:Npn \__siunitx_number_exponent_shift:nnn #1#2#3 { \int_compare:nNnTF {#1} > 0 { \__siunitx_number_exponent_shift_down:nnnw {#1} {#3} { } #2 \q_stop } { \int_compare:nNnTF {#1} < 0 { \__siunitx_number_exponent_shift_up:nnn {#1} {#2} {#3} } { {#2} {#3} } } } \cs_generate_variant:Nn \__siunitx_number_exponent_shift:nnn { nnf } \cs_new:Npn \__siunitx_number_exponent_shift_down:nnnw #1#2#3#4#5 \q_stop { \tl_if_blank:nTF {#5} { \__siunitx_number_exponent_shift_down:nnn {#1} { #4 #3 } {#2} } { \__siunitx_number_exponent_shift_down:nnnw {#1} {#2} { #4 #3 } #5 \q_stop } } \cs_new:Npn \__siunitx_number_exponent_shift_down:nnn #1#2#3 { \int_compare:nNnTF {#1} = 0 { { \tl_reverse:n {#2} } \exp_not:n { {#3} } } { \__siunitx_number_exponent_shift_down:nw {#1} #2 \q_stop {#3} } } \cs_new:Npn \__siunitx_number_exponent_shift_down:nw #1#2#3 \q_stop #4 { \tl_if_blank:nTF {#3} { \__siunitx_number_exponent_shift_down:nnn { #1 - 1 } { 0 } { #2#4 } } { \__siunitx_number_exponent_shift_down:nnn { #1 - 1 } {#3} { #2#4 } } } \cs_new:Npn \__siunitx_number_exponent_shift_up:nnn #1#2#3 { \tl_if_blank:nTF {#3} { \__siunitx_number_exponent_shift_up_aux:ffn { \int_eval:n { #1 + 1 } } { \str_if_eq:nnF {#2} { 0 } {#2} 0 } { } \__siunitx_number_exponent_shift_uncert:nw { 1 } } { \__siunitx_number_exponent_shift_up:nnw {#1} {#2} #3 \q_stop } } \cs_new:Npn \__siunitx_number_exponent_shift_up:nnw #1#2#3#4 \q_stop { \__siunitx_number_exponent_shift_up_aux:ffn { \int_eval:n { #1 + 1 } } { \str_if_eq:nnF {#2} { 0 } {#2} #3 } {#4} } \cs_new:Npn \__siunitx_number_exponent_shift_up_aux:nnn #1#2#3 { \int_compare:nNnTF {#1} = 0 { \exp_not:n { {#2} {#3} } } { \tl_if_blank:nTF {#3} { { \exp_not:n {#2} \prg_replicate:nn { \int_abs:n {#1} } { 0 } } { } \__siunitx_number_exponent_shift_uncert:nw { \int_abs:n {#1} } } { \__siunitx_number_exponent_shift_up:nnn {#1} {#2} {#3} } } } \cs_generate_variant:Nn \__siunitx_number_exponent_shift_up_aux:nnn { f , ff } \cs_new:Npn \__siunitx_number_exponent_shift_uncert:nw #1#2 \__siunitx_number_exponent_uncert:n #3 { \tl_if_blank:nTF {#3} { #2 \__siunitx_number_exponent_uncert:n { } } { \str_if_eq:nnTF {#3} { 0 } { #2 \__siunitx_number_exponent_uncert:n { { S } { 0 } } } { \use:c { __siunitx_number_exponent_shift_uncert_ \use_i:nn #3 :fnnn } { \prg_replicate:nn {#1} { 0 } } {#2} #3 } } } \cs_new:Npn \__siunitx_number_exponent_shift_uncert_S:nnnn #1#2#3#4 { #2 \__siunitx_number_exponent_uncert:n { { S } { #4#1 } } } \cs_generate_variant:Nn \__siunitx_number_exponent_shift_uncert_S:nnnn { f } \cs_new:Npn \__siunitx_number_exponent_uncert:n #1 { { \exp_not:n {#1} } } \cs_new:Npn \__siunitx_number_exponent_finalise:n #1 { \int_compare:nNnTF {#1} < 0 { { - } } { { } } { \int_abs:n {#1} } } \cs_new:Npn \__siunitx_number_exponent_engineering_aux:nnnnnnn #1#2#3#4#5#6#7 { \exp_not:n { {#1} {#2} } \use:c { __siunitx_number_exponent_engineering_ \int_compare:nNnTF {#6#7} < 0 { \int_case:nnF { \int_mod:nn { #7 } { 3 } } { { 1 } { 2 } { 2 } { 1 } } { 0 } } { \int_mod:nn {#7} { 3 } } :nnnn } {#3} {#4} {#5} {#6#7} } \cs_new:cpn { __siunitx_number_exponent_engineering_0:nnnn } #1#2#3#4 { \exp_not:n { {#1} {#2} {#3} } \__siunitx_number_exponent_finalise:n {#4} } \cs_new:cpn { __siunitx_number_exponent_engineering_1:nnnn } #1#2#3#4 { \tl_if_blank:nTF {#2} { { \exp_not:n { #1 0 } } { } { \__siunitx_number_exponent_engineering_uncert:nn {#3} { 0 } } } { { \exp_not:n {#1} \exp_not:o { \tl_head:w #2 \q_stop } } { \exp_not:f { \tl_tail:n {#2} } } { \exp_not:n {#3} } } \__siunitx_number_exponent_finalise:n { #4 - 1 } } \cs_new:cpn { __siunitx_number_exponent_engineering_2:nnnn } #1#2#3#4 { \tl_if_blank:nTF {#2} { { \exp_not:n { #1 00 } } { } { \__siunitx_number_exponent_engineering_uncert:nn {#3} { 00 } } } { \__siunitx_number_exponent_engineering:nnNw {#1} {#3} #2 \q_stop } \__siunitx_number_exponent_finalise:n { #4 - 2 } } \cs_new:Npn \__siunitx_number_exponent_engineering:nnNw #1#2#3#4 \q_stop { \tl_if_blank:nTF {#4} { { \exp_not:n { #1#3 0 } } { } { \__siunitx_number_exponent_engineering_uncert:nn {#2} { 0 } } } { { \exp_not:n {#1#3} \exp_not:o { \tl_head:w #4 \q_stop } } { \exp_not:f { \tl_tail:n {#4} } } { \exp_not:n {#2} } } } \cs_new:Npn \__siunitx_number_exponent_engineering_uncert:nn #1#2 { \tl_if_blank:nF {#1} { \use:c { __siunitx_number_exponent_engineering_uncert_ \use_i:nn #1 :nnn } #1 {#2} } } \cs_new:Npn \__siunitx_number_exponent_engineering_uncert_S:nnn #1#2#3 { { S } { \exp_not:n {#2} \str_if_eq:nnF {#2} { 0 } {#3} } } \cs_new_protected:Npn \__siunitx_number_digits:NN #1#2 { \tl_set:Nx #2 { \exp_after:wN \__siunitx_number_digits:nnnnnnn #1 } } \cs_new:Npn \__siunitx_number_digits:nnnnnnn #1#2#3#4#5#6#7 { \exp_not:n { {#1} {#2} } { \__siunitx_number_digits:Nn \l__siunitx_number_min_integer_int {#3} \exp_not:n {#3} } { \exp_not:n {#4} \__siunitx_number_digits:Nn \l__siunitx_number_min_decimal_int {#4} } { \tl_if_blank:nF {#5} { \__siunitx_number_digits_uncert:nn #5 } } \exp_not:n { {#6} {#7} } } \cs_new:Npn \__siunitx_number_digits:Nn #1#2 { \int_compare:nNnT { #1 - \tl_count:n {#2} } > 0 { \prg_replicate:nn { #1 - \tl_count:n {#2} } { 0 } } } \cs_new:Npn \__siunitx_number_digits_uncert:nn #1#2 { { #1 } { \use:c { __siunitx_number_digits_uncert_ #1 :n } {#2} } } \cs_new:Npn \__siunitx_number_digits_uncert_S:n #1 { \exp_not:n {#1} \__siunitx_number_digits:Nn \l__siunitx_number_min_decimal_int {#1} } \cs_new_protected:Npn \__siunitx_number_drop_exponent:NN #1#2 { \bool_if:NT \l__siunitx_number_drop_exponent_bool { \tl_set:Nx #2 { \exp_after:wN \__siunitx_number_drop_exponent:nnnnnnn #1 } } } \cs_new:Npn \__siunitx_number_drop_exponent:nnnnnnn #1#2#3#4#5#6#7 { \exp_not:n { {#1} {#2} {#3} {#4} {#5} { } { 0 } } } \cs_new_protected:Npn \__siunitx_number_drop_uncertainty:NN #1#2 { \bool_if:NTF \l__siunitx_number_drop_uncertainty_bool { \tl_set:Nx #2 { \exp_after:wN \__siunitx_number_drop_uncertainty:nnnnnnn #1 } } { \tl_set_eq:NN #2 #1 } } \cs_new:Npn \__siunitx_number_drop_uncertainty:nnnnnnn #1#2#3#4#5#6#7 { \exp_not:n { {#1} {#2} {#3} {#4} { } {#6} {#7} } } \cs_new_protected:Npn \__siunitx_number_round:NN #1#2 { \tl_set:Nx #2 { \cs:w __siunitx_number_round_ \l__siunitx_number_round_mode_tl :nnnnnnn \exp_after:wN \cs_end: #1 } } \cs_new:Npn \__siunitx_number_round_none:nnnnnnn #1#2#3#4#5#6#7 { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } } \cs_new:Npn \__siunitx_number_round:nnn #1#2#3 { \__siunitx_number_round_auxi:nnnN {#1} {#2} { } #3 \q_recursion_tail \q_recursion_stop } \cs_generate_variant:Nn \__siunitx_number_round:nnn { f } \cs_new:Npn \__siunitx_number_round_auxi:nnnN #1#2#3#4 { \quark_if_recursion_tail_stop_do:Nn #4 { \__siunitx_number_round_auxii:nnnN {#1} {#3} { } #2 \q_recursion_tail \q_recursion_stop } \__siunitx_number_round_auxi:nnnN {#1} {#2} {#4#3} } \cs_new:Npn \__siunitx_number_round_auxii:nnnN #1#2#3#4 { \quark_if_recursion_tail_stop_do:Nn #4 { \tl_if_blank:nTF {#2} { \__siunitx_number_round_auxiv:nnnN {#1} { } { } #3 \q_recursion_tail \q_recursion_stop } { \__siunitx_number_round_auxiii:nnnN {#1} {#3} { } #2 \q_recursion_tail \q_recursion_stop } } \__siunitx_number_round_auxii:nnnN {#1} {#2} {#4#3} } \cs_new:Npn \__siunitx_number_round_auxiii:nnnN #1#2#3#4 { \quark_if_recursion_tail_stop_do:Nn #4 { \__siunitx_number_round_auxiv:nnnN {#1} { } {#3} #2 \q_recursion_tail \q_recursion_stop } \int_compare:nNnTF {#1} > 0 { \exp_args:Nf \__siunitx_number_round_auxiii:nnnN { \int_eval:n { #1 - 1 } } {#2} { #4#3 } } { \__siunitx_number_round_auxv:nnN {#3} {#2} #4 } } \cs_new:Npn \__siunitx_number_round_auxiv:nnnN #1#2#3#4 { \quark_if_recursion_tail_stop_do:Nn #4 { \int_compare:nNnTF {#1} = 0 { \__siunitx_number_round_auxvi:nnN {#3} {#2} 0 \q_recursion_tail \q_recursion_stop } { { 0 } { } } } \int_compare:nNnTF {#1} > 0 { \exp_args:Nf \__siunitx_number_round_auxiv:nnnN { \int_eval:n { #1 - 1 } } { #2 0 } { #4#3 } } { \__siunitx_number_round_auxvi:nnN {#3} {#2} #4 } } \cs_new:Npn \__siunitx_number_round_auxv:nnN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 { \__siunitx_number_round_auxvi:nnN {#1} { } #2 \q_recursion_tail \q_recursion_stop } \bool_lazy_or:nnTF { \int_compare_p:nNn { 0 \tl_head:n {#1} } < 5 } { \bool_lazy_all_p:n { { \l__siunitx_number_round_half_even_bool } { ! \int_if_odd_p:n {#3} } { \__siunitx_number_round_if_half_p:n {#1} } } } { \__siunitx_number_round_final_decimal:nnw } { \__siunitx_number_round_auxvii:nnN } {#2} { } #3 } \cs_new:Npn \__siunitx_number_round_auxvi:nnN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 { { 0 } { } } \bool_lazy_or:nnTF { \int_compare_p:nNn { 0 \tl_head:n {#1} } < 5 } { \bool_lazy_all_p:n { { \l__siunitx_number_round_half_even_bool } { ! \int_if_odd_p:n {#3} } { \__siunitx_number_round_if_half_p:n {#1} } } } { \__siunitx_number_round_final_integer:nnw } { \__siunitx_number_round_auxviii:nnN } { } {#2} #3 } \cs_new:Npn \__siunitx_number_round_auxvii:nnN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 { \str_if_eq:nnTF {#1} { 0 } { \__siunitx_number_round_final_output:ff { 1 } { \__siunitx_number_round_truncate:n {#2} } } { \__siunitx_number_round_auxviii:nnN {#2} { } #1 \q_recursion_tail \q_recursion_stop } } \int_compare:nNnTF {#3} = 9 { \__siunitx_number_round_auxvii:nnN {#1} { 0 #2 } } { \int_compare:nNnTF {#3} = 0 { \__siunitx_number_round_final_decimal:nnw {#1} { 1 \__siunitx_number_round_truncate:n {#2} } } { \__siunitx_number_round_final:fn { \int_eval:n { #3 + 1 } } { \__siunitx_number_round_final_decimal:nnw {#1} {#2} } } } } \cs_new:Npn \__siunitx_number_round_auxviii:nnN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 { \tl_if_blank:nTF {#1} { \__siunitx_number_round_final_shift:ff { \exp_last_unbraced:Nf 1 { \__siunitx_number_round_truncate_direct:n {#2} } 0 } { } } { \__siunitx_number_round_final_shift:ff { 1 #2 } { \__siunitx_number_round_truncate:n {#1} } } } \int_compare:nNnTF {#3} = 9 { \__siunitx_number_round_auxviii:nnN {#1} { 0 #2 } } { \__siunitx_number_round_final:fn { \int_eval:n { #3 + 1 } } { \__siunitx_number_round_final_integer:nnw {#1} {#2} } } } \cs_new:Npn \__siunitx_number_round_final_decimal:nnw #1#2#3 \q_recursion_tail \q_recursion_stop { \__siunitx_number_round_final_output:ff { \tl_reverse:n {#1} } { \tl_reverse:n {#3} #2 } } \cs_new:Npn \__siunitx_number_round_final_integer:nnw #1#2#3 \q_recursion_tail \q_recursion_stop { \__siunitx_number_round_final_output:ff { \exp_args:Ne \__siunitx_number_round_final_significant:n { \tl_reverse:n {#3} #2 } } {#1} } \cs_new:Npn \__siunitx_number_round_final_significant:n #1 { \__siunitx_number_round_final_significant:N #1 \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__siunitx_number_round_final_significant:N #1 { \quark_if_recursion_tail_stop_do:Nn #1 { 0 } \int_compare:nNnTF {#1} = 0 { \__siunitx_number_round_final_significant:N } { #1 \__siunitx_number_round_final_significant:w } } \cs_new:Npn \__siunitx_number_round_final_significant:w #1 \q_recursion_tail \q_recursion_stop {#1} \cs_new:Npn \__siunitx_number_round_final_output:nn #1#2 { {#1} {#2} } \cs_generate_variant:Nn \__siunitx_number_round_final_output:nn { ff } \cs_new:Npn \__siunitx_number_round_final:nn #1#2 { #2 #1 } \cs_generate_variant:Nn \__siunitx_number_round_final:nn { f } \cs_new:Npn \__siunitx_number_round_final_shift:nn #1#2 { \str_if_eq:VnTF \l__siunitx_number_round_mode_tl { places } { \use:c { __siunitx_number_round_ \l__siunitx_number_exponent_mode_tl :nn } {#1} {#2} } { {#1} {#2} } } \cs_generate_variant:Nn \__siunitx_number_round_final_shift:nn { ff } \cs_new:Npn \__siunitx_number_round_engineering:nn #1#2 { \int_compare:nNnTF { \tl_count:n {#1} } = 4 { \__siunitx_number_round_engineering:NNNNn #1 {#2} \__siunitx_number_round_final_shift:Nw 3 } { {#1} {#2} } } \cs_new:Npn \__siunitx_number_round_engineering:NNNNn #1#2#3#4#5 { {#1} \exp_args:NV \__siunitx_number_round_engineering:nnN { \l__siunitx_number_round_precision_int } { } #2#3#4#5 \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__siunitx_number_round_engineering:nnN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 { {#2} } \int_compare:nNnTF {#1} = { 0 } { \use_i_delimit_by_q_recursion_stop:nw { {#2} } } { \__siunitx_number_round_engineering:nnN { #1 - 1 } { #2#3 } } } \cs_new:Npn \__siunitx_number_round_fixed:nn #1#2 { {#1} {#2} } \cs_new:Npn \__siunitx_number_round_input:nn #1#2 { {#1} {#2} } \cs_new:Npn \__siunitx_number_round_scientific:nn #1#2 { \__siunitx_number_exponent_shift:nnf { 1 } {#1} { \__siunitx_number_round_truncate_direct:n {#2} } \__siunitx_number_round_final_shift:Nw 1 } \cs_new:Npn \__siunitx_number_round_final_shift:Nw #1#2 \__siunitx_number_round_places_end:nnn #3#4#5 { \exp_not:n { {#3} } \__siunitx_number_exponent_finalise:n { #4#5 + #1 } } \cs_new:Npn \__siunitx_number_round_truncate:n #1 { \str_if_eq:VnTF \l__siunitx_number_round_mode_tl { figures } { \__siunitx_number_round_truncate_direct:n {#1} } {#1} } \cs_new:Npn \__siunitx_number_round_truncate_direct:n #1 { \__siunitx_number_round_truncate:nnN { } { } #1 \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__siunitx_number_round_truncate:nnN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 { #1 } \__siunitx_number_round_truncate:nnN {#1#2} {#3} } \prg_new_conditional:Npnn \__siunitx_number_round_if_half:n #1 { p } { \int_compare:nNnTF { \tl_head:n { #1 0 } } = 5 { \exp_after:wN \__siunitx_number_round_if_half:N \use_none:n #1 0 \q_recursion_tail \q_recursion_stop } { \prg_return_false: } } \cs_new:Npn \__siunitx_number_round_if_half:N #1 { \quark_if_recursion_tail_stop_do:Nn #1 { \prg_return_true: } \int_compare:nNnTF {#1} = 0 { \__siunitx_number_round_if_half:N } { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_false: } } } \cs_new:Npn \__siunitx_number_round_pad:nnn #1#2#3 { {#2} { #3 \bool_if:NT \l__siunitx_number_round_pad_bool { \prg_replicate:nn {#1} { 0 } } } } \cs_new:Npn \__siunitx_number_round_figures:nnnnnnn #1#2#3#4#5#6#7 { \bool_lazy_and:nnTF { \str_if_eq_p:nn {#3} { 0 } } { \str_if_eq_p:ee { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } } } { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } } { \__siunitx_number_round_figures_aux:nnnnnnn {#1} {#2} {#3} {#4} {#5} {#6} {#7} } } \cs_new:Npn \__siunitx_number_round_figures_aux:nnnnnnn #1#2#3#4#5#6#7 { \tl_if_blank:nTF {#5} { \int_compare:nNnTF \l__siunitx_number_round_precision_int > 0 { \exp_not:n { {#1} {#2} } \__siunitx_number_round_figures_count:nnN {#3} {#4} #3#4 \q_recursion_tail \q_recursion_stop \exp_not:n { { } {#6} {#7} } } { { } { } { 0 } { } { } { } { 0 } } } { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } } } \cs_new:Npn \__siunitx_number_round_figures_count:nnN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 { { } { } { 0 } { } { } { } { 0 } } \int_compare:nNnTF {#3} = 0 { \__siunitx_number_round_figures_count:nnN {#1} {#2} } { \__siunitx_number_round_figures_count:nnnN { 1 } {#1} {#2} } } \cs_new:Npn \__siunitx_number_round_figures_count:nnnN #1#2#3#4 { \quark_if_recursion_tail_stop_do:Nn #4 { \int_compare:nNnTF {#1} > \l__siunitx_number_round_precision_int { \__siunitx_number_round:fnn { \int_eval:n { #1 - \l__siunitx_number_round_precision_int } } {#2} {#3} } { \__siunitx_number_round_pad:nnn { \l__siunitx_number_round_precision_int - (#1) } {#2} {#3} } } \exp_args:Nf \__siunitx_number_round_figures_count:nnnN { \int_eval:n { #1 + 1 } } {#2} {#3} } \cs_new:Npn \__siunitx_number_round_places:nnnnnnn #1#2#3#4#5#6#7 { \tl_if_blank:nTF {#5} { \exp_args:Ne \__siunitx_number_round_places_finalise:n { \exp_not:n { {#1} {#2} } \int_compare:nNnTF \l__siunitx_number_round_precision_int > 0 { \__siunitx_number_round_places_decimal:nn } { \__siunitx_number_round_places_integer:nn } {#3} {#4} \__siunitx_number_round_places_end:nnn { } {#6} {#7} } } { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } } } \cs_new:Npn \__siunitx_number_round_places_end:nnn #1#2#3 { \exp_not:n { {#1} {#2} {#3} } } \cs_new:Npn \__siunitx_number_round_places_decimal:nn #1#2 { \int_compare:nNnTF { \l__siunitx_number_round_precision_int - 0 \tl_count:n {#2} } > 0 { \__siunitx_number_round_pad:nnn { \l__siunitx_number_round_precision_int - 0 \tl_count:n {#2} } {#1} {#2} } { \__siunitx_number_round:fnn { \int_eval:n { 0 \tl_count:n {#2} - \l__siunitx_number_round_precision_int } } {#1} {#2} } } \cs_new:Npn \__siunitx_number_round_places_integer:nn #1#2 { \__siunitx_number_round:fnn { \int_eval:n { 0 \tl_count:n {#2} - \l__siunitx_number_round_precision_int } } {#1} {#2} } \cs_new:Npn \__siunitx_number_round_places_finalise:n #1 { \__siunitx_number_round_places_finalise:nnnnnnn #1 } \cs_new:Npn \__siunitx_number_round_places_finalise:nnnnnnn #1#2#3#4#5#6#7 { \bool_lazy_and:nnTF { \str_if_eq_p:nn {#3} { 0 } } { \str_if_eq_p:ee { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } } } { \tl_if_empty:NTF \l__siunitx_number_round_min_tl { \exp_not:n { {#1} } { \str_if_eq:nnF {#2} { - } { \exp_not:n {#2} } } \exp_not:n { {#3} {#4} {#5} {#6} {#7} } } { \exp_after:wN \__siunitx_number_round_places_finalise:nnnnn \l__siunitx_number_round_min_tl {#2} {#6} {#7} } } { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } } } \cs_new:Npn \__siunitx_number_round_places_finalise:nnnnn #1#2#3#4#5 { { \str_if_eq:nnTF {#3} { - } { > } { < } } \exp_not:n { {#3} {#1} {#2} { } {#4} {#5} } } \cs_new:Npn \__siunitx_number_round_uncertainty:nnnnnnn #1#2#3#4#5#6#7 { \bool_lazy_or:nnTF { \tl_if_blank_p:n {#5} } { ! \int_compare_p:nNn \l__siunitx_number_round_precision_int > 0 } { \exp_not:n { {#1} {#2} {#3} {#4} { } {#6} {#7} } } { \str_if_eq:eeTF { \tl_head:n {#5} } { S } { \exp_not:n { {#1} {#2} } \exp_args:Nnno \__siunitx_number_round_uncertainty:nnn {#3} {#4} { \use_ii:nn #5 } \__siunitx_number_round_uncertainty_end:nn {#6} {#7} } { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } } } } \cs_new:Npn \__siunitx_number_round_uncertainty_end:nn #1#2 { \exp_not:n { {#1} {#2} } } \cs_new:Npn \__siunitx_number_round_uncertainty:nnn #1#2#3 { \exp_args:Nf \__siunitx_number_round_uncertainty:nnnn { \int_eval:n { \tl_count:n {#3} - \l__siunitx_number_round_precision_int } } {#1} {#2} {#3} } \cs_new:Npn \__siunitx_number_round_uncertainty:nnnn #1#2#3#4 { \exp_last_unbraced:Nf \__siunitx_number_round_uncertainty:nnnnn { \__siunitx_number_round:nnn {#1} { } {#4} } {#2} {#3} {#1} } \cs_new:Npn \__siunitx_number_round_uncertainty:nnnnn #1#2#3#4#5 { \tl_if_blank:nTF {#1} { \exp_args:Nf \__siunitx_number_round_uncertainty_simple:nnnnn { \prg_replicate:nn { \int_max:nn { 0 - ( \tl_count:n {#4} - \tl_count:n {#2} - #5 + 1 ) } { 0 } } { 0 } } {#3} {#4} {#2} {#5} } { \__siunitx_number_round_uncertainty_shift:nnnnn {#3} {#4} {#1} {#2} {#5} } } \cs_new:Npn \__siunitx_number_round_uncertainty_simple:nnnnn #1#2#3#4#5 { \__siunitx_number_round:nnn {#5} {#2} {#3} { { S } { #4 #1 } } } \cs_new:Npn \__siunitx_number_round_uncertainty_shift:nnnnn #1#2#3#4#5 { \exp_args:Ne \__siunitx_number_round_uncertainty_shift:nn { \__siunitx_number_round:fnn { \int_eval:n { #5 + 1 } } {#1} {#2} } {#5} } \cs_new:Npn \__siunitx_number_round_uncertainty_shift:nn #1#2 { \__siunitx_number_round_uncertainty_shift:nnnw #1 {#2} } \cs_new:Npn \__siunitx_number_round_uncertainty_shift:nnnw #1#2#3 #4 \__siunitx_number_round_uncertainty_end:nn #5#6 { #4 \bool_lazy_and:nnTF { \int_compare_p:nNn {#3} > { \tl_count:n {#1} } } { ! \bool_lazy_and_p:nn { \str_if_eq_p:Vn \l__siunitx_number_exponent_mode_tl { scientific } } { \str_if_eq_p:nn { #1.#2 } { 10. } } } { \exp_args:Nf \__siunitx_number_round_uncertainty_shift_aux:nnnnn { \prg_replicate:nn { \tl_if_blank:nTF {#2} { \int_min:nn {#3} { \tl_count:n {#1} - 1 } } { 0 } } { 0 } } {#1} {#2} } { \use:c { __siunitx_number_round_uncertainty_ \l__siunitx_number_exponent_mode_tl :nnn } {#1} } {#5} {#6} } \cs_new:Npn \__siunitx_number_round_uncertainty_shift_aux:nnnnn #1#2#3#4#5 { \use:c { __siunitx_number_round_ \l__siunitx_number_exponent_mode_tl :nn } {#2} {#3} \__siunitx_number_round_places_end:nnn { { S } { 1 #1 } } {#4} {#5} } \cs_new:Npn \__siunitx_number_round_uncertainty_engineering:nnn #1#2#3 { \use:c { __siunitx_number_round_uncertainty_ \l__siunitx_number_exponent_mode_tl _ \tl_count:n {#1} :n } {#2#3} } \cs_new:cpn { __siunitx_number_round_uncertainty_engineering_2:n } #1 { { 10 } { } { { S } { 10 } } \__siunitx_number_exponent_finalise:n {#1} } \cs_new:cpn { __siunitx_number_round_uncertainty_engineering_3:n } #1 { { 100 } { } { { S } { 100 } } \__siunitx_number_exponent_finalise:n {#1} } \cs_new:cpn { __siunitx_number_round_uncertainty_engineering_4:n } #1 { { 1 } { } { { S } { 1 } } \__siunitx_number_exponent_finalise:n { #1 + 3 } } \cs_new:Npn \__siunitx_number_round_uncertainty_fixed:nnn #1#2#3 { {#1} { } { { S } { 1 \prg_replicate:nn { \tl_count:n {#1} - 1 } { 0 } } } {#2} {#3} } \cs_new_eq:NN \__siunitx_number_round_uncertainty_input:nnn \__siunitx_number_round_uncertainty_fixed:nnn \cs_new:Npn \__siunitx_number_round_uncertainty_scientific:nnn #1#2#3 { { 1 } { } { { S } { 1 } } \__siunitx_number_exponent_finalise:n { #2#3 + \tl_count:n {#1} - 1 } } \cs_new_protected:Npn \__siunitx_number_zero_decimal:NN #1#2 { \bool_if:NT \l__siunitx_number_drop_zero_decimal_bool { \tl_set:Nx #2 { \exp_after:wN \__siunitx_number_zero_decimal:nnnnnnn #1 } } } \cs_new:Npn \__siunitx_number_zero_decimal:nnnnnnn #1#2#3#4#5#6#7 { \exp_not:n { {#1} {#2} {#3} } \str_if_eq:eeTF { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } } { { } } { \exp_not:n { {#4} } } \exp_not:n { {#5} {#6} {#7} } } \cs_new:Npn \siunitx_number_adjust_exponent:nn #1#2 { \__siunitx_number_adjust_exp:nnnnnnnn #1 {#2} } \cs_new:Npn \siunitx_number_adjust_exponent:Nn #1#2 { \tl_if_empty:NF #1 { \exp_args:NV \siunitx_number_adjust_exponent:nn #1 {#2} } } \cs_new:Npn \__siunitx_number_adjust_exp:nnnnnnnn #1#2#3#4#5#6#7#8 { \exp_not:n { {#1} {#2} {#3} {#4} {#5} } \exp_args:Ne \__siunitx_number_adjust_exp:nn { \fp_eval:n { #6#7 + #8 } } {#6} } \cs_new:Npn \__siunitx_number_adjust_exp:nn #1#2 { \__siunitx_number_adjust_exp:nNw {#2} #1 \q_stop } \cs_new:Npn \__siunitx_number_adjust_exp:nNw #1#2#3 \q_stop { \token_if_eq_meaning:NNTF #2 - { { - } { \exp_not:n {#3} } } { { \str_if_eq:nnT {#1} { + } { + } } { \exp_not:n {#2#3} } } } \tl_new:N \l__siunitx_number_bracket_close_tl \tl_new:N \l__siunitx_number_bracket_open_tl \tl_set:Nn \l__siunitx_number_bracket_open_tl { ( } \tl_set:Nn \l__siunitx_number_bracket_close_tl { ) } \bool_new:N \l_siunitx_number_bracket_ambiguous_bool \tl_new:N \l_siunitx_number_output_decimal_tl \keys_define:nn { siunitx } { bracket-ambiguous-numbers .bool_set:N = \l_siunitx_number_bracket_ambiguous_bool , bracket-negative-numbers .bool_set:N = \l__siunitx_number_bracket_negative_bool , exponent-base .tl_set:N = \l__siunitx_number_exponent_base_tl , exponent-product .tl_set:N = \l__siunitx_number_exponent_product_tl , group-digits .choice: , group-digits / all .code:n = { \bool_set_true:N \l__siunitx_number_group_decimal_bool \bool_set_true:N \l__siunitx_number_group_integer_bool } , group-digits / decimal .code:n = { \bool_set_true:N \l__siunitx_number_group_decimal_bool \bool_set_false:N \l__siunitx_number_group_integer_bool } , group-digits / integer .code:n = { \bool_set_false:N \l__siunitx_number_group_decimal_bool \bool_set_true:N \l__siunitx_number_group_integer_bool } , group-digits / none .code:n = { \bool_set_false:N \l__siunitx_number_group_decimal_bool \bool_set_false:N \l__siunitx_number_group_integer_bool } , group-digits .default:n = all , group-minimum-digits .int_set:N = \l__siunitx_number_group_minimum_int , group-separator .tl_set:N = \l__siunitx_number_group_separator_tl , negative-color .tl_set:N = \l__siunitx_number_negative_color_tl , output-close-uncertainty .tl_set:N = \l__siunitx_number_output_uncert_close_tl , output-decimal-marker .tl_set:N = \l_siunitx_number_output_decimal_tl , output-exponent-marker .tl_set:N = \l__siunitx_number_output_exp_marker_tl , output-open-uncertainty .tl_set:N = \l__siunitx_number_output_uncert_open_tl , print-implicit-plus .bool_set:N = \l__siunitx_number_implicit_plus_bool , print-unity-mantissa .bool_set:N = \l__siunitx_number_unity_mantissa_bool , print-zero-exponent .bool_set:N = \l__siunitx_number_zero_exponent_bool , tight-spacing .bool_set:N = \l__siunitx_number_tight_bool , uncertainty-mode .choices:nn = { compact , compact-marker , full , separate } { \tl_set_eq:NN \l__siunitx_number_uncert_mode_tl \l_keys_choice_tl } , uncertainty-separator .tl_set:N = \l__siunitx_number_uncert_separator_tl } \bool_new:N \l__siunitx_number_group_decimal_bool \bool_new:N \l__siunitx_number_group_integer_bool \tl_new:N \l__siunitx_number_uncert_mode_tl \cs_new:Npn \siunitx_number_output:N #1 { \__siunitx_number_output:Nn #1 { } } \cs_new:Npn \siunitx_number_output:n #1 { \__siunitx_number_output:nn #1 { } } \cs_new:Npn \siunitx_number_output:NN #1#2 { \__siunitx_number_output:Nn #1 {#2} } \cs_new:Npn \siunitx_number_output:nN #1#2 { \__siunitx_number_output:nn #1 {#2} } \cs_new:Npn \__siunitx_number_output:Nn #1#2 { \tl_if_empty:NF #1 { \exp_after:wN \__siunitx_number_output:nnnnnnn #1 {#2} } } \cs_new:Npn \__siunitx_number_output:nn #1#2 { \tl_if_empty:nF {#1} { \__siunitx_number_output:nnnnnnn #1 {#2} } } \cs_new:Npn \__siunitx_number_output:nnnnnnn #1#2#3#4#5#6#7#8 { \__siunitx_number_output_color:n {#2} \__siunitx_number_output_comparator:nn {#1} {#8} \__siunitx_number_output_bracket:nn {#5} {#7} \__siunitx_number_output_sign:nnn {#1} {#2} {#8} \__siunitx_number_output_integer:nnn {#3} {#4} {#7} \__siunitx_number_output_decimal:nn {#4} {#8} \__siunitx_number_output_uncertainty:nnn {#5} {#4} {#8} \__siunitx_number_output_exponent:nnnn {#6} {#7} { #3 . #4 } {#8} \__siunitx_number_output_end: } \cs_new:Npn \__siunitx_number_output_bracket:nn #1#2 { \bool_lazy_all:nT { { \str_if_eq_p:Vn \l__siunitx_number_uncert_mode_tl { separate } } { \l_siunitx_number_bracket_ambiguous_bool } { ! \tl_if_blank_p:n {#1} } { \bool_lazy_or_p:nn { \l__siunitx_number_zero_exponent_bool } { ! \str_if_eq_p:nn {#2} { 0 } } } } \__siunitx_number_output_bracket:w } \cs_new:Npn \__siunitx_number_output_bracket:w #1 \__siunitx_number_output_exponent:nnnn { \exp_not:V \l__siunitx_number_bracket_open_tl #1 \exp_not:V \l__siunitx_number_bracket_close_tl \__siunitx_number_output_exponent:nnnn } \cs_new:Npn \__siunitx_number_output_color:n #1 { \bool_lazy_and:nnT { \str_if_eq_p:nn {#1} { - } } { ! \tl_if_empty_p:N \l__siunitx_number_negative_color_tl } { \exp_not:N \color { \exp_not:V \l__siunitx_number_negative_color_tl } } } \cs_new:Npn \__siunitx_number_output_comparator:nn #1#2 { \tl_if_blank:nF {#1} { \exp_not:n { \mathord {#1} } } \exp_not:n {#2} } \cs_new:Npn \__siunitx_number_output_sign:nnn #1#2#3 { \tl_if_blank:nTF {#2} { \bool_if:NT \l__siunitx_number_implicit_plus_bool { \__siunitx_number_output_sign:nN {#1} + } } { \str_if_eq:nnTF {#2} { - } { \bool_if:NTF \l__siunitx_number_bracket_negative_bool { \__siunitx_number_output_sign_brackets:w } { \__siunitx_number_output_sign:nN {#1} #2 } } { \__siunitx_number_output_sign:nN {#1} #2 } } \exp_not:n {#3} } \cs_new:Npn \__siunitx_number_output_sign:nN #1#2 { \tl_if_blank:nTF {#1} { \__siunitx_number_output_sign:N #2 } { \exp_not:n { \mathord {#2} } } } \cs_new:Npn \__siunitx_number_output_sign:N #1 { \bool_if:NTF \l__siunitx_number_tight_bool { \exp_not:n { \mathord {#1} } } { \exp_not:n {#1} } } \cs_new:Npn \__siunitx_number_output_sign_brackets:w #1 \__siunitx_number_output_end: { \exp_not:V \l__siunitx_number_bracket_open_tl #1 \exp_not:V \l__siunitx_number_bracket_close_tl \__siunitx_number_output_end: } \cs_new:Npn \__siunitx_number_output_integer:nnn #1#2#3 { \bool_lazy_any:nT { { \l__siunitx_number_unity_mantissa_bool } { ! \str_if_eq_p:nn { #1 . #2 } { 1. } } { \bool_lazy_and_p:nn { \str_if_eq_p:nn {#3} { 0 } } { ! \l__siunitx_number_zero_exponent_bool } } } { \__siunitx_number_output_digits:nn { integer } {#1} } } \cs_new:Npn \__siunitx_number_output_decimal:nn #1#2 { \exp_not:n {#2} \tl_if_blank:nF {#1} { \str_if_eq:VnTF \l_siunitx_number_output_decimal_tl { , } { \exp_not:N \mathord } { \use:n } { \exp_not:V \l_siunitx_number_output_decimal_tl } } \exp_not:n {#2} \__siunitx_number_output_digits:nn { decimal } {#1} } \cs_generate_variant:Nn \__siunitx_number_output_decimal:nn { f } \cs_new:Npn \__siunitx_number_output_digits:nn #1#2 { \bool_if:cTF { l__siunitx_number_group_ #1 _ bool } { \int_compare:nNnTF { \tl_count:n {#2} } < \l__siunitx_number_group_minimum_int { \exp_not:n {#2} } { \use:c { __siunitx_number_output_ #1 _aux:n } {#2} } } { \exp_not:n {#2} } } \cs_new:Npn \__siunitx_number_output_integer_aux:n #1 { \use:c { __siunitx_number_output_integer_aux_ \int_eval:n { \int_mod:nn { \tl_count:n {#1} } { 3 } } :n } {#1} } \cs_new:cpn { __siunitx_number_output_integer_aux_0:n } #1 { \__siunitx_number_output_integer_first:nnNN #1 \q_nil } \cs_new:cpn { __siunitx_number_output_integer_aux_1:n } #1 { \__siunitx_number_output_integer_first:nnNN { } { } #1 \q_nil } \cs_new:cpn { __siunitx_number_output_integer_aux_2:n } #1 { \__siunitx_number_output_integer_first:nnNN { } #1 \q_nil } \cs_new:Npn \__siunitx_number_output_integer_first:nnNN #1#2#3#4 { \exp_not:n {#1#2#3} \quark_if_nil:NF #4 { \__siunitx_number_output_integer_loop:NNNN #4 } } \cs_new:Npn \__siunitx_number_output_integer_loop:NNNN #1#2#3#4 { \str_if_eq:VnTF \l__siunitx_number_group_separator_tl { , } { \exp_not:N \mathord } { \use:n } { \exp_not:V \l__siunitx_number_group_separator_tl } \exp_not:n {#1#2#3} \quark_if_nil:NF #4 { \__siunitx_number_output_integer_loop:NNNN #4 } } \cs_new:Npn \__siunitx_number_output_decimal_aux:n #1 { \__siunitx_number_output_decimal_loop:NNNN \c_empty_tl #1 \q_nil \q_nil \q_nil } \cs_new:Npn \__siunitx_number_output_decimal_loop:NNNN #1#2#3#4 { \quark_if_nil:NF #2 { \exp_not:V #1 \exp_not:n {#2} \quark_if_nil:NTF #3 { \use_none:n } { \exp_not:n {#3} \quark_if_nil:NTF #4 { \use_none:nn } { \exp_not:n {#4} \__siunitx_number_output_decimal_loop:NNNN \l__siunitx_number_group_separator_tl } } } } \cs_new:Npn \__siunitx_number_output_uncertainty:nnn #1#2#3 { \tl_if_blank:nTF {#1} { \__siunitx_number_output_uncertainty_unaligned:n {#3} } { \use:c { __siunitx_number_output_uncert_ \tl_head:n {#1} :nnnw } {#2} {#3} #1 } } \cs_new:Npn \__siunitx_number_output_uncertainty_unaligned:n #1 { \exp_not:n { #1 #1 #1 #1 } } \cs_new:Npn \__siunitx_number_output_uncert_S:nnnw #1#2#3#4 { \str_if_eq:VnTF \l__siunitx_number_uncert_mode_tl { separate } { \exp_not:n {#2} \__siunitx_number_output_sign:N \pm \exp_not:n {#2} \__siunitx_number_output_uncert_S_aux:nnn { \int_eval:n { \tl_count:n {#4} - \tl_count:n {#1} } } {#4} {#2} } { \exp_not:V \l__siunitx_number_uncert_separator_tl \exp_not:V \l__siunitx_number_output_uncert_open_tl \use:c { __siunitx_number_output_uncert_S_ \l__siunitx_number_uncert_mode_tl :nn } {#1} {#4} \exp_not:V \l__siunitx_number_output_uncert_close_tl \__siunitx_number_output_uncertainty_unaligned:n {#2} } } \cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnn #1#2#3 { \int_compare:nNnTF {#1} > 0 { \__siunitx_number_output_uncert_S_aux:fnnw { \int_eval:n { #1 - 1 } } {#3} { } #2 \q_nil } { 0 \__siunitx_number_output_decimal:fn { \prg_replicate:nn { \int_abs:n {#1} } { 0 } #2 } {#3} } } \cs_generate_variant:Nn \__siunitx_number_output_uncert_S_aux:nnn { f } \cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnnw #1#2#3#4 { \quark_if_nil:NF #4 { \int_compare:nNnTF {#1} = 0 { \__siunitx_number_output_uncert_S_aux:nnw {#3#4} {#2} } { \__siunitx_number_output_uncert_S_aux:fnnw { \int_eval:n { #1 - 1 } } {#2} {#3#4} } } } \cs_generate_variant:Nn \__siunitx_number_output_uncert_S_aux:nnnw { f } \cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnw #1#2#3 \q_nil { \__siunitx_number_output_digits:nn { integer } {#1} \__siunitx_number_output_decimal:nn {#3} {#2} } \cs_new:Npn \__siunitx_number_output_uncert_S_compact:nn #1#2 { \exp_not:n {#2} } \cs_new:cpn { __siunitx_number_output_uncert_S_compact-marker:nn } #1#2 { \bool_lazy_or:nnTF { \tl_if_blank_p:n {#1} } { ! \int_compare_p:nNn { \tl_count:n {#2} } > { \tl_count:n {#1} } } { \__siunitx_number_output_uncert_S_compact:nn } { \__siunitx_number_output_uncert_S_full:nn } {#1} {#2} } \cs_new:Npn \__siunitx_number_output_uncert_S_full:nn #1#2 { \__siunitx_number_output_uncert_S_aux:fnn { \int_eval:n { \tl_count:n {#2} - \tl_count:n {#1} } } {#2} { } } \cs_new:Npn \__siunitx_number_output_exponent:nnnn #1#2#3#4 { \exp_not:n {#4} \bool_lazy_or:nnTF { \l__siunitx_number_zero_exponent_bool } { ! \str_if_eq_p:nn {#2} { 0 } } { \tl_if_empty:NTF \l__siunitx_number_output_exp_marker_tl { \__siunitx_number_output_exponent_auxi:nnnn } { \__siunitx_number_output_exponent_auxii:nnnn } {#1} {#2} {#3} {#4} } { \exp_not:n {#4} } } \cs_new:Npn \__siunitx_number_output_exponent_auxi:nnnn #1#2#3#4 { \bool_lazy_or:nnTF { \l__siunitx_number_unity_mantissa_bool } { ! \str_if_eq_p:nn {#3} { 1. } } { \bool_if:NTF \l__siunitx_number_tight_bool { \exp_not:N \mathord } { \use:n } { \exp_not:V \l__siunitx_number_exponent_product_tl } \exp_not:n {#4} } { \exp_not:n {#4} } \exp_not:V \l__siunitx_number_exponent_base_tl ^ { \__siunitx_number_output_exponent_auxiii:nn {#1} {#2} } } \cs_new:Npn \__siunitx_number_output_exponent_auxii:nnnn #1#2#3#4 { \exp_not:n {#4} \exp_not:V \l__siunitx_number_output_exp_marker_tl \__siunitx_number_output_exponent_auxiii:nn {#1} {#2} } \cs_new:Npn \__siunitx_number_output_exponent_auxiii:nn #1#2 { \tl_if_blank:nTF {#1} { \bool_lazy_and:nnT { \l__siunitx_number_implicit_plus_bool } { ! \str_if_eq_p:nn {#2} { 0 } } { \__siunitx_number_output_sign:N + } } { \__siunitx_number_output_sign:N #1 } \__siunitx_number_output_digits:nn { integer } {#2} } \cs_new:Npn \__siunitx_number_output_end: { } \tl_new:N \l__siunitx_number_valid_tl \prg_new_protected_conditional:Npnn \siunitx_if_number:n #1 { T , F , TF } { \group_begin: \bool_set_true:N \l__siunitx_number_validate_bool \bool_set_true:N \l_siunitx_number_parse_bool \siunitx_number_parse:nN {#1} \l__siunitx_number_parsed_tl \tl_if_empty:NTF \l__siunitx_number_parsed_tl { \group_end: \prg_return_false: } { \group_end: \prg_return_true: } } \prg_new_conditional:Npnn \siunitx_if_number_token:N #1 { p , T , F , TF } { \__siunitx_number_token_auxi:NN #1 \l_siunitx_number_input_decimal_tl \l__siunitx_number_input_uncert_close_tl \l_siunitx_number_input_comparator_tl \l__siunitx_number_input_digit_tl \l_siunitx_number_input_exponent_tl \l__siunitx_number_input_ignore_tl \l__siunitx_number_input_uncert_open_tl \l_siunitx_number_input_sign_tl \l__siunitx_number_input_uncert_sign_tl \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__siunitx_number_token_auxi:NN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 { \prg_return_false: } \__siunitx_number_token_auxii:NN #1 #2 \__siunitx_number_token_auxi:NN #1 } \cs_new:Npn \__siunitx_number_token_auxii:NN #1#2 { \exp_after:wN \__siunitx_number_token_auxiii:NN \exp_after:wN #1 #2 \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__siunitx_number_token_auxiii:NN #1#2 { \quark_if_recursion_tail_stop:N #2 \str_if_eq:nnT {#1} {#2} { \use_i_delimit_by_q_recursion_stop:nw { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_true: } } } \__siunitx_number_token_auxiii:NN #1 } \msg_new:nnnn { siunitx } { invalid-number } { Invalid~number~'#1'. } { The~input~'#1'~could~not~be~parsed~as~a~number~following~the~ format~defined~in~module~documentation. } \keys_set:nn { siunitx } { bracket-ambiguous-numbers = true , bracket-negative-numbers = false , drop-exponent = false , drop-uncertainty = false , drop-zero-decimal = false , evaluate-expression = false , exponent-base = 10 , exponent-mode = input , exponent-product = \times , expression = #1 , fixed-exponent = 0 , group-digits = all , group-minimum-digits = 5 , group-separator = \, , % ( input-close-uncertainty = ) , input-comparators = { <=>\approx\ge\geq\gg\le\leq\ll\sim } , input-decimal-markers = { ., } , input-digits = 0123456789 , input-exponent-markers = dDeE , input-ignore = \, , input-open-uncertainty = ( , % ) input-signs = +-\mp\pm , input-uncertainty-signs = \pm , minimum-decimal-digits = 0 , minimum-integer-digits = 0 , negative-color = , % ( output-close-uncertainty = ) , output-decimal-marker = . , output-open-uncertainty = ( , % ) parse-numbers = true , print-implicit-plus = false , print-unity-mantissa = true , print-zero-exponent = false , retain-explicit-plus = false , retain-zero-uncertainty = false , round-half = up , round-minimum = 0 , round-mode = none , round-pad = true , round-precision = 2 , tight-spacing = false , uncertainty-mode = compact , uncertainty-separator = } \RequirePackage { amstext } \cs_new_eq:NN \__siunitx_print_ams_text:n \text \RequirePackage { color } \cs_generate_variant:Nn \tl_replace_all:Nnn { NV } \tl_new:N \l__siunitx_print_tmp_tl \tl_new:N \l__siunitx_print_number_mode_tl \tl_new:N \l__siunitx_print_unit_mode_tl \keys_define:nn { siunitx } { color .meta:n = { number-color = #1 , unit-color = #1 } , mode .meta:n = { number-mode = #1 , unit-mode = #1 } , number-color .tl_set:N = \l__siunitx_print_number_color_tl , number-mode .choices:nn = { match , math , text } { \tl_set_eq:NN \l__siunitx_print_number_mode_tl \l_keys_choice_tl } , propagate-math-font .bool_set:N = \l__siunitx_print_math_font_bool , reset-math-version .bool_set:N = \l__siunitx_print_math_version_bool , reset-text-family .bool_set:N = \l__siunitx_print_text_family_bool , reset-text-series .bool_set:N = \l__siunitx_print_text_series_bool , reset-text-shape .bool_set:N = \l__siunitx_print_text_shape_bool , text-family-to-math .bool_set:N = \l__siunitx_print_math_family_bool , text-font-command .tl_set:N = \l__siunitx_print_text_font_tl , text-series-to-math .bool_set:N = \l__siunitx_print_math_series_bool , unit-color .tl_set:N = \l__siunitx_print_unit_color_tl , unit-mode .choices:nn = { match , math , text } { \tl_set_eq:NN \l__siunitx_print_unit_mode_tl \l_keys_choice_tl } } \keys_define:nn { siunitx / series-version-mapping } { ul . tl_set:N = \l__siunitx_print_version_ul_tl , el . tl_set:N = \l__siunitx_print_version_el_tl , l . tl_set:N = \l__siunitx_print_version_l_tl , sl . tl_set:N = \l__siunitx_print_version_sl_tl , m . tl_set:N = \l__siunitx_print_version_m_tl , sb . tl_set:N = \l__siunitx_print_version_sb_tl , b . tl_set:N = \l__siunitx_print_version_b_tl , eb . tl_set:N = \l__siunitx_print_version_eb_tl , ub . tl_set:N = \l__siunitx_print_version_ub_tl } \cs_new_protected:Npn \siunitx_print_number:n #1 { \__siunitx_print_aux:nn { number } {#1} } \cs_generate_variant:Nn \siunitx_print_number:n { V , x } \cs_new_protected:Npn \siunitx_print_unit:n #1 { \__siunitx_print_aux:nn { unit } {#1} } \cs_generate_variant:Nn \siunitx_print_unit:n { V , x } \cs_new_protected:Npn \__siunitx_print_aux:nn #1#2 { \tl_if_empty:cTF { l__siunitx_print_ #1 _color_tl } { \use:n } { \exp_args:Nv \textcolor { l__siunitx_print_ #1 _color_tl } } { \use:c { siunitx_print_ \tl_use:c { l__siunitx_print_ #1 _mode_tl } :n } {#2} } } \cs_new_protected:Npn \siunitx_print_match:n #1 { \mode_if_math:TF { \siunitx_print_math:n {#1} } { \siunitx_print_text:n {#1} } } \cs_new_protected:Npn \__siunitx_print_replace_font:N #1 { \tl_if_empty:NF \l_siunitx_unit_font_tl { \tl_replace_all:NVn #1 \l_siunitx_unit_font_tl { \use:n } } } \clist_map_inline:nn { uc , ec , c , sc , sx , x , ex , ux } { \tl_const:cn { c__siunitx_print_series_ #1 _tl } { m } } \clist_map_inline:nn { l , m , b } { \tl_const:cn { c__siunitx_print_series_ #1 _tl } { #1 } } \tl_new:N \l__siunitx_print_math_html_tl \cs_new_protected:Npn \siunitx_print_math:n #1 { \bool_lazy_and:nnTF { \l__siunitx_print_math_series_bool } { \str_if_eq_p:Vn \math@version { normal } } { \tl_set:Nx \l__siunitx_print_tmp_tl { \exp_after:wN \__siunitx_print_extract_series:Nw \f@series ? \q_stop } \tl_if_empty:NTF \l__siunitx_print_tmp_tl { \__siunitx_print_math_auxi:n {#1} } { \__siunitx_print_math_version:Vn \l__siunitx_print_tmp_tl {#1} } } { \__siunitx_print_math_auxi:n {#1} } } \cs_new:Npn \__siunitx_print_extract_series:Nw #1#2 ? #3 \q_stop { \cs_if_exist:cTF { c__siunitx_print_series_ #1#2 _tl } { \__siunitx_print_convert_series:v { c__siunitx_print_series_ #1#2 _tl } } { \cs_if_exist:cTF { c__siunitx_print_series_ #1 _tl } { \__siunitx_print_convert_series:v { c__siunitx_print_series_ #1 _tl } } { \__siunitx_print_convert_series:n {#1#2} } } } \cs_new:Npn \__siunitx_print_convert_series:n #1 { \tl_use:c { l__siunitx_print_version_ #1 _tl } } \cs_generate_variant:Nn \__siunitx_print_convert_series:n { v } \cs_new_protected:Npn \__siunitx_print_math_auxi:n #1 { \bool_if:NTF \l__siunitx_print_math_version_bool { \__siunitx_print_math_version:nn { normal } {#1} } { \__siunitx_print_math_auxii:n {#1} } } \cs_new_protected:Npn \__siunitx_print_math_version:nn #1#2 { \str_if_eq:VnTF \math@version { #1 } { \__siunitx_print_math_auxii:n {#2} } { \mode_if_math:TF { \text } { \use:n } { \mathversion {#1} \__siunitx_print_math_auxii:n {#2} } } } \cs_generate_variant:Nn \__siunitx_print_math_version:nn { V } \cs_new_protected:Npn \__siunitx_print_math_auxii:n #1 { \group_begin: \cs_set_protected:Npn \text ##1 { \cs_set_eq:NN \text \__siunitx_print_ams_text:n \siunitx_print_text:n {##1} } \tl_set:Nn \l__siunitx_print_tmp_tl {#1} \exp_after:wN \__siunitx_print_math_replace:Nn \l__siunitx_print_math_html_tl \q_recursion_tail { } \q_recursion_stop \exp_args:NV \__siunitx_print_math_auxiii:n \l__siunitx_print_tmp_tl \group_end: } \cs_new_protected:Npn \__siunitx_print_math_replace:Nn #1#2 { \quark_if_recursion_tail_stop:N #1 \tl_replace_all:Nnn \l__siunitx_print_tmp_tl {#1} {#2} \__siunitx_print_math_replace:Nn } \cs_new_protected:Npn \__siunitx_print_math_auxiii:n #1 { \bool_if:NTF \l__siunitx_print_math_family_bool { \str_case_e:nnF { \f@family } { { \rmdefault } { \__siunitx_print_math_auxv:n } { \sfdefault } { \__siunitx_print_math_auxix:Nn \mathsf } { \ttdefault } { \__siunitx_print_math_auxix:Nn \mathtt } } { \__siunitx_print_math_auxiv:n } } { \__siunitx_print_math_auxiv:n } {#1} } \cs_new_protected:Npn \__siunitx_print_math_auxiv:n #1 { \bool_if:NTF \l__siunitx_print_math_font_bool { \__siunitx_print_math_auxvii:N \mathbf \mathit \mathsf \mathtt \q_recursion_tail \q_recursion_stop } { \__siunitx_print_math_auxv:n } {#1} } \cs_new_protected:Npn \__siunitx_print_math_auxv:n #1 { \bool_lazy_or:nnTF { \int_compare_p:nNn \fam = { -1 } } { \int_compare_p:nNn \fam = \symoperators } { \__siunitx_print_math_ensure:n } { \__siunitx_print_math_auxvi:Nn \mathrm } {#1} } \cs_new_protected:Npn \__siunitx_print_math_auxvi:Nn #1#2 { \__siunitx_print_math_ensure:n { #1 {#2} } } \cs_new_protected:Npn \__siunitx_print_math_auxvii:N #1 { \quark_if_recursion_tail_stop_do:Nn #1 { \__siunitx_print_math_auxv:n } \exp_after:wN \exp_after:wN \exp_after:wN \__siunitx_print_math_auxviii:w \cs:w \cs_to_str:N #1 \c_space_tl \cs_end: \use@mathgroup ? { -2 } \q_stop #1 } \cs_new_protected:Npn \__siunitx_print_math_auxviii:w #1 \use@mathgroup #2#3 #4 \q_stop #5 { \int_compare:nNnTF \fam = {#3} { \use_i_delimit_by_q_recursion_stop:nw { \__siunitx_print_math_auxix:Nn #5 } } { \__siunitx_print_math_auxvii:N } } \cs_new_protected:Npx \__siunitx_print_math_auxix:Nn #1#2 { \group_begin: \tl_set:Nn \exp_not:N \l__siunitx_print_tmp_tl {#2} \__siunitx_print_replace_font:N \exp_not:N \l__siunitx_print_tmp_tl \tl_replace_all:Nnn \exp_not:N \l__siunitx_print_tmp_tl { \char_generate:nn { `\_ } { 8 } } { \exp_not:N \__siunitx_print_math_sub:n } \tl_replace_all:Nnn \exp_not:N \l__siunitx_print_tmp_tl { ^ } { \exp_not:N \__siunitx_print_math_super:n } \exp_not:N \exp_args:NNV \__siunitx_print_math_auxvi:Nn #1 \exp_not:N \l__siunitx_print_tmp_tl \group_end: } \cs_new_protected:Npx \__siunitx_print_math_sub:n #1 { \char_generate:nn { `\_ } { 8 } { \exp_not:N \__siunitx_print_math_script:n {#1} } } \cs_new_protected:Npn \__siunitx_print_math_super:n #1 { ^ { \__siunitx_print_math_script:n {#1} } } \cs_new_protected:Npn \__siunitx_print_math_script:n #1 { \group_begin: \tl_set:Nn \l__siunitx_print_tmp_tl {#1} \__siunitx_print_replace_font:N \l__siunitx_print_tmp_tl \tl_use:N \l__siunitx_print_tmp_tl \group_end: } \cs_new_protected:Npn \__siunitx_print_math_ensure:n #1 { \tl_if_blank:nF {#1} { \mode_if_math:TF {#1} { $ #1 $ } } } \AtBeginDocument { \@ifpackageloaded { tex4ht } { \tl_set:Nx \l__siunitx_print_math_html_tl { ^ { \token_to_str:N ^ } } } { } } \cs_new_protected:Npn \siunitx_print_text:n #1 { \text { \bool_if:NT \l__siunitx_print_text_family_bool { \fontfamily { \familydefault } } \bool_if:NT \l__siunitx_print_text_series_bool { \fontseries { \seriesdefault } } \bool_if:NT \l__siunitx_print_text_shape_bool { \fontshape { \shapedefault } } \bool_lazy_any:nT { { \l__siunitx_print_text_family_bool } { \l__siunitx_print_text_series_bool } { \l__siunitx_print_text_shape_bool } } { \selectfont } \tl_use:N \l__siunitx_print_text_font_tl \exp_args:NnV \tl_if_head_eq_meaning:nNTF {#1} \l_siunitx_unit_fraction_tl { \__siunitx_print_text_fraction:Nnn #1 } { \__siunitx_print_text_replace:n {#1} } } } \cs_new_protected:Npn \__siunitx_print_text_replace:n #1 { \group_begin: \tl_if_head_eq_meaning:nNTF {#1} \mathchoice { \__siunitx_print_text_replace:Nnnnn #1 } { \tl_set:Nn \l__siunitx_print_tmp_tl {#1} \__siunitx_print_replace_font:N \l__siunitx_print_tmp_tl \cs_set:Npn \mathord ##1 {##1} \cs_set:Npn \pm { \exp_not:N \textpm } \tl_map_inline:nn { \mp \ge \le \gg \ll } { \cs_set:Npn ##1 { \exp_not:N \ensuremath { \exp_not:N ##1 } } } \cs_set:Npn \cdot { \exp_not:N \textperiodcentered } \cs_set:Npn \times { \exp_not:N \texttimes } \protected@edef \l__siunitx_print_tmp_tl { \l__siunitx_print_tmp_tl } \__siunitx_print_text_replace:N \l__siunitx_print_tmp_tl \__siunitx_print_text_replace_aux:n { \tl_use:N \l__siunitx_print_tmp_tl } } \group_end: } \cs_new_protected:Npn \__siunitx_print_text_replace_aux:n #1 {#1} \cs_new_protected:Npx \__siunitx_print_text_replace:N #1 { \exp_not:N \__siunitx_print_text_replace:NNn #1 - { \exp_not:N \textminus } \char_generate:nn { `\_ } { 8 } { \exp_not:N \__siunitx_print_text_sub:n } ^ { \exp_not:N \__siunitx_print_text_super:n } \exp_not:N \q_recursion_tail { ? } \exp_not:N \q_recursion_stop } \cs_new_protected:Npn \__siunitx_print_text_replace:NNn #1#2#3 { \quark_if_recursion_tail_stop:N #2 \tl_replace_all:Nnn #1 {#2} {#3} \__siunitx_print_text_replace:NNn #1 } \cs_new_protected:Npn \__siunitx_print_text_replace:Nnnnn #1#2#3#4#5 { \ensuremath { \mathchoice { \__siunitx_print_print_replace_frac:n {#2} } { \__siunitx_print_print_replace_frac:n {#3} } { \__siunitx_print_print_replace_frac:n {#4} } { \__siunitx_print_print_replace_frac:n {#5} } } } \cs_new_protected:Npn \__siunitx_print_print_replace_frac:n #1 { \exp_args:NnV \tl_if_head_eq_meaning:nNTF {#1} \l_siunitx_unit_fraction_tl { \__siunitx_print_text_fraction:Nnn #1 } { \mbox { \__siunitx_print_text_replace:n {#1} } } } \sys_if_engine_xetex:T { \AtBeginDocument { \@ifpackageloaded { bidi } { \cs_set_protected:Npn \__siunitx_print_text_replace_aux:n #1 { \LRE {#1} } } { } } } \cs_new_protected:Npn \__siunitx_print_text_sub:n #1 { \__siunitx_print_text_scripts:NnN \textsubscript {#1} \__siunitx_print_text_super:n } \cs_new_protected:Npn \__siunitx_print_text_super:n #1 { \__siunitx_print_text_scripts:NnN \textsuperscript {#1} \__siunitx_print_text_sub:n } \cs_new_protected:Npn \__siunitx_print_text_scripts:NnN #1#2#3 { \cs_set_protected:Npn \__siunitx_print_text_scripts: { \if_meaning:w \l_peek_token #3 \exp_after:wN \__siunitx_print_text_scripts_two:NnNn \else: \exp_after:wN \__siunitx_print_text_scripts_one:Nn \fi: #1 {#2} } \peek_after:Nw \__siunitx_print_text_scripts: } \cs_new_protected:Npn \__siunitx_print_text_scripts: { } \cs_new_protected:Npn \__siunitx_print_text_scripts_one:Nn #1#2 { \group_begin: \tl_set:Nn \l__siunitx_print_tmp_tl {#2} \__siunitx_print_text_replace:N \l__siunitx_print_tmp_tl \exp_args:NNV \group_end: #1 \l__siunitx_print_tmp_tl } \cs_new_protected:Npn \__siunitx_print_text_scripts_two:NnNn #1#2#3#4 { \cs_if_eq:NNTF #1 \textsubscript { \__siunitx_print_text_scripts_two:nn {#4} {#2} } { \__siunitx_print_text_scripts_two:nn {#2} {#4} } } \cs_new_protected:Npx \__siunitx_print_text_scripts_two:nn #1#2 { \group_begin: \exp_not:N \m@th \exp_not:N \ensuremath { ^ { \exp_not:N \__siunitx_print_text_scripts_two:n {#1} } \char_generate:nn { `\_ } { 8 } { \exp_not:N \__siunitx_print_text_scripts_two:n {#2} } } \group_end: } \cs_new_protected:Npn \__siunitx_print_text_scripts_two:n #1 { \mbox { \fontsize \sf@size \z@ \selectfont \__siunitx_print_text_scripts_one:Nn \use:n {#1} } } \cs_new_protected:Npn \__siunitx_print_text_fraction:Nnn #1#2#3 { \ensuremath { #1 { \mbox { \__siunitx_print_text_replace:n {#2} } } { \mbox { \__siunitx_print_text_replace:n {#3} } } } } \keys_set:nn { siunitx } { color = , mode = math , number-color = , number-mode = math , propagate-math-font = false , reset-math-version = true , reset-text-shape = true , reset-text-series = true , reset-text-family = true , text-family-to-math = false , text-font-command = , text-series-to-math = false , unit-color = , unit-mode = math } \keys_set:nn { siunitx / series-version-mapping } { ul = light , el = light , l = light , sl = light , m = normal , sb = bold , b = bold , eb = bold , ub = bold } \box_new:N \l__siunitx_table_tmp_box \dim_new:N \l__siunitx_table_tmp_dim \tl_new:N \l__siunitx_table_tmp_tl \bool_new:N \l__siunitx_table_text_bool \cs_new_protected:Npn \siunitx_cell_begin:w { \bool_set_false:N \l__siunitx_table_text_bool \bool_if:NTF \l_siunitx_number_parse_bool { \__siunitx_table_collect_begin: } { \__siunitx_table_direct_begin: } } \cs_new_protected:Npn \siunitx_cell_end: { \bool_if:NF \l__siunitx_table_text_bool { \bool_if:NTF \l_siunitx_number_parse_bool { \__siunitx_table_collect_end: } { \__siunitx_table_direct_end: } } } \tl_new:N \l__siunitx_table_collect_tl \cs_new_protected:Npn \__siunitx_table_collect_begin: { \group_begin: \tl_clear:N \l__siunitx_table_collect_tl \if_false: { \fi: \cs_set_protected:Npn \cr { \__siunitx_table_collect_loop: \tex_cr:D } \if_false: } \fi: \__siunitx_table_collect_begin:w } \cs_new_protected:Npn \__siunitx_table_collect_begin:w #1 \ignorespaces { \__siunitx_table_collect_loop: #1 } \cs_new_protected:Npn \__siunitx_table_collect_loop: { \peek_catcode_ignore_spaces:NTF \c_group_begin_token { \__siunitx_table_collect_group:n } { \__siunitx_table_collect_token:N } } \cs_new_protected:Npn \__siunitx_table_collect_group:n #1 { \tl_put_right:Nn \l__siunitx_table_collect_tl { {#1} } \__siunitx_table_collect_loop: } \cs_new_protected:Npn \__siunitx_table_collect_token:N #1 { \__siunitx_table_collect_search:NnF #1 { \unskip { \__siunitx_table_collect_loop: } \end { \tabularnewline \end } \relax { \__siunitx_table_collect_relax:N #1 } \tabularnewline { \tabularnewline } \siunitx_cell_end: { \siunitx_cell_end: } } { \__siunitx_table_collect_token_aux:N #1 } } \cs_new_protected:Npn \__siunitx_table_collect_token_aux:N #1 { \tl_put_right:Nn \l__siunitx_table_collect_tl {#1} \__siunitx_table_collect_loop: } \cs_new_protected:Npn \__siunitx_table_collect_relax:N #1 { \str_if_eq:nnTF {#1} { \relax } { \relax } { \__siunitx_table_collect_token_aux:N #1 } } \AtBeginDocument { \@ifpackageloaded { mdwtab } { \cs_set_protected:Npn \__siunitx_table_collect_token:N #1 { \__siunitx_table_collect_search:NnF #1 { \@maybe@unskip { \__siunitx_table_collect_loop: } \tab@setcr { \__siunitx_table_collect_loop: } \unskip { \__siunitx_table_collect_loop: } \end { \tabularnewline \end } \relax { \__siunitx_table_collect_relax:N #1 } \tabularnewline { \tabularnewline } \siunitx_cell_end: { \siunitx_cell_end: } } { \__siunitx_table_collect_token_aux:N #1 } } } { } } \cs_new_protected:Npn \__siunitx_table_collect_search:NnF #1#2#3 { \__siunitx_table_collect_search_aux:NNn #1 #2 #1 {#3} \q_stop } \cs_new_protected:Npn \__siunitx_table_collect_search_aux:NNn #1#2#3 { \token_if_eq_meaning:NNTF #1 #2 { \use_i_delimit_by_q_stop:nw {#3} } { \__siunitx_table_collect_search_aux:NNn #1 } } \tl_new:N \l__siunitx_table_before_tl \tl_new:N \l__siunitx_table_number_tl \tl_new:N \l__siunitx_table_after_tl \cs_new_protected:Npn \__siunitx_table_collect_end: { \exp_args:NNV \group_end: \__siunitx_table_collect_end:n \l__siunitx_table_collect_tl \exp_args:NV \__siunitx_table_split:nNNN \l__siunitx_table_collect_tl \l__siunitx_table_before_tl \l__siunitx_table_number_tl \l__siunitx_table_after_tl \tl_if_empty:NTF \l__siunitx_table_number_tl { \__siunitx_table_print_text:V \l__siunitx_table_before_tl } { \__siunitx_table_print:VVV \l__siunitx_table_before_tl \l__siunitx_table_number_tl \l__siunitx_table_after_tl } } \cs_new_protected:Npn \__siunitx_table_collect_end:n #1 { \str_if_eq:eeTF { \exp_not:n {#1} } { { \__siunitx_table_collect_end_aux:n {#1} } } { \tl_set:Nn } { \cs_if_exist:NT \array@row@rst { \cs_set_eq:NN \array@row@rst \scan_stop: } \protected@edef } \l__siunitx_table_collect_tl {#1} } \cs_new:Npn \__siunitx_table_collect_end_aux:n #1 { \exp_after:wN \__siunitx_table_collect_end:w #1 \q_stop } \cs_new:Npn \__siunitx_table_collect_end:w #1 \q_stop { \exp_not:n {#1} } \cs_new_protected:Npn \__siunitx_table_split:nNNN #1#2#3#4 { \tl_clear:N #2 \tl_clear:N #3 \tl_clear:N #4 \__siunitx_table_split_loop:NNN #2#3#4 #1 \q_recursion_tail \q_recursion_stop \__siunitx_table_split_tidy:N #2 \__siunitx_table_split_tidy:N #4 } \cs_new_protected:Npn \__siunitx_table_split_loop:NNN #1#2#3 { \peek_catcode_ignore_spaces:NTF \c_group_begin_token { \__siunitx_table_split_group:NNNn #1#2#3 } { \__siunitx_table_split_token:NNNN #1#2#3 } } \cs_new_protected:Npn \__siunitx_table_split_group:NNNn #1#2#3#4 { \tl_if_empty:NTF #2 { \tl_put_right:Nn #1 { {#4} } } { \tl_put_right:Nn #3 { {#4} } } \__siunitx_table_split_loop:NNN #1#2#3 } \cs_new_protected:Npn \__siunitx_table_split_token:NNNN #1#2#3#4 { \quark_if_recursion_tail_stop:N #4 \tl_if_empty:NTF \l__siunitx_table_after_tl { \siunitx_if_number_token:NTF #4 { \tl_put_right:Nn #2 {#4} } { \tl_if_empty:NTF #2 { \tl_put_right:Nn #1 {#4} } { \tl_put_right:Nn #3 {#4} } } } { \tl_put_right:Nn #3 {#4} } \__siunitx_table_split_loop:NNN #1#2#3 } \cs_new_protected:Npn \__siunitx_table_split_tidy:N #1 { \tl_if_empty:NF #1 { \__siunitx_table_split_tidy:NV #1 #1 } } \cs_new_protected:Npn \__siunitx_table_split_tidy:Nn #1#2 { \str_if_eq:onT { \exp_after:wN { \use:n #2 } } {#2} { \tl_set:No #1 { \use:n #2 } } } \cs_generate_variant:Nn \__siunitx_table_split_tidy:Nn { NV } \cs_new_protected:Npn \__siunitx_table_skip:n #1 { \skip_horizontal:n {#1} \tex_kern:D \c_zero_skip } \dim_new:N \l__siunitx_table_column_width_dim \keys_define:nn { siunitx } { table-column-width .code:n = { \dim_set:Nn \l__siunitx_table_column_width_dim {#1} \dim_compare:nNnT \l__siunitx_table_column_width_dim > \c_zero_dim { \bool_set_true:N \l__siunitx_table_fixed_width_bool } } , table-fixed-width .bool_set:N = \l__siunitx_table_fixed_width_bool } \cs_new_protected:Npn \__siunitx_table_align_center:n #1 { \__siunitx_table_align_auxi:nn {#1} { 0pt~plus~0.5fill } } \cs_new_protected:Npn \__siunitx_table_align_left:n #1 { \__siunitx_table_align_auxi:nn {#1} { 0pt } } \cs_new_protected:Npn \__siunitx_table_align_right:n #1 { \__siunitx_table_align_auxi:nn {#1} { 0pt~plus~1fill } } \cs_new_protected:Npn \__siunitx_table_align_none:n #1 { \bool_if:NTF \l__siunitx_table_fixed_width_bool { \hbox_to_wd:nn \l__siunitx_table_column_width_dim } { \use:n } {#1} } \cs_new_protected:Npn \__siunitx_table_align_auxi:nn #1#2 { \bool_if:NTF \l__siunitx_table_fixed_width_bool { \hbox_to_wd:nn \l__siunitx_table_column_width_dim } { \use:n } { \__siunitx_table_skip:n {#2} #1 \__siunitx_table_skip:n { 0pt~plus~1fill - #2 } } } \AtBeginDocument { \@ifpackageloaded { colortbl } { \cs_new_eq:NN \__siunitx_table_align_auxii:nn \__siunitx_table_align_auxi:nn \cs_set_protected:Npn \__siunitx_table_align_auxi:nn #1#2 { \__siunitx_table_skip:n{ 0pt~plus~-0.5fill } \__siunitx_table_align_auxii:nn {#1} {#2} \__siunitx_table_skip:n { 0pt~plus~-0.5fill } } } { } } \keys_define:nn { siunitx } { table-text-alignment .choices:nn = { center , left , right , none } { \tl_set:Nn \l__siunitx_table_align_text_tl {#1} } , } \tl_new:N \l__siunitx_table_align_text_tl \cs_new_protected:Npn \__siunitx_table_print_text:n #1 { \bool_set_true:N \l__siunitx_table_text_bool \use:c { __siunitx_table_align_ \l__siunitx_table_align_text_tl :n } {#1} } \cs_generate_variant:Nn \__siunitx_table_print_text:n { V } \box_new:N \l__siunitx_table_integer_box \box_new:N \l__siunitx_table_decimal_box \cs_new_eq:NN \__siunitx_table_fil: \tex_hfil:D \cs_new_eq:NN \__siunitx_table_fill: \tex_hfill:D \cs_new:Npn \__siunitx_table_cleanup_decimal:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil { #1#2#3#4#5#6#7 } \cs_new_protected:Npn \__siunitx_table_color_check:N #1 { \exp_after:wN \__siunitx_table_color_check:w #1 \q_stop } \cs_new_protected:Npn \__siunitx_table_color_check:w #1 \q_nil #2 \q_stop { \tl_if_head_eq_meaning:nNT {#1} \color { \__siunitx_table_color_check:Nnw #1 \q_stop } } \cs_new_protected:Npn \__siunitx_table_color_check:Nnw #1#2#3 \q_stop { \keys_set:nn { siunitx } { number-color = #2 } } \cs_new_protected:Npn \__siunitx_table_center_marker: { \hbox_set:Nn \l__siunitx_table_tmp_box { \ensuremath { \mathord { \l_siunitx_number_output_decimal_tl } } } \dim_compare:nNnTF { \box_wd:N \l__siunitx_table_integer_box } > { \box_wd:N \l__siunitx_table_decimal_box - \box_wd:N \l__siunitx_table_tmp_box } { \bool_if:NTF \l__siunitx_table_align_after_bool { \__siunitx_table_center_marker_aux:Nnnn \l__siunitx_table_decimal_box { \box_wd:N \l__siunitx_table_integer_box + \box_wd:N \l__siunitx_table_tmp_box } } { \__siunitx_table_center_marker_aux:Nnnn \l__siunitx_table_after_box { \box_wd:N \l__siunitx_table_after_box + \box_wd:N \l__siunitx_table_integer_box - \box_wd:N \l__siunitx_table_decimal_box + \box_wd:N \l__siunitx_table_tmp_box } } { } { \__siunitx_table_fil: } } { \bool_if:NTF \l__siunitx_table_align_before_bool { \__siunitx_table_center_marker_aux:Nnnn \l__siunitx_table_integer_box { \box_wd:N \l__siunitx_table_decimal_box - \box_wd:N \l__siunitx_table_tmp_box } } { \__siunitx_table_center_marker_aux:Nnnn \l__siunitx_table_before_box { \box_wd:N \l__siunitx_table_before_box + \box_wd:N \l__siunitx_table_decimal_box - \box_wd:N \l__siunitx_table_integer_box - \box_wd:N \l__siunitx_table_tmp_box } } { \__siunitx_table_fil: } { } } } \cs_new_protected:Npn \__siunitx_table_center_marker_aux:Nnnn #1#2#3#4 { \hbox_set_to_wd:Nnn #1 {#2} { #3 \hbox_unpack:N #1 #4 } } \keys_define:nn { siunitx } { table-alignment .meta:n = { table-number-alignment = #1 , table-text-alignment = #1 }, table-alignment-mode .choices:nn = { none , format , marker } { \tl_set_eq:NN \l__siunitx_table_align_mode_tl \l_keys_choice_tl } , table-auto-round .bool_set:N = \l__siunitx_table_auto_round_bool , table-format .code:n = { \group_begin: \protected@edef \l__siunitx_table_tmp_tl {#1} \exp_args:NNV \group_end: \__siunitx_table_split:nNNN \l__siunitx_table_tmp_tl \l__siunitx_table_before_model_tl \l__siunitx_table_model_tl \l__siunitx_table_after_model_tl \exp_args:NV \__siunitx_table_generate_model:n \l__siunitx_table_model_tl \tl_set:Nn \l__siunitx_table_align_mode_tl { format } } , table-number-alignment .choices:nn = { center , left , right } { \tl_set_eq:NN \l__siunitx_table_align_number_tl \l_keys_choice_tl } } \tl_new:N \l__siunitx_table_align_mode_tl \tl_new:N \l__siunitx_table_align_number_tl \tl_new:N \l__siunitx_table_format_tl \tl_new:N \l__siunitx_table_before_model_tl \tl_new:N \l__siunitx_table_model_tl \tl_new:N \l__siunitx_table_after_model_tl \cs_new_protected:Npn \__siunitx_table_generate_model:n #1 { \group_begin: \bool_set_true:N \l_siunitx_number_parse_bool \keys_set:nn { siunitx } { retain-explicit-plus = true } \siunitx_number_parse:nN {#1} \l__siunitx_table_format_tl \exp_args:NNNV \group_end: \tl_set:Nn \l__siunitx_table_format_tl \l__siunitx_table_format_tl \tl_if_empty:NF \l__siunitx_table_format_tl { \exp_after:wN \__siunitx_table_generate_model:nnnnnnn \l__siunitx_table_format_tl } } \cs_new_protected:Npn \__siunitx_table_generate_model:nnnnnnn #1#2#3#4#5#6#7 { \tl_set:Nx \l__siunitx_table_model_tl { \exp_not:n { {#1} {#2} } { \prg_replicate:nn {#3} { 8 } } { \prg_replicate:nn { 0 #4 } { 8 } } { \tl_if_blank:nF {#5} { \use:c { __siunitx_table_generate_model_ \tl_head:n {#5} :nnw } {#4} #5 } } \exp_not:n { {#6} } { \int_compare:nNnTF {#7} = 0 { 0 } { \prg_replicate:nn {#7} { 8 } } } } } \cs_new:Npn \__siunitx_table_generate_model_S:nnw #1#2#3 { { S } { \exp_args:Nff \__siunitx_table_generate_model_S:nnn { \tl_count:n {#1} } { \tl_count:n {#3} } {#3} } } \cs_new:Npn \__siunitx_table_generate_model_S:nnn #1#2#3 { \prg_replicate:nn { \int_compare:nNnTF {#2} > {#1} { \str_range:nnn {#3} { 1 } {#1} + \str_range:nnn {#3} { 1 + #1 } {#2} } {#3} } { 8 } } \cs_new_protected:Npn \__siunitx_table_direct_begin: { \__siunitx_table_direct_begin:w } \cs_new_protected:Npn \__siunitx_table_direct_begin:w #1 \ignorespaces { #1 \peek_catcode_ignore_spaces:NTF \c_group_begin_token { \__siunitx_table_print_text:n } { \m@th \use:c { __siunitx_table_direct_ \l__siunitx_table_align_mode_tl : } } } \cs_new_protected:Npn \__siunitx_table_direct_end: { \use:c { __siunitx_table_direct_ \l__siunitx_table_align_mode_tl _end: } } \cs_new_protected:Npn \__siunitx_table_direct_marker: { \hbox_set:Nn \l__siunitx_table_tmp_box { \ensuremath { \mathord { \l_siunitx_number_output_decimal_tl } } } \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box { \box_wd:N \l__siunitx_table_tmp_box } { \__siunitx_table_fil: } \hbox_set:Nw \l__siunitx_table_integer_box \c_math_toggle_token \tl_map_inline:Nn \l_siunitx_number_input_decimal_tl { \char_set_active_eq:NN ##1 \__siunitx_table_direct_marker_switch: \char_set_mathcode:nn { `##1 } { "8000 } } } \cs_new_protected:Npn \__siunitx_table_direct_marker_switch: { \c_math_toggle_token \hbox_set_end: \hbox_set:Nw \l__siunitx_table_decimal_box \c_math_toggle_token \l_siunitx_number_output_decimal_tl } \cs_new_protected:Npn \__siunitx_table_direct_marker_end: { \c_math_toggle_token \hbox_set_end: \bool_set_true:N \l__siunitx_table_align_before_bool \bool_set_true:N \l__siunitx_table_align_after_bool \__siunitx_table_center_marker: \use:c { __siunitx_table_align_ \l__siunitx_table_align_text_tl :n } { \box_use_drop:N \l__siunitx_table_integer_box \box_use_drop:N \l__siunitx_table_decimal_box } } \cs_new_protected:Npn \__siunitx_table_direct_format: { \tl_set:Nx \l__siunitx_table_tmp_tl { \siunitx_number_output:NN \l__siunitx_table_model_tl \q_nil } \exp_after:wN \__siunitx_table_direct_format_aux:w \l__siunitx_table_tmp_tl \q_stop } \cs_new_protected:Npn \__siunitx_table_direct_format_aux:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_stop { \hbox_set:Nn \l__siunitx_table_tmp_box { \ensuremath { \__siunitx_table_cleanup_decimal:w #4 } } \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box { \box_wd:N \l__siunitx_table_tmp_box } { \__siunitx_table_fil: } \hbox_set:Nn \l__siunitx_table_tmp_box { \ensuremath { #1#2#3 } } \hbox_set_to_wd:Nnw \l__siunitx_table_integer_box { \box_wd:N \l__siunitx_table_tmp_box } \c_math_toggle_token \tl_map_inline:Nn \l_siunitx_number_input_decimal_tl { \char_set_active_eq:NN ##1 \__siunitx_table_direct_format_switch: \char_set_mathcode:nn { `##1 } { "8000 } } \__siunitx_table_fill: } \cs_new_protected:Npn \__siunitx_table_direct_format_switch: { \c_math_toggle_token \hbox_set_end: \hbox_set_to_wd:Nnw \l__siunitx_table_decimal_box { \box_wd:N \l__siunitx_table_decimal_box } \c_math_toggle_token \mathord { \l_siunitx_number_output_decimal_tl } } \cs_new_protected:Npn \__siunitx_table_direct_format_end: { \c_math_toggle_token \__siunitx_table_fil: \hbox_set_end: \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n } { \box_use_drop:N \l__siunitx_table_integer_box \box_use_drop:N \l__siunitx_table_decimal_box } } \cs_new_protected:Npn \__siunitx_table_direct_none: { \c_math_toggle_token } \cs_new_protected:Npn \__siunitx_table_direct_none_end: { \c_math_toggle_token } \box_new:N \l__siunitx_table_before_box \box_new:N \l__siunitx_table_after_box \dim_new:N \l__siunitx_table_before_dim \dim_new:N \l__siunitx_table_carry_dim \keys_define:nn { siunitx } { table-align-comparator .bool_set:N = \l__siunitx_table_align_comparator_bool , table-align-exponent .bool_set:N = \l__siunitx_table_align_exponent_bool , table-align-text-after .bool_set:N = \l__siunitx_table_align_after_bool , table-align-text-before .bool_set:N = \l__siunitx_table_align_before_bool , table-align-uncertainty .bool_set:N = \l__siunitx_table_align_uncertainty_bool } \cs_new_protected:Npn \__siunitx_table_print:nnn #1#2#3 { \use:c { __siunitx_table_print_ \l__siunitx_table_align_mode_tl :nnn } {#1} {#2} {#3} } \cs_generate_variant:Nn \__siunitx_table_print:nnn { VVV } \cs_new_protected:Npn \__siunitx_table_print_marker:nnn #1#2#3 { \hbox_set:Nn \l__siunitx_table_before_box {#1} \dim_compare:nNnT { \box_wd:N \l__siunitx_table_before_box } = { 0pt } { \box_clear:N \l__siunitx_table_before_box #1 } \hbox_set:Nn \l__siunitx_table_after_box {#3} \dim_compare:nNnTF { \box_wd:N \l__siunitx_table_after_box } > { \box_wd:N \l__siunitx_table_before_box } { \hbox_set_to_wd:Nnn \l__siunitx_table_before_box { \box_wd:N \l__siunitx_table_after_box } { \__siunitx_table_fil: \hbox_unpack:N \l__siunitx_table_before_box } } { \hbox_set_to_wd:Nnn \l__siunitx_table_after_box { \box_wd:N \l__siunitx_table_before_box } { \hbox_unpack:N \l__siunitx_table_after_box \__siunitx_table_fil: } } \siunitx_number_parse:nN {#2} \l__siunitx_table_tmp_tl \siunitx_number_process:NN \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl \tl_set:Nx \l__siunitx_table_tmp_tl { \siunitx_number_output:NN \l__siunitx_table_tmp_tl \q_nil } \__siunitx_table_color_check:N \l__siunitx_table_tmp_tl \exp_after:wN \__siunitx_table_print_marker:w \l__siunitx_table_tmp_tl \q_stop } \cs_new_protected:Npn \__siunitx_table_print_marker:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_stop { \hbox_set:Nn \l__siunitx_table_integer_box { \siunitx_print_number:n { #1#2#3 } } \hbox_set:Nn \l__siunitx_table_decimal_box { \siunitx_print_number:x { \__siunitx_table_print_marker_aux:w #4 } } \__siunitx_table_center_marker: \use:c { __siunitx_table_align_ \l__siunitx_table_align_text_tl :n } { \box_use_drop:N \l__siunitx_table_before_box \box_use_drop:N \l__siunitx_table_integer_box \box_use_drop:N \l__siunitx_table_decimal_box \box_use_drop:N \l__siunitx_table_after_box } } \cs_new:Npn \__siunitx_table_print_marker_aux:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil { \exp_not:n {#1#2#3#4#5} \tl_if_blank:nT {#1#2#3#4#5} { { } } \exp_not:n {#6#7} } \cs_new_protected:Npn \__siunitx_table_print_format:nnn #1#2#3 { \hbox_set:Nn \l__siunitx_table_tmp_box { \l__siunitx_table_before_model_tl } \hbox_set:Nn \l__siunitx_table_before_box {#1} \dim_compare:nNnT { \box_wd:N \l__siunitx_table_before_box } = { 0pt } { \box_clear:N \l__siunitx_table_before_box #1 } \dim_set:Nn \l__siunitx_table_before_dim { \box_wd:N \l__siunitx_table_tmp_box } \siunitx_number_parse:nN {#2} \l__siunitx_table_tmp_tl \group_begin: \bool_if:NT \l__siunitx_table_auto_round_bool { \exp_args:Nx \keys_set:nn { siunitx } { round-mode = places , round-pad = true , round-precision = \exp_after:wN \__siunitx_table_print_format:nnnnnn \l__siunitx_table_format_tl } } \siunitx_number_process:NN \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl \exp_args:NNNV \group_end: \tl_set:Nn \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl \tl_set:Nx \l__siunitx_table_tmp_tl { \siunitx_number_output:NN \l__siunitx_table_model_tl \q_nil \exp_not:N \q_mark \siunitx_number_output:NN \l__siunitx_table_tmp_tl \q_nil } \exp_after:wN \__siunitx_table_print_format_auxi:w \l__siunitx_table_tmp_tl \q_stop \hbox_set:Nn \l__siunitx_table_tmp_box { \l__siunitx_table_after_model_tl } \hbox_set_to_wd:Nnn \l__siunitx_table_after_box { \box_wd:N \l__siunitx_table_tmp_box + \l__siunitx_table_carry_dim } { \bool_if:NT \l__siunitx_table_align_after_bool { \skip_horizontal:n { \l__siunitx_table_carry_dim } } #3 \__siunitx_table_fil: } \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n } { \box_use_drop:N \l__siunitx_table_before_box \box_use_drop:N \l__siunitx_table_integer_box \box_use_drop:N \l__siunitx_table_decimal_box \box_use_drop:N \l__siunitx_table_after_box } } \cs_new:Npn \__siunitx_table_print_format:nnnnnn #1#2#3#4#5#6#7 { 0 #4 } \cs_new_protected:Npn \__siunitx_table_print_format_auxi:w #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop { \__siunitx_table_color_check:w #3 \q_nil \q_stop \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1} \bool_if:NTF \l__siunitx_table_align_before_bool { \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box { \box_wd:N \l__siunitx_table_tmp_box } { \__siunitx_table_fil: \tl_if_blank:nF {#3} { \siunitx_print_number:n {#3} } } } { \__siunitx_table_print_format_box:Nn \l__siunitx_table_integer_box {#3} \dim_add:Nn \l__siunitx_table_before_dim { \box_wd:N \l__siunitx_table_tmp_box - \box_wd:N \l__siunitx_table_integer_box } } \__siunitx_table_print_format_auxii:w #2 \q_mark #4 \q_stop } \cs_new_protected:Npn \__siunitx_table_print_format_auxii:w #1 \q_nil #2 \q_nil #3 \q_mark #4 \q_nil #5 \q_nil #6 \q_stop { \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1#2} \bool_lazy_and:nnTF { \l__siunitx_table_align_comparator_bool } { \dim_compare_p:nNn { \box_wd:N \l__siunitx_table_integer_box } > { 0pt } } { \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box { \box_wd:N \l__siunitx_table_integer_box + \box_wd:N \l__siunitx_table_tmp_box } { \hbox_unpack:N \l__siunitx_table_integer_box \__siunitx_table_fil: \siunitx_print_number:n {#4#5} } } { \bool_if:NTF \l__siunitx_table_align_before_bool { \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box { \box_wd:N \l__siunitx_table_integer_box + \box_wd:N \l__siunitx_table_tmp_box } { \__siunitx_table_fil: \hbox_unpack:N \l__siunitx_table_integer_box \siunitx_print_number:n {#4#5} } } { \dim_set:Nn \l__siunitx_table_tmp_dim { \box_wd:N \l__siunitx_table_integer_box } \hbox_set:Nn \l__siunitx_table_integer_box { \hbox_unpack:N \l__siunitx_table_integer_box \siunitx_print_number:n {#4#5} } \dim_add:Nn \l__siunitx_table_before_dim { + \box_wd:N \l__siunitx_table_tmp_box + \l__siunitx_table_tmp_dim - \box_wd:N \l__siunitx_table_integer_box } } } \hbox_set_to_wd:Nnn \l__siunitx_table_before_box \l__siunitx_table_before_dim { \__siunitx_table_fil: \hbox_unpack:N \l__siunitx_table_before_box } \__siunitx_table_print_format_auxiii:w #3 \q_mark #6 \q_stop } \cs_new_protected:Npn \__siunitx_table_print_format_auxiii:w #1 \q_nil #2 \q_nil #3 \q_mark #4 \q_nil #5 \q_nil #6 \q_stop { \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1#2} \__siunitx_table_print_format_box:Nn \l__siunitx_table_decimal_box {#4#5} \dim_set:Nn \l__siunitx_table_carry_dim { \box_wd:N \l__siunitx_table_tmp_box - \box_wd:N \l__siunitx_table_decimal_box } \__siunitx_table_print_format_auxiv:w #3 \q_mark #6 \q_stop } \cs_new_protected:Npn \__siunitx_table_print_format_auxiv:w #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop { \tl_if_blank:nTF {#1} { \__siunitx_table_print_format_auxv:w } { \__siunitx_table_print_format_auxvi:w } #1#2 \q_mark #3#4 \q_stop } \cs_new_protected:Npn \__siunitx_table_print_format_auxv:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_mark #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop { \__siunitx_table_print_format_auxvii:w #4 \q_mark #8 \q_stop } \cs_new_protected:Npn \__siunitx_table_print_format_auxvi:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_mark #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop { \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #1#2#3 } \dim_set:Nn \l__siunitx_table_tmp_dim { \box_wd:N \l__siunitx_table_tmp_box } \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #5#6#7 } \__siunitx_table_print_format_after:N \l__siunitx_table_align_uncertainty_bool \__siunitx_table_print_format_auxvii:w #4 \q_mark #8 \q_stop } \cs_new_protected:Npn \__siunitx_table_print_format_auxvii:w #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop { \tl_if_blank:nF {#2} { \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #1#2 } \dim_set:Nn \l__siunitx_table_tmp_dim { \box_wd:N \l__siunitx_table_tmp_box } \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #3#4 } \__siunitx_table_print_format_after:N \l__siunitx_table_align_exponent_bool } } \cs_new_protected:Npn \__siunitx_table_print_format_box:Nn #1#2 { \hbox_set:Nn #1 { \tl_if_blank:nF {#2} { \siunitx_print_number:n {#2} } } } \cs_new_protected:Npn \__siunitx_table_print_format_after:N #1 { \bool_if:NTF #1 { \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box { \box_wd:N \l__siunitx_table_decimal_box + \l__siunitx_table_carry_dim + \box_wd:N \l__siunitx_table_tmp_box } { \hbox_unpack:N \l__siunitx_table_decimal_box \__siunitx_table_fil: \hbox_unpack:N \l__siunitx_table_tmp_box } \dim_set:Nn \l__siunitx_table_carry_dim { \l__siunitx_table_tmp_dim - \box_wd:N \l__siunitx_table_tmp_box } } { \hbox_set:Nn \l__siunitx_table_decimal_box { \hbox_unpack:N \l__siunitx_table_decimal_box \hbox_unpack:N \l__siunitx_table_tmp_box } \dim_add:Nn \l__siunitx_table_carry_dim { \l__siunitx_table_tmp_dim - \box_wd:N \l__siunitx_table_tmp_box } } } \cs_new_protected:Npn \__siunitx_table_print_none:nnn #1#2#3 { \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n } { #1 \siunitx_number_format:nN {#2} \l__siunitx_table_tmp_tl \siunitx_print_number:V \l__siunitx_table_tmp_tl #3 } } \keys_set:nn { siunitx } { table-align-comparator = true , table-align-exponent = true , table-align-text-after = true , table-align-text-before = true , table-align-uncertainty = true , table-alignment = center , table-auto-round = false , table-column-width = 0pt , table-fixed-width = false , table-format = 2.2 , table-number-alignment = center , table-text-alignment = center , table-alignment-mode = marker } \cs_generate_variant:Nn \tl_replace_all:Nnn { NnV } \fp_new:N \l__siunitx_unit_tmp_fp \int_new:N \l__siunitx_unit_tmp_int \tl_new:N \l__siunitx_unit_tmp_tl \tl_const:Nx \c__siunitx_unit_math_subscript_tl { \char_generate:nn { `\_ } { 8 } } \bool_new:N \l__siunitx_unit_parsing_bool \bool_new:N \l__siunitx_unit_test_bool \prg_new_protected_conditional:Npnn \__siunitx_unit_if_symbolic:n #1 { TF } { \group_begin: \bool_set_true:N \l__siunitx_unit_test_bool \protected@edef \l__siunitx_unit_tmp_tl {#1} \exp_args:NNV \group_end: \tl_if_blank:nTF \l__siunitx_unit_tmp_tl { \prg_return_true: } { \prg_return_false: } } \seq_new:N \l_siunitx_unit_symbolic_seq \seq_new:N \l_siunitx_unit_seq \cs_new_protected:Npn \__siunitx_unit_set_symbolic:Nnn #1 { \__siunitx_unit_set_symbolic:Nnnn #1 { } } \cs_new_protected:Npn \__siunitx_unit_set_symbolic:Npnn #1#2# { \__siunitx_unit_set_symbolic:Nnnn #1 {#2} } \cs_new_protected:Npn \__siunitx_unit_set_symbolic:Nnnn #1#2#3#4 { \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1} \cs_set:cpn { __siunitx_unit_ \token_to_str:N #1 :w } #2 { \bool_if:NF \l__siunitx_unit_test_bool { \bool_if:NTF \l__siunitx_unit_parsing_bool {#4} {#3} } } } \cs_new_protected:Npn \siunitx_declare_power:NNn #1#2#3 { \__siunitx_unit_set_symbolic:Nnn #1 { \__siunitx_unit_literal_power:nn {#3} } { \__siunitx_unit_parse_power:nnN {#1} {#3} \c_true_bool } \__siunitx_unit_set_symbolic:Nnn #2 { ^ {#3} } { \__siunitx_unit_parse_power:nnN {#2} {#3} \c_false_bool } } \cs_new_protected:Npn \siunitx_declare_prefix:Nn #1#2 { \__siunitx_unit_set_symbolic:Nnn #1 {#2} { \__siunitx_unit_parse_prefix:Nn #1 {#2} } } \cs_new_protected:Npn \siunitx_declare_prefix:Nnn #1#2#3 { \siunitx_declare_prefix:Nn #1 {#3} \prop_put:Nnn \l__siunitx_unit_prefixes_forward_prop {#3} {#2} \prop_put:Nnn \l__siunitx_unit_prefixes_reverse_prop {#2} {#3} } \cs_generate_variant:Nn \siunitx_declare_prefix:Nnn { Nnx } \prop_new:N \l__siunitx_unit_prefixes_forward_prop \prop_new:N \l__siunitx_unit_prefixes_reverse_prop \cs_new_protected:Npn \siunitx_declare_qualifier:Nn #1#2 { \__siunitx_unit_set_symbolic:Nnn #1 { ~ ( #2 ) } { \__siunitx_unit_parse_qualifier:nn {#1} {#2} } } \cs_new_protected:Npn \siunitx_declare_unit:Nn #1#2 { \siunitx_declare_unit:Nnn #1 {#2} { } } \cs_generate_variant:Nn \siunitx_declare_unit:Nn { Nx } \cs_new_protected:Npn \siunitx_declare_unit:Nnn #1#2#3 { \seq_put_right:Nn \l_siunitx_unit_seq {#1} \__siunitx_unit_set_symbolic:Nnn #1 {#2} { \__siunitx_unit_if_symbolic:nTF {#2} {#2} { \__siunitx_unit_parse_unit:Nn #1 {#2} } } \tl_clear_new:c { l__siunitx_unit_options_ \token_to_str:N #1 _tl } \tl_if_empty:nF {#3} { \tl_set:cn { l__siunitx_unit_options_ \token_to_str:N #1 _tl } {#3} } } \cs_generate_variant:Nn \siunitx_declare_unit:Nnn { Nx } \bool_new:N \l__siunitx_unit_options_bool \cs_new_protected:Npn \siunitx_unit_options_apply:n #1 { \bool_if:NF \l__siunitx_unit_options_bool { \tl_if_single_token:nT {#1} { \tl_if_exist:cT { l__siunitx_unit_options_ \token_to_str:N #1 _tl } { \keys_set:nv { siunitx } { l__siunitx_unit_options_ \token_to_str:N #1 _tl } } } } \bool_set_true:N \l__siunitx_unit_options_bool } \__siunitx_unit_set_symbolic:Nnn \per { / } { \__siunitx_unit_parse_per: } \__siunitx_unit_set_symbolic:Npnn \cancel { } { \__siunitx_unit_parse_special:n { \cancel } } \__siunitx_unit_set_symbolic:Npnn \highlight #1 { \__siunitx_unit_literal_special:nN { \textcolor {#1} } } { \__siunitx_unit_parse_special:n { \textcolor {#1} } } \__siunitx_unit_set_symbolic:Npnn \of #1 { \ ( #1 ) } { \__siunitx_unit_parse_qualifier:nn { \of {#1} } {#1} } \__siunitx_unit_set_symbolic:Npnn \raiseto #1 { \__siunitx_unit_literal_power:nn {#1} } { \__siunitx_unit_parse_power:nnN { \raiseto {#1} } {#1} \c_true_bool } \__siunitx_unit_set_symbolic:Npnn \tothe #1 { ^ {#1} } { \__siunitx_unit_parse_power:nnN { \tothe {#1} } {#1} \c_false_bool } \keys_define:nn { siunitx } { extract-mass-in-kilograms .bool_set:N = \l__siunitx_unit_mass_kilogram_bool , inter-unit-product .tl_set:N = \l__siunitx_unit_product_tl , unit-font-command .tl_set:N = \l_siunitx_unit_font_tl } \tl_new:N \l__siunitx_unit_formatted_tl \cs_new_protected:Npn \siunitx_unit_format:nN #1#2 { \bool_set_false:N \l__siunitx_unit_prefix_exp_bool \fp_zero:N \l__siunitx_unit_combine_exp_fp \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp } \__siunitx_unit_format:nNN {#1} #2 \l__siunitx_unit_tmp_fp } \cs_new_protected:Npn \siunitx_unit_format_extract_prefixes:nNN #1#2#3 { \bool_set_true:N \l__siunitx_unit_prefix_exp_bool \fp_zero:N \l__siunitx_unit_combine_exp_fp \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp } \__siunitx_unit_format:nNN {#1} #2 #3 } \cs_new_protected:Npn \siunitx_unit_format_combine_exponent:nnN #1#2#3 { \bool_set_false:N \l__siunitx_unit_prefix_exp_bool \fp_set:Nn \l__siunitx_unit_combine_exp_fp {#2} \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp } \__siunitx_unit_format:nNN {#1} #3 \l__siunitx_unit_tmp_fp } \cs_new_protected:Npn \siunitx_unit_format_multiply:nnN #1#2#3 { \bool_set_false:N \l__siunitx_unit_prefix_exp_bool \fp_zero:N \l__siunitx_unit_combine_exp_fp \fp_set:Nn \l__siunitx_unit_multiple_fp {#2} \__siunitx_unit_format:nNN {#1} #3 \l__siunitx_unit_tmp_fp } \cs_new_protected:Npn \siunitx_unit_format_multiply_extract_prefixes:nnNN #1#2#3#4 { \bool_set_true:N \l__siunitx_unit_prefix_exp_bool \fp_zero:N \l__siunitx_unit_combine_exp_fp \fp_set:Nn \l__siunitx_unit_multiple_fp {#2} \__siunitx_unit_format:nNN {#1} #3 #4 } \cs_new_protected:Npn \siunitx_unit_format_multiply_combine_exponent:nnnN #1#2#3#4 { \bool_set_false:N \l__siunitx_unit_prefix_exp_bool \fp_set:Nn \l__siunitx_unit_combine_exp_fp {#3} \fp_set:Nn \l__siunitx_unit_multiple_fp {#2} \__siunitx_unit_format:nNN {#1} #4 \l__siunitx_unit_tmp_fp } \cs_new_protected:Npn \__siunitx_unit_format:nNN #1#2#3 { \group_begin: \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq { \cs_set_eq:Nc ##1 { __siunitx_unit_ \token_to_str:N ##1 :w } } \tl_clear:N \l__siunitx_unit_formatted_tl \fp_zero:N \l__siunitx_unit_prefix_fp \bool_if:NTF \l__siunitx_unit_parse_bool { \__siunitx_unit_if_symbolic:nTF {#1} { \__siunitx_unit_parse:n {#1} \prop_if_empty:NF \l__siunitx_unit_parsed_prop { \__siunitx_unit_format_parsed: } } { \bool_if:NTF \l__siunitx_unit_forbid_literal_bool { \msg_error:nnn { siunitx } { unit / literal } {#1} } { \__siunitx_unit_format_literal:n {#1} } } } { \__siunitx_unit_format_literal:n {#1} } \cs_set_protected:Npx \__siunitx_unit_format_aux: { \tl_set:Nn \exp_not:N #2 { \exp_not:V \l__siunitx_unit_formatted_tl } \fp_set:Nn \exp_not:N #3 { \fp_use:N \l__siunitx_unit_prefix_fp } } \exp_after:wN \group_end: \__siunitx_unit_format_aux: } \cs_new_protected:Npn \__siunitx_unit_format_aux: { } \cs_new:Npn \__siunitx_unit_literal_power:nn #1#2 { #2 ^ {#1} } \cs_new:Npn \__siunitx_unit_literal_special:nN #1#2 { #1 {#2} } \group_begin: \char_set_catcode_active:n { `\~ } \cs_new_protected:Npx \__siunitx_unit_format_literal:n #1 { \group_begin: \exp_not:n { \bool_set_false:N \l__siunitx_unit_parsing_bool } \tl_set:Nn \exp_not:N \l__siunitx_unit_tmp_tl {#1} \tl_replace_all:Nnn \exp_not:N \l__siunitx_unit_tmp_tl { \token_to_str:N ^ } { ^ } \tl_replace_all:Nnn \exp_not:N \l__siunitx_unit_tmp_tl { \token_to_str:N _ } { \c__siunitx_unit_math_subscript_tl } \char_set_active_eq:NN ^ \exp_not:N \__siunitx_unit_format_literal_superscript: \char_set_active_eq:NN _ \exp_not:N \__siunitx_unit_format_literal_subscript: \char_set_active_eq:NN \exp_not:N ~ \exp_not:N \__siunitx_unit_format_literal_tilde: \exp_not:n { \protected@edef \l__siunitx_unit_tmp_tl { \l__siunitx_unit_tmp_tl } \tl_clear:N \l__siunitx_unit_formatted_tl \tl_if_empty:NF \l__siunitx_unit_tmp_tl { \exp_after:wN \__siunitx_unit_format_literal_auxi:w \l__siunitx_unit_tmp_tl . \q_recursion_tail . \q_recursion_stop } \exp_args:NNNV \group_end: \tl_set:Nn \l__siunitx_unit_formatted_tl \l__siunitx_unit_formatted_tl } } \group_end: \cs_new:Npx \__siunitx_unit_format_literal_subscript: { \c__siunitx_unit_math_subscript_tl } \cs_new:Npn \__siunitx_unit_format_literal_superscript: { ^ } \cs_new:Npn \__siunitx_unit_format_literal_tilde: { . } \cs_new_protected:Npn \__siunitx_unit_format_literal_auxi:w #1 . { \quark_if_recursion_tail_stop:n {#1} \__siunitx_unit_format_literal_auxii:n {#1} \tl_set_eq:NN \l__siunitx_unit_separator_tl \l__siunitx_unit_product_tl \__siunitx_unit_format_literal_auxi:w } \cs_set_protected:Npn \__siunitx_unit_format_literal_auxii:n #1 { \__siunitx_unit_format_literal_auxiii:w #1 / \q_recursion_tail / \q_recursion_stop } \cs_new_protected:Npn \__siunitx_unit_format_literal_auxiii:w #1 / { \quark_if_recursion_tail_stop:n {#1} \__siunitx_unit_format_literal_auxiv:n {#1} \tl_set:Nn \l__siunitx_unit_separator_tl { / } \__siunitx_unit_format_literal_auxiii:w } \cs_new_protected:Npn \__siunitx_unit_format_literal_auxiv:n #1 { \__siunitx_unit_format_literal_auxv:nw { } #1 \q_recursion_tail \q_recursion_stop } \cs_new_protected:Npn \__siunitx_unit_format_literal_auxv:nw #1#2 \q_recursion_stop { \tl_if_head_is_N_type:nTF {#2} { \__siunitx_unit_format_literal_auxvi:nN } { \tl_if_head_is_group:nTF {#2} { \__siunitx_unit_format_literal_auxix:nn } { \__siunitx_unit_format_literal_auxx:nw } } {#1} #2 \q_recursion_stop } \cs_new_protected:Npx \__siunitx_unit_format_literal_auxvi:nN #1#2 { \exp_not:N \quark_if_recursion_tail_stop_do:Nn #2 { \exp_not:N \__siunitx_unit_format_literal_add:n {#1} } \exp_not:N \token_if_eq_meaning:NNTF #2 ^ { \exp_not:N \__siunitx_unit_format_literal_super:nn {#1} } { \exp_not:N \token_if_eq_meaning:NNTF #2 \c__siunitx_unit_math_subscript_tl { \exp_not:N \__siunitx_unit_format_literal_sub:nn {#1} } { \exp_not:N \__siunitx_unit_format_literal_auxvii:nN {#1} #2 } } } \cs_new_protected:Npn \__siunitx_unit_format_literal_auxvii:nN #1#2 { \str_if_eq:nnTF {#2} { \protect } { \__siunitx_unit_format_literal_auxviii:nN {#1} } { \__siunitx_unit_format_literal_auxv:nw {#1#2} } } \cs_new_protected:Npn \__siunitx_unit_format_literal_auxviii:nN #1#2 { \__siunitx_unit_format_literal_auxv:nw { #1 \protect #2 } } \cs_new_protected:Npn \__siunitx_unit_format_literal_super:nn #1#2 { \quark_if_recursion_tail_stop:n {#2} \__siunitx_unit_format_literal_add:n {#1} \tl_put_right:Nn \l__siunitx_unit_formatted_tl { ^ {#2} } \__siunitx_unit_format_literal_auxvi:nN { } } \cs_new_protected:Npx \__siunitx_unit_format_literal_sub:nn #1#2 { \exp_not:N \quark_if_recursion_tail_stop:n {#2} \exp_not:N \__siunitx_unit_format_literal_add:n {#1} \tl_put_right:Nx \exp_not:N \l__siunitx_unit_formatted_tl { \c__siunitx_unit_math_subscript_tl { \exp_not:N \exp_not:V \exp_not:N \l_siunitx_unit_font_tl { \exp_not:N \exp_not:n {#2} } } } \exp_not:N \__siunitx_unit_format_literal_auxvi:nN { } } \cs_new_protected:Npn \__siunitx_unit_format_literal_add:n #1 { \tl_put_right:Nx \l__siunitx_unit_formatted_tl { \tl_if_empty:NF \l__siunitx_unit_formatted_tl { \exp_not:V \l__siunitx_unit_separator_tl } \tl_if_empty:nF {#1} { \exp_not:V \l_siunitx_unit_font_tl { \exp_not:n {#1} } } } \tl_clear:N \l__siunitx_unit_separator_tl } \cs_new_protected:Npn \__siunitx_unit_format_literal_auxix:nn #1#2 { \__siunitx_unit_format_literal_auxv:nw { #1 {#2} } } \use:x { \cs_new_protected:Npn \exp_not:N \__siunitx_unit_format_literal_auxx:nw ##1 \c_space_tl } { \__siunitx_unit_format_literal_auxv:nw {#1} } \tl_new:N \l__siunitx_unit_separator_tl \cs_new_protected:Npn \siunitx_unit_pdfstring_context: { \bool_set_false:N \l__siunitx_unit_parsing_bool \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq { \cs_set_eq:Nc ##1 { __siunitx_unit_ \token_to_str:N ##1 :w } } } \keys_define:nn { siunitx } { sticky-per .bool_set:N = \l__siunitx_unit_sticky_per_bool } \prop_new:N \l__siunitx_unit_parsed_prop \bool_new:N \l__siunitx_unit_per_bool \int_new:N \l__siunitx_unit_position_int \cs_new_protected:Npn \__siunitx_unit_parse:n #1 { \prop_clear:N \l__siunitx_unit_parsed_prop \bool_set_true:N \l__siunitx_unit_parsing_bool \bool_set_false:N \l__siunitx_unit_per_bool \bool_set_false:N \l__siunitx_unit_test_bool \int_zero:N \l__siunitx_unit_position_int \siunitx_unit_options_apply:n {#1} #1 \int_step_inline:nn \l__siunitx_unit_position_int { \__siunitx_unit_parse_finalise:n {##1} } \__siunitx_unit_parse_finalise: } \cs_new_protected:Npn \__siunitx_unit_parse_add:nnnn #1#2#3#4 { \tl_set:Nx \l__siunitx_unit_tmp_tl { #1 - #2 } \prop_if_in:NVTF \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl { \msg_error:nnxx { siunitx } { unit / duplicate-part } { \exp_not:n {#1} } { \token_to_str:N #3 } } { \prop_put:NVn \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl {#4} } } \cs_new_protected:Npn \__siunitx_unit_parse_prefix:Nn #1#2 { \int_set:Nn \l__siunitx_unit_tmp_int { \l__siunitx_unit_position_int + 1 } \__siunitx_unit_parse_add:nnnn { prefix } { \int_use:N \l__siunitx_unit_tmp_int } {#1} {#2} } \cs_new_protected:Npn \__siunitx_unit_parse_power:nnN #1#2#3 { \tl_set:Nx \l__siunitx_unit_tmp_tl { unit- \int_use:N \l__siunitx_unit_position_int } \bool_lazy_or:nnTF {#3} { \prop_if_in_p:NV \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl } { \__siunitx_unit_parse_add:nnnn { power } { \int_eval:n { \l__siunitx_unit_position_int \bool_if:NT #3 { + 1 } } } {#1} {#2} } { \msg_error:nnxx { siunitx } { unit / part-before-unit } { power } { \token_to_str:N #1 } } } \cs_new_protected:Npn \__siunitx_unit_parse_qualifier:nn #1#2 { \tl_set:Nx \l__siunitx_unit_tmp_tl { unit- \int_use:N \l__siunitx_unit_position_int } \prop_if_in:NVTF \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl { \__siunitx_unit_parse_add:nnnn { qualifier } { \int_use:N \l__siunitx_unit_position_int } {#1} {#2} } { \msg_error:nnnn { siunitx } { unit / part-before-unit } { qualifier } { \token_to_str:N #1 } } } \cs_new_protected:Npn \__siunitx_unit_parse_special:n #1 { \__siunitx_unit_parse_add:nnnn { special } { \int_eval:n { \l__siunitx_unit_position_int + 1 } } {#1} {#1} } \cs_new_protected:Npn \__siunitx_unit_parse_unit:Nn #1#2 { \int_incr:N \l__siunitx_unit_position_int \tl_if_eq:nnT {#1} { \gram } { \__siunitx_unit_parse_add:nnnn { command } { \int_use:N \l__siunitx_unit_position_int } {#1} {#1} } \__siunitx_unit_parse_add:nnnn { unit } { \int_use:N \l__siunitx_unit_position_int } {#1} {#2} \bool_if:NT \l__siunitx_unit_per_bool { \__siunitx_unit_parse_add:nnnn { per } { \int_use:N \l__siunitx_unit_position_int } { \per } { true } } } \cs_new_protected:Npn \__siunitx_unit_parse_per: { \bool_if:NTF \l__siunitx_unit_sticky_per_bool { \bool_set_true:N \l__siunitx_unit_per_bool \cs_set_protected:Npn \per { \msg_error:nn { siunitx } { unit / duplicate-sticky-per } } } { \__siunitx_unit_parse_add:nnnn { per } { \int_eval:n { \l__siunitx_unit_position_int + 1 } } { \per } { true } } } \cs_new_protected:Npn \__siunitx_unit_parse_finalise:n #1 { \tl_set:Nx \l__siunitx_unit_tmp_tl { per- #1 } \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl { \prop_remove:NV \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl \tl_set:Nx \l__siunitx_unit_tmp_tl { power- #1 } \prop_get:NVNTF \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl \l__siunitx_unit_part_tl { \tl_set:Nx \l__siunitx_unit_part_tl { \fp_eval:n { \l__siunitx_unit_part_tl * -1 } } \fp_compare:nNnTF \l__siunitx_unit_part_tl = 1 { \prop_remove:NV \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl } { \prop_put:NVV \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl \l__siunitx_unit_part_tl } } { \prop_put:NVn \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl { -1 } } } } \cs_new_protected:Npn \__siunitx_unit_parse_finalise: { \clist_map_inline:nn { per , power , prefix } { \tl_set:Nx \l__siunitx_unit_tmp_tl { ##1 - \int_eval:n { \l__siunitx_unit_position_int + 1 } } \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl { \msg_error:nnn { siunitx } { unit / dangling-part } { ##1 } } } } \keys_define:nn { siunitx } { bracket-unit-denominator .bool_set:N = \l__siunitx_unit_denominator_bracket_bool , forbid-literal-units .bool_set:N = \l__siunitx_unit_forbid_literal_bool , fraction-command .tl_set:N = \l_siunitx_unit_fraction_tl , parse-units .bool_set:N = \l__siunitx_unit_parse_bool , per-mode .choice: , per-mode / fraction .code:n = { \bool_set_false:N \l__siunitx_unit_autofrac_bool \bool_set_false:N \l__siunitx_unit_per_symbol_bool \bool_set_true:N \l__siunitx_unit_powers_positive_bool \bool_set_true:N \l__siunitx_unit_two_part_bool } , per-mode / power .code:n = { \bool_set_false:N \l__siunitx_unit_autofrac_bool \bool_set_false:N \l__siunitx_unit_per_symbol_bool \bool_set_false:N \l__siunitx_unit_powers_positive_bool \bool_set_false:N \l__siunitx_unit_two_part_bool } , per-mode / power-positive-first .code:n = { \bool_set_false:N \l__siunitx_unit_autofrac_bool \bool_set_false:N \l__siunitx_unit_per_symbol_bool \bool_set_false:N \l__siunitx_unit_powers_positive_bool \bool_set_true:N \l__siunitx_unit_two_part_bool } , per-mode / repeated-symbol .code:n = { \bool_set_false:N \l__siunitx_unit_autofrac_bool \bool_set_true:N \l__siunitx_unit_per_symbol_bool \bool_set_true:N \l__siunitx_unit_powers_positive_bool \bool_set_false:N \l__siunitx_unit_two_part_bool } , per-mode / symbol .code:n = { \bool_set_false:N \l__siunitx_unit_autofrac_bool \bool_set_true:N \l__siunitx_unit_per_symbol_bool \bool_set_true:N \l__siunitx_unit_powers_positive_bool \bool_set_true:N \l__siunitx_unit_two_part_bool } , per-mode / symbol-or-fraction .code:n = { \bool_set_true:N \l__siunitx_unit_autofrac_bool \bool_set_true:N \l__siunitx_unit_per_symbol_bool \bool_set_true:N \l__siunitx_unit_powers_positive_bool \bool_set_true:N \l__siunitx_unit_two_part_bool } , per-symbol .tl_set:N = \l__siunitx_unit_per_symbol_tl , qualifier-mode .choices:nn = { bracket , combine , phrase , subscript } { \tl_set_eq:NN \l__siunitx_unit_qualifier_mode_tl \l_keys_choice_tl } , qualifier-phrase .tl_set:N = \l__siunitx_unit_qualifier_phrase_tl } \bool_new:N \l__siunitx_unit_bracket_bool \tl_new:N \l__siunitx_unit_bracket_open_tl \tl_new:N \l__siunitx_unit_bracket_close_tl \tl_set:Nn \l__siunitx_unit_bracket_open_tl { ( } \tl_set:Nn \l__siunitx_unit_bracket_close_tl { ) } \bool_new:N \l__siunitx_unit_font_bool \bool_new:N \l__siunitx_unit_autofrac_bool \bool_new:N \l__siunitx_unit_per_symbol_bool \bool_new:N \l__siunitx_unit_powers_positive_bool \bool_new:N \l__siunitx_unit_two_part_bool \bool_new:N \l__siunitx_unit_numerator_bool \tl_new:N \l__siunitx_unit_qualifier_mode_tl \fp_new:N \l__siunitx_unit_combine_exp_fp \bool_new:N \l__siunitx_unit_prefix_exp_bool \fp_new:N \l__siunitx_unit_prefix_fp \fp_new:N \l__siunitx_unit_multiple_fp \tl_new:N \l__siunitx_unit_current_tl \tl_new:N \l__siunitx_unit_part_tl \tl_new:N \l__siunitx_unit_denominator_tl \int_new:N \l__siunitx_unit_total_int \cs_new_protected:Npn \__siunitx_unit_format_parsed: { \int_set_eq:NN \l__siunitx_unit_total_int \l__siunitx_unit_position_int \tl_clear:N \l__siunitx_unit_denominator_tl \tl_clear:N \l__siunitx_unit_formatted_tl \fp_zero:N \l__siunitx_unit_prefix_fp \int_zero:N \l__siunitx_unit_position_int \fp_compare:nNnF \l__siunitx_unit_combine_exp_fp = \c_zero_fp { \__siunitx_unit_format_combine_exp: } \fp_compare:nNnF \l__siunitx_unit_multiple_fp = \c_one_fp { \__siunitx_unit_format_multiply: } \bool_lazy_and:nnT { \l__siunitx_unit_prefix_exp_bool } { \l__siunitx_unit_mass_kilogram_bool } { \__siunitx_unit_format_mass_to_kilogram: } \int_do_while:nNnn \l__siunitx_unit_position_int < \l__siunitx_unit_total_int { \bool_set_false:N \l__siunitx_unit_bracket_bool \tl_clear:N \l__siunitx_unit_current_tl \bool_set_false:N \l__siunitx_unit_font_bool \bool_set_true:N \l__siunitx_unit_numerator_bool \int_incr:N \l__siunitx_unit_position_int \clist_map_inline:nn { prefix , unit , qualifier , power , special } { \__siunitx_unit_format_parsed_aux:n {##1} } \__siunitx_unit_format_output: } \__siunitx_unit_format_finalise: } \cs_new_protected:Npn \__siunitx_unit_format_parsed_aux:n #1 { \tl_set:Nx \l__siunitx_unit_tmp_tl { #1 - \int_use:N \l__siunitx_unit_position_int } \prop_get:NVNT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl \l__siunitx_unit_part_tl { \use:c { __siunitx_unit_format_ #1 : } } } \cs_new_protected:Npn \__siunitx_unit_format_combine_exp: { \prop_get:NnNF \l__siunitx_unit_parsed_prop { power-1 } \l__siunitx_unit_tmp_tl { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } } \fp_set:Nn \l__siunitx_unit_tmp_fp { \l__siunitx_unit_combine_exp_fp / \l__siunitx_unit_tmp_tl } \prop_get:NnNTF \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl { \prop_get:NVNF \l__siunitx_unit_prefixes_forward_prop \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl { \prop_get:NnN \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl \msg_error:nnx { siunitx } { unit / non-numeric-exponent } { \l__siunitx_unit_tmp_tl } \tl_set:Nn \l__siunitx_unit_tmp_tl { 0 } } } { \tl_set:Nn \l__siunitx_unit_tmp_tl { 0 } } \tl_set:Nx \l__siunitx_unit_tmp_tl { \fp_eval:n { \l__siunitx_unit_tmp_fp + \l__siunitx_unit_tmp_tl } } \fp_compare:nNnTF \l__siunitx_unit_tmp_tl = \c_zero_fp { \prop_remove:Nn \l__siunitx_unit_parsed_prop { prefix-1 } } { \prop_get:NVNTF \l__siunitx_unit_prefixes_reverse_prop \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl { \prop_put:NnV \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl } { \msg_error:nnx { siunitx } { unit / non-convertible-exponent } { \l__siunitx_unit_tmp_tl } } } } \cs_new_protected:Npn \__siunitx_unit_format_multiply: { \int_step_inline:nn { \prop_count:N \l__siunitx_unit_parsed_prop } { \prop_get:NnNF \l__siunitx_unit_parsed_prop { power- ##1 } \l__siunitx_unit_tmp_tl { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } } \fp_set:Nn \l__siunitx_unit_tmp_fp { \l__siunitx_unit_tmp_tl * \l__siunitx_unit_multiple_fp } \fp_compare:nNnTF \l__siunitx_unit_tmp_fp = \c_one_fp { \prop_remove:N \l__siunitx_unit_parsed_prop { power- ##1 } } { \prop_put:Nnx \l__siunitx_unit_parsed_prop { power- ##1 } { \fp_use:N \l__siunitx_unit_tmp_fp } } } } \cs_new_protected:Npn \__siunitx_unit_format_mass_to_kilogram: { \int_step_inline:nn \l__siunitx_unit_total_int { \prop_if_in:NnT \l__siunitx_unit_parsed_prop { command- ##1 } { \prop_if_in:NnF \l__siunitx_unit_parsed_prop { prefix- ##1 } { \group_begin: \bool_set_false:N \l__siunitx_unit_parsing_bool \tl_set:Nx \l__siunitx_unit_tmp_tl { \kilo } \exp_args:NNNV \group_end: \tl_set:Nn \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl \prop_put:NnV \l__siunitx_unit_parsed_prop { prefix- ##1 } \l__siunitx_unit_tmp_tl \prop_get:NnNF \l__siunitx_unit_parsed_prop { power- ##1 } \l__siunitx_unit_tmp_tl { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } } \fp_set:Nn \l__siunitx_unit_prefix_fp { \l__siunitx_unit_prefix_fp - 3 * \l__siunitx_unit_tmp_tl } } } } } \cs_new:Npn \__siunitx_unit_format_bracket:N #1 { \bool_if:NTF \l__siunitx_unit_bracket_bool { \exp_not:V \l__siunitx_unit_bracket_open_tl \exp_not:V #1 \exp_not:V \l__siunitx_unit_bracket_close_tl } { \exp_not:V #1 } } \cs_new_protected:Npn \__siunitx_unit_format_power: { \__siunitx_unit_format_font: \exp_after:wN \__siunitx_unit_format_power_aux:wTF \l__siunitx_unit_part_tl - \q_stop { \__siunitx_unit_format_power_negative: } { \__siunitx_unit_format_power_positive: } } \cs_new:Npn \__siunitx_unit_format_power_aux:wTF #1 - #2 \q_stop { \tl_if_empty:nTF {#1} } \cs_new_protected:Npn \__siunitx_unit_format_power_positive: { \__siunitx_unit_format_power_superscript: } \cs_new_protected:Npn \__siunitx_unit_format_power_negative: { \bool_set_false:N \l__siunitx_unit_numerator_bool \bool_if:NTF \l__siunitx_unit_powers_positive_bool { \tl_set:Nx \l__siunitx_unit_part_tl { \exp_after:wN \__siunitx_unit_format_power_negative_aux:w \l__siunitx_unit_part_tl \q_stop } \str_if_eq:VnF \l__siunitx_unit_part_tl { 1 } { \__siunitx_unit_format_power_superscript: } } { \__siunitx_unit_format_power_superscript: } } \cs_new:Npn \__siunitx_unit_format_power_negative_aux:w - #1 \q_stop { \exp_not:n {#1} } \cs_new_protected:Npn \__siunitx_unit_format_power_superscript: { \exp_after:wN \__siunitx_unit_format_power_superscipt:w \l__siunitx_unit_part_tl . . \q_stop } \cs_new_protected:Npn \__siunitx_unit_format_power_superscipt:w #1 . #2 . #3 \q_stop { \tl_if_blank:nTF {#2} { \tl_set:Nx \l__siunitx_unit_current_tl { \__siunitx_unit_format_bracket:N \l__siunitx_unit_current_tl ^ { \exp_not:n {#1} } } } { \tl_set:Nx \l__siunitx_unit_tmp_tl { { } \tl_if_head_eq_charcode:nNTF {#1} - { { - } { \exp_not:o { \use_none:n #1 } } } { { } { \exp_not:n {#1} } } {#2} { } { } { 0 } } \tl_set:Nx \l__siunitx_unit_current_tl { \__siunitx_unit_format_bracket:N \l__siunitx_unit_current_tl ^ { \siunitx_number_output:N \l__siunitx_unit_tmp_tl } } } \bool_set_false:N \l__siunitx_unit_bracket_bool } \cs_new_protected:Npn \__siunitx_unit_format_prefix: { \bool_if:NTF \l__siunitx_unit_prefix_exp_bool { \__siunitx_unit_format_prefix_exp: } { \__siunitx_unit_format_prefix_symbol: } } \cs_new_protected:Npn \__siunitx_unit_format_prefix_exp: { \prop_get:NVNTF \l__siunitx_unit_prefixes_forward_prop \l__siunitx_unit_part_tl \l__siunitx_unit_part_tl { \bool_if:NT \l__siunitx_unit_mass_kilogram_bool { \tl_set:Nx \l__siunitx_unit_tmp_tl { command- \int_use:N \l__siunitx_unit_position_int } \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl { \__siunitx_unit_format_prefix_gram: } } \tl_set:Nx \l__siunitx_unit_tmp_tl { power- \int_use:N \l__siunitx_unit_position_int } \prop_get:NVNF \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } } \fp_add:Nn \l__siunitx_unit_prefix_fp { \l__siunitx_unit_tmp_tl * \l__siunitx_unit_part_tl } } { \__siunitx_unit_format_prefix_symbol: } } \cs_new_protected:Npn \__siunitx_unit_format_prefix_gram: { \tl_set:Nx \l__siunitx_unit_part_tl { \int_eval:n { \l__siunitx_unit_part_tl - 3 } } \group_begin: \bool_set_false:N \l__siunitx_unit_parsing_bool \tl_set:Nx \l__siunitx_unit_current_tl { \kilo } \exp_args:NNNV \group_end: \tl_set:Nn \l__siunitx_unit_current_tl \l__siunitx_unit_current_tl } \cs_new_protected:Npn \__siunitx_unit_format_prefix_symbol: { \tl_set_eq:NN \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl } \cs_new_protected:Npn \__siunitx_unit_format_qualifier: { \use:c { __siunitx_unit_format_qualifier_ \l__siunitx_unit_qualifier_mode_tl : } \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl } \cs_new_protected:Npn \__siunitx_unit_format_qualifier_bracket: { \__siunitx_unit_format_font: \tl_set:Nx \l__siunitx_unit_part_tl { \exp_not:V \l__siunitx_unit_bracket_open_tl \exp_not:V \l_siunitx_unit_font_tl { \exp_not:V \l__siunitx_unit_part_tl } \exp_not:V \l__siunitx_unit_bracket_close_tl } } \cs_new_protected:Npn \__siunitx_unit_format_qualifier_combine: { } \cs_new_protected:Npn \__siunitx_unit_format_qualifier_phrase: { \__siunitx_unit_format_font: \tl_set:Nx \l__siunitx_unit_part_tl { \exp_not:V \l__siunitx_unit_qualifier_phrase_tl \exp_not:V \l_siunitx_unit_font_tl { \exp_not:V \l__siunitx_unit_part_tl } } } \cs_new_protected:Npn \__siunitx_unit_format_qualifier_subscript: { \__siunitx_unit_format_font: \tl_set:Nx \l__siunitx_unit_part_tl { \c__siunitx_unit_math_subscript_tl { \exp_not:V \l_siunitx_unit_font_tl { \exp_not:V \l__siunitx_unit_part_tl } } } } \cs_new_protected:Npn \__siunitx_unit_format_special: { \tl_set:Nx \l__siunitx_unit_current_tl { \exp_not:V \l__siunitx_unit_part_tl { \bool_if:NTF \l__siunitx_unit_font_bool { \use:n } { \exp_not:V \l_siunitx_unit_font_tl } { \exp_not:V \l__siunitx_unit_current_tl } } } \bool_set_true:N \l__siunitx_unit_font_bool } \cs_new_protected:Npn \__siunitx_unit_format_unit: { \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl } \cs_new_protected:Npn \__siunitx_unit_format_output: { \__siunitx_unit_format_font: \bool_set_false:N \l__siunitx_unit_bracket_bool \use:c { __siunitx_unit_format_output_ \bool_if:NTF \l__siunitx_unit_numerator_bool { aux: } { denominator: } } } \cs_new_protected:Npn \__siunitx_unit_format_output_aux: { \__siunitx_unit_format_output_aux:nV { formatted } \l__siunitx_unit_product_tl } \cs_new_protected:Npn \__siunitx_unit_format_output_denominator: { \bool_if:NTF \l__siunitx_unit_two_part_bool { \bool_lazy_and:nnT { \l__siunitx_unit_denominator_bracket_bool } { ! \tl_if_empty_p:N \l__siunitx_unit_denominator_tl } { \bool_set_true:N \l__siunitx_unit_bracket_bool } \__siunitx_unit_format_output_aux:nV { denominator } \l__siunitx_unit_product_tl } { \bool_lazy_and:nnT { \l__siunitx_unit_per_symbol_bool } { \tl_if_empty_p:N \l__siunitx_unit_formatted_tl } { \tl_set:Nn \l__siunitx_unit_formatted_tl { 1 } } \__siunitx_unit_format_output_aux:nv { formatted } { l__siunitx_unit_ \bool_if:NTF \l__siunitx_unit_per_symbol_bool { per_symbol } { product } _tl } } } \cs_new_protected:Npn \__siunitx_unit_format_output_aux:nn #1#2 { \tl_set:cx { l__siunitx_unit_ #1 _tl } { \exp_not:v { l__siunitx_unit_ #1 _tl } \tl_if_empty:cF { l__siunitx_unit_ #1 _tl } { \exp_not:n {#2} } \exp_not:V \l__siunitx_unit_current_tl } } \cs_generate_variant:Nn \__siunitx_unit_format_output_aux:nn { nV , nv } \cs_new_protected:Npn \__siunitx_unit_format_font: { \bool_if:NF \l__siunitx_unit_font_bool { \tl_set:Nx \l__siunitx_unit_current_tl { \exp_not:V \l_siunitx_unit_font_tl { \exp_not:V \l__siunitx_unit_current_tl } } \bool_set_true:N \l__siunitx_unit_font_bool } } \cs_new_protected:Npn \__siunitx_unit_format_finalise: { \tl_if_empty:NF \l__siunitx_unit_denominator_tl { \bool_if:NTF \l__siunitx_unit_powers_positive_bool { \__siunitx_unit_format_finalise_fractional: } { \__siunitx_unit_format_finalise_power: } } } \cs_new_protected:Npn \__siunitx_unit_format_finalise_fractional: { \tl_if_empty:NT \l__siunitx_unit_formatted_tl { \tl_set:Nn \l__siunitx_unit_formatted_tl { 1 } } \bool_if:NTF \l__siunitx_unit_autofrac_bool { \__siunitx_unit_format_finalise_autofrac: } { \bool_if:NTF \l__siunitx_unit_per_symbol_bool { \__siunitx_unit_format_finalise_symbol: } { \__siunitx_unit_format_finalise_fraction: } } } \cs_new_protected:Npn \__siunitx_unit_format_finalise_autofrac: { \group_begin: \__siunitx_unit_format_finalise_fraction: \exp_args:NNNV \group_end: \tl_set:Nn \l__siunitx_unit_tmp_tl \l__siunitx_unit_formatted_tl \__siunitx_unit_format_finalise_symbol: \tl_set:Nx \l__siunitx_unit_formatted_tl { \mathchoice { \exp_not:V \l__siunitx_unit_tmp_tl } { \exp_not:V \l__siunitx_unit_formatted_tl } { \exp_not:V \l__siunitx_unit_formatted_tl } { \exp_not:V \l__siunitx_unit_formatted_tl } } } \cs_new_protected:Npn \__siunitx_unit_format_finalise_fraction: { \tl_set:Nx \l__siunitx_unit_formatted_tl { \exp_not:V \l_siunitx_unit_fraction_tl { \exp_not:V \l__siunitx_unit_formatted_tl } { \exp_not:V \l__siunitx_unit_denominator_tl } } } \cs_new_protected:Npn \__siunitx_unit_format_finalise_symbol: { \tl_set:Nx \l__siunitx_unit_formatted_tl { \exp_not:V \l__siunitx_unit_formatted_tl \exp_not:V \l__siunitx_unit_per_symbol_tl \__siunitx_unit_format_bracket:N \l__siunitx_unit_denominator_tl } } \cs_new_protected:Npn \__siunitx_unit_format_finalise_power: { \tl_if_empty:NTF \l__siunitx_unit_formatted_tl { \tl_set_eq:NN \l__siunitx_unit_formatted_tl \l__siunitx_unit_denominator_tl } { \tl_set:Nx \l__siunitx_unit_formatted_tl { \exp_not:V \l__siunitx_unit_formatted_tl \exp_not:V \l__siunitx_unit_product_tl \exp_not:V \l__siunitx_unit_denominator_tl } } } \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { \cs_new:Npn \__siunitx_unit_non_latin:n #1 { \char_generate:nn {#1} { \char_value_catcode:n {#1} } } } { \cs_new:Npn \__siunitx_unit_non_latin:n #1 { \exp_last_unbraced:Nf \__siunitx_unit_non_latin:nnnn { \char_to_utfviii_bytes:n {#1} } } \cs_new:Npn \__siunitx_unit_non_latin:nnnn #1#2#3#4 { \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \char_generate:nn {#1} { 13 } \char_generate:nn {#2} { 12 } } } \siunitx_declare_unit:Nn \kilogram { \kilo \gram } \siunitx_declare_unit:Nn \metre { m } \siunitx_declare_unit:Nn \meter { \metre } \siunitx_declare_unit:Nn \mole { mol } \siunitx_declare_unit:Nn \second { s } \siunitx_declare_unit:Nn \ampere { A } \siunitx_declare_unit:Nn \kelvin { K } \siunitx_declare_unit:Nn \candela { cd } \siunitx_declare_unit:Nn \gram { g } \siunitx_declare_prefix:Nnn \yocto { -24 } { y } \siunitx_declare_prefix:Nnn \zepto { -21 } { z } \siunitx_declare_prefix:Nnn \atto { -18 } { a } \siunitx_declare_prefix:Nnn \femto { -15 } { f } \siunitx_declare_prefix:Nnn \pico { -12 } { p } \siunitx_declare_prefix:Nnn \nano { -9 } { n } \siunitx_declare_prefix:Nnx \micro { -6 } { \__siunitx_unit_non_latin:n { "03BC } } \siunitx_declare_prefix:Nnn \milli { -3 } { m } \siunitx_declare_prefix:Nnn \centi { -2 } { c } \siunitx_declare_prefix:Nnn \deci { -1 } { d } \siunitx_declare_prefix:Nnn \deca { 1 } { da } \siunitx_declare_prefix:Nnn \deka { 1 } { da } \siunitx_declare_prefix:Nnn \hecto { 2 } { h } \siunitx_declare_prefix:Nnn \kilo { 3 } { k } \siunitx_declare_prefix:Nnn \mega { 6 } { M } \siunitx_declare_prefix:Nnn \giga { 9 } { G } \siunitx_declare_prefix:Nnn \tera { 12 } { T } \siunitx_declare_prefix:Nnn \peta { 15 } { P } \siunitx_declare_prefix:Nnn \exa { 18 } { E } \siunitx_declare_prefix:Nnn \zetta { 21 } { Z } \siunitx_declare_prefix:Nnn \yotta { 24 } { Y } \siunitx_declare_unit:Nn \becquerel { Bq } \siunitx_declare_unit:Nx \degreeCelsius { \__siunitx_unit_non_latin:n { "00B0 } C } \siunitx_declare_unit:Nn \coulomb { C } \siunitx_declare_unit:Nn \farad { F } \siunitx_declare_unit:Nn \gray { Gy } \siunitx_declare_unit:Nn \hertz { Hz } \siunitx_declare_unit:Nn \henry { H } \siunitx_declare_unit:Nn \joule { J } \siunitx_declare_unit:Nn \katal { kat } \siunitx_declare_unit:Nn \lumen { lm } \siunitx_declare_unit:Nn \lux { lx } \siunitx_declare_unit:Nn \newton { N } \siunitx_declare_unit:Nx \ohm { \__siunitx_unit_non_latin:n { "03A9 } } \siunitx_declare_unit:Nn \pascal { Pa } \siunitx_declare_unit:Nn \radian { rad } \siunitx_declare_unit:Nn \siemens { S } \siunitx_declare_unit:Nn \sievert { Sv } \siunitx_declare_unit:Nn \steradian { sr } \siunitx_declare_unit:Nn \tesla { T } \siunitx_declare_unit:Nn \volt { V } \siunitx_declare_unit:Nn \watt { W } \siunitx_declare_unit:Nn \weber { Wb } \siunitx_declare_unit:Nn \astronomicalunit { au } \siunitx_declare_unit:Nn \bel { B } \siunitx_declare_unit:Nn \decibel { \deci \bel } \siunitx_declare_unit:Nn \dalton { Da } \siunitx_declare_unit:Nn \day { d } \siunitx_declare_unit:Nn \electronvolt { eV } \siunitx_declare_unit:Nn \hectare { ha } \siunitx_declare_unit:Nn \hour { h } \siunitx_declare_unit:Nn \litre { L } \siunitx_declare_unit:Nn \liter { \litre } \siunitx_declare_unit:Nn \minute { min } \siunitx_declare_unit:Nn \neper { Np } \siunitx_declare_unit:Nn \tonne { t } \siunitx_declare_unit:Nx \arcminute { \__siunitx_unit_non_latin:n { "02B9 } } \siunitx_declare_unit:Nx \arcsecond { \__siunitx_unit_non_latin:n { "02BA } } \siunitx_declare_unit:Nx \degree { \__siunitx_unit_non_latin:n { "00B0 } } \siunitx_declare_unit:Nx \percent { \cs_to_str:N \% } \siunitx_declare_power:NNn \square \squared { 2 } \siunitx_declare_power:NNn \cubic \cubed { 3 } \msg_new:nnnn { siunitx } { unit / dangling-part } { Found~#1~part~with~no~unit. } { Each~#1~part~must~be~associated~with~a~unit:~a~#1~part~was~found~ but~no~following~unit~was~given. } \msg_new:nnnn { siunitx } { unit / duplicate-part } { Duplicate~#1~part:~#2. } { Each~unit~may~have~only~one~#1:\\ the~additional~#1~part~'#2'~will~be~ignored. } \msg_new:nnnn { siunitx } { unit / duplicate-sticky-per } { Duplicate~\token_to_str:N \per. } { When~the~'sticky-per'~option~is~active,~only~one~ \token_to_str:N \per \ may~appear~in~a~unit. } \msg_new:nnnn { siunitx } { unit / literal } { Literal~units~disabled. } { You~gave~the~literal~input~'#1'~ but~literal~unit~output~is~disabled. } \msg_new:nnnn { siunitx } { unit / non-convertible-exponent } { Exponent~'#1'~cannot~be~converted~into~a~symbolic~prefix. } { The~exponent~'#1'~does~not~match~with~any~of~the~symbolic~prefixes~ set~up. } \msg_new:nnnn { siunitx } { unit / non-numeric-exponent } { Prefix~'#1'~does~not~have~a~numerical~value. } { The~prefix~'#1'~needs~to~be~combined~with~a~number,~but~it~has~no numerical~value. } \msg_new:nnnn { siunitx } { unit / part-before-unit } { Found~#1~part~before~first~unit:~#2. } { The~#1~part~'#2'~must~follow~after~a~unit:~ it~cannot~appear~before~any~units~and~will~therefore~be~ignored. } \keys_set:nn { siunitx } { bracket-unit-denominator = true , forbid-literal-units = false , fraction-command = \frac , inter-unit-product = \, , extract-mass-in-kilograms = true , parse-units = true , per-mode = power , per-symbol = / , qualifier-mode = subscript , qualifier-phrase = , sticky-per = false , unit-font-command = \mathrm } \AtBeginDocument { \str_if_eq:eeT { \exp_not:o { \familydefault } } { \exp_not:n { \sfdefault } } { \keys_set:nn { siunitx } { unit-font-command = \mathsf } } } \tl_new:N \l__siunitx_quantity_tmp_fp \tl_new:N \l__siunitx_quantity_tmp_tl \tl_new:N \l__siunitx_quantity_bracket_close_tl \tl_new:N \l__siunitx_quantity_bracket_open_tl \tl_set:Nn \l__siunitx_quantity_bracket_open_tl { ( } \tl_set:Nn \l__siunitx_quantity_bracket_close_tl { ) } \tl_new:N \l_siunitx_quantity_prefix_mode_tl \bool_new:N \l__siunitx_quantity_uncert_bracket_bool \bool_new:N \l__siunitx_quantity_uncert_repeat_bool \keys_define:nn { siunitx } { allow-quantity-breaks .bool_set:N = \l__siunitx_quantity_break_bool , prefix-mode .choices:nn = { combine-exponent , extract-exponent , input } { \tl_set_eq:NN \l_siunitx_quantity_prefix_mode_tl \l_keys_choice_tl } , quantity-product .tl_set:N = \l__siunitx_quantity_product_tl , separate-uncertainty-units .choice: , separate-uncertainty-units / bracket .code:n = { \bool_set_true:N \l__siunitx_quantity_uncert_bracket_bool \bool_set_false:N \l__siunitx_quantity_uncert_repeat_bool } , separate-uncertainty-units / repeat .code:n = { \bool_set_false:N \l__siunitx_quantity_uncert_bracket_bool \bool_set_true:N \l__siunitx_quantity_uncert_repeat_bool } , separate-uncertainty-units / single .code:n = { \bool_set_false:N \l__siunitx_quantity_uncert_bracket_bool \bool_set_false:N \l__siunitx_quantity_uncert_repeat_bool } } \tl_new:N \l__siunitx_quantity_number_tl \tl_new:N \l__siunitx_quantity_unit_tl \cs_new_protected:Npn \siunitx_quantity:nn #1#2 { \group_begin: \siunitx_unit_options_apply:n {#2} \tl_if_blank:nTF {#1} { \siunitx_unit_format:nN {#2} \l__siunitx_quantity_unit_tl \siunitx_print_unit:V \l__siunitx_quantity_unit_tl } { \bool_if:NTF \l_siunitx_number_parse_bool { \__siunitx_quantity_parsed:nn {#1} {#2} } { \tl_set:Nn \l__siunitx_quantity_number_tl { \ensuremath {#1} } \siunitx_unit_format:nN {#2} \l__siunitx_quantity_unit_tl \siunitx_quantity_print:VV \l__siunitx_quantity_number_tl \l__siunitx_quantity_unit_tl } } \group_end: } \cs_new_protected:Npn \__siunitx_quantity_parsed:nn #1#2 { \bool_set_false:N \l_siunitx_number_bracket_ambiguous_bool \siunitx_number_parse:nN {#1} \l__siunitx_quantity_number_tl \use:c { __siunitx_quantity_parsed_ \l_siunitx_quantity_prefix_mode_tl :n } {#2} \tl_set:Nx \l__siunitx_quantity_number_tl { \siunitx_number_output:NN \l__siunitx_quantity_number_tl \q_nil } \exp_after:wN \__siunitx_quantity_parsed_aux:w \l__siunitx_quantity_number_tl \q_stop } \cs_new_protected:cpn { __siunitx_quantity_parsed_combine-exponent:n } #1 { \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl \exp_args:NV \__siunitx_quantity_extract_exp:nNN \l__siunitx_quantity_number_tl \l__siunitx_quantity_tmp_fp \l__siunitx_quantity_number_tl \siunitx_unit_format_combine_exponent:nnN {#1} \l__siunitx_quantity_tmp_fp \l__siunitx_quantity_unit_tl } \cs_new_protected:cpn { __siunitx_quantity_parsed_extract-exponent:n } #1 { \siunitx_unit_format_extract_prefixes:nNN {#1} \l__siunitx_quantity_unit_tl \l__siunitx_quantity_tmp_fp \tl_set:Nx \l__siunitx_quantity_number_tl { \siunitx_number_adjust_exponent:Nn \l__siunitx_quantity_number_tl \l__siunitx_quantity_tmp_fp } \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl } \cs_new_protected:Npn \__siunitx_quantity_parsed_input:n #1 { \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl \siunitx_unit_format:nN {#1} \l__siunitx_quantity_unit_tl } \cs_new_protected:Npn \__siunitx_quantity_parsed_aux:w #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_nil #9 \q_stop { \__siunitx_quantity_parsed_aux:nnnw {#1} {#2#3#4#5} {#6#7#8} #9 \q_stop } \cs_new_protected:Npn \__siunitx_quantity_parsed_aux:nnnw #1#2#3 #4 \q_nil #5 \q_nil #6 \q_stop { \__siunitx_quantity_parsed_aux:nnnn {#1} {#2} {#3#4} {#5#6} } \cs_new_protected:Npn \__siunitx_quantity_parsed_aux:nnnn #1#2#3#4 { \tl_if_blank:nTF {#3} { \siunitx_quantity_print:nV {#1#2#4} \l__siunitx_quantity_unit_tl } { \bool_if:NTF \l__siunitx_quantity_uncert_bracket_bool { \siunitx_quantity_print:xV { \exp_not:n {#1} \exp_not:V \l__siunitx_quantity_bracket_open_tl \exp_not:n {#2#3} \exp_not:V \l__siunitx_quantity_bracket_close_tl \exp_not:n {#4} } \l__siunitx_quantity_unit_tl } { \bool_if:NTF \l__siunitx_quantity_uncert_repeat_bool { \tl_if_blank:nTF {#4} { \__siunitx_quantity_parsed_aux:nnn {#1#2} {#3} { } } { \__siunitx_quantity_parsed_aux:nnn {#1#2} {#3} { { } #4 } } } { \siunitx_quantity_print:nV {#1#2#3#4} \l__siunitx_quantity_unit_tl } } } } \cs_new_protected:Npn \__siunitx_quantity_parsed_aux:nnn #1#2#3 { \siunitx_quantity_print:nV {#1#3} \l__siunitx_quantity_unit_tl \tl_if_blank:nF {#2} { \siunitx_quantity_print:nV { { } #2#3 } \l__siunitx_quantity_unit_tl } } \cs_new_protected:Npn \__siunitx_quantity_extract_exp:nNN #1#2#3 { \__siunitx_quantity_extract_exp:nnnnnnnNN #1 #2 #3 } \cs_new_protected:Npn \__siunitx_quantity_extract_exp:nnnnnnnNN #1#2#3#4#5#6#7#8#9 { \fp_set:Nn #8 {#6#7} \tl_set:Nx #9 { {#1} {#2} {#3} {#4} {#5} { } { 0 } } } \cs_new_protected:Npn \siunitx_quantity_print:nn #1#2 { \siunitx_print_number:n {#1} \tl_if_blank:nF {#2} { \bool_lazy_or:nnTF { \tl_if_blank_p:n {#1} } { ! \tl_if_head_eq_charcode_p:nN {#2} { 1 } } { \tl_use:N \l__siunitx_quantity_product_tl \bool_if:NTF \l__siunitx_quantity_break_bool { \penalty \binoppenalty } { \nobreak } \siunitx_print_unit:n {#2} } { \exp_args:No \siunitx_print_unit:n { \use_none:n #2 } } } } \cs_generate_variant:Nn \siunitx_quantity_print:nn { nV , VV , xV } \keys_set:nn { siunitx } { allow-quantity-breaks = false , prefix-mode = input , quantity-product = \, , separate-uncertainty-units = bracket } \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { \cs_new:Npn \__siunitx_quantity_non_latin:n #1 { \char_generate:nn {#1} { \char_value_catcode:n {#1} } } } { \cs_new:Npn \__siunitx_quantity_non_latin:n #1 { \exp_last_unbraced:Nf \__siunitx_quantity_non_latin:nnnn { \char_to_utfviii_bytes:n {#1} } } \cs_new:Npn \__siunitx_quantity_non_latin:nnnn #1#2#3#4 { \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \char_generate:nn {#1} { 13 } \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \char_generate:nn {#2} { 13 } } } \siunitx_declare_unit:Nxn \degree { \__siunitx_quantity_non_latin:n { "00B0 } } { quantity-product = { } } \tl_new:N \l__siunitx_symbol_tmpa_tl \tl_new:N \l__siunitx_symbol_tmpb_tl \AtBeginDocument { \cs_if_free:cT { T@TS1 } { \RequirePackage { textcomp } } } \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { \cs_new:Npn \__siunitx_symbol_non_latin:n #1 { \char_generate:nn {#1} { \char_value_catcode:n {#1} } } } { \cs_new:Npn \__siunitx_symbol_non_latin:n #1 { \exp_last_unbraced:Nf \__siunitx_symbol_non_latin:nnnn { \char_to_utfviii_bytes:n {#1} } } \cs_new:Npn \__siunitx_symbol_non_latin:nnnn #1#2#3#4 { \__siunitx_symbol_deal_with_utf: \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \char_generate:nn {#1} { 13 } \char_generate:nn {#2} { 12 } } } \cs_new:Npn \__siunitx_symbol_deal_with_utf: { } \prg_new_protected_conditional:Npnn \__siunitx_symbol_if_replace:Nn #1#2 { T , TF } { \group_begin: \protected@edef \l__siunitx_symbol_tmpa_tl { \exp_not:V \l_siunitx_unit_font_tl { \__siunitx_symbol_non_latin:n {#2} } } \int_step_inline:nnn { "80 } { "FF } { \char_set_active_eq:nN {##1} \scan_stop: } \keys_set:nn { siunitx } { parse-units = false } \siunitx_unit_format:nN {#1} \l__siunitx_symbol_tmpb_tl \str_if_eq:VVTF \l__siunitx_symbol_tmpa_tl \l__siunitx_symbol_tmpb_tl { \group_end: \prg_return_true: } { \group_end: \prg_return_false: } } \AtBeginDocument { \__siunitx_symbol_if_replace:NnT \arcminute { "02B9 } { \siunitx_declare_unit:Nn \arcminute { \ensuremath { { } ' } } } \__siunitx_symbol_if_replace:NnT \arcsecond { "02BA } { \siunitx_declare_unit:Nn \arcsecond { \ensuremath { { } '' } } } \__siunitx_symbol_if_replace:NnT \degree { "00B0 } { \siunitx_declare_unit:Nxn \degree { \exp_not:N \ifmmode \@ifpackageloaded { unicode-math } { \__siunitx_symbol_non_latin:n { "00B0 } } { { } ^ { \exp_not:N \circ } } \exp_not:N \else \exp_not:N \text { \@ifpackageloaded { inputenc } { \exp_not:N \textdegree } { \__siunitx_symbol_non_latin:n { "00B0 } } } \exp_not:N \fi } { quantity-product = { } } } \group_begin: \tl_set:Nx \l__siunitx_symbol_tmpa_tl { \__siunitx_symbol_non_latin:n { "00B0 } C } \protected@edef \l__siunitx_symbol_tmpa_tl { \exp_not:V \l_siunitx_unit_font_tl { \l__siunitx_symbol_tmpa_tl } } \keys_set:nn { siunitx } { parse-units = false } \siunitx_unit_format:nN { \degreeCelsius } \l__siunitx_symbol_tmpb_tl \str_if_eq:VVTF \l__siunitx_symbol_tmpa_tl \l__siunitx_symbol_tmpb_tl { \group_end: \siunitx_declare_unit:Nx \degreeCelsius { \exp_not:N \ifmmode \@ifpackageloaded { unicode-math } { \__siunitx_symbol_non_latin:n { "00B0 } } { { } ^ { \exp_not:N \circ } } \exp_not:N \else \exp_not:N \text { \@ifpackageloaded { inputenc } { \exp_not:N \textdegree } { \__siunitx_symbol_non_latin:n { "00B0 } } } \exp_not:N \fi C } } { \group_end: } \__siunitx_symbol_if_replace:NnT \ohm { "03A9 } { \tl_set:Nx \l__siunitx_symbol_tmpa_tl { \cs_if_exist:NTF \upOmega { \exp_not:N \upOmega } { \exp_not:N \Omega } } \siunitx_declare_unit:Nx \ohm { \@ifpackageloaded { fourier } { \exp_not:N \ensuremath { \exp_not:V \l__siunitx_symbol_tmpa_tl } } { \exp_not:N \ifmmode \@ifpackageloaded { fontspec } { \exp_not:N \text { \exp_not:N \ensuremath { \exp_not:V \l__siunitx_symbol_tmpa_tl } } } { \exp_not:V \l__siunitx_symbol_tmpa_tl } \exp_not:N \else \exp_not:N \text { \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { \__siunitx_symbol_non_latin:n { "03A9 } } { \exp_not:N \textohm } } \exp_not:N \fi } } } \__siunitx_symbol_if_replace:NnT \micro { "03BC } { \siunitx_declare_prefix:Nnx \micro { -6 } { \exp_not:N \text { \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { \__siunitx_symbol_non_latin:n { "00B5 } } { \exp_not:N \textmu } } } } } \AtBeginDocument { \@ifpackageloaded { hyperref } { \exp_args:Nx \pdfstringdefDisableCommands { \cs_set_eq:NN \siunitx_print_text:n \exp_not:N \use:n \siunitx_declare_unit:Nn \exp_not:N \ohm { \__siunitx_symbol_non_latin:n { "03A9 } } } } { } } \siunitx_declare_unit:Nn \A { \ampere } \siunitx_declare_unit:Nn \pA { \pico \ampere } \siunitx_declare_unit:Nn \nA { \nano \ampere } \siunitx_declare_unit:Nn \uA { \micro \ampere } \siunitx_declare_unit:Nn \mA { \milli \ampere } \siunitx_declare_unit:Nn \kA { \kilo \ampere } \siunitx_declare_unit:Nn \Hz { \hertz } \siunitx_declare_unit:Nn \mHz { \milli \hertz } \siunitx_declare_unit:Nn \kHz { \kilo \hertz } \siunitx_declare_unit:Nn \MHz { \mega \hertz } \siunitx_declare_unit:Nn \GHz { \giga \hertz } \siunitx_declare_unit:Nn \THz { \tera \hertz } \siunitx_declare_unit:Nn \mol { \mole } \siunitx_declare_unit:Nn \fmol { \femto \mole } \siunitx_declare_unit:Nn \pmol { \pico \mole } \siunitx_declare_unit:Nn \nmol { \nano \mole } \siunitx_declare_unit:Nn \umol { \micro \mole } \siunitx_declare_unit:Nn \mmol { \milli \mole } \siunitx_declare_unit:Nn \kmol { \kilo \mole } \siunitx_declare_unit:Nn \V { \volt } \siunitx_declare_unit:Nn \pV { \pico \volt } \siunitx_declare_unit:Nn \nV { \nano \volt } \siunitx_declare_unit:Nn \uV { \micro \volt } \siunitx_declare_unit:Nn \mV { \milli \volt } \siunitx_declare_unit:Nn \kV { \kilo \volt } \siunitx_declare_unit:Nn \hl { \hecto \litre } \siunitx_declare_unit:Nn \l { \litre } \siunitx_declare_unit:Nn \ml { \milli \litre } \siunitx_declare_unit:Nn \ul { \micro \litre } \siunitx_declare_unit:Nn \hL { \hecto \liter } \siunitx_declare_unit:Nn \L { \liter } \siunitx_declare_unit:Nn \mL { \milli \liter } \siunitx_declare_unit:Nn \uL { \micro \liter } \siunitx_declare_unit:Nn \fg { \femto \gram } \siunitx_declare_unit:Nn \pg { \pico \gram } \siunitx_declare_unit:Nn \ng { \nano \gram } \siunitx_declare_unit:Nn \ug { \micro \gram } \siunitx_declare_unit:Nn \mg { \milli \gram } \siunitx_declare_unit:Nn \g { \gram } \siunitx_declare_unit:Nn \kg { \kilo \gram } \siunitx_declare_unit:Nn \W { \watt } \siunitx_declare_unit:Nn \uW { \micro \watt } \siunitx_declare_unit:Nn \mW { \milli \watt } \siunitx_declare_unit:Nn \kW { \kilo \watt } \siunitx_declare_unit:Nn \MW { \mega \watt } \siunitx_declare_unit:Nn \GW { \giga \watt } \siunitx_declare_unit:Nn \J { \joule } \siunitx_declare_unit:Nn \uJ { \micro \joule } \siunitx_declare_unit:Nn \mJ { \milli \joule } \siunitx_declare_unit:Nn \kJ { \kilo \joule } \siunitx_declare_unit:Nn \eV { \electronvolt } \siunitx_declare_unit:Nn \meV { \milli \electronvolt } \siunitx_declare_unit:Nn \keV { \kilo \electronvolt } \siunitx_declare_unit:Nn \MeV { \mega \electronvolt } \siunitx_declare_unit:Nn \GeV { \giga \electronvolt } \siunitx_declare_unit:Nn \TeV { \tera \electronvolt } \siunitx_declare_unit:Nnn \kWh { \kilo \watt \hour } { inter-unit-product = } \siunitx_declare_unit:Nn \m { \metre } \siunitx_declare_unit:Nn \pm { \pico \metre } \siunitx_declare_unit:Nn \nm { \nano \metre } \siunitx_declare_unit:Nn \um { \micro \metre } \siunitx_declare_unit:Nn \mm { \milli \metre } \siunitx_declare_unit:Nn \cm { \centi \metre } \siunitx_declare_unit:Nn \dm { \deci \metre } \siunitx_declare_unit:Nn \km { \kilo \metre } \siunitx_declare_unit:Nn \K { \kelvin } \siunitx_declare_unit:Nn \dB { \deci \bel } \siunitx_declare_unit:Nn \F { \farad } \siunitx_declare_unit:Nn \fF { \femto \farad } \siunitx_declare_unit:Nn \pF { \pico \farad } \siunitx_declare_unit:Nn \nF { \nano \farad } \siunitx_declare_unit:Nn \uF { \micro \farad } \siunitx_declare_unit:Nn \H { \henry } \siunitx_declare_unit:Nn \mH { \milli \henry } \siunitx_declare_unit:Nn \uH { \micro \henry } \siunitx_declare_unit:Nn \N { \newton } \siunitx_declare_unit:Nn \mN { \milli \newton } \siunitx_declare_unit:Nn \kN { \kilo \newton } \siunitx_declare_unit:Nn \MN { \mega \newton } \siunitx_declare_unit:Nn \Pa { \pascal } \siunitx_declare_unit:Nn \kPa { \kilo \pascal } \siunitx_declare_unit:Nn \MPa { \mega \pascal } \siunitx_declare_unit:Nn \GPa { \giga \pascal } \siunitx_declare_unit:Nn \mohm { \milli \ohm } \siunitx_declare_unit:Nn \kohm { \kilo \ohm } \siunitx_declare_unit:Nn \Mohm { \mega \ohm } \siunitx_declare_unit:Nn \s { \second } \siunitx_declare_unit:Nn \as { \atto \second } \siunitx_declare_unit:Nn \fs { \femto \second } \siunitx_declare_unit:Nn \ps { \pico \second } \siunitx_declare_unit:Nn \ns { \nano \second } \siunitx_declare_unit:Nn \us { \micro \second } \siunitx_declare_unit:Nn \ms { \milli \second } \siunitx_declare_prefix:Nn \kibi { Ki } \siunitx_declare_prefix:Nn \mebi { Mi } \siunitx_declare_prefix:Nn \gibi { Gi } \siunitx_declare_prefix:Nn \tebi { Ti } \siunitx_declare_prefix:Nn \pebi { Pi } \siunitx_declare_prefix:Nn \exbi { Ei } \siunitx_declare_prefix:Nn \zebi { Zi } \siunitx_declare_prefix:Nn \yobi { Yi } \siunitx_declare_unit:Nn \bit { bit } \siunitx_declare_unit:Nn \byte { B } \tl_new:N \l__siunitx_command_tmp_tl \keys_define:nn { siunitx } { free-standing-units .bool_set:N = \l__siunitx_command_create_bool , overwrite-commands .bool_set:N = \l__siunitx_command_overwrite_bool , space-before-unit .bool_set:N = \l__siunitx_command_prespace_bool , unit-optional-argument .bool_set:N = \l__siunitx_command_optarg_bool , use-xspace .bool_set:N = \l__siunitx_command_xspace_bool } \AtBeginDocument { \clist_map_inline:nn { free-standing-units , overwrite-commands , space-before-unit , unit-optional-argument , use-xspace } { \keys_define:nn { siunitx } { #1 .code:n = { \msg_warning:nnn { siunitx } { option-preamble-only } {#1} } } } } \msg_new:nnn { siunitx } { option-preamble-only } { Option~'#1'~only~available~in~the~preamble. } \cs_new_protected:Npn \siunitx_command_create: { \bool_if:NT \l__siunitx_command_create_bool { \__siunitx_command_create: } \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq { \cs_if_free:NT ##1 { \cs_set_protected:Npn ##1 { \ERROR } } } \@ifpackageloaded { soulpos } { \@ifpackageloaded { soul } { } { \cs_undefine:N \hl \cs_undefine:N \ul } } { } } \AtBeginDocument { \siunitx_command_create: } \cs_new_protected:Npn \__siunitx_command_create: { \bool_if:NT \l__siunitx_command_xspace_bool { \RequirePackage { xspace } } \bool_if:NT \l__siunitx_command_overwrite_bool { \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq { \cs_undefine:N ##1 } } \cs_set_protected:Npx \__siunitx_command_create:N ##1 { \ProvideDocumentCommand ##1 { \bool_if:NT \l__siunitx_command_optarg_bool { o } } { \mode_leave_vertical: \group_begin: \bool_if:NTF \l__siunitx_command_optarg_bool { \exp_not:N \IfNoValueTF {####1} } { \use_i:nn } { \siunitx_unit_options_apply:n {##1} \siunitx_unit_format:nN {##1} \exp_not:N \l__siunitx_command_tmp_tl \bool_if:NTF \l__siunitx_command_prespace_bool { \siunitx_quantity_print:nV { } } { \siunitx_print_unit:V } \exp_not:N \l__siunitx_command_tmp_tl } { \siunitx_quantity:nn {####1} {##1} } \group_end: \bool_if:NT \l__siunitx_command_xspace_bool { \exp_not:N \xspace } } } \seq_map_function:NN \l_siunitx_unit_seq \__siunitx_command_create:N } \cs_new_protected:Npn \__siunitx_command_create:N #1 { } \keys_set:nn { siunitx } { free-standing-units = false , overwrite-commands = false , space-before-unit = false , unit-optional-argument = false , use-xspace = false } \msg_new:nnn { siunitx } { option-deprecated } { Option~"#1"~has~been~deprecated~in~this~release.\\ \\ Use~"#2"~as~a~replacement. } \msg_new:nnn { siunitx } { option-removed } { Option~"#1"~has~been~removed~in~this~release. } \cs_new_protected:Npn \__siunitx_option_deprecated:nn #1#2 { \msg_info:nnnn { siunitx } { option-deprecated } {#1} {#2} \keys_set:nn { siunitx } {#2} } \cs_new_protected:Npn \__siunitx_option_deprecated:nnn #1#2#3 { \msg_info:nnnn { siunitx } { option-deprecated } {#1} {#2} \keys_set:nn { siunitx } { #2 = #3 } } \cs_generate_variant:Nn \__siunitx_option_deprecated:nnn { nnV } \cs_new_protected:Npn \__siunitx_option_removed:n #1 { \msg_warning:nnx { siunitx } { option-removed } {#1} } \cs_generate_variant:Nn \__siunitx_option_removed:n { V } \clist_map_inline:nn { abbreviations , binary-units , load-configurations , version-1-compatibility } { \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} } } \keys_define:nn { siunitx } { add-arc-degree-zero .code:n = { \__siunitx_option_deprecated:nnV { add-arc-degree-zero } { fill-angle-degrees } \l_keys_value_tl } , add-arc-degree-zero .default:n = true , add-arc-minute-zero .code:n = { \__siunitx_option_deprecated:nnV { add-arc-minute-zero } { fill-angle-minutes } \l_keys_value_tl } , add-arc-minute-zero .default:n = true , add-arc-second-zero .code:n = { \__siunitx_option_deprecated:nnV { add-arc-second-zero } { fill-angle-seconds } \l_keys_value_tl } , add-arc-second-zero .default:n = true , arc-separator .code:n = { \__siunitx_option_deprecated:nnV { arc-separator } { angle-separator } \l_keys_value_tl } } \keys_define:nn { siunitx } { list-units / brackets .code:n = { \__siunitx_option_deprecated:nn { list-units~=~brackets } { list-units~=~bracket } } , range-units / brackets .code:n = { \__siunitx_option_deprecated:nn { range-units~=~brackets } { range-units~=~bracket } } , product-units / brackets .code:n = { \__siunitx_option_deprecated:nn { product-units~=~brackets } { product-units~=~bracket } } } \keys_define:nn { siunitx } { overwrite-functions .code:n = { \__siunitx_option_deprecated:nnV { overwrite-functions } { overwrite-commands } \l_keys_value_tl } , overwrite-functions .default:n = true } \keys_define:nn { siunitx } { detect-all .code:n = { \__siunitx_option_deprecated:nn { detect-all } { mode~=~match , ~ propagate-math-font~=~true , ~ reset-math-version~=~false , ~ reset-text-family~=~false , ~ reset-text-series~=~false , ~ text-family-to-math~=~true , ~ text-series-to-math~=~true } } , detect-family .code:n = { \__siunitx_option_deprecated:nn { detect-family } { reset-text-family~=~false , ~ text-family-to-math~=~true } } , detect-mode .code:n = { \__siunitx_option_deprecated:nn { detect-mode } { mode~=~match } } , detect-none .code:n = { \__siunitx_option_deprecated:nn { detect-none } { mode~=~math , ~ propagate-math-font~=~false , ~ reset-math-version~=~true , ~ reset-text-family~=~true , ~ reset-text-series~=~true , ~ text-family-to-math~=~false , ~ text-series-to-math~=~false } } , detect-shape .code:n = { \__siunitx_option_deprecated:nn { detect-shape } { reset-text-shape~=~false } } , detect-weight .code:n = { \__siunitx_option_deprecated:nn { detect-weight } { reset-text-series~=~false , ~ text-series-to-math~=~true } } } \clist_map_inline:nn { detect-display-math , detect-inline-family , detect-inline-weight } { \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} } } \clist_map_inline:nn { math-rm , math-sf , math-tt , number-math-rm , number-math-sf , number-math-tt , number-text-rm , number-text-sf , number-text-tt , text-rm , text-sf , text-tt , unit-math-rm , unit-math-sf , unit-math-tt , unit-text-rm , unit-text-sf , unit-text-tt } { \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} } } \clist_map_inline:nn { math-angstrom , math-arcminute , math-arcsecond , math-celsius , math-degree , math-micro , math-ohm , text-angstrom , text-arcminute , text-arcsecond , text-celsius , text-degree , text-micro , text-ohm , } { \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} } } \keys_define:nn { siunitx } { group-digits / false .code:n = { \__siunitx_option_deprecated:nn { group-digits ~ = ~ false } { group-digits ~ = ~ none } } , group-digits / true .code:n = { \__siunitx_option_deprecated:nn { group-digits ~ = ~ true } { group-digits ~ = ~ all } } , input-symbols .code:n = { \msg_info:nnnn { siunitx } { option-deprecated } { input-symbols } { input-digits } \tl_put_right:Nn \l__siunitx_number_input_digit_tl {#1} } , separate-uncertainty .choice: , separate-uncertainty / false .code:n = { \__siunitx_option_deprecated:nn { separate-uncertainty } { uncertainty-mode~=~compact } } , separate-uncertainty / true .code:n = { \__siunitx_option_deprecated:nn { separate-uncertainty } { uncertainty-mode~=~separate } } , separate-uncertainty .default:n = true } \clist_map_inline:nn { input-protect-tokens , input-quotient , output-product , quotient-mode } { \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} } } \keys_define:nn { siunitx } { add-decimal-zero .choice: , add-decimal-zero / false .code:n = { \__siunitx_option_deprecated:nn { add-decimal-zero } { minimum-decimal-digits~=~0 } } , add-decimal-zero / true .code:n = { \__siunitx_option_deprecated:nn { add-decimal-zero } { minimum-decimal-digits~=~1 } } , add-decimal-zero .default:n = true , add-integer-zero .code:n = { \__siunitx_option_removed:V \l_keys_key_tl } , close-bracket .code:n = { \__siunitx_option_removed:V \l_keys_key_tl } , bracket-numbers .choice: , bracket-numbers / false .code:n = { \__siunitx_option_deprecated:nn { bracket-numbers } { bracket-ambiguous-numbers~=~false } } , bracket-numbers / true .code:n = { \__siunitx_option_deprecated:nn { bracket-numbers } { bracket-ambiguous-numbers~=~true } } , bracket-numbers .default:n = true , explicit-sign .code:n = { \str_if_eq:nnTF {#1} { + } { \__siunitx_option_deprecated:nn { explicit-sign } { print-implicit-plus~=~true } } { \__siunitx_option_removed:V \l_keys_key_tl } } , group-four-digits .choice: , group-four-digits / false .code:n = { \__siunitx_option_deprecated:nn { group-four-digits~=~false } { group-minimum-digits~=~5 } } , group-four-digits / true .code:n = { \__siunitx_option_deprecated:nn { group-four-digits~=~false } { group-minimum-digits~=~4 } } , bracket-numbers .default:n = true , omit-uncertainty .code:n = { \__siunitx_option_deprecated:nnV { omit-uncertainty } { drop-uncertainty } \l_keys_value_tl } , omit-uncertainty .default:n = true , open-bracket .code:n = { \__siunitx_option_removed:V \l_keys_key_tl } , retain-unity-mantissa .code:n = { \__siunitx_option_deprecated:nnV { retain-unity-mantissa } { print-unity-mantissa } \l_keys_value_tl } , retain-unity-mantissa .default:n = true , retain-zero-exponent .code:n = { \__siunitx_option_deprecated:nnV { retain-zero-exponent } { print-zero-exponent } \l_keys_value_tl } , retain-zero-exponent .default:n = true , round-integer-to-decimal .code:n = { \__siunitx_option_removed:V \l_keys_key_tl } , scientific-notation .choice: , scientific-notation / engineering .code:n = { \__siunitx_option_deprecated:nn { scientific-notation~=~engineering } { exponent-mode~=~engineering } } , scientific-notation / fixed .code:n = { \__siunitx_option_deprecated:nn { scientific-notation~=~fixed } { exponent-mode~=~fixed } } , scientific-notation / false .code:n = { \__siunitx_option_deprecated:nn { scientific-notation~=~false } { exponent-mode~=~input } } , scientific-notation / true .code:n = { \__siunitx_option_deprecated:nn { scientific-notation~=~true } { exponent-mode~=~scientific } } , scientific-notation .default:n = true , zero-decimal-to-integer .code:n = { \__siunitx_option_deprecated:nnV { zero-decimal-to-integer } { drop-zero-decimal } \l_keys_value_tl } , zero-decimal-to-integer .default:n = true } \keys_define:nn { siunitx } { table-align-text-post .code:n = { \__siunitx_option_deprecated:nnV { table-align-text-post } { table-align-text-after } \l_keys_value_tl } , table-align-text-post .default:n = true , table-align-text-pre .code:n = { \__siunitx_option_deprecated:nnV { table-align-text-pre } { table-align-text-before } \l_keys_value_tl } , table-align-text-pre .default:n = true , table-number-alignment / center-decimal-marker .code:n = { \msg_info:nnnn { siunitx } { option-deprecated } { table-number-alignment~=~center-decimal-marker } { table-alignment-mode~=~marker } \keys_set:nn { siunitx } { table-alignment-mode = marker } } , table-omit-exponent .code:n = { \__siunitx_option_deprecated:nnV { table-omit-exponent } { drop-exponent } \l_keys_value_tl } , table-omit-exponent .default:n = true , table-parse-only .code:n = { \msg_info:nnnn { siunitx } { option-deprecated } { table-parse-only } { table-alignment-mode~=~none } \str_if_eq:VnTF \l_keys_value_tl { false } { \keys_set:nn { siunitx } { table-alignment-mode = marker } } { \keys_set:nn { siunitx } { table-alignment-mode = none } } } , table-space-text-post .code:n = { \msg_info:nnnn { siunitx } { option-deprecated } { table-space-text-post } { table-format } \tl_set:Nn \l__siunitx_table_after_model_tl {#1} } , table-space-text-pre .code:n = { \msg_info:nnnn { siunitx } { option-deprecated } { table-space-text-post } { table-format } \tl_set:Nn \l__siunitx_table_before_model_tl {#1} } } \cs_new_protected:Npn \__siunitx_option_table_format:n #1 { \msg_info:nnnn { siunitx } { option-deprecated } { table- #1 } { table-format } \tl_set:Nx \l__siunitx_table_format_tl { \cs:w __siunitx_option_table_ #1 :nnnnnnnn \exp_after:wN \exp_after:wN \exp_after:wN \cs_end: \exp_after:wN \l__siunitx_table_format_tl \exp_after:wN { \l_keys_value_tl } } \exp_after:wN \__siunitx_table_generate_model:nnnnnnn \l__siunitx_table_format_tl } \cs_new:Npn \__siunitx_option_table_comparator:nnnnnnnn #1#2#3#4#5#6#7#8 { \exp_not:n { {#8} {#2} {#3} {#4} {#5} {#6} {#7} } } \cs_new:cpn { __siunitx_option_table_figures-decimal:nnnnnnnn } #1#2#3#4#5#6#7#8 { \exp_not:n { {#1} {#2} {#3} {#8} {#5} {#6} {#7} } } \cs_new:cpn { __siunitx_option_table_figures-exponent:nnnnnnnn } #1#2#3#4#5#6#7#8 { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#8} } } \cs_new:cpn { __siunitx_option_table_figures-integer:nnnnnnnn } #1#2#3#4#5#6#7#8 { \exp_not:n { {#1} {#2} {#8} {#4} {#5} {#6} {#7} } } \cs_new:cpn { __siunitx_option_table_figures-uncertainty:nnnnnnnn } #1#2#3#4#5#6#7#8 { \exp_not:n { {#1} {#2} {#3} {#4} { { S } {#8} } {#6} {#7} } } \cs_new:cpn { __siunitx_option_table_sign-exponent:nnnnnnnn } #1#2#3#4#5#6#7#8 { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#8} {#7} } } \cs_new:cpn { __siunitx_option_table_sign-mantissa:nnnnnnnn } #1#2#3#4#5#6#7#8 { \exp_not:n { {#1} {#8} {#3} {#4} {#5} {#6} {#7} } } \keys_define:nn { siunitx } { table-comparator .code:n = { \__siunitx_option_table_format:n { comparator } } , table-figures-decimal .code:n = { \__siunitx_option_table_format:n { figures-decimal } } , table-figures-exponent .code:n = { \__siunitx_option_table_format:n { figures-exponent } } , table-figures-integer .code:n = { \__siunitx_option_table_format:n { figures-integer } } , table-figures-uncertainty .code:n = { \__siunitx_option_table_format:n { figures-uncertainty } } , table-sign-exponent .code:n = { \__siunitx_option_table_format:n { sign-exponent } } , table-sign-mantissa .code:n = { \__siunitx_option_table_format:n { sign-mantissa } } } \keys_define:nn { siunitx } { fraction-function .code:n = { \__siunitx_option_deprecated:nnV { fraction-function } { fraction-command } \l_keys_value_tl } , literal-superscript-as-power .code:n = { \__siunitx_option_removed:V \l_keys_key_tl } , per-mode / reciprocal .code:n = { \__siunitx_option_deprecated:nn { per-mode~=~reciprocal } { per-mode~=~power } } , per-mode / reciprocal-positive-first .code:n = { \__siunitx_option_deprecated:nn { per-mode~=~reciprocal-positive-first } { per-mode~=~power-positive-first } } , power-font .code:n = { \__siunitx_option_removed:V \l_keys_key_tl } , qualifier-mode / brackets .code:n = { \__siunitx_option_deprecated:nn { qualifier-mode~=~brackets } { qualifier-mode~=~bracket } } , qualifier-mode / space .code:n = { \msg_info:nnnn { siunitx } { option-deprecated } { qualifier-mode~=~space } { qualifier-mode~=~phrase"~plus~"qualifier-phrase=\ } \keys_set:nn { siunitx } { qualifier-mode = phrase, qualifier-phrase = \ } } , qualifier-mode / text .code:n = { \__siunitx_option_deprecated:nn { qualifier-mode~=~text } { qualifier-mode~=~combine } } } \keys_define:nn { siunitx } { allow-number-unit-breaks .code:n = { \__siunitx_option_deprecated:nnV { allow-number-unit-breaks } { allow-quantity-breaks } \l_keys_value_tl } , allow-number-unit-breaks .default:n = true , exponent-to-prefix .choice: , exponent-to-prefix / false .code:n = { \__siunitx_option_deprecated:nn { exponent-to-prefix~=~false } { prefix-mode~=~input } } , exponent-to-prefix / true .code:n = { \__siunitx_option_deprecated:nn { exponent-to-prefix~=~true } { prefix-mode~=~combine-exponent } } , exponent-to-prefix .default:n = true , multi-part-units .choice: , multi-part-units / brackets . code:n = { \__siunitx_option_deprecated:nn { multi-part-units~=~brackets } { separate-uncertainty-units~=~bracket } } , multi-part-units / repeat . code:n = { \__siunitx_option_deprecated:nn { multi-part-units~=~repeat } { separate-uncertainty-units~=~repeat } } , multi-part-units / single . code:n = { \__siunitx_option_deprecated:nn { multi-part-units~=~single } { separate-uncertainty-units~=~single } } , number-unit-product .code:n = { \__siunitx_option_deprecated:nnV { number-unit-product } { quantity-product } \l_keys_value_tl } , number-unit-separator .code:n = { \__siunitx_option_deprecated:nnV { number-unit-separator } { quantity-product } \l_keys_value_tl } , prefixes-as-symbols .choice: , prefixes-as-symbols / false . code:n = { \__siunitx_option_deprecated:nn { prefixes-as-symbols~=~false } { prefix-mode~=~extract-exponent } } , prefixes-as-symbols / true . code:n = { \__siunitx_option_deprecated:nn { prefixes-as-symbols~=~true } { prefix-mode~=~input } } , prefixes-as-symbols .default:n = true } \keys_define:nn { siunitx } { table-column-type .tl_set:N = \l__siunitx_column_type_tl } \keys_set:nn { siunitx } { table-column-type = S } \RequirePackage { l3keys2e } \ProcessKeysOptions { siunitx } \IfFormatAtLeastTF { 2020-10-01 } { } { \RequirePackage { xparse } } \NewDocumentCommand \DeclareSIPower { +m +m m } { \siunitx_declare_power:NNn #1 #2 {#3} } \NewDocumentCommand \DeclareSIPrefix { +m m m } { \siunitx_declare_prefix:Nnn #1 {#3} {#2} } \NewDocumentCommand \DeclareSIQualifier { +m m } { \siunitx_declare_qualifier:Nn #1 {#2} } \NewDocumentCommand \DeclareSIUnit { o +m m } { \IfNoValueTF {#1} { \siunitx_declare_unit:Nn #2 {#3} } { \siunitx_declare_unit:Nnn #2 {#3} {#1} } } \@ifpackageloaded { physics } { \msg_new:nnn { siunitx } { physics-pkg } { Detected~the~"physics"~package: \\ Omitting~definition~of~\token_to_str:N \qty. } \msg_warning:nn { siunitx } { physics-pkg } \use_none:nnnn } { } \NewDocumentCommand \qty { O { } m > { \TrimSpaces } m } { \mode_leave_vertical: \group_begin: \siunitx_unit_options_apply:n {#3} \keys_set:nn { siunitx } {#1} \siunitx_quantity:nn {#2} {#3} \group_end: } \NewDocumentCommand \ang { O { } > { \SplitArgument { 2 } { ; } } m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \__siunitx_angle:nnn #2 \group_end: } \NewDocumentCommand \num { O { } m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \siunitx_number_format:nN {#2} \l__siunitx_tmp_tl \siunitx_print_number:V \l__siunitx_tmp_tl \group_end: } \@ifpackageloaded { units } { \msg_new:nnn { siunitx } { units-pkg } { Detected~the~"units"~package: \\ Omitting~definition~of~\token_to_str:N \unit. } \msg_warning:nn { siunitx } { units-pkg } \use_none:nnnn } { } \NewDocumentCommand \unit { O { } > { \TrimSpaces } m } { \mode_leave_vertical: \group_begin: \siunitx_unit_options_apply:n {#2} \keys_set:nn { siunitx } {#1} \siunitx_unit_format:nN {#2} \l__siunitx_tmp_tl \siunitx_print_unit:V \l__siunitx_tmp_tl \group_end: } \NewDocumentCommand \qtylist { O { } > { \SplitList { ; } } m > { \TrimSpaces } m } { \mode_leave_vertical: \group_begin: \siunitx_unit_options_apply:n {#3} \keys_set:nn { siunitx } {#1} \siunitx_quantity_list:nn {#2} {#3} \group_end: } \NewDocumentCommand \numlist { O { } > { \SplitList { ; } } m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \siunitx_number_list:nn {#2} \group_end: } \NewDocumentCommand \qtyproduct { O { } > { \SplitList { x } } m > { \TrimSpaces } m } { \mode_leave_vertical: \group_begin: \siunitx_unit_options_apply:n {#3} \keys_set:nn { siunitx } {#1} \siunitx_quantity_product:nn {#2} {#3} \group_end: } \NewDocumentCommand \numproduct { O { } > { \SplitList { x } } > { \TrimSpaces } m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \siunitx_number_product:n {#2} \group_end: } \NewDocumentCommand \qtyrange { O { } m m > { \TrimSpaces } m } { \mode_leave_vertical: \group_begin: \siunitx_unit_options_apply:n {#4} \keys_set:nn { siunitx } {#1} \siunitx_quantity_range:nnn {#2} {#3} {#4} \group_end: } \NewDocumentCommand \numrange { O { } m m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \siunitx_number_range:nn {#2} {#3} \group_end: } \NewDocumentCommand \complexnum { O { } m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \siunitx_complex_number:n {#2} \l__siunitx_tmp_tl \group_end: } \NewDocumentCommand \complexqty { O { } m m } { \mode_leave_vertical: \group_begin: \siunitx_unit_options_apply:n {#3} \keys_set:nn { siunitx } {#1} \siunitx_complex_quantity:nn {#2} {#3} \group_end: } \NewDocumentCommand \tablenum { O { } m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \siunitx_cell_begin:w \ignorespaces #2 \siunitx_cell_end: \group_end: } \NewDocumentCommand \sisetup { m } { \keys_set:nn { siunitx } {#1} } \cs_new_protected:Npn \__siunitx_angle:nnn #1#2#3 { \tl_if_novalue:nTF {#2} { \siunitx_angle:n {#1} } { \tl_if_novalue:nTF {#3} { \siunitx_angle:nnn {#1} {#2} { } } { \siunitx_angle:nnn {#1} {#2} {#3} } } } \RequirePackage { array } \cs_new_protected:Npn \__siunitx_declare_column:Nnn #1#2#3 { \cs_if_exist:cT { NC@find@ #1 } { \cs_undefine:c { NC@find@ #1 } \cs_set_protected:Npn \__siunitx_tmp:w ##1 \NC@do #1 ##2 \q_stop { \NC@list {##1##2} } \exp_after:wN \__siunitx_tmp:w \the \NC@list \q_stop \msg_warning:nnn { siunitx } { column-overwritten } {#1} } \newcolumntype {#1} { } \cs_set_protected:Npn \__siunitx_tmp:w \NC@do ##1##2 \NC@do #1 { \NC@list { \NC@do ##1 \NC@do #1 ##2 } } \exp_after:wN \__siunitx_tmp:w \the \NC@list \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [ 1 ] [ ] { \@temptokena \expandafter { \the \@temptokena > {#2} c < {#3} } \NC@find } } \msg_new:nnn { siunitx } { column-overwritten } { Tabular~column~type~"#1"~overwritten~with~siunitx~definition. } \AtBeginDocument { \@ifpackageloaded { mdwtab } { \cs_set_protected:Npn \__siunitx_declare_column:Nnn #1#2#3 { \cs_if_exist:cT { NC@find@ #1 } { \cs_undefine:c { NC@find@ #1 } \msg_warning:nnn { siunitx } { column-overwritten } {#1} } \newcolumntype {#1} [ 1 ] [ ] { > {#2} c < {#3} } } } { } \tl_map_inline:Nn \l__siunitx_column_type_tl { \__siunitx_declare_column:Nnn #1 { \keys_set:nn { siunitx } {##1} \siunitx_cell_begin:w } { \siunitx_cell_end: } } } \cs_new_protected:Npn \__siunitx_bookmark_cmd:Nnn #1#2#3 { \exp_args:Nc \DeclareExpandableDocumentCommand { \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) } {#2} {#3} } \__siunitx_bookmark_cmd:Nnn \qty { o m m } { #2 ~ #3 } \__siunitx_bookmark_cmd:Nnn \ang { m } { \__siunitx_angle:n {#1} } \__siunitx_bookmark_cmd:Nnn \num { o m } { #2 } \__siunitx_bookmark_cmd:Nnn \unit { o m } { #2 } \__siunitx_bookmark_cmd:Nnn \numlist { o m } { \__siunitx_list_use:nnVVV {#2} { } \l_siunitx_list_separator_pair_tl \l_siunitx_list_separator_tl \l_siunitx_list_separator_final_tl } \__siunitx_bookmark_cmd:Nnn \qtylist { o m m } { \__siunitx_list_use:nnVVV {#2} {#3} \l_siunitx_list_separator_pair_tl \l_siunitx_list_separator_tl \l_siunitx_list_separator_final_tl } \__siunitx_bookmark_cmd:Nnn \numproduct { o m } { } \__siunitx_bookmark_cmd:Nnn \qtyproduct { o m m } { } \__siunitx_bookmark_cmd:Nnn \numrange { o m m } { #2 \tl_use:N \l_siunitx_range_phrase_tl #3 } \__siunitx_bookmark_cmd:Nnn \qtyrange { o m m m } { #2 ~ #4 \tl_use:N \l_siunitx_range_phrase_tl #3 ~ #4 } \__siunitx_bookmark_cmd:Nnn \si { o m } { #2 } \__siunitx_bookmark_cmd:Nnn \SI { o m O { } m } { #3 #2 ~ #4 } \__siunitx_bookmark_cmd:Nnn \SIlist { o m m } { \__siunitx_list_use:nnVVV {#2} {#3} \l_siunitx_list_separator_pair_tl \l_siunitx_list_separator_tl \l_siunitx_list_separator_final_tl } \__siunitx_bookmark_cmd:Nnn \SIrange { o m m m } { #2 ~ #4 \tl_use:N \l_siunitx_range_phrase_tl #3 ~ #4 } \seq_const_from_clist:Nn \c__siunitx_bookmark_seq { \ang , \qty , \num , \unit , \numlist , \qtylist , \numrange , \qtyrange , \si , \SI , \SIlist , \SIrange } \AtBeginDocument { \@ifpackageloaded { hyperref } { \pdfstringdefDisableCommands { \seq_map_inline:Nn \c__siunitx_bookmark_seq { \cs_set_eq:Nc #1 { \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) } } } \pdfstringdefDisableCommands { \siunitx_unit_pdfstring_context: \cs_if_exist:NT \FB@fg { \def \fg { \FB@fg } } \edef \H { \exp_not:c { PU-cmd } \exp_not:N \H \exp_not:c { PU \token_to_str:N \H } } } } { } } \cs_new:Npn \__siunitx_angle:n #1 { \__siunitx_angle:w #1 ; ; ; \q_stop } \cs_new:Npn \__siunitx_angle:w #1 ; #2 ; #3 ; #4 \q_stop { \tl_if_blank:nF {#1} { #1 \degree } \tl_if_blank:nF {#2} { \tl_if_blank:nF {#1} { \c_space_tl } #2 \arcminute } \tl_if_blank:nF {#3} { \tl_if_blank:nF {#1#2} { \c_space_tl } #3 \arcsecond } } \cs_new:Npn \__siunitx_list_use:nnnnn #1#2#3#4#5 { \tl_if_blank:nTF {#2} { \__siunitx_list_use_aux:nnnnn {#1} { } } { \__siunitx_list_use_aux:nnnnn {#1} { ~ #2 } } {#3} {#4} {#5} } \cs_generate_variant:Nn \__siunitx_list_use:nnnnn { nnVVV } \cs_new:Npn \__siunitx_list_use_aux:nnnnn #1#2#3#4#5 { \int_case:nnF { \__siunitx_list_count:n {#1} } { { 0 } { } { 1 } { \__siunitx_list_use_auxi:nw {#2} #1 ; ; { } } { 2 } { \__siunitx_list_use_auxi:nw {#2} #1 ; {#3} } } { \__siunitx_list_use_auxii:nnw {#2} { } #1 ; \q_mark ; { \__siunitx_list_use_auxii:nnw {#2} {#4} } \q_mark ; { \__siunitx_list_use_auxiii:nnw {#2} {#5} } \q_stop { } } } \cs_new:Npn \__siunitx_list_use_auxi:nw #1#2 ; #3 ; #4 { #2 #1 #4 #3 \tl_if_blank:nF {#3} {#1} } \cs_new:Npn \__siunitx_list_use_auxii:nnw #1#2#3 ; #4 ; #5 ; #6 \q_mark ; #7#8 \q_stop #9 { #7 {#4} ; {#5} ; #6 \q_mark ; {#7} #8 \q_stop { #9 #2 #3 #1 } } \cs_new:Npn \__siunitx_list_use_auxiii:nnw #1#2#3 ; #4 \q_stop #5 { #5 #2 #3 #1 } \cs_new:Npx \__siunitx_list_count:n #1 { \exp_not:N \int_eval:n { 0 \exp_not:N \__siunitx_list_count:w \c_space_tl #1 \exp_not:n { ; \q_recursion_tail ; \q_recursion_stop } } } \cs_new:Npx \__siunitx_list_count:w #1 ; { \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1} \exp_not:N \tl_if_blank:nF {#1} { + 1 } \exp_not:N \__siunitx_list_count:w \c_space_tl } \NewDocumentCommand \DeclareBinaryPrefix { +m m m } { \siunitx_declare_prefix:Nn #1 {#2} } \NewDocumentCommand \DeclareSIPrePower { +m m } { \siunitx_declare_power:NNn #1 \__siunitx_tmp:w {#2} \seq_remove_all:Nn \l_siunitx_unit_symbolic_seq { \__siunitx_tmp:w } } \NewDocumentCommand \DeclareSIPostPower { +m m } { \siunitx_declare_power:NNn \__siunitx_tmp:w #1 {#2} \seq_remove_all:Nn \l_siunitx_unit_symbolic_seq { \__siunitx_tmp:w } } \NewDocumentCommand \si { O { } m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \siunitx_unit_format:nN {#2} \l__siunitx_tmp_tl \siunitx_print_unit:V \l__siunitx_tmp_tl \group_end: } \NewDocumentCommand \SI { O { } m o m } { \mode_leave_vertical: \group_begin: \keys_set:nn { siunitx } {#1} \IfNoValueF {#3} { \siunitx_unit_format:nN {#3} \l__siunitx_tmp_tl \siunitx_print_unit:V \l__siunitx_tmp_tl \nobreak } \siunitx_quantity:nn {#2} {#4} \group_end: } \NewDocumentCommand \SIlist { O { } > { \SplitList { ; } } m > { \TrimSpaces } m } { \mode_leave_vertical: \group_begin: \siunitx_unit_options_apply:n {#3} \keys_set:nn { siunitx } {#1} \siunitx_quantity_list:nn {#2} {#3} \group_end: } \NewDocumentCommand \SIrange { O { } m m > { \TrimSpaces } m } { \mode_leave_vertical: \group_begin: \siunitx_unit_options_apply:n {#4} \keys_set:nn { siunitx } {#1} \siunitx_quantity_range:nnn {#2} {#3} {#4} \group_end: } \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { \cs_new:Npn \__siunitx_emulation_non_latin:n #1 { \char_generate:nn {#1} { \char_value_catcode:n {#1} } } } { \cs_new:Npn \__siunitx_emulation_non_latin:n #1 { \exp_last_unbraced:Nf \__siunitx_emulation_non_latin:nnnn { \char_to_utfviii_bytes:n {#1} } } \cs_new:Npn \__siunitx_emulation_non_latin:nnnn #1#2#3#4 { \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \char_generate:nn {#1} { 13 } \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \char_generate:nn {#2} { 13 } } } \AtBeginDocument { \cs_new_protected:Npn \SIUnitSymbolArcminute { \ensuremath { { } ' } } \cs_new_protected:Npn \SIUnitSymbolArcsecond { \ensuremath { { } '' } } \@ifpackageloaded { fontspec } { \cs_new_protected:Npx \SIUnitSymbolAngstrom { \__siunitx_emulation_non_latin:n { "00C5 } } \cs_new_protected:Npx \SIUnitSymbolDegree { \__siunitx_emulation_non_latin:n { "00B0 } } \cs_new_protected:Npx \SIUnitSymbolCelsius { \__siunitx_emulation_non_latin:n { "00B0 } C } } { \cs_new_protected:Npx \SIUnitSymbolAngstrom { \siunitx_print_text:n { \__siunitx_emulation_non_latin:n { "00C5 } } } \cs_new_protected:Npx \SIUnitSymbolCelsius { \siunitx_print_text:n { \__siunitx_emulation_non_latin:n { "00B0 } } C } \cs_new_protected:Npx \SIUnitSymbolDegree { \siunitx_print_text:n { \__siunitx_emulation_non_latin:n { "00B0 } } } } \cs_new_protected:Npx \SIUnitSymbolMicro { \siunitx_print_text:n { \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { \__siunitx_emulation_non_latin:n { "00B5 } } { \exp_not:N \textmu } } } \cs_new_protected:Npx \SIUnitSymbolOhm { \exp_not:N \ifmmode \cs_if_exist:NTF \upOmega { \exp_not:N \upOmega } { \exp_not:N \Omega } \exp_not:N \else \siunitx_print_text:n { \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } { \__siunitx_emulation_non_latin:n { "03A9 } } { \exp_not:N \textohm } } \exp_not:N \fi } } \siunitx_declare_unit:Nn \celsius { \degreeCelsius } \msg_new:nnn { siunitx } { unit-deprecated } { Unit~macro~#1~has~been~deprecated~in~this~release. \\ \\ The~BIPM~have~removed~this~unit~from~the~SI~Brochure.~ You~should~define~it~yourself~using~\token_to_str:N \DeclareSIUnit\ % in~your~source.~The~current~definition~is\\ \\ \token_to_str:N \DeclareSIUnit #1 \{ #2 \} } \cs_gset_protected:Npn \__siunitx_emulation_tmp:w #1#2 { \quark_if_recursion_tail_stop:N #1 \bool_new:c { g__siunitx_emulation_unit_warning_ \token_to_str:N #1 _bool } \siunitx_declare_unit:Nx #1 { \exp_not:N \bool_if:NF \exp_not:c { g__siunitx_emulation_unit_warning_ \token_to_str:N #1 _bool } { \exp_not:N \bool_gset_true:N \exp_not:c { g__siunitx_emulation_unit_warning_ \token_to_str:N #1 _bool } \msg_warning:nnnn { siunitx } { unit-deprecated } { \token_to_str:N #1 } {#2} } #2 } \__siunitx_emulation_tmp:w } \__siunitx_emulation_tmp:w \atomicmassunit { u } \bar { bar } \barn { b } \bohr { \exp_not:N \text { \exp_not:N \ensuremath { a } } \char_generate:nn { `\_ } { 8 } { 0 } } \clight { \exp_not:N \text { \exp_not:N \ensuremath { c } } \char_generate:nn { `\_ } { 8 } { 0 } } \electronmass { \exp_not:N \text { \exp_not:N \ensuremath { m } } \char_generate:nn { `\_ } { 8 } { \exp_not:N \mathrm { e } } } \elementarycharge { \text { \ensuremath { e } } } \hartree { \exp_not:N \text { \exp_not:N \ensuremath { E } } \char_generate:nn { `\_ } { 8 } { \exp_not:N \mathrm { h } } } \knot { kn } \mmHg { mmHg } \nauticalmile { M } \planckbar { \exp_not:N \text { \exp_not:N \ensuremath { \exp_not:N \hbar } } } \q_recursion_tail { } \q_recursion_stop \@ifpackageloaded { fontspec } { \__siunitx_emulation_tmp:w \angstrom { \__siunitx_emulation_non_latin:n { "00C5 } } } { \__siunitx_emulation_tmp:w \angstrom { \exp_not:N \text { \__siunitx_emulation_non_latin:n { "00C5 } } } } \q_recursion_tail { } \q_recursion_stop \NewDocumentCommand \SendSettingsToPgf { } { \use:x { \exp_not:N \pgfqkeys { /pgf/number~format } { \str_if_eq:VnT \l__siunitx_number_round_mode_tl { figures } { fixed , fixed~zerofill = true , } precision = \int_use:N \l__siunitx_number_round_precision_int , set~decimal~separator = \str_if_eq:VnTF \l_siunitx_number_output_decimal_tl { , } { \exp_not:N \mathord } { \use:n } { \exp_not:V \l_siunitx_number_output_decimal_tl } , set~thousands~separator = set~decimal~separator = \str_if_eq:VnTF \l__siunitx_number_group_separator_tl { , } { \exp_not:N \mathord } { \use:n } { \exp_not:V \l__siunitx_number_group_separator_tl } , min~exponent~for~1000~sep = \int_eval:n { \l__siunitx_number_group_minimum_int - 1 } , \bool_lazy_or:nnF { \l__siunitx_number_group_decimal_bool } { \l__siunitx_number_group_integer_bool } { min~exponent~for~1000~sep = 999 , } showpos = \bool_if:NTF \l__siunitx_number_implicit_plus_bool { true } { false } } } } %% Copyright (C) 2008-2021 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: %% %% https://www.latex-project.org/lppl.txt %% %% This work is "maintained" (as per LPPL maintenance status) by %% Joseph Wright. %% %% This work consists of the files siunitx.dtx, %% siunitx.ins, %% siunitx.tex, %% siunitx-abbreviations.cfg, %% siunitx-abbreviation.dtx, %% siunitx-angle.dtx, %% siunitx-binary.cfg, %% siunitx-binary.dtx, %% siunitx-code.tex, %% siunitx-command.dtx, %% siunix-complex.dtx, %% siunitx-compound.dtx, %% siunitx-emulation.dtx, %% siunitx-locale.dtx, %% siunitx-number.dtx, %% siunitx-print.dtx, %% siunitx-quantity.dtx, %% siunitx-symbol.dtx, %% siunitx-table.dtx, %% siunitx-unit.dtx, %% siunitx-v2.sty and %% siunitx-version-1.cfg, %% and the derived files siunitx.pdf, %% siunitx.sty and %% siunitx-code.pdf. %% %% %% End of file `siunitx.sty'.