表形式環境でのマクロ展開

表形式環境でのマクロ展開

タブで区切られた csv ファイルが多数あり、これを LaTeX の表形式で自動的にテーブルに変換したいと考えています。テーブルの名前は次のとおりです。ログ_%ここで、% は \in {at,be,fr,....} のいずれかの記号になります。たとえば、各ファイルは次のようになります。

 
accuracy    timepred    timelearn   timelearn2  timelearn4  rmsetrain
0.987747    0.532   2.44    nan nan 0.987676
0.987747    0.528   2.396   nan nan 0.987676
0.987747    0.544   2.408   nan nan 0.987676
0.987747    0.496   2.388   nan nan 0.987676
0.987747    0.436   2.432   nan nan 0.987676
0.987747    0.428   2.444   nan nan 0.987676
0.987747    0.464   2.452   nan nan 0.987676
0.987747    0.428   2.452   nan nan 0.987676
0.987747    0.464   2.46    nan nan 0.987676
0.987747    0.484   2.448   nan nan 0.987676

以下のコードを試しましたが、残念ながら動作しません。

\documentclass{article}
\usepackage{xparse}% http://ctan.org/pkg/xparse
\usepackage{csvsimple}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage{array}
\usepackage{pgfplotstable}
\newcounter{listtotal}\newcounter{listcntr}%
\NewDocumentCommand{\names}{o}{%
  \setcounter{listtotal}{0}\setcounter{listcntr}{-1}%
  \renewcommand*{\do}[1]{\stepcounter{listtotal}}%
  \expandafter\docsvlist\expandafter{\namesarray}%
  \IfNoValueTF{#1}
    {\namesarray}% \names
    {% \names[]
     \renewcommand*{\do}[1]{\stepcounter{listcntr}\ifnum\value{listcntr}=#1\relax##1\fi}%
     \expandafter\docsvlist\expandafter{\namesarray}}%
}

\begin{document} \newcommand{\namesarray}{at,br,cz,dk,fi,ie,nb,no,pt,se,be,ch,de,es,fr,it,nl,pl,ru,uk}% \foreach \i in {0,...,20}{ \newcommand{\name}{\names[\i]} \name \csvautotabular[separator=tab]{logs/log_\names[\i]} \par } \end{document}

上記のコードを実行するとエラーが発生します:


! Package csvsimple Error: File 'logs/log_\names [0]' not existent, not readable, or empty!.

同じ例は、シンボルを次のようにハードコーディングすることでも機能します。


\csvautotabular[separator=tab]{logs/log_at} \par

代わりに


\csvautotabular[separator=tab]{logs/log_\names[\i]} \par

次のリンクにハードコーディングして実用的なソリューションをアップロードしました: goo.gl/nbI5TQ
問題は、マクロ \i が展開され、表形式環境で \names が展開されないことにあると思います。しかし、確信はありません。マクロ \names[\i] を \i だけでなくグループとして展開することは可能ですか?
問題を解決するためのどんな小さな助けでもいただければ幸いです。

ありがとう :)

答え1

コードが複雑すぎるようです。ファイルのリストをループするだけであれば、 からのループetoolboxと からの関連コマンドだけが必要だと思いますcsvsimple

たとえば、次のようになりますlogs/log_at:

accuracy        timepred        timelearn       timelearn2      timelearn4      rmsetrain                                                           
0.987747        0.532   2.44    nan     nan     0.987676                                                                                            
0.987747        0.528   2.396   nan     nan     0.987676                                                                                            
0.987747        0.544   2.408   nan     nan     0.987676                                                                                            
0.987747        0.496   2.388   nan     nan     0.987676                                                                                            
0.987747        0.436   2.432   nan     nan     0.987676                                                                                            
0.987747        0.428   2.444   nan     nan     0.987676                                                                                            
0.987747        0.464   2.452   nan     nan     0.987676                                                                                            
0.987747        0.428   2.452   nan     nan     0.987676                                                                                            
0.987747        0.464   2.46    nan     nan     0.987676                                                                                            
0.987747        0.484   2.448   nan     nan     0.987676                                                                          

そしてlogs/log_br

accuracy        timepred        timelearn       timelearn2      timelearn4      rmsetrain                                                           
0.987747        0.532   2.44    nan     nan     0.987676                                                                                            
0.987747        0.528   2.396   nan     nan     0.987676                                                                                            
0.987747        0.544   2.408   nan     nan     0.987676                                                                                            
0.987747        0.496   2.388   nan     nan     0.987676                                                                                            
0.987747        0.436   2.432   nan     nan     0.987676                                                                                            
0.987747        0.428   2.444   nan     nan     0.987676                                                                                            
0.987747        0.464   2.452   nan     nan     0.987676                                                                                            
0.987747        0.428   2.452   nan     nan     0.987676
0.987747        0.464   2.46    nan     nan     0.987676
0.987747        0.484   2.448   nan     nan     0.987676

コード.tex

\documentclass{article}
\usepackage{csvsimple}
\usepackage{etoolbox}
\providecommand*\do{}
\begin{document}
\renewcommand*\do[1]{%
  #1
  \csvautotabular[separator=tab]{logs/log_#1}\par
}
\docsvlist{at,br}%,cz,dk,fi,ie,nb,no,pt,se,be,ch,de,es,fr,it,nl,pl,ru,uk}%
\end{document}

次の出力を生成します

作業出力

このコードでは、ファイルが と呼ばれるlogs/log_<xx>.texか、ファイルが であると想定していることに注意してくださいlogs/log_<xx>。拡張子が異なる場合は、それを指定する必要があります。

答え2

を注意

  1. \csvautotabular[separator=tab]つまり、csv ファイルの行内の項目を区切るには、スペースではなくタブを使用する必要があります。

  2. TeX がファイル名を処理する方法は、すべてのプラットフォームで同じではありません。
    たとえば、Windows 7 で MiKTeX 2.9 を使用する場合、ファイル名拡張子が指定されていない場合、TeX は常にファイル名拡張子が ".tex" であると想定します。問題のファイル名に拡張子がまったくない場合は、とにかくドット (拡張子なし) を指定する必要があります。たとえば
    、現在のディレクトリのサブディレクトリ "logs" にあるファイル "log_at" を指定する場合は、 と記述する必要があります./logs/log_at.。( ./logs/log_at末尾のドットなしで指定すると、(MiK)TeX は現在のディレクトリのサブディレクトリ "logs" にあるファイル "log_at.tex" を検索します。)

関連情報