38
34

脱 physics パッケージして physics2 パッケージを使おう

Last updated at Posted at 2023-04-07

LaTeX で数式を取り扱う場合、physics パッケージは非常に有用なパッケージとして有名です。他方で、physics パッケージには数多くの問題があるとされています。この問題は快適さとトレードオフの関係にあるものではなく、修正されるべき問題です。

本記事では、physics パッケージの問題点を明らかにし、代替パッケージを検討します。また、代替パッケージの内、physics2 パッケージの使い方について紹介します。

■ physics パッケージのココがヤバい

実は、physics パッケージは実装やそこから得られる結果にいくつもの問題を抱えています :scream:

これは、LaTeX Stack Exchangephysics2 パッケージで多く提起・議論されています。ここで提起・議論されている問題を以下のリストにまとめました。

  • 実装の問題
    • 内部で使用される \DeclareDocumentCommand (xparse) によってコマンドを強制的に上書きする(警告もない!)
    • xparse パッケージで非推奨とされている g 引数を利用している
    • ドキュメントに記載されていない \homework コマンドが存在する
    • \Xmat コマンドの定義では、トークンリストレジスタを無駄遣いする
    • 部分的なコマンドを個別モジュールとして読み込みすることが出来ない
    • 2012 年のリリース以降、更新されていない!(参考
  • 他パッケージとの衝突
    • \qty コマンドが siunitx パッケージと衝突する
    • 内部で使用される \boldsymbol (amsmath) は unicode-math パッケージと併用すると失敗する
  • 得られる結果に生じる問題
    • 実装内に奇妙なスペースを構成している (LaTeX Stack Exchange)

      例:括弧周りのスペースが左右で異なっている
      \fbox{$\ev*{\hat{O}_P}$}
      

      odd spacing

    • ドキュメント作成者の意図しない引数の扱い方をする (LaTeX Stack Exchange)

      例:(y^2-5) が無視される
      \[
        \dv{x}{t}(y^2-5)
      \]
      

      ignore argument

一方で、physics パッケージを代替するパッケージの検討に関する議論もなされています。

ここで紹介されているパッケージは、以下のようなものです。それぞれで提供される機能も付記しました。

  • physics2 パッケージ
    • 高さが自動調整される括弧(ab モジュール)
    • Dirac の bra-ket 記法(ab.braketbraket モジュール)
    • 行列の簡易記法(diagmatxmat モジュール)
    • レガシーモジュール
      • ベクトル記法
      • いくつかの作用素
      • 挿入テキストの簡易コマンド
  • 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 つのレガシーモジュールがあります。

  • モダンモジュール

    abab.braketbraket
    doubleproddiagmatxmat
  • レガシーモジュール

    ab.legacybm-um.legacy
    nabla.legacyop.legacyqtext.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) を参照してください。

以下では、モダンなモジュールのみを紹介します。

!接頭辞

abdiagmatxmat モジュールから提供されるコマンドでは、接頭辞を付けることで括弧を指定することが出来ます。

接頭辞 対応する括弧
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 つ続く bigggBiggg が提供されます。

したがって、次のように 7 種類の高さを表現でき、次表の 8 つのコマンドが追加されます。

variation of brace size

高さ 場所無し 中央
biggg \biggg \bigggl \bigggm \bigggr
Biggg \Biggg \Bigggl \Bigggm \Bigggr

また、自動で括弧の高さを調整する \delopen\delclose が提供されます。これは mleftright パッケージの \mleft\mright と類似しています。

compare space size around parenthesis

上の図を見れば明らかなように、\left\right 使用時に生じる括弧周りの余分なアキが無いように動作します。

次で紹介する ab モジュール提供の \ab コマンドも同様に動作します。(tightbraces=true)

ab モジュール

このモジュールから提供されるコマンドは、\ab と接頭辞を付けたコマンドの計 7 つです。

  • \ab
  • \pab
  • \bab
  • \Bab
  • \vab
  • \Vab
  • \aab
\usephysicsmodule{ab}
オプション デフォルト値 説明
tightbraces true
  • true\delopen\delclose を利用
  • false\left\right を利用

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 command sample

また、\ab は接頭辞 § (pbBvVa) を用いることで、常に {} によって表現することも出来ます。これは、上に示したコマンドが次のコマンドと同等であることを意味しています。

\[
  \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}}
\]

Adjust the size of parentheses manually

physics パッケージの \qty では、波括弧の高さを自動調整する \qty{...} のような使い方ができました。これは xparse パッケージで非推奨としている g 引数を利用しているためです。physics2 パッケージでは、このような非推奨な実装をしていないため、\ab{...} によって \qty{...} と同じ結果は得られません。

\qty{...} に相当するコマンドは、\ab\{...\} または \Bab{...} です。また、\ab{...} は存在しないことに注意してください。

ab.braketbraket モジュール

このモジュールから提供されるコマンドは、以下の 4 つとその * 付きの計 8 つです。* 付きは高さの自動調整をしません。

  • \bra
  • \ket
  • \braket
  • \ketbra

ab.braketbraket モジュールは、ともに Dirac の bra-ket 記法を提供します。しかし、この 2 つのモジュールは競合するため、どちらか一方しか利用できません。

\usephysicsmodule{ab.braket}
\usephysicsmodule{braket}

両モジュールの違いは表現方法にあります。

モジュール 相違点
ab.braket
  • ab モジュールと同じように、<|> を明示的に用いる
  • 括弧高さの手動調整する場合は、[] を用いない
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
\]

Dirac's bra-ket notation by braket module

もしも、これらモジュールの記法や機能が気に入らない場合は、モジュールを有効にせずに braket パッケージを利用すると良いでしょう。

doubleprod モジュール

このモジュールから提供されるコマンドは、以下の 2 つです。

  • \doublecross
  • \doubledot

doubleprod module

\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}
\]

default diagmat command by diagmat module

\diagmat は接頭辞 § (pbBvV) を用いること (\Xdiagmat) で、括弧を自動的に与えることが出来ます。また、empty オプションから非対角成分を指定できます。

\[
  \pdiagmat[empty={}]{1, 2, 3, 4}
\]

with empty option by diagmat module

現在、反対角行列を書くコマンドは提供されていません。

xmat モジュール

このモジュールから提供されるコマンドは、\xmat と接頭辞を付けたコマンドの計 6 つです。これらは、括弧の有無や形状以外は同じ機能を有しています。

  • \xmat
  • \pxmat
  • \bxmat
  • \Bxmat
  • \vxmat
  • \Vxmat
\usephysicsmodule{xmat}

このモジュールは amsmath を必要とします。

このモジュールはオプションがあります。このオプションはモジュールでグローバルに指定できます。また、各コマンドのオプション指定もできます。

オプション デフォルト値 説明
showtop 8 省略せずに表示する行数
showleft 8 省略せずに表示する列数
format #1_{#2#3} 行列の形式を指定する
  • #1:行列要素
  • #2:行番号
  • #3:列番号

showtopshowleft のデフォルト値は MaxMatrixCols より 2 小さくなります。amsmath では MaxMatrixCols は 10 であるため、8 がデフォルト値となっています。


実際に使った例をいくつか紹介します。

\xmat は $a_{mn}$ のような行列を簡単に書くことができます。

\[
  \xmat{a}{2}{3}
\]

xmat command by xmat module

\xmat は接頭辞 § (pbBvV) を用いること (\Xxmat) で、括弧を自動的に与えることが出来ます。

また、showtopshowleft オプションから省略せずに表示する行列の数を指定できます。m 行 n 列の行列を表現したい際に有益です。

\[
  \pxmat[showtop=2, showleft=3]{M}{m}{n}
\]

with showtop and showleft options by xmat module

format オプションを利用すれば、x[row][col] のような行列を書くことが出来ます。

\[
  \xmat[
      showtop=3,
      showleft=2,
      format=\texttt{#1[#2][#3]}
    ]{x}{m}{n}
\]

with format option by xmat module

☆ 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 issue resolved in physics2

括弧周りの奇妙なスペースはありません。physics パッケージで確認された問題は physics2 パッケージで再現されません。嬉しいですね :laughing:

少し山括弧が大きい気がする場合は、big をオプションに加えると良いでしょう。

\fbox{$\braket[1, big]{\hat{O}_P}$}

braket command with big option

big オプションが与えられた場合でも、physics パッケージのような問題は再現されません :tada:

私は、実装に関してヤバいところがあるかどうか分かりません。分かる人は時間がある時に、ぜひコードを確認してみてください :eyes:

★ サポートされないコマンド

physics パッケージから提供されていたコマンドの内、いくつかのコマンドについて physics2 パッケージはサポートを計画していません :cry:

  • 微分記法に関するコマンド
  • \sin(...)\log(...) etc.
  • \comm\comm*
  • \acomm\acomm*
  • \pb
  • \vb\vb*
  • \va\va*
  • \vu\vu*
  • \mqty\Xmqty
  • \smqty

これらの解決方法については、physics2 manual for physics users (PDF) を参照すると良いでしょう。また、微分記法に関するコマンドは diffcoeffderivative パッケージを利用すると良いでしょう。

余談

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 モジュールに関する記述を修正しました。
38
34
2

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
38
34