要正确排版像 “9.81 m/s²” 这样的量,需要遵守一些细节约定:单位用 直立(roman)体,数值和单位之间放 细空格,复合单位的乘积和商也要保持一致的间距。手动维护这些规则既麻烦又容易漂移。siunitx 包是标准工具,可以用一套一致规则自动排版数值、单位和量。本页整理当前版本(v3)的三个核心命令 \num、\unit、\qty,以及表格中按小数点对齐数字的 S 列,并说明它们与旧文档中仍会遇到的 v2 名称 \SI、\si 有何不同。
为什么需要单位包
理工科记法遵循国际约定(ISO 80000-2 / JIS Z 8000-2,详见另页)。其中一个要点是 “单位符号用直立体排版”。m、kg、s 不是变量,因此不应使用变量书体,即斜体。但在 LaTeX 数学模式中,英文字母默认是斜体,所以直接写 $kg$ 会让单位看起来像斜体 k 和 g 的乘积。
第二个要点是 间距。数值和单位之间既不能紧贴,也不能空得太宽,而应放一个 细空格(相当于数学中的 \,):不是 9.81m,也不是 9.81 m。对于 m/s 这样的复合单位,还希望整篇文档统一处理除法的显示方式(斜杠还是负幂 s⁻¹),以及 kg·m 这样的乘积是否带中点。若逐处手写 \mathrm{m} 等,间距、幂和乘积的处理很容易前后不一致。
siunitx 会一次性接管这些工作:把单位排成直立体,在数值前后插入正确空距,并用一致规则处理乘积、商和幂。而且只改一处设置,就能切换整篇文档的显示方式。在导言区载入 \usepackage{siunitx} 即可使用。
排版数值:\num
\num{…} 是只格式化 数值本身 的命令。把数传给它后,它会自动处理分组、指数和符号,并以直立体排版。特别方便的是指数解析:它把 e、E、d、D 识别为“×10 的幂”。因此 \num{1.234e5} 会排成 1.234 × 10⁵(不会原样输出 e5)。小数标记可接受 . 或 ,,必要时会在小数点前补 0。
\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 345,1.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³ |
\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 的写法。量值是“数值 × 单位”,两者之间的空格代表乘法;这个命令就是把这一思想具体化。
重力加速度は \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{…} 应用于整个文档。
\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、\qty 是 siunitx 版本 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 代替 c、l 或 r,该列中的数字就会 按小数点对齐。单元格内容由与 \num 相同的解析器处理,因此带指数的值(1.2e3)也能正确处理。
\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=…]{…}。
\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 列,从而在整篇文档中保持一致的数值样式。