使用 pgfplotstable 的集合列表

使用 pgfplotstable 的集合列表

我正在尝试使用设置列表选项在表中创建新列,但存储在宏中时不会扩展列表。我已在多个位置尝试过 \expandafter,但目前没有成功。

\documentclass{article}
\usepackage{pgfplotstable}
\begin{document}

\noindent This works.
\pgfplotstableset{create on use/first/.style={create col/set list={a,b,c,d,e,f}}}
\pgfplotstablenew[columns={first}]{6}\mytable
\pgfplotstabletypeset[string type]\mytable

\noindent This also works.
\pgfplotstablecreatecol[set list={a,b,c,d,e,f}]{second}\mytable
\pgfplotstabletypeset[string type]\mytable

\noindent This doesn't.
\edef\names{a,b,c,d,e,f}
\pgfplotstablecreatecol[set list={\names}]{third}\mytable
\pgfplotstabletypeset[string type]\mytable
\end{document}

表


根据 Matthew Leingang 的回答,我了解了如何处理环境。

\documentclass{article}
\usepackage{pgfplotstable}
\begin{document}

\edef\names{A,B,C,D}
\edef\parms{symbolic x coords={\names},xtick=data}
\def\environ{\begin{axis}}

\begin{tikzpicture}
\expandafter\environ\expandafter[\parms]
\addplot coordinates {(A,0) (B,1) (C,1) (D,2)};
\end{axis}
\end{tikzpicture}
\end{document}

答案1

我仍然是一个反复试验的程序员\expandafter。但有一件事要记住,那就是它会扩展代币它们要么是字符,要么是控制序列。因此,如果您想一次性扩展一堆标记,不按顺序扩展,最简单的方法是将它们放在宏中。在这种情况下,您想setlist={\names}一次性扩展整个可选参数。这样就可以了。

\documentclass{standalone}
\usepackage{pgfplotstable}
\begin{document}

This works.
\pgfplotstableset{create on use/first/.style={create col/set list={a,b,c,d,e,f}}}
\pgfplotstablenew[columns={first}]{6}\mytable
\pgfplotstablecreatecol[set list={a,b,c,d,e,f}]{second}\mytable

\def\names{a,b,c,d,e,f}
\edef\myargs{set list={\names}}
\expandafter\pgfplotstablecreatecol\expandafter[\myargs]{third}\mytable
\pgfplotstabletypeset[string type]\mytable
\end{document}

使扩展为\edef\myargs{set list={\names}}。下一行有两个s。第一个跳过,却发现另一个跳过。因此,第一个扩展的标记是,插入可选参数。然后将放回原位,最后扩展 。到那时,标记列表看起来像\myargsset list={a,b,c,d,e,f}\expandafter\pgfplotstablecreatecol\expandafter[\myargs[\pgfplotstablecreatecol

\pgfplotstablecreatecol[set list={a,b,c,d,e,f}]{third}\mytable

这正是您想要的。

示例代码输出

答案2

事实证明有一个更简单的解决方案:/.expanded

\documentclass{article}
\usepackage{pgfplotstable}
\begin{document}

\def\names{a,b,c,d,e,f}

\pgfplotstableset{create on use/first/.style={create col/set list/.expanded={\names}}}
\pgfplotstablenew[columns={first}]{6}\mytable
\pgfplotstabletypeset[string type]\mytable

\end{document}

相关内容