時間微分と空間微分のためのコマンド

# 時間微分と空間微分のためのコマンド

時間微分にニュートンの記法，空間微分にラグランジュの記法を使用する場合，`\dot{f}` や`f^\prime` とするだろう．

しかしながら，時間の3階微分は`\dddot{f}`，空間の3階微分は`f^{\prime\prime\prime}` とする必要がある．分かりづらい上に打つのも面倒だ．
そこで，時間微分(ドット) と空間微分(ダッシュ) をオプション引数から微分階数を指定できるコマンドを作成してみた．

これらは条件分岐と反復処理のみで作成しているので，比較的コードは単純になっています．場合によっては適宜修正を加えてください．

## 使用パッケージ

- [ifthen | CTAN](https://www.ctan.org/pkg/ifthen)
- [xparse | CTAN](https://www.ctan.org/pkg/xparse)
- [amsmath | CTAN](https://www.ctan.org/pkg/amsmath)

ifthen パッケージでは条件分岐と反復処理，xparse パッケージでオプション引数の追加を行っている．

これらのパッケージについては以下の記事に詳しい．

> - [LaTeX で条件分岐や反復処理：ifthen パッケージのキホン - Qiita](https://qiita.com/zr_tex8r/items/71ae46c9c4e8cb575073)
> - [xparse パッケージでスゴイ LaTeX マクロを作ろう！ - Qiita](https://qiita.com/zr_tex8r/items/50168ad7087516c3e139)

## 作成したコマンド

以下の2つのコマンドを作成した．

|                               |       コマンド        |
| :---------------------------: | :-------------------: |
|  時間微分 (time derivative)   | `\tdv[arg]{function}` |
| 空間微分 (spacial derivative) | `\sdv[arg]{function}` |

`arg` には微分階数(整数) を指定する．この引数なしに使用することも出来るが，この場合には引数が`1` と同じとなる．

整数を指定することになるが，`0` 以下の数を入れると`function` のみが出力される．また，小数を挿入するとエラーを吐く．

![tdv and sdv commands](https://i.gyazo.com/8e74625a13fb347f4d38efb2a3401158.png)


時間微分はドットを繰り返すのみになっている．あまり高階の時間微分には適していないだろう．
空間微分は3階微分まではダッシュ，4階以上の微分では`(n)` で示すようになっている．

## コード

プリアンブルには上で示したパッケージを以下のように読み込んでおく．

```latex
\usepackage{ifthen}
\usepackage{xparse}
\usepackage{amsmath}
```

これらは独立して定義しているので，それぞれを一方のコードのみでも使用可能となっている．

<details><summary>時間微分と空間微分のためのコマンド コードまとめ (折りたたみ)</summary><div><br>

いくつかコメントアウトしている．適宜コメントアウトを解除してください．

```latex
\newcounter{CDots}
\NewDocumentCommand\tdv{ o m }
{
  \IfNoValueTF{#1}{\dot{#2}}
  {
    \ifthenelse{#1=1}{\dot{#2}}
    {
      \ifthenelse{#1=2}{\ddot{#2}}
      {
        \ifthenelse{#1=3}{\dddot{#2}}
        {
          \ifthenelse{#1=4}{\ddddot{#2}}
          {
            \overset{
              \setcounter{CDots}{0}
              \whiledo{\value{CDots}<#1}{
                .
                \addtocounter{CDots}{1}}
            }{#2}
  }}}}}
}
% \let\accentdot\dot
% \let\dot\tdv
\newcounter{CPrims}
\NewDocumentCommand\sdv{ o m }
{
  \IfNoValueTF{#1}
  {#2^{\prime}}
  {
    #2^{
      \ifthenelse{#1<4}
      {
        \setcounter{CPrims}{0}
        \whiledo{\value{CPrims}<#1}{
          \prime
          \addtocounter{CPrims}{1}}
      }
      {(#1)}}
  }
}
% \NewDocumentCommand{\dash}{}{\sdv}
```


</div></details><br>



### 時間微分

```latex
\newcounter{CDots}
\NewDocumentCommand\tdv{ o m }
{
  \IfNoValueTF{#1}{\dot{#2}}
  {
    \ifthenelse{#1=1}{\dot{#2}}
    {
      \ifthenelse{#1=2}{\ddot{#2}}
      {
        \ifthenelse{#1=3}{\dddot{#2}}
        {
          \ifthenelse{#1=4}{\ddddot{#2}}
          {
            \overset{
              \setcounter{CDots}{0}
              \whiledo{\value{CDots}<#1}{
                .
                \addtocounter{CDots}{1}}
            }{#2}
  }}}}}
}
```

以下を続けて挿入すれば，元の`\dot` を`\accentdot` に代えて`\dot` を`\tdv` に置き換えることが出来る．
これによって，オプション引数を加えた`\dot` とすることが出来る．

```latex
\let\accentdot\dot
\let\dot\tdv
```

オプション引数のない`\dot` も使用できるので，`\dot` を使用したパッケージ等と衝突することは無いと思われる．

### 空間微分

```latex
\newcounter{CPrims}
\NewDocumentCommand\sdv{ o m }
{
  \IfNoValueTF{#1}
  {#2^{\prime}}
  {
    #2^{
      \ifthenelse{#1<4}
      {
        \setcounter{CPrims}{0}
        \whiledo{\value{CPrims}<#1}{
          \prime
          \addtocounter{CPrims}{1}}
      }
      {(#1)}}
  }
}
```

以下を追加すれば，`\sdv` を`\dash` とすることも出来る．

```latex
\NewDocumentCommand{\dash}{}{\sdv}
```



## 記号の定義

ドットやダッシュを利用する際には，微分操作と記号を一致させておく必要がある．
これを簡便にするコマンドも作成しておいた．

```latex
\NewDocumentCommand{\deftdv}{ o D(){\mathrm{d}} m O{\coloneqq} }%
{%
  \dot{\IfNoValueTF{#1}{\phantom{X}}{#1}}%
  #4%
  \IfNoValueTF{#1}{\frac{#2}{#2 #3}}{\frac{#2}{#2 #3}#1}%
}
\NewDocumentCommand{\defsdv}{ o D(){\mathrm{d}} m O{\coloneqq} }%
{%
  {\IfNoValueTF{#1}{\phantom{X}}{#1}}^\prime%
  #4%
  \IfNoValueTF{#1}{\frac{#2}{#2 #3}}{\frac{#2}{#2 #3}#1}%
}
```

以下のように使用する．

```latex
\defxdv[function](diff){dependent variable}[definition symbol]
```

オプションとして以下の3つを変更することが出来る．

- 関数の挿入
- 微小量`d` の変更(デフォルト：`\mathrm{d}`)
- 定義記号の変更(デフォルト：`\coloneqq`)

以下に使用例を紹介しておく．

**使用例1**
:  時間微分を"t", 空間微分を"x" で行う．

```latex
\begin{equation*}
  \deftdv{t},
  \quad
  \defsdv{x}
\end{equation*}
```

![def tdv-sdv1](https://i.gyazo.com/8affb6bc8aaf61cbd3fbc7047462b79f.png)

これを基本的な使用方法として想定している．

**使用例2**
:  関数を挿入する．

```latex
\begin{equation*}
  \deftdv[F]{t},
  \quad
  \defsdv[G]{x}
\end{equation*}
```

![def tdv-sdv2](https://i.gyazo.com/af5001f38938d5ef2bb806cd005bc94d.png)

`function` を挿入する場合もあるだろう．

**使用例3**
:  微小量`d` を`\partial` に変更，`\coloneqq` を`\equiv` に変更する．

```latex
\begin{equation*}
  \deftdv[F](\partial){\tau}[\equiv],
  \quad
  \defsdv[G](\partial){\xi}[\equiv]
\end{equation*}
```

![def tdv-sdv3](https://i.gyazo.com/6eef0cc5bc54c6cc08c9aa761b958fa6.png)

少し自由度高めに作成した．

# まとめ

ifthen パッケージとxparse パッケージを利用すれば何でも出来そう．(TeX /LaTeX にプリミティブなコマンドはなるべく使用しない強いお気持ち)