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.]+
(假设您只有原始数字,这可能是这种情况);那么您就不需要问号了,它表示所谓的非贪婪运算符(使用尽可能少的字符而不是太多的字符)。
最后要说的是,虽然正则表达式乍一看似乎很可怕,但相信我,一旦你掌握了它们,你的生活就会变得更轻松。