假设我正在使用siunitx
,per-mode=fraction
并且我已将其声明\mile
为一个新单位(缩写为“mi”)。
有没有自动识别为特殊字符的方法,并在“h”上方输出“mph”而不是“mi”?如果有一种方法可以做到这一点,并且扩展到或不扩展到诸如或 之类的东西,\si{\mile\per\hour}
我会很好。\si{\per\hour\mile}
\si{\kilo\gram\mile\per\hour}
编辑 - -
例如,有没有办法将钩子宏插入到\SI{}{}
并\si{}
检查参数,如果是\mile\per\hour
,则将其换成单独定义的东西,比如\mph
?
答案1
正如前面提到的,没有内置功能可以做到这一点,处理奇数单位的“首选”方法是为特殊情况定义一个单位宏
\DeclareSIUnit{\mph}{mph}
或者使用“文字”输入
\si{mph}
没有可用于挑选“特殊情况”多部分单元的“钩子”,但我们可以通过重新定义内部函数来挑选它(注意:我正在研究 v3 siunitx
,因此这个名称可能会改变:但是在代码级别会有记录的接口)。
\documentclass{article}
\usepackage{siunitx}
\ExplSyntaxOn
\cs_new_eq:NN \__siunitx_saved_unit_in:nn \__siunitx_unit_in:nn
\cs_set_protected:Npn \__siunitx_unit_in:nn #1
{
\str_if_eq:nnTF {#1} { \mile \per \hour }
{ \__siunitx_saved_unit_in:nn { \mph } }
{ \__siunitx_saved_unit_in:nn {#1} }
}
\ExplSyntaxOff
\sisetup{per-mode=fraction}
\DeclareSIUnit\mile{mi}
\DeclareSIUnit{\mph}{mph}
\begin{document}
\si{\mile}
\si{\kilo\gram\mile\per\hour}
\si{\mile\per\hour}
\SI{10}{\mile\per\hour}
\SI{20}{\kilo\gram\mile\per\hour}
\end{document}
这里的想法是改变执行单元解析/格式化的函数,以便我们“预先”测试精确的输入\mile\per\hour
,如果找到,我们将其替换为\mph
,然后按正常方式处理。另一种方法是完全跳过解析器并硬编码mph
:
\cs_set_protected:Npn \__siunitx_unit_in:nn #1
{
\str_if_eq:nnTF {#1} { \mile \per \hour }
{ \tl_set:Nn \l__siunitx_unit_tl { mph } }
{ \__siunitx_saved_unit_in:nn {#1} }
}
答案2
这太难实现了。你想从中得到什么\mile\per\second
?从中得到什么\meter\per\hour
?看来你只想改变一个案例,为此,你应该定义它自己的单元。\DeclareSIUnit\mph{mph}
清晰易用,你以后仍然可以重新定义它。
% arara: pdflatex
\documentclass{article}
\usepackage{siunitx}
\sisetup{per-mode=fraction}
%\DeclareSIUnit{\mile}{mi} % if you want/need to change back
\DeclareSIUnit{\mph}{mph}
%\DeclareSIUnit{\mph}{\mile\per\hour} % if you want/need to change back
\begin{document}
\SI{42}{\mph}
\end{document}