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 \iFrame
hacer referencia a datos, es necesario expandir el comando que contiene los datos, en este caso \iFrame
.
Si tienes suerte, \iFrame
contendrá los tokens reales de los datos y solo requerirá una expansión para obtenerlos. Si no tienes suerte, la \iFrame
macro no será ampliable en absoluto, en cuyo caso lo que describo no solucionará tu problema. En algún punto intermedio entre estos extremos, \iFrame
puede 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, \iFrame
contiene 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 \iFrame
a una macro temporal \tmp
. Entonces, uno puede usar \expandafter
para expandir\iFrame
antesen expansión \tmp
. Por lo tanto, cuando \DTLassignfirstmatch
se ejecuta, la aparición de \iFrame
ya se ha expandido a los tokens de datos reales que se requieren de la \DTL...
macro.
Respuesta2
La documentación de datatool
es clara al respecto:
\DTLassignfirstmatch{⟨db name⟩}{⟨col key⟩}{⟨value⟩}{⟨assign list⟩}
Esto es similar
\DTLassign
excepto 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
\DTLassignfirstmatch
pero 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