LaTeX-Wörterbuch: in Datei schreiben

From Wikibooks
Jump to navigation Jump to search

Dieses Dokument beschäftigt sich mit dem Schreiben von Daten, die in einem LaTeX-Dokument gesammelt werden und während des TeX'ens in eine externen Datei geschrieben werden. Am Ende werden diese Daten aus der Datei ausgelesen und ausgegeben. Dies wird an einem Beispiel mit Seminarterminen erläutert, die z.B. in einem längeren Text an unterschiedlichen Stellen genannt werden. Ziel ist es diese Termin am Ende des LaTeX-Dokumentes noch einmal gesammelt auszugeben. Daher enthält das Beispieldokument sowohl eine Reihe von Schreibbefehlen, die aus Gründen der Übersichtlichkeit direkt hintereinander aufgeführt wurden.


siehe auch: Serienbrief.

Beschreibung[edit]

Öffnen und Schließen der Datei[edit]

Um in eine Datei schreiben zu können, muss zunächst eine externe Datenquelle geöffnet werden:

 \newwrite\outfile
 \immediate\openout\outfile=seminar.dat

Dabei wird mittels newwrite eine neue Variable, hier outfile angelegt. Mittels openout wird dann die Datei seminar.dat zum Schreiben geöffnet.

Nach Abschluss des Speicherns wird die Datei mittels closeout dann wieder geschlossen:

 \immediate\closeout\outfile

Zeilenweises schreiben[edit]

Das Schreiben einer Zeile erfolgt mit

 \immediate\write\outfile{1;Mustermann;Orthogonalitaet}

Auswertung der Zeile[edit]

Für das abschließende Einlesen der Datei wird ein Kommando chopline definiert. Wir haben unsere Datei der Seminartermine als eine gewöhnliche Textdatei gespeichert, in der je Zeile die Seminartermindaten stehen. Diese sind durch Semikolon getrennt:

1;Mustermann;Orthogonalitaet
2;Musterfrau;Zeitgesetz
3;Musterbert;Transformation

Um nun die einzelnen Felder sinnvoll ansprechen zu können, definieren wir im Kopf einen chopline-Befehl:

\def\chopline#1;#2;#3 \\{
  \def\nummer{#1}
  \def\name{#2}
  \def\vortragstitel{#3}
}

Dabei sind #1, #2 und #3 die durch Semikolon getrennten Einträge aus der Datei seminar.dat. LaTeX kann nur maximal 9 Felder verarbeiten. Das Leerzeichen nach dem letzten Feld und vor dem Zeilenumbruch ist nötig, da beim Einlesen einer Datei standardmäßig ein Leerzeichen am Ende der Zeile gelesen wird. Dieses soll jedoch nicht im Parameter erhalten bleiben. Dann werden die Befehle nummer, name und vortragstitel definiert, die uns das bessere Ansprechen der einzelnen Felder erlauben.

In unserem LaTeX-Dokument können nun diese verwendet werden, wenn wir die zeile mittels expandafter zerlegen:

\expandafter\chopline\zeile\\

Beispielcode[edit]

Das eigentliche Dokument:

\documentclass[12pt]{article} 
%---chopline-Command definieren----------
%---chopline kann max. 9 Parameter haben
\def\chopline#1;#2;#3 \\{
  \def\nummer{#1}
  \def\name{#2}
  \def\vortragstitel{#3}
}
%----------------------------------------
%---neue boolesche Variable definieren---
%---Variable \more wird auf true gesetzt
\newif\ifmore \moretrue
%----------------------------------------
\begin{document}
 %--Datei schreiben---------------------------
 \newwrite\outfile
 \immediate\openout\outfile=seminar.dat
 \immediate\write\outfile{1;Mustermann;Orthogonalitaet}
 \immediate\write\outfile{2;Musterfrau;Zeitgesetz}
 \immediate\write\outfile{3;Musterbert;Transformation}
 \immediate\closeout\outfile
 %----------------------------------------------------- 
%----------------------------------------
%----------------------------------------
%---Datei zum Lesen oeffnen--------------
\newread\quelle
\openin\quelle=seminar.dat
%----------------------------------------
%---- Schleife beginnen
\loop
 %----------------------------------------
 %---- zeilenweise die Quelldatei einlesen und in Zeile speichern
 \read\quelle to \zeile
 %----------------------------------------
 \ifeof\quelle
  \global\morefalse% Variable "more" auf "false" setzen, falls EOF erreicht.
 \else
  \expandafter\chopline\zeile\\
  %------------------------------------------------------
  Vortragsnummer ist {\nummer} des Vortrags {\vortragstitel} und mein
  Name ist {\name}. \\
  %------------------------------------------------------
 \fi
%----------------------------------------
\ifmore\repeat
% if fragt more-Variable ab, ob der "more" noch auf "true" steht 
% "repeat" bricht bei \more=false ab
%----------------------------------------
\closein\quelle
% Quelldatei kann nun geschlossen werden.
%----------------------------------------
\end{document}

Die Datei seminar.dat

1;Mustermann;Orthogonalitaet
2;Musterfrau;Zeitgesetz
3;Musterbert;Transformation

Siehe auch:[edit]

InDeX[edit]