我想創建 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}
這兩行註解行並不像我那樣運作。有沒有一種簡單的方法來修復它或其他套件可以讓我查看文字文件,從特定行中選擇值並將其用作變數?如果有任何建議,我將不勝感激。
答案1
一般來說,當您遇到諸如以下的巨集呼叫時
\DTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}
其中巨集似乎需要實際數據,而不是\iFrame
對數據的引用,您需要擴展保存數據的命令,在本例中為\iFrame
。
如果幸運的話,\iFrame
將包含資料的實際標記,並且只需要一次擴充即可取得它們。如果你運氣不好,\iFrame
宏將根本無法擴展,在這種情況下,我所描述的將無法解決你的問題。在這些極端之間的某個地方,\iFrame
可能需要有限數量的擴展來產生所需的數據標記(我不會在這裡描述如何實現這一點,但有一些方法可以做到這一點)。
幸運的是,在我們的例子中,\iFrame
包含資料的實際標記,因此只需要一次擴展。實現此目的的典型方法如下
\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
但對 執行一級擴展⟨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
我明白了