单位 (siunitx)

要正确排版像 “9.81 m/s²” 这样的量,需要遵守一些细节约定:单位用 直立(roman)体,数值和单位之间放 细空格,复合单位的乘积和商也要保持一致的间距。手动维护这些规则既麻烦又容易漂移。siunitx 包是标准工具,可以用一套一致规则自动排版数值、单位和量。本页整理当前版本(v3)的三个核心命令 \num\unit\qty,以及表格中按小数点对齐数字的 S 列,并说明它们与旧文档中仍会遇到的 v2 名称 \SI\si 有何不同。

为什么需要单位包

理工科记法遵循国际约定(ISO 80000-2 / JIS Z 8000-2,详见另页)。其中一个要点是 “单位符号用直立体排版”mkgs 不是变量,因此不应使用变量书体,即斜体。但在 LaTeX 数学模式中,英文字母默认是斜体,所以直接写 $kg$ 会让单位看起来像斜体 kg 的乘积。

第二个要点是 间距。数值和单位之间既不能紧贴,也不能空得太宽,而应放一个 细空格(相当于数学中的 \,):不是 9.81m,也不是 9.81 m。对于 m/s 这样的复合单位,还希望整篇文档统一处理除法的显示方式(斜杠还是负幂 s⁻¹),以及 kg·m 这样的乘积是否带中点。若逐处手写 \mathrm{m} 等,间距、幂和乘积的处理很容易前后不一致。

siunitx 会一次性接管这些工作:把单位排成直立体,在数值前后插入正确空距,并用一致规则处理乘积、商和幂。而且只改一处设置,就能切换整篇文档的显示方式。在导言区载入 \usepackage{siunitx} 即可使用。

排版数值:\num

\num{…} 是只格式化 数值本身 的命令。把数传给它后,它会自动处理分组、指数和符号,并以直立体排版。特别方便的是指数解析:它把 eEdD 识别为“×10 的幂”。因此 \num{1.234e5} 会排成 1.234 × 10⁵(不会原样输出 e5)。小数标记可接受 .,,必要时会在小数点前补 0

latex
\num{12345}      % → 12 345(桁区切りが入る / digit grouping)
\num{1.234e5}    % → 1.234 × 10^5
\num{0,1234}     % → 0.1234(カンマも小数点として解釈 / comma as decimal)
\num{.5}         % → 0.5(先頭に 0 を補う / leading zero added)
\num{3.45d-4}    % → 3.45 × 10^{-4}

在这些例子中,12345 会加入细分组空格成为 12 3451.234e5 变成 1.234 × 10⁵.5 变成 0.5。地区习惯(用逗号分组、用逗号作小数标记等)可用选项切换,但首先只需记住“数值不要裸写,而要交给 \num”。另外,要排版 数值的乘积,请使用专用的 \numproduct{1.2 x 3.4}(用 x 分隔各项);v3 中 \num 本身不会生成乘积。

排版单位:\unit

\unit{…} 是只排版 单位本身 的命令。输入有两种风格。一种是 literal(直接书写) 风格,像 \unit{kg.m/s^2} 那样直接输入单位符号。这里句点 . 表示单位之间的 乘积/ 表示 ^_ 表示 上标和下标。siunitx 会把它排成直立体并加入正确间距:\unit{kg.m/s^2} 会输出为 kg m/s²(kg 和 m 之间有细空格,s 上有上标 2)。

另一种是 interpreted(宏) 风格,用命令分别组合单位、前缀和幂,写法很像把单位名称读出来。下表列出基本构件。

命令含义输出
gram\gram / \metre / \second基本单位(SI 基本单位名称)g / m / s
kilo\kilo \milli \micro前缀(放在单位之前)k / m / µ
kilogram\kilogram预定义的带前缀单位kg
per\per把下一个单位放入分母… ⁻¹ 或 /…
squared\squared / \cubed把前一个单位平方 / 立方(后置)m² / m³
square\square / \cubic把后一个单位平方 / 立方(前置)m² / m³
latex
\unit{\kilo\gram\per\cubic\metre}   % → kg/m^3 (密度 / density)
\unit{\metre\per\second\squared}     % → m/s^2 (加速度 / acceleration)
\unit{\kilo\gram}                     % → kg
\unit{\kilogram}                      % → kg(定義済みの一語 / predefined)

对于带前缀的“kilogram”,无论把前缀和单位顺序写成 \kilo\gram,还是使用预定义单词 \kilogram,都会得到同样的 kg\cubic\metre 是前置形式的“立方米 m³”,\metre\per\second\squared 则用后置的 \squared 表示“米每二次方秒 m/s²”。\per 的显示方式(负幂 s⁻¹ 还是斜杠 /s)由下文的 per-mode 选项切换。

literal 风格和 interpreted 风格可以得到同样结果,但 interpreted(宏)风格有优势:幂、前缀以及乘积/商的外观可通过选项整体控制,也可以定义自己的新单位宏。literal 风格则适合快速写下简单单位。无论哪种方式,单位都会是直立体,间距也会正确。

数值和单位一起:\qty

在实际文档中,数值和单位几乎总是一起出现。\qty{…}{…} 第一个参数取数值,第二个参数取单位,并把二者作为一个整体排版。它相当于 \num\unit 的组合:数值部分完全按 \num 的写法,单位部分完全按 \unit 的写法。量值是“数值 × 单位”,两者之间的空格代表乘法;这个命令就是把这一思想具体化。

latex
重力加速度は \qty{9.81}{\metre\per\second\squared} である。
The acceleration of gravity is \qty{9.81}{\metre\per\second\squared}.

\qty{1.234e5}{\kilo\gram\per\cubic\metre}  % → 1.234 × 10^5 kg/m^3
\qty{2.998e8}{m/s}                          % リテラル単位もそのまま使える

在这个例子中,9.81 后面放一个细空格,接着是直立的 m/s²,因此 “9.81 m/s²” 会作为一个完整的量排版。像 \qty{1.234e5}{…} 这样,带指数的数值也可以直接传入。单位部分既可以是宏(\metre\per\second\squared),也可以是 literal(m/s)。

\per 的显示方式由 per-mode 选项选择:默认是负幂(m s⁻¹),per-mode=symbol 给出斜杠(m/s),per-mode=fraction 则构造上下排列的分数(分子在上、分母在下)。选项可以在每个命令的方括号中单独给出,也可以在导言区用 \sisetup{…} 应用于整个文档。

latex
\qty{1.99}{\per\kilogram}                 % 既定 → 1.99 kg^{-1}
\qty[per-mode = symbol]{1.99}{\per\kilogram}    % → 1.99 /kg
\qty[per-mode = fraction]{1.345}{\coulomb\per\mole}  % → 縦組みの分数 C/mol

% 文書全体に方針を適用 / set a policy document-wide
\sisetup{per-mode = symbol}

角度有专用的 \ang{…}\ang{45} 输出 45°;也可以用分号分隔度、分、秒的“弧度格式”,\ang{45;30;15} 会排成 45°30′15″。弧度格式中的成分可留空:\ang{;;1} 只输出秒,\ang{+10;;} 只输出度(带显式符号)。角度不使用 SI 前缀,因此应使用这个专用命令,而不是 \qty

v2 与 v3:\SI / \si 是旧名称

上面的 \num\unit\qtysiunitx 版本 3 的核心命令。在旧文档和网页回答中,你会看到 版本 2 的命令。对应关系如下。

v2(旧名称)v3(当前)作用
SI\SI{9.81}{\metre\per\second\squared}\qty{9.81}{...}数值 + 单位
si\si{\kilo\gram}\unit{\kilo\gram}仅单位
num\num{1.234e5}\num{1.234e5}(不变)仅数值
SIrange\SIrange{10}{20}{\metre}\qtyrange{10}{20}{\metre}范围(10 m 到 20 m)
SIlist\SIlist{10;20;30}{\metre}\qtylist{10;20;30}{\metre}列表(10 m, 20 m, 30 m)

官方手册说明,v3 将文档命令名称改得“更具描述性”,并指出 \SI\si\SIrange\SIlist 仍可使用,但不推荐用于新文档(应改用 \qty… 系列)\num 这个名称在 v2 和 v3 中没有变化。如果目标是编译旧文档,可以用 \usepackage{siunitx}[=v2] 调用旧版行为;但 新写文档应使用 v3 的 \qty\unit\num

v3 还让输入稍微更严格。例如前缀不能单独使用(必须与单位一起),数值乘积要用专用命令 \numproduct,带单位量的乘积要用 \qtyproduct。很多情况下,旧选项名会在内部映射到新名称,并在日志中给出相应提示。

在表格中对齐数字:S

在数字表格中,如果各位没有对齐,阅读会很困难。siunitx 为 tabular 提供了 S 列类型:在列格式中用 S 代替 clr,该列中的数字就会 按小数点对齐。单元格内容由与 \num 相同的解析器处理,因此带指数的值(1.2e3)也能正确处理。

latex
\begin{tabular}{@{}S@{}}
  \toprule
  {Some Values} \\   % 見出しは波括弧で保護(数値と誤認させない)
  \midrule
      2.3456 \\
     34.2345 \\
     -6.7835 \\
   5642.5   \\
      1.2e3  \\
      e4     \\
  \bottomrule
\end{tabular}

在这个表中,各单元格的数值按小数点对齐,1.2e3 会排成 1.2 × 10³e4 会排成 10⁴有一个重要注意点:列标题等 文本必须用花括号 {…} 包住。若不用 {Some Values} 保护,siunitx 会尝试把它当作数值的一部分读取,导致对齐出错。

若要固定位数布局并按需要放置列,可用 table-format 选项告诉 siunitx “整数位数.小数位数”。S[table-format=2.4] 表示“2 位整数、4 位小数”,可稳定整列外观。若需要在 \multicolumn\multirow 内对齐数字,还有可替代 S 列的宏版本 \tablenum[table-format=…]{…}

latex
\begin{tabular}{@{}S[table-format=4.1]@{}}
  \toprule
  {Mass / \unit{\gram}} \\
  \midrule
  1234.5 \\
    12.0 \\
     6.7 \\
  \bottomrule
\end{tabular}

在这个例子中,列标题用 \unit{\gram} 以直立单位显示 “Mass / g”,同时数字按 4 位整数和 1 位小数对齐。使用 S 列时,可以分工明确:正文中的量用 \qty,表格中的数字用 S 列,从而在整篇文档中保持一致的数值样式。