siunitx:组合“\num”和“\SI”并改变参数的顺序

siunitx:组合“\num”和“\SI”并改变参数的顺序

我正在尝试组合\num\SI命令siunitx并更改参数的顺序。具体来说,我想要实现的是一个新的命令,\Zahl[siunitx-options]<pre-unit>{number}[measure]其中除了命令之外的所有内容number都是可选的。

下面的 MWE 通过复制siunitx内部代码实现了我的目的,这是一个馊主意。具体来说,我Npn根据\SI更改原始命令的顺序SI并进行\Zahl相应定义,创建了一个新的“jorg”。有没有更一致、更可靠的方法来实现相同的效果?

\documentclass{scrartcl}

\usepackage{siunitx,xparse,expl3}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\ExplSyntaxOn
% Create \Zahl based on siunitx' \num and \SI
%  The syntax is then \Zahl[siunitx-options]<pre-unit>{number}[measure]
\cs_new_protected:Npn \__siunitx_jorg:nnnn #1#2#3#4 {
  \IfNoValueTF {#2}
    { \tl_clear:N \l__siunitx_pre_unit_tl }
    {
      \group_begin:
        \__siunitx_unit_in:nn {#2} {#1}
        \cs_set_eq:NN \l__siunitx_pre_unit_tl \l__siunitx_unit_tl
      \exp_args:NNNo \group_end:
      \tl_set:Nn \l__siunitx_pre_unit_tl { \l__siunitx_unit_tl }
    }
  \cs_set_eq:NN \l__siunitx_brackets_bool
    \l__siunitx_multi_brackets_bool
  \__siunitx_combined_unit:nnn {#3} {#4} {#1}
  \__siunitx_combined_output:n {#3}
}

\NewDocumentCommand\Zahl{o D<>{} m O{}}%
 {
  \leavevmode
  \group_begin:
    \IfNoValueTF {#1}
      { \__siunitx_jorg:nnnn { } {#2} {#3} {#4} }
      {
        \keys_set:nn { siunitx } {#1}
        \__siunitx_jorg:nnnn {#1} {#2} {#3} {#4}
      }
  \group_end:
}
\ExplSyntaxOff

\DeclareSIUnit\%{\char37}



\begin{document}

\Zahl{200}

\Zahl{200}[\percent]

\Zahl<£>{200}

\Zahl<£>{200}[\percent]

\Zahl[round-mode=figures,round-precision=3]<£>{200.7}[\percent]

\end{document}

答案1

您不需要在这里使用中继功能,因为部分要点是xparse代码级功能应该“仅使用”正确数量的强制参数即可。

\documentclass{article}
\usepackage{siunitx}
\ExplSyntaxOn
\NewDocumentCommand \Zahl {o D<>{} m O{}}
  {
    \leavevmode
    \group_begin:
      \IfNoValueTF {#1}
        { \__siunitx_combined:nnnn { } {#3} {#2} {#4} }
        {
          \keys_set:nn { siunitx } {#1}
          \__siunitx_combined:nnnn {#1} {#3} {#2} {#4}
        }
    \group_end:
  }
\ExplSyntaxOff
\begin{document}

\Zahl{200}

\Zahl{200}[\percent]

\Zahl<\pounds>{200}

\Zahl<\pounds>{200}[\percent]

\Zahl[round-mode=figures,round-precision=3]<\pounds>{200.7}[\percent]

\end{document}

从界面的角度来看,有几个原因让我不太喜欢这个想法

  • 尾随可选参数在 LaTeX2e 中并不常见(某些通用文档命令除外)
  • 我选择分离\num\SI有原因的 :-)(“数字”和“数量”的概念是不同的。)

从编码角度来看

  • 没有适当记录的代码级接口siunitx(我的错!)

但是,它应该已经足够好了。我目前不打算改变内部接口,如果我要改变的话,我会提供一个有文档的代码级接口。

相关内容