LaTeX で数式を取り扱う場合、physics パッケージは非常に有用なパッケージとして有名です。他方で、physics パッケージには数多くの問題があるとされています。この問題は快適さとトレードオフの関係にあるものではなく、修正されるべき問題です。
本記事では、physics パッケージの問題点を明らかにし、代替パッケージを検討します。また、代替パッケージの内、physics2 パッケージの使い方について紹介します。
■ physics パッケージのココがヤバい
実は、physics パッケージは実装やそこから得られる結果にいくつもの問題を抱えています
これは、LaTeX Stack Exchange や physics2 パッケージで多く提起・議論されています。ここで提起・議論されている問題を以下のリストにまとめました。
- 実装の問題:
-
他パッケージとの衝突:
-
\qty
コマンドが siunitx パッケージと衝突する - 内部で使用される
\boldsymbol
(amsmath) は unicode-math パッケージと併用すると失敗する
-
-
得られる結果に生じる問題:
-
実装内に奇妙なスペースを構成している (LaTeX Stack Exchange)
例:括弧周りのスペースが左右で異なっている\fbox{$\ev*{\hat{O}_P}$}
-
ドキュメント作成者の意図しない引数の扱い方をする (LaTeX Stack Exchange)
例:(y^2-5) が無視される\[ \dv{x}{t}(y^2-5) \]
-
一方で、physics パッケージを代替するパッケージの検討に関する議論もなされています。
- macros - Alternatives to the physics package - TeX - LaTeX Stack Exchange
- package writing - Physics replacement effort - TeX - LaTeX Stack Exchange
ここで紹介されているパッケージは、以下のようなものです。それぞれで提供される機能も付記しました。
-
physics2 パッケージ
- 高さが自動調整される括弧(
ab
モジュール) - Dirac の bra-ket 記法(
ab.braket
・braket
モジュール) - 行列の簡易記法(
diagmat
・xmat
モジュール) - レガシーモジュール
- ベクトル記法
- いくつかの作用素
- 挿入テキストの簡易コマンド
- 高さが自動調整される括弧(
-
fixdif パッケージ
- 微分のための微小量記号
-
diffcoeff パッケージ
- 微分記法
-
derivative パッケージ
- 微分記法
-
braket パッケージ
- Dirac の bra-ket 記法
本記事では、physics2 パッケージについて紹介します。この他のパッケージについては他の記事に譲ります。
■ physics2 パッケージを使おう
physics パッケージの後継に相当する physics2 パッケージが 2023/02/08 に公開されました。
本記事では、バージョン 1.0.1 (2024/01/10) に準拠します。
physics2 パッケージはその名前から推測されるように、physics パッケージに影響を受けたパッケージです。そのため、このパッケージの目的は次の 2 点です。
- より簡単かつ可読性が高まるようにコマンドを提供する
- コマンド名は目的が明瞭かつ覚えやすいように定義している
- physics パッケージで書かれた文書を維持する (?)
- と言いつつ、完全な互換性はありません……
physics パッケージとの差別化点は以下の 4 点が挙げられます。
- physics パッケージのような実装内の問題がない(はず)
- 現在進行形で開発されている
- コマンドを目的別にモジュール化している
- unicode-math パッケージと併用できる
physics パッケージを単純に physics2 パッケージに置き替えることは出来ません。複数のコマンドについて、多くの違いがあるため注意してください。
physics2 パッケージから提供されるモジュールは、以下の 6 つのモダンなモジュールと 5 つのレガシーモジュールがあります。
-
モダンモジュール:
ab
、ab.braket
、braket
、doubleprod
、diagmat
、xmat
-
レガシーモジュール:
ab.legacy
、bm-um.legacy
、nabla.legacy
、op.legacy
、qtext.legacy
physics パッケージが提供するいくつかのコマンドを後方互換しています。
モジュールは \usepackage{physics2}
の後で \usephysicsmodule
によって読み込みます。モジュールにはオプションを含むものもあり、\usephysicsmodule
のオプションからモジュール毎に読み込むことが出来ます。
それぞれのモダンなモジュールについて簡単に説明しておきます。
モジュール | 説明 |
---|---|
デフォルト |
\delopen ・\delclose コマンドの提供 |
ab |
高さが自動調整される括弧 (physics パッケージにおける \qty に対応) |
ab.braket |
明示的な括弧による bra-ket 記法 |
braket |
波括弧による bra-ket 記法 |
doubleprod |
テンソルのダブルクロス積記号 |
diagmat |
対角行列の簡易記法 |
xmat |
行列の添え字表記法 |
レガシーモジュールについても簡単に説明しておきます。場合によっては、これらは自力で定義した方が簡便な可能性もあります。
モジュール | 説明 |
---|---|
ab.legacy |
\abs 、\norm 、\eval 、\order を提供 |
bm-um.legacy |
\bm を unicode-math パッケージに対応するように変更 |
nabla.legacy |
\grad 、\div 、\rot を提供(÷ は \divsymbol ) |
op.legacy |
\asin 、\acos 、\atan 、\acsc 、\asec 、\acot 、\Tr 、\tr 、\rank 、\erf 、\Res 、\res 、\PV 、\pv 、\Re 、\Im を提供 |
qtext.legacy |
\qq 、\qq* 、\qcc 、\qcc* 、\qif 、\qthen を提供 |
レガシーモジュールに関するより詳細なガイドは、physics2 manual for physics users (PDF) を参照してください。
以下では、モダンなモジュールのみを紹介します。
!接頭辞
ab
・diagmat
・xmat
モジュールから提供されるコマンドでは、接頭辞を付けることで括弧を指定することが出来ます。
接頭辞 | 名 | 対応する括弧 |
---|---|---|
p |
丸括弧 |
( ・)
|
b |
角括弧 |
[ ・]
|
B |
波括弧 |
\{ ・\} または \lbrace ・\rbrace
|
v |
垂直棒 |
| ・| または \lvert ・\rvert
|
V |
二重垂直棒 |
\| ・\| または \lVert ・\rVert
|
a |
山括弧 |
< ・> または \langle ・\rangle
|
これらに関して、接頭辞付きコマンドを \X~~
と表現します。(e.g. \pab
, \bab
, … , \aab
→ \Xab
)
▽ デフォルト
physics2 パッケージを読み込むと利用できるデフォルト機能です。(ver.1.0 以前では common
モジュールと呼ばれていました)
デフォルトの機能は、括弧の高さを手動で調整する \big
系統に、g
が 3 つ続く biggg
・Biggg
が提供されます。
したがって、次のように 7 種類の高さを表現でき、次表の 8 つのコマンドが追加されます。
高さ | 場所無し | 左 | 中央 | 右 |
---|---|---|---|---|
biggg | \biggg |
\bigggl |
\bigggm |
\bigggr |
Biggg | \Biggg |
\Bigggl |
\Bigggm |
\Bigggr |
また、自動で括弧の高さを調整する \delopen
・\delclose
が提供されます。これは mleftright パッケージの \mleft
・\mright
と類似しています。
上の図を見れば明らかなように、\left
・\right
使用時に生じる括弧周りの余分なアキが無いように動作します。
次で紹介する ab
モジュール提供の \ab
コマンドも同様に動作します。(tightbraces=true
)
▽ ab
モジュール
このモジュールから提供されるコマンドは、\ab
と接頭辞を付けたコマンドの計 7 つです。
\ab
\pab
\bab
\Bab
\vab
\Vab
\aab
\usephysicsmodule{ab}
オプション | デフォルト値 | 説明 |
---|---|---|
tightbraces |
true |
|
ab
は “Automatic braces” の略です。
モジュール名の通り、\ab
コマンドと対応する括弧を用いることで、高さが自動調整された括弧を挿入することが出来ます。このコマンドは、physics パッケージにおける \qty
と同じように括弧を明示的に表現することが出来ます。
\[
\ab (\frac{1}{2}) \quad
\ab [\frac{1}{2}] \quad
\ab\{\frac{1}{2}\} \quad
\ab |\frac{1}{2}| \quad
\ab\|\frac{1}{2}\| \quad
\ab <\frac{1}{2}>
\]
また、\ab
は接頭辞 § (p
・b
・B
・v
・V
・a
) を用いることで、常に {}
によって表現することも出来ます。これは、上に示したコマンドが次のコマンドと同等であることを意味しています。
\[
\pab{\frac{1}{2}} \quad % ( )
\bab{\frac{1}{2}} \quad % [ ]
\Bab{\frac{1}{2}} \quad % { }
\vab{\frac{1}{2}} \quad % | |
\Vab{\frac{1}{2}} \quad % \| \|
\aab{\frac{1}{2}} % < >
\]
\ab
は []
を付けずに \big
、\Xab
は [big]
等とすることで、手動によって括弧の高さを調整します。
\[
\ab\Bigg[\frac{1}{2}]
\bab[Bigg]{\frac{1}{2}}
\]
physics パッケージの \qty
では、波括弧の高さを自動調整する \qty{...}
のような使い方ができました。これは xparse パッケージで非推奨としている g
引数を利用しているためです。physics2 パッケージでは、このような非推奨な実装をしていないため、\ab{...}
によって \qty{...}
と同じ結果は得られません。
\qty{...}
に相当するコマンドは、\ab\{...\}
または \Bab{...}
です。また、\ab{...}
は存在しないことに注意してください。
▽ ab.braket
・braket
モジュール
このモジュールから提供されるコマンドは、以下の 4 つとその *
付きの計 8 つです。*
付きは高さの自動調整をしません。
\bra
\ket
\braket
\ketbra
ab.braket
・braket
モジュールは、ともに Dirac の bra-ket 記法を提供します。しかし、この 2 つのモジュールは競合するため、どちらか一方しか利用できません。
\usephysicsmodule{ab.braket}
\usephysicsmodule{braket}
両モジュールの違いは表現方法にあります。
モジュール | 相違点 |
---|---|
ab.braket |
|
braket |
|
ここでは、\braket
を使ったそれぞれの例を紹介しておきます。braket パッケージの記法とも少し異なることに注意してください。
% ab.braket module
\[
\braket< \psi > \quad
\braket< \frac{\phi}{2} | \psi > \quad
\braket< \frac{\phi}{2} | H | \psi > \quad
\]
% braket module
\[
\braket[1]{ \psi } \quad
\braket{ \frac{\phi}{2} }{ \psi } \quad
\braket[3]{ \frac{\phi}{2} }{ H }{ \psi } \quad
\]
もしも、これらモジュールの記法や機能が気に入らない場合は、モジュールを有効にせずに braket パッケージを利用すると良いでしょう。
▽ doubleprod
モジュール
このモジュールから提供されるコマンドは、以下の 2 つです。
\doublecross
\doubledot
\usephysicsmodule{doubleprod}
オプション | デフォルト値 | 説明 |
---|---|---|
crossscale |
0.8 |
大きさ |
dotscale |
1 |
大きさ |
crossopenup |
0.02 |
× の間隔幅 |
dotopenup |
0.2 |
⋅ の間隔幅 |
▽ diagmat
モジュール
このモジュールから提供されるコマンドは、\diagmat
と接頭辞を付けたコマンドの計 6 つです。これらは、括弧の有無や形状以外は同じ機能を有しています。
\diagmat
\pdiagmat
\bdiagmat
\Bdiagmat
\vdiagmat
\Vdiagmat
\usephysicsmodule{diagmat}
このモジュールは amsmath を必要とします。
このモジュールはオプションがあります。このオプションはモジュールでグローバルに指定できます。また、各コマンドのオプション指定もできます。
オプション | デフォルト値 | 説明 |
---|---|---|
empty |
0 |
非対角成分の文字 |
実際に使った例をいくつか紹介します。
\diagmat
は対角行列成分を引数に採って、対角行列を書くことが出来ます。各成分は ,
で区切ります。
\[
\diagmat{1, 2, 3, 4}
\]
\diagmat
は接頭辞 § (p
・b
・B
・v
・V
) を用いること (\Xdiagmat
) で、括弧を自動的に与えることが出来ます。また、empty
オプションから非対角成分を指定できます。
\[
\pdiagmat[empty={}]{1, 2, 3, 4}
\]
現在、反対角行列を書くコマンドは提供されていません。
▽ xmat
モジュール
このモジュールから提供されるコマンドは、\xmat
と接頭辞を付けたコマンドの計 6 つです。これらは、括弧の有無や形状以外は同じ機能を有しています。
\xmat
\pxmat
\bxmat
\Bxmat
\vxmat
\Vxmat
\usephysicsmodule{xmat}
このモジュールは amsmath を必要とします。
このモジュールはオプションがあります。このオプションはモジュールでグローバルに指定できます。また、各コマンドのオプション指定もできます。
オプション | デフォルト値 | 説明 |
---|---|---|
showtop |
8 |
省略せずに表示する行数 |
showleft |
8 |
省略せずに表示する列数 |
format |
#1_{#2#3} |
行列の形式を指定する
|
showtop
・showleft
のデフォルト値は MaxMatrixCols より 2 小さくなります。amsmath では MaxMatrixCols は 10 であるため、8
がデフォルト値となっています。
実際に使った例をいくつか紹介します。
\xmat
は $a_{mn}$ のような行列を簡単に書くことができます。
\[
\xmat{a}{2}{3}
\]
\xmat
は接頭辞 § (p
・b
・B
・v
・V
) を用いること (\Xxmat
) で、括弧を自動的に与えることが出来ます。
また、showtop
・showleft
オプションから省略せずに表示する行列の数を指定できます。m 行 n 列の行列を表現したい際に有益です。
\[
\pxmat[showtop=2, showleft=3]{M}{m}{n}
\]
format
オプションを利用すれば、x[row][col]
のような行列を書くことが出来ます。
\[
\xmat[
showtop=3,
showleft=2,
format=\texttt{#1[#2][#3]}
]{x}{m}{n}
\]
☆ physics パッケージでの問題
この記事の # この節 で physics パッケージで生じていた問題を 2 つ紹介していました。physics2 パッケージでは、これらの問題は解消されているのか確かめておきましょう。
提起した問題は次の 2 つでした。
- 実装内に奇妙なスペースを構成している
\fbox{$\ev*{\hat{O}_P}$}
- ドキュメント作成者の意図しない引数の扱い方をする
$\dv{x}{t}(y^2-5)$
physics2 パッケージでは、微分記法に関するコマンドを提供していないため、1 つ目の問題に関して確かめてみましょう。
\fbox{$\braket[1]{\hat{O}_P}$}
括弧周りの奇妙なスペースはありません。physics パッケージで確認された問題は physics2 パッケージで再現されません。嬉しいですね
少し山括弧が大きい気がする場合は、big
をオプションに加えると良いでしょう。
\fbox{$\braket[1, big]{\hat{O}_P}$}
big
オプションが与えられた場合でも、physics パッケージのような問題は再現されません
私は、実装に関してヤバいところがあるかどうか分かりません。分かる人は時間がある時に、ぜひコードを確認してみてください
★ サポートされないコマンド
physics パッケージから提供されていたコマンドの内、いくつかのコマンドについて physics2 パッケージはサポートを計画していません
- 微分記法に関するコマンド
-
\sin(...)
・\log(...)
etc. -
\comm
・\comm*
-
\acomm
・\acomm*
\pb
-
\vb
・\vb*
-
\va
・\va*
-
\vu
・\vu*
-
\mqty
・\Xmqty
\smqty
これらの解決方法については、physics2 manual for physics users (PDF) を参照すると良いでしょう。また、微分記法に関するコマンドは diffcoeff や derivative パッケージを利用すると良いでしょう。
余談
physics パッケージは、実は問題がいくつもあります。他のパッケージに乗り換えた方が賢明でしょう。physics パッケージの類似記法を数多く提供している physics2 パッケージは、移行先として有力なパッケージです。
今回紹介した physics2 パッケージは、以下のリポジトリで開発されています。問題や新たな機能リクエストがあれば、Issue を提起しておくと良いでしょう。
画像生成用ファイル(折りたたみ)
% +++
% latex = "lualatex"
% +++
\documentclass[paper=a6]{jlreq}
\usepackage{amsmath}
\usepackage{mathtools}
\mathtoolsset{showonlyrefs}
\usepackage{physics}
\usepackage[active, tightpage, displaymath]{preview}
\begin{document}
\begin{preview}
\rule{\textwidth}{0mm}
\begin{center}
\fbox{$\ev*{\hat{O}_P}$}
\end{center}
\end{preview}
\begin{equation}
\dv{x}{t}(y^2-5)
\end{equation}
\end{document}
% +++
% latex = "lualatex"
% +++
\documentclass[paper=a5]{jlreq}
\usepackage{amsmath}
\usepackage{mathtools}
\mathtoolsset{showonlyrefs}
\usepackage{mleftright}
\usepackage{physics2}
\usephysicsmodule{ab, braket, doubleprod, diagmat, xmat}
\newcommand{\cmd}[1]{\texttt{\textbackslash #1}}
\newcommand{\cmdtext}[1]{\text{\texttt{\textbackslash #1}}}
\usepackage[active, tightpage, displaymath]{preview}
\begin{document}
\begin{alignat}{4}
\sin(x), &\qquad& \sum(x), &\qquad& (x)(x). &\qquad&& \text{normal}
\\
\sin\left(x\right), && \sum\left(x\right), && \left(x\right)\left(x\right). &&& \text{\cmd{left} and \cmd{right}}
\\
\sin\mleft(x\mright), && \sum\mleft(x\mright), && \mleft(x\mright)\mleft(x\mright). &&& \text{\cmd{mleft} and \cmd{mright}}
\\
\sin\delopen(x\delclose), && \sum\delopen(x\delclose), && \delopen(x\delclose)\delopen(x\delclose). &&& \text{\cmd{delopen} and \cmd{delclose}}
\\
\sin\ab(x), && \sum\ab(x), && \ab(x)\ab(x). &&& \cmdtext{ab}
\end{alignat}
\begin{equation}
\ab (\frac{1}{2})
\quad
\ab [\frac{1}{2}]
\quad
\ab\{\frac{1}{2}\}
\quad
\ab |\frac{1}{2}|
\quad
\ab\|\frac{1}{2}\|
\quad
\ab <\frac{1}{2}>
\end{equation}
\begin{equation}
\ab\Bigg[\frac{1}{2}]
\bab[Bigg]{\frac{1}{2}}
\end{equation}
\begin{equation}
\braket[1]{\psi}
\quad
\braket{\frac{\phi}{2}}{\psi}
\quad
\braket[3]{\frac{\phi}{2}}{H}{\psi}
\end{equation}
\begin{alignat}{5}
\cmdtext{doublecross}&\quad&
\doublecross
&\qquad\qquad\qquad\qquad&
\cmdtext{doubledot}&\quad&
\doubledot
\end{alignat}
\begin{equation}
\diagmat{1,2,3,4}
\end{equation}
\begin{equation}
\pdiagmat[empty={}]{1,2,3,4}
\end{equation}
\begin{equation}
\xmat{a}{2}{3}
\end{equation}
\begin{equation}
\pxmat[showtop=2, showleft=3]{M}{m}{n}
\end{equation}
\begin{equation}
\xmat[
showtop=3,
showleft=2,
format=\texttt{#1[#2][#3]}
]{x}{m}{n}
\end{equation}
\begin{preview}
\begin{center}
\rule{\textwidth}{0mm}
\fbox{$\braket[1]{\hat{O}_P}$}
\end{center}
\end{preview}
\end{document}
追記
- 2023/05/24: いくつかの画像を追加。軽微修正。
- 2024/03/21: ver.1.0 以降では
common
モジュールが素の physics2 パッケージに取り込まれたため、common
モジュールに関する記述を修正しました。