Eu gostaria de criar um tikzpicture (de fato animado) que lesse números de um arquivo de texto e os usasse como coordenadas ou nós ou para cálculos adicionais. Parece que o pacote datatool seria adequado, mas só posso fazê-lo funcionar se passar os argumentos diretamente, como no 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}
As duas linhas comentadas não funcionam como eu faria. Existe uma maneira simples de consertar isso ou outro pacote que me permita examinar o arquivo de texto, escolher o valor de uma linha específica e usá-lo como uma variável? Eu apreciaria qualquer sugestão sobre isso.
Responder1
Em geral, quando você se depara com uma invocação de macro como
\DTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}
em que a macro parece exigir dados reais, em vez de \iFrame
referência aos dados, é necessário expandir o comando que contém os dados, neste caso \iFrame
.
Se você tiver sorte, \iFrame
conterá os tokens reais dos dados e exigirá apenas uma única expansão para obtê-los. Se você não tiver sorte, a \iFrame
macro não será expansível e, nesse caso, o que descrevo não resolverá o seu problema. Em algum lugar entre esses extremos, \iFrame
pode ser necessário um número finito de expansões para produzir os tokens de dados desejados (não descreverei como fazer isso aqui, mas existem maneiras de fazer isso).
Felizmente, no nosso caso, \iFrame
contém os tokens reais dos dados, portanto, é necessária apenas uma única expansão. Um método típico para conseguir isso é o seguinte
\def\tmp{\DTLassignfirstmatch{widmo}{f}}
\expandafter\tmp\expandafter{\iFrame}{\wzb=wzb,\em=em}
Aqui, armazenamos uma expressão balanceada que leva a \iFrame
uma macro temporária \tmp
. Então, pode-se usar \expandafter
para expandir\iFrame
antesExpandindo \tmp
. Assim, no momento \DTLassignfirstmatch
da execução, a ocorrência de \iFrame
já foi expandida para os tokens de dados reais que são exigidos da \DTL...
macro.
Responder2
A documentação de datatool
é clara sobre isso:
\DTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}
Isso é semelhante,
\DTLassign
exceto que se aplica à primeira linha de um determinado banco de dados, onde a coluna identificada pelo rótulo⟨col key⟩
tem o valor fornecido.Observe que nenhuma expansão é realizada na partida.O valor deve ser uma correspondência exata.
(Página 98, ênfase adicionada.)
Por outro lado, imediatamente após esta descrição você encontra
\xDTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}
Isso é semelhante
\DTLassignfirstmatch
, mas executa uma expansão de um nível em⟨value⟩
.
Então você quer usar
\xDTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}
Se eu tentar, recebo “dimensão muito grande”.
De qualquer forma, se eu testar com
\def\iFrame{405}
\xDTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}
\verb|\wzb| = \wzb
\verb|\em| = \em
eu recebo