我在一份报告中使用 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}