データツールの引数として挿入された定義変数

データツールの引数として挿入された定義変数

テキスト ファイルから数値を読み取り、それを座標またはノードとして使用したり、さらに計算に使用したりする tikzpicture (実際にはアニメーション化されています) を作成したいと思います。datatool パッケージが適していると思われますが、MWE のように引数を直接渡す場合にのみ機能します。

\documentclass{standalone}
\usepackage{filecontents}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{datatool}
\usepackage{animate}
\begin{filecontents*}{test.csv}
f wzb em
380 5 3
400 1 2
405 2 5
410 43 5656
415 4   94
420 4 6
\end{filecontents*}
\DTLsetseparator{ }
\DTLloaddb{widmo}{test.csv}
\begin{document}

\begin{animateinline}[label=graph_switch,controls=step]{1}
\multiframe{5}{iFrame=400+5}{       
\begin{tikzpicture}
   \useasboundingbox[draw] (-3,-2) rectangle (5,6);
\pgfmathparse{1000/\iFrame}
\edef\dlugosc{\pgfmathresult}
\DTLassignfirstmatch{widmo}{f}{405}{\wzb=wzb,\em=em}
%\DTLassignfirstmatch{widmo}{f}{\dlugosc}{\wzb=wzb,\em=em}
%\DTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}
\draw[->] (0,0) --  (\wzb, \em) --(\dlugosc:1) node[left] {\dlugosc};
\node at (2,0) {em=\em, wzb=\wzb};
\end{tikzpicture}
}
\end{animateinline}
\end{document}

コメントされた 2 行は期待通りには動作しません。これを修正する簡単な方法、またはテキスト ファイルを調べて特定の行から値を選択し、それを変数として使用できる他のパッケージはありますか? これに関する提案があれば幸いです。

答え1

一般的に、次のようなマクロ呼び出しに直面した場合、

\DTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}

マクロが\iFrameデータへの参照ではなく実際のデータを要求しているように見える場合は、データを保持するコマンド (この場合は ) を展開する必要があります\iFrame

運が良ければ、\iFrameマクロにはデータの実際のトークンが含まれ、トークンを取得するために 1 回の展開のみが必要になります。運が悪ければ、マクロは\iFrameまったく展開できず、その場合、ここで説明する方法では問題は解決されません。これらの両極端の間のどこかで、\iFrame必要なデータ トークンを生成するために有限数の展開が必要になる場合があります (ここではその方法については説明しませんが、方法はあります)。

幸いなことに、私たちの場合、には\iFrameデータの実際のトークンが含まれているため、1回の展開のみが必要です。これを実現する一般的な方法は次のとおりです。

\def\tmp{\DTLassignfirstmatch{widmo}{f}}
\expandafter\tmp\expandafter{\iFrame}{\wzb=wzb,\em=em}

ここでは、 までの括弧付き式を\iFrame一時マクロに格納します\tmp。次に、 を使用して\expandafter展開します。\iFrame 前にを展開します\tmp。したがって、 が実行される時点で\DTLassignfirstmatch、 の出現は、マクロ\iFrameに必要な実際のデータ トークンにすでに展開されています\DTL...

答え2

のドキュメントdatatoolにはそれが明確に記載されています。

\DTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}

これは に似ていますが、\DTLassignラベルで識別される列に指定⟨col key⟩された値がある、指定されたデータベースの最初の行に適用される点が異なります。試合では拡張は行われないことに注意してください。値は完全に一致する必要があります。

(98ページ、強調追加)

一方、この説明の直後には

\xDTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}

これは に似ています\DTLassignfirstmatchが、 に対して 1 レベルの展開を実行します⟨value⟩

だから使いたい

\xDTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}

試してみると、「ディメンションが大きすぎます」というメッセージが表示されます。

とにかく、私がテストすると

\def\iFrame{405}

\xDTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}

\verb|\wzb| = \wzb

\verb|\em| = \em

私は

ここに画像の説明を入力してください

関連情報