如何循环使用“pgfplotstabletypeset”读取文件(带下划线)?

如何循环使用“pgfplotstabletypeset”读取文件(带下划线)?

我对 的使用存在疑问pgfplotstabletypeset

我用它来读取带有下划线的表格,然后我需要解析每个单元格中的字符串(参见代码)。

如果直接在代码中使用,效果很好。但是,如果将其包装在 中,则不起作用\newcommand。但是,如果我使用savebox(参见代码),它就可以工作。

我的问题是我想循环遍历多个文件。这就是为什么使用\newcommand会非常好。对于savebox解决方案,我不知道如何为框提供文件名(我有很多文件,因此我想避免循环遍历每个文件)。目前,我已经对文件名进行了硬编码以说明问题。

我在下面发布了一个显示该问题的文件。

pgfplotstabletypeset如何循环读取文件(带下划线) ?

它适用于没有下划线的表格,从那时起

     postproc cell content/.code={%

    \pgfplotsutilstrreplace{_}{\_}{##1}%
    \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
  },

是不需要的。

这是我的代码:

\documentclass{article}
%
\usepackage{filecontents}
\usepackage{pgfplotstable}

\begin{filecontents}{a.txt}
 a_1 1 2
 a_2 3 4
\end{filecontents}

\begin{filecontents}{b.txt}
 b1 5 6
 b2 7 8   
\end{filecontents}  

\def\Files{a.txt,b.txt}
\def\myfile{a.txt}

\newcommand\readtable[1]{
  \pgfplotstabletypeset[
    header=false,
    columns/0/.style={
    string type,
    postproc cell content/.code={%
     \pgfplotsutilstrreplace{_}{\_}{##1}%
     \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
   },
  },  
 ]{#1}  
}

\newsavebox{\mytaba}
\begin{lrbox}{\mytaba}  
\pgfplotstabletypeset[
 header=false,
 columns/0/.style={
  string type,
  postproc cell content/.code={%
    \pgfplotsutilstrreplace{_}{\_}{##1}%
    \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
  },
 },  
]{a.txt}
\end{lrbox}


\begin{document}

%
% first test pgfplotstabletypeset outside loops
%
print \myfile{} outside loop using pgfplotstabletypeset

\pgfplotstabletypeset[
 header=false,
 columns/0/.style={
  string type,
  postproc cell content/.code={%
    \pgfplotsutilstrreplace{_}{\_}{##1}%
    \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
  },
 },  
]{\myfile}  

%
% now use wrapped command
%
print \myfile{} outside loop using readtable

\readtable{\myfile}

%
% Try with savebox
%
print \myfile{} outside loop using savebox

\usebox{\mytaba}

%
% test inside loop
%
\foreach [count=\xi] \x in \Files
{

 print in loop file \x

 \pgfplotstabletypeset[
   header=false,
   columns/0/.style={
   string type,
   postproc cell content/.code={%
     \pgfplotsutilstrreplace{_}{\_}{##1}%
     \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
   },
  },  
 ]{\x}    
}

\end{document}

这是输出 在此处输入图片描述

我正在使用 Ubuntu 18.04。

pdfTeX 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian)
kpathsea version 6.2.3
Copyright 2017 Han The Thanh (pdfTeX) et al.
There is NO warranty.  Redistribution of this software is
covered by the terms of both the pdfTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the pdfTeX source.
Primary author of pdfTeX: Han The Thanh (pdfTeX) et al.
Compiled with libpng 1.6.34; using libpng 1.6.34
Compiled with zlib 1.2.11; using zlib 1.2.11
Compiled with poppler version 0.62.0

答案1

我可以用 来包装东西\scantokens

\documentclass{article}
\usepackage{filecontents}
\usepackage{pgfplotstable}

\begin{filecontents}{a.txt}
 a_1 1 2
 a_2 3 4
\end{filecontents}

\begin{filecontents}{b.txt}
 b1 5 6
 b2 7 8   
\end{filecontents}  

\def\Files{a.txt,b.txt}
\def\myfile{a.txt}

\newcommand\readtable[1]{
\scantokens{\pgfplotstabletypeset[
    header=false,
    columns/0/.style={
    string type,
    postproc cell content/.code={%
     \pgfplotsutilstrreplace{_}{\_}{##1}%
     \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
   },
  },  
 ]{#1}  
}}

\newsavebox{\mytaba}
\newcommand\readtablesavebox[1]{
  \scantokens{\begin{lrbox}{\mytaba}  
    \pgfplotstabletypeset[
    header=false,
    columns/0/.style={
    string type,
    postproc cell content/.code={%
     \pgfplotsutilstrreplace{_}{\_}{##1}%
     \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
   },
  },  
 ]{#1}  
\end{lrbox}}%
\usebox{\mytaba}
}

\begin{document}
%
% first test pgfplotstabletypeset outside loops
%
print \myfile{} outside loop using pgfplotstabletypeset

\pgfplotstabletypeset[
 header=false,
 columns/0/.style={
  string type,
  postproc cell content/.code={%
    \pgfplotsutilstrreplace{_}{\_}{##1}%
    \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
  },
 },  
]{\myfile}  

%
% now use wrapped command
%
print \myfile{} outside loop using readtable

\readtable{\myfile}

%
% Try with savebox
%
print \myfile{} outside loop using readtablesavebox

\readtablesavebox{\myfile}

%
% test inside loop
%
\foreach [count=\xi] \x in \Files
{

 print in loop file \x

 \scantokens{\pgfplotstabletypeset[
   header=false,
   columns/0/.style={
   string type,
   postproc cell content/.code={%
     \pgfplotsutilstrreplace{_}{\_}{##1}%
     \pgfkeyslet{/pgfplots/table/@cell content}\pgfplotsretval
   },
  },  
 ]{\x}    
}}
\end{document}

在此处输入图片描述

相关内容