我正在尝试使用设置列表选项在表中创建新列,但存储在宏中时不会扩展列表。我已在多个位置尝试过 \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。第一个跳过,却发现另一个跳过。因此,第一个扩展的标记是,插入可选参数。然后将放回原位,最后扩展 。到那时,标记列表看起来像\myargs
set 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}