variables de definición insertadas como argumentos de la herramienta de datos

variables de definición insertadas como argumentos de la herramienta de datos

Me gustaría crear una imagen tikz (animada de hecho) que lea números de un archivo de texto y los use como coordenadas o nodos o para cálculos adicionales. Parece que el paquete datatool sería adecuado, pero sólo puedo hacerlo funcionar si paso los argumentos directamente, como en 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}

Las dos líneas comentadas no funcionan como lo haría yo. ¿Existe una forma sencilla de solucionarlo u otro paquete que me permita revisar el archivo de texto, seleccionar el valor de una línea específica y usarlo como variable? Agradecería cualquier sugerencia al respecto.

Respuesta1

En general, cuando se enfrenta a una invocación de macro como

\DTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}

en el que la macro parece exigir datos reales, en lugar de \iFramehacer referencia a datos, es necesario expandir el comando que contiene los datos, en este caso \iFrame.

Si tienes suerte, \iFramecontendrá los tokens reales de los datos y solo requerirá una expansión para obtenerlos. Si no tienes suerte, la \iFramemacro no será ampliable en absoluto, en cuyo caso lo que describo no solucionará tu problema. En algún punto intermedio entre estos extremos, \iFramepuede ser necesario un número finito de expansiones para producir los tokens de datos deseados (no describiré cómo lograrlo aquí, pero hay formas de hacerlo).

Afortunadamente, en nuestro caso, \iFramecontiene los tokens de datos reales, por lo que solo se requiere una única expansión. Un método típico para lograr esto es el siguiente

\def\tmp{\DTLassignfirstmatch{widmo}{f}}
\expandafter\tmp\expandafter{\iFrame}{\wzb=wzb,\em=em}

Aquí, almacenamos una expresión balanceada entre llaves que conduce \iFramea una macro temporal \tmp. Entonces, uno puede usar \expandafterpara expandir\iFrame antesen expansión \tmp. Por lo tanto, cuando \DTLassignfirstmatchse ejecuta, la aparición de \iFrameya se ha expandido a los tokens de datos reales que se requieren de la \DTL...macro.

Respuesta2

La documentación de datatooles clara al respecto:

\DTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}

Esto es similar \DTLassignexcepto que se aplica a la primera fila de la base de datos dada donde la columna identificada por la etiqueta ⟨col key⟩tiene el valor dado.Tenga en cuenta que no se realiza ninguna expansión en el partido.El valor debe coincidir exactamente.

(Página 98, énfasis añadido.)

Por otro lado, inmediatamente después de esta descripción se encuentra

\xDTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}

Esto es como \DTLassignfirstmatchpero realiza una expansión de un nivel en ⟨value⟩.

Entonces quieres usar

\xDTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}

Sin embargo, si lo intento, obtengo una “dimensión demasiado grande”.

De todos modos, si lo pruebo con

\def\iFrame{405}

\xDTLassignfirstmatch{widmo}{f}{\iFrame}{\wzb=wzb,\em=em}

\verb|\wzb| = \wzb

\verb|\em| = \em

yo obtengo

ingrese la descripción de la imagen aquí

información relacionada