時間微分(ドット) と空間微分(ダッシュ) を引数から微分階数を指定できるコマンドを作成してみた.
条件分岐と反復処理のみで作成しているので,比較的コードは単純になっています.場合によっては適宜修正を加えてください.
注意
: 今回,\DeclareDocumentCommand
を用いてコマンドを定義している.したがって,それ以前に定義されているコマンドを上書きする形をとる.
以下の2つのコマンドを作成した.
コマンド | |
---|---|
時間微分 (time derivative) | \tdv[arg]{function} |
空間微分 (spacial derivative) | \sdv[arg]{function} |
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*}
引数として関数を挿入することも出来る.
\begin{equation*}
\deftdv[F]{t},
\quad
\defsdv[G]{x}
\end{equation*}
ifthen パッケージとxparse パッケージを利用すれば何でも出来そう.(TeX /LaTeX にプリミティブなコマンドは使用しない強いお気持ち)