修复宏以实现 siunitx 向后兼容

修复宏以实现 siunitx 向后兼容

我遇到了下面的代码错误(包含在已加载的.sty文件中;包已预先适当加载),这是我尝试确保的一部分siunitx3兼容旧代码,同时保持与版本 2 的向后兼容性。

\expandafter\edef\csname SIUnitXUnitSepParamNameV2\endcsname{number-unit-product}
\expandafter\edef\csname SIUnitXUnitSepParamNameV3\endcsname{quantity-product}

\edef\SIUnitXUnitSepParamName{\csname SIUnitXUnitSepParamNameV3\endcsname}
%
\@ifpackagelater{siunitx}{2021/05/17} {  % main release of 3.0.0
    % already set, as default, above
}{
    \edef\SIUnitXUnitSepParamName{\csname SIUnitXUnitSepParamNameV2\endcsname}
}

我稍后尝试使用它,如下所示:

\expandafter\expandafter\expandafter\DeclareSIUnit[\expandafter\SIUnitXUnitSepParamName = \;]\basepair{bp}
       
    
\expandafter\expandafter\expandafter\DeclareSIUnit[\expandafter\SIUnitXUnitSepParamName = \;]\kilobasepair{\kilo\basepair}

我意识到我的宏替换有错误,但迄今为止我尝试解决它都没有成功。(我收到各种错误,相当于说我的SIUnitXUnitSepParamName定义无效,因为扩展不正确。)

有人能善意指出我的错误吗?最好能提供一个使用 LaTeX 3 语法的修正版本,或者改进版本?对于这些特定\SI定义的反馈或改进也非常欢迎。

答案1

正确的\expandaftery 应为:

  \expandafter\DeclareSIUnit\expandafter[\SIUnitXUnitSepParamName = \;]\basepair{bp}
% 1           2             3           45

(记住,每个\expandafter都会跳过一个标记并扩展下一个,因此上面的 1 会跳过 2 并扩展 3,而 3 会跳过 4 并扩展 5)。

但是如果你使用的是版本 2,则可以将密钥定义quantity-product为密钥的别名number-unit-product

\@ifpackagelater{siunitx}{2021/05/17}
  { }
  {
    \keys_define:nn { siunitx }
      { quantity-product .meta:n = { number-unit-product = {#1} } }
  }

那么您就可以quantity-product无条件使用。

工作示例:

\documentclass{article}

\usepackage{siunitx}
\ExplSyntaxOn
\makeatletter
\@ifpackagelater{siunitx}{2021/05/17}
  { }
  {
    \keys_define:nn { siunitx }
      { quantity-product .meta:n = { number-unit-product = {#1} } }
  }
\ExplSyntaxOff

\DeclareSIUnit[quantity-product = x]\basepair{bp}
\DeclareSIUnit[quantity-product = x]\kilobasepair{\kilo\basepair}

\begin{document}

\ifdefined\qty
  \qty{10}{\basepair}
\else
  \SI{10}{\basepair}
\fi

\end{document}

相关内容