datatool의 "잘못 배치된 \noalign" 오류

datatool의 "잘못 배치된 \noalign" 오류

다음 파일을 컴파일하려고 하면 다음 오류가 발생합니다.

! Misplaced \noalign.
\pagebreak ->\noalign 
                      {\ifnum `}=0\fi \@testopt {\LT@no@pgbk -}4
l.47 \end{letter}

왜 그런지 이해가 안 돼요. csv 파일을 약간 변경하면 xx.csv이 오류가 사라집니다. 예를 들어 mm로 변경합니다 m. 또는 mm로 변경하십시오 11.

또는 문자열 끝에 쉼표를 추가합니다 2014.02.26,26,2014.11.12.tm.

\PrintDocTableParekh[2014.02.26,26,2014.11.12.tm]{newbDB}{Documents}

따라서 이를 2014.02.26,26,2014.11.12.tm,다음으로 변경하면 오류가 사라집니다.

\documentclass[12pt]{letter}
\usepackage{longtable}
\usepackage[verbose]{datatool}
\usepackage{array}
\usepackage{url}

\newcounter{tabenum}\setcounter{tabenum}{0}
\newcommand{\colhead}[1]{\multicolumn{1}{>{\bfseries}l}{#1}}
\newcommand{\nextnuml}[1]{\refstepcounter{tabenum}\thetabenum.\label{#1}}
\newcommand*{\checkmissing}[1]{\DTLifnull{#1}{}{#1}}
\signature{Someone}
\newcommand{\PrintDocTableParekh}[3][]{%
 % #1 = list of rowIDs
 % #2 = database to search
 % #3 =caption
  \begin{longtable}{r l p{1.5in} c c p{2.5in}}
    \caption{#3}\\
   & \colhead{Date} & \colhead{Filename} & \colhead{From} & \colhead{To} & \colhead{Subject}\\\hline\endhead
    \DTLforeach
    [\ifblank{#1}{\boolean{true}}{\DTLisSubString{#1}{\RowID}}]
    {#2}{%
      \RowID=RowID,%
      \Date=Date,%
      \Filename=Filename,%
      \From=From,%
      \To=To,%
      \Subject=Subject%
    }{%
      \nextnuml{\RowID} & \Date & {\bfseries\expandafter\url\expandafter{\Filename} } & \checkmissing{\From} & \checkmissing{\To} & \Subject \\
    }%
  \end{longtable}
}%

\begin{filecontents*}{xx.csv}
2014.02.26,       26 Feb 2014      , something.txt     ,      ,    ,    ,subject
2014.11.12.tm,    12 Nov 2014      , something.txt     , XXX  , YY ,    , subject
mm, date, ,,,, subject
\end{filecontents*}

\begin{document}
\begin{letter}{}
  \opening{xx,}
  \closing{Yours Sincerely,}
  \DTLloaddb[noheader,keys={RowID,Date,Filename,From,To,Email,Subject}]{newbDB}{xx.csv}
  \PrintDocTableParekh[2014.02.26,26,2014.11.12.tm]{newbDB}{Documents}

\end{letter}
\end{document}

답변1

\DTLifSubString내에서 사용시 문제가 있는 것 같습니다 \DTLforeach. (여기 \DTLisSubString에는 조건부 인수의 using이 포함됩니다.) letterand 의 사용은 longtable난독화 문제이므로 다음은 간략한 버전입니다.

\documentclass{article}

\usepackage{datatool}

\begin{filecontents*}{xx.csv}
2014.02.26
2014.11.12.tm
mm
\end{filecontents*}

\newcommand*{\ifcontainsrowid}[2]{%
 \ifblank{#1}{#2}%
 {%
   \DTLifSubString{#1}{\RowID}{#2}{}%
 }%
}    

\begin{document}

\DTLloaddb[noheader,keys={RowID}]{newbDB}{xx.csv}

\DTLforeach*{newbDB}{\RowID=RowID}%
{%
   \ifcontainsrowid{2014.02.26,26,2014.11.12.tm}%
   {%
      \RowID
   }
}%

\end{document}

이로 인해 다른 오류 메시지가 발생합니다.

Runaway argument?
\expandafter \dtl@ifsingle \expandafter {\dtl@first }{\expandafter \@dtl@testif
substring \ETC.
! Paragraph ended before \dtl@getfirst was complete.
<to be read again> 
                   \par

그러나 그것은 같은 문제에서 비롯됩니다. 아직 원인을 파악하지 못했지만 일주일 동안 집을 비웠고 상황을 따라잡아야 하기 때문에 아직 조사할 기회가 많지 않았습니다. 예를 들어 패키지 \IfSubStr에서 다른 명령을 사용하여 이 문제를 해결할 수 있습니다 xstring .

\documentclass{article}

\usepackage{datatool}
\usepackage{xstring}

\begin{filecontents*}{xx.csv}
2014.02.26
2014.11.12.tm
mm
\end{filecontents*}

\newcommand*{\ifcontainsrowid}[2]{%
 \ifblank{#1}{#2}%
 {%
   %\DTLifSubString{#1}{\RowID}{#2}{}%
   \IfSubStr{#1}{\RowID}{#2}{}%
 }%
}


\begin{document}

\DTLloaddb[noheader,keys={RowID}]{newbDB}{xx.csv}

\DTLforeach*{newbDB}{\RowID=RowID}%
{%
   \ifcontainsrowid{2014.02.26,26,2014.11.12.tm}%
   {%
      \RowID
   }
}%

\end{document}

업데이트: 이 버그는 v2.23에서 수정되었습니다.

관련 정보