datatool 인수로 삽입된 정의 변수

datatool 인수로 삽입된 정의 변수

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

나는 얻다

여기에 이미지 설명을 입력하세요

관련 정보