我应该使用什么包来排版单位?

我应该使用什么包来排版单位?

我知道有几个与排版单元相关的软件包:

  • 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 有一个列表)。相比之下,SIunitsSIstyle都已贬值:仅修复错误。unitsunitsdef软件包已经多年没有更新了。

答案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 文档之外生成的)。

我知道这并不适合所有人,但写过很多科学文章并使用过多个单元包后,这就是我不断回想起的解决方案。它比尝试回忆无数选项的语法和键/值对更容易,更易读,而且我对输出有更好的控制。

相关内容