変数の使い方(TeX・Tikzで数値計算)
$$
\def\DIS{\displaystyle}
\def\fraction(#1/#2){\frac{#1}{#2}}
\def\ff(#1/#2){\frac{#1}{#2}}
\def\dd#1#2#3{\frac{d ^{#1}#2}{d #3^{#1}}}
\def\pdd#1#2{\frac{\partial ^{#1}#2}{\partial #3^{#1}}}
\def\bi#1#2{{}{#1}! , \mathrm C{#2}}
\def\bm{\boldsymbol}
$$
TeXで数値計算をするときは,2種類の変数の使い方があります。次のように定義します。
\def\hogehoge{数値}
\tikzmath{
\tikzhoge = 数値;
}
数値計算は\tikzmath
内で行うので,後者の変数を使う方が便利です。
しかし,\tikzmath
の変数は,環境をまたいだりすると数値を忘れてしまうことがあります。次のように,0,1,2,3,4を表示するTeXを書きます。
\def\stepA{5}
\newcount\countA
\tikzmath{
\tikzhoge =0;
}
\countA = 0 \loop\ifnum\countA < \stepA
{
\begin{preview}
\tikzhoge
\end{preview}
\tikzmath{
\tikzhoge = \tikzhoge + 1;
}
}
\advance\countA by1\repeat
これを実行すると0が5個表示されます。\tikzhoge
に1ずつ足した結果が有効になっていません。
次のように変更して,数値を忘れないようにします。
\def\stepA{5}
\newcount\countA
\tikzmath{
\tikzhoge =0;
}
\def\hogehoge{\tikzhoge}
\countA = 0 \loop\ifnum\countA < \stepA
{
\begin{preview}
\hogehoge
\end{preview}
\tikzmath{
\tikzhoge = \hogehoge;
\tikzhoge = \tikzhoge + 1;
}
\global\edef\hogehoge{\tikzhoge}
}
\advance\countA by1\repeat
と表示されます。
\global
はTeX文章内全体で有効にする,\edef
は数値を代入するという意味で,この2つを組み合わせます。
変数に番号をつける・配列 \expandafter
\def
,\edef
は次のように使うことはできません。
\foreach \x in {1,...,5}{
\global\def\csname hogehoge[\x] \endcsname{\tikzhoge}
}
\x
の数値を有効にしなければいけません。次のように\expandafter
を入れます。
\foreach \x in {1,...,5}{
\global\expandafter\def\csname hogehoge[\x] \endcsname{\tikzhoge}
}
\tikzmath
の変数にも番号をつけることができます。
\tikzmath{
\tikzhoge{1} =1;
\tikzhoge{2} =2;
}
ただし,次のような事はできません。
\foreach \x in {1,...,5}{
\global\expandafter\def\csname hogehoge[\x] \endcsname{\tikzhoge{\x}}
}
理由は分かりませんが(\xの取る値が整数型ではないのが理由かも),少々面倒ですが整数型の変数を導入し,カウンターを用いて解決します。
\countB = 0 \loop\ifnum\countB < 2
{
\tikzmath{
int \tikzcountB;
\tikzcountB = \countB + 1;
}
\global\expandafter\edef\csname hogehoge[\tikzcountB] \endcsname{\tikzhoge{\tikzcountB}}
}
\advance\countB by1\repeat
\foreach
では,整数形の変数を用いても解決しませんでした。