Hallo zusammen!

Ich verwende seit fast einem Jahr diese sicher nicht ganz optimale Lösung für einen Serienbrief. Das hat bis vor Kurzem (~1 Monat) auch problemfrei funktioniert. Neuerdings bekomme ich aber den Fehler "File ended while scanning use of \@DTLforeach" unter TeX Live 2019/Debian.

Das nicht ganz so minimale MWE… bei dem ich hier im Wesentlichen bedingt Briefe adressieren möchte.

%example data
\begin{filecontents*}{data.csv}
Memberno;Mark;Nick;EMail;PGP;Firm;Title;FirstNames;FamilyNames;Phone;PostalNames;AddressDetails;Street;HouseNumber;ZIP;Place;Country
1;m;Sandy;sandy@strahlenau.de;;;;Sandy;Sonnenschein;;;;Wetterstraße;5;1111;Strahlenau;
2;m;York;york@gmail.com;0x12345678;NoGo GbR;Dr.;York;Quietsch;;;;Bachstraße;4;67345;Ententeich;Österreich
3;p;Sab;sab@gmx.net;0xabcdef;;;Sabine;Müller;;;;Kutscherstraße;19;39114;Sonstwo;
4;m;Jane;jane@1und1.de;;;;Hannah;Geisler;;;;Hauptstraße;44 a;1789;Sity;Schweiz
\end{filecontents*}

\documentclass[
  fontsize=11pt,
  paper=a4,
  parskip=full,
  enlargefirstpage=on,    % More space on first page
  fromalign=left,        % PLacement of name in letter head
  fromphone=false,
  fromfax=false,
  fromrule=aftername,     % Rule after sender name in letter head
  fromemail=on,           % turn on email of sender
  fromurl=on,
  addrfield=on,           % Adress field for envelope with window
  backaddress=on,         % Sender address in this window
  %~ subject=beforeopening,  % Placement of subject
  locfield=narrow,        % Additional field for sender
  foldmarks=on,           % Print foldmarks
  version=last,
  pagenumber=off,
  subject=untitled
]{scrlttr2}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\nonfrenchspacing

\setkomavar{fromzipcode}{12345}
\setkomavar{place}{Place}
\setkomavar{date}{%
\today%
}
\setkomavar{fromemail}[]{mail@sender.com}
\setkomavar{fromurl}[]{https://domain.sender.com/}

\LoadLetterOption{DIN}

\setkomavar{fromname}{SENDER Company}
\setkomavar{toname}{RECEIPIENT}

\setkomavar{fromaddress}{%
Streetaddress
\usekomavar{fromzipcode}~\usekomavar{place}
}

\setkomavar{backaddressseparator}{\enspace\textperiodcentered\enspace}
\setkomavar{enclseparator}[Attachments]{: }

\usepackage[utf8,separator=;]{datatool}
\DTLsetseparator{;}
\DTLloadrawdb[
keys={%
fieldmemberno,fieldmark,fieldnick,fieldemail,fieldpgp,fieldfirm,fieldtitle,fieldname1,fieldname2,fieldphone,fieldnamepostal,fieldremark,fieldstreet,fieldhousenr,fieldzip,fieldplace,fieldcountry %
}
]%
{addresses}%
{data.csv}

\renewcommand*{\raggedsignature}{\raggedright}
\setkomavar{signature}{boardmembers}

\begin{document}
\DTLforeach*{addresses}{%
    \Chiffre=fieldmemberno,\Mark=fieldmark,\MemberNick=fieldnick,\MemberEMail=fieldemail,\PGP=fieldpgp,%
    \Firm=fieldfirm,\Title=fieldtitle,%
    \Firstname=fieldname1,\Surname=fieldname2,%
    \Phone=fieldphone,%
    \Remark=fieldremark,\Postname=fieldnamepostal,
    \Street=fieldstreet,\HouseNr=fieldhousenr,\ZIP=fieldzip,\Place=fieldplace,\Country=fieldcountry
}{
\ifstr{\Mark}{m}{
\setkomavar{title}{Your Membership at \usekomavar{fromname}}
\setkomavar{subject}{}
\begin{letter}{% 
% here the problem starts: conditionally using information for address
%
% working example, just I do have differrent cases that are not covered by this
% at least useable pdf produced
    %~ \Firstname ~\Surname \\
    %~ \Street \\
    %~ \ZIP \Place
%
% was working formerly, not any more, maybe due to changes in a package?
% no pdf produced
%error msg: File ended while scanning use of \\@DTLforeach.
    \ifstr{\Firma}{}{}{\Firma \\}
    \ifstr{\Titel}{}{}{\Titel ~}
    \ifstr{\Postname}{}{\Vorname ~\Name }{\Postname } \\
    \ifstr{\Remark}{}{}{\Remark \\}
    \Street{}\ifstr{\HouseNr}{}{}{~\HouseNr } \\
    \PLZ ~\Ort \ifstr{\Land}{}{}{\\\MakeUppercase{\countrypostname{\Land }}
}

\opening{Hello \MemberNick{}!}

Letting you know some detail about your mebership at \usekomavar{fromname}\\

\begin{itemize}% itemize here to reduce the example with using a table incl. multicols
\item Chiffre: \Chiffre{} (please mention when contacting)
\item Nick: \MemberNick{} 
\item E-Mail: \MemberEMail{}
\end{itemize}

\closing{Yours,}

\end{letter}\newpage
}{}% end of ifstr
}% end of DTLforeach
\end{document}

Gerne auch Hinweise wie der Serienbrief besser umgesetzt werden sollte, aber primär interessiert mich wie ich die Bedingten Adressabgaben wieder wirksam werden lassen kann, die PDF sauber erstellt wird und möglichst kein Fehler gemeldet wird.

Vielen Dank im Voraus für eure Hinweise

gefragt 20 Dez '19, 13:02

vv01f's gravatar image

vv01f
214
Akzeptiert-Rate: 100%

bearbeitet 20 Dez '19, 20:42

1

Das kann eigentlich gar nicht funktionieren und kann eigentlich auch noch nie funktioniert haben. Das beginnt schon damit, dass \ifblank nicht so funktioniert, wie du das zu glauben scheinst. Die Anweisung hat nämlich nur drei und nicht vier Argumente und expandiert das erste Argument laut Doku auch nicht. Aber selbst mit korrekten Argumenten würde die Verarbeitung von fromaddress so nicht funktionieren, weil am Ende AFAIK kein \\ stehen darf. Auch die \ifstr im Argument der letter-Umgebung sind problematisch, da auch dabei die Zerlegung des Arguments eher nicht funktioniert.

(20 Dez '19, 15:03) Ijon Tichy

@ijon-tichy danke für den Hinweis auf \ifblank, ich habe dieses Relikt aus der Verwendung im \firsthead hier mal entfernt und bei mir lokal auf 3 Argumente verkürzt. Das \ ging wohl gut weil ich \fromaddress in der konkerten Vorlage nicht selbst aufrief. Was würde deiner Erfahrung nach einen String-Vergleich ermöglichen?. Aber ich kann nicht behaupten, die Funktionsweise durchdrungen zu haben.

(20 Dez '19, 15:49) vv01f

Wäre es denkbar, dass Du neuerdings (TeXLive 11/2019?) \begin{filecontents*}[overwrite]{data.csv} verwenden musst?

(20 Dez '19, 18:47) cis

Ich habe dann einfach weiter geforscht und nachdem ich weder mit \ifx, ifthenelse oder einfach nur if weiter kam, stieß ich bei Stackexchange auf den wesentlichen Punkt: Der Adressbereich von \begin{letter} verträgt sich nicht mit u.a. \ifthenelse.1 Auch wenn mir die Information an sich noch nicht weiterhilft und ich keine Ahnung habe warum die bisher nachweislich mehr als 100 Briefe kein Problem waren, war dort immerhin ein Workaround dabei; nicht schön, aber funktioniert.

Hier die Lösung (neues \makeaddress anstatt \begin{letter}) bei mir angewendet:

%example data
\begin{filecontents*}%
%~ [overwrite] % good to know it exists, but not needed here
{data.csv} Memberno;Mark;Nick;EMail;PGP;Firm;Title;FirstNames;FamilyNames;Phone;PostalNames;AddressDetails;Street;HouseNumber;ZIP;Place;Country
1;m;Sandy;sandy@strahlenau.de;;;;Sandy;Sonnenschein;;Sandra Sunshine;;Wetterstraße;5;11111;Strahlenau;
2;m;York;york@gmail.com;0x12345678;NoGo GbR;Dr.;York;Quietsch;;;;Bachstraße;4;67345;Ententeich;Österreich
3;p;Sab;sab@gmx.net;0xabcdef;;;Sabine;Müller;;;;Kutscherstraße;19;39114;Sonstwo;
4;m;Jane;jane@1und1.de;;;;Hannah;Geisler;;;;Hauptstraße;44 a;1789;Sity;Schweiz
\end{filecontents*}

\documentclass[
  fontsize=11pt,
  paper=a4,
  parskip=full,
  enlargefirstpage=on,    % More space on first page
  fromalign=left,        % PLacement of name in letter head
  fromphone=false,
  fromfax=false,
  fromrule=aftername,     % Rule after sender name in letter head
  fromemail=on,           % turn on email of sender
  fromurl=on,
  addrfield=on,           % Adress field for envelope with window
  backaddress=on,         % Sender address in this window
  %~ subject=beforeopening,  % Placement of subject
  locfield=narrow,        % Additional field for sender
  foldmarks=on,           % Print foldmarks
  version=last,
  pagenumber=off,
  subject=untitled,
  ngerman,          % modern german orthography
]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{scrletter}
\nonfrenchspacing

\setkomavar{fromzipcode}{12345}
\setkomavar{place}{Place}
\setkomavar{date}{%
\today%
}
\setkomavar{fromemail}[]{mail@sender.com}
\setkomavar{fromurl}[]{https://domain.sender.com/}

\LoadLetterOption{DIN}

\setkomavar{fromname}{SENDER Company}
\setkomavar{toname}{RECEIPIENT}

\setkomavar{fromaddress}{%
Streetaddress \\
\usekomavar{fromzipcode}~\usekomavar{place}
}

\setkomavar{backaddressseparator}{\enspace-\enspace}
\setkomavar{enclseparator}[Attachments]{: }

\usepackage[utf8,separator=;]{datatool}
\DTLsetseparator{;}
\DTLloadrawdb[
keys={%
fieldmemberno,fieldmark,fieldnick,fieldemail,fieldpgp,fieldfirm,fieldtitle,fieldname1,fieldname2,fieldphone,fieldnamepostal,fieldremark,fieldstreet,fieldhousenr,fieldzip,fieldplace,fieldcountry %
}
]%
{addresses}%
{data.csv}

\renewcommand*{\raggedsignature}{\raggedright}
\setkomavar{signature}{boardmembers}

% found at https://tex.stackexchange.com/questions/192669/mail-merge-using-datatool-with-letter-class
% The argument to \begin{letter} is massaged in order to extract the addressee. This massage is incompatible with \ifthenelse.
\makeatletter
\newtoks\address@toks
\newcommand\addto@address[1]{%
  \address@toks=\expandafter{\the\expandafter\address@toks#1}%
}
\newcommand\makeaddress{%
  \address@toks={}%
  \ifthenelse{\DTLiseq{\addrFirm}{}}{}{\addto@address{\addrFirm\\}}
  \ifthenelse{\DTLiseq{\addrTitle}{}}{}{\addto@address{\addrTitle\ }}%
  \ifthenelse{\DTLiseq{\addrPostname}{}}{\addto@address{\addrFirstname\ \addrSurname\\}}{\addto@address{\addrPostname\\}}
  \ifthenelse{\DTLiseq{\addrRemark}{}}{}{\addto@address{\addrRemark\\}}
  \ifthenelse{\DTLiseq{\addrStreet}{}}{}{\addto@address{\addrStreet}}
  \ifthenelse{\DTLiseq{\addrHouseNr}{}}{}{\addto@address{\ \addrHouseNr}}
  \addto@address{\noexpand\\}
  \ifthenelse{\DTLiseq{\addrZIP}{}}{}{\addto@address{\addrZIP\ }}
  \ifthenelse{\DTLiseq{\addrPlace}{}}{}{\addto@address{\addrPlace}}
  %~ \ifthenelse{\DTLiseq{\addrState}{}}{}{, \addto@address{\addrState}}
  \ifthenelse{\DTLiseq{\addrCountry}{}}{}{\addto@address{\\\addrCountry}}
  \begingroup
  \edef\x{\endgroup\noexpand\begin{letter}{\the\address@toks}}\x
}
\makeatother

\begin{document}
\DTLforeach*{addresses}{%
    \Chiffre=fieldmemberno,\Mark=fieldmark,\MemberNick=fieldnick,\MemberEMail=fieldemail,\PGP=fieldpgp,%
    \addrFirm=fieldfirm,\addrTitle=fieldtitle,%
    \addrFirstname=fieldname1,\addrSurname=fieldname2,%
    \Phone=fieldphone,%
    \addrRemark=fieldremark,\addrPostname=fieldnamepostal,
    \addrStreet=fieldstreet,\addrHouseNr=fieldhousenr,\addrZIP=fieldzip,\addrPlace=fieldplace,\addrCountry=fieldcountry
}{
\ifstr{\Mark}{m}{
\setkomavar{title}{Your Membership at \usekomavar{fromname}}
\setkomavar{subject}{}
% begin letter
\makeaddress

\opening{Hello \MemberNick{}!}

Letting you know some detail about your mebership at \usekomavar{fromname}\\

Chiffre: \Chiffre{} (please mention when contacting)
Nick: \MemberNick{} 
E-Mail: \MemberEMail{}

\closing{Yours,}

\end{letter}\newpage
}{}
}
\end{document}

Hier nun auch nicht mehr scrlttr2 als Klasse, da jemand meinte das wäre nicht gut bzw. Zukunftssicher.

Falls noch jemand Verbesserungsvorschläge hat, immer gerne :)

Permanenter link

beantwortet 20 Dez '19, 20:25

vv01f's gravatar image

vv01f
214
Akzeptiert-Rate: 100%

bearbeitet 20 Dez '19, 20:40

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×16
×14
×5
×2
×2

gestellte Frage: 20 Dez '19, 13:02

Frage wurde gesehen: 887 Mal

zuletzt geändert: 20 Dez '19, 20:40