这是对“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)
。