行列環境のエトセトラをまとめる


行列の書き方はいくつもありすぎて分からんのじゃ．まとめておこう．

行列を書くなら，ベクトルやテンソルも書きたいだろう．以下の拙文も紹介しておきたい．

- [ベクトル書きたい - Qiita (限定共有記事)](https://qiita.com/Yarakashi_Kikohshi/private/324e07b0162cfb618dc9)
- [テンソル書きたい - Qiita (限定共有記事)](https://qiita.com/Yarakashi_Kikohshi/private/cc2e204e408940813335)

# LaTeX での行列

$\rm\LaTeX$ 標準では，array 環境を用いた以下のような方法がある．

```tex
\begin{equation}
A =
    \left(
    \begin{array}{ccc}
    a & b & c \\
    d & e & f \\
    g & h & i 
    \end{array}
    \right)
\end{equation}
```

$\rm\LaTeX$ で数式を使用する場合の多くにはamsmath を使用する．~~したがって，上での表記方法はあまり使用しない方が良いだろう．[^thinking]~~

[^thinking]: 表記方法は統一しておいた方が良いという程度にしかこの論の補強を考えられなかった．

以下で紹介する方法はamsmath とmathtools を使用することで，このarray 環境を用いた方法を踏襲する形でより綺麗になるように定義されている．また，これらのパッケージでは少しだけ簡単に行列を表記できる．しかし，基本的には`{cc...c}` のようなオプションは指定しない．指定したい場合には，[行列要素の揃える位置を指定したい](#-行列要素の揃える位置を指定したい) を参照してほしい．


# ○ amsmath とmathtools を使った行列環境

基本的な行列(matrix)環境を紹介する．mathtools ではamsmath では提供されていない行列環境を拡張しているので，ぜひこのパッケージも活用していくといいだろう．

また，これらの行列環境が面倒であれば，physics パッケージ[^physics]を利用することをお勧めする．これらの環境を用いずとも幾分か簡略的に行列を表記することが出来る．

[^physics]: [physics.sty | CTAN](https://www.ctan.org/pkg/physics) から．使い方に関しては，「[数式をもっと楽に書ける TeX の physics パッケージまとめ - Qiita](https://qiita.com/7ma7X/items/ce9f49e9b3fc0344ae23)」に詳しい．

## ■ 提供されている行列環境

ディスプレイスタイル(背の高いスタイル)とテキストスタイル(背の低いスタイル)がある．各パッケージが提供している行列環境を表にしておく．

### ● amsmath 

各デリミタに対して行列環境が提供されている．サンプルは[以下#-ディスプレイスタイル](#-ディスプレイスタイル)で紹介する．

|デリミタ|ディスプレイスタイル|テキストスタイル|
|:--:|:--:|:--:|
|なし|matrix|smallmatrix|
|丸括弧 (Parenthesis)|pmatrix|-|
|角括弧 (Bracket)|bmatrix|-|
|波括弧 (Brace)|Bmatrix|-|
|垂直棒 (Vertical bar)|vmatrix|-|
|2本の垂直棒|Vmatrix|-|

amsmath で提供する行列環境では，デリミタを自動的に挿入してくれる．

### ● mathtools 

amsmath を拡張する形で以下の17個の行列環境を提供している．

|デリミタ|ディスプレイスタイル|テキストスタイル|
|:--:|:--:|:--:|
|なし|matrix\*|smallmatrix\*|
|丸括弧 (Parenthesis)|pmatrix\*|psmallmatrix, psmallmatrix\*|
|角括弧 (Bracket)|bmatrix\*|bsmallmatrix, bsmallmatrix\*|
|波括弧 (Brace)|Bmatrix\*|Bsmallmatrix, Bsmallmatrix\*|
|垂直棒 (Vertical bar)|vmatrix\*|vsmallmatrix, vsmallmatrix\*|
|2本の垂直棒|Vmatrix\*|Vsmallmatrix, Vsmallmatrix\*|


`*` 付きの環境は，行列要素を右揃えや左揃えに変えることが出来る([参照節#-行列要素の揃える位置を指定したい](#-行列要素の揃える位置を指定したい))．

もしも，何らかの理由からmathtools を使用できない場合のために，以下のような方法もあることを紹介しておきたい．
以下のようにすることでmathtools が提供している環境と同等の環境を利用することが出来るだろう．

<details><summary>**テキストスタイルを真似たい**（折りたたみ）</summary>
<div>

amsmath ではテキストスタイルの行列環境としてsmallmatrix を提供している．これを利用してpsmallmatrix を再現するには，`\left( ~ \right)` で囲えば良いだろう．

```tex
$
\left(
    \begin{smallmatrix}
    a & b & c \\
    d & e & f 
    \end{smallmatrix}
\right)
$
```

同様にして，bsmallmatrix では`\left\lbrack ~ \right\rbrack` ，vsmallmatrix では`\left\lvert ~ \right\rvert` で囲えば良いだろう．

</div>
</details>

<details><summary>**行列要素の揃える位置の指定したい**（折りたたみ）</summary>
<div>


amsmath では行列要素は中央揃えしか出来ない．mathtools を使用せずに揃える位置を変更する方法は以下の3つの方法が考えられる．

- array 環境を用いる ([上で紹介済み#-LaTeX-での行列](#latex-での行列))
- `\phantom` を用いる
- 他のパッケージを導入する

array 環境を用いるのがもっとも簡単な方法であり，以下の2つの方法をするよりもお手軽である．

`\phantom` を使った方法はなかなかに面倒な方法だ．

```tex
\begin{equation*}
    \begin{matrix}
    \phantom{-}A & -B \\
    -C & \phantom{-}D 
    \end{matrix}
\end{equation*}
```

これは，`\phantom` で必要な空白を挿入して，見た目上で右揃えになるようにしている．これは逐一空白を挿入する必要があるので非常に面倒くさい．行列要素が増えれば尚のこと面倒である．

mathtools は使えないが他のパッケージなら使える(そんな状況がある???)ならば，**nicematrix** [^nicematrix]を導入しても良いだろう．あるいは，**easymat** [^easymat]も良いかも知れない．子細なことはあまりよく分からないので，各自パッケージガイド等を参照してほしい．

[^nicematrix]: [nicematrix | CTAN](https://ctan.org/pkg/nicematrix) から．「[天地有情 [LaTeX] nicematrix --- 新しい環境を使用して数学行列の組版を改善する](https://konoyonohana.blog.fc2.com/blog-entry-557.html)」に詳しい．

[^easymat]: [easymat | CTAN](https://www.ctan.org/pkg/easymat) から．紹介しているサイトを確認することは出来なかった．(不人気なのかな?)

</div>
</details>

## ■ ディスプレイスタイル

以下のようにXmatrix 環境を数式環境内で用いる．


```tex
\begin{equation}
    \begin{matrix}
    a & b & c \\
    d & e & f 
    \end{matrix}
\end{equation}
```

|デリミタ|環境|例|
|:--:|:--:|:--:|
|なし|matrix|![matrix]|
|丸括弧 (Parenthesis)|pmatrix|![pmatrix]|
|角括弧 (Bracket)|bmatrix|![bmatrix]|
|波括弧 (Brace)|Bmatrix|![B-matrix]|
|垂直棒 (Vertical bar)|vmatrix|![vmatrix]|
|2本の垂直棒|Vmatrix|![V-matrix]|

以上の環境はamsmath から提供されているが，各行列要素は中央揃え[^arrayalign]になっている．

[^arrayalign]: 上での$\rm\LaTeX$ 標準でのarray 環境では，揃える位置を`c`, `r`, `l` を指定することが出来る．しかし，amsmath ではそのような指定が出来ない．mathtools ではそのような指定のできる`*` 付きの行列環境を提供している．

[matrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/a1206fe8-4e88-9b3c-1b72-4c684f34eb27.png
[pmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/f3ccea49-fc42-fc5a-e1c5-e37e1ed1d020.png
[bmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/c32576ee-5bcd-1db7-4177-504e0f7c1cef.png
[B-matrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/f22cc23f-022f-c5c1-07b3-30979a81d73d.png
[vmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/aa9b6190-b0d3-7abf-38da-2c8fa31666a4.png
[V-matrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/4b093978-89ae-7015-5e8c-bd4166045b70.png



## ■ テキストスタイル

~~本文内で行列を表記したい人がいるのかは不明だが，~~ 本文中で表記するための背の低い行列環境が定義されている．先ほどの環境に`small-` とすれば良いだけだ．

```tex
$
\begin{smallmatrix}
    a & b & c \\
    d & e & f 
\end{smallmatrix}
$
```

|デリミタ|環境|例|
|:--:|:--:|:--:|
|なし|smallmatrix|![smallmatrix]|
|丸括弧 (Parenthesis)|psmallmatrix|![psmallmatrix]|
|角括弧 (Bracket)|bsmallmatrix|![bsmallmatrix]|
|波括弧 (Brace)|Bsmallmatrix|![B-smallmatrix]|
|垂直棒 (Vertical bar)|vsmallmatrix|![vsmallmatrix]|
|2本の垂直棒|Vsmallmatrix|![V-smallmatrix]|

あまり行数を増やすのは良くないと思われる．

[smallmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/4ddc31a0-1153-8dd0-a65c-9b318c61830f.png
[psmallmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/c5bfdba4-c55e-93c7-a639-b04f33aa7773.png
[bsmallmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/42d28117-a09c-0d94-a312-fea0ea53cc01.png
[B-smallmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/56043f78-2748-e541-dafe-13199e481222.png
[vsmallmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/28240dfb-6a50-5680-4900-d3df6a4a1c56.png
[V-smallmatrix]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/22f2c93f-9604-a288-1c01-95f54c875379.png



# ○ 行列要素の揃える位置を指定したい

`*` 付きの環境を用いて`r`, `l` のオプションを指定することで右揃え，左揃えにすることが出来る．これは，上で示したすべての行列環境で使用することが出来る．デフォルトでは`c` の中央揃えになっている．

各行列要素の見た目サイズが大きくなる場合には非常に気にした方が良いだろう．

```tex
\begin{equation*}
M =
    \begin{pmatrix*}[r]
    A & -B \\
    -C & D 
    \end{pmatrix*}
\end{equation*}
```

ただし，このオプションはすべての行列要素に適用され，array 環境のように各列に対して指定することは出来ないことに注意が必要である．

![matrix-right-align.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/ea42e7a3-7d98-c881-e099-472aab757bfe.png)


# ○ Xsmallmatrix のグローバルな変更

mathtools でいくつか変更することが出来る．

以下のようなことが出来る．

![smallmatrix-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/833d622c-f392-ebed-d7cd-9beba3e0cc78.png)


## ■ 行列要素の揃える位置を指定したい

`smallmatrix-align` を設定することで，文章全体で行列要素の位置をそろえることが出来る．
全体を右揃えにする場合は以下のようにする．

```tex
\mathtoolsset{smallmatrix-align = r}
```

このとき，`*` 付きのXsmallmatrix\* 環境である必要がある．(ディスプレイスタイルでのグローバルな設定は無いようだ．なんで無いのか……)


## ■ デリミタと行列要素の間隔を変えたい

`smallmatrix-inner-space` を設定することで，デリミタと行列要素の間隔を変更することが出来る．
デフォルトでは`\,` となっている．


```tex
\mathtoolsset{smallmatrix-inner-space = \,}
```

ディスプレイスタイルでのグローバルな設定はないようだが，どうにかすれば出来そう．[^arraystretch]

[^arraystretch]: `\arraystretch` で変更することも出来るようだが，これはtable 環境にも影響してしまうので良くないのではと思う．


# ○ 行列関連の演算子

`\det`, `\dim`, `\ker`(小文字になっていることに注意) は定義されているが，他にも行列関連で使用する演算子はあるだろう．

以下のように定義しておこう．

```tex
\DeclareMathOperator{\Ker}{Ker}
\DeclareMathOperator{\tr}{tr}
\DeclareMathOperator{\Tr}{Tr}
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator{\Im}{Im}
\DeclareMathOperator{\im}{im}
\DeclareMathOperator{\diag}{diag}
```

このほかにも独自に定義しておいても良いだろう．(行列で使用する演算子を網羅出来ている気がしない……)

参考：[amsmath+mathtools と仲良くなろう#-自作で演算子を定義したい - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/6362bf26828bfcfdb289#-自作で演算子を定義したい)

# ○ 転置行列

転置行列は，"transpose" を意味する"t" を左上または"T" を右上に付与する．数学表記の慣例はそれぞれの流派にしたがうべきだが，"t" または"T" に関してはある程度こだわりを持った方が良いと思われる．

## ■ 左上に"t" の場合

左上の場合，べき乗と誤読するようなことはないので，通常のイタリック体で表記しても良い．しかし，"t" と行列の間隔は狭めておいた方が表記としては見やすい．したがって，以下のようにする．

```tex
{}^t\! A    % A に詰まるように`\!` を含めている
```

上のように扱う場合には，左側の`{}` のサイズにしたがって"t" が上付きになるので，行列を明らかにしているときには不適切な位置に"t" が付いてしまう．

mathtools には右側の数式のサイズに対して上付き・下付きの文字を与えるコマンドが定義されている．
`\prescript` を用いて以下のように定義すると良いだろう．**(cf. The mathtools Package, §4.2 Left sub/superscripts)**

```tex
\begin{equation*}
\prescript{t\!}{}{M}
    =
    \prescript{t\!}{}{
    \begin{pmatrix*}[r]
    A & -B \\
    -C & D
    \end{pmatrix*}}
\end{equaiton*}
```

このようにすることで，以下のようになる．

![transpose-left.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/6b6582de-d103-4e48-23a8-7911ff3c5d4d.png)



もちろんこれは一例であり，ローマン体の方が良いという場合には`\mathrm{t}` とする．

## ■ 右上に"T" の場合

右上の場合には，べき乗と誤読する可能性があるので，イタリック体での表記は避けた方が良い．また，`\mathrm` を用いてローマン体(セリフ体)にしている場合もあるが，これもまたべき乗と誤読する可能性はある．

したがって，以下のような表記方法がよく用いられているようだ．

|コマンド|概略|例|
|:--:|:--|:--:|
|`\mathsr`|サンセリフ体|![mathsr]|
|`\intercal`|amssymb から提供されている|![intercal]|
|`\top`||![top]|

[mathsr]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/f7cebbe7-3574-bafb-adde-b24b00289e28.png
[intercal]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/a1e8a3ad-ccc1-51b8-4c5e-a273a97aa8ef.png
[top]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/9663b0a5-6595-3f7d-6d39-5bc4cb26901e.png


どれを採用しても支持する人間も反対する人間もいる．個人的には`\mathsr` を用いた方法が見やすいので好ましく思う．

ざっと意見をまとめておくと以下のようなものが見られた．

- `\mathsr`
  - あまり綺麗でない
  - 他2つのいずれかの方が良い
- `\intercal`
  - 小さめに表示される
  - 二項演算子に関するコマンドなので使用すべきでない
  - 高さが低い
- `\top`
  - 線が薄いので見づらい
  - 記号自体が大きい


どの転置のシンボルが好みだろうか．

![transpose-right.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/7cd4a6ff-67a5-e513-1ed0-03fd26474779.png)




## ★ Suggestion

以下のように定義しておけば，上のいずれの場合の転置の表記であっても対応することが出来るだろう．

```tex
\newcommand{\transpose}[1]{%
    \prescript{t\!}{}{#1}    % 左上に"t" の場合
%    #1 ^\mathsr{T}    % 右上に"T" の場合
}
```

転置に関しては微妙な表記方法の違いがあり，どれに対応するかは個人の自由になる．マクロで定義しておいた方が安全に管理することが出来るだろう．[^transposesymbol]

[^transposesymbol]: 多くの人が満足する転置を表す記号を新たに定義してほしい気持ちはすごくある．

# ○ 3点リーダー

$\rm\LaTeX$ で提供されている3点リーダーで行列を省略するような表記方法はよくあるだろう．

||コマンド|みほん|
|:--:|:--:|:--:|
|よこ (crosswise)|`\cdots`|![cdots]|
|たて (vertical)|`\vdots`|![vdots]|
|ななめ (diagonal)|`\ddots`|![ddots]|

[cdots]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/38584b9a-7064-61c1-6e46-b6a4abffa643.png
[vdots]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/ae0aded3-6ee0-b24a-2ad5-3a974a4b22ff.png
[ddots]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/0b9f5281-b6df-b304-d8d0-733e5a35f7fb.png

ここで，横の3点リーダーは`\ldots` を使用しないようにしよう．あまり好ましくはない．[^dots]

[^dots]: `\cdots` は文の中心の3点リーダーとなるが，`\ldots` は文の下側の3点リーダーとなる．

amsmath では連続する複数の行要素をリーダーで埋めることも出来る．`\hdotsfor` を使おう．

```tex
\hdotsfor[<乗数>]{<行の要素の数>}
```

以下のように利用することが出来る．

```tex
\begin{equation*}
\begin{pmatrix}
    a & b & c & d \\
    e & \hdotsfor{3}
\end{pmatrix}
\end{equation*}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/59b45617-8951-eba4-7356-1aaa75544f4e.png" width=50%>

# 参考


- [amsmathパッケージユーザガイド (Version 2.1)](https://www.latex-project.org/help/documentation/amsldoc_jpn.pdf) [pdf]
- [User’s Guide for the amsmath Package (Version 2.1)](http://texdoc.net/texmf-dist/doc/latex-dev/amsmath/amsldoc.pdf) [pdf]
- [The mathtools package](http://ftp.jaist.ac.jp/pub/CTAN/macros/latex/contrib/mathtools/mathtools.pdf) [pdf]
- [horizontal alignment - How do I left-align entries in a matrix with \begin{matrix}? - TeX - LaTeX Stack Exchange](https://tex.stackexchange.com/questions/45001/how-do-i-left-align-entries-in-a-matrix-with-beginmatrix)
- [LaTeXでの転置行列の表記 - Alice in the Machine - Blog](https://blog.browniealice.net/post/latex_transpose/)
- [math mode - What is the best symbol for vector/matrix transpose? - TeX - LaTeX Stack Exchange](https://tex.stackexchange.com/questions/30619/what-is-the-best-symbol-for-vector-matrix-transpose)
- [表記の哲学 - TeX Wiki](https://texwiki.texjp.org/?表記の哲学)

# 追記

- 2020/09/14 : amsmath とmathtools が提供する行列環境を明確にしました．