variáveis ​​de definição inseridas como argumentos do datatool

variáveis ​​de definição inseridas como argumentos do datatool

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 \iFramereferência aos dados, é necessário expandir o comando que contém os dados, neste caso \iFrame.

Se você tiver sorte, \iFrameconterá os tokens reais dos dados e exigirá apenas uma única expansão para obtê-los. Se você não tiver sorte, a \iFramemacro não será expansível e, nesse caso, o que descrevo não resolverá o seu problema. Em algum lugar entre esses extremos, \iFramepode 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, \iFrameconté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 \iFrameuma macro temporária \tmp. Então, pode-se usar \expandafterpara expandir\iFrame antesExpandindo \tmp. Assim, no momento \DTLassignfirstmatchda execução, a ocorrência de \iFramejá 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, \DTLassignexceto 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

insira a descrição da imagem aqui

informação relacionada