PgfplotsTable:如何将两个表的单元格内容合并到一个表中?

PgfplotsTable:如何将两个表的单元格内容合并到一个表中?

我有两个表格(抱歉,在我的系统上,内联表格无法与pgfplotstable2011/12/19 一起使用,即使使用选项 format=inline):

  1. 数据表(data.csv):

    X,A,B
    U,1.1,1.2
    V,2.1,2.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:Nnxexpl3

\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等价物)

在此处输入图片描述

相关内容