Ich schreibe einen Serienbrief in Latex. Die Adressen stammen aus einer externen Datenquelle. Das Problem ist, dass in der Datenquelle (eigentlich ziemlich häufig) leere Felder vorkommen (siehe unten). Aus diesem Grund erwartet \def\chopline#1,#2,#3,#4,#5,#6,#7,#8 \\
die Zeile \expandafter\chopline\zeile\\
irgendwie mindestens ein Zeichen hinter einem Komma und verbraucht es. Wenn in einem Feld keine Daten vorhanden sind, wird das Komma einfach „aufgefressen“ und das nächste Datenfeld eingeschlossen, was zu einem kompletten Durcheinander führt. Jeder Ratschlag zur Eindämmung des Problems wäre hilfreich.
Außerdem habe ich dieses Beispiel vor einiger Zeit kopiert und verstehe nicht alle Befehle und ihre Auswirkungen. Ich habe den Eindruck, dass die von mir verwendete Struktur ziemlich alt ist und möglicherweise nicht die sicherste Möglichkeit darstellt, das gewünschte Verhalten zu implementieren. Welche fortgeschritteneren Tools, die LuaLaTeX bietet, könnte ich verwenden, um den Code zu verbessern, der den Serienbrief implementiert?
Dies ist der Code:
\documentclass{scrlttr2}
\usepackage{etoolbox}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}
\setmonofont{Linux Libertine Mono O}
\def\chopline#1,#2,#3,#4,#5,#6,#7,#8 \\{
\def\lastname{#1}
\def\firstname{#2}
\def\fanilyname{#3}
\def\addrsuppa{#4}
\def\street{#5}
\def\addrsuppb{#6}
\def\postcode{#7}
\def\town{#8}
}
\newif\ifmore \moretrue
\begin{document}
\setkomavar{subject}{Subject}
\newread\quelle
\openin\quelle=../teilnehmer.csv
\read\quelle to \zeile
\loop
\read\quelle to \zeile
\ifeof\quelle
\global\morefalse
\else
\expandafter\chopline\zeile\\
\begin{letter}{\firstname\ \lastname \\
\postcode\ \town}
\opening{Sehr geehrte Familie \lastname,}
[content]
\closing{Best regards}
\end{letter}
\fi
\ifmore\repeat
\closein\quelle
\end{document}
Hier kommt die Datenquelle (mit einigen Dummies):
last_name,first_name,family_name,address_supplement_1,street,address_supplement_2,postcode,town,telephone_1,telephone_2,mail
Barnes,Helen,,Apartment 3,Potsdamer Platz 10,Neukölln,99823,Görlitz,3714 2487824,8797 9717692,[email protected]
Thomas,Brandon,,,Dorfstraße 34d,,20903,Aachen,9214 3252403,,[email protected]
Kelley,Juan,,,Hauptstraße 11,,00495,Hamburg,6265 9683011,6263 6235169,[email protected]
Fisher,Anne,,,Berliner Straße 99,,39856,Oldenburg,0666 6226586,7917 5816244,
Sanchez,Martha,Miller,,Mittelweg 23,,11932,Leverkusen,3728 6123496,,[email protected]
Morrison,Daniel,,,Schulstraße 8,,11943,Neustadt,9589 2520624,
Brown,David,Clark,Room 42,Bahnhofstraße 12,Amorbach,12821,Neckarsulm,9304 3674329,,[email protected]
Graham,Frank,,,Lindenallee 19,,32956,Neustadt,,,[email protected]
Price,Douglas,,,Mühlweg 5e,,04923,Neustadt,7934 4700638,7689 9255281,[email protected]
Antwort1
Hier ist eine Lösung mitdatatool
(vorausgesetzt, die Daten liegen in vor test.csv
, ändern Sie sie entsprechend):
\documentclass{scrlttr2}
\usepackage{etoolbox}
\usepackage{fontspec}
\setmainfont{Liberation Sans}% (I don't have the fonts from the original MWE)
\usepackage{datatool}
\DTLloaddb{mydata}{test.csv}
\begin{document}
\setkomavar{subject}{Subject}
\DTLforeach*{mydata}%
{\LastName=last_name,\FirstName=first_name,%
\AddrI=address_supplement_1,\Street=street,%
\AddrII=address_supplement_2,\PostCode=postcode,\Town=town}%
{%
\begin{letter}{\FirstName\ \LastName\\%
\DTLifnullorempty{\AddrI}{}{\AddrI\\}%
\DTLifnullorempty{\Street}{}{\Street\\}%
\DTLifnullorempty{\AddrII}{}{\AddrII\\}%
\PostCode\\\Town}
\opening{Sehr geehrt Familie \LastName,}
[content]
\closing{Best regards}
\end{letter}
}
\end{document}