home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / dtp / handbuch.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-01-20  |  5.8 KB  |  208 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      HANDBUCH.PAS                      *)
  3. (* Turbo-Pascal-Programm zur Druckausgabe von ASCII-Text- *)
  4. (*    dateien als A5-Heftchen über PostScript-Dateien     *)
  5. (*             (c) 1991 Frank Stahl & TOOLBOX             *)
  6. (* ------------------------------------------------------ *)
  7. PROGRAM Handbuch;
  8.  
  9. USES Crt, Dos;
  10.  
  11. CONST
  12.   Max_Zeilen  = 65;
  13.   Max_Seiten  = 200;
  14.  
  15. TYPE
  16.   Seite    = ARRAY [1..Max_Zeilen] OF STRING [90];
  17.   SeitePtr = ^Seite;
  18.   BuchType = ARRAY [1..Max_Seiten] OF SeitePtr;
  19.  
  20. VAR
  21.   Buch             : BuchType;
  22.   E_Datei, A_Datei : Text;
  23.   E_Name, A_Name   : STRING [12];
  24.   Name             : STRING [7];         (* [8] reserviert *)
  25.   Zeile            : STRING [80];
  26.   Zeilen_Zaehler,
  27.   Seiten_Zaehler,
  28.   Blatt_Zaehler,
  29.   Anzahl_Seiten    : BYTE;
  30.  
  31.  
  32.   PROCEDURE Einlesen;
  33.     (* Quelldokument in den Speicher einlesen *)
  34.   VAR
  35.     i : BYTE;
  36.  
  37.     PROCEDURE Zeile_kopieren;
  38.     VAR
  39.       i,   (* Quellindex *)
  40.       j    (* Zielindex  *)  : BYTE;
  41.     BEGIN
  42.       j := 1;
  43.       FOR i := 1 TO Length(Zeile) DO BEGIN
  44.          (* einer öffnenden oder schließenden Klammer     *)
  45.          (* wird ein Backslash ("\") vorangestellt.       *)
  46.         IF (Zeile [i] = #40) OR (Zeile[i] = #41) THEN BEGIN
  47.           Buch[Seiten_Zaehler]^[Zeilen_Zaehler][j] := '\';
  48.           Inc(j);
  49.         END;
  50.         (* Längenbyte berechnen *)
  51.         Buch[Seiten_Zaehler]^[Zeilen_Zaehler][j]:= Zeile[i];
  52.         Inc(j);
  53.       END;
  54.       Buch[Seiten_Zaehler]^[Zeilen_Zaehler][0] := Chr(j-1);
  55.     END;
  56.  
  57.   BEGIN
  58.     Assign(E_Datei, E_Name);
  59.     {$I-}
  60.     Reset(E_Datei);
  61.     {$I+}
  62.     IF IOResult <> 0 THEN BEGIN
  63.       WriteLn('Eingabe-Datei nicht gefunden.');
  64.       Halt(1);
  65.     END;
  66.  
  67.     IF NOT EOF(E_Datei) THEN
  68.       Readln(E_Datei, Zeile);
  69.  
  70.     New(Buch[Seiten_Zaehler]);    (* Speicher reservieren *)
  71.     REPEAT
  72.       Zeile_kopieren;
  73.       Inc(Zeilen_Zaehler);
  74.       IF Zeilen_Zaehler > Max_Zeilen THEN BEGIN
  75.         Inc(Seiten_Zaehler);
  76.         New(Buch[Seiten_Zaehler]);
  77.         Zeilen_Zaehler := 1;
  78.       END;
  79.       Readln(E_Datei, Zeile);
  80.     UNTIL EOF(E_Datei);
  81.     FOR i := Zeilen_Zaehler TO Max_Zeilen DO
  82.       Buch[Seiten_Zaehler]^[i] := '';
  83.     Anzahl_Seiten := Seiten_Zaehler;
  84.  
  85.     Close(E_Datei);
  86.   END;
  87.  
  88.  
  89.   PROCEDURE Ausgabe_Erstellung;
  90.   VAR
  91.     Seiten_Nr, Anzahl_Blatt,
  92.     i                     : BYTE;
  93.  
  94.     PROCEDURE Vorspann_kopieren;
  95.     BEGIN
  96.       REPEAT
  97.         Readln(E_Datei, Zeile);
  98.         WriteLn(A_Datei, Zeile);
  99.       UNTIL EOF(E_Datei);
  100.       Close(E_Datei);
  101.       Reset(E_Datei);
  102.     END;
  103.  
  104.     PROCEDURE Seite_Ausgeben(Seite : BYTE);
  105.     VAR
  106.       j : BYTE;
  107.     BEGIN
  108.       FOR j := 1 TO Max_Zeilen DO BEGIN
  109.         Write(A_Datei, '(');
  110.         Write(A_Datei, Buch[Seite]^[j]);
  111.         WriteLn(A_Datei, ') show LF');
  112.       END;
  113.     END;
  114.  
  115.   BEGIN
  116.     Assign(E_Datei, 'HANDBUCH.INI');     (* Präambeldatei *)
  117.     Reset(E_Datei);
  118.  
  119.     Anzahl_Blatt := (Anzahl_Seiten + 3) DIV 4;
  120.            (* Jedes begonnene Blatt ist ein ganzes Blatt, *)
  121.            (* daher + 3!                                  *)
  122.  
  123.     (* -------------------------------------------------- *)
  124.     (* Ausgabe in zwei Dateien, damit man weiß, wo die    *)
  125.     (* Mitte ist und genügend Zeit zum Wechseln hat.      *)
  126.     (*                                                    *)
  127.     (* Die Ausgabe-Anweisungen sind bis auf die Be-       *)
  128.     (* rechnung der Seitennummern und die Dateinamen      *)
  129.     (* identisch, könnten also auch in einer gemeinsamen  *)
  130.     (* Prozedur codiert werden. Faktisch erzeugt die      *)
  131.     (* getrennte Codierung etwas weniger Maschinencode,   *)
  132.     (* weil Abfragen entfallen.                           *)
  133.  
  134.     (* --- 1.Datei -------------------------------------- *)
  135.  
  136.     A_Name := Name + '1.PS ';
  137.     Assign(A_Datei, A_Name);
  138.     Rewrite(A_Datei);
  139.  
  140.     Vorspann_kopieren;
  141.  
  142.       (* 'Quer', 'Links', 'Rechts' und 'showpage' sind in *)
  143.       (* der Präambeldatei definiert.                     *)
  144.  
  145.     FOR i := 1 TO Anzahl_Blatt DO BEGIN
  146.       WriteLn(A_Datei, 'Quer');
  147.       WriteLn(A_Datei, 'Links');
  148.       Seiten_Nr := i * 2;                          (* !!! *)
  149.       IF Seiten_Nr <= Anzahl_Seiten THEN
  150.         (* Falls die Seitenzahl nicht durch 4 teilbar ist *)
  151.         Seite_Ausgeben(Seiten_Nr);
  152.       WriteLn(A_Datei, 'Rechts');
  153.       Seiten_Nr := Anzahl_Blatt * 4 - i * 2 + 1;   (* !!! *)
  154.       IF Seiten_Nr <= Anzahl_Seiten THEN
  155.         Seite_Ausgeben(Seiten_Nr);
  156.       WriteLn(A_Datei, 'showpage');
  157.     END;
  158.     Close(A_Datei);
  159.  
  160.     (* --- 2. Datei ------------------------------------- *)
  161.  
  162.     A_Name := Name + '2.PS';
  163.     Assign(A_Datei, A_Name);
  164.     Rewrite(A_Datei);
  165.  
  166.     Vorspann_kopieren;
  167.  
  168.     FOR i := 1 TO Anzahl_Blatt DO BEGIN
  169.       WriteLn(A_Datei, 'Quer');
  170.       WriteLn(A_Datei, 'Links');
  171.       Seiten_Nr := 2 * (i + Anzahl_Blatt);
  172.       IF Seiten_Nr <= Anzahl_Seiten THEN
  173.         Seite_Ausgeben(Seiten_Nr);
  174.       WriteLn(A_Datei, 'Rechts');
  175.       Seiten_Nr := Anzahl_Blatt * 2 - 2 * i + 1;
  176.       IF Seiten_Nr <= Anzahl_Seiten THEN
  177.         Seite_Ausgeben(Seiten_Nr);
  178.       WriteLn(A_Datei, 'showpage');
  179.     END;
  180.     Close(A_Datei);
  181.  
  182.     (* -------------------------------------------------- *)
  183.  
  184.     Close(E_Datei);
  185.   END;
  186.  
  187.  
  188. BEGIN                    (* Hauptprogramm *)
  189.   Zeilen_Zaehler := 1;
  190.   Seiten_Zaehler := 1;
  191.   Blatt_Zaehler  := 1;
  192.   Zeile          := '';
  193.   ClrScr;
  194.   WriteLn('HANDBUCH -- (c) 1991 Frank Stahl & TOOLBOX');
  195.   WriteLn;
  196.   Write('Name der Eingabe-Datei: ');
  197.   ReadLn(E_Name);
  198.   WriteLn;
  199.   Write('Ausgabe-Datei (bitte höchstens 7-stellig): ');
  200.   ReadLn(Name);
  201.  
  202.   Einlesen;
  203.   Ausgabe_Erstellung;
  204.  
  205. END.
  206. (* ------------------------------------------------------ *)
  207. (*                Ende von HANDBUCH.PAS                   *)
  208.