Scrlttr2 和 datatool 兼容性?

Scrlttr2 和 datatool 兼容性?

我对写一些格式信函很感兴趣。我非常喜欢 scrletter2 的功能,尤其是它可以将“收件人”地址放在商务信封的正确位置。

对于邮件合并,我过去曾使用过 datatools 包。它与 article 类结合使用非常简单。MWE 可能看起来像

\documentclass{letter}
\usepackage{datatool}
\begin{document}
% load database
\DTLloaddb{scores}{StudentScores.csv}
\DTLforeach{scores}{\firstname=FirstName,\surname=Surname,\score=Score}{%

\begin{letter}{}
\opening{Dear \firstname\ \surname}
Congratulations on your score of \score !
\closing{Yours Sincerely}
\end{letter}

}
\end{document}

然而,使用 scrletter2 时,事情变得棘手。具体来说,我很难弄清楚如何放置命令。

我不知道如何发布不太长的 MWE,但要点如下:

\documentclass[11pt,english]{scrlttr2}
\usepackage{datatool}
\begin{document}

% a bunch of \setkomavar{fromname}{From name} and similar

\DTLloaddb{info}{Book1.csv}
% read database
\DTLforeach{info}{\firstname=FirstName,
\surname=LastName,
\position=Position,}{%

\begin{letter}{\firstname}
Text here
\end{letter}
}
\end{document}

我收到以下错误:

Runaway argument?
\@nil \@@ {scores}\fi \ifthenelse {\boolean {true}}{\refstepcounter {\ETC.
Paragraph ended before \@dtl@next was complete.
<to be read again> 
\par 
l.130 }

我觉得文档中 \DTL 命令的位置有问题,但又无法弄清楚。

答案1

您必须letter用命令\DTLforeachDTLenvforeach环境将环境括起来。但您必须准确使用分配列表:键前后不应有额外的空格,分配列表末尾不应有逗号。

在此处输入图片描述

与环境一起编码DTLenvforeach

\begin{filecontents*}{test.csv}
FirstName,LastName,Score
John,"Smith, Jr",68
Jane,Brown,75
Andy,Brown,42
Z\"oe,Adams,52
Roger,Brady,58
Clare,Verdon,45
\end{filecontents*}

\documentclass[
  english,
  fromalign=right
]{scrlttr2}
\usepackage{babel}
\usepackage{datatool}

\begin{document}
\setkomavar{fromname}{Sydney Summer}
\setkomavar{fromaddress}{Entenstr. 5\\99999 Katzenhausen}

\DTLloaddb{info}{test.csv}
\begin{DTLenvforeach}{info}{\firstname=FirstName,\surname=LastName,\score=Score}
  \begin{letter}{\firstname{} \surname}
    \opening{Dear \firstname,}
    Congratulations on your score of \score !
    \closing{Yours sincerely}
  \end{letter}
\end{DTLenvforeach}
\end{document}

或者使用以下命令\DTLforeach

\documentclass[
  english,
  fromalign=right
]{scrlttr2}
\usepackage{babel}
\usepackage{datatool}

\begin{document}
\setkomavar{fromname}{Sydney Summer}
\setkomavar{fromaddress}{Entenstr. 5\\99999 Katzenhausen}

\DTLloaddb{info}{test.csv}
\DTLforeach{info}{\firstname=FirstName,\surname=LastName,\score=Score}{
  \begin{letter}{\firstname{} \surname}
    \opening{Dear \firstname,}
    Congratulations on your score of \score !
    \closing{Yours sincerely}
  \end{letter}
}
\end{document}

相关内容