PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Newsletter (Serienbrief) mit 'Anforderungsverzeichnis'



Freut
16-05-2013, 20:59
Hallo LaTeX-Community,

ich beschäftige mich schon einige Monate mit diesem netten 'Wortprozessor' und mein Wissen würde ich 'besser als ein Standardanwender' einstufen. So besitze ich langjährige Programmierkenntnisse in (anderen) Sprachen und habe auch schon in einer CLS-Datei kleine Anpassungen gemacht. Bisherige Hürden konnte ich von Berichten anderer Anwender lösen.

Jetzt komme ich aber mit einem vermutlich sehr ausgefallen Problem nicht weiter und alleine die Titelvergabe ist mir schon schwer gefallen.

Mein Ziel: Ein Newsletter soll erstellt bzw. verschickt werden

Adressen werden aus externer Datendatei geholt
Brief bzw. Newsletter besteht aus mehreren kleinen Berichten (wahrscheinlich doppelseitig in 3 Spalten)
nach jedem Bericht steht eine Anforderungsziffer (fortlaufende Nr), mit der weitere Infos zu diesem Bericht angefordert werden kann.
Dokumentenklasse NICHT letter bzw. Koma wegen Gestaltung als Newsletter (somit wohl auch kein adrentry-Serienbrief möglich)
die fortlaufende Nummer und das 'Anforderungsverzeichnis' wird von LaTeX selbständig erstellt.



Mein Problem liegt in Punkt 5.

Ich habe schon mehrere Ansätze versucht:

eigenes Verzeichnis [\usepackage{float}]:
Da Serienbrief mehrere Seiten bedeutet, macht er die Einträge von ALLEN Seiten in das Verzeichnis.
Davon abgesehen wird das Verzeichnis nur EINMAL im gesamten Dokument gesetzt. (Wer will schon mehrere Verzeichnisse in einem Dokument?)

Kummulieren einer Variablen (Macro)[z.B. \gappto]
Meine Idee war, dass er die Einträge einfach 'sammelt' und am Ende jeden Anschreibens ausgibt. Irgendwie lässt sich eine Variable in LaTeX aber nicht einfach so selbst 'erweitern'. Mit \gappto bzw. {etoolbox}+{environ} klappt das zwar jetzt, doch stimmt die Nummerierung nicht. Er führt auch hier alle Einträge auf, aber das könnte mit der richtigen Boolean-Variable eingeschränkt werden (skizziert mit If \thepage =1)

Vielleicht gibt es zu o.g. Ansätzen andere Wege? Ein 3.ter Ansatz könnte sein den Textkörper (die Kurzberichte MIT Anforderungsziffern) anfangs (einmalig) zu erstellen und dann zu speichern und in jedem Serienbrief den 'eingefrorenen' Text wiederzugeben. Einige Versuche habe ich hier unternommen, doch bisher habe ich keine Möglichkeit gefunden bei LaTeX einen Text (mit Berechnungsfunktion) 'einzufrieren'.

Zum Minimalbeispiel:

\Blindtext aktivieren, verhindert Serienbrieffunktion (daher 'unnötigen' Blindtext - wie lange habe ich an diesem Fehler gesucht!!!!!! alte Version? pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9) (preloaded format=pdflatex 2012.4.24))
Minimalbeispiel enthält Ansatz 1 (Verzeichnis) + Ansatz 2 (gappto), Umstellbar mit Variable 'dummyverzeichnis' true oder false
Anforderungsverzeichnis bei beiden Methoden nicht verwendbar
Zusätzliches Problem: Anforderungsnummer wird über ALLE Serienbriefe durchgezählt.
Suche im Minimalbeispiel nach 'hier' um schneller Einstellmöglichkeiten zu finden


Ich hoffe doch sehr, dass ich alle Antworten zu möglichen Fragen schon hier wiedergegeben habe :) - ich wollte sagen: hoffentlich habe ich es verständlich beschrieben.

Vielen Dank
Freut

Nachfolgend das Minimalbeispiel


%% Quellen:
%% Serienbrief:
%% http://de.wikibooks.org/wiki/LaTeX-W%C3%B6rterbuch:_Serienbrief_mit_externen_Daten
%%
%% append Environment:
%% http://tex.stackexchange.com/questions/62265/append-the-contents-of-an-environment-to-a-hook-using-gappto

\documentclass[a4paper]{article}

% Zum Erstellen einer Test-Adressendatei:
\begin{filecontents*}{adressen.adr}
Firma Hans Maier; Bodenreiniger; Im InfoHäusle 13; 98765 Lemmenburg
Klaus Meier; Dachreiniger; Hauptstr. 30; 12345 Treppenweiler
Maria Musterfrau; Hausreinigung und Abfallentsorgung; BlitzBlankSauberweg 3; 45678 Putzenwedel
\end{filecontents*}


\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc} % use TeX encoding then Type 1.
\usepackage[ngerman]{babel} % Deutsche Umlaute

\usepackage{ifthen} % wird für die 'Dummy'-Abfragen benötigt
\usepackage{blindtext}


%nur für Testzwecke: Umschalten Verzeichnis / gappto:
\newboolean{dummyverzeichnis}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%
\setboolean{dummyverzeichnis}{true} % <- HIER true = Verzeichnis, false = \gappto
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%

\newcounter{anfzaehler} % Zähler für die Durchnummerierung der einzelnen Berichte
\setcounter{anfzaehler}{1}


\ifthenelse{\boolean{dummyverzeichnis}}%
%
{% true = Verzeichnistechnik
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{float}
\floatstyle{plain}
\newfloat{anforderungen}{th}{anfaux}
\floatname{anforderungen}{\textbf{G}}%%

% Befehl um Kurzbeschreibung in Anforderungsverzeichnis zu bringen:
\newcommand{\anfinliste}[1]{
\begin{anforderungen}
Anforderung Nr. \theanfzaehler:~#1
\addcontentsline{anfaux}{anforderungen}{\theanfzae hler~#1}
\end{anforderungen}
\refstepcounter{anfzaehler}}
}%----
%
{% false = gappto-Technik
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{etoolbox}
\usepackage{environ}

\newcommand\myhook{} % Variable zum 'sammeln' der Infos

% Befehl um Kurzbeschreibung in Anforderungsverzeichnis zu bringen:
\newcommand{\anfinliste}[1]{
(\theanfzaehler)
\ifthenelse{\thepage = 1} % Erster Versuch, damit nicht ALLE Seriendrucke hier gesammelt werden
{\gappto{\myhook}{\theanfzaehler~#1\\}}%
{}
\refstepcounter{anfzaehler}}
}%----



%% Def-Bereich: Serienbrief
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%

% Definieren der Ausleseinfos von der Quelldatei (Umsetzen in Makros):
\def\chopline#1;#2;#3;#4 \\{
\def\adrFirma{#1}
\def\adrBranche{#2}
\def\adrStrasse{#3}
\def\adrOrt{#4}
}

\newif\ifmore \moretrue % ADRESSEN: Abbruchvariable bestimmen



\begin{document}

%% Def-Bereich-2: Serienbrief (nach \begin{document})
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%
\newread\quelle % ADRESSEN: Öffnen der Quell-Datei
\openin\quelle=adressen.adr


\loop % ADRESSEN: START Schleife
\read\quelle to \zeile % ADRESSEN: Einlesen Datensatz aus Quelle

\ifeof\quelle
\global\morefalse
\else % ADRESSEN: START Bedingung wenn Datensatz vorh.



%% Start DOKUMENTENDRUCK
\expandafter\chopline\zeile\\ %ADRESSEN: Umsetzen Dateiwerte in Makros(Variablen)



Infos für\\
\adrFirma \\
\adrBranche \\
\adrStrasse \\
\adrOrt



\section{Bereich 1: Schuhe}

%\blindtext %HIER Problem: Kein Serienbrief mehr, wenn aktiviert !!!
Weit hinten, hinter den Wortbergen, fern der Länder Vokalien und Konsonantien leben die Blindtexte. Abgeschieden wohnen Sie in Buchstabhausen an der Küste des Semantik, eines großen Sprachozeans. Ein kleines Bächlein namens Duden fließt durch ihren Ort und versorgt sie mit den nötigen Regelialien. Es ist ein paradiesmatisches Land, in dem einem gebratene Satzteile in den Mund fliegen. Nicht einmal \anfinliste{Infos über rosa Schuhe}


\section{Bereich 2: Zahnpasta}
Ipsum, hinaus zu gehen in die weite Grammatik. Der große Oxmox riet ihr davon ab, da es dort wimmele von bösen Kommata, wilden Fragezeichen und hinterhältigen Semikoli, doch das Blindtextchen ließ sich nicht beirren. Es packte seine sieben Versalien, schob sich sein Initial in den Gürtel und machte sich auf den Weg. Als es die ersten Hügel des \anfinliste{Infos über schwarze Zahnpasta}


\section{Bereich 3: Badehose}
Kursivgebirges erklommen hatte, warf es einen letzten Blick zurück auf die Skyline seiner Heimatstadt Buchstabhausen, die Headline von Alphabetdorf und die Subline seiner eigenen Straße, der Zeilengasse. Wehmütig lief ihm eine rhetorische Frage über die Wange, dann setzte es seinen Weg fort. \anfinliste{Infos über transparente Badehosen}


\ifthenelse{\boolean{dummyverzeichnis}}%
{%
\listof{anforderungen}{Ich wünsche Infos über}
}{
\vspace{1cm}
\textbf{Ich wünsche Infos über} \\
\myhook
}



%%%% ENDE DOKUMENT
\newpage
%\setcounter{page}{1} % Seiten wieder auf 1 setzen, da sonst alle fortlaufend


\fi % ADRESSEN: ENDE Bedingung wenn Datensatz vorh.
\ifmore\repeat % ADRESSEN: ENDE Schleife

\closein\quelle % ADRESSEN: SCHLIESSE Quell-Datei


\end{document}

u_fischer
17-05-2013, 09:50
Ich halte es nicht für sehr glücklich, in einem Minimalbeispiel zwei Methoden zu kombinieren. Da muss man ja nicht nur dein Problem verstehen sondern auch die Logik der if-Schleifen.

Abgesehen davon: Niemand hindert dich daran, am Ende des ersten Briefes Befehle wieder umzudefinieren oder Zähler zurückzusetzen. D.h. dein \anfinliste-Befehle können im ersten Brief irgendwas in einem Befehl speichern oder in das float-Verzeichnis und sich dann ab dem zweiten Brief ruhig verhalten.

Bei den Floats muss du daran denken, dass du keine zwei \listof im Dokument verwenden kannst: Das erste \listof öffnet und löscht damit den Inhalt der externen Datei. Du kannst solltest zu Beginn des Dokument den Inhalt mit dem catchfile-Paket lesen und abspeichern.

Freut
17-05-2013, 22:19
Hallo Ulrike,
vielen Dank für die Info.

Ich dachte es ist einfacher nur EIN Minimalbeispiel zu machen, zumal ich großzügig mit Kommentaren war. Aber ich werde das beherzigen, nächstesmal getrennte Beispiele geben und mir auch weniger Arbeit machen. :)


...Befehle wieder umzudefinieren...dann ab dem zweiten Brief ruhig verhalten.
Ja, so etwas habe ich mit einer Boolean-Variable auch schon umgesetzt und es funktioniert. Nur habe ich noch nicht ganz verstanden WANN der LaTeX-Kompiler welche 'beweglichen Texte' füllt. Da die Anforderungsnummer in der 'Sammelvariable' nicht nach meinen Wünschen zählt, vermute ich, dass die Werte erst beim Setzen (am Schluß) gefüllt werden und nicht in chronologischer Folge des Textes.

Im Minimalbeispiel oben (Schalter auf FALSE gesetzt = Beispiel \gappto) kommt so z.B. am Schluß 4x die Nr. 4 heraus, obwohl er im Text (beim Sammeln) jede Nr. fortlaufend korrekt einbindet.

Ich wünsche Infos über
4 Infos über rosa Schuhe
4 Infos über schwarze Zahnpasta
4 Infos über transparente Badehosen


Das 'Variablen bzw. Makro'-Handling von LaTeX ist wohl ein Thema für sich, für das ich noch mehr Wissen brauche.

Wie mir die catchfile Funktion hier nutzt, muss auch warten, da jetzt erst einmal Urlaub ansteht :D

Nochmals Danke
Freut

P.S: Konnte jemand das Problem mit 'Blindtext' nachvollziehen? D.h. Blindtext aktiviert = KEINE Serienbrieffunktion mehr.