単位(siunitx)

「9.81 m/s²」の数字と単位のあいだにある空白は、見た目を整えるためのものではありません。国際度量衡総会が発行する SI 文書はこの空白を 掛け算の記号 だと明言しており、だからこそ量は一つのまとまりであって行末で切り離してはならない——LaTeX でこの種の規則をまとめて引き受けるのが siunitx パッケージです。このページでは現行 v3 の三本柱 \num\unit\qty を追いながら、単位がなぜ立体で組まれるのか、桁区切りがなぜコンマではなく空きなのか、表の小数点をそろえる S 列の使い方、そして古い記事に出てくる \SI\si をどう読み替えるかまでを見ていきます。

\mathrm{kg} と手書きしてはいけない理由

手書きが破綻するのは、守るべきことが好みではなく 国際規格 で、しかも三つの規則が同時に効いているからです。一つ目は書体。SI 文書は、単位記号を「周囲の書体にかかわらず立体(ローマン体)で組む」と定めています。mkgs は変数ではないからです。ところが LaTeX の数式モードでは英字が既定で斜体になるので、$9.81 kg$ と素で書くと、単位が斜体の kg の積のように見えてしまいます。\mathrm{kg} と書けば直りますが、直すべき箇所は一つの論文に何十とあります。

二つ目は空きです。SI 文書 §5.4.3 は「数値はつねに単位に先行し、両者を分けるためにつねに空白を用いる」とし、さらに この空白は掛け算の記号とみなされる と説明します。9.81kg9.81 kg も規格違反です。そして規格が唯一の例外として挙げるのが、平面角の度・分・秒(°)——ここだけは空きを入れません。だから同じ段落のなかに 30.2 °C(セ氏温度は空きあり)と 22.20°(角度は空きなし)が同居します。文書には「° の前に空きを入れる/入れない」が両方出てくるわけで、この区別を数百箇所で手作業のまま維持するのは、率直に言って無理があります。

三つ目は「切れないこと」です。量が数値と単位の積である以上、行末で 9.81 だけが残り、次の行に m/s² が送られる——という組みかたは許されません。siunitx は既定でこの分割を禁じており、どうしても許したいときだけ allow-quantity-breaks を有効にします。狭い段組で underfull hbox の警告が出たら、それは事故ではなく規則が守られている証拠です。以上の三つは、プリアンブルに \usepackage{siunitx} を一行足せばまとめて片づきます。設定を一か所で変えれば文書全体の見せ方が変わる、という副産物も付いてきます。

latex
\usepackage{siunitx}

% by hand: three separate things to remember, every time
$9.81\,\mathrm{m}\,\mathrm{s}^{-2}$

% with siunitx: one command, and the standard is applied for you
\qty{9.81}{\metre\per\second\squared}
\qty{100}{\degreeCelsius}   % 100 °C   - space kept before the degree
\qty{10}{\percent}          % 10 %     - space here too
\ang{22.20}                 % 22.20°   - but no space for a plane angle

\num — 裸の数字に起きること

\num{…} は数値だけを受け取り、桁区切り・指数・符号・先頭の 0 を規格どおりに整えます。\num{12345}12 345\num{1.234e5}1.234 × 10⁵\num{.5}0.5 になります。三つ目が地味に効きます——SI 文書は「数が +1 と −1 のあいだにあるとき、小数点の前にはつねに 0 を置く」と定めており、.234 ではなく 0.234 と書くべきだからです。原稿では .5 と打っておいて、出力で 0.5 にしてもらえる、というのは思ったより手数を減らします。

桁区切りが コンマではなく空き なのは、パッケージ作者の趣味ではありません。1948 年の第 9 回国際度量衡総会 決議 7 が「数は読みやすさのために 3 桁ずつの組に分けてよい。組と組のあいだの空きには、点もコンマも決して入れない」と決めたからです。同じ決議は小数点について「コンマ(フランスの慣行)またはピリオド(イギリスの慣行)」という、いま読むとやや微笑ましい書き方をしています。規格どおりなら 43 279.168 29、規格違反なら 43,279.168,29。siunitx の group-separator の既定値は、まさにその細い空き \, です。

入力側はむしろ寛容です。input-decimal-markers の既定は ., の二つなので、\num{0,1234} と書いても \num{0.1234} と書いても同じ結果になります。指数の目印 input-exponent-markers の既定は dDeE の四つで、Fortran 由来の 3.45d-4 もそのまま 3.45 × 10⁻⁴ として読まれます。つまり、CSV や計測器の吐き出したログから貼り付けた数値を、書式をそろえないまま投げ込んでよい、ということです。数値どうしの積だけは \num の仕事ではなく、v3 では専用の \numproduct{1.2 x 3.4}(区切りは x)を使います——これも規格に沿った分業で、SI 文書は「数どうしを掛けるときは掛け算記号 × だけを用いる」と定めています。

latex
\num{12345}        % 12 345      - grouped with a thin space, never a comma
\num{43279.16829}  % 43 279.168 29
\num{1.234e5}      % 1.234 x 10^5
\num{3.45d-4}      % 3.45 x 10^-4  - Fortran-style d also works
\num{0,1234}       % 0.1234       - comma accepted on input
\num{.5}           % 0.5          - leading zero supplied
\num{-15673}       % -15 673
\numproduct{1.2 x 3.4}   % 1.2 x 3.4   - products need their own command

小数点はピリオドかコンマか — localeoutput-decimal-marker

どちらも正しい、というのが規格の答えです。2003 年の第 22 回国際度量衡総会 決議 10 は、小数点を「行上の点、または行上のコンマ」のいずれかとし、「当該の言語と文脈で慣用されているほうを選ぶ」 と定めました。つまりドイツ語・フランス語・スペイン語の文書で 9,81 m/s² と組むのは、英語の文書で 9.81 m/s² と組むのとまったく同じ資格で正しい。どちらかが「本物」でどちらかが「訛り」なのではありません。siunitx の設計はここに正直で、入力の書式と出力の書式を切り離しています。

切り替えかたは二通りあります。細かく指定するなら、出力の小数点は output-decimal-marker、桁区切りは group-separator を個別に設定します。地域ごとまとめて切り替えるなら locale オプションで、パッケージには UK・US・DE(ドイツ)・PL(ポーランド)・FR(フランス)・SI(スロベニア)・ZA(南アフリカ)の設定が同梱されています。要点は入力を書き換えなくてよいことで、\qty[locale = DE]{6.789}{\metre} はソースをピリオドのまま保ちつつ 6,789 m を出力します。同じ原稿を英語版と独語版で出し分ける、という使い方ができます。

同梱されていない地域——スペイン語圏やイタリア語圏など——は locale では指定できないので、\sisetup{output-decimal-marker = {,}} のように自分で書きます。ここで踏みやすい落とし穴が一つ。小数点をコンマにしたうえで、桁区切りにもコンマを指定してしまう ことです。group-separator = {,}output-decimal-marker = {,} を両方書くと \num{12345.678}12,345,678 になり、どこが小数点でどこが区切りなのか読み手には判別できません。1948 年の決議が「組と組のあいだに点もコンマも入れない」とわざわざ書いた理由が、ここで身をもって分かります。桁区切りは既定の細い空きのままにしておくのが安全です。

latex
\qty[locale = DE]{6.789}{\metre}       % 6,789 m   - source keeps the point
\num[output-decimal-marker = {,}]{1.23}  % 1,23
\num[group-separator = {,}]{12345}       % 12,345    - US/UK habit, not SI

% document-wide, for a locale siunitx does not ship
\sisetup{output-decimal-marker = {,}}    % group-separator stays a thin space

% do NOT do this: the output 12,345,678 is unreadable
% \sisetup{output-decimal-marker = {,}, group-separator = {,}}

\unit — 単位の二つの書きかたと \per

\unit{…} は単位だけを組みます。書きかたは二つ。リテラル方式\unit{kg.m/s^2} のように記号をそのまま打つもので、ピリオド . が単位どうしの積、/ が商、^ が上付きになります。マクロ方式\unit{\kilo\gram\metre\per\second\squared} のように、接頭辞・単位・冪を一語ずつ組み立てるもので、英語で単位名を読み上げる感覚に近い書きかたです。実務の分かれ目ははっきりしていて、その場かぎりの単位を急いで書くならリテラル、文書全体の見せ方をあとから一括で切り替えたいならマクロを選びます。オプションが効くのはマクロ方式のほうだからです。

マクロ意味出力
\gram基本単位のマクロ。\metre \second \ampere \kelvin \mole \candela も同様g
\kilo接頭辞。単独では使えず、必ず単位が続くk
\kilogram接頭辞つきの単位を一語で。\kilo\gram と同じ結果kg
\per次に来る単位を分母へ。\joule\per\mole は…J mol⁻¹
\squared直前の単位を 2 乗(後置)。3 乗は \cubed
\square直後の単位を 2 乗(前置)。3 乗は \cubic
\degreeCelsiusセ氏温度。規格どおり前に空きが入る°C
\percent百分率。SI が認める記号で、やはり前に空きが入る%

\per の見た目は per-mode オプションが決めます。ここは古い解説記事がよく取り違えるところで、既定は負の冪 です。\unit{\metre\per\second\squared}m/s² ではなく m s⁻² と出ますし、\unit{\kilo\gram\per\cubic\metre}kg/m³ ではなく kg m⁻³ です。スラッシュにしたければ per-mode = symbol、分数として縦に組みたければ per-mode = fraction を指定します。プリアンブルで \sisetup{per-mode = symbol} と一度書いておけば、文書中のすべての単位がその方針に従います。

スラッシュを選んだとき、siunitx は黙って括弧を補います。SI 文書 §5.4.6 が「スラッシュで割るときは曖昧さを避けるために括弧を用いる。(a/b)/c はよいが a/b/c はいけない」と定めているからです。だから \unit[per-mode = symbol]{\joule\per\mole\per\kelvin}J/mol/K ではなく J/(mol K) を出力します。手書きなら「二つ目のスラッシュに気をつける」と覚えておくしかなかった規則が、構造として守られるわけです。マニュアルも、込み入った単位では負の冪のほうが望ましいと付け加えています——既定が per-mode = power なのは、そういう理由です。

latex
\unit{kg.m/s^2}                          % kg m/s^2   - literal input, slash kept
\unit{\kilo\gram\metre\per\second\squared}   % kg m s^-2  - default per-mode = power
\unit[per-mode = symbol]{\kilo\gram\per\cubic\metre}   % kg/m^3

\unit{\joule\per\mole\per\kelvin}                      % J mol^-1 K^-1
\unit[per-mode = symbol]{\joule\per\mole\per\kelvin}   % J/(mol K)  - brackets added

\sisetup{per-mode = symbol}   % one policy for the whole document

\qty で数値と単位をまとめる — 範囲・リスト・角度

\qty{数値}{単位} は、第一引数を \num に、第二引数を \unit に渡し、そのあいだに規格どおりの空きを置きます。だから新しい記法を覚える必要はありません——\num で書けたものと \unit で書けたものを、そのまま並べるだけです。単位部はマクロ(\metre\per\second\squared)でもリテラル(m/s)でもかまいません。冒頭で述べた「量は数値と単位の積」という考えを、そのままコマンドの形にしたのがこの \qty です。

範囲とリストにも専用の命令があります。目を引くのは \qtyrange{10}{20}{\metre} の出力で、これは 10–20 m ではなく 10 m to 20 m になります。これも規格由来です——SI 文書は「量をダッシュで結ぶと負の値と読み違えられうる。量は一つの数学的まとまりなので、値をダッシュで結んで単位を一つだけ付けるのも誤り。「to」という語を使うことを強く推奨する」と述べています。表の見出しなどで 10–20 m と書きたくなる場面は多いのですが、それは規格違反というわけです。\qtylist{10;20;30}{\metre}10 m, 20 m and 30 m を組みます。

角度だけは \qty ではなく \ang の担当です。前に触れたとおり \ang{45} は空きのない 45° を出し、セミコロン区切りで度・分・秒を渡すと \ang{45;30;15}45° 30′ 15″ になります。ただし常用すべきは前者のほうで、SI 文書は「平面角は度を小数で分割するほうが一般に望ましい。航海・地図作成・天文学、および非常に小さい角の測定といった分野を除き、22° 12′ より 22.20° と書くのが好ましい」としています。分・秒の記法は、必要な分野でだけ使う道具だと考えておくのが無難です。

latex
\qty{9.81}{\metre\per\second\squared}   % 9.81 m s^-2
\qty{1.234e5}{\kilo\gram\per\cubic\metre}  % 1.234 x 10^5 kg m^-3
\qty{2.998e8}{m/s}                       % literal units work here too

\qtyrange{10}{20}{\metre}    % 10 m to 20 m       - the word "to", not a dash
\qtylist{10;20;30}{\metre}   % 10 m, 20 m and 30 m

\ang{22.20}       % 22.20°     - decimal degrees are preferred
\ang{45;30;15}    % 45° 30' 15"  - degrees; minutes; seconds

不確かさを括弧で書く — \num{1.234(5)}

測定値には不確かさが付きものです。siunitx は入力中の丸括弧をそのまま不確かさとして読み、\num{1.234(5)}1.234(5) を組みます。この括弧記法は siunitx の発明ではなく、SI 文書 §5.4.5 が例として挙げているものです——中性子の質量を mₙ = 1.674 927 471(21) × 10⁻²⁷ kg と書くとき、括弧の中身は最後の桁に対する標準不確かさを表します。つまり \num(…) を渡すのは、規格が想定しているとおりの入力の書きかたなのです。

見せ方は uncertainty-mode で選びます。既定の compact は括弧の中身を末位の桁として出し(\num{123.45(120)}123.45(120))、full は不確かさを完全な値として出します(→ 123.45(1.20))。separate-uncertainty を有効にすると \pm で分けた 1.234 ± 0.005 の形になります。ここで気を配りたいのが単位の掛かりかたで、12.3 ± 0.4 kg と書くと ±0.4 のほうに単位が掛かっていないように読めてしまいます。siunitx はそれを承知していて、\qty[separate-uncertainty]{12.3(4)}{\kilogram} は自動的に括弧を補い (12.3 ± 0.4) kg を出力します。

latex
\num{1.234(5)}                              % 1.234(5)
\num{123.45(120)}                           % 123.45(120)  - compact, the default
\num[uncertainty-mode = full]{123.45(120)}  % 123.45(1.20)
\num[separate-uncertainty]{1.234(5)}        % 1.234 +- 0.005

\qty{12.3(4)}{\kilogram}                        % 12.3(4) kg
\qty[separate-uncertainty]{12.3(4)}{\kilogram}  % (12.3 +- 0.4) kg  - brackets added

表で小数点をそろえる — S 列と table-format

列指定で clr の代わりに S と書けば、その列の数値が小数点でそろいます。セルの中身は \num と同じパーサが読むので、1.2e31.2 × 10³ に、コンマで書かれた 975,31975.31 になります——CSV から流し込んだ列がそのまま整うということです。これも規格の要求に応えるための仕組みで、SI 文書は「表中の数では、一つの列のなかで書式を変えてはならない」と一文だけ、しかしはっきりと書いています。

最初につまずくのは、ほぼ必ず列見出しです。S 列のセルに文字を置くと、siunitx はそれを数値の一部として読もうとします。見出しは波括弧で {Mass} のように囲む ——これを忘れると、その行だけ整列が崩れます。単位や注記を含む見出しも同じで、{Mass / \unit{\gram}} のようにまるごと保護してください。列の幅を安定させるには table-format で「整数部の桁数.小数部の桁数」を宣言します。S[table-format = 4.1] は整数 4 桁・小数 1 桁ぶんの場所を先に確保するので、あとから行を足しても列の位置が動きません。不確かさ付きなら S[table-format = 2.2(1), separate-uncertainty]、指数付きなら S[table-format = 1.3e2] と書けます。

latex
\begin{tabular}{@{}cS[table-format = 4.1]@{}}
  \toprule
  Entry & {Mass / \unit{\gram}} \\   % braces protect the heading text
  \midrule
  1 & 1234.5 \\
  2 &   12.0 \\
  3 &    6.7 \\
  \bottomrule
\end{tabular}

% uncertainties and exponents get their own formats
% S[table-format = 2.2(1), separate-uncertainty]  ->  12.34 +- 0.05
% S[table-format = 1.3e2]

見出しに単位を書くときの形にも定石があります。Length [m] ではなく Length / m ——単位で割った形にするのが推奨されます。理由は記法の衝突で、[x] は数学では「x の次元」を意味する記法だからです。角括弧を単位の入れ物に流用すると、[a] が「加速度の次元」なのか「単位は m/s²」なのか読み分けられなくなります。単位で割った形にすれば表の中身は無次元の数だけになり、S 列の仕事ともきれいに噛み合います。なお \multicolumn\multirow の中で同じ整列がほしいときは、S 列のマクロ版にあたる \tablenum[table-format = …]{…} を使います。

\SI\qty の違い — v2 から v3 への乗り換え

同じ仕事をする命令の、古い名前と新しい名前です。\SI が v2、\qty が v3。siunitx の作者 Joseph Wright は 2021 年 5 月 17 日にリリースした v3.0.0 でパッケージを内部から書き直し、文書用命令の名前を「より説明的」なものに改めました。マニュアルは、\SI\si\SIrange\SIlist は引き続き使えるものの 新規文書では推奨しない、代わりに \qty… 系を使うようにと述べています。\num\ang の名前だけは、v2 から v3 へ変わっていません。

v2(古い名前)v3(現行)役割
\SI\qty{9.81}{\metre\per\second\squared}数値と単位
\si\unit{\kilo\gram}単位だけ
\SIrange\qtyrange{10}{20}{\metre}範囲(10 m to 20 m
\SIlist\qtylist{10;20;30}{\metre}リスト(10 m, 20 m and 30 m
\num\num{1.234e5}(名前は変わらず)数値だけ
\ang\ang{22.20}(名前は変わらず)平面角

v3 は入力も少し厳しくしました。目立つのは接頭辞で、単位を伴わない接頭辞が使えなくなりました。\unit{\kilo}! Package siunitx Error: Found prefix part with no unit. で止まります。これは意地悪ではなく規格に合わせた変更です——SI 文書 §5.2 は「接頭辞は決して単独では用いず、複合接頭辞も用いない」と、ずっと以前から定めていました。つまり v3 の「破壊的変更」の少なくとも一部は、パッケージが規格に追いついた結果です。同じ方針で、数値どうしの積は \numproduct、量どうしの積は \qtyproduct に分けられ、複素数は \complexnum という専用命令になりました。

古い文書がどうしても v3 で通らないときは、読み込み時にバージョンを指定して旧版の挙動を呼び出せます——\usepackage{siunitx}[=v2] です。ただしこれは延命策と考えてください。v3 は多くの旧オプション名を内部で新しい名前に読み替え、そのつどログに警告を残します。ログに siunitx の警告が並ぶ文書は、名前を書き換える時期に来ている、と読むのが正しい。新しく書きはじめるなら、覚えるのは \num\unit\qty の三つで足ります——数値だけ、単位だけ、その両方。このページで見てきた規格の細部は、すべてその三つの内側で処理されます。

latex
% v2 names: still work, no longer recommended for new documents
\SI{9.81}{\metre\per\second\squared}
\si{\kilo\gram}

% v3 names: use these
\qty{9.81}{\metre\per\second\squared}
\unit{\kilo\gram}

% a prefix on its own is now an error:
% ! Package siunitx Error: Found prefix part with no unit.
\unit{\kilo}

% last resort for a document that will not build with v3
\usepackage{siunitx}[=v2]