【LaTeX】physicsパッケージとphysics2パッケージ（+α）との対応一覧

<!---------- 目的 ---------->

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

:::note info
本記事の目的はphysicsパッケージを脱却し、physics2パッケージを中心に他のパッケージへの乗り換えを行うことである。
:::
:::note info
読者ターゲットは「physicsパッケージ使用者」を想定する。あるいは「数式を扱う上で便利なパッケージを探している方」にとっても一読の価値はある。
:::

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


# §.諸注意

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


<!---------- 目的 END ---------->










<!---------- 目次 ---------->

# §.目次
+ [本記事の目的と対象読者](#本記事の目的と対象読者)
+ [諸注意](#諸注意)
+ [physics2パッケージ導入の必要性](#physics2パッケージ導入の必要性)
+ [physicsパッケージの代替案](#physicsパッケージの代替案)
+ [physicsパッケージと代替パッケージの対応](#physicsパッケージと代替パッケージの対応)
この節が本記事における核である。ここに至るまでの“前置き”が少し長いので、本題が気になる場合はここまで読み飛ばして構わない
+ [結論](#結論)
「結論」では、`\usepackage{physics}`の代わりにプリアンブルへ書くべきコードを添付した。
+ [参考文献](#参考文献)

<!---------- 目次 END ---------->









<!---------- Introduction ---------->

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

皆さんは、physicsパッケージを使用しているだろうか。physicsパッケージは、$\LaTeX$で数式を記述する場合に使用する非常に強力なパッケージだ。例えば括弧の大きさを自動調整し、
```math
\begin{align}
    \left \{ \frac{1}{2} \right \}
\end{align}
```
のように出力したいとする。通常は
```latex:括弧を自動調整：デフォルト
\left\{ \frac{1}{2} \right\}
```
とする必要がある。`\left`やら`\right`やら書くのも面倒くさい。より多くのコマンドを必要とすることから、括弧が増えるほど可読性もますます下がる。しかしphysicsパッケージでは、`\qty`コマンドによって単に
```latex:括弧を自動調整：physicsパッケージ
\qty{ \frac{1}{2} }
```
とするだけで事足りる。これは一例であり他にも便利コマンドは多いが、physicsパッケージは有用である。

しかし、この`\qty`コマンドを含め、physicsパッケージは**幾つかの問題点を孕んでいる**ことをご存知だろうか。具体的には、以下のように分類できる[^problem]。
[^problem]: これらの問題点は[physics2パッケージの公式ドキュメント][physics2]や[LaTeX Stack Exchange][stack]で議論されており、また[この記事][escape]では日本語で丁寧に整理されている。本記事の分類はこれらを参考にした。

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

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

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

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

<!----- 問題点1 ----->

<details><summary><b>問題点1：他パッケージのコマンドとのコンフリクト</b></summary>

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

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

\end{document}
```
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/e561b340-9fd0-9900-8c0a-499e8ec4615a.png">

しかし、physicsパッケージとsinuitxパッケージを同時に読み込むと、`\qty`コマンドが競合し、正しい出力を得られない。
```latex:\qtyコマンド同士のコンフリクト
\documentclass{jsarticle}
\usepackage{physics}
\usepackage{siunitx}
\begin{document}

$ \displaystyle \qty{ \frac{1}{2} } $
\qty{ 3.0e8 }{ m.s^{-1} }

\end{document}
```
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/f8c5e81c-6510-c268-ff09-58214fe84458.png">

例えば他にも、後述する`\pdv`コマンドがphysicsパッケージとderivativeパッケージで競合する。

</details>

<!----- 問題点1 END ----->





<!----- 問題点2 ----->

<details><summary><b>問題点2 : 公式ドキュメントに無いコマンドと上書き問題</b></summary>

physicsパッケージには「隠しコマンド」が存在する。
```latex:\homeworkコマンド
\homework
```
と入力すると、電磁気学におけるMaxwell方程式と量子力学におけるSchrödinger方程式が出力される。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/786a199b-b6d3-0b0e-1cab-69c978b5b54f.png">

`\homework`コマンドはphysics.sty[^style]では明確に宣言されているが、公式ドキュメントには記載されていない。また、我々が独自に`\homework`コマンドを定義していても、physicsパッケージを読み込むことで**勝手に上書きされてしまう**。
[^style]: styleファイル(.sty)とは簡単に言うと、パッケージを読み込んだときにどのコマンドがどうのように動くかを命令するプログラムである。

</details>

<!----- 問題点2 END ----->





<!----- 問題点3 ----->

<details><summary><b>問題点3：出力結果が“乱れる”</b></summary>

例えば、量子力学において

+ 演算子$\hat{\mathcal{O}}$の期待値
+ 状態$\ket{\phi},\ket{\psi} $の内積

を箱で囲んで表示したいとする。
```latex:期待値や内積を箱で囲んで出力したい
\fbox{ $ \ev*{ \hat{O} } $ }
\fbox{ $ \braket*{ \phi }{ \psi } $ }
```
これの出力結果を以下に示す。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/d6f2357c-e484-284b-085b-7831fd1a3d7f.png">

囲いに対して文字が僅かに右寄りなのが分かるだろうか。これは論文のレイアウトとしてはよろしく無い。

さらに変数を明記した全微分や偏微分
```math
\frac{dy}{dt}(t)
\quad
\frac{\partial y}{\partial t}(t, x)
```
を表示したいとする。physicsパッケージには全微分と偏微分を表示するための`\dv`・`\pdv`コマンドがある。これらを使用すると、出力結果が“乱れ”てしまう。
```latex:変数の消滅
\dv{y}{t}(t)
\pdv{y}{t}(t,x)
```
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/0304a99f-9436-aaf4-8da0-6dee5736c437.png">

ソースコードには変数を明示しているにも関わらず、出力結果には反映されていないことが分かる。

</details>

<!----- 問題点3 END ----->


<!----- そこでphysics2パッケージ ----->

## そこでphysics2パッケージ

そこで開発されたパッケージが<font color="#00cc00">physics2パッケージ</font>である。physics2パッケージはphysicsパッケージが直面した問題を回避しつつ、数式を「より速く・より簡潔に」記述するためのコマンドをサポートしている。

### 使用方法
physics2パッケージはプリアンブルに
```latex:physics2
\usepackage{physics2}
```
と記載することで使用できるようになる。physics2パッケージはモジュール化されたパッケージであり、モジュールをロードすることで豊富なコマンドが使用できる。モジュールのロード方法は`\usepackage`とほぼ同じである。同じくプリアンブルに
```latex:モジュールのロード
\usephysicsmodule{<module>}
```
と記載すれば良い。また、
```latex:モジュールのロード（複数）
\usephysicsmodule{<module1>,<module2>,...}
```
のように、複数のモジュールを一括でロードすることもできる。physics2パッケージが提供するモダンなモジュール[^modern]と各機能は以下の通りである。
[^modern]: レガシーモジュールと明確に区別する意味で、本記事では「モダンモジュール」と呼称する。

| モダンモジュール名 | `<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パッケージに準拠したレガシーモジュールも提供している。

:::note warn
「新規ドキュメントを作成する場合、レガシーモジュールの使用は推奨しない」とパッケージ開発者は述べている。これを受け、本記事ではレガシーモジュールを一切登場させない立場を採った。
:::

| レガシーモジュール名 | `<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` |

<!----- そこでphysics2パッケージ END ----->

<!---------- Introduction END ---------->









<!---------- physicsパッケージの代替案 ---------->

# §.physicsパッケージの代替案

前節で紹介したようにphysicsパッケージには問題点が幾つもある。他のパッケージへの移行が推奨されるが、一方でモダンモジュールはphysicsパッケージの全てを網羅し、継承しているわけでは無い。physicsパッケージが提供している主要なコマンドと機能について確認しよう。

| コマンド | 何ができる? |
|:-:|:-:|
| Automatic bracing | 括弧サイズの自動調整など |
| Vector notation | ベクトル記法や勾配・発散・回転 |
| Operators | 初等関数や$\mathrm{Tr}$記号など |
| Derivatives | 常微分・偏微分など |
| Dirac bra-ket notation | braketによる表現 |
| Matrix macros | 行列表記 |

例えば「常微分・偏微分」のコマンドは、モダンモジュールには存在しない。そこで我々はいくつかのパッケージによって、これらをカバーすることを目指す。

<!---------- physicsパッケージの代替案 END ---------->










<!---------- physicsパッケージと代替パッケージの対応 ---------->

# §.physicsパッケージと代替パッケージの対応

本節では、physicsパッケージの各コマンドをどのパッケージで置き換えると良いかを整理した。気になる各項目を適宜展開し、確認して欲しい。

<!----- Automatic bracing ----->

<details><summary><b>Automatic bracing</b></summary>

## 括弧の自動調整・絶対値・ノルム

<font color="#00cc00">physics2パッケージのabモジュール</font>を利用する[^ab]。
[^ab]: `ab`モジュールはAutomatic bracingの略称である。
 
```latex
\usephysicsmodule{ab}
```

abモジュールによって、
+ 小括弧$(~)$
+ 中括弧・Poisson括弧$\\{~\\}$
+ 大括弧・交換子$[~]$
+ 絶対値$|~|$
+ ノルム$||~||$

を出力できる。`\ab`コマンドの基本的な使い方は`\qty`コマンドと同様だ。

```latex:\abコマンド
    \ab( \frac{1}{2} )
    \ab[ \frac{1}{2} ]
    \ab< \frac{1}{2} >
    \ab| \frac{1}{2} |
    \ab\| \frac{1}{2} \|
```
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/c5366a24-ecd2-e904-b105-57680d1f8470.png">

:::note warn
`\ab`コマンドにおける中括弧$\\{\cdot\\}$の出力方法は、`\qty`コマンドとは異なる点に注意。
:::
```latex:中括弧は違う
\qty{ \frac{1}{2] }
\ab\{ \frac{1}{2} \}
```
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/27e49533-8fdd-1637-8218-2c5aa7a0dc9e.png">

他にもphysicsパッケージのAutomatic bracingでは、積分値の評価とオーダー記号を出力するコマンドも提供している[^nao]。
[^nao]: physics2パッケージのレガシーモジュールでも、積分値の評価とオーダー記号は対応できる。

## 積分値の評価

```latex:積分値の評価-physicsパッケージ
\eval{ \frac{1}{x} }_{0}^{\infty}
```
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/152771cb-8bdd-fccb-44fc-a2f948580e12.png">

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

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

<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/9c2a86cf-b495-9f79-e405-28a56330439b.png">

## Landau記号

```latex:Landau記号-physicsパッケージ
\order{ \frac{1}{x} }
```
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/f9da9809-fc56-0398-c287-d56bb3d49161.png">

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

```latex:Landau記号-代替
\usepackage{mathrsfs}
\newcommand{\order}[1]{\mathcal{O} \ab( #1 )}
~~~
\order{ \frac{1}{x} }
```

<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/1c31c0b3-9d75-fafe-beab-6f42f7ecdced.png">

</details>

<!----- Automatic bracing END ----->



<!----- Vector notation ----->


<details><summary><b>Vector notation</b></summary>

## ベクトル記法

physicsパッケージでは以下のコマンドを提供している。

```latex:ベクトル記法
\vb{v}
\va{v}
\vu{v}
```

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/146f1cec-4dc2-7e62-f301-a1a0bc341577.png">

これらのコマンドを、physics2パッケージがサポートする計画は無い。ベクトル記法に関するコマンドとして、`\bm`コマンドや`\boldsymbol`コマンドがある。

どうしてもphysicsパッケージにおける`\vb`コマンドなどを使用したければ、以下のコードをプリアンブルに記載すれば良い。
```latex:どうしても\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
```

このように定義したとき、各コマンドの出力結果は以下になる。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/51ec68c8-0432-446a-5dfa-98f76cf800c2.png">

矢印付きのベクトル（`\va`コマンド）の出力結果が、physicsパッケージのそれとは異なると分かる。矢印付きベクトルは文字をわざわざ太字にする必要が無いためだ。

またphysicsパッケージは`\vdot, \cross`コマンドを提供しているが、これは`\cdot, \times`コマンドで十分である。

## 勾配・発散・回転

$\nabla$:`\nabla`コマンドが使用できる。勾配`\grad`・発散`\div`・回転`\rot`のコマンドを使用したければ、以下をプリアンブルに記載すれば良い。

```latex:勾配・発散・回転のコマンドを定義したい
% 勾配
\DeclareMathOperator{\grad}{\nabla}
% 発散
% \divが「÷」と競合するため再定義
\DeclareMathOperator{\divergence}{\nabla\cdot}
\let\divisionsymbol\div 
\renewcommand{\div}{\divergence} 
% 回転
\DeclareMathOperator{\rot}{\nabla\times}
% \DeclareMathOperator{\curl}{\nabla\times} % 個人の好みによって、\rotでは無く\curlをどうぞ
```

出力結果は次のようになる。コマンドを再定義した除算についても併記した。

```latex:勾配・発散・回転
\grad \phi
\div \bm{x}
\rot \bm{x}
a \divisionsymbol b
```
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/d03f522b-9a7c-2aa3-8f7b-cdd9baddbd00.png">


</details>

<!----- Vector notation END ----->



<!-----  Operators ----->

<details><summary><b>Operators</b></summary>

physics2パッケージはOperatorsのコマンドを全てサポートする計画は無い。

## 初等関数

sin関数なら、例えば

```latex:sin関数
\sin \ab( \frac{\pi}{2} )
```
<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/887840b3-f045-45fb-dbd9-10f1964ae2c2.png">

などとすれば良い。

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

$\mathrm{Re, Im}$はデフォルトでは、RとIがドイツ文字となっている。
```latex:Re, Im（デフォルト）
\Re \ab[ f(z) ]
\Im \ab[ f(z) ]
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/e82f912d-383d-d97e-8d9d-3fcb6dcb7d41.png">

Roman体を使用したい場合、

```latex:Re, Im, Tr, rank
\renewcommand{\Re}{\operatorname{Re}}
\renewcommand{\Im}{\operatorname{Im}}
\newcommand{\Tr}{\operatorname{Tr}}
\newcommand{\rank}{\operatorname{rank}}
```

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

```latex:Re, Im, Tr, rankの出力結果
\Re \ab[ f(z) ]
\Im \ab[ f(z) ]
\Tr \ab[ A ]
\rank \ab[ A ]
```
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/0896bb11-984c-3f10-b7a3-81a365e19ab7.png">

</details>

<!-----  Operators END ----->



<!-----  Derivatives ----->

<details><summary><b>Derivatives</b></summary>

physics2パッケージは、Derivativesのコマンドをサポートする計画は無い。我々は<font color="#00cc00">fixdifパッケージ</font>と<font color="#00cc00">derivativeパッケージ</font>を採用しよう。これらはコンフリクトしないため、安心して同時に読み込める。

```latex:プリアンブル
\usepackage{fixdif, derivative}
```

## 微分演算子

physicsパッケージでは微分演算子$\mathrm{d}$を出力するコマンドが用意されている。

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

<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/2d6d7a95-966d-112d-db66-6e7e53bdcb6d.png">

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

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

<img width="100" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/2d6d7a95-966d-112d-db66-6e7e53bdcb6d.png">


## 常微分 

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

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

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/5fe9718a-ef93-302c-0bce-44b4932d4656.png">

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

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

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/d09546a7-a385-2f09-246b-e4db97a5b19b.png">

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

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

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/e7ba550c-dcbf-b89a-ae84-74c64206f323.png">




## 偏微分

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

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

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/694b4e13-57e5-a6ed-fb66-ca0713e947c0.png">

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

```latex:偏微分-derivativeパッケージ
\pdv{}{x}
\pdv{f}{x}
\pdv{f}{x, y}
\pdv[order=n]{f}{x} 
```
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/ec8080c1-5bf3-e166-ab63-4d36623fd2cc.png">

他にも`\pdv`コマンドは、以下のようにphysicsパッケージにはできない複雑な処理などもできる[^dekiruno]。
[^dekiruno]: 筆者は知らないのだが、physicsパッケージの`\pdv`コマンドで$\displaystyle \frac{\partial^5 f(x,y,z) }{\partial^2 x \partial y \partial^2 z} $のような少し複雑な処理はできるのだろうか？

```latex:\pdvコマンドの補足
\pdv{f}/{x}
\pdv*{f(x,y,z)}{x}
\pdv[order={2, 1, 2}]{f}{x, y, z} 
```
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/aa404b09-eb16-2568-2e3b-c33cd9de0d7b.png">



</details>

<!-----  Derivatives END ----->



<!-----  Dirac bra-ket notation ----->


<details><summary><b>Dirac bra-ket notation</b></summary>

physicsパッケージにはbraket記法を提供するコマンドが存在する。以下のように、

+ braベクトル$\ket{\psi}$・ketベクトル$\bra{\phi}$
+ 内積$\braket{\phi|\psi} $・外積$\ketbra{\psi}{\phi}$
+ 期待値$\braket{\psi|A|\psi}$

などを出力できる。

```latex:braket-physicsパッケージ
\ket{\psi}
\bra{\phi} 
\braket{\phi}{\psi} 
\dyad{\psi}{\phi}
\braket{\psi}
\ev{A}{\psi}
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/9f3faa7a-c11e-7f2e-bbdb-dc44caf1918e.png">


これの代替として<font color="#00cc00">physics2パッケージのab.braketモジュール</font>を紹介する。他の手段として、

+ physics2パッケージのbraketモジュール
+ braketパッケージ

が挙げられる。braketモジュールはphysicsパッケージの記法に似ている。ここら辺は個人の好みで好きなパッケージ・モジュールを採用すれば良い[^braket_hosoku]。
[^braket_hosoku]: braketパッケージは括弧の大きさを自動調整する際、`\braket{}{}`では無く`\Braket{}{}`のように何故か大文字で記述しなければならない点が、個人的に好きでは無い。

:::note warn
これらは互いにコンフリクトするため、同時に読み込まないように。
:::

ab.braketモジュールは、`\bra, \ket, \braket, \ketbra`という“わかりやすい”コマンドや、$|, <, >$という直感的な記号を使用することで記述をできる点が良い。また括弧のサイズも自動調整される。

```latex:braket-ab.braketモジュール
\ket|\psi> 
\bra<\phi|
\braket<\phi|\psi>
\ketbra|\psi><\phi|
\braket<\psi>
\braket<\psi|A|\psi>
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/16e07fdc-0377-1ed5-91a5-524c69e0f6fd.png">

:::note warn
期待値$\braket{\psi|A|\psi}$の絶対値を採るときは注意が必要。
:::

```latex:期待値の絶対値
\ab| \braket<\psi|A|\psi> | % 不適切な記法
\ab| { \braket<\psi|A|\psi> } | % 適切な記法
```

`\braket<\psi|A|\psi>`を中括弧$\\{~\\}$の中に入れなければ、正しい結果は出力されない。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/224a9f6b-5564-a0b0-8d03-c794e6df74a4.png">


</details>

<!-----  Dirac bra-ket notation END ----->



<!-----  Matrix macros ----->

<details><summary><b>Matrix macros</b></summary>

## `\mqty`コマンド

physicsパッケージでは行列を簡潔に記述できる`\mqty`コマンドを提供している。
```latex:\mqtyコマンド-physicsパッケージ
\mqty{ a&b\\c&d } % 括弧無し
\mqty( a&b\\c&d ) % 小括弧( )
\mqty[ a&b\\c&d ] % 大括弧[ ]
\mqty| a&b\\c&d | % 行列式| |
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/8486d5f7-b7ae-28ea-6b34-76f382d0acef.png">

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

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

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

```latex:\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 }  | % 行列式| |
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/cf3bedda-d71f-2bbd-17bf-791a808e1c5c.png">



## 対角行列

physicsパッケージでは対角行列を記述する`\dmat`コマンドを提供している。

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

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/6b51c17f-6ab7-29dc-3aac-700d79f9da48.png">

代替として、<font color="#00cc00">physics2パッケージのdiagmatモジュール</font>を採用する。

```latex:プリアンブル
\usephysicsmodule{diagmat}
```

diagmatモジュールでは、`\diagmat`コマンドによって対角行列を記述できる。

```latex:対角行列-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 } )
```

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/8955fd9b-4b52-80e0-91e4-fb7df4deee53.png">

## n×m行列

physicsパッケージではn×m行列を記述する`\xmat`コマンドを提供している。

```latex:n×m行列
\smqty( \xmat{a}{3}{2} )
\smqty( \xmat*{a}{3}{2} )
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/034037a5-d069-0b01-82f9-9c147ed0bc51.png">


これの代替（というか、完全上位互換）として、<font color="#00cc00">physics2パッケージのxmatモジュール</font>を採用する。physics2パッケージのほうがレイアウトが綺麗であり、一般的な$n\times m$行列も出力できる。

```latex:プリアンブル
\usephysicsmodule[<option>]{xmat}
```

xmatモジュールでは、`\xmat`コマンドによって$n\times m$行列を記述できる。`<option>`では$n\times m$行列においてどこまで成分を表示するかについて命令できる。詳しくは後述。

まず、physicsパッケージにおける`\smqty( \xmat{a}{3}{2} )`に対応する結果は以下である。

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

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/f9bc49f1-7586-77a6-d9d6-4b2bfdd03a06.png">

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

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

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/f3b4dc68-cb09-6252-eff7-a289c77bb21b.png">

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

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

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

```latex:n×m行列(2)-optionあり
\usephysicsmodule[showleft=2,showtop=2]{xmat}
~~~
\pxmat{a}{n}{m}
```

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217473/7b3208d5-4cb7-16e6-e50c-6863687596dc.png">


</details>

<!-----  Matrix macros END ----->


<!---------- physicsパッケージと代替パッケージの対応 END ---------->









<!---------- まとめ ---------->

# §.結論

physics2パッケージのモダンモジュールを中心として、時には他のパッケージも援用することで、physicsパッケージの代替手段を提案した。physicsパッケージは大くの問題を抱えながらも、10年以上更新の無いパッケージである。そのため、physics2パッケージへ乗り換えることを強く勧める。

これ以降は、プリアンブルに`\usepackage{physics}`では無く、


```latex:これからのプリアンブル
%---------- 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 ----------% 
```

などとすれば良い。



<!---------- まとめ END ---------->









<!---------- 参考文献 ---------->

# §.参考文献

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

### 公式ドキュメント

+ [The physics package][physics]
+ [The physics2 package][physics2]
+ [physics2 manual for the legacy physics users][physics_user]
+ [The fixdif Package][fixdif]
+ [The derivative package][derivative]
+ [The braket package][braket]

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

+ [LaTeX Stack Exchanges]()
具体的には以下の議論を参考にした
    + ["Alternatives to the physics package"](https://tex.stackexchange.com/questions/471532/alternatives-to-the-physics-package)
    + ["How to fix the spacing before starred commands from physics package"](https://tex.stackexchange.com/questions/453274/how-to-fix-the-spacing-before-starred-commands-from-physics-package/453275#453275)
    + ["Macros \dv and \pdv eat the subsequent parenthesis argument"](https://tex.stackexchange.com/questions/470819/macros-dv-and-pdv-eat-the-subsequent-parenthesis-argument/470842#470842)

### 記事
#### Qiita
+ [「脱 physics パッケージして physics2 パッケージを使おう」][escape]
+ [「ベクトル書きたい」](https://qiita.com/Yarakashi_Kikohshi/items/324e07b0162cfb618dc9#:~:text=%E3%81%93%E3%82%8C%E3%81%8C%E9%9D%A2%E5%80%92%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AB%E3%81%AF%EF%BC%8C%E3%83%8A%E3%83%96%E3%83%A9%E3%81%AE2%E4%B9%97%E3%81%A7%E3%82%82%E8%89%AF%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E6%80%9D%E3%81%86%EF%BC%8E%20Copied!%20%5Cnewcommand*%7B%5CLaplace%7D%7B%5Cmathbin%7B%5Cnabla%5E2%7D.%20%E4%BD%99%E8%AB%87.)

#### その他（ネットに転がっていた記事）
+ [「Re,Im(実部,虚部)のかき方について」](https://mathlandscape.com/latex-re-im/)

<!---------- 参考文献 END ---------->









<!---------- LINK ---------->

[physics]: https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/macros/latex/contrib/physics/physics.pdf

[physics2]: https://ftp.jaist.ac.jp/pub/CTAN/macros/latex/contrib/physics2/physics2.pdf

[physics_user]: https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/macros/latex/contrib/physics2/physics2-legacy.pdf

[fixdif]: https://ftp.kddilabs.jp/CTAN/macros/latex/contrib/fixdif/fixdif.pdf

[derivative]: https://ctan.math.illinois.edu/macros/latex/contrib/derivative/derivative.pdf

[braket]: https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/macros/latex/contrib/braket/braket.pdf

[stack]: https://tex.stackexchange.com/

[escape]: https://qiita.com/Yarakashi_Kikohshi/items/131e2324f401c3effb84

<!---------- LINK END ---------->