テキスト ファイルから数値を読み取り、それを座標またはノードとして使用したり、さらに計算に使用したりする 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
私は