次のような .csv ファイルがあります:
\begin{filecontents}{data.csv}
type,Description,Value
typA,Description0,Value0
typA,Description1,Value1
typB,Description2,Value2
typA,Description3,Value3
\end{filecontents}
列の内容に応じてtype
、複数列と単一列を区別したいと思います。
このシンプルな MWE では、説明が記載されている行とは別に、常に 1 つの列が存在しますtypB
。この場合、画像に示すように、説明のみが行の中央に印刷されます。
これはこれにかなり似ていると思うhttps://tex.stackexchange.com/a/459848/104358質問ですが、私の場合、特定の行をハードコードして設定したくありません。タイプ列の内容をチェックして、その場で計算する必要があります。
私は の助けを借りてこれを実現しようとしました\pgfplotstablegetelem
が、これは環境で定義されていないようですtypeset cell/.code
。
\documentclass{standalone}
\usepackage{pgfplotstable}
\usepackage{ifthen}
\pgfplotsset{compat=newest}
\begin{filecontents}{data.csv}
type,Description,Value
typA,Description0,Value0
typA,Description1,Value1
typB,Description2,Value2
typA,Description3,Value3
\end{filecontents}
\pgfplotstableread[col sep=comma]{data.csv}{\csvdata}
\pgfplotstablegetrowsof{\csvdata}
\pgfmathtruncatemacro\CSVDataRows{\pgfplotsretval-1}
\pgfplotstableset{
typeset cell/.code={%
%\pgfplotstablegetelem{\pgfplotstablerow}{type}\of{\csvdata}
%\ifthenelse{\equal{\pgfplotsretval}{typB}}{
% Equivalent to: \ifnum\pgfplotstablerow = 2
%}{
% Equivalent to: \ifnum\pgfplotstablerow != 2
%}
\ifnum\pgfplotstablerow=2 %=> This row depends on the content of column type!
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\\}%
\else%
\ifnum\pgfplotstablecol=2%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\multicolumn{3}{c}{#1}}%
\else%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{}%
\fi
\fi
\else%
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\\}%
\else%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1 &}%
\fi
\fi
},
}
\begin{document}
\pgfplotstabletypeset[col sep = comma,
string type,
column type = l,
multicolumn names,
]{\csvdata}
\end{document}
答え1
問題を解決する解決策を見つけました。最善ではないかもしれませんが、それでも機能します。
秘訣は、これの特別なケースを用意することでした。これは、(ヘッド行を含む)からカウントが始まりますが、(ヘッド行の後ろ)からカウントが始まるため\pgfplotstablerow=-1
必要です。\pgfplotstablerow
-1
\pgfplotstablegetelem{}{}\of{\csvdata}
0
\documentclass{standalone}
\usepackage{pgfplotstable}
\usepackage{ifthen}
\pgfplotsset{compat=newest}
\begin{filecontents}{data.csv}
Type,Description,Value
typA,descriptionA0,value0
typB,descriptionA1,value1
typA,descriptionB2,value2
\end{filecontents}
\pgfplotstableread[col sep=comma]{data.csv}{\csvdata}
\pgfplotstablegetrowsof{\csvdata}
\pgfmathtruncatemacro\CSVDataRows{\pgfplotsretval-1}
\newcounter{endRowCounter}
\pgfplotstableset{
col sep=comma,
string type,
typeset cell/.code={%
\setcounter{endRowCounter}{\pgfplotstablerows}
\addtocounter{endRowCounter}{1}
\ifthenelse{\pgfplotstablerow=-1}{
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\\}%
\else
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1 &}
\fi
}{
\ifthenelse{\pgfplotstablerow<\value{endRowCounter}}{
\pgfplotstablegetelem{\pgfplotstablerow}{Type}\of{\csvdata}
\ifthenelse{\equal{\pgfplotsretval}{typB}}{
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\\}%
\else
\ifnum\pgfplotstablecol=1
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\multicolumn{3}{c}{#1}}%
\else
\pgfkeyssetvalue{/pgfplots/table/@cell content}{}%
\fi
\fi
}{
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\\}%
\else
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1 &}%
\fi
}
}{}
}
},
}
\begin{document}
\pgfplotstabletypeset{\csvdata}
\end{document}
結果