home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* HANDBUCH.PAS *)
- (* Turbo-Pascal-Programm zur Druckausgabe von ASCII-Text- *)
- (* dateien als A5-Heftchen über PostScript-Dateien *)
- (* (c) 1991 Frank Stahl & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Handbuch;
-
- USES Crt, Dos;
-
- CONST
- Max_Zeilen = 65;
- Max_Seiten = 200;
-
- TYPE
- Seite = ARRAY [1..Max_Zeilen] OF STRING [90];
- SeitePtr = ^Seite;
- BuchType = ARRAY [1..Max_Seiten] OF SeitePtr;
-
- VAR
- Buch : BuchType;
- E_Datei, A_Datei : Text;
- E_Name, A_Name : STRING [12];
- Name : STRING [7]; (* [8] reserviert *)
- Zeile : STRING [80];
- Zeilen_Zaehler,
- Seiten_Zaehler,
- Blatt_Zaehler,
- Anzahl_Seiten : BYTE;
-
-
- PROCEDURE Einlesen;
- (* Quelldokument in den Speicher einlesen *)
- VAR
- i : BYTE;
-
- PROCEDURE Zeile_kopieren;
- VAR
- i, (* Quellindex *)
- j (* Zielindex *) : BYTE;
- BEGIN
- j := 1;
- FOR i := 1 TO Length(Zeile) DO BEGIN
- (* einer öffnenden oder schließenden Klammer *)
- (* wird ein Backslash ("\") vorangestellt. *)
- IF (Zeile [i] = #40) OR (Zeile[i] = #41) THEN BEGIN
- Buch[Seiten_Zaehler]^[Zeilen_Zaehler][j] := '\';
- Inc(j);
- END;
- (* Längenbyte berechnen *)
- Buch[Seiten_Zaehler]^[Zeilen_Zaehler][j]:= Zeile[i];
- Inc(j);
- END;
- Buch[Seiten_Zaehler]^[Zeilen_Zaehler][0] := Chr(j-1);
- END;
-
- BEGIN
- Assign(E_Datei, E_Name);
- {$I-}
- Reset(E_Datei);
- {$I+}
- IF IOResult <> 0 THEN BEGIN
- WriteLn('Eingabe-Datei nicht gefunden.');
- Halt(1);
- END;
-
- IF NOT EOF(E_Datei) THEN
- Readln(E_Datei, Zeile);
-
- New(Buch[Seiten_Zaehler]); (* Speicher reservieren *)
- REPEAT
- Zeile_kopieren;
- Inc(Zeilen_Zaehler);
- IF Zeilen_Zaehler > Max_Zeilen THEN BEGIN
- Inc(Seiten_Zaehler);
- New(Buch[Seiten_Zaehler]);
- Zeilen_Zaehler := 1;
- END;
- Readln(E_Datei, Zeile);
- UNTIL EOF(E_Datei);
- FOR i := Zeilen_Zaehler TO Max_Zeilen DO
- Buch[Seiten_Zaehler]^[i] := '';
- Anzahl_Seiten := Seiten_Zaehler;
-
- Close(E_Datei);
- END;
-
-
- PROCEDURE Ausgabe_Erstellung;
- VAR
- Seiten_Nr, Anzahl_Blatt,
- i : BYTE;
-
- PROCEDURE Vorspann_kopieren;
- BEGIN
- REPEAT
- Readln(E_Datei, Zeile);
- WriteLn(A_Datei, Zeile);
- UNTIL EOF(E_Datei);
- Close(E_Datei);
- Reset(E_Datei);
- END;
-
- PROCEDURE Seite_Ausgeben(Seite : BYTE);
- VAR
- j : BYTE;
- BEGIN
- FOR j := 1 TO Max_Zeilen DO BEGIN
- Write(A_Datei, '(');
- Write(A_Datei, Buch[Seite]^[j]);
- WriteLn(A_Datei, ') show LF');
- END;
- END;
-
- BEGIN
- Assign(E_Datei, 'HANDBUCH.INI'); (* Präambeldatei *)
- Reset(E_Datei);
-
- Anzahl_Blatt := (Anzahl_Seiten + 3) DIV 4;
- (* Jedes begonnene Blatt ist ein ganzes Blatt, *)
- (* daher + 3! *)
-
- (* -------------------------------------------------- *)
- (* Ausgabe in zwei Dateien, damit man weiß, wo die *)
- (* Mitte ist und genügend Zeit zum Wechseln hat. *)
- (* *)
- (* Die Ausgabe-Anweisungen sind bis auf die Be- *)
- (* rechnung der Seitennummern und die Dateinamen *)
- (* identisch, könnten also auch in einer gemeinsamen *)
- (* Prozedur codiert werden. Faktisch erzeugt die *)
- (* getrennte Codierung etwas weniger Maschinencode, *)
- (* weil Abfragen entfallen. *)
-
- (* --- 1.Datei -------------------------------------- *)
-
- A_Name := Name + '1.PS ';
- Assign(A_Datei, A_Name);
- Rewrite(A_Datei);
-
- Vorspann_kopieren;
-
- (* 'Quer', 'Links', 'Rechts' und 'showpage' sind in *)
- (* der Präambeldatei definiert. *)
-
- FOR i := 1 TO Anzahl_Blatt DO BEGIN
- WriteLn(A_Datei, 'Quer');
- WriteLn(A_Datei, 'Links');
- Seiten_Nr := i * 2; (* !!! *)
- IF Seiten_Nr <= Anzahl_Seiten THEN
- (* Falls die Seitenzahl nicht durch 4 teilbar ist *)
- Seite_Ausgeben(Seiten_Nr);
- WriteLn(A_Datei, 'Rechts');
- Seiten_Nr := Anzahl_Blatt * 4 - i * 2 + 1; (* !!! *)
- IF Seiten_Nr <= Anzahl_Seiten THEN
- Seite_Ausgeben(Seiten_Nr);
- WriteLn(A_Datei, 'showpage');
- END;
- Close(A_Datei);
-
- (* --- 2. Datei ------------------------------------- *)
-
- A_Name := Name + '2.PS';
- Assign(A_Datei, A_Name);
- Rewrite(A_Datei);
-
- Vorspann_kopieren;
-
- FOR i := 1 TO Anzahl_Blatt DO BEGIN
- WriteLn(A_Datei, 'Quer');
- WriteLn(A_Datei, 'Links');
- Seiten_Nr := 2 * (i + Anzahl_Blatt);
- IF Seiten_Nr <= Anzahl_Seiten THEN
- Seite_Ausgeben(Seiten_Nr);
- WriteLn(A_Datei, 'Rechts');
- Seiten_Nr := Anzahl_Blatt * 2 - 2 * i + 1;
- IF Seiten_Nr <= Anzahl_Seiten THEN
- Seite_Ausgeben(Seiten_Nr);
- WriteLn(A_Datei, 'showpage');
- END;
- Close(A_Datei);
-
- (* -------------------------------------------------- *)
-
- Close(E_Datei);
- END;
-
-
- BEGIN (* Hauptprogramm *)
- Zeilen_Zaehler := 1;
- Seiten_Zaehler := 1;
- Blatt_Zaehler := 1;
- Zeile := '';
- ClrScr;
- WriteLn('HANDBUCH -- (c) 1991 Frank Stahl & TOOLBOX');
- WriteLn;
- Write('Name der Eingabe-Datei: ');
- ReadLn(E_Name);
- WriteLn;
- Write('Ausgabe-Datei (bitte höchstens 7-stellig): ');
- ReadLn(Name);
-
- Einlesen;
- Ausgabe_Erstellung;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von HANDBUCH.PAS *)
-