Sie sind hier

Serienbrief mit Variantenlogik

Hallo!

Ich experimentiere seit einiger Zeit mit LaTeX für Sereinbrieferstellung und habe jetzt noch ein "Optimierungsproblem".

Ich möchte einen Serienbrief erstellen. Dieser bezieht seine Daten aus einer Datenbank
Die Felder für die Anrede und Namen sind schon eingefügt. Jetzt geht es darum Textbausteine in Abhängigkeit von 2 Datenfeldern (#4 und #6) auszuwählen. Hier als Beispiel stark verkürzt:

\ ifdim #4pt>0pt \ relax Du hast ein ein Guthaben von {#4~EURO} und brauchst deshalb für das kommende Jahr keinen Mitgliedsbeitrag einzuzahlen.
% Wenn diese Abfrage zu einem Ergebnis führt dann weiter zu %

\ if #6R \ Du bist Ruhend und musst derzeit keinen Beitrag zahlen
% Wenn diese Abfrage zu einem Ergebnis führt dann weiter zu %

\ if #6S \ Du bist Ehrenmitglied und musst deshalb keinen Beitrag zahlen
% Wenn diese Abfrage zu einem Ergebnis führt dann weiter zu %

Wieder einmal ist Dein Beitrag fällig - für das nächste Jahr
\ if #6E \ zahlst du einen ermäßigten Beitrag von xx Euro
\ if #6V \ du als Vollzahler einen Beitrag von yy Euro

% Nachstehende Abfrage gilt zusätzlich zur obigen Jahresvorschreibung, für alle die einen Zahlungsrückstand haben (das können nur #6E und #6V sein)
\ ifdim #4pt
BlaLBla ....

TEXT 1 für #6V, #6E danach zu

für #6R und #6S wird zum gesprungen

Ich habe das zwar geschafft aber nur indem ich teilweise die Texte bei den if-Abfragen doppelt angeordnet habe. Mein Wunsch wäre immer mit jeweils einen Textbaustein für die entsprechende Logik auszukommen. Ich hoffe ich habe das Problem klar darstellen können.

Herzliche Grüße
Erwin

Bild von Markus Kohm

Mir ist ehrlich gesagt nicht ganz klar, was genau Du wissen willst. Wenn Du wissen willst, wie Du Deine if-Logik optimieren kannst, müssten wir ja erst einmal wissen, wie die genau aussieht. Aus dem, was Du angegeben hast, geht jedenfalls für mich nicht hervor, warum Du einige Teile doppelt hast. Falls sich die doppelten Teile in der Logik nicht vermeiden lassen, könnte man bei diesen natürlich auch noch mit Variablen oder Makros (falls man Argumente benötigt) arbeiten. Wie man neue Variablen definiert, ist in der KOMA-Script-Anleitung zu finden (Stichwort: Anweisung \newkomavar). Wie man neue Makros/Anweisungen definiert, ist in guten LaTeX-Einführungen zu finden (Stichwort: Anweisung \newcommand).

Vielen Dank für die rasche Antwort. Tut mir leid wenn ich es nicht gut erklären konnte ... Hier ist das aktuelle Beispiel - vielleicht geht es so leichter zu erklären. Habe es am Anfang kommentiert.

\textbf{Mitgliedsbeitrag:}
%
%% Dies ist der Abschnitt den ich doppelt schreiben muss weil die verschachtelte IF-Logik bei mir nicht hinkommt Dieser Abschnitt soll aber auch nicht bei #6R und #6S verwendet werden ... d.h. sollte in diesen Fällen ausfallen was es derzeit nicht tut%%
%
\if #6E {Anbei findest du einen Zahlschein zur Überweisung des Mitgliedsbeitrags für das kommende Halbjahr. Dieser beträgt - bei Vorauszahlung bis zum 31. Juli 2009 - \textbf{24\ EURO}}, ansonsten \textbf{30 Euro}.
\fi
\if #6V {Anbei findest du einen Zahlschein zur Überweisung des Mitgliedsbeitrags für das kommende Halbjahr. Dieser beträgt - bei Vorauszahlung bis zum 31. Juli 2009 - \textbf{48\ EURO}}, ansonsten \textbf{60 Euro}.
\fi
%% Abschnitt DOPPEL ENDE %%
\if #6R {Du bist derzeit ruhendes Mitglied und musst keinen Beitrag zahlen. Wieder mal Lust auf ein Training?}
\fi
\if #6S {\if #5M {Lieber #1,} \fi
\if #5W {Liebe #1,} \fi du bist Ehrenmitglied und musst keinen Beitrag zahlen. Hast du wieder einmal Lust auf ein Training mit uns?}
\fi
%
%%Logik Offene Mitgliedsbeiträge und Guthaben -------------------------------------------------%
%
\ifdim #4pt0pt \relax % #4 ist ein Betrag (Gleitkommazahl) größer 0. Das ist ein Guthaben
\\Du hast jedoch ein \textbf{Guthaben} von \textbf {#4~EURO} und brauchst deshalb nichts mehr bzw. nur die Differenz zum Semesterbeitrag einzahlen.
\fi\\
%%Ende Logik Mitgliedsbeiträge -----------------------------------------------------------------------%

Bild von Markus Kohm

Code-Abschnitte sind entsprechend zu markieren, u. a. damit sie nicht abhängig von der Breite des Browserfensters umbrochen werden. Du wirst darauf spätestens beim Speichern eines Beitrags hingewiesen. Wenn Du das weiterhin ignorierst, erschwerst Du nicht nur die Hilfeversuche, ich muss Dich dann auch verwarnen.

Vermutlich, weil Du keinen echten Code und kein echtes Minimalbeispiel, sondern irgendwas zusammengeschustertes postest, verstehe ich das Problem noch immer nicht. #6 kann nicht gleichzeitig E und R oder S sein und auch nicht gleichzeitig V und R oder S sein. Also können Teile, die nur im E- bzw. V-Fall ausgegeben werden, eigentlich nicht im R- oder S-Fall erscheinen.

Eventuell ist bei Dir ja auch \if gar nicht die richtige Abfrage. Ich bin bisher davon ausgegangen, dass Du Dir klar bist, was \if macht (beispielsweise im Unterschied zu \ifx). Wenn das nicht der Fall sein sollte, dann solltest Du Deine Vergleiche besser mit Hilfe des ifthen-Pakets lösen. Du bist dann eher auf der sicheren Seite.

Leider sind meine Fragen aus meinem ersten Kommentar, nämlich ob es darum geht, die Logik zu optimieren oder lediglich die Texte nur einmal zu erfassen und dann ggf. mehrfach zu verwenden, auch in keiner Weise beantwortet.

Ist hier vielleicht sonst jemand der das Problem begreift?

Hallo!

Habe einfach den fraglichen Codeteil kopiert - ist nichts zusammengeschustertes sondern so wie ich es auch original verwende. Habe jetzt versucht das so aufzubereiten wie du es glaube ich meinst. D.h. ein funktionsfähiges Beispiel so kurz es mir möglich war (aber aus dem Original). Sorry habe noch nie in so einem System gearbeitet und arbeite auch erst kurz mit LaTex ... Die Probleme habe ich bei den jeweiligen Abschnitten beschrieben
Die Adressdatenbank ist im Format:

\adrentry{Vorname}{Name}{Strasse\\PLZ Stadt}{offener Betrag}{Geschlecht}{Mitgliedstyp}{Benutzername}{Passwort}
 
\adrentry{Martin}{Maier}{Malerstrasse\\1010 Malerau}{-50}{M}{V}{MMAier}{12345}
\adrentry{Martha}{Maier}{Malerstrasse\\1010 Malerau}{0}{W}{E}{MMAier}{12345}
\adrentry{Moritz}{Maier}{Malerstrasse\\1010 Malerau}{20}{M}{V}{MMAier}{12345}
\adrentry{Manuela}{Maier}{Malerstrasse\\1010 Malerau}{0}{W}{R}{MMAier}{12345}

Das ist mein Testbeispiel. Der obere Teil ist in meinem Original nur in eine Datei header.tex ausgelagert

\documentclass[DIN,paper=a4,fontsize=12pt]{scrlttr2}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[scaled]{helvet}
\usepackage{graphicx}
\usepackage{varwidth}
\usepackage{color}
\usepackage{float}
\setkomavar{fromaddress}{Malerstrasse \\A-1010 Malerau}
\setkomavar{fromemail}{office@maler.at}
\setkomavar{fromurl}{www.maler.at}
\setkomavar{place}{Malerau}
\setkomavar{signature}{(Martin Maier)}
%%
%-----------------------------------------------------------------------------------------------------------------%
%--  Brief - Überschrift und Anschrift ------------------------------------------------------------------.%
%-----------------------------------------------------------------------------------------------------------------%
\setkomavar{title}{Mitgliederbrief}
\def\chopline#1;#2;#3;#4;#5;#6 \\{
 \def\vorname{#1}
 \def\name{#2}
 \def\PLZ{#3}
 \def\Ort{#4}
 \def\Strasse{#5}
 
}
\newif\ifmore \moretrue
\begin{document}
%%Anschrift -------------------------------------------------------------------------------------------------%
%
\renewcommand*{\adrentry}[8]{ %
\begin{letter}{#1 #2\\#3} 
\if #5M \opening{Lieber #1!} \fi 
\if #5W \opening{Liebe #1!} \fi
%
%-----------------------------------------------------------------------------------------------------------------%
%--  Beginn Brieftext ---------------------------------------------------------------------------------------.%
%-----------------------------------------------------------------------------------------------------------------%
%
BlaBlaBla\\

Dies ist der Abschnitt den ich doppelt schreiben muss weil die verschachtelte IF-Logik bei mir nicht hinkommt. Die Einstufung der Mitglieder aus der Adressdatenbank #6 unterscheiden sich im Code E oder V nur im Mitgliedsbeitrag. D.h. Ziel wäre nur ein Text in dem beide Möglichkeiten berücksichtigt werden können.

\textbf{Mitgliedsbeitrag:}
%
\if #6E {Anbei findest du einen Zahlschein zur Überweisung des Mitgliedsbeitrags für das kommende Halbjahr. Dieser beträgt - bei Vorauszahlung bis zum 31. Juli 2009 - \textbf{24\ EURO}}, ansonsten \textbf{30 Euro}.
\fi
\if #6V {Anbei findest du einen Zahlschein zur Überweisung des Mitgliedsbeitrags für das kommende Halbjahr. Dieser beträgt - bei Vorauszahlung bis zum 31. Juli 2009 - \textbf{48\ EURO}}, ansonsten \textbf{60 Euro}.
\fi

Hier sind die Mitglieder mit Code R und S aus der Adressdatenbank #6. Diese müssen nichts zahlen. D.h. der obige Teil gilt nicht für sie. Das funktioniert auch so.

\if #6R {Du bist derzeit ruhendes Mitglied und musst keinen Beitrag zahlen. Wieder mal Lust auf ein Training?}
\fi
\if #6S {
\if #5M {Lieber #1,} \fi
\if #5W {Liebe #1,} \fi 
du bist Ehrenmitglied und musst keinen Beitrag zahlen. Hast du wieder einmal Lust auf ein Training mit uns?}
\fi

Der nächste Abschnitt ist für jene die einen Rückstand haben - hier wird noch zusätzlich das Minus aufgeführt - d.h. die bekommen in der Realität 2 Zahlscheine. Das funktioniert auch.

%
%%Logik Offene Mitgliedsbeiträge und Guthaben -------------------------------------------------%
%
\ifdim #4pt<0pt \relax % #4 ist ein Betrag (Gleitkommazahl) kleiner 0. Es werden die Säumigen erfasst.
%
\\Deinen \textbf {ausständigen Betrag} findest du auf dem zweiten Erlagschein (Stichtag 19. Juni 2009). Wir ersuchen Dich, den offenen Betrag von \textbf {#4~EURO} bis spätestens 31. Juli 2009 auf das Vereinskonto einzuzahlen.
\fi

Dieser Abschnitt gilt nur für jene Mitglieder aus der Datenbank #6 E und V. Das funktioniert aber derzeit so nicht weil das obige schon durchgelaufen ist und jene die ein Guthaben aufweisen derzeit ebenfalls einen Zahlschein (erster Code) bekommen obwohl sie ein Guthaben haben. Das ist so falsch.

\ifdim #4pt>0pt \relax % #4 ist ein Betrag (Gleitkommazahl) größer 0. Das ist ein Guthaben
\\Du hast jedoch ein \textbf{Guthaben} von \textbf {#4~EURO} und brauchst deshalb nichts mehr bzw. nur die Differenz zum Semesterbeitrag einzahlen.
\fi\\
%%Ende Logik Mitgliedsbeiträge -----------------------------------------------------------------------%

Hier ist nur mehr der Schluss des Briefes

Das ist jetzt der Schlusstext
 
%-----------------------------------------------------------------------------------------------------------------%
%-- Ende des Brieftextes ----------------------------------------------------------------------------------%
%-----------------------------------------------------------------------------------------------------------------%
\closing{Herzliche Grüße im Namen des gesamten Vorstandes}
\end{letter} 
} 
\input{Mitglieder.adr} 
\end{document}

Ich hoffe ich habe mich da jetzt nicht zu umständlich ausgedrückt und habe es richtig verstanden.

herzliche Grüße
Erwin

Bild von Markus Kohm

Es war nicht die Rede davon, dass Du das Beispiel zerstückeln sollst. Ich habe nichts gegen Kommentare im Code, wenn der Code eine vernünftige Zeilenlänge hat und darüber hinaus (wie in Deinem neusten Beitrag) korrekt als Code markiert ist. Nur so ist sichergestellt, dass ich den Code einfach per Copy&Paste übernehmen kann.

Obwohl Du Dich wieder um die direkte Beantwortung der direkten Frage herumgemogelt hast, ist mir nun tatsächlich klar geworden, worum es Dir geht. Entscheidend waren die Sätze:

Die Einstufung der Mitglieder aus der Adressdatenbank #6 unterscheiden sich im Code E oder V nur im Mitgliedsbeitrag. D.h. Ziel wäre nur ein Text in dem beide Möglichkeiten berücksichtigt werden können.

Demnach willst Du also wirklich eine Optimierung der Logik. Nun, mit dem bereits erwähnten Paket ist das kein Problem. Ich habe mal ansatzweise auf dieses Paket umgestellt (näheres dazu ist der Paketanleitung zu entnehmen):

\documentclass[DIN,paper=a4,fontsize=12pt,parskip=half]{scrlttr2}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[scaled]{helvet}
\usepackage{graphicx}
\usepackage{varwidth}
\usepackage{color}
\usepackage{float}
\usepackage{ifthen}
\usepackage{filecontents}% Damit die filecontents*-Umgebung die externe Datei
                         % ggf. bei jedem Lauf neu schreibt (= überschreibt).
\begin{filecontents*}{Mitglieder.adr}
%\adrentry{Vorname}{Name}{Strasse\\PLZ Stadt}{offener Betrag}{Geschlecht}{Mitgliedstyp}{Benutzername}{Passwort}
 
\adrentry{Martin}{Maier}{Malerstrasse\\1010 Malerau}{-50}{M}{V}{MMAier}{12345}
\adrentry{Martha}{Maier}{Malerstrasse\\1010 Malerau}{0}{W}{E}{MMAier}{12345}
\adrentry{Moritz}{Maier}{Malerstrasse\\1010 Malerau}{20}{M}{V}{MMAier}{12345}
\adrentry{Manuela}{Maier}{Malerstrasse\\1010 Malerau}{0}{W}{R}{MMAier}{12345}
\end{filecontents*}
 
\setkomavar{fromaddress}{Malerstrasse \\A-1010 Malerau}
\setkomavar{fromemail}{office@maler.at}
\setkomavar{fromurl}{www.maler.at}
\setkomavar{place}{Malerau}
\setkomavar{signature}{(Martin Maier)}
\let\raggedsignature\raggedright
%%
%---------------------------------------------------------------------------
%--  Brief - Überschrift und Anschrift -------------------------------------
%---------------------------------------------------------------------------
\setkomavar{title}{Mitgliederbrief}
\def\chopline#1;#2;#3;#4;#5;#6 \\{
 \def\vorname{#1}
 \def\name{#2}
 \def\PLZ{#3}
 \def\Ort{#4}
 \def\Strasse{#5}
 
}
\newif\ifmore \moretrue
\begin{document}
%%Anschrift ---------------------------------------------------------------
\renewcommand{\adrentry}[8]{ %
\begin{letter}{#1 #2\\#3} 
\opening{Liebe\ifthenelse{\equal{#5}{M}}{r}{} #1!}
%
%--------------------------------------------------------------------------
%--  Beginn Brieftext -----------------------------------------------------
%--------------------------------------------------------------------------
%
BlaBlaBla
 
\textbf{Mitgliedsbeitrag:}
%
\ifthenelse{\equal{#6}{E}\OR\equal{#6}{V}}{%
  Anbei findest du einen Zahlschein zur Überweisung des Mitgliedsbeitrags für
  das kommende Halbjahr. Dieser beträgt
  \textbf{\ifthenelse{\equal{#6}{E}}{24}{48} EUR} bei Vorauszahlung bis zum
  31. Juli, ansonsten \textbf{\ifthenelse{\equal{#6}{E}}{30}{60} EUR}.\par
}{}%
\ifthenelse{\equal{#6}{R}}{%
  Du bist derzeit ruhendes Mitglied und musst keinen Beitrag zahlen. Wieder
  mal Lust auf ein Training?\par
}{}%
\if #6S
  \if #5M {Lieber #1,} \fi
  \if #5W {Liebe #1,} \fi 
  du bist Ehrenmitglied und musst keinen Beitrag zahlen. Hast du wieder einmal
  Lust auf ein Training mit uns?\par
\fi
%
%%Logik Offene Mitgliedsbeiträge und Guthaben -----------------------------
%
\ifdim #4pt<0pt\relax % #4 ist ein Betrag (Gleitkommazahl) kleiner 0. Es
                      % werden die Säumigen erfasst.
%
  Deinen \textbf {ausständigen Betrag} findest du auf dem zweiten
  Erlagschein (Stichtag 19. Juni 2009). Wir ersuchen Dich, den offenen Betrag
  von \textbf {#4~EUR} bis spätestens 31. Juli 2009 auf das Vereinskonto
  einzuzahlen.
\fi
Das ist jetzt der Schlusstext
 
%---------------------------------------------------------------------------
%-- Ende des Brieftextes ---------------------------------------------------
%---------------------------------------------------------------------------
\closing{Herzliche Grüße im Namen des gesamten Vorstandes}
\end{letter} 
} 
\input{Mitglieder.adr} 
\end{document}

Es sei an dieser Stelle auch darauf hingewiesen, dass im Deutschen - ein Bindestrich ist, während -- ein Gedankenstrich ist.

Die ISO-Einheit für Euro ist EUR. Die Verwendung von \texteuro wäre bei Verwendung einer passenden Schrift – beispielsweise Latin Modern (LM) mit \usepackage{lmodern} – ebenfalls möglich. Desweiteren gibt es diverse Pakete mit einem Euro-Zeichen.

Man muss nicht mit festen Zeilenumbrüchen, also \\ im Blocksatz herummurksen, sondern darf ruhig echte Absätze, also Leerzeilen oder \par, verwenden, wenn man bei \renewcommand selbiges nicht verbietet. Zum Unterschied zwischen \renewcommand und \renewcommand* siehe eine gute LaTeX-Einführung oder ganz am Ende von Abschnitt 3.4 im usrguide.

Hallo Markus!

Vielen Dank erst mal, bin sehr froh über die Unterstützung auch wenn ich anscheinend mein Problem nicht gut darstellen konnte - wird noch werden :-)
Habe den Code jetzt angepasst, auch die zweite Anrede nach dem Beispiel der ersten und er läuft wunderbar. Die Adressdatei wird von einem Programm schon extern richtig aufbereitet die brauche ich nur aktivieren (war vielleicht missverständlich). Der nächste Schritt ist die Übernahme aus einer CSV-Datei, beschäftige mich dafür grade mit dem
Habe da jetzt einiges zu lernen (geht am Besten doch am praktischen Beispiel) vor allem die ifthen Anweisung die mir noch nicht geläufig war, werde die verwendeten Befehle noch genauer studieren. Danke auch für den Hinweis mit den Bindestrichen, Absätzen, ...

noch ein schönes Wochenende
Erwin

Comments for "Serienbrief mit Variantenlogik" abonnieren