我正在尝试组合\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
(我的错!)
但是,它应该已经足够好了。我目前不打算改变内部接口,如果我要改变的话,我会提供一个有文档的代码级接口。