場合分けをきれいに書く

# 場合分けをきれいに書く

場合分けを書くだけでもいくつかテクニックがあるなぁと感じさせる記事です．

# ○ 基本的な場合分け環境

amsmath から提供されているcases 環境は以下のように利用する．

```tex
\begin{equation}  \label{eq: cases f}
f(x)=
    \begin{cases}
        \frac{1}{x}   &   \text{$0<x<1$のとき}  \\
        -x^2+1        &   \text{$x>1$のとき}
    \end{cases}
\end{equation}
```

![cases.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/72d1db17-8848-5a88-674d-14089f8ccd62.png)

アンパサンド`&` 以降も数式モードなので，`\text` を用いて条件等を挿入する．
また，ここではテキストスタイルになる．[^casesstyle]

[^casesstyle]: cases 環境ではテキストスタイルとなっている．これにを`\displaystyle` を挿入することでディスプレイスタイルにすることも出来るが，dcases 環境を用いた方が簡単である．

もちろん，equation+alignedat で同じようにすることが出来るが，cases 環境を用いてしまった方が簡単である．


```tex
\begin{equation}  \label{eq: cases f}
f(x)=
    \left\{
    \begin{alignedat}{2}
        & \frac{1}{x}    &\quad&    \text{$0<x<1$のとき}  \\
        & -x^2+1         &     &    \text{$x>1$のとき}
    \end{alignedat}
    \right.
\end{equation}
```

場合分けを`\{`, `\}` で括りたい場合にはcases 環境よりも上のようにequation+alignedat ですると良いだろう．

## ■ 拡張された場合分け環境

amsmath を拡張するmathtools[^mathtools] ではcases 環境を拡張して7つの場合分け環境を提供している．

[^mathtools]: [mathtools | CTAN](https://www.ctan.org/pkg/mathtools) から．

- cases\*
- dcases, dcases\*
- rcases, rcases\*
- drcases, drcases\*

`*` の有無は以下のような書き方に違いがある．

|場合分け環境|アンパサンド`&` 以降|立体文字の挿入方法|
|:--:|:--|:--|
|`*` **無し**|数式環境のまま|`\text`|
|`*` **付き**|本文中の通常立体文字|そのまま挿入可能|


```tex
\begin{equation}  \label{eq: cases f}
f(x)=
    \begin{cases*}
        \frac{1}{x}   &   $0<x<1$のとき  \\
        -x^2+1        &   $x>1$のとき
    \end{cases*}
\end{equation}
```


いずれの場合で立体文字を挿入していても，`$` を用いて数式をインラインモードで挿入することが出来る．
条件として加える部分に数式と文章のどちらが多いかによって使い分けると良いだろう．

また，cases 環境ではテキストスタイルだったが，`d-` 環境はディスプレイスタイルとなる．
括弧の位置も変えることが出来る．


|       環境       | 数式のスタイル  | 括弧の位置 |
| :--------------: | :-------------: | :--------: |
|  cases, cases\*  |  `\textstyle`   |    { ひだり    |
| dcases, dcases\* | `\displaystyle` |    { ひだり    |
| rcases, rcases\* | `\textstyle` |    みぎ }    |
| drcases, drcases\* | `\displaystyle` |    みぎ }   |

```tex
\begin{equation}  \label{eq: cases f}
f(x)=
    \begin{dcases}
        \frac{1}{x}    &   \text{$0<x<1$のとき}  \\
        -x^2+1         &   \text{$x>1$のとき}
    \end{dcases}
\end{equation}
```

![dcases.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/318a2366-5707-4ed3-a934-6e96a009bb1c.png)

# ○ 各々に式番号を付けたい

amsmath やmathtools から提供されている場合分け環境は，式番号が全体で1つしか付与されない．

各々の場合分けにも式番号を付与したい場合，以下の2つの方法が挙げられるだろう．

また，式番号の付けられ方についても確認しておきたい．
サブナンバーとして`(1a)`, `(1b)` とすることも可能である．このようにすることで，場合分け各々に対しての相互参照と，式全体の相互参照の双方をすることが出来る．

## ■ empheq パッケージを使用する

empheq パッケージ[^empheq]はmathtools のバンドルになっている．
直接的に場合分けの環境ではないが作成することが出来る．

[^empheq]: [empheq | CTAN](https://www.ctan.org/pkg/empheq) から．


```tex
\begin{empheq}[left = {g(x)= \empheqlbrace \,}]{alignat = 2}
    & \frac{1}{4}x^2+1    &\quad&   \text{$0<x<2$のとき}  \label{eq: cases g1}  \\
    & 3x-4                &     &   \text{$2>x$のとき}  \label{eq: cases g2}
\end{empheq}
```

![cases-empheq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/2365abbc-dfb6-064e-9373-c75e616c48c3.png)

もしも，`(1a)`, `(1b)` というような式番号にしたい場合には，subequations 環境を利用する．

```tex
\begin{subequations}  \label{eq: g all}
    \begin{empheq}[left = {g(x)= \empheqlbrace \,}]{alignat = 2}
        & \frac{1}{4}x^2+1    &\quad&   \text{$0<x<2$のとき}  \label{eq: cases g1}  \\
        & 3x-4                &     &   \text{$2>x$のとき}  \label{eq: cases g2}
    \end{empheq}
\end{subequations}
```

![cases-empheq-subequations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/41cbbab8-9b55-3b7b-80b3-f19e64699069.png)

subequations 環境については以下の記事に詳しい．

- [連立方程式をきれいに書く - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/dc8f983d24698119bf71)

ちなみに，rcases 環境のように右側に括弧を付けたい場合には，以下のようにすればよい．

```tex
\begin{empheq}[right = {\,\empheqrbrace = g(x)}]{alignat = 2}
    & \frac{1}{4}x^2+1    &\quad&   \text{$0<x<2$のとき}  \label{eq: cases g1r}  \\
    & 3x-4                &     &   \text{$2>x$のとき}  \label{eq: cases g2r}
\end{empheq}
```

![rcases-empheq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/ec6527d8-2b30-14cf-b5f6-6efc73fbf8a7.png)

## ■ cases パッケージを使用する

cases パッケージ[^casespackage]では2つの環境を提供している．
読み込みは必ずamsmath の**後**．

[^casespackage]: [cases | CTAN](https://www.ctan.org/pkg/cases) から．

いずれの場合分け環境もディスプレイスタイルである．
empheq パッケージで作成するよりも幾分か楽に作成することが出来る．


```tex
\begin{numcases}{h(x) = }
    3\frac{1}{x}    &   \text{$0<x<3$のとき}  \label{eq: cases h1}  \\
    x^2-8           &   \text{$3>x$のとき}  \label{eq: cases h2}
\end{numcases}
```

![numcases.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/f77a925d-78e7-3402-1f61-5d99711e4e45.png)

また，`(1a)`, `(1b)` というような式番号にしたい場合には，subnumcases 環境を利用する．


```tex
\begin{subnumcases}{\label{eq: h all}  h(x) = }
    3\frac{1}{x}    &   \text{$0<x<3$のとき}  \label{eq: cases h1}  \\
    x^2-8           &   \text{$3>x$のとき}  \label{eq: cases h2}
\end{subnumcases}
```

![subnumcases.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/41fcd142-b39c-220f-b864-a51d5ee899fa.png)



## ! cases パッケージのオプション

いくつかのオプションがある．
fleqn やleqno はamsmath 側でも同様のオプション設定をしておく必要がある．

| オプション |                                                                  | 
| ---------- | ---------------------------------------------------------------- | 
| subnum     | numcases 環境をsubnumcases 環境として処理する                    | 
| amsstyle   | テキストスタイルに変更                                           | 
| casesstyle | amsmath から提供されているcases 環境をディスプレイスタイルに変更 |
| fleqn      | 数式の配置を文章幅の左右中央ではなく，左から一定の字下げの後で行う | 
| leqno      | 式番号を左に置く(場合分けの各々に式番号を付与している場合には似つかわしくない)          |  
| cases      | amsmath を読み込まない場合にcases 環境を提供                     | 

cases パッケージでは右側括弧の場合分け環境を作成することは出来ない．

# ○ 場合分け環境内で改行を含みたい

以下のような場合，右辺の数式は改行をしておいた方が良いだろう．※ (1)式参照
また，条件が複数ある場合にも改行した方が良いだろう．※ (2)式参照

![bad-cases.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/9ce05610-dc49-79d0-1a15-be262750f7e3.png)


## ■ 数式を改行する

数式を改行する場合は，split 環境が想定されるだろう．また，mathtools から提供されているmultlined 環境を用いる方法もある．
これらにはいくつかのテクニックがあったので紹介しておきたい．

数式の改行は，改行された2段目の数式は1段目より下げて(右側に移動させて)置いた方が良い．この点に留意しておきたい．

### cases 環境内で改行

cases 環境はテキストスタイルで表示されるためか，multlined 環境では上手く表示できないようだった．したがって，split 環境を使いたい．
これはrcases 環境とこれらの`*` 付き環境と同様である．

- **cases + split + qquad**

```tex
\begin{equation}
\framebox[2cm]{LHS} = 
    \begin{cases}
        \begin{split}
        & \framebox[5cm]{long expression 1st line}  \\
        & \qquad \framebox[3cm]{2nd line}
        \end{split}                           &   \text{for}\,\framebox[3cm]{1st condition}  \\
        \framebox[3cm]{short expression}      &   \text{for}\,\framebox[3cm]{2nd condition}
    \end{cases}
\end{equation}
```


![cases-split-qquad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/acf4cc01-4a85-1880-d613-c4ffc2c6e26d.png)

2段目では`\qquad` で間隔を空けているが，mathtools から提供されている`\MoveEqLeft` を用いても良い．

- **cases + split + MoveEqLeft**

```tex
\begin{equation}
\framebox[2cm]{LHS} = 
    \begin{cases}
        \begin{split}\MoveEqLeft
        \framebox[5cm]{long expression 1st line}  \\
        & \framebox[3cm]{2nd line}
        \end{split}                         &   \text{for}\,\framebox[3cm]{1st condition}  \\
        \framebox[3cm]{short expression}    &   \text{for}\,\framebox[3cm]{2nd condition}
    \end{cases}
\end{equation}
```

![cases-split-multlined.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/ee8c0033-cbed-4d76-b77b-c0814eb18252.png)

### dcases 環境内で改行

dcases 環境では，split 環境とmultlined 環境の双方を使うことが出来る．
これはdrcases 環境とこれらの`*` 付き環境と同様である．

- **dcases + split + MoveEqLeft**

```tex
\begin{equation}
\framebox[2cm]{LHS} = 
    \begin{dcases}
        \begin{split}\MoveEqLeft
        \framebox[5cm]{long expression 1st line}  \\
        & \framebox[3cm]{2nd line}
        \end{split}                         &   \text{for}\,\framebox[3cm]{1st condition}  \\
        \framebox[3cm]{short expression}    &   \text{for}\,\framebox[3cm]{2nd condition}
    \end{dcases}
\end{equation}
```


![dcases-split.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/acf15f51-edb0-2ea5-0098-6678cc234eae.png)

- **dcases + multilned**

```tex
\begin{equation}
\framebox[2cm]{LHS} = 
    \begin{dcases}
        \begin{multlined}   % multlined で"&" は使用できない
        \framebox[5cm]{long expression 1st line}  \\
        \framebox[3cm]{2nd line}
        \end{multlined}                     &   \text{for}\,\framebox[3cm]{1st condition}  \\
        \framebox[3cm]{short expression}    &   \text{for}\,\framebox[3cm]{2nd condition}
    \end{dcases}
\end{equation}
```


![dcases-multlined.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/281770a4-99c9-b27b-42d9-d0fcd3797664.png)

### empheq 環境内で改行

empheq(alignat) ではsplit 環境を挿入すると他のsplit 環境が壊れる事態が発生していた．そのため，multlined 環境を使うことをお勧めしたい．

- **empheq(alignat) + multlined**

```tex
\begin{empheq}[left = {\framebox[2cm]{LHS} = \empheqlbrace \,}]{alignat = 2}
    & \begin{multlined}
        \framebox[5cm]{long expression 1st line}  \\
        \framebox[3cm]{2nd line}
        \end{multlined}                   &\quad&   \text{for}\,\framebox[3cm]{1st condition}  \\
    & \framebox[3cm]{short expression}    &     &   \text{for}\,\framebox[3cm]{2nd condition}
\end{empheq}
```


![emph-multlined.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/6c06e474-bc79-fd26-40c8-004b151f74cb.png)

式番号にサブナンバーを付与したい場合は，subequations 環境内で使用すればよい．

## ■ 条件を改行する

条件が複数ある場合，改行しておいた方が良いだろう．
複数ある条件を以下のようにすれば良い．

```tex
\left\{  \begin{aligned}
    \text{for}\,& \framebox[3cm]{1st condition}  \\
    \text{or}\, & \framebox[3cm]{2nd condition}
\end{aligned}  \right.
```

この方法は上のどの環境であってもこの書き方で対応することが出来るようだ．
具体的にすると，以下のようになる．

```tex
\begin{empheq}[left = {\framebox[2cm]{LHS} = \empheqlbrace \,}]{alignat = 2}
    & \framebox[3cm]{1st expression}    &\quad&    \text{for}\,\framebox[3cm]{1st condition}  \\
    & \framebox[3cm]{2nd expression}    &     &    \left\{  \begin{aligned}
                                                       \text{for}\,& \framebox[3cm]{2nd condition}  \\
                                                       \text{or}\, & \framebox[3cm]{3rd condition}
                                                   \end{aligned}  \right.
\end{empheq}
```

![condition-par.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590705/89f7585e-211d-17f0-7bbf-43fe18e6d1d6.png)

このempheq で分かるように，各条件について式番号は付与されないので注意が必要である．

# ○ showonlyrefs との併用

mathtools パッケージ[^showonlyref]のshowonlyrefs を使って式番号を相互参照する数式のみ付与するようにしている人は多いのではないだろうか．

[^showonlyref]: showonlyref に関して「[数式の相互参照: mathtools の紹介 - 裏紙に雑文](http://mtino1594.hatenablog.com/entry/2017/11/20/012034)」に詳しい．

showonlyrefs を利用しながら場合分けの一部しか相互参照しないが他の場合分けに式番号を付与したい際には，`\noeqref` を用いれば良い．


```tex
\mathtoolsset{showonlyrefs = true}
\begin{subequations}  \label{eq: g all}
    \begin{empheq}[left = {g(x)= \empheqlbrace \,}]{alignat = 2}
        & \frac{1}{4}x^2+1    &\quad&   \text{$0<x<2$のとき}  \label{eq: cases g1}  \noeqref{eq: cases g1}  \\
        & 3x-4                &     &   \text{$2>x$のとき}  \label{eq: cases g2}
    \end{empheq}
\end{subequations}
相互参照は\eqref{eq: cases g2}だけ!!
```

empheq パッケージで作成した場合は`\noeqref` によって式番号を付与することが出来たが，numcases, subnumcases 環境では式番号を回復させることが出来なかった．

また，autonum パッケージではnumcases, subnumcases 環境の式番号を消すことが出来なかった．

# 参考

- [amsmath - Split-like environment inside cases environment - TeX - LaTeX Stack Exchange](https://tex.stackexchange.com/questions/5183/split-like-environment-inside-cases-environment)

# 余談

これで場合分けを書く際に書けないようなことはないだろう．

各々に式番号を付ける場合，cases パッケージで書く方が平易に書くことが出来るが，empheq パッケージで作成したほうがshowonlyrefs に対応していて良いように思う．
実はcases パッケージについて書きたかったのに，cases パッケージはあまりオススメ出来ないという結果になってしまった．

empheq で作成するのも長くて面倒なので，新たなsubnumcases 環境を作成してしまえば良いようにも思う．

```tex
\newenvironment{subnumcases}[2]{%
    \subequations \label{#1}   % 
    \empheq[left = {#2 \empheqlbrace \,}]{alignat = 2}    % 
}{%
    \endempheq    % 
    \endsubequations    % 
}
```

ただし，このように新たな環境として定義しても，この環境内ではalignat 環境で書く必要があるので少々面倒ではある．

場合分け環境内で改行するときがあるのか分からないが，そのようにしたい人はいくらかいるようだった．
(コードの見やすさ重視にスペースを多用したが，さすがに入れすぎという感は否めない)


にしても，例に出している数式の条件部分で「～のとき」としているのはさすがにアレだな……