\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 マトリックスを表形式に置き換えると、同じエラーが発生します。コマンドから問題が発生しているようです。\\コマンドを削除して、1 つのセルのみを生成すると、ループが機能します。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{は、関連する が欠落しているにもかかわらず、何らかの「文字列ビルダー」に追加できることを除いてと同じです}(つまり、 は\bgroupの不均衡な形式です{)。
  • \pgfmatrixnextcellPGF マニュアルでは、\matrixマクロ内でコードが生成される場合に提供されます。技術的な理由により、その場合、マトリックス コードはサポートされません&(詳細については、PGF マニュアルを参照してください)。

もっとシンプルであればいいのですが、TeX は決してシンプルではありません (もちろん、ここでこの質問をしたのはそのためです)。

このパッケージはpgfplotstable、CSV データ用の洗練されたコード ジェネレーターです。次のスニペットは、出力をカスタマイズして、ノードの 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 入力テーブルの一部のみを考慮していますが、私は CSV 入力テーブル全体を自由に出力していることに注意してください。私の解決策が正しい方向であると思われる場合は、 で列名、出力列の選択、出力行などをカスタマイズするためのキーをたくさん見つけることができますpgfplotstable

これは比較的エレガントな解決策だと思いますが、きっとあなたやこのサイトの他の訪問者は「どうすれば簡単なコードで同じことができるのか」と疑問に思うでしょう。答えは、TeXマクロ言語をより細かく制御する方法(「TeX拡張制御」を参照)です。LaTeX プログラミングはどこから始めればよいですか?) または、ステートメントをアセンブルして実行可能な TeX コードを出力する Lua コードを使用することもできます。しかし、それは私の答えの範囲を超えています。

関連情報