我知道有几个与排版单元相关的软件包:
unitsdef
units
,可以看作是unitsdef
SIunits
siunitx
,它是SIunits
- 也许还有其他?
cjwunits
比如hepunits
它们之间有什么区别?它们在数学模式下也能使用吗?更重要的是,我应该使用哪一个?
对于试图回答这个问题的人的建议:展示一些如何排版简单和复杂单元的示例。例如,尝试排版这些项目:
- 100 摄氏度
- 3 x 10^5 公里/秒
- 引力常数以 N m^2/kg^2 为单位
- 10 千赫 = 1 秒^{-4}
- sin(x) 米
我认为这些示例涵盖了编写科学文本时的大多数需求:简单测量(值+简单单位)、用科学计数法写成的数值、简单分数单位、复杂分数和平方单位、没有任何伴随值的单位、具有任意指数的单位以及任意数学代码(而不是简单值)。
答案1
作为作者siunitx
我对各种替代方案的相对优势有一些了解。单位需要做以下几件事:
- 单位的语义输入,因此
\kilo\metre
而不是km
:这允许特殊效果,例如“随时”重新格式化分数(有些人更喜欢使用文字输入,理想情况下也需要支持这一点)。 - 数字格式化,例如将数字分成几组。
- 正确呈现不常见的符号,例如微符号。
- 设置字体:许多指南要求单位采用直立罗马字体,没有粗体或斜体变化。
- 将数字和单位放在一起(不分隔空格)
已经编写了许多软件包来解决这个问题。例如,SIunits
擅长提供语义输入,而SIstyle
专注于正确排版,但将输入留给用户。另一方面,unitsdef
坚持只做单位,不担心其他方面。
该包的目的siunitx
是满足上述所有要求,并提供一种可以改变包行为的方法。因此,它使用一系列键值选项来改变输出的格式。这些选项可以应用于整个文档或单个输入。它还设计为在数学或文本模式下同样好地工作。我还非常小心地在文档中提供有关国际认可单位的最新建议siunitx
。
作为演示,使用siunitx
以下最新版本展示该软件包:
\documentclass{article}
\usepackage{siunitx}
\begin{document}
\begin{itemize}
\item \qty{100}{\degreeCelsius}
\item \qty{3e5}{\km\per\s} or \qty[per-mode = symbol]{3e5}{\km\per\s}
\item \unit{\newton\metre\squared\per\kilogram\squared} or
\unit[per-mode = symbol]{\newton\metre\squared\per\kilogram\squared}
\item \( \qty{10}{\kilo\hertz} = \qty{1}{\per\second\tothe{4}} \)
\item \qty[parse-numbers = false]{\sin(x)}{\metre}
\end{itemize}
\end{document}
如果使用,需要注意几点siunitx
。首先,它需要 e-TeX,这对一些出版商来说可能是一个问题(即使在它完成 10 多年后!)。其次,格式化确实需要一些时间。有一些设置可以关闭它,但手动操作最终总是会更快。然而,更清晰、更灵活的输入在我看来是值得的。
另一点是siunitx
正在开发中,包含错误修复和新功能(v3.1 有一个列表)。相比之下,SIunits
和SIstyle
都已贬值:仅修复错误。units
和unitsdef
软件包已经多年没有更新了。
答案2
这希尼奇软件包讨论了您列出的所有其他软件包,并指出它可以模拟所有这些软件包。我并没有广泛使用过它,但根据我的经验,它似乎运行良好,并且非常全面。快速浏览一下该手册,您应该可以找到与您列出的每个软件包相匹配的示例。
因此我认为简短的回答是:使用 siunitx。
答案3
我也推荐siunitx
。如你所知,它的作者在 TeX 社区非常活跃,并提供了出色的支持。
答案4
我发现单位包很麻烦。相反,可以考虑一个简单的解决方案,它可以覆盖大多数(如果不是全部)典型用例。
\newcommand{\unit}[1]{\,\mathrm{#1}}
\newcommand{\degC}{^\circ{\mathrm C}}
\newcommand{\tothe}[1]{\times 10^{#1}}
将这些命令放在序言中确实不如\usepackage
命令那么清晰,但经济和可读性我认为文本的准确性更高。以下是 MWE。
\documentclass{article}
\newcommand{\unit}[1]{\,\mathrm{#1}}
\newcommand{\degC}{^\circ{\mathrm C}}
\newcommand{\tothe}[1]{\times 10^{#1}}
\begin{document}
\begin{itemize}
\item $100\degC$
\item $3\tothe{5}\unit{km/s}$ or $3\tothe{5}\unit{km\,s^{-1}}$
\item $6\unit{N m^2 kg^{-2}}$ or $6\unit{N m^2/kg^2}$
\item $10\unit{kHz} = 1\unit{s^{-4}}$
\item $\sin(x)\unit{m}$
\item $16\unit{\mu W/m\,K}$ is different than $16\unit{\mu W/mK}$
\end{itemize}
\end{document}
这种方法有明显的缺点。(1)它不是语义化的。但我不需要在自己的文档中使用这个。我知道我想说什么,而且比使用包更经济。(参见 MWE 中的最后一个例子。语义方法可以透明地处理这个问题。)(2)它没有涵盖所有用例。但我想不出一个极端情况,如果需要,我可以在本地格式化它们或编辑命令;我不需要一个涵盖一切以牺牲简单性为代价。(3)它不能很好地处理裸单位(因为空间太小,即使你包含\ensuremath
在命令中)。但我认为在科学写作中不需要裸单位(除了在情节标签中,它们通常是在 LaTeX 文档之外生成的)。
我知道这并不适合所有人,但写过很多科学文章并使用过多个单元包后,这就是我不断回想起的解决方案。它比尝试回忆无数选项的语法和键/值对更容易,更易读,而且我对输出有更好的控制。