LoginSignup
2
3

physicsパッケージからphysics2パッケージへ移行すべきである【LaTeX】

Last updated at Posted at 2024-03-19

§.本記事の目的と対象読者

本記事の目的は「physicsパッケージからphysics2パッケージへの乗り換えを行うこと」である。

読者ターゲットは「physicsパッケージ使用者」を想定する。あるいは「数式を扱う上で便利なパッケージを探している方」にとっても一読の価値はある。

そもそもphysicsパッケージを使用していない方は、初めからphysics2パッケージを導入することを推奨する。

§.諸注意

  1. physics2パッケージは現在も開発段階にあるパッケージです。そのため、本記事を公開して以降も、何かと変更があるかと思います。公式ドキュメントを確認することもおすすめします
  2. 筆者は実行環境として、Overleafを採用しています
  3. 本記事ではamsmathパッケージの使用を前提としています
プリアンブル
\usepackage{amsmath}

§.目次

§.physics2パッケージ導入の必要性

皆さんは、physicsパッケージを使用しているだろうか。physicsパッケージは、$\LaTeX$で数式を記述する場合に使用する非常に強力なパッケージだ。例えば括弧の大きさを自動調整し、

\begin{align}
    \left \{ \frac{1}{2} \right \}
\end{align}

のように出力したいとする。通常は

括弧を自動調整:デフォルト
\left\{ \frac{1}{2} \right\}

とする必要がある。\leftやら\rightやら書くのも面倒くさい。より多くのコマンドを必要とすることから、括弧が増えるほど可読性もますます下がる。しかしphysicsパッケージでは、\qtyコマンドによって単に

括弧を自動調整:physicsパッケージ
\qty{ \frac{1}{2} }

とするだけで事足りる。このようにphysicsパッケージは便利である。

しかし、この\qtyコマンドを含め、physicsパッケージは幾つかの問題点を孕んでいることをご存知だろうか。具体的には、以下のように分類できる1

  • 他パッケージとのコンフリクト
  • physicsパッケージ実装上の問題
  • 出力結果における問題

複数の問題があるにもかかわらず、2012年からアップデートが無い点にも留意すべきだろう。

physicsパッケージにおける問題点の確認

ここではphysicsパッケージによって引き起こるトラブルを、具体的に3つ紹介しよう。

問題点1:他パッケージのコマンドとのコンフリクト

physicsパッケージとsiunitxパッケージにおける\qtyコマンドがコンフリクトする。siunitxパッケージとは、SI単位系を扱う際に有用なパッケージである。先述のように、physicsパッケージにおける\qtyコマンドは括弧の大きさを自動調整するコマンドだ。一方、siunitxパッケージにおける\qtyコマンドは、「数値+SI単位」の出力を簡単にする。

siunitxパッケージにおける\qtyコマンド
\documentclass{jsarticle}
\usepackage{siunitx}
\begin{document}

\qty{ 3.0e8 }{ m.s^{-1} }

\end{document}

しかし、physicsパッケージとsinuitxパッケージを同時に読み込むと、\qtyコマンドが競合し、正しい出力を得られない。

\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コマンド
\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パッケージはプリアンブルに

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コマンド
    \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

積分値の評価

積分値の評価-physicsパッケージ
\eval{ \frac{1}{x} }_{0}^{\infty}

\left, \rightコマンドによって代替する。

積分値の評価-代替
\newcommand{\eval}[1]{\left. #1 \right|}
~~~
\eval{ \frac{1}{x} }_0^\infty 

Landau記号

Landau記号-physicsパッケージ
\order{ \frac{1}{x} }

これは\mathcalコマンドで代替する。\mathcalコマンドは花文字を出力するコマンドで、mathrsfsパッケージをロードする必要がある。

Landau記号-代替
\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コマンドなどを使用したければ、以下のコードをプリアンブルに記載すれば良い。

どうしても\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関数
\sin \ab( \frac{\pi}{2} )

などとすれば良い。

Re, Im, Tr, rank などの記号

$\mathrm{Re, Im}$はデフォルトでは、RとIがドイツ文字となっている。

Re, Im(デフォルト)
\Re \ab[ f(z) ]
\Im \ab[ f(z) ]

Roman体を使用したい場合、

Re, Im, Tr, rank
\renewcommand{\Re}{\operatorname{Re}}
\renewcommand{\Im}{\operatorname{Im}}
\newcommand{\Tr}{\operatorname{Tr}}
\newcommand{\rank}{\operatorname{rank}}

とプリアンブルに記載すれば良い(ここでは$\mathrm{Tr, rank}$もまとめて定義しておいた)。

Re, Im, 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}$を出力するコマンドが用意されている。

微分演算子-physicsパッケージ
\dd x

これはfixdifパッケージのコマンドで代替可能である。

微分演算子-fixdifパッケージ
\d x

常微分

physicsパッケージでは$n$階常微分を出力するコマンドが用意されている。

常微分-physicsパッケージ
\dv{x}
\dv{f}{x}
\dv[n]{f}{x} 

これはderivativeパッケージにおける\odvコマンドで代替できる。記法が僅かに異なることに注意。$n$階常微分を出力するときは、optionとしてorder=nと記載する必要がある。

常微分-derivativeパッケージ
\odv{}{x}
\odv{f}{x}
\odv[order=n]{f}{x} 

他にも、\odvコマンドには以下のような記法がある。

\odvコマンドの補足
\odv{f}/{x}
\odv*{f(x)}{x}

偏微分

physicsパッケージでは$n$階偏微分を出力するコマンドが用意されている。

偏微分-physicsパッケージ
\pdv{x}
\pdv{f}{x}
\pdv{f}{x}{y} 
\pdv[n]{f}{x} 

これはderivativeパッケージにおける\pdvコマンドで代替できる(代替というより、もはや完全上位互換)。コマンド名は同一だが、記法が異なることに注意。

偏微分-derivativeパッケージ
\pdv{}{x}
\pdv{f}{x}
\pdv{f}{x, y}
\pdv[order=n]{f}{x} 

他にも\pdvコマンドは、以下のようにphysicsパッケージにはできない複雑な処理などもできる6

\pdvコマンドの補足
\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}$

などを出力できる。

braket-physicsパッケージ
\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という“わかりやすい”コマンドや、$|, <, >$という直感的な記号を使用することで記述をできる点が良い。また括弧のサイズも自動調整される。

braket-ab.braketモジュール
\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コマンド-physicsパッケージ
\mqty{ a&b\\c&d } % 括弧無し
\mqty( a&b\\c&d ) % 小括弧( )
\mqty[ a&b\\c&d ] % 大括弧[ ]
\mqty| a&b\\c&d | % 行列式| |

physics2パッケージは\mqtyコマンドをサポートする計画は無い。プリアンブルに以下のコマンドを定義すると良い。

\mqtyコマンドの定義
\newcommand{\mqty}[1]{\begin{matrix}#1\end{matrix}}

これはphysicsパッケージにおける\mqty{}と同じ出力結果を得る。\mqty(), \mqty[], \mqty||などと同様の結果を得たい場合、次のように記載すれば良い。

\mqtyコマンド-abモジュールとの組み合わせ
\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コマンドを提供している。

対角行列-physicsパッケージ
\mqty(\dmat{1,2,3})
\mqty(\dmat[0]{1,2,3})

代替として、physics2パッケージのdiagmatモジュールを採用する。

プリアンブル
\usephysicsmodule{diagmat}

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コマンドを提供している。

n×m行列
\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} )に対応する結果は以下である。

n×m行列(1)
\xmat{a}{3}{2} % 括弧無し
\ab( \xmat{a}{3}{2} ) % 小括弧( )
\pxmat{a}{3}{2} % 小括弧( )

次に一般的な$n\times m$行列を出力しよう。\usephysicsのときに<option>を設定しない場合、以下のように“余分”な成分まで出力されてしまう。

n×m行列(2)-option無し
\usephysicsmodule{xmat}
~~~
\pxmat{a}{n}{m}

そこで<option>を設定することで、出力される行列成分の数を制限できる。<option>の設定方法は2つある。

  1. \usephysicsmoduleで設定する
  2. 各々の\pxmatコマンドで設定する

前者はドキュメント全体に適用されるため、今回はこちらを採用しよう。

n×m行列(2)-optionあり
\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 ----------% 

などとすれば良い。

§.参考文献

本記事を作成するにあたって、主に以下の文献を頼った。

公式ドキュメント

LaTeXユーザーのコミュニティ

記事

Qiita

その他(ネットに転がっていた記事)

  1. これらの問題点はphysics2パッケージの公式ドキュメントLaTeX Stack Exchangeで議論されており、またこの記事では日本語で丁寧に整理されている。本記事の分類はこれらを参考にした。

  2. styleファイル(.sty)とは簡単に言うと、パッケージを読み込んだときにどのコマンドがどうのように動くかを命令するプログラムである。

  3. レガシーモジュールと明確に区別する意味で、本記事では「モダンモジュール」と呼称する。

  4. abモジュールはAutomatic bracingの略称である。

  5. physics2パッケージのレガシーモジュールでも、積分値の評価とオーダー記号は対応できる。

  6. 筆者は知らないのだが、physicsパッケージの\pdvコマンドで$\displaystyle \frac{\partial^5 f(x,y,z) }{\partial^2 x \partial y \partial^2 z} $のような少し複雑な処理はできるのだろうか?

  7. braketパッケージは括弧の大きさを自動調整する際、\braket{}{}では無く\Braket{}{}のように何故か大文字で記述しなければならない点が、個人的に好きでは無い。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3