循环遍历使用 newcommand 定义的列表

循环遍历使用 newcommand 定义的列表

我尝试自动生成相同的表。使用\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在这里很有用。添加两个\expandafters 即可与您的 配合使用\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}

相关内容