我尝试自动生成相同的表。使用\newcommand
逗号分隔的文件名列表进行定义。我想迭代这些文件,导入它们并将它们连接到单个表中。听起来很简单,但我失败了。
阅读 pgfplotstable 的手册,它提供了 3 种方法。
\foreach
:被分组,使得循环内定义的输出不能从外部访问。\pgfplotsforeachungrouped
: 似乎是专门为该任务设计的。它未分组,手册中的示例对我来说几乎可以正常工作。但只有当我明确定义列表时它才有效。如果我在其他地方使用 声明列表,则不会\newcommand
。问题:它不会迭代所有条目。只迭代一次,获取
\filename
所有文件名的完整字符串。\pgfplotsinvokeforeach
:与相同\pgfplotsforeachungrouped
,只是语法略有改变。
我能想到两种方法,但无法解决它们。
\pgfplotsforeachungrouped
与工作外部列表一起使用- 使用
\foreach
并以某种方式编写输出以供全局访问
我能/应该做什么?
这是我当前的测试环境。
\newcommand*\fileList{List1.csv,List2.csv}
\documentclass[parskip=half]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.14}
\usepackage{filecontents}
\begin{filecontents}{List1.csv}
A B
1 2
\end{filecontents}
\begin{filecontents}{List2.csv}
A B
3 4
\end{filecontents}
\begin{document}
% % % This works fine
\begin{center}\bfseries
Test with pgfplotsforeachungrouped and explicit list
\end{center}
\pgfplotsforeachungrouped \filename in {List1.csv,List2.csv} {%
<\filename> %debug output
\pgfplotstableread{\filename}{\temptable} %read file
\pgfplotstablevertcat{\output}{\temptable} %append file
\pgfplotstabletypeset{\temptable} %debug output
\hfill %debug output
}%
Output : \pgfplotstabletypeset{\output} %debug output
\pgfplotstableclear{\output} %clear \output
% % % This does not work
\begin{center}\bfseries
Test with pgfplotsforeachungrouped and external list
\end{center}
\pgfplotsforeachungrouped \filename in {\fileList} {%
<\filename>
}
% Outputs <List1.csv,List2.csv>
% % % This does not work
\begin{center}\bfseries
Test with pgfplotsforeachungrouped and external list
\end{center}
Package pgfplots Error: Found unexpected characters: expected 'in '.
%\pgfplotsforeachungrouped \filename in \fileList {%
% <\filename> %debug output
%}
% this works
\begin{center}\bfseries
Test with pgfplotsinvokeforeach and explicit list
\end{center}
\pgfplotsinvokeforeach{List1.csv,List2.csv}{ %
<#1>
}
%
%
%
\begin{center}\bfseries
Tests with foreach and external list
\end{center}
\foreach \filename in \fileList{ %
<\filename> %debug output
\pgfplotstableread{\filename}{\temptable} %read file
\pgfplotstablevertcat{\output}{\temptable} %append file
\pgfplotstabletypeset{\temptable} %debug output
\hfill %debug output
}%
% \output is not defined
\foreach \filename in {\fileList}{ %
<\filename>
% Outputs <List1.csv,List2.csv>
}
\end{document}
答案1
问题是, 未\fileList
展开。 的不同语法\pgfplotsinvokeforeach
在这里很有用。添加两个\expandafter
s 即可与您的 配合使用\fileList
。
\newcommand*\fileList{List1.csv,List2.csv}
\documentclass[parskip=half]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.14}
\usepackage{filecontents}
\begin{filecontents}{List1.csv}
A B
1 2
\end{filecontents}
\begin{filecontents}{List2.csv}
A B
3 4
\end{filecontents}
\begin{document}
% this works
\begin{center}\bfseries
Test with pgfplotsinvokeforeach and some \verb|\expandafter|\,s
\end{center}
\expandafter\pgfplotsinvokeforeach\expandafter{\fileList}{ %
<#1>
\pgfplotstableread{#1}{\temptable} %read file
\pgfplotstablevertcat{\output}{\temptable} %append file
\pgfplotstabletypeset{\temptable} %debug output
\hfill %debug output
}
Output : \pgfplotstabletypeset{\output} %debug output
\end{document}