ISO/JIS の数式組版規則

理工系の数式には「何を斜体にし、何を立体(ローマン体)にするか」という国際的な約束があり、それを定めているのが ISO 80000-2、日本では JIS Z 8000-2 です。規則そのものは一行で言えます——変わりうる量は斜体、意味の決まったものは立体。ところが LaTeX で素直に書くと、この規則を満たすものと満たさないものがきれいに分かれます。\sin\partial も数字も既定で正しい一方、自然対数の底 e、虚数単位 i、微分の d、円周率 π は既定で斜体 ——つまり不適合です。このページでは規格の中身と、\mathrm{d}x\uppiisomathunicode-mathmath-style=ISO で LaTeX をどう合わせるかを、実際に PDF から文字コードを取り出して確かめながら整理します。

ISO 80000-2 と JIS Z 8000-2(旧 JIS Z 8201)

ISO 80000-2(Quantities and units — Part 2: Mathematics)は、数学記号の意味と 組み方(書体) をあわせて定めた国際規格です。現行は 2019 年版(第2版。初版は 2009 年)で、2021 年 11 月に正誤訂正版が発行されています。日本ではこれを一致規格として翻訳した JIS Z 8000-2:2022「量及び単位—第2部:数学記号」 が 2022 年に制定され、それまで 40 年以上使われてきた JIS Z 8201:1981「数学記号」 は 2022 年 3 月 22 日に廃止されました。古い教科書や社内規程では JIS Z 8201 や、その源流にあたる ISO 31-11 の名前を見かけますが、いま拠るべきはこの ISO 80000-2 / JIS Z 8000-2 です。

なぜ規格が書体まで決めるのでしょうか。数式では 書体そのものが意味を担う からです。e は文脈次第で「変数 e」にも「自然対数の底 2.718…」にもなり、斜体の e と立体の e で書き分ければ添え書きなしで区別がつきます。規格はこの区別を世界共通の規則に固定し、論文・教科書・技術文書のあいだで表記が揺れないようにするものです。しかも、この揺れは実害を生みます——量の記号と単位記号が同じ書体で並べば、m が質量なのかメートルなのか読者には分かりません。LaTeX で数式を組むことは、この規格を守る出発点としてはとても有利です。数式モードでは英字が自動で斜体になり、\sin などの関数名や数字は最初から立体で組まれるからです。

基本原則 — 変わるものは斜体、決まったものは立体

規格の中心には一つの考えしかありません。値が文脈によって変わりうる量は斜体、意味や値が一意に決まっているものは立体 で組みます。xy のような変数、ab のように「その場では定数とみなすパラメータ」、一般の関数記号 fg は、いずれも値が固定されていないので 斜体。これらは LaTeX 数式モードの既定そのままなので、何もしなくても規格に従えます。一方、値の確定した 数学定数(e、i、π)、微分演算子 d とその仲間(偏微分の ∂ など)、系統的に定義された関数名(sin、exp、ln、Γ)、そして 数字単位記号 は立体です。規格の立場は単純で、「これらは変数ではないのだから、変数の書体で組んではならない」。

判断に迷ったときの手っ取り早いテストは「その記号を別の文字に置き換えられるか」です。xt に置き換えても式の意味は保たれます——だから変数で、斜体。しかし積分の dx の d を別の字に替えることはできません——意味の決まった演算子だから、立体です。同じテストで、\sin の s を替えられないことも、\mathrm{kg} の k を替えられないことも説明がつきます。

立体・斜体の早見表 — LaTeX の既定はどこまで合っているか

結論から言うと、LaTeX が 既定で満たすのは関数名・偏微分 ∂・数字・大文字ギリシャ自分で手当てが必要なのは e・i・π・微分演算子 d・単位・ベクトル/テンソル です。下の表で「既定で OK」は素の数式モードのまま規格どおりに組まれるもの、「要対応」は明示的に立体化(あるいは太字斜体化)が必要なものを指します。

対象規格の書体LaTeX での書き方
variables変数・量 x, y, t は斜体x(数式モードの既定で OK)
parametersパラメータ・一般の関数 a, b, f, g は斜体a, f(x)(既定で OK)
\mathrm{e}自然対数の底 e は立体\mathrm{e}。素の e は斜体で不適合。要対応
\mathrm{i}虚数単位 i(電気系では j)は立体\mathrm{i} / \mathrm{j}。要対応
\uppi定数としての円周率 π は立体\uppi(upgreek か unicode-math)。素の \pi は斜体。要対応
\mathrm{d}微分演算子 d は立体\mathrm{d}x。素の d は斜体で不適合。要対応
\partial偏微分記号 ∂ は立体\partial(既定で立体 — OK)
\sin定義された関数 sin, exp, ln は立体\sin, \exp, \ln(既定で立体 — OK)
\Gamma関数としての大文字ギリシャ Γ は立体\Gamma(標準 LaTeX では既定で立体 — OK。ただし次節を参照)
digits数字 0–9 は立体123(既定で立体 — OK)
\unit単位記号 m, kg, s は立体siunitx の \unit{} / \qty{}{}。要対応
\vectorsymベクトル・行列 a, A は太字斜体\bm{a}、または isomath の \vectorsym{a}。要対応
\tensorsymテンソル T はサンセリフ太字斜体isomath の \tensorsym{T}。要対応

\mathrm{d}x — 微分の d と定数 e・i を立体にする

いちばん多い質問への答えは短く、\mathrm{…} で囲むだけ です。LaTeX の数式モードでは eid は単なる英字なので斜体の変数として組まれますが、\mathrm{e}\mathrm{i}\mathrm{d} と書けば立体になり、変数の e や d とはっきり区別がつきます。積分では \int_0^1 x^2 \,\mathrm{d}x のように、被積分関数と d のあいだに細い空き \, を入れるのが慣例です(規格は空きの量までは定めませんが、読みやすさのため広く行われています)。ここで一つ補足を。\mathup という命令を見かけることがありますが、これは isomath が定義するものではありませんunicode-math\mathup\mathrm の別名として定義しているほか、kpfontsmismath なども独自に持っています。実測でも、unicode-math 環境で \mathrm{d}\mathup{d}\symup{d} の三つはいずれも U+0064(ただの立体の d) を出し、素の d だけが U+1D451(数式イタリックの d)になりました。つまり \mathup\mathrm の言い換えであって、別の何かではありません。

毎回 \mathrm{d} と打つのは煩わしく、しかも打ち忘れが必ず起きます。だからプリアンブルで 自分用の短い命令を一度だけ定義する のが定石です。\newcommand{\dd}{\mathrm{d}} のようにしておけば本文では \dd x と書けますし、方針を変えたくなったときも定義一行を直すだけで文書全体が追従します。逆に、本文のあちこちに \mathrm{d} を直書きしてしまうと、後から「やはり斜体の d に戻す」と言われたときに手が付けられません。規格に合わせる作業は、命令に名前を付けて一元管理する作業 だと考えてください。

document.tex
% define once in the preamble
\newcommand{\dd}{\mathrm{d}}   % upright differential operator
\newcommand{\eu}{\mathrm{e}}   % base of the natural logarithm
\newcommand{\iu}{\mathrm{i}}   % imaginary unit
% ...
\[
  \eu^{\iu\uppi} + 1 = 0, \qquad
  \frac{\dd}{\dd x}\,\eu^{x} = \eu^{x}, \qquad
  \int_0^{\infty} \eu^{-x}\,\dd x = 1.
\]

\uppi の落とし穴 — 立体の π は別の書体を連れてくる

円周率 π を規格どおり立体にする定番は upgreek パッケージの \uppi ですが、ここには見落としやすい代償があります。upgreek既定で Euler Roman を使う のです。パッケージ内の \ExecuteOptions{Euler} がそれで、実際 \usepackage{upgreek} して $\uppi$ を組んだ PDF を pdffonts にかけると EURM10——ヘルマン・ツァップが設計した Euler 一族の書体——が埋め込まれます。Computer Modern で組んだ文書に、その π だけ別のデザイナーの書体が混じるわけです。気になる場合は \usepackage[Symbol]{upgreek} とすると URW Symbol(StandardSymL)から取られます。どちらが良いかは本文書体しだいなので、必ず出力を見て決めてください

もう一つ知っておくとよいのは、upgreek が用意するのは 小文字ギリシャだけ だということです。\upalpha から \upomega までは揃っていますが、\upGamma は定義されておらず、書くと ! Undefined control sequence. になります。標準 LaTeX では大文字ギリシャがそもそも立体なので、これは不足ではなく設計です。なお unicode-math を使う場合は upgreek は要りません——\uppi\upGamma も、\symup{…} の短縮形としてパッケージ側が自動生成します。

大文字ギリシャが立体なのは ISO ではなく TeX の慣習

標準 LaTeX では \Gamma\Omega などの大文字ギリシャが立体で組まれます。これはクヌースが決めた TeX の伝統であって、ISO 80000-2 の要求ではありません。規格の考えでは、変数として使う大文字ギリシャ(たとえば角度の Θ)は他の変数と同じく斜体であるべきで、立体でよいのは Γ 関数のように 名前が確定した関数 の場合です。中身は驚くほど単純で、標準 LaTeX の \Gamma\mathchar"7000——族 0(operators、立体)に置かれています。isomath が内部で読み込む fixmath(Walter Schmidt 作)はこれを \mathchar"7100 に付け替えるだけ。16 進数の一桁が変わり、大文字ギリシャが族 1(letters、数式イタリック)へ移る のです。ついでに \mathbf などの数式アルファベットも大文字ギリシャに効くようになります。

isomath を丸ごと読み込みたくない場合、pdfLaTeX なら 数式フォントパッケージのオプション で同じ結果が得られることがあります。newtxmath には slantedGreekuprightGreek があり、実測では \usepackage[slantedGreek]{newtxmath} を読むと \Gamma\mathchar"7100(既定は \mathchar"7400)に変わりました。フランス式の組版に寄せる frenchmath オプションもあります。どの手段を選ぶにせよ、大文字ギリシャの向きは文書全体で一度決めて、途中で変えない ことが肝心です。同じ論文の中で Θ が斜体だったり立体だったりすれば、読者は「これは別の量なのか」と考えてしまいます。

math-style=ISO は何を変えるか — 実測した文字コード

XeLaTeX・LuaLaTeX で unicode-math を使うなら、書体方針は math-style= という一つのキーで丸ごと切り替えられます。値は TeX(既定)・ISOfrenchuprightliteral の五つ。効果は憶測ではなく測れます——LuaLaTeX で $\Gamma\ \alpha\ A\ a\ \partial\ \pi$ を組み、PDF から文字を取り出して Unicode の符号位置を並べたのが下の表です。math-style=ISO にすると大文字ギリシャ Γ が U+0393(立体)から U+1D6E4(数式イタリック)へ移る のが一目で分かります。ここが規格と TeX の伝統がぶつかる、ちょうどその一点です。

指定大文字ギリシャ Γ小文字ギリシャ α偏微分 ∂ラテン小文字 a
math-style=TeXU+0393 立体U+1D6FC 斜体U+1D715 斜体U+1D44E 斜体
math-style=ISOU+1D6E4 斜体U+1D6FC 斜体U+1D715 斜体U+1D44E 斜体
math-style=frenchU+0393 立体U+03B1 立体U+2202 立体U+1D44E 斜体
math-style=uprightU+0393 立体U+03B1 立体U+2202 立体U+0061 立体

この表からは二つのことが読み取れます。第一に、math-style=ISO にしても π は斜体のまま(U+1D70B)です。規格では定数の π は立体ですが、unicode-math には「この π は定数か変数か」を判別する手段がありません。だから前節の \uppi(または \symup{\pi})は、ISO 指定にしたあとも必要です。第二に、math-style=french という値の存在そのものが面白い——フランスの組版慣習ではギリシャ文字を大文字も小文字も立体にし、ラテン大文字も立体にします。「正しい書体」は一つではなく、地域の伝統がある ことを、パッケージが値として認めているわけです。なお太字には別のキー bold-style= があり、既定の TeX では \symbf{v}太字の立体(U+1D42F)になります。ベクトルを規格どおり太字斜体にしたいなら bold-style=ISO を指定するか、\symbfit(U+1D497)を使ってください。

document.tex
% compile with xelatex or lualatex
\usepackage{amsmath}
\usepackage[math-style=ISO,bold-style=ISO]{unicode-math}
\setmathfont{STIX Two Math}
% ...
\[
  \symup{e}^{\symup{i}\uppi} + 1 = 0, \qquad
  \int_0^1 x^2 \,\symup{d}x = \frac{1}{3}, \qquad
  \symbfit{v} = \symbfit{A}\,\symbfit{x}.
\]

ベクトルは太字斜体、テンソルはサンセリフ太字斜体

規格は量の「型」に応じた書体も定めます。ベクトルと行列の記号は太字斜体テンソルの記号はサンセリフ太字斜体。ここで最大の落とし穴が、よく使われる \mathbf{v}太字の立体 を出すことです。これは規格の言う太字斜体ではありません。手軽なのは bm パッケージの \bm{v} で、斜体を保ったまま太さだけを足します。より規格に忠実にやるなら isomath で、\vectorsym{v}\matrixsym{A}\tensorsym{T} という 意味で名付けられた命令 が使えます。この命名は実務で効きます——半年後に読み返したとき、\bm{A} が行列なのかベクトルなのか単なる強調なのかは分かりませんが、\matrixsym{A} なら一目で分かります。

ただし isomath は静かに二つのことをします。第一に、\mathbf を太字斜体に再定義しますOML 符号化の bx/it)。規格に沿った変更ですが、\mathbf を「立体の太字」として使っていた既存の原稿を通すと見た目が変わるので、途中から導入するときは全文を見直してください。第二に、内部で fixmath を読むので 大文字ギリシャが斜体になります。もう一点、Computer Modern には数式用のサンセリフ太字斜体が無いため、\tensorsym を使うとログに Font shape OML/cmbr/bx/it in size <10> not available という フォント代替の情報 が出ます(エラーではありません)。実測では cmbright 系が代わりに使われました。テンソルを多用する文書では、代替されたその書体で本当に良いかを一度確かめる価値があります。

document.tex
\usepackage{isomath}   % loads fixmath: capital Greek becomes italic
% NOTE: isomath also redefines \mathbf as bold ITALIC (OML bx/it)
% ...
\[
  \vectorsym{v} = \matrixsym{A}\,\vectorsym{x},
  \qquad
  \tensorsym{T}_{ij}.
\]

実務での方針 — どこまで従い、どこで妥協するか

規格に厳密に従うか慣行に寄せるかは、文書の性格しだいです。判断の材料ははっきりしています——投稿先や社内規程が ISO/JIS 準拠を求めているかどうか。求められているなら下の方針で整えれば足ります。求められていないなら、\mathrm{d} だけ導入するといった部分適用でも構いません(これは分野を問わず読みやすさが上がります)。ただし何を選ぶにせよ、方針は一文書のなかで統一する。同じ記号が斜体と立体で混在するのが、いちばん読者を混乱させます。

  • e・i・d は立体に。 プリアンブルで \dd\eu\iu\mathrm{…} として定義し、本文では短い命令だけを書く。
  • π を厳密にするなら upgreek\uppi。ただし既定では Euler Roman の字形が混ざるので、[Symbol] オプションと見比べてから決める。
  • 単位は siunitx に任せる。 手書きの \mathrm{…} を避け、\unit{}\qty{}{} を使う。空きも複合単位も規格どおりに揃う。
  • ベクトル・行列は太字斜体。 \mathbf(太字立体)ではなく \bm、または規格準拠の isomath\vectorsym / \matrixsym / \tensorsym
  • 関数名・偏微分・数字は既定のまま。 \sin\cos\log\lim\partial123 は何もしなくても規格を満たす。自分の関数名を足すときは amsmath\DeclareMathOperator{\rank}{rank} を使えば、同じ立体と空きが得られる。
  • 大文字ギリシャは一度決めて動かさない。 斜体にするなら isomathfixmath)か newtxmathslantedGreek、あるいは math-style=ISO

最後に、physics パッケージについて一言。微分の \dd や導関数の \dv を立体で手軽に出せるので魅力的に見えますが、命令名が他パッケージと衝突することが知られています。実測でも physicssiunitx を同時に読み込むと \qty の定義を奪い合い、! Missing $ inserted.! Extra }, or forgotten $. が出ました(補修用の physics-patch も存在し、近年は derivative パッケージなどの代替も使われます)。この件は physics 専用のページで詳しく扱っています。単位の書き方そのものについても siunitx のページが持ち主なので、複合単位や有効数字まで踏み込むならそちらを読んでください。書体の意味を意識して一貫させること——規格遵守の本質は、結局そこに尽きます。