Ich möchte ein Tikzpicture (animiert) erstellen, das Zahlen aus einer Textdatei liest und sie entweder als Koordinaten oder Knoten oder für weitere Berechnungen verwendet. Das Datatool-Paket scheint dafür geeignet zu sein, aber ich kann es nur zum Laufen bringen, wenn ich die Argumente direkt übergebe, wie in 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}
Die beiden kommentierten Zeilen funktionieren nicht so, wie ich es mir vorgestellt hatte. Gibt es eine einfache Möglichkeit, das Problem zu beheben, oder ein anderes Paket, mit dem ich die Textdatei durchsuchen, einen Wert aus einer bestimmten Zeile auswählen und ihn als Variable verwenden kann? Ich bin für jeden Vorschlag diesbezüglich dankbar.
Antwort1
Wenn Sie mit einem Makroaufruf konfrontiert werden, wie z. B.
\DTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}
in dem das Makro scheinbar tatsächliche Daten und nicht \iFrame
einen Datenverweis anfordert, müssen Sie den Befehl erweitern, der die Daten enthält, in diesem Fall \iFrame
.
Wenn Sie Glück haben, \iFrame
enthält es die tatsächlichen Token der Daten und erfordert nur eine einzige Erweiterung, um sie zu erhalten. Wenn Sie Pech haben, \iFrame
ist das Makro überhaupt nicht erweiterbar. In diesem Fall wird das, was ich beschreibe, Ihr Problem nicht lösen. Irgendwo zwischen diesen Extremen \iFrame
kann eine endliche Anzahl von Erweiterungen erforderlich sein, um die gewünschten Token der Daten zu erzeugen (ich werde hier nicht beschreiben, wie das erreicht wird, aber es gibt Möglichkeiten, dies zu tun).
Glücklicherweise \iFrame
enthält in unserem Fall die eigentlichen Datentoken, sodass nur eine einzige Erweiterung erforderlich ist. Eine typische Methode, um dies zu erreichen, ist wie folgt
\def\tmp{\DTLassignfirstmatch{widmo}{f}}
\expandafter\tmp\expandafter{\iFrame}{\wzb=wzb,\em=em}
Hier speichern wir einen Klammer-balancierten Ausdruck, der zu führt, \iFrame
in einem temporären Makro \tmp
. Dann kann man verwenden, \expandafter
um zu erweitern\iFrame
VorErweitern \tmp
. Daher wurde das Vorkommen von zum Zeitpunkt \DTLassignfirstmatch
der Ausführung \iFrame
bereits auf die tatsächlichen Datentoken erweitert, die das \DTL...
Makro benötigt.
Antwort2
Die Dokumentation datatool
ist diesbezüglich eindeutig:
\DTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}
Dies ähnelt dem,
\DTLassign
außer dass es für die erste Zeile in der angegebenen Datenbank gilt, in der die durch die Bezeichnung identifizierte Spalte⟨col key⟩
den angegebenen Wert hat.Beachten Sie, dass im Match keine Erweiterung durchgeführt wird.Der Wert muss exakt übereinstimmen.
(Seite 98, Hervorhebung hinzugefügt.)
Unmittelbar nach dieser Beschreibung finden Sie jedoch
\xDTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}
Dies ist wie
\DTLassignfirstmatch
, führt aber eine einstufige Erweiterung durch⟨value⟩
.
Sie möchten also
\xDTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}
Wenn ich es versuche, erhalte ich allerdings die Meldung „Dimension zu groß“.
Wie auch immer, wenn ich es teste mit
\def\iFrame{405}
\xDTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}
\verb|\wzb| = \wzb
\verb|\em| = \em
Ich bekomme