siunitx, II 中的符号和输出

siunitx, II 中的符号和输出

这是对“siunitx 中的符号和输出“。

考虑以下代码(图片来源:egreg):

\documentclass{article}

\usepackage{amsmath}
\usepackage[locale = DE]{siunitx}

\ExplSyntaxOn
\NewDocumentCommand\SIexpr{ O{,} m m }
 {
  \SIextension_siexpr:nnn { #1 } { #2 } { #3 }
 }

\cs_new_protected:Npn \SIextension_siexpr:nnn #1 #2 #3
 {
  \seq_set_split:Nnn \l_SIextension_siexpr_input_seq { #1 } { #2 }
  \seq_pop_left:NN \l_SIextension_siexpr_input_seq \l_SIextension_siexpr_first_tl
  \seq_clear:N \l_SIextension_siexpr_output_seq
  \seq_put_right:Nx \l_SIextension_siexpr_output_seq
   {
    \fp_compare:nTF { \l_SIextension_siexpr_first_tl > 0 }
      { \num { \l_SIextension_siexpr_first_tl } }
      { - \num { \tl_tail:V \l_SIextension_siexpr_first_tl } }
   }
  \seq_map_inline:Nn \l_SIextension_siexpr_input_seq
   {
    \seq_put_right:Nx \l_SIextension_siexpr_output_seq
     {
      \fp_compare:nTF { ##1 > 0 }
        { + \num { ##1 } }
        { - \num { \tl_tail:n { ##1 } } }
     }
   }

  \SI[parse-numbers=false]
   {
    \sisetup{parse-numbers}
    ( \seq_use:Nn \l_SIextension_siexpr_output_seq { } )
   }
   { #3 }
}
\ExplSyntaxOff

\begin{document}

\begin{align*}
  l
  &= \SI{-38.0}{\cm} + 2 \cdot \SI{26.2}{\cm} + \SI{32.6}{\cm}\\
  &= \SIexpr{-38.0, 52.4, 32.6}{\cm}\\
%  &= \SIexpr{-\frac{38.0}{1}, 52.4, 32.6}{\cm}\\
  &= \SI{47.0}{\cm}.
\end{align*}

\end{document}

输出

代码编译得很好,但假设我想要一个分数,就像在注释掉的表达式中一样,并且带有括号的自动缩放。

我如何实现这个目标?

更新

我尝试将一行代码从

( \seq_use:Nn \l_SIextension_siexpr_output_seq { } )

\left( \seq_use:Nn \l_SIextension_siexpr_output_seq { } \right)

为了获得缩放括号但没有运气;无论是否更改代码,当我尝试在里面使用分数时都会出现以下错误\SIexpr

! Undefined control sequence.
<argument> \LaTeX3 error: 
                           Erroneous variable \protect used!

答案1

\documentclass{scrartcl}

\usepackage{mathtools,mleftright}
\usepackage[locale = DE]{siunitx}

\ExplSyntaxOn
\NewDocumentCommand\SIexpr{ O{,} m m }
 {
  \SIextension_siexpr:nnn { #1 } { #2 } { #3 }
 }

\cs_new_protected:Npn \SIextension_siexpr:nnn #1 #2 #3
 {
  \seq_set_split:Nnn \l_SIextension_siexpr_input_seq { #1 } { #2 }
  \seq_pop_left:NN \l_SIextension_siexpr_input_seq \l_SIextension_siexpr_first_tl
  \seq_clear:N \l_SIextension_siexpr_output_seq
  \seq_put_right:Nx \l_SIextension_siexpr_output_seq
   {
    \fp_compare:nTF { \l_SIextension_siexpr_first_tl > 0 }
      { \num { \l_SIextension_siexpr_first_tl } }
      { - \num { \tl_tail:V \l_SIextension_siexpr_first_tl } }
   }
  \seq_map_inline:Nn \l_SIextension_siexpr_input_seq
   {
    \seq_put_right:Nx \l_SIextension_siexpr_output_seq
     {
      \fp_compare:nTF { ##1 > 0 }
        { + \num { ##1 } }
        { - \num { \tl_tail:n { ##1 } } }
     }
   }

  \SI[parse-numbers=false,quotient-mode=fraction]
   {
    \sisetup{parse-numbers}
    \mleft( \seq_use:Nn \l_SIextension_siexpr_output_seq { } \mright)
   }
   { #3 }
}
\ExplSyntaxOff

\begin{document}

\begin{align*}
  l &= \SI{-38.0}{\cm} + 2 \cdot \SI{26.2}{\cm} + \SI{32.6}{\cm} \\
    &= \SIexpr{-38.0, 52.4/12, 32.6}{\cm} \\
    &= \SI{47.0}{\cm}.
\end{align*}

\end{document}

没有给我任何错误。

我做了什么?我添加了选项quotient-mode=fraction\SI[…]以便您可以使用它/来获得分数。

顺便说一句,我会加载\usepackage{mleftright}并使用\mleft( … \mright)而不是\left( … \right)

在此处输入图片描述

相关内容