如何将大文档从units-package切换到siunitx?

如何将大文档从units-package切换到siunitx?

units由于历史原因,我在论文中一直使用该包来排版带单位的数字或带单位的\usepackage[tight]{units}

对于表格列中的数字格式,我已经使用该siunitx包,并且我还想将其用于带单位和单位的数字。但是在大型文档(>300 页)中,我无法\unit[]{}手动替换所有(>500)出现的命令。

用新命令替换旧命令的良好策略是什么?

\unit[我认为用来替换是不够的\SI[,或者可选参数和参数的“语法”对于两个命令是否“兼容”?

答案1

units包很容易合理地模拟。我建议使用 LaTeX3\DeclareDocumentCommand宏:

\documentclass{article}
%\usepackage{units}
\usepackage{siunitx}
\sisetup{detect-weight, per-mode = fraction}
\DeclareDocumentCommand\unit{om}{%
  \IfNoValueTF{#1}{\si{#2}}{\SI{#1}{#2}}%
}
\begin{document}
\unit{m}
\unit[10]{m}
\end{document}

答案2

由于语法单位\unit[<value>]{<unit>},必须使用两个不同的命令希尼奇

\makeatletter
\let\unit\relax % to "undefine" it
\DeclareRobustCommand{\unit}{\@ifnextchar[\my@si\si}
\def\my@si[#1]#2{\SI{#1}{#2}}
\makeatother

或者

\makeatletter
\let\unit\relax % to "undefine" it
\DeclareRobustCommand{\unit}[2][]{%
   \if\relax\detokenize{#1}\relax % check if optional argument is empty
     % no value
     \si{#2}%
   \else
     % value is given
     \SI{#1}{#2}
   \fi}
 \makeatother

答案3

我肯定会使用正则表达式来实现。这样你就不用使用宏技巧(这并不总是人们想要的),而且——作为额外的奖励——你会学会使用一个强大的工具。

在 Emacs 中(这很重要,因为 emacs、perl 等的正则表达式有时略有不同)我会使用以下转换(使用query-replace-regexp):

\\unit\[\(.+?\)\]{\(.+?\)}    ->    \\SI{\1}{\2}

\\unit{\(.+?\)}    ->    \\si{\1}

这假设]可选参数中没有 ,}强制参数中也没有 ;如果您有嵌套构造等,则必须:

  • 使用 egreg 的方法;
  • 设计一个更聪明的正则表达式来自动完成它;
  • (我最喜欢的)首先创建一个正则表达式来寻找此类情况会自动发生,正确的手动进行这些操作(当然,假设这种情况很少见)。

.+?请注意,在第一个正则表达式中,您可以使用更具体的内容来代替,例如[0-9.]+(假设您只有原始数字,这可能是这种情况);那么您就不需要问号了,它表示所谓的非贪婪运算符(使用尽可能少的字符而不是太多的字符)。

最后要说的是,虽然正则表达式乍一看似乎很可怕,但相信我,一旦你掌握了它们,你的生活就会变得更轻松。

相关内容