xparseで条件分岐コマンドを生成 LaTeX

# 準備

```tex
\usepackage{xparse}
\usepackage{mleftright} %あったほうがいい
```
ドキュメント
https://ctan.org/pkg/xparse



# 例


### leftとrightを楽にしたい

```tex
\NewDocumentCommand\ld{}{\left.}
\NewDocumentCommand\rd{}{\right.}
\NewDocumentCommand\alc{}{\mleft\lparen}
\NewDocumentCommand\arc{}{\mright\rparen}

```


### 関数に変数を明示したい

```tex
\NewDocumentCommand\funct{m}{
    {#1}_{\alc t \arc}
}   %f(t)
```


### 積分記号の引数処理を楽にしたい

```tex
\NewDocumentCommand\intet{moo}{
    \IfValueTF{#2}{
        \IfValueTF{#3}{
            \int_{#2}^{#3}
        }{
            \int_{#2}
        }
    }{
        \int
    }
    {#1} {\mathrm{d}t}
}

\[
  \intet{\funct{f}{}}[\tau]
\]
```

+ #2があって#3があるなら$\int$の上下に引数を入れる
+ #2のみなら$\int$の下に引数を入れる
+ #2もないなら$\int$のみ

これだと$\int_\tau f_{(t)} \mathrm{d}t$が生成される


### 微分ry

```tex
\NewDocumentCommand\difft{mo}{
    \IfValueT{#2}{\ld}
    \frac{\mathrm{d}}{\mathrm{d}t} {#1}
    \IfValueT{#2}{\right\vert_{#2}}
}

\[
  \difft{x^2}[2] &= 4
\]

```

+ #2があるなら$\vert$と引数のセットをつける
+ #2がないならなし

これだと$\left. \dfrac{\mathrm{d}}{\mathrm{d}t} x^2 \right|_2 = 4$が生成される



# 解説



## 関数


### `\IfValueTF{}{}`，`\IfValueT{}`，`\IfValueF{}`
変数がある時〜！が`true`でない時〜！が`false`
`TF{}{}`は`true`の処理と`false`の処理を分けて書ける
それ以外は`true`か`false`のどちらかの時だけを書ける


### `\IfNotValueTF{}{}`，`\IfNotValueT{}`，`\IfNotValueF{}`
その逆を往く


### `\IfBooleanValueTF{}{}`，`\IfBooleanValueT{}`，`\IfBooleanValueF{}`
`\BooleanTrue`と`\BooleanFalse`に対応する（後述）


### ```\NewDocumentCommand```
コマンド新設置

```tex
\NewDocumentCommand\新しい関数の名前{引数のオプション}{処理の中身}
```


### ```\RenewDocumentCommand```
コマンド上書き

```tex
\NewDocumentCommand\新しい関数の名前{引数のオプション}{処理の中身}
```



## 引数


### 関数側
最低限は以下のルールを守る

+ 前から`#1`，`#2`，`#3`…と呼ぶ
+ 念のために`{#1}`のように前後は`{}`で囲っておいたほうがいい
+ 定義の中で既に定義された別の関数を用いることができる
  + デフォルトの値にも設定できる
+ 変数に段落（`\par`動作）も含めたいならオプションの前に`+`をつけよう
+ コマンドの省略制御は割りと難しいので，**使用頻度の高い順に番号を振るのが吉**
+ `m`オプション
  + 入力がなければコンパイルエラー吐いて止まる
  + 要するに普通の引数と同じ
+ `o`オプション
  + 入力がなければ`-NoValue-`すなわち`変数なし`を返す
     + この時に変数を無理矢理に出力すると**`"-NoValue-"`という文字列になる**
     + でも`"-NoValue-"`を入力に渡すと`-NoValue-`は返されない
  + 入力があれば処理は続行する
+ `O{デフォルトの値}`オプション
  + 入力がなければデフォルトの値を採用する
  + 入力があれば入力を採用する
+ `+b`オプション
  + 環境設定的な`begin{}`を作るのに重宝する
  + 引数の最後にこれを持ってくることで，以降の文章が全て入力として扱われる
+ `s`オプション
  + コマンドの後に`*`を入れてモードを切り替えるのに便利
  + `*`あれば`\BooleanTrue`，なければ`\BooleanFalse`
     + 引数設定の先頭に`s`があるなら，このどっちかが必ず変数`#1`に入る
     + 別に先頭である必要はないが，慣習的に先頭の方がよさそう


### 本文側
だいたいこんな感じか

+ `m`オプション
  + `\コマンド{引数}`の形を取る
  + **`{}`は入力ありと判定される** 
+ `o`オプション
  + `\コマンド[引数]`の形を取る
  + **`[]`は入力ありと判定される**
+ `O`オプション
  + `\コマンド[引数]`の形を取る
  + **`[]`は入力ありと判定される**
+ `s`オプション
  + `*`の有無に依存する
  + 必ず`\BooleanTrue`か`\BooleanFalse`のどちらかを返す
+ 省略制御は難しい
  + 例えば関数側で`{s m m O{xyz} o o}`と指定した時
     + `[]`は`\BooleanFalse,-NoValue-,-NoValue-,"",-NoValue-,-NoValue-`になる
     + `{}[][]`は`\BooleanFalse,"",-NoValue-,"","",-NoValue-,`になる
  + 要するに引数の型をチェックして前に詰めていく上に**「入力なし」を入力できない**らしい


# これを使う利点
割と楽に2つ以上の引数の省略が可能になる，使い分けが増えることで関数名が節約できる
（デフォルトでは自明に1個までしか省略できない）

# 意見・要望
積分記号あるじゃないですか，あれって

```tex
\[
  \left\int f(x) \right.
\]
```

的な感じでサイズを調整してくれるとマジで嬉しいんですよね
実際には`! Missing delimiter (. inserted).`つまり`\int`は区切り記号（括弧類）じゃないってエラー吐かれるんですが
でもだってほら，微分に使う$\vert$はleftrightできるし，$\int$も対応して欲しいなって