在 siunitx 中,将 \mile\per\hour 识别为 mph

在 siunitx 中,将 \mile\per\hour 识别为 mph

假设我正在使用siunitxper-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}

在此处输入图片描述

相关内容