테이블 형식 환경의 매크로 확장

테이블 형식 환경의 매크로 확장

라텍스의 테이블 형식 환경에서 자동으로 테이블로 변환하고 싶은 탭으로 구분된 CSV 파일이 많이 있습니다. 테이블 이름은 다음과 같습니다.통나무_%여기서 %는 \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 확장에 실패한다는 것입니다. 하지만 잘 모르겠습니다. \i뿐만 아니라 매크로 \names[\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" 파일을 찾습니다.

관련 정보