Skip to content

Instantly share code, notes, and snippets.

@yarakos95
Created February 13, 2021 18:06
Show Gist options
  • Save yarakos95/a2be2186d29e379c30f74e1913fdb092 to your computer and use it in GitHub Desktop.
Save yarakos95/a2be2186d29e379c30f74e1913fdb092 to your computer and use it in GitHub Desktop.
ドットとダッシュ

ドットとダッシュ

時間微分(ドット) と空間微分(ダッシュ) を引数から微分階数を指定できるコマンドを作成してみた.

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

使用パッケージ

注意 : 今回,\DeclareDocumentCommand を用いてコマンドを定義している.したがって,それ以前に定義されているコマンドを上書きする形をとる.

作成したコマンド

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

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

tdv and sdv commands

arg には微分階数(整数) を指定する.この引数なしに使用することも出来るが,この場合には引数が1 と同じとなる.(整数を指定することになるが,0 以下の数を入れるとfunction のみが出力される.)

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

コード

プリアンブルには上で示した2つのパッケージを導入しておく.また,amsmath にも依存している. したがって,以下のように読み込んでおく.

\usepackage{ifthen}
\usepackage{xparse}
\usepackage{amsmath}

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

時間微分

\newcounter{CDots}
\DeclareDocumentCommand\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}
  }}}}}
}

空間微分

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

最終行で\dash でも使えるように定義している.

記号の定義

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

\DeclareDocumentCommand{\deftdv}{ o m }
{
  \tdv[1]{\IfNoValueTF{#1}{\phantom{X}}{#1}}
  \coloneqq
  \IfNoValueTF{#1}{\frac{\dd}{\dd #2}}{\frac{\dd}{\dd #2}#1}
}
\DeclareDocumentCommand{\defsdv}{ o m }
{
  \sdv[1]{\IfNoValueTF{#1}{\phantom{X}}{#1}}
  \coloneqq
  \IfNoValueTF{#1}{\frac{\dd}{\dd #2}}{\frac{\dd}{\dd #2}#1}
}

d にはphysics で提供されている\dd を使用している.読み込んでいない場合にはこの部分を書き替えてほしい. また,定義記号には\coloneqq としているが,\equiv 等に変更しても良いだろう.

: 時間微分を"t", 空間微分を"x" で行う場合.

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

def tdv-sdv

引数として関数を挿入することも出来る.

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

def tdv-sdv

まとめ

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment