텍스트 파일에서 숫자를 읽고 이를 좌표나 노드로 사용하거나 추가 계산에 사용하는 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
나는 얻다