\pgfplotstableread 中表名的宏定义

\pgfplotstableread 中表名的宏定义

我在一份报告中使用 pgfplots 为许多不同的数据集制作类似的图表,每个数据集的数据都包含在单独的 .txt 文件中。我使用 \pgfplotstableread 读取数据表并分配给宏名称以供以后在图表中使用。

我希望能够定义一个命令,该命令接受一个文本字符串参数,并使用此参数引用数据文件和命名表。我似乎无法在宏内动态定义表的存储名称(例如使用 \csname)。

最简单的,也许我只需要了解为什么以下 MWE 中的 \tablereadB 会产生错误?这里我假设有一个要读取的 data.txt 文件。

\documentclass{article}

\usepackage{pgfplots}

\begin{document}

\newcommand{\tablereadA}{ \pgfplotstableread{data.txt}{\tabA} }
\newcommand{\tablereadB}{ \pgfplotstableread{data.txt}{\csname tabB\endcsname} }

% this works:
\tablereadA{}

% this gives  error Extra \endcsname
\tablereadB{}

\end{document}

我假设这与扩展顺序有关,但使用 \expandafter 却无法使任何东西正常工作。


作为对 gernot 回答的后续,最终,对于字符串输入“ONE”,我希望命令执行以下命令:

\pgfplotstableread{\pathONE}{\tabONE} 

这里,\pathONE 将在一长串路径(每个数据文件一个)中手动定义。我该如何实现这一点?

答案1

问题是,\pgfplotstableread将表存储在给定名称下。在您的方法中,它\csname被重新定义并tabB\endcsname遗留,从而\endcsname导致错误消息。

尝试以下方法:

\newcommand\tablereadB{\expandafter\tablereadBaux\csname tabB\endcsname}
\newcommand\tablereadBaux[1]{\pgfplotstableread{data.txt}{#1}}

以下是后续问题的解决方案:

\documentclass{article}
\usepackage{pgfplots}
\newcommand\tableread[1]%
  {\edef\tablereadX
     {\noexpand\pgfplotstableread
       {\csname path#1\endcsname}%
       \csname tab#1\endcsname
     }%
   \tablereadX
  }
\begin{document}
\newcommand\pathONE{data.txt}
\tableread{ONE} % expands to \pgfplotstableread {data.txt}\tabONE
\end{document}

相关内容