§.本記事の目的と対象読者
本記事の目的はphysicsパッケージを脱却し、physics2パッケージを中心に他のパッケージへの乗り換えを行うことである。
読者ターゲットは「physicsパッケージ使用者」を想定する。あるいは「数式を扱う上で便利なパッケージを探している方」にとっても一読の価値はある。
そもそもphysicsパッケージを使用していない方は、初めからphysics2パッケージを導入することを推奨する。
§.諸注意
- physics2パッケージは現在も開発段階にあるパッケージです。そのため、本記事を公開して以降も、何かと変更があるかと思います。公式ドキュメントを確認することもおすすめします
- 筆者は実行環境として、Overleafを採用しています
- 本記事ではamsmathパッケージの使用を前提としています
\usepackage{amsmath}
§.目次
- 本記事の目的と対象読者
- 諸注意
- physics2パッケージ導入の必要性
- physicsパッケージの代替案
-
physicsパッケージと代替パッケージの対応
この節が本記事における核である。ここに至るまでの“前置き”が少し長いので、本題が気になる場合はここまで読み飛ばして構わない -
結論
「結論」では、\usepackage{physics}
の代わりにプリアンブルへ書くべきコードを添付した。 - 参考文献
§.physics2パッケージ導入の必要性
皆さんは、physicsパッケージを使用しているだろうか。physicsパッケージは、$\LaTeX$で数式を記述する場合に使用する非常に強力なパッケージだ。例えば括弧の大きさを自動調整し、
\begin{align}
\left \{ \frac{1}{2} \right \}
\end{align}
のように出力したいとする。通常は
\left\{ \frac{1}{2} \right\}
とする必要がある。\left
やら\right
やら書くのも面倒くさい。より多くのコマンドを必要とすることから、括弧が増えるほど可読性もますます下がる。しかしphysicsパッケージでは、\qty
コマンドによって単に
\qty{ \frac{1}{2} }
とするだけで事足りる。これは一例であり他にも便利コマンドは多いが、physicsパッケージは有用である。
しかし、この\qty
コマンドを含め、physicsパッケージは幾つかの問題点を孕んでいることをご存知だろうか。具体的には、以下のように分類できる1。
- 他パッケージとのコンフリクト
- physicsパッケージ実装上の問題
- 出力結果における問題
複数の問題があるにもかかわらず、2012年からアップデートが無い点にも留意すべきだろう。
physicsパッケージにおける問題点の確認
ここではphysicsパッケージによって引き起こるトラブルを、具体的に3つ紹介しよう。
問題点1:他パッケージのコマンドとのコンフリクト
physicsパッケージとsiunitxパッケージにおける\qty
コマンドがコンフリクトする。siunitxパッケージとは、SI単位系を扱う際に有用なパッケージである。先述のように、physicsパッケージにおける\qty
コマンドは括弧の大きさを自動調整するコマンドだ。一方、siunitxパッケージにおける\qty
コマンドは、「数値+SI単位」の出力を簡単にする。
\documentclass{jsarticle}
\usepackage{siunitx}
\begin{document}
\qty{ 3.0e8 }{ m.s^{-1} }
\end{document}
しかし、physicsパッケージとsinuitxパッケージを同時に読み込むと、\qty
コマンドが競合し、正しい出力を得られない。
\documentclass{jsarticle}
\usepackage{physics}
\usepackage{siunitx}
\begin{document}
$ \displaystyle \qty{ \frac{1}{2} } $
\qty{ 3.0e8 }{ m.s^{-1} }
\end{document}
例えば他にも、後述する\pdv
コマンドがphysicsパッケージとderivativeパッケージで競合する。
問題点2 : 公式ドキュメントに無いコマンドと上書き問題
physicsパッケージには「隠しコマンド」が存在する。
\homework
と入力すると、電磁気学におけるMaxwell方程式と量子力学におけるSchrödinger方程式が出力される。
\homework
コマンドはphysics.sty2では明確に宣言されているが、公式ドキュメントには記載されていない。また、我々が独自に\homework
コマンドを定義していても、physicsパッケージを読み込むことで勝手に上書きされてしまう。
問題点3:出力結果が“乱れる”
例えば、量子力学において
- 演算子$\hat{\mathcal{O}}$の期待値
- 状態$\ket{\phi},\ket{\psi} $の内積
を箱で囲んで表示したいとする。
\fbox{ $ \ev*{ \hat{O} } $ }
\fbox{ $ \braket*{ \phi }{ \psi } $ }
これの出力結果を以下に示す。
囲いに対して文字が僅かに右寄りなのが分かるだろうか。これは論文のレイアウトとしてはよろしく無い。
さらに変数を明記した全微分や偏微分
\frac{dy}{dt}(t)
\quad
\frac{\partial y}{\partial t}(t, x)
を表示したいとする。physicsパッケージには全微分と偏微分を表示するための\dv
・\pdv
コマンドがある。これらを使用すると、出力結果が“乱れ”てしまう。
\dv{y}{t}(t)
\pdv{y}{t}(t,x)
ソースコードには変数を明示しているにも関わらず、出力結果には反映されていないことが分かる。
そこでphysics2パッケージ
そこで開発されたパッケージがphysics2パッケージである。physics2パッケージはphysicsパッケージが直面した問題を回避しつつ、数式を「より速く・より簡潔に」記述するためのコマンドをサポートしている。
使用方法
physics2パッケージはプリアンブルに
\usepackage{physics2}
と記載することで使用できるようになる。physics2パッケージはモジュール化されたパッケージであり、モジュールをロードすることで豊富なコマンドが使用できる。モジュールのロード方法は\usepackage
とほぼ同じである。同じくプリアンブルに
\usephysicsmodule{<module>}
と記載すれば良い。また、
\usephysicsmodule{<module1>,<module2>,...}
のように、複数のモジュールを一括でロードすることもできる。physics2パッケージが提供するモダンなモジュール3と各機能は以下の通りである。
モダンモジュール名 | <module> |
何ができる? |
---|---|---|
The ab module | ab |
括弧サイズの自動調整 |
The ab.braket module | ab.braket |
braket記法 |
The braket module | braket |
braket記法 |
The disgmat module | disgmat |
対角行列の表記 |
The doubleprod module | doubleprod |
テンソル演算の記号 |
The xmat module | xmat |
行列の表記 |
なお、physicsパッケージに準拠したレガシーモジュールも提供している。
「新規ドキュメントを作成する場合、レガシーモジュールの使用は推奨しない」とパッケージ開発者は述べている。これを受け、本記事ではレガシーモジュールを一切登場させない立場を採った。
レガシーモジュール名 | <module> |
---|---|
The ab.legacy module | ab.legacy |
The bm-um.legacy module | bm-um.legacy |
The nabla.legacy module | nabla.legacy |
The op.legacy module | op.legacy |
The qtext.legacy module | qtext.legacy |
§.physicsパッケージの代替案
前節で紹介したようにphysicsパッケージには問題点が幾つもある。他のパッケージへの移行が推奨されるが、一方でモダンモジュールはphysicsパッケージの全てを網羅し、継承しているわけでは無い。physicsパッケージが提供している主要なコマンドと機能について確認しよう。
コマンド | 何ができる? |
---|---|
Automatic bracing | 括弧サイズの自動調整など |
Vector notation | ベクトル記法や勾配・発散・回転 |
Operators | 初等関数や$\mathrm{Tr}$記号など |
Derivatives | 常微分・偏微分など |
Dirac bra-ket notation | braketによる表現 |
Matrix macros | 行列表記 |
例えば「常微分・偏微分」のコマンドは、モダンモジュールには存在しない。そこで我々はいくつかのパッケージによって、これらをカバーすることを目指す。
§.physicsパッケージと代替パッケージの対応
本節では、physicsパッケージの各コマンドをどのパッケージで置き換えると良いかを整理した。気になる各項目を適宜展開し、確認して欲しい。
Automatic bracing
括弧の自動調整・絶対値・ノルム
physics2パッケージのabモジュールを利用する4。
\usephysicsmodule{ab}
abモジュールによって、
- 小括弧$(~)$
- 中括弧・Poisson括弧$\{~\}$
- 大括弧・交換子$[~]$
- 絶対値$|~|$
- ノルム$||~||$
を出力できる。\ab
コマンドの基本的な使い方は\qty
コマンドと同様だ。
\ab( \frac{1}{2} )
\ab[ \frac{1}{2} ]
\ab< \frac{1}{2} >
\ab| \frac{1}{2} |
\ab\| \frac{1}{2} \|
\ab
コマンドにおける中括弧$\{\cdot\}$の出力方法は、\qty
コマンドとは異なる点に注意。
\qty{ \frac{1}{2] }
\ab\{ \frac{1}{2} \}
他にもphysicsパッケージのAutomatic bracingでは、積分値の評価とオーダー記号を出力するコマンドも提供している5。
積分値の評価
\eval{ \frac{1}{x} }_{0}^{\infty}
\left, \right
コマンドによって代替する。
\newcommand{\eval}[1]{\left. #1 \right|}
~~~
\eval{ \frac{1}{x} }_0^\infty
Landau記号
\order{ \frac{1}{x} }
これは\mathcal
コマンドで代替する。\mathcal
コマンドは花文字を出力するコマンドで、mathrsfsパッケージをロードする必要がある。
\usepackage{mathrsfs}
\newcommand{\order}[1]{\mathcal{O} \ab( #1 )}
~~~
\order{ \frac{1}{x} }
Vector notation
ベクトル記法
physicsパッケージでは以下のコマンドを提供している。
\vb{v}
\va{v}
\vu{v}
これらのコマンドを、physics2パッケージがサポートする計画は無い。ベクトル記法に関するコマンドとして、\bm
コマンドや\boldsymbol
コマンドがある。
どうしてもphysicsパッケージにおける\vb
コマンドなどを使用したければ、以下のコードをプリアンブルに記載すれば良い。
\makeatletter
\newcommand\vb{\@ifstar\boldsymbol\mathbf}
\newcommand\va[1]{\@ifstar{\vec{#1}}{\vec{\mathrm{#1}}}}
\newcommand\vu[1]{%
\@ifstar{\hat{\boldsymbol{#1}}}{\hat{\mathbf{#1}}}}
\makeatother
このように定義したとき、各コマンドの出力結果は以下になる。
矢印付きのベクトル(\va
コマンド)の出力結果が、physicsパッケージのそれとは異なると分かる。矢印付きベクトルは文字をわざわざ太字にする必要が無いためだ。
またphysicsパッケージは\vdot, \cross
コマンドを提供しているが、これは\cdot, \times
コマンドで十分である。
勾配・発散・回転
$\nabla$:\nabla
コマンドが使用できる。勾配\grad
・発散\div
・回転\rot
のコマンドを使用したければ、以下をプリアンブルに記載すれば良い。
% 勾配
\DeclareMathOperator{\grad}{\nabla}
% 発散
% \divが「÷」と競合するため再定義
\DeclareMathOperator{\divergence}{\nabla\cdot}
\let\divisionsymbol\div
\renewcommand{\div}{\divergence}
% 回転
\DeclareMathOperator{\rot}{\nabla\times}
% \DeclareMathOperator{\curl}{\nabla\times} % 個人の好みによって、\rotでは無く\curlをどうぞ
出力結果は次のようになる。コマンドを再定義した除算についても併記した。
\grad \phi
\div \bm{x}
\rot \bm{x}
a \divisionsymbol b
Operators
physics2パッケージはOperatorsのコマンドを全てサポートする計画は無い。
初等関数
sin関数なら、例えば
\sin \ab( \frac{\pi}{2} )
などとすれば良い。
Re, Im, Tr, rank などの記号
$\mathrm{Re, Im}$はデフォルトでは、RとIがドイツ文字となっている。
\Re \ab[ f(z) ]
\Im \ab[ f(z) ]
Roman体を使用したい場合、
\renewcommand{\Re}{\operatorname{Re}}
\renewcommand{\Im}{\operatorname{Im}}
\newcommand{\Tr}{\operatorname{Tr}}
\newcommand{\rank}{\operatorname{rank}}
とプリアンブルに記載すれば良い(ここでは$\mathrm{Tr, rank}$もまとめて定義しておいた)。
\Re \ab[ f(z) ]
\Im \ab[ f(z) ]
\Tr \ab[ A ]
\rank \ab[ A ]
Derivatives
physics2パッケージは、Derivativesのコマンドをサポートする計画は無い。我々はfixdifパッケージとderivativeパッケージを採用しよう。これらはコンフリクトしないため、安心して同時に読み込める。
\usepackage{fixdif, derivative}
微分演算子
physicsパッケージでは微分演算子$\mathrm{d}$を出力するコマンドが用意されている。
\dd x
これはfixdifパッケージのコマンドで代替可能である。
\d x
常微分
physicsパッケージでは$n$階常微分を出力するコマンドが用意されている。
\dv{x}
\dv{f}{x}
\dv[n]{f}{x}
これはderivativeパッケージにおける\odv
コマンドで代替できる。記法が僅かに異なることに注意。$n$階常微分を出力するときは、optionとしてorder=n
と記載する必要がある。
\odv{}{x}
\odv{f}{x}
\odv[order=n]{f}{x}
他にも、\odv
コマンドには以下のような記法がある。
\odv{f}/{x}
\odv*{f(x)}{x}
偏微分
physicsパッケージでは$n$階偏微分を出力するコマンドが用意されている。
\pdv{x}
\pdv{f}{x}
\pdv{f}{x}{y}
\pdv[n]{f}{x}
これはderivativeパッケージにおける\pdv
コマンドで代替できる(代替というより、もはや完全上位互換)。コマンド名は同一だが、記法が異なることに注意。
\pdv{}{x}
\pdv{f}{x}
\pdv{f}{x, y}
\pdv[order=n]{f}{x}
他にも\pdv
コマンドは、以下のようにphysicsパッケージにはできない複雑な処理などもできる6。
\pdv{f}/{x}
\pdv*{f(x,y,z)}{x}
\pdv[order={2, 1, 2}]{f}{x, y, z}
Dirac bra-ket notation
physicsパッケージにはbraket記法を提供するコマンドが存在する。以下のように、
- braベクトル$\ket{\psi}$・ketベクトル$\bra{\phi}$
- 内積$\braket{\phi|\psi} $・外積$\ketbra{\psi}{\phi}$
- 期待値$\braket{\psi|A|\psi}$
などを出力できる。
\ket{\psi}
\bra{\phi}
\braket{\phi}{\psi}
\dyad{\psi}{\phi}
\braket{\psi}
\ev{A}{\psi}
これの代替としてphysics2パッケージのab.braketモジュールを紹介する。他の手段として、
- physics2パッケージのbraketモジュール
- braketパッケージ
が挙げられる。braketモジュールはphysicsパッケージの記法に似ている。ここら辺は個人の好みで好きなパッケージ・モジュールを採用すれば良い7。
これらは互いにコンフリクトするため、同時に読み込まないように。
ab.braketモジュールは、\bra, \ket, \braket, \ketbra
という“わかりやすい”コマンドや、$|, <, >$という直感的な記号を使用することで記述をできる点が良い。また括弧のサイズも自動調整される。
\ket|\psi>
\bra<\phi|
\braket<\phi|\psi>
\ketbra|\psi><\phi|
\braket<\psi>
\braket<\psi|A|\psi>
期待値$\braket{\psi|A|\psi}$の絶対値を採るときは注意が必要。
\ab| \braket<\psi|A|\psi> | % 不適切な記法
\ab| { \braket<\psi|A|\psi> } | % 適切な記法
\braket<\psi|A|\psi>
を中括弧$\{~\}$の中に入れなければ、正しい結果は出力されない。
Matrix macros
\mqty
コマンド
physicsパッケージでは行列を簡潔に記述できる\mqty
コマンドを提供している。
\mqty{ a&b\\c&d } % 括弧無し
\mqty( a&b\\c&d ) % 小括弧( )
\mqty[ a&b\\c&d ] % 大括弧[ ]
\mqty| a&b\\c&d | % 行列式| |
physics2パッケージは\mqty
コマンドをサポートする計画は無い。プリアンブルに以下のコマンドを定義すると良い。
\newcommand{\mqty}[1]{\begin{matrix}#1\end{matrix}}
これはphysicsパッケージにおける\mqty{}
と同じ出力結果を得る。\mqty(), \mqty[], \mqty||
などと同様の結果を得たい場合、次のように記載すれば良い。
\mqty{ a&b\\c&d } % 括弧無し
\ab( \mqty{ a&b\\c&d } ) % 小括弧()
\ab[ \mqty{ a&b\\c&d } ] % 大括弧[ ]
\ab| \mqty{ a&b\\c&d } | % 行列式| |
対角行列
physicsパッケージでは対角行列を記述する\dmat
コマンドを提供している。
\mqty(\dmat{1,2,3})
\mqty(\dmat[0]{1,2,3})
代替として、physics2パッケージのdiagmatモジュールを採用する。
\usephysicsmodule{diagmat}
diagmatモジュールでは、\diagmat
コマンドによって対角行列を記述できる。
%--- 非対角成分が0 ---%
\diagmat{ 1, 2, 3 } % 括弧無し
\ab( \diagmat{ 1, 2, 3 } ) % 小括弧( )
\pdiagmat{ 1, 2, 3 } % 小括弧( )
%--- 非対角成分が空 ---%
\ab( \diagmat[ empty={} ]{ 1, 2, 3 } )
%--- 非対角成分がa ---%
\ab( \diagmat[ empty={a} ]{ 1, 2, 3 } )
n×m行列
physicsパッケージではn×m行列を記述する\xmat
コマンドを提供している。
\smqty( \xmat{a}{3}{2} )
\smqty( \xmat*{a}{3}{2} )
これの代替(というか、完全上位互換)として、physics2パッケージのxmatモジュールを採用する。physics2パッケージのほうがレイアウトが綺麗であり、一般的な$n\times m$行列も出力できる。
\usephysicsmodule[<option>]{xmat}
xmatモジュールでは、\xmat
コマンドによって$n\times m$行列を記述できる。<option>
では$n\times m$行列においてどこまで成分を表示するかについて命令できる。詳しくは後述。
まず、physicsパッケージにおける\smqty( \xmat{a}{3}{2} )
に対応する結果は以下である。
\xmat{a}{3}{2} % 括弧無し
\ab( \xmat{a}{3}{2} ) % 小括弧( )
\pxmat{a}{3}{2} % 小括弧( )
次に一般的な$n\times m$行列を出力しよう。\usephysics
のときに<option>
を設定しない場合、以下のように“余分”な成分まで出力されてしまう。
\usephysicsmodule{xmat}
~~~
\pxmat{a}{n}{m}
そこで<option>
を設定することで、出力される行列成分の数を制限できる。<option>
の設定方法は2つある。
-
\usephysicsmodule
で設定する - 各々の
\pxmat
コマンドで設定する
前者はドキュメント全体に適用されるため、今回はこちらを採用しよう。
\usephysicsmodule[showleft=2,showtop=2]{xmat}
~~~
\pxmat{a}{n}{m}
§.結論
physics2パッケージのモダンモジュールを中心として、時には他のパッケージも援用することで、physicsパッケージの代替手段を提案した。physicsパッケージは大くの問題を抱えながらも、10年以上更新の無いパッケージである。そのため、physics2パッケージへ乗り換えることを強く勧める。
これ以降は、プリアンブルに\usepackage{physics}
では無く、
%---------- package ----------%
%--- physics2 ---%
\usepackage{physics2}
\usephysicsmodule{ab} % 括弧サイズの自動調整
\usephysicsmodule{ab.braket} % braket記法
\usephysicsmodule{diagmat} % 対角行列
\usephysicsmodule[showleft=2,showtop=2]{xmat} % n×m行列
%--- physics2 END ---%
% 数式環境
\usepackage{amsmath}
% ベクトル
\usepackage{bm}
%--- 微分演算子 ---%
\usepackage{fixdif}
\usepackage{derivative}
%--- 微分演算子 END ---%
% 花文字
\usepackage{mathrsfs}
%---------- package END ----------%
%---------- newcommand ----------%
% 積分値の評価
\newcommand{\eval}[1]{\left.#1\right|}
% Landau記号
\newcommand{\order}[1]{\mathcal{O}\ab(#1)}
%--- physicsパッケージの\vbコマンドを再現 --%
\makeatletter
\newcommand\vb{\@ifstar\boldsymbol\mathbf}
\newcommand\va[1]{\@ifstar{\vec{#1}}{\vec{\mathrm{#1}}}}
\newcommand\vu[1]{%
\@ifstar{\hat{\boldsymbol{#1}}}{\hat{\mathbf{#1}}}}
\makeatother
%--- physicsパッケージの\vbコマンドを再現 END --%
%--- 勾配・発散・回転 ---%
% 勾配
\DeclareMathOperator{\grad}{\nabla}
% 発散
% \divが「÷」と競合するため再定義
\DeclareMathOperator{\divergence}{\nabla\cdot}
\let\divisionsymbol\div
\renewcommand{\div}{\divergence}
% 回転
\DeclareMathOperator{\rot}{\nabla\times}
%--- 勾配・発散・回転 END ---%
% 実部
\renewcommand{\Re}{\operatorname{Re}}
% 虚部
\renewcommand{\Im}{\operatorname{Im}}
% トレース
\newcommand{\Tr}{\operatorname{Tr}}
% rank
\newcommand{\rank}{\operatorname{rank}}
% \mqtyコマンド
\newcommand{\mqty}[1]{\begin{matrix}#1\end{matrix}}
%---------- newcommand END ----------%
などとすれば良い。
§.参考文献
本記事を作成するにあたって、主に以下の文献を頼った。
公式ドキュメント
- The physics package
- The physics2 package
- physics2 manual for the legacy physics users
- The fixdif Package
- The derivative package
- The braket package
LaTeXユーザーのコミュニティ
-
LaTeX Stack Exchanges
具体的には以下の議論を参考にした
記事
Qiita
その他(ネットに転がっていた記事)
-
これらの問題点はphysics2パッケージの公式ドキュメントやLaTeX Stack Exchangeで議論されており、またこの記事では日本語で丁寧に整理されている。本記事の分類はこれらを参考にした。 ↩
-
styleファイル(.sty)とは簡単に言うと、パッケージを読み込んだときにどのコマンドがどうのように動くかを命令するプログラムである。 ↩
-
レガシーモジュールと明確に区別する意味で、本記事では「モダンモジュール」と呼称する。 ↩
-
ab
モジュールはAutomatic bracingの略称である。 ↩ -
physics2パッケージのレガシーモジュールでも、積分値の評価とオーダー記号は対応できる。 ↩
-
筆者は知らないのだが、physicsパッケージの
\pdv
コマンドで$\displaystyle \frac{\partial^5 f(x,y,z) }{\partial^2 x \partial y \partial^2 z} $のような少し複雑な処理はできるのだろうか? ↩ -
braketパッケージは括弧の大きさを自動調整する際、
\braket{}{}
では無く\Braket{}{}
のように何故か大文字で記述しなければならない点が、個人的に好きでは無い。 ↩