physics / braket / tensor

物理や量子力学の数式を組んでいると、同じ書き方が何度も出てきます——微分 d/dx、偏微分 ∂/∂x、絶対値や大きさの縦棒、ブラとケット、そして上下に並ぶテンソルの添字。これらを毎回 \frac\left| で手書きするのは骨が折れます。このページでは、そうした表記を覚えやすい命令にまとめてくれる三つのパッケージ——導関数や自動サイズの括弧をひとそろい用意する **physics、ディラックのブラ・ケット記法に特化した braket、上付き・下付き添字をきれいに整列させる tensor**——を紹介します。便利な反面、physics には標準命令を黙って上書きするなどの落とし穴もあるので、利点と注意点の両方を見ていきます。

physics パッケージとは

physics** は、Sergio C. de la Barrera による、物理の数式を「速く・読みやすく」組むためのパッケージです。プリアンブルに \usepackage{physics} の一行を書けば使えます。内部では xparseamsmath を必要とし、amsmath は physics が自動で読み込むため、別途書く必要はありません。狙いは明快で、命令名を見ただけで何をするかが分かるようにし、長い \frac{\mathrm{d}}{\mathrm{d}x} のような決まり文句を短い命令に置き換えることです。

latex
\usepackage{physics}

提供される命令は大きく、自動サイズの括弧(\qty\abs\norm\eval)、ベクトル解析(\grad\div\curl\laplacian)、導関数と微分(\dv\pdv\dd)、ディラック記法(\bra\ket\braket)、そして行列マクロに分かれます。以下では実際の数式組版でよく使うものを順に見ていきます。なお physics には設計上の癖もあり、後半でまとめて扱います。

physics の導関数と微分

physics の看板機能が導関数です。\dv は常微分(ordinary derivative)で、引数の数で形が変わります。\dv{x} のように一つだけ渡すと演算子 d/dx を、\dv{f}{x} のように二つ渡すと df/dx を組みます。高階の微分は省略可能引数で指定し、\dv[2]{f}{x} は d²f/dx²、\dv[n]{f}{x} は dⁿf/dxⁿ になります。分子・分母とも d は既定で立体(ローマン体)で組まれ、\usepackage[italicdiff]{physics} とすると斜体の d に切り替わります。

偏微分は \pdv で、\dv と同じ流儀です。\pdv{f}{x} は ∂f/∂x、\pdv[2]{f}{x} は ∂²f/∂x² を組みます。混合偏微分は引数を三つ渡して \pdv{f}{x}{y} と書くと ∂²f/∂x∂y になります。微分要素そのものは \dd で、\dd{x} は前後の文脈に応じた空きを伴う dx を、\dd[3]{x} は d³x を組みます(積分の中で \int f(x) \dd{x} のように使います)。

latex
\[
  \dv{f}{x}, \qquad \dv[2]{f}{x}, \qquad
  \pdv{f}{x}{y}, \qquad \int_0^1 f(x) \dd{x}
\]

この例は左から順に、df/dx、二階導関数 d²f/dx²、混合偏微分 ∂²f/∂x∂y、そして 0 から 1 までの積分(被積分関数のあとに微分要素 dx)を組みます。インライン用に分数を斜線で組みたいときは星付きの \dv*{f}{x} を使うと、df/dx が \flatfrac 形式の横並びで出力されます。

physics の自動括弧とブラ・ケット

physics は、中身の高さに合わせて自動で伸びる括弧類も用意します。\abs{a} は絶対値 |a| を、\norm{a} はノルム ‖a‖ を、中身に応じたサイズで組みます(内部で \left\right 相当の処理をします)。手動でサイズを決めたいときは \abs\Big{a} のように \big\Big などを差し込め、逆にサイズを変えたくないときは星付きの \abs*{a} を使います。評価の縦棒は \eval\eval{x}_0^\infty で下端・上端付きの縦棒)です。汎用の括弧は \qty(...) で、\qty(...)\qty[...]\qty{...} が丸・角・波括弧に対応します。

latex
\[
  \abs{\frac{a}{b}}, \qquad \norm{\vb{v}}, \qquad
  \eval{x^2}_0^\infty, \qquad \qty( \frac{1}{2} )
\]

この例では、絶対値の縦棒が分数 a/b の高さに合わせて伸び、ノルムの二重縦棒がベクトル v を包み、評価の縦棒が右側に 0 と ∞ を伴って立ち、最後の丸括弧が分数 1/2 の高さに合わせて大きく組まれます。

ディラック記法では、基本となるのが \bra{\phi}\ket{\psi} の対です。physics の設計上、\bra{\phi}\ket{\psi}(間に空白を入れない)と書くと、ブラとケットが互いに「縮約」して ⟨φ|ψ⟩ という一つの内積に組まれます。内積を直接書く \braket{a}{b}(→ ⟨a|b⟩)や一引数の \braket{a}(→ ⟨a|a⟩、ノルム)、外積の \ketbra{a}{b}(→ |a⟩⟨b|、\dyad の別名)も用意されています。いずれも中身の高さに合わせて自動でサイズが決まり、星を付けると自動サイズが止まります。

ベクトル解析の作用素もそろっています。\grad は勾配 ∇、\div は発散 ∇·、\curl は回転 ∇×、\laplacian はラプラシアン ∇² です。これらは関数を引数に取り、\grad{\Psi} で ∇Ψ のように組みます。ただし \div の再定義には注意が必要で、これは次節で扱います。

physics の注意点と代替

physics は便利ですが、標準的な命令を黙って再定義する ため、扱いには注意が要ります。代表例が \div です。LaTeX 標準では \div は割り算の記号 ÷ ですが、physics はこれを発散 ∇· に置き換え、もとの ÷ は \divisionsymbol に移します。同様に三角関数も再定義され、\sin などは自動で括弧を付ける形になります(\usepackage[notrig]{physics} で無効化でき、もとの定義は \sine などの長い名前で残ります)。\Re\Im も置き換わります。これらは知らないと「いつもの記号が出ない」と戸惑う原因になります。

もう一つの有名な落とし穴が、導関数の 直後の丸括弧を引数として飲み込む 挙動です。physics では \dv{x}(\Psi) のように丸括弧を続ける書き方が「長形式」として定義されており、d/dx が括弧の中身を作用させる対象として扱います。そのため \dv{f}{x}(g) と書くと、(g) が独立した因子ではなく \dv の引数として吸い込まれ、意図とずれた出力になります。この振る舞いは tex.stackexchange でもよく話題になり、改良版の physics-patch パッケージが用意されているほどです。回避するには、続く因子の前に空きを入れる、{} を挟む、あるいは括弧を \qty() 以外の方法で書くなどします。

パッケージどうしの衝突もあります。とくに単位組版の定番 siunitx は新しい版で数量を表す命令 \qty を導入したため、physics の \qty と名前がぶつかります(読み込み順で挙動が変わります)。こうした事情から、近年は「physics をひとそろい使う」より、目的別に専用パッケージを選ぶ流儀も広まっています。導関数なら高階・多変数に強い **derivative パッケージ、微分演算子をきれいに組みたいなら fixdif、レガシーな physics 利用者向けに整理された physics2** などが代替候補です。

自動サイズの括弧についても、physics に頼らず 自分で名前付きの区切り記号を定義する 流儀があります。mathtools\DeclarePairedDelimiter を使えば、たとえば \DeclarePairedDelimiter{\abs}{\lvert}{\rvert} と一度宣言するだけで、自分専用の \abs が手に入り、\abs{x}(既定サイズ)と \abs*{x}\left\right で自動伸縮)を使い分けられます。標準命令を上書きしないぶん安全で、挙動も予測しやすいため、堅牢さを重視する文書ではこちらが好まれます(詳しくは mathtools のページを参照)。

braket パッケージ

ディラック記法だけを軽く使いたいなら、Donald Arseneau による **braket** パッケージが手頃です。physics のような大きなツール群ではなく、ブラ・ケットと集合の記法に絞った小さなパッケージで、\usepackage{braket} で読み込みます。提供される命令は二系統です。固定サイズ(中身に関わらず大きさが一定)の小文字版 \bra{ }\ket{ }\braket{ }\set{ } と、自動伸縮(内部で \left\right を使い中身を包む)の大文字版 \Bra{ }\Ket{ }\Braket{ }\Set{ } です。

大文字版の便利な点は、引数の中に縦棒 | をそのまま書くと、その縦棒も外側の括弧と一緒に伸びることです。\Braket では中の | がすべて引数の高さに合わせて伸び、\Set では最初の | が伸びます。二重縦棒がほしいときは \|、またはその局所的な別名 || を使います。

latex
\Braket{ \phi | \frac{\partial^2}{\partial t^2} | \psi }

\Set{ x \in \mathbf{R}^2 | 0 < {|x|} < 5 }

この例の前者は、二階の偏微分演算子をはさんだ行列要素 ⟨φ| ∂²/∂t² |ψ⟩ を、外側の山括弧と中の二本の縦棒がすべて演算子の高さに合わせて大きく伸びた形で組みます。後者は集合 { x ∈ R² | 0 < |x| < 5 } を、外側の波括弧と区切りの縦棒を伸ばして組みます(集合の中の |x| は固定サイズのままにしたいので {|x|} と波括弧で囲って保護しています)。なお physics と違い、braket には外積用の \ketbra定義されていません。作者は \ket{ }\bra{ } と書くことを勧めています。

tensor パッケージ

上付き・下付きの添字が入り混じるテンソルでは、添字の 横方向の位置と間隔 が意味を持ちます。たとえば Γ^μ_{νρ} や R^μ_{ν}{}^ρ_σ では、上の添字と下の添字が左から正しい順序で並ばなければなりません。素朴に ^_ を続けて書くと、上下が同じ位置に重なってしまい、どの添字が先かが読み取れません。これを解決するのが Philip G. Ratcliffe による **tensor** パッケージ(Mike Piff の original を全面改訂したもの、v2.2)です。外部パッケージを必要とせず、\usepackage{tensor} で使えます。

中心となる命令は二つです。軽量な \indices は、テンソル本体のすぐ後ろに置いて添字列だけを取ります。たとえば M\indices{^a_b^{cd}_e} と書くと、M に続けて上の a、下の b、上の cd、下の e が、正しい水平位置を保って整列します。添字列の中では ^(上付き)と _(下付き)をそのまま使い、複数文字の添字は ^{cd} のように波括弧でまとめます(\sp\sb も同じ働きをします)。

もう一つの \tensor は、Mike Piff の original と後方互換な形で、テンソル本体と添字列を別々の引数に取ります。\tensor{M}{^a_b^{cd}_e}\indices を使った上の例とまったく同じ出力になります。\tensor の利点は、テンソルの に添字を置けることです。省略可能な第一引数に前置の添字列を渡すと、\tensor[^a_b^c_d]{M}{^e_f^g_h} のように、本体 M の前と後ろの両方に添字を整列できます。

latex
\[
  M\indices{^a_b^{cd}_e}, \qquad
  \tensor{M}{^a_b^{cd}_e}, \qquad
  \tensor[^a_b^c_d]{M}{^e_f^g_h}
\]

三つとも、上下の添字が重ならず、左から正しい順序で段違いに並びます。最後の例だけは M の前にも添字の組が付きます。\indices\tensor には星付きの形があり、\indices*\tensor* は添字間の空きを詰めて標準的な見た目に戻します。さらに、添字列の 先頭* を置くと、続く上下の添字の組が左揃えで整列します(位置のばらつきを抑えたいときに使います)。

おまけとして、テキスト・数式どちらでも使える \nuclide も定義されています。\nuclide[14][6]{C} と書くと、質量数 14 と原子番号 6 を元素記号 C の左肩・左下に付けた ¹⁴₆C を組みます(質量数・原子番号はどちらも省略可能です)。多文字の添字は波括弧でまとめる必要があり、\mathrm などの構成も \indices{_{\mathrm{H}}^x} のように全体を波括弧で囲みます。