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}
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}