\pgfplotstableforeachcolumn을 사용하여 tikz 행렬(또는 표 형식)을 생성하는 데 문제가 있습니다.

\pgfplotstableforeachcolumn을 사용하여 tikz 행렬(또는 표 형식)을 생성하는 데 문제가 있습니다.

tikz테이블 파일의 데이터에서 그림을 생성하여 읽어 보려고 합니다 pgfplotstable(그리고 데이터를 직접 플로팅하지 않으므로 pgfplots직접 사용할 수 없습니다).

첫 번째 단계는 테이블의 요소를 반복하여 tikz 행렬을 생성하는 것입니다. 그러나 설명할 수 없는 문제가 있습니다.

다음은 최소한의 예입니다.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\usetikzlibrary{matrix}

\begin{filecontents*}{file.table}
col1 col2 col3 col4 col5
   a    b    c    d    e
\end{filecontents*}

\begin{document}

\pgfplotstableread{file.table}\mytable

\begin{tikzpicture}
  \matrix (plots) [matrix of nodes] {
    \pgfplotstableforeachcolumn\mytable\as\col{%
      \col \\
    }
  };
\end{tikzpicture}

% This also doesn't work
% \begin{tabular}{c}
%   \pgfplotstableforeachcolumn\mytable\as\col{%
%     \col \\
%   }
% \end{tabular}

\end{document}

다음과 같은 비밀스러운 오류 메시지가 표시됩니다.

./mwe.tex:21: Undefined control sequence. [ }]
./mwe.tex:21: Missing number, treated as zero. [ }]

테이블 형식에 대한 tikz 행렬을 바꾸면 동일한 오류가 발생합니다. 문제는 \\명령에서 발생한 것 같습니다. 명령을 제거하여 하나의 셀만 생성하면 루프가 작동하기 때문입니다. tikz 행렬 대신 표 형식의 행을 생성하려고 할 때도 동일한 문제가 발생합니다. 매크로와 같은 다른 반복 방법을 사용하면 \foreach행렬(또는 표 형식) 내에서 작동하지만 테이블 열을 반복할 수 있는 방법은 없습니다.

내가 무엇을 놓치고 있나요?

답변1

불행하게도 모든 종류의 TeX 루핑은 다음과 같은 표로 작성된 환경 내부 \begin{tabular}또는 다른 환경 에서 구성됩니다.\matrix 작동하지 않습니다. 이는 보는 것과 실행하는 것을 자체적으로 이해하는 TeX의 한계입니다.

당신이 해야 할 일은 다음과 같은 코드를 생성하고 그 사이에 추가 실행 지침 없이 TeX가 이를 처리하도록 지시하는 코드를 작성하는 것입니다.

\matrix (plots) [matrix of nodes] \bgroup %
col1\pgfmatrixnextcell col2\pgfmatrixnextcell col3\pgfmatrixnextcell col4\pgfmatrixnextcell col5\\%
a\pgfmatrixnextcell b\pgfmatrixnextcell c\pgfmatrixnextcell d\pgfmatrixnextcell e\\%
\egroup ;%

나는 아래에 표시된 코드 생성의 출력과 유사하기 때문에 위의 공식을 선택했습니다. 그러나 다른 코드 생성기는 동일한(또는 유사한) 출력을 생성해야 합니다. 참고하세요

  • \bgroup관련 항목이 누락되었음에도 {불구하고 일부 "stringbuilder"에 추가될 수 있다는 점을 제외 하면 와 동일합니다 (즉 , 의 균형이 맞지 않는 형식임 ).}\bgroup{
  • \pgfmatrixnextcell\matrix일부 매크로에서 코드가 생성되는 경우 PGF 매뉴얼에서 제공하는 것입니다 . 기술적인 이유로 인해 매트릭스 코드가 지원되지 않는 &경우가 있습니다. (자세한 내용은 PGF 매뉴얼을 참조하세요.)

더 간단했으면 좋겠지만 TeX은 결코 단순하지 않습니다(물론 여기서 이 질문을 한 이유도 바로 이 때문입니다).

패키지는 pgfplotstableCSV 데이터를 위한 정교한 코드 생성기에 불과합니다. 다음 스니펫은 노드의 PGF 매트릭스를 생성하도록 출력을 사용자 정의합니다.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\usetikzlibrary{matrix}

\begin{filecontents*}{file.table}
col1 col2 col3 col4 col5
   a    b    c    d    e
\end{filecontents*}

\begin{document}

\pgfplotstableread{file.table}\mytable

\begin{tikzpicture}
  \pgfplotstabletypeset[
    string type,
    skip coltypes=true,
    debug,
    %
    typeset cell/.code={%
        % this here is more-or-less the default implementation, but it
        % substitutes '&' by '\pgfmatrixnextcell':
        \ifnum\pgfplotstablecol=\pgfplotstablecols
            \pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\\}%
        \else
            \pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\pgfmatrixnextcell}%
        \fi
    },
    % '\bgroup' / '\egroup' = '{' / '}' except that it does not need to be balanced
    begin table={\matrix (plots) [matrix of nodes] \bgroup},
    end table={\egroup;},
  ]{\mytable}
\end{tikzpicture}

\end{document}

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

귀하의 시도는 일부만 고려하더라도 전체 CSV 입력 테이블을 자유롭게 출력할 수 있다는 점에 유의하십시오. 내 솔루션이 올바른 방향인 것 같으면 에서 열 이름, 출력 열 선택, 출력 행 등을 사용자 정의하는 많은 키를 찾을 수 있습니다 pgfplotstable.

나는 이것이 상대적으로 우아한 해결책이라고 생각합니다. 하지만 장담컨데 당신이나 이 사이트의 다른 방문자는 "간단한 코드 조각으로 어떻게 같은 일을 할 수 있을까?"라고 궁금해하게 될 것입니다. 대답은 다음과 같습니다: TeX 매크로 언어를 더 많이 제어함으로써("TeX 확장 제어", 참조)LaTeX 프로그래밍은 어디서 시작하나요?) 또는 명령문을 조합하고 실행 가능한 TeX 코드를 생성하는 Lua 코드를 사용합니다. 그러나 그것은 내 대답을 넘어서는 것입니다.

관련 정보