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
の不均衡な形式です{
)。\pgfmatrixnextcell
PGF マニュアルでは、\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 コードを使用することもできます。しかし、それは私の答えの範囲を超えています。