我有两个表格(抱歉,在我的系统上,内联表格无法与pgfplotstable
2011/12/19 一起使用,即使使用选项 format=inline):
数据表(data.csv):
X,A,B
U,1.1,1.2
V,2.1,2.2参考文献表(references.csv):
X,A,B
U,ref1,ref2
V,ref2,ref1
我想用 PgfplotsTable 读取两个表并用 创建一个新表{cell content}={cell content of data.csv}\citep{cell content of references.csv}
。我尝试在预处理步骤中使用 pgfkeys 执行此操作,但无法通过这种方式使其工作。显然,宏\ori
不会在 的参数中展开。因此,我尝试仅使用包中的\pgfkeyssetvalue
来扩展 的第二个参数:\pgfkeyssetvalue
\exp_args:Nnx
expl3
\documentclass{article}
\usepackage[numbers]{natbib}
\usepackage{pgfplotstable}
\usepackage{ifthen}
\usepackage{expl3}
%
\begin{document}
\pgfplotstableread[col sep=comma, trim cells=true]{data.csv}\data
\pgfplotstableread[col sep=comma, trim cells=true, header=false]{references.csv}\references
\pgfplotstabletypeset[
string type,
preproc cell content/.append code={%
\pgfmathtruncatemacro{\col}{\pgfplotstablecol-1}
\ifthenelse{\col>0}{
\pgfmathtruncatemacro{\row}{\pgfplotstablerow+1}
\pgfplotstablegetelem{\row}{\col}\of{\references}
\pgfkeysgetvalue{/pgfplots/table/@cell content}{\ori}
\expandafter\def\expandafter\ori\expandafter{\ori\citep{\pgfplotsretval}}
\ExplSyntaxOn
\exp_args:Nnx \pgfkeyssetvalue {/pgfplots/table/@cell content} {\ori}
\ExplSyntaxOff
}{}
},
]\data
\begin{thebibliography}{9}
\bibitem{ref1} ref1
\bibitem{ref2} ref2
\end{thebibliography}
\end{document}
使用此代码我得到以下错误(这里仅举一个例子):
! Undefined control sequence.
\pgfplotstable@result ...ular}{ccc}X&A&B \\U&\ori
&\ori \\V&\ori &\ori \\\en...
l.24 ]\data
The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.
我做错了什么以及执行此类表格操作的最佳方法是什么?
答案1
尝试编辑表格时遇到几个问题到位。首先\pgfkeyssetvalue{/pgfplots/table/@cell content}{\ori}
将内容设置为宏\ori
。问题是由于preproc cell content
在组内完成,因此导致\ori
外部无法访问。
对于您拥有的该段代码中的任何其他宏用法也是如此。
一旦您通过了一层扩展,\ori
您将达到\pgfplotsretval
也仅在您的代码段中定义的状态。\citep
这不是问题,因为它是在组之外定义的。
您需要做的是完全扩展您的参数,然后使用\pgfkeyssetvalue
在进程组之外(即在排版组中)定义的宏参数。因此,解决方案将是:
\pgfplotstabletypeset[string type,
preproc cell content/.append code={%
\pgfmathtruncatemacro{\col}{\pgfplotstablecol-1}
\ifthenelse{\col>0}{
\pgfmathtruncatemacro{\row}{\pgfplotstablerow+1}
\pgfplotstablegetelem{\row}{\col}\of{\references}
\pgfkeysgetvalue{/pgfplots/table/@cell content}{\ori}
% Be sure to have \ori contain the fully expanded values, we do not want to expand \citep
\edef\ori{\ori\noexpand\citep{\pgfplotsretval}}
% edef the key so that you do not have any reference to \ori.
% This is just instead of many \expandafter's
\edef\tmp{%
\noexpand\pgfkeyssetvalue{/pgfplots/table/@cell content}{\expandafter\unexpanded\expandafter{\ori}}
}\tmp
}{}
}]\data
这将产生(我已经使用了\cite
而不是你的natbib
等价物)