问题
我使用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{...}{...}
输入起来并不困难,并且可以清楚地将不同的东西区分开来。