単位(siunitx)

「9.81 m/s²」のような量を正しく組むには、細かな約束ごとがあります。単位は 立体(ローマン体)、数値と単位のあいだには 細い空き、複合単位の積・商の間隔もそろえる——これらを手作業で守るのは面倒で、ぶれも生じます。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 がそのまま 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 345 に、1.234e51.234 × 10⁵ に、.50.5 になります。地域慣行(桁区切りをコンマにする、小数点をコンマにする等)はオプションで切り替えられますが、まずは「数値は素の数字ではなく \num に通す」と覚えておけば十分です。なお 数値の積 を出すには専用の \numproduct{1.2 x 3.4}× で区切る)を使います(v3 では \num 自身は積を組みません)。

単位を組む — `\unit`

\unit{…}単位だけ を組む命令です。入力には二つの流儀があります。一つは リテラル(そのまま書く)方式 で、\unit{kg.m/s^2} のように単位記号を直接打ちます。ここでピリオド . は単位どうしの /^_上付き・下付き を表します。siunitx がこれを立体で組み、正しい空きを入れます。\unit{kg.m/s^2}kg m/s²(kg と m のあいだに細い空き、s に上付きの 2)になります。

もう一つは 解釈(マクロ)方式 で、単位・接頭辞・冪をそれぞれ命令で組み立てます。英語で単位名を読み上げるのに近い書き方です。基本となる命令を表に挙げます。

命令意味出力例
gram\gram / \metre / \second基本単位(SI 基本単位の名前)g / m / s
kilo\kilo \milli \micro接頭辞(単位の前に置く)k / m / µ
kilogram\kilogram接頭辞つきの定義済み単位kg
per\per次に来る単位を分母(割り算)に… ⁻¹ または /…
squared\squared / \cubed直前の単位を 2 乗 / 3 乗(後置)m² / m³
square\square / \cubic直後の単位を 2 乗 / 3 乗(前置)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)

接頭辞つきの「キログラム」は、接頭辞と単位を続けて \kilo\gram と書いても、定義済みの一語 \kilogram と書いても同じ kg になります。\cubic\metre は前置で「立方メートル m³」、\metre\per\second\squared は後置の \squared で「メートル毎秒毎秒 m/s²」です。\per の見せ方(負冪 s⁻¹ か、スラッシュ /s か)は後述の per-mode オプションで切り替えます。

リテラル方式と解釈方式は同じ結果を出せますが、解釈方式(マクロ)には利点があります。冪や接頭辞・積商の見せ方をオプションで一括制御でき、自分で新しい単位マクロを定義することもできます。一方リテラル方式は、ちょっとした単位を手早く書くのに向きます。どちらでも、単位が立体で、空きが正しく入る点は共通です。

数値と単位をまとめて — `\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)でもリテラル(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″ を組みます。角度は 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 列型** を用意しており、列指定で clr の代わりに S を書くと、その列の数値が 小数点で整列 します。中身は \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.2e31.2 × 10³ として、e410⁴ として組まれます。重要な注意点が一つ——列見出しのような **文字列は波括弧 {…} で囲む** ことです。{Some Values} のように保護しないと、siunitx がそれを数値の一部と解釈しようとして整列が崩れます。

桁数をそろえて中央や右に位置を決めたいときは、table-format オプションで「整数部の桁数.小数部の桁数」を伝えます。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 列、と役割を分けながら、文書全体で一貫した数値表記を保てます。