我遇到了下面的代码错误(包含在已加载的.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
正确的\expandafter
y 应为:
\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}