siunitx' \SI 宏的包装器,用于自动拆分数字和单位

siunitx' \SI 宏的包装器,用于自动拆分数字和单位

问题

我使用siunitx-package 来排版数字和单位,并设置正确的间距等。有一个命令

\SI{<number>}{<unit>}

这样做会更容易,比如

\xSI{<number and unit>}

并让 LaTeX 自动拆分数字和单位并\SI{}{}内部调用。

\xSI{9.81m/s^2}  →  \SI{9.81}{m/s^2}
\xSI{1e-3m}      →  \SI{1e-3}{m}

我知道它expl3提供了一些正则表达式功能,但由于我只熟悉“常规” LaTeX,所以我不知道从哪里开始。

问题

我如何编写一个包装函数SI{}{}(使用expl3?)以便数字和单位部分自动分割?

答案1

找到科学格式数字的正则表达式这里

\documentclass{article}
\usepackage{siunitx,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\xSI}{ O{} m }
 {
  \ralfix_split:n { #2 }
  \ralfix_si:n { #1 }
 }

\seq_new:N \l__ralfix_pieces_seq
\cs_new_protected:Npn \ralfix_split:n #1
 {
  \regex_split:nnN
   {
    ( [ - + ]? [0-9]* [\.\,]? [0-9]+ ( [eE] [-+]? [0-9]+ )? )
    (.*)
   }
   { #1 }
   \l__ralfix_pieces_seq
 }
\cs_new_protected:Npn \ralfix_si:n #1
 {
  \use:x
   {
    \exp_not:n {\SI[#1]}
    {\seq_item:Nn \l__ralfix_pieces_seq {2}}
    {\seq_item:Nn \l__ralfix_pieces_seq {4}}
   }
 }
\ExplSyntaxOff
\begin{document}
\xSI{9.81m/s^2}

\xSI{1e-3m}

\xSI[output-decimal-marker={,}]{1,2e-33kV}
\end{document}

可以通过首先检查结果序列中项目编号 1 来改进该函数,如果未找到匹配项,则该项目将不为空。

这就是说,我建议你使用 \SI{...}{...} 输入起来并不困难,并且可以清楚地将不同的东西区分开来。

在此处输入图片描述

相关内容