summaryrefslogtreecommitdiff
path: root/doc/user-manual
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2019-02-04 13:09:03 +0100
committerLars-Dominik Braun <lars@6xq.net>2019-02-04 13:09:03 +0100
commit04e68443040c7abad84d66477e98f93bed701760 (patch)
tree2b6202afae659e773bf6916157d23e83edfa44e3 /doc/user-manual
downloadeumel-src-04e68443040c7abad84d66477e98f93bed701760.tar.gz
eumel-src-04e68443040c7abad84d66477e98f93bed701760.tar.bz2
eumel-src-04e68443040c7abad84d66477e98f93bed701760.zip
Initial import
Diffstat (limited to 'doc/user-manual')
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil1924
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil10771
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil111072
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil12234
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil2628
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil32097
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil42306
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil5667
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6a1590
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6b1425
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil72469
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil81345
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil9936
-rw-r--r--doc/user-manual/1.7.3-pd/doc/source-disk1
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.1580
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.2443
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.32019
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.42242
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5a1446
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5b1632
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5c711
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5d211
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5e223
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.6474
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.anhang484
-rw-r--r--doc/user-manual/1.8.7/doc/source-disk1
26 files changed, 26931 insertions, 0 deletions
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil1 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil1
new file mode 100644
index 0000000..cdeca13
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil1
@@ -0,0 +1,924 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 1: Einführung
+
+Vorwort
+
+Lieber EUMEL-Nutzer!
+
+Ihnen liegt hier das EUMEL-Benutzerhandbuch zur Public-Domain-Version 1.7.3
+vor. Es gliedert sich in mehrere Teile. Der erste Teil des Benutzerhandbuchs
+soll dem zukünftigen Benutzer den "Einstieg" in das EUMEL-System erleichtern.
+Dazu werden die wichtigsten Eigenschaften des EUMEL-Systems vorgestellt.
+Danach zeigen wir eine Beispielsitzung. Anschließend werden einige
+prinzipielle Konzepte des EUMEL-Systems vermittelt. Den Abschluß bildet ein
+kleines EUMEL-Wörterbuch.
+
+Die übrigen Teile des EUMEL-Benutzerhandbuchs dokumentieren jeweils ein oder
+mehrere abgeschlossene Einheiten des Systems. Ein EUMEL-Nutzer braucht so nur
+die ihn interessierenden Teile zu lesen. Ein Programmierer z.B. sollte
+
+ Einführung, Supervisor/Monitor, Editor, ELAN-Compiler und Dateien
+
+durcharbeiten. Für Programmierer, die noch keine Erfahrung mit ELAN besitzen,
+ist der Teil "Erste Hilfe" gedacht. Weiterhin werden die Teile über Dateien
+und Standardpakete oft benötigt. Ein Nutzer, der vorwiegend an der Textbe-
+und verarbeitung interessiert ist, braucht dagegen nur
+
+ Einführung, Supervisor/Monitor, Dateien, Editor und Textkosmetik.
+
+Der OPERATOR/Spooler-Teil ist nur für diejenigen Programmierer gedacht, die
+ein EUMEL-System betreuen. Weitere Informationen finden System-Programmierer
+im System-Handbuch bzw. in der Veröffentlichung des Quellcodes.
+
+
+1. Eigenschaften des EUMEL-Betriebssystems
+
+Das EUMEL-Betriebssystem (Extendable multi User Microprocessor ELANsystem)
+ist ein Betriebssystem, das z.Z. für den Einsatz auf Mikroprozessoren vorge-
+sehen ist. Es weist u.a. folgende Eigenschaften auf:
+
+- Das EUMEL-System ist ein "Time sharing"-Betriebssystem, d.h. mehrere Be-
+ nutzer können gleichzeitig an einem Rechensystem arbeiten (z.B. Programme
+ übersetzen, bearbetten (rechnen) oder erstellen (edieren)). Dabei wird die
+ verfügbare Rechen- und Speicherkapazität zwischen den Benutzer-Prozessen
+ dynamisch aufgeteilt.
+
+- Jeder Benutzer richtet (mindestens) eine Task ein, in der er sich Programme
+ und/oder Dateien halten kann, auf die andere Nutzer nicht zugreifen können.
+ Tasks können von einem Terminal "abgekoppelt" und trotzdem - sofern aus-
+ reichend freie Rechnerkapazität zur Verfügung steht - als Batch-Auftrag im
+ Hintergrund weiter bearbeitet werden.
+
+- Das EUMEL-Betriebssystem ist so konzipiert, daß der Sicherheit des Systems
+ besondere Beachtung geschenkt wurde. Zu diesem Zweck werden in bestimmten
+ zeitlichen Abständen sogenannte Restart-Punkte auf dem externen Speicher-
+ medium gesichert. In diesen Sicherungen wird der augenblickliche System-
+ Zustand konserviert, so daß bei Netzausfall oder eventuellen System-Zu-
+ sammenbrüchen der Betrieb übergangslos wieder aufgenommen werden kann, mit
+ der Ausnahme des Verlustes der Daten, die nach dem letzten Restart-Punkt
+ aufliefen.
+
+- "Tasks" und/oder Dateien können vor dem unbefugten Zugriff durch "Pass-
+ words" geschützt werden. Ein weitergehender Schutz wird durch die Möglich-
+ keit von Password-Algorithmen vom EUMEL-System angeboten, so daß den Be-
+ langen des Datenschutzes Rechnung getragen werden kann.
+
+- Das EUMEL-Betriebssystem ist leicht erweiterbar. Da der Kern des Betriebs-
+ systems in ELAN geschrieben ist, können Anwender selbst leicht Erweiterun-
+ gen bzw. lokale Modifikationen in das System ein- bzw. anfügen. Dabei kön-
+ nen bestimmte Erweiterungen nur bestimmten Benutzern oder Benutzergruppen
+ zur Verfügung gestellt werden. Da die Programmiersprache ELAN selbst er-
+ weiterbar ist, ist es möglich, verschiedenen Anwendern oder -gruppen unter-
+ schiedliche Erweiterungen der Sprache anzubieten.
+
+- In dem EUMEL-Betriebssystem ist eine implizite Dateihierarchie realisiert.
+ Dies wird erreicht, indem den Tasks Dateien zugeordnet werden. Man kann
+ Dateien im Taskbaum von "Vater-Tasks" holen oder zu ihnen schicken. Lokale
+ Dateien werden mit dem Beenden einer Task automatisch gelöscht, während
+ Dateien, die längerfristig gehalten werden sollen, bei längerlebenden Tasks
+ gehalten werden müssen.
+
+- Die Kommandosprache ("job control language") des EUMEL-Systems entspricht
+ der ELAN-Syntax (Prozeduraufrufe). Das befreit den Anwender von der
+ Schwierigkeit, zwei verschiedenartige Sprachen zu erlernen. Darüber hinaus
+ können eine oder mehrere Anweisungen der Kommandosprache in ELAN-Programmen
+ enthalten sein. Z.B. ist es möglich, Kommandos vom Editor ausführen zu
+ lassen oder den Editor von einem Programm aus aufzurufen.
+
+- Die Dienstprogramme des EUMEL-Systems, wie z.B. der EUMEL-Editor, sind
+ geräteunabhängig und meist erweiterbar konzipiert. Zudem sind sie auch in
+ ELAN formuliert, so daß Änderungen und Korrekturen leicht vorgenommen
+ werden können.
+
+- Das EUMEL-System verwaltet seinen Hauptspeicher nach dem "demand-paging"-
+ Prinzip. Daten und/oder Programme werden daher in Seiten von 512 Bytes
+ aufgeteilt. Nur diejenigen Seiten, die zu einem Zeitpunkt wirklich benötigt
+ werden, befinden sich im Speicher. Dadurch kann sich das EUMEL-System auf
+ wechselnde Speicherplatz-Anforderungen optimal einstellen.
+
+- Für alle Programme wird reentranter Code erzeugt. Somit können mehrere
+ Benutzer Code gleichzeitig benutzen ("sharable code"), wobei der Code nur
+ einmal vorhanden sein muß. Dies ist insbesondere für Dienstprogramme wie
+ z.B. Compiler, Editor usw. wichtig.
+
+- Dateien können ebenfalls (wie Programme) von mehreren Benutzern gemeinsam
+ verwendet werden, ohne daß mehrere Kopien davon hergestellt werden müssen
+ Das System sorgt mit seinen Paging-Fähigkeiten automatisch für das "sharen"
+ von Dateien. Erfolgt jedoch ein Schreibzugriff, so wird nur für den
+ schreibenden Benutzer eine Kopie angelegt.
+
+- Das EUMEL-System bietet gute Textbe- und -verarbeitungsmöglichkeiten.
+ Grundlage dafür ist der bildschirmorientierte Editor (eine Entwicklung der
+ GMD). Der Editor erlaubt auch ein "multi window editing" und die Ausführung
+ von beliebigen Kommandos. Zusätzlich gibt es eine Reihe von Programmen zur
+ "Textkosmetik", die es erlauben, Texte zeilen- und seitenweise zu forma-
+ tieren. Dabei ist es möglich, unterschiedliche Schriftarten zu verwenden.
+
+
+2. Eine kleine Beispielsitzung mit EUMEL
+
+Zum ersten Kennenlernen wird hier ein Beispiel einer EUMEL-Sitzung darge-
+stellt. Diese Vorlage kann man am Rechner "nachspielen". Da die Reaktion des
+Systems hier auf dem Papier nur unvollkommen wiedergegeben werden kann, ist
+diese Beispielsitzung durch "trockenes" Lesen (ohne Rechner) sicherlich etwas
+schwieriger zu verstehen als durch Nachspielen.
+
+Alle Ausgaben des EUMEL werden mit
+
+---->
+
+gekennzeichnet, alle Benutzereingaben haben
+
+<----
+
+als Kennzeichen. Spezielle Tasten werden groß geschrieben, z.B.
+
+ RETURN
+
+als Bezeichnung für die RETURN-Taste.
+
+
+Anfang
+
+Im Multi-User-System können gleichzeitig mehrere Benutzer aktiv sein. Dabei
+braucht jeder ein eigenes "Zimmer" im "EUMEL-Haus", in dem er arbeiten kann,
+ohne andere zu stören. Diese "Zimmer" heißen hier "Tasks" und haben Namen.
+Zu Beginn muß der Benutzer sich an seinem Bildschirm eine Task erzeugen. Dazu
+muß er das Betriebssystem aktivieren:
+
+<---- SV
+
+EUMEL meldet sich: EUMEL Version 1.7.3/M
+
+----> gib supervisor kommando:
+
+Dann muß der Benutzer sich einen Tasknamen ausdenken (z.B. "ottokar") und
+ein Kommando zum Einrichten einer neuen Task geben:
+
+<---- begin ("ottokar") RETURN
+
+Daraufhin wird eine neue Task erzeugt, sie meldet sich:
+
+----> gib kommando:
+
+Jetzt kann die eigentliche Sitzung beginnen.
+
+
+Programm erstellen
+
+Wir schreiben ein kleines Programm zur Primzahlberechnung:
+
+<---- edit ("prim") RETURN
+
+----> neue datei einrichten (j/n) ?
+
+<---- j
+
+Es soll eine neue Datei mit dem Namen 'prim' eingerichtet werden, daher ant-
+worten wir mit 'j'. Die Datei ist zu Anfang leer. Der Editor zeigt nur die
+Überschrift, der restliche Bildschirm ist leer. Wir können jetzt unser Pro-
+gramm eingeben:
+
+ INT VAR zahl := 3 ;
+ WHILE zahl <= 1000 REP
+ drucke falls primzahl ;
+ zahl INCR 2
+ PER .
+
+ drucke falls primzahl :
+ INT VAR teiler := 3 ;
+ WHILE teiler * teiler <= zahl REP
+ IF teiler gefunden
+ THEN LEAVE drucke falls primzahl
+ FI ;
+ teiler INCR 2
+ PER ;
+ put (zahl) ;
+ line .
+
+ teiler gefunden :
+ zahl MOD teiler = 0 .
+
+Bei der Eingabe des Programms können wir auch die Funktionstasten benutzen.
+Die genauen Funktionen sind in den folgenden Teilen des Benutzerhandbuchs
+erklärt. Für den Anfang gilt aber: Probieren geht über Studieren!
+
+Wir verlassen den Editor:
+
+<---- ESC q
+
+----> gib kommando:
+
+
+Programm übersetzen und ausführen
+
+<---- run RETURN
+
+----> ("prim")
+
+Der Dateiname ('prim') wird automatisch ergänzt und das Programm wird vom
+ELAN-Compiler übersetzt. Dabei erscheinen die Nummern der gerade übersetzten
+Zeilen in der linken unteren Bildecke. Wenn keine Fehler gefunden wurden,
+wird das Programm anschließend ausgeführt. Dann sollten die Primzahlen von
+3 bis 1000 erscheinen.
+
+
+Ein fehlerhaftes Programm korrigieren
+
+Falls der ELAN-Compiler Fehler findet, wird das Programm nicht ausgeführt.
+Das System geht automatisch in den Editor, der jetzt zwei Dateien "parallel"
+auf dem Bildschirm zeigt. Die obere enthält die Fehlermeldungen, die untere
+das ELAN-Programm, so daß Korrekturen leicht möglich sind. Dabei kann man gut
+folgende Editor-Funktionen benutzen (ausprobieren!):
+
+ ESC ESC n RETURN positioniert auf Zeile n
+
+ HOP UNTEN
+ zum Blättern
+ HOP OBEN
+
+ ESC w wechselt zur jeweils anderen Datei (z.B. um in der
+ Fehlermeldungsdatei weiterzublättern)
+
+Nach Verlassen des Editors (ESC q) kann das Programm wieder gestartet werden.
+
+
+Ändern des Programms
+
+<---- edit RETURN
+
+----> ("prim")
+
+Auch hier wird der Dateiname zum Kommando 'edit' automatisch ergänzt. Jetzt
+kann das Programm mit den üblichen Editor-Möglichkeiten verändert werden.
+Vorschläge:
+
+ - Man ändere den Bereich (Vorsicht: maxint ist 32767).
+ - Man teste die Teiler bis zur Zahl selbst hoch.
+ - Man benutze REALs anstelle von INTs.
+ - Man suche Zwillinge.
+
+An Editor-Möglichkeiten könnte man ausprobieren:
+
+ RUBOUT löscht ein Zeichen.
+
+ RUBIN schaltet den Einfügezustand ein. Das nächste RUBIN
+ schaltet ihn wieder ab.
+
+ HOP UNTEN zum Anfang des Bildschirms oder "blättern nach oben".
+
+ HOP OBEN zum Ende des Bildschirms oder "blättern nach unten".
+
+ HOP RUBOUT am Zeilenanfang löscht die ganze Zeile.
+
+ HOP RUBIN schaltet "Zeilen einfügen" ein. Das nächste HOP RUBIN
+ schaltet es wieder aus.
+
+
+Datei löschen
+
+<---- forget RETURN
+
+----> ("prim")
+
+----> löschen (j/n) ?
+
+<---- j
+
+----> gib kommando:
+
+
+Ende einer Sitzung
+
+<---- end RETURN
+
+----> task loeschen (j/n) ?
+
+<---- j
+
+----> EUMEL Version 1.7.3 / M
+
+
+
+3. Einige Eigenschaften des EUMEL-Systems
+
+In diesem Abschnitt werden wir einige Eigenschaften des EUMEL-Systems
+schildern, die zum korrekten Arbeiten mit dem System wichtig sind. Um das
+Verständnis zu erleichtern, verwenden wir für einige System-Eigenschaften
+Modelle, die das Verhalten des Systems an typischen Merkmalen widerspiegeln
+spiegeln sollen, die aber - wie bei allen Modellen - kein exaktes Abbild
+darstellen.
+
+
+Tasks, Supervisor und Monitor
+
+Zuerst versuchen wir zu erklären, wie sich ein Benutzer im EUMEL-System
+anmeldet und den Mechanismus, wie man bestimmte Leistungen vom System
+anfordert (Einige Ideen dieses ersten Abschnittes gehen auf W. Ambros,
+Rhein-Sieg Gymnasium, St. Augustin, zurück).
+
+Stellen wir uns das EUMEL-System als ein riesiges Verwaltungsgebäude vor,
+wie es in unseren Städten in den letzten Jahren überall gebaut wurde. Ein
+Verwaltungsangestellter beginnt frohgemut seinen ersten Arbeitstag. Da das
+Gebäude so riesig ist, kann er sein Zimmer nicht finden. Aber er ist pfiffig:
+er fragt einfach den freundlichen Pförtner, der ihn in sein Zimmer führt.
+
+So ist es im EUMEL-System:
+Wenn man eine Arbeit neu beginnen will, muß man sich beim Supervisor (das ist
+der Pförtner in unserem Modell) anmelden. Dazu muß man erstmal den Supervisor
+"wecken" (wie mit einer Klingel): wir drücken die Supervisor-Taste (im
+folgenden mit SV abgekürzt). Der Supervisor meldet sich dann mit
+
+ gib supervisor kommando :
+
+Nun kann man eine Task anmelden. Das ist ein Zimmer im EUMEL-System, in dem
+man arbeiten kann, ohne von den anderen Benutzern gestört zu werden. Ist die
+Task noch nicht vorhanden, wird sie eingerichtet. Dann leitet uns der Super-
+visor in die angegebene Task.
+
+Der Verwaltungsangestellte ist nun vom Pförtner zu seinem Büro geleitet
+worden. Dort empfängt ihn der Bürovorsteher: "Was möchten Sie arbeiten?"
+Unser Angestellter kann nun (z.B.) sagen, daß er etwas schreiben möchte. Der
+Bürovorsteher führt ihn in einen speziellen Schreibraum, in dem einige
+spezielle Einrichtungen und Geräte für komfortables Schreiben stehen.
+
+So sieht es im EUMEL-System aus:
+Nachdem man eine neue Task eingerichtet hat oder eine bereits vorhandene
+fortsetzen will, gelangt man zum Monitor (das ist unser Bürovorsteher), der
+sich mit
+
+ gib kommando :
+
+meldet. Nun kann man verschiedene Arbeiten verrichten, wie z.B. den Editor
+rufen, um einen Text oder ein Programm zu schreiben:
+
+ edit ("meine datei")
+
+In diesem Schreibzimmer kann unser Angestellter irgendetwas schreiben, z.B.
+ein Programm, einen Liebesbrief, ein Testament oder ganz etwas anderes. Hat
+er eine Frage oder will er eine besondere Leistung, dann kann unser Ange-
+stellter den Bürovorsteher aus dem Schreibzimmer rufen. Hat er seine Schreib-
+arbeit beendet, geht er aus dem Zimmer und trifft dort wiederum auf den auf-
+merksamen Vorsteher. Ihm kann er nun sagen, daß er das Schriftstück (z.B.)
+drucken oder von einem Dolmetscher übersetzen lassen will.
+
+Im EUMEL-System:
+Im Editor schreibt man Texte oder Programme. Während man im Editor ist, kann
+man besondere Leistungen durch Kommandos anfordern, ohne den Editor zu ver-
+lassen, z.B. in einer anderen Datei nachschauen oder einen Teiltext in dem
+geschriebenen Schriftstück suchen. Nachdem die Arbeit beendet ist, verläßt
+man den Editor (ESC q) und gelangt wiederum in den Monitor. Hier kann man
+das Schriftstück drucken oder - im Falle eines Programms - übersetzen lassen:
+
+ print ("meine datei")
+ run ("meine datei")
+
+Hat das Programm einen Fehler, eröffnet uns der Monitor ein Fenster auf die
+Datei und zeigt uns gleichzeitig die Fehlermeldungen, so daß wir bequem
+korrigieren können.
+
+Nachdem unser Angestellter mit seinen Arbeiten fertig ist, kann er dem Vor-
+steher (Monitor) sagen:
+
+ Ich kündige! (will nicht mehr weiterarbeiten) ('end')
+ Bis Morgen! (will später weiterarbeiten) ('break')
+
+Merke: Der Supervisor des EUMEL-Systems regelt die Einrichtung, Zugang und
+ Löschung von Tasks. In einer Task kann ein Benutzer arbeiten, ohne
+ von anderen gestört zu werden. Spezielle Tasks sind für allgemeine
+ Aufgaben vorgesehen, wie z.B. das Drucken und Sichern von Dateien.
+ Durch den Monitor kann man Kommandos innerhalb einer Task geben.
+
+
+Demand Paging
+
+Nun versuchen wir einen zentralen Begriff des EUMEL-Systems zu erklären, das
+"demand paging". Diese Eigenschaft moderner Rechensysteme sorgt dafür, daß
+bei (normalerweise immer) beschränkten Speicherkapazitäten eines Rechners
+Programme bearbeitbar sind, die in ihrer Gesamtgröße nicht in den Speicher
+des Rechners passen würden.
+
+Nehmen wir wieder den Angestellten, der nun in einem Zimmer (Task) auf einem
+Tisch das EUMEL-Benutzerhandbuch durcharbeiten will. Stellen wir uns weiter
+vor, daß er das Benutzerhandbuch nicht rein "sequentiell" lesen will, sondern
+daß er fortwährend "blättern" muß. Eigentlich muß unser Angestellter mehrere
+Seiten des Benutzerhandbuchs gleichzeitig lesen. Deshalb kommt er auf die
+listige Idee, die Seiten, die er dringend benötigt, zu photokopieren und auf
+seinem Tisch nebeneinander auszubreiten, damit er nicht mehr blättern muß.
+Leider ist sein Tisch zu klein, um alle photokopierten Seiten darauf auszu-
+breiten. Durch die Sparbemühungen der Regierung ist es auch aussichtslos,
+sich um einen größeren Tisch zu bemühen. Aber im Titel für Verbrauchsmaterial
+ist genügend Geld vorhanden, so daß Papier für den Photokopierer angeschafft
+werden kann. Außerdem geht das Photokopieren sehr schnell, weil er den Photo-
+kopierer direkt neben seinen Tisch aufbaut. Darum photokopiert er nur die-
+jenigen Seiten, die er gerade benötigt und legt diese auf seinen Tisch.
+Braucht er eine neue Seite aus dem Buch und hat diese auf dem Schreibtisch
+keinen Platz mehr, so muß er eine auf dem Tisch liegende Seite entfernen.
+Geschickt wählt sich unser Angestellter eine Seite aus, von der er annimmt,
+daß er diese nicht so schnell wieder benötigt.
+
+Was macht er nun mit der "alten" Seite? Er könnte die kopierte Seite einfach
+in das Benutzerhandbuch einordnen. Aber dazu müßte er erstmal in dem Benut-
+zerhandbuch suchen, was ihm zuviel Mühe macht. Deshalb wirft er diese Seite
+einfach weg, denn er kann sie ja jederzeit wieder aus dem Handbuch kopieren.
+
+Gerade will er eine Seite wegwerfen, da fällt ihm auf, daß er das "Wegwerf"-
+Verfahren vielleicht nicht immer anwenden sollte. Seine Notizen, die er sich
+auf einigen Seiten gemacht hat, würden ja mit weggeworfen und damit ver-
+nichtet. Deshalb wirft er Seiten mit Notizen nicht weg, sondern tauscht diese
+Seiten mit den ursprünglichen Seiten im Benutzerhandbuch aus.
+
+Fassen wir zusammen:
+Jemand arbeitet ein Buch "durch". Er kopiert sich diejenigen Seiten, die er
+jeweils benötigt. Da sein Tisch zu klein ist, um alle Seiten gleichzeitig
+auszulegen, kann er immer nur einen Ausschnitt aus dem Buch bearbeiten, was
+aber ausreicht. Braucht er eine neue Seite, so muß er eine auf dem Tisch
+liegende Seite "verdrängen". Hat er diese Seite nicht verändert, also mit
+Notizen versehen, so kann er sie einfach wegwerfen. "Veränderte" Seiten
+ersetzt er im Buch und bewahrt sie somit auf.
+
+Ähnliches erfolgt auch im EUMEL-System:
+Der Zentralspeicher (der Tisch in unserem Modell) des Rechners ist meist ge-
+genüber dem Massenspeicher, der im EUMEL-System auch als "Hintergrund" be-
+zeichnet wird (Floppy oder Magnetplatte; in unserem Modell das Buch) zu
+klein, als daß alle Informationen gleichzeitig hineinpassen würden. Darum
+werden alle Informationen in sogenannte Seiten ("pages") unterteilt, die
+jeweils 512 Byte (ein Byte entspricht einem Zeichen) groß sind. Wird eine
+Information benötigt, so wird die betreffende Seite in den Speicher geholt
+(daher auch der Begriff "demand paging", etwa: Seitenaustausch auf An-
+forderung). Das geht so lange gut bis der gesamte Platz im Zentralspeicher
+des Rechners belegt ist. Soll nun eine neue Seite vom Massenspeicher geholt
+werden, weil die darin enthaltenen Informationen gebraucht werden, muß eine
+Seite im Zentralspeicher ersetzt werden (Fachwort: die Seite muß "verdrängt"
+werden). Sie kann überschrieben werden (in unserem Modell wurde sie "wegge-
+worfen"), wenn keine Veränderungen vorgenommen wurden, d.h. keine Schreibzu-
+griffe, sondern nur Lesezugriffe auf die Seite erfolgten. Wurde die Seite
+verändert, so muß sie auf den Hintergrund zurückkopiert werden und dort die
+ursprüngliche Seite ersetzen.
+
+
+Merke: Die Vorteile eines "demand paging" Systems sind nun offensichtlich:
+ Es ist möglich, bei weitem größere Informationsmengen (Daten und/oder
+ Programme) zu bearbeiten als diejenige, die eigentlich in den vor-
+ handenen Speicher passen würde, weil tatsächlich immer nur ein Aus-
+ schnitt der gesamten Informationsmenge zu einem Zeitpunkt bearbeitet
+ werden muß. Bei traditionellen Systemen ist dagegen die maximale Größe
+ von Programmen und Daten durch die physikalische Größe des Zentral-
+ speichers beschränkt.
+
+
+Sharing
+
+Sharing bezeichnet die gemeinsame Nutzung von Seiten ("pages") durch mehr
+als einen Benutzer.
+
+Zurück zu unserem Angestellten: Dieser ist inzwischen fleißiger geworden und
+hat das gleiche Verfahren auf mehrere Bücher ausgedehnt, d.h. er kopiert sich
+diejenigen Seiten aus den Büchern, die er gerade benötigt. Bei der Ver-
+drängung einer Seite behält er sein altes (nicht sehr umweltfreundliches)
+Verfahren bei: nur die veränderten Seiten ersetzen die Original-Seiten in den
+Büchern (werden zurückgelegt), die anderen (nicht veränderten) weggeworfen.
+
+Aber auch andere Angestellte seines Büros haben ihn beobachtet, beneiden ihn
+um seine "geschickte" Arbeitstechnik und wollen mitarbeiten. Leider steht
+ihnen gemeinsam nur der eine Tisch zur Verfügung, der zudem in der Zwischen-
+zeit auch nicht größer geworden ist, weil die Sparmaßnahmen der Regierung
+noch immer anhalten. Darum müssen sie sich nun den einzigen Tisch teilen, auf
+dem sie ihre kopierten Seiten auslegen können.
+
+Im Laufe der Arbeit ergibt es sich, daß sie unterschiedliche Seiten der
+Bücher durcharbeiten müssen, weil sie verschieden schnell arbeiten, aber auch
+andere Arbeitsgebiete haben.
+
+Durch die unterschiedliche Arbeitsgeschwindigkeit ergibt es sich, daß ein
+Angestellter z.B. zu einem Zeitpunkt sich intensiv nur mit einer Seite be-
+schäftigt, ein anderer aber mehrere Seiten quasi gleichzeitig braucht. Aber
+oft brauchen mehrere Angestellte mehrere Seiten, so daß der verfügbare Platz
+auf dem Tisch bald etwas zu eng wird. Natürlich "funktioniert" unser Ver-
+fahren immer noch, aber es ist doch etwas langsam geworden, weil unsere
+Angestellten mehr mit dem Austausch von Seiten beschäftigt sind, als daß sie
+noch zu dem Verarbeiten der gelesenen Informationen kommen. Sie überlegen
+also, wie das Verfahren zu verbessern ist und kommen auf folgenden Trick:
+kopierte Seiten, die zwei oder mehr Angestellte zur gleichen Zeit bearbeiten
+wollen, brauchen nur einmal auf dem Tisch zu liegen (schließlich sind unsere
+Angestellten gewöhnt, in Gruppen zu arbeiten). Diese Rationalisierungs-Idee
+ist ja offensichtlich, denn schließlich benutzen die Angestellten die Bücher
+auch gemeinsam. Aber Vorsicht: wenn einer der Angestellten, die gemeinsam
+eine Seite bearbeiten, sich etwas auf dieser Seite notieren will, darf nicht
+die gemeinsam auf dem Tisch liegende Seite verwendet werden. In diesem Fall
+ist es notwendig, vorher eine erneute Kopie zu machen, weil andere Ange-
+stellte seine Notizen nicht unbedingt mitlesen sollen, also die unveränderte
+Seite brauchen.
+
+Und das findet im Rechner statt:
+Das "demand paging" Verfahren funktioniert natürlich nicht nur mit einer
+Datei und einem Programm, sondern auch mit mehreren Dateien und Programmen,
+von denen nur diejenigen Seiten in den Zentralspeicher geholt werden, die zu
+einem Zeitpunkt in den Rechner passen. Aber erst mit mehreren Benutzern des
+EUMEL-Systems entfaltet das "demand paging" Verfahren seine volle Mächtig-
+keit, denn alle Benutzer können Programme und/oder Dateien verarbeiten, die
+in der Gesamtheit nicht in den Speicher passen würden. Dabei wird eine Eigen-
+schaft des EUMEL-Systems gut genutzt: Alle Programme des EUMEL-Systems (und
+übrigens alle Programme, die der ELAN-Compiler übersetzt hat) sind reentrant,
+d.h. können von mehreren Benutzern gleichzeitig gelesen werden, aber brauchen
+nur einmal im Zentralspeicher vorhanden zu sein. Zwei oder mehr Benutzer
+können also eine oder mehrere Seiten gemeinsam verwenden (Fachausdruck:
+"sharen"), sowohl im Zentralspeicher wie auch im Massenspeicher ("Hinter-
+grund"). Dies gilt nicht nur für Programme, sondern auch für Daten. Erst
+wenn ein Benutzer eine Veränderung vornimmt, also schreibend auf die Seite
+zugreift, wird diese Seite (nur für diesen Benutzer!) kopiert (EUMEL-Fachaus-
+druck: "copy on write"). Alle anderen Benutzer arbeiten mit der unveränderten
+Seite weiter. Der große Vorteil dieses Verfahrens: eine redundante
+Speicherung von Daten und Programmen wird vermieden.
+
+Es passiert nun oft, daß ein Benutzer zu einem Zeitpunkt relativ wenig Seiten
+benötigt: sei es, daß er Daten mit Hilfe des Editors eingibt oder nachdenkt,
+sei es, daß ein Programm wenig Daten verwendet und selbst sehr kurz ist. Mit
+anderen Worten: die Anzahl der benötigten Seiten zu einem Zeitpunkt (Fachaus-
+druck: "working set") für diesen Benutzer ist klein. Dann ist es möglich, daß
+andere Benutzer zu diesem Zeitpunkt mehr Seiten im Zentralspeicher des Rech-
+ners haben. Deren "working set" ist also groß.
+
+Merke: Damit wird ein weiterer Vorteil des "demand paging" Verfahrens klar:
+ Ein "demand paging" System stellt sich automatisch und dynamisch auf
+ die Anforderungen von Benutzern ein, indem denjenigen Benutzern mehr
+ Speicher zugeteilt wird, die mehr benötigen und umgekehrt. Aber auch
+ ein Nachteil wird sichtbar: Benötigen alle Benutzer des Systems viel
+ Zentralspeicher, dann kann es zu folgender Situation kommen: Benutzer
+ A benötigt eine neue Seite. Das System verdrängt für diesen Zweck eine
+ Seite, die Benutzer B gehört. Nachdem Benutzer B an die Reihe kommt,
+ benötigt er diese Seite wieder. Das System verdrängt eine Seite des
+ Benutzers A u.s.f.. Eine solche Situation, in der "pages" ständig in
+ den Speicher kopiert und aus dem Speicher bei einer Seitenverdrängung
+ auf den Hintergrund geschrieben werden muß (und somit kaum gerechnet
+ wird), wird als "thrashing" bezeichnet. "thrashing" oder mit anderen
+ Worten: sehr geringer Verbrauch an Rechenzeit bei gleichzeitig er-
+ höhtem "paging"-Aufwand ist ein Anzeichen für zu hohe Anforderungen
+ an das System (Ausweg: Erweiterung des Hauptspeichers oder Be-
+ schleunigung des Hintergrundmediums (Platte statt Floppy) oder
+ Reduktion der Anforderungen).
+
+
+Datenräume
+
+Datenräume sind die Grundlage für Dateien im EUMEL-System.
+
+Zurück zu unseren Angestellten:
+Nachdem die Verbesserung vorgenommen wurde, daß sich zwei oder mehr Ange-
+stellte eine Seite auf dem Tisch "teilen", tritt sofort ein neues Problem
+auf. Es kann nun nämlich passieren, daß zwei Angestellte eine Original-Seite
+verändern und beide in dem gleichen Buch ersetzt werden müssen. Es befinden
+sich somit noch mindestens zwei andere mit Notizen versehene Seiten mit
+gleicher Seitennummer in einem Buch. Zu allem Unglück wurde die Original-
+Seite ersetzt, so daß andere Angestellte nur die mit Notizen versehene Seiten
+erhalten können. Was ist zu tun? Das Verfahren sollte doch beibehalten
+werden, denn schließlich ist eine totale Abkehr von Arbeitsvorgängen für
+Verwaltungsangestellte nicht denkbar.
+
+Als erste Idee kommt ihnen in den Sinn, einfach alle Bücher für alle Ange-
+stellten zu photokopieren. Dann kann es ja nicht zu einer solchen Kollision
+kommen, daß zwei oder mehr Angestellte eine Seite in einem Buch ersetzen
+wollen, weil jeder Angestellte seine eigene Kopie besitzt. Um die ver-
+schiedenen Kopien eines Buches auseinander zu halten, wird von den Ange-
+stellten verlangt, ihre Buch-Kopie mit einem sinnvollen Namen zu versehen.
+Dies Verfahren funktioniert auch eine Weile, bis ein strebsamer Angestellter
+einen Verbesserungsvorschlag macht, der prompt mit DM 5,- honoriert wird:
+wie bereits mit den Seiten auf dem Tisch geschehen, ist es ja nicht not-
+wendig, die Bücher zu photokopieren, sondern nur die mit Notizen versehenen
+in einen Ordner, der entsprechend einer Buch-Kopie angelegt wird, einzu-
+ordnen. Alle anderen, nicht veränderten Seiten können noch immer gemeinsam
+benutzt werden.
+
+Und so funktioniert es nun:
+Bei Arbeitsbeginn finden die Angestellten einen Buchbestand vor. Um mit einem
+Buch arbeiten zu können, muß ein Angestellter einen Ordner für dieses Buch
+anlegen, in den die ggf. veränderten Seiten eingeordnet werden. Zu diesem
+Zweck muß jeder Ordner einen sinnvollen Namen erhalten, damit die Angestell-
+ten ihre Ordner auch wiederfinden. Am Anfang müssen die Angestellten Seiten
+der Original-Bücher kopieren. Wird eine solche Seite mit Notizen versehen,
+also verändert, muß sie bei einer Verdrängung in den entsprechenden Ordner
+eingefügt werden. Muß ein Angestellter eine neue Seite kopieren, so schaut
+er erst in seinem Ordner nach, ob sich die entsprechende Seite dort befindet.
+Damit wird garantiert, daß jeder Angestellte auch immer seine, mit Notizen
+versehene Seiten erhält. Befindet sich eine gesuchte Seite nicht in dem
+Ordner (am Arbeitsbeginn ist ein Ordner natürlich immer leer), so kopiert er
+sich eine Seite aus dem entsprechenden Original-Buch.
+
+In der Zwischenzeit passiert folgendes im Rechner:
+Eine Sammlung von Daten und/oder Programmen wird im EUMEL-System ein "Daten-
+raum" ("dataspace") genannt. Erhält ein Datenraum einen Namen, so wird
+dieser Datenraum eine Datei ("file") genannt. Angenommen, es existiert im
+System eine Datei mit dem Namen 'Mist', die ein Angestellter mit dem Namen
+'Krümel Monster' erstellt hat. Ein anderer Benutzer mit dem Namen 'Grobi'
+will mit dieser Datei arbeiten. Grobi kopiert sich also diese Datei und gibt
+ihr den Namen 'Grobis Mist'. Durch diese Kopier-Operation wird ein neuer
+Datenraum angelegt, der aber anfänglich nur Verweise auf den Datenraum ent-
+hält, der sich unter dem Namen 'Mist' verbirgt. Der Datenraum bzw. die
+Seiten, die in Datei 'Mist' enthalten sind, werden also "geshared", d.h. von
+mehreren Benutzern gemeinsam verwendet (in unserem Beispiel von Grobi und
+Krümel Monster). Es erfolgt also eine logische Kopie, aber keine physika-
+lische!
+
+Will der Angestellte Grobi nun eine Seite der Datei 'Grobis Mist' verwenden,
+so erhält er natürlich die entsprechende Seite aus der Datei 'Mist'. Ver-
+ändert der Angestellte Grobi nun eine Seite, so wird diese veränderte Seite
+in dem Datenraum vermerkt, der unter dem Namen 'Grobis Mist' ansprechbar ist.
+Davon merkt der Benutzer 'Krümel Monster' natürlich nichts, denn er arbeitet
+mit den Seiten seines Datenraums weiter, die unverändert geblieben sind. Aber
+auch Grobi merkt nichts davon, daß Seiten soweit wie möglich gemeinsam be-
+nutzt werden.
+
+Merke: Durch das Konzept der Datenräume und Dateien (die nichts anderes sind
+ als benannte Datenräume), ist es möglich, auch Daten von verschiedenen
+ Programmen her gemeinsam zu benutzen und somit eine redundante
+ Speicherung überflüssig zu machen. Programme sind ebenfalls in Daten-
+ räumen gespeichert, so daß einer gemeinsamen Benutzung von z.B.
+ Systemprogrammen durch mehrere Nutzer nichts im Wege steht.
+
+
+
+Fixpunkte
+
+In gewissen Zeitabständen wird der gesamte Systemzustand eines EUMEL-Systems
+gespeichert ("Fixpunkt"). Bei eventuell auftretenden Störungen kann dadurch
+immer bei dem letzten Fixpunkt mit der Verarbeitung fortgefahren werden.
+
+Zurück zu unseren Angestellten, die typischerweise dieses komische System
+weiter benutzen: Es passiert zum ersten Mal ein entsetzliches Unglück:
+während im Sommer mehrere Fenster geöffnet wurden, betritt der "reitende"
+Bürobote das Zimmer und alle Seiten werden von den Tischen und aus allen
+offenen Ordnern herabgeweht. Da unsere Angestellten - wie man sich leicht
+vorstellen kann - etwas vergeßlich sind, können sie nicht mehr rekon-
+struieren, welche Seiten auf den Tischen und welche sich in den Büchern bzw.
+Ordnern befanden. Die Arbeit von mehreren Monaten ist somit verloren!
+
+Deshalb werden Sicherheitsmaßnahmen getroffen:
+In regelmäßigen Zeitabständen müssen alle Angestellten ihre Arbeit unter-
+brechen. Dann wird von einem - extra dazu abgestellten - Angestellten Listen
+angelegt, in denen die Seiten auf dem Tisch, den Ordnern und den Büchern
+vermerkt wird. Im Falle eines erneuten Unglücks braucht man also nur die
+letzte dieser Listen zu konsultieren, um eine gesicherte Arbeitssituation
+herzustellen. Allerdings ist in einem solchen Fall diejenige Arbeit verloren,
+die in der Zwischenzeit seit der Erstellung der letzten Liste geleistet
+wurde. Aber das wird ja gerne in Kauf genommen, weil überhaupt weitergemacht
+werden kann und nicht die gesamte Arbeit verloren ist.
+
+Merke: In gewissen (einstellbaren, typisch: 15 Minuten) Zeitabständen wird
+ vom EUMEL-System der gesamte Zustand des Systems gesichert. Diese
+ Sicherung wird "Fixpunkt" genannt. Dazu ist es notwendig, daß die
+ Verarbeitung der Programme kurz (z.Z. 0.2 Sek.) unterbrochen wird,
+ was sich jedoch meist nicht besonders störend auswirkt. Damit ist es
+ aber sichergestellt, daß bei einem Stromausfall, Hardware- oder Soft-
+ warestörungen immer zu einem Zeitpunkt in der Verarbeitung "aufge-
+ setzt" werden kann, bei dem nur diejenigen Daten verloren sind, die
+ seit dem letzten "Fixpunkt" aufliefen.
+
+
+
+Archiv
+
+Ein weiteres Sicherungsmittel im EUMEL-System ist das Archiv, mit welchem
+man Dateien (also Daten und/oder Programme) extern zum EUMEL-System
+speichern kann.
+
+Verlassen wir nun lieber unsere Angestellten. Dieses Modell würden wir sonst
+übermäßig strapazieren. Wenden wir uns vielmehr einem weiteren Sicherungs-
+mittel des EUMEL-Systems zu, dem EUMEL-Archiv. Mit Hilfe des EUMEL-Archivs
+ist es möglich, Dateien auf Floppies zu schreiben und somit außerhalb des
+EUMEL-Systems aufzubewahren. Es ist nun möglich, mehrere Dateien auf einer
+Floppy zu speichern. Bloß wie funktioniert das?
+
+Ein gutes Modell des EUMEL-Archivs stellt ein Tonband oder eine Musikkassette
+dar. Auf diesen werden die Musikstücke (unsere Dateien) nacheinander (Fach-
+ausdruck: "sequentiell") aufgezeichnet, d.h. neue Musikstücke (Dateien)
+können immer nur angefügt werden. Ist das Tonband oder die Kassette voll
+beschrieben, so schaltet das Gerät meist automatisch ab. Im EUMEL-System
+gibt's in solchen Fällen eine Fehlermeldung.
+
+Unterschiedlich zu einem Tonband ist jedoch, daß im EUMEL-System die Namen
+der Dateien mit abgespeichert werden und diese Dateien - durch die Angabe
+des Dateinamens - gezielt vom Archiv gelesen werden können. Bei einem Ton-
+band oder einer Kassette muß man sich erst alle Musikstücke anhören, bis
+das Musikstück erreicht ist, welches benötigt wird. Dieses "sequentielle"
+Überlesen nicht benötigter Dateien erledigt das EUMEL-System "automatisch".
+
+Im EUMEL-System gibt es nun nicht nur die Möglichkeit, eine Datei auf ein
+Archiv zu schreiben oder von einem Archiv zu lesen, sondern auch mehrere Da-
+teien mit einem Kommando zu lesen oder zu schreiben. Zusätzlich ist es mög-
+lich, ein Archiv zu löschen (und dann ggf. neu zu beschreiben), wenn die
+"archivierten" Dateien nicht mehr benötigt werden.
+
+Nun passiert es oft, daß eine bereits archivierte Datei verändert wird und
+nochmals auf das Archiv geschrieben werden soll. Aber durch eine Veränderung
+der Datei hat diese gerade ihren Platzbedarf verändert. Somit könnte die
+Datei - sofern sie sich vergrössert hat - eine nachfolgende Datei auf dem
+Archiv u.U. teilweise überschreiben. Deshalb wurde im EUMEL-Archiv folgende
+Vereinbarung getroffen: Wird eine Datei nochmals auf ein Archiv geschrieben,
+so wird die Datei, die sich bereits auf dem Archiv befindet, als "ungültig"
+gekennzeichnet und die neue Version an das Ende angefügt. Nur wenn die alte
+Datei die letzte auf dem Archiv ist, wird sie von der neuen Version über-
+schrieben.
+
+Merke: Durch dieses Verfahren kann es zu einer kuriosen Situation kommen:
+ zwei Dateien werden abwechselnd auf ein Archiv in mehreren Versionen
+ geschrieben. Obwohl beide Dateien zusammengenommen bei weitem nicht
+ das Archiv auffüllen würden, kommt es zum Überlauf. In einem solchen
+ Fall muß man das Archiv löschen (wobei vorher die Dateien ggf. in das
+ System geholt werden müssen) und beide Dateien erneut auf das Archiv
+ schreiben.
+
+
+
+4. Kleines #ib#EUMEL-Wörterbuch
+
+In diesem Wörterbuch werden einige der Begriffe, die häufig in diesem Be-
+nutzer-Handbuch verwendet werden, erläutert. Bezüge auf weitere Begriffe,
+die in diesem Wörterbuch stehen, werden mit den Zeichen ">" und "<" ge-
+klammert.
+
+Anweisung: Direktive an die Textkosmetik, welche direkt in einen Text
+ geschrieben wird. Eine Anweisung muß in "\#" eingefaßt
+ werden. Beachte den Unterschied zu einem Kommando.
+
+Archiv: Ein Programmsystem, um Dateien des EUMEL-Systems auf
+ Floppys außerhalb des Systems zu speichern oder von dort
+ wieder in das EUMEL-System zu holen. Als Archiv wird auch
+ noch ein Speichermedium bezeichnet (in der Regel eine
+ Diskette).
+
+Benutzer-Task: Im Gegensatz zu einer >System-Task< ist eine Benutzer-Task
+ eine Task, die von einem Benutzer erzeugt worder ist. Sie
+ ist entweder an ein Terminal gekoppelt oder kann unab-
+ hängig von einem Terminal im Hintergrund bearbeitet werden.
+
+BOUND: Attribut von Variablen, das bei einer Deklaration vor die
+ Typangabe gesetzt wird. Dient zur Aufprägung eines Daten-
+ typs auf einen Datenraum.
+
+DATASPACE: Eine Datei ohne Namen.
+
+Datenraum: Siehe >DATASPACE<.
+
+Editor: Programm zur Eingabe und Veränderung von Texten, Daten und
+ Programmen.
+
+ELAN: Programmiersprache des EUMEL-Systems ("ELementary
+ LANguage").
+
+ELAN-Compiler: Ein Programm, welches ein korrektes ELAN-Programm in ein
+ äquivalentes, ablauffähiges Programm (im >EUMEL0-Code<)
+ übersetzt.
+
+EUMEL0-Code: Maschinensprache des EUMEL-Systems.
+
+EUMEL-Drucker: Programm zur Ansteuerung von (unterschiedlichen) Druckern.
+ Der EUMEL-Drucker wird durch Kommandos gesteuert und er-
+ laubt es, unterschiedliche Drucker mit verschiedenartigen
+ Leistungen immer gleich anzusprechen.
+
+EUMEL-Standard: Objekte (also Datentypen, Prozeduren und/oder Operatoren),
+ die durch Pakete realisiert werden und standardmässig in
+ jedem EUMEL-System verfügbar sind.
+
+Fixpunkt: Speicherung des aktuellen Systemzustandes in regelmäßigen
+ Abständen. Bei Hardware- oder Softwarestörungen kann immer
+ bei der letzten Fixpunkt-Sicherung aufgesetzt werden.
+
+Hintergrund-Task: Eine >Task<, die nicht an ein Terminal angekoppelt ist
+ (d.h. einem Benutzer nicht direkt zugänglich), aber trotz-
+ dem vom System bearbeitet wird oder im Wartezustand ist
+ (warten auf einen Auftrag oder eine Ein/Ausgabe-Operation).
+
+Kommando: Ein ELAN-Programm, welches in der Regel aus einem
+ Prozeduraufruf besteht. Ein Kommando kann vom >Monitor<
+ oder Editor gegeben werden. Kommandos können ebenfalls in
+ Programmen verwandt werden.
+
+Lokale Dateien: Dateien einer Benutzer-Task.
+
+Manager: Eine >Task<, die auf Aufträge wartet. Beispiele sind die
+ Spool-Task bzw. Datei-Manager. Letzterer wird für die
+ Haltung längerfristig benötigter Dateien gebraucht.
+
+Monitor: Der Monitor steuert die Kommunikation zwischen einem
+ Benutzer am Terminal und dem EUMEL-Betriebssystem, nachdem
+ der Benutzer sich mit Hilfe des >Supervisors< eine Task
+ erschaffen hat. Die Monitor-Kommandos beziehen sich immer
+ auf die angekoppelte Benutzer-Task.
+
+paging: Benötigte Informationen werden in Einheiten ("pages") in
+ den Zentralspeicher des Rechners geladen. Somit ist es
+ möglich, bei weitem größere Informationsmengen zu ver-
+ arbeiten, als auf einmal in den Speicher des Rechners
+ passen.
+
+OPERATOR: >Task<, mit der das EUMEL-System u.a. gestartet, "abge-
+ schaltet" und gesichert werden kann.
+
+Scanner: Programm, um aus einem Text lexikalische Elemente ("Le-
+ xeme") herauszublenden. In dem im >EUMEL-Standard<
+ implementierten Scanner werden Lexeme nach der ELAN-Syntax
+ erkannt, redundante Leerzeichen (nicht in Texten) sowie
+ Kommentare überlesen.
+
+Sendungs-Vermittlung: Steuerung der Übermittlung von Informationen zwischen
+ verschiedenen >Tasks<.
+
+sharing: >Datenräume< und/oder >pages< können von mehreren Benutzern
+ gleichzeitig benutzt werden. Erst bei einer Schreibopera-
+ tion eines Benutzers wird nur für diesen Nutzer eine Kopie
+ der Daten angelegt. ("copy on write").
+
+Spooler: Systemprogramm des EUMEL-Systems, welches Druckaufträge
+ zwischenspeichert, so daß unmittelbar weiter gearbeitet
+ werden kann.
+
+Supervisor: Kern des EUMEL-Betriebssystems auf der ELAN-Ebene zum Ver-
+ walten von Tasks.
+
+Supervisor-Kommando: Kommando zur Steuerung (An-/Abkoppeln, Erzeugen,
+ Benutzung) einer >Benutzer-Task<.
+
+System-Task: Eine >Task<, die für Aufrechterhaltung, Betrieb und Steu-
+ erung des EUMEL-Systems benötigt und nicht von einem
+ Benutzer erzeugt wird, sondern "immer" im >Taskbaum<
+ vorhanden ist.
+
+Task: Eigenständiger Prozeß (Auftrag) im EUMEL-System.
+
+Taskbaum: Eine baumförmige Anordnung von >Tasks<, in die jede Task
+ des EUMEL-Systems eingefügt wird. Dabei hat jede Task
+ - mit Ausnahme des >Urvaters< - eine >Vater-Task<, und
+ kann weitere Tasks erzeugen ("Söhne").
+
+Textkosmetik: Programme des EUMEL-Systems, die die Gestaltung eines
+ Textes erlauben.
+
+Urvater: Wurzel des >Task-Baums< mit dem Namen 'UR'.
+
+Vater-Dateien: Dateien einer >Vater-Task<.
+
+Vater-Task: Eine >Task<, die einer Task in direkt aufsteigender Linie
+ im >Taskbaum< übergeordnet ist. Es wird dabei zwischen
+ einer "unmittelbaren" (die direkt übergeordnete Vater-Task)
+ und "mittelbaren" Vater-Tasks (Vater-Tasks, die über die
+ unmittelbare Vater-Task erreichbar sind) unterschieden.
+
+
+
+5. ELAN-Literatur
+
+Bittner, M., Jäckel, J., Jähnichen, S.:
+ ELAN - Beispielsammlung.
+ Institut für angewandte Informatik,
+ Fachbereich 20, TU Berlin,
+ Berlin, 1979
+
+Hahn, R.:
+ Höhere Programmiersprachen im Vergleich.
+ Akademische Verlagsgesellschaft,
+ Wiesbaden, 1981
+
+Hahn, R., Nienaber, B.:
+ Probleme lösen mit dem Computer.
+ Teil 1: Einführung in die algorithmische Problemlösung.
+ Teil 2: Werkzeuge und Methoden.
+ Neuer Verlag Bernhard Bruscha,
+ Tübingen, 1978
+
+Hahn, R., Stock, P.:
+ ELAN - Handbuch.
+ Akademische Verlagsgesellschaft,
+ Wiesbaden, 1979
+
+Hommel, G., Jäckel, J., Jähnichen, S., Kleine, K., Koch, W., Koster, K.:
+ ELAN - Sprachbeschreibung.
+ Akademische Verlagsgesellschaft,
+ Wiesbaden, 1979
+
+Hommel, G., Jähnichen, S., Koch, W.:
+ SLAN - Eine erweiterbare Sprache zur Unterstützung der strukturierten
+ und modularen Programmierung.
+ 4. GI Fachtagung Programmiersprachen in Erlangen,
+ Springer Verlag, 1976
+
+Hommel, G., Jähnichen, S., Koster, C.H.A.:
+ Methodisches Programmieren.
+ De Gruyter, Berlin, 1983
+
+Klingen, L., Liedtke, J:
+ Programmieren mit ELAN
+ Teubner, Stuttgart, 1983
+
+Liedtke, J.:
+ EUMEL - Ein ELAN-System für Mikroprozessoren.
+ GMD-Spiegel,
+ Bonn, 1979
+
+Voila, H.T.:
+ A new computer routine for the generation of publishable data from
+ nothing.
+ Computer Quickies 48, 117 (1984)
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil10 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil10
new file mode 100644
index 0000000..0f3b656
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil10
@@ -0,0 +1,771 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 10: Graphik
+
+1. Übersicht
+
+Dieser Teil des Benutzer-Handbuchs beschreibt die Graphik-Möglichkeiten des
+EUMEL-Systems. Die Graphik-Pakete gehören nicht zum EUMEL-Standard, sondern
+sind Anwenderpakete, die im Quellcode ausgeliefert und von jeder Instal-
+ation in das System aufgenommen werden können. Unter Umständen müssen
+Programme erstellt werden, die die Anpassungen für spezielle graphische
+Geräte einer Installation vornehmen.
+
+Das Graphik-System ermöglicht es, durch ELAN-Programme geräteunabhängige
+Informationen für Zeichnungen ("Graphiken") zu erstellen. Die Graphik
+erzeugenden Programme brauchen dabei keine gerätespezifischen Größen sowie
+gerätespezifischen Unterprogramme zu enthalten. Sie befassen sich somit
+ausschließlich mit der Erzeugung der problemorientierten Information für die
+Konstruktion einer Zeichnung. Nach der geräteunabhängigen Erzeugung einer
+Graphik kann diese auf unterschiedlichen Geräten ausgegeben werden (z.B.
+erst auf einem Terminal zur Kontrolle und dann auf einem Plotter).
+
+Die EUMEL-Graphik umfaßt zwei- und dreidimensionale Graphik. Dabei ent-
+spricht die Y-Achse bei der zweidimensionalen Graphik der Z-Achse (Höhe) bei
+der dreidimensionalen Graphik. Im dreidimensionalen Fall sind perspektivi-
+sche, orthografische und schiefwinklige Projektionen mit beliebigen Betrach-
+tungswinkeln möglich.
+
+Bei der EUMEL-Graphik wird streng zwischen Erzeugung und Manipulation von
+Graphiken (Bildern) auf der einen und Darstellung der erzeugten Bilder auf
+der anderen Seite unterschieden. Für die Erzeugung und Manipulation der
+Graphiken existiert der Typ PICTURE, für die Darstellung der Bilder gibt es
+den Typ PICFILE. Dabei müssen Ausschnitt, Maßstab, Betrachtungswinkel und
+Projektionsart erst bei der Darstellung festgelegt werden. Diese Kon-
+struktion des Graphik-Systems hat folgende Vorteile:
+
+a) Programme, die Graphik-Informationen erzeugen, sind geräteunabhängig.
+ Das bedeutet, daß Programmierer sich ausschließlich mit einem logischen
+ Problem zu befassen brauchen und nicht mit gerätespezifischen Besonder-
+ heiten.
+
+b) Graphiken können auf mehreren unterschiedlich gearteten Geräten mehrmals
+ dargestellt werden, ohne daß das erzeugende Programm geändert oder neu
+ gestartet werden muß. Z.B. kann ein Programmierer eine Graphik erst auf
+ dem Terminal auf Richtigkeit und Größenverhältnisse überprüfen, bevor er
+ die Zeichnung auf einem Plotter zeichnen läßt.
+
+c) Graphiken können leicht geändert (z.B. vergrößert oder in eine Richtung
+ gestreckt) werden, ohne daß das erzeugende Programm erneut durchlaufen
+ werden muß. Zudem können Graphiken aneinander oder übereinander gelegt
+ werden.
+
+d) Graphiken mit unterschiedlichen Farben, Strichen usw. können leicht er-
+ zeugt werden.
+
+e) Der Anschluß von neuen Graphik-Geräten durch Benutzer ist leicht möglich,
+ ohne daß die Graphik erzeugenden Programme modifiziert werden müssen.
+
+f) Plotter können wie Drucker an einen SPOOLER gehängt werden.
+
+g) Bilder können als PICFILEs gespeichert und versandt werden.
+
+
+
+Erzeugung von Bildern
+
+Bilder entstehen in Objekten vom Datentyp
+
+ PICTURE
+
+Diese müssen mit der Prozedur
+
+ nilpicture
+
+initialisiert werden. Sie enthalten dann ein leeres Bild, dessen Dimension
+noch nicht festgelegt ist. Die Dimension eines PICTUREs wird mit dem ersten
+Schreibzugriff ('move' oder 'draw') festgelegt. Ein PICTURE kann immer nur
+entweder zwei- oder dreidimensional sein. Außerdem kann einem PICTURE mit
+der Prozedur
+
+ pen
+
+genau ein virtueller Stift zugeordnet oder der aktuelle Stift erfragt werden.
+
+Die Erzeugung eines Bildes basiert auf dem Modell eines Plotters. Der (vir-
+tuelle) Zeichenstift kann mit
+
+ move
+
+ohne zu zeichnen an beliebige Stellen gefahren werden (reine Positionierung).
+Mit
+
+ draw
+
+wird der Stift veranlaßt, eine Linie von der aktuellen zur angegebenen Ziel-
+position zu zeichnen. 'move' löst also Bewegungen mit gehobenem, 'draw'
+solche mit gesenktem Stift aus. Um auch 'relatives' Zeichnen zu ermöglichen,
+existiert die Prozedur
+
+ where
+
+die die aktuelle Stiftposition liefert.
+
+
+
+Manipulation von Bildern
+
+Erstellte Bilder können als Ganzes manipuliert werden. Die Prozeduren
+
+ translate (* verschieben *)
+ stretch (* strecken bzw. stauchen *)
+ rotate (* drehen *)
+ reflect (* spiegeln *)
+
+verändern jeweils das ganze Bild. Es ist aber auch möglich, mehrere Bilder
+zusammenzufügen. Mit
+
+ CAT
+
+kann ein weiteres Bild angefügt werden. Dabei müssen allerdings beide
+PICTURE die gleiche Dimension haben. In solchen als ganzes manipulierten
+Bildern kann man ohne Einschränkung mit 'draw' und 'move' weiterzeichnen.
+
+
+
+Darstellung
+
+Für die Darstellung der erzeugten Bilder existiert der Typ
+
+ PICFILE
+
+Dieser besteht aus max. 128 PICTUREs, die mit den Prozeduren
+
+ put
+ get
+
+eingegeben bzw. ausgegeben werden können. PICFILE wird durch Datenräume
+realisiert, deshalb erfolgt die Assoziation an einen benannten Datenraum
+ähnlich wie beim FILE. Dafür wird die Prozedur
+
+ picture file
+
+verwandt. Ein neuer PICFILE enthält genau ein leeres PICTURE. Die Darstel-
+lung der PICFILEs auf Zeichengeräten erfolgt mit der Prozedur
+
+ plot
+
+Da die Graphiken aber in "Weltkoordinaten" erzeugt werden und die spätere
+Darstellung vollkommen unbeachtet bleibt, müssen gewisse Darstellungspara-
+meter für die Zeichnung gesetzt werden. Diese Parameter werden im PICFILE
+abgelegt und gelten jeweils für den gesamten PICFILE. Dadurch ist es möglich,
+einen PICFILE mit spezifizierter Darstellungsart über einen SPOOLER an einen
+Plotter zu senden oder die bei der letzten Betrachtung gewählte Darstellung
+mit in dem PICFILE gespeichert zu halten. Für die Darstellung können den
+virtuellen Stiften mit der Prozedur
+
+ select pen
+
+reale Stifte zugeordnet werden. Voreingestellt ist für alle virtuellen
+Stifte: Standardfarbe, Standardstärke, durchgängige Linie.
+
+Indem man einigen virtuellen Stiften den leeren Stift als realen Stift zu-
+ordnet, kann man einzelne PICTUREs ausblenden. Sowohl bei der Darstellung
+von zwei- als auch dreidimensionaler Graphik kann die gewählte Zeichenfläche
+auf dem Endgerät mit der Prozedur
+
+ viewport
+
+festgelegt werden. Voreingestellt ist das Quadrat mit der größtmöglichen
+Seitenlänge, d.h. der kürzeren Seite der hardwaremäßigen Zeichenfläche.
+
+
+
+Darstellung zweidimensionaler Graphik
+
+Bei der Darstellung zweidimensionaler Bilder muß der zu zeichnende Ausschnitt
+(das 'Fenster') angegeben werden. Mit der Prozedur
+
+ window
+
+wird durch Angabe der minimalen und maximalen X- bzw. Y-Koordinaten ein
+Fenster definiert. Da das so definierte Fenster auf die ganze (mit 'viewport'
+definierbare) Zeichenfläche abgebildet wird, ist der Abbildungsmaßstab durch
+das Zusammenspiel von 'viewport' und 'window' bestimmt. Da bei 'viewport'
+standardmäßig das maximale Zeichenquadrat voreingestellt ist, wird in diesem
+Fall durch gleiche X- und Y-Fenstergröße eine winkeltreue Darstellung er-
+reicht.
+
+
+
+Darstellung dreidimensionaler Graphik
+
+Im dreidimensionalen Fall wird das Fenster ebenfalls mit
+
+ window
+
+definiert, wobei dann allerdings auch der Bereich der dritten Dimension
+(Z-Koordinaten) zu berücksichtigen ist. Da die dreidimensionale Graphik auf
+eine zweidimensionale Fläche projiziert wird, können aber noch weitere Dar-
+stellungsparameter angegeben werden. Der Betrachtungswinkel wird mit Hilfe
+der Prozedur
+
+ view
+
+angegeben. Zur Spezifikation der gewünschten Projektionsart gibt es
+
+ orthographic (* orthographische Projektion *)
+ perspective (* perspektivische Projektion,
+ der Fluchtpunkt ist frei wählbar *)
+ oblique (* schiefwinklige Projektion *)
+
+
+
+Beispiel (Sinuskurve)
+
+ funktion zeichnen;
+ bild darstellen .
+
+funktion zeichen :
+ PICTURE VAR pic :: nilpicture;
+ REAL VAR x := -pi;
+ move (pic, x, sin (x));
+ REP x INCR 0.1;
+ draw (pic, x, sin (x))
+ UNTIL x >= pi PER .
+
+bild darstellen :
+ PICFILE VAR p :: picture file ("sinus");
+ window (p, -pi, pi, -1.0, 1.0);
+ put (p, pic);
+ plot (p) .
+
+
+
+Beispiel (Würfel)
+
+ wuerfel zeichen;
+ wuerfel darstellen.
+
+wuerfel zeichnen :
+ zeichne vorderseite;
+ zeichne rueckseite;
+ zeichne verbindungskanten.
+
+zeichne vorderseite :
+ PICTURE VAR vorderseite :: nilpicture;
+ move (vorderseite, 0.0, 0.0, 0.0);
+ draw (vorderseite, 1.0, 0.0, 0.0);
+ draw (vorderseite, 1.0, 0.0, 1.0);
+ draw (vorderseite, 0.0, 0.0, 1.0);
+ draw (vorderseite, 0.0, 0.0, 0.0).
+
+zeichne rueckseite :
+ PICTURE VAR rueckseite :: translate (vorderseite, 0.0, 1.0, 0.0).
+
+zeichne verbindungskanten :
+ PICTURE VAR verbindungskanten :: nilpicture;
+ move (verbindungskanten, 0.0, 0.0, 0.0);
+ draw (verbindungskanten, 0.0, 1.0, 0.0);
+
+ move (verbindungskanten, 1.0, 0.0, 0.0);
+ draw (verbindungskanten, 1.0, 1.0, 0.0);
+
+ move (verbindungskanten, 1.0, 0.0, 1.0);
+ draw (verbindungskanten, 1.0, 1.0, 1.0);
+
+ move (verbindungskanten, 0.0, 0.0, 1.0);
+ draw (verbindungskanten, 0.0, 1.0, 1.0).
+
+wuerfel darstellen :
+ PICFILE VAR p := picture file ("wuerfel");
+ put (p, vorderseite);
+ put (p, rueckseite);
+ put (p, verbindungskanten);
+ window (p, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
+ view (p, 0.0, 40.0, 20.0);
+ orthographic (p);
+ plot (p).
+
+
+
+Beschreibung der Graphik-Prozeduren
+
+Zweidimensionale PICTUREs brauchen weniger Speicherplatz als dreidimensio-
+nale. Daher werden in einigen Fehlermeldungen unterschiedliche Größen ange-
+geben.
+
+:=
+ OP := (PICTURE VAR dest, PICTURE CONST source)
+ Zweck: Zuweisung
+
+ OP := (PICFILE VAR dest, DATASPACE CONST source)
+ Zweck: Assoziiert die PICFILE Variable 'dest' mit der DATASPACE CONST
+ 'source' und initialisiert die PICFILE Variable sofern nötig.
+ Fehlerfall:
+ * dataspace is no PICFILE
+ Der anzukoppelnde Datenraum hat einen falschen Typ.
+
+CAT
+ OP CAT (PICTURE VAR dest, PICTURE CONST source)
+ Zweck: Aneinanderfügen von zwei PICTURE's.
+ Fehlerfälle:
+ * OP CAT: left dimension <> right dimension
+ Es können nur PICTUREs mit gleicher Dimension angefügt werden.
+ * OP CAT: Picture overflow
+ Die beiden PICTURE überschreiten die maximale Größe eines Pictures.
+
+act picture
+ PICTURE PROC act picture (PICFILE VAR p)
+ Zweck: Liefert das PICTURE des PICFILEs 'p', auf das mit 'backward' o.ä.
+ positioniert wurde.
+
+backward
+ PROC backward (PICFILE VAR p)
+ Zweck: Positioniert den PICFILE 'p' um ein PICTURE zurück.
+ Fehlerfall:
+ * backward at begin of file
+ Es wurde versucht vor den Anfang des PICFILEs zu positionieren.
+
+draw
+ PROC draw (PICTURE VAR pic, REAL CONST x, y)
+ Zweck: Die Prozedur zeichnet in dem (zweidimensionalen) Bild 'pic' eine
+ Linie von der aktuellen Position zur Position (x, y).
+ Fehlerfälle:
+ * picture overflow
+ Zu viele Befehle in einem PICTURE (z. Zeit max. 1927)
+ * picture is three dimensional
+ Ein PICTURE kann nur entweder zwei- oder dreidimensional sein.
+
+ PROC draw (PICTURE VAR pic, REAL CONST x, y, z)
+ Zweck: Die Prozedur zeichnet in dem (dreidimensionalen) Bild 'pic' eine
+ gerade Linie von der aktuellen Position zur Position (x, y, z).
+ Fehlerfälle:
+ * picture overflow
+ Zu viele Befehle in einem PICTURE (z. Zeit max. 1310)
+ * picture is only two dimensional
+ Ein PICTURE kann nur entweder zwei- oder dreidimensional sein.
+
+ PROC draw (PICTURE VAR pic, TEXT CONST text)
+ Zweck: Der angegebene Text wird in das Bild 'pic' eingetragen. Der An-
+ fang ist dabei die aktuelle Stiftposition. Diese wird nicht ver-
+ ändert.
+ Fehlerfall:
+ * picture overflow
+ Der Text paßt nicht mehr in das PICTURE.
+
+ PROC draw (PICTURE VAR pic, TEXT CONST text, REAL CONST angle, height)
+ Zweck: Der angegebene Text wird unter dem Winkel 'angle' gegenüber der
+ Waagerechten und in der Größe 'height' in das PICTURE 'pic'
+ eingetragen. Der Anfang ist dabei die aktuelle Stiftposition.
+ Diese wird nicht verändert.
+ Fehlerfall:
+ * picture overflow
+ Der Text paßt nicht mehr in das PICTURE.
+
+ PROC draw (PICFILE VAR pic, REAL CONST x, y)
+ Zweck: Die Prozedur zeichnet in dem aktuellen (zweidimensionalen)
+ PICTURE des PICFILEs 'p' eine gerade Linie. Der (virtuelle) Stift
+ wird von der aktuellen Position zur Position (x, y) gefahren.
+ Falls das aktuelle PICTURE zu voll ist, wird automatisch auf das
+ nächste umgeschaltet.
+ Fehlerfälle:
+ * picfile overflow
+ Das letzte PICTURE ist voll (z. Zeit max. 128 PICTURE)
+ * picture is threedimensional
+ Das aktuelle PICTURE ist dreidimensional.
+
+ PROC draw (PICTFILE VAR pic, REAL CONST x, y, z)
+ Zweck: s. o.
+ Fehlerfälle:
+ * picfile overflow
+ Das letzte PICTURE ist voll (z. Zeit max. 128)
+ * picfile is only twodimensional
+ Das aktuelle PICTURE ist zweidimensional.
+
+ PROC draw (PICTFILE VAR pic, TEXT CONST text)
+ Zweck: Der angegebene Text wird in das aktuelle PICTURE des PICFILEs 'p'
+ eingetragen. Falls das aktuelle PICTURE zu voll ist, wird auto-
+ matisch auf das nächste umgeschaltet. Der Anfang ist dabei die
+ aktuelle Stiftposition. Diese wird nicht verändert.
+ Fehlerfall:
+ * picfile overflow
+ Das letzte PICTURE ist voll (z. Zeit max. 128)
+
+ PROC draw (PICFILE VAR pic, TEXT CONST text, REAL CONST angle, height)
+ Zweck: Der angegebene Text wird unter dem Winkel 'angle' gegenüber der
+ Waagerechten und in der Größe 'height' in das aktuelle PICTURE
+ des PICFILES 'p' eingetragen. Falls das aktuelle PICTURE zu voll
+ ist, wird automatisch auf das nächste umgeschaltet. Der Anfang ist
+ dabei die aktuelle Stiftposition. Diese wird nicht verändert.
+ Fehlerfall:
+ * picfile overflow
+ Das letzte PICTURE ist voll (z. Zeit max. 128)
+
+eof
+ BOOL PROC eof (PICFILE CONST p)
+ Zweck: Liefert 'TRUE' wenn hinter das Ende des PICFILEs positioniert
+ wurde.
+
+extrema
+ PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y max)
+ Zweck: Die Prozedur liefert die größten und kleinsten X- und Y-Koordi-
+ naten des PICTUREs 'p'. Diese werden in die Parameter 'x min',
+ 'x max', 'y min' und 'y max' eingetragen.
+
+ PROC extrema (PICTURE CONST p,
+ REAL VAR x min, x max, y min, y max, z min, z max)
+ Zweck: s.o.
+
+ PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max)
+ Zweck: s.o.
+
+ PROC extrema (PICFILE VAR p,
+ REAL VAR x min, x max, y min, y max, z min, z max)
+ Zweck: s.o.
+
+forward
+ PROC forward (PICFILE VAR p)
+ Zweck: Positioniert den PICFILE um ein PICTURE weiter.
+ Fehlerfall:
+ * picfile overflow
+ Es sollte hinter das Ende des PICFILEs positioniert werden.
+
+get
+ PROC get (PICFILE VAR p, PICTURE VAR pic)
+ Zweck: Liest ein PICTURE aus einem PICFILE und positioniert auf das
+ Nächste.
+ Fehlerfall:
+ * input after end of picfile
+ Es sollte nach dem Ende des Picfiles gelesen werden.
+
+move
+ PROC move (PICTURE VAR pic, REAL CONST x, y)
+ Zweck: Der (virtuelle) Stift wird zur Position (x, y) gefahren.
+ Fehlerfälle:
+ * picture overflow
+ Zu viele Befehle in einem PICTURE (z. Zeit max. 1927 'moves')
+ * picture is three dimensional
+ Ein PICTURE kann nur entweder zwei- oder dreidimensional sein.
+
+ PROC move (PICTURE VAR pic, REAL CONST x, y, z)
+ Zweck: Der (virtuelle) Stift wird zur Position (x, y, z) gefahren.
+ Fehlerfälle:
+ * picture overflow
+ Zu viele Befehle in einem PICTURE (z. Zeit max. 1310)
+ * picture is only twodimensional
+ Ein PICTURE kann nur entweder zwei- oder dreidimensional sein.
+
+ PROC move (PICFILE VAR p, REAL CONST x, y)
+ Zweck: Der (virtuelle) Stift wird zur Position (x, y) gefahren. Falls
+ das aktuelle PICTURE des PICFILEs 'p' zu voll ist, wird auto-
+ matisch auf das nächste umgeschaltet.
+ Fehlerfall:
+ * picfile overflow
+ Das letzte PICTURE ist voll (z. Zeit max. 128 PICTUREs)
+
+ PROC move (PICFILE VAR p, REAL CONST x, y, z)
+ Zweck: Der (virtuelle) Stift wird zur Position (x, y, z) gefahren. Falls
+ das aktuelle PICTURE des PICFILEs 'p' zu voll ist, wird auto-
+ matisch auf das nächste umgeschaltet.
+ Fehlerfall:
+ * picfile overflow
+ Das letzte PICTURE ist voll (z. Zeit max. 128 PICTUREs)
+
+nilpicture
+ PICTURE PROC nilpicture
+ Zweck: Die Prozedure liefert ein leeres PICTURE zur Initialisierung.
+
+oblique
+ PROC oblique (PICFILE VAR p, REAL CONST a, b)
+ Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird 'schiefwinklig' als
+ gewünschte Projektionsart eingestellt. Dabei ist (a, b) der Punkt
+ in der X-Y-Ebene, auf den der Einheitsvector in Z-Richtung
+ abgebildet werden soll.
+
+orthographic
+ PROC orthographic (PICFILE VAR p)
+ Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird "orthografisch" als
+ Projektionsart eingestellt. Bei der orthografischen Projektion
+ wird ein dreidimensionaler Körper mit parallelen Strahlen senk-
+ recht auf die Projektionsebene abgebildet.
+
+pen
+ INT PROC pen (PICTURE CONST pic)
+ Zweck: Liefert die Nummer des 'virtuellen Stifts'.
+
+ PICTURE PROC pen (PICTURE CONST pic, INT CONST pen)
+ Zweck: Liefert ein PICTURE mit dem Inhalt 'pic' und dem 'virtuellen
+ Stift' mit der Nummer 'pen'. Möglich sind die Nummern 1 - 16.
+ Fehlerfälle:
+ * PROC pen: pen [No] < 1
+ Der gewünschte Stift ist kleiner als 1.
+ * PROC pen: pen [No] > 16
+ Der gewünschte Stift ist größer als 16.
+
+perspective
+ PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz)
+ Zweck: Bei den dreidimensionalen PICTUREs des PICFILE's 'p' wird
+ "perspektivisch" als gewünschte Projektionsart eingestellt. Der
+ Punkt (cx, cy, cz) ist der Fluchtpunkt der Projektion, d.h. alle
+ Parallelen zur Blickrichtung schneiden sich in diesem Punkt.
+
+pic no
+ INT PROC pic no (PICFILE CONST p)
+ Zweck: Liefert die Nummer des aktuellen PICTUREs.
+
+picture file
+ DATASPACE PROC picture file (TEXT CONST name)
+ Zweck: Die Prozedur dient zur Assoziation eines benannten Datenraumes
+ mit einem PICFILE (s. Operator ':=').
+
+plot
+ PROC plot (TEXT CONST name)
+ Zweck: Der PICFILE mit dem Namen 'name' wird entspechend der angege-
+ benen Darstellungsart gezeichnet. Diese Parameter ('perspective',
+ 'orthographic', 'oblique', 'view', 'window' etc.) müssen vorher
+ eingestellt werden.
+ Fehlerfall:
+ * FILE does not exist
+ Es existiert kein PICFILE mit dem Namen 'name'
+
+ PROC plot (PICFILE VAR p)
+ Zweck: Der PICFILE 'p' wird entspechend der angegebenen Darstellungsart
+ gezeichnet. Diese Parameter müssen vorher eingestellt werden.
+
+
+ Zweidimensional:
+
+ obligat: 'window' (zweidimensional)
+ optional: 'view' (zweidimensional)
+ 'select pen'
+ 'viewport'
+
+ Dreidimensional:
+
+ obligat: 'window' (dreidimensional)
+ optional: 'view' (dreidimensional)
+ 'orthographic', 'perspective', 'oblique'
+ 'viewport'
+ 'select pen'
+
+put
+ PROC put (PICFILE VAR p, PICTURE CONST pic)
+ Zweck: Schreibt ein PICTURE in einen PICFILE und positioniert um eins
+ vor.
+ Fehlerfall:
+ * picfile overflow
+ Der PICFILE ist voll. (z. Z. max. 128 PICTURE)
+
+reset
+ PROC reset (PICFILE VAR p)
+ Zweck: Positioniert auf den Anfang eines Picfiles.
+
+rotate
+ PICTURE PROC rotate (PICTURE CONST pic, REAL CONST alpha)
+ Zweck: Das PICTURE 'pic' wird um den Punkt (0, 0) um den Winkel 'alpha'
+ (im Gradmaß) im mathematisch positiven Sinn gedreht.
+
+ PICTURE PROC rotate (PICTURE CONST pic, REAL CONST alpha, beta, gamma)
+ Zweck: Das dreidimensionale PICTURE 'pic' wird um den Winkel 'alpha',
+ 'beta' oder 'gamma' im mathematisch positiven Sinn gedreht. Der
+ Winkel 'alpha' dreht um die X-Achse, der Winkel 'beta' um die
+ Y-Achse und 'gamma' um die Z-Achse. Es darf dabei nur jeweils
+ ein Winkel von 0.0 verschieden sein. Alle Winkel werden im
+ Gradmaß angegeben.
+
+select pen
+ PROC select pen (PICFILE VAR p,
+ INT CONST pen, colour, thickness, linetype)
+ Zweck: Für die Darstellung des Bildes 'p' soll dem "virtuellen Stift"
+ 'pen' ein realer Stift zugeordnet werden, der möglichst die Farbe
+ 'colour' und die Dicke 'thickness' hat und dabei Linien mit dem
+ Typ 'line type' zeichnet. Es wird die beste Annäherung für das
+ Ausgabegerät für diese Parameter genommen. Dabei gelten folgende
+ Vereinbarungen:
+
+ Farbe: negative Farben setzten den Hintergrund, positive Farben
+ zeichnen im Vordergrund.
+
+ 0 Löschstift (falls vorhanden)
+ 1 Standardfarbe des Endgeräts (schwarz oder weiß)
+ 2 rot
+ 3 blau
+ 4 grün
+ 5 schwarz
+ 6 weiß > 20 nicht normierte Sonderfarben
+
+ Dicke: 0
+ Standardstrichstärke des Endgerätes > 0
+ Strichstärke in 1/10 mm
+
+ Typ:
+ 0 keine sichtbare Linie
+ 1 durchgängige Linie
+ 2 gepunktete Linie
+ 3 kurz gestrichelte Linie
+ 4 lang gestrichelte Linie
+ 5 Strichpunktlinie
+
+ Die hier aufgeführten Möglichkeiten müssen nicht an allen
+ grafischen Endgeräten vorhanden sein. Der geräteabhängige
+ Graphik-Treiber wählt jeweils die für ihn bestmögliche Annäherung.
+
+ Fehlerfälle:
+ * pen < 1
+ * pen > 16
+
+size
+ INT PROC size (PICFILE CONST p)
+ Zweck: Liefert die aktuelle Größe eines PICFILEs in Bytes.
+
+stretch
+ PICTURE PROC stretch (PICTURE CONST pic, REAL CONST xc, yc)
+ Zweck: Das PICTURE 'pic' wird in X-Richtung um den Faktor 'xc', in
+ Y-Richtung um den Faktor 'yc' gestreckt (bzw. gestaucht). Dabei
+ bewirkt der Faktor
+ c > 1 eine Streckung
+ 0 < c < 1 eine Stauchung
+ c < 0 zusätzlich eine Achsenspiegelung
+
+ PICTURE PROC stretch (PICTURE CONST pic, REAL CONST xc, yc, zc)
+ Zweck: Das dreidimensionale PICTURE 'pic' wird entsprechend den
+ angegeben Faktoren 'xc', 'yc' und 'zc' gestreckt. Wirkung s.o.
+
+translate
+ PICTURE PROC translate (PICTURE CONST pic, REAL CONST dx, dy)
+ Zweck: Das PICTURE 'pic' wird um 'dx' und 'dy' verschoben.
+ Fehlerfall:
+ * picture is threedimensional
+ 'pic' ist dreidimensional.
+
+ PICTURE PROC translate (PICTURE CONST pic, REAL CONST dx, dy, dz)
+ Zweck: Das PICTURE 'pic' wird um 'dx', 'dy' und 'dz' verschoben.
+ Fehlerfall:
+ * picture is twodimensional
+ Das PICTURE 'pic' ist zweidimensional
+
+two dimensional
+ PROC two dimensional (PICFILE VAR p)
+ Zweck: Setzt als Projektionsart zweidimensional.
+
+view
+ PROC view (PICFILE VAR p, REAL CONST alpha, phi, theta)
+ Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne
+ dargestellt, sondern für die Betrachtung gedreht. Mit der Prozedur
+ 'view' kann diese Betrachtungsrichtung durch die Polarwinkel 'phi'
+ und 'theta' angegeben werden. Mit dem Winkel 'alpha' kann dann
+ das Bild um den Mittelpunkt der Zeichenfläche gedreht werden.
+ Dadurch kann ein Bild auch auf einem Terminal hochkant gestellt
+ werden. Voreingestellt ist 'phi = 0, theta = 0 und alpha = 0',
+ d.h. direkt von oben.
+
+ Im Gegensatz zu 'rotate' hat 'view' keine Wirkung auf das eigent-
+ liche Bild (PICFILE), sondern nur auf die gewählte Darstellung.
+ So addieren sich zwar aufeinanderfolgende "Rotationen", 'view'
+ aber geht immer von der Nullstellung aus. Auch kann das Bild
+ durch eine "Rotation" ganz oder teilweise aus oder in das Dar-
+ stellungsfenster ('window') gedreht werden. Bei 'view' verändern
+ sich die Koordinaten der Punkte nicht, d.h. das Fenster wird mit-
+ gedreht.
+
+viewport
+ PROC viewport (PICFILE VAR p,
+ REAL CONST hormin, hormax, vertmin, vertmax)
+ Zweck: Die Zeichenfläche auf dem Endgerät, auf dem das Bild dargestellt
+ werden soll, wird spezifiziert. Dabei wird sowohl die Größe als
+ auch die relative Lage der Zeichenfläche definiert. Der linke
+ untere Eckpunkt der physikalischen Zeichenfläche des Gerätes hat
+ die Koordinaten (0.0, 0.0). Die definierte Zeichenfläche erstreckt
+ sich
+
+ 'hormin' - 'hormax' in der Horizontalen,
+ 'vertmin' - 'vertmax' in der Vertikalen.
+
+ So liegt der linke untere Eckpunkt dann bei (hormin, vertmin), der
+ rechte obere bei (hormax, vertmax).
+
+ Damit sowohl geräteunabhängige als auch maßstabsgerechte
+ Zeichnungen möglich sind, können die Koordinaten in zwei Arten
+ spezifiziert werden :
+
+ a) Gerätekoordinaten
+ Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei
+ hat die kürzere Seite der physikalischen Zeichenfläche defini-
+ tionsgemäß die Länge 1.0.
+
+ b) absolute Koordinaten
+ Die Werte werden in cm angegeben. Für die Maximalwerte sind
+ nur Werte größer als 2.0 möglich.
+
+ Voreingestellt ist
+
+ viewport (0.0, 1.0, 0.0, 1.0),
+
+ d.h. das größtmöglichste Quadrat, beginnend in der linken unteren
+ Ecke der physikalischen Zeichenfläche. In vielen Fällen wird
+ diese Einstellung ausreichen, so daß der Anwender kein eigenes
+ 'viewport' definieren muß.
+
+ Der Abbildungsmaßstab wird durch das Zusammenspiel von 'viewport'
+ und 'window' festgelegt (siehe dort). Dabei ist insbesondere
+ darauf zu achten, daß winkeltreue Darstellungen nur bei gleichem
+ X- und Y-Maßstab möglich sind. Da man oft quadratische Fenster
+ ('window') verwendet, wurde als Standardfall auch ein quadrati-
+ sches 'viewport' gewählt.
+
+where
+ PROC where (PICTURE CONST pic, REAL VAR x, y)
+ Zweck: Die aktuelle Stiftposition wird in 'x' und 'y' eingetragen.
+ Fehlerfall:
+ * picture is threedimensional
+ Das PICTURE 'pic' ist dreidimensional
+
+ PROC where (PICTURE CONST pic, REAL VAR x, y, z)
+ Zweck: Die aktuelle Stiftposition wird in 'x', 'y' und 'z' eingetragen.
+ Fehlerfall:
+ * picture is twodimensional
+ Das PICTURE 'pic' ist zweidimensional
+
+window
+ PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max)
+ Zweck: Für die Darstellung eines zweidimensionalen Bildes wird das
+ darzustellende Fenster definiert. Alle Bildpunkte, deren X-Ko-
+ ordinaten im Intervall [x min, x max] und deren Y-Koordinaten im
+ Intervall [y min, y max] liegen, gehören zum definierten Fenster.
+ Vektoren, die über dieses Fenster hinausgehen, werden abge-
+ schnitten. Dieses Fenster wird auf die spezifizierte Zeichen-
+ fläche abgebildet. (Das ist standardmäßig das größtmögliche
+ Quadrat auf dem ausgewählten Gerät).
+
+ Der Darstellungsmaßstab ergibt sich als
+
+ x max - x min
+ -----------------------------------------
+ horizontale Seitenlänge der Zeichenfläche
+
+ y max - y min
+ -----------------------------------------
+ vertikale Seitenlänge der Zeichenfläche
+
+ Für eine winkeltreue Darstellung müssen X- und Y-Maßstab
+ gleich sein! Einfach können winkeltreue Darstellung erreicht
+ werden, wenn das Fenster eine quadratische Form hat. Die
+ Zeichenfläche ('viewport') ist dementsprechend als Quadrat vor-
+ eingestellt.
+
+ PROC window (PICFILE VAR p,
+ REAL CONST x min, x max, y min, y max, z min, z max)
+ Zweck: Für die Darstellung eines dreidimensionalen Bildes wird das darzu-
+ stellende Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im
+ Intervall [x min, x max] und deren Y-Koordinaten im Intervall
+ [y min, y max] und deren Z-Koordinaten im Intervall [z min, z max]
+ liegen, gehören zum definierten Fenster. Dieses dreidimensionale
+ Fenster (Quader) wird entsprechend der eingestellten Projektions-
+ art (orthografisch, perspektivisch oder schiefwinklig) und den
+ Betrachtungswinkeln (s. 'view') auf die spezifizierte Zeichen-
+ fläche abgebildet. (Das ist standardmäßig das größtmögliche
+ Quadrat auf dem ausgewählten Gerät.) Linien, die außerhalb dieses
+ Quadrates liegen, werden abgeschnitten.
+
+ Anders als im zweidimensionalen Fall ist das Problem der Maßstäbe
+ nicht mehr nur durch das Zusammenspiel von 'window' und 'view-
+ port' zu beschreiben. Hier spielen auch Projektionsart und Dar-
+ stellungswinkel eine Rolle. Falls alle Darstellungswinkel den
+ Wert 0.0 haben, gilt das für den zweidimensionalen Fall gesagte
+ für die Ebene (y = 0.0) entsprechend.
+
+write is possible
+ BOOL PROC write is possible (PICTURE CONST pic, INT CONST space)
+ Zweck: Liefert 'TRUE', falls 'space' Bytes Platz in 'pic' vorhanden ist.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil11 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil11
new file mode 100644
index 0000000..cae9c50
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil11
@@ -0,0 +1,1072 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 11: Utilities
+
+
+In diesem Teil werden einige Dienstprogramme aufgeführt. Diese Programme
+sind bei speziellen Anwendungen nützlich.
+
+
+
+1. Scanner
+
+Der Scanner zerlegt einen TEXT in Symbole bzw. "Tokens" entsprechend der
+ELAN-Sprachdefinition.
+
+Der Scanner kann benutzt werden, um festzustellen, welche Art von Symbolen
+in einem TEXT enthalten sind. Die Repräsentation der Symbole müssen dabei
+der ELAN-Syntax entsprechen. Folgende #ib#Symbole#ie# kann der Scanner
+erkennen:
+
+ - "tags", d.h. Namen,
+ - "bolds", d.h. Schlüsselworte,
+ - "number", d.h. INT oder REAL Zahlen,
+ - Operatoren,
+ - "delimiter", d.h. Begrenzer wie z.B. ";",
+ - und das Ende des Scan-Textes.
+
+
+Der Scanner überliest Kommentare und Leerzeichen zwischen den Symbolen.
+Der (erste) zu verarbeitende Text muß mit der Prozedur
+
+ scan
+
+in den Scanner "hineingesteckt" werden. Mit der Prozedur
+
+ next symbol
+
+wird das jeweils nächste Symbol des TEXTes geholt. Am Ende wird "end of scan"
+und als Symbol 'niltext' geliefert. Falls innerhalb eines TEXT-Denoters oder
+eines Kommentars "end of scan" auftritt, wird "within text" bzw. "within
+comment" gemeldet. Der Scan-Prozeß kann dann mit dem nächsten zu scannenden
+TEXT (der nächsten Zeile) fortgesetzt werden. Dafür wird nicht die Prozedur
+'scan', sondern
+
+ continue scan
+
+verwandt. Sie setzt im letzten Scan-Zustand (z.B. Kommentar oder TEXT-
+Denoter) wieder auf, so daß auch Folgen von TEXTen (Zeilen) wie z.B. Dateien
+leicht gescannt werden können.
+
+Mit den Prozeduren
+
+ scan (* meldet eine Datei zum scannen an *)
+ next symbol (* holt die Symbole *)
+
+kann man auch eine Datei nach ELAN-Symbolen untersuchen. Beispiel:
+
+ FILE VAR f :: ...
+ ...
+ scan (f); (* beginnt das Scanning in der nächsten Zeile *)
+ TEXT VAR symbol;
+ INT VAR type;
+ REP
+ next symbol (f, symbol, type);
+ verarbeite symbol
+ UNTIL type >= 7 END REP.
+
+Merke: Mit dem Scanner kann man einen ELAN-Text analysieren.
+
+
+
+Scanner-Kommandos
+
+continue scan
+ PROC continue scan (TEXT CONST scan text)
+ Zweck: Das Scanning soll mit 'scan text' fortgesetzt werden. Falls der
+ Scan-Vorgang beim vorigen 'scan text' innerhalb eines TEXT-
+ Denoters oder eines Kommentars abgebrochen wurde, wird er jetzt
+ entsprechend mit dem nächsten 'next symbol' fortgesetzt. Der
+ erste Teil-Scan einer Folge muß aber stets mit 'scan' einge-
+ leitet werden!
+
+next symbol
+ PROC next symbol (TEXT VAR symbol, INT VAR type)
+ Zweck: Holt das nächste Symbol. In "symbol" steht der TEXT des Symbols,
+ so z.B. die Ziffern eines INT-Denoters. Bei TEXT-Denotern
+ werden die führenden und abschließenden Anführungsstriche ab-
+ geschnitten. Leerzeichen oder Kommentare spielen in "tags" oder
+ "numbers" keine Rolle. Zwischen Symbolen spielen Leerzeichen
+ oder Kommentare keine Rolle. In "type" steht eine Kennzeichung
+ für den Typ des Symbols:
+
+ tag = 1 ,
+ bold = 2 ,
+ number = 3 ,
+ text = 4 ,
+ operator = 5 ,
+ delimiter = 6 ,
+ end of file = 7 ,
+ within comment = 8 ,
+ within text = 9 .
+
+ Wird Scan-Ende innerhalb eines Kommentars gefunden, so wird
+ 'niltext' und 'within comment' geliefert. Wird Scan-Ende inner-
+ halb eines TEXT-Denoters gefunden, so wird der schon analysierte
+ Teil des Denoters und 'within text' geliefert.
+
+ PROC next symbol (TEXT VAR symbol)
+ Zweck: s.o. Es wird aber nur der Text des Symbols (ohne Typ) geliefert.
+
+ PROC next symbol (FILE VAR f, TEXT CONST symbol)
+ Zweck: arbeitet wie obige Prozeduren, jedoch auf einen FILE.
+
+ PROC next symbol (FILE VAR f, TEXT CONST symbol, INT VAR type)
+ Zweck: arbeitet wie obige Prozeduren, jedoch auf einen FILE.
+
+scan
+ PROC scan (TEXT CONST scan text)
+ Zweck: Meldet einen 'scan text' für den Scanner zur Verarbeitung an.
+ Die Prozedur 'scan' muß vor dem ersten Aufruf von 'next symbol'
+ gegeben werden. Im Gegensatz zu 'continue scan' normiert 'scan'
+ den inneren Zustand des Scanners, d.h. vorherige Scan-Vorgänge
+ haben keinen Einfluß mehr auf das Scanning.
+
+ PROC scan (FILE VAR f)
+ Zweck: Wie obige Prozedur, jedoch auf einen FILE. Die zu scannende Zeile
+ ist die nächste Zeile im FILE 'f' ('scan' macht zuerst ein 'get-
+ line').
+
+
+
+2. Inspector
+
+Der Inspector stellt ein Hilfsmittel bei der Programmentwicklung dar.
+
+Der Inspector informiert über alle
+
+ - insertierten Prozeduren / Operatoren mit dem gleichen Namen
+ - Prozeduren / Operatoren / Typen, die ein Paket definiert
+ - bisher insertierten Pakete
+ - insertierten Prozeduren / Operatoren / Typen.
+
+Mit dem Aufruf von
+
+ help ("name")
+
+wird eine Liste aller Prozeduren / Operatoren, die 'name' heißen, auf dem
+Bildschirm ausgegeben. Die Liste ist paketweise sortiert unter Angabe des
+Paketnamens. Die Ausgabe erfolgt mit der Angabe der Parametertypen. Gibt es
+kein Objekt mit dem angegebenen Namen, so erscheint die Ausgabe
+
+ unbekannt: name
+
+Das Kommando
+
+ bulletin ("paket name")
+
+informiert über alle Objekte, die in der DEFINES-Liste des Pakets mit dem
+Namen "paket name" stehen. Die Ausgabe erfolgt wie beim list-Kommando.
+
+Eine gesamte Liste aller bisher insertierten Prozeduren/Operatoren/Typen
+erhält man mit dem Kommando
+
+ bulletin
+
+Bei diesen Funktionen ist (noch) zu beachten, daß Typen immer dem textmäßig
+vorhergehendem Paket zugeordnet werden. Der Grund hierfür liegt in der
+Behandlung abstrakter Datentypen im ELAN-Compiler. Eine Korrektur ist für
+spätere Auslieferungen geplant.
+
+Mit
+
+ packets
+
+werden die Namen aller bisher insertierten Pakete "gelistet".
+
+Merke: Mit 'help' kann man sich über verfügbare Prozeduren/Operatoren in-
+formieren.
+
+
+
+Inspector-Kommandos
+
+help
+ PROC help (TEXT CONST name)
+ Zweck: Listen aller Prozeduren / Operatoren mit dem Namen "name". Die
+ Ausgabe erfolgt direkt auf den Bildschirm.
+
+bulletin
+ PROC bulletin (TEXT CONST paket name)
+ Zweck: Listen aller in der DEFINES-Liste des Pakets mit dem Namen
+ "paket name".
+
+ PROC bulletin
+ Zweck: Es wird eine Liste aller bisher insertierter Objekte erstellt.
+ Diese Liste ist paketweise sortiert.
+
+packets
+ PROC packets
+ Zweck: Auflisten der Namen aller bisher insertierten Pakete.
+
+
+
+3. Lexikographische Vergleiche
+
+Die üblichen Operatoren für TEXTe arbeiten mit dem der Reihenfolge des EUMEL-
+Zeichencodes. Hier wird beschrieben, wie man lexikographische Vergleiche
+nach DIN erhält.
+
+Für TEXT-Vergleiche nach DIN 5007 gibt es die Operatoren
+
+ LEXEQUAL
+ LEXGREATER
+ LEXGREATEREQUAL
+
+Diese Operatoren vergleichen zwei TEXTE nach DIN 5007 mit folgenden
+Bedingungen:
+
+- Die Reihenfolge enspricht 'ABC...Z', wobei große und kleine Buchstaben
+ gleich behandelt werden.
+
+- Weitere Entsprechungen:
+ ö = oe, ä = ae, ü = ue
+ Ö = Oe, Ü = Ue, Ä = Ae,
+ Ä = ä, Ü = ü, Ö = ö,
+ ß = ss
+ Dadurch ist z.B.
+
+ "muß" LEXGREATER "Muster" --> FALSE
+ "Goethe" LEXEQUAL "Göthe" --> TRUE
+
+- Alle Sonderzeichen (außer " " und "-") werden ignoriert.
+
+- Ein Leerzeichen und ein Bindestrich zwischen Worten werden gleich behan-
+ delt. Beispiel:
+
+ "EUMEL System" LEXEQUAL "EUMEL-System" --> TRUE
+
+Anmerkung: Diese drei Operatoren sind - sofern die oben erwähnten Zeichen in
+den Operanden vorkommen - langsamer als die "normalen" TEXT-Vergleiche
+(=, >, <, usw.). Das liegt daran, daß die Operanden in solchen Fällen
+umgewandelt werden.
+
+
+
+Lexikographische Operatoren
+
+LEXEQUAL
+ BOOL OP LEXEQUAL (TEXT CONST l, r)
+ Zweck: Lexikographischer Vergleich von 'l' und 'r' auf Gleichheit.
+
+LEXGREATER
+ BOOL OP LEXGREATER (TEXT CONST l, r)
+ Zweck: Lexikographischer Vergleich von 'l' und 'r' auf "Grösser".
+
+LEXGREATEREQUAL
+ BOOL OP LEXGREATEREQUAL (TEXT CONST l, r)
+ Zweck: Lexikographischer Vergleich von 'l' und 'r' auf "Grösser Gleich".
+
+
+
+4. Der 'reporter'
+
+Das Programm 'reporter' dient zur Fehlersuche und/oder Lokalisierung von
+besonders häufig durchlaufenen Programmteilen. Zu diesem Zweck werden in ein
+Programm Prozeduraufrufe eingefügt, die veranlassen, daß bestimmte Informa-
+tionen (normalerweise Ablaufinformationen) in eine Datei (die TRACE-Datei)
+geschrieben werden.
+
+'reporter' ermöglicht
+
+a) Ablaufinformationen ("trace");
+b) Häufigkeitszählung ("frequency count");
+c) Programmunterbrechung bei Nichterfüllung einer Bedingung ("assertion").
+
+
+
+Installation von 'reporter'
+
+Das Programm befindet sich in der Datei 'reporter' und kann wie üblich in-
+sertiert werden. Jedoch muß es mit 'check off' übersetzt werden, damit keine
+Zeilennummern für 'reporter' generiert werden. Dies ist notwendig, damit die
+Zeilennummern des zu testenden Programms nicht mit den Zeilennummern des
+Programms 'reporter' verwechselt werden können. Beispiel:
+
+ check off; insert ("reporter"); check on
+
+
+
+Vorbereitungen
+
+Mit dem Kommando
+
+ generate reports ("testdatei")
+
+werden die oben erwähnten Prozeduraufrufe ('report') in das zu testende
+Programm, welches in der Datei 'testdatei' steht, geschrieben. Die Prozedur-
+aufrufe werden nach jedem Prozedur-, Operator- oder Refinement-Kopf
+eingefügt und erhalten den entsprechenden Namen als Parameter. Diese
+Prozeduraufrufe werden gekennzeichnet, damit sie von der Prozedur
+
+ eliminate reports ("testdatei")
+
+automatisch wieder entfernt werden können. Beispiel (für die eingefügten
+Prozeduraufrufe):
+
+ ...
+ PROC beispiel (INT CONST mist):
+ ##report ("beispiel");##
+ ...
+
+
+
+Automatische Ablaufinformationen
+
+Ist ein Programm mit 'generate reports' mit 'report'-Aufrufen versehen
+worden, kann es wie gewohnt übersetzt werden. Wird das Programm vom ELAN-
+Compiler korrekt übersetzt und dann gestartet, wird bei jedem Antreffen
+eines 'report'-Aufrufs der Parameter (Name der Prozedur, Operator oder
+Refinement) in eine Datei, die TRACE-Datei geschrieben. Die TRACE-Datei wird
+beim Programmlauf automatisch von 'reporter' unter dem Namen 'TRACE' einge-
+richtet.
+
+Mit Hilfe dieser Datei kann der Programmablauf verfolgt werden. Es ist damit
+auch möglich festzustellen, wo eine "Endlos-Rekursion" auftritt. Die Ablauf-
+informationen bestehen nur aus den Namen der angetroffenen Prozeduren und
+Refinements. Trotzdem können die Anzahl der Informationen sehr umfangreich
+werden. Deshalb gibt es die Möglichkeit, die Erzeugung der Ablaufinforma-
+tionen ab- bzw. wieder anzuschalten. Dazu gibt es die Möglichkeit, in das zu
+testende Programm die Prozeduren
+
+ report on
+ report off
+
+einzufügen und das zu testende Programm mit diesen Prozeduraufrufen (erneut)
+zu übersetzen.
+
+
+
+Benutzereigene Ablaufinformationen
+
+Zusätzlich zu den von 'generate reports' eingefügten 'report'-Aufrufen kann
+ein Benutzer eigene Aufrufe an geeigneten Stellen in ein Programm schreiben.
+Dafür werden weitere 'report'-Prozeduren zur Verfügung gestellt, die als
+ersten Parameter ein TEXT-Objekt (meist Name des Objekts oder der Ausdruck
+selbst) und als zweiten ein INT/REAL/TEXT/ BOOL-Objekt (der zu überprüfende
+Wert oder Ausdruck) enthalten. Beispiel:
+
+ ...
+ PROC beispiel (INT CONST mist):
+ ##report ("beispiel");## (* automatisch eingefuegte *)
+ INT VAR mist :: ...; ...
+ ##report ("mist:", mist);## (* vom Benutzer per Hand eingefuegt *)
+ ...
+
+Folgende 'report'-Routinen stehen zur Verfügung, damit man sie "von Hand" in
+ein zu testendes Programm einfügen kann:
+
+ PROC report on
+ PROC report off
+ PROC report (TEXT CONST message)
+ PROC report (TEXT CONST message, INT CONST value)
+ PROC report (TEXT CONST message, REAL CONST value)
+ PROC report (TEXT CONST message, TEXT CONST value)
+ PROC report (TEXT CONST message, BOOL CONST value)
+
+Wichtig: Hier - wie bei allen anderen "von Hand eingefügten" Aufrufen -
+sollte ein Nutzer sich an die Konvention halten, diese in "##" einzuklammern.
+Mit 'eliminate reports' werden diese Einfügungen automatisch entfernt.
+Sollen diese Aufrufe aber immer im Programm erhalten bleiben (jedoch nicht
+wirksam sein), sollten sie
+
+a) vor 'generate reports'-Aufruf mit jeweils '###' eingefaßt werden.
+ Beispiel:
+ ### report ("...") ###
+ So steht das 'report'-Statement in einem Kommentar. 'generate reports'
+ wandelt '###' --> '####' um, so daß ein solches Statement wirksam wird.
+ 'eliminate reports' wandelt ein '####' --> '###' zurück.
+
+b) nach 'generate reports' in '####' eingefaßt werden.
+
+
+
+Häufigkeitszählung
+
+Eine Häufigkeitszählung erhält man, in dem man in das zu testende Programm
+die Aufrufe
+
+ count on
+ count off
+
+einfügt. Ist die Häufigkeitszählung eingeschaltet, merkt sich 'reporter' die
+Anzahl der Durchläufe für jede Prozedur bzw. Refinement. Mit der Prozedur
+
+ generate counts ("zu testende datei")
+
+werden die vermerkten Häufigkeiten in das zu testende Programm direkt einge-
+fügt. Die Häufigkeiten werden wie oben beschrieben gekennzeichnet, so daß sie
+mit 'eliminate reports' entfernt werden können.
+
+
+
+Assertions
+
+Zusätzlich zu den oben erwähnten Möglichkeiten bietet 'reporter' noch die
+Prozedur
+
+ assert
+
+an. Diese Prozedur kann von einem Programmierer an einer Stelle in das zu
+testende Programm eingefügt werden, an der bestimmte Bedingungen erfüllt sein
+müssen. Die Prozedur 'assert' steht in zwei Formen zur Verfügung:
+
+ PROC assert (BOOL CONST zusicherung)
+ PROC assert (TEXT CONST message, BOOL CONST zusicherung)
+
+Ist der Wert von 'zusicherung' nicht TRUE, wird der Programmlauf abgebrochen.
+
+
+
+'reporter'-Kommandos
+
+count on
+ PROC count on
+ Zweck: Schaltet die Häufigkeitszählung ein.
+
+count off
+ PROC count off
+ Zweck: Schaltet die Häufigkeitszählung aus.
+
+eliminate reports
+ PROC eliminate reports (TEXT CONST datei)
+ Zweck: Entfernt gekennzeichnete 'report'-Aufrufe aus der Datei 'datei'.
+
+generate reports
+ PROC generate reports (TEXT CONST datei)
+ Zweck: Fügt 'report'-Aufrufe in die Datei 'datei' ein und kennzeichnet
+ diese mit '##'.
+
+report on
+ PROC report on
+ Zweck: Schaltet die Ablaufinformationen in die Datei 'TRACE' ein.
+
+report off
+ PROC report off
+ Zweck: Schaltet die Ablaufinformationen wieder aus.
+
+generate counts
+ PROC generate counts (TEXT CONST datei)
+ Zweck: Bringt die Häufigkeitszählung (wie oft eine Prozedur oder Refine-
+ ment durchlaufen wurde) in die Programmdatei 'datei'. Mit
+ 'eliminate reports' werden diese wieder automatisch entfernt.
+
+assert
+ PROC assert (TEXT CONST message, BOOL CONST value)
+ Zweck: Schreibt 'message' und den Wert von 'value' in die TRACE-Datei.
+ Ist 'value' FALSE, wird angefragt, ob das Programm fortgesetzt
+ werden soll.
+
+
+
+5. Referencer
+
+Das Programm 'referencer' erstellt aus einem (syntaktisch korrektem) ELAN-
+Programm eine Liste, in der jedes Auftreten eines Objekts mit der betref-
+fenden Zeilennummer verzeichnet ist.
+
+ 'referencer' wird durch
+
+ referencer ("ref datei", "referenz liste")
+
+aufgerufen, wobei die Datei 'referenz liste' nicht existieren darf.
+'referenz liste' enthält nach Ablauf des Programms die gewünschte Liste, die
+sogenannte Referenzliste.
+
+Achtung: 'referencer' arbeitet ausschließlich mit Namen und verarbeitet nur
+wenige syntaktische Konstrukte. Darum ist es nur erlaubt, ein PACKET auf
+einmal von 'referencer' verarbeiten zu lassen. Verarbeitet man mehrere
+PACKETs auf einmal, kann es geschehen, daß gleichnamige Objekte in unter-
+schiedlichen Paketen zu Warnungen (vergl. die unten beschriebenen Überprü-
+fungen) führen.
+
+In der Referenzliste sind
+
+- alle Objekte mit ihrem Namen (in der Reihenfolge ihres Auftretens im
+ Programm)
+
+- alle Zeilennummern, in der das Objekt angesprochen wird
+
+- die Zeilennummern, in der das Objekt deklariert wurde ('L' für ein lokales
+ und 'G' für ein globales Objekt, 'R' für ein Refinement)
+
+verzeichnet.
+
+Die Referenzliste kann u.a. dazu dienen, zu kontrollieren, ob und wie (bzw.
+wo) ein Objekt angesprochen wird. Dies lohnt sich selbstverständlich nur bei
+etwas umfangreicheren Programmen (bei "Mini"-Programmen kann man dies sofort
+sehen).
+
+Bei der Erstellung der Referenzliste nimmt das Programm 'referencer' gleich-
+zeitig einige Überprüfungen vor, die helfen können, ein Programm zu ver-
+bessern:
+
+1. Warnung bei mehrzeiligen Kommentaren.
+
+2. Überdeckungsfehler. Wird ein Objekt global (auf PACKET-Ebene) und noch-
+ mals lokal in einer Prozedur deklariert, ist das globale Objekt nicht mehr
+ ansprechbar. Überdeckungen sind nach der gültigen Sprachdefinition z.Zt.
+ noch erlaubt, werden aber bei einer Revision des Sprachstandards verboten
+ sein.
+
+3. Mehrmaliges Einsetzen von Refinements. Wird ein Refinement mehrmals einge-
+ setzt (das ist völlig legal), sollte man überlegen, ob sich dieses Refine-
+ ment nicht zu einer Prozedur umgestalten läßt.
+
+4. Nicht angewandte Refinements. Wird ein Refinement zwar deklariert, aber
+ nicht "aufgerufen", erfolgt eine Warnung.
+
+5. Nicht angesprochene Daten-Objekte. Werden Daten-Objekte zwar deklariert,
+ aber im folgenden nicht angesprochen, wird eine Warnung ausgegeben.
+ Hinweis: Alle Objekte, die nur wenig angesprochen werden, also nur wenige
+ Zeilennummern in der Referenzliste besitzen, sind verdächtig (Ausnahmen:
+ importierte Prozeduren, LET-Objekte u.a.m.).
+
+
+
+'referencer'-Kommandos
+
+referencer
+ PROC referencer (TEXT CONST check file, dump file)
+ Zweck: Überprüft 'check file'. In 'dump file' steht nach Abschluß die
+ Referenzliste.
+
+
+
+6. Notizen (Notizbuch, Fehlerprotokoll)
+
+Das Notizbuch erlaubt es u.a., Fehlermeldungen zwischenzeitig zu speichern
+und am Ende einer Verarbeitung die Fehlermeldungen zusammen mit dem bear-
+beiteten Text im Paralleleditor anzuzeigen.
+
+Das Notizbuch wird eingesetzt, wenn Texte bearbeitet werden, die gewissen
+Regeln entsprechen müssen (Beispiele: ELAN-Compiler, Textkosmetik usw.). In
+solchen Fällen ist es nützlich, die Fehlermeldungen zwischenzeitig zu
+speichern und erst am Ende einer Verarbeitung gesammelt dem Benutzer zusam-
+men mit dem Quelltext anzuzeigen. Diese Aufgaben übernimmt das Notizbuch.
+Mit der Prozedur
+
+ note
+
+kann eine Meldung im Notizbuch gespeichert werden. Mit
+
+ note line
+
+wird der Beginn einer neuen Zeile im Notizbuch signalisiert. Das bedeutet,
+daß ein Programmierer für alle Zeilenvorschübe in der Fehlermeldungsdatei mit
+dieser Prozedur zu sorgen hat.
+
+Mit der Informationsprozedur
+
+ anything noted
+
+kann man am Ende einer Verarbeitung abfragen, ob Fehlermeldungen gespeichert
+wurden. Ist das der Fall, kann man den Paralleleditor aufrufen:
+
+ note edit
+
+In der oberen Hälfte werden die Fehlermeldungen dargestellt, in der unteren
+den zu bearbeitenden Text. Beispiel:
+
+ PROC verarbeite (TEXT CONST datei):
+ FILE VAR f :: sequential file (input, datei);
+ verarbeitung;
+ ende behandlung.
+
+ verarbeitung:
+ ...
+ note (fehlermeldung);
+ note line.
+
+ ende behandlung:
+ IF anything noted
+ THEN note edit (f)
+ FI
+ END PROC verarbeite
+
+
+
+Notizbuch-Kommandos
+
+anything noted
+ BOOL PROC anything noted
+ Zweck: Informationsprozedur, ob etwas in das Notizbuch geschrieben wurde.
+
+note edit
+ PROC note edit
+ Zweck Bewirkt das Anzeigen des Notizbuchs auf vollem Bildschirm.
+
+ PROC note edit (FILE VAR f)
+ Zweck: Anzeigen des Notizbuchs und der Datei 'f' durch den Parallel-
+ editor.
+
+note file
+ FILE PROC note file
+ Zweck: Assoziierungsprozedur. Liefert das Notizbuch.
+
+note line
+ PROC note line
+ Zweck: Zeilenvorschub im Notizbuch.
+
+note
+ PROC note (TEXT CONST meldung)
+ Zweck: Schreibt 'meldung' in das Notizbuch.
+
+ PROC note (INT CONST zahl)
+ Zweck: Schreibt 'zahl' als TEXT in das Notizbuch (analog 'put').
+
+
+
+7. Sortier-Programme
+
+Es stehen zwei verschiedene Sortier-Programme zur Verfügung: 'sort'
+(Sortierung nach ASCII-Reihenfolge) und 'lex sort' (Sortierung nach
+deutschem Alphabet).
+
+Das Kommando
+
+ sort ("datei")
+
+sortiert 'datei' zeilenweise. Beispiel:
+
+ Eingabe-Datei:
+ Berta ist eine Frau.
+ Adam ist ein Mann.
+ ...
+ Sortierte Datei:
+ Adam ist ein Mann.
+ Berta ist eine Frau.
+ ...
+
+Dabei werden die Zeilen-Anfänge solange zeichenweise miteinander verglichen,
+bis ein Unterschied auftritt und dann ggf. umgeordnet. Werden zwei ungleich
+lange Zeilen (Anzahl Zeichen/Zeile) miteinander verglichen, dann kann man
+sich die kürzere Zeile mit Leerzeichen auf die Länge der längeren Zeile
+verlängert denken.
+
+Die Reihenfolge, in der die Zeilen sortiert werden, erfolgt nach dem ASCII-
+Zeichensatz in aufsteigender Reihenfolge (vergl. TEIL 3; EUMEL-Zeichencode):
+
+ Leerzeichen
+ einige Sonderzeichen
+ Ziffern
+ einige Sonderzeichen
+ Große Buchstaben
+ einige Sonderzeichen
+ kleine Buchstaben
+ einige Sonderzeichen
+ Umlaute und ß
+
+Das bedeutet, daß z.B. folgendermaßen sortiert wird:
+
+ Adam
+ Ball
+ Zuruf
+ aber das ist ein Satz
+ niemals
+ Überlauf
+
+Um zu erreichen, daß große und kleine Buchstaben gleichwertig behandelt
+werden, kann man das Kommando
+
+ lex sort ("datei")
+
+geben. In diesem Fall würde die sortierte Datei folgendermaßen aussehen:
+
+ aber das ist ein Satz
+ Adam
+ Ball
+ niemals
+ Überlauf
+ Zuruf
+
+Man beachte, daß der Umlaut 'Ü' wie 'Ue' behandelt wird (für die restlichen
+Umlaute gilt eine analoge Behandlung; ebenso wird 'ß' wie 'ss' behandelt).
+Weiterhin werden alle Sonderzeichen bei der Sortierreihenfolge ignoriert.
+
+
+
+Sortier-Kommandos
+
+sort
+ PROC sort (TEXT CONST datei)
+ Zweck: Die Prozedur 'sort' sortiert die Datei 'datei' zeilenweise. Die
+ Sortierung erfolgt nach der Ordnung, die der EUMEL-Zeichencode
+ vorschreibt. Beispielsweise werden Zeilen ("Sätze"), die mit
+ Ziffern beginnen, vor Sätzen, die mit Buchstaben anfangen, ein-
+ geordnet. Sätze, die mit großen Buchstaben beginnen, werden vor
+ Sätzen mit kleinen Buchstaben einsortiert. Weiterhin werden die
+ Umlaute und das "ß" nach allen anderen Buchstaben eingeordnet.
+
+ PROC sort (TEXT CONST datei, INT CONST anfang)
+ Zweck: Sortiert eine Datei wie obige Prozedur, jedoch wird bei der
+ Sortierung nicht der Anfang eines Satzes beachtet, sondern die
+ Position 'anfang'.
+
+lex sort
+ PROC lex sort (TEXT CONST datei)
+ Zweck: Wie 'sort', jedoch nach (deutscher) lexikographischer Reihen-
+ folge nach DIN 5007. Bei den Vergleichen werden die Operatoren
+ LEXEQUAL, LEXGREATER, LEXGREATEREQUAL (vergl. TEIL 11 des
+ Benutzerhandbuchs) verwandt. Anmerkung: 'lex sort' ist um
+ einiges langsamer als 'sort'.
+
+ PROC lex sort (TEXT CONST datei, INT CONST anfang)
+ Zweck: Wie 'lex sort', jedoch wird bei der Sortierung bei 'anfang'
+ jeder Zeile begonnen.
+
+
+
+8. Rechnen im Editor: TeCal
+
+Das Programm TeCal (Abkürzung für "Text Calculator") ermöglicht das einfache
+Rechnen im EUMEL-Editor.
+
+Das Programm TeCal ermöglicht einfache Rechnungen (ähnlich wie mit einem
+Taschenrechner) unter der Benutzung des Editors. Gleichzeitig stehen dem
+Benutzer aber alle Fähigkeiten des Editors zur Verfügung. TeCal ermöglicht
+Rechnungen auf einfache Weise zu erstellen oder Tabellenspalten zu berechnen.
+
+TeCal wird aus dem Editor heraus durch 'ESC t' oder durch das Editor-
+Kommando
+
+ tecal
+
+aktiviert. (Anmerkung: TeCal ist nicht standardmäßig insertiert). Dadurch
+wird in der untersten Zeile des Bildschirms eine Informationszeile aufgebaut,
+in der die (Zwischen-) Ergebnisse einer Rechnung zur Kontrolle festgehalten
+werden.
+
+Merke: TeCal ermöglicht einfache Rechnungen im EUMEL-Editor.
+
+
+
+Ein einfaches Beispiel
+
+Angenommen, Prokurist Meier der Firma 'Software Experts' muß eine Rechnung
+schreiben. Er schreibt u.a.:
+
+ ...
+ Wir berechnen Ihnen
+
+ 1 Manual 'Software Auswahl leicht gemacht' 112.30 DM
+ 1 Manual 'Ohne Fehler programmieren' 300.-
+
+ Summe
+
+Nun kann er die TeCal-Funktionen durch
+
+ ESC t
+
+zuschalten. (Natürlich kann TeCal auch schon während des Schreibens einge-
+schaltet sein, das Editorfenster ist dann nur um eine Zeile (nämlich die
+TeCal-Informationszeile) kürzer. Zuerst löscht Prokurist Meier eventuell
+vorhandene Zwischenergebnisse von TeCal (TeCal vergißt eine angefangene
+Rechnung durch Abschalten nicht!) mit
+
+ ESC C
+
+Das funktioniert wie eine CLEAR-Taste bei einem Taschenrechner, löscht also
+ggf. vorhandene Werte. In der Informationszeile (die letzte Zeile des Bild-
+schirms) erscheint darum als Wert '0.0'.
+
+Nun "fährt" er mit dem Cursor auf den ersten Wert ('112.30'). Dabei ist es
+belanglos, welche Ziffer er "trifft". Dann betätigt er
+
+ ESC L
+
+(für Lesen). Damit erscheint dieser Wert in der Informationszeile. Durch
+'ESC L' wird versucht, einen Wert von der Stelle aus der Datei zu lesen, die
+durch den Cursor angezeigt wird. (Gelingt dies nicht, erfolgt in der
+obersten Zeile eine Fehlermeldung). Dann betätigt er
+
+ ESC +
+
+weil er ja die zwei Werte addieren will. Das Zwischenergebnis in der TeCal-
+Informationszeile bleibt dadurch unverändert. Jetzt fährt er auf den zweiten
+Wert und betätigt erneut 'ESC L'. Nun erscheint der zweite Wert in der An-
+zeige. Um das Ergebnis der Rechnung zu erfahren, betätigt er
+
+ ESC =
+
+Die Summe der zwei Zahlen erscheint nun in der Informationszeile. Nun fährt
+er mit dem Cursor auf die Stelle, an der die Summe stehen soll und betätigt
+hier
+
+ ESC S
+
+(für Schreiben). Damit erscheint die eben errechnete Summe (412.30) an dieser
+Stelle der Datei.
+
+Man bedient TeCal also wie einen Taschenrechner. Man muß allerdings, um die
+Rechentasten zu bedienen, ESC zuvor drücken. Dies ist notwendig, um die
+"normalen" Tasten von den TeCal-Tasten zu unterscheiden.
+
+Merke: Mit einigen einfachen Tastendrücken können Berechnungen vorgenommen
+werden. 'ESC L' liest einen Wert von der aktuellen Cursor-Position, 'ESC S'
+schreibt den angezeigten TeCal-Wert an die aktuelle Cursor-Position. 'ESC C'
+löscht alle Werte im TeCal-Rechner.
+
+
+
+Einige weitere einfache Rechenoperationen
+
+In diesem Abschnitt werden weitere einfache Operationen von TeCal be-
+schrieben.
+
+Natürlich kann man mit TeCal nicht nur Addieren. Die folgenden Operationen
+laufen analog 'ESC +':
+
+ ESC - (Subtrahieren)
+ ESC * (Multiplizieren)
+ ESC / (Dividieren)
+
+Beispiel:
+
+ ...
+ Wir berechnen Ihnen
+
+ Artikelbezeichnung Anzahl Einzelpreis Summe
+
+ Schraube, verdreht 27 1.05 28.35
+
+ Gesamt 28.35
+
+Dazu drückt Prokurist Meier folgende Tasten:
+
+ Cursor auf Taste TeCal-Anzeige
+
+ 27 ESC C 0.00
+ unverändert ESC L 27.00
+ unverändert ESC * 27.00
+ 1.05 ESC L 1.05
+ unverändert ESC = 28.35
+ unter Summe ESC S 28.35
+ in Gesamtzeile ESC S 28.35
+
+Wie wir sehen, kann Prokurist Meier jederzeit seine Eingaben kontrollieren
+mit Hilfe der TeCal-Informationszeile.
+
+Anmerkung:
+
+'ESC S' schreibt den aktuellen Wert wie der Dezimal-Tabulator des Editors
+(vergleiche Kapitel Editor). Die Stelle, an der der Cursor steht, wird beim
+Schreiben die letzte Stelle vor dem Dezimalpunkt. Ziffern vor dem Dezimal-
+punkt werden also nach links, Ziffern nach dem Dezimalpunkt nach rechts ge-
+schrieben.
+
+Merke: ESC mit den Tasten '-', '+', '*' und '/' haben die gewohnte Wirkung.
+
+
+
+Die Verwendung von Klammern
+
+TeCal erlaubt bei Rechnungen die Eingabe von Klammern.
+
+Beispiel (wir haben hier die Taste ESC fortgelassen):
+
+ 2 * (3 + 5) = 16.00
+
+Merke: Klammern können bei Rechnungen beliebig verwendet werden.
+
+
+
+Der Prozent-Operator
+
+Angenommen, wir wollen 14 Prozent von 200 DM errechnen. Dann können wir wie
+gewohnt verfahren (für bessere Lesbarkeit zeigen wir hier für 'ESC L' den
+jeweiligen Wert):
+
+ 200 ESC % ESC =
+
+Der Prozent-Operator berechnet immer einen eingestellten Prozentsatz von dem
+gerade angezeigten Zwischenergebnis. Der eingestellte Prozentsatz wird in der
+Informationszeile angezeigt. Er läßt sich mit Hilfe des Kommandos
+
+ prozentsatz ('prozentzahl')
+
+verändern.
+
+Was müssen wir machen, um die 14 Prozent von 200 auf den Wert von 200 zu
+addieren? Ganz einfach:
+
+ 200 ESC + ESC % ESC =
+
+Wie wir solche Tastensequenzen einfacher erledigen können, zeigen wir in
+einem späteren Abschnitt.
+
+Merke: Der Prozent-Operator berechnet immer den eingestellten Prozentanteil
+vom angezeigten Wert.
+
+
+
+Spaltenweise summieren
+
+Da es beim Schreiben von Rechnungen o.ä. häufig vorkommt, daß eine ganze
+Zahlenkolonne addiert werden soll, besitzt TeCal eine Sonderfunktion, die es
+dem Benutzer erspart, mit dem Cursor auf jeden einzelnen Wert zu fahren und
+'ESC L' sowie 'ESC +' zu drücken. Durch
+
+ ESC V
+
+addiert TeCal zu der Zahl, auf der der Cursor steht alle, die in gerader
+Linie darüberstehen, solange bis eine Zeile gefunden wird, in der Text oder
+andere Zeichen stehen, die nicht zu einer Zahl gehören. Leerzeichen führen
+also nicht zum Abbruch der Rechnung. Nehmen wir an, Prokurist Meier hätte
+seine Rechnung soweit fertig :
+
+ ...
+ Wir berechnen Ihnen
+
+ Artikelbezeichnung Anzahl Einzelpreis Summe
+
+ Schraube, verdreht 27 1.05 28.35
+ Nagel, m. Kopf 33 0.50 16.50
+ Hammer, Spezialausführung m.
+ Eichenholzgriff 1 44.70 44.70
+ --------
+
+Um nun die Gesamtsumme zu berechnen fährt er einfach mit dem Cursor auf die
+unterste Zahl (44.70) und betätigt ESC V. In der Anzeige steht direkt die
+Gesamtsumme, die dann mit ESC S unter dem Strich eingetragen werden kann.
+
+Merke: Zahlenkolonnen können mit ESC V summiert werden.
+
+
+
+Direkte Eingabe
+
+Es kann ein Wert direkt in die Berechnung eingehen, ohne daß er vorher in
+der Datei stehen muß.
+
+Durch das Betätigen von
+
+ ESC E
+
+erscheint 'gib wert :' in der TeCal-Informationszeile. Nun kann ein Wert
+(wie im Editor) eingegeben werden, zugelassen ist auch ein ganzer Ausdruck
+wie z.B.
+
+ (3.00 DM + 5.00 DM) * 365 Tage - 2,00 DM * 12 Monate
+
+Dabei sind auch Buchstaben erlaubt, die aber überlesen werden. Betätigt man
+RETURN, wird der Ausdruck ausgewertet und der Wert in die Anzeige über-
+nommen. Für das oben gezeigte Beispiel steht die Anzeige also anschließend
+auf 2896. Auf diese Weise kann man auch einfach Zwischenrechnungen machen,
+ohne daß die verwendeten Zahlen irgendwo in der Datei stehen. Das Ergebnis
+kann man dann weiter verrechnen, als wäre es mit ESC L aus der Datei gelesen
+worden. Natürlich kann man es auch direkt mit ESC S in die Datei schreiben.
+
+Merke: Mit ESC E wird ein Wert direkt in TeCal aufgenommen. Durch Eingabe
+eines ganzen Rechenausdrucks lassen sich leicht auch Rechnungen durchführen,
+ohne daß die Zahlen in einer Datei stehen.
+
+
+
+TeCal und Lernen im Editor
+
+Bei sich wiederholenden Rechnungen ist es sinnvoll, Rechenoperationen "zu
+lernen" und auf eine Taste zu legen.
+
+Angenommen, Prokurist Meier hat häufig Rechnungen zu schreiben und muß des
+öfteren die Mehrwertsteuer und Bruttopreis unter die jeweiligen Nettopreise
+schreiben. Zu diesem Zweck kann er die "Lern"-Einrichtung des Editors
+benutzen (vergl. EUMEL-Benutzerhandbuch: Editor). Beim Lernen "merkt" sich
+der Editor jeden Tastendruck (also auch TeCal-Operationen). Die gelernten
+Tasten kann man anschließend mit einem Tastendruck abrufen. Meier kann die
+Operationen wie folgt vom Editor lernen lassen:
+
+Er fährt mit dem Cursor zuerst auf den Nettopreis, von der die Mehrwertsteuer
+errechnet werden soll. Dann betätigt er ESC HOP (es erscheint LEARN in der
+Kopfzeile des Editors). Dann schreibt er die TeCal-Operationen wie oben
+gezeigt (in diesem Falle also ESC L ESC + ESC % ; dann steht der Mehrwert-
+steuerbetrag in der Anzeige. Er fährt also mit dem Cursor eine Zeile tiefer
+und betätigt ESC S, dann geht er noch eine Zeile tiefer und gibt ESC = und
+wiederum ESC S um den Bruttobetrag zu berechnen und zu schreiben. Mit dem
+abschließenden ESC HOP und einer weiteren Taste (sagen wir mal 'm' als
+Abkürzung für Mehrwert) beendet er das Lernen. Nun kann er jederzeit die
+Mehrwertsteuer und Bruttobetrag unter einen gegebenen Nettobetrag schreiben,
+indem er ESC m betätigt.
+
+Praktischer Tip:
+
+Tabulator-Bewegungen kann man ebenfalls lernen. So ist es z.B. möglich, die
+Berechnung von Spalten- oder Reihensummen zu erlernen, indem man mit
+TAB jeweils zu dem nächsten Wert springt.
+
+Merke: Es können beliebige Rechnungen erlernt und auf eine Taste gelegt
+werden. Die gelernten Rechnungen können mit Hilfe einer Taste abgerufen
+werden.
+
+
+
+Benutzung des Merkregisters
+
+Mit
+
+ ESC M
+
+(für Merken) kann man ein gerade angezeigtes (Zwischen-) Ergebnis im
+Speicher aufbewahren, um es später an anderer Stelle wieder in die Rechnung
+einzubeziehen. Das geschieht, in dem man dann statt eine Zahl mit ESC L
+einzulesen
+
+ ESC K
+
+(für Konstante) eingibt. Dadurch wird die Zahl aus dem Merkregister wieder
+in die Anzeige übertragen, so daß man damit weiterrechnen kann.
+
+Merke: Man kann Zahlen mit ESC M abspeichern und mit ESC K wiederholen.
+
+
+
+Auskunft über TeCal-Funktionen
+
+Wenn Sie beim Arbeiten mit TeCal noch nicht so sicher sind oder eine Funktion
+benutzen möchten, die Sie sonst nur selten verwenden und deren genaue
+Wirkung sie vielleicht wieder vergessen haben, so hilft Ihnen
+
+ ESC ?
+
+weiter. Nach betätigen dieser Tasten meldet sich die TeCal Auskunft mit
+Funktionstaste drücken oder <?>. Dann geben Sie das Funktionssymbol ein, das
+Sie erklärt bekommen möchten. Geben Sie z.B. ein C ein, wenn Sie die Wirkung
+von ESC C wissen möchten. Daraufhin wird ein Text gezeigt, in dem die
+entsprechende Auskunft steht. In diesem Text können Sie sich wie im Editor
+bewegen. Wenn Sie den Text gelesen haben, können Sie das Fenster wieder mit
+ESC Q verlassen. Dadurch wird der alte Zustand vor der Auskunftsfunktion
+wiederhergestellt. Durch
+
+ ESC ? ?
+
+erklärt sich die Auskunft selbst. Sie bekommen dort unter anderem die Liste
+aller TeCal-Funktionen gezeigt.
+
+Merke: Mit ESC ? erhält man Auskünfte über TeCal-Funktionen.
+
+
+
+Einstellen von Nachkommastellen
+
+Durch das Kommando
+
+ kommastellen ('zahl')
+
+wird die Anzahl der angezeigten Nachkommastellen (0-9) eingestellt. Genau so
+viele Nachkommastellen werden auch bei ESC S oder ESC T geschrieben (intern
+wird aber jeweils mit höchster Genauigkeit gerechnet). Mit
+
+ ESC R
+
+kann man ein angezeigtes Zwischenergebnis auch intern auf die angezeigte Zahl
+von Nachkommastellen runden. Beispiel:
+
+ ESC ( 1 ESC / 3 ESC ) ESC * 2 ESC=
+
+führt zur Anzeige von 0.67 (bei zwei eingestellten Nachkommastellen). Gibt
+man jetzt (aber nach ESC ) noch ESC R ein, so wird das Zwischenergebnis von
+1/3 auf 0.33 gerundet, so daß das Endergebnis 0.66 beträgt.
+
+Merke: Im Kommandomodus kann man durch das Kommando 'kommastellen' die An-
+zahl der Nachkommastellen einstellen.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil12 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil12
new file mode 100644
index 0000000..ba5d0c6
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil12
@@ -0,0 +1,234 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 12: SPOOLER / OPERATOR
+
+1. Spooler-Übersicht
+
+Ein "Spooler" ist eine Warteschlange von Datenräumen#ie# (Dateien) vor einem
+"Worker":
+
+ +------------+ +------------+
+ -----> | | | |
+ -----> | spooler | ------------> | worker |
+ -----> | | | |
+ +------------+ +------------+
+
+Der Spooler puffert Dateien, die von beliebigen Tasks geschickt werden kön-
+nen, in seiner Warteschlange und gibt sie der Reihe nach dem Worker zur
+eigentlichen Verarbeitung. Ein typischer Einsatzfall (aber nicht der einzige)
+für ein solches System ist der EUMEL-Drucker in Multi-User-Systemen. Unab-
+hängig davon, ob der Drucker gerade aktiv ist und wieviele Dateien noch auf
+den Ausdruck warten, kann man seine Datei dem Druckspooler schicken und
+sofort danach weiterarbeiten.
+
+Da jeder Spooler und auch jeder Worker eine eigene Task ist, können Spooler
+nur im Multi-User-Systemen eingesetzt werden.
+
+Im folgenden wird nur die anwenderseitige Schnittstelle eines Spoolers be-
+schrieben.
+
+Merke: Ein Spooler puffert Dateien für einen Worker.
+
+
+
+2. Die Benutzung eines Spoolers
+
+Jeder Spooler im System ist eine eigene Task und hat dementsprechend einen
+Tasknamen, über den er angesprochen werden kann. So heißt der Druckspooler
+beispielsweise " PRINTER".
+
+Jede Task kann jedem Spooler durch Aufruf von 'save' eine Datei schicken.
+Beispiel:
+
+ save ("datei name", task ("spooler name"))
+
+(Vergl. auch TEIL 7). In der Regel ist ein SPOOLER für (mindestens) einen
+Drucker in einem EUMEL-System vorhanden. Dieser kann über den internen
+Task-Bezeichner 'print' angesprochen werden. Beispiel:
+
+ save ("datei name", printer)
+
+Eine so übergebene Datei kann man durch
+
+ erase ("datei name", printer)
+
+aus der Warteschlange löschen. (Natürlich nur solange sie sich noch in dieser
+Warteschlange befindet). Dabei kann man nur auf solche Dateien zugreifen, die
+aus der eigenen Task stammen. Durch Aufruf von
+
+ list (printer)
+
+wird die aktuelle Warteschlange des angegebenen Spoolers auf dem Terminal
+angezeigt, so daß man sich über die Anzahl der Dateien und die Position der
+eigenen Dateien im Spooler informieren kann.
+
+Aufbauend auf diesen allgemeinen Kommandos können weitere für spezielle
+Spooler programmiert werden. So gibt es für den Spooler 'printer' die Proze-
+duren
+
+ print und print ("datei name")
+
+die im wesentlichen auf
+
+ save ("datei name", printer)
+
+zurückgeführt werden.
+
+Merke: Einem SPOOLER kann man eine (oder mehrere) Dateien mit 'save'
+schicken. Mit 'list' kann man sich über die Dateien im SPOOLER informieren.
+Einem Drucker-SPOOLER übergibt man mit 'print' eine Datei.
+
+
+
+3. Privilegierte Spooler-Kommandos
+
+Gewisse Kommandos können einer #ib#Spooler-Task#ie# direkt im Dialog (ähn-
+lich wie im 'maintenance'-Zustand eines globalen Datei-Managers) gegeben
+werden. Dazu muß der Spooler mit 'continue' an ein Terminal geholt werden.
+Ist der SPOOLER durch ein Paßwort, so sind diese privilegierten Kommandos
+nicht für jeden Benutzer zugänglich.
+
+break
+ PROC break
+ Zweck: Beendet den Dialogzustand des Spoolers. Der Spooler koppelt sich
+ vom Terminal ab und geht in seinen normalen Verarbeitungsmodus
+ über.
+
+first
+ PROC first
+ Zweck: Vorziehen einer Datei in der Warteschlange auf den ersten Platz.
+ Alle Dateien von der zweiten an werden im Dialog zum Vorziehen
+ angeboten.
+
+start
+ PROC start
+ Zweck: Die (vorher gestoppte) Worker-Task wird neu kreiert und ge-
+ startet.
+
+stop
+ PROC stop
+ Zweck: Die Worker-Task wird abgebrochen und gelöscht. Damit wird auch
+ ein von ihr belegetes Terminal wieder frei.
+
+
+Hinweis: Die Kommandos 'start/stop' sind gut dazu geeignet, die Verarbeitung
+ einer Datei durch einen Worker (z.B. Druckoutput) abzubrechen, bei
+ Hardwareeingriffen zu stoppen oder Worker (wie z.B. Drucker) nur
+ zeitweise zu betreiben.
+
+Hinweis: Wenn der Worker mit Verzögerung abgebrochen werden soll, kann man
+ den Spooler an ein Terminal holen und dann so lange mit der Eingabe
+ von 'stop' warten, bis der Worker mit der gerade bearbeiteten Datei
+ fertig ist. Der Spooler kann in dieser Zeit nicht von anderen Tasks
+ oder dem Worker angesprochen werden.
+
+
+
+4. Der OPERATOR
+
+Im folgenden Abschnitt wird die standardmäßig implementierte Task OPERATOR
+erläutert. Erweiterungsmöglichkeiten sind im Systemhandbuch beschrieben. Dem
+OPERATOR stehen gewisse privilegierte Kommandos zur Verfügung. Diese Kom-
+mandos (System abschalten, fremde Tasks löschen u.a) werden vom "normalen"
+Benutzer des Multi-User-Systems nicht benötigt. Sie sind nur für den
+"Operateur" interessant. Es empfiehlt sich, OPERATOR mit einem Paßwort zu
+versehen, damit die priviligierten Kommandos nicht jedem Benutzer zur Ver-
+fügung stehen.
+
+
+
+Einschalten des EUMEL-Systems
+
+Wie ein EUMEL-System eingeschaltet wird, kann hier nicht beschrieben werden,
+weil dies abhängig von speziellen Rechnern ist (Lage des Ein/Aus-Schalters
+u.a.m.). Üblicherweise liefern die Hersteller für diesen Zweck bei der Aus-
+lieferung Anweisungen mit.
+
+Nach Einschalten des Rechnersystems befindet man sich in der Task OPERATOR.
+Diese Task dient zum kontrollierten Ein- und Ausschalten des EUMEL-Systems.
+Nach dem Einschalten wird man automatisch von der Task OPERATOR nach dem
+aktuellen Datum und der Uhrzeit gefragt. Nach Eingabe dieser Werte erfolgt
+
+ gib kommando :
+
+Der Benutzer befindet sich also in der Monitor-Ebene (vergl. dazu auch
+TEIL 2). Um die Task OPERATOR vom Terminal abzukoppeln, gibt man
+
+ break
+
+Nach Betätigen der SV-Taste erscheint dann
+
+ gib supervisor kommando :
+
+Nun kann man mit 'begin' oder 'continue' eine neue Task einrichten oder mit
+einer alten Task in der Arbeit fortfahren.
+
+Merke: Nach dem Einschalten gibt man das Datum und die Uhrzeit an.
+ Dann koppelt man die Task OPERATOR mit 'break' ab.
+
+
+
+EUMEL-System ausschalten
+
+Nachdem die Arbeiten in der Benutzer-Task beendet wurden, koppelt man die
+Task mit
+
+ break
+
+vom Terminal ab oder beendet die Task mit
+
+ end
+
+Achtung: Bei 'end' werden alle Dateien der Task gelöscht.
+
+Nach Betätigen der SV-Taste kann nun ein Supervisor-Kommando gegeben
+werden. Um das EUMEL-System kontrolliert auszuschalten, muß man die Task
+OPERATOR wieder an das Terminal holen. Das erfolgt mit
+
+ continue ("OPERATOR")
+
+Die OPERATOR-Task meldet sich mit
+
+ gib kommando :
+
+Nun kann man das Kommando
+
+ shutup
+
+geben, welches das System kontrolliert abschließt. 'shutup' garantiert, daß
+alle Dateien auf dem Hintergrund des EUMEL-Systems gesichert werden. Wird
+das EUMEL-System ohne 'shutup' ausgeschaltet (z.B. indem der Rechner einfach
+ausgeschaltet wird), können die Informationen, die seit dem letzten Fixpunkt
+(üblicherweise 15 Minuten) aufgelaufen sind, verloren sein.
+
+Merke: In der Task OPERATOR wird mit dem Kommando 'shutup' das EUMEL-System
+kontrolliert abgeschaltet.
+
+
+
+Übersicht über die #ib#OPERATOR-Kommandos
+
+end
+ PROC end (TASK CONST task)
+ Zweck: Löschen der Task 'task'. Hierbei findet keine Paßwortüberprüfung
+ statt. Darum sollte die Task OPERATOR auch mit einem Paßwort
+ versehen sein, weil man vom OPERATOR jede Task löschen kann.
+ Beispiel:
+
+ end (task ("hugo")) (* oder: *)
+ end (/"hugo")
+
+set date
+ PROC set date
+ Zweck: Einstellen des Datums und der Uhrzeit. Das Erfragen der Werte
+ erfolgt interaktiv.
+
+shutup
+ PROC shutup
+ Zweck: Kontrolliertes Herunterfahren des gesamten Systems. Alle Tasks
+ bleiben mit ihren Daten erhalten. Beim Start des Systems meldet
+ sich die OPERATOR-Task wieder auf dem gleichen Terminal. Das
+ Kommando sollte deshalb möglichst nur am Terminal 0 gegeben
+ werden. Nach dem Start sollte der OPERATOR mit 'break' vom
+ Terminal abgekoppelt werden.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil2 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil2
new file mode 100644
index 0000000..c70ddfc
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil2
@@ -0,0 +1,628 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 2: Supervisor/Monitor
+
+
+1. Task-Organisation
+
+In diesem Kapitel wird die Task-Verwaltung und der Task-Baum beschrieben.
+
+Alle Tasks des EUMEL-Systems werden in einen Task-Baum eingebunden. Das be-
+deutet, daß die Task eines Benutzers automatisch einen "Vater" besitzt, aber
+auch neue Tasks ("Söhne") erzeugen kann. In einem EUMEL-System gibt es in
+der Regel zwei spezielle Tasks (#ib#UR#ie# und #ib#SUPERVISOR#ie#). Alle
+anderen Tasks sind Söhne oder Enkel dieser Tasks. Zum Beispiel:
+
+Die mit großen Buchstaben geschriebenen Tasknamen sind "System"-Tasks; die
+mit kleinen Buchstaben geschriebenen Tasknamen sind Benutzer-Tasks (dies
+ist nicht zwingend, sondern Konvention).
+
+- SUPERVISOR: Übernimmt das Einrichten bzw. Löschen von Tasks.
+
+- OPERATOR: Übernimmt u.a. die Aufgaben für das Ein- bzw. Ausschalten des
+ EUMEL-Systems.
+
+- ARCHIVE: Übernimmt die Auslagerung von Dateien auf Archive.
+
+- UR: Ist der "Urvater" des EUMEL-Systems, enthält u.a. den
+ ELAN-Compiler.
+
+- PUBLIC: Enthält Dateien, die längerfristig gehalten werden müssen und
+ die alle Benutzer des Systems benötigen.
+
+
+Der Task-Baum hat folgende Bedeutung:
+
+Eine Task, die sich "unter" einer anderen befindet, ist ein "Sohn" dieser
+"Vater"-Task. Beispielsweise ist die Task PUBLIC ein Sohn von UR (und UR ist
+somit Vater von PUBLIC).
+
+Die für eine Task zur Verfügung stehenden Datentypen und Operationen (d.h.
+die Objekte, die aus insertierten ELAN-Paketen herausgereicht werden), sind
+durch die direkte aufsteigende Linie im Task-Baum vorgegeben. Die in "Vater-
+Tasks" insertierten und über die Schnittstelle herausgereichten Objekte
+stehen in den "Söhnen" automatisch zur Verfügung. Beispielsweise stehen einer
+Sohn-Task von 'user 1' alle insertierten Objekte aus der 'user 1'-Task zur
+Verfügung (zusätzlich zu denen, die in UR und PUBLIC insertiert wurden).
+Somit ist leicht möglich, unterschiedliche Sprachmengen des ELAN-Compilers
+zur Verfügung zu stellen. Vergl. dazu auch das Kapitel über den ELAN-
+Compiler.
+Ähnliches gilt bei Dateien. So ist es erlaubt, Dateien zu direkten Vätern und
+Söhnen im Taskbaum zu transportieren, aber nicht unmittelbar in "parallele"
+Tasks. Man kann somit in der 'user 1'-Task Dateien von UR oder PUBLIC be-
+ziehen, aber nicht von 'user 2' (da diese Task eine "parallele" Task ist).
+Soll das trotzdem geschehen, so muß eine Datei erst von 'user 1' zu PUBLIC
+geschickt werden und dann von 'user 2' dort abgeholt werden. Genaueres über
+solche Operationen findet man im Benutzerhandbuch über die Datenräume.
+
+Einige Tasks sind speziell dafür eingerichtet, Dateien für mehrere Nutzer
+aufzubewahren. So sind UR und PUBLIC Tasks, die Dateien verwalten, die
+längerfristig gehalten werden sollen. Solche Tasks werden "Manager"-Tasks
+genannt.
+
+
+2. Supervisor und Tasks
+
+Eine Task ist für einen Benutzer ein "eigener Rechner", in der er Programme
+bearbeiten lassen und/oder Daten aufbewahren kann, ohne von anderen Nutzern,
+die gleichzeitig im System arbeiten, gestört zu werden. Der Supervisor er-
+möglicht u.a. die Einrichtung, Weiterbearbeitung und Beendigung einer Task.
+
+
+Überblick
+
+Eine Task ist im EUMEL-System ein selbständiger Prozeß. Zu jedem Program-
+mierer an einem Terminal gehört eine damit verbundene Task. Für den Benutzer
+ist diese Task sozusagen ein "eigener Rechner". In einem EUMEL-System sind
+zur gleichen Zeit noch weitere Tasks vorhanden, so z.B. zum Start und Ab-
+schalten des Systems (OPERATOR), zur Druckersteuerung (SPOOLER), zur Ver-
+waltung längerfristig benötigter Dateien u.a.m..
+
+Der Supervisor ist auf der ELAN-Ebene des EUMEL-Systems der Betriebssystem-
+kern. Seine Aufgabe ist im wesentlichen die Task-Verwaltung, nämlich die Er-
+richtung und das Löschen von Tasks. Im einfachsten Fall kommt ein Benutzer
+des EUMEL-Systems mit dem Supervisor also nur bei den Supervisor-Kommandos
+in Kontakt, die den Beginn und das Ende einer Task steuern.
+
+Jede Task wird in einen "Taskbaum" eingeordnet. Jede Benutzer-Task ist
+"Sohn" einer bereits vorhandenen "Vater"-Task und "erbt" von dieser vorüber-
+setzte Programme. Man kann Dateien zu einer Vater-Task schicken oder von
+dieser empfangen.
+
+
+Eine neue Task beginnen
+
+Mit dem Supervisor-Kommando 'begin' kann eine neue Task eingerichtet werden.
+
+Soll eine neue Arbeit im EUMEL-System begonnen werden, muß eine neue Task
+eingerichtet werden. Dazu muß das Supervisor-Kommando 'begin' gegeben
+werden. Jedes Supervisor-Kommando muß durch die Betätigung der SV-Taste
+eingeleitet werden. Dadurch meldet sich das EUMEL-System mit
+
+ gib supervisor kommando :
+
+Jetzt kann eines der Supervisor-Kommandos gegeben werden. In unserem Fall
+wollen wir mit dem 'begin'-Kommando eine neue Task einrichten. Beispiel:
+
+ begin ("rainer")
+
+errichtet eine neue Task in dem EUMEL-System mit dem Namen 'rainer'. Die
+Task meldet sich mit
+
+ gib kommando :
+
+Nun kann ein beliebiges Monitor-Kommando gegeben werden.
+
+Wird eine Task in der geschilderten Weise eingerichtet, ist diese Task im
+Taskbaum automatisch ein "Sohn" der Task 'PUBLIC'. 'PUBLIC' ist in der Lage,
+Dateien von der neuen Sohn-Task zu empfangen ('save'-Kommando) oder man kann
+Dateien von 'PUBLIC' in die Sohn-Task holen ('fetch'-Kommando). Solche Tasks,
+die Dateien verwalten können, werden 'manager' genannt.
+
+Merke: Nach dem Betätigen der SV-Taste meldet sich der Supervisor.
+ Mit dem 'begin'-Kommando wird eine neue Task eingerichtet.
+
+
+
+Eine Task ab- und ankoppeln
+
+Mit dem 'break'- und 'continue'-Kommandos können die Arbeiten in einer Task
+unterbrochen und später wieder aufgenommen werden.
+
+Soll die Arbeit in einer Task unterbrochen werden, so kann man das (Monitor-)
+Kommando
+
+ break
+
+geben, welches die Task vom Benutzer-Terminal abkoppelt. Die Task wird dann
+vom System als "Hintergrund-Task" geführt, bleibt also weiterhin bestehen.
+Mit dem Supervisor-Kommando
+
+ continue ("meine task")
+
+kann eine solche "abgekoppelte" Task wieder an ein Terminal angekoppelt und
+die unterbrochenen Arbeiten weitergeführt werden.
+
+Mit 'break' wird eine Task unterbrochen, während durch das 'continue'-Kom-
+mando die Arbeiten fortgesetzt werden können.
+
+
+
+Eine Task beenden
+
+Mit dem 'end'-Kommando wird eine Task beendet und gelöscht.
+
+Sind die Arbeiten in einer Task beendet, so sollte sie aus dem System ent-
+fernt werden. Dies erfolgt mit dem Kommando
+
+ end
+
+Nach einer Rückfrage des Systems wird die Task gelöscht. Beachte, daß mit dem
+Löschen der Task auch alle in ihr befindlichen Dateien gelöscht werden.
+
+Merke: Mit dem 'end'-Kommando wird eine Task beendet und alle in ihr befind-
+lichen Daten werden gelöscht.
+
+
+
+Eine Task als Sohn einer Task einrichten
+
+Mit dem 'begin'-Kommando ist es auch möglich, eine Task als Sohn einer be-
+stimmten Task einzurichten. Damit die Vater-Task auch Dateien der einzu-
+richtenden Sohn-Task verwalten kann, muß man sie vorher zu einer 'manager'-
+Task machen.
+
+In der Regel richtet man seine Task als Sohn von PUBLIC ein. Das erfolgt
+automatisch, sofern man im 'begin'-Kommando nichts anderes als den neuen
+Tasknamen angibt. Manchmal ergibt sich aber die Notwendigkeit, eine Task als
+Sohn einer bestimmten Task einzurichten. Gründe können dafür u.a. sein:
+
+- Man will eine eigene Datei-Hierarchie über mehrere Tasks einrichten.
+
+- Man will ein Programmsystem anderen Benutzern zur Verfügung stellen.
+
+Damit eine Task als Vater für andere, noch einzurichtende Task arbeiten kann,
+muß man sie zuerst zu einer 'manager'-Task machen. Das erfolgt mit dem
+Kommando
+
+ global manager
+
+Dies Kommando muß in der Task gegeben werden, die eine Vater-Task werden
+soll. Damit wird die Task befähigt, Söhne einzurichten und Dateien, die von
+einem (oder mehreren) Söhnen geschickt werden, zu verwalten.
+
+Durch das 'global manager'-Kommando wird implizit ein 'break'-Kommando ge-
+geben, so daß der Benutzer in der Supervisor-Ebene landet. Koppelt man nun
+zu irgendeinem Zeitpunkt diese (zunächst potentielle) Vater-Task wieder an
+('continue'-Kommando), meldet sich die Task nicht wie gewohnt mit 'gib
+kommando :', sondern mit
+
+ maintenance :
+
+um anzudeuten, daß es sich um eine 'manager'-Task handelt.
+
+Um eine Sohn-Task "unterhalb" der 'manager'-Task einzurichten, gibt man das
+'begin'-Kommando, wobei man die Vater-Task mit angibt. Beispiel:
+
+ begin ("rainer", "vatername")
+
+richtet eine neue Task 'rainer' ein, die als Sohn der Vater-Task 'vatername'
+in den Taskbaum eingeordnet wird.
+
+Merke: Das Kommando 'global manager' macht eine Task zu einer 'manager'-Task.
+Mit dem 'begin'-Kommando kann man auch eine Task als Sohn einer bestimmten
+Task einrichten.
+
+
+
+Ein laufendes Programm unterbrechen
+
+Mit dem Betätigen der SV-Taste und dem Supervisor-Kommando 'halt' kann ein
+Programm abgebrochen werden.
+
+Soll ein Programm, welches gerade ausgeführt wird, vorzeitig abgebrochen
+werden, so betätigt man die SV-Taste und gibt das Supervisor-Kommando
+
+ halt
+
+Anschließend kann man wieder ein Monitor-Kommando geben, weil man durch das
+'halt'-Kommando automatisch wieder in seine Task gelangt.
+
+Merke: Mit dem 'halt'-Kommando wird ein Programm abgebrochen.
+
+
+
+Eine Task mit Paßwort schützen
+
+Man kann eine Task durch ein Paßwort vor unberechtigtem Zugriff schützen.
+
+Das Kommando
+
+ task password
+
+welches nur im Monitor gegeben werden kann, sorgt dafür, daß eine Task fort-
+an nur wieder mit einem 'continue'-Kommando 'betreten' werden kann, wenn man
+vorher das richtige Paßwort angibt. Beispiel:
+
+ task passwort ("mein geburtstag")
+
+Versucht nun ein Benutzer, die mit dem Paßwort geschützte Task mit dem
+'continue'-Kommando an sein Terminal anzukoppeln, wird er zunächst nach dem
+'Paßwort' gefragt. Nur unter Angabe des Paßwortes wird die Task angekoppelt. #count("1")#)
+
+Man sollte Paßwörter möglichst behalten! Durch Paßwörter geschützte Tasks
+kann niemand - außer durch die Angabe des korrekten Paßworts - die Task
+wieder ankoppeln. Hat man das Paßwort vergessen, kann man nur noch die Task
+löschen.
+
+Damit ist gewährleistet, daß kein unberechtigter Benutzer an die Dateien und
+Programme der Task gelangen kann. Es gibt jedoch noch zwei Situationen, die
+einen unberechtigten Zugang zu Dateien erlauben:
+
+a) Dateien in die Vater-Task schicken:
+ Transportiert man Dateien in die Vater-Task ('save'-Kommando, vergl. auch
+ Teil 7: Datei-Verwaltung), können Benutzer auf diese Dateien zugreifen
+ (sofern sie Zugang zu dieser Task haben). Dies kann man verhindern, in dem
+ man ein Datei-Paßwort angibt (siehe Teil 7 für die Beschreibung dieser
+ Paßworte). Man beachte, daß das Paßwort für Dateien und das oben be-
+ schriebene Paßwort für Tasks nichts miteinander zu tun haben.
+
+b) Dateien werden in eine Sohn-Task geholt:
+ Ist die Task als Vater-Task eingerichtet (Kommando 'global manager') dann
+ ist es möglich, von der Sohn-Task Dateien ('fetch'-Kommando) aus der
+ Vater-Task zu holen, die mit einem Paßwort geschützt ist. Darum muß man
+ verhindern, daß Unberechtigte Söhne einer mit Paßwort geschützten Task
+ einrichten können. Das kann man mit dem Kommando
+
+ begin password ("geheim")
+
+ Wird dieses Kommando gegeben, wird man bei dem Versuch, eine Sohn-Task
+ einzurichten, nach einem Paßwort gefragt. Beachte, daß das 'begin-
+ password' nichts mit dem Task-Paßwort und Datei-Paßwort zu tun hat.
+
+Merke: Mit dem 'task password'-Kommando wird eine Task durch ein Paßwort
+geschützt.
+
+
+
+Informations-Kommandos
+
+(Die Informations-Kommandos können auch vom Monitor aus gegeben werden).
+
+Mit der Informationsprozedur
+
+ task status
+
+können Sie sich über den Zustand einer Task informieren. Beispiele:
+
+ task status (* informiert über die eigene Task *)
+ task status (father) (* informiert über die Vater-Task *)
+
+'task status' informiert u.a. über die verbrauchte CPU-Zeit der Task, den
+belegten Speicherplatz (man beachte, daß Dateien mit Vater-Tasks oder Sohn-
+Tasks werden), den Kanal, an dem die Task angekoppelt ist und dem Zustand
+der Task (vergl. auch 'task info').
+
+Mit der Prozedur
+
+ task info
+
+können Sie eine Übersicht über alle in dem System befindlichen Tasks er-
+halten.
+Mit dem Kommando
+
+ storage info
+
+kann man erfahren, wieviel Speicherplatz auf dem EUMEL-Hintergrund (noch)
+zur Verfügung steht.
+
+Durch einige Kommandos, die man nur vom Monitor aus geben kann, kann man
+sich den Namen von Tasks liefern lassen. Die Kommandos
+
+ myself
+ father
+
+liefern den (internen) Task-Namen. Mit dem Kommando
+
+ name
+
+bekommt man den internen Tasknamen in einen Text gewandelt. Beispiel:
+
+ put (name (myself))
+ put (name (father))
+
+Mit dem Kommando
+
+ rename myself
+
+kann der Task-Name der Benutzer-Task geändert werden.
+
+Merke: Durch die Informations-Kommandos 'storage info' und 'task info' kann
+man erfahren, wieviel Speicherplatz und welche Tasks in dem EUMEL-System
+sind. Mit den Kommandos 'myself' und 'father' kann man mehrere Dateien auf
+einmal manipulieren (vergl. Teil 7).
+
+
+
+Übersicht über Supervisor- und Task-Kommandos
+
+In diesem Abschnitt werden alle Supervisor- und Task-Kommandos in der ELAN-
+Notation dargestellt.
+
+Die Supervisor-Kommandos entsprechen - wie alle anderen Kommandos im EUMEL-
+System - der ELAN-Syntax (Kommando-Namen werden klein geschrieben, Parameter
+in Klammern, mehrere Parameter durch Kommata getrennt, TEXT-Parameter in
+Anführungstrichen usw.). Dabei ist jedoch zu beachten, daß diese Kommandos
+zum Teil nur im Supervisor-Zustand (vorheriges Betätigen der SV-Taste) ge-
+geben werden können. Die Kommandos 'break', 'end', 'storage info' und
+'task info' können auch im Monitor gegeben werden.
+Folgende Supervisor-Kommandos stehen zur Verfügung:
+
+begin
+ PROC begin (TEXT CONST task name)
+ Zweck: Richtet eine neue Task als Sohn von PUBLIC ein.
+
+ PROC begin (TEXT CONST task name, father task name)
+ Zweck: Richtet eine neue Task als Sohn der 'father task name'-Task ein.
+
+begin password
+ PROC begin password (TEXT CONST geheim)
+ Zweck: Verhindert das unberechtigte Einrichten einer Sohn-Task.
+
+break
+ PROC break
+ Zweck: Die zum Terminal aktuell zugeordnete Task wird abgekoppelt. Sie
+ wird damit zu einer Hintergrund-Task, d.h. sie wird entweder bis
+ zu ihrem Ende oder bis zur nächsten angeforderten Terminal-Ein-/
+ Ausgabe oder bis zum nächsten 'continue'- Kommando weiter be-
+ arbeitet.
+
+continue
+ PROC continue (TEXT CONST task name)
+ Zweck: Eine im Hintergrund laufende Task wird an das Terminal des
+ Benutzers angekoppelt.
+
+end
+ PROC end
+ Zweck: Die zum Terminal aktuell gehörende Task wird abgebrochen und
+ gelöscht. Das Kommando ist im Monitor verfügbar.
+
+father
+ TASK PROC father
+ Zweck: Liefert den internen Tasknamen.
+
+global manager
+ PROC global manager
+ Zweck: Macht eine Task zur 'manager'-Task. Erst nach Aufruf dieser
+ Prozedur sind Sohn-Tasks möglich.
+
+halt
+ PROC halt
+ Zweck: Das laufende Programm der dem Terminal aktuell zugeordneten Task
+ wird abgebrochen. Im Gegensatz zum 'end'-Kommando wird nur das
+ laufende Programm abgebrochen, aber die Task wird nicht gelöscht.
+ Genauer:
+ Es wird der Fehler 'halt from terminal' induziert. Normalerweise
+ wird das Programm dadurch wie durch jeden anderen Fehler abge-
+ brochen. Genaueres findet man im Systemhandbuch unter Fehler-
+ behandlung.
+
+name
+ TEXT PROC name (TASK CONST interner name)
+ Zweck: Wandelt den internen Task-Namen in einen TEXT.
+
+rename myself
+ PROC rename myself (TEXT CONST neuer name)
+ Zweck: Umbenennen einer Benutzer-Task.
+
+myself
+ TASK PROC myself
+ Zweck: Liefert den internen Task-Namen der Benutzer-Task.
+
+storage info
+ PROC storage info
+ Zweck: Informationsprozedur über den verfügbaren Hintergrund-Speicher.
+
+task info
+ PROC task info
+ Zweck: Informiert über alle Tasknamen im System unter gleichzeitiger An-
+ gabe der Vater/Sohn-Beziehungen (Angabe durch Einrückungen).
+
+ PROC task info (INT CONST art)
+ Zweck: Informiert über alle Tasks im System. Mit 'art' kann man die Art
+ der Zusatz-Information auswählen. Für 'art' sind zur Zeit
+ folgende Werte zugelassen:
+
+ 1: entspricht 'task info' ohne Parameter, d.h. gibt nur die
+ Tasknamen unter angabe der Vater/Sohn-Beziehungen aus.
+
+ 2: gibt die Tasknamen aus. Zusätzlich erhalten Sie Informationen
+ über die verbrauchte CPU-Zeit der Task, die Priorität, den
+ Kanal, an dem die Task angekoppelt ist und den eigentlichen
+ Taskstatus. Hierbei bedeuten:
+
+ 0 -busy- Task ist aktiv.
+ 1 i/o Task wartet auf Beendigung des Outputs
+ oder auf Eingabe.
+ 2 wait Task wartet auf Sendung von einer anderen
+ Task.
+ 4 busy-blocked Task ist rechenwillig, aber blockiert.
+ 5 i/o -blocked Task wartet auf I/O, ist aber blockiert.
+ 6 wait-blocked Task wartet auf Sendung, ist aber blockiert.
+ Achtung: Die Task wird beim Eintreffen einer
+ Sendung automatisch entblockiert.
+
+ 3: wie 2, aber zusätzlich wird der belegte Speicher angezeigt.
+ (Achtung: Prozedur ist aufwendig!). Beachten Sie, daß Dateien
+ mit Väter/Söhnen "geshared" werden. Beispiel:
+ Mit 'begin ("sohn", "vater")' wird eine neue Task eingerichtet.
+ Für 'sohn' wird in diesem Zustand der gleiche belegte Speicher
+ angezeigt wie für 'vater'. Erst wenn (Datei-)Operationen in
+ der Sohn- oder Vater-Task vorgenommen werden, wird ein unter-
+ schiedlicher Speicherplatz angezeigt.
+
+task status
+ PROC task status
+ Zweck: Informationsprozedur über den Zustand der eigenen Task.
+ Informiert u.a. über
+ - Name der Task, Datum und Uhrzeit;
+ - verbrauchte CPU-Zeit;
+ - belegten Speicherplatz;
+ - Kanal, an den die Task angekoppelt ist;
+ - Zustand der Task (rechnend u.a.m.);
+ - Priorität.
+
+ PROC task status (TASK CONST t)
+ Zweck: Wie obige Prozedur, aber über die Task mit dem internen Task-
+ namen 't'. Beispiel: task status (father)
+
+task password
+ PROC password (TEXT CONST geheim)
+ Zweck: Einstellen eines Paßworts für eine Task im Monitor. Das Kommando
+ 'task password' ist ein Monitor-Kommando. Ist eine Task mit einem
+ Paßwort geschützt, so wird durch den Supervisor nach dem
+ 'continue'-Kommando das Paßwort angefragt. Nur nach Eingabe des
+ richtigen Paßworts gelangt man in die gewünschte Task. Das Paß-
+ wort kann durch nochmaligen Aufruf von 'task password' geändert
+ werden, z.B., wenn es in regelmäßigen Abständen geändert werden
+ muß, um personenbezogene Daten zu schützen.
+
+ Es gibt keine Möglichkeit, ein einmal eingestelltes Paßwort in
+ Erfahrung zu bringen. Sollte das Paßwort vergessen werden, kann
+ somit die Task nur noch gelöscht werden.
+
+ Wird als Paßwort ein '-'-Zeichen eingegeben, so wird verhindert,
+ daß die betreffende Task jemals wieder mit dem 'continue'-Kom-
+ mando angekoppelt werden kann. Dies ist z.B. für Manager-Tasks
+ sinnvoll.
+
+
+
+3. Der Monitor
+
+Der EUMEL-Monitor führt den Dialog mit dem Benutzer innerhalb einer Task. In
+diesem Kapitel werden nur die Ausführung der Kommandos und die Kommando-
+Arten beschrieben, während die einzelnen Kommandos selbst in den jeweiligen
+Kapiteln des Benutzerhandbuchs erläutert werden.
+
+Der Monitor ermöglicht es, Leistungen im Dialog mit Hilfe von Kommandos
+(ELAN-Prozeduraufrufen) vom EUMEL-Betriebssystem anzufordern. Nach dem
+Beginn einer Sitzung meldet sich der Monitor mit
+
+ gib kommando :
+
+Danach kann der Benutzer Monitor-Kommandos geben. Erfolgt dabei ein Schreib-
+fehler, so kann er (wie beim Editor) innerhalb der Zeile positionieren, über-
+schreiben, löschen, einfügen u.a.m.. Die Ausführung des/der Kommandos wird
+mit der Taste RETURN ausgelöst. Nach Abschluß einer Kommando-Ausführung er-
+scheint wieder obige Meldung. Die Tastenfolge ESC k stellt das zuletzt gege-
+bene Kommando wieder dar.
+
+Monitor-Kommandos müssen gemäß der ELAN-Syntax geschrieben werden (Kommando-
+Namen werden klein geschrieben, Parameter in Klammern, mehrere Parameter
+durch Kommata getrennt, TEXT-Parameter in Anführungstrichen usw.). Beispiele:
+
+ edit ("meine datei")
+ copy ("meine datei", "Duplikat")
+
+Bei den meisten Kommandos mit einem TEXT-Parameter kann der Parameter fort-
+gelassen werden. Der Monitor versorgt das Kommando immer mit dem zuletzt an-
+gegebenen Parameter und zeigt dies auch auf dem Bildschirm des Benutzers an.
+Beispiel:
+
+ edit ("Datei vom 17.4.")
+
+schreibt der Nutzer nun z.B.
+
+ run
+
+und betätigt RETURN, dann ergänzt der Monitor das Kommando:
+
+ run ("Datei vom 17.4.")
+
+Monitor-Kommandos sind einzeilige ELAN-Programme, die dem ELAN-Compiler zur
+Übersetzung und anschließender Ausführung zugeleitet werden. Darum können
+die Monitor-Kommandos auch von Programmen aus verwendet werden. Falsch ge-
+schriebene oder nicht vorhandene Kommandos werden vom ELAN-Compiler mit ent-
+sprechender Fehlermeldung abgewiesen. Oft benutzte Kommandos werden aus
+Effizienzgründen vom Monitor selbst interpretiert und ausgeführt. Durch die
+automatische Überleitung von Kommandos zum ELAN-Compiler ist es möglich
+
+a) einzeilige ELAN-Programme direkt in der Monitor-Ebene ausführen zu
+ lassen, d.h. ohne das Programm in eine Datei zu schreiben. Beispiel:
+
+ put (sin (0.5))
+
+b) mehrere Kommandos (ELAN-Anweisungen), durch ";" getrennt, auf einmal zu
+ schreiben. Beispiele:
+
+ edit ("datei"); lineform ("datei"); print ("datei")
+ INT VAR i; FOR i FROM 1 UPTO90 REP print ("x") ENDREP
+
+c) eine Erweiterung des Kommando-Vorrats jederzeit vorzunehmen, indem man
+ die gewünschte Prozedur (in einem PACKET "verpackt") 'insertiert'.
+
+Im folgenden werden die am häufigsten benutzten Kommandos aufgeführt.
+Genauere Informationen über die einzelnen Kommandos findet man in den
+entsprechenden Kapiteln des Benutzerhandbuchs.
+
+Informations-Kommandos
+
+ storage info Belegter externer Speicher
+ task info Zeigt die im System befindlichen Tasks
+ task status Zustände der im System befindlichen Tasks
+
+
+Verbindung zum Supervisor
+
+ end Task und die in ihr befindlichen Dateien
+ löschen
+ break Task abkoppeln
+ task password ("geheim") Paßwort einstellen
+
+
+Editor-Kommandos
+
+ edit ("datei") Datei editieren
+ edit ("datei1", "datei2") Parallel-Editor
+
+
+Compiler-Kommandos
+
+ run ("datei") Übersetzen und ausführen eines ELAN-Programms
+ run again Letztes übersetztes Programm nochmal aus-
+ führen
+ insert ("datei") Übersetztes Programm eintragen
+
+
+Datei-Kommandos
+
+ copy ("datei", "duplikat") Datei kopieren
+ rename ("alt", "neu") Datei umbenennen
+ reorganize ("datei") Datei "reorganisieren"
+ fetch ("datei") Datei von Vater-Task holen
+ save ("datei") Datei zur Vater-Task schicken
+ erase ("datei") Datei in Vater-Task löschen
+ forget ("datei") Datei in Benutzer-Task löschen
+ list Dateien der Benutzer-Task anzeigen
+
+
+Archiv-Kommandos
+
+ archive ("name") Archiv mit einem Namen reservieren
+ release (archive) Archiv freigeben
+ clear (archive) Löscht ein Archiv
+ list (archive) Dateien des Archivs anzeigen
+ save all (archive) Archiviert alle Dateien einer Task
+ fetch all (archive) Holt alle Dateien eines Archivs in eine Task
+ save ("datei", archive) Datei archivieren
+ fetch ("datei", archive) Datei vom Archiv holen
+
+
+Textkosmetik und Drucker
+
+ lineform ("datei") Zeilenweises Formatieren
+ pageform ("datei") Seitenweises Formatieren
+ index ("datei") Stichwort- und Inhaltsverzeichnis
+ print ("datei.p") Drucken
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil3 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil3
new file mode 100644
index 0000000..eaf1ed6
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil3
@@ -0,0 +1,2097 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 3: Editor
+
+Vorwort
+
+Der EUMEL-Editor ist ein Programm zur Bearbeitung von Texten. Er bietet
+vielfältige Möglichkeiten, um Autoren oder Programmierer bei dem Erstellen,
+Korrigieren und Gestalten von Manuskripten oder Programmen zu unterstützen.
+Die größte Hilfe beim Schreiben besteht (durch die Speicherfähigkeit von
+Computern) aus dem Zugriff auf einmal geschriebene Informationen. Im Gegen-
+satz zu einer Schreibmaschine können durch den EUMEL-Editor (beliebig oft)
+Einfügungen vorgenommen, Texte korrigiert, gelöscht und umgeordnet werden.
+Somit ist das Schreiben von Texten mittels des EUMEL-Systems besonders dann
+vorteilhaft und zeitsparend, wenn Texte häufig geändert werden oder wenn
+sie in einer besonders schönen Form gedruckt werden sollen (sofern ein ent-
+sprechender Drucker zur Verfügung steht). Weiterhin bietet der Editor Hilfen
+zum Schreiben an, wie z.B. automatischen Wortumbruch am Zeilenende, eine
+Einrückungsautomatik, "Lernen" von Texten u.a.m.. Zusätzlich kann der Editor
+in seinen Fähigkeiten erweitert und somit für spezielle Schreibarbeiten an-
+gepaßt werden. Bei der Entwicklung des Editors wurde besonderer Wert auf
+einfache Bedienung gelegt: innerhalb von wenigen Minuten kann schon ge-
+schrieben werden und auf dem Bildschirm sieht man direkt, was mit dem Text
+passiert. Das Schreiben und die Korrektur werden durch einige wenige, aber
+leistungsstarke Funktionstasten unterstützt.
+
+Anfänger sollten zumindest das erste Kapitel lesen, bevor mit dem Schreiben
+begonnen wird. Dort wird geschildert, wie auf einfache Weise Texte ge-
+schrieben und geändert werden können. Die beschriebenen Tätigkeiten sollte
+man an einem kleinen Probetext erst einmal ausprobieren. Lesen und an-
+schließendes Ausprobieren eines der hier beschriebenen Vorgänge beschleunigt
+stark das Erlernen der Funktionen des Editors.
+
+Weitere Fähigkeiten des Editors werden in den folgenden Kapiteln erläutert.
+Diese Kapitel sollte man lesen, wenn die ersten Texte geschrieben worden
+sind. Die dort erklärten Möglichkeiten des Editors kann man dann bei Bedarf
+nachlesen, erlernen und einsetzen. Im letzten Kapitel werden Programmierern
+Hinweise gegeben, wie sie die Benutzerschnittstelle des Editors an indivi-
+duelle Bedürfnisse anpassen können.
+
+Einige Gestaltungsmöglichkeiten für Texte kann man nicht auf dem Terminal
+"sehen", wie z.B. Proportionalschriften, Fettdruck usw.. Solche Leistungen
+können durch Anweisungen an die Textkosmetik-Programme und den EUMEL-Drucker
+angefordert werden. Diese Anweisungen müssen in den Text eingefügt werden.
+Dazu sollte das Kapitel über die Textkosmetik gelesen werden.
+
+is nämlich alles ohne Radiergummi-Abbildung !!!
+
+
+
+1. Einführung in die Benutzung des Editors
+
+In diesem Kapitel beschreiben wir das Tastenfeld eines EUMEL-Terminals, weil
+es hier einige Tasten gibt, die auf einer Schreibmaschine nicht vorhanden
+sind. Anschließend erklären wir, wie der Editor ein- und ausgeschaltet wird,
+wie Texte geschrieben und auf einfache Weise korrigiert werden können. Eine
+kurze Erklärung des Tabulators beendet die Einführung.
+
+
+
+Das Tastenfeld
+
+In diesem Abschnitt wird das Tastenfeld eines EUMEL-Terminals erklärt. Es
+wird erläutert, wo sich die Tasten befinden und wie man Umlaute schreibt.
+
+Das Tastenfeld eines EUMEL-Terminals entspricht weitgehend dem einer
+Schreibmaschine. Wir finden also die Buchstaben a-z und die Ziffern 0-9 auf
+Tasten. Mit der SHIFT-Taste und gleichzeitigem Drücken einer anderen Taste
+können die großen Buchstaben und eine Reihe von speziellen anderen Zeichen,
+die Sonderzeichen genannt werden, geschrieben werden. Die "Zwischenraum-
+taste" oder Leertaste erzeugt immer ein Leerzeichen.
+
+Nun gibt es in der Praxis zwei unterschiedliche Tastaturen. Zum einen
+existiert die EDV-Tastatur, die zum Schreiben von Programmen benutzt wird.
+Sie erkennt man daran, daß keine Umlaute (ä, ü, ö) und kein ß auf den Tasten
+eingraviert sind. Dafür gibt es Tasten für eckige und geschweifte Klammern.
+Sollen auf einer solchen Tastatur die Umlaute geschrieben werden, muß man
+sich eines Tricks bedienen: mit der Taste ESC und nachfolgendem Betätigen
+einer anderen Taste erhalten wir den entsprechenden Umlaut.
+Diese Tasten sind standardmäßig vorbelegt, können aber von Benutzern und in
+Anwenderprogrammen geändert werden.
+
+ ESC a bringt ä, ESC A bringt Ä
+ ESC u bringt ü, ESC U bringt Ü
+ ESC o bringt ö, ESC O bringt Ö und
+ ESC s bringt ß.
+
+In der Regel kann man die Umlaute auf dem Bildschirm eines solchen EDV-
+Terminals nicht sehen, sondern sie erscheinen als a, u, usw.. Beim Druck
+eines Textes werden sie aber richtig dargestellt.
+
+Die andere Tastatur entspricht in der Tastenbelegung weitgehend einer deut-
+schen Schreibmaschine und besitzt Tasten für die Umlaute und ß. Sollen vor-
+wiegend deutsche Texte geschrieben werden, empfiehlt es sich, solch ein
+Terminal zu verwenden.
+
+Neben diesen "einfachen" Tasten gibt es noch einige wenige Tasten, die zur
+Bedienung des Editors (aber auch anderer Programme) notwendig sind. Wo die
+Tasten auf Ihrem Gerät liegen, hängt von dem jeweiligen Gerätetyp ab. Die
+Wirkung der Tasten erklären wir in den anschließenden Abschnitten.
+Es kann sein, daß die Tasten nicht richtig beschriftet sind. Dann sollten Sie
+den Betreuer ihrer Installation bitten, diese zu beschriften. Zusätzlich zu
+den hier beschriebenen können sich noch weitere Tasten auf ihrem Terminal
+befinden, die aber keine besondere Bedeutung für den Editor haben.
+
+Taste Bedeutung
+-----------------------------------------------------------------------------
+SHIFT Umschalttaste.
+ Für Großbuchstaben statt Kleinbuchstaben und Sonderzeichen
+ statt Ziffern.
+
+RETURN Beginn einer neuen Zeile (Absatz).
+ Die RETURN-Taste ist oft mit einem geknicktem Pfeil nach
+ links gekennzeichnet. Im Kommandomodus (also bei "gib
+ kommando :") wird ein gegebenes Kommando ausgeführt.
+
+LINKS Tasten für die Positionierung.
+RECHTS
+OBEN
+UNTEN
+ Positionierung der Schreibmarke (Cursor) in die jeweilige
+ Richtung (auf den Tasten oft auch durch Pfeile dargestellt).
+
+HOP "Verstärkertaste": Wirkt als Vorschalttaste.
+
+RUBOUT Löschtaste.
+
+RUBIN Ein- bzw. Ausschalten des Einfügezustandes.
+
+TAB Tabulatortaste.
+
+MARK Ein- bzw. Ausschalten der Markierung.
+
+ESC Kommandotaste.
+
+Merke: Das Tastenfeld eines EUMEL-Terminals ist in der Regel wie das einer
+Schreibmaschine und kann ebenso bedient werden. Umlaute müssen bei EDV-
+Tastaturen mit Hilfe der Taste ESC geschrieben werden. Einige Spezialtasten
+werden benutzt, um die Textbearbeitung des Editors zu steuern.
+
+Weitere Kommandotasten:
+ SV Supervisor-Taste im Mehrbenutzer-Betrieb ("multi-user").
+ Diese Taste bewirkt den Aufruf des Supervisors und ist keine
+ spezielle Editor-Taste.
+ STOP Anhalten eines Programms.
+ Wird die Taste aus Versehen betätigt (erkennbar daran, daß
+ der Editor nicht "reagiert"), muß WEITER betätigt werden.
+ WEITER Programm soll weiterlaufen.
+
+
+
+Speicherung von Texten
+
+In diesem Abschnitt wird der Begriff "Datei" erklärt und erläutert, wie
+unterschiedliche Texte auseinandergehalten werden können.
+
+Das EUMEL-System speichert einmal geschriebene Texte, bis sie vom Benutzer
+gelöscht werden. In der Regel wird nicht nur ein (langer) Text oder ein Pro-
+grammtext geschrieben, sondern mehrere und unterschiedliche. Um diese aus-
+einanderhalten zu können, versehen wir sie jeweils mit einem Namen, der frei
+gewählt werden kann. Beispiele für Namen:
+
+ "Brief vom 1.8.83"
+ "1. Kapitel meines Buches"
+
+Eine Sammlung von Zeichen (also im Normalfall unsere geschriebenen Texte),
+die mit einem Namen versehen worden ist, nennt man eine 'Datei' ('file'). Der
+Editor erstellt also eine Datei, wenn wir einen Text schreiben. Eine Datei
+kann bis zu 4 000 Zeilen fassen, wobei eine Zeile bis zu 32 000 Zeichen lang
+sein darf.
+
+Mit Hilfe des (Datei-) Namens kann man den Text (immer) wieder ansprechen,
+solange, bis die Datei gelöscht wird. Bei der Bearbeitung einer Datei durch
+den Editor wirkt sich jede Änderung des Textes auf dem Bildschirm sofort bis
+in die gespeicherte Datei aus. Eine Datei kann durch Kommandos verarbeitet
+werden. Eine Auswahl (Vergl. dazu die Beschreibung des Monitors):
+
+edit (Datei bearbeiten), rename (Datei umbenennen), copy (Duplizieren der
+Datei), to archive (Archivieren), lineform bzw. autoform (Zeilen
+formatieren), pageform (Seiten formatieren), print (Drucken) usw.
+
+Merke: Ein Text wird im EUMEL-System in einer Datei gehalten. Eine Datei
+faßt bis zu 4000 Zeilen Text. Eine Datei kann über den Dateinamen ange-
+sprochen werden, der frei gewählt werden kann.
+
+
+
+Ein- und Ausschalten des Editors
+
+Hier beschreiben wir, wie der Editor ein- und ausgeschaltet wird und wie
+der Editor eine Datei einrichtet. Zusätzlich wird das Ausschalten des auto-
+matischen Wortumbruchs erklärt.
+
+Wenn auf dem Bildschirm die Aufforderung
+
+ gib kommando :
+
+erscheint, befindet man sich in der Monitor-Ebene. Durch
+
+ edit ("dateiname")
+
+kann der EUMEL-Editor eingeschaltet (programmtechnisch: "aufgerufen")
+werden. Ist die Datei noch nicht vorhanden, d.h. kein Text unter dem ange-
+gebenen Namen im System gespeichert, folgt eine Anfrage, ob eine neue Datei
+eingerichtet werden soll. Dies dient zur Kontrolle von Schreibfehlern, die
+besonders bei ähnlichen Dateinamen auftreten. Man kann dann das Einrichten
+der Datei ablehnen, den Dateinamen verbessern und das Kommando erneut geben.
+
+Der Editor zeigt jetzt in der obersten Zeile des Bildschirms die Titelzeile,
+die den Dateinamen und die Zeilennummer enthält, die gerade bearbeitet wird.
+Im Fall einer bereits beschriebenen Datei zeigt der Editor das zuletzt bear-
+beitete Textstück. Bei einer neuen Datei ist der Bildschirm unterhalb der
+Titelzeile leer. Dieser Teil dient als "Schreibfläche". Der Cursor, so nennt
+man die blinkende Schreibmarke, steht dann direkt unter der Titelzeile. Er
+zeigt immer die aktuelle Schreibposition an. Jetzt kann sofort mit dem
+Schreiben begonnen werden, ganz wie mit einer normalen Schreibmaschine.
+
+Beenden der Schreibarbeit und Ausschalten des Editors erfolgt durch Drücken
+der beiden Tasten
+
+ ESC q
+
+nacheinander. Man befindet sich wieder in der alten Kommando-Ebene.
+
+Es ist aber auch möglich, während der Schreibarbeit (also bei eingeschalte-
+tem Editor) durch zweimaliges Drücken von ESC in die (Editor) Kommando-
+Ebene zu gelangen. Nach Abarbeitung des Kommandos gelangt man wieder in den
+normalen Schreibzustand.
+
+Der Editor ist auf das Schreiben von "normalen" Texten eingestellt. Bei
+"normalen" Texten soll ein Wort, welches über das Ende einer Zeile gehen
+würde, automatisch in die nächste Zeile gebracht werden. Dies wird
+"Wortumbruch" genannt.
+
+Ist kein Wortumbruch erwünscht, so gibt man das Kommando
+
+ word wrap (false)
+
+In diesem Fall schreibt der Editor bis zum Zeilenende und springt dann auto-
+matisch (u.U. mitten im Wort) auf die nächste Zeile. Der Wortumbruch kann
+durch
+
+ word wrap (true)
+
+wieder eingeschaltet werden.
+
+Merke: Der Editor wird durch das Kommando 'edit ("name")' aufgerufen und
+und wird durch ESC q wieder verlassen. Der Cursor zeigt die aktuelle
+Schreibposition an. Der Editor ist auf automatischen Wortumbruch eingestellt.
+
+
+
+Schreiben eines Textes
+
+In diesem Abschnitt wird erklärt, wie ein Text geschrieben wird und was es
+mit Absätzen auf sich hat.
+
+Nach dieser etwas langen Vorrede können wir endlich losschreiben. Wird ein
+Zeichen geschrieben, rückt der Cursor automatisch nach rechts auf die
+nächste Schreibstelle. Durch den automatischen Wortumbruch werden ange-
+fangene Worte, die über ein Zeilenende hinausgehen würden, ohne Silbentren-
+nung in die nächste Zeile gebracht.
+Nehmen Sie bitte keine Silbentrennung "per Hand" vor (wie in dieser An-
+leitung).Eingebrachte Trennstriche gelten als Bindestrich und bleiben somit
+auch bei Umformatierungen erhalten, was unerwünscht ist. Für diese mühevolle
+Aufgabe gibt es in der Textkosmetik ein Programm!
+
+Die RETURN-Taste (bei einer Schreibmaschine bedeutet sie "Wagenrücklauf")
+braucht also nur noch betätigt zu werden, wenn eine Zeile vorzeitig beendet
+werden soll: also bei einem Absatz oder einer Leerzeile. Der Cursor wird da-
+bei an den Anfang der nächsten Zeile positioniert. Gleichzeitig erscheint in
+der vorherigen Zeile am rechten Rand des Bildschirms eine Markierung, die
+anzeigt, daß hier ein Absatz gemacht wurde.
+
+Diese Absatzkennzeichnung ist wichtig: Sie bedeutet u.a. eine "Grenze" für
+die Textkosmetik-Programme beim (optimalen) Auffüllen von Zeilen. Für den
+Drucker bedeutet ein Absatz, keinen rechten Randausgleich (druckertechnisch:
+"Blocksatz") in dieser Zeile vorzunehmen.
+Die Absatzkennzeichnung besteht aus einem Leerzeichen in der Datei ("blank";
+im Unterschied zur Schreibmaschine ist das Leerzeichen in der EDV auch ein
+Zeichen und wird gespeichert). Absatzkennzeichen können gelöscht oder auch
+hinzugefügt werden (wie das gemacht wird, erfahren Sie in den nächsten Ab-
+schnitten). Ist der Wortumbruch ausgeschaltet, erscheint keine Absatzkenn-
+zeichnung beim Betätigen der RETURN-Taste.
+
+Darum ist das Betätigen der RETURN-Taste bei Tabellenzeilen und Programm-
+texten besonders wichtig, denn hier soll ja jede Zeile separat bleiben.
+
+Ein Bildschirm faßt (neben der Titelzeile) üblicherweise 23 Zeilen, die mit
+Text beschrieben werden können. Ist die letzte Zeile voll und muß eine neue
+Zeile begonnen werden, "rutscht" der Bildschirminhalt automatisch um eine
+Zeile nach oben. Damit ist Platz für eine Leerzeile, die nun ebenfalls be-
+schrieben werden kann usw.. Keine Angst: die so verschwundenen Zeilen sind
+natürlich nicht "weg". Da ein Bildschirm immer nur eine beschränkte Anzahl
+von Zeilen hat, kann der Editor nur einen Ausschnitt aus der Datei zeigen.
+In unserem Fall, wo wir zunächst nur am Ende der Datei schreiben, werden
+also immer die letzten Zeilen der Datei angezeigt.
+
+Merke: Ist der Wortumbruch eingeschaltet, wird ein angefangenes Wort, das
+über das Zeilenende gehen würden, an den Anfang der neuen Zeile gebracht.
+Die RETURN-Taste wird nur bei Absätzen, Tabellenzeilen oder Leerzeilen be-
+tätigt. In diesem Fall erscheint eine Absatzkennzeichnung am rechten Rand
+des Bildschirms. Ist der Bildschirm vollgeschrieben, werden beim fort-
+laufenden Schreiben alle Zeilen um eine Zeile nach oben gerückt.
+
+
+
+Einrückungen
+
+Hier wird die Einrückungsautomatik erklärt.
+
+Soll ein Text eingerückt werden (wie in den obigen "Merke"-Zeilen) oder bei
+Aufzählungen, so wird die in der ersten Zeile geschriebene Einrückung auto-
+matisch in den folgenden Zeilen beibehalten, bis sie durch die Posi-
+tionierungstasten wieder aufgehoben wird. Es gibt also kein Einrückkommando.
+Wie der rechte Rand (also die Zeilenbreite) eingestellt wird, erklären wir
+später.
+Dies kann für die gesamte Datei (und somit für den gesamten Text) durch ein
+ein Kommando erfolgen, mit welchem man den Editor auf diese Zeilenbreite
+einstellt. Um den rechten Rand nur für einige Zeilen zu verändern (wie z.B.
+bei unseren "Merke"-Zeilen) kann ein 'limit'-Kommando der Textkosmetik
+verwandt werden.
+
+Merke: Einrückungen werden automatisch beibehalten.
+
+
+
+Einfaches Positionieren und das Editor-Fenster
+
+Um Korrekturen (Überschreiben, Löschen oder Einfügen) vorzunehmen, muß der
+Cursor, der die aktuelle Schreibposition anzeigt, bewegt werden können. Bei
+längeren Texten ist es möglich, den Cursor auch auf Zeilen zu positionieren,
+die sich (noch nicht) auf dem Bildschirm befinden. Somit zeigt der Editor
+nicht nur immer das Ende einer Datei, sondern einen beliebigen Ausschnitt,
+der auf dem Bildschirm im sogenannten Fenster sichtbar ist.
+
+Ist eine Korrektur notwendig, muß der Cursor (blinkende Schreibmarke) auf die
+Stelle positioniert werden, an der die Korrektur vorgenommen werden soll.
+Dazu verwenden wir die Positionierungstasten LINKS, RECHTS, OBEN und UNTEN.
+LINKS und RECHTS bewegen den Cursor innerhalb einer Zeile. Stößt man mit
+RECHTS an das Ende einer Zeile, wird der Cursor an den Anfang der nachfol-
+genden Zeile bewegt. (Positionierungen jenseits des linken Randes sind nicht
+möglich).
+
+Ein Zeilenwechsel kann einfacher mit den Tasten OBEN und UNTEN vorgenommen
+werden. Die Taste OBEN bewegt den Cursor eine Zeile nach oben, die Taste
+UNTEN entsprechend eine Zeile tiefer.
+
+Was passiert nun, wenn der untere oder der obere Rand des Bildschirms er-
+reicht wird und es wird darüber hinaus positioniert? In diesem Fall wird der
+Text zeilenweise nach oben oder nach unten verschoben und es erscheint die
+gewünschte Zeile, wobei andere am anderen Rand "verschwinden". Wir sehen
+also, daß wir mit den Positionierungstasten den Bildschirm als Fenster über
+die Datei hinweggleiten lassen können (Fachausdrücke: "roll up" oder "roll
+down"). Den Text selbst können wir uns auf einem langen Band geschrieben
+vorstellen. Die Zeilennummer, in der der Cursor steht, wird stets in der
+Titelzeile angezeigt.
+
+Innerhalb einer Zeile ist es etwas anders: Positionieren wir bei einer Zeile,
+die breiter als der Bildschirm ist, nach rechts, wird das Fenster nur für
+diese Zeile verschoben (Fachausdruck: "scrolling").
+
+Merke: Mit Hilfe der vier Positionierungstasten kann man den Cursor auf dem
+Bildschirm bewegen. Außerdem ist es möglich, das Fenster mittels der
+Positionierungstasten über den Text zu bewegen.
+
+
+
+Einfache Korrekturen: Zeichen überschreiben, löschen und einfügen
+
+In diesem Abschnitt wird erklärt, wie einfache Korrekturen durch Über-
+schreiben von Zeichen, Löschen von Zeichen und Einfügen von Zeichen vorge-
+nommen werden können.
+
+Es können Korrekturen gleich beim Schreiben vorgenommen werden, indem die
+zuletzt geschriebenen Zeichen mit der RUBOUT-Taste gelöscht werden. Häufig
+merkt man aber Schreibfehler erst etwas später, so daß man diese Fehler nicht
+so leicht korrigieren kann. Für solche Zwecke muß man den Cursor an die Text-
+stelle bewegen, an dem korrigiert werden soll. Wie man das macht, haben wir
+im letzten Abschnitt geschildert.
+
+Die einfachste Möglichkeit der Korrektur ist das Überschreiben. Soll z.B. ein
+Zeichen durch ein anderes ersetzt werden, so positioniert man den Cursor
+genau über dieses und tippt das richtige Zeichen ein.Das kann natürlich auch
+mit mehreren Zeichen nacheinander erfolgen.
+
+Will man ein Zeichen löschen, so positioniert man auch hier den Cursor auf
+dieses Zeichen und betätigt die Taste RUBOUT. Das Zeichen verschwindet und
+die Restzeile rückt heran. Sollen mehrere Zeichen gelöscht werden, muß die
+RUBOUT-Taste entsprechend oft gedrückt werden.
+
+Steht der Cursor hinter dem letzten Zeichen der Zeile, wird immer das letzte
+Zeichen der Zeile gelöscht. Man kann also mit dieser Eigenschaft eine Zeile
+"von hinten wegradieren".
+
+Fehlende Zeichen kann man genauso einfach einfügen. Man bringt den Cursor
+auf das Zeichen, vor das eingefügt werden soll. Dann drückt man die Taste
+RUBIN. Der Editor gelangt in den Einfüge-Zustand, was in der Titelzeile durch
+RUBIN angezeigt wird. Er fügt alle Zeichen ein, die jetzt getippt werden (an-
+statt zu überschreiben). Der Teil der Zeile rechts vom Cursor rückt jeweils
+um entsprechend viele Stellen nach rechts.
+
+Wichtig ist, daß im RUBIN-Zustand der Editor genauso funktioniert wie im
+Normal-Zustand (natürlich mit der Ausnahme, daß eingefügt statt überschrieben
+wird).
+
+Ein neuerliches Betätigen der RUBIN-Taste beendet den Einfüge-Zustand. Die
+RUBIN-Taste wirkt also wie ein Schalter, der den Einfüge-Zustand ein- und
+ausschaltet. Allerdings kann man nur so viele Zeichen in eine Zeile einfügen,
+bis das letzte Wort der Zeile an das Zeilenende stößt. Das angefangene Wort
+wird am Anfang der folgenden Zeile eingefügt, sofern dort noch Platz ist und
+es nicht offensichtlich ein Absatzende kennzeichnet. Andernfalls wird auto-
+matisch eine neue Zeile für das angefangene Wort eingefügt.
+
+Im eingeschalteten RUBIN-Zustand können keine Zeichen verloren gehen. Viele
+Benutzer lassen darum den RUBIN-Zustand immer eingeschaltet, um sich vor dem
+unbeabsichtigten Überschreiben von Texten zu schützen. Es wird korrigiert,
+indem man die Verbesserung einfügt und den alten Text löscht.
+
+Merke: Mit Hilfe der Positionierungstasten LINKS, RECHTS, OBEN und UNTEN
+kann eine Stelle in der Datei ausgewählt werden, an der eine Korrektur vor-
+genommen werden soll. Die einfachste Korrektur ist das Überschreiben von
+fehlerhaften Zeichen. Zeichen löschen erfolgt mit der Taste RUBOUT. Mit
+RUBIN kann der Einfüge-Zustand ein- und ausgeschaltet werden. Im Einfüge-Zu-
+stand wird nicht überschrieben, sondern es wird vor der Cursor-Position das
+getippte Zeichen eingefügt.
+
+
+
+Springen, Zeilen einfügen/löschen mittels HOP-Taste
+
+Bewegungen des Cursors sind mit den Positionierungstasten bei größeren "Ab-
+ständen" etwas mühsam, ebenso bei umfangreichen Löschungen und Einfügungen.
+Die "Verstärkertaste" HOP ermöglicht es, diese Operationen auf einfache
+Weise zu beschleunigen. Mit der HOP-Taste kann man das Fenster über der
+Datei nicht nur zeilenweise, sondern auch um jeweils eine Fensterlänge ver-
+schieben. Das nennt man Blättern.
+
+Wird die HOP-Taste vor einer anderen der schon erklärten Funktionstasten
+gedrückt, verstärkt sie deren Wirkung. Die HOP-Taste ist eine "Präfix"-Taste:
+sie wird vor (und nicht gleichzeitig, wie z.B. die Umschalttaste SHIFT) einer
+anderen Taste gedrückt. Zuerst das springende Positionieren:
+Weitere wichtige Anwendungen der HOP-Taste beschreiben wir in den nächsten
+Abschnitten.
+
+HOP RECHTS Sprung an das rechte Zeilenende.
+ Falls die Zeile länger als das Fenster breit ist, wird seitlich
+ geblättert.
+
+HOP LINKS Sprung an den Zeilenanfang (ggf. seitlich blätternd).
+
+HOP OBEN Sprung auf die erste Zeile des Bildschirms.
+ Nochmaliges Betätigen dieser Tastenkombination positioniert den
+ Cursor (und damit das Fenster in der Datei) um ein Fenster
+ zurück.
+
+HOP UNTEN Sprung auf die letzte Zeile des Bildschirms.
+ Das Blättern erfolgt analog HOP OBEN.
+
+HOP RETURN Macht die aktuelle Zeile zur ersten des Fensters.
+ Die Zeile, in der sich der Cursor befindet, wird die erste
+ Zeile des Fensters.
+
+Die HOP-Taste in Verbindung mit RUBIN und RUBOUT wird zum "verstärkten"
+Löschen und Einfügen verwandt:
+
+HOP RUBIN Einfügen von Textpassagen:
+ Ab der aktuellen Position des Cursors verschwindet der rest-
+ liche Text. Es kann wie bei der anfänglichen Texteingabe fort-
+ gefahren werden. Die Anzeige REST in der Titelzeile erinnert
+ daran, daß noch ein Resttext existiert. Dieser erscheint nach
+ einem neuerlichen Betätigen der beiden Tasten HOP RUBIN wieder
+ auf dem Bildschirm (die Anzeige REST verschwindet dann wieder).
+
+HOP RUBOUT Löscht Zeile ab Cursor-Position bis Zeilenende:
+ Löscht die Zeile rechts vom Cursor. Steht der Cursor am Zeilen-
+ anfang, wird dementsprechend die ganze Zeile gelöscht und die
+ Lücke durch Nachrücken der Folgezeilen geschlossen.
+
+Merke: Die HOP-Taste dient in Verbindung mit den Positionierungstasten zum
+"Springen" oder zum "Blättern" innerhalb der Datei. Vor der Taste RUBOUT ge-
+drückt, bewirkt sie die Löschung von Zeilen. Mit HOP RUBIN kann man längere
+Texte in einen Text einfügen.
+
+
+
+Der Tabulator
+
+Eine weitere wichtige Positionierungshilfe ist die TAB-Taste. Sie wird zum
+Schreiben von Tabellen benötigt. Wie bei einer Schreibmaschine können Ta-
+bulatormarken gesetzt bzw. gelöscht werden.
+
+Der Tabulator hat eine wichtige Funktion für das schnelle Positionieren, auch
+wenn keine Marken eingestellt wurden. Voreingestellte Tabulatormarken sind
+nämlich der Textanfang einer Zeile (Einrückung; falls vorhanden) und die
+Stelle direkt hinter dem letzten Zeichen der Zeile. Betätigt man also die
+Taste TAB, dann springt der Cursor an die nächste dieser voreingestellten
+Positionen. So kann man schnell an den Anfang oder das Ende einer Zeile mit
+dem Cursor gelangen (und z.B. am Zeilenende Zeichen "von hinten" löschen
+oder dort weiterschreiben).
+
+Nun zum Setzen des Tabulators: Er wird gesetzt, indem man den Cursor auf die
+Zeilenposition bringt, in der die Marke plaziert werden soll. Hier betätigt
+man nun HOP TAB. Die Tabulatorsetzung kann man in der Titelzeile an einer
+Markierung ("Dach"-Zeichen) sehen (falls sie im Fensterbereich ist und die
+aktuelle Zeile nicht seitlich verschoben ist). Betätigt man nun an irgend-
+einer Position innerhalb einer Zeile die TAB-Taste, wird der Cursor auf die
+Position der nächsten Tabulatormarkierung (die sich rechts vom Cursor be-
+findet) oder eine der voreingestellten Positionen bewegt.
+
+Gesetzte Tabulatormarken können gelöscht werden, indem man mit der TAB-
+Taste die Position der Tabulatormarke einstellt und dann HOP TAB betätigt.
+Die Marke ist dann gelöscht (das Dach verschwindet in der Titelzeile).
+
+Tabulatormarkierungen hinterlassen keine Spuren in der Datei, sondern dienen
+nur als Positionierungshilfen.
+
+Werden Tabulatormarken gesetzt (HOP TAB), gelten die voreingestellten Tabu-
+latormarken (Anfang und Ende einer Zeile) nicht mehr. Dies ist z.B. bei dem
+Schreiben von Tabellen notwendig. Andererseits möchte man beim Schreiben von
+"normalen" Text wieder die voreingestellten Tabulatormarken bedienen können.
+Mit den Tasten
+
+ ESC TAB
+
+kann man die gesetzten Tabulatormarken (erkenntlich an dem "Dach"-Zeichen in
+der Kopfzeile) verschwinden lassen. Dann gelten wieder die voreingestellten
+Marken. Erneutes ESC TAB stellt die gesetzten Tabulatormarken wieder her
+usw.
+
+Merke: Das Einstellen und Löschen von Tabulatormarken erfolgt mit HOP TAB;
+das Positionieren auf diese mit TAB. Voreingestellte Tabulatormarken sind
+Zeilenanfang und -ende. ESC TAB wirkt wie ein Umschalter zwischen voreinge-
+stellten und gesetzten Tabulatormarken.
+
+
+
+2. Beschreibung weiterer Funktionen
+
+In diesem Kapitel werden weitere Funktionen des Editors beschrieben, die bei
+dem Erstellen von Texten und Korrekturen sinnvoll einsetzbar sind. Die
+Kenntnis der hier beschriebenen Funktionen sind für erste Arbeiten nicht
+notwendig (dafür reicht das erste Kapitel). Man sollte aber dieses Kapitel
+zumindest überfliegen, damit bei Bedarf die zusätzlichen Möglichkeiten des
+Editors erlernt und angewandt werden können.
+
+
+
+Zeilen aufbrechen und Rückumbruch
+
+Um grössere Textpassagen einzufügen, betätigt man HOP RUBIN nacheinander.
+Diese Tastenfolge kann benutzt werden, um eine Zeile zu spalten (Zeile auf-
+zubrechen). HOP RUBOUT am Ende einer Zeile macht einen Rückumbruch.
+
+Wie bereits beschrieben, bewirkt HOP RUBIN in einer Zeile, daß der Zeilenrest
+rechts vom Cursor und alle Zeilen unterhalb der aktuellen Zeile scheinbar
+verschwinden. REST in der Titelzeile erinnert daran, daß ein Teil der Datei
+nicht sichtbar ist.
+
+Wird unmittelbar nach HOP RUBIN wiederum HOP RUBIN betätigt, wird der vor-
+herige Zeilenrest als eigenständige Zeile dargestellt. Es ist damit eine Auf-
+spaltung einer Zeile in zwei Zeilen vollzogen.
+
+Der umgekehrte Fall, nämlich zwei Zeilen zu einer zusammenzufassen (sog.
+Rückumbruch), ist durch HOP RUBOUT hinter dem letzten Zeichen einer Zeile
+möglich. (Hinter das letzte Zeichen einer Zeile kann einfach mit dem
+Tabulator positioniert werden).
+
+Das Aufbrechen einer Zeile und der Rückumbruch zusammen angewandt stellen
+also den ursprünglichen Zustand wieder her. Beispiel: Mit HOP RUBIN bricht
+man eine Zeile auf (der Rest der Zeile und nachfolgende Zeilen verschwinden
+vom Bildschirm). Erneutes HOP RUBIN stellt den rechten Zeilenteil auf der
+nächsten Zeile und die nachfolgenden Zeilen auf dem Bildschirm wieder dar. Da
+der Cursor sich noch immer am rechten Rand der aufgebrochenen Zeile befindet,
+kann man mit HOP RUBOUT den ursprünglichen rechten Zeilenteil wieder re-
+kombinieren.
+
+Merke: Zweimaliges HOP RUBIN spaltet eine Zeile auf; HOP RUBOUT hinter dem
+Ende einer Zeile fügt die nachfolgende Zeile an die aktuelle an (Rück-
+umbruch).
+
+
+
+Zahlentabellen schreiben: Dezimaltabulator
+
+Beim Schreiben von Zahlentabellen sollen die Zahlen oft rechtsbündig im Text
+erscheinen. Dazu bietet der Editor den Dezimaltabulator an.
+
+Für jede Zahlenkolonne wird die gewünschte Position der Einerstelle (also der
+letzten Stelle) mit Hilfe eines Tabulators eingestellt. Mit TAB wird der
+Cursor zur jeweils nächsten Tabulatormarke vorgerückt. Werden nun Ziffern
+geschrieben, so schreibt man nicht - wie gewohnt - nach rechts, sondern die
+Ziffern werden nach links eingerückt. Etwas genauer: Beim Drücken einer
+Zifferntaste wird, solange links vor der Zahl noch ein Blank, eine Zahl, "+",
+"-" oder ein Punkt sichtbar ist, diese gelöscht und die hierdurch neu ent-
+standene Ziffernfolge rechtsbündig an der Tabulatorposition geschrieben.
+Zahlenkolonnen können so leicht und rechtsbündig geschrieben werden.
+Wird eine Proportionalschrift (Schrift, bei der die Zeichen unterschiedliche
+Breiten haben) verwandt, sollte man zwischen den einzelnen Zahlenkolonnen
+mindestens zwei Leerzeichen schreiben. Andernfalls bekommt man - auf Grund
+der unterschiedlicher Zeichenbreiten - keine rechtsbündigen Kolonnen ge-
+druckt.
+
+ 12 12345,78
+ 1 0,23
+ 12345 1234,00
+
+Merke: Ziffern werden bei Einsatz des Tabulators automatisch rechtsbündig ab
+der Tabulatormarke geschrieben.
+
+Es gibt somit vier nützliche Automatiken: neben dem automatischen Dezimal-
+tabulator der Wortumbruch, die Einrückautomatik und die Zeileneinfügeauto-
+matik beim einfügenden Schreiben.
+
+
+
+Den Editor lernen lassen
+
+Beliebige Folgen von Tastenbetätigungen können gelernt und Tasten zugeordnet
+werden. Das ist sinnvoll, wenn wiederholt immer die gleichen Tastenbe-
+tätigungen ausgeführt werden müssen, wie z.B. in Tabellenzeilen etwas ein-
+fügen oder wenn des öfteren gleiche Texte geschrieben werden müssen, wie
+z.B. ein Absender, Grußformeln usw.
+
+Der Lernmodus wird durch Betätigen der Tasten ESC HOP eingeschaltet (es
+erscheint LEARN als Kontrolle in der Titelzeile). Alle Tastenanschläge (auch
+Tastenanschläge wie RETURN: man kann also auch mehrere Zeilen lernen lassen)
+werden jetzt gelernt bis zum expliziten Ausschalten des Lernmodus.
+
+Das Beenden oder Ausschalten des Lernmodus erfolgt durch Drücken der drei
+Tasten ESC HOP 'taste'. Dabei wird die gelernte Tastenanschlagsfolge, auch
+Lernsequenz genannt, der Taste 'taste' zugeordnet.
+
+Durch späteres Betätigen der Tastenfolge ESC 'taste' kann der gelernte Text
+an jeder Stelle der Datei geschrieben werden. Beispiel: Ein "Schreiberling"
+hat jeden Tag 27 mal die Worte 'Hochschulrechenzentrum der Universität
+Bielefeld' zu tippen. Er läßt diese Worte den Editor lernen mit
+
+ ESC HOP Hochschulrechenzentrum der Universität Bielefeld
+ ESC HOP b
+
+Die Worte liegen jetzt auf der Taste 'b'. Wird 'b' gedrückt, erscheint ein
+'b' auf dem Bildschirm. Mit ESC 'b' erscheinen die obigen Worte. ESC ist
+also notwendig, um das normale 'b' von der Lernsequenz zu unterscheiden.
+
+Bei einigen Terminaltypen gibt es Tasten, die vom EUMEL-System nicht benutzt
+werden. Bei diesen kann man ESC beim Aufruf der Lernsequenz weglassen.
+
+Welche Tasten dürfen zum Lernen belegt werden? Alle Tasten, außer
+
+- vom System benutzte Tasten, wie SV, CTRL;
+- vom Editor (je nach Anwendung) vorbelegte Tasten, wie die Tasten q oder
+ ESC und HOP;
+- durch Programmierung (siehe dieses Kapitel) fest belegte Tasten.
+
+Praktische Tips: Man sollte die Tastatur nicht mit Lernsequenzen überlasten,
+weil man sich viele Tasten nicht merken kann. Besser ist es, einige wenige
+Tasten fest zu belegen und andere für momentane Aufgaben einzusetzen.
+
+Der Einsatz von Lernsequenzen ist besonders sinnvoll zum Schreiben von An-
+weisungen für die Textkosmetik. Anweisungen wie z.B. 'unterstreichen ein-
+schalten', Schrifttyp-Anweisung usw. werden zweckmäßigerweise auf Tasten
+gelegt.
+
+Hat man sich einmal beim Lernen verschrieben, so ist das nicht weiter
+schlimm: es kann ohne Bedenken korrigiert werden (z.B. mit der Taste RUBOUT).
+Solche Tastenanschläge werden dann allerdings auch gelernt, was man aber
+beim Einsetzen der Lernsequenz kaum sieht.
+
+Merke: Tastenanschläge werden mit ESC HOP gelernt und mit ESC HOP 'taste'
+auf eine Taste gelegt. Mit ESC 'taste' kann die Lernsequenz jederzeit abge-
+rufen werden.
+
+
+
+Mehrere Zeilen auf einmal verarbeiten: Markieren
+
+Oft ergibt sich die Notwendigkeit, mehrere Zeilen oder ganze Textpassagen zu
+löschen oder zu verschieben. Hierbei hilft die Taste MARK, mit der man Texte
+markieren (also kennzeichnen) kann. Die so markierten Texte können dann auf
+verschiedene Weisen als Ganzes verarbeitet werden.
+
+Durch Drücken der Taste MARK wird die Markierung eingeschaltet und - bei
+erneuter Betätigung - wieder ausgeschaltet. Der Anfang der Markierung wird
+"festgehalten" und man kann nun das Markierende durch die Positionierungs-
+tasten und die HOP-Taste in Richtung auf das Dateiende verschieben, wobei
+die dazwischen liegenden Zeichen markiert (in der Regel "video-invertiert"
+dargestellt) werden. Ein so markierter Text kann mit ESC RUBOUT gelöscht
+werden. Markieren und löschen mit ESC RUBOUT ist eine bequeme und sichere
+Löschmethode, da man genau sieht, was gelöscht wird.
+
+Der gelöschte Abschnitt ist aber nicht vollständig gelöscht, sondern er kann
+an anderer (oder an der gleichen) Stelle im Text durch ESC RUBIN wieder ein-
+efügt werden. Dies gilt aber nur für den zuletzt gelöschten Text. Auf diese
+Art kann ein Textabschnitt beliebiger Länge an eine andere Stelle des Textes
+sicher, schnell und bequem verschoben werden. Zusätzlich ist das nachträg-
+liche Korrigieren von fehlerhaften Löschungen leicht möglich, weil der Text
+wieder mit ESC RUBIN leicht reproduziert werden kann.
+
+Mit eingeschalteter Markierung kann auch geschrieben werden. Das markierende
+Schreiben ist eine besonders vorsichtige Art der Texterstellung, denn der
+Texteinschub bleibt erst durch Ausschalten der Markierung (MARK) wirklich
+bestehen. Er kann wieder gelöscht werden (ESC RUBOUT) und an eine andere
+Stelle gebracht werden (ESC RUBIN). Beim markierenden Schreiben wirkt
+RUBOUT immer auf das zuletzt geschriebene Zeichen.
+
+Die Markierung kann auch dazu verwendet werden, auf markierte Textabschnitte
+eigene Benutzerprogramme anzuwenden.
+
+Merke: Die Markierung schaltet man durch die Taste MARK ein und aus. Ein
+markierter Abschnitt kann gelöscht werden (ESC RUBOUT) und an einer anderen
+Stelle wieder eingefügt werden (ESC RUBIN). Mit eingeschalteter Markierung
+kann auch geschrieben werden. Die Markierung dient ebenfalls als Parameter
+für Textverarbeitungsprogramme.
+
+
+
+Zwei einfache Kommandos
+
+Einige Operationen kann man nur mühselig mit den bis jetzt beschriebenen
+Tasten durchführen. Z.B. ist es sehr zeitaufwendig, eine bestimmte Text-
+stelle zu finden. Andere Operationen sind mit den im vorigen Kapitel be-
+schriebenen Tasten überhaupt nicht möglich, wie etwa die Zeilenbreite ein-
+zustellen oder Programme aufzurufen, die die zu editierende Datei ver-
+arbeiten. Solche Operationen werden durch Kommandos ermöglicht, die man vom
+Editor aus geben kann.
+
+Durch zweimaliges Betätigen von ESC erfolgt die Aufforderung
+
+ gib kommando :
+
+Es erscheint auf dem Bildschirm eine Kommandozeile, in der der Benutzer
+Kommandos (d.h. ELAN-Programme) schreiben kann. Durch Betätigen der Taste
+RETURN wird das Kommando ausgeführt. Beispiel:
+
+ ESC ESC (* es erscheint 'gib kommando :' *)
+ "diese Zeichen"
+ RETURN
+
+Durch die Angabe eines TEXTes in Anführungstrichen wird nach dem einge-
+schlossenen TEXT 'diese Zeichen' ab der aktuellen Cursor-Position gesucht.
+Wird 'diese Zeichen' gefunden, bleibt der Cursor auf dem gesuchten Text
+stehen. Andernfalls steht der Cursor hinter dem Ende der letzten Zeile der
+Datei. Weiteres Beispiel:
+
+ ESC ESC
+ 127
+ RETURN
+
+Durch dieses Kommando wird auf die 127. Zeile positioniert.
+
+Diese beiden häufig benötigten Kommandos haben eine Sonderstellung und
+werden speziell behandelt, weil sie nicht der allgemeinen ELAN-Syntax ent-
+sprechen. Darum dürfen sie auch nicht in Verbindung mit anderen Kommandos
+verwendet werden (siehe nächsten Abschnitt). Alle anderen Kommandos, die wir
+in den nächsten Abschnitten beschreiben, entsprechen der ELAN-Syntax und
+sind somit allgemeine Kommandos.
+
+Merke: Kommandos nach man nach zweimaligen Betätigen der ESC-Taste schreiben.
+Mit RETURN wird die Ausführung des Kommandos ausgelöst. Durch Angabe eines
+TEXTes wird ab der aktuellen Cursor-Position nach diesem TEXT gesucht. Durch
+die Angabe einer ganzen Zahl (INT) wird auf die entsprechende Zeilennummer
+in der Datei positioniert.
+
+
+
+Beliebige Kommandos
+
+Beliebige Kommandos (siehe Monitor-Beschreibung) und ELAN-Programme sind
+zulässig.
+
+Die Kommandozeile kann wie eine "normale" Textzeile editiert werden (Posi-
+tionieren, Überschreiben, Einfügen, Löschen und Markieren). Erzeugt ein
+Programm eine Ausgabe oder rufen fehlerhafte Kommandos Fehlermeldungen
+hervor, werden diese in der ersten Zeile des Bildschirms angezeigt. Danach
+ist man wieder im Editor und kann wie gewohnt arbeiten.
+
+Die oben beschriebenen zwei Spezial-Kommandos kann man nicht mit anderen
+Kommandos zusammen verbinden (mit ';'). Deshalb gibt es für sie auch eine
+ELAN-Form, die es erlaubt, sie mit anderen Kommandos zusammen zu verwenden:
+
+a) TEXT suchen ab der aktuellen Cursor-Position (D ist eine Abkürzung für
+ 'DOWN'):
+
+ "diese Zeichen" (* Spezial-Version *)
+ D "diese Zeichen" (* Allgemeine Version *)
+
+b) Auf eine Zeile Positionieren (T ist eine Abkürzung für TO LINE):
+
+ 127 (* Spezial-Version *)
+ T 127 (* Allgemeine Version *)
+
+Es können mehrere Kommandos in der Kommandozeile angegeben werden. Die ein-
+zelnen Kommandos müssen in diesem Fall mit ';' voneinander getrennt werden.
+Beispiel:
+
+ ESC ESC
+ T 1; D "noch Zeichen" RETURN
+
+Diese zwei Kommandos werden nacheinander ausgeführt. Zuerst wird auf die
+erste Zeile positioniert und dann (von der ersten Zeile) nach 'noch Zeichen'
+gesucht. Damit ist es möglich, die Datei nicht nur von der aktuellen Zeile zu
+durchsuchen, sondern die gesamte Datei. Soll nicht in Richtung auf das Datei-
+ende, sondern in Richtung auf den Dateianfang (also nach "oben") gesucht
+werden, kann man das U-Kommando (Abkürzung für UP) verwenden:
+
+ ESC ESC
+ U "noch'n Text" RETURN
+
+Ein weiteres Kommando ist das C-Kommando (Abkürzung für 'CHANGE'), mit
+welchem man einen TEXT sucht und diesen dann ersetzen kann. Beispiel:
+
+ ESC ESC
+ "alte Zeichen" C "neue Zeichen" RETURN
+
+Es wird ab der aktuellen Cursor-Position nach 'alte Zeichen' gesucht. Wird
+der TEXT gefunden, wird er durch 'neue Zeichen' ersetzt. Der Cursor befindet
+sich in diesem Fall nach dem ersetzten TEXT. Wird 'alte Zeichen' dagegen
+nicht in der Datei gefunden, befindet sich der Cursor (wie beim erfolglosen
+Suchen mit D) am Ende der letzten Zeile der Datei.
+
+Wie alle andern Kommandos kann auch das C-Kommando mit anderen Kommandos
+verbunden werden. Beispiel:
+
+ ESC ESC
+ T 500; "Schreibfelher" C "Schreibfehler" RETURN
+
+Hier wird ab der 500. Zeile der Datei nach 'Schreibfelher' gesucht und ggf.
+ersetzt. Soll ein TEXT nicht nur einmal, sondern bei jedem Auftreten ersetzt
+werden, benutzt man das CA-Kommando (Abkürzung für CHANGEALL):
+
+ ESC ESC
+ "dieser alte Text" CA "dieser neue Text" RETURN
+
+Dadurch wird 'dieser alte Text' bei jedem Auftreten ab der aktuellen Cursor-
+Position durch 'dieser neue Text' ersetzt.
+
+Merke: Mehrere Kommandos werden mit ';' verbunden.
+
+
+
+Kommandos auf Tasten legen
+
+Oft benutzte Kommandos können auf Tasten gelegt werden. Damit ist es möglich,
+den Editor auf spezielle Bedürfnisse eines Benutzers zu modifizieren.
+
+Anstatt der Taste RETURN beim Abschluß können oft benutzte Kommandos mit der
+Drei-Tastenfolge ESC ! 'taste' auf eine Taste gelegt werden. Beispiel:
+
+ ESC ESC (* es erscheint die Kommandozeile *)
+ D "Schreibfehler"
+ ESC ! s (* das Kommando 'DOWN "Schreibfehler"' ist
+ nun auf die Taste 's' gelegt *)
+
+Wird nun die Taste 's' gedrückt, erscheint das Zeichen 's' auf dem Bildschirm.
+Mit ESC s wird das D-Kommando ausgeführt. Natürlich können auch komplizier-
+tere ziertere Kommandos auf Tasten gelegt werden.
+
+Einige Tasten sind bereits mit Kommandos belegt (man kann sie aber ver-
+ändern). Will man ein Kommando, welches auf eine Taste gelegt wurde, ver-
+ändern oder löschen, drückt man im Kommandodialog (!) die Drei-Tastenfolge
+ESC ? 'taste'. Beispiel:
+
+ ESC ESC (* in den Kommandodialog gehen *)
+ ESC ? s (* es erscheint nun: 'D "Schreibfehler"' *)
+
+Dieses Kommando kann nun z.B. verändert und ausgeführt (durch RETURN) oder
+wiederum auf die gleiche oder eine andere Taste gelegt werden (durch
+ESC ! 'taste').
+
+Die Ausführung eines Kommandos kann meist mit ESC abgebrochen werden,
+z.B. wenn ein Suchkommando unerwünscht weit reicht.
+
+Merke: Kommandos können auf Tasten gelegt werden (wie beim Lernen). Das
+letzte Kommando kann durch ESC f wiederholt werden.
+
+
+
+Die wichtigsten Kommandos zur Textverarbeitung
+
+Einige Kommandos sind speziell für die Textverarbeitung im Editor program-
+miert. Die wichtigsten werden hier vorgestellt.
+
+Kommando Bedeutung
+-----------------------------------------------------------------------------
+"text" Text suchen:
+D "text" Der zu suchende Text muß in Anführungszeichen geschrieben
+ werden (damit werden auch Leerzeichen innerhalb des ge-
+ suchten Textes wichtig). Es wird ab der Stelle in der
+ Datei in Richtung auf das Dateiende hin gesucht (also
+ "nach unten"), an der sich der Cursor befindet. Wird der
+ Text gefunden, positioniert der Editor den Cursor direkt
+ dahinter. Beispiel:
+
+ D "Autor"
+
+ sucht nach dem ersten Auftreten von 'Autor'. Beachte, daß
+ bei der Suche nach Zeichen, die man nicht direkt mit der
+ Tastatur schreiben kann, der Codewert angegeben werden
+ muß (vergl. dazu die EUMEL-Codetabelle). Beispiel:
+
+ DOWN ""217"" (* sucht ein ä *)
+ DOWN "Diesen Text mu"251" man finden"
+
+ (Ein Codewert innerhalb eines Textes muß in " einge-
+ schlossen werden).
+ Wird nur ein Text gesucht, kann man auch nur diesen
+ angeben. Beispiel:
+
+ "diesen fehler"
+
+D nummer (Relatives) Positionieren in Richtung auf das Dateiende.
+ Beispiel:
+
+ D 75
+
+ positioniert um 75 Zeilen in Richtung auf das Dateiende.
+
+U "text" Analog D, aber in Richtung auf den Dateianfang ("nach
+ oben").
+
+U nummer Analog D, aber in Richtung auf den Dateianfang.
+
+nummer Absolutes Positionieren:
+T nummer Durch Angabe einer Zahl, wird auf die entsprechende
+ Zeile der Datei positioniert. Beispiel:
+
+ T 317
+ 317
+
+ Ist die Datei bereits vor der Zeile '317' zu Ende, wird
+ auf die letzte Zeile der Datei positioniert.
+
+"alt" C "neu" Suchen und Ersetzen eines Textes: Sucht nach dem Text
+ 'alt'. Falls vorhanden, wird 'alt' durch 'neu' ersetzt.
+ Beispiel:
+
+ "einfach" C "leicht"
+
+ ersetzt 'einfach' durch 'leicht'.
+
+"alt" CA "neu" Suchen aller 'alt' ab der aktuellen Position bis zum
+ Dateiende und ersetzen durch 'neu'.
+
+type ("text") Schreiben eines 'text' durch ein Kommando. Das type-Kom-
+ mando wird häufig benutzt, um Zeichen zu schreiben, die
+ nicht auf der Tastatur zu finden sind. In diesem Fall muß
+ der Codewert des Zeichens angegeben werden (jeweils in
+ doppelten "). Beispiel (vergl. auch EUMEL-Codetabelle):
+
+ type (""251"")
+
+ schreibt ein ß an die aktuelle Position der Zeile.
+
+Merke: Durch das D- bzw. U-Kommando kann ein Text in der Datei gesucht
+werden. Mit C kann ein Text gesucht und ersetzt werden. "alt" CA "neu" er-
+setzt alle 'alt' durch 'neu'. 'type' schreibt ein Zeichen (oder einen Text).
+Durch T kann auf eine bestimmte Zeile der Datei positioniert werden.
+
+
+
+Texte aus anderen Dateien einfügen oder in andere Dateien schreiben
+
+Manchmal ist es notwendig, einen Text in eine andere Datei zu schreiben
+(z.B. wenn man diesen Text noch einmal verwenden will) oder einen Text einer
+anderen Datei in den zu bearbeitenden Text einzufügen. Die GET- und PUT-
+Kommandos bieten die Möglichkeit, Texte zwischen Dateien auszutauschen
+(vergl. auch Paralleleditor).
+
+Das Kommando GET 'dateiname' holt den Text der Datei "dateiname" an die
+aktuelle Schreibposition. Beispiel:
+
+ GET "absender"
+
+holt den Text 'absender'. Wenn also des öfteren Briefe geschrieben werden,
+braucht man sich den Absender nur einmalig in die Datei 'absender' zu schrei-
+ben und kann diesen mit dem Kommando GET (was man auf eine Taste legen kann)
+u.U. mehrmals an verschiedenen Stellen in die Datei einfügen.
+
+Das Kommando PUT (abgekürzt: P) schreibt einen vorher markierten Text in
+eine Datei. Beispiel:
+
+ PUT "Tabelle"
+
+schreibt einen markierten Text in die Datei 'Tabelle'. 'Tabelle' wird ggf.
+eingerichtet. Ist die Datei 'Tabelle' bereits vorhanden, so wird erfragt, ob
+die Datei gelöscht werden kann, um den markierten Text aufzunehmen (über-
+schreiben). Andernfalls wird der markierte Text an den bereits vorhandenen
+Text in 'Tabelle' angefügt. Es ist somit durch mehrmaliges markieren und dem
+PUT-Kommando möglich, Texte aus einer Datei aufzusammeln und in eine neue
+Datei zu geben.
+
+Merke: Die GET- und PUT-Kommandos schreiben bzw. holen Texte aus Dateien.
+
+
+
+Breitere Zeilen bearbeiten
+
+Der Editor ist auf eine Zeilenbreite von 77 Zeichen eingestellt. Oft ist es
+notwendig, mit einer anderen Zeilenbreite zu schreiben, welches man mit dem
+LIMIT-Kommando einstellen kann. Aber auch die Positionierung innerhalb einer
+Zeile wird dadurch etwas anders, weil bei breiteren Zeilen als die Bild-
+schirmbreite die Zeile nicht auf einmal auf den Bildschirm paßt. In diesem
+Fall wird gerollt.
+
+Eine andere Zeilenbreite stellt man durch 'limit' ein. Beachte, daß die somit
+eingestellte Zeilenbreite für die gesamte Datei gilt. Beispiel:
+(Soll eine veränderte Zeilenbreite nur für einen Abschnitt gelten, muß man
+eine Textkosmetik-Anweisung einfügen, welches erst nach Anwendung von
+'lineform' wirkt.)
+
+ limit (180)
+
+Nun kann man wie gewohnt schreiben. Allerdings wird die aktuelle Zeile, in
+der man sich befindet, nicht wie gewohnt am Bildschirmende umgebrochen,
+sondern erst an der Spalte 180 (sofern sie nicht vorher durch die RETURN-
+Taste beendigt wird). Wird über das rechte Bildschirmende hinaus geschrieben,
+bleibt die Cursor-Position am Ende des Bildschirms erhalten, aber die Zeile
+wird beim weiteren Schreiben nach links verschoben, "rollt" also nach links
+(der Anfang der Zeile verschwindet scheinbar nach links).
+
+Mit der Positionierung verhält es sich ähnlich. Wird über den rechten Bild-
+schirmrand mit RECHTS positioniert, wird die Zeile ebenfalls gerollt. HOP
+RECHTS dagegen bewirkt ein Blättern nur innerhalb dieser Zeile nach rechts.
+Analog verläuft es bei verschobener Zeile, wenn nach links (LINKS bzw. HOP
+LINKS) positioniert wird.
+
+Beim Schreiben von Tabellen kann es sinnvoll sein, das Fenster vorübergehend
+auf eine andere Anfangsposition (als 1) einzustellen. Das kann mit dem
+'margin'-Kommando erfolgen. Beispiel:
+
+ margin (50)
+
+Das Fenster des Editors zeigt nun einen Ausschnitt aus der Datei, beginnend
+ab Spalte 50. In der Titelzeile wird "M50" angezeigt.
+
+Merke: Eine veränderte Zeilenbreite wird mit dem limit-Kommando eingestellt.
+Wird über den Bildschirmrand positioniert, wird die Zeile gerollt. Mit dem
+'margin'-Kommando kann spaltenmäßig ein Anfangspunkt des Fensters einge-
+stellt werden.
+
+
+
+Paralleles Editieren (Fenstereditor)
+
+Oft ist notwendig, mit mehreren Dateien gleichzeitig zu arbeiten, z.B. wenn
+aus einer Datei etwas in eine andere kopiert werden muß, wenn Fehler durch
+die Textkosmetik-Programme oder einen Compiler gefunden werden oder wenn man
+kurz etwas in einer andern Datei nachschauen will. Zu diesem Zweck bietet der
+Editor die Möglichkeit, zwei (oder mehr) Dateien zur gleichen Zeit zu be-
+arbeiten.
+
+Um ein neues Editor-Fenster einzuschachteln, betätigt man im Editor
+
+ ESC e
+
+Dies eröffnet ein Fenster auf eine andere Datei, deren Name interaktiv er-
+fragt wird. Die obere linke Ecke des Fensters befindet sich an der aktuellen
+Cursor-Position. Dabei darf sich der Cursor nicht zu sehr am rechten oder
+unteren Rand befinden (weil das Fenster sonst zu klein würde). In diesem
+"Fenster" auf eine andere Datei kann man genauso arbeiten, wie im "normalen"
+Editor. ESC q verläßt den aktuellen Fenstereditor (und alle darin einge-
+schachtelten Fenster).
+
+Mit der Tastenfolge
+
+ ESC w
+
+kann man von einem Fenster in das benachbarte wechseln (zyklisch). Insbeson-
+dere kann ein markierter Teil einer Datei mit dem Kommando
+
+ ESC p (* oder: PUT "" *)
+
+in eine temporäre Datei geschrieben und nach ESC w mit
+
+ ESC g (* oder: GET "" *)
+
+in die andere Datei eingefügt werden.
+
+Betätigt man ESC e ungefähr in der Mitte des Bildschirms, hat man das Fenster
+auf die neue Datei in der unteren Hälfte des Bildschirms und die "alte" Datei
+in der oberen Bildschirmhälfte. Dies nennt man "Paralleleditor", weil zwei
+Dateien zur gleichen Zeit editiert werden können. Der Paralleleditor wird
+auch von anderen Programmen benutzt, wie z.B. dem ELAN-Compiler, um Fehler-
+meldungen bequem anzuzeigen.
+
+Das Notizbuch schlägt man mit
+
+ ESC n
+
+auf. In diesem Notizbuch werden Informationen durch die Prozedur
+
+ note
+
+geschrieben.
+
+Merke: Der Fenstereditor wird durch ESC e aufgerufen und mit ESC q verlassen.
+Mit ESC w kann zwischen Dateien umgeschaltet werden. In jeder Datei stehen
+die gleichen Funktionen wie im "einfachen" Editor zur Verfügung. Man kann
+markierte Texte mit PUT bzw. GET von einer Datei in die andere bringen
+(Kopieren).
+
+
+
+Arbeiten mit dem Zeileneditor
+
+Der Zeileneditor erlaubt ein Editieren einer Eingabe mit allen Editor-
+Funktionen.
+
+Der Zeileneditor (auch "Feldeditor" genannt) wird über die Prozedur
+
+ editget
+
+aufgerufen. Durch diese Prozedur kann eine Zeile vom Terminal wie im Editor
+eingegeben werden, d.h. es können u.a. Einfügungen bzw. Löschungen in der
+Zeile vorgenommen werden. 'editget' dient darum als Grundlage für alle 'get'-
+Prozeduren. Beispiel:
+
+ TEXT VAR eingabe :: "";
+ put ("Bitte geben Sie einen Wert ein:");
+ editget (eingabe);
+ line
+
+'editget' kann aber auch einen Wert ausgeben, den ein Benutzer ggf.
+verändern kann. Beispiel:
+
+ TEXT VAR eingabe :: "trium10");
+ put ("Bitte Schrifttyp angeben:");
+ editget (eingabe);
+ line
+
+Hier kann ein Benutzer den TEXT 'trium10' verändern oder nur RETURN betäti-
+gen.
+
+Es gibt noch weitere Versionen von 'editget', bei denen man die Zeilenbreite,
+reservierte Tasten u.a.m. angeben kann.
+
+Merke: 'editget' ist der Zeileneditor.
+
+
+
+3. Vorbelegung von Tasten
+
+Wie schon beschrieben, können Lernsequenzen und Kommandos (d.h. ELAN-
+Programme) Tasten zugeordnet werden. Da einige Funktionen häufig benötigt
+werden, sind diese standardmäßig bestimmten Tasten zugeordnet.
+
+
+
+Kommandodialog
+
+ESC ESC Kommandodialog einschalten.
+
+ESC ! taste Im Kommandodialog: geschriebenes Kommando auf Taste legen.
+
+ESC ? taste Im Kommandodialog: Auf 'taste' gelegtes Kommando anzeigen zum
+ Editieren.
+
+ESC k Im Kommandodialog: Das zuletzt editierte ELAN-Programm an-
+ zeigen.
+
+
+
+Lernen
+
+ESC HOP Lernen einschalten.
+
+ESC HOP taste Lernsequenz auf 'taste' legen.
+
+
+
+Operationen auf Markierungen
+
+ESC RUBOUT Markiertes "vorsichtig" löschen.
+
+ESC RUBIN Vorsichtig Gelöschtes einfügen.
+
+ESC p Markiertes in die Scratch-Datei kopieren (PUT ""), an
+ schließend löschen (kann mit ESC g an anderer Stelle re-
+ produziert werden).
+
+ESC d Duplizieren: Markiertes in die Scratch-Datei kopieren
+ (PUT ""), anschließend die Markierung abschalten. (Kann mit
+ ESC g beliebig oft reproduziert werden).
+
+ESC g MIT ESC p gelöschtes oder mit ESC d dupliziertes an aktuelle
+ Cursor-Stelle schreiben, d.h. Scratch-Datei an aktueller
+ Stelle einfügen (GET "").
+
+
+
+Weitere Operationen
+
+ESC q Verlassen des Editors.
+
+ESC e Fenstereditor einschalten.
+
+ESC n Notizbuch "aufschlagen".
+
+ESC w Dateiwechsel beim Fenstereditor.
+
+ESC f Nochmalige Ausführung des letzten Kommandos
+
+ESC b Das Fenster wird auf den linken Rand der aktuellen (ggf.
+ verschobenen) Zeile gesetzt.
+
+ESC RECHTS Zum nächsten Wortanfang.
+
+ESC LINKS Zum vorigen Wortanfang.
+
+ESC 1 Zum Anfang der Datei.
+
+ESC 9 Zum Ende der Datei.
+
+
+
+Zeichen schreiben
+
+ESC a Schreibt ein ä.
+ESC A Schreibt ein Ä.
+ESC o Schreibt ein ö.
+ESC O Schreibt ein Ö.
+ESC u Schreibt ein ü.
+ESC U Schreibt ein Ü.
+ESC s Schreibt ein ß.
+ESC ( Schreibt eine [.
+ESC ) Schreibt eine ].
+ESC < Schreibt eine {.
+ESC > Schreibt eine }.
+ESC \# Schreibt ein \#, was auch gedruckt werden kann.
+ESC blank Schreibt ein (geschütztes) Leerzeichen.
+
+
+
+4. Komplexere Kommandos (ELAN-Programme)
+
+In diesem Kapitel finden Sie (neben den bereits in den vorherigen Kapiteln
+beschriebenen) eine Übersicht über die vorgefertigten Kommandos. Weitere
+können leicht vom Benutzer und Programmierer selbst erstellt werden.
+
+
+
+Wiederholungen schreiben
+
+In der Programmiersprache ELAN gibt es ein Sprachmittel, um Anweisungen
+wiederholen zu lassen. Dieses Sprachmittel nennt man Wiederholungsanweisung
+oder Schleife. Durch dieses Sprachmittel ist es leicht möglich, eine oder
+mehrere Kommandos mehrmals ausführen zu lassen.
+
+Eine Wiederholung, meist Schleife genannt, wird durch die Worte REP (steht
+für 'REPEAT', was soviel wie 'wiederhole' heißt) und PER (die Umkehrung von
+REP) oder END REP gebildet. Alle Anweisungen, die zwischen diesen Worten
+stehen, werden wiederholt ausgeführt (bis das Ende der Datei erreicht ist).
+Damit kann man einen Text in der gesamten Datei ändern. (In den folgenden
+Beispielen schreiben wir die Kommandozeile der besseren Übersichtlichkeit
+halber in mehreren Zeilen). Beispiel:
+
+ T 1;
+ WHILE NOT eof REP
+ "alter text" C "neuer text"
+ PER
+
+Durch die erste Anweisung wird zur ersten Zeile der Datei positioniert. Dann
+steht im Programm eine sogenannte "abweisende Schleife", die durch 'WHILE
+bedingung' eingeleitet wird (die Schleife wird solange ausgeführt, bis die
+Bedingung nicht mehr erfüllt ist). Die Bedingung besteht hier aus einer Ab-
+frage auf das Dateiende der bearbeiteten Datei ('eof'). Nach Eintritt in die
+Schleife wird nach 'alter text' gesucht. Falls gefunden, wird er durch
+'neuer text' ersetzt. Das Suchen und ersetzen wird solange durchgeführt, bis
+das Dateiende erreicht wird. Falls 'alter text' nicht gefunden wird, steht
+man auf dem letzten Zeichen der letzten Zeile der Datei (wie bei einer er-
+folglosen wiederholten letzten Suche), so daß die nächste WHILE-Überprüfung
+die Schleife abbricht.
+
+Die meisten der oben beschriebenen Kommandos gibt es nicht nur als Operato-
+ren, sondern auch als Prozeduren. Beispiele:
+
+ T 1 ==> toline (1)
+ D "text" ==> down ("text")
+ U "text" ==> up ("text")
+ D 17 ==> down (17)
+ U 18 ==> up (18)
+ "alt" C "neu" ==> change to ("alt", "neu")
+ "alt" CA "neu" ==> change all ("alt", "neu")
+
+Man kann also das obige Beispiel auch folgendermaßen programmieren:
+
+ toline (1);
+ WHILE NOT eof REP
+ change to ("alter text", "neuer text")
+ PER
+
+Durch dieses zusammengesetzte Editor-Kommando können also ein oder mehrere
+Worte in der gesamten Datei auf einfache Weise geändert werden.
+Natürlich kann man das obige Beispiel einfacher schreiben:
+
+ toline (1); change all ("alter text", "neuer text")
+
+Was muß man nun programmieren, um eine Ersetzung nur einmal pro Zeile vor-
+zunehmen? Erinnern wir uns: nach einer Ersetzung steht der Cursor hinter dem
+ersetzten Text. Somit finden wir bei der erneuten Suche unter Umständen den
+Text nochmals in der aktuellen Zeile. Wenn wir nach einer Ersetzung aber um
+eine Zeile vorwärts positionieren (mit 'down (1)'), kann dies nicht ge-
+schehen. Leider wird durch die Vorwärts-Positionierung die Position des
+Cursors nicht verändert. Somit kann die erneute Suche einen Text in der
+nächsten Zeile verpassen. Man muß also neben der Vorwärts-Positionierung um
+eine Zeile zusätzlich auch noch an den Anfang der Zeile gehen. Für die
+Positionierung innerhalb einer Zeile gibt es die Prozedur
+
+ col (17) (* Positioniert auf die 17. Spalte
+ der aktuellen Zeile *)
+
+Damit können wir nun eine einmalige Ersetzung in einer Zeile programmieren:
+
+ toline (1);
+ WHILE NOT eof REP
+ col (1);
+ change to ("alter text", "neuer text");
+ down (1);
+ PER
+
+Es wird erst auf die erste Zeile, erste Spalte positioniert. Dann wird 'alter
+text' gesucht und ggf. durch 'neuer text' ersetzt. Danach wird eine Zeile
+vorwärts positioniert, wiederum auf Spalte 1. Dadurch ist gewährleistet, daß
+eine Ersetzung nur einmal pro Zeile vorgenommen wird und immer von der
+ersten Spalte einer Zeile aus gesucht wird. Dies geschieht solange, bis das
+Ende der Datei erreicht ist.
+
+Manchmal ergibt sich die Notwendigkeit, in Tabellen in jeder Zeile noch Leer-
+spalten einzufügen oder zu entfernen. Auch dies kann mit der Schleife leicht
+erledigt werden:
+
+ toline (1);
+ WHILE NOT eof REP
+ col (48);
+ "" C " ";
+ down (1)
+ PER
+
+Hier werden in jeder Zeile an der Spalte 48 drei Leerzeichen eingefügt. In
+diesem Fall suchen wir ab der Spaltenposition 48 einen sogenannten "Niltext"
+("leerer Text"). Dieser Text wird natürlich immer gefunden. Aber man muß
+hier aufpassen, denn der gesuchte Text sollte in dieser Zeile vorhanden sein,
+sonst wird in einer der nächsten Zeilen ein TEXT ersetzt, der nicht unbe-
+dingt an der Spaltenposition 48 steht!
+
+Wie bereits angemerkt, sollten in den zu verändernden Zeilen an der Position
+48 ein Leerzeichen stehen, sonst wird das C-Kommando fehlerhaft bei dem
+nächsten TEXT ausgeführt. Das kann man verhindern, indem man folgendes
+programmiert:
+
+ toline (1);
+ WHILE NOT eof REP
+ down (" "); (* sucht das naechste Blank ab Spalte 48 *)
+ IF col = 48
+ THEN change to (" ", " ");
+ FI
+ END REP
+
+Die Prozedur 'col' (ohne Parameter) liefert die aktuelle Spaltenposition
+innerhalb einer Zeile.
+
+Manchmal soll eine Änderung nur in einem bestimmten Bereich vorgenommen
+werden. Dazu gibt es die Prozedur 'line no', mit der man die aktuelle Zeilen-
+nummer erfragen kann. Beispiel:
+
+ toline (50);
+ WHILE NOT eof REP
+ aenderungen
+ UNTIL line no = 100 END REP
+
+In diesem Beispiel werden 'aenderungen' im Zeilenbereich 50 - 100 vorgenom-
+men. 'line no' liefert die aktuelle Zeilennummer des FILEs, welches gerade
+vom Editor bearbeitet wird.
+
+Weitere Beispiele:
+
+ (* suchen in Spalte 17: *)
+ REP
+ down ("muster")
+ UNTIL eof OR col = 17 END REP
+
+ (* in Spalte 1 ersetzen: *)
+ REP
+ down ("alt");
+ IF col = 1
+ THEN "alt" C "neu"
+ FI
+ UNTIL eof END REP
+
+Merke: Eine Wiederholung REP ... PER führt die in ihr enthaltenen An-
+weisungen wiederholt aus. Eine Abfrage auf das Dateiende der bearbeiteten
+Datei ist durch 'eof' möglich.
+
+
+
+Das Notizbuch
+
+Im Notizbuch kann man sich Notizen über den Ablauf von Kommandos machen.
+
+Die Prozedur
+
+ note
+
+schreibt einen INT- oder TEXT-Parameter in eine Zwischendatei. Diese Datei
+kann man sich mit
+
+ ESC n
+
+anschauen. Beispiel:
+
+ (* ersetzen und notieren: *)
+ REP
+ "alt" C "neu";
+ note (line no) (* Zeilennummer der Ersetzung notieren *)
+ UNTIL eof END REP
+
+Merke: Die Prozedur 'note' schreibt in das Notizbuch. Mit ESC n kann man
+sich das Notizbuch anschauen.
+
+
+
+Neue Editor-Kommandos bereitstellen
+
+Sollen neue Editor-Kommandos bereitgestellt werden, muß man dem Editor ggf.
+mitteilen, ob und wie das Fenster auf die Datei auf dem Bildschirm neu ge-
+schrieben werden muß.
+
+Neue Editor-Kommandos kann man allen Benutzern bereitstellen, in dem ein
+Programm geschrieben wird. Beispiel:
+
+ PROC datum schreiben:
+ type (datum).
+
+ datum:
+ date (clock (1)). (* Siehe auch TEIL 8: Standardpakete *)
+ END PROC datum schreiben
+
+Diese Prozedur (oder mehrere) muß noch in ein PACKET "gekleidet" und dann
+insertiert werden. Dann steht 'datum schreiben' allen Benutzern dieser Task
+oder dessen Sohn-Task zur Verfügung (siehe dazu auch TEIL 5: ELAN-Compiler).
+
+Bei etwas komplizierteren Prozeduren sollte man dem Editor mitteilen, ob und
+wie er das Fenster auf die Datei auf dem Bildschirm neu schreiben muß.
+Normalerweise schreibt der Editor nach einem Kommando den gesamten Bild-
+schirm neu. Dies kann man verhindern, indem man die Prozedur
+
+ nichts neu
+
+aufruft. Sie teilt dem Editor mit, daß das Fenster nicht neu geschrieben
+werden muß. Weitere Prozeduren teilen dem Editor mit, daß Teile des Fensters
+neu geschrieben werden müssen:
+
+ satznr neu (* Zeilennummer links oben *)
+ ueberschrift neu
+ zeile neu
+ abschnitt neu
+ bild neu
+
+Dabei kann man die Prozeduren in beliebiger Reihenfolge aufrufen, wobei
+jeweils immer die größte Änderung dominiert. Beispiel:
+
+ nichts neu;
+ ...
+ zeile neu;
+ ...
+ bild neu;
+ ...
+ ueberschrift neu
+ ...
+
+'bild neu' dominiert über 'zeile neu',
+'zeile neu' dominiert über 'ueberschrift neu';
+'ueberschrift neu' dominiert über 'nichts neu'.
+
+Im obigen Beispiel 'datum schreiben' würde es also ausreichen, am Anfang der
+Prozedur 'nichts neu' und am Ende 'zeile neu' aufzurufen, damit nur die
+aktuelle Zeile neu geschrieben wird.
+
+Manchmal ist es notwendig, dem Benutzer bei einer Kommandoverarbeitung neue
+Zustände direkt anzuzeigen. Dafür gibt es die Prozeduren
+
+ satznr zeigen
+ ueberschrift zeigen
+ bild zeigen
+
+Beispiel:
+
+ satznr zeigen (line no)
+
+zeigt bei einer Kommandoverarbeitung die aktuelle Zeilenummer.
+
+Merke: Normalerweise baut der Editor nach einer Kommandoausführung das
+Fenster auf dem Bildschirm neu auf. Mit 'nichts neu' kann das verhindert
+werden. Weitere Prozeduren teilen dem Editor mit, welche Fensterteile neu
+geschrieben werden müssen. Das Schreiben von Fensterteilen kann auch direkt
+ausgelöst werden.
+
+
+
+Die ELAN-Notation
+
+Kommandos werden in ELAN-Notation beschrieben. Dabei bedeuten:
+
+OP Operator.
+ Der Name des Operators muß mit grossen Buchstaben vor oder
+ zwischen die Operanden geschrieben werden. Beispiele:
+ OP C (TEXT CONST muster, pattern)
+ --> "alt" C "neu"
+
+PROC Prozedur.
+ Der Name der Prozedur muß klein geschrieben werden. Die
+ Parameter werden in Klammern angefügt. Beispiele:
+ PROC getchar (TEXT VAR zeichen)
+ --> getchar (character)
+ PROC edit (TEXT CONST datei,
+ INT CONST x, y, xsize, ysize)
+ --> edit ("meine datei", 1, 1, 79, 24)
+
+INT Ganze Zahl ('Integer').
+ Der Wert ist eine ganze Zahl (ohne Dezimalpunkt!).
+
+BOOL Wahrheitswert ('Boolean').
+ Hat zwei Werte: TRUE ('Wahr') und FALSE ('Falsch').
+
+TEXT Text.
+ Muß in Anführungszeichen geschrieben werden. Soll das
+ '"'-Zeichen in einem Text vorkommen, muß es doppelt
+ geschrieben werden.
+
+VAR Veränderbarer Wert.
+ Wert kann von der Prozedur oder dem Operator verändert
+ werden.
+
+CONST Unveränderbarer Wert.
+ Wert kann von der Prozedur oder dem Operator nicht ver-
+ ändert werden.
+
+
+
+Kommando-Übersicht
+
+In dieser Übersicht werden Editor-Kommandos, die in der Regel nur in Pro-
+grammen verwendet werden, mit (P) gekennzeichnet. "Nicht-Programmierer"
+brauchen also nur die nicht gekennzeichneten Kommandos zu lesen. Alle hier
+aufgeführten Kommandos arbeiten auf die vom Editor bearbeitete Datei
+('editfile'). Einige der Prozeduren stehen auch zur allgemeinen Dateiver-
+arbeitung zur Verfügung (siehe TEIL 7), allerdings dann mit einem zusätz-
+lichen FILE-Parameter.
+
+abschnitt neu (P)
+ PROC abschnitt neu (INT CONST von zeile, bis zeile)
+ Zweck: Mitteilung an den Editor, daß der entsprechende Abschnitt
+ auf dem Bildschirm neu geschrieben werden muß.
+
+at (P)
+ BOOL PROC at (TEXT CONST muster)
+ Zweck: Feststellen, ob der Editor auf 'muster' steht. Die Cursor-
+ Position wird dabei nicht verändert.
+
+bild neu (P)
+ PROC bild neu
+ Zweck: Mitteilung an den Editor, daß das Bild nach Kommandover-
+ arbeitung neu geschrieben werden muß.
+
+bild zeigen
+ PROC bild zeigen
+ Zweck: Mitteilung an den Editor, daß das Bild sofort neu geschrieben
+ werden muß.
+
+C
+ OP C (TEXT CONST muster, pattern)
+ Zweck: Wie D "muster" mit anschließender Ersetzung desselben durch
+ 'pattern'.
+
+change to (P)
+ PROC change to (TEXT CONST muster, pattern)
+ Zweck: Analog C.
+
+ PROC change to (TEXT CONST muster, pattern, INT CONST number)
+ Zweck: Analog C, aber nur 'number' Zeilen weit.
+
+CA
+ OP CA (TEXT CONST source, destination)
+ Zweck: Arbeitet ab der aktuellen Position wie
+
+ WHILE NOT eof REP
+ "source" C "destination"
+ END REP
+
+change all (P)
+ PROC change all (TEXT CONST source, destination)
+ Zweck: Analog CA.
+
+col (P)
+ PROC col (INT CONST pos)
+ Zweck: Positioniert auf die Spalte 'pos' der aktuellen Zeile.
+ Beispiel:
+
+ col (37)
+
+ positioniert auf die 37. Spalte der aktuellen Zeile.
+
+ INT PROC col
+ Zweck: Liefert die aktuelle Position des Cursors innerhalb einer Zeile.
+
+D
+ OP D (INT CONST n)
+ Zweck: Positioniert das Fenster n Zeilen vorwärts in Richtung auf das
+ Dateiende.
+
+ OP D (TEXT CONST muster)
+ Zweck: Sucht 'muster' vorwärts in Richtung auf das Dateiende. Die Suche
+ beginnt direkt hinter der aktuellen Cursor-Position. Wird 'muster'
+ nicht gefunden, steht der Cursor hinter dem letzten Zeichen der
+ Datei. Wird 'muster' gefunden, steht der Cursor direkt auf dem
+ ersten Zeichen von 'muster'.
+
+down (P)
+ PROC down (INT CONST n)
+ Zweck: Analog D.
+
+ PROC down (TEXT CONST muster)
+ Zweck: Analog D.
+
+ PROC down (TEXT CONST muster, INT CONST n)
+ Zweck: Analog D, jedoch geht die Suche nur 'n' Zeilen.
+
+downety (P)
+ PROC downety (TEXT CONST muster)
+ Zweck: Im Gegensatz zu 'down' beginnt die Suche mit dem aktuellen Zeiche
+ n, d.h. der Aufruf führt zu einer leeren Leistung, wenn der Cursor schon
+ auf 'muster' steht. Deshalb bei der Programmierung vorsichtig verwenden.
+
+ PROC downety (TEXT CONST muster, INT CONST n)
+ Zweck: Analog 'downety', jedoch geht die Suche nur 'n' Zeilen und
+ beginnt bei der aktuellen Cursor-Position (siehe oben).
+
+editfile (P)
+ FILE PROC editfile
+ Zweck: Liefert die aktuell editierte Datei.
+
+eof
+ BOOL PROC eof
+ Zweck: Abfrage auf das Dateiende der zu bearbeitenden Datei.
+
+GET
+ OP GET (TEXT CONST dateiname)
+ Zweck: Kopiert den Inhalt der Datei mit dem angegebenen Namen vor die
+ aktuelle Cursor-Position. Ist die Quelldatei kopiert, wird nur
+ der markierte Teil kopiert.
+
+ OP G (TEXT CONST dateiname)
+ Zweck: Wie GET.
+
+len (P)
+ INT PROC len
+ Zweck: Liefert die Länge der aktuellen Zeile.
+
+limit
+ OP limit (INT CONST limit)
+ Zweck: Setzt die rechte Schreibgrenze auf 'limit'. Beispiel:
+
+ limit (120)
+
+ stellt den Editor auf eine Zeilenlänge von 120 Zeichen.
+
+ INT PROC limit
+ Zweck: Liefert die eingestellte Zeilenbreite.
+
+line no (P)
+ INT PROC line no
+ Zweck: Liefert die aktuelle Zeilennummer der editierten Datei.
+
+margin
+ PROC margin (INT CONST anfang)
+ Zweck: Alle Zeilen erscheinen erst ab Spalte 'anfang' im Sichtfenster.
+ Beispiel:
+
+ margin (50)
+
+ legt das Fenster ab Spalte 50 fest.
+
+ INT PROC margin
+ Zweck: Liefert den eingestellten linken Rand.
+
+mark (P)
+ PROC mark (BOOL CONST an)
+ (Zweck: Schaltet die Markierung an der aktuellen Stelle ein bzw. aus.
+ Beispiel:
+
+ mark (true) (* schaltet Markierung an *)
+ mark (false) (* schaltet Markierung aus *)
+
+ BOOL PROC mark
+ Zweck: Liefert TRUE, sofern die Markierung eingeschaltet ist.
+
+nichts neu (P)
+ PROC nichts neu
+ Zweck: Mitteilung an den Editor, daß nach Kommandoverarbeitung das Bild
+ nicht neu geschrieben werden muß.
+
+note (P)
+ PROC note (INT CONST wert)
+ Zweck: Schreibt 'wert' in das Notizbuch.
+
+ PROC note (TEXT CONST message)
+ Zweck: Schreibt 'message' in das Notizbuch.
+
+pattern found (P)
+ BOOL PROC pattern found
+ Zweck: Gibt an, ob der letzte Suchprozeß erfolgreich war.
+
+PUT
+ OP PUT (TEXT CONST dateiname)
+ Zweck: Richtet eine Datei mit dem angegebenen Namen ein, kopiert den
+ markierten Textabschnitt in diese.
+
+ OP P (TEXT CONST dateiname)
+ Zweck: Wie PUT.
+
+satznr neu (P)
+ PROC satznr zeigen
+ Zweck: Mitteilung an den Editor, daß nach Kommandoverarbeitung die
+ Zeilennummer rechts oben neu geschrieben werden muß.
+
+satznr zeigen (P)
+ PROC satznr zeigen (INT CONST nr)
+ Zweck: Mitteilung an den Editor, die Zeilennummer 'nr' sofort neu zu
+ schreiben.
+
+T
+ OP T (INT CONST n)
+ Zweck: Positioniert auf die Zeile 'n'.
+
+toline (P)
+ PROC toline (INT CONST n)
+ Zweck: Analog T.
+
+type (P)
+ PROC type (TEXT CONST t)
+ Zweck: Trägt 't' in den Eingabestrom ('f kommando') des Editors ein.
+ Beispiel:
+
+ type (text (sqrt (2.0)))
+
+ fügt an die aktuelle Cursor-Position den Wert 1.41... ein.
+ Beispiel:
+
+ INT VAR i;
+ FOR i FROM 1 UPTO 10 REP
+ type (text (i) + " ")
+ END REP
+ (* Ausgabe: 1 2 3 4 5 6 7 8 9 10 *)
+
+U
+ OP U (INT CONST n)
+ Zweck: Positioniert das Fenster n Zeilen rückwärts in Richtung auf den
+ Dateianfang.
+
+ OP U (TEXT CONST muster)
+ Zweck: Sucht 'muster' rückwärts in Richtung auf den Dateianfang. Die
+ Suche beginnt links neben der aktuellen Cursor-Position. Vergl. D
+
+ueberschrift neu (P)
+ PROC ueberschrift neu
+ Zweck: Mitteilung an den Editor, daß nach Kommandoverarbeitung die
+ Überschriftszeile neu zu schreiben ist.
+
+ueberschrift zeigen (P)
+ PROC ueberschrift zeigen
+ Zweck: Mitteilung an den Editor, daß sofort die Überschriftszeile neu
+ zu schreiben ist.
+
+up (P)
+ PROC up (INT CONST n)
+ Zweck: Analog U.
+
+ PROC up (TEXT CONST muster)
+ Zweck: Analog U.
+
+ PROC up (TEXT CONST muster, INT CONST n)
+ Zweck: Analog U, aber nur 'n' Zeilen weit.
+
+uppety (P)
+ PROC uppety (TEXT CONST muster)
+ Zweck: Im Gegensatz zu 'up' beginnt die Suche direkt auf der aktuellen
+ Cursor-Position. Vergl. 'down'.
+
+ PROC uppety (TEXT CONST muster, INT CONST n)
+ Zweck: Analog 'uppety', aber nur 'n' Zeilen weit.
+
+word (P)
+ TEXT PROC word
+ Zweck: Liefert das Wort von der aktuellen Position bis zum nächsten
+ Blank bzw. Zeilenende. Die Cursor-Position wird nicht verändert.
+
+ TEXT PROC word (TEXT CONST muster)
+ Zweck: Liefert das Wort von der aktuellen Position bis zum nächsten Auf-
+ treten von 'muster' (ausschließlich) bzw. Zeilenende. Die Cursor-
+ Position wird nicht verändert.
+
+ TEXT PROC word (INT CONST laenge)
+ Zweck: Liefert das Wort von der aktuellen Position in der angegebenen
+ 'laenge' bzw. bis zum Zeilenende. Die Cursor-Position wird nicht
+ verändert.
+
+word wrap
+ PROC word wrap (BOOL CONST an)
+ Zweck: Schaltet den automatischen Wortumbruch an (voreingestellt) bzw.
+ aus. Beispiel:
+
+ word wrap (true) (* angeschaltet *)
+ word wrap (false) (* ausgeschaltet *)
+
+zeile neu (P)
+ PROC zeile neu
+ Zweck: Mitteilung an den Editor, daß nach Kommandoverarbeitung die
+ aktuelle Zeile neu zu schreiben ist.
+
+
+
+5. EUMEL-Zeichensatz
+
+Das EUMEL-System definiert einen Zeichensatz, der gewährleistet, daß Zeichen
+auf allen Maschinen überall gleich codiert werden. Dadurch ist es z.B. mög-
+lich, Dateien und Programme ohne Konvertierungen zwischen EUMEL-Systemen
+unterschiedlicher Hersteller zu übertragen. Der EUMEL-Zeichensatz beruht auf
+dem ASCII-Zeichensatz (DIN 66 003) mit Erweiterungen.
+
+
+
+Darstellbare Zeichen
+
+Die genaue Darstellung der einzelnen Zeichen hängt vom Endgerät ab. Die hier
+aufgeführten Zeichen sind i.A. auf allen Geräten vorhanden. Ein erweiterter
+Zeichensatz (mit mathematischen, diakritischen und griechischen Zeichen) ist
+nur auf Spezialgeräten verfügbar und wird deshalb hier nicht angegeben.
+
+Beispiele zum Lesen der Tabelle:
+
+ code (" ") -> 32
+ code ("m") -> 109
+
+ |3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
+-+-------------------------------------------------------------------
+0| ( 2 < F P Z d n x k
+ |
+1| ) 3 = G Q [ e o y - ß
+ |
+2|SP * 4 > H R \\ f p z \#
+ |
+3|! + 5 ? I S ] g q { SP
+ |
+4|" , 6 § J T ^ h r | Ä
+ |
+5|\# - 7 A K U _ i s } Ö
+ |
+6|$ . 8 B L V ` j t ~ Ü
+ |
+7|% / 9 C M W a k u ä
+ |
+8|& 0 : D N X b l v ö
+ |
+9|' 1 ; E O Y c m w ü
+
+Anmerkungen:
+1) SP bedeutet Leerzeichen ("blank").
+2) Die Zeichen 'k', '-' und 'SP' mit den Codes 220, 221, 223 werden für die
+ Zwecke der Textkosmetik benötigt (Trenn 'k' bei der Umwandlung von 'ck' in
+ 'kk'; Trennzeichen; geschütztes Leerzeichen).
+3) Das Zeichen '\#' (Code 222) ist druckbar, während das Zeichen '\#' (Code 35)
+ nicht druckbar ist (Einleitungszeichen für Anweisungen der Textkosmetik
+ und Drucker).
+4) Das Zeichen SP (Code 223) wird zur besseren Identifizierung als Unter-
+streichungsstrich auf dem Terminal dargestellt. Im einem Ausdruck erscheint
+es als ein Leerzeichen.
+
+
+
+Steuerzeichen und -tasten
+
+Das EUMEL-System definiert neben den darstellbaren Zeichen auch Steuer-
+zeichen, die entsprechend der angeschlossenen Geräte ggf. jeweils umcodiert
+werden.
+
+Das EUMEL-System definiert (Ausgabe-) Steuerzeichen mit ihren (ausgabesei-
+tigen) Wirkungen. Diese Steuerzeichen sind geräteunabhängig und werden vom
+EUMEL-System automatisch für die jeweiligen Geräte passend umcodiert. Bei
+Standard-Geräteschnittstellen ist die Wirkung anderer Steuerzeichen nicht
+definiert. Für den Anschluß von Druckern, für Datenfernübertragung u.ä.
+können sogenannte "Transparent"-Schnittstellen verwandt werden. Bei diesen
+Schnittstellen ist die Wirkung aller Steuerzeichen undefiniert (vom ange-
+schlossenen Gerät abhängig); es wird aber garantiert, daß alle Zeichen ohne
+Code-Umsetzung direkt ausgegeben werden.
+
+
+
+Ausgabesteuerzeichen
+
+Wert | Bezeichnung | Wirkung
+------+--------------+-----------------------------------------
+ 0 | NUL | keine Wirkung, Füllzeichen
+ 1 | HOME | Cursor auf linke obere Ecke des Bildschirms
+ 2 | RECHTS | Cursor eine Stelle nach rechts
+ 3 | OBEN | Cursor eine Zeile nach oben
+ 4 | CL EOP | Löschen von Cursor-Position bis Bildschirmende
+ 5 | CL EOL | Löschen von Cursor-Position bis Zeilenende
+ 6 | CPOS | Cursor positionieren, nächstes Ausgabezeichen be-
+ | | stimmt die y-Position (0 <= code (y) <= 23), darauf-
+ | | folgendes Ausgabezeichen die x-Position
+ | | (0 <= code (x) <= 78).
+ 7 | BELL | akustisches Signal
+ 8 | LINKS | Cursor eine Stelle nach links
+10 | UNTEN | Cursor eine Zeile nach unten bzw. 'roll up', falls
+ | | der Cursor schon in der letzten Zeile stand
+13 | RETURN | Cursor an den Anfang der aktuellen Zeile
+14 | ENDMARK | Ende des zu markierenden Bereichs
+15 | BEGINMARK | Anfang des zu markierenden Bereichs
+
+
+
+Eingabe-Steuertasten
+
+Für die Eingabeseite sind im EUMEL ebenfalls Steuertasten definiert. Diese
+Tasten sollten am angeschlossenen Gerät vorhanden sein oder bereitgestellt
+werden (z.B. durch Überkleben von Tasten) oder müssen mit Hilfe der
+CONTROL-Taste simuliert werden. Das EUMEL-System führt entsprechend der
+folgenden Tabelle evtl. notwendige Umcodierungen der Eingabe durch. Weitere
+vorhandene Spezialtasten erzeugen gerätespezifische Codes. Bei der "Transpa-
+rent"-Schnittstelle werden - symmetrisch zur Ausgabeseite - alle hereinkom-
+menden Zeichen ohne Code-Umsetzung weitergereicht.
+
+Wert | Bezeichnung
+------+------------
+ 1 | HOP
+ 2 | RECHTS
+ 3 | OBEN
+ 8 | LINKS
+ 9 | TAB
+10 | UNTEN
+11 | RUBIN
+12 | RUBOUT
+13 | RETURN
+16 | MARK
+27 | ESC
+
+
+
+6. Der Editor als Unterprogramm
+
+Um eine Anpassung der Benutzerschnittstelle an spezielle Bedürfnisse vor-
+nehmen zu können, werden einige noch nicht erläuterte ELAN-Prozeduren zur
+Verfügung gestellt. Mit diesen kann für jede Anwendung ein Spezialprogramm
+zur Verfügung gestellt werden, das den Editor als Unterprogramm aufruft. Für
+den "normalen" Editor-Benutzer ist dieses Kapitel somit nicht weiter von
+Interesse.
+
+
+
+Tastenverwaltung
+
+kommando auf taste legen
+ PROC kommando auf taste legen (TEXT CONST taste, elan programm)
+ Zweck: Belegt die Taste 'taste' mit dem ELAN-Programm 'elan programm'.
+ Beispiel:
+
+ kommando auf taste legen
+ ("v", "edit (""meine datei"")")
+
+ belegt die Taste 'v' mit der 'edit'-Prozedur.
+
+kommando auf taste
+ TEXT PROC kommando auf taste (TEXT CONST taste)
+ Zweck: Liefert den Quelltext des auf die Taste 'taste' gelegten ELAN-Pro-
+ gramms oder niltext, wenn diese nicht entsprechend belegt ist.
+
+lernsequenz auf taste legen
+ PROC lernsequenz auf taste legen (TEXT CONST taste, lernsequenz)
+ Zweck: Belegt die Taste 'taste' mit den Zeichen 'lernsequenz'. Beispiel:
+
+ lernsequenz auf taste legen ("a", ""217"")
+
+ belegt die Taste 'a' mit dem 'ä'.
+
+lernsequenz auf taste
+ TEXT PROC lernsequenz auf taste (TEXT CONST taste)
+ Zweck: Liefert die auf 'taste' gelegte Tastenanschlagsfolge
+ oder niltext, wenn diese nicht entsprechend belegt ist.
+
+taste enthaelt kommando
+ BOOL PROC taste enthaelt kommando (TEXT CONST taste)
+ Zweck: Liefert TRUE, wenn 'taste' mit einem ELAN-Programm belegt ist.
+
+std tastenbelegung
+ PROC std tastenbelegung
+ Zweck: Belegt die Tasten mit der Standardbelegung.
+
+
+
+Aufruf des Editors, Zeilen- und Fenstereditors
+
+edit
+ PROC edit
+ Zweck: a) Im Monitor:
+ Ruft den Editor mit den zuletzt verwandten Dateinamen auf.
+ b) Im Editor:
+ Der Dateiname wird erfragt.
+ Für jedes 'edit' gilt:
+ Wurde der 'edit' zum ersten mal aufgerufen, nimmt das Fenster
+ den gesamten Bildschirm ein. Bei erneuten 'edit'-Aufruf wird
+ ein Fenster nach rechts unten ab aktuellen Cursor-Punkt eröffnet.
+
+ PROC edit (TEXT CONST datei)
+ Zweck: Ruft den Editor mit 'datei' auf.
+
+ PROC edit (TEXT CONST datei, x, y, xsize, ysize)
+ Zweck: Wie obiger 'edit'-Aufruf, jedoch kann das Fenster, in der 'datei'
+ editierbar ist, gesetzt werden. Die Parameter definieren ein
+ Editor-Fenster mit der linken oberen Ecke auf den Bildschirmkoor-
+ dinaten 'x' und 'y' und einer Zeilenbreite 'xsize' und 'ysize'
+ Zeilen. Wird der Editor mit 'edit ("datei")' aufgerufen, wird
+ implizit 'edit ("datei", 1, 1, 79, 24)' aufgerufen.
+
+ PROC edit (FILE VAR f)
+ Zweck: Vergl. obige 'edit'-Prozedur.
+
+ PROC edit (THESAURUS CONST t)
+ Zweck: Editieren aller in dem Thesaurus 't' enthaltenen Dateien nachein-
+ ander. Beispiel:
+
+ edit (ALL myself)
+
+ PROC edit (FILE VAR f, INT CONST x, y, xsize, ysize)
+ Zweck: Vergl. obige 'edit'-Prozedur.
+
+editget
+ PROC editget (TEXT VAR editsatz)
+ Zweck: Eingabe mit Editiermöglichkeit von 'editsatz' vom Terminal an der
+ aktuellen Bildschirmposition. 'editsatz' wird ausgegeben. Die
+ Eingabe wird mit RETURN beendet. Im Gegensatz zu 'get' ist hier
+ auch eine leere Eingabe (RETURN) erlaubt.
+
+ PROC editget (TEXT VAR editsatz, INT CONST editlimit, editlaenge,
+ TEXT CONST sep, res, TEXT VAR exit char)
+ Zweck: Wie oben. Dabei bedeuten:
+
+ editsatz: TEXT, der zum Editieren ausgegeben wird.
+ editlimit: Einstellung des 'limit's der Zeile (max. Anzahl von Zeichen).
+ Bei obiger 'editget'-Prozedur wird 'editlimit' mit
+ 'maxtextlength' aufgerufen.
+ editlaenge: Breite des Zeilenfensters, bevor gerollt wird (bei leerer
+ Zeile ist dies 77).
+ sep: Zeichen, bei denen die Eingabe (zusätzlich zu RETURN)
+ beendet werden soll.
+ res: Angabe von reservierten Tasten. Wird einer dieser Tasten mit
+ ESC betätigt, wird die Eingabe beendet. In
+ exit char: steht dann ESC und das Zeichen, mit dem der Editor verlassen
+ wurde.
+
+ PROC editget (TEXT VAR editsatz, INT CONST editlimit,
+ TEXT VAR exit char)
+ Zweck: Siehe oben.
+
+ PROC editget (TEXT VAR editsatz, TEXT CONST sep, res,
+ TEXT VAR exit char)
+ Zweck: Siehe oben.
+
+show
+ PROC show (FILE VAR f)
+ Zweck: Zeigt eine Datei 'f' auf dem Bildschirm. Wie beim Editor kann mit
+ Hilfe der Positionierungstasten UNTEN bzw. OBEN oder HOP UNTEN bzw.
+ HOP OBEN oder HOP RETURN "geblättert" werden. Die Datei 'f' muß
+ deshalb mit der Verarbeitungsart 'modify' assoziiert worden sein.
+ Soll die Prozedur 'show' verlassen werden, müssen - wie beim Editor
+ - die zwei Tasten ESC und q betätigt werden. Die Datei kann nicht
+ schreibend verändert werden.
+
+ PROC show (TEXT CONST filename)
+ Zweck: Wie obige Prozedur.
+
+
+
+Zeichen verarbeiten
+
+getchar
+ PROC getchar (TEXT VAR zeichen)
+ Zweck: Holt das nächste Eingabezeichen von der Tastatur.
+
+is incharety
+ BOOL PROC is incharety (TEXT CONST zeichen)
+ Zweck: Ist das nächste Eingabezeichen der Tastatur 'zeichen', liefert
+ 'is incharety' TRUE. In diesem Fall wird 'zeichen' von der Eingabe
+ verschluckt. Ist das nächste Zeichen von der Tastatur nicht 'zei-
+ chen', liefert 'is incharety' FALSE. Die Eingabe bleibt unver-
+ ändert.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil4 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil4
new file mode 100644
index 0000000..ecca7e6
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil4
@@ -0,0 +1,2306 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 4: Textkosmetik und Druck
+
+TEIL 4: Textkosmetik und Druck
+
+
+Vorwort
+
+Die Textkosmetik-Programme des EUMEL-Systems bieten eine einfach zu er-
+lernende und zu bedienende Möglichkeit, Texte für den endgültigen Druck zu
+gestalten (Programmtechnisch: #ib#formatieren#ie#). Die Textkosmetik ermög-
+licht zusätzlich, Texte in einer Art und Weise zu manipulieren, die auf
+preiswerten Terminals zur Zeit nicht darstellbar ist, wie z.B. verschieden-
+artige Schriften. "Nebenbei" erledigt die Textkosmetik aufwendige Routine-
+arbeiten, wie z.B. Seitennumerierung und die Plazierung von Fußnoten.
+
+Die Textkosmetik-Programme bearbeiten Dateien, die durch den EUMEL-Editor
+erstellt wurden. Darum sollte man sich zuerst mit dem EUMEL-Editor vertraut
+machen.
+
+Für die meisten Aufgaben ist kein Benutzereingriff erforderlich, darum sind
+die Programme so konstruiert, daß sie durch in den Text eingefügte Anweisun-
+gen gesteuert werden. Einige Arbeiten erfordern den Benutzereingriff, wie
+z.B. die Kontrolle von Silbentrennungen bei fremdsprachigen Texten und die
+Plazierungen von Seitenenden. Diese Arbeiten werden auf einfache Weise
+interaktiv vorgenommen. Die Form der Anweisung ist für die Textkosmetik und
+den EUMEL-Drucker gleich und entspricht der ELAN-Syntax. Man beachte den
+Unterschied zwischen einem Kommando und einer Text-Anweisung: während ein
+Kommando direkt ausgeführt wird, wird eine im Text eingebettete Text-Anwei-
+sung (im weiteren kurz "#ib#Anweisung#ie#" genannt) erst nach dem Aufruf von
+Textkosmetik-und Drucker-Programmen wirksam.
+
+Die Wirkungsweise der Textkosmetik-Anweisungen ist leicht zu erlernen und
+kann vor allen Dingen stufenweise erfolgen. Deshalb ein guter Rat für An-
+fänger: Lesen Sie diesen Teil des Benutzer-Handbuchs erst oberflächlich, so
+daß Sie ungefähr Bescheid wissen, welche Möglichkeiten die Textkosmetik-Pro-
+gramme bieten. Dann können Sie diejenigen Teile der Textkosmetik auswählen
+und bei Bedarf anwenden, die sie für Ihre spezielle Anwendung benötigen.
+
+Zum Schluß noch eine Warnung: Die Regeln, Konventionen und Wirkungsweisen
+des EUMEL-Systems und der Textkosmetik-Programme muß ein Nutzer beherrschen,
+will er das System gut nutzen. Der Lernaufwand erfordert etwas Zeit und Mühe,
+der aber bei der Benutzung einer jeden Maschine erforderlich ist. Soll nur
+ein kurzer Brief geschrieben werden, ist man mit einer Schreibmaschine
+besser bedient. Beherrscht man dagegen die Benutzung des EUMEL-Systems
+einigermaßen, so kann auch die Erstellung eines kurzen Briefes schneller
+erfolgen als auf einer Schreibmaschine.
+
+
+
+1. Einführung in die Benutzung der Textkosmetik
+
+In diesem Kapitel wird eine Übersicht über die verfügbaren Programme der
+Textkosmetik gegeben.
+
+
+
+Schreiben, Gestalten und Drucken von Texten
+
+Im EUMEL-System unterscheiden wir zwischen drei Stufen einer Textbehandlung:
+Erstellung, Gestaltung und Druck. Die Trennung in verschiedene Arbeitsstufen
+hat den Vorteil, daß man sich zu einem Zeitpunkt nur auf einen Arbeits-
+schritt konzentrieren muß.
+
+
+a) Texterstellung bzw. Textbearbeitung
+
+Das Schreiben von Texten wird mit Hilfe des Editors erledigt. In dieser Stufe
+der Texterstellung kann ein Benutzer sich ausschließlich auf das Schreiben
+und die inhaltliche Korrektheit seines Textes konzentrieren. Wird ein Text
+ohne Anweisungen gedruckt, dann erscheint er so, wie er mit dem Editor ge-
+schrieben wurde. Bei der Erstellung des Textes können bereits Textkosmetik-
+Anweisungen in den Text eingefügt werden.
+
+Texte sollten im 'Fließtext'-Modus erstellt werden, d.h. Worte, die über
+Zeilengrenzen gehen würden, werden ohne Silbentrennung vom Editor in die
+nächste Zeile gebracht.
+
+
+b) Textkosmetik bzw. Textgestaltung
+
+Nachdem ein Text geschrieben wurde, kann man ihn mit Textkosmetik-Programmen
+gestalten, ohne ihn inhaltlich zu verändern. Dies kann auch vor oder nach
+eventuellen Korrekturen erfolgen. Die Textkosmetik bietet zur Zeit drei
+Programme an, die je nach Bedarf eingesetzt werden können:
+
+I) 'autoform/lineform' formatiert einen Text zeilenweise und vollzieht
+ eine Silbentrennung. Weiterhin erlaubt 'autoform/lineform' die Verwen-
+ dung unterschiedlicher Schrifttypen und Schrifthöhen.
+
+II) 'pageform' gestattet die Formatierung eines Textes in Seiten (drucktech-
+ nisch: "Paginieren"). Es ist mit 'pageform' u.a. möglich, die Seiten-
+ einteilung zu bestimmen, eine Seite in Spalten zu formatiern ("Zeitungs-
+ format"), Zeilen am Anfang bzw. Ende jeder Seite einfügen zu lassen,
+ eine Seitennummerierung zu erhalten und Fußnoten zu gestalten.
+
+III) 'index' erlaubt die Erstellung von Stichwort- und Inhaltsverzeichnissen.
+
+
+c) Drucken
+
+Zu jedem Zeitpunkt der Textbehandlung kann gedruckt werden. Um Drucker mit
+unterschiedlichen Eigenschaften betreiben zu können, wurde der (Fachausdruck:
+"virtuelle") EUMEL-Drucker als Schnittstelle zwischen dem EUMEL-System und
+(echten) Druckern geschaffen. Der EUMEL-Drucker beachtet die gleichen An-
+weisungen wie die Textkosmetik-Programme und noch einige zusätzliche, die
+nur für die Druckaufbereitung notwendig sind. Spezielle Druckleistungen, wie
+z.B. verschiedenartige Schrifttypen, können nur auf besonderen Druckern er-
+zeugt werden. Verfügt ein Drucker nicht über eine bestimmte Hardware-Eigen-
+schaft, wird die vom Benutzer geforderte Leistung ignoriert. Somit ist es
+möglich, Probedrucke für Korrekturen auch auf preiswerten Druckern herzu-
+stellen.
+
+Merke: Der EUMEL-Editor übernimmt die Texterstellung; 'lineform' formatiert
+zeilenweise; 'pageform' formatiert seitenweise; 'index' erstellt Stich- und
+Inhaltsverzeichnisse; der EUMEL-Drucker ist eine Software-Anpassung an
+unterschiedliche Ausgabe-Geräte.
+
+
+
+Anweisungen für die Textkosmetik und den Drucker
+
+In diesem Abschnitt wird beschrieben, wie Anweisungen für die Textkosmetik-
+Programme in einen Text eingefügt werden.
+
+Die Ausführung von 'lineform', 'pageform', 'index' und EUMEL-Drucker wird
+mit Hilfe von Anweisungen gesteuert, die man in den Text an geeigneter
+Stelle einfügt. Anweisungen haben die Form
+
+ #kommando#
+
+Beachte, daß jede Anweisung von #-Zeichen eingeschlossen sein muß, damit
+die Anweisung vom eigentlichen Text unterschieden werden kann. Beispiele:
+
+ #page# (* aber auch z.B.: # page # *)
+ #free (3.0)#
+ #type ("elitedeutsch")#
+
+Das "#"-Zeichen darf nur für Anweisungen verwandt werden, also sonst nicht
+im Text vorkommen. (Wird das "#"-Zeichen benötigt, muß das Zeichen mit ESC #
+geschrieben werden. Vergl. auch die Tastenbelegung in der Editor-Beschrei-
+bung).
+
+Die von '#'-Zeichen eingeschlossenen Anweisungen sind so konstruiert, daß
+sie - wie alle anderen Kommandos im EUMEL-System auch - der ELAN-Syntax
+entsprechen (u.a. müssen sie klein geschrieben werden; Parameter in runden
+Klammern; mehrere Parameter werden durch Kommata getrennt; TEXT-Parameter
+in Anführungsstrichen; REAL-Parameter mit Dezimalpunkt usw.). Leerzeichen
+spielen (außer in TEXT-Parametern) keine Rolle und können zur besseren Les-
+barkeit beliebig verwandt werden.
+
+Man beachte den Unterschied zwischen einer Anweisung und einem Kommando:
+während es nur eine beschränkte Anzahl von Anweisungen gibt, die nur von den
+Textkosmetik-Programmen ausgeführt werden (also sonst nicht in Programmen
+oder Monitor benutzt werden können), kann ein Benutzer ein Kommando in der
+Regel in einem Programm, im Editor oder im Monitor verwenden. Hinzu kommt,
+daß neben dem vom EUMEL-System zur Verfügung gestellten Kommandos in der
+Regel noch installationsspezifische und/oder benutzereigene Kommandos gibt.
+
+Anweisungen dürfen im allgemeinen überall auf einer Zeile stehen (wie z.B.
+in der nächsten Zeile). #on("underline")#Ausnahmen#off("underline")# werden
+bei der Beschreibung der Anweisungen speziell erwähnt. Alle Anweisungen
+werden zum frühest möglichen Zeitpunkt ausgeführt, haben also u.U. bereits
+Auswirkungen auf die Zeile, in der sie stehen.
+
+Die Zeichen, aus denen eine Anweisung besteht, werden bei der Formatierung
+einer Zeile oder Seite nicht mitgezählt und vom EUMEL-Drucker nicht gedruckt.
+Eine Zeile, die nur aus Anweisungen besteht, wird ebenso behandelt.
+
+Merke: Anweisungen steuern die Verarbeitung der Textkosmetik-Programme. Sie
+müssen in '#'-Zeichen eingeschlossen sein und dürfen in der Regel überall
+auf einer Zeile stehen. Sie werden an der Stelle ausgeführt, an der sie
+stehen.
+
+
+
+Aufruf der Textkosmetik-Programme
+
+In diesem Abschnitt wird beschrieben, wie die Textkosmetik-Programme
+aktiviert werden.
+
+Die Textkosmetik-Programme werden durch Kommandos aktiviert (d.h. in der
+'gib kommando:'-Ebene). Die Aktivierung (Fachausdruck: "Aufruf") erfolgt -
+ebenso wie beim Editor - durch den Namen des Programms und die Angabe
+der Datei. Beispiele:
+
+ autoform ("meine datei")
+ lineform ("text1");
+ pageform ("1. Kapitel")
+ index ("Buch.p")
+
+Das Programm 'pageform' erzeugt aus der Eingabedatei eine Druckdatei, die
+entsprechend umgeformt wird (Fußnoten werden an die richtige Stelle plaziert,
+Seitenummern eingesetzt u.a.m.). Diese Druckdatei bekommt den Namen der
+angegebenen Eingabedatei mit dem Zusatz '.p'. Beispiel: 'pageform ("text")'
+erzeugt eine Datei 'text.p'. Es ist auch erlaubt, 'pageform' durch die Angabe
+eines zweiten Parameters mitzuteilen, wie die Druckdatei heißen soll:
+
+ pageform ("mein text", "erste Druckdatei")
+
+Ähnlich verhält es sich mit dem Programm 'index', welches bis zu 9 Stichwort-
+bzw. Inhaltsverzeichnisse erstellen kann. Da in den Verzeichnissen die
+Seitennummern aufgeführt werden, kann 'index' nur Druckdateien bearbeiten.
+Beispiel:
+
+ index ("handbuch.p")
+
+Das Programm 'index' erstellt die angeforderten Verzeichnisse in Dateien,
+die mit dem Zusatz '.i<nummer>' gekennzeichnet werden. Beispiele (für den
+obigen Aufruf):
+
+ 'Handbuch.i1', 'Handbuch.i2'
+
+usw..
+
+Merke: Die Textkosmetik-Programme werden durch Kommandos aufgerufen mit der
+Angabe der Dateinamen als Parameter.
+
+
+
+Vorzeitiger Abbruch und Fehlermeldungen
+
+Alle Textkosmetik-Programme können vorzeitig vom Benutzer abgebrochen werden.
+Eventuelle Fehlermeldungen werden durch den Paralleleditor angezeigt.
+
+Durch die Taste SV und das Supervisor-Kommando 'halt' können die Textkosme-
+tik-Programme jederzeit vorzeitig abgebrochen werden. Die Eingabedatei steht
+dann unverändert zur Verfügung. Ein vorzeitiger Abbruch kann notwendig sein,
+wenn ein Programm mit einer falschen Datei aufgerufen wurde oder zu viele
+Fehler gemeldet wurden.
+
+Alle Textkosmetik-Programme melden Fehler, wenn eine oder mehrere Anweisun-
+gen falsch benutzt werden. Die Fehlermeldungen werden auf dem Bildschirm
+angezeigt. Bei Beendigung eines Programms wird - falls Fehler entdeckt
+wurden - die Fehlermeldungen im oberen Fenster des Paralleleditors angezeigt,
+während im unteren Fenster die Eingabedatei zur Korrektur angeboten wird.
+
+Merke: Vorzeitiger Abbruch eines Programms durch SV und 'halt'. (Die Eingabe-
+datei steht unverändert zur Verfügung.) Fehlermeldungen werden im Parallel-
+editor angezeigt.
+
+
+
+2. Zeilenweises formatieren: 'autoform/lineform'
+
+Die Programme 'autoform' oder 'lineform' formatieren einen Text zeilenweise
+(ggf. mit Silbentrennung), unter Berücksichtigung von Schrifttyp und Zeilen-
+breite.
+
+
+
+Eine Datei formatieren: 'autoform/lineform'-Kommando
+
+Die Programme 'lineform/autoform' werden unter Angabe der Datei aufgerufen.
+Beispiel:
+
+ lineform ("meine datei")
+ autoform ("Brief vom 24.12.")
+
+
+
+Unterschied von 'autoform' und 'lineform'
+
+Zur Zeilenformatierung werden zwei Programme angeboten, die sich nur in der
+Art der Behandlung von Silbentrennungen unterscheiden:
+
+a) autoform:
+ Zeilenformatierung mit automatischer Silbentrennung. 'autoform' sollte
+ nur bei deutschen Texten eingesetzt werden, weil die Silbentrennung bei
+ fremdsprachigen Texten nach anderen Regeln erfolgen muß.
+
+b) lineform:
+ Zeilenformatierung mit Silbentrennung "per Hand", wobei (nach deutschen
+ Trennregeln) ein sinnvoller Trennvorschlag gemacht wird. Die Trennstelle
+ kann interaktiv soweit verschoben werden, wie das zu trennende Wort noch
+ auf die Zeile paßt.
+
+Merke: 'autoform' nimmt eine automatische Silbentrennung vor, während
+'lineform' die #ib#Silbentrennung "per Hand"#ie# erlaubt.
+
+
+
+Übersicht über 'autoform'/'lineform'
+
+'autoform'/'lineform' formatieren eine Datei zeilenweise. Dabei werden
+Zeilen möglichst vollständig aufgefüllt.
+
+'autoform'/'lineform' haben im wesentlichen vier Aufgaben:
+
+a) Auffüllen von Zeilen:
+ 'autoform'/'lineform' können besonders gut nach Korrekturen eingesetzt
+ werden, bei denen - nach Einfügungen oder Löschungen - nicht vollstän-
+ dige oder zu lange Zeilen in der Datei stehen bleiben können.
+
+b) Erstellen von Zeilen mit unterschiedlichen Schrifttypen:
+ Werden in einer Datei mehrere Schriftarten ('type'-Anweisung) verwandt,
+ berechnen 'autoform'/'lineform' nach der eingestellten Zeilenbreite die
+ Anzahl Zeichen, die auf eine Zeile passen.
+
+c) Erstellen von unterschiedlichen Zeilenlängen:
+ Manchmal ist es notwendig, die Breite von Zeilen zu verändern ('limit'-
+ Anweisung). Dies wird von 'autoform'/'lineform' berücksichtigt.
+
+d) Silbentrennung:
+ Automatische ('autoform') und interaktive Silbentrennung ('lineform').
+ Sofern notwendig, werden Silbentrennungen rückgängig gemacht.
+
+'autoform'/'lineform' beachten nur wenige Anweisungen:
+
+Anweisung Zweck
+
+ limit Zeilenbreite einstellen
+ off Schrifttyp-Modifikation ausstellen
+ on Schrifttyp-Modifikation einstellen
+ type Schrifttyp einstellen
+
+
+'autoform'/'lineform' akzeptieren als Eingabe eine Datei und verändern diese.
+Dafür wird eine (interne) Zwischendatei benötigt. Deshalb ist darauf zu
+achten, daß noch ausreichend Platz auf dem System ist, der jedoch nur
+zwischenzeitig für den Formatierungsschritt benötigt wird.
+
+'autoform'/'lineform' fragen nach ihrem Aufruf an, auf welche Zeilenbreiten
+und mit welchem Schrifttyp die Datei formatiert werden soll. Diese Informa-
+ionen werden von 'autoform'/'lineform' in Form von 'limit'- und 'type'-An-
+weisungen in der Datei vermerkt, so daß die Anfragen bei weiteren Datei-
+Bearbeitungen entfallen.
+
+Bei Zeilen, die länger als die angegebene Zeilenbreite sind, werden die-
+jenigen Worte, die über die Zeilenbreite hinausgehen, in die nächste Zeile
+umgebrochen. Kürzere Zeilen werden aus der nachfolgenden Zeile bis zur
+Zeilenbreite aufgefüllt. Worte werden jedoch nicht über Absatzgrenzen hinweg
+verschoben. Deshalb ist vor Anwendung von 'lineform' darauf zu achten, daß
+Absätze richtig markiert wurden. Fehlende Markierungen sollte man nachträg-
+lich einfügen (RETURN am Ende einer Zeile), andernfalls werden Zeilen über
+Absatzgrenzen zusammen gezogen. Dies gilt insbesondere für Tabellenzeilen.
+
+Einrückungen (Leerzeichen am Anfang einer Zeile) werden von 'autoform'/'line-
+form' ebenfalls bei der Formatierung von Zeilen eingehalten.
+Dabei behandelt die Prozedur 'autoform'/'lineform' Einrückungen in einem
+speziellen Fall nicht so, wie ein Benutzer es erwarten würde. Bei ein-
+zeiligen Absätzen wird - falls die Zeile länger als das eingestellte Limit
+ist und der "überschüssige" Teil in eine neue Zeile umgebrochen werden muß
+- die Einrückung der aktuellen Zeile beibehalten. Das ist meist das
+"richtige" Verhalten, während es bei Aufzählungen falsch ist, weil die
+zweite Zeile einer Aufzählung oft eingerückt wird. Beispiel:
+
+ - Diese Zeile war zu lang und wurde unter
+ das "-"-Zeichen umgebrochen.
+
+Man sollte daher - nach Verarbeitungsende - die Datei nach solchen Fällen
+durchsuchen.
+
+Merke: 'autoform'/'lineform' vervollständigen zu kurze Zeilen oder brechen
+zu lange Zeilen um. Dabei werden Absätze beachtet.
+
+
+
+Interaktive Silbentrennung mit 'lineform'
+
+'lineform' trennt Silben interaktiv. 'lineform' sollte deshalb für fremd-
+sprachige Texte angewandt werden.
+
+Paßt ein Wort nicht mehr ganz auf eine Zeile, dann wird dieses Wort inter-
+aktiv zur Trennung angeboten. Die Umgebung dieses Wortes wird zur Er-
+leichterung des Trennvorgangs mit angezeigt. Das Trennzeichen erscheint an
+einer sinnvollen Stelle im zu trennenden Wort. Beispiel:
+
+ Text vor dem Trennwort; das
+ Trenn-wort steht mit nachfolgendem Text in dieser Zeile
+
+Der Benutzer hat die Möglichkeit, das Trennzeichen mit Hilfe der Positionie-
+rungstasten innerhalb des "Trennbereichs" (das ist der markierte Bereich, der
+noch auf die Zeile passen würde), zu verschieben. An der gewünschten Trenn-
+position (der Wortteil, der noch auf die Zeile kommen soll, steht links vom
+Trennstrich) kann die RETURN-Taste betätigt werden. RETURN zeigt dem Pro-
+gramm 'lineform' an, daß an dieser Stelle die Trennung erfolgen soll. 'line-
+form' fügt an den ersten Teil des Wortes das "-"-Zeichen an und schreibt den
+abgetrennten Wortteil in die nächste Zeile.
+Hinweis: Das Trennzeichen "-" hat einen anderen Code als der "normale"
+Bindestrich (vergl. dazu die Codetabelle), da Trennungen ggf. bei erneuten
+Änderungen wieder rückgängig gemacht werden müssen.
+
+Es stehen folgende Operationen bei der interaktiven Trennung zur Verfügung:
+
+ Taste Bedeutung
+
+ RETURN Trennen.
+ LINKS Trennstelle um ein Zeichen nach links verschieben.
+ RECHTS Trennstelle um ein Zeichen nach rechts verschieben.
+ HOP LINKS Trennstelle vor das Wort setzen (das Wort wird an dieser
+ Position nicht getrennt).
+ HOP RECHTS Trennstelle in die ursprüngliche Position setzen.
+ BLANK Trennzeichen wird von "-" auf " " umgeschaltet.
+ Dies kann verwandt werden, um Worte, die nicht zusammen
+ geschrieben werden sollen, beim Trennvorgang in zwei
+ Worte aufzuspalten.
+ - Schaltet das Trennzeichen von Leerzeichen (" ") wieder auf
+ den Trennstrich ("-") um.
+
+Zwei Sonderbedingungen sind bei der interaktiven Trennung noch zu beachten:
+
+ - Bei Worten mit Bindestrich wird die Trennstelle hinter dem Bindestrich als
+ Leerzeichen angezeigt. Die Trennstelle vor dem Bindestrich wird bei
+ weiterem Positionieren nach links übersprungen. Das verhindert, daß Worte
+ mit führendem Bindestrich im Text erscheinen.
+
+ - Bei einer Trennposition zwischen den Zeichen "ck" wird das Zeichen "c" in
+ ein "k" umgewandelt. Beispiel:
+
+ Druk-ker
+Hinweis: Das umgewandelte "k" hat einen anderen Code als das "normale"
+"k" (vergl. dazu die Codetabelle). Das ist notwendig, um bei späteren
+Änderungen solche Trennungen wieder rückgängig machen zu können.
+
+Sofern für die Zeilenformatierung notwendig, macht die Prozedur 'lineform'
+bereits erfolgte Trennungen rückgängig (das Trennzeichen wird entfernt und
+die Wortteile wieder zusammengefügt), wenn sich das getrennte Wort nicht mehr
+am Zeilenende (etwa durch Korrekturen oder Veränderungen der Zeilenbreite)
+befinden sollte.
+
+Merke: 'lineform' bietet Worte zur Silbentrennung an. Die "Trennstelle" kann
+durch den Nutzer verschoben werden.
+
+
+
+Automatische Silbentrennung mit 'autoform'
+
+'autoform' arbeitet wie 'lineform', nur werden die Silbentrennungen auto-
+matisch vorgenommen.
+
+Ist eine Silbentrennung bei der Formatierung notwendig, übernimmt 'autoform'
+diese automatisch und gibt diese zur Kontrolle auf dem Bildschirm aus. Die
+automatische Silbentrennung arbeitet mit einer hohen Trenngüte; allerdings
+nur für deutsche Texte. Trotzdem kann es vorkommen, daß einige Trennungen
+(insbesondere bei Fremdworten) falsch vorgenommen werden. In diesem Fall
+muß man diese nachträglich mit dem Editor korrigieren. Dabei sollte man das
+oben erwähnte Trennzeichen verwenden (ESC -).
+
+
+Wenige oder viele Silbentrennungen: Trennpunkt einstellen
+
+Viele Silbentrennungen in einem Text erschweren das Lesen. Würde man nun
+keine Silbentrennungen vornehmen, wird der rechte Rand stark "ausgefranst"
+oder beim Blocksatz ("rechter Randausgleich") müssen viele Zwischenräume
+zwischen den Worten eingefügt werden. Durch das Kommando
+
+ hyphenation width (prozentuale angabe)
+
+kann der Trennpunkt, ab dem die Silbentrennung einsetzen soll, eingestellt
+werden. Die Angabe erfolgt in Prozenten der Zeilenbreite. Beispielsweise
+stellt 'hyphenation width (5)' den Trennpunkt auf 5% der Zeilenbreite ein
+(Voreingestellt ist 7). Bei einer Angabe von 20 werden sehr wenige Worte zur
+Silbentrennung angeboten, während bei einer Angabe von '3' ungefähr jede
+dritte Zeile eine Silbentrennung versucht wird. Die Einstellung des Trenn-
+punktes bestimmt also, ab wann ein Wort zur Silbentrennung untersucht wird.
+Andererseits bestimmt die Einstellung auch, wieviel Zwischenraum zwischen
+Worten eingefügt werden muß, um einen rechten Randausgleich zu erzielen.
+
+Merke: 'hyphenation width' bestimmt, an welchem Punkt Worte zur Silbentren-
+nung angeboten werden.
+
+
+Mit unterschiedlichen Schriften schreiben: 'type'
+
+Unterschiedliche Schrifttypen#ie# werden mit der 'type'-Anweisung ange-
+fordert.
+
+Es ist möglich, mit 'lineform' verschiedenartige Schrifttypen (kurz Typen
+genannt) verarbeiten zu lassen. Jeder Typ hat - neben dem speziellen Aus-
+sehen der Zeichen - die Eigenschaft, daß jedes Zeichen eine bestimmte Breite
+und Höhe hat.
+
+Es gibt zwei Arten von Schriften: bei äquidistanten Schriften sind alle
+Zeichen gleich breit (wie bei einer "normalen" Schreibmaschine). Proportio-
+nalschrift findet man in gedruckten Büchern. Hier haben unterschiedliche
+Zeichen auch unterschiedliche Breiten. Die Zeichen ".", "i", "!" sind z.B.
+schmaler als die Zeichen "w", "o", "m" usw.
+
+Mit der Anweisung
+
+ type ("schriftname")
+
+kann auf einen anderen Schrifttyp umgeschaltet werden (auch mehrmals inner-
+halb einer Zeile). Dieser Typ gilt solange, bis wieder ein neue 'type'-An-
+weisung gegeben wird. Beispiel:
+
+ \#type("basker12")\#Jetzt schreiben wir in einer Schrift. Und jetzt
+ schalten wir um auf\#type ("modern12")\# noch eine andere Schrift.
+
+Welche Schriftarten zur Verfügung stehen, hängt natürlich von dem verfügbaren
+Drucker ab. Sie können die Schrifttypen bei Ihrer EUMEL-Installation er-
+fragen.
+Schrifttypen können modifiziert gedruckt werden (vergl. dazu den nächsten Ab-
+schnitt). Durch die Angabe einer 'type'-Anweisung werden alle Modifikationen
+ausgeschaltet.
+
+Merke: Eine 'type'-Anweisung gibt einen gewünschten Schrifttyp an.
+
+
+
+Kursiv, fett, unterstrichen, revers drucken: 'on/off'
+
+Mit der 'on'- und 'off'-Anweisung ist es möglich, einen Schrifttyp zu modi-f
+izieren. Die Schrift wird zwar nicht gewechselt, aber verändert gedruckt.
+Zur Zeit ist unterstrichen, fett, kursiv und der Druck von weiß auf schwarz
+möglich (abhängig vom eingesetzten Drucker).
+
+Die 'on'/'off'-Anweisung wirkt wie ein Schalter, der die gewünschte Schrift-
+typ-Modifikation ein- bzw. ausschaltet. Beispiel:
+
+... Das EUMEL-System ermöglicht es,
+\#on("italic")\#kursiv\#off("italic")\#
+und
+\#on("underline")\#unterstrichen\#off("underline")\#
+und
+\#on("bold")\#fett\#off("bold")\#
+und
+\#on("revers")\#revers\#off("revers")\#
+zu schreiben.
+
+Die Anweisung 'on' schaltet die Modifikation ein, 'off' schaltet sie aus.
+Folgende Modifikationen sind z.Zt. implementiert:
+
+ bold (Fettdruck)
+ italic (Kursivdruck)
+ underline (Unterstreichung)
+ revers (Weiß auf Schwarz)
+
+Dabei ist folgendes zu beachten:
+
+a) Ein 'type'-Anweisung schaltet eine Modifikation immer aus.
+
+b) Eine Modifikation sollte nicht über einen Absatz gehen ('lineform' er-
+ zeugt eine Warnung). Somit ist es gewährleistet, daß das Ausschalten
+ einer Modifikation nicht vergessen wird.
+
+c) Nicht alle Drucker können die hier angegebenen Modifikationen auch
+ drucken. Bitte erkundigen Sie sich bei Ihrer Installation.
+
+d) Welche Modifikationen gleichzeitig eingeschaltet werden können, ist
+ ebenfalls druckerabhängig.
+
+Merke: Die Anweisungen 'on' und 'off' schalten eine Modifikation an- und aus.
+
+
+
+Gesperrt schreiben
+
+Wird ein Wort g e s p e r r t geschrieben, muß natürlich verhindert werden,
+daß dieses Wort beim Formatieren getrennt wird. Andere Worte, wie z.B. in
+Formeln, sollten ebenfalls zusammen auf eine Zeile geschrieben werden (z.B.
+'sin (x)').
+
+Dies kann man erreichen, indem man nicht das Leerzeichen zwischen die Zeichen
+schreibt, denn das Leerzeichen bedeutet für 'autoform'/'lineform' immer das
+Ende eines Wortes. Man nimmt stattdessen ESC blank. ESC blank erscheint auf
+dem Bildschirm zur besseren Identifizierung als Unterstreichungsstrich (oder
+invers:  ) Beim Drucken wird jedoch wieder ein Leerzeichen produziert.
+Beispiel:
+
+ g_e_s_p_e_r_r_t (auf dem Terminal)
+ g e s p e r r t (auf Papier)
+
+Wir nennen dieses Leerzeichen auch "geschütztes Leerzeichen".
+
+Merke: G e s p e r r t wird mit dem geschützten Leerzeichen geschrieben.
+
+
+
+Tabellen und Aufzählungen schreiben
+
+Aufzählungen und Tabellen werden automatisch richtig formatiert und gedruckt,
+wenn man sich an einige einfache Regeln hält.
+
+Verwendet man eine Proportionalschrift beim Tabellenschreiben, so sind die
+Spalten in der Regel unterschiedlich breit, selbst wenn eine gleiche Anzahl
+Zeichen in jeder Spalte geschrieben wird. Dies kann man durch das Schreiben
+von einem "Doppelblank" vermeiden. Beispiel:
+
+ nnnnn | zweite Spalte
+ mmmmm | steht nicht untereinander
+
+aber mit Doppelblank:
+
+ nnnn | zweite Spalte
+ mmmm | stehen jetzt untereinander
+
+Das Doppelblank dient 'lineform/autoform' und dem Drucker als Zeichen, daß
+die Positionen speziell berechnet ('lineform') und beim Druck berücksichtigt
+werden müssen. In seltenen Fällen (insbesondere beim Einsatz von Schriftypen,
+die in der Größe stark voneinander abweichen) kann es vorkommen, daß diese
+Tabellenautomatik nicht funktioniert und Spalten übereinander gedruckt
+werden. In solchen Fällen muß man die Anzahl der trennenden Doppelblanks
+erhöhen.
+
+Praktischer Tip:
+Beachte, daß für das Funktionieren der "Tabellenautomatik" bei proportionalen
+Schriften es erforderlich ist, das jede Tabellenzeile eine Absatzzeile ist.
+Man sollte diese Zeilen vor dem Druck daraufhin überprüfen oder durch 'line-
+form/autoform' die Datei bearbeiten lassen. Sollte durch die zeilenweise
+Formatierung einmal zwei Zeilen zusammengezogen sein (wegen fehlender Absatz-
+kennzeichnung), kann man diese leicht mit dem Editor wieder "auseinander-
+brechen" (zweimaliges HOP RUBIN).
+
+Ähnliches gilt bei Aufzählungen. Beispiel:
+
+ 1) Das ist die erste Aufzählung.
+ Dieser Satz wird bündig gedruckt.
+ 2) Hier auch.
+
+Auch in solchen Fällen wird der gedruckte Text in der Regel richtig einge-
+rückt. Die Aufzählungsautomatik wirkt nur nach einem Absatz und bei Propor-
+tionalschriften. Die Regeln sind etwas kompliziert, so daß sie hier nicht
+einzeln aufgeführt werden (siehe S. #topage("block")# unter dem Kommando
+'block'). Trifft man auf einen der seltenen Fälle, wo die Einrückungsautoma-
+tik nicht funktioniert, kann man immer das Doppelblank der Tabellenautomatik
+verwenden.
+
+Merke: Die Tabellen- und die Aufzählungsautomatik sorgen dafür, daß Tabellen-
+spalten und Aufzählungen bündig gedruckt werden.
+
+
+
+Zeilenbreite einstellen: 'limit'
+
+Mit der 'limit'-Anweisung kann die Zeilenbreite eingestellt werden.
+
+Die 'limit'-Anweisung gibt (in cm) an, wie breit die Zeile sein soll. Be-
+achte, daß die Angabe der Zeilenbreite nichts mit dem LIMIT-Kommando des
+Editors zu tun hat. Dieses gibt an, wieviel Zeichen einer äquidistanten
+Schrift beim Schreiben auf eine Bildschirmzeile passen sollen.
+
+Die Zeilenbreite wird zusammen mit dem Schrifttyp beim erstmaligen Aufruf von
+'autoform'/'lineform' interaktiv erfragt und als 'limit'-Anweisung (zusammen
+mit der 'type'-Anweisung) in die erste Zeile der Datei eingetragen. Es kann
+in einer Datei mehrmals verändert werden. Die Zeilenbreite gilt immer ab der
+Zeile, in der die 'limit'-Anweisung steht. Beispiel:
+
+ \#limit(10.0)\#Mit der 'limit'-Anwei­
+ sung kann man Paragraphen in einem
+ anderen Format leicht gestalten.
+ Die rechte Schreibgrenze wird durch
+ die 'limit'-Anweisung eingestellt,
+ während der linke Rand durch eine
+ entsprechende Einrückung gestaltet
+ wird. \#limit(13.5)\#
+
+Man beachte, daß als Parameter in der 'limit'-Anweisung eine Zahl mit Dezi-
+malpunkt angegeben werden muß.
+
+Die folgende Tabelle gibt sinnvolle 'limit'-Einstellungen für die am
+häufigsten verwandten Papiergrößen an:
+
+
+ Format 'limit' Verbleibender
+ (Zeilenbreite) Rand
+
+ DIN A4 16.0 cm je 2.65 cm
+
+ DIN A5 12.0 cm je 1.42 cm
+
+ DIN A4 quer 25.0 cm je 2.35 cm
+
+Merke: Die 'limit'-Anweisung stellt die Zeilenbreite in cm ein, während das
+'LIMIT'-Kommando des Editors die Zeilenbreite in Anzahl Zeichen angibt.
+
+
+
+3. Seitenweises formatieren: 'pageform'
+
+'pageform' formatiert eine Datei seitenweise, wobei Routinearbeiten, wie
+etwa die Plazierung von Fußnoten, Seitennummerierung usw. ebenfalls von
+'pageform' erledigt werden.
+
+
+
+Eine Datei in Seiten teilen: 'pageform'-Kommando
+
+Das Programm 'pageform' wird mit dem Kommando
+
+ pageform ("Buch")
+
+aufgerufen. 'pageform' erzeugt aus der Eingabedatei (hier: 'Buch') eine
+Druckdatei, deren Name durch ein angehängtes '.p' gebildet wird (in unserem
+Beispiel: 'Buch.p').
+
+
+Übersicht über die Arbeitsweise von 'pageform'
+
+'pageform' erzeugt aus einer Eingabedatei eine Druckdatei, wobei z.B. Fuß-
+noten und Seitennummern an den richtigen Stellen eingefügt werden.
+
+'pageform' akzeptiert als Eingabe eine Datei und produziert eine neue Datei,
+die "Druckdatei". Die Druckdatei besteht aus der Eingabedatei mit ggf. neu
+eingefügten Zeilen. Die eingesetzten Zeilen stammen aus 'head'-, 'bottom'
+oder 'footnote'-Anweisungen. Dadurch erhöht sich die Zeilenanzahl der Datei
+(bis zu 15%).
+
+Durch 'pageform' ist es möglich, am Anfang und am Ende jeder Seite Zeilen
+einfügen zu lassen. Solche Textzeilen aus Kopf- bzw. Fußbereichen sowie
+Zeilen aus Fußnoten werden in der Druckdatei in jede Seite an entsprechender
+Stelle eingefügt.
+
+Es ist möglich, in Kopf- oder Fußzeilen Seitennummern aufzunehmen. Diese Sei-
+tennummern werden von 'pageform' bei Seitenwechseln automatisch erhöht und
+an eine vom Benutzer gekennzeichnete Stelle eingesetzt. Fußnoten können auch
+durch Nummern gekennzeichnet werden. Querverweise sind ebenfalls möglich.
+
+'pageform' berechnet die Anzahl von Zeilen, die auf eine Seite passen sollen,
+aus den Angaben für die Seitenlänge, eingestellten Zeilenvorschub und even-
+tuelle Kopf-, Fuß- und Fußnotenzeilen. Bei der Berechnung wird von der je-
+weiligen Schrifthöhe des eingestellten Schriftyps ('type'-Anweisung) ausge-
+gangen. Dann zeigt 'pageform' das errechnete Seitenende auf dem Bildschirm
+an. Das Seitenende kann interaktiv verschoben werden, um es an eine ge-
+wünschte Stellen zu plazieren oder es können Leerzeilen eingefügt/gelöscht
+werden, um Seiten gleich lang zu machen. Zusätzlich ist es auch möglich,
+Seiten in Spalten ("Zeitungsdruck") aufzuteilen und diese interaktiv zu
+formatieren.
+
+ Anweisungs-Übersicht
+
+ bottom Fußzeilen *)
+ bottomeven " *)
+ bottomodd " *)
+ columns Spaltenformatieren
+ columnsend Spalten ausschalten
+ count Zähler erhöhen und einsetzen
+ end Beendet 'head', 'bottom' und *)
+ 'foot'-Bereiche
+ foot Fußnote *)
+ free Zeilen freilassen *)
+ goalpage Seitenverweis (Ziel)
+ head Kopfzeilen *)
+ headeven " *)
+ headodd " *)
+ linefeed Zeilenabstand *)
+ page Neue Seite anfangen *)
+ pagelength Seitenlänge setzen
+ pagenr Seitennummer bzw. -zeichen
+ setcount Zähler setzen
+ topage Seitenverweis (Ursprung)
+ value Wert des Zählers einsetzen
+
+*) Diese Anweisungen dürfen nur allein oder als letztes auf einer Zeile stehen.
+
+
+Merke: 'pageform' erlaubt nicht nur eine Seitenformatierung, sondern auch
+Spaltenformatierung, Fußnoten-Plazierung, Kopf- und/oder Fußzeilen, Seiten-
+numerierung und Querverweise. 'pageform' erzeugt eine neue Datei, die
+"Druckdatei" mit dem Namen der Eingabedatei, an den ".p" angefügt wird.
+
+
+
+Seitenende interaktiv verschieben#ie# mit 'pageform'
+
+In diesem Abschnitt wird beschrieben, welche interaktiven Möglichkeiten
+'pageform' bietet, um Seiten zu gestalten.
+
+Auf dem Bildschirm wird das von 'pageform' errechnete jeweilige Seitenende
+unter Angabe der aktuellen Seitennummer angezeigt. Das Seitenende erscheint
+ungefähr in der Mitte des Bildschirmes und wird durch eine von 'pageform' ge-
+kennzeichnete Zeile markiert, die auch - nach erfolgter Seitenformatierung -
+in der Druckdatei zu sehen ist. (Der EUMEL-Drucker druckt diese Zeile nicht.)
+Beispiel:
+
+\#page\#\#--------------------- Ende Seite 1 ---\#
+
+Über der Markierung erscheinen die letzten Zeilen der bereits verarbeiteten
+Seite, darunter Zeilen der nächsten Seite. Es ist nun mit Hilfe der Positio-
+nierungstasten möglich, die Markierung und damit das Seitenende nach "oben
+zu verschieben". Somit kann vermieden werden, daß logisch zusammengehörender
+Text auseinandergerissen wird und z.B. "Waisenkinder" entstehen (letzte
+Zeile eines Abschnittes kommt noch auf die neue Seite).
+
+Bei der interaktiven Seitenformatierung kann die Markierung nicht über das
+errechnete Ende einer Seite nach "unten" oder über das vorherige, bereits
+verarbeitete Seitenende nach "oben" verschoben werden. Die Markierung kann
+auch nicht in einen Fußnotenbereich plaziert werden, weil Fußnoten sinn-
+vollerweise nicht geteilt werden sollten.
+
+Entstehen Leerzeilen bei der Seitenformatierung am Anfang einer Seite (z.B.
+durch Plazierung des Seitenendes zwischen zwei Absätzen), so werden diese
+von 'pageform' automatisch aus der Druckdatei entfernt. Will man Leerzeilen
+am Anfang einer Seite#ie#, dann sollte das 'free' in Verbindung mit der
+'page'-Anweisung verwandt werden.
+
+Zusätzlich ist es möglich, Leerzeilen in eine Seite der Druckdatei einzu-
+fügen und/oder beliebige Zeilen zu löschen (vergl. b)).
+
+Folgende Operationen stehen bei der interaktiven Seitenformatierung zur
+Verfügung:
+
+a) Seitenende verschieben:
+
+'pageform' berechnet das "rechnerische" Seitenende und zeigt dieses auf dem
+Bildschirm durch die Markierung an. Die Markierung kann interaktiv verschoben
+werden:
+
+ Taste Bedeutung
+
+ RETURN Seitenende an diese Stelle plazieren.
+ OBEN Seitenende eine Zeile nach oben verschieben.
+ UNTEN Seitenende eine Zeile nach unten verschieben
+ (wenn vorher nach "oben" verschoben).
+ HOP OBEN Seitenende um einen Bildschirm nach oben verschieben.
+ HOP UNTEN Seitenende um einen Bildschirm nach unten verschieben.
+
+b) Leerzeilen einfügen und/oder Zeilen löschen
+
+Ergeben die Berechnungen von 'pageform', daß der bearbeitete Text nicht
+richtig auf der Seite plaziert ist, können in die Seite (der Druckdatei!)
+Leerzeilen eingefügt und/ oder Zeilen gelöscht werden. Dies kann beispiels-
+weise sinnvoll sein, wenn durch die Löschung einer Zeile ein Absatz noch auf
+die Seite passen würde oder durch die Einfügung von Leerzeilen ein Absatz
+auf der letzten Zeile der Seite endet. Oft ist es auch sinnvoll, daß alle
+Seiten gleich lang sind. In diesem Fall sollten vor Kapiteln und Absätzen
+Leerzeilen eingefügt oder gelöscht werden.
+
+Um Leerzeilen einzufügen und/oder Zeilen zu löschen, muß die Markierung (wie
+unter a) beschrieben) an die Stelle plaziert werden, an der die Änderung
+vorgenommen werden soll. Abschließend berechnet 'pageform' die Seite erneut.
+
+ Taste Bedeutung
+
+ HOP RUBIN Leerzeilen einfügen.
+ Anstatt der Markierung können durch (u.U. mehrmaliges)
+ RETURN Leerzeilen eingefügt werden. HOP RUBIN beendet
+ den Vorgang (wie Zeileneinfügen im Editor).
+
+ HOP RUBOUT Zeile löschen.
+ Die Zeile unmittelbar oberhalb der Markierung wird
+ gelöscht.
+
+'page'-Anweisung bestätigen/löschen
+
+Wird von der Prozedur 'pageform' eine 'page'-Anweisung angetroffen, so wird
+das so gewünschte Seitenende auf dem Bildschirm des Benutzers angezeigt. Die
+'page'-Anweisung kann entweder bestätigt oder gelöscht werden.
+
+ Taste Bedeutung
+
+ RETURN Seitenende bestätigen.
+
+ RUBOUT 'page'-Anweisung ignorieren. Die Prozedur 'pageform'
+ bearbeitet in diesem Fall die Datei weiter, als ob
+ keine 'page'-Anweisung angetroffen wurde.
+
+Merke: Ein Seitenende wird von 'pageform' auf dem Bildschirm angezeigt. Dies
+kann man mit den Positionierungstasten verschieben. Es können in die Seite
+Leerzeilen eingefügt oder Zeilen gelöscht werden. Eine 'page'-Anweisung kann
+man bestätigen oder löschen.
+
+
+
+Seitenlänge einstellen: 'pagelength'
+
+'pageform' ist auf eine Seitenlänge von 25.0 cm eingestellt (entspricht
+einem DINA4-Schreibfeld). Ist eine andere Seitenlänge erwünscht, muß die
+'pagelength'-Anweisung in den Text eingefügt werden.
+
+Beispiel:
+
+ \#pagelength (20.0)\#
+
+stellt die Seitenlänge auf 20 cm ein. Man beachte, daß der Dezimalpunkt bei
+der Seitenlänge mit angegeben werden muß.
+
+Die folgende Tabelle gibt die Seitenlänge für die am häufigsten gewählten
+Papiergrößen an:
+
+ Format Seitenlänge oberer und
+ (in cm) unterer Rand
+
+ DIN A4 25.0 je 2.35 cm
+
+ DIN A5 18.0 je 2.15 cm
+
+ DIN A4 quer 18.0 je 2.15 cm
+
+Merke: Mit der 'pagelength'-Anweisung kann die Seitenlänge (in cm) einge-
+tellt werden.
+
+
+
+Zeilenabstand einstellen: 'linefeed'
+
+Die 'linefeed'-Anweisung stellt einen Zeilenvorschub relativ zu der Schrift-
+höhe des eingestellten Schrifttyps ein.
+
+'pageform' berechnet die Anzahl Zeilen/Seite immer in Abhängigkeit vom einge-
+stellten Schrifttyp. Hat man z.B. eine Schrift gewählt, die doppelt so hoch
+wie z.B. eine Schreibmaschinenschrift ist, bekommt man auch entsprechend
+weniger Zeilen auf eine Seite. Um diesen Berechnungsvorgang braucht sich ein
+Nutzer in der Regel nicht zu kümmern.
+
+Anders verhält es sich, wenn ein anderer Zeilenvorschub als der "normale"
+Abstand zwischen Zeilen vorgenommen werden soll. In diesem Fall muß man wis-
+sen, daß die "Höhe" einer Zeile sich aus der Schrifttypgröße errechnet plus
+(ca.) 10%, welches den Abstand zwischen den Zeilen darstellt.
+
+Soll nun ein anderer Abstand eingestellt werden, wird die 'linefeed'-An-
+weisung eingesetzt. Der Parameter gibt an, um wieviel eine Zeilenhöhe erhöht
+oder verringert werden soll. Beispiel:
+
+ \#linefeed (2.0)\#
+
+Nach Antreffen dieser Anweisung wird die Zeilenhöhe durch 2 * eingestellte
+Schrifttypgröße errechnet. Es wird also der Zeilenabstand zwischen den Zeilen
+entsprechend vergrößert, da die Schriftgröße gleich bleibt. Dies entspricht
+dem zweizeiligen Schreiben bei einer Schreibmaschine (wenn man davon absieht,
+daß hier auch unterschiedliche Schrifthöhen berücksichtigt werden). Ein
+1 1/2 zeiliges Schreiben wäre mit
+
+ \#linefeed (1.5)\#
+
+einzustellen.
+
+ \#linefeed (0.5)\#
+
+stellt die Zeilenhöhe = 1/2 * eingestellte Schrifthöhe ein, so daß die Zeilen
+teilweise ineinander gedruckt werden. Bei 'linefeed (0.0)' werden Zeilen
+übereinander gedruckt (druckerabhängig).
+
+Man beachte, daß die Angabe in der 'linefeed'-Anweisung relativ erfolgt. Bei
+allen anderen Anweisungen der Textkosmetik werden Angabe in Zentimeter ver-
+langt. Die 'linefeed'-Anweisung bildet somit eine Ausnahme (von der Regel).
+
+Merke: Wieviel Zeilen auf eine Seite passen, ist von den Höhen der einge-
+stellten Schrifttypen abhängig. Diese Berechnung erfolgt automatisch durch
+'pageform'. Die 'linefeed'-Anweisung stellt einen Zeilenvorschub relativ zum
+eingestellten Schrifttyp ein.
+
+
+
+Platz freihalten: 'free'
+
+Mit der 'free'-Anweisung kann man einen zusammenhängenden Teil auf einer
+Seite freihalten.
+
+Die 'free'-Anweisung wird an solchen Stellen im Text eingesetzt, an denen -
+nach dem Druck - Zeichnungen, Tabellen und ähnliches eingeklebt werden sol-
+len. Es wird der in der 'free'-Anweisung angebene Platz freigehalten. Bei-
+spiel:
+
+\#free (2.0)\#
+hält zwei Zentimeter frei. Paßt der angeforderte Platz nicht mehr auf die
+Seite, so wird der angeforderte Platz auf der nächsten Seite reserviert
+('pageform' plaziert das Seitenende vor die 'free'-Anweisung).
+
+Merke: Die 'free'-Anweisung hält einen Platz auf dem Papier frei (Angabe in
+cm).
+
+
+
+Neue Seite beginnen: 'page'
+
+An einigen Stellen im Text, z.B. zu Beginn eines neuen Kapitels, soll unbe-
+ingt eine neue Seite angefangen werden.
+
+Dies erreicht - wie bereits erwähnt - man mit der 'page'-Anweisung. 'page-
+form' meldet im diesem Fall, nach wieviel cm auf der Seite die Anweisung an-
+getroffen wurde. Man kann nun mit RETURN das Seitenende bestätigen, oder die
+Anweisung (in der Druckdatei) löschen. Im letzteren Fall berechnet 'page-
+form' die Seite neu (als ob die 'page'-Anweisung nicht dagewesen wäre).
+
+Gleichzeitig ist es möglich, mit Hilfe der 'page'-Anweisungs eine neue Sei-
+tennummer#ie# für die neue Seite einzustellen (vergl. die nächsten Ab-
+chnitte).
+
+Merke: Die 'page'-Anweisung bewirkt eine neue Seite und muß beim Formatieren
+bestätigt werden.
+
+
+
+Kopf- und Fußzeilen: 'head/bottom'
+
+Mit den 'head'- und #ib#'bottom'-Anweisung#ie#en ist es möglich, Zeilen am
+Anfang und Ende jeder Seite einfügen zu lassen.
+
+Zeilen am Anfang ("Kopfzeilen") und Ende ("Fußzeilen") jeder Seite werden
+nur einmal geschrieben und mit Anweisungen gekennzeichnet. Diese Zeilen fügt
+'pageform' dann an den entsprechenden Stellen ein. Beispiel:
+
+\#head\#
+ Unser EUMEL-Benutzerhandbuch
+
+\#end\#
+
+Diese zwei Zeilen (also die zwischen den 'head'- und 'end'-Anweisungen ein-
+geschlossenen Zeilen) werden unverändert von 'pageform' an den Anfang jeder
+Seite in die Druckdatei plaziert. Man beachte, daß zweckmäßigerweise (minde-
+stens) eine Leerzeile nach einer solchen Kopfzeile in den 'head'-Bereich ein-
+gefügt werden sollte, um die Kopfzeile von dem eigentlichen Text der Seite zu
+trennen.
+
+Entsprechendes gilt für Fußzeilen, die zwischen 'bottom' und 'end' einge-
+chlossen werden müssen:
+
+\#bottom\#
+ Autor: I. Listig
+\#end\#
+
+Praktischer Tip: Man füge nach einer Schriftzeile mindestens eine Leerzeile
+ein (in einem 'head') bzw. vor der Schriftzeile (in einem 'bottom'), um den
+eigentlichen Text von den Kopf- bzw. Fußzeilen abzuheben.
+
+'pageform' zählt die Seiten, beginnend mit der Seitennummer '1'. (Wie man
+Seitennummern in die Kopf- und Fußzeilen bekommt, verraten wir im nächsten
+Abschnitt). Es ist nun möglich, getrennte Kopf- und Fußzeilen für gerade und
+ungerade Seiten zu gestalten (wie in diesem Benutzerhandbuch). Dies erfolgt
+mit den Anweisungen 'headeven' und 'headodd' für Seiten mit geraden und un-
+geraden Seitennummern; ('bottomeven' und 'bottomodd' dito).
+
+Diese Anweisungen müssen ebenfalls jeweils mit einer 'end'-Anweisung be-
+endet werden.
+
+Es ist möglich, Kopf- und Fußzeilen mehrmals innerhalb einer Datei zu
+wechseln, um unterschiedliche Beschriftungen zu erhalten (z.B. kapitelweise).
+Dies ist jedoch nur sinnvoll, wenn dies auf einer neuen Seite erfolgt, also
+unmittelbar nach einer 'page'-Anweisung in den Text eingefügt wird. Beispiel:
+
+ \#page\#
+ \#head\#
+ Neuer Seiten Kopf
+
+ \#end\#
+
+"Fußzeilen" sollen überall gleiches Aussehen haben, unabhängig davon, welche
+Anweisungen im restlichen Text gegeben werden. Darum werden die bei der De-
+finition einer Fußzeile aktuellen Werte für
+
+ limit
+ type
+ linefeed
+
+bei dem Einsetzen der Zeilen berücksichtigt. Es ist somit erlaubt, einen
+anderen Schrifttyp (z.B. als der restliche Text) für Fußzeilen zu verwenden,
+indem die 'type'-Anweisung innerhalb des 'bottom'-Bereiches gegeben wird.
+Beachte, daß nach 'head'-, 'bottom' und auch 'foot'-Bereiche die o.a. Kom-
+mandos nicht automatisch zurückgestellt werden. Darum sollte vor der 'end'-
+Anweisung wieder auf den im übrigen Text verwandten Schrifttyp zurückge-
+stellt werden. Gleiches gilt für die 'limit'- und 'linefeed'-Anweisung.
+Beispiel:
+
+ \#bottom\#
+ \#type ("besonders schoen")\#
+ Autor: I. Listig
+
+ (Schriftyp zurückstellen): \#type ("normal")\# \#end\#
+
+Merke: Kopf- und Fußzeilen können durch die Anweisungen 'head' bzw. 'bottom'
+oder 'headeven', 'headodd' bzw. 'bottomeven', 'bottomodd' definiert werden.
+Die Zeilen müssen jeweils durch die 'end'-Anweisung beendet werden.
+
+
+
+Seiten numerieren
+
+In den Kopf- und Fußzeilen steht das '%'-Zeichen für die aktuelle Seiten-
+nummer.
+
+Erscheint das '%'-Zeichen innerhalb eines Kopf- oder Fußbereiches, wird von
+'pageform' beim Einsetzen dieser Zeilen auf jeder Seite die aktuelle Seiten-
+nummer#ie# eingesetzt (sind mehrere '%'-Zeichen vorhanden, wird die Seiten-
+nummer mehrmals eingesetzt). Beispiel:
+
+\#head\#
+ Seite: - % -
+
+\#end\#
+
+Durch einen Fußbereich kann man die Seitennummern auch am Ende einer Seite
+haben. Man beachte, daß sich bei mehrstelligen Seitennummern durch das Ein-
+setzen die Zeilenlänge vergrößert.
+
+Manchmal ist es notwendig und sinnvoll, einen Text in mehreren Dateien zu
+halten. Bei einer Folgedatei muß die Seitennummer dann neu gesetzt werden.
+Das erfolgt mit der 'page'-Anweisung. Beispiel:
+
+\#page (4)\#
+
+vollzieht eine neue Seite. Die Seitennummer der neuen Seite ist '4'.
+
+Bei einigen Spezialanwendungen benötigt man mehr als eine Seitennummer.
+Beispielsweise soll ein Text nicht nur absolut, sondern auch jede Seite in
+jedem Kapitel separat durchgezählt werden. Eine andere Anwendung ist die
+Benennung einer Folgeseite, wie in diesem Beispiel:
+
+\#page (4711)\#
+\#head\#
+ Mein Buch Seite: %
+
+\#end\#
+\#pagenr ("$", 4712)\#
+\#bottom\#
+
+ Nächste Seite: $
+\#end\#
+
+Durch die 'pagenr'-Anweisung gibt man ein neues "Seitenzeichen" (hier: '$')
+und den Anfangwert für diese Seitennummer (hier: '4712'), der ebenfalls wie
+das '%'-Seitenzeichen von 'pageform' bei jeder neuen Seite um '1' erhöht und
+ggf. in die Kopf- und Fußzeilen eingesetzt wird. Es sind zwei zusätzliche
+Seitenzeichen (neben dem '%') möglich.
+
+Merke: In den Kopf- und Fußzeilen wird ein '%'-Zeichen von 'pageform' durch
+die aktuelle Seitennummer ersetzt. Die Seitennummer kann durch das 'page'-
+Anweisung neu gesetzt werden.
+
+
+
+Fußnoten schreiben: 'foot'
+
+Fußnoten werden direkt im Text durch die Anweisungen 'foot' und 'end' ge-
+kennzeichnet. Die Fußnoten plaziert 'pageform' an das Ende einer Seite.
+
+Fußnoten werden vom Benutzer direkt in den Text geschrieben, am besten nach
+einem Absatz. Die Fußnote wird von 'pageform' an das Ende einer Seite, ggf.
+vor Fußzeilen plaziert. Für die Kennzeichnung von Fußnoten und die ent-
+sprechende Markierung im Text ist der Benutzer selbst zuständig. Allerdings
+wird von 'pageform' bei dem Einsetzen einer Fußnote am Ende einer Seite
+Unterstreichungsstriche vor die Fußnoten eingefügt, damit Fußnoten vom
+"normalen" Text abgehoben werden.
+
+\#foot\#
+*) Das ist die erste Anmerkung auf dieser Seite.
+\#end\#
+
+Mehrere Fußnoten innerhalb einer Seite werden von 'pageform' in der Reihen-
+folge ihres Auftretens gesammelt und am Ende der Seite plaziert. Für eine
+entsprechende Trennung der Fußnoten voneinander (z.B. durch Leerzeilen) hat
+der Benutzer selbst zu sorgen.
+
+Man sollte eine Fußnote unmittelbar hinter den Absatz schreiben, in der die
+Markierung für die Fußnote erscheint, denn u.U. paßt die Fußnote nicht mehr
+auf die aktuelle Seite und muß somit von 'pageform' auf die nächste Seite
+gebracht werden. 'pageform' geht davon aus, daß die Kennzeichnung der Fuß-
+note in der Zeile unmittelbar vor der Fußnote steht und bringt diese Zeile
+ebenfalls auf die neue Seite.
+
+Merke: Fußnoten werden direkt hinter einem Absatz in den Text mittels der
+Anweisungen 'foot' und 'end' geschrieben, die 'pageform' an das Ende der
+Seite einfügt. Die Kennzeichnung der Fußnoten hat der Benutzer selbst vorzu-
+nehmen oder man kann sie mit Hilfe von 'count'- und 'value'-Anweisungen
+durchnumerieren (siehe nächsten Abschnitt).
+
+
+
+Fußnoten numerieren: Zählen lassen
+
+Bei vielen Fußnoten in einem Text ist es nicht möglich, die Fußnoten beim
+Schreiben des Textes entsprechend zu beschriften. Für diesen Fall und um auf
+die Fußnote im Text nochmals Bezug nehmen zu können, bietet 'pageform' die
+Möglichkeit an, die Fußnoten zu numerieren.
+
+Durch die 'count'-Anweisung wird 'pageform' veranlaßt, einen internen Zähler
+(beginnend bei dem Wert 0) zu erhöhen und diesen Wert anstatt der 'count'-
+Anweisungen in den Text einzusetzen. Beispiel:
+
+\#count\#
+
+setzt den Wert 1 anstatt der Anweisung ein (Anmerkung: trifft 'lineform' auf
+eine 'count'-Anweisung, so wird die Zeile berechnet, als ob drei Ziffern
+anstatt der Anweisung ständen). Jede weitere 'count'-Anweisung erhöht den
+internen Zähler und der Zählerwert wird wiederum eingesetzt:
+
+\#count\#
+
+setzt den Wert 2 ein usw. Dadurch ist es möglich, beliebige Textteile
+(Kapitel, mathematische Sätze u.a.m.) fortlaufend zu numerieren, ohne auf
+die Numerierung beim Schreiben und Ändern des Textes zu achten.
+
+Mit der 'value'-Anweisung kann man den letzten erreichten count-Wert noch-
+mals einsetzen. Das ist insbesondere für Fußnoten sinnvoll einsetzbar.
+Beispiel:
+
+ Bla Bla Bla (\#count\#)
+ \#foot\#
+ Eine Fußnote
+ \#end\#
+ ...
+
+Das Resultat würde folgendermaßen aussehen:
+
+ Bla Bla Bla (3)
+ ....
+
+ _____
+ (3) Eine Fußnote
+
+Man beachte, daß in diesem Fall die 'value'-Anweisung der 'count'-Anweisung
+folgen muß, ohne das eine weitere 'count'-Anweisung dazwischen steht. Das
+liegt - wie bereits erwähnt - daran, daß die 'value'-Anweisung immer den
+letzten 'count' Wert einsetzt.
+
+Das kann man umgehen, indem die 'count'- und 'value'-Anweisungen mit einem
+TEXT-Parameter versehen werden, der als Kennzeichnung dient. Beispiel:
+
+ \#count ("Merk1")\#
+
+arbeitet ebenso wie 'count' ohne Parameter (setzt also hier den Wert 4 ein),
+aber zusätzlich vermerkt 'pageform' den aktuellen Zählerwert neben dem Kenn-
+zeichen. Nun ist es mit der 'value'-Anweisung möglich, den vermerkten Zähler-
+wert durch Angabe des Kennzeichens an beliebigen Stellen im Text zu reprodu-
+zieren (auch wenn der interne Zähler weitergezählt wurde). Beispiel:
+
+ \#count\#\#count\#
+ \#value("Merk1")\#
+
+Die ersten zwei 'count'-Anweisungen produzieren - wie beschrieben - die
+Werte 5 bzw. 6. Die 'value'-Anweisung dagegen setzt den vermerkten Wert 4
+ein.
+
+Dies ist insbesondere sinnvoll, wenn man im Text auf eine Fußnote verweisen
+will. Beispiel:
+
+ Bla Bla. Siehe auch Anmerkung (\#value ("Waldschrat")\#). Bla
+ ...
+ ...
+ Bla Bla Bla (\#count ("Waldschrat")\#)
+ \#foot\#
+ (\#value ("Waldschrat")\#) Waldschrate kommen in vier Farben vor:
+ Rot, schwarz, grün und blau/gelb.
+ \#end\#
+
+Manchmal ist es notwendig (ebenso wie bei der Seitennummer), den internen
+Zähler neu zu setzen. Beispiel:
+
+ \#setcount (13)\#\#count ("aha!")\#
+
+produziert den Wert 13.
+
+Merke: Die 'count'-Anweisung setzt einen internen Zähler in die Druckdatei
+ein. Durch die #ib#'value'-Anweisung#ie# werden gespeicherte Werte einge-
+setzt, was man bei Fußnoten ausnutzen kann.
+
+
+
+Querverweise mit 'topage'/'goalpage'
+
+Mit den Anweisungen 'topage' und 'goalpage' sind Querverweise möglich, die
+von 'pageform' in die Druckdatei eingefügt werden.
+
+Mit Hilfe von Querverweisen soll auf andere Stellen im Text verwiesen werden,
+was nur bei längeren Texten üblich ist. Um dem Leser die mühselige Suche
+nach der Textstelle zu ersparen, gibt man in der Regel die Seitennummer an.
+Leider steht die Seitennummer vor der Fertigstellung des Textes meist noch
+nicht fest. Auch in diesem Fall kann 'pageform' helfen. Die 'topage'- An-
+weisung verweist auf eine andere Seite im Text, an der sich eine Anweisung
+'goalpage' befinden muß. Anstatt der Anweisung 'topage' wird die Seitennum-
+mer der Seite eingesetzt, auf der sich 'goalpage' befindet. Damit jedes
+'topage' auch (sein) entsprechendes 'goalpage' findet, wird bei beiden An-
+weisungen ein TEXT-Parameter angegeben. Beispiel:
+
+ Man schreibt: ... siehe auch auf Seite \#topage("verweis1")\#
+ ...
+ Auf einer anderen Seite befindet sich \#goalpage("verweis1")\#
+
+Nach 'Seite' wird die entsprechende Seitennummer eingesetzt.
+
+Es ist möglich, mehrmals auf die gleiche (Ziel-) Seite zu verweisen, man muß
+nur darauf achten, daß immer das gleiche Merkmal (TEXT-Parameter) verwandt
+wird.
+
+Merke: Mit den 'topage'- und 'goalpage'-Anweisungen sind Seitenquerverweise
+möglich. Für 'topage' wird die Seitennummer eingesetzt, auf der 'goalpage'
+steht.
+
+
+
+Formatierung von Spalten: 'columns'
+
+Mit der 'columns'-Anweisung ist es möglich, einen Text in Spalten zu forma-
+tieren ("Zeitungsdruck").
+
+Durch die Angabe der 'columns'-Anweisung wird 'pageform' aufgefordert, den
+Text in Spalten zu formatieren. Die Spaltenbreite muß der Benutzer mit der
+'limit'-Anweisung einstellen. Beispiel:
+
+ \#limit (18.0)\#
+ ...
+ \#columns (2, 2.0)\#\#limit (8.0)\#
+ ...
+
+Anfangs schreibt der Benutzer mit einer Zeilenbreite von 18 cm. Dann fordert
+er mit der 'columns'-Anweisung zweispaltigen Druck an (zwischen den Spalten
+soll 2 cm Abstand sein). Somit muß die 'limit'-Anweisung auf 8 cm einge-
+stellt werden.
+
+Die interaktive Spaltenformatierung wird von 'pageform' wie gewohnt vorgenom-
+men. Auf dem Bildschirm erscheint nun das Spaltenende, wobei die Nummer der
+Spalte angezeigt wird. Fußnoten werden spaltenweise eingeordnet und müssen
+somit die gleiche Zeilenbreite haben, wie die restlichen Spalten.
+
+'pageform' erzeugt in der Druckdatei die Spalten hintereinander. Das folgende
+Beispiel zeigt einen Ausschnitt aus der Druckdatei mit Kopf- und Fußzeilen
+bei einem zweispaltigen Druck:
+
+ head-Zeilen
+ xx
+ xx
+ xx
+ bottom-Zeilen
+ \#page\#\#------- Ende Seite 1 Spalte 1 ----\#
+ xx
+ xx
+ xx
+ \#page\#\#------- Ende Seite 1 Spalte 2 ----\#
+
+Die zweite Spalte erscheint also ohne Kopf- und Fußzeilen, die jedoch bei der
+Berechnung berücksichtigt werden. Man beachte, daß die Kopf- und Fußzeilen
+über die Spalten gehen können. Dies erreicht man durch geeignete 'limit'-
+Anweisungen in den genannten Bereichen. Hochwertige Drucker plazieren die
+zweite Spalte im Druckbild neben die erste. Bei preiswerteren Druckern muß
+man die Spalten nebeneinander kleben.
+
+Es ist zwar prinzipiell möglich, die Spalten in der Druckdatei nebeneinander
+zu schreiben. Jedoch hätte das Druckerprogramm Schwierigkeiten, diese neben-
+einander zu drucken, ohne daß z.B. ein Schrifttypwechsel in einer Spalte
+Auswirkungen auf eine Benachbarte hat. Praktischer Tip: Bei Druckern mit
+"Traktorführung" kann man erst alle ersten Spalten drucken, dann das Papier
+"von Hand" zurückdrehen und die zweiten Spalten drucken usw.
+
+Alle Anweisungen funktionieren beim spaltenweisen Formatieren wie üblich. Die
+'free'-Anweisung z.B. hält entsprechenden Platz in einer Spalte frei. Eine
+Ausnahme bildet die 'page'-Anweisung. Sie vollzieht hier ein Spaltenende. Die
+'page'-Anweisung mit einem Parameter (welcher die Seitennummer der nächsten
+Seite angibt), vollzieht dagegen ein Seitenende.
+
+Die 'columns end'-Anweisung beendet die spaltenweise Formatierung. Es ist
+zweckmäßig, unmittelbar vor der 'columns'- und hinter der 'columns end'-
+Anweisung eine 'page'-Anweisung zu schreiben.
+
+Überschriften (bzw. Textblöcke) über mehrere Spalten hinweg sind nur in der
+ersten Seite direkt hinter der 'columns'-Anweisung möglich. Beispiel:
+
+ \#page\#
+ \#limit (18.0)\#
+ HEAD
+ Breite Überschrift
+ \#columns (2, ...)\#\#limit (8.0)\#
+ XX
+ XX
+ XX
+ Bottom
+ \#page\#\#------- Ende Seite 1 Spalte 1 ----\#
+ XX
+ XX
+ XX
+ \#page\#\#------- Ende Seite 1 Spalte 2 ----\#
+
+Die Zeilen für die zweispaltige Überschrift werden berücksichtigt. Dies gilt
+jedoch nur unmittelbar hinter der 'columns'-Anweisung. Will man diesen Effekt
+nochmals haben, beendet man mit 'columns end', schreibt die 'page'-Anweisung,
+die breite Überschrift und schaltet die 'columns'-Anweisung wieder ein usw.
+
+Merke: Die Anweisungen 'columns'- und 'columns end' bewirken ein spalten-
+weises Formatieren des Textes durch 'pageform'. Die Spaltenbreite ('limit'-
+Anweisung) hat der Benutzer selbst einzustellen.
+
+
+
+4. Stichwortverzeichnisse erstellen: 'index'-Kommando
+
+Das Programm 'index' kann Stichwort- und Inhaltsverzeichnisse erstellen.
+Stichwortverzeichnisse#ie# können sortiert werden. Mehrere Stichwortver-
+zeichnisse können durch 'index merge' zusammengeführt werden.
+
+
+
+Übersicht über die Arbeitsweise von 'index'
+
+Durch den Aufruf von
+
+ index ("datei.p")
+
+werden durch Indexanweisungen gekennzeichnete Worte in Dateien, den soge-
+nannten Indexdateien, gespeichert.
+
+Anweisung Zweck
+
+ ib Anfang Index
+ (folgende Worte werden bis zur 'ie'-Anweisung in den
+ Index übernommen)
+ ie Ende eines Index
+
+Solche Verzeichnisse von Worten werden im EUMEL-System allgemein als Index
+bezeichnet. Nachdem eine oder mehrere Indexdateien aus einer Druckdatei
+erstellt sind, werden die Indexdateien auf Anfrage alphabetisch sortiert.
+Bei einem Inhaltsverzeichnis sollte man die Sortierung natürlich ablehnen.
+
+Nach der Sortierung werden gleiche Einträge automatisch zusammengefaßt und
+die entsprechenden Seitennummern nacheinander aufgeführt.
+
+Praktischer Tip: Will man nur eine Sortierung, aber keine Zusammenfassung
+von Einträgen, dann lehnt man die Sortieranfrage ab. Anschließend kann man
+die Indexdatei mit 'lex sort ("indexdatei namen")' sortieren. Hierbei
+bleiben gleiche Einträge erhalten.
+
+Das Programm
+
+ index merge ("index.i1", "index.i2")
+
+erlaubt es, zwei durch 'index' erzeugte Verzeichnisse zusammenzuführen.
+'index' kann ebenfalls benutzt werden, um ein Inhaltsverzeichnis und/oder
+ein Verzeichnis aller Abbildungen zu erstellen oder Literaturhinweise zu
+überprüfen.
+
+Die Worte, die durch 'index' in einen Index übernommen werden sollen, müssen
+in der Eingabedatei (der Druckdatei aus 'pageform') für 'index' durch An-
+weisungen gekennzeichnet werden. Die Form der Anweisungen entspricht der
+ELAN-Syntax (analog den Anweisungen für 'lineform', 'pageform' und EUMEL-
+Drucker). Solche #ib(1,"ff")#Indexanweisungen#ie# werden von den anderen
+Textbe- und -verarbeitungs Programmen ('lineform', 'pageform', EUMEL-
+Drucker) ignoriert. Man kann also bei dem Schreiben mit dem Editor gleich
+festlegen, welche Worte in einen Index aufgenommen werden sollen.
+
+
+
+Worte kennzeichnen: 'ib'/'ie'
+
+Da in einem Index - neben dem eigentlichen Worteintrag - die Seitennummer
+enthalten sein soll, arbeitet das Programm 'index' nur mit einer Druckdatei,
+d.h. einer Ausgabedatei von 'pageform'. Die Indexworte werden in Indexda-
+teien gesammelt. Die Indexdateien erhalten den Namen der zu bearbeitenden
+Datei, an den ".i" und die Nummer des Index angefügt wird. Beispiel:
+
+ ... Hier wird eine Eigenschaft des \#ib(1)\#EUMEL-Systems\#ie(1)\# beschrieben.
+
+(Die durch die Anweisungen 'ib' und 'ie' gekennzeichneten Worte werden mit
+der dazugehörigen Seitennummer in die erste Indexdatei geschrieben.)
+
+Die Einträge in einer Indexdatei werden von den Seitennummern durch min-
+destens drei Punkte getrennt.
+
+Werden diese nicht gewünscht, kann man sie leicht mit dem Editor entfernen.
+Beachte, daß man nur bei einer äquidistanten Schrift ein rechtsbündiges
+Verzeichnis erhalten kann.
+
+Es gibt die Möglichkeit, bis zu neun unterschiedliche Indexdateien zu er-
+stellen, z.B. durch
+
+ \#ib (1)\# und \#ie (1)\#
+
+gekennzeichnete Worte gehen in die Indexdatei mit der Nummer 1, durch
+
+ \#ib (9)\# und \#ie (9)\#
+
+gekennzeichnete Worte gehen in die Indexdatei mit der Nummer 9. Als Erleich-
+terung für diejenigen, die nur einen Index erstellen müssen, dürfen die 'ib'-
+und 'ie'-Anweisungen ohne Parameter benutzt werden, welches gleichbedeutend
+ist mit 'ib(1)' und 'ie(1)'.
+
+Die durch 'ib'- und 'ie'-Anweisungen gekennzeichneten Worte können auch über
+Zeilengrenzen (mit Silbentrennungen) gehen. Beispiel:
+
+ .... \#ib\#schöne Index-An-
+ weisungen\#ie\# ...
+
+'index' zieht getrennte Worte zusammen (hier: 'schöne Index-Anweisungen').
+Will man einige Worte in verschiedenen Indexdateien haben, darf man die 'ib'-
+und 'ie'-Anweisungen auch "schachteln". Dies kann man besonders bei Kapitel-
+überschriften nutzen. Beispiel (vergl. auch die Überschrift dieses Ab-
+schnitts):
+
+ \#ib(9)\#Worte kennzeichnen: '\#ib\#ib\#ie\#'/'\#ib\#ie\#ie\#'\#ie(9)\#
+
+In diesem Beispiel wird das Inhaltsverzeichnis in die Indexdatei '9' ge-
+bracht, während der "allgemeine" Index in der Indexdatei '1' gesammelt wird.
+
+
+
+Nebeneinträge erzeugen
+
+Es ist möglich, an die Seitennummer eines Eintrags einen beliebigen Text
+anfügen zu lassen. Beispiele:
+
+ EUMEL-System ... 27ff.
+ Monitor ........ 13(Def.)
+ EUMEL-Editor ... 2(Kap.4)
+
+Dies wird durch die generische Form der 'ib'-Anweisung ermöglicht:
+
+ ... der \#ib(1,"(Kap.4)")\#EUMEL-Editor\#ie\# ist gut geeignet,
+ Texte zu erstellen ...
+
+(erzeugt den letzten obigen Eintrag).
+
+An einen Eintrag kann ein weiterer TEXT angefügt werden, um etwa Unterein-
+träge zu bilden:
+
+ EUMEL-System .............. 27
+ EUMEL-System, kapitales ... 28
+ EUMEL-System, schönes ..... 29
+
+Das wird ebenfalls durch eine andere Form der 'ie'-Anweisung ermöglicht:
+
+ ... ist das \#ib\#EUMEL-System\#ie(1,", schönes")\# wirklich ein
+ schönes System ...
+
+(erzeugt den letzten obigen Eintrag).
+
+Nach der Erstellung einer Indexdatei können - nach interaktiver Anfrage - die
+Einträge sortiert werden. Die Sortierung erfolgt alphabetisch nach DIN 5007,
+Abschnitt 1 und 3.2 (Umlaute werden "richtig" eingeordnet).
+
+Wie bereits erwähnt, kann 'index' vielseitig eingesetzt werden:
+
+a) Erstellung von Stichwortverzeichnissen:
+ Wie bereits beschrieben.
+
+b) Erstellung von Inhaltsverzeichnissen:
+ Kapitelüberschriften mit eigenen Indexanweisungen klammern und durch
+ 'index' wie beschrieben verarbeiten. Beispiel:
+
+ \#ib(8)\#9.1.3 Das abenteuerliche Leben von Micky Maus unter
+ besonderer Berücksichtigung seiner Geburtsstadt Entenhausen\#ie(8)\#
+
+ Dann ist man sicher, daß das Inhaltsverzeichnis bezüglich Seitennummern
+ und Kapitelüberschriften korrekt ist.
+
+c) Erstellung von Abbildungsverzeichnissen:
+ Abbildungsüber- bzw. -unterschriften wie Inhaltsverzeichnisse verarbeiten.
+
+d) Überprüfung von Literaturhinweisen auf Vollständigkeit:
+ Man klammert alle Literaturhinweise mit extra Indexanweisungen (Beispiel:
+ \#ib(9)\#/Meier82/\#ie(9)\#) und überprüft dann mit Hilfe dieser Indexdatei
+ die Literaturverweise. Dann ist man sicher, daß alle Literaturverweise im
+ Text auch in der Literaturaufstellung stehen.
+
+
+
+Indexdateien zusammenführen: 'index merge'
+
+Durch das Programm 'index merge' kann eine Indexdatei in eine zweite "einge-
+mischt" werden. Es ist somit möglich, einen Index zu erstellen, der sich über
+mehrere Dateien erstreckt, indem man 'index' die Druckdateien dieser Dateien
+bearbeiten läßt und anschließend die entstandenen Indexdateien mit 'index
+merge ' zusammenfaßt. Indexdateien können ggf. mit dem Editor bzw. 'lineform'
+und/ oder 'pageform' bearbeitet und anschließend gedruckt werden. Beispiel:
+
+ index merge ("1.kapitel.i1", "2.kapitel.i1")
+
+Hier wird die Indexdatei des '1.kapitel' in die Indexdatei des '2.kapitel'
+eingeordnet und auf Wunsch sortiert.
+
+Beachte, daß 'index' und 'index merge' Kommandos und keine Anweisungen sind.
+
+Merke: 'index' verarbeitet eine Druckdatei (Zusatz: ".p") und erzeugt eine
+oder mehrere Indexdateien (Zusatz: ".i<nummer>"). Die in einen Index zu
+übernehmenden Worte müssen im Text durch die 'ib'- und 'ie'-Anweisungen
+eingefaßt sein.
+
+
+
+5. Drucken: 'print'
+
+Der EUMEL-Drucker, der mit dem Kommando 'print' angesprochen wird, ist eine
+Software-Schnittstelle zu einem angeschlossenem Drucker. In diesem Kapitel
+wird erklärt, wie man mit dem EUMEL-Drucker eine Datei druckt und welche
+speziellen Anweisungen den Drucker steuern.
+
+Jeder Drucker erbringt "hardwaremäßig" unterschiedliche Leistungen (z.B.
+Randausgleich, Unterstreichung). Diese Leistungen werden durch Eingabe
+spezieller Zeichenfolgen veranlaßt, die zwar genormt sind, aber von den Druk-
+kerherstellern nicht eingehalten werden oder unterschiedlich interpretiert
+werden.
+
+Um vom EUMEL-System unterschiedliche Drucker auf gleiche Weise ansprechen
+zu können, wurde eine Software-Schnittstelle geschaffen, die EUMEL-Drucker
+genannt wird. Der EUMEL-Drucker akzeptiert eine Datei und veranlaßt, daß
+diese in geeigneter Weise gedruckt wird. Weiterhin beachtet der EUMEL-
+Drucker die Anweisungen der Textkosmetik. Die Form der Anweisungen der
+Textkosmetik und des EUMEL-Druckers sind gleich.
+
+
+
+Eine Datei drucken: 'print'-Kommando
+
+Mit dem Kommando
+
+ print
+
+kann dem EUMEL-Drucker eine Datei zum Drucken übergeben werden. Beispiel:
+
+ print ("Drucker Beschreibung")
+
+In der Regel ist im EUMEL-System (Multi-User) ein "Spooler" installiert, so
+daß sofort mit der Arbeit fortgefahren werden kann. Der EUMEL-Drucker ar-
+beitet in diesem Fall parallel zu anderen Arbeiten des Nutzers.
+
+
+
+Anweisungen für den EUMEL-Drucker
+
+Ein Text (eine Datei) kann vom Drucker auch ohne Anweisungen gedruckt
+werden, etwa für Probedrucke. Für diesen Fall hat der Drucker vernünftige
+Voreinstellungen. Für einen "normalen" Text braucht ein Benutzer keine spe-
+ziellen Druckeranweisungen in den zu druckenden Text einzufügen, denn die
+Anweisungen für die Textkosmetik reichen zur Druckersteuerung aus. Nur wenn
+besondere Leistungen verlangt werden, wie z.B. Blocksatz oder den gedruckten
+Text an eine bestimmte Stelle zu plazieren, sind Druckeranweisungen notwen-
+dig.
+
+Werden vom Drucker Leistungen verlangt, die hardwaremäßig nicht vorhanden
+sind, so sorgt der EUMEL-Drucker dafür, daß eine möglichst äquivalente
+Leistung erbracht wird. Wird beispielsweise ein nicht vorhandener Schrifttyp
+angefordert, wird mit dem Standard-Schrifttyp der jeweiligen Installation
+gedruckt.
+
+Damit ist es möglich, einen Text auf einem Drucker zu drucken, der den ge-
+forderten Typ nicht kennt und der eigentlich für einen anderen Drucker
+bestimmt ist.
+
+Wie bereits erwähnt, beachtet der EUMEL-Drucker die gleichen Anweisungen wie
+die Textkosmetik-Programme. Eine 'type'-Anweisung beispielsweise, welches
+einen bestimmten Schrifttyp anfordert, wird also auch vom EUMEL-Drucker als
+Befehlsfolge an den angeschlossenen Hardware-Drucker übergeben (sofern der
+Schrifttyp auf dem Drucker realisierbar ist). Wie die Anweisungen ge-
+schrieben werden müssen, wird in der Beschreibung der Textkosmetik ge-
+schildert.
+
+Anweisungen werden nicht gedruckt. Besteht eine Zeile nur aus Anweisungen,
+so wird diese Zeile vom EUMEL-Drucker nicht gedruckt. Im Gegensatz zu den
+Programmen der Textkosmetik werden unbekannte oder fehlerhafte Anweisungen
+vom EUMEL-Drucker ohne Fehlermeldung "verschluckt". Alle Anweisungen werden
+zum frühest möglichen Zeitpunkt ausgeführt, haben also u.U. bereits Aus-
+wirkungen auf die Zeile, in der sie stehen.
+
+Einige Anweisungen sind speziell nur für den EUMEL-Drucker vorhanden.
+Diese werden in diesem Kapitel erklärt bzw. werden in der Anweisungs-Über-
+sicht mit aufgeführt.
+
+Neben den "normalen" Anweisungen, die nur in "\#"-Zeichen eingeschlossen
+werden, gibt es noch zwei andere Formen:
+
+a) Kommentar-Anweisungen:
+ Werden in "\#-" und "\#"-Zeichen eingeschlossen. Solche Anweisungen
+ werden ignoriert. Beispiel:
+
+ \#---- Ende der Seite 1 ---\#
+
+b) Spezielle Druckeranweisungen:
+ Werden in "\#/" und "\#"-Zeichen eingefaßt. Die von diesen Anweisungs-
+ Zeichen eingeschlossenen Druckerbefehlen werden unverändert (ohne die
+ "\#/" und "\#"-Zeichen) an den Drucker weitergereicht. Beispiel:
+
+ \#/C05\# (* C05 geht an den Drucker *)
+
+ Solche Anweisungen werden manchmal benötigt, um spezielle Druckereigen-
+ schaften auszunutzen, die schwer oder garnicht im EUMEL-Drucker reali-
+ sierbar sind.
+
+Anmerkung: Diese Anweisungen werden, wie die normalen Anweisungen auch, bei
+der Berechnung einer Zeile nicht berücksichtigt und nicht gedruckt.
+
+Merke: Der EUMEL-Drucker übernimmt die Anpassung an spezielle Hardware-
+Drucker. Er beachtet die gleichen Anweisungen wie die Textkosmetik-Programme.
+Zusätzlich gibt es noch einige wenige spezielle Druckeranweisungen.
+
+
+
+Blocksatz drucken: 'block'
+
+Die Anweisung 'block' bewirkt einen Blocksatz beim Druck.
+
+Fügt man in den Text (meist am Anfang einer Datei) die Anweisung
+
+ \#block\#
+
+ein, druckt der Drucker ab dieser Stelle alle Zeilen, die nicht mit einem
+Absatzkennzeichen versehen sind, im Blocksatz. Dies heißt, daß durch Ver-
+größern der Wortabstände alle Zeilen an der gleichen Position enden (rechter
+Randausgleich). Preiswerte Drucker können dies nur durch Einfügen ganzer
+Leerzeichen zwischen den Worten vornehmen, was sich oft beim Lesen störend
+bemerkbar macht. Bei qualitativ hochwertigen Druckern wird dagegen der
+Blocksatz durch Einfügen kleinerer Abstände zwischen den Worten oder sogar
+zwischen den Zeichen erreicht.
+
+Merke: Die Anweisung 'block' bewirkt den Blocksatz beim Druck.
+
+
+Schreibfeld verschieben: 'start'
+
+Durch die Anweisung 'start' ist es möglich, das Schreibfeld beim Druck auf
+dem Papier an eine andere Stelle zu plazieren.
+
+Der EUMEL-Drucker plaziert das Schreibfeld auf einem Drucker automatisch der-
+art, daß ein genügender Rand verbleibt. Diese Voreinstellung ist natürlich
+abhängig vom Drucker und der Installation. Mit der 'start'-Anweisung kann
+die automatische Einstellung verändert werden. Beispiel:
+
+ \#start (1.0, 2.0)\#
+
+legt die linke, obere Ecke des Schreibfeldes fest (vom linken Rand 1 cm, vom
+oberen Rand 2 cm).
+
+Merke: Die 'start'-Anweisung legt den linken oberen Rand des Schreibfeldes
+fest.
+
+
+
+Zentrieren
+
+Mit dem '#ib#center#ie#'-Kommando kann man eine Zeile in der Mitte der Zeile
+drucken lassen.
+
+Das 'center'-Kommando zentriert die Schrift einer Zeile. Beispiel:
+
+\#center\#Diese Zeile ist zentriert
+
+Dies Kommando ist nur bei Proportionalschriften sinnvoll einzusetzen, da man
+bei einer äquidistanten Schrift man direkt auf dem Bildschirm sehen kann,
+wie der Text auf einer Zeile plaziert ist.
+
+Merke: 'center' zentriert eine Zeile beim Drucken.
+
+
+
+6. Textkosmetik-Makros
+
+Makros dienen als Abkürzung für immer wiederkehrende Textteile und/oder
+Kommandos.
+
+Textkosmetik-Makros kommen zum Einsatz bei
+
+- immer wiederkehrenden Textteilen;
+
+- immer wiederkehrenden Anweisungssequenzen;
+
+- bei der Erstellung von Manuskripten, deren endgültige Form man anfänglich
+ noch nicht weiß oder die man noch ändern will.
+
+Die Definition von einem oder mehreren Makros wird mit dem Editor vorgenom-
+men. Diese Makro-Datei wird dann geladen. Von diesem Augenblick an "kennen"
+'lineform'/'autoform' und 'pageform' die Makros (d.h. die Textzeilen und/
+oder Anweisungen, die sich unter dem dem Makronamen "verbergen").
+
+'lineform'/'autoform' beachten die Anweisungen, die in den Makros enthalten
+sind. Man beachte, daß die Anweisungen und Textzeilen, die in den Makros ent-
+halten sind, nicht in der Datei erscheinen. Erst 'pageform' setzt diese in
+die Druckdatei ein.
+
+
+Ein Beispiel
+
+Hier wird ein einfaches Beispiel für einen Briefkopf gezeigt.
+
+Angenommen, die Firma 'Meier' schreibt mit dem EUMEL-System ihre Geschäfts-
+briefe. Sie hat einen Drucker zur Verfügung, mit dem man auch die Briefköpfe
+erstellen kann. Für den Briefkopf schreibt die Junior-Chefin ein Makro'kopf'
+in eine Datei 'macro definitionen':
+
+ \#*kopf\#
+ \#type("fett und gross")\# Firma Meier
+ \#type("fett")\# Gemischtwaren in kleinen Mengen
+ \#type("klein")\# Straße
+ Stadt
+ \#type ("normal")\#
+ \#*macro end\#
+
+Der Name des Makros ist 'kopf'. Man beachte, daß eine Makro-Definition mit
+dem Namen des Makros beginnen müssen. Der Makroname muß mit einem '*'
+gekennzeichnet werden, um ihn von "normalen" Text-Anweisungen unterscheiden
+zu können. Jedes Makro wird mit einer 'macro end'-Anweisung beendet
+(es dürfen mehrere Makros hintereinander in die Datei geschrieben werden).
+
+Nun muß die Junior-Chefin das so definierte Makro 'laden':
+
+ load macros ("macro defintionen")
+
+Zur Kontrolle kann sie sich die "geladenen" Makros in einen Datei ausgeben
+lassen:
+
+ list macros ("kontroll datei")
+
+Nun kann die Junior-Chefin ihrem Sekretär sagen, daß er von jetzt ab ein
+neues Kommando zur Verfügung hat, welches einen Briefkopf in jeden Brief
+drucken kann (mit dem Namen 'kopf'). Der Sekretär schreibt also nun
+folgenden Brief:
+
+\#kopf\#
+
+Sehr geehrte Frau ....
+usw.
+
+Nachdem er mit 'lineform' den Brief zeilenweise formatiert hat, kontrolliert
+er die formatierte Datei. Hier hat sich noch nichts verändert, die neue An-
+weisung 'kopf' steht unverändert in der Datei. ('lineform' beachtet zwar
+alle Anweisungen und Textzeilen eines Makros, setzt diese jedoch nicht in
+die Datei ein).
+
+Nun formatiert der Sekretär die Datei, welche den Brief enthält, mit 'page-
+form'. In der Druckdatei ist nun die Anweisung 'kopf' verschwunden, dafür
+stehen aber nun die Zeilen des Makrorumpfes ('pageform' setzt die Zeilen des
+Makros in die Druckdatei ein):
+
+ \#type("fett und gross")\# Firma Meier
+ \#type("fett")\# Gemischtwaren in kleinen Mengen
+ \#type("klein")\# Straße
+ Stadt
+ \#type ("normal")\#
+
+
+ Sehr geehrte Frau ...
+ usw.
+
+Merke: Makros sind bei der Verwendung von wenigen Text- und/oder Anweisungs-
+folgen nützlich, die immer in der gleichen Form benötigt werden.
+
+
+Ein Beispiel mit Makro-Parametern
+
+Unsere Junior-Chefin fällt nun auf, daß sie ihr Makro noch etwas verbessern
+kann. Sie will noch das Datum mit in den Briefkopf aufnehmen. Somit editiert
+sie ihre Makro-Datei folgendermaßen (man beachte die '$'-Zeichen):
+
+ \#*kopf ($1)\#
+ \#type("fett und gross")\# Firma Meier
+ \#type("fett")\# Gemischtwaren in kleinen Mengen
+ \#type("klein")\# Straße
+ Stadtname
+ \#type ("normal")\#
+
+ Stadtname, den $1
+ \#*macro end\#
+
+Damit hat sie dem 'kopf'-Makro einem Parameter gegeben ('$1'; die Parameter
+werden numeriert. Ein zweiter Parameter würde '$2' heißen usw.).
+
+Der Sekretär muß nun die Anweisung 'kopf' mit dem jeweiligen Datum in einen
+Brief schreiben:
+
+ \#kopf ("9.1.1984")\#
+
+'pageform' setzt nun das angegebene Datum direkt hinter 'Stadtname, den' in
+den Briefkopf ein (in der Druckdatei). Beachte, daß nur TEXT-Denoter als
+aktuelle Parameter eines Makros erlaubt sind.
+
+Merke: Durch die Makro-Parameter ist es also möglich, immer wiederkehrende
+Textteile in Schriftstücke einsetzen zu lassen, die sich nur in Kleinigkei-
+ten unterscheiden.
+
+
+Ein Beispiel für Manuskripte
+
+Hier wird gezeigt, wie man mit Makros Anweisungen formulieren kann, die aus-
+sagen, um was es sich bei einem Text handelt und nicht, wie es behandelt
+werden soll.
+
+Bei Manuskripten für Artikel, Bücher und Manuals weiß ein Autor oft vorher
+nicht, in welchem Format das Manuskript gedruckt werden wird. Zu diesem
+Zweck ist es ebenfalls nützlich, die Makros zu verwenden. Beispiel:
+
+ \#*kapitel anfang ($1)\#
+ \#free (2.0)\#
+ \#type ("gross und fett")\#\#ib (9)\#$1\#ie (9)\#\#type ("normal")\#
+
+ \#*macro end\#
+
+In diesem Beispiel wird ein Makro für den Anfang eines Kapitels definiert.
+Zwischen zwei Kapiteln soll hier zwei cm Zwischenraum bleiben, die Kapitel-
+Überschrift (als Parameter) wird in einer grösseren Schrift gedruckt. Zu-
+sätzlich wird die Überschrift in den 9. Index aufgenommen für ein Inhalts-
+verzeichnis. Nach der Überschrift wird eine Leerzeile eingeschoben, bevor
+der "richtige" Text anfängt.
+
+Ein(e) Anwender(in) dieses Makros schreibt also z.B. folgende Anweisung:
+
+ \#kapitel anfang ("Ein Beispiel fuer Manuskripte")\#
+
+(Beachte, daß die Kapitel-Überschrift nicht länger als eine Textzeile sein
+darf. Das liegt daran, das 'lineform'/'autoform' zwar die Zeile bearbeitet,
+aber nicht in den Text einsetzt. 'pageform' setzt also die unveränderte
+- nicht aufgebrochene Textzeile - ein).
+
+Man kann nun Makros für die meisten Textstrukturen definieren. Schreibkräfte
+brauchen dann in der Regel die meisten der Text-Anweisungen nicht zu kennen,
+sondern nur noch eine Anzahl von einfachen Makro-Anweisungen.
+
+Die Makro-Definitionen können jederzeit geändert werden, um wechselnden
+Bedürfnissen angepaßt zu werden (z.B. wenn ein Verlag ein bestimmtes
+Schreibformat verbindlich vorschreibt). In diesem Fall brauchen nicht alle
+Text-Dateien geändert zu werden, sondern nur die Makro-Definitionen.
+
+Ein weiterer Vorteil einer solchen Vorgehensweise ist, daß die Makro-Anwei-
+sungen in diesem Fall angeben, was eine bestimmte Text-Struktur ist, und
+nicht, wie die Struktur behandelt werden soll.
+
+Anmerkung:
+In eine Makro-Definition sollte man ggf. 'limit'-, 'type'- und 'linefeed'-
+Angaben einsetzen, um die Makros unabhängig von der Aufrufstelle zu machen.
+Ggf. sollte man die Datei vorher mit 'lineform' bearbeiten, um Trennungen
+vorzunehmen.
+
+Merke: Makros dienen zur flexiblen Behandlung von Text-Strukturen, indem
+Makros definiert werden, die angeben, um was es sich dabei handelt.
+
+
+
+Beschreibung der Makro-Kommandos
+
+Mit dem Kommando
+
+ load macros ("macro datei")
+
+kann eine Datei, in denen die Makro-Definitionen enthalten sind, in den
+Makro-Speicher des Textsystems geladen werden. Ist dies fehlerfrei erfolgt,
+kann man 'lineform'/'autoform' Dateien übergeben, die die definierten Makro-
+Anweisungen "kennen" und befolgen. 'pageform' setzt bei Antreffen einer
+Makro-Anweisung den Makrorumpf in die Ausgabe-Datei ein.
+
+Die Definition eines Makros erfolgt mit dem Makronamen, der von Anweisungs-
+zeichen eingeschlossen ist. Um Makro-Anweisungen von "normalen" Textkosmetik-
+Anweisungen zu unterscheiden, müssen diese nach dem ersten Anweisungszeichen
+mit einem '*' gekennzeichnet werden. Beispiel:
+
+ \#*macro eins\#
+ Makrorumpf mit "normalen" Kommandos, wie z.B.
+ \#type ("x")\#
+ \#*macro end\#
+
+Der Aufruf eines Makros, welcher z.B. in einer von 'lineform' zu bearbeiten-
+den Datei steht, unterscheidet sich nicht von einer "normalen" Textanweisung.
+Beispiel:
+
+ ... \#macro eins\# ...
+
+Hat das Makro Parameter (bei der Definition mit '$'-Zeichen durchnumeriert),
+müssen beim Aufruf TEXT-Parameter eingesetzt werden (also in Anführungs-
+strichen). Beispiel:
+
+ \#*macro zwei ($1)\#
+ ... $1 ...
+ \#*macro end\#
+
+ (* Aufruf: *)
+
+ \#macro zwei ("ein einzusetzender Text")\#
+
+Anmerkung:
+Bei Makros gibt es keine generischen Anweisungen. Makros, die gleiche Namen
+haben, aber sich durch die Anzahl der Parameter unterscheiden, sind also
+nicht erlaubt.
+
+Beachten Sie ferner, daß Makro-Texte so verwendet werden, wie diese mit
+'load macros' geladen werden. Beispiel:
+
+ \#*a\#
+ \#on("underline")\#
+ \#*macro end\#
+
+ \#*b\#
+ \#off("underline")\#
+ \#*macro end\#
+
+Betätigt man in der Makro-Datei nach jeder Zeile die RETURN-Taste (Absatz),
+dann erhält man bei folgender Verwendung Fehlermeldungen von 'lineform':
+
+ ... \#a\#zu unterstreichender Text\#b\# ...
+
+weil hier Mitten im Satz Absätze erscheinen und 'lineform' bei jedem Absatz
+prüft, ob noch Modifikationen "offen" sind. In solchen Anwendungen sollte
+man also Makros ohne Absätze speichern.
+
+
+
+7. Anweisungs-Übersicht
+
+* block
+ Zweck: Blocksatz (rechter Randausgleich). Der Text einer Zeile wird durch
+ Vergrößern der Wortlücken auf die Zeilenlänge, die durch das
+ 'limit'-Kommando eingestellt ist, verlängert. Es gelten folgende
+ Bedingungen:
+ a) Leerzeichen werden nicht verbreitert bei
+ - Zeilen mit Absatzzeichen;
+ - Mehrfache Leerzeichen;
+ - führende Leerzeichen (Einrückung);
+ - ein Leerzeichen hinter dem ersten Wort einer Zeile, wenn es auf
+ die Zeichen "]", ")", ".", "-", ":" endet.
+ b) Einrückungen werden äquidistant berechnet (Anzahl Zeichen *
+ Breite eines "Standard-Blanks"). Dies gilt nur für Proportional-
+ schriften und vor einer Absatzzeile. Es gilt als Einrückung:
+ - "Spiegelstrich" (Bindestrich und Leerzeichen am Anfang der
+ Zeile);
+ - Doppelpunkt als Ende des ersten Wortes (Position < 20);
+ - Schliessende Klammer oder Punkt als Ende des ersten Wortes,
+ wenn eine Ziffer davor steht (Position < 7);
+ c) Tabellen werden auch äquidistant berechnet. Dies gilt ebenfalls
+ nur für Proportionalschriften und vor einer Absatzzeile. Es gilt
+ als Teil einer Tabelle:
+ - Position des letzten Mehrfachblank.
+
+* bottom
+ Zweck: Erzeugen von "Fußzeilen" am Ende jeder Seite in der Druckdatei für
+ Untertitel und Seitennummern. Die Textzeilen zwischen den Anwei-
+ sungen 'bottom' und 'end' werden von 'pageform' am Ende jeder Seite
+ eingesetzt.
+
+* bottom even
+ Zweck: Definition von Fußzeilen für Seiten mit geraden Seitennummern. Es
+ gilt das unter 'bottom' gesagte.
+
+* bottom odd
+ Zweck: Definition von Fußzeilen für Seiten mit ungeraden Seitennummern. Es
+ gilt das bei 'bottom' gesagte.
+
+* center
+ Zweck: Zentrieren einer Zeile (Absatzzeile).
+
+* columns (INT CONST anzahl, REAL CONST luecke)
+ Zweck: Einschalten der Spaltenformatierung.
+
+* columnsend
+ Zweck: Ausschalten der Spaltenformatierung.
+
+* count
+ Zweck: Erhöhung eines internen Zählers und Einsetzen des Wertes anstatt
+ der Anweisung in die Druckdatei.
+
+* count (TEXT CONST merkmal)
+ Zweck: Wie obiges 'count', jedoch wird der Wert des Zählers vermerkt, so
+ daß er mit 'value' wieder erfragt werden kann.
+
+* end
+ Zweck: Beendet die Defintion von 'head', 'bottom' oder Fußnotenbereichen.
+
+* foot
+ Zweck: Definieren von Fußnoten. Es werden die aktuellen Werte von 'limit',
+ 'linefeed' und 'type' für die Fußnote verwendet (vergl. 'bottom'-
+ Anweisung).
+
+* free (REAL CONST freier platz)
+ Zweck: Es werden 'freier platz' cm freigehalten.
+
+* goalpage (TEXT CONST merkmal)
+ Zweck: (Ziel-) Verweis für Seitenquerverweise in Verbindung mit der Anwei-
+ sung 'topage'. 'merkmal' muß mit dem Parameter des entsprechenden
+ 'topage' übereinstimmen.
+
+* head
+ Zweck: Definieren von Kopfzeilen, die von 'pageform' am Anfang jeder Seite
+ eingefügt werden. Es gilt das unter 'bottom' gesagte.
+
+* head even
+ Zweck: Definieren von Kopfzeilen für Seiten mit geraden Seitennummern. Es
+ gilt das unter 'bottom' gesagte.
+
+* head odd
+ Zweck: Definieren von Kopfzeilen für Seiten mit ungeraden Seitennummern.
+ Es gilt das unter 'bottom' gesagte.
+
+* ib
+ Zweck: Arbeitet wie 'ib (1)', man darf aber den Parameter weglassen.
+
+* ib (INT CONST index nummer)
+ Zweck: Indexanfang einer oder mehrerer Indexworte bis zur entsprechenden
+ 'ie'-Anweisung. Die Worte zwischen 'ib' und 'ie' werden in die
+ Indexdatei geschrieben. 'index nummer' gibt die Indexdatei an.
+
+* ib (INT CONST index nummer, TEXT CONST seitennummer zusatz)
+ Zweck: Indexanfang mit Zusatztext für die Seitennummer. Das oben gesagte
+ gilt entsprechend. 'seitennummer zusatz' wird unmittelbar hinter
+ die Seitennummer angefügt. 'seitennummer zusatz' muß in jeder 'ib'-
+ Anweisung neu gesetzt werden.
+
+* ie
+ Zweck: Arbeitet wie 'ie (1)', man darf aber den Parameter weglassen.
+
+* ie (INT CONST index nummer)
+ Zweck: Abschluß eines Index. Ein Index darf nicht über Absatz- und Seiten-
+ grenzen gehen. Ein Index über mehr als zwei Zeilen ist ebenfalls
+ aus Sicherheitsgründen (vergessene Abschlußanweisung) nicht erlaubt.
+
+* ie (INT CONST index nummer, TEXT CONST index zusatz)
+ Zweck: Es wird 'index zusatz' an die durch die Index-Anweisungen einge-
+ faßten Worte angefügt. Beispiel:
+
+ \#ib (1)\#EUMEL-System\#ie(1, ", kapitales")\# ist
+ schön.
+
+ Erscheint als 'EUMEL-System, kapitales ... 4' in der Indexdatei.
+ Diese Anweisung dient also dazu, auch Sub-Indizes zu ermöglichen.
+
+* limit (REAL CONST wert)
+ Zweck: Einstellen einer neuen Zeilenbreite in cm. Die Zeilenbreite gilt
+ solange, bis sie durch ein erneute 'limit'-Anweisung verändert wird.
+
+* linefeed (REAL CONST wert)
+ Zweck: Einstellen eines neuen Zeilenvorschubs in Abhängigkeit vom einge-
+ stellten Schrifttyp.
+
+* material (TEXT CONST mat)
+ Zweck: Angabe von installationsspezifischen Merkmalen für den Drucker.
+
+* off (TEXT CONST modification)
+ Zweck: Abschalten einer Modifikation.
+
+* on (TEXT CONST modification)
+ Zweck: Einschalten einer Modifikation. Folgende Modifikationen sind zur
+ Zeit möglich:
+ bold (Fettdruck)
+ italic (Kursivdruck)
+ underline (Unterstreichung)
+ revers (Weiß auf Schwarz)
+
+* page
+ Zweck: Anfang einer neuen Seite. 'page' muß als letztes auf einer Zeile
+ stehen.
+
+* page (INT CONST nr)
+ Zweck: Anfang einer neuen Seite mit 'nr' Seitennummer.
+
+* page length (REAL CONST cm)
+ Zweck: Einstellen der Seitenlänge in cm.
+
+* page nr (TEXT CONST seitennr zeichen, start)
+ Zweck: Einstellen eines neuen Seitennr-Zeichens und Anfangwerts bzw.
+ setzen der Seitennummer des bereits vorhandenen Seitenzeichens
+ ("%"). Neben dem vorhandenen "%"-Zeichen können zwei zusätzliche
+ (beliebige, aber von den "\#"-Zeichen unterschiedliche) Seiten-
+ zeichen definiert werden.
+
+* papersize (REAL CONST width, length)
+ Zweck: Angabe der Papiergröße des Druckers in cm.
+
+* print (INT CONST von, bis)
+ Zweck: Teilausdruck einer Datei. Der Drucker verarbeitet die Datei, bis er
+ an die Seite 'von' angelangt ist. Dann druckt er die Seiten bis
+ einschließlich 'bis'. Beachte, daß der EUMEL-Drucker die Seiten
+ immer ab 1 durchzählt (und eine eventuelle Seitennumerierung nicht
+ beachtet).
+
+* start (REAL CONST x, y)
+ Zweck: Legt den linken, oberen Eckpunkt des Schreibfeldes fest. Die
+ Angaben erfolgen in cm.
+
+* topage (TEXT CONST merkmal)
+ Zweck: Verweis auf eine Seite mit der Anweisung 'goalpage' und dem
+ gleichen 'merkmal'. Für 'topage' wird die Seitennummer von
+ 'goalpage' eingesetzt.
+
+* type (TEXT CONST schrifttyp name)
+ Zweck: Einstellen eines anderen Schrifttyps. Die verfügbaren Schriftarten
+ und deren Namen sind installationsspezifisch und deshalb hier nicht
+ beschrieben.
+
+* value
+ Zweck: Einsetzen des letzten 'count' Wertes.
+
+* value (TEXT CONST merkmal)
+ Zweck: Erfragen des mit 'count' gespeicherten Zählerwertes für 'merkmal'
+ und Einsetzen dieses Wertes durch 'pageform' in die Druckdatei.
+
+
+
+7. Kommando-Übersicht
+
+autoform
+ PROC autoform
+ Zweck: Aufruf von 'autoform' unter Verwendung des letzten eingestellten
+ Dateinamens.
+
+ PROC autoform (TEXT CONST datei)
+ Zweck: 'lineform' mit automatischer Silbentrennung. Nur die vorgenomme-
+ nen Trennungen werden auf dem Bildschirm angezeigt.
+
+ PROC autoform (FILE VAR f, TEXT CONST type name, REAL CONST width)
+ Zweck: Wie oben, jedoch auf einer Datei.
+
+index
+ PROC index (TEXT CONST eingabe datei)
+ Zweck: Erstellen von Indexdateien aus einer Druckdatei wie beschrieben.
+ Eine Indexdatei erhält den Namen der zu bearbeitenden Datei mit
+ dem Zusatz ".i" und der entsprechenden Indexnummer. Hat das
+ Programm 'index' die Druckdatei bearbeitet, werden die in die
+ Indexdatei geschriebenen Einträge alphabetisch sortiert (nach
+ Anfrage). Gleiche Einträge werden zusammengezogen: ein gleich-
+ lautender Eintrag wird entfernt, seine Seitennummer wird jedoch
+ an den bereits vorhandenen mit einem Komma aggefügt.
+
+ Die Sortierung entspricht DIN 5007:
+ - Die Sortierreihenfolge enspricht 'ABC...Z', wobei große und
+ kleine Buchstaben gleich behandelt werden.
+ - Weitere Entsprechungen:
+ ö = oe, ä = ae, ü = ue
+ Ö = Oe, Ü = Ue, Ä = Ae, Ä = ä, Ü = ü, Ö = ö, ß = ss
+ Dadurch wird z.B. 'muß' vor 'Muster' einsortiert und 'Goethe'
+ ist gleich 'Göthe'.
+ - Alle Sonderzeichen (außer " " und "-") werden ignoriert.
+ - Ein Leerzeichen und ein Bindestrich zwischen Worten werden
+ gleich behandelt. Beispiel:
+
+ 'EUMEL System' und 'EUMEL-System' sind also gleich.
+
+ Es sind z.Z. max. neun unterschiedliche Indexdateien vorgesehen.
+ Der Name einer Indexdatei ergibt sich aus dem Namen der zu bear-
+ beitenden Druckdatei, wobei '.p' durch '.i' mit der entsprechen-
+ den Ziffer ersetzt wird. Beispiel (für Indizes mit
+ 'index nummer' = 1, z.B. \#ib\# ... \#ie\#):
+
+ skript.p --> skript.i1
+
+index merge
+ PROC index merge (TEXT CONST von, hinzu)
+ Zweck: Einmischen der Indizes der Indexdatei 'von' in die Indexdatei
+ 'hinzu'. Beide Indexdateien müssen vorhanden sein. Dabei wird
+ 'von' vor dem ersten Satz von 'hinzu' eingefügt und anschließend
+ ggf. sortiert.
+
+list macros
+ PROC list macros (TEXT CONST datei)
+ Zweck: Ausgabe der "geladenen" Makros in die Datei 'datei'. 'datei' darf
+ vorher nicht existieren, wird also von 'list macros' eingerichtet.
+ Die "geladenen" Makros bleiben unberührt. Man kann die mit 'list
+ macros' in die Datei 'datei' geschriebenen Makro-Definitionen ggf.
+ verändern und erneut mit 'load macros' laden.
+ Fehlerfall:
+ * file already exists
+ Ausgabe-Datei 'datei' ist bereits vorhanden.
+
+lineform
+ PROC lineform
+ Zweck: Der zuletzt verwandte Dateiname wird benutzt. Beispiel:
+
+ edit ("test")
+ ...
+ lineform (* wird zu 'lineform ("test") *)
+
+ PROC lineform (TEXT CONST dateiname)
+ Zweck: Formatieren einer Datei zeilenweise.
+
+ PROC lineform (FILE VAR f, TEXT CONST type name, REAL CONST width)
+ Zweck: Aufruf von 'lineform' von einem Programm.
+
+load macros
+ PROC load macros (TEXT CONST datei)
+ Zweck: Lädt Makro-Definitionen in den Makro-Speicher des Textsystems. Die
+ Definitionen müssen in der Datei 'datei' enthalten sein (mit dem
+ Editor erstellen). Es können mehrere Definitionen in der Datei ent-
+ halten sein. Um den Makro-Speicher zu leeren, übergibt man eine
+ leere 'datei'.
+
+ Eine Makro-Definition besteht aus einem
+ - Makro-Kopf:
+ Muß alleine auf einer Zeile stehen. Der Makro-Kopf fängt mit
+ '\#*'-Zeichen an und wird mit '\#' beendet. Beispiel: \#*ein macro\#
+ Der Name eines Macros muß (wie alle andern Anweisungen auch)
+ mit kleinen Buchstaben geschrieben werden. Leerzeichen spielen
+ keine Rolle.
+ Eventuelle Parameter müssen in Klammern (bei mehreren durch
+ Kommata getrennt) und mit einem $-Zeichen numeriert werden.
+ Beispiel:
+ \#*macro1 ($1)\#
+ \#*macro 2 ($1, $2)\#
+
+ - Makro-Rumpf:
+ Besteht aus beliebig vielen Text-Zeilen, die Kommandos enthalten
+ können. Parameter (also das $-Zeichen mit anschließender Nummer)
+ werden bei Aufruf eines Makros ersetzt. In einem Makro-Rumpf
+ darf keine Makro-Anweisung erscheinen, die noch nicht definiert
+ wurde (sog. "Vorwärts-Referenzen").
+
+ - Makro-Ende:
+ besteht aus der Anweisung
+ \#*macro end\#
+ und muß wie der Makro-Kopf alleine auf einer Zeile stehen.
+
+ Fehlerfälle:
+ * file does not exists
+ Die Eingabe-Datei 'datei' ist nicht vorhanden.
+ * macro store overflow (number lines)
+ Es passen zur Zeit nicht mehr als 1 000 Zeilen in den Makro-Speicher.
+ * macro store overflow (number macros)
+ Es passen zur Zeit nicht mehr als 100 Makro-Defintionen in den
+ Makro-Speicher.
+
+pageform
+ PROC pageform
+ Zweck: Wie beschrieben, jedoch ohne Parameter. Die zuletzt benutzte
+ Datei wird bearbeitet. Für die Druckdatei wird dieser Dateiname,
+ an den ".p" angehängt wird, eingesetzt. Beispiel:
+
+ edit ("test")
+ ...
+ pageform (* wird zu 'pageform ("test", "test.p")'
+ ergaenzt *)
+
+ PROC pageform (TEXT CONST dateiname)
+ Zweck: Wie beschrieben, wobei der Parameter für die Druckdatei ergänzt
+ wird (an 'dateiname' wird '.p' angehängt). Beispiel:
+
+ pageform ("test")
+ (* wird zu 'pageform ("test", "test.p")' ergaenzt *)
+
+ PROC pageform (TEXT CONST dateiname, druckdatei)
+ Zweck: Wie oben.
+
+print
+ PROC print (TEXT CONST datei)
+ Zweck: Druck der Datei 'datei' unter Berücksichtigung von Anweisungen.
+
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil5 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil5
new file mode 100644
index 0000000..d59b147
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil5
@@ -0,0 +1,667 @@
+ EUMEL-Benutzerhandbuch
+
+
+ TEIL 5: ELAN-Compiler
+
+
+Der ELAN-Compiler im EUMEL-System
+
+In diesem Kapitel wird die Benutzung des ELAN-Compilers im EUMEL-System be-
+schrieben. Es enthält Angaben, welche Einschränkungen bzw. Erweiterungen
+gegenüber dem Sprachstandard existieren. Eine Einführung in die Programmier-
+sprache ELAN wird hier nicht gegeben.
+
+
+
+1. Einführung
+
+Der im EUMEL-System eingesetzte ELAN-Compiler wurde von J. Liedtke und
+U. Bartling am HRZ Bielefeld in den Jahren 1975/76 erstellt und in den
+folgenden Jahren erweitert und der Sprachbeschreibung angepaßt. Der gleiche
+ELAN-Compiler wird auch auf verschiedenen Großrechnern (TR440, IBM, SIEMENS)
+eingesetzt.
+
+Den ELAN-Compiler kann man sich als aus zwei Teilen bestehend vorstellen.
+Einmal gibt es den "eigentlichen" ELAN-Compiler, der ein ELAN-Programm in
+eine Maschinensprache (im EUMEL-System der sogenannte EUMEL0-Code) übersetzt.
+Zum anderen verwaltet der ELAN-Compiler übersetzte Moduln (in ELAN Packets
+genannt).
+
+In einem Packet können Prozeduren, Datentypen und/oder Operatoren definiert
+werden. Ist ein solches Packet vorübersetzt (im EUMEL-System wird dieser
+Vorgang 'insertieren' genannt), stehen diese Objekte zur Benutzung zur Ver-
+fügung. Durch Packets kann man somit die Sprache ELAN erweitern.
+
+Weitere Informationen über die Programmiersprache ELAN finden Sie in den
+folgenden Büchern:
+
+Hommel / Jähnichen / Koster:
+Methodisches Programmieren
+W. de Gruyter, Berlin, 1983
+
+Klingen / Liedtke:
+Programmieren mit ELAN
+Teubner, Stuttgart, 1983
+
+In der Regel sind in einem EUMEL-System die Standard-Packets bereits in-
+sertiert (Ausnahmen: Datentypen #ib#VECTOR#ie# und #ib#MATRIX#ie#). Zusätz-
+lich sind weitere Packets vorübersetzt, die Kommandos zur Verfügung stellen.
+Welche weiteren Packets insertiert werden, kann jede EUMEL-Installation und
+jeder Nutzer entscheiden. Somit kann man sein System auf spezielle
+Anwendungen zuschneiden.
+
+
+
+2. Übersetzen mit dem ELAN-Compiler
+
+In diesem Abschnitt wird erklärt, wie Programme mit dem ELAN-Compiler über-
+setzt oder vorübersetzt werden können.
+
+
+
+Einfaches Übersetzen: 'run'-Kommando
+
+Mit dem 'run'-Kommando kann ein ELAN-Programm übersetzt und ausgeführt
+werden.
+
+Das 'run'-Kommando (vergl. auch die Kommandos in der Beschreibung des
+Monitors) übersetzt ein in einer Datei befindliches ELAN-Programm. Beispiel:
+
+ run ("mein programm")
+
+übersetzt das ELAN-Programm, welches in der Datei 'mein programm' enthalten
+ist. (Wie man ELAN-Programme schreibt, ist u.a. im Editor-Kapitel beschrie-
+ben).
+
+Der Fortschritt der Übersetzung wird durch laufende Nummern auf dem Bild-
+schirm des Benutzers angezeigt, die die gerade verarbeiteten Zeilennummern
+anzeigen. Da der ELAN-Compiler ein Zwei-Paß Compiler ist, werden alle
+Zeilen (mindestens) zweimal überprüft.
+
+Ist das Programm syntaktisch korrekt, d.h. hat der ELAN-Compiler keine
+Fehler gefunden, wird eine Ende-Meldung abgesetzt, die den Speicherumfang
+des übersetzten Programms enthält. Die Ende-Meldung entfällt, wenn die Task
+an kein Terminal angekoppelt ist.
+
+Nach der Ende-Meldung wird das Programm unmittelbar ausgeführt (ein Binder
+ist im EUMEL-System nicht notwendig).
+
+Merke: Das Kommando 'run' übersetzt ein in einer Datei befindliches Programm
+und führt fehlerfreie Programme aus.
+
+
+
+Korrektur von Fehlern
+
+In diesem Abschnitt wird beschrieben, wie (syntaktische bzw. semantische)
+Fehler korrigiert werden können.
+
+Entdeckt der ELAN-Compiler Fehler, so meldet er sie dem Benutzer unter An-
+Angabe der Zeilennummer. Die zwei Pässe des Compilers sind so konstruiert,
+daß sie unterschiedliche Fehler entdecken. Ist bereits im ersten Paß ein
+Fehler entdeckt worden, wird der zweite Paß nicht gestartet. Somit kann es
+vorkommen, daß man glaubt, alle Fehler beseitigt zu haben und dann werden
+wieder (andere) Fehler durch den zweiten Paß gemeldet ...
+
+Fehlermeldungen und Quelldatei werden nach Abschluß der Übersetzung durch
+den Paralleleditor angezeigt. Vergl. dazu auch die Beschreibung des Editors.
+
+Merke: Eventuelle Fehler und das zu korrigierende Programm werden durch den
+Paralleleditor angezeigt. So kann man das fehlerhafte Programm bequem ver-
+ändern.
+
+
+Nochmalige Ausführung eines Programms: 'run again'
+
+Mit 'run again' kann das zuletzt fehlerfrei übersetzte Programm nochmals
+ausgeführt werden.
+
+Ist ein Programm fehlerfrei übersetzt worden, so kann man es mit dem Komman-
+do 'run again' (beispielsweise mit anderen Eingabedaten) nochmals ausführen.
+
+Merke: Das Kommando 'run again' führt das zuletzt übersetzte Programm noch-
+mals aus.
+
+
+
+Übersetzen von Kommandos
+
+Auch Kommandos werden in der Regel vom ELAN-Compiler übersetzt.
+
+Der ELAN-Compiler wird nicht nur für Programme eingesetzt, sondern auch als
+Übersetzer für die EUMEL-Kommandosprache (in anderen Systemen "job control
+language", abgekürzt JCL genannt) und für Kommandos, die man im Editor geben
+kann. Jedes Kommando der EUMEL-Kommandosprache ist ein kleines ELAN-Programm,
+welches in der Regel aus einem Prozeduraufruf besteht. Einige häufig be-
+nutzte Kommandos werden der Effizienz halber über einen Kommando-Interpreter
+abgewickelt. Beispiel:
+
+ edit ("mein erstes Programm")
+
+Natürlich ist es möglich, mehrere Kommandos oder ein richtiges, einzeiliges
+Programm als Kommando zu verwenden. Beispiele:
+
+ put (17 * 4)
+
+ INT VAR i; FOR i FROM 1 UPTO 100 REP put ("i") PER
+
+ edit ("datei"); lineform ("datei"); print ("datei")
+
+ INT VAR i; FOR i FROM 1 UPTO 10 REP print ("d") END REP
+
+Mit vorübersetzten Prozeduren (siehe auch das Kommando 'insert') ist es
+möglich, eine eigene Kommandosprache zusammenzustellen.
+
+Merke: Der ELAN-Compiler wird auch für die Übersetzung und Ausführung von
+Kommandos benutzt.
+
+
+
+Vorübersetzen: 'insert'
+
+Das Kommando 'insert' übersetzt ein in einer Datei befindliches ELAN-Pro-
+gramm und trägt dieses in den Tabellenspeicher des Compilers ein.
+
+Mit dem Kommando 'insert' kann ein ELAN-Programm (d.h. ein Packet oder eine
+Packetfolge) in den Tabellenspeicher (eine Art "Compilerdatenbank") des
+ELAN-Compilers eingetragen werden. Die in den Packets enthaltenen Objekte
+stehen nach Abschluß der Übersetzung zur Verfügung. Beispiel:
+
+Die Datei 'mein druck' enthalte folgendes Programm:
+
+ PACKET mein druck DEFINES drucke:
+
+ PROC drucke (TEXT CONST datei):
+ edit (datei);
+ lineform (datei);
+ pageform (datei);
+ print (datei)
+ END PROC drucke;
+
+ END PACKET drucke;
+
+Mit dem Kommando
+
+ insert ("mein druck")
+
+wird das Packet 'drucke' in die Tabellen des ELAN-Compilers aufgenommen.
+Nun kann (als Kommando oder in einem Programm) der Prozeduraufruf 'drucke'
+verwandt werden.
+
+Man beachte, daß der Nutzer beim Einrichten seiner Task alle insertierten Ob-
+jekte der Vater-Task erhält. Insertiert der Benutzer in seiner Task weitere
+Packets, so sind diese nur ihm verfügbar (oder ggf. seinen Sohn-Tasks). Es
+ist somit möglich, Tasks mit unterschiedlichem Sprachumfang einzurichten.
+
+Einmal insertierte Packets können nicht mehr aus den Compilertabellen ent-
+fernt werden. Man kann also nur die Task löschen (bitte vorher alle Dateien
+archivieren oder bei der Vater-Task aufheben (siehe Kommando: 'save')).
+
+Das Kommando 'insert' arbeitet auch mit einem Thesaurus (vergl. dazu auch
+den Teil über Dateien). Beispiel:
+
+ insert (ALL myself)
+
+insertiert alle Dateien der Benutzer-Task in Reihenfolge.
+
+Merke: Das Kommando 'insert' übersetzt die in einer Datei enthaltene Packet-
+folge und trägt diese in die Tabellen des Compilers ein.
+
+
+
+Programme von einem Programm übersetzen lassen
+
+Manchmal ist es notwendig, daß ein Programm den ELAN-Compiler zur Über-
+setzung und Ausführung eines Programms aufrufen muß.
+
+Natürlich kann man auch die Kommandos 'run' oder 'insert' von einem Programm
+aus aufrufen. Leider müssen die zu übersetzenden Programme in einer Datei
+enthalten sein. Will man jedoch nur eine Anweisung übersetzen und ausführen
+lassen und nicht den "Umweg" über eine Datei gehen (wie z.B. die Kommandos
+im Monitor oder Editor), so kann man die Prozedur '#ib#do#ie#' verwenden.
+Beispiel:
+
+ ...
+ get (eingabe);
+ do (eingabe);
+ ...
+
+Findet der ELAN-Compiler bei der Übersetzung eines Textes der Prozedur 'do'
+einen Fehler, so wird dieser Fehler über 'errorstop' gemeldet (vergl. dazu
+auch das Kapitel über die Fehlerbehandlung im System-Handbuch) und die Über-
+setzung bei der ersten Fehlermeldung abgebrochen. In diesem Fall kann ein
+Nutzer den Fehler durch eine #ib#Fängerebene#ie# leicht selbst behandeln.
+
+Merke: Die Prozedur 'do' übersetzt (kleinere) ELAN-Programme von einem Pro-
+gramm aus.
+
+
+
+Kommandos zur Steuerung des ELAN-Compilers
+
+In diesem Abschnitt beschreiben wir die Kommandos für die Steuerung des
+ELAN-Compilers#ie#. Ebenso wie die Kommandos zur Übersetzung eines Programms
+müssen die Kommandos zur Steuerung des Compilers vom Monitor gegeben werden.
+
+Mit dem Kommando
+
+ prot ("datei name")
+
+wird das Listing des ELAN-Compilers eingeschaltet und in die angegebene
+Datei ausgegeben. Mit
+
+ prot off
+
+wird es wieder ausgeschaltet. 'prot off' ist voreingestellt.
+
+Normalerweise werden Zeilennummern des Quellprogramms im übersetzten Pro-
+gramm mitgeführt, so daß bei einem Fehler zusätzlich zur Fehlermeldung auch
+die Nummer der Zeile ausgegeben werden kann, in der der Fehler aufgetreten
+ist. Mit dem Kommando
+
+ check off
+
+kann die Generierung von Zeilenummern für das Objektprogramm abgeschaltet
+werden. Durch die Angabe dieses Kommandos wird weniger Code für das
+Programm erzeugt. Mit
+
+ check on
+
+wird die Generierung von Zeilennummern durch den Compiler wieder einge-
+schaltet. 'check on' ist voreingestellt. Mit der Prozedur
+
+ check
+
+die ein boolesches Resultat liefert, kann in einem Programm abgefragt werden,
+ob der 'check'-Zustand ein- oder ausgeschaltet ist. Beispiel:
+
+ IF check THEN check off FI
+
+Merke: Die Kommandos 'check on' bzw. 'check off' schalten das Einfügen von
+Zeilennummern in den erzeugten Code ein bzw. aus.
+
+
+
+3. Abweichungen gegenüber dem Sprachstandard
+
+Der im HRZ Bielefeld entwickelte ELAN-Compiler weist einige Abweichungen
+gegenüber dem Sprachstandard auf, wie er in der Sprachbeschreibung formu-
+liert ist. Es existieren einige Einschränkungen, die einen Programmierer
+jedoch nicht weiter behindern. Die Spracherweiterungen wurden meist speziell
+für das EUMEL-System geschaffen. Weitere Abweichungen gegenüber dem aktuellen
+Sprachstandard, die aber in der nächsten Sprachbeschreibung enthalten sein
+werden, sind in einem weiteren Abschnitt aufgeführt.
+
+
+
+Einschränkungen gegenüber dem Sprachstandard
+
+ * Das "row display" wurde nicht implementiert. Der Grund dafür liegt in
+ dem unverhältnismäßig hohen Aufwand, dieses Sprachmittel bei der gegen-
+ wärtigen Compiler-Struktur zu implementieren. Abhilfe: Man verwende den
+ Konstruktor. Beispiel:
+
+ ROW 5 INT VAR vektor;
+ vektor := [1, 2, 3, 4, 5]; (* nicht möglich *)
+ vektor := ROW 5 INT :(1, 2, 3, 4, 5); (* Ersatz: Konstruktor *)
+
+ * Einige alternative Darstellungen von Symbolen können nicht verwendet
+ werden. Diese sind:
+
+ "&"-Zeichen für "AND",
+ "/="-Zeichen für "<>",
+ "%"- und "//"-Zeichen für "DIV".
+
+ * Eine Typ-Definition muß einer Deklaration immer textuell vorangehen.
+ Beispiel:
+
+ TYPE QUADRAT = ... (* erlaubt *)
+ QUADRAT VAR rundes quadrat;
+ ...
+ PUNKT VAR meiner; (* verboten *)
+ TYPE PUNKT = ...
+
+ Es ist jedoch erlaubt, einen Typ in einer Typ-Definition zu verwenden,
+ der textuell erst später definiert wird. Beispiel:
+
+ TYPE PERSON = STRUCT (TEXT name, vorname, ADRESSE wohnort);
+ TYPE ADRESSE = ...
+
+ Diese Einschränkung ("defined before applied") gilt nur für Typen,
+ nicht für Datenobjekte u.ä.. Selbstverständlich ist
+
+ otto := 0;
+ INT VAR otto;
+ ...
+
+ erlaubt (aber kein besonders schöner Programmierstil)!
+
+ * Die Operatoren AND und OR können nicht redefiniert werden, sofern einer
+ ihrer Operanden vom Typ BOOL ist.
+
+
+
+Implementationsbedingte Einschränkungen
+
+ * Es sind bis zu 32 000 Zeichen in einem TEXT zugelassen. Hat ein TEXT
+ bis 13 Zeichen, so wird er vollständig auf dem Stack untergebracht.
+ TEXTe mit mehr als 13 Zeichen werden auf dem Heap gespeichert. Die
+ Benutzung des Heaps bedeutet unter Umständen eine Verlangsamung eines
+ Programms. Darum ist
+
+max text length = 32 000
+
+ * Die Anzahl der Zeichen in einem TEXT-Denoter (Angabe eines TEXTes in
+ einem Programm) ist auf 254 Zeichen beschränkt.
+
+ * INT-Werte werden in sechzehn Bit dargestellt (einschließlich Vor-
+ zeichen). Das bedeutet, daß
+
+ maxint = 32 767
+ minint = - 32 768
+
+ ist.
+
+ * REAL-Werte werden intern mit einer Mantisse von 13 Stellen abgespei-
+ chert, von denen die ersten sieben Stellen bei der Ausgabe dargestellt
+ werden. Das bedeutet, daß
+
+ maxreal = 9.999999999999e126
+
+ ist.
+
+ * Die lexikographische Reihenfolge von Zeichen entspricht dem ASCII-Code
+ (vergl. dazu die Code-Tabelle).
+
+ * Weiterhin sieht der ASCII-Code noch eine Anzahl von Steuerzeichen vor,
+ die jedoch von Herstellern leider nicht immer gleich interpretiert
+ werden. Diese Zeichen sind im EUMEL-System teilweise normiert und
+ können verwandt werden. Die verfügbaren Steuerzeichen sind ebenfalls im
+ EUMEL-Taschenbuch aufgeführt.
+
+ * Die Initialisierung von Paketen (genauer: die Initialisierung von
+ Datenobjekten, die in vorübersetzten PACKETs außerhalb von Prozeduren
+ deklariert wurden) wird nur einmal, während der Übersetzung, durchge-
+ führt. Werden mehrere Pakete hintereinander (aus einer Datei) übersetzt,
+ dürfen die Prozeduren 'run', 'run again', 'insert' und 'do', die wieder
+ den ELAN-Compiler aufrufen, nur bei der Ausführung des letzten Packets
+ verwandt werden, weil der ELAN-Compiler nicht rekursiv benutzbar ist.
+
+
+
+Erweiterungen gegenüber dem Standard
+
+ * Einem Datenobjekt, das an einen #ib#Datenraum#ie# gebunden werden soll,
+ wird bei der Deklaration das Schlüsselwort #ib#BOUND#ie# vorangestellt.
+ Damit wird dem ELAN-Compiler mitgeteilt, daß er für ein solches Objekt
+ keinen Speicherplatz reservieren muß. Die Assoziation mit einem Daten-
+ raum erfolgt bei der Deklaration mit Hilfe der Initialisierung.
+ Beispiel:
+
+ BOUND INT VAR objekt :: old ("hugo");
+ (* eine bereits errichtete Datei wird unter dem Namen "hugo" benutzt.
+ "objekt" ist jetzt an die Datei mit dem Namen "hugo" "gebunden" *)
+
+
+
+Vorweggenommene Implementation des nächsten Standards
+
+In diesem Abschnitt sind Erweiterungen/Einschränkungen des ELAN-Compilers
+hinsichtlich der aktuellen ELAN-Sprachbeschreibung aufgeführt, die in der
+nächsten Sprachbeschreibung mit aufgenommen werden.
+
+ * ASCII-Zeichen, die nicht unmittelbar dargestellt werden können, können
+ in TEXT-Denotern angegeben werden, sofern sie in Anführungszeichen
+ eingeschlossen werden. Beispiele:
+
+ ""13""
+
+ ist ein TEXT-Denoter, der nur CR (carriage return) enthält.
+
+ "Jetzt erfolgt ein Zeilenwechsel "13""10""
+
+ Hier wird nach der Ausgabe des Textes ein "Wagenrücklauf" ('CR',
+ Code = 13) und einen Zeilenvorschub ('LF', Code = 10) erzeugt.
+
+ ""1""4""
+
+ positioniert in die linke obere Ecke eines Bildschirms (Code = 1) und
+ löscht den Bildschirm (Code = 4).
+
+ * Im aktuellen Standard wurde die #ib#Reihenfolge der Auswertung von
+ Operanden#ie# nicht definiert. Nunmehr wird zusätzlich nicht garantiert,
+ daß alle Operanden ausgewertet werden, wenn dies nicht notwendig ist.
+ Beispiel:
+
+ IF f (x) > 0 AND x <> 0 THEN ... FI
+
+ Hier muß beispielsweise 'f (x)' nicht ausgewertet werden, wenn 'x = 0'
+ ist.
+
+ * Die booleschen Operatoren CAND und COR stehen zusätzlich zur Verfügung.
+ Wirkung:
+
+ a CAND b :<==> IF a THEN b ELSE FALSE FI
+
+ a COR b :<==> IF a THEN TRUE ELSE b FI
+
+ Beispiel:
+
+ IF element vorhanden
+ THEN verarbeite element
+ FI.
+
+ element vorhanden:
+ index > 0 CAND liste (index) > 0.
+
+ * Prozeduren als Parameter. Beispiel:
+
+ (* Deklaration: *)
+ PROC draw (REAL PROC (REAL CONST) funktion,
+ REAL CONST von, bis, delta)
+ (* Aufruf: *)
+ draw (REAL PROC (REAL CONST) sin, -pi, pi, 0.1)
+
+ Die obige Form von Prozedur-Parametern wird als "Langform" bezeichnet.
+ Die Langform muß verwandt werden, wenn generische aktuelle Parameter
+ benutzt werden. Eine "Kurzform" reicht aus, wenn der aktuelle Prozedur-
+ Parameter keine generischen Prozedur ist, d.h. eindeutig über den
+ Prozedurnamen (und nicht noch über die Datentypen seiner Parameter)
+ identifiziert werden kann. Die Kurzform unterscheidet sich von der
+ Langform nur beim Aufruf, bei dem eventuelle Resultate und die Daten-
+ typen der Parameter nicht mit angegeben werden müssen. Beispiel:
+
+ (* Aufruf obiger Prozedur bei nichtgenerischer aktueller Prozedur
+ 'sin' *)
+ draw (PROC sin, -pi, pi, 0.1)
+
+ * In Paketen sind auch außerhalb von Prozeduren Refinements zugelassen.
+ In solchen "Paket-Refinements" dürfen nur Paket-Objekte angesprochen
+ werden. Insbesondere ist es erlaubt, auch im letzten Paket ('main
+ packet') neben Prozeduren auch Refinements in beliebiger Reihenfolge zu
+ benutzen. Beispiel:
+
+ PROC kommando erkennung:
+ ...
+ END PROC kommando erkennung;
+
+ PROC kommando ausführung:
+ ...
+ END PROC kommando ausführung;
+
+ datei assoziieren;
+ saetze lesen und bearbeiten;
+ ende behandlung.
+
+ datei assoziieren:
+ FILE VAR f :: sequential file ...;
+ ...
+ saetze lesen und bearbeiten:
+ ...
+ ende behandlung:
+ put ("Ende der Bearbeitung").
+
+ Dies ist die Schreibweise, die wir empfehlen. Will man aber Refinements
+ auch zwischen Prozeduren deklarieren, wird es etwas komplizierter.
+ Beispiel:
+
+ PROC a:
+ END PROC a;
+ ref; (* Refinement Aufruf *)
+ PROC b:
+ END PROC b;
+ (* Achtung: Semikolon, Punkt vor dem Refinement *)
+ .ref: . ; (* Punkt, Semikolon nach dem Refinement *)
+ PROC c:
+ END PROC c
+
+ Paket-Refinements dürfen auch von Prozeduren benutzt werden, allerdings
+ sind dann auch die Sichtbarkeitsregeln zu beachten. D.h. die Paket-
+ Refinements, die in Prozeduren verwandt werden, dürfen dann auch nur
+ Paket-Objekte ansprechen. Die Aufnahme eines Refinements in das Inter-
+ face ist verboten.
+
+
+
+4. Interne Fehlermeldungen des Compilers
+
+Interne Fehlermeldungen des Compilers#ie# erfolgen, wenn der ELAN-Übersetzer
+an implementationsbedingte Einschränkungen stößt.
+
+ Interne Fehlermeldungen erfolgen in der Form:
+
+ COMPILER ERROR: <zahl>
+
+wobei <zahl> folgende Werte annehmen kann:
+
+<zahl> Bedeutung und eventuelle Abhilfe:
+
+ 101 name table overflow:
+ Die Anzahl der Namen im Programm ist zu groß oder es wurden die
+ Anführungstriche eines TEXT-Denoters vergessen. Keine Abhilfe.
+
+ 102 symbol table overflow:
+ Die Anzahl der deklarierten Objekte ist zu groß.
+ Abhilfe: Programm in Pakete unterteilen.
+
+ 103 intermediate string overflow:
+ Abhilfe: Programm in Pakete unterteilen.
+
+ 104 permanent table overflow
+ Zu viele Pakete insertiert.
+ Abhilfe: Keine (neue Task beginnen).
+
+ 106 packet address overflow:
+ Insgesamt zu viele Adressen in Paketen ( > 64K ), d.h. ein Daten-
+ objekt ist zu groß.
+ Keine Abhilfe.
+
+ 107 local data overflow:
+ Ein Datenobjekt in einer Prozedur ist zu groß ( > 32K ).
+ Abhilfe:
+ Datenobjekt in mehrere unterteilen.
+
+ 204 compiler stack overflow:
+ Keine Abhilfe.
+
+ 301 too many modules:
+ Zu viele Pakete, Prozeduren und Operatoren ( > 2048 ).
+ Keine Abhilfe.
+
+ 303 applied table overflow:
+ siehe 304
+
+ 304 too many labels:
+ In dem gerade übersetzten Modul (Prozedur, Operator oder Paket-
+ rumpf) werden vom Compiler zu viele Marken benötigt (mehr als
+ 2000). Marken werden z.B. für die Codegenerierung von Auswahl
+ (IF ...) und Wiederholung (REP ...) gebraucht. Insbesondere bei
+ SELECT-Anweisungen werden 'casemax - casemin + 2' Marken
+ benötigt, wobei 'casemax' der INT-Wert des maximalen, 'casemin'
+ der des minimalen CASE-Wertes ist. Dieser Fehler ist somit fast
+ immer auf zu viele und/oder zu weit gespannte SELECT-Anweisungen
+ zurückzuführen.
+ Abhilfe: SELECT-Anweisungen über mehrere Prozeduren verteilen oder
+ Spannweiten verringern.
+
+ 305 code overflow:
+ Der insgesamt erzeugte Code ist zu umfangreich ( > 256K ).
+ Keine Abhilfe.
+
+ 306 packet data overflow:
+ Insgesamt zu viele Datenobjekte in den Paketen ( > 128K ).
+ Keine Abhilfe.
+
+ 307 local data overflow:
+ Zu viele (lokale) Datenobjekte in einer Prozedur ( > 32K ).
+ Abhilfe: Prozedur in mehrere unterteilen, so daß die Datenobjekte
+ sich über mehrere Prozeduren verteilen.
+
+ 308 module code overflow:
+ Ein Modul (Prozedur, Operator oder Paket-Initialisierungsteil) ist
+ zu groß ( > 7.5 KB Code).
+ Abhilfe: In mehrere Prozeduren oder Pakete zerlegen.
+
+Anmerkung: Fehlermeldungen, die hier nicht aufgeführt sind, weisen in der
+Regel auf ein fehlerhaftes Arbeiten des ELAN-Compilers hin. In diesem Fall
+bitten wir um die Einsendung des Programms (Listing, Quelldatei auf Diskette
+bei umfangreichen Programmen) und entsprechender Fehlermeldung.
+
+
+
+5. Übersicht über die Compiler-Kommandos
+
+check
+ BOOL PROC check
+ Zweck: Informationsprozedur.
+
+ PROC check on
+ Zweck: Einschalten der Generierung von Zeilennummern durch den
+ ELAN-Compiler. Voreingestellt ist 'check on'.
+
+ PROC check off
+ Zweck: Ausschalten der Generierung von Zeilennummern durch den
+ ELAN-Compiler.
+
+do
+ PROC do (TEXT CONST program)
+ Zweck: Übersetzen und Ausführen von 'program' von einem Programm aus.
+
+insert
+ PROC insert
+ Zweck: Insertieren eines oder mehrerer PACKETs. Der Programmtext muß sich
+ in einer Datei befinden. Der Dateiname ist der zuletzt benutzte
+ Dateiname.
+
+ PROC insert (TEXT CONST dateiname)
+ Zweck: Wie oben. Der Programmtext wird aus der Datei mit dem Namen
+ 'dateiname' geholt.
+
+ PROC insert (THESAURUS CONST t)
+ Zweck: Insertieren aller PACKETs, die in den Dateien des Thesaurus 't'
+ enthalten sind.
+
+prot
+ BOOL PROC prot
+ Zweck: Informationsprozedur, ob 'prot' eingeschaltet ist.
+
+ PROC prot (TEXT CONST dateiname)
+ Zweck: Einschalten des Compilerlistings auf dem Bildschirm. Das Listing
+ wird gleichzeitig in die Datei 'dateiname' geschrieben.
+
+prot off
+ PROC prot off
+ Zweck: Ausschalten des Listings.
+
+run
+ PROC run
+ Zweck: Übersetzen und Ausführen eines ELAN-Programms. Der Programmtext
+ muß sich in einer Datei befinden. Der Dateiname ist der zuletzt
+ benutzte Dateiname.
+
+ PROC run (TEXT CONST dateiname)
+ Zweck: Wie oben. Der Programmtext wird aus der Datei mit dem Namen
+ 'dateiname' geholt.
+
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6a b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6a
new file mode 100644
index 0000000..1ee80ec
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6a
@@ -0,0 +1,1590 @@
+ EUMEL-Benutzerhandbuch
+
+
+ TEIL 6: Erste Hilfe in ELAN
+
+
+Vorwort
+
+Dieser Teil des EUMEL-Handbuchs ist keine "Einführung in die Programmierung
+mit ELAN", sondern ist als Begleitmaterial für einen ELAN-Kurs gedacht.
+Zudem beschreibt das Skript nicht die vollständige Sprache; dafür ist die
+Sprachbeschreibung und das Handbuch vorgesehen. Folgende ELAN-Bücher sind
+z.Zt. erhältlich:
+
+Klingen / Liedtke:
+Programmieren mit ELAN
+Teubner, Stuttgart, 1982
+
+Jähnichen u.a.:
+Systematisches Programmieren mit ELAN
+W. de Gruyter, 1982
+
+Wir haben in dieses Skript auch einige Aufgaben mit aufgenommen, die An-
+fänger auf jeden Fall lösen sollten. Die Aufgaben dienen aber nur dazu, das
+erlernte Wissen über ELAN zu überprüfen und sind keine eigentlichen Program-
+mieraufgaben, die es im begleitenden Kurs geben sollte. Es gibt zwei Arten
+von Aufgaben:
+
+a) HSG (Hätten Sie's gewußt?): Aufgaben, die das bis dahin Gelernte über-
+ prüfen sollen.
+b) TSW (Trau', Schau', wem!): Aufgaben mit Programmen, die Fehler enthalten
+ können. Alle Programme dieses Skripts sind übrigens von der Art TSW.
+
+Es ist auch sinnvoll und notwendig, möglichst viele Programme dieses Skripts
+direkt auf dem Terminal zu probieren und zu verändern. Auf diese Weise wird
+ein Anfänger auch mit den Fehlermeldungen des ELAN-Compilers vertraut.
+
+
+
+Das erste Programm
+
+Gleich am Anfang einer Programmierlaufbahn haben Anfänger eine schwierige
+Hürde zu nehmen: das erste Programm "zum Laufen" zu bringen. Das wird einem
+Anfänger meist nicht leicht gemacht: schließlich hat er mit dem Betriebs-
+system eines Computers zu kämpfen. Ein #ib#Betriebssystem#ie# sorgt u.a. für
+die Steuerung so unterschiedlicher Peripheriegeräte wie Drucker, Lochkarten-
+leser, Magnetplatten und -bänder usw. Zusätzlich hat es dafür Sorge zu
+tragen, daß Informationen sicher gespeichert werden und nicht unbeabsichtigt
+verändert werden können. Letztendlich hat ein Betriebsystem die Aufgabe, die
+Aufträge von Benutzern ("jobs") - und das können mehrere auf einmal sein -
+sicher und effizient bearbeiten zu lassen. Um mit einem Betriebsystem
+"sprechen" zu können, ist meist eine eigene Sprache vorhanden, die Kommando-
+sprache ("job control language", abgekürzt: JCL).
+
+Eine Kommandosprache kann - auf Grund der vielfältigen Aufgaben, die mit
+ihrer Hilfe formuliert werden müssen - mehr oder weniger kompliziert sein.
+Zusätzlich sind Kommandosprachen sehr unterschiedlich: aus leicht einsichti-
+gen Gründen wollen sich Hersteller nicht auf eine Kommandosprache einigen.
+Deshalb können wir die Anweisungen in einer speziellen Kommandosprache hier
+nicht angeben; man erfragt diese am besten. Auf jeden Fall muß etwas getan
+werden, um ein Programm auf einem Rechner "zum Laufen" zu bringen.
+
+Wie bereits erwähnt, beschränken wir uns hier auf die eigentlichen Programme.
+Um den Mechanismus mit den Anweisungen an das Betriebsystem von Anfang
+an kennen zu lernen, denken wir uns ein sehr einfaches Programm aus, das wir
+bearbeiten lassen wollen.
+
+Programm 1:
+
+ put ("Hallo: mein erstes Programm")
+
+Dieses Programm muß nun dem Rechner zur Bearbeitung übergeben werden.
+Auch hier treffen wir auf Unterschiede bei den verschiedenen Rechensystemen:
+bei einigen Rechnern muß ein solches Programm (mit Anweisungen der
+Kommandosprache) auf Lochkarten übertragen werden, bei anderen dagegen
+tippt man das Programm direkt an einem Sichtgerät ("Terminal") ein. Die
+Ausgabe erfolgt dann über einen Schnelldrucker oder auch über das Sichtgerät.
+Um von Geräten bestimmter Installationen zu abstrahieren, nennen wir im
+folgenden das Eingabemedium #ib#Eingabegerät#ie# und das Gerät, auf dem die
+Resultate erscheinen, dementsprechend Ausgabegerät.
+
+Aufgabe (TSW):
+
+ Versuchen Sie, Programm 1 auf dem Rechner Ihrer Installation zu "rechnen".
+Übungsziel: Umgang mit dem Betriebsystem
+
+
+Das Ergebnis unseres ersten Programms ist nun das Erscheinen des Textes:
+'Hallo: mein erstes Programm'. Was ist hier passiert? Da ein Rechner ein
+ELAN-Programm meist nicht direkt ausführen kann, muß es in eine Form
+gebracht werden, die der Rechner "versteht". Diese Form ist wiederum eine
+(sehr andersartige und - für Menschen - nicht leicht verständliche) Sprache,
+die Maschinensprache. Man muß also ein ELAN-Programm übersetzen. Dies wird
+von einem Programm (und nicht etwa einer festverdrahteten Schaltung) vorge-
+nommen, einem Übersetzer. Eine bestimmte Art von Übersetzer heißt Compiler;
+er übersetzt ein Programm als Ganzes (im Gegensatz zu einem Interpreter, der
+nur einzelne Anweisungen übersetzt und anschließend ausführt). Darum sind
+bei ELAN-Programmen, die meist durch Compiler übersetzt ("kompiliert")
+werden, zwei Phasen zu unterscheiden:
+
+a) Übersetzungsphase:
+
+ In dieser Phase wird ein ELAN-Programm (man spricht von Quellprogramm
+ bzw. "source program") in ein äquivalentes Maschinenprogramm (Objektpro-
+ gramm) transformiert. Dabei überprüft der Übersetzer das Quellprogramm
+ auf eventuelle Fehler (Anweisungen, die nicht der ELAN-Sprachbeschreibung
+ entsprechen). Bei solchen Fehlern, die ein Compiler entdecken kann,
+ spricht man von syntaktischen Fehlern oder von Fehlern zur Übersetzungs-
+ zeit.
+
+b) Bearbeitungsphase:
+
+ In dieser Phase ("run time") wird das übersetzte (Maschinen-) Programm
+ abgearbeitet. Auch hier können Fehler auftreten (z.B. wenn auf einen Wert
+ vom Programm zugegriffen wird, der noch gar nicht berechnet wurde).
+ Solche Fehler nennt man Laufzeitfehler.
+
+Haben wir das erste Programm so geschrieben, wie oben angegeben, dürften
+keine Fehler entdeckt werden und das Programm wird (hoffentlich korrekt, d.h.
+mit den geforderten Ergebnissen) beendet. Was für ein Programm haben wir nun
+geschrieben bzw. was haben wir vom Rechner verlangt?
+
+Das Wort 'put' bezeichnet eine Prozedur. Eine Prozedur ist ein Algorithmus
+(hier mit Parametern): eine bestimmte Sammlung von Anweisungen und unter
+Umständen Daten. Eine solche Prozedur können wir in einem Programm unter
+einem Namen (nämlich 'put') ansprechen und ausführen lassen. Man spricht
+dann von dem Aufruf einer Prozedur, wenn ein Prozedurname geschrieben wird.
+Von einer Prozedur brauchen wir nur zu wissen, was die Prozedur macht, aber
+gottseidank nicht, wie sie es macht.
+
+Eine Prozedur wie 'put' ist vorgefertigt und einfach benutzbar, wobei wir
+später sehen werden, wie man solche Prozeduren selber schreiben kann. Die
+Prozedur 'put' hat einen Parameter, nämlich den in Klammern geschriebenen
+Text, der auf dem Ausgabegerät ausgegeben werden soll. Wir können eine
+solche Prozedur auch mit anderen Parametern versehen und mehrmals aufrufen:
+
+Programm 2:
+
+ put ("Programm:");
+ put (2)
+
+Mit dem zweiten Programm ist es uns gelungen, ein Programm mit zwei Anwei-
+sungen zu schreiben (dabei ist der Parameter bei dem ersten Aufruf der
+'put'-Prozedur ein Text, beim zweiten Parameter eine ganze Zahl).
+
+ELAN ist eine formatfreie Sprache, d.h. Anweisungen können so auf eine Zeile
+verteilt werden, wie es uns gefällt und zweckmäßig erscheint.
+
+Programm 3:
+
+ put ("mein"); put (3); put (".Programm")
+
+Man kann also eine oder mehrere Anweisungen auf eine Zeile schreiben oder
+eine Anweisung über mehrere Zeilen. Das setzt jedoch voraus, daß die Anwei-
+sungen voneinander getrennt werden (schließlich muß der Übersetzer erkennen
+können, wo eine Anweisung anfängt und aufhört). Das ist besonders notwendig,
+weil man in Namen in ELAN beliebig Leerzeichen zur besseren Lesbarkeit
+verwenden kann.
+
+
+Programm 4:
+
+ p u t ( "aha");
+ put ("aha")
+
+Beide Anweisungen bewirken also das Gleiche.
+
+Die Trennung von Anweisungen erfolgt in ELAN durch das Trennsymbol
+Semikolon. Es bedeutet soviel wie: "führe die nächste Anweisung aus". Aus
+diesem Grund darf hinter der letzten Anweisung eines Programms kein Semiko-
+lon geschrieben werden (es folgt ja auch keine Anweisung mehr).
+
+Der Aufruf einer Prozedur (wie z.B. 'put') verlangt von unserem Rechner im-
+mer eine Leistung. Wollen wir aber in einem Programm eine Bemerkung schrei-
+ben (z.B. um uns etwas zu merken), dann können wir einen Kommentar schrei-
+ben, der vom Übersetzer überlesen und somit keinen Einfluß auf die Aus-
+führung eines Programms hat. Ein Kommentar in ELAN wird durch die Zeichen
+(* und *) eingeschlossen und darf über mehrere Zeilen gehen. Kommentare sind
+in ELAN aber nur in wenigen Fällen notwendig, weil wir Programme durch
+andere Mittel gut lesbar machen können.
+
+
+
+Ziel der Programmierung
+
+Was wollen wir eigentlich mit dem Programmieren von Computern erreichen?
+Häufig wiederkehrende und somit oft langweilige Tätigkeiten oder solche, die
+besonders schnell erledigt werden müssen, sollen von dem "Werkzeug Computer
+erledigt werden. Gehaltsberechnungen, Unterstützung beim Schreiben von
+Texten, Katalogsysteme für Bibliotheken, Steuerung von Walzstraßen usw. sind
+typische Aufgaben für Computer.
+
+Bei der Programmierung wird also versucht, Objekte (wie z.B. Geld bei einer
+Gehaltsberechnung) und Prozesse (wie z.B. die Simulation von Wirtschaftsab-
+läufen) der realen Welt mit Hilfe von Programmen in einem Computer nachzu-
+bilden und nach bestimmten Vorstellungen so zu verändern, daß man "brauch-
+bare" Ergebnisse erlangt. In einem Programm sind Befehle an einen Rechner
+für eine solche Abbildung enthalten. Die Befehle in einem Programm werden
+Anweisungen genannt. Ein Programmierer muß also folgendes tun:
+
+1. Abbilden von Objekten und Prozessen der realen Welt in ein Programm.
+ Dabei müssen die Bedingungen der Aufgabe beachtet werden. Was das Pro-
+ gramm Programm leisten soll, wird darum in einer Spezifikation festgelegt.
+
+2. Einbringen des Programms in einen Rechner und Bearbeitung desselben. Die
+ Formulierung von Anweisungen in einem Programm erfolgt in einer bestimmten
+ Sprache, nämlich einer Programmiersprache.
+
+3. Interpretation der Ergebnisse.
+
+
+
+Das Konzept des Datentyps
+
+Befassen wir uns vorerst nur mit Objekten. Sicherlich gibt es sehr viele Ob-
+jekte in unserer Welt. Einige von ihnen haben aber gleiche Eigenschaften:
+
+- Fahrzeuge (Autos, Mofas, Dreiräder) bringen uns von Ort A nach Ort B.
+
+- Geld (Münzen, Geldscheine, Murmeln, Franc, DM) erlaubt es, etwas zu kaufen.
+
+- Schreibgeräte (Bleistift, Kugelschreiber, Schreibmaschine) sind die Werk-
+ zeuge von Leuten, die etwas zu schreiben haben.
+
+- ...
+
+Es ist also möglich, einige Objekte der realen Welt in Klassen zusammenzu-
+fassen. Eine solche Zusammenfassung kann hinsichtlich gleicher Eigenschaften
+bzw. gleicher Operationen, die für solche Objekte zugelassen sind, erfolgen.
+Eine Klasse von Objekten mit gleichen Eigenschaften wird in Programmier-
+sprachen Datentyp genannt. Dabei hat ein Datentyp immer einen Namen, der die
+Klasse von Objekten sinnvoll kennzeichnet. Als ein Datenobjekt wird ein
+Exemplar eines Datentyps (also ein spez. Objekt einer Klasse) bezeichnet.
+
+Datentypen sind in ELAN ein zentrales Konzept. Jedes der in einem ELAN-
+Programm verwandten Datenobjekte hat einen Datentyp; somit kann man Daten-
+typen auch als Eigenschaften von Datenobjekten ansehen. Für jeden Datentyp
+sind nur spezielle Operationen sinnvoll. Z.B. sind für einen Datentyp
+"UBoot" die Operationen "erstellen", "tauchen", "auftauchen", "versenken"
+und "lieber nicht verwenden" sinnvoll, aber nicht die Operation "+" wie bei
+ganzen Zahlen. Man kann nun Übersetzern die Aufgabe überlassen zu überprüfen,
+ob stets die richtige Operation auf einen Datentyp angewandt wird.
+
+Aufgabe (HSG):
+
+ Was ist ein Datentyp? Welche Funktion erfüllen Datentypen?
+Übungsziel: Datentyp-Konzept
+
+Einige Datentypen spielen bei der Programmierung eine besondere Rolle, weil
+sie häufig benötigt werden. In ELAN sind das die Datentypen für
+
+- ganze Zahlen. Dieser Datentyp wird INT (für "integer") genannt.
+
+- reelle Zahlen (REAL).
+
+- Zeichen und Zeichenfolgen (TEXT).
+
+- Wahrheitswerte (BOOL).
+
+Diese Typen werden in ELAN elementare Datentypen genannt. Für effiziente
+Rechnungen mit elementaren Datentypen gibt es in den meisten Rechnern
+spezielle Schaltungen, so daß die Hervorhebung und besondere Rolle, die
+sie in Programmiersprachen spielen, gerechtfertigt ist. Zudem hat man
+Werte-Darstellungen innerhalb von Programmen für die elementaren Datentypen
+vorgesehen, was wir im nächsten Abschnitt erklären wollen.
+
+Im weiteren Teil dieses Skripts werden wir uns zunächst auf die Behandlung
+der elementaren Datentypen beschränken. Das bedeutet für den Programmierer,
+daß er alle Objekte der realen Welt mit Hilfe der elementaren Datentypen in
+den Computer abbilden muß. Das kann manchmal sehr schwierig sein (wie bilden
+wir z.B. Personen oder UBoote mit den elementaren Datentypen ab?). Später
+werden wir dann Möglichkeiten kennenlernen, neue - problemgerechte -
+Datentypen in ELAN zu formulieren.
+
+
+
+Denoter (Werte-Repräsentationen) elementarer Datentypen
+
+Wenn wir mit Objekten elementarer Datentypen arbeiten, müssen wir die
+Möglichkeit haben, Werte in ein Programm zu schreiben. Leider kann man einen
+Wert "an sich" in einem Programm nicht direkt angeben. Schreiben wir z.B.
+4711, dann meinen wir zwar einen INT-Wert, haben aber die Ziffern 4, 7, 1 und
+1 geschrieben. Der eigentliche Wert wird in unserem Kopf oder - für unsere
+Zwecke - in einem Rechner gebildet.
+
+Die Werte-Darstellungen oder Werte-Repräsentationen, die in ELAN "Denoter"
+genannt werden, sind für jeden Datentyp unterschiedlich. Wie bereits erwähnt,
+haben alle Datenobjekte in ELAN (also auch Denoter) nur einen - vom Über­
+setzer feststellbaren - Datentyp. Aus der Form eines Denoters ist also der
+Datentyp erkennbar:
+
+- INT-Denoter:
+ Bestehen aus einer Aneinanderreihung von Ziffern. Beispiele:
+
+ 17, 007, 32767, 0
+
+ Führende Nullen spielen bei der Bildung des Wertes keine Rolle (sie werden
+ vom ELAN-Compiler überlesen). Negative INT-Denoter gibt es nicht (wie
+ negative Werte-Darstellungen in einem Programm geschrieben werden, lernen
+ wir bei den Ausdrücken).
+
+- REAL-Denoter:
+ Hier gibt es zwei Formen. Die erste besteht aus zwei INT-Denotern, die
+ durch einen Dezimalpunkt getrennt werden. Beispiele:
+
+ 0.314159, 17.28
+
+ Der Dezimalpunkt wird analog der deutschen Schreibweise als Komma
+ verwendet. Negative REAL-Denoter gibt es wiederum nicht.
+
+ Eine zweite Form wird kurioserweise als "wissenschaftliche Notation" be-
+ zeichnet. Sie findet dann Verwendung, wenn sehr große oder Zahlen, die
+ nahe bei Null liegen, dargestellt werden müssen. Beispiele:
+
+ 3.0 e5, 3.0e-5
+
+ Der (INT-) Denoter hinter dem Buchstaben e gibt an, wie viele Stellen der
+ Dezimalpunkt nach rechts (positive Werte) oder nach links zu verschieben
+ ist. Dieser Wert wird Exponent, der Teil vor dem Buchstaben e Mantisse
+ genannt.
+
+- TEXT-Denoter:
+ TEXT-Denoter werden in Anführungszeichen eingeschlossen. Beispiele:
+
+ "Das ist ein TEXT-Denoter"
+ "Jetzt ein Text-Denoter ohne ein Zeichen: ein leerer Text"
+ ""
+
+ Beachte, daß das Leerzeichen ebenfalls ein Zeichen ist. Soll ein An-
+ führungszeichen in einem TEXT erscheinen (also gerade das Zeichen, welches
+ einen TEXT-Denoter beendet), so muß es doppelt geschrieben werden:
+
+ "Ein TEXT mit dem ""-Zeichen"
+ "Ein TEXT-Denoter nur mit dem ""-Zeichen:"
+ """"
+
+ Manchmal sollen Zeichen in einem TEXT-Denoter enthalten sein, die auf dem
+ Eingabegerät nicht zur Verfügung stehen. In diesem Fall kann der Code-
+ Wert des Zeichens angegeben werden:
+
+ ""32""
+
+ bedeutet z.B. das (ASCII-) Leerzeichen. Der Code-Wert eines Zeichens er-
+ gibt sich aus einer Code-Tabelle (installationsspezifisch), in der jedem
+ Zeichen eine ganze Zahl zugeordnet ist.
+
+- BOOL-Denoter:
+ Es gibt nur zwei BOOL-Denoter: TRUE (für "wahr") und FALSE (für "falsch").
+
+Nun wird auch klar, was für Parameter wir in den obigen Programmen verwandt
+haben. Es waren natürlich TEXT- bzw. INT-Denoter.
+
+
+Aufgabe (TSW):
+
+ Welche der folgenden Denotationen ist falsch?
+
+ a) 1. e) 1 . 0 i) 007
+ b) -1 f) "" j) "Ein "Getuem" stellt sich vor"
+ c) """ g) """"
+ d) "das ist ein text" h) TRUE k) 1.0 e 37
+
+Übungsziel: Lernen von Denotationen
+
+
+
+ELAN-Datenobjekte
+
+Wie bereits erwähnt, wollen wir mit Hilfe von Programmen Datenobjekte so
+verändern, daß wir erwünschte Ergebnisse erhalten. Meist wird zu dieser Ver-
+änderung von Datenobjekten "Rechnen" gesagt, obwohl - wie wir gleich sehen
+werden - nicht nur numerische Objekte manipuliert werden. Die Veränderung
+der Datenobjekte findet zur "Laufzeit" (nicht zur Übersetzungszeit) im
+Rechner statt. Die Darstellung eines Werts in einem Rechner zur Laufzeit
+eines Programms wird #ib#Repräsentation#ie# genannt. Wenn es eindeutig ist,
+daß es sich nur um die Repräsentation im Rechner handelt, sprechen wir kurz
+von Werten.
+Da also ein Datenobjekt wechselnde Werte annehmen kann, brauchen wir eine
+Möglichkeit, es in einem Programm anzusprechen, egal welchen Wert das Objekt
+zu einem Zeitpunkt beinhaltet. Zu diesem Zweck können wir einem Datenobjekt
+einen Namen geben (wie z.B. einen Personennamen, hinter dem sich eine wirk­
+liche Person "verbirgt"). Wenn wir also den Namen des Datenobjekts in ein
+Programm schreiben, dann meinen wir (meist) den Wert des Datenobjekts, den
+es zu diesem Zeitpunkt besitzt.
+
+Nun sollen die zu behandelnden Datenobjekte ja auch neue Werte erhalten. In
+diesem Fall müssen wir die Speicherstelle finden, in die der neue Wert ge-
+bracht werden soll. Für diesen Zweck benutzen wir ebenfalls den Namen, zu-
+sätzlich zu der Angabe einer Operation, durch die das Objekt einen neuen
+Wert erhalten soll. Diese Operation (Wert "schreiben") nennen wir Zuweisung.
+Der Zuweisungs-Befehl wird ':=' geschrieben. Beispiel:
+
+ a := 5
+
+Bedeutet, daß das Datenobjekt mit dem Namen 'a' den Wert '5' erhält.
+
+Von manchen Datenobjekten wissen wir, daß wir ihnen nur einmal einen Wert
+geben wollen. Sie sollen also nicht verändert werden. Oder wir wissen, daß
+in einem Programmbereich ein Datenobjekt nicht verändert werden soll. Um ein
+unbeabsichtigtes Verändern zu verhindern, wird in ELAN dem Namen eines
+Datenobjekts ein zusätzlicher Schutz mitgegeben: das Zugriffsrecht oder
+Accessrecht. Es besteht aus der Angabe der Worte VAR (für Lesen und Ver-
+ändern) oder CONST (für ausschließliches Lesen).
+
+
+
+Die Deklaration (Vereinbarung) von Datenobjekten
+
+Wollen wir ein Datenobjekt in einem Programm verwenden, so müssen wir dem
+Übersetzer mitteilen, welchen Datentyp und welches Accessrecht das Objekt
+haben soll. Das dient u.a. dazu, nicht vereinbarte Namen (z.B. verschriebene)
+vom Übersetzer entdecken zu lassen. Weiterhin ist aus dem bei der Deklaration
+angegebenen Datentyp zu entnehmen, wieviel Speicherplatz für das Objekt zur
+Laufzeit zu reservieren ist. Beispiel:
+
+INT VAR mein datenobjekt
+
+Zuerst wird der Datentyp, dann das Accessrecht und schließlich der Name des
+Datenobjekts angegeben. Wie werden nun Namen in ELAN formuliert?
+
+Das erste Zeichen eines Namens muß immer ein kleiner Buchstabe sein. Danach
+dürfen beliebig viele kleine Buchstaben, aber auch Ziffern folgen. Zur bes-
+seren Lesbarkeit können (wie bei den obigen Prozedurnamen) Leerzeichen in
+einem Namen erscheinen, die aber nicht zum Namen zählen. Beispiele:
+
+ name1
+ n a m e 1
+ x27
+ gehalts konto
+ das ist ein langer name
+
+Verschiedene Datenobjekte mit gleichem Datentyp und Accessrecht dürfen in
+einer Deklaration angegeben werden (durch Kommata trennen). Mehrere Dekla-
+rationen werden - genauso wie Anweisungen - durch das Trennsymbol
+voneinander getrennt. Beispiele:
+
+ INT VAR mein wert, dein wert, unser wert;
+ BOOL VAR listen ende;
+ TEXT VAR zeile, wort
+
+
+
+Die Initialisierung von Datenobjekten
+
+Um mit den so vereinbarten Datenobjekten arbeiten zu können, muß man ihnen
+eine Wert geben. Hat ein Datenobjekt noch keinen Wert erhalten, so sagt man,
+sein Wert sei undefiniert. Das versehentliche Arbeiten mit undefinierten
+Werten ist eine beliebte Fehlerquelle. Deshalb wird von Programmierern
+streng darauf geachtet, diese Fehlerquelle zu vermeiden. Eine Wertgebung an
+ein Datenobjekt kann (muß aber nicht) bereits bei der Deklaration erfolgen,
+was man in ELAN Initialisierung nennt. Beispiele:
+
+ INT CONST gewuenschtes gehalt :: 12 000;
+ TEXT VAR zeile :: "";
+ REAL CONST pi :: 3.14159;
+ BOOL VAR bereits sortiert :: TRUE
+
+Allerdings: für mit CONST vereinbarte Datenobjekte ist die Initialisierung
+die einzige Möglichkeit, ihnen einen Wert zu geben.
+
+Die Initialisierung erfolgt mit Hilfe des '::'-Symbols. Anschließend folgt
+der Wert, den das Datenobjekt erhalten soll. (In den Beispielen haben wir
+nur Denoter geschrieben. Es sind aber auch allgemeinere Ausdrücke erlaubt.).
+Es ist nun möglich, mit der oben erwähnten 'put'-Prozedur auch den Wert von
+Datenobjekten ausgeben zu lassen.
+
+
+Programm 5:
+
+ INT VAR nummer :: 5;
+ TEXT CONST bemerkung :: ".Programm";
+ put (nummer);
+ put (bemerkung)
+
+Beachte dabei, daß bei der Aufführung eines Namens in diesem Fall immer der
+Wert des Datenobjekts gemeint ist. Auch die 'put'-Prozedur druckt nicht etwa
+den Namen des Datenobjekts oder die Adresse der Speicherstelle, sondern
+ebenfalls den Wert.
+
+
+Aufgabe (HSG):
+
+ Welche Aufgabe erfüllen Deklarationen? Was heißt: "Eine Variable hat
+ einen undefinierten Wert"? Was ist eine Initialisierung? Was ist ein
+ CONST-Datenobjekt? Warum müssen CONST-Datenobjekte initialisiert
+ werden?
+Übungsziel: Verständnis von Deklarationen und Accessrecht
+
+
+
+Schlüsselworte
+
+Einige Worte haben in ELAN eine feste Bedeutung und können somit nicht -
+wie etwa Namen - frei gewählt werden. Solche Worte werden bei den meisten
+ELAN-Übersetzern mit großen Buchstaben geschrieben, wie z.B. VAR, CONST,
+INT oder REAL u.a.m. Wie wir später sehen werden, besteht die Möglichkeit,
+neue Schlüsselworte einzuführen. Halten wir vorläufig fest, daß feste
+Bestandteile der Sprache (wie z.B. CONST oder VAR) und Datentypen (wie INT
+oder REAL) Schlüsselworte sind, also mit großen Buchstaben geschrieben
+werden.
+
+
+
+Ausdrücke
+
+Nun wäre es natürlich schlecht, wenn Programmierer nicht mehr machen könnten,
+als Werte ausgeben. Als erste Stufe von etwas komplexeren "Rechnungen"
+dürfen Ausdrücke gebildet werden. Ausdrücke sind eine Zusammenstellung von
+Datenobjekten (Denoter, VAR- oder CONST-Objekte) und Operatoren. Schauen wir
+uns dazu erst ein Programm an:
+
+
+Programm 6:
+
+ INT CONST wert 1 :: 1,
+ wert 2 :: 2,
+ wert 3 :: 3;
+
+ put (wert1 + wert2);
+ put (wert2 - wert1);
+ put (wert2 * wert3);
+ put (wert3 DIV wert2);
+ put (wert2 ** wert3)
+
+In diesem Programm werden drei Datenobjekte initialisiert. Anschließend
+werden jeweils die Werte von zwei Objekten addiert (Operatorzeichen: '+'),
+subtrahiert ('-'), multipliziert ('*'), dividiert (ganzzahlige Division ohne
+Rest: 'DIV') und potenziert ('**'). Dies sind Operatoren, die zwei Operanden
+haben: man nennt sie dyadische Operatoren. Die monadischen Operatoren da-
+gegen haben nur einen Operanden. Beispiel:
+
+ put ( - wert1)
+
+Operatoren in ELAN werden - wie wir an den obigen Beispielen sehen - durch
+ein oder zwei spezielle Zeichen oder durch große Buchstaben (in den Fällen,
+in denen kein "vernünftiges" Zeichen mehr zur Verfügung steht) als Schlüssel-
+wort dargestellt.
+
+Als Operanden (also die Datenobjekte, auf die ein Operator "wirken" soll)
+eines Operators darf ein VAR- oder CONST-Datenobjekt, aber auch ein Denoter
+verwendet werden. Das Resultat eines Operators (also das Ergebnis einer
+Berechnung) ist bei den obigen Ausdrücken wieder vom Datentyp INT mit dem
+Accessrecht CONST. Darum ist es erlaubt, solch einen Ausdruck wiederum als
+Operanden zu verwenden. Praktisch bedeutet dies, daß wir mehrere Operatoren
+und Datenobjekte zusammen in einem Ausdruck haben dürfen.
+
+
+Programm 7:
+
+ INT CONST wert 1 :: 1,
+ wert 2 :: 2,
+ wert 3 :: 3;
+
+ put (wert2 + 3 - wert2 * wert3);
+ put (- wert2 * wert3)
+
+Nun haben wir eine Schwierigkeit: Der Ausdruck in der ersten 'put'-Anweisung
+ist mehrdeutig, d.h. kann - je nach Reihenfolge der Auswertung - unter-
+schiedliche Ergebnisse als Resultat liefern. Beispiel:
+
+ a) (wert2 + 3 = 5) - (wert2 * wert3 = 6) = -1
+ b) ((wert2 + 3 = 5) - wert2 = 3) * 3 = 9
+
+Es kommt also auf die Reihenfolge der Auswertung von Operatoren an. Diese
+kann man durch die Angabe von Klammern steuern. Beispiel:
+
+ (a + b) * (a + b)
+
+Es wird jeweils erst 'a + b' ausgewertet und dann erst die Multiplikation
+durchgeführt. In ELAN ist es erlaubt, beliebig viel Klammernpaare zu ver-
+wenden (Regel: die innerste Klammer wird zuerst ausgeführt). Es ist sogar
+zulässig, Klammern zu verwenden, wo keine notwendig sind, denn überflüssige
+Klammernpaare werden überlesen. Beispiel:
+
+ ((a - b)) * 3 * ((c + d) * (c - d))
+
+Somit können wir beliebig komplizierte Ausdrücke formulieren. (Was man aber
+vermeiden sollte, weil sie leicht zu Fehlern führen. Stattdessen kann man
+einen komplizierten Ausdrücke in mehrere (einfachere) zerlegen.)
+
+Um solche Ausdrücke einfacher zu behandeln und sie so ähnlich schreiben zu
+können, wie man es in der Mathematik gewohnt ist, wird in Programmiersprachen
+die Reihenfolge der Auswertung von Operatoren festgelegt. In ELAN wurden
+neun Ebenen, Prioritäten genannt, festgelegt:
+
+
+Priorität Operatoren
+
+ 9 alle monadischen Operatoren
+ 8 **
+ 7 *, /, DIV, MOD
+ 6 +, -
+ 5 =, <>, <, <=, >, >=
+ 4 AND
+ 3 OR
+ 2 alle übrigen, nicht in dieser Tabelle aufgeführten
+ dyadischen Operatoren
+ 1 :=
+
+
+(Die bis jetzt noch nicht erwähnten Operatoren in der Tabelle werden wir in
+den weiteren Abschnitten besprechen.)
+
+Operatoren mit der höchsten Priorität werden zuerst ausgeführt, dann die mit
+der nächst höheren Priorität usw. Operatoren mit gleicher Priorität werden
+von links nach rechts ausgeführt. Dadurch ergibt sich die gewohnte Abarbei-
+tungsfolge wie beim Rechnen. Beispiel:
+
+ -2 + 3 * 2 ** 3
+
+ a) -2
+ b) 2 ** 3
+ c) 3 * (2 ** 3)
+ d) ((-2)) + (3 * (2 ** 3))
+
+Wie bereits erwähnt, ist es immer erlaubt, Klammern zu setzen. Ist man sich
+also über die genaue Abarbeitungsfolge nicht im Klaren, so kann man Klammern
+verwenden.
+
+
+Aufgabe (HSG):
+
+ Welche INT-Werte ergeben sich?
+
+ a) 14 DIV 4 e) -14 DIV -4
+ b) + 14 DIV 4 f) 2 * 3 DIV 2 ** 2 * 4
+ c) -14 DIV 4 g) 2 ** 3 ** 4
+ d) 14 DIV -4 h) 3 + 4 * 2 + 3
+
+Übungsziel: Arithmetische Ausdrücke
+
+
+Aufgabe (HSG):
+
+ Bilden Sie für folgende mathematische Formeln entsprechende ELAN-
+ Ausdrücke:
+
+ a b a+b
+ a) - c d) a g) - ---
+ b c
+
+
+ a+b b a c
+ b) --- e) -a h) - * -
+ c+d b d
+
+
+ a+b -b c
+ c) --- e f) a i) (a*b)
+ c+d
+
+Übungsziel: Arithmetische Ausdrücke formulieren
+
+
+
+Generische Operatoren und Prozeduren
+
+Bis jetzt wurden nur Ausdrücke mit INT-Operanden verwendet. Wie sieht es
+jetzt mit REALs aus?
+
+
+Programm 8:
+
+ put (1.0 + 2.0);
+ put (2.0 - 1.0);
+ put (2.0 * 3.0);
+ put (3.0 / 2.0);
+ put (2.0 ** 3.0)
+
+Man beachte die Unterschiede zum Programm 7: Wir müssen nun REAL-Denoter
+verwenden (mit INT-Denotern zu arbeiten wäre ein Fehler). Der Divisions-
+Operator hat sich nun von 'DIV' zu '/' gewandelt. Die Ergebnisse sind nun
+nicht INT-, sondern REAL-Werte. Für die Reihenfolge der Auswertung der
+Operatoren sowie die Verwendung von Klammern gilt das für INT-Ausdrücke
+gesagte.
+
+Wir haben den '+'-Operator in zwei verschiedenen Formen gesehen: in Programm
+7 mit Operanden vom Datentyp INT, ein INT-Resultat liefernd, und in Programm
+8 das gleiche mit REALs. Es liegen also zwei verschiedene Operatoren vor,
+die aber den gleichen Namen (Zeichen: '+') haben.
+
+In ELAN ist es somit möglich, unterschiedlichen Operatoren (aber auch Proze-
+duren) gleiche Namen zu geben. Solche Operatoren werden generische Opera-
+toren genannt. Ein ELAN-Compiler wählt den richtigen Operator aufgrund der
+Datentypen der Operanden aus. Oft werden die verfügbaren Operatoren wie folgt
+dokumentiert:
+
+ INT OP + (INT CONST links, rechts)
+
+Diese Form nennt man einen "Operator-Kopf". Sie wird in ELAN-Programmen bei
+der Definition von Operatoren benötigt. Dabei steht OP für "OPERATOR". Die
+Angabe des Datentyps davor gibt den Datentyp des Resultats des Operators an.
+Zwischen 'OP' und der öffnenden Klammer steht der Name des Operators (hier:
+'+'). In den Klammern werden die Datentypen und das Accessrecht der
+Operanden angegeben. CONST bedeutet hier: der Operand darf vom Operator
+nicht verändert werden, während bei VAR (was normalerweise ja nicht sein
+sollte!) ein Operand bei der Abarbeitung eines Operators verändert werden
+kann.
+
+Damit wir solche Definitionen besser beherrschen, geben wir noch weitere
+Beispiele an:
+
+ INT OP - (INT CONST operand)
+ REAL OP / (INT CONST l, r)
+
+Bei dem ersten Operator handelt es sich um den monadischen Operator '-' für
+INT-Operanden (z.B.: 'INT VAR a :: 1; put (-a)'), während es sich bei dem
+zweiten Operator um eine Divisions-Operator handelt, der jedoch ein REAL-
+Resultat liefert (z.B.: 'put (3 / 2)' liefert 1.5). Der MOD-Operator liefert
+den Rest einer Division:
+
+ INT OP MOD (INT CONST l, r)
+ REAL OP MOD (REAL CONST l, r)
+
+Die Beschreibung von generischen Prozeduren verläuft analog. Beispiele:
+
+ PROC put (INT CONST wert)
+ PROC put (REAL CONST wert)
+
+Hier wird das Wort 'OP' durch 'PROC' (für 'PROCEDURE') ersetzt. Die Angaben
+in Klammern bezeichnen nun nicht Operanden, sondern Parameter.
+
+Über die verfügbaren Operatoren und Prozeduren für INT- und REAL-Datenob-
+jekte kann man sich im ELAN-Handbuch oder im EUMEL-Benutzerhandbuch infor-
+mieren. Einige - aber nicht alle - der Operatoren und Prozeduren (auch für
+andere Datentypen) werden wir erklären, wenn wir sie in Programmen benötigen.
+
+
+
+Die Zuweisung
+
+Ein spezieller Operator ist die Zuweisung (Zeichen: ':='). Dieser Operator
+hat immer die geringste Priorität, wird also immer als letzter eines Aus-
+drucks ausgeführt. Die Zuweisung wird verwendet, um einer Variablen einen
+neuen Wert zu geben. Beispiel:
+
+ a := b
+
+Hier wird der Wert von 'b' der Variablen 'a' zugewiesen. Der vorher vor-
+handene Wert von 'a' geht dabei verloren. Man sagt auch, der Wert wird über-
+schrieben. Auf der rechten Seite (also als rechter Operand) des ':='
+Operators darf auch ein Ausdruck stehen. Beispiel:
+
+ a := b + c
+
+Hier wird das Resultat von 'b + c' an die Variable 'a' zugewiesen. Man be-
+achte dabei die Prioritäten der Operatoren '+' (Priorität 6) und ':=' (Pri-
+orität 1): die Addition wird vor der Zuweisung ausgeführt. Die Auswertung
+von Zuweisungen mit Ausdrücken muß immer so verlaufen, da die Zuweisung
+stets die niedrigste Priorität aller Operatoren hat.
+
+Schauen wir uns zum besseren Verständnis die Definitionen des (natürlich
+auch generischen) Operators ':=' an:
+
+ OP := (INT VAR ziel, INT CONST quelle)
+ OP := (REAL VAR ziel, REAL CONST quelle)
+ OP := (TEXT VAR ziel, TEXT CONST quelle)
+ OP := (BOOL VAR ziel, BOOL CONST quelle)
+
+Der Operator ':=' liefert also kein Resultat (man sagt auch, er liefert
+keinen Wert) und verlangt als linken Operanden ein VAR-Datenobjekt (an den
+der Wert der rechten Seite zugewiesen werden soll). Der Wert des linken
+Operanden wird also verändert. Für den rechten Operanden ist durch CONST
+sichergestellt, daß er nur gelesen wird.
+
+Oft kommt es vor, daß ein Objekt auf der linken und rechten Seite des Zuwei-
+sungsoperators erscheint, z.B. wenn ein Wert erhöht werden soll. Beispiele:
+
+ a := a + 1;
+ a := a + 17
+
+Hier wird der "alte", aktuelle Wert von 'a' genommen, um '1' erhöht und dem
+Objekt 'a' zugewiesen. Man beachte, daß hier in einer Anweisung ein Datenob-
+jekt unterschiedliche Werte zu unterschiedlichen Zeitpunkten haben kann.
+
+In solchen Fällen darf man den Operator INCR verwenden:
+
+ a INCR 1;
+ a INCR 17
+
+Analoges gilt für den Operator DECR, bei dem ein Wert von einer Variable
+subtrahiert wird. Also:
+
+ OP INCR (INT VAR ziel, INT CONST dazu)
+ OP INCR (REAL VAR ziel, REAL CONST dazu)
+
+ OP DECR (INT VAR ziel, INT CONST abzug)
+ OP DECR (REAL VAR ziel, REAL CONST abzug)
+
+Schauen wir uns folgendes Programm an, bei dem zwei Werte vertauscht werden:
+
+
+Programm 9:
+
+ INT VAR a, b, x;
+
+ get (a);
+ get (b);
+ x := a;
+ a := b;
+ b := x;
+ put (a);
+ put (b)
+
+Wie wir an diesem Beispiel sehen, existieren nicht nur 'put'-Prozeduren,
+sondern auch 'get'-Prozeduren, die einen Wert vom Eingabemedium einlesen.
+Es gibt folgende 'get'- Prozeduren (die 'put'-Prozeduren führen wir der
+Vollständigkeit halber auch mit auf):
+
+ PROC get (INT VAR wert)
+ PROC get (REAL VAR wert)
+ PROC get (TEXT VAR wert)
+
+ PROC put (INT CONST wert)
+ PROC put (REAL CONST wert)
+ PROC put (TEXT CONST wert)
+
+
+Aufgabe (HSG):
+
+ Was versteht man unter Generizität?
+ Übungsziel: Generizitäts-Begriff
+
+
+
+Refinements
+
+Bevor wir die Operationen für TEXTe und BOOLs besprechen, wollen wir eine
+weitere wichtige Eigenschaft von ELAN diskutieren, nämlich die Namensgebung.
+Namen für Datenobjekte haben wir bereits kennengelernt. In ELAN ist es eben-
+falls möglich, Namen für Ausdrücke oder eine bzw. mehrere Anweisungen zu
+vergeben.
+
+
+Programm 10:
+
+ INT VAR a, b, x;
+ einlesen von a und b;
+ vertauschen von a und b;
+ vertauschte werte ausgeben.
+
+ einlesen von a und b:
+ get (a);
+ get (b).
+
+ vertauschen von a und b:
+ x := a;
+ a := b;
+ b := x.
+
+ vertauschte werte ausgeben:
+ put (a);
+ put (b).
+
+Dies ist das gleiche Programm wie das 9. Beispielprogramm. Für den Namen
+'einlesen von a und b' werden die Anweisungen 'get (a); get (b)' vom
+ELAN-Übersetzer eingesetzt. Man kann also die ersten vier Zeilen des
+Programms als eigentliches Programm ansehen, wobei die Namen durch die
+betreffenden Anweisungen ersetzt werden. Eine solche Konstruktion wird in
+ELAN Refinement genannt. Was wird dadurch erreicht?
+
+Durch die sinnvolle Verwendung von Refinements wird ein Programm im Programm
+und nicht in einer separaten Beschreibung dokumentiert. Weiterhin kann ein
+Programm "von oben nach unten" ("top down") entwickelt werden: wir haben das
+obige - zugegeben einfache - Beispielprogramm in drei Teile zerlegt und
+diese durch Namen beschrieben. Bei der Beschreibung von Aktionen durch Namen
+sagen wir, was wir machen wollen und nicht wie, denn wir brauchen uns auf
+dieser Stufe der Programmentwicklung um die Realisierung der Refinements
+(noch) keine Sorgen zu machen. Das erfolgt erst, wenn wir genauer definieren
+müssen, wie das Refinement programmiert werden muß. Dabei können wir
+wiederum Refinements verwenden usw., bis wir auf eine Ebene "herunterge-
+stiegen" sind, bei dem eine (jetzt: Teil-) Problemlösung sehr einfach ist
+und wir sie direkt hinschreiben können. Wir beschäftigen uns also an jedem
+Punkt der Problemlösung nur mit einem Teilaspekt des gesamten Problems.
+Zudem sieht man - wenn die Refinements einigermaßen vernünftig verwendet
+werden - dem Programm an, wie die Problemlösung entstanden ist.
+
+Die Verwendung von Refinements hat also eine Anzahl von Vorteilen. Schauen
+wir uns deshalb an, wie die Refinements formal verwandt werden müssen. Das
+"Hauptprogramm" wird durch einen Punkt abgeschlossen, falls ein Refinement
+folgt. Ein Refinement besteht aus der Nennung des Refinement-Namens, der
+von einem Doppelpunkt gefolgt sein muß. In einem Refinement kann eine
+Anweisung oder mehrere - durch Semikolon getrennt - stehen. Das Refinement
+wird durch einen Punkt abgeschlossen.
+
+Refinements können auch dort verwendet werden, wo ein Wert erwartet wird,
+z.B. in einem Ausdruck oder einer 'put'-Anweisung. In diesem Fall muß das
+Refinement natürlich einen Wert liefern. Wie macht man das? Eine Möglichkeit
+ist, daß im Refinement ein Ausdruck geschrieben wird, der einen Wert als
+Resultat liefert.
+
+
+Programm 11:
+
+ INT VAR a :: 1, b :: 2, c :: 3;
+ put (resultat).
+
+ resultat:
+ (a * b + c) ** 3.
+
+Eine Zuweisung liefert - wie bereits erwähnt - kein Resultat. Es ist auch
+erlaubt, ein Refinement mit mehreren Anweisungen zu schreiben, das einen Wert
+liefert. Allgemeine Regel: die letzte Anweisung eines Refinements bestimmt,
+ob ein Refinement einen Wert liefert - und wenn ja, von welchen Datentyp.
+
+
+
+BOOLesche Operationen
+
+Für BOOLesche Datenobjekte gibt es einige Operatoren:
+
+ BOOL OP AND (BOOL CONST links, rechts)
+ BOOL OP OR (BOOL CONST links, rechts)
+ BOOL OP NOT (BOOL CONST operand)
+
+Der Operator AND liefert als Resultat die logische "und"-Verknüpfung (nur
+wenn beide Operanden den Wert TRUE haben ist das Resultat TRUE, sonst FALSE),
+OR ist das logische "oder" (nur wenn beide Operanden FALSE liefern, ist das
+Resultat FALSE, sonst TRUE) und die logische Negation NOT (als Resultat wird
+das "Gegenteil" geliefert).
+
+Ebenfalls wichtig sind die Vergleichs-Operatoren, die zwar keine BOOLeschen
+Operanden erwarten, aber ein BOOLesches Resultat liefern:
+
+ BOOL OP = (INT CONST links, rechts)
+ BOOL OP <> (INT CONST links, rechts)
+ BOOL OP < (INT CONST links, rechts)
+ BOOL OP <= (INT CONST links, rechts)
+ BOOL OP > (INT CONST links, rechts)
+ BOOL OP >= (INT CONST links, rechts)
+
+Diese Operatoren: = (gleich), <> (ungleich), < (kleiner), <= (kleiner
+gleich), > (größer), >= (größer gleich) gibt es auch noch für Operanden vom
+Datentyp REAL und TEXT. Da die Vergleichs-Operatoren ein BOOLesches Resultat
+liefern, kann man sie in BOOLeschen Ausdrücken verwenden. Zu beachten ist
+dabei die Priorität der Operatoren: die Vergleiche werden immer vor den
+Operatoren AND bzw. OR ausgeführt.
+
+
+Programm 12:
+
+ BOOL CONST kaufen;
+ kaufen := will ich AND NOT zu teuer.
+
+ will ich:
+ TEXT VAR produktname;
+ get (produktname);
+ produktname = "muesli" OR produktname = "vollkornbrot".
+
+ zu teuer:
+ INT VAR preis;
+ get (preis);
+ preis > 20.
+
+
+
+Aufgabe (HSG):
+
+ Welche BOOL-Werte ergeben sich?
+
+ a) TRUE AND FALSE e) TRUE AND TRUE OR TRUE
+ b) TRUE OR FALSE f) 10 < 3 AND 17 > 4
+ c) TRUE AND NOT FALSE g) 17 + 4 = 21 OR TRUE
+ d) NOT TRUE AND FALSE h) TRUE AND FALSE OR TRUE
+
+ Übungsziel: Boolesche Ausdrücke
+
+
+
+Abfragen
+
+BOOLesche Ausdrücke werden in einer speziellen Anweisung verwandt, der
+Abfrage:
+
+
+Programm 13:
+
+ INT VAR a, b;
+ get (a); get (b);
+ IF a > b
+ THEN vertausche a und b
+ END IF;
+ put (a); put (b).
+
+ vertausche a und b:
+ INT CONST x :: a;
+ a := b;
+ b := x.
+
+Das Refinement im THEN-Teil der bedingten Anweisung wird nur durchgeführt,
+wenn der BOOLesche Ausdruck ('a > b') den Wert TRUE liefert. Liefert er den
+Wert FALSE, wird die Anweisung, die der bedingten Anweisung folgt (nach END
+IF), ausgeführt. Programm 13 kann etwas anders geschrieben werden:
+
+
+Programm 14:
+
+ INT VAR a, b;
+ get (a); get (b);
+ IF a > b
+ THEN put (a);
+ put (b)
+ ELSE put (b);
+ put (a)
+ END IF.
+
+Der THEN-Teil wird wiederum ausgeführt, wenn die BOOLesche Bedingung
+erfüllt ist. Liefert sie dagegen FALSE, wird der ELSE-Teil ausgeführt.
+
+Die bedingte Anweisung gibt uns also die Möglichkeit, abhängig von einer
+Bedingung eine oder mehrere Anweisungen ausführen zu lassen. Dabei können
+im THEN- bzw. ELSE-Teil wiederum bedingte Anweisungen enthalten sein usw.
+Solche geschachtelten bedingten Anweisungen sollte man jedoch vermeiden,
+weil sie leicht zu Fehlern führen können (statt dessen durch Refinements
+realisieren). Man beachte auch die Einrückungen, die man machen sollte, um
+die "Zweige" besonders kenntlich zu machen.
+
+
+Aufgabe (HSG):
+
+ a) In welcher Reihenfolge werden Operatoren ausgewertet?
+ b) Reihenfolge der Auswertung von: a + b + c
+ c) INT VAR a, b, c;
+ ...
+ IF NOT a = 0 AND b = 0 THEN...
+ ergibt einen syntaktischen Fehler. Welchen?
+ d) Wie wird der BOOLesche Ausdruck ausgewertet?
+ INT VAR a :: 0, b :: 4;
+ ...
+ IF a = 0 AND b DIV a > 0
+ e) Warum ist
+ BOOL VAR ende :: TRUE;
+ ...
+ IF ende = TRUE
+ THEN...
+ Unsinn?
+
+ Übungsziel: Reihenfolge der Auswertung von Ausdrücken
+
+Bei Abfrageketten kann das ELIF-Konstrukt eingesetzt werden. (ELIF ist eine
+Zusammenziehung der Worte ELSE und IF). Anstatt
+
+ ...
+ IF bedingung1
+ THEN aktion1
+ ELSE IF bedingung2
+ THEN aktion2
+ ELSE aktion3
+ END IF
+ END IF;
+ ...
+
+kann man besser
+
+ ...
+ IF bedingung1
+ THEN aktion1
+ ELIF bedingung2
+ THEN aktion2
+ ELSE aktion3 END IF;
+ ...
+
+schreiben.
+
+Die bedingte Anweisung kann auch einen Wert liefern. In diesem Fall muß der
+ELSE-Teil vorhanden sein und jeder Zweig den gleichen Datentyp liefern
+(jeweils die letzte Anweisung muß einen Wert liefern).
+
+
+Aufgabe (HSG):
+
+ Was berechnen folgende (Teil-) Programme?
+
+ a) INT VAR a;
+ get (a);
+ put (wert).
+
+ wert:
+ IF a < 0
+ THEN -a
+ ELSE a
+ END IF.
+
+ b) INT VAR brutto, netto;
+ get (brutto);
+ berechne gehalt;
+ put ("mein gehalt:");
+ put (netto).
+
+ berechne gehalt:
+ IF jahresverdienst > 30 000 (* zu wenig? *)
+ THEN sonderabgabe
+ END IF;
+ netto := brutto - brutto DIV 100 * 20.
+
+ jahresverdienst:
+ brutto * 12.
+
+ sonderabgabe:
+ brutto := brutto - brutto DIV 100 * 30
+
+ c) INT VAR x;
+ ...
+ put (signum).
+
+ signum:
+ IF x > 0
+ THEN 1
+ ELSE kleiner gleich
+ END IF.
+
+ kleiner gleich:
+ IF x = 0
+ THEN 0
+ ELSE -1
+ END IF.
+
+
+
+TEXTe
+
+TEXT-Denoter haben wir bereits kennengelernt. Im folgenden Programm stellen
+wir die Wirkung einiger TEXT-Operationen vor.
+
+
+Programm 15:
+
+ TEXT VAR a, b, c;
+ a := "ELAN";
+ b := "-Programm";
+ c := a + b;
+ put (c)
+
+Der Operator
+
+ TEXT OP + (TEXT CONST links, rechts)
+
+liefert als Ergebnis einen TEXT, bei dem an den linken der rechte Operand
+angefügt wurde (Fachausdruck: "Konkatenation"). Weitere Operatoren:
+
+ TEXT OP CAT (TEXT VAR ziel, TEXT CONST dazu)
+ TEXT OP * (INT CONST i, TEXT CONST a)
+ TEXT OP SUB (TEXT CONST t, INT CONST pos)
+
+Der Operator CAT fügt an einen TEXT einen zweiten an ('a CAT b' wirkt wie
+'a := a + b'). Mit dem '*'-Operator kann man einen TEXT vervielfältigen
+(Beispiel: 17 * "--"), während man mit SUB ein Zeichen aus einem TEXT her-
+ausholen kann (Beispiel: "ELAN" SUB 3 liefert "A").
+
+Die meisten TEXT-Operationen sind als Prozeduren realisiert, weil mehr als
+zwei Operanden benötigt werden. Die Wirkung einiger Operationen geben wir in
+kurzen Kommentaren an:
+
+ TEXT PROC subtext (TEXT CONST t, INT CONST von)
+ (* rechter Teiltext von 't' von der Position 'von' bis Ende *)
+
+ TEXT PROC subtext (TEXT CONST t, INT CONST von, bis)
+ (* Teiltext von 't' von der Position 'von' bis 'bis' *)
+
+ PROC change (TEXT VAR t, TEXT CONST old, new)
+ (* Ersetzung von 'old' in 'new' im TEXT 't' *)
+
+ INT PROC length (TEXT CONST t)
+ (* Anzahl Zeichen von 't' *)
+
+ INT PROC pos (TEXT CONST t, muster)
+ (* Die Position des ersten Auftretens von 'muster' in 't' *)
+
+Die Vergleichs-Operatoren für TEXTe arbeiten bei dem Vergleich nach der
+alphabetischen Reihenfolge ('"a" < "b"' liefert TRUE). Dabei definiert ELAN
+nur die Reihenfolge innerhalb der kleinen und großen Buchstaben und Ziffern.
+Das Leerzeichen ("#ib#blank#ie#") ist jedoch stets das "kleinste" Zeichen.
+Wie diese "Zeichenblöcke" und die restlichen Zeichen angeordnet sind, wurde
+nicht spezifiziert. Ob '"a" < "Z"' TRUE oder FALSE liefert, wurde also nicht
+festgelegt und ist somit rechnerspezifisch. Anmerkung: Im EUMEL-Betriebs-
+system wird der ASCII-Zeichencode, DIN 66 003 mit Erweiterungen verwandt.
+Die folgenden Vergleiche sind alle TRUE:
+
+ "otto" = "otto"
+ "a" < "z"
+ "Adam" < "Eva"
+ "hallo" < "hallu"
+ "hallo" < "hallo "
+ length ("ha") = 2
+ subtext ("ELAN-Programmierung", 14) = "ierung"
+
+
+Aufgabe (HSG):
+
+ Gib die Realisierung von folgenden vorgegebenen Prozeduren und Opera-
+ toren an:
+ a) TEXT PROC subtext (TEXT CONST t, INT CONST von) durch
+ TEXT PROC subtext (TEXT CONST t, INT CONST von, bis)
+ b) OP CAT (TEXT VAR a, TEXT CONST b) durch ':=' und '+'
+ c) TEXT OP SUB (TEXT CONST t, INT CONST p) durch 'subtext'
+
+ Übungsziel: Lernen einiger vorgegebener TEXT-Operationen
+
+
+
+Die Wiederholungs-Anweisung
+
+Wiederholungs-Anweisungen ermöglichen es uns, Anweisungen wiederholt - meist
+in Abhängigkeit von einer Bedingung - ausführen zu lassen. Darum wird die
+Wiederholungs-Anweisung oft auch #ib#Schleife#ie# genannt, die in ihr ent-
+haltenen Anweisungen #ib#Schleifenrumpf#ie#. Die Schleife von ELAN baut auf
+einem Basis-Konstrukt auf:
+
+ REP
+ anweisungen
+ END REP
+
+Diese Anweisungsfolge realisiert eine sogenannte "Endlosschleife", weil nicht
+spezifiziert wird, wann die Schleife beendet werden soll.
+
+Bei der abweisenden Schleife wird die Abbruchbedingung an den Anfang der
+Schleife geschrieben:
+
+ WHILE boolesche bedingung REP
+ anweisungen
+ END REP
+
+Bei jedem erneuten Durchlauf durch die Schleife wird überprüft, ob der
+BOOLesche Ausdruck den Wert TRUE liefert. Ist das nicht der Fall, wird mit
+der nächsten, auf die Schleife folgenden Anweisung mit der Bearbeitung fort-
+gefahren. Die Schleife wird abweisende Schleife genannt, weil der Schleifen-
+rumpf nicht ausgeführt wird, wenn die Bedingung vor Eintritt in die Schleife
+bereits FALSE liefert.
+
+Anders verhält es bei der nicht abweisenden Schleife:
+
+ REP
+ anweisungen
+ UNTIL boolesche Bedingung END REP
+
+Hier wird der Schleifenrumpf auf jeden Fall einmal bearbeitet. Am Ende des
+Rumpfes wird die BOOLesche Bedingung abgefragt. Liefert diese den Wert FALSE,
+wird die Schleife erneut abgearbeitet. Liefert die Bedingung den Wert TRUE,
+wird die Schleife abgebrochen und mit der ersten Anweisung hinter der
+Schleife in der Bearbeitung fortgefahren.
+
+Bei beiden Arten der Wiederholungs-Anweisung ist es wichtig, daß Elemente
+der BOOLeschen Bedingung in der Schleife verändert werden, damit das
+Programm terminieren kann, d.h. die Schleife abgebrochen wird.
+
+Eine Endlos-Schleife wird bei der Zählschleife meist nicht vorkommen:
+
+ FOR i FROM anfangswert UPTO endwert REP
+ anweisungen
+ END REP
+
+Zählschleifen werden eingesetzt, wenn die genaue Anzahl der Schleifendurch-
+läufe bekannt ist. Hier wird eine Laufvariable verwendet (in unserem Bei-
+spiel 'i': sie muß mit INT VAR deklariert werden), die die INT-Werte von
+'anfangswert' bis 'endwert' in Schritten von '1' durchläuft. Diese Schleife
+zählt "aufwärts". Wird anstatt UPTO das Schlüsselwort DOWNTO verwendet, wird
+mit Schritten von -1 "abwärts" gezählt. Beispiel:
+
+ FOR i FROM endwert DOWNTO anfangswert REP
+ ...
+
+Für ein Beispielprogramm stellen wir uns die Aufgabe, aus TEXTen das Auf-
+treten des Buchstabens "e" herauszufinden. Die TEXTe sollen vom Eingabe-
+medium solange eingelesen werden, bis wir den TEXT "00" eingeben.
+
+
+Programm 16:
+
+ INT VAR anzahl e :: 0;
+ TEXT VAR wort;
+ REP
+ get (wort);
+ zaehle e im wort
+ UNTIL wort = "00" END REP;
+ put (anzahl e).
+
+ zaehle e im wort:
+ INT VAR i;
+ FOR i FROM 1 UPTO length (wort) REP
+ IF das i te zeichen ist e
+ THEN anzahl e INCR 1
+ END IF
+ END REP.
+
+ das i te zeichen ist e:
+ (wort SUB i) = "e".
+
+
+Aufgabe (HSG):
+
+ Die Klammern in dem letzten Refinement sind notwendig. Warum?
+
+Bevor wir ein Programm einem Rechner zur Bearbeitung übergeben, sollten wir
+uns davon überzeugen, daß das Programm wirklich das leistet, was es soll.
+Eine der wichtigsten Bedingungen ist die Terminierung eines Programms, d.h.
+das Programm darf nicht in eine Endlosschleife geraten. Unser Beispielpro-
+gramm terminiert, wenn beide Schleifen terminieren: die obere Schleife
+terminiert durch das Endekriterium, während die zweite Schleife automatisch
+durch die Zählschleife begrenzt wird. Das Programm wird also auf jeden Fall
+beendet (kann in keine Endlosschleife geraten), falls das Endekriterium ein-
+gegeben wird.
+Interessant sind dabei immer "Grenzfälle", wie z.B. die Eingabe eines
+"leeren Textes", sehr lange TEXTe usw.
+
+
+Aufgabe (HSG):
+
+ Welche Fehler befinden sich in den folgenden Programmteilen?
+ a) INT VAR i;
+ FOR i FROM 1 UPTO i REP
+ tue irgendwas
+ END REP
+
+ b) BOOL CONST noch werte :: TRUE;
+ INT VAR i;
+ WHILE noch werte REP
+ get (i);
+ ...
+ IF i = O
+ THEN noch werte := FALSE
+ END IF
+ END REP
+
+ c) INT VAR anz berechnungen :: 1;
+ REP
+ lies eingabe wert;
+ berechnung;
+ drucke ausgabewert
+ UNTIL anz berechnungen > 10 END REP.
+
+ d) INT VAR anz berechnungen;
+ WHILE anz berechnungen <= 10 REP
+ lies eingabewert;
+ berechnung;
+ drucke ausgabewert;
+ anz berechnungen INCR 1
+ END REP.
+
+ e) INT VAR n := 1, summe;
+ summe der ersten 100 zahlen.
+
+ summe der ersten 100 zahlen:
+ WHILE n < 100 REP
+ summe := summe + n;
+ n INCR 1
+ END REP.
+ (* Achtung: 2 Fehler! (Vorwarnen ist feige) *)
+
+ f) INT VAR n := 1;
+ REP
+ INT VAR summe := 0;
+ summe := summe + n;
+ n INCR 1
+ UNTIL n = 100 END REP
+ (* Achtung: 2 Fehler! *)
+
+ Übungsziel: Arbeiten mit Schleifen
+
+
+Das Programm 16 können wir etwas besser formulieren. Dazu wollen wir uns
+aber eine etwas andere Aufgabe stellen: wie viele Leerzeichen sind in einem
+Text? Zur Lösung dieser Aufgabe sollten wir den Text nicht wortweise ein-
+lesen, sondern zeilenweise. Dazu verwenden wir die Prozedur
+
+ PROC get (TEXT VAR t, INT CONST max length)
+
+die einen TEXT 't' mit maximal 'max length' Zeichen einliest. Auf dem
+EUMEL-System gibt es dafür auch die Prozedur 'getline'.
+
+
+Programm 17:
+
+ INT VAR anzahl blanks :: 0;
+ REP
+ lies zeile ein;
+ zaehle blanks
+ UNTIL zeile hat endekriterium END REP.
+
+ lies zeile ein:
+ TEXT VAR zeile;
+ get (zeile, 80).
+
+ zaehle blanks:
+ INT VAR von :: 1;
+ WHILE zeile hat ab von ein blank REP
+ anzahl blanks INCR 1;
+ von auf blank position setzen
+ END REP.
+
+ zeile hat ab von ein blank:
+ pos (zeile, " ", von) > 0.
+
+ von auf blank position setzen:
+ von := pos (zeile, " ", von).
+
+ zeile hat endekriterium:
+ pos (zeile, "00") > 0.
+
+
+Aufgabe (TSW):
+
+ Das Programm 17 enthält (mindestens) zwei Fehler. Finden Sie diese bitte
+ heraus.
+
+ Übungsziel: Finden von Programmierfehlern.
+
+
+Aufgabe (HSG):
+
+ a) Welche Werte liefern folgende Ausdrücke für die Textvariable
+ TEXT VAR t :: "Das ist mein Text"
+ a1) pos (t, "ist")
+ a2) pos (t, "ist", 5)
+ a3) length (t)
+ a4) subtext (t, 14)
+ a5) subtext (t, 14, 17)
+
+ b) Welche Werte liefern folgende Ausdrücke für die Textkonstanten
+ TEXT CONST text :: "ELAN-Programm",
+ alphabet :: "abcde...xyz"
+ b1) 3 * text
+ b2) length ("mein" + text + 3 * "ha")
+ b3) 3 * "ha" < text
+ b4) pos (text, alphabet SUB 1)
+ b5) pos (text, subtext (alphabet, 7, 7))
+
+ c) Schreibe in anderer Form:
+ c1) subtext (text, 7, 7)
+ c2) change (text, "alt", "neu")
+ c3) INT VAR laenge :: length (text);
+ IF subtext (text, laenge, laenge) =...
+ c4) IF NOT (text = "aha")
+ THEN aktion 1
+ ELSE aktion 2
+ END IF
+
+ Übungsziel: TEXT-Ausdrücke und Prozeduren
+
+
+
+Die Repräsentation von Datentypen
+
+Wie bereits erwähnt, sind Datentypen Klassen von Objekten der realen Umwelt.
+Die Objekte eines Datentyps müssen in den Speicher eines Rechners abgebildet
+werden. Die Darstellung eines Objekts im Rechner wird Repräsentation genannt.
+Aus organisatorischen Gründen versucht man, immer feste, gleich große Ein-
+heiten für die Objekte eines Datentyps zu verwenden. Durch die Begrenzung auf
+feste Speicherplatzeinheiten ist der Wertebereich beschränkt. Diese Grenzen
+hat man beim Programmieren zu beachten.
+
+Beim Datentyp BOOL spielt die Repräsentation nur insoweit eine Rolle, daß
+man die zwei möglichen Werte mehr oder weniger speicheraufwendig realisieren
+kann. Eine Einschränkung des Wertebereichs gibt es nicht.
+
+Bei INTs ist jedoch eine Einschränkung des Wertebereichs gegeben. Für die
+Repräsentation von INTs sind Einheiten von 16, 32 Bit u.a.m. gebräuchlich.
+Es existiert die Möglichkeit, den größten INT-Wert mit Hilfe von
+
+ maxint
+
+zu erfragen. Z.B. ist 'maxint' für EUMEL-Systeme z.Zt. 32 767. Der kleinste
+INT-Wert ist oft nicht ' - maxint' (im EUMEL-System kann er unter 'minint'
+angesprochen werden). Übersteigt ein Wert 'maxint', gibt es eine Fehler-
+meldung 'overflow', im andern Fall 'underflow'.
+
+REALs sind noch schwieriger. Durch die endliche Darstellung der Mantisse
+treten "Lücken" zwischen zwei benachbarten REALs auf. Deshalb ist bei Ver-
+wendung von REALs immer mit Repräsentationsfehlern zu rechnen. Dieses Thema
+der "Rundungsfehler" wollen wir hier jedoch nicht weiter vertiefen. Auf
+jeden Fall gibt es aber auch einen größten REAL-Wert
+
+ maxreal
+
+Bei TEXTen gibt es zwei Repräsentations-Schwierigkeiten. Einerseits werden
+TEXTe durch "irgendeinen" Code im Rechner repräsentiert, der z.B. bei Ver-
+gleichen verwendet wird. ELAN-Compiler auf Rechenanlagen mit unterschied-
+lichen Zeichencodes können daher unterschiedliche Ergebnisse liefern.
+Andererseits ist in ELAN nicht definiert, wie viele Zeichen maximal in einen
+TEXT passen, was ebenfalls vom Rechner bzw. von einem ELAN-Compiler abhängt.
+Auf dem EUMEL-System kann die maximale Anzahl Zeichen eines TEXTs durch
+'maxtext length' erfragt werden. Sie ist z.Z. '32 000'.
+
+
+
+Ein- und Ausgabe
+
+Wie Datenobjekte - auf einfache Weise - auf einem Ausgabemedium ausgegeben
+werden können, haben wir bereits geschildert (Prozedur 'put'). Die Ausgabe
+erfolgt solange auf einer Zeile, bis ein auszugebender Wert nicht mehr auf
+eine Zeile paßt. In diesem Fall wird die Ausgabe in die nächste Zeile pla-
+ziert. Zwischen den einzelnen Werten auf einer Zeile wird jeweils ein Blank
+Zwischenraum gelassen, um die Ausgaben voneinander zu trennen. Mit folgenden
+Prozeduren kann man die Ausgabe flexibel gestalten:
+
+ PROC line (* bewirkt einen Zeilenvorschub *)
+
+ PROC line (INT CONST anzahl) (* bewirkt 'anzahl' Zeilenvorschübe *)
+
+ PROC page (* bewirkt einen Seitenvorschub auf
+ einem Drucker oder löscht den Bild-
+ schirm und positioniert in die linke
+ obere Ecke *)
+
+ PROC putline (TEXT CONST zeile) (* gibt 'zeile' auf dem Bildschirm aus
+ und positioniert auf die nächste
+ neue Zeile *)
+
+ PROC cursor (INT CONST reihe, spalte) (* Positioniert die Schreibmarke
+ auf dem Bildschirm in die an-
+ gegebene Position *)
+
+Die Prozedur 'get' holt Eingaben vom Eingabemedium. Ein Element der Eingabe
+wird dabei durch ein Blank vom nächsten getrennt. Einige weitere Eingabe-
+Prozeduren:
+
+ PROC get (TEXT VAR t, TEXT CONST delimiter) (* die nächste Eingabe wird
+ nicht von einem Blank
+ begrenzt, sondern durch
+ 'delimiter' *)
+
+ TEXT PROC get (* dient zum Initialisieren *)
+
+ PROC inchar (TEXT VAR zeichen) (* wartet solange, bis ein Zeichen vom
+ Bildschirm eingegeben wird *)
+
+ TEXT PROC incharety (* Versucht ein Zeichen vom Bildschirm
+ zu lesen. Ist kein Zeichen vor-
+ handen, wird "" geliefert *)
+
+ PROC editget (TEXT VAR line) (* Bei der Eingabe kann 'line' editiert
+ werden *)
+
+ PROC get cursor (INT VAR zeile, spalte) (* Informationsprozedur, wo die
+ Schreibmarke aktuell steht *)
+
+
+
+Konvertierungen
+
+Manchmal ist es notwendig, eine Datentyp-Wandlung für ein Objekt vorzunehmen.
+Die Wandlungen von einem INT- bzw. einen REAL-Wert in einen TEXT und umge-
+kehrt sind relativ unkritisch:
+
+ TEXT PROC text (INT CONST value)
+ TEXT PROC text (REAL CONST value)
+ INT PROC int (TEXT CONST number)
+ REAL PROC real (TEXT CONST number)
+
+Aber bei der folgenden Prozedur 'int' gehen im allgemeinen Fall Informationen
+verloren (es wird abgeschnitten):
+
+ INT PROC int (REAL CONST value)
+ REAL PROC real (INT CONST value)
+
+Zusätzlich steht eine Informationsprozedur 'last conversion ok' zur Ver-
+fügung, die den Wert TRUE liefert, falls die letzte Konversion fehlerfrei
+war:
+
+ BOOL PROC last conversion ok
+
+Solche Abfragen sind notwendig, weil die Konversionsroutinen bei falschen
+Parameterwerten (z.B. 'int (maxreal)') nicht mit einer Fehlermeldung ab-
+brechen. Als Beispiel zeigen wir ein Programm zum Einlesen von Werten, von
+denen man nicht weiß, ob sie INT oder REAL sind. Darum kann auch nicht die
+'get'-Prozedur für INT oder REAL verwandt werden:
+
+
+Programm 18:
+
+ TEXT VAR eingabe element;
+ REP
+ get (eingabe element);
+ wert nach intwert oder realwert bringen;
+ berechnung
+ UNTIL ende ENDREP.
+
+ wert nach intwert oder realwert bringen:
+ IF pos (eingabe element, ".") > 0
+ THEN REAL VAR realwert :: real (eingabe element)
+ ELSE INT VAR intwert :: int (eingabe element)
+ END IF;
+ IF NOT last conversion ok
+ THEN put ("Fehler bei Konvertierung:" + eingabe element);
+ line
+ END IF.
+
+ berechnung:
+ ...
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6b b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6b
new file mode 100644
index 0000000..7fdaf39
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6b
@@ -0,0 +1,1425 @@
+ EUMEL-Benutzerhandbuch
+
+
+ TEIL 6: Erste Hilfe in ELAN
+
+Prozeduren
+
+Prozeduren werden verwendet, wenn
+
+- Anweisungen und Datenobjekte unter einem Namen zusammengefaßt werden
+ sollen ("Abstraktion").
+
+- gleiche Anweisungen von mehreren Stellen eines Programms verwandt werden
+ sollen (Codereduktion) u.U. mit verschieden Datenobjekten (Parameter);
+
+- wenn Datenobjekte nur kurzfristig benötigt werden (dynamische Speicherver-
+ waltung) und diese nicht von dem gesamten Programm angesprochen werden
+ sollen (lokale, globale Datenobjekte);
+
+Im folgenden Programm stellen wir ein Fragment vor, in dem zwei Werte ver-
+tauscht werden. In der einen (linken) Lösung wird ein Refinement, in der
+anderen eine Prozedur verwandt.
+
+Programm 19:
+
+ ... PROC vertausche a und b:
+ IF a > b INT CONST x :: a;
+ THEN vertausche a und b a := b;
+ END IF; b := x
+ ... END PROC vertausche a und b;
+ vertausche a und b; ...
+ ... IF a > b
+ THEN vertausche a und b
+ vertausche a und b: END IF;
+ INT CONST x :: a; ...
+ a := b; vertausche a und b;
+ b := x. ...
+
+Beim ersten Hinsehen leisten beide Programme das Gleiche. Es gibt jedoch
+drei wichtige Unterschiede:
+
+1) Das Refinement 'vertausche a und b' wird zweimal (vom ELAN-Compiler)
+ eingesetzt, d.h. der Code ist zweimal vorhanden. Die Prozedur dagegen ist
+ vom Code nur einmal vorhanden, wird aber zweimal - durch das Aufführen
+ des Prozedurnamens - aufgerufen.
+
+2) Die Variable 'x' ist in der linken Programmversion während des gesamten
+ Ablauf des Programms vorhanden. Solche Datenobjekte nennt man statische
+ Datenobjekte oder auch (aus Gründen, die erst etwas später offensichtlich
+ werden) Paket-Objekte. Das Datenobjekt 'x' der rechten Version dagegen
+ ist nur während der Bearbeitung der Prozedur vorhanden. Solche Daten-
+ objekte, die nur kurzfristig Speicher belegen, werden dynamische Daten-
+ objekte genannt.
+
+ Prozeduren sind also ein Mittel, um die Speicherbelegung zu beeinflussen,
+ was besonders bei großen Datenobjekten notwendig ist.
+
+3) 'x' kann in der linken Programmversion - obwohl sie in einem Refinement
+ deklariert wurde - von jeder Stelle des Programms angesprochen werden.
+ Solche Datenobjekte werden globale Datenobjekte genannt. Das Datenobjekt
+ 'x' der Prozedur dagegen kann nur innerhalb der Prozedur angesprochen
+ werden, sie ist also ein lokales Datenobjekt hinsichtlich der Prozedur.
+ Innerhalb der Prozedur dürfen globale Datenobjekte (also Objekte, die
+ außerhalb von Prozeduren deklariert wurden) angesprochen werden.
+
+ Eine Prozedur in ELAN bildet im Gegensatz zu Refinements einen eigenen
+ Gültigkeitsbereich hinsichtlich Datenobjekten und Refinements, die inner-
+ halb der Prozedur deklariert werden. Prozeduren sind somit ein Mittel, um
+ die in ihr deklarierten Datenobjekte hinsichtlich der Ansprechbarkeit
+ nach Außen "abzuschotten".
+
+Prozeduren wie die in Programm 19 werden mit dem Schlüsselwort PROC, dem
+Namen der Prozedur und einem Doppelpunkt eingeleitet. Dies nennt man den
+Prozedurkopf. Der Prozedurkopf entspricht den Definitionen, die wir bereits
+in vorigen Abschnitten dieses Skripts gegeben haben. Nach dem Prozedurkopf
+folgt der Prozedurrumpf, der Datenobjekt-Deklarationen, Anweisungen und
+Refinements enthalten kann. Abgeschlossen wird die Prozedur durch END PROC
+und dem Prozedurnamen.
+
+
+Aufgabe (HSG):
+
+ a) Erkläre den Unterschied zwischen einer Prozedur und einem Refinement.
+ b) Was sind globale bzw. lokale Datenobjekte?
+Übungsziel: Begriffe, die mit Prozeduren zusammenhängen
+
+
+Aufgabe (TSW):
+
+ Gegeben sei folgendes Programmfragment:
+ INT VAR a, b;
+ ... (*1*)
+ PROC x:
+ INT VAR x1;
+ ... (*2*)
+ END PROC x;
+ TEXT VAR t;
+ PROC y:
+ REAL VAR y1
+ ... (*3*)
+ END PROC y;
+ ... (*4*)
+
+ 1.) Welche Objekte (einschließlich Prozeduren) sind an den Punkten
+ (*1*) :
+ (*2*) :
+ (*3*) :
+ (*4*) :
+ ansprechbar?
+
+ 2.) Welche Datenobjekte sind in der Prozedur 'y'
+ global:
+ lokal:
+Übungsziel: Globale und lokale Objekte
+
+
+Prozeduren mit Parametern erlauben es, gleiche Anweisungen mit unterschied-
+lichen Datenobjekten auszuführen:
+
+
+Programm 20:
+
+ PROC vertausche (INT VAR a, b):
+ INT VAR x :: a;
+ a := b;
+ b := x
+ END PROC vertausche;
+
+ INT VAR eins :: 1,
+ zwei :: 2,
+ drei :: 3;
+ vertausche (eins, zwei);
+ vertausche (zwei, drei);
+ vertausche (eins, zwei);
+ put (eins); put (zwei); put (drei)
+
+Die Datenobjekte 'a' und 'b' der Prozedur 'vertausche' werden formale Para-
+meter genannt. Sie stehen als Platzhalter für die bei einem Prozeduraufruf
+einzusetzenden aktuellen Parameter (in unserem Beispiel die Datenobjekte
+'eins', 'zwei' und 'drei').
+
+
+Aufgabe (HSG):
+
+ Welche Werte werden in dem Programm 20 ausgedruckt?
+Übungsziel: Arbeiten mit Prozeduren und Parameter-Mechanismus.
+
+
+Parameter werden im Prozedurkopf nach dem Prozedurnamen in Klammern mit
+Datentyp und Accessrecht angegeben. Dabei bedeutet CONST, daß auf den
+Parameter nur lesend zugegriffen wird, während auf einen VAR-Parameter auch
+z.B. eine Zuweisung angewandt werden kann. CONST-Parameter sind also
+Eingabe-Parameter, während VAR-Parameter Ein-/Ausgabe-Parameter realisieren.
+
+Bei den aktuellen Parametern ist folgendes zu beachten:
+
+a) Wird ein VAR-Parameter in der Definition der Prozedur vorgeschrieben (wie
+ z.B. im Programm 20), darf kein Ausdruck als aktueller Parameter "überge-
+ ben" werden, weil an einen Ausdruck nichts zugewiesen werden kann.
+ Gegenbeispiel:
+
+ vertausche ( eins * zwei, drei)
+
+ Ausdrücke haben - wie bereits erwähnt - das Accessrecht CONST.
+
+b) Wird ein CONST-Parameter verlangt, dann darf in diesem Fall ein Ausdruck
+ als aktueller Parameter geschrieben werden. Aber auch ein VAR-Datenobjekt
+ darf angegeben werden. In diesem Fall wird eine Wandlung des Accessrechts
+ (CONSTing) vorgenommen: der aktuelle Parameter erhält sozusagen für die
+ Zeit der Abarbeitung der Prozedur das Accessrecht CONST.
+
+Es ist auch möglich, Prozeduren als Parameter zu definieren, worauf wir aber
+hier nicht eingehen wollen.
+
+Eine Werte liefernde Prozedur erhält man, wenn der Prozedurrumpf einen Wert
+liefert, d.h. die letzte ausführbare Anweisung des Prozedurrumpfes muß einen
+Wert liefern (analog Werte liefernde Refinements) und der zu liefernde
+Datentyp vor den Prozedurkopf geschrieben wird.
+
+
+Programm 21:
+
+ INT PROC max (INT CONST a, b):
+ IF a > b
+ THEN a
+ ELSE b
+ END IF
+ END PROC max;
+
+ put (max (3, 4))
+
+(In unserem Beispiel liefert die IF-Anweisung einen Wert. Das erfolgt da-
+durch, daß beide Zweige der Anweisung einen Wert liefern.)
+
+
+
+Neudefinierte Operatoren
+
+Neue, zusätzliche Operatoren können in ELAN wie Prozeduren definiert werden.
+Es ist nur notwendig, bei der Definition das Wort PROC gegen OP zu vertau-
+schen. Es sind aber auch nur 1 oder 2 Parameter bei Operatoren erlaubt.
+
+
+Programm 22a:
+
+ TEXT OP * (INT CONST mal, TEXT CONST t):
+ INT VAR zaehler :: mal;
+ TEXT VAR ergebnis :: "";
+ WHILE zaehler > 0 REP
+ ergebnis := ergebnis + t;
+ zaehler := zaehler - 1
+ END REP;
+ ergebnis
+ END OP *;
+
+Dieser Operator vervielfältigt TEXTe ( 2 * "ha" liefert "haha"). Der Name
+des Operators ist '*'. Man kann als Operatornamen die vorhandenen, bereits
+benutzten Sonderzeichen verwenden. In diesem Fall bekommt der neudefinierte
+Operator die gleiche Priorität wie der bereits vorhandene oder ein Schlüssel-
+wort.
+
+Der "Aufruf" eines Operators unterscheidet sich von einer Prozedur durch die
+infix-Schreibweise. Im übrigen gilt das für Prozeduren Gesagte.
+
+
+
+Optimierungen
+
+Optimierungen werden vorgenommen, wenn man mit den Laufzeiten bzw. Speicher-
+bedarf eines Programms nicht zufrieden ist. Kleinere, lokale Optimierungen
+sind meist nicht sinnvoll und notwendig und bringen mehr Fehler, als Ver-
+besserungen:
+
+
+Programm 22b:
+
+ TEXT OP * (INT CONST mal, TEXT CONST t):
+ INT VAR i;
+ TEXT VAR ergebnis :: "";
+ FOR i FROM 1 UPTO mal REP
+ ergebnis CAT t
+ END REP;
+ ergebnis
+ END OP *;
+
+Wir haben hier die WHILE-Schleife durch eine Zählschleife und 'ergebnis :=
+ergebnis + t' durch 'ergebnis CAT t' ersetzt. Dies ist nur eine minimale
+Optimierung (wenn sie überhaupt etwas einbringt). Leider sind solche
+"Optimierungen" sehr häufig anzutreffen. Besser ist es, eine Lösung zu
+finden, die algorithmisch oder von den Datenstrukturen her prinzipiell
+besser ist. Wir haben dies für das Programm 22 getan. Lösungsidee: jeweilige
+Verdopplung eines Zwischentextes ("Russische Multiplikation").
+
+
+Programm 22c:
+
+ TEXT OP * (INT CONST mal, TEXT CONST t):
+ INT VAR zaehler :: mal;
+ TEXT VAR einer :: "",
+ dopplung :: t;
+ IF fehlerhafter aufruf
+ THEN LEAVE * WITH ""
+ ELSE verdopplung
+ END IF;
+ dopplung + einer.
+
+ fehlerhafter aufruf:
+ zaehler < 1.
+
+ verdopplung:
+ WHILE zaehler > 1 REP
+ IF zaehler ist ungerade
+ THEN einer CAT t
+ END IF;
+ dopplung CAT dopplung;
+ zaehler := zaehler DIV 2
+ END REP.
+
+ zaehler ist ungerade:
+ zaehler MOD 2 = 1.
+
+ END OP *;
+
+
+In diesem Programm wurde eine Anweisung verwendet (LEAVE), die wir im
+folgenden Abschnitt erklären wollen.
+
+
+
+Das LEAVE-Konstrukt
+
+Das LEAVE-Konstrukt wird verwendet, um eine benannte Anweisung (Refinement,
+Prozedur oder Operator) vorzeitig zu verlassen. Es ist auch möglich, mehr-
+fach geschachtelte Refinements zu verlassen. Durch eine (optionale)
+WITH-Angabe kann auch ein wertelieferndes Refinement verlassen werden.
+
+
+
+Reihungen
+
+Wir haben bis jetzt bereits zusammengesetzte algorithmische Objekte kennen-
+gelernt, die man unter einem Namen als Ganzes ansprechen kann (Prozeduren).
+Die gleiche Möglichkeit gibt es auch bei Datenobjekten, wobei wir gleich-
+artige oder ungleichartige Objekte zu einem Objekt zusammenfassen können.
+Zuerst zu der Zusammenfassung gleichartiger Datenobjekte, die in ELAN eine
+Reihung (ROW) genannt wird. Die einzelnen Objekte einer Reihung werden
+Elemente genannt. Beispiel (Deklaration einer Reihung von 10 INT-Elementen):
+
+ ROW 10 INT VAR feld
+
+Die Angabe hinter dem Schlüsselwort ROW muß ein INT-Denoter sein (oder
+durch ein LET definierter Name). Dabei ist ROW 10 INT ein (neuer, von den
+elementaren unterschiedlicher) Datentyp, für den keine Operationen definiert
+sind, außer der Zuweisung. Das Accessrecht (VAR in unserem Beispiel) und der
+Name ('feld') gilt - wie bei den elementaren Datentypen - für diesen neuen
+Datentyp, also für alle 10 Elemente.
+
+Warum gibt es keine Operationen außer der Zuweisung? Das wird uns sehr
+schnell einsichtig, wenn wir uns vorstellen, daß es ja sehr viele Datentypen
+(zusätzlich zu den elementaren) gibt, weil Reihungen von jedem Datentyp
+gebildet werden können:
+
+ ROW 1 INT ROW 1 REAL
+ ROW 2 INT ROW 2 REAL
+ : :
+ ROW maxint INT ROW maxint REAL
+
+ ROW 1 TEXT ROW 1 BOOL
+ ROW 2 TEXT ROW 2 BOOL
+ : :
+ ROW maxint TEXT ROW maxint BOOL
+
+Für die elementaren INT-, REAL-, BOOL- und TEXT-Datentypen sind
+unterschiedliche Operationen definiert. Man müßte nun für jeden dieser
+zusammengesetzten Datentypen z.B. auch 'get'- und 'put'-Prozeduren
+schreiben, was allein vom Schreibaufwand sehr aufwendig wäre. Das ist der
+Grund dafür, daß es keine vorgegebene Operationen auf zusammengesetzte
+Datentypen gibt.
+
+Zugegebenermaßen könnte man mit solchen Datentypen, die nur über eine Opera-
+tion verfügen (Zuweisung), nicht sehr viel anfangen, wenn es nicht eine wei-
+tere vorgegebene Operation gäbe, die #ib#Subskription#ie#. Sie erlaubt es,
+auf die Elemente einer Reihung zuzugreifen und den Datentyp der Elemente
+"aufzudecken". Beispiel:
+
+ feld [3]
+
+bezieht sich auf das dritte Element der Reihung 'feld' und hat den Datentyp
+INT. Für INT-Objekte haben wir aber einige Operationen, mit denen wir
+arbeiten können. Beispiele:
+
+ feld [3] := 7;
+ feld [4] := feld [3] + 4;
+ ...
+
+Eine Subskription "schält" also vom Datentyp ein ROW ab und liefert ein
+Element der Reihung. Die Angabe der Nummer des Elements in der Reihung nennt
+man Subskript (in unserem Fall '3'). Der Subskript wird in ELAN in eckigen
+Klammern angegeben, um eine bessere Unterscheidung zu den runden Klammern in
+Ausdrücken zu erreichen. Ein subskribiertes ROW-Datenobjekt kann also über-
+all da verwendet werden, wo ein entsprechender Datentyp benötigt wird (Aus-
+nahme: Schleifenvariable). Als Beispiel zeigen wir zwei Prozeduren, die eine
+Reihung einlesen bzw. ausgeben:
+
+
+Programm 23:
+
+ PROC get (ROW 10 INT VAR feld):
+ INT VAR i;
+ FOR i FROM 1 UPTO 10 REP
+ put (i); put ("tes Element bitte:");
+ get (feld [i]);
+ line
+ END REP
+ END PROC get;
+
+ PROC put (ROW 10 INT CONST feld):
+ INT VAR i;
+ FOR i FROM 1 UPTO 10 REP
+ put (i); put ("tes Element ist:");
+ put (feld [i]);
+ line
+ END REP
+ END PROC put
+
+
+Wie bereits erwähnt, ist es erlaubt, Reihungen überall dort zu verwenden, wo
+auch die elementaren Datentypen verwandt werden können, also auch als
+Parameter. Zudem haben wir die generischen Eigenschaften von Prozeduren in
+ELAN bei der Benennung der Prozeduren benutzt.
+
+Diese beiden Prozeduren benutzen wir gleich im nächsten Programm, welches
+10 Werte einliest und die Summe berechnet:
+
+
+Programm 24:
+
+ ROW 10 INT VAR werte;
+ lies werte ein;
+ summiere sie;
+ drucke die summe und einzelwerte.
+
+ lies werte ein:
+ get (werte).
+
+ summiere sie:
+ INT VAR summe :: 0, i;
+ FOR i FROM 1 UPTO 10 REP
+ summe INCR werte [i]
+ END REP.
+
+ drucke die summe und einzelwerte:
+ put (werte);
+ line;
+ put ("Summe:"); put (summe).
+
+
+Aufgabe (HSG):
+
+ Wie kann man vermeiden, daß 'summe > maxint' ("overflow"-Bedingung)
+ wird?
+
+
+Oft benötigt man die Werte einer Reihung sortiert. Das Programm 25 zeigt
+einen (sehr dummen und ineffizienten) Sortieralgorithmus:
+
+
+Programm 25:
+
+ ROW 10 INT VAR wert;
+ lies die werte ein;
+ sortiere in eine zweite liste;
+ drucke die zweite liste.
+
+ lies die werte ein:
+ get (wert).
+
+ sortiere in eine zweite liste:
+ INT VAR i;
+ FOR i FROM 1 UPTO 10 REP
+ suche kleinstes element aus der werte liste;
+ bringe dieses in die zweite liste;
+ entferne es aus der werte liste
+ END REP.
+
+ suche kleinstes element aus der werte liste:
+ INT VAR kleinstes element :: maxint, position kleinstes element :: 0, k;
+ FOR k FROM 1 UPTO 10 REP
+ IF wert [k] < kleinstes element
+ THEN kleinstes element := wert [k];
+ position kleinstes element := k
+ END IF
+ END REP.
+
+ bringe dieses in die zweite liste:
+ ROW 10 INT VAR liste2;
+ liste2 [i] := kleinstes element.
+
+ entferne es aus der werte liste:
+ wert [position kleinstes element] := maxint.
+
+ drucke die zweite liste:
+ put (liste2).
+
+Anmerkung: Bei diesem einfachen Sortieralgorithmus (der übrigens "lineare
+Auswahl" heißt), wurde der Wert 'maxint' als zulässiger Wert ausgeschlossen.
+Der Algorithmus ist ziemlich der schlechteste, den wir uns ausdenken können.
+Einmal braucht er den doppelten Speicherplatz für die zu sortierende Liste,
+andererseits sind für N Werte N*N Durchläufe durch die Liste notwendig (man
+sagt, der Algorithmus ist von der Ordnung N Quadrat).
+
+Da es möglich ist, von jedem Datentyp eine Reihung zu bilden, kann man
+natürlich auch von einer Reihung eine Reihung bilden:
+
+ ROW 5 ROW 10 INT VAR matrix
+
+Für eine "doppelte" Reihung gilt das für "einfache" Reihungen gesagte.
+Wiederum existieren keine Operationen für dieses Datenobjekt (außer der
+Zuweisung), jedoch ist es durch Subskription möglich, auf die Elemente zuzu-
+greifen:
+
+ matrix [3]
+
+liefert ein Datenobjekt mit dem Datentyp ROW 10 INT, für den wir bereits in
+Programm 23 die Prozeduren 'get' und 'put' geschrieben haben, die wir
+verwenden können:
+
+ get (matrix [4])
+
+Subskribieren wir jedoch 'matrix' nochmals, so erhalten wir ein INT:
+
+ matrix [2] [8]
+
+(jede Subskription "schält" von Außen ein ROW vom Datentyp ab).
+
+
+Aufgabe (HSG):
+
+ a) Geben Sie Datentyp, Accessrecht und Name der folgenden Datenobjekte
+ an:
+ ROW 17 INT CONST alpha;
+ ROW 3 ROW 4 TEXT VAR matrix;
+ ...
+ beta [3] := 7;
+ gamma [4] := gamma [5]
+
+ b) Was führt zu Fehlern? Wenn ja, warum?
+ ROW 17 INT VAR alpha;
+ ROW 3 ROW 4 TEXT VAR beta, gamma;
+ ROW 4 ROW 3 TEXT CONST delta;
+ INT VAR x :: 7;
+ ROW x BOOL VAR y;
+ get (alpha);
+ get (beta [7]);
+ FOR x FROM 1 UPTO 3 REP
+ get (beta [x])
+ END REP;
+ beta := delta;
+ delta [1] [2] := "mist";
+ beta := gamma;
+ beta [3] := gamma [3];
+ get (beta [1] [1]);
+ gamma [1] [5] := beta [1] [1] + "ELAN"
+ x := alpha [3];
+ x := 20;
+ alpha [x] := alpha [3] + 7
+Übungsziel: Umgang mit Reihungen
+
+
+
+Strukturen
+
+Strukturen sind Datenverbunde wie Reihungen, aber die Komponenten können
+ungleichartige Datentypen haben. Die Komponenten von Strukturen heißen
+Felder (bei Reihungen: Elemente) und der Zugriff auf ein Feld Selektion
+(Reihungen: Subskription). Eine Struktur ist - genauso wie bei Reihungen -
+ein eigener Datentyp, der in einer Deklaration angegeben werden muß.
+Beispiel:
+
+ STRUCT (TEXT name, INT alter) VAR ich
+
+Wiederum existieren keine Operationen auf Strukturen außer der Zuweisung und
+der Selektion, die es erlaubt, Komponenten aus einer Struktur herauszulösen:
+
+ ich . name
+ ich . alter
+
+Die erste Selektion liefert einen TEXT-, die zweite ein INT-Datenobjekt. Mit
+diesen (selektierten) Datenobjekten kann - wie gewohnt - gearbeitet werden
+(Ausnahme: nicht als Schleifenvariable).
+
+Zum Datentyp einer Struktur gehören auch die Feldnamen:
+
+ STRUCT (TEXT produkt name, INT artikel nr) VAR erzeugnis
+
+ist ein anderer Datentyp als im ersten Beispiel dieses Abschnitts. Für
+Strukturen - genauso wie bei Reihungen - kann man sich neue Operationen
+definieren. Im folgenden Programm definieren wir für eine Struktur, die
+Personen beschreibt, die Operationen 'put', 'get' und den dyadischen
+Operator HEIRATET. Anschließend werden drei Paare verHEIRATET.
+
+
+Programm 26a:
+
+ PROC get (STRUCT (TEXT name, vorname, INT alter) VAR p):
+ put ("bitte Nachname:"); get ( p.name);
+ put ("bitte Vorname:"); get ( p.vorname);
+ put ("bitte Alter:"); get ( p.alter);
+ line
+ END PROC get;
+
+ PROC put (STRUCT (TEXT name, vorname, INT alter) CONST p):
+ put (p.vorname); put (p.name);
+ put ("ist");
+ put (p.alter);
+ put ("Jahre alt");
+ line
+ END PROC put;
+
+ OP HEIRATET
+ (STRUCT (TEXT name, vorname, INT alter) VAR w,
+ STRUCT (TEXT name, vorname, INT alter) CONST m):
+ w.name := m.name
+ END OP HEIRATET;
+
+ ROW 3 STRUCT (TEXT name, vorname, INT alter) VAR frau, mann;
+
+ personendaten einlesen;
+ heiraten lassen;
+ paardaten ausgeben.
+
+ personendaten einlesen:
+ INT VAR i;
+ FOR i FROM 1 UPTO 3 REP
+ get (frau [i]);
+ get (mann [i])
+ END REP.
+
+ heiraten lassen:
+ FOR i FROM 1 UPTO 3 REP
+ frau [i] HEIRATET mann [i]
+ END REP.
+
+ paardaten ausgeben:
+ FOR i FROM 1 UPTO 3 REP
+ put (frau [i]);
+ put ("hat geheiratet:"); line;
+ put (mann [i]); line
+ END REP.
+
+Reihungen und Strukturen dürfen miteinander kombiniert werden, d.h. es darf
+eine Reihung in einer Struktur erscheinen oder es darf eine Reihung von einer
+Struktur vorgenommen werden. Selektion und Subskription sind in diesen Fällen
+in der Reihenfolge vorzunehmen, wie die Datentypen aufgebaut wurden (von
+außen nach innen).
+
+
+Aufgabe (HSG):
+
+ In ELAN heissen
+ a1) Datenverbunde gleichartiger Komponenten:
+ a2) Datenverbunde ungleichartiger Komponenten:
+ b1) die Komponenten eines ROWs:
+ b2) die Komponenten eines STRUCTs:
+ c1) die Zugriffe auf die Komponenten eines ROWs:
+ c2) die Zugriffe auf die Komponenten eines STRUCTs:
+Übungsziel: Begriffe von ROWs und STRUCTs kennenlernen
+
+
+
+LET-Konstrukt
+
+Wie wir in Programm 26 gesehen haben, ist die Verwendung von Strukturen
+oder auch Reihungen manchmal schreibaufwendig. Mit dem LET-Konstrukt darf
+man Datentypen (und Denotern) einen Namen geben. Dieser Name steht als
+Abkürzung und verringert so die Schreibarbeit. Zusätzlich wird durch die
+Namensgebung die Lesbarkeit des Programms erhöht. Beispiel:
+
+
+Programm 26b:
+
+ LET PERSON = STRUCT (TEXT name, vorname, INT alter);
+
+ PROC get (PERSON VAR p):
+ put ("bitte Nachname:"); get ( p.name);
+ put ("bitte Vorname:"); get ( p.vorname);
+ put ("bitte Alter:"); get ( p.alter);
+ line
+ END PROC get;
+
+ PROC put (PERSON CONST p):
+ put (p.vorname); put (p.name); put ("ist");
+ put (p.alter); put ("Jahre alt"); line
+ END PROC put;
+
+ OP HEIRATET (PERSON VAR f, PERSON CONST m):
+ f.name := m.name
+ END OP HEIRATET;
+
+ ROW 3 PERSON VAR mann, frau;
+ ...
+
+Überall wo der abzukürzende Datentyp verwandt werden kann, kann PERSON
+benutzt werden. Wohlgemerkt: PERSON ist kein neuer Datentyp, sondern nur ein
+Name, der für STRUCT (....) steht. Der Zugriff auf die Komponenten des
+abgekürzten Datentyps bleibt erhalten (was bei abstrakten Datentypen, die wir
+etwas später erklären, nicht mehr der Fall ist).
+
+Neben der Funktion der Abkürzung von Datentypen kann das LET-Konstrukt
+auch für die Namensgebung für die Denoter verwandt werden. Beispiele:
+
+ LET pi = 3.14159;
+ LET blank = " ";
+ LET anzahl = 27
+
+Der Einsatz von LET-Namen für INT-Denoter macht es möglich, Programme
+leicht zu ändern:
+
+
+Programm 26c:
+
+ LET anzahl paare = 3;
+ ROW anzahl paare PERSON VAR frau, mann;
+
+ personendaten einlesen;
+ heiraten lassen;
+ paardaten ausgeben.
+
+ personendaten einlesen:
+ INT VAR i;
+ FOR i FROM 1 UPTO anzahl paare REP
+ get (frau [i]);
+ get (mann [i])
+ END REP.
+ ...
+
+Ebenso wie die Abkürzung von Datentypen (LET PERSON = STRUCT (...)) wird
+im obigen Beispiel für den Namen 'anzahl paare' bei jedem Auftreten der
+Denoter '3' vom ELAN-Compiler eingesetzt. Um nun (z.B.) 27 Paare "heiraten"
+zu lassen, brauchen wir nur die LET-Anweisung in '27' zu verändern...
+(Scheidungen erfordern etwas mehr Aufwand).
+
+
+Aufgabe (HSG):
+
+ Was ist falsch?
+ LET anz = 5,
+ max = 5*5,
+ MAT = ROW anz ROW anz TEXT;
+
+ PROC get (MAT CONST m):
+ FOR i FROM 1 UPTO max REP
+ get (m [i])
+ END REP
+ END PROC get;
+
+ MAT VAR x,y;
+ get (x);
+ x := y + 1
+
+
+Aufgabe (HSG):
+
+ Schreibe ein Programm, das mit den Deklarationen
+ LET anz = 5,
+ VEC = ROW anz INT,
+ MAT = ROW anz VEC;
+ folgende Prozeduren realisiert:
+ PROC get (VEC VAR v)
+ PROC get (MAT VAR m)
+ PROC put (VEC CONST v)
+ PROC put (MAT CONST m)
+ INT PROC reihensumme (VEC CONST v)
+Übungsziel: Reihungen als Parameter
+
+
+
+Denoter für Datenverbunde: Konstruktoren
+
+Denoter für die elementaren Datentypen haben wir kennengelernt. Oft ergibt
+sich auch die Notwendigkeit (z.B. bei Initialisierungen), Datenverbunde in
+einem Programm Werte zu geben. Das kann durch normale Zuweisungen erfolgen.
+Beispiel:
+
+ LET PERSON = STRUCT (TEXT name, vorname, INT alter);
+
+ PERSON VAR mann;
+
+ mann.name := "meier";
+ mann.vorname := "egon";
+ mann.alter := 27
+
+Aber man möchte auch Denoter für Datenverbunde z.B. in Ausdrücken verwenden,
+was durch die Konstruktoren ermöglicht wird. Beispiel:
+
+ LET PERSON = STRUCT (TEXT name, vorname, INT alter);
+
+ PERSON VAR mann, frau;
+
+ frau := PERSON : ( "niemeyer", "einfalt", 65);
+ frau HEIRATET PERSON : ( "meier", "egon", 27)
+
+Ein Konstruktor ist also ein Mechanismus, um ein Datenobjekt eines Datenver-
+bundes in einem Programm zu notieren. Ein Konstruktor besteht aus der Angabe
+des Datentyps (der auch durch einen LET-Namen abgekürzt sein darf), einem
+Doppelpunkt und den in Klammern eingefaßten Komponenten (hier Denoter).
+Besteht eine der Komponenten wiederum aus einem Datenverbund, muß inner-
+halb des Konstruktors wiederum ein Konstruktor eingesetzt werden usw. Kon-
+struktoren sind natürlich für Reihungen auch möglich:
+
+ ROW 7 INT VAR feld;
+ feld := ROW 7 INT : ( 1, 2, 3, 4, 5, 6, 7);
+
+
+Aufgabe (HSG):
+
+ Geben Sie Datentyp, Accessrecht und Name der folgenden Datenobjekte an:
+ STRUCT (INT alter, TEXT name) VAR mensch;
+ STRUCT (INT jahrgang, ROW 2 TEXT lage) CONST wein;
+ ROW 100 STRUCT (PERSON p, NUMMER n) VAR betriebsangehoeriger;
+ STRUCT (INT anz terminals, STRUCT (TEXT systemname, INT version) art)
+ CONST betriebsystem;
+ mensch := ...;
+ betriebsangehoeriger [2] := ...;
+ betriebsangehoeriger [2]. n := NUMMER: (...);
+ betriebsystem.art.systemname := "EUMEL";
+ wein.lage := ROW 2 TEXT: ("Loire", "Frankreich");
+ wein.lage [1] := "Kroever Nacktarsch";
+Übungsziel: Umgang mit Strukturen.
+
+
+
+Rekursive Prozeduren und Operatoren
+
+Alle Prozeduren und Operatoren dürfen in ELAN rekursiv sein.
+
+
+Programm 27:
+
+ INT PROC fakultaet (INT CONST n):
+ IF n > 0
+ THEN fakultaet (n-1) * n
+ ELSE 1
+ END IF
+ END PROC fakultaet
+
+Dieses Beispiel ist aber (leider) kein gutes Beispiel für eine Rekursion,
+denn das Programm kann leicht in eine iterative Version umgewandelt werden:
+
+
+Programm 28:
+
+ INT PROC fakultaet (INT CONST n):
+ INT VAR prod :: 1, i;
+ FOR i FROM 2 UPTO n REP
+ prod := prod * i
+ END REP;
+ prod
+ END PROC fakultaet
+
+Die Umwandlung von einem rekursiven Programm in ein iteratives ist übrigens
+immer möglich, jedoch oft nicht so einfach wie in diesem Fall. Beispiel
+(Ackermann-Funktion):
+
+
+Programm 29:
+
+ INT PROC acker (INT CONST m, n):
+ IF m = 0
+ THEN n + 1
+ ELIF n = 0
+ THEN acker (m-1, 0)
+ ELSE acker (m - 1, acker (m, n - 1))
+ ENDIF
+ END PROC acker
+
+
+Aufgabe (HSG):
+
+ a) Beschreibe die Unterschiede zwischen Iteration und Rekursion. Worauf
+ muß man bei Rekursionen achten?
+ b) Wie groß ist der Wert von 'acker (2, 2)'? Hilfreicher Tip: stelle
+ dabei eine Tabelle auf!
+ c) Zudem enthält die Programmierung der Ackermann-Funktion (mindestens)
+ einen Fehler. Welchen?
+Übungsziel: Umgang mit Rekursion
+
+
+Das eigentliche Einsatzgebiet von rekursiven Algorithmen liegt aber bei den
+'backtrack'-Verfahren. Diese werden eingesetzt, wenn eine exakte algorithmi-
+sche Lösung nicht bekannt ist oder nicht gefunden werden kann und man ver-
+schiedene Versuche machen muß, um zu einem Ziel (oder Lösung) zu gelangen.
+
+Als Beispielprogramm zeigen wir das Spiel "Maus sucht Käse". In einem Laby-
+rinth (realisiert durch eine Reihung von einer Reihung), das mit Hindernis-
+sen bestückt ist, wurde ein Käse versteckt. Eine sehr dumme Maus sucht
+systematisch die umliegenden Felder (in allen vier Himmelsrichtungen) nach
+dem Käse ab. Ist sie auf einem neuen Feld und ist das Feld frei, sucht sie
+erneut. Felder, auf denen sie bereits war, werden von ihr markiert. Da die
+Maus sehr kurzsichtig ist und nicht richtig riechen kann, bemerkt sie den
+Käse erst, wenn sie sozusagen mit allen vier Pfoten in ihm gelandet ist
+(analog bei Hindernissen, die nicht überklettert werden können). Damit die
+Maus nicht aus dem Labyrinth entfliehen kann, wird der Rand als Hindernis
+angesehen.
+
+
+(Teil-) Programm 30:
+
+ PROC suche weg (INT CONST x, y):
+ IF labyrinth [x] [y] = kaese
+ THEN kaese gefunden
+ ELIF labyrinth [x] [y] = frei
+ THEN suche weiter
+ END IF.
+
+ suche weiter:
+ labyrinth [x] [y] := markiert;
+ INT VAR richtung;
+ FOR richtung FROM osten UPTO sueden REP
+ versuche diese richtung
+ END REP;
+ labyrinth [x] [y] := frei.
+
+ versuche diese richtung:
+ IF richtung = osten
+ THEN suche weg (x + 1, y)
+ ELIF richtung = norden
+ THEN suche weg (x, y + 1)
+ ...
+
+
+
+Dateien
+
+Dateien werden benötigt, wenn
+
+- Daten über die Abarbeitungszeit eines Programms aufbewahrt werden sollen;
+- der Zeitpunkt oder Ort der Datenerfassung nicht mit dem Zeitpunkt oder Ort
+ der Datenverarbeitung übereinstimmt;
+- die gesamte Datenmenge nicht auf einmal in den Zentralspeicher eines
+ Rechners paßt;
+- die Anzahl und/oder Art der Daten nicht von vornherein bekannt sind.
+
+Eine Datei ("file") ist eine Zusammenfassung von Daten, die auf Massenspei-
+chern aufbewahrt wird. Dateien sind in bestimmten Informationsmengen, den
+Sätzen ("records") organisiert.
+
+In ELAN gibt es zwei Arten von Dateien:
+
+a) FILE: sequentielle Dateien. Die Sätze können nur sequentiell gelesen bzw.
+ geschrieben werden. Eine Positionierung ist nur zum nächsten Satz möglich.
+b) DIRFILE: indexsequentielle Dateien. Die Positionierung erfolgt direkt mit
+ Hilfe eines Schlüssels ("key") oder Index, kann aber auch sequentiell
+ vorgenommen werden.
+
+ Wichtig:
+ DIRFILEs sind auf dem EUMEL-System nicht implementiert! Deswegen wird
+ auf diesen Dateityp hier nicht weiter eingegangen.
+
+Dateien werden normalerweise von dem #ib#Betriebsystem#ie# eines Rechners
+aufbewahrt und verwaltet. Somit ist eine Verbindung von einem ELAN-Programm,
+in dem eine Datei unter einem Namen - wie jedes andere Datenobjekt auch -
+angesprochen werden soll, und dem Betriebsystem notwendig. Dies erfolgt durch
+sogenannte Assoziierungsprozeduren. Beispiele:
+
+ FILE VAR meine datei :: sequential file (output, "xyz");
+ FILE CONST eine andere datei :: sequential file (input, "abc")
+
+Die Assoziierungsprozedur heißt 'sequential file' für FILEs. Der erste
+Parameter einer Assoziierungsprozedur gibt immer die sogenannte Betriebs-
+richtung ("TRANSPUTDIRECTION") an. Es gibt folgende Betriebsrichtungen:
+
+ input nur Lesen der Datei
+ output nur Schreiben der Datei
+
+ Anmerkung:
+ Im EUMEL-System gibt es noch die Betriebsrichtung 'modify', die es er-
+ laubt, beliebig zu positionieren, Sätze zu löschen und/oder einzufügen
+ usw. Dafür gibt es keine DIRFILEs. Siehe dazu auch das Kapitel über
+ Dateien in diesem Benutzerhandbuch.
+
+Der zweite Parameter einer Assoziierungsprozedur gibt an, unter welchem
+Namen die Datei in dem Betriebsystem bekannt ist. Mit Hilfe dieses Namens
+wird die Datei an das Datenobjekt gekoppelt, das bei der FILE-Deklaration im
+Programm erzeugt wurde.
+
+Welche Operationen sind nun für Dateien zugelassen? Wir beschreiben die
+wichtigsten für die beiden Dateiarten und Betriebsrichtungen getrennt:
+
+a) FILE mit 'input' (nur lesen):
+
+ PROC getline (FILE CONST f, TEXT VAR zeile)
+ PROC get (FILE CONST f, TEXT VAR t)
+ PROC get (FILE CONST f, REAL VAR r)
+ PROC get (FILE CONST f, INT VAR i)
+ BOOL PROC eof (FILE CONST f)
+ (* Abfrageprozedur auf das Ende eines FILEs (letzter Satz) *)
+
+ Als Beispiel zeigen wir ein Programm, welches eine Datei liest und auf
+ dem Ausgabemedium ausgibt.
+
+
+ Programm 31:
+
+ FILE CONST f :: sequential file (input, "datei1");
+ TEXT VAR satz;
+ WHILE NOT eof (f) REP
+ getline (f, satz);
+ put (satz); line
+ END REP.
+
+b) FILE mit 'output' (nur schreiben):
+
+ PROC putline (FILE VAR f, TEXT CONST zeile)
+ PROC put (FILE VAR f, TEXT CONST t)
+ PROC put (FILE VAR f, REAL CONST r)
+ PROC put (FILE VAR f, INT CONST i)
+ PROC line (FILE VAR f, INT CONST zeilenzahl)
+
+
+Aufgabe (HSG):
+
+ a) Das Arbeiten mit Dateien ist manchmal notwendig, weil ...
+ b) Wenn man mit Dateien in ELAN arbeitet, sind Assoziierungsprozeduren
+ notwendig.
+ b1) Wie heißen diese?
+ b2) Was gibt man in diesen an?
+ c) Welche Betriebsrichtungen gibt es bei FILES und was bewirken sie?
+Übungsziel: Datei-Begriffe
+
+
+Aufgabe (TSW):
+
+ Welche Fehler befinden sich in den folgenden Programmfragmenten?
+ a) FILE VAR f :: sequential file (input, "MIST");
+ TEXT VAR zeile;
+ REP
+ getline (f, zeile);
+ ...
+ UNTIL eof (f) END REP
+
+ b) FILE VAR f :: sequential file (output, "NOCHMAL");
+ TEXT VAR zeile;
+ REP
+ getline (f, zeile);
+ put (zeile)
+ UNTIL eof (f) END REP
+
+ c) FILE VAR f :: sequential file (input, "VERDAMMT"),
+ g :: sequential file (input, "DAEMLICH");
+ TEXT VAR zeile;
+ kopiere g in f.
+
+ kopiere g in f:
+ FOR i FROM 1 UPTO 100 REP
+ getline (g, zeile);
+ putline (f, zeile)
+ UNTIL eof (g) END REP.
+Übungsziel: Arbeiten mit Dateien
+
+
+
+Programmstruktur 1
+
+Bis jetzt haben wir noch nicht vollständig erklärt, wie ein ELAN-Programm
+formal als Ganzes aufgebaut sein muß, d.h. wie und in welcher Reihenfolge
+die Anweisungen, Refinements, Prozeduren und Deklarationen geschrieben
+werden müssen.
+
+Ein ELAN-Programm kann aus mehreren Moduln (Bausteinen) aufgebaut sein,
+die in ELAN PACKETs genannt werden. Das letzte PACKET wird "main packet"
+genannt, weil in diesem das eigentliche Benutzerprogramm (Hauptprogramm)
+enthalten ist. In diesem Abschnitt wollen wir uns nur mit dem Aufbau eines
+solchen PACKETs beschäftigen. Wir werden dabei nicht alle Möglichkeiten
+besprechen, sondern nur die wichtigsten Anwendungen beschreiben, mit einer
+Empfehlung, in welcher Reihenfolge die Elemente geschrieben werden sollten.
+
+Ein "main packet" kann aus folgenden Elementen bestehen:
+
+a) Deklarationen und Anweisungen. Diese müssen nicht in einer bestimmten
+ Reihenfolge im Programm erscheinen, sondern es ist möglich, erst in dem
+ Augenblick zu deklarieren, wenn z.B. eine neue Variable benötigt wird. Es
+ ist jedoch gute Programmierpraxis, die meisten Deklarationen an den
+ Anfang eines Programms (außer z.B. Datenobjekte, die nur lokal oder
+ kurzfristig benötigt werden, wie Hilfsvariablen oder Laufvariablen) zu
+ plazieren.
+
+ <Deklarationen> ;
+ <Anweisungen>
+
+b) Deklarationen, Refinements und Anweisungen. In diesem Fall ist es notwen-
+ dig, die Refinements hintereinander zu plazieren. Refinement-Aufrufe
+ und/oder Anweisungen sollten textuell vorher erscheinen. Die Refinements
+ werden durch einen Punkt von den Aufrufen getrennt:
+
+ <Deklarationen> ;
+ <Refinement-Aufrufe und/oder Anweisungen> .
+ <Refinements>
+
+ Innerhalb der Refinements sind Anweisungen und/oder Deklarationen möglich.
+
+c) Deklarationen, Prozeduren und Anweisungen. Werden Prozeduren vereinbart,
+ sollte man sie nach den Deklarationen plazieren. Danach sollten die
+ Anweisungen folgen:
+
+ <Deklarationen> ;
+ <Prozeduren> ;
+ <Anweisungen>
+
+ Mehrere (parallele) Prozeduren werden durch ";" voneinander getrennt. In
+ diesem Fall sind die Datenobjekte aus den Deklarationen außerhalb von
+ Prozeduren statisch, d.h. während der gesamten Laufzeit des Programm
+ vorhanden. Solche Datenobjekte werden auch PACKET-Daten genannt.Im
+ Gegensatz dazu sind die Datenobjekte aus Deklarationen in Prozeduren
+ dynamische Datenobjekte, die nur während der Bearbeitungszeit der
+ Prozedur existieren. Innerhalb einer Prozedur dürfen wiederum Refinements
+ verwendet werden. Ein Prozedur-Rumpf hat also den formalen Aufbau wie
+ unter a) oder b) geschildert.
+
+ Die Refinements und Datenobjekte, die innerhalb einer Prozedur deklariert
+ wurden, sind lokal zu dieser Prozedur, d.h. können von außerhalb nicht
+ angesprochen werden.
+
+d) Deklarationen, Prozeduren, Anweisungen und PACKET-Refinements.
+ Zusätzlich zu der Möglichkeit c) ist es erlaubt, neben den Anweisungen
+ außerhalb einer Prozedur auch Refinements zu verwenden:
+
+ <Deklarationen> ;
+ <Prozeduren> ;
+ <Anweisungen> .
+ <Refinements>
+
+ Diese Refinements können nun in Anweisungen außerhalb der Prozeduren
+ benutzt werden oder auch durch die Prozeduren (im letzteren Fall spricht
+ man analog zu globalen PACKET-Daten auch von PACKET-Refinements oder
+ globalen Refinements). In PACKET-Refinements dürfen natürlich keine
+ Datenobjekte verwandt werden, die lokal zu einer Prozedur sind.
+
+
+
+Moduln (PACKETs)
+
+PACKETs sind in ELAN eine Zusammenfassung von Datenobjekten, Prozeduren/
+Operatoren und Datentypen. Man kann sich ein PACKET als ein 'main packet'
+mit Zusätzen vorstellen. PACKETs können separat übersetzt werden, so
+daß der "Zusammenbau" eines umfangreichen Programms aus mehreren PACKETs
+möglich ist.
+
+Elemente eines PACKETs (Prozeduren/Operatoren, Datentypen) können außerhalb
+des PACKETs nur angesprochen werden, wenn sie in der Schnittstelle des
+PACKETs, die auch "interface" genannt wird, aufgeführt wird. Mit anderen
+Worten: es können alle Elemente eines PACKETs von außen nicht angesprochen
+werden, sofern sie nicht über die Schnittstelle "nach außen gereicht" wird.
+Damit wird gewährleistet, daß mehrere Programmierer an einem gemeinsamen
+Projekt arbeiten können und daß eine gemeinsame Benutzung (oder Störung) von
+Programmteilen nur über die in den Schnittstellen von PACKETs aufgeführten
+Objekte erfolgen kann.
+
+Im Gegensatz zu einer Prozedur kann ein PACKET nicht aufgerufen werden (nur
+die Elemente der Schnittstelle können benutzt werden). Beispiel:
+
+
+Programm 32:
+
+ PACKET fuer eine prozedur DEFINES swap:
+
+ PROC swap (INT VAR a, b):
+ INT CONST x :: a;
+ b := a;
+ a := x
+ END PROC swap
+
+ END PACKET fuer eine prozedur
+
+Dies ist ein PACKET, das eine Tausch-Prozedur für INT-Datenobjekte bereit-
+stellt. Das PACKET kann übersetzt werden und dem ELAN-Compiler bekannt
+gemacht werden (EUMEL: "insertieren"). Ist das geschehen, kann man 'swap'
+wie alle anderen Prozeduren (z.B. 'put', 'get') in einem Programm verwenden.
+Tatsächlich werden die meisten Prozeduren und Operatoren (aber auch einige
+Datentypen), die in ELAN zur Verfügung stehen, nicht durch den ELAN-Compiler
+realisiert, sondern durch solche PACKETs. Um solche Objekte einigermaßen
+zu standardisieren, wurde in der ELAN-Sprachbeschreibung festgelegt, welche
+Datentypen, Prozeduren und Operatoren in jedem ELAN-System vorhanden
+sein müssen. Solche PACKETs werden Standard-Pakete genannt. Jeder Installa-
+tion - aber auch jedem Benutzer - steht es jedoch frei, zu den Standard-
+Paketen zusätzliche PACKETs mit in den Compiler aufzunehmen und damit den
+ELAN-Sprachumfang zu erweitern.
+
+Ein ELAN-PACKET beginnt mit dem PACKET-Schlüsselwort. Danach folgt der Name
+des PACKETs (der am Ende des PACKETs hinter END PACKET wieder erscheinen
+muß), gefolgt von der DEFINES-Liste. In dieser Schnittstelle werden die Ob-
+jekte angegeben, die nachfolgenden PACKETs zur Verfügung gestellt werden
+sollen.
+
+In der Schnittstelle werden Prozeduren/Operatoren nur mit ihrem Namen ange-
+geben. Weiterhin können Datentypen und mit CONST vereinbarte Datenobjekte
+in der Schnittstelle aufgeführt werden, aber keine VAR-Datenobjekte, weil
+diese sonst über PACKET-Grenzen hinweg verändert werden könnten.
+
+Im obigen Programm 32 haben wir ein PACKET in der Funktion als spracher-
+weiterndes Instrument gezeigt. Im folgenden Beispiel zeigen wir ein Programm,
+in dem das PACKET-Konzept verwandt wird, um Datenobjekte vor unbefugten
+Zugriff zu schützen.
+
+
+Programm 33:
+
+ PACKET stack handling DEFINES push, pop, init stack:
+
+ LET max = 1000;
+ ROW max INT VAR stack;
+ INT VAR stack pointer;
+
+ PROC init stack:
+ stack pointer := 0
+ END PROC init stack;
+
+ PROC push (INT CONST dazu wert):
+ stack pointer INCR 1;
+ IF stack pointer > max
+ THEN errorstop ("stack overflow")
+ ELSE stack [stack pointer] := dazu wert
+ END IF
+ END PROC push;
+
+ PROC pop (INT VAR von wert):
+ IF stack pointer = 0
+ THEN errorstop ("stack empty")
+ ELSE von wert := stack [stack pointer];
+ stack pointer DECR 1
+ END IF
+ END PROC pop
+
+ END PACKET stack handling;
+
+Nun kann man den Stack über die Prozeduren 'init stack', 'push' und 'pop'
+benutzen (in einem 'main packet').
+
+
+Programm 34:
+
+ init stack;
+ werte einlesen und pushen;
+ werte poppen und ausgeben.
+
+ werte einlesen und pushen:
+ INT VAR anzahl :: 0, wert;
+ REP
+ get (wert);
+ push (wert);
+ anzahl INCR 1
+ UNTIL ende kriterium END REP.
+
+ werte poppen und ausgeben:
+ INT VAR i;
+ FOR i FROM 1 UPTO anzahl REP
+ pop (wert);
+ put (wert)
+ END REP.
+
+Die Datenobjekte 'stack' und 'stack pointer' haben nur Gültigkeit innerhalb
+des PACKETs 'stack handling'. Anweisungen wie z.B.
+
+ put (stack [3]);
+ stack [27] := 5
+
+außerhalb des PACKETs 'stack handling' sind also verboten und werden vom
+ELAN-Compiler entdeckt.
+
+Ein PACKET bietet also auch einen gewissen Schutz vor fehlerhafter Verwen-
+dung von Programmen und Datenobjekten. Wichtig ist weiterhin, daß die Reali-
+sierung des Stacks ohne weiteres geändert werden kann, ohne daß Benutzer-
+programme im 'main packet' geändert werden müssen, sofern die Schnittstelle
+nicht verändert wird. Beispielsweise kann man sich entschließen, den Stack
+nicht durch eine Reihung, sondern durch eine gekettete Liste zu realisieren.
+Davon bleibt ein Benutzerprogramm unberührt.
+
+Die letzte Funktion von PACKETs ist die Realisierung von abstrakten Daten-
+typen. Dazu müssen wir uns aber zuvor die Möglichkeiten anschauen, neue
+Datentypen zu definieren.
+
+
+
+Die Definition neuer Datentypen
+
+Im Gegensatz zur LET-Vereinbarung, bei der lediglich ein neuer Name für
+einen bereits vorhandenen Datentyp eingeführt wurde und bei der somit auch
+keine neuen Operationen definiert werden müssen (weil die Operationen für
+den abzukürzenden Datentyp verwandt werden können), wird durch eine TYPE-
+Vereinbarung ein gänzlich neuer Datentyp eingeführt. Im Gegensatz zu
+Strukturen und Reihungen stehen für solche Datentypen noch nicht einmal die
+Zuweisung zur Verfügung. Beispiel:
+
+ TYPE PERSON = STRUCT (TEXT name, vorname, INT alter)
+
+Ein solcher Datentyp kann wie auch alle anderen Datentypen verwandt werden
+(Deklarationen, Parameter, Werte liefernde Prozeduren, als Komponenten in
+Reihungen und Strukturen usw.).
+
+Der neudefinierte Datentyp wird abstrakter Datentyp genannt. Er kann mit
+Hilfe eines PACKETs (vergl. nächsten Abschnitt) anderen Programmteilen zur
+Verfügung gestellt werden. Die rechte Seite der TYPE-Vereinbarung wird
+"konkreter Typ", "Realisierung des Datentyps" oder Feinstruktur genannt.
+
+Um neue Operatoren und/oder Prozeduren für einen abstrakten Datentyp zu
+schreiben, ist es möglich, auf die Komponenten des Datentyps (also auf die
+Feinstruktur) mit Hilfe des Konkretisierers zuzugreifen. Der Konkretisierer
+arbeitet ähnlich wie die Subskription oder Selektion: er ermöglicht eine
+typmäßige Umbetrachtung vom abstrakten Typ zum Datentyp der Feinstruktur.
+Beispiel:
+
+ TYPE MONAT = INT;
+
+ PROC put (MONAT CONST m):
+ put ( CONCR (m))
+ END PROC put;
+
+Der Konkretisierer ist bei Feinstrukturen notwendig, die von elementarem
+Datentyp sind. Besteht dagegen die Feinstruktur aus Reihungen oder Struk-
+turen, dann wird durch eine Selektion oder Subskription eine implizite Kon-
+kretisierung vorgenommen. Beispiel:
+
+ TYPE LISTE = ROW 100 INT;
+
+ LISTE VAR personal nummer;
+ ...
+ personal nummer [3] := ...
+ (* das gleiche wie *)
+ CONCR (personal nummer) [3] := ...
+
+Denoter für neudefinierte Datentypen werden mit Hilfe des Konstruktors
+gebildet:
+
+ TYPE GEHALT = INT;
+
+ GEHALT VAR meins :: GEHALT : (1 000 000);
+
+Besteht die Feinstruktur aus einem Datenverbund, muß der Konstruktor u.U.
+mehrfach geschachtelt angewandt werden:
+
+ TYPE KOMPLEX = ROW 2 REAL;
+
+ KOMPLEX CONST x :: KOMPLEX : ( ROW 2 REAL : ( 1.0, 2.0));
+
+
+
+Abstrakte Datentypen
+
+Auf die Feinstruktur über den Konkretisierer eines neudefinierten Datentyps
+darf nur in dem PACKET zugegriffen werden, in dem der Datentyp definiert
+wurde. Der Konstruktor kann ebenfalls nur in dem typdefinierenden PACKET
+verwandt werden.
+
+Wird der Datentyp über die Schnittstelle des PACKETs anderen Programmteilen
+zur Benutzung zur Verfügung gestellt, so müssen Operatoren und/oder Proze-
+duren für den Datentyp ebenfalls "herausgereicht" werden. Da dann der neude-
+finierte Datentyp genauso wie alle anderen Datentypen verwandt werden kann,
+aber die Komponenten nicht zugänglich sind, spricht man von abstrakten
+Datentypen.
+
+Welche Operationen sollten für einen abstrakten Datentyp zur Verfügung
+stehen? Obwohl das vom Einzelfall abhängt, werden meistens folgende
+Operationen und Prozeduren definiert:
+
+- 'get'- und 'put'-Prozeduren.
+- Zuweisung (auch für die Initialisierung notwendig).
+- Denotierungs-Prozedur (weil kein Konstruktor für den abstrakten Datentyp
+ außerhalb des definierenden PACKETs zur Verfügung steht)
+
+
+Programm 35:
+
+ PACKET widerstaende DEFINES WIDERSTAND, REIHE, PARALLEL, :=, get, put:
+
+ TYPE WIDERSTAND = INT;
+
+ OP := (WIDERSTAND VAR l, WIDERSTAND CONST r):
+ CONCR (l) := CONCR (r)
+ END OP :=;
+
+ PROC get (WIDERSTAND VAR w):
+ INT VAR i;
+ get (i);
+ w := WIDERSTAND : (i)
+ END PROC get;
+
+ PROC put (WIDERSTAND CONST w):
+ put (CONCR (w))
+ END PROC put;
+
+ WIDERSTAND OP REIHE (WIDERSTAND CONST l, r):
+ WIDERSTAND : ( CONCR (l) + CONCR (r))
+ END OP REIHE;
+
+ WIDERSTAND OP PARALLEL (WIDERSTAND CONST l, r):
+ WIDERSTAND :
+ ((CONCR (l) * CONCR (r)) DIV (CONCR (l) + CONCR (r)))
+ END OP PARALLEL
+
+ END PACKET widerstaende
+
+Dieses Programm realisiert den Datentyp WIDERSTAND und mit den Operationen
+eine Fachsprache, mit dem man nun leicht WIDERSTANDs-Netzwerke berechnen
+kann, wie z.B. folgendes:
+
+
+ +--- R4 ---+
+ | |
+ +--- R1 ---+ +--- R5 ---+
+ | | | |
+ ---+ +--- R3 ---+ +---
+ | | | |
+ +--- R2 ---+ +--- R6 ---+
+ | |
+ +--- R7 ---+
+
+Zur Berechnung des Gesamtwiderstandes kann nun folgendes Programm
+geschrieben werden:
+
+ ROW 7 WIDERSTAND VAR r;
+ widerstaende einlesen;
+ gesamtwiderstand berechnen;
+ ergebnis ausgeben.
+
+ widerstaende einlesen:
+ INT VAR i;
+ FOR i FROM 1 UPTO 7 REP
+ put ("bitte widerstand R"); put (i); put (":");
+ get (r [i]);
+ END REP.
+
+ gesamtwiderstand berechnen:
+ WIDERSTAND CONST rgesamt :: (r [1] PARALLEL r [2]) REIHE
+ r [3] REIHE (r [4] PARALLEL r [5] PARALLEL r [6]
+ PARALLEL r [7]).
+
+ ergebnis ausgeben:
+ line;
+ put (rgesamt).
+
+
+Aufgabe (HSG):
+
+ Was ist ein Modul? Was ist ein Interface? Was ist der Unterschied
+ zwischen einem PACKET und einer Prozedur?
+ Die Realisierung von WIDERSTAND durch INTs ist nicht in allen Fällen
+ befriedigend. Warum? (Beachte besonders die Realisierung des OP
+ PARALLEL).
+ Wenn man bei der Typ-Vereinbarung von WIDERSTAND INT gegen REAL
+ austauschen würde, wo müßte man noch Änderungen vornehmen? Sind
+ insbesondere Änderungen im Benutzer-Programm (hier im 'main packet')
+ notwendig?
+Übungsziel: PACKET-Begriff
+
+
+
+Programmstruktur 2
+
+Nun können wir auch erklären, wie ein ELAN-Programm mit mehreren PACKETs
+aussieht. Ein Programm besteht aus einer Folge von PACKETs, dem ein 'main
+packet' folgt. Es ist auch möglich, PACKETs vorübersetzen zu lassen, so daß
+es für einen Nutzer so aussieht, als ob er nur ein 'main packet' übersetzen
+läßt. Tatsächlich sind zumindest die Standard-Packets vorübersetzt vorhanden.
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil7 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil7
new file mode 100644
index 0000000..1aadc5f
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil7
@@ -0,0 +1,2469 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 7: Dateien, Datei-Verwaltung und Datenräume
+
+1. Übersicht
+
+Dateien dienen zur Aufnahme von Informationen, die auch über die Bearbei-
+tungszeit eines Programms erhalten bleiben (können). Dateien werden als
+Objekte in einer Task gehalten. Sie bleiben solange erhalten, bis sie expli-
+zit gelöscht ('forget'-Kommando) oder die Task beendet wird ('end'-Kommando).
+
+Dateien kann man an andere Tasks schicken ('save'-Kommando) oder von anderen
+Tasks holen ('fetch'-Kommando). Mit diesen (hier vorgestellten) Kommandos
+ist der Transport von Dateien jedoch nur in direkter Linie des Task-Baums
+möglich, also an einen "Vater" oder einen "Sohn". Damit ist automatisch eine
+Datei-Hierarchie im EUMEL-System realisiert.
+
+Alle Datei-Arten des EUMEL-Systems basieren auf Datenräumen. Ein Datenraum
+ist ein Speicherplatz, der 1 MByte Daten speichern kann und vom EUMEL-System
+verwaltet wird. Datenräume können gelöscht, kopiert usw. werden. Mit Hilfe
+Mit Hilfe von Datenräumen werden alle Datei-Arten des EUMEL-Systems reali-
+siert, indem einem Datenraum eine Struktur (Datentyp) aufgeprägt wird. Da-
+durch wird es Benutzern des EUMEL-Systems ermöglicht, auf einfache Weise
+neben den bereits vorhandenen Datei-Arten (FILEs für die Speicherung von
+Texten, PICFILEs für die Speicherung von Bildinformationen, u.a.m.)
+spezielle Dateien zu konstruieren.
+
+Die wichtigste Datei-Art, mit der ein Benutzer in Berührung kommt, ist die
+sequentielle Datei, genannt FILE. Ein FILE kann nur TEXTe aufnehmen und hat
+z.Zt. ein Fassungsvermögen von 4000 Zeilen (Sätze). Insgesamt darf ein FILE
+1 MByte aufnehmen. Eine Datei-Zeile (Satz) kann bis zu 32 000 Zeichen auf-
+nehmen.
+
+FILEs können in einer von drei Betriebsrichtungen bearbeitet werden:
+- "input": nur Lesen.
+- "output": nur Schreiben.
+- "modify": Lesen/Schreiben und zusätzlich beliebiges Positionieren, Ein-
+ fügen und Löschen von Sätzen.
+
+'input'-Dateien sind also Eingabedateien, 'output'- sind Ausgabedateien und
+'modify'-Dateien kann man verändern. Insbesondere die 'modify'-Dateien eig-
+nen sich, um andere Datei-Arten leicht zu realisieren (z.B. indexsequentiel-
+le Dateien).
+
+Eine Datei kann auf einen bestimmten Zeilenbereich eingeschränkt werden. Ein
+solches Segment kann selbst wie eine Datei von einem Programm behandelt
+werden.
+
+
+
+2. Datei-Kommandos
+
+Dateien werden in der Regel in einer Benutzer-Task gehalten. Die Kommandos
+für die Behandlung von Dateien in einer Benutzer-Task werden hier vorge-
+stellt. Dann wird erklärt, wie Dateien zu einer übergeordneten Task ge-
+schickt oder geholt werden können.
+
+
+
+Datei-Kommandos für Benutzer-Tasks
+
+Im Monitor-Dialog kann man Dateien kopieren, löschen und einen anderen Namen
+geben.
+
+Mit dem Kommando
+
+ edit ("dateiname")
+
+wird eine Text-Datei im Monitor-Dialog (implizit) eingerichtet, wenn es sich
+um einen noch nicht vorhandenen 'dateiname' handelt (vergl. auch die Editor-
+Beschreibung).
+
+Welche Dateien in der Benutzer-Task vorhanden sind, kann mit dem Kommando
+
+ list
+
+erfragt werden. 'list' zeigt auf dem Bildschirm die Dateinamen der Benutzer-
+Task. Vor jedem Namen steht ein Datum, welches anzeigt, an welchem Tag die
+Datei zuletzt von einem Programm bearbeitet wurde. Ein 'a' hinter dem Datum
+kennzeichnet Dateien, die nach einer Archivierung nicht bearbeitet wurden.
+
+Ein Duplizieren einer Datei kann mit
+
+ copy ("alte datei", "neue datei")
+
+erreicht werden, wobei eine Kopie von 'alter datei' angelegt wird, die den
+Namen 'neue datei' erhält. Man beachte, daß es sich um eine logische (und
+vorerst um keine physikalische) Kopie handelt. Erst bei Schreibzugriffen
+werden Seiten " entshared" ("copy-on-write"). Ein Umbenennen einer Datei
+kann mit
+
+ rename ("alter datei name", "neuer datei name")
+
+erfolgen. Mit
+
+ forget ("dateiname")
+
+kann eine Datei gelöscht werden.
+
+Wurde in einer Datei editiert, kann durch Löschen oder Einfügen von Zeilen
+der interne Verwaltungsaufwand hoch werden, so daß Positionierungen nicht
+mehr effizient vor sich gehen. Mit dem Kommando
+
+ reorganize ("dateiname")
+
+wird die Datei so organisiert, als wenn sie neu erstellt wäre (gilt nur für
+Text-Dateien). Sie braucht dann in der Regel auch etwas weniger Speicher-
+platz.
+
+
+Merke: Das Kommando 'rename' gibt einer Datei einen anderen Namen, 'copy'
+dupliziert eine Datei. Mit 'list' kann man sich anzeigen lassen, welche
+Dateien in der Task vorhanden sind.
+
+
+
+Datei-Kommandos für Vater-Tasks
+
+Man kann Dateien von einer Vater-Task holen oder an eine Vater-Task schicken,
+um sie dort längerfristig zu speichern. Auch wenn die Benutzer-Task gelöscht
+wird, bleiben alle Dateien, die bei einer Vater-Task gespeichert (also
+"gerettet") sind, erhalten. Andere Sohn-Tasks können sich Dateien bei einer
+Vater-Task abholen.
+
+Auf Dateien einer Benutzer-Task können andere Nutzer aus anderen Tasks in
+der Regel nicht zugreifen. Manchmal ist es jedoch notwendig, daß mehrere
+Nutzer Dateien gemeinsam benutzen oder eine Datei eine Task "überleben" soll.
+In solchen Fällen muß man Dateien bei einem Vater aufbewahren.
+
+Mit der Prozedur
+
+ global manager
+
+kann die Benutzer-Task zu einem Datei-Manager gemacht werden. Erst nach
+Aufruf dieser Prozedur können Söhne dieser Task eingerichtet werden.
+
+Von einer Benutzer-Task kann eine Datei mit
+
+ save ("Buch 1")
+
+der direkten Vater-Task übergeben werden, wobei 'buch 1' in der Benutzer-
+Task erhalten bleibt. 'save' wirkt also wie ein Transport einer Kopie der
+angegebenen Datei in die Vater-Task. Achtung: ist eine Datei 'Buch 1' in der
+Vater-Task bereits vorhanden, wird diese ohne Warnung überschrieben.
+
+Analog zu der 'forget'-Prozedur für Dateien einer Benutzer-Task können
+Dateien einer unmittelbaren Vater-Task mit
+
+ erase ("datei name")
+
+gelöscht werden. Soll eine Datei von einer Vater-Task in eine Benutzer-Task
+geholt werden, so benutzt man die Prozedur
+
+ fetch ("datei")
+
+Nach Aufruf dieser Prozedur wird eine Kopie der angegebenen Datei in der
+Benutzer-Task angelegt. Ist bereits eine Datei 'datei' in der Benutzer-Task
+vorhanden, so erfolgt eine Fehlermeldung.
+
+Mit 'save', 'fetch' und 'erase' ist es möglich, daß zwei oder mehr Benutzer
+eine Datei alternierend bearbeiten. In diesem Fall müssen sich die Benutzer
+als Söhne einer gemeinsamen Vater-Task einrichten und die Datei mit 'fetch'
+jeweils in die Benutzer-Task holen. Um zu verhindern, daß ein anderer Be-
+nutzer zur gleichen Zeit mit der Datei arbeitet, wird sie jeweils mit 'erase'
+bei der Vater-Task gelöscht. Nach Beendigung der Arbeiten muß die Datei dann
+wieder mit 'save' in die Vater-Task transportiert werden. Dann steht sie
+wieder anderen Benutzern zur Verarbeitung zur Verfügung. Beispiel:
+
+ fetch ("datei"); erase ("datei"); (* Datei vom Vater holen und dort
+ loeschen *)
+ edit ("datei"); (* Datei bearbeiten *)
+ save ("datei"); (* Datei zur Vater-Task bringen *)
+ forget ("datei") (* Datei in Benutzer-Task
+ loeschen *)
+
+Mit den Prozeduren
+
+ save all
+ fetch all
+
+kann man alle Dateien einer Benutzer-Task in die direkte Vater-Task schicken
+oder von dort holen.
+
+Merke:
+ * * * * * * * * * *
+ * *
+ * <-+ * Vater-Task
+ * | | *
+ * * * | * * | * * *
+ | |
+ fetch save
+ | |
+ * * * | * * | * * *
+ * | | *
+ * ->edit| * Benutzer-Task
+ * *
+ * * * * * * * * * *
+
+
+
+Ansprechen von anderen Tasks
+
+Sollen Dateien in andere als die direkte Vater-Task transportiert oder von
+anderen Tasks geholt werden, muß man den internen Task-Bezeichner angeben.
+
+Es gibt einige Prozeduren, mit denen man den internen Task-Bezeichner einer
+Task bekommt. Solch eine Prozedur ist
+
+ father
+
+Prozeduren, mit denen man Dateien transportieren kann, liegen auch in einer
+Version vor, bei denen man den internen Task-Bezeichner angeben kann.
+Beispiel:
+
+ save ("datei", father) (* wie: save ("datei") *)
+ erase ("datei", father) (* wie: erase ("datei") *)
+ fetch ("datei", father) (* wie: fetch ("datei") *)
+
+Weitere Prozeduren, die einen internen Task-Bezeichner liefern, sind:
+
+ myself
+ printer
+ public
+ archive
+
+Anmerkung: Zur Prozedur 'archive' siehe auch das nächste Kapitel; zu 'print'
+siehe auch SPOOLER. Dadurch kann man Dateien auch zu anderen als der
+Vater-Task transportieren, holen oder löschen. Beispiele:
+
+ erase ("datei", public) (* Loescht 'datei' in Task 'PUBLIC' *)
+ fetch ("datei", public) (* Holt 'datei' aus der Task "PUBLIC" *)
+ save ("datei", public) (* Kopiert 'datei' in die Task 'PUBLIC' *)
+ save ("datei", printer) (* Uebergibt 'datei' dem Spooler und
+ druckt die Datei *)
+ list (father) (* Listet Dateien der Vater-Task *)
+
+Bei komplizierten "Verwandschafts-Verhältnisse" von Tasks ist es einfacher,
+eine Task mit Hilfe des Task-Namens anzusprechen. Das erfolgt mit Hilfe der
+Prozedur 'task'. Beispiel:
+
+ save ("datei", task ("hugo"))
+
+'task' liefert den internen Task-Bezeichner von 'hugo'. Die Umkehr-Prozedur
+zu 'task' ist 'name':
+
+ put (name (myself))
+
+schreibt den Namen der Task, in der man sich gerade befindet, auf den Bild-
+schirm.
+
+Durch die Prozedur 'father', die einen internen Task-Bezeichner als
+Parameter erwartet, kann man an die Vater-Task einer Task gelangen.
+Beispiel:
+
+ save ("datei", father (father))
+
+Hier wird die Datei 'datei' an die Vater-Task der Vater-Task geschickt (also
+zur "Großvater-Task").
+
+Mit dem Operator /
+
+kann man aus einem Tasknamen den internen Tasknamen erhalten. '/' kann über-
+all dort eingesetzt werden, wo ein interner Taskname verlangt wird. Beispiel:
+
+ task status (/"meine task")
+
+
+Merke: Mit den internen Task-Bezeichner kann man mit anderen Tasks als der
+Vater-Task kommunizieren.
+
+
+
+Kommandos für mehrere Dateien
+
+Durch die vom EUMEL-System bereitgestellten Task-Variablen und Datei-Ver-
+zeichnisse (Thesaurus, Plural: Thesauren) ist es möglich, mehrere Dateien
+mit einem Kommando zu behandeln.
+
+Sollen alle Dateien einer Task zu einer anderen transportiert werden (mit
+'save') oder alle Dateien geholt werden, kann man 'save all' und 'fetch all'
+auch mit einem internen Task-Bezeichner versehen. Beispiele:
+
+ save all (public)
+ fetch all (public)
+
+Damit werden alle Dateien der Benutzer-Task zu der Task 'PUBLIC' geschickt
+oder von dort geholt.
+
+Die internen Tasknamen wie z.B. 'myself', 'father', 'public' usw. werden
+auch bei dem Einsatz eines Thesaurus benutzt. Was ist ein "Thesaurus"?
+
+Das EUMEL-System hält sich die Dateinamen einer Task des Taskbaums in einer
+internen Liste. Die Namens-Liste wird Thesaurus (laut Duden: ein
+"systematisch geordnetes Verzeichnis") genannt.
+
+Der Operator ALL liefert den Thesaurus einer Task. Beispiel:
+
+ ALL father
+ ALL myself
+
+liefert jeweils den Thesaurus der Vater- oder der eigenen Task. Solche
+Thesauren kann man als Parameter der meisten der oben erwähnten Kommandos
+verwenden:
+
+ save (ALL myself) (* kopiert alle Dateien in die Vater-Task;
+ arbeitet wie 'save all' *)
+ forget (ALL myself) (* loescht alle Dateien der Benutzer-Task *)
+ fetch (ALL father) (* holt alle Dateien der Vater-Task;
+ arbeitet wie 'fetch all' *)
+
+Der Operator SOME dagegen bietet einen Thesaurus vorher zum Editieren an,
+um Dateinamen zu streichen (HOP RUBOUT). Beispiele:
+
+ fetch (SOME father) (* holt die nicht gestrichenen Dateien *)
+ save (SOME myself) (* kopiert die nicht gestrichenen Dateien *)
+ forget (SOME myself) (* loescht die nicht gestrichenen Dateien *)
+
+Es ist auch möglich, aus den Thesauren mehrerer Tasks einen neuen Thesaurus
+zu bilden:
+
+ - (* Differenzmenge *)
+ / (* Schnittmenge *)
+ + (* Vereinigungsmenge *)
+
+Beispiel:
+
+ fetch (ALL father - ALL myself)
+
+holt alle Dateien der Vater-Task, die nicht bereits in der Benutzer-Task
+sind.
+
+
+Merke: Mit den Operatoren 'ALL' und 'SOME' kann man mehrere Dateien mit
+einem Kommando behandeln.
+
+
+
+Datei-Schutz durch Paßworte und Verschlüsselung
+
+Dateien können vor unbefugtem Zugriff mit Hilfe von Paßworten und/oder der
+Verschlüsselung der Informationen geschützt werden.
+
+
+
+Paßworte
+
+Paßworte für Dateien dienen zur Verhinderung von unbefugtem Zugriff auf
+Dateien, die bei einer Vater-Task gespeichert werden. (Die Dateien der
+Benutzer-Task können durch ein Task-Paßwort geschützt werden). Dabei sollte
+man bedenken, daß Paßworte bekannt werden können.
+
+Der Paßwort-Schutz ist im EUMEL-System etwas sicherer als in anderen
+Betriebssystemen, weil Paßworte nur selten angegeben werden müssen und
+daher nicht so leicht bekannt werden können (z.B. durch "über die Schulter
+schauen"). Die Kommandozeile wird zudem bei der Angabe eines Paßworts nach
+dem Betätigen der RETURN-Taste gelöscht.
+
+Paßworte werden nur im Verkehr mit Vater-Tasks eingesetzt. Lokale Benutzer-
+Dateien brauchen nicht gesondert gesichert zu werden, da man ein Paßwort
+auf die Benutzer-Task legen kann oder die zu sichernden Dateien aus dem
+System nehmen kann. Ein Paßwort kann mit der Prozedur
+
+ enter password ("schreibpasswort / lesepasswort")
+
+angegeben oder ein bereits eingestelltes Paßwort kann mit dieser Prozedur
+überschrieben werden. Voreingestellt ist kein Paßwort. Nachdem ein Benutzer
+die 'enter password'-Prozedur angegeben hat, wird jeder Datei-Verkehr mit
+einer Vater-Task mit Hilfe dieses Paßworts überprüft. Unzulässige Zugriffe
+durch Benutzer anderer Tasks auf Dateien einer Vater-Task werden abgewiesen.
+
+Ein Paßwort hat eine eigene Syntax. Es besteht aus zwei Teilen, die leer
+sein können und die durch ein "/"-Zeichen voneinander getrennt sind. Der
+erste Teil ist das Schreib-Paßwort, der zweite das Lese-Paßwort. Wird kein
+Lese-Paßwort angegeben, gilt das Schreib-Paßwort auch für das Lesen. Ist
+also kein "/"-Zeichen im Paßwort-String vorhanden, so wird das Schreib-
+Paßwort sozusagen gedoppelt. Beispiele:
+
+ enter password ("") (* kein Paßwort *)
+ enter password ("hugo") (* 'hugo' gilt fuer das Schreiben und
+ Lesen *)
+ enter password ("egon/meier") (* 'egon' fuers Schreiben, 'meier' fuers
+ Lesen *)
+
+Zusätzlich kann das "-"-Zeichen in dem Teil des Paßworts angegeben werden,
+für den ein Zugriff nicht erlaubt sein soll. Beispiel:
+
+ enter password ("-/nurlesen") (* Schreibzugriff nicht erlaubt,
+ Lese-Passwort ist 'nurlesen' *)
+
+Das Lese-Paßwort gilt für die Prozedur
+
+ fetch
+
+während das Schreib-Paßwort für die Prozeduren
+
+ save
+ erase
+
+gilt. Sofern die betreffende Datei durch ein Paßwort geschützt ist, ist
+folgendes zu beachten:
+
+a) fetch:
+ Will ein Benutzer mit der Prozedur 'fetch' eine Datei in seine Benutzer-
+ Task holen, so wird sein aktuell eingestelltes Paßwort (nur Lese-Teil)
+ und das Paßwort der Datei überprüft. Stimmen diese nicht überein, so wird
+ der 'fetch'-Zugriff auf eine Datei der Vater-Task abgewiesen.
+
+b) save:
+ Bei einem Transport in eine Vater-Task mit Hilfe der Prozedur 'save' sind
+ zwei Fälle zu unterscheiden:
+
+ - Datei ist in der Vater-Task noch nicht vorhanden: Diese Datei wird
+ in der Vater-Task mit dem aktuellen Paßwort des Benutzers einge-
+ tragen.
+
+ - Datei ist in der Vater-Task bereits vorhanden und soll durch die
+ neue Datei ersetzt werden: Es wird überprüft, ob das aktuelle
+ Schreib-Paßwort des Benutzers mit dem der gleichnamigen Datei in der
+ Vater-Task übereinstimmt. Ist dies nicht der Fall, wird die Datei
+ nicht in der Vater-Task eingetragen.
+
+c) erase:
+ Soll eine Datei der Vater-Task gelöscht werden, wird überprüft, ob das
+ aktuelle Schreib-Paßwort mit dem der zu löschenden Datei in der Vater-
+ Task übereinstimmt. Ist dies nicht der Fall, wird die Lösch-Operation
+ abgewiesen.
+
+
+Merke: Dateien können bei der Sicherung in einer Vater-Task vor unbefugtem
+Zugriff durch Paßworte geschützt werden.
+
+
+
+Dateien verschlüsseln
+
+Zusätzlich zu einem Paßwort kann man eine Datei vor unbefugtem Zugriff
+schützen, indem sie verschlüsselt wird.
+
+Mit den Prozeduren
+
+ crypt
+ decrypt
+
+kann eine Datei ver- oder entschlüsselt werden (Datenschutz für einzelne
+Dateien). Dabei ist es möglich, eine Datei mehrfach zu verschlüsseln (man
+muß die Verschlüsselung dann allerdings auch mehrfach rückgängig machen).
+Beispiel:
+
+ crypt ("datei", "schluessel")
+
+verschlüsselt 'datei' mit 'schluessel'. Die Entschlüsselung erfolgt, indem
+man die Prozedur 'decrypt' auf 'datei' anwendet und den gleichen Schlüssel
+zur Entschlüsselung benutzt. Beispiel:
+
+ decrypt ("datei", "schluessel")
+
+Den Text des Schlüssels (hier: 'schluessel') sollte man sich also unbedingt
+merken, sonst kann die Datei nicht mehr entschluesselt werden.
+
+Merke: Dateien werden durch 'crypt' und 'decrypt' ver- und entschlüsselt.
+
+
+
+3. Das Archiv
+
+Dateien werden im EUMEL-System auf Systemträgern gespeichert. Mit dem Archiv
+können Dateien vom System auf externe Speichermedien (normalerweise
+Disketten) gebracht und von diesen ins System geholt werden.
+
+Das EUMEL-Archiv hat folgende Aufgaben:
+
+a) Das Archiv wird als Sicherheitsbereich benutzt, indem man von wichtigen
+ Dateien Kopien anlegt und diese außerhalb des EUMEL-Systems speichert.
+
+b) Man kann das Archiv-System aber auch benutzen, um Dateien, die nur selten
+ oder in größeren Zeitabständen benötigt werden, zu kopieren ("archi-
+ vieren") und im EUMEL-System zu löschen. Falls diese Dateien wieder
+ gebraucht werden, können sie wieder in das EUMEL-System geholt werden.
+ Damit wird erreicht, daß im EUMEL-System nur die wirklich notwendigen
+ Dateien stehen.
+
+c) Sollen Dateien von einer EUMEL-Installation auf eine andere übertragen
+ werden, so kann man ebenfalls Archive verwenden.
+
+d) Bei Versionswechsel des EUMEL-Systems sind Archive die einzige Möglich-
+ keit, Dateien in die neue Systemversion einzuspielen. Dabei wird garan-
+ tiert, daß zumindest Archive der letzten Version gelesen werden können.
+
+Merke: Durch das Archiv können Dateien außerhalb des Systems gesichert
+werden.
+
+
+
+Das Archiv reservieren
+
+Soll archiviert werden, muß man das dem Archiv-System mitteilen, damit nicht
+ein anderer Benutzer zur gleichen Zeit auf das Archiv zugreift. Dieser
+Vorgang wird "reservieren" genannt.
+
+Archiv-Disketten haben aus Sicherheitsgründen einen Namen. Dieser Name muß
+bei der Anmeldung einer Archivierung angegeben werden. Die Anmeldung einer
+Archivierung und gleichzeitige Reservierung erfolgt mit
+
+ archive ("name")
+
+Der Archiv-Name wird bei folgenden Archiv-Operationen zur Überprüfung mit
+dem eingelegten Archiv verwandt.
+
+Wichtig: Eine Diskette sollte erst nach dem 'archive'-Kommando in das
+Laufwerk geschoben werden, d.h. erst dann, wenn das Archiv-System reserviert
+ist. Sonst kann es geschehen, daß ein anderer Benutzer auf dieser Diskette
+archiviert.
+
+Archivierungen erfolgen durch die schon beschriebenen Transportkommandos
+'save' und 'fetch'. Dabei wird als Zieltask 'archive' angegeben. Beispiel:
+
+ save ("mein buch", archive)
+ fetch ("kapitel 1", archive)
+ save all (archive)
+ fetch all (archive)
+
+Das Archiv bleibt für den Nutzer solange reserviert, wie er Archivierungs-
+operationen vollzieht. Dann sollte er das Archiv wieder für andere Benutzer
+mit der Prozedur
+
+ release (archive)
+
+freigeben.
+
+Leitet ein Nutzer innerhalb von fünf Minuten nach der letzten Archiv-
+Operation keine neue ein und meldet sich ein anderer Nutzer mit 'archive'
+bei dem Archiv-System an, so wird dem ersten Nutzer die Archiv-Berechtigung
+entzogen, um Blockaden zu verhindern. Wenn der erste Nutzer eine erneute
+Archiv-Operation versucht, erhält er eine Fehlermeldung. Dadurch kann ein
+Nutzer das Archiv längere Zeit (ohne 'release') benutzen, ohne den Betrieb
+zu stören, da andere Nutzer bei Bedarf jederzeit eingeschoben werden.
+
+Wichtig: Muß die Archiv-Floppy gewechselt werden (weil etwa von einer
+Diskette eine Datei gelesen wurde und diese auf eine andere geschrieben
+werden soll), muß erneut das 'archive'-Kommando gegeben werden. Dies ist
+notwendig, um das Verzeichnis aller auf der Diskette befindlichen Dateien
+der neuen Diskette zu lesen.
+
+Merke: Mit 'archive' wird die Archiv-Verwaltung für einen Nutzer reserviert, mit 'release' wieder freigegeben. Mit 'archive' wird
+gleichzeitig ein Archiv-Name eingestellt, der bei Archiv-Operationen mit dem
+auf der Diskette gespeicherten Archiv-Namen verglichen wird.
+
+
+
+Archiv löschen und einen Namen geben
+
+Bevor ein Archiv-Diskette benutzt werden kann, muß sie den mit 'archive'
+eingestellten Namen bekommen.
+
+Bei der Erstbenutzung eines Archivs muß dieses mit einem Namen versehen
+werden. Als Archiv-Name wird der mit 'archive' eingestellte Name verwandt.
+Dies erfolgt mit der Prozedur
+
+ clear (archive)
+
+Gleichzeitig werden alle Dateien, die sich eventuell vorher auf dem Archiv-
+Träger befanden, gelöscht. Somit wird 'clear' auch für das Löschen von
+Archiven verwendet.
+
+
+Merke: Mit 'clear' wird die Archiv-Diskette gelöscht und gleichzeitig der
+mit 'archive' eingestellte Name gegeben.
+
+
+
+Einfache Archiv-Operationen
+
+In diesem Abschnitt werden einfache Archiv-Operationen beschrieben.
+
+Mit den Prozeduren
+
+ save ("datei", archive)
+ fetch ("datei", archive)
+ erase ("datei", archive)
+
+kann jeweils eine Datei auf die Archiv-Diskette ('save') und von dem Archiv
+in das EUMEL-System kopiert ('fetch') oder auf dem Archiv gelöscht ('erase')
+werden. Dabei bedeutet 'datei' die zu kopierende Datei und 'archive' der
+interne Task-Name für die Archiv-Verwaltung. Bei den ersten zwei Kommandos
+ist zu beachten, daß die Datei, die auf das Archiv geschrieben (bei 'save')
+oder die in die Benutzer-Task geholt werden soll (bei 'fetch'), immer
+kopiert wird. Dateien bleiben also im "Ursprung" immer erhalten.
+
+Ist eine Datei gleichen Namens bereits auf der Archiv-Diskette (bei 'save')
+oder in der Benutzer-Task (bei 'fetch') vorhanden, wird von der Archiv-Ver-
+waltung angefragt, ob diese Datei überschrieben werden darf. Es kann somit
+nicht zu einem unbeabsichtigten Löschen von Dateien kommen.
+
+Mit dem Kommando
+
+ list (archive)
+
+erhält man (wie bei dem "normalen" 'list'-Kommando) ein Namens-Verzeichnis
+aller Dateien, die sich auf der eingelegten Archiv-Diskette befinden.
+
+
+Merke: Nachdem ein Archiv mit 'archive' reserviert wurde, kann mit 'save'
+eine Datei auf das Archiv geschrieben und mit 'fetch' eine Datei von dem
+Archiv in die Benutzer-Task kopiert werden.
+
+
+
+Archiv-Operationen für mehrere Dateien
+
+Hier wird beschrieben, wie man mehrere Dateien auf einmal auf ein Archiv
+schreibt oder von einem Archiv liest.
+
+Mit den Kommandos
+
+ save all (archive)
+ fetch all (archive)
+
+werden alle Dateien der Benutzer-Task auf das Archiv geschrieben bzw. von
+dort geholt.
+
+Zusätzlich ist es möglich, die Operatoren 'ALL' und 'SOME' auf ein Archiv
+anzuwenden. Wie bereits geschildert, liefern diese Operatoren einen
+Thesaurus der angegebenen Task: 'ALL' liefert alle Dateinamen, während man
+bei 'SOME' eine Auswahl treffen kann. Damit ist es möglich, alle oder einige
+Dateien der Benutzer-Task auf eine Archiv-Diskette zu kopieren oder von der
+Archiv-Diskette in die Benutzer-Task zu holen:
+
+ fetch (SOME archive, archive) (* zeigt die Namen der Dateien der
+ Archiv-Diskette. Die nicht ge-
+ strichenen Dateien werden in die
+ Benutzer-Task geholt *)
+ save (SOME myself, archive) (* zeigt die Namen der Dateien der
+ Benutzer-Task. Die nicht ge-
+ strichenen Dateien werden auf die
+ Archiv-Diskette kopiert *)
+ save (ALL archive, archive) (* sichert alle Dateien der Benutzer-
+ Task, die sich schon auf dem Archiv
+ befinden (alte Version). Das
+ Kommando ist für Sicherungs-
+ Disketten gedacht, bei dem man immer
+ die gleichen Dateien auf dem Archiv
+ haben will *)
+
+Durch die Thesaurus-Operatoren '-' (Differenzmenge), '/' (Schnittmenge) und
+'+' (Vereinigungsmenge) kann man kompliziertere Wirkungen erzielen.
+Beispiele:
+
+ save (ALL myself - ALL archive, archive) (* Schreibt alle Dateien der
+ Benutzer-Task auf das Archiv,
+ die nicht bereits auf dem
+ Archiv stehen *)
+ save (ALL myself - ALL father - ALL archive, archive)
+ (* Schreibt alle Dateien der
+ Benutzer-Task auf das Archiv,
+ mit Ausnahme der Dateien, die
+ längerfristig in der Vater-
+ Task gespeichert sind und die
+ nicht bereits auf dem Archiv
+ stehen *)
+ fetch (ALL archive - ALL myself) (* Holt alle Dateien vom Archiv,
+ die sich nicht bereits in der
+ Benutzer-Task befinden *)
+
+Werden mehrere Dateien mittels eines Thesaurus bearbeitet, kann man nach
+einer Unterbrechung der Bearbeitung (d.h. Fehlermeldung) die Operation wieder
+aufsetzen. Dazu liefert das Kommando
+
+ remainder
+
+den "Rest"-Thesaurus. Er enthält alle nicht bearbeiteten Dateinamen.
+Beispiel:
+
+ save (SOME myself, archive) (* Unterbrechung, z.B. durch einen vom
+ Programm erzeugten 'errorstop' oder SV
+ und 'halt' *)
+ save (remainder, archive) (* bearbeitet die restlichen Dateien *)
+
+
+Merke: Mit 'save all' bzw. 'fetch all' kann man alle Dateien einer Benutzer-
+Task archivieren bzw. alle Dateien eines Archivs in die Benutzer-Task holen.
+Mit den Operatoren SOME und ALL sind weitere Operationen möglich.
+
+
+
+Fehlermeldungen des Archivs
+
+Bei Archiv-Operationen kann es zu Fehlersituationen kommen.
+
+Versucht man eine Datei vom Archiv zu lesen, kann es vorkommen, daß das
+Archiv-System
+
+ Lese-Fehler (Archiv)
+
+meldet und den Lese-Vorgang abbricht. Dies kann auftreten, wenn die Floppy
+beschädigt oder aus anderen Gründen nicht lesbar ist (z.B. nicht justierte
+Disketten-Geräte). In einem solchen Fall vermerkt das Archiv-System intern,
+daß die Datei nicht korrekt gelesen werden kann. Das sieht man z.B. beim
+'list (archive)'. Dort ist der betreffende Datei-Name mit dem Zusatz 'mit
+Lese-Fehler' gekennzeichnet. Um diese Datei trotzdem zu lesen, muß man sie
+im Datei-Namen mit dem Zusatz 'mit Lese-Fehler' versehen. Beispiel:
+
+ fetch ("dateiname mit Lese-Fehler")
+
+Die Datei wird in diesem Fall trotz Lese-Fehler (Informationsverlust!) vom
+Archiv gelesen.
+
+Um solche Fälle möglichst zu vermeiden, sieht das EUMEL-System die
+Möglichkeit vor, Archive bzw. Archiv-Dateien nach beschreiben zu prüfen. Das
+erfolgt mit dem Kommando
+
+ check ("dateiname", archive) (* oder *)
+ check (ALL archive, archive) (* fuer alle Archiv-Dateien *)
+
+Durch dieses Kommando werden eventuelle Lese-Fehler gemeldet.
+
+Weitere Fehlermeldungen des Archivs:
+
+* Lesen unmöglich (Archiv) Archiv-Floppy nicht eingelegt oder die Tür
+ des Laufwerks ist nicht geschlossen.
+
+* Schreiben unmöglich (Archiv) Floppy ist schreibgeschützt.
+
+* Archiv nicht angemeldet Archiv wurde nicht angemeldet
+ ('archive ("name")' geben).
+
+* Lese-Fehler (Archiv) Siehe obige Beschreibung.
+
+* Schreibfehler (Archiv) Die Floppy kann nicht (mehr) beschrieben
+ werden. Andere Floppy verwenden.
+
+* Speicherengpass Im System ist nicht mehr genügend Platz, um
+ eine Datei vom Archiv zu laden.
+ Ggf. Dateien löschen.
+
+* RERUN beim Archiv-Zugriff Das System wurde bei einer Archiv-Operation
+ durch Ausschalten bzw. Reset unterbrochen.
+
+* ... gibt es nicht Die Datei ... gibt es nicht auf dem Archiv.
+
+* Archiv heißt ... Die eingelegte Floppy hat einen anderen als
+ den eingestellten Archiv-Namen.
+
+* Archiv wird von Task ... benutzt Das Archiv wurde von einem anderen
+ Benutzer reserviert.
+
+* ... kann nicht geschrieben werden (Archive voll) Das Archiv ist voll.
+ Neue Archiv-Floppy
+ benutzen.
+
+* Archiv inkonsistent Die eingelegte Floppy hat nicht die Struk-
+ tur einer Archiv-Floppy ('clear (archive)'
+ vergessen).
+
+* save/erase wegen Lese-Fehler verboten Bei Archiven mit Lese-Fehler sind
+ Schreiboperationen verboten, weil
+ ein Erfolg nicht garantiert
+ werden kann.
+
+
+
+4. FILEs in Programmen
+
+Die bisher geschilderten Kommandos gelten für alle Datei-Arten. In diesem
+Kapitel wird der Standard Datei-Typ FILE beschrieben. Eine Datei von Daten-
+typ FILE ist eine sequentielle Datei, die das Lesen und Schreiben von Daten
+in strikter Aufeinanderfolge von Sätzen erlaubt (Betriebsrichtungen 'input'
+und 'output'). Die Betriebsrichtung 'modify' erlaubt das gleichzeitige Lesen
+und Schreiben sowie beliebiges Positionieren.
+
+
+
+Deklaration, Assoziierung und Betriebsrichtungen
+
+Für ELAN-Programme gibt es standardmäßig den Datentyp FILE. FILEs müssen
+deklariert werden. Die Kopplung einer FILE VAR im Programm mit einer Datei
+erfolgt durch eine Assoziierungsprozedur. Bei der Assoziierung muß man an-
+geben, wie die Datei bearbeitet werden soll.
+
+Dateien müssen in einem ELAN-Programm - wie alle anderen Objekte auch -
+deklariert werden. Beispiel:
+
+ FILE VAR f :: ...
+
+Mit der Deklaration wird dem ELAN-Compiler der Name der Datei-Variablen
+bekannt gemacht. Dabei ist zu beachten, daß im EUMEL-System alle FILEs mit
+VAR deklariert werden müssen, denn jede Lese/Schreib-Operation verändert
+einen FILE. FILE CONST Objekte sind also nicht erlaubt. Ähnlich wie bei
+anderen Datenobjekten werden FILEs initialisiert. In der Regel erfolgt dies
+mit einer Assoziierungsprozedur. Beispiele:
+
+ FILE VAR meine datei :: sequential file (output, "daten")
+ ...
+ (* oder: *)
+ TEXT VAR datei name;
+ put ("Dateiname bitte:"); get (datei name);
+ FILE VAR f :: sequential file (input, datei name);
+
+Die Assoziierungsprozedur 'sequential file' hat die Aufgabe, eine in einem
+Programm deklarierte FILE VAR mit einer bereits vorhandenen oder noch einzu-
+richtenden Datei (abhängig von der Betriebsrichtung, siehe unten) des
+EUMEL-Systems zu koppeln. Den Dateinamen gibt man als zweiten Parameter
+an. Dadurch können ELAN-Programme geschrieben werden, die Dateien
+bearbeiten, deren Namen man beim Erstellen des Programms noch nicht kennt.
+
+Der erste Parameter gibt die sog. Betriebsrichtung an. Sie bestimmt, in
+welcher Weise die assoziierte Datei bearbeitet wird. Es gibt folgende drei
+Betriebsarten:
+
+a) input:
+ Die Datei kann vom Programm nur gelesen werden. Durch 'input' wird bei
+ der Assoziierung automatisch auf den ersten Satz der Datei positioniert.
+ Ist die zu lesende Datei nicht vorhanden, wird ein Fehler gemeldet.
+
+b) output:
+ Die Datei kann vom Programm nur beschrieben werden. Durch 'output' wird
+ bei der Assoziierung automatisch hinter den letzten Satz der Datei
+ positioniert (bei einer leeren Datei also auf den ersten Satz). Ist die
+ Datei vor der Assoziierung nicht vorhanden, wird sie automatisch einge-
+ richtet.
+
+c) modify:
+ Die Datei kann vom Programm in beliebiger Weise gelesen und beschrieben
+ werden. Im Gegensatz zu den Betriebsrichtungen 'input' und 'output', bei
+ denen ausschließlich ein rein sequentielles Lesen oder Schreiben erlaubt
+ ist, kann bei 'modify' beliebig positioniert, gelöscht, eingefügt und neu
+ geschrieben werden. Hier ist nicht definiert, auf welchen Satz der Datei
+ man nach erfolgter Assoziierung steht. Die Datei wird automatisch einge-
+ richtet, wenn sie vor der Assoziierung nicht vorhanden war.
+
+Anmerkung:
+In jeder Betriebsrichtung sind nur bestimmte Operationen zugelassen. Z.B.
+sind bei 'input' keine Schreib-Prozeduren erlaubt. Vergl. dazu die nächsten
+Abschnitte.
+
+Neben der Betriebsrichtung 'input', 'output' oder 'modify' muß bei
+'sequential file' als zweiter Parameter der Name der zu bearbeitenden Datei
+angegeben werden. Beispiel:
+
+ TEXT VAR datei name, zeile;
+ put ("Bitte Name der zu bearbeitenden Datei eingeben:");
+ get (datei name);
+ FILE VAR f :: sequential file (input, dateiname);
+ ...
+ getline (f, zeile);
+ ...
+
+Hier wird der Name der zu bearbeitenden Datei zuerst eingelesen. Diese Datei
+wird mit 'f' in der Betriebsrichtung 'input' assoziiert, d.h. würde man z.B.
+die Prozedur
+
+ putline (f, irgendein text)
+
+an einer Stelle im Programm verwenden, wird ein Fehler gemeldet. Die Be-
+triebsrichtung hilft also, Fehler bei der Programmierung zu vermeiden.
+
+Mit den Prozeduren
+
+ modify (f)
+ input (f)
+ output (f)
+
+kann die Betriebsrichtung von Dateien geändert werden.
+
+Dateien brauchen im EUMEL-System vor Programmende nicht geschlossen zu
+werden, da sie vom System immer konsistent gehalten werden.
+
+Merke: Die Betriebsrichtung gibt an, wie man eine Datei bearbeiten will.
+'input' steht für Lesen, 'output' für Schreiben und 'modify' für Verändern.
+Jede Datei muß vor einer Benutzung mit 'sequential file' assoziiert werden.
+Die Assoziierungsprozedur stellt die Kopplung zwischen dem Programm und dem
+EUMEL-Betriebssystem her.
+
+
+
+Operationen der Betriebsrichtung 'output'
+
+In der Betriebsrichtung 'output' sind nur Schreib-Operationen gestattet.
+'output' ist also für das Bearbeiten von Ausgabedateien vorgesehen.
+
+Mit den Prozeduren
+
+ put
+
+können INT-, REAL- und TEXT-Werte in eine Datei geschrieben werden. Die
+Prozedur
+
+ line
+
+sorgt dafür, daß eine neue Zeile in der Datei begonnen wird. Beispiel:
+
+ FILE VAR f :: sequential file (output, "daten");
+ put (f, "Daten:");
+ line (f);
+ schreibe daten.
+
+ schreibe daten:
+ INT VAR intwert;
+ REAL VAR textwert;
+ put ("bitte Daten eingeben (INT, REAL):");
+ REP
+ get (intwert);
+ put (f, intwert);
+ get (realwert);
+ put (f, realwert);
+ line (f);
+ UNTIL yes ("fertig") END REP.
+
+Durch die Assoziierungsprozedur mit der Betriebsrichtung 'output' wird
+hinter den letzten Satz der Datei positioniert, bei einer leeren Datei also
+auf den ersten Satz. In dem ersten Satz in unserem Beispiel wird also
+'Daten:' geschrieben. Durch die Prozedur 'line' geht man auf den nächsten
+Satz. Dann werden jeweils ein INT- und ein REAL-Wert in eine Datei-Zeile
+geschrieben, bis die Frage 'fertig' mit 'j' beantwortet wird.
+
+Die 'put'-Prozeduren schreiben die Werte jeweils in die aktuelle Datei-Zeile.
+Zwischen den Werten wird von den 'put'-Prozeduren jeweils ein Leerzeichen
+eingefügt. Im Gegensatz zu den 'put'-Prozeduren schreibt die Prozedur 'write'
+einen TEXT ohne ein anschließendes Leerzeichen in die aktuelle Datei-Zeile.
+Beispiel:
+
+ ...
+ write (f, "meine Daten:");
+ write (f, " ");
+ write (f, text (17 + 4));
+ (* das Gleiche wie: put (f, "meine Daten:"); put (f, 17 + 4) *)
+
+Auf eine neue Datei-Zeile kann auf zwei verschiedene Arten positioniert
+werden:
+
+a) Prozedur 'line':
+ Diese darf auch mit einem Parameter angegeben werden, der die Anzahl
+ Zeilen angibt. Beispiel:
+
+ line (f); (* positioniert auf die naechste Zeile *)
+ line (f, 1) (* das Gleiche *)
+ line (f, 4) (* Vier Zeilen weiter; dazwischen sind 3 Leerzeilen *)
+
+b) Überschreiten der Zeilengrenze:
+ Eine Datei-Zeile kann (voreingestellt) 77 Zeichen aufnehmen. Wird bei
+ einer Schreib-Operation diese Grenze überschritten, wird der auszugebende
+ Wert auf die nächste Zeile plaziert. Mit der Prozedur 'max line length'
+ kann die eingestellte Datei-Zeilenlänge gelesen oder verändert werden.
+ Beispiel:
+
+ FILE VAR f :: sequential file (output, "meine daten");
+ put (max line length (f)); (* ergibt 77 *)
+ max line length (f, 132);
+ put (max line length (f)) (* ergibt 132 *)
+
+ Ist die Länge des auszugebenden Textes größer als die verbleibende
+ Zeilenbreite, wird der Text auf der nächsten Zeile ausgegeben.
+
+Die 'putline'-Prozedur bietet die Möglichkeit, eine ganze Datei-Zeile auf
+einmal auszugeben. Eine Positionierung auf die nächste Datei-Zeile ('line')
+braucht dabei nicht vorgenommen werden. Beispiel:
+
+ TEXT VAR zeile :: "";
+ ...
+ zeile := ...;
+ putline (f, zeile);
+ ...
+
+Merke: In der Betriebsrichtung 'output' kann in eine Datei geschrieben
+werden. Dazu stehen die Prozeduren 'put', 'write' und 'putline' zur Verfü-
+gung. Die Prozedur 'line' positioniert auf die nächste Zeile der Ausgabe-
+datei. Mit 'max line length' kann die Länge einer Datei-Zeile verändert oder
+erfragt werden.
+
+
+
+Operationen der Betriebsrichtung 'input'
+
+In der Betriebsrichtung 'input' sind nur Lese-Operationen gestattet. 'input'
+ist also für das Bearbeiten von Eingabedateien vorgesehen.
+
+Analog der Betriebsrichtung 'output' sind bei 'input' 'get'-Prozeduren vor-
+handen, die INT-, REAL- oder TEXT-Werte aus einer Datei lesen. Beispiel:
+
+ FILE VAR f :: sequential file (input, "Betriebszeiten");
+ REAL VAR zeiten;
+ zeiten einlesen und berechnen.
+
+ zeiten einlesen und berechnen:
+ REP
+ get (f, zeiten);
+ IF zeiten = 0.0
+ THEN LEAVE zeiten einlesen und berechnen
+ FI; (* siehe auch 'eof'-Prozedur *)
+ berechne
+ END REP.
+
+ berechne:
+ ...
+
+Die 'get'-Prozeduren positionieren automatisch auf die nächste Zeile, sofern
+keine Werte mehr in der aktuellen Zeile vorhanden sind. Mit der Prozedur
+'line' kann explizit auf die nächste Zeile positioniert werden. Damit können
+die restlichen Daten einer Zeile überschlagen werden. Für die 'get'-Proze-
+duren gilt, daß jeder zu lesende Wert entweder beim nächsten Leerzeichen
+oder beim Zeilenende aufhört. Beispiel:
+
+ FILE VAR f :: sequential file (input, "text");
+ TEXT VAR wort;
+ lese worte.
+
+ lese worte:
+ REP
+ get (f, wort); (* Lesen eines Worts ohne Leerzeichen *)
+ put (wort); (* Schreiben eines Worts mit Leerzeichen *)
+ IF wort = "Ende"
+ THEN LEAVE lese worte
+ FI
+ END REP.
+
+
+Trennzeichen ("separator") zwischen den Worten sind also Leerzeichen, welche
+nicht eingelesen werden. Manchmal sollen jedoch Daten eingelesen werden, die
+durch andere Zeichen als dem Leerzeichen voneinander getrennt sind. Eine
+Möglichkeit, solche Daten zu behandeln, bietet die 'getline'-Prozedur. Sie
+liest (analog 'putline') eine ganze Zeile und positioniert auf die nächste
+Zeile. Dann kann man mit Hilfe von TEXT-Prozeduren solche Zeilen 'per Hand'
+auseinandernehmen. Als Beispiel zeigen wir ein Programm, welches den zweiten
+Wert einer Zeile lesen soll. Die Werte werden durch Kommata voneinander
+getrennt:
+
+ FILE VAR eingabe datei :: sequential file (input, "daten");
+ TEXT VAR zeile, wert;
+ lese jeweils zweiten wert;
+ verarbeite wert.
+
+ lese jeweils zweiten wert:
+ REP
+ getline (f, zeile);
+ IF zeile = "Ende"
+ THEN LEAVE lese jeweils zweiten wert
+ FI;
+ extrahiere zweiten wert
+ END REP.
+
+ extrahiere zweiten wert:
+ wert := subtext (zeile, anfang, ende).
+
+ anfang:
+ pos (zeile, ",") + 1.
+
+ ende:
+ pos (zeile, ",", anfang) + 1.
+
+ verarbeite wert:
+ ...
+
+Diese (etwas umständliche) Methode ist immer dann angebracht, wenn Zeilen
+unterschiedlich untersucht werden müssen. Eine einfachere Möglichkeit, die
+in vielen Fällen angewandt werden kann, bietet eine andere Form der 'get'-
+Prozedur, bei der man das oder die Trennzeichen angeben kann. Beispiel:
+
+ ...
+ extrahiere zweiten wert:
+ get (f, wert, ","); (* ersten Wert der Zeile ueberlesen *)
+ get (f, wert, ","). (* hier der richtige zweite Wert *)
+
+Hier wird also das Trennzeichen mit angegeben (dritter Parameter). Eine
+andere Methode müssen wir anwenden, wenn Daten nicht durch ein Trennzeichen
+unterschieden werden, sondern nur durch ihre Länge definiert sind. Beispiel:
+
+ ...
+ lese fuenfstellige werte:
+ REP
+ get (f, wort, 5);
+ verarbeite wert
+ ...
+ END REP.
+
+Bei dieser 'get'-Prozedur wird die Länge des einzulesenden Textes als
+dritter Parameter angegeben. Man beachte, daß die letzten zwei 'get'-Proze-
+duren nur TEXTe einlesen. Entsprechende Typwandlungen hat der Programmierer
+vorzunehmen.
+
+Merke: Die Betriebsrichtung 'input' erlaubt nur Lesen aus einer Eingabedatei.
+Für diesen Zweck gibt es die Prozeduren 'get', 'getline' und 'line'.
+
+
+
+Operationen der Betriebsrichtung 'modify'
+
+Die Betriebsrichtung 'modify' erlaubt das Lesen und Schreiben von Informa-
+tionen auf Dateien. Zusätzlich ist beliebiges Positionieren auf Dateien
+erlaubt. 'modify' ist also für Dateien gedacht, die man gleichzeitig als
+Ausgabe- und Eingabedateien behandeln will.
+
+Die Betriebsrichtung 'modify' erlaubt ein Ändern einer Datei ("updating"),
+wobei die sequentielle Natur der Datei erhalten bleibt.
+
+Eine Datei der Betriebsrichtung 'modify' muß ebenso mit 'sequential file'
+assoziiert werden, wie bei den zwei anderen Betriebsrichtungen. Während bei
+'input' auf den ersten bzw. bei 'output' auf den letzten Satz der Datei
+positioniert wird, ist bei 'modify' nicht definiert, auf welchem Satz der
+Datei nach erfolgter Assoziierung positioniert wird. Man muß also die erste
+Positionierung explizit vornehmen. Für die Zwecke der Positionierung gibt es
+die Prozeduren
+
+ to line (* auf eine bestimmte Zeile *)
+ col (* auf eine Spalte innerhalb der Zeile *)
+ down (* eine Zeile vorwaerts *)
+ up (* eine Zeile zurueck *)
+
+Neben diesen Positionierungsprozeduren gibt es die Informationsprozeduren:
+
+ lines (* Anzahl Zeilen in der Datei *)
+ line no (* aktuelle Zeilennummer *)
+ eof (* Dateiende? *)
+
+Beispiele:
+
+ down (f); (* wie: to line (f, line no (f) + 1) *)
+ (* Nicht über eof *)
+ up (f); (* wie: to line (f, line no (f) - 1) *)
+ (* Nicht über Zeile 1 *)
+
+Mit der Prozedur
+
+ read record
+
+kann der Satz, auf den aktuell positioniert wurde, gelesen werden. Mit
+
+ write record
+
+kann sein Inhalt geschrieben werden (also auch "überschreiben"). Mit den
+Prozeduren
+
+ insert record
+ delete record
+
+kann eine Zeile vor der aktuellen eingefügt (Position ist dann die einge-
+fügte Zeile) oder der aktuelle Satz gelöscht werden (Position ist dann der
+nächste Satz). Beispiele:
+
+ FILE VAR f :: sequential file (modify, "meine daten")
+ TEXT VAR zeile, neue zeile;
+ to line (f, 1);
+ read record (f, zeile); (* erste Zeile lesen *)
+ ...
+ insert record (f); (* neue erste Zeile *)
+ write record (f, neue zeile);
+ down (f); (* auf die 2. Zeile, die vorher die 1. war *)
+ delete record (f); (* diese loeschen, so dass die
+ Zeilenzahl wieder stimmt *)
+
+Das nächste Beispiel zeigt, wie hinter den letzten Satz einer Datei eine
+Zeile eingefügt werden kann (hier wird ausgenutzt, daß man in der Betriebs-
+richtung 'modify' hinter den letzten Satz der Datei positioniert werden
+kann):
+
+ FILE VAR f :: sequential file (modify, "test");
+ to line (f, lines (f)); (* auf die letzte Zeile *)
+ down (f);
+ insert record (f);
+ write record (f, "neue letzte Zeile");
+ ...
+
+Mit 'down' bzw. 'up' kann man auch um einige Zeilen auf einmal vorwärts oder
+rückwärts positionieren. Beispiele:
+
+ down (f, 17) (* 17 Zeilen vorwaerts *)
+ up (f, 13) (* 13 zeilen rueckwaerts *)
+
+Merke: In der Betriebsrichtung 'modify' können Dateien gelesen und/oder ge-
+schrieben werden ('read record' oder 'write record'). Positionierungen kön-
+nen mit 'down', 'up' oder 'to line' vorgenommen werden.
+
+
+
+Manipulationen von FILEs
+
+FILEs können im EUMEL-System auch als Einheiten behandelt werden. Dazu
+stehen die bereits erläuterten Prozeduren zur Verfügung, die wir hier der
+Vollständigkeit halber nochmals aufführen.
+
+Mit der Prozedur
+
+ exists
+
+kann erfragt werden, ob eine Datei bereits existiert. Beispiel:
+
+ TEXT VAR name;
+ REP
+ erfrage name;
+ UNTIL exists (name) END REP;
+ ...
+
+ erfrage name:
+ put ("Dateiname bitte:");
+ get (name);
+ line.
+
+Weitere Prozeduren:
+
+ forget (* Datei löschen *)
+ rename (* umbenennen *)
+ copy (* kopieren *)
+
+Für Programmierer ist eine Version der 'forget'-Prozedur interessant, die
+eine Datei ohne Kontroll-Anfrage löscht. Beispiel:
+
+ forget ("meine scratch datei", quiet)
+
+Merke: Mit 'exists' kann erfragt werden, ob ein FILE bereits existiert.
+
+
+
+Texte Suchen
+
+Mit den Prozeduren 'down' und 'up' kann man (ebenso wie im Editor) auch nach
+Texten suchen.
+
+Die Prozeduren 'down' bzw. 'up' suchen einen Text in der Datei. Beispiele:
+
+ down (f, "dieser text")
+ up (f, "noch'n text")
+
+Diese Prozeduren suchen direkt auf der Dateistruktur. Wird der gesuchte Text
+gefunden, steht man direkt auf dem gesuchten Text. Wird der Text nicht
+gefunden, steht man auf dem ersten (bei 'up') oder hinter dem letzten (bei
+'down') Zeichen der Datei. Die Position innerhalb der Zeile nach einer Suche
+kann mit
+
+ col (f)
+
+abgefragt werden. Um die Suche auf einen Bereich zu beschränken, kann man
+'down' bzw. 'up' mit einem weiterem Parameter versehen, der die max. Anzahl
+von Zeilen angibt. Beispiel:
+
+ FILE VAR f :: ...
+ ...
+ INT VAR akt zeilennr :: line no (f);
+ down (f, "pattern", 100);
+ (* sucht in den naechsten 100 Zeilen nach 'pattern' *)
+ IF line no (f) <> akt zeilen nr + 100
+ THEN gefunden
+ ELSE nicht gefunden
+ FI;
+ ...
+
+Achtung: 'down' bzw. 'up' beginnen die Suche immer mit dem nächsten Zeichen
+in Suchrichtung, so daß man mehrmals hintereinander suchen kann, ohne in
+eine Endlosschleife zu geraten (Erinnerung: wird ein Text gefunden, ist die
+Position innerhalb der Zeile das erste Zeichen des gesuchten Begriffs).
+
+Mit den Prozeduren (gleiche Parameterversorgung wie 'down' und 'up')
+
+ downety
+ uppety
+
+beginnt man mit der Suche immer auf der aktuellen Position. Darum sollte man
+diese Prozeduren mit Vorsicht verwenden. Mit der Prozedur
+
+ pattern found
+
+kann man anfragen, ob die letzte Suchoperation erfolgreich war oder nicht.
+Beispiel:
+
+ FILE VAR f :: ...
+ ...
+ INT VAR akt zeilennr :: line no (f);
+ down (f, "pattern", 100);
+ (* sucht in den naechsten 100 Zeilen nach 'pattern' *)
+ IF pattern found THEN gefunden
+ ELSE nicht gefunden
+ FI;
+ ...
+
+Mit der Prozedur
+
+ at
+
+kann man anfragen, ob man auf einem gewünschten Wort steht. Beispiel:
+
+ IF at (f, "pattern")
+ THEN ..
+ FI
+
+Die Prozedur
+
+ word
+
+liefert das aktuelle Wort der aktuellen Position einer Zeile. Beispiele:
+
+ TEXT VAR dieses wort :: word (f);
+ (* Zeichenkette von der aktuellen Position bis zum nächsten Blank oder
+ Zeilenende *)
+ dieses wort := word (f, "<");
+ (* Zeichenkette (Wort) von der aktuellen Position bis zum Zeichen '<'
+ oder Zeilenende *)
+ dieses wort := word (f, 13);
+ (* Zeichenkette (Wort) mit der Laenge 13 *)
+
+Merke: Die Prozeduren 'down' und 'up' suchen einen Text innerhalb einer
+Datei. Mit 'at' kann man anfragen, ob man auf dem gesuchten Begriff steht.
+'word' liefert das aktuelle Wort.
+
+
+
+FILE-Ausschnitte
+
+Hier wird erklärt, wie man mehrere Zeilen aus einer Datei auf einmal löschen
+und/oder verschieben und wie man nur einen Ausschnitt einer Datei zugänglich
+machen kann.
+
+Den einfachsten Zugang zu Datei-Abschnitten erhält ein Programmierer durch
+einige Anwendungsprozeduren, die u.a. auch im Editor verwandt werden. Dort
+gibt es die Möglichkeit, einen markierten Bereich "vorsichtig" zu löschen
+und u.U. an anderer Stelle wieder einzufügen (ESC RUBOUT und ESC RUBIN).
+Solche Prozeduren stehen auch einem Programmierer zur Verfügung. Beispiel:
+
+ FILE VAR f :: ....
+ ....
+ remove (f, 100); (* entfernt 100 Zeilen von der aktuellen
+ Position rueckwaerts (!) aus der Datei 'f' *)
+ to line (27); (* zum Beispiel *)
+ re insert (f) (* fuegt die "vorsichtig" geloeschten Zeilen vor
+ (!) die Zeile 27 ein *)
+
+Die Prozedur
+
+ remove
+
+löscht also eine angebbare Anzahl von Zeilen in der Datei (rückwärts von der
+aktuellen Zeilennummer ab) und schreibt diesen Datei-Abschnitt in einen
+internen Puffer. Man beachte, daß sich dabei natürlich die Zeilennummer der
+Datei ändert. Die entfernten Zeilen können aus dem internen Puffer an einer
+anderen Stelle durch
+
+ reinsert
+
+genau einmal wieder eingefügt werden. Sollen jedoch die mit 'remove' ent-
+fernten Zeilen wirklich gelöscht und nicht mehr an anderer Stelle eingesetzt
+werden, dann kann man die Prozedur
+
+ clear removed
+
+verwenden. Beispiel:
+
+ ...
+ remove (f, 50); (* loescht vorsichtig *)
+ clear removed (f); (* und endgueltig *)
+ ...
+
+Durch solche Löschungen oder Einfügungen entstehen Datei-Segmente.
+Innerhalb eines Segments kann direkt positioniert werden. Werden jedoch
+Löschungen oder Einfügungen vorgenommen (Sätze werden ein- oder ausgekettet),
+muß erst zu einem entsprechenden Segment positioniert und dann innerhalb des
+Segments auf den entsprechenden Satz positioniert werden. Das kann - je nach
+Anzahl der Segmente - zeitaufwendig sein. Deshalb existiert die Prozedur
+
+ segments
+
+mit der man feststellen kann, wieviel Datei-Segmente in der Datei existieren.
+(Sind es "zu viele", kann man die Datei "reorganisieren").
+
+Diese und die folgenden Prozeduren nutzen eine vom EUMEL-System bereitge-
+stellte Möglichkeit, Ausschnitte aus Dateien wie eigenständige Dateien zu
+behandeln. Beispiel:
+
+ FILE VAR f :: ...
+ ...
+ FRANGE VAR alter bereich;
+ set range (f, 200, 1, alter bereich);
+ (* Datei mit 200 Zeilen von der Spalte 1 der aktuellen Zeile *)
+ edit (f); (* Zeilen 1-200 editieren *)
+ set range (f, alter bereich); (* Datei zuruecksetzen *)
+ ...
+
+Von dem Beispiel-Programm wird die Datei 'f' bearbeitet. Die FRANGE-Variable
+dient hier dazu, sich den ursprünglichen Bereich der Datei 'f' (der auch
+schon eingeschränkt sein kann), zu merken. Mit der Prozedur 'set range' wird
+die Datei 'f' auf 200 Zeilen eingeschränkt (von der aktuellen Zeile 200
+Zeilen rückwärts). Mit der Prozedur 'edit' kann nun der Benutzer unseres
+Programms die (eingeschränkte) Datei beliebig editieren. Ihm steht am Anfang
+Zeilen 1 bis 200 zur Verfügung; die "ausgeblendeten" Datei-Teile kann er
+nicht verändern. Mit dem zweiten Aufruf von 'set range' wird der einge-
+schränkte (und u.U. veränderte) Datei-Bereich aufgehoben, so daß hier wieder
+alle ursprünglichen Datei-Zeilen zur Verfügung stehen.
+
+Solche Beschränkungen können natürlich mehrmals geschachtelt vorgenommen
+werden. Um nach Ablauf solcher Programmteile sicher wieder die ursprüngliche
+Datei (mit allen ihren Zeilen) zur Verfügung zu haben, gibt es die Prozedur
+
+ reset range (f)
+
+Sie setzt die Datei 'f' auf den größtmöglichen Bereich zurück.
+
+Merke: Mit 'remove' und 'reinsert' können Zeilen gelöscht und/oder ver-
+schoben werden. Mit dem Datentyp FRANGE und den Prozeduren 'set range'
+können Dateien eingeschränkt werden.
+
+
+
+5. Datenräume
+
+Die bis jetzt behandelten Dateien können nur TEXTe aufnehmen (bei einigen
+Schreib-/Lese-Operationen werden Daten in Texte umgewandelt, z.B. bei 'get'
+und 'put'). Damit ist gewährleistet, daß alle Programme im EUMEL-System
+(Editor, Drucker, Compiler, Benutzer-Programme usw.) auf gleiche Art und
+Weise auf Dateien zugreifen können, unabhängig davon, welche Daten wirklich
+gespeichert sind. Der folgende Abschnitt zeigt, wie man mit Dateien umgeht,
+die nicht vom Standardtyp FILE sind.
+
+
+
+Konzept des Datenraums
+
+Standarddateien (FILEs) können nur Texte aufnehmen, da sie ja hauptsächlich
+für die Kommunikation mit dem Menschen (vorwiegend mit Hilfe des Editors bzw.
+Ein-/Ausgabe) gedacht sind. Will man Zahlen in einen FILE ausgeben, so
+müssen diese zuvor in Texte umgewandelt werden. Hierfür stehen Standard-
+prozeduren zur Verfügung (z.B. 'put (f, 17)').
+
+Will man aber Dateien zur Kommunikation zwischen Programmen verwenden, die
+große Zahlenmengen austauschen, verursachen die Umwandlungen von Zahlen
+in TEXTe und umgekehrt unnötigen Rechenaufwand. Daher wurden in EUMEL� die
+Datenräume eingef�hrt, die es gestatten, beliebige Strukturen (Typen) in
+Dateien zu speichern. Solche Datenräume kann man weder mit dem Editor noch
+mit dem Standarddruckprogramm (print) bearbeiten, da diese ja den Typ des in
+der Datei gespeicherten Objektes nicht kennen.
+
+Einen Datenraum kann man sich als eine Sammlung von Daten vorstellen (u.U.
+leer), die ausschließlich von einem Programm her behandelt wird. Man kann
+einem Datenraum durch ein Programm einen Datentyp "aufprägen". Meist handelt
+es sich um Reihungen, weil die Benutzung von Datenräumen erst bei größeren
+Datenmengen lohnt. Nach einem solchen "Aufpräge"-Vorgang kann der Datenraum
+wie ein "normaler" Datentyp behandelt werden, mit dem Unterschied, daß die
+Daten in einem Datenraum (d.h. Datei) gespeichert werden. Somit können nach-
+folgende Programme auf die im Datenraum gespeicherten Daten zugreifen, so-
+fern sie den gleichen Datentyp auf den Datenraum aufprägen.
+
+Merke: Ein Datenraum ist eine Sammlung von Daten. Er kann ausschließlich
+durch ein Programm (und z.B. nicht durch den Editor) behandelt werden.
+Programme können Datenräumen Datentypen aufprägen und sie dann mit den ver-
+fügbaren Operationen dieses Datentyps manipulieren.
+
+
+Ein Beispiel
+
+Diesen etwas komplizierten Vorgang wollen wir an Hand eines Beispiels
+Schritt für Schritt erklären.
+
+Angenommen, Programmierer Meier hat ein Gehaltsprogramm zu erstellen. Er
+überlegt sich, das Programm in (mindestens) zwei Moduln (PACKETs) zu er-
+stellen:
+
+a) Berechnung der Gehaltssumme aus den Arbeitszeiten (also Bruttogehalt) und
+ dann
+b) Endgültige Berechnung der Gehälter durch Abzug von Steuern usw.
+
+Das Programm aus a) erstellt also eine Gehaltsliste für alle Beschäftigten
+des Betriebs. Die Gehaltsliste soll ebenfalls von Modul b) genutzt werden.
+
+Meier entschließt sich, die Gehaltsliste in einem Datenraum zu speichern.
+Das hat neben der effizienteren Bearbeitung noch den Vorteil, daß man die
+Gehaltsliste - ohne Programmierkenntnisse zu besitzen - nicht mit dem Editor
+bearbeiten kann (Datenschutz).
+
+Dem ELAN-Compiler muß Meier also mitteilen, daß die Reihung für die
+Gehaltsliste (oder irgendein anderer Datentyp) nicht im Speicherbereich des
+Programms, sondern in einem Datenraum gespeichert werden soll. Dies erfolgt
+mit dem Schlüsselwort BOUND, welches dem Datentyp bei der Deklaration
+vorangestellt wird. Beispiel:
+
+ BOUND ROW 1000 REAL VAR gehaltsliste
+
+Dieses BOUND-Objekt muß Meier noch mit einer Datei verbinden, man spricht
+von "ankoppeln". Die Ankopplung erfolgt durch den Operator ':='. Dies kann
+man gleich bei der Initialisierung vornehmen. Beispiel:
+
+ BOUND ROW 1000 REAL VAR gehaltsliste := new ("hugo")
+
+Die Prozedur 'new' kreiert dabei einen leeren Datenraum (hier mit dem Namen
+'hugo'), der mit Hilfe der Zuweisung (hier: Initialisierung) an die Variable
+'gehaltsliste' gekoppelt wird.
+
+Nun kann Meier mit der 'gehaltsliste' arbeiten wie mit allen anderen Feldern
+auch, mit dem Unterschied, daß die Daten, die er in 'gehaltsliste' speichert,
+eigentlich im Datenraum 'hugo' gespeichert sind. Beispiele:
+
+ gehaltsliste [5] := 10 000.0; (* Traumgehalt *)
+ gehaltsliste [index] INCR 200.0; (* usw. *)
+
+Meier kann auch Prozeduren schreiben, die auf der Gehaltsliste arbeiten.
+Beispiel:
+
+ PROC sort (ROW 1000 REAL VAR liste):
+ ...
+ END PROC sort;
+ ...
+ sort (gehaltsliste);
+ ...
+
+Man beachte, daß der formale Parameter der Prozedur 'sort' nicht mit BOUND
+spezifiziert werden darf (BOUND wird nur bei der Deklaration des Objekts
+angegeben). Das ist übrigens ein weiterer wichtiger Vorteil von BOUND-Objek-
+ten: man kann alle Prozeduren des EUMEL-Systems auch für BOUND-Objekte
+verwenden, nur die Datentypen müssen natürlich übereinstimmen.
+
+Nach der Bearbeitung des Moduls a) ist Meier nun sicher, daß seine Brutto-
+daten in dem Datenraum 'hugo' stehen. Meier braucht (genauso wie bei FILEs)
+den Datenraum nicht zu schließen. Im zweiten Modul muß Meier nun erneut ein
+BOUND-Objekt deklarieren.
+Deshalb deklariert Meier nun
+
+ BOUND ROW 1000 REAL VAR nettoliste :: old ("hugo");
+
+Hier muß Meier nun die Prozedur 'old' verwenden, weil der Datenraum bereits
+aus dem ersten Modul existiert. Nun kann Meier weiter programmieren, bis er
+letztendlich den Datenraum löscht:
+
+ forget ("hugo")
+
+Merke: Ein Datenobjekt eines beliebigen Datentyps kann mit einem vorange-
+stellten BOUND deklariert werden und an einen Datenraum gekoppelt werden.
+Der Datentyp ist dann auf den Datenraum aufgeprägt und man kann mit ihm
+arbeiten wie mit allen anderen Objekten dieses Datentyps.
+
+
+
+Datenräume als Datentyp
+
+Datenräume können auch als eigener Datentyp (DATASPACE) in einem Programm
+behandelt werden. Somit können Datenräume (als Ganzes) ohne Kenntnis eines
+eventuell (vorher oder später) aufgeprägten Typs verwandt werden.
+
+Als Operationen auf DATASPACE-Objekten sind nur Transporte, Löschen und
+Initialisieren zugelassen.
+
+ DATASPACE VAR ds :: old ("daten");
+
+Der Zuweisungsoperator bewirkt eine Kopie des Datenraums vom rechten auf
+den linken Operanden. Des weiteren gibt es eine DATASPACE Konstante 'nil-
+space', die eine leere Datenraum repräsentiert. Mit diesem Wert initialisiert
+der Datei-Manager Dateien, die neu kreiert werden.
+
+Eine neuer Datenraum kann durch
+
+ new ("name")
+
+eingerichtet werden. 'new' liefert gleichzeitig einen Datenraum und wird
+deshalb für Initialisierungen verwandt. Beispiel:
+
+ DATASPACE VAR datenraum :: new ("name1"); (* Kopie ! *)
+
+Ein bereits vorhandener Datenraum in der Benutzer-Task kann mit
+
+ old ("datei")
+
+erneut benutzt werden. 'old' liefert (wie 'new') einen DATASPACE, so daß
+'old' ebenfalls zur Initialisierung benutzt werden kann. Die Prozedur
+
+ nilspace
+
+liefert einen leeren Datenraum.
+
+Für Datenräume gelten zusätzlich einige der Prozeduren wie für FILEs, u.a.:
+
+ forget
+ fetch
+ save
+ rename
+
+Ausgenommen davon sind Prozeduren, die einen TEXT-File voraussetzen, wie
+z.B. 'crypt' und 'decrypt', 'put', 'putline' usw.
+
+Abschließend soll hier noch auf häufig gemachte Fehler hingewiesen werden:
+
+Wenn man an ein DATASPACE-Objekt zuweist (z.B.: DATASPACE VAR ds :=
+new ("mein datenraum")) so erhält man, wie oben erwähnt, eine Kopie des
+Datenraums in 'ds'. Koppelt man jetzt 'ds' an ein BOUND-Objekt an und führt
+Änderungen durch, so wirken diese nur auf die Kopie und nicht auf die Quelle
+(d.h. im Beispiel, daß die Datenraum 'hugo' nicht verändert wird, hier also
+leer bleibt). Für Änderungen in den vom Datei-Manager verwalteten Dateien
+ist also stets direkt anzukoppeln, wie es im Beispiel gezeigt wurde.
+
+Wenn man ein DATASPACE-Objekt benutzt, ohne den Datei-Manager zu verwenden,
+so muß man selbst dafür sorgen, daß dieses Objekt nach seiner Benutzung
+wieder gelöscht wird. Das Löschen geschieht durch die Prozedur 'forget'.
+Ferner ist zu beachten, daß vor der Ankopplung an ein BOUND-Objekt das
+DATASPACE-Objekt initialisiert wird (im Normalfall mit 'nilspace'). Beispiel:
+
+ DATASPACE VAR ds := nilspace;
+ BOUND ROW 1000 REAL VAR real feld := ds;
+ ....
+ real feld [index] := wert;
+ ....
+ forget (ds) (* Datei löschen, damit der Platz wieder verwendet wird *)
+
+Ein automatisches Löschen von DATASPACE-Objekten erfolgt auch nicht bei
+Programmende (sonst könnten sie ihre Funktion als Datei nicht erfüllen).
+Erst beim Löschen einer Task werden alle ihr gehörenden DATASPACE-Objekte
+freigegeben. Verboten ist weiterhin folgendes:
+
+ BOUND X ...;
+
+wobei 'X' mit BOUND deklariert wurde oder ein DATASPACE ist.
+
+Merke: Datenräume können durch 'new' erschaffen werden. Mit 'old' kann ein
+bereits vorhandener Datenraum angesprochen werden. Im Übrigen gelten auch
+einige der für FILEs vorhandenen Operationen.
+
+
+
+Datei-Typen definieren
+
+Durch die Datenräume und die Datentyp-Definition von ELAN ist es für
+Programmierer relativ einfach, neue Datei-Datentypen zu definieren.
+
+In der Regel reicht der Datentyp FILE für "normale" Anwendungen aus, jedoch
+kann es manchmal sinnvoll und notwendig sein, neue Datei-Typen für spezielle
+Aufgaben zu definieren.
+
+In diesem Abschnitt zeigen wir an dem Beispiel DIRFILE (welcher zwar im
+ELAN-Standard definiert, aber nicht im EUMEL-System realisiert ist), wie ein
+neuer Datei-Datentyp definiert wird:
+
+ PACKET dirfiles DEFINES DIRFILE, :=, dirfile, getline, ...:
+
+ LET maxsize = 1000;
+
+ TYPE DIRFILE = BOUND ROW maxsize TEXT;
+ (* DIRFILE besteht aus TEXTen; Zugriff erfolgt ueber einen
+ Schluessel, der den Index auf die Reihung darstellt *)
+
+ OP := (DIRFILE VAR dest, DATASPACE CONST space):
+ CONCR (dest) := space
+ END OP :=;
+
+ DATASPACE PROC dirfile (TEXT CONST name):
+ IF exists (name)
+ THEN old (name)
+ ELSE new (name)
+ FI
+ END PROC dirfile;
+
+ PROC getline (DIRFILE CONST df, INT CONST index, TEXT VAR record):
+ IF index <= 0
+ THEN errorstop ("access before first record")
+ ELIF index > maxsize
+ THEN errorstop ("access after last record")
+ ELSE record := df [index]
+ FI
+ END PROC getline;
+
+ PROC putline (DIRFILE CONST df, INT CONST index, TEXT VAR record):
+ ...
+ END PROC putline;
+
+ ...
+ END PACKET dirfiles;
+
+Die Prozedur 'dirfile' ist die Assoziierungsprozedur für DIRFILEs (analog
+'sequential file' bei FILEs). 'dirfile' liefert entweder einen bereits vor-
+handenen Datenraum oder richtet einen neuen ein. Um eine Initialisierung mit
+der 'dirfile'-Prozedur vornehmen zu können, braucht man auch einen Zu-
+weisungsoperator, der den Datenraum an den DIRFILE-Datentyp koppelt.
+
+Zugriffe auf einen DIRFILE sind nun relativ einfach zu schreiben. Im obigen
+Beispiel wird nur die Prozedur 'getline' gezeigt.
+
+Nun ist es möglich, Programme zu schreiben, die den DIRFILE-Datentyp
+benutzen. Beispiel:
+
+ DIRFILE VAR laeufer ::
+ dirfile ("Nacht von Borgholzhausen");
+ INT VAR nummer;
+ TEXT VAR name;
+
+ REP
+ put ("Startnummer bitte:");
+ get (nummer);
+ line;
+ put ("Name des Laeufers:");
+ get (name);
+ putline (laeufer, nummer, name);
+ line
+ UNTIL no ("weiter") END REP;
+ ...
+
+Merke: Neue Datei-Typen für spezielle Anwendungen kann man leicht selbst
+programmieren.
+
+
+
+6. Beschreibung der Prozeduren
+
+In diesem Abschnitt werden alle Operationen, die für Dateien zur Verfügung
+stehen, aufgeführt. Dabei werden die Operationen für FILEs und Datenräume
+mit (F) gekennzeichnet.
+
++
+ THESAURUS OP + (THESAURUS CONST left, right)
+ Zweck: Vereinigungsmenge von 'left' und 'right'.
+
+ THESAURUS OP + (THESAURUS VAR left, TEXT CONST name)
+ Zweck: Nimmt den TEXT 'name' in den Thesaurus 'left' auf. Beispiel:
+
+ save (SOME father + "hugo", archive)
+
+-
+ THESAURUS OP - (THESAURUS CONST left, right)
+ Zweck: Differenzmenge von 'left' und 'right'.
+
+ THESAURUS OP - (THESAURUS VAR left, TEXT CONST name)
+ Zweck: Liefert einen Thesaurus aus left, aber ohne den Eintrag 'name'.
+ Beispiel:
+
+ save (ALL myself - "hugo", archive)
+
+/
+ THESAURUS OP / (THESAURUS CONST left, right)
+ Zweck: Schnittmenge von 'left' und 'right'.
+
+ TASK OP / (TEXT CONST task name)
+ Zweck: Liefert aus einem Tasknamen den internen Tasknamen. '/' kann über-
+ all dort eingesetzt werden, wo ein interner Taskname verlangt wird.
+
+ALL
+ THESAURUS OP ALL (TASK CONST task)
+ Zweck: Liefert einen Thesaurus, der alle Dateinamen der angegebenen Task
+ enthält (auch der Benutzer-Task: 'myself').
+
+ THESAURUS OP ALL (TEXT CONST file name)
+ Zweck: Liefert einen Thesaurus, der die in 'file name' vorhandenen Datei-
+ namen (jede Zeile ein Name) enthält.
+
+at (F)
+ BOOL PROC at (FILE VAR f, TEXT CONST word)
+ Zweck: Abfrage, ob man auf 'word' in der Datei 'f' positioniert ist.
+ Beispiel:
+
+ ...
+ down (f, "muster")
+ IF at (f, "muster")
+ THEN gefunden
+ ELSE nicht gefunden
+ FI;
+ ...
+
+archive
+ PROC archive (TEXT CONST archive name)
+ Zweck: Anmeldung von Archiv-Operationen. 'archive name' wird zur Über-
+ prüfung für alle folgenden Archiv-Operationen verwandt, um die
+ unberechtigte Benutzung eines Archivs zu verhindern. Die Anmeldung
+ wird abgelehnt, wenn ein anderer Nutzer das Archiv belegt hat.
+
+ TASK PROC archive
+ Zweck: Liefert den internen Task-Bezeichner für die Verwendung in
+ Datei-Kommandos. Beispiel:
+
+ save ("datei", archive)
+
+brother
+ TASK PROC brother (TASK CONST task)
+ Zweck: Liefert den internen Task-Bezeichner der angegebenen "Bruder"-
+ Task.
+
+check
+ PROC check (TEXT CONST dateiname, TASK CONST task)
+ Zweck: Überprüft, ob die Datei 'dateiname' auf dem Archiv lesbar ist.
+ Beispiel:
+
+ check ("meine datei", archive)
+
+ PROC check (THESAURUS CONST t, TASK CONST task)
+ Zweck: Überprüft, ob die in dem Thesaurus 't' enthaltenen Dateien auf dem
+ Archiv lesbar sind. Beispiel:
+
+ check (ALL archive, archive)
+
+clear
+ PROC clear (TASK CONST task)
+ Zweck: Löscht alle Dateien der Task 'task'. Ist z.Z. nur für die Task
+ 'ARCHIVE' implementiert.
+
+clear removed (F)
+ PROC clear removed (FILE VAR f)
+ Zweck: Löscht die mit 'remove' "vorsichtig" gelöschten Zeilen aus der
+ Datei 'f' endgültig.
+
+close (F)
+ PROC close (FILE VAR file)
+ Zweck: Schließen der Datei 'file'. Im EUMEL-System ist der Aufruf von
+ 'close' nicht notwendig. 'close' wurde nur aufgenommen, um die
+ Kompatibilität zu Standard zu wahren.
+
+col (F)
+ PROC col (FILE VAR f, INT CONST position)
+ Zweck: Positionierung auf die Spalte 'position' innerhalb der aktuellen
+ Zeile.
+
+ INT PROC col (FILE CONST f)
+ Zweck: Liefert die aktuelle Position innerhalb der aktuellen Zeile.
+
+copy (F)
+ PROC copy (TEXT CONST source, destination)
+ Zweck: Kopiert die Datei 'source' in eine neue Datei mit dem Namen
+ 'destination' in der Benutzer-Task.
+ Fehlerfälle:
+ * destination file already exists
+ Eine Datei mit dem Namen 'destination' existiert bereits.
+ * source file does not exist
+ Die Ursprungsdatei mit dem Namen 'source' ist nicht vorhanden.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien der Benutzer-Task ist über-
+ schritten.
+
+ PROC copy (DATASPACE CONST ds, TEXT CONST destination)
+ Zweck: Eintragen eines unbenannten DATASPACE in die Datei-Verwaltung.
+ Fehlerfälle:
+ * destination file already exists
+ Eine Datei mit dem Namen 'destination' existiert bereits.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien der Benutzer-Task ist über-
+ schritten.
+
+create
+ PROC create (TEXT CONST name)
+ Zweck: Erschafft einen neuen Datenraum in der Benutzer-Task.
+ Fehlerfälle:
+ * file already exists
+ Eine Datei mit dem Namen 'name' existiert bereits in der Benutzer-
+ Task.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien der Benutzer-Task ist über-
+ schritten.
+
+crypt (F)
+ PROC crypt (TEXT CONST name, parole)
+ Zweck: Verschlüsseln des Inhaltes der Datei 'name' mit Hilfe des Textes
+ 'parole' für Zwecke des Datenschutzes. Die Verschlüsselung ist
+ umso besser (bzw. umso schwieriger zu "knacken"), je länger der
+ Text 'parole' ist. Die Datei kann mit der Prozedur 'decrypt'
+ wieder entschlüsselt werden.
+
+ Eine Datei kann mehrfach verschlüsselt werden. Dabei gilt bei
+ einer Entschlüsselung das Klammerungsprinzip. Es muß also genau so
+ oft entschlüsselt werden, wie anfangs verschlüsselt wurde. Dabei
+ ist auf die richtige Angabe der 'parole'n zu achten. Beispiel:
+
+ crypt ("hugo", "verschluesselung1");
+ crypt ("hugo", "verschluesselung2");
+ ...
+ decrypt ("hugo", "verschluesselung2");
+ decrypt ("hugo", "verschluesselung1")
+
+ Achtung: 'crypt' und 'decrypt' sind nicht standardmäßig insertiert.
+
+decrypt (F)
+ PROC decrypt (TEXT CONST name, parole)
+ Zweck: Entschlüsselt die Datei 'name' mit Hilfe der angegebenen 'parole'.
+ Dabei ist darauf zu achten, daß die gleiche 'parole' anzugeben
+ ist, die verwendet wurde, um die Datei zu verschlüsseln (sonst
+ wirkt 'decrypt' wie ein erneuter Aufruf von 'crypt').Beim mehr-
+ fachen Ver- und Entschlüsseln ist das Klammerungsprinzip zu be-
+ achten (dazu vergl. 'crypt').
+
+delete record (F)
+ PROC delete record (FILE VAR file)
+ Zweck: Der aktuelle Satz der Datei 'file' wird gelöscht. Der folgende
+ Satz wird der aktuelle Satz. Die Datei 'file' muß mit der Verar-
+ beitungsart 'modify' assoziiert worden sein.
+
+do
+ PROC do (PROC (TEXT CONST) operate, THESAURUS CONST thesaurus)
+ Zweck: Ruft 'operate' mit allen im 'thesaurus' enthaltenen Dateinamen
+ nacheinander auf. Man beachte, daß bei Prozedur-Parametern der
+ Name der Prozedur hinter dessen Parametern geschrieben wird.
+ Beispiel:
+
+ do (PROC (TEXT CONST) reorganize, ALL myself)
+
+ PROC do (PROC (TEXT CONST, TASK CONST) operate,
+ THESAURUS CONST thesaurus, TASK CONST task)
+ Zweck: S.o.. Dabei ist zu beachten, daß 'task' als zweiter Parameter in
+ der Prozedur 'operate' eingesetzt wird. Beispiel:
+
+ do (PROC (TEXT CONST, TASK CONST) save,
+ SOME myself, father)
+ (* enspricht: *)
+ save (SOME myself, father)
+
+down (F)
+ PROC down (FILE VAR f)
+ Zweck: Positionieren um eine Zeile vorwärts in der Datei 'f'.
+
+ PROC down (FILE VAR f, INT CONST number)
+ Zweck: Positionieren um 'number' Zeilen vorwärts in der Datei 'f'.
+
+ PROC down (FILE VAR f, TEXT CONST pattern)
+ Zweck: Suche nach 'pattern' in der Datei 'f'. Wird 'pattern' gefunden,
+ ist die Position das erste Zeichen von 'pattern'. Andernfalls
+ steht man hinter dem letzten Zeichen der Datei. Achtung: 'down'
+ sucht vom nächsten Zeichen rechts ab, so daß wiederholtes Suchen
+ keine Endlosschleife ergibt.
+
+ PROC down (FILE VAR f, TEXT CONST pattern, INT CONST number)
+ Zweck: Wie obiges 'down', aber maximal nur 'number'-Zeilen weit.
+
+downety (F)
+ PROC downety (FILE VAR f, TEXT CONST pattern)
+ Zweck: Suche nach 'pattern' in der Datei 'f'. Wird 'pattern' gefunden,
+ ist die Position das erste Zeichen von 'pattern'. Andernfalls
+ steht man auf dem letzten Zeichen der Datei. Achtung: 'downety'
+ sucht (im Gegensatz zu 'down') vom aktuellen Zeichen.
+
+ PROC downety (FILE VAR f, TEXT CONST pattern, INT CONST number)
+ Zweck: Wie obiges 'downety', aber maximal nur 'number'-Zeilen weit.
+
+enter password
+ PROC enter password (TEXT CONST password)
+ Zweck: Einstellen eines Paßwortes in der Benutzer-Task für den Datei-
+ Verkehr mit einer Vater-Task. Der Parameter 'password' kann dabei
+ aus zwei Teilen bestehen, die durch ein "/"-Zeichen getrennt
+ werden müssen. Der erste Teil bedeutet das schreib-Passwort,
+ während der TEXT nach dem "/"-Zeichen das Lese-Paßwort beinhaltet.
+ Enthält der Parameter 'password' kein "/"-Zeichen, gilt der ange-
+ gebene TEXT sowohl für das Schreib- wie auch für das Lese-Paßwort.
+ Im Schreib- bzw. Lese-Teil des Paßworts kann man das "-"-Zeichen
+ angeben, um eine Datei vor überschreibendem oder lesendem Zugriff
+ zu schützen.
+
+ Die Paßwort-Überprüfung findet statt bei
+
+ - fetch (Überprüfung der Lese-Berechtigung)
+ - save (Überprüfung der Schreib-Berechtigung)
+ - erase (Überprüfung der Schreib-Berechtigung)
+
+eof (F)
+ BOOL PROC eof (FILE CONST file)
+ Zweck: Informationsprozedur auf das Ende eines FILEs. Liefert den Wert
+ TRUE, sofern hinter den letzten Satz eines FILEs positioniert
+ wurde.
+
+erase
+ PROC erase (TEXT CONST name)
+ Zweck: Löscht eine Datei mit dem Namen 'name' in der unmittelbaren
+ Vater-Task.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Eine Datei mit dem Namen 'name' existiert in der unmittelbaren
+ Vater-Task nicht.
+ * wrong password
+ Es wurde mit der Prozedur 'enter password' nicht das richtige
+ Paßwort angegeben.
+
+ PROC erase (TEXT CONST name, TASK CONST task)
+ Zweck: Löscht eine Datei mit dem Namen 'name' in der Task 'task'. Bei-
+ spiel:
+
+ erase ("meine datei", father)
+
+ PROC erase (THESAURUS CONST thesaurus)
+ Zweck: Löscht die im 'thesaurus' angegebenen Dateien in der Vater-Task.
+ Beispiel (löscht alle Dateien in der Vater-Task, die in der Benut-
+ zer-Task vorhanden sind):
+
+ erase (ALL myself)
+
+ PROC erase (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: S.o..
+
+exists (F)
+ BOOL PROC exists (TEXT CONST name)
+ Zweck: Informationsprozedur zur Abfrage der Existenz einer Datei in der
+ Benutzer-Task. Beispiel:
+
+ IF exists ("dateiname")
+ THEN FILE VAR f :: sequential file ...;
+ ELSE errorstop ("Datei existiert nicht")
+ FI
+
+father
+ TASK PROC father
+ Zweck: Liefert den internen Task-Bezeichner der Vater-Task der Benutzer-
+ Task. Beispiel:
+
+ save ("datei", father)
+
+ TASK PROC father (TASK CONST task)
+ Zweck: Liefert den internen Task-Bezeichner von 'task'. Beispiel:
+
+ save ("datei", father (father)) (* Kopiert 'datei' zum "Opa" *)
+
+fetch
+ PROC fetch (TEXT CONST name)
+ Zweck: Einbringen einer Datei in die Benutzer-Task von dem "direkten"
+ Vater im Taskbaum.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Die Datei existiert bei dem Vater nicht.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien der Benutzer-Task ist über-
+ schritten.
+ * wrong password
+ Es wurde mit der Prozedur 'enter password' nicht das richtige
+ Paßwort angegeben.
+
+ PROC fetch (TEXT CONST name, TASK CONST task)
+ Zweck: Kopieren einer Datei in die Benutzer-Task von 'task'. Beispiel:
+
+ fetch ("datei", public)
+
+ PROC fetch (THESAURUS CONST thesaurus)
+ Zweck: Holt alle im 'thesaurus' enthaltenen Dateien von der Vater-Task.
+
+ PROC fetch (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: Holt alle im 'thesaurus' enthaltenen Dateien von der 'manager'-
+ Task.
+
+forget (F)
+ PROC forget (TEXT CONST name)
+ Zweck: Löschen einer Datei mit dem Namen 'name' in der Benutzer-Task.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Die Datei mit dem Namen 'name' existiert nicht in der Benutzer-
+ Task.
+
+ PROC forget (DATASPACE VAR ds)
+ Zweck: Löschen des Datenraums 'ds'.
+
+ PROC forget (THESAURUS CONST thesaurus)
+ Zweck: Löscht die im 'thesaurus' enthaltenen Dateinamen in der Benutzer-
+ Task. Beispiel:
+
+ forget (SOME myself)
+
+ PROC forget (TEXT CONST file name, QUIET CONST q)
+ Zweck: Löschen der Datei 'file name' ohne Anfrage. Als zweiter Parameter
+ muß 'quiet' übergeben werden. Beispiel:
+
+ forget ("hugo", quiet)
+
+get (F)
+ PROC get (FILE VAR f, INT VAR number)
+ Zweck: Lesen eines INT-Wertes 'number' von der Datei 'f'.
+
+ PROC get (FILE VAR f, REAL VAR number)
+ Zweck: Lesen eines REAL-Wertes 'number' von der Datei 'f'.
+
+ PROC get (FILE VAR f, TEXT VAR text)
+ Zweck: Lesen eines TEXT-Wertes 'text' von der Datei 'f'.
+
+ PROC get (FILE VAR f, TEXT VAR text, TEXT CONST delimiter)
+ Zweck: Lesen eines TEXT-Wertes 'text' von der Datei 'f', bis das Zeichen
+ 'delimiter' angetroffen wird. Ein eventueller Zeilenwechsel in der
+ Datei wird dabei nicht übergangen.
+
+ PROC get (FILE VAR f, TEXT VAR text, INT CONST maxlength)
+ Zweck: Lesen eines TEXT-Wertes 'text' von der Datei 'f' mit 'maxlength'
+ Zeichen. Ein eventueller Zeilenwechsel in der Datei wird dabei
+ nicht übergangen.
+
+getline (F)
+ PROC get line (FILE VAR file, TEXT VAR record)
+ Zweck: Lesen einer Zeile 'record' von einer sequentiellen Datei 'file'.
+ Die Datei muß mit 'input' assoziiert sein (vergl. 'sequential
+ file').
+ Fehlerfälle:
+ * file not open
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+ * input after end of file
+ Es wurde versucht, über die letzte Zeile einer Datei zu lesen.
+ * input access to output file
+ Es wurde versucht, von einem mit 'output' assoziierten FILE zu
+ lesen.
+
+global manager
+ PROC global manager
+ Zweck: Durch den Aufruf der Prozedur wird die Benutzer-Task zu einem
+ Datei-Manager. Danach können Söhne dieser Task eingerichtet
+ werden.
+
+input (F)
+ PROC input (FILE VAR f)
+ Zweck: Ändern der Verarbeitungsart von 'modify' oder 'output' in 'input'.
+ Dabei wird auf den ersten Satz der Datei positioniert.
+
+ TRANSPUTDIRECTION CONST input
+ Zweck: Assoziierung in Zusammenhang mit der Prozedur 'sequential file'
+ einer sequentiellen Datei mit der 'TRANSPUTDIRECTION' 'input' (nur
+ lesen).
+
+insert record (F)
+ PROC insert record (FILE VAR file)
+ Zweck: Es wird ein leerer Satz in die Datei 'file' vor die aktuelle
+ Position eingefügt. Dieser Satz kann anschließend mit 'write
+ record' beschrieben werden (d.h. der neue Satz ist jetzt der
+ aktuelle Satz). Die Datei 'file' muß mit der Verarbeitungsart
+ 'modify' assoziiert worden sein.
+
+line no (F)
+ INT PROC line no (FILE CONST file)
+ Zweck: Liefert die aktuelle Zeilennummer.
+
+line (F)
+ PROC line (FILE VAR file)
+ Zweck: Positionierung auf die nähhste Zeile der Datei 'file'. Die Datei
+ 'file' darf mit 'output' oder 'input' assoziiert sein. Wird ver-
+ sucht, über das Ende eines mit 'input' assoziierten FILEs zu
+ positionieren, wird keine Aktion vorgenommen.
+
+ PROC line (FILE VAR file, INT CONST lines)
+ Zweck: Positionierung auf 'lines' nächste Zeilen der Datei 'file'. Die
+ Datei 'file' darf mit 'output' oder 'input' assoziiert sein. Wird
+ versucht, über das Ende eines mit 'input' assoziierten FILEs zu
+ positionieren, wird keine Aktion vorgenommen. Ist 'lines' <= 0,
+ wird keine Aktion durchgeführt.
+
+lines (F)
+ PROC lines (FILE VAR f)
+ Zweck: Liefert die Anzahl der Zeilen der Datei 'f'.
+
+list
+ PROC list
+ Zweck: Listet alle Dateien der Benutzer-Task mit Namen und Datum des
+ letzten Zugriffs auf dem Terminal auf.
+
+ PROC list (FILE VAR f)
+ Zweck: Schreibt alle Dateien der Benutzer-Task mit Namen und Datum der
+ letzten Änderung in die Datei 'f'.
+
+ PROC list (TASK CONST task)
+ Zweck: Listet alle Dateien der angegebenen 'task' mit Namen und Datum der
+ letzten Änderung auf dem Terminal auf. Beispiel:
+
+ list (father)
+
+max line length (F)
+ INT PROC max line length (FILE CONST file)
+ Zweck: Informationsprozedur über die Anzahl von Zeichen in einer Zeile
+ der Datei 'file'. Standardmäßig sind die Anzahl der Zeichen einer
+ Zeile wie beim Editor 77 Zeichen.
+
+ PROC max line length (FILE VAR file, INT CONST number)
+ Zweck: Setzen der Anzahl von Zeichen einer Zeile in dem FILE 'file'.
+
+modify (F)
+ TRANSPUTDIRECTION CONST modify
+ Zweck: Diese Betriebsrichtung erlaubt das Vorwärts- und Rückwärts-Posi-
+ tionieren und das beliebige Einfügen und Löschen von Sätzen.
+ 'modify' wird für die Assoziierungsprozedur 'sequential file'
+ benötigt.
+
+ PROC modify (FILE VAR f)
+ Zweck: Ändern der Betriebsrichtung von 'input' oder 'output' in die Be-
+ triebsrichtung 'modify'.
+
+myself
+ TASK PROC myself
+ Zweck: Liefert den internen Task-Bezeichner der Benutzer-Task. Beispiel:
+
+ save (ALL myself, father)
+
+name
+ TEXT PROC name (TASK CONST task)
+ Zweck: Liefert den TEXT-Namen von 'task'. Beispiel:
+
+ put (name (myself))
+
+new (F)
+ DATASPACE PROC new (TEXT CONST name)
+ Zweck: Richtet eine neue Datei in der Benutzer-Task ein.
+ Fehlerfälle:
+ * file already exists
+ Die Datei mit dem Namen 'name' existiert bereits in der Benutzer-
+ Task.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien in der Benutzer-Task ist über-
+ schritten.
+
+nilspace (F)
+ DATASPACE CONST nilspace
+ Zweck: Liefert einen leeren Datenraum.
+
+old (F)
+ DATASPACE PROC old (TEXT CONST name)
+ Zweck: Eine bereits vorhandene Datei der Benutzer-Task wird erneut zur
+ Bearbeitung angemeldet.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Die Datei mit dem Namen 'name' ist nicht in der Benutzer-Task
+ vorhanden.
+
+output (F)
+ PROC output (FILE VAR file)
+ Zweck: Ändern der Verarbeitungsart von 'input' oder 'modify' in 'output'.
+ Dabei wird hinter den letzten Satz der Datei positioniert.
+
+ TRANSPUTDIRECTION CONST output
+ Zweck: In Verbindung mit der Prozedur 'sequential file' kann eine Datei
+ assoziiert werden mit der Betriebsrichtung 'output' (nur
+ schreiben).
+
+pattern found
+ BOOL PROC pattern found
+ Zweck: Liefert TRUE, sofern die letzte Suchoperation (siehe 'down' und
+ 'up') erfolgreich war, sonst FALSE.
+
+printer
+ TASK PROC printer
+ Zweck: Liefert den internen TASK-Bezeichner der SPOOLer-Task für den
+ Drucker. Beispiel:
+
+ save ("datei", printer)
+
+public
+ TASK PROC public
+ Zweck: Liefert den internen Task-Bezeichner von "PUBLIC". Beispiel:
+
+ fetch ("datei", public)
+
+put (F)
+ PROC put (FILE VAR f, INT CONST number)
+ Zweck: Ausgabe eines INT-Wertes 'number' in die Datei 'f'. Dabei wird ein
+ Leerzeichen an die Ausgabe angefügt.
+
+ PROC put (FILE VAR f, REAL CONST number)
+ Zweck: Ausgabe eines REAL-Wertes 'number' in die Datei 'f'. Dabei wird
+ ein Leerzeichen an die Ausgabe angefügt.
+
+ PROC put (FILE VAR f, TEXT CONST text)
+ Zweck: Ausgabe eines TEXT-Wertes 'text' in die Datei 'f'. Dabei wird ein
+ Leerzeichen an die Ausgabe angefügt.
+
+putline (F)
+ PROC putline (FILE VAR file, TEXT CONST record)
+ Zweck: Ausgabe eines TEXTes 'record' in die Datei 'file'. 'file' muß mit
+ 'output' assoziiert sein.
+ Fehlerfälle:
+ * file not open
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+ * output access to input file
+ Es wurde versucht, auf einen mit 'input' assoziierten FILE zu
+ schreiben.
+
+read record (F)
+ PROC read record (FILE CONST file, TEXT VAR record)
+ Zweck: Liest den aktuellen Satz der Datei 'file' in den TEXT 'record'.
+ Die Position wird dabei nicht verändert. Die Datei 'file' muß mit
+ der Verarbeitungsart 'modify' assoziiert worden sein.
+
+reinsert (F)
+ PROC reinsert (FILE VAR f)
+ Zweck: Einfügen von "vorsichtig gelöschten" Zeilen (vergl. 'remove') an
+ der aktuellen Position.
+
+release
+ PROC release (TASK CONST task)
+ Zweck: Aufgabe der Reservierung des Archivs. Ein implizites 'release'
+ wird automatisch fünf Minuten nach der letzten Archiv-Operation
+ gegeben, sofern ein 'archive' eines anderen Nutzers vorliegt.
+ Beispiel:
+
+ release (archive)
+
+rename (F)
+ PROC rename (TEXT CONST oldname, newname)
+ Zweck: Umbenennen einer Datei von 'oldname' in 'newname'.
+
+remainder
+ THESAURUS PROC remainder
+ Zweck: Liefert nach der Unterbrechung einer Thesaurus-Operation den
+ "Rest"-Thesaurus.
+
+reorganize (F)
+ PROC reorganize (TEXT CONST filename)
+ Zweck: Reorganisiert eine Datei. Die durch eventuelles Einfügen und
+ Löschen entstandene Lücken werden eliminiert und die Anordung der
+ Sätze der Datei wird linearisiert.
+
+reset (F)
+ PROC reset (FILE VAR file)
+ Zweck: Positionieren in einem FILE auf den Anfang (bei mit 'input' asso-
+ ziierten FILEs) oder auf das Ende (bei mit 'output' assoziierten
+ FILEs).
+
+reset range (F)
+ PROC reset range (FILE VAR file)
+ Zweck: Setzt alle Einschränkungen auf 'file' zurück. Siehe auch 'set
+ range'.
+
+remove (F)
+ PROC remove (FILE VAR f, INT CONST anzahl)
+ Zweck: Löscht eine 'anzahl' von Zeilen "vorsichtig" aus der Datei 'f',
+ die mit 'reinsert' an anderer Stelle wieder eingesetzt werden
+ können.
+
+save
+ PROC save (TEXT CONST datei)
+ Zweck: Datei 'datei' wird an die unmittelbare Vater-Task übertragen.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Eine Datei mit dem Namen 'datei' existiert nicht in der Benutzer-
+ Task.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien in 'task' ist überschritten.
+ * wrong password
+ Es wurde mit der Prozedur 'enter password' nicht das richtige
+ Paßwort angegeben.
+
+ PROC save (TEXT CONST name, TASK CONST task)
+ Zweck: Datei mit dem Namen 'name' in Task 'task' kopieren. Beispiel:
+
+ save ("meine datei", father)
+
+ Fehlerfälle:
+ * ... gibt es nicht
+ Eine Datei mit dem Namen 'name' existiert nicht in der Benutzer-
+ Task.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien in der angegebenen task ist
+ überschritten.
+ * wrong password
+ Es wurde mit der Prozedur 'enter password' nicht das richtige
+ Paßwort angegeben.
+
+ PROC save (THESAURUS CONST thesaurus)
+ Zweck: Kopiert die Dateien, die in 'thesaurus' enthalten sind, in die
+ Vater-Task. Beispiel:
+
+ save (SOME myself)
+
+ PROC save (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: Kopiert die Dateien, die in 'thesaurus' enthalten sind, in Task
+ 'manager'.
+
+segments (F)
+ INT PROC segments (FILE CONST f)
+ Zweck: Liefert die Anzahl der Datei-Segmente von 'f'. Nach 'reorganize'
+ besteht 'f' aus einem Segment. Einfügungen oder Löschungen
+ erhöhen die Segmentanzahl.
+
+sequential file (F)
+ FILE PROC sequential file (TRANSPUTDIRECTION CONST mode, DATASPACE VAR ds)
+ Zweck: Assoziierung einer sequentiellen Datei mit dem Dataspace 'ds' und
+ der Betriebsrichtung 'TRANSPUTDIRECTION' (vergl. 'modify', 'input'
+ bzw. 'output'). Diese Prozedur dient zur Assoziierung eines tempo-
+ rären Datenraums in der Benutzer-Task, der nach der Beendigung
+ des Programmlaufs nicht mehr zugriffsfähig ist (weil der Name des
+ Datenraums nicht mehr ansprechbar ist). Somit muß der Datenraum
+ explizit vom Programm gelöscht werden.
+
+ FILE PROC sequential file (TRANSPUTDIRECTION CONST mode, TEXT CONST name)
+ Zweck: Assoziierung einer sequentiellen Datei mit dem Namen 'name' und
+ der Betriebsrichtung 'TRANSPUTDIRECTION' (vergl. 'input' bzw.
+ 'output'). Existiert der FILE bereits, dann wird mit 'input' auf
+ den Anfang des FILEs, bei 'output' hinter den letzten Satz der
+ Datei positioniert. Existiert dagegen der FILE noch nicht und ist
+ die TRANSPUTDIRECTION 'output', wird ein neuer FILE eingerichtet.
+ Fehlerfall:
+ * input file not existing
+ Es wurde versucht, einen nicht vorhandenen FILE mit 'input' zu
+ assoziieren.
+
+set range (F)
+ PROC set range (FILE VAR f, INT CONST anz, INT CONST column, FRANGE VAR b)
+ Zweck: Schränkt die Datei 'f' auf 'anz' Zeilen beginnend bei der Position
+ 'column' der aktuellen Zeile. Der "alte" Datei-Bereich wird in 'b'
+ gespeichert.
+
+ PROC set range (FILE VAR f, FRANGE VAR b)
+ Zweck: Setzt die Datei 'f' auf die in 'b' gespeicherten Bereich zurück.
+
+son
+ TASK PROC son (TASK CONST task)
+ Zweck: Liefert den internen Task-Bezeichner der Sohn-Task. Beispiel:
+
+ put (name (son (myself)))
+
+SOME
+ THESAURUS OP SOME (THESAURUS CONST thesaurus)
+ Zweck: Bietet den angegebenen 'thesaurus' zum Editieren an. Dabei können
+ nicht erwünschte Namen gestrichen werden.
+
+ THESAURUS OP SOME (TASK CONST task)
+ Zweck: Bietet einen THESAURUS von 'task' zum Editieren an.
+
+ THESAURUS OP SOME (TEXT CONST file name)
+ Zweck: Bietet einen 'thesaurus', der aus 'file name' gebildet wird, zum
+ editieren an.
+
+to line (F)
+ PROC to line (FILE VAR f, INT CONST number)
+ Zweck: Positionierung auf die Zeile 'number'. Nur erlaubt in der
+ Betriebsrichtung 'modify'.
+
+task
+ TASK PROC task (TEXT CONST task name)
+ Zweck: Liefert den internen Task-Bezeichner von 'task name'. Beispiel:
+
+ save ("datei", task ("PUBLIC"))
+
+ (* das gleiche wie: *)
+
+ save ("datei", public)
+
+type (F)
+ INT PROC type (DATASPACE CONST ds)
+ Zweck: Liefert den frei wählbaren (INT-) Schlüssel des Datenraums 'ds'.
+ Wurde der Datenraum noch nie angekoppelt, so liefert die Prozedur
+ 'type' einen Wert < 0, erfolgte eine Ankopplung und hat ein
+ Programmierer für den Datenraum 'ds' noch keinen anderen Schlüssel
+ festgelegt, so liefert 'type' den Wert '0'.
+
+ PROC type (DATASPACE CONST ds, INT CONST type)
+ Zweck: Setzt den frei wählbaren Schlüssel 'type' für den Datenraum 'ds'
+ (vergl. obige Prozedur 'type').
+
+up (F)
+ PROC up (FILE VAR f)
+ Zweck: Positionieren um eine Zeile rückwärts in der Datei 'f'.
+
+ PROC up (FILE VAR f, INT CONST number)
+ Zweck: Positionieren um 'number' Zeilen rückwärts in der Datei 'f'.
+
+ PROC up (FILE VAR f, TEXT CONST pattern)
+ Zweck: Suche nach 'pattern' rückwärts in der Datei 'f'. Wird 'pattern'
+ gefunden, ist die Position das erste Zeichen von 'pattern'.
+ Andernfalls steht man auf dem ersten Zeichen der Datei. Achtung:
+ 'down' sucht vom nächsten Zeichen links ab, so daß wiederholtes
+ Suchen keine Endlosschleife ergibt.
+
+ PROC up (FILE VAR f, TEXT CONST pattern, INT CONST number)
+ Zweck: Wie obiges 'up', aber maximal nur 'number'-Zeilen weit.
+
+uppety (F)
+ PROC uppety (FILE VAR f, TEXT CONST pattern)
+ Zweck: Suche nach 'pattern' rückwärts in der Datei 'f'. Wird 'pattern'
+ gefunden, ist die Position das erste Zeichen von 'pattern'.
+ Andernfalls steht man auf dem ersten Zeichen der Datei. Achtung:
+ 'uppety' sucht (im Gegensatz zu 'up') vom aktuellen Zeichen.
+
+ PROC uppety (FILE VAR f, TEXT CONST pattern, INT CONST number)
+ Zweck: Wie obiges 'uppety', aber maximal nur 'number'-Zeilen weit.
+
+word (F)
+ TEXT PROC word (FILE CONST f)
+ Zweck: Liefert das aktuelle Wort (bis zum nächsten Leerzeichen oder
+ Zeilenende).
+
+ TEXT PROC word (FILE CONST f, TEXT CONST sep)
+ Zweck: Liefert einen Text von der aktuellen Position bis zum nächsten
+ 'sep-Zeichen oder Zeilenende.
+
+ TEXT CONST word (FILE CONST f, INT CONST len)
+ Zweck: Liefert einen Text von der aktuellen Position mit der Länge 'len'
+ bzw. bis zum Zeilenende.
+
+write (F)
+ PROC write (FILE VAR f, TEXT CONST text)
+ Zweck: Schreibt 'text' in die Datei 'f' (analog 'put (f, text)'), aber
+ ohne Trennblank.
+
+write record (F)
+ PROC write record (FILE VAR file, TEXT CONST record)
+ Zweck: Schreibt einen Satz in die Datei 'file' an die aktuelle Position.
+ Dieser Satz muß bereits vorhanden sein, d.h. mit 'write record'
+ kann keine leere Datei beschrieben werden, sondern es wird der
+ Satz an der aktuellen Position überschrieben. Die Position in der
+ Datei wird nicht verändert. Die Datei 'file' muß mit der Verar-
+ beitungsart 'modify' assoziiert worden sein.
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil8 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil8
new file mode 100644
index 0000000..16e4d07
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil8
@@ -0,0 +1,1345 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 8: Standardpakete
+
+
+1. Übersicht
+
+Hier werden die im EUMEL-System verfügbaren Prozeduren und Operatoren aufge-
+führt, die nicht bereits in anderen Teilen des Benutzerhandbuchs beschrieben
+wurden.
+
+Die meisten der hier beschriebenen Objekte werden nicht vom ELAN-Compiler,
+sondern von vorübersetzten Moduln (PACKETs) realisiert (vergl. dazu auch den
+Quellcode). Die in diesem Teil beschriebenen Prozeduren und Operatoren
+weisen einige wenige Modifikationen, aber beträchtliche Erweiterungen gegen-
+über dem Standard auf, um sie für die Zwecke des EUMEL-Systems anzupassen.
+Hier werden nur diejenigen Objekte aufgeführt, die bei einer System-Aus-
+lieferung dem EUMEL-System beigefügt sind. Jeder Installation ist es frei-
+gestellt, diesen "EUMEL-Standard" zu erweitern oder zu modifizieren.
+
+Die Operationen des EUMEL-Standards lassen sich in verschiedene Klassen -
+je nach Aufgabenbereich - ordnen.
+
+
+
+Ein-/Ausgabe
+
+Die Ein-/Ausgabe erfolgt im EUMEL-System in der Regel auf dem Terminal des
+Benutzers. Sie kann aber auch in einen File umgeleitet werden.
+
+Die Ein-/Ausgabe eines Programms erfolgt in der Regel auf dem Terminal des
+Benutzers, welches einem Prozeß zugeordnet ist. Die Eingabe vom Bildschirm
+kann man mit den Prozeduren
+
+ get
+
+programmieren, welche INT, REAL und TEXT-Werte einlesen. Bei der Eingabe
+kann der Eingabetext editiert werden (Zeichen löschen, einfügen, über-
+schreiben oder Lernsequenzen abrufen). Die Ausgabe erfolgt mit den Proze-
+duren
+
+ put
+
+(für INT-, REAL- und TEXT-Werte). Von den 'put'-Prozeduren wird ein Leer-
+zeichen an eine Ausgabe angefügt, um diese von der vorhergehenden zu trennen.
+Zusätzlich existiert die
+
+ write
+
+Prozedur, welche an die Ausgabe kein Leerzeichen anfügt. Mit
+
+ line
+
+kann man eine Positionierung auf eine neue Zeile bei der Ein-/Ausgabe er-
+wirken. Mit
+
+ getline
+ putline
+
+kann eine ganze Zeile eingelesen bzw. ausgegeben werden.
+
+Wie bereits erwähnt, erfolgt die Ein-/Ausgabe in der Regel auf dem Terminal
+des Benutzers. Es ist jedoch möglich, die Ein-/Ausgabe dieser Prozeduren
+"umzuleiten". Diese Umleitung erfolgt in eine oder von einer Datei. Dazu
+gibt es die Prozeduren
+
+ online (* liefert TRUE, wenn die Task an ein Terminal
+ gekoppelt ist *)
+ sysout ("name") (* Ausgabe erfolgt in die Datei 'name'. 'sysout
+ ("")' schaltet auf das Terminal zurück *)
+ sysout (* Liefert den Namen der eingestellten 'sysout'-
+ Datei. Wird "" geliefert, ist man an ein
+ Terminal gekoppelt *)
+ sysin ("name") (* Umschaltung der Eingabe vom Terminal auf die
+ Datei 'name'. sysin ("")' schaltet auf das
+ Terminal zurück *)
+ sysin (* Liefert den Namen der eingestellten 'sysin'-
+ Datei. Wird "" geliefert, ist man an ein
+ Terminal gekoppelt *)
+
+Wie bereits erwähnt, ist die Umschaltung nur für die Prozeduren 'get' und
+'put'/'write', sowie 'getline' und 'putline' und die Prozedur 'line' möglich.
+(Die folgenden Prozeduren haben immer eine Wirkung auf das Benutzer-
+Terminal). Die Prozedur
+
+ out
+
+schreibt wie 'write' einen Text auf den Bildschirm (läßt sich aber nicht
+"umleiten").
+
+ cout
+
+schreibt einen INT-Wert an die aktuelle Cursor-Position auf den Bildschirm
+und positioniert anschließend auf diese Position wieder zurück. Diese
+Prozedur wird vorwiegend für Kontroll-Ausgaben (z.B. Zeilennummern) benutzt.
+Ist die Task nicht angekoppelt, geht die Ausgabe ins "Leere"; das Programm
+der Task läuft also weiter (im Gegensatz zu 'put' auf den Bildschirm). Mit
+der Prozedur
+
+ cursor
+
+kann - neben der Möglichkeit des Arbeitens mit Steuerzeichen - auf eine
+bestimmte Position des Bildschirms positioniert werden. Mit
+
+ get cursor
+
+kann die aktuelle Position des Cursors auf dem Terminal des Benutzers er-
+fragt werden. Mit Hilfe der Prozedur
+
+ inchar
+
+kann ein Zeichen vom Bildschirm gelesen werden. Der Prozeß wartet solange,
+bis ein Zeichen eingegeben wird. Dagegen wird bei
+
+ incharety
+
+niltext geliefert, wenn kein Zeichen eingegeben wurde. Eine weitere 'inchare-
+ty'-Prozedur wartet zusätzlich noch eine angebbare Zeitdauer, ob ein Zeichen
+eingegeben wird. Der Operator
+
+ TIMESOUT
+
+stellt einen TEXT mehrfach auf dem Bildschirm dar. Die Prozedur
+
+ page
+
+positioniert auf einen "neuen Bildschirm": der Bildschirm wird gelöscht und
+der Cursor befindet sich anschließend in der linken oberen Ecke des Bild-
+schirms.
+
+
+
+Manipulation von Texten
+
+Ein Text kann im EUMEL-System bis zu 32 000 Zeichen haben. Für TEXTe
+stehen neben der Zuweisung die Vergleichsoperatoren
+
+ = , < , <= , > , >= , <>
+
+zur Verfügung. Dabei ist die lexikographische Reihenfolge der Zeichen (vergl.
+EUMEL-Zeichensatz) zu beachten. Zur Verkettung zweier TEXTe ist der
+
+ +
+
+Operator vorhanden. Der Operator
+
+ *
+
+nimmt eine Vervielfachung eines TEXTes vor. Der Operator
+
+ CAT
+
+konkateniert den linken mit dem rechten Operanden und weist das Resultat dem
+linken Operanden zu. Die Prozeduren
+
+ pos
+
+liefern die Position des ersten Auftretens eines TEXTes oder einer
+Zeichenklasse in einem anderen TEXT. Die Prozeduren
+
+ code
+
+konvertieren ein Zeichen in einen INT-Wert und umgekehrt (vergl. dazu den
+EUMEL-Zeichensatz) und dienen z.B. zur Behandlung von Zeichen, die nicht
+auf einer Tastatur zu finden sind. Die Prozedur
+
+ compress
+
+schneidet führende und nachfolgende Leerzeichen eines TEXTs ab, während
+
+ delete char (* ein Zeichen loeschen *)
+ insert char (* ein Zeichen einfuegen *)
+
+ein Zeichen einfügt bzw. löscht. Mit
+
+ change
+
+kann bei dem erstmaligen Auftreten eines Teiltextes in einem TEXT dieser
+ersetzt werden. Mit
+
+ change all
+
+kann jedesmal, wenn ein Teiltext in einem TEXT auftritt, dieser durch einen
+anderen Text ersetzt werden.
+
+ LENGTH (* oder *)
+ length
+
+liefert die Länge (d.h. die Anzahl der Zeichen in einem TEXT einschließlich
+der Leerzeichen) eines TEXTes. Mit
+
+ replace
+
+kann eine Ersetzung eines Teiltextes erzielt werden. Im Gegensatz zu
+'replace' kann sich bei 'change' die Länge des Textes ändern. Mit
+
+ SUB
+ subtext
+
+kann ein Zeichen ('SUB') oder ein Teiltext ('subtext') aus einem Text geholt
+werden.
+
+TEXTe werden im EUMEL-System über einen Heap realisiert, d.h. nicht wie
+andere Objekte auf einem Stack. Das hat u.a. zur Folge, daß TEXT-"Leichen"
+auf dem Heap nicht automatisch beseitigt werden. Darum kann der benötigte
+Speicherplatz durch TEXT-Operationen anwachsen. Der Heap kann nun von
+unnötigem Speicherplatz durch die Prozedur
+
+ collect heap garbage
+
+bereinigt werden. Die Größe des Heaps (in KB) kann durch die Prozedur
+
+ heap size
+
+erfragt werden. Übrigens überprüft der Standard-Monitor nach jedem Kommando
+die Heap-Größe und veranlaßt eine Bereinigung des Heaps, wenn dieser um
+mindestens 4 KB gewachsen ist.
+
+
+
+Mathematische Operationen
+
+Folgende mathematische Prozeduren bzw. Operatoren stehen im EUMEL zur Zeit
+zur Verfügung (manche Prozeduren stehen in mehr als einer Version zur
+Verfügung, z.B. die sin-Prozedur für Radiant und Winkelgrad):
+
+ ** (* Exponentiation *)
+ abs (* Absolutbetrag *)
+ arctan (* Arcus Tangens-Funktion *)
+ cos (* Kosinus-Funktion *)
+ e (* Eulersche Zahl (2.718282) *)
+ pi (* Die Zahl pi (3.141593) *)
+ exp (* Exponential-Funktion *)
+ floor (* REAL mit abgeschnittenen Nachkommastellen *)
+ frac (* Nachkommastellen eines REALs *)
+ random,
+ initialize random (* Zufallszahlen *)
+ ln, log2, log10 (* Logarithmus-Funktionen *)
+ max, min (* Minimum bzw. Maximum zweier Werte *)
+ MOD (* Modulo-Funktion *)
+ round (* Rundung *)
+ sign (* Vorzeichen feststellen *)
+ sin (* Sinus-Funktion *)
+ sqrt (* Wurzel-Funktion *)
+ tan (* Tangens-Funktion *)
+
+
+
+Konvertierungs-Operationen
+
+Mit den Prozeduren
+
+ text
+
+kann aus einem INT- bzw. REAL-Wert ein TEXT, während mit
+
+ int
+
+aus einem REAL- bzw. TEXT-Wert ein INT und mit
+
+ real
+
+aus einem INT- bzw. TEXT-Wert ein REAL gemacht werden kann. Mit
+
+ last conversion ok
+
+kann abgefragt werden, ob die letzte Umwandlung ohne Fehler bzw. fehlerhaft
+vorgenommen wurde. Mit
+
+ decimal exponent
+
+kann der Exponent eines REAL-Wertes ausgeblendet werden.
+
+
+
+Kommando-Dialog
+
+Die Prozeduren für den Kommando-Dialog dienen zur bequemen Programmierung
+von interaktiven Anfragen an einen Benutzer eines Programms. (Diese
+Prozeduren werden u.a. auch vom Monitor verwendet). Der Kommando-Dialog
+ist im Normalfall eingeschaltet. Mit der Prozedur
+
+ command dialogue
+
+kann man den Kommando-Dialog ein- bzw. ausschalten. Mit der Prozedur
+
+ say
+
+kann - sofern der Kommando-Dialog eingeschaltet ist - ein Text auf dem
+Bildschirm ausgegeben werden. Sofern der Kommando-Dialog eingeschaltet ist,
+schreibt die Prozedur
+
+ yes
+
+einen Text auf den Bildschirm des Benutzers. An den Text wird '(j/n) ?'
+angefügt. Die Prozedur 'yes' liefert den Wert TRUE, sofern der Benutzer auf
+die Frage mit dem Zeichen "j" antwortet und den Wert FALSE, sofern die
+Antwort "n" lautete. Die Prozedur
+
+ no
+
+arbeitet wie 'NOT yes'.
+
+
+
+Verschiedenes
+
+Mit den Prozeduren
+
+ stop
+ errorstop
+
+kann ein Abbruch (letztere mit Meldung; vergl. Fehlerbehandlung im System-
+handbuch) erreicht werden. Die Prozedur
+
+ clock
+
+liefert Zeitwerte als REAL-Wert, nämlich die verbrauchte CPU-Zeit einer Task
+oder die aktuelle Uhrzeit (inklusive Datum). Die Prozedur
+
+ time of day
+
+liefert die aktuelle Uhrzeit. Mit den Konvertierungsprozeduren
+
+ date
+ time
+
+können die Werte der Prozedur 'clock' in eine lesbare Form gebracht werden.
+Mit der Prozedur
+
+ pause
+
+kann eine bestimmte Zeitdauer gewartet werden, ohne den Prozessor zu be-
+lasten. Die Wartezeit wird abgebrochen, wenn die Zeitgrenze erreicht ist
+oder sobald ein Zeichen am Terminal des Benutzers eingegeben wurde. Dieses
+Zeichen wird nicht verarbeitet.
+
+
+
+2. Die EUMEL-Standardpakete
+
+Die elementaren Datentypen BOOL, INT, REAL, TEXT und die entsprechenden Zu-
+weisungsoperatoren werden hier nicht angegeben.
+
+=
+ BOOL OP = (INT CONST a, b)
+ Zweck: Vergleich.
+
+ BOOL OP = (REAL CONST a, b)
+ Zweck: Vergleich.
+
+ BOOL OP = (TEXT CONST left, right)
+ Zweck: Vergleich von zwei Texten auf Gleichheit (Texte mit ungleichen
+ Längen sind immer ungleich).
+
+<
+ BOOL OP < (INT CONST a, b)
+ Zweck: Vergleich auf kleiner.
+
+ BOOL OP < (REAL CONST a, b)
+ Zweck: Vergleich auf kleiner.
+
+ BOOL OP < (TEXT CONST left, right)
+ Zweck: Vergleich zweier Texte auf kleiner ('left' kommt lexikographisch
+ vor 'right').
+
+>
+ BOOL OP > (INT CONST a, b)
+ Zweck: Vergleich auf größer.
+
+ BOOL OP > (REAL CONST a, b)
+ Zweck: Vergleich auf größer.
+
+ BOOL OP > (TEXT CONST left, right)
+ Zweck: Vergleich zweier Texte auf größer ('left' kommt lexikographisch
+ nach 'right').
+
+<=
+ BOOL OP <= (INT CONST a, b)
+ Zweck: Vergleich auf kleiner gleich.
+
+ BOOL OP <= (REAL CONST a, b)
+ Zweck: Vergleich auf kleiner gleich.
+
+ BOOL OP <= (TEXT CONST left, right)
+ Zweck: Vergleich von zwei Texten auf kleiner gleich ('left' kommt
+ lexikographisch vor oder ist gleich 'right').
+
+>=
+ BOOL OP >= (INT CONST a, b)
+ Zweck: Vergleich auf größer gleich.
+
+ BOOL OP >= (REAL CONST a, b)
+ Zweck: Vergleich auf größer gleich.
+
+ BOOL OP >= (TEXT CONST left, right)
+ Zweck: Vergleich zweier Texte auf größer gleich ('left' kommt lexiko-
+ graphisch nach oder ist gleich 'right').
+
+<>
+ BOOL OP <> (INT CONST a, b)
+ Zweck: Vergleich auf Ungleichheit.
+
+ BOOL OP <> (REAL CONST a, b)
+ Zweck: Vergleich auf Ungleichheit.
+
+ BOOL OP <> (TEXT CONST left, right)
+ Zweck: Vergleich von zwei Texten auf Ungleichheit (Texte mit ungleichen
+ Längen sind stets ungleich).
+
++
+ INT OP + (INT CONST a)
+ Zweck: Monadischer Operator (Vorzeichen, ohne Wirkung).
+
+ REAL OP + (REAL CONST a)
+ Zweck: Monadischer Operator (Vorzeichen, ohne Wirkung).
+
+ INT OP + (INT CONST a, b)
+ Zweck: Addition.
+
+ REAL OP + (REAL CONST a, b)
+ Zweck: Addition.
+
+ TEXT OP + (TEXT CONST left, right)
+ Zweck: Verkettung der Texte 'left' und 'right' in dieser Reihenfolge. Die
+ Länge des Resultats ergibt sich aus der Addition der Längen der
+ Operanden.
+
+-
+ INT OP - (INT CONST a)
+ Zweck: Vorzeichen-Umkehrung.
+
+ REAL OP - (REAL CONST a)
+ Zweck: Vorzeichen-Umkehrung.
+
+ INT OP - (INT CONST a, b)
+ Zweck: Subtraktion.
+
+ REAL OP - (REAL CONST a, b)
+ Zweck: Subtraktion.
+
+*
+ INT OP * (INT CONST a, b)
+ Zweck: Multiplikation.
+
+ REAL OP * (REAL CONST a, b)
+ Zweck: Multiplikation.
+
+ TEXT OP * (INT CONST times, TEXT CONST source)
+ Zweck: 'times' fache Erstellung von 'source' und Verkettung. Dabei muß
+
+ times >= 0
+
+ sein, sonst wird 'niltext' geliefert.
+
+/
+ REAL OP / (REAL CONST a, b)
+ Zweck: Division.
+ Fehlerfall:
+ * Division durch 0
+
+**
+ INT OP ** (INT CONST arg, exp)
+ Zweck: Exponentiation mit 'exp' >= 0
+ Fehlerfälle:
+ * INT OP ** : negative exponent
+ Ein negativer Exponent ist nicht zugelassen.
+ * 0 ** 0 is not defined
+ 'arg' und 'exp' dürfen nicht beide 0 sein.
+
+ REAL OP ** (REAL CONST arg, exp)
+ Zweck: Exponentiation.
+ Fehlerfälle:
+ * hoch mit negativer basis
+ Der 'exp' muß >= 0.0 sein.
+ * 0**0 geht nicht
+ 'arg' und 'exp' dürfen nicht gleichzeitig 0.0 sein.
+
+ REAL OP ** (REAL CONST arg, INT CONST exp)
+ Zweck: Exponentiation.
+ Fehlerfall:
+ * 0.0 ** 0 geht nicht
+
+abs
+ INT PROC abs (INT CONST argument)
+ Zweck: Absolutbetrag eines INT-Wertes.
+
+ INT OP ABS (INT CONST argument)
+ Zweck: Absolutbetrag eines INT-Wertes.
+
+ REAL PROC abs (REAL CONST value)
+ Zweck: Absolutbetrag eines REAL-Wertes.
+
+ REAL OP ABS (REAL CONST value)
+ Zweck: Absolutbetrag eines REAL-Wertes.
+
+AND
+ BOOL OP AND (BOOL CONST a, b)
+ Zweck: Logisches und.
+
+arctan
+ REAL PROC arctan (REAL CONST x)
+ Zweck: Arcus Tangens-Funktion. Liefert einen Wert in Radiant.
+
+arctand
+ REAL PROC arctand (REAL CONST x)
+ Zweck: Arcus Tangens-Funktion. Liefert einen Wert in Grad.
+
+CAT
+ OP CAT (TEXT VAR left, TEXT CONST right)
+ Zweck: Hat die gleiche Wirkung wie
+
+ left := left + right
+
+ Hinweis: Der Operator 'CAT' hat eine geringere Heap-Belastung als
+ die Operation mit expliziter Zuweisung.
+
+change
+ PROC change (TEXT VAR destination, TEXT CONST old, new)
+ Zweck: Ersetzung des (Teil-) TEXTes 'old' in 'destination' durch 'new' bei
+ dem erstmaligen Auftreten. Ist 'old' nicht in 'source' vorhanden,
+ so wird keine Meldung abgesetzt (Abweichung vom Standard). Beachte,
+ daß sich dabei die Länge von 'destination' verändern kann.
+ Beispiel:
+
+ TEXT VAR mein text :: "EUMEL-Benutzerhandbuch";
+ change (mein text, "Ben", "N"); (* EUMEL-Nutzerhandbuch *)
+
+PROC change (TEXT VAR destination, INT CONST from, to, TEXT CONST new)
+ Zweck: Der TEXT 'new' wird in den TEXT 'destination' anstatt des TEXTes,
+ der zwischen 'from' und 'to' steht, eingesetzt. Beachte, daß sich
+ dabei die Länge von 'destination' ändern kann. Beispiel:
+
+ TEXT VAR mein text :: "EUMEL-Benutzerhandbuch";
+ change (mein text, 7, 9, "N"); (* wie oben *)
+
+change all
+ PROC change all (TEXT VAR destination, TEXT CONST old, new)
+ Zweck: Der Teiltext 'old' wird durch 'new' in 'destination' ersetzt. Im
+ Unterschied zur 'change'-Prozedur findet die Ersetzung nicht nur
+ bei dem erstmaligen Auftreten von 'old' statt, sondern so oft, wie
+ 'old' in 'destination' vorhanden ist. Beispiel:
+
+
+ TEXT VAR x :: "Das ist ein Satz";
+ change all (x, " ", ""); (* DasisteinSatz *)
+
+clock
+ REAL PROC clock (INT CONST index)
+ Zweck: Datum und Uhrzeit werden vom EUMEL-System für alle Tasks geführt.
+ Neben einer Uhr ('Realzeituhr'), die das Datum und die aktuelle
+ Uhrzeit enthält, wird eine Uhr für die von der Task verbrauchte
+ CPU-Zeit geführt ('CPU-Zeituhr'). Beide Zeiten werden vom System
+ als REALs realisiert. Die Prozedur 'clock' liefert die aktuellen
+ Werte dieser Uhren. Bei 'index = 0' wird die akkumulierte CPU-Zeit
+ der Task, bei 'index = 1' der Wert der Realzeituhr geliefert.
+
+ Mit den REAL-Werten der Uhren kann ohne weiteres gerechnet werden,
+ jedoch sind nur Werte > 0 definiert. Die REAL-Werte der Realzeit-
+ uhr beginnen beim 1.1.1900 um 0 Uhr. Es sind nur Werte für dieses
+ Jahrhundert zugelassen. Werte der Realzeituhr in lesbarer Form
+ kann man durch die Konvertierungsprozeduren 'date' (für den
+ aktuellen Tag) und 'time of day' (Uhrzeit) erhalten.
+
+ Um die benötigte CPU-Zeit eines Programms zu berechnen, muß man
+ die CPU-Zeituhr zweimal abfragen. Um solche Zeiten in lesbarer
+ Form zu erhalten, kann man die Konvertierungsprozedur 'time'
+ verwenden. Beispiel:
+
+ REAL CONST anfang :: clock (0);
+ berechnungen;
+ REAL CONST ende :: clock (0);
+ put ("benoetigte CPU-Zeit:");
+ put (time (ende - anfang))
+
+code
+ TEXT PROC code (INT CONST code)
+ Zweck: Wandelt einen INT-Wert 'code' in ein Zeichen um. 'code' muß
+
+ 1 <= code <= 254
+
+ sein.
+
+ INT PROC code (TEXT CONST text)
+ Zweck: Wandelt ein Zeichen 'text' in einen INT-Wert um. Ist
+
+ LENGTH text <> 1
+
+ dann wird der Wert -1 geliefert (also bei mehr als ein Zeichen
+ oder niltext).
+
+collect heap garbage
+ PROC collect heap garbage
+ Zweck: Bereinigung des Heaps von nicht mehr benötigten TEXTen.
+
+command dialogue
+ PROC command dialogue (BOOL CONST status)
+ Zweck: Ein- bzw. Ausschalten des Kommando-Dialogs. Ist der Kommando-
+ dialog eingeschaltet, dann funktionieren z.B. die Prozeduren 'yes'
+ bzw. 'no' und ein Aufruf der Prozedur 'errorstop' liefert eine
+ Fehlermeldung auf dem Terminal. Ist der Kommandodialog ausge-
+ schaltet, wird z.B. durch die Prozedur 'yes' kein Text ausgegeben
+ (es wird TRUE geliefert) und errorstop erzeugt keine Fehler-
+ meldungen.
+
+ BOOL PROC command dialogue
+ Zweck: Liefert den Wert TRUE, wenn der Kommando-Dialog eingeschaltet
+ ist, andernfalls FALSE.
+
+compress
+ TEXT PROC compress (TEXT CONST text)
+ Zweck: Liefert den TEXT 'text' ohne führende und nachfolgende Leerzeichen.
+
+cos
+ REAL PROC cos (REAL CONST x)
+ Zweck: Kosinus-Funktion. 'x' muß in Radiant angegeben werden.
+
+cosd
+ REAL PROC cosd (REAL CONST x)
+ Zweck: Cosinus-Funktion. 'x' muß in Winkelgrad angegeben werden.
+
+cout
+ PROC cout (INT CONST number)
+ Zweck: Schreibt 'number' an die aktuelle Cursor-Position auf den Bild-
+ schirm. Anschließend wird an diese Position wieder zurück positio-
+ niert. 'number' muß > 0 sein. Paßt 'number' nicht mehr auf die
+ Zeile, so ist die Wirkung von 'cout' nicht definiert. 'cout' gibt
+ den Wert von 'number' nur aus, wenn genügend freie Kanal-Kapazität
+ für diese Ausgabe vorhanden ist. Das hat zur Folge, daß Programme
+ nicht auf die Beendigung einer Ausgabe von 'number' warten müssen
+ und ggf. Ausgaben überschlagen werden.
+
+cursor
+ PROC cursor (INT CONST column, row)
+ Zweck: Positioniert den Cursor auf dem Bildschirm, wobei 'column' die
+ Spalte und 'row' die Zeile angibt. Die zulässigen Bereiche von
+ 'column' und 'row' sind geräteabhängig. Zur Zeit gilt auf allen
+ EUMEL-Geräten
+
+ 1 <= column <= 80
+ 1 <= row <= 24
+
+date
+ TEXT PROC date (REAL CONST time)
+ Zweck: Konvertierungsprozedur für das Datum, welches sich aus dem Aufruf
+ der Prozedur 'clock (1)' ergibt. Das Datum wird in der Form
+ 'tt.mm.jj' geliefert. Beispiel:
+
+ put (date (clock (1))) (* z.B.: 24.12.82 *)
+
+
+ REAL PROC date (TEXT CONST datum)
+ Zweck: Konvertierungsprozedur für ein Datum in der Form 'tt.mm.jj'.
+ Liefert einen REAL-Wert, wie ihn die Prozedur 'clock (1)' liefern
+ würde. Beispiel:
+
+ put (date ("24.12.82")) (* 6.270670e10 *)
+
+ TEXT PROC date
+ Zweck: Liefert das Tagesdatum. Wirkt wie 'date (clock (1))', ist jedoch
+ erheblich schneller.
+
+day
+ REAL CONST day
+ Zweck: Liefert die Anzahl der Sekunden eines Tages (86 400.0).
+
+decimal exponent
+ INT PROC decimal exponent (REAL CONST mantisse)
+ Zweck: Liefert aus einem REAL-Wert den dezimalen Exponenten als INT-Wert.
+
+DECR
+ OP DECR (INT VAR left, INT CONST right)
+ Zweck: Wirkt wie left := left - right
+
+ OP DECR (REAL VAR left, REAL CONST right)
+ Zweck: Wirkt wie left := left - right
+
+delete char
+ PROC delete char (TEXT VAR string, INT CONST delete pos)
+ Zweck: Löscht ein Zeichen aus dem Text 'string' an der Position 'delete
+ pos'. Für
+
+ delete pos <= 0
+
+ oder
+
+ delete pos > LENGTH string
+
+ wird keine Aktion vorgenommen.
+
+DIV
+ INT OP DIV (INT CONST a, b)
+ Zweck: INT-Division.
+ Fehlerfall:
+ * DIV by 0
+ Division durch Null.
+
+e
+ REAL CONST e
+ Zweck: Eulersche Zahl (2.718282).
+
+errorstop
+ PROC errorstop (TEXT CONST error message)
+ Zweck: Abbruch unter Ausgabe einer Fehlermeldung (vergl. Fehlerbehand-
+ lung).
+
+exp
+ REAL PROC exp (REAL CONST z)
+ Zweck: Exponentialfunktion.
+
+floor
+ REAL PROC floor (REAL CONST real)
+ Zweck: Schneidet die Nachkommastellen des REAL-Wertes 'real' ab.
+
+frac
+ REAL PROC frac (REAL CONST z)
+ Zweck: Liefert die Stellen eines REAL-Wertes hinter dem Dezimalpunkt.
+
+get
+ PROC get (INT VAR number)
+ Zweck: Einlesen eines INT-Wertes vom Bildschirm. Der einzulesende INT-
+ Wert kann bei der Eingabe vom Terminal editiert werden. Die
+ Eingabe kann vom Benutzer-Terminal so umgeleitet werden, daß sie
+ von einer Datei aus erfolgt (vergl. 'sysin').
+
+ PROC get (REAL VAR value)
+ Zweck: Einlesen eines REAL-Wertes vom Bildschirm. Der einzulesende
+ REAL-Wert kann bei der Eingabe vom Terminal editiert werden. Die
+ Eingabe kann vom Benutzer-Terminal so umgeleitet werden, daß sie
+ von einer Datei aus erfolgt (vergl. 'sysin').
+
+ PROC get (TEXT VAR word)
+ Zweck: Liest einen Text in die Variable 'word' mit maximal 255 Zeichen.
+ Es werden solange Zeichen vom Terminal gelesen, bis ein Leer-
+ zeichen oder ein Positionierungszeichen eingegeben wird. Dabei
+ werden führende Leerzeichen übergeben. Der einzulesende Text kann
+ bei der Eingabe editiert werden. Eine leere Eingabe ist nicht
+ erlaubt. Die Eingabe kann vom Benutzer-Terminal so umgeleitet
+ werden, daß sie von einer Datei aus erfolgt (vergl. 'sysin').
+
+ PROC get (TEXT VAR word, INT CONST laenge)
+ Zweck: Liest einen Text vom Bildschirm mit der Länge 'laenge' oder bis
+ ein Positionierungszeichen angetroffen wird. Der einzulesende Wert
+ kann bei der Eingabe editiert werden. Dabei gilt:
+
+ 1 <= laenge <= 255
+
+ PROC get (TEXT VAR word, TEXT CONST separator)
+ Zweck: Liest einen Text vom Bildschirm, bis ein Zeichen 'separator' ange-
+ troffen oder ein Positionierungszeichen eingegeben wird. Der ein-
+ zulesende Text kann bei der Eingabe editiert werden.
+
+get cursor
+ PROC get cursor (INT VAR x, y)
+ Zweck: Erfragung der aktuellen Cursor-Position. Die Koordinaten des Cur-
+ sors werden in 'x' und 'y' geliefert. Die aktuelle Cursor-Position
+ ist nach Ausgabe von 'HOME' (Code = 1) oder einer Positionierung
+ des Cursors mit der Prozedur 'cursor' stets definiert. Die Proze-
+ dur 'get cursor' liefert jedoch undefinierte Werte, wenn über den
+ rechten Rand einer Zeile hinausgeschrieben wurde (die Wirkung
+ einer solchen Operation hängt von der Hardware eines Terminals ab).
+
+getline
+ PROC get line (TEXT VAR line)
+ Zweck: Das System wartet auf eine Zeile vom Bildschirm (max. 255 Zeichen).
+ Eine leere Eingabe ist nicht möglich. Die Eingabe kann vom Benut-
+ zer-Terminal so umgeleitet werden, daß sie von einer Datei aus
+ erfolgt (vergl. 'sysin').
+
+heap size
+ INT PROC heap size
+ Zweck: Informationsprozedur für die Größe (in KB) des TEXT-Heaps.
+
+hour
+ REAL CONST hour
+ Zweck: Liefert die Anzahl der Sekunden einer Stunde (3600.0).
+
+inchar
+ PROC inchar (TEXT VAR character)
+ Zweck: Wartet solange, bis ein Zeichen von der Tastatur eingegeben wird,
+ und schreibt dieses Zeichen in die Variable 'character'.
+
+incharety
+ TEXT PROC incharety
+ Zweck: Versucht, ein Zeichen von der Tastatur zu lesen. Wurde kein
+ Zeichen eingegeben, wird niltext geliefert.
+
+ TEXT PROC incharety (INT CONST time limit)
+ Zweck: Versucht, ein Zeichen vom Bildschirm zu lesen. Dabei wird maximal
+ eine 'time limit' lange Zeit auf das Zeichen gewartet (gemessen in
+ Zehntel-Sekunden).
+
+INCR
+ OP INCR (INT VAR left, INT CONST right)
+ Zweck: Wirkt wie left := left + right
+
+ OP INCR (REAL VAR left, REAL CONST right)
+ Zweck: Wirkt wie left := left + right
+
+initialize random
+ PROC initialize random (INT CONST value)
+ Zweck: Initialisieren der 'random'-Prozedur, um nicht reproduzierbare
+ Zufallszahlen zu bekommen. Diese 'init random'-Prozedur gilt für
+ den "INT-Random Generator".
+
+ PROC initialize random (REAL CONST z)
+ Zweck: Initialisieren der 'random'-Prozedur mit verschiedenen Werten für
+ 'z', um nicht reproduzierbare Zufallszahlen zu bekommen. Diese
+ Prozedur gilt für den "REAL-Random Generator".
+
+insert char
+ PROC insert char (TEXT VAR string, TEXT CONST char, INT CONST insert pos)
+ Zweck: Fügt ein Zeichen 'char' in den Text 'string' an der Position
+ 'insert pos' ein. Für
+
+ insert pos > LENGTH string + 1
+
+ wird keine Aktion vorgenommen. Daher ist es möglich, mit dieser
+ Prozedur auch am Ende eines Textes (Position: LENGTH string + 1)
+ ein Zeichen anzufügen.
+
+int
+ INT PROC int (REAL CONST a)
+ Zweck: Konvertierungsprozedur.
+
+ INT PROC int (TEXT CONST number)
+ Zweck: Umwandlung eines Textes in einen INT-Wert. Der Text 'number' darf
+ ein "+"- oder "-"-Zeichen vor den Ziffern enthalten. Führende
+ Blanks werden überlesen. Enthält 'number' an einer Position ein
+ Zeichen, das nicht umgewandelt werden kann, so wird die Umwand-
+ lung gestoppt und der bis dahin umgewandelte Wert (bzw. der Wert 0)
+ geliefert.
+
+last conversion ok
+ BOOL PROC last conversion ok
+ Zweck: Liefert den Wert TRUE, sofern die letzte Konvertierungsprozedur
+ nicht auf einen Fehler bei der Umwandlung gestoßen ist, andernfalls
+ FALSE.
+
+length
+ INT PROC length (TEXT CONST text)
+ Zweck: Anzahl von Zeichen ("Länge") von 'text' einschließlich Leerzeichen.
+
+LENGTH
+ INT OP LENGTH (TEXT CONST text)
+ Zweck: Anzahl von Zeichen ("Länge") von 'text' einschließlich Leerzeichen.
+
+line
+ PROC line
+ Zweck: Es wird zum Anfang einer neuen Zeile positioniert.
+
+ PROC line (INT CONST number)
+ Zweck: Es werden 'number' Zeilenwechsel vorgenommen.
+
+ln
+ REAL PROC ln (REAL CONST x)
+ Zweck: Natürlicher Logarithmus.
+ Fehlerfall:
+ * ln mit nicht positiver Zahl
+ Nur echt positive Argumente sind zulässig.
+
+log2
+ REAL PROC log2 (REAL CONST z)
+ Zweck: Logarithmus zur Basis 2.
+ Fehlerfall:
+ * log2 mit negativer zahl
+ Nur echt positive Argumente sind zulässig.
+
+log10
+ REAL PROC log10 (REAL CONST x)
+ Zweck: Logarithmus zur Basis 10.
+ Fehlerfall:
+ * log10 mit negativer zahl
+ Nur echt positive Argumente sind zulässig.
+
+max
+ INT PROC max (INT CONST first, second)
+ Zweck: Liefert den Größten der beiden INT-Werte.
+
+ REAL PROC max (REAL CONST first, second)
+ Zweck: Liefert den Größten der beiden REAL-Werte.
+
+maxint
+ INT CONST maxint
+ Zweck: Größter INT-Wert im EUMEL-System (32 767).
+
+maxreal
+ REAL CONST maxreal
+ Zweck: Größter REAL-Wert im EUMEL-System (9.999999999999e126).
+
+max text length
+ INT CONST max text length
+ Zweck: Maximale Anzahl von Zeichen in einem TEXT (32 000).
+
+min
+ INT PROC min (INT CONST first, second)
+ Zweck: Liefert den Kleinsten der beiden INT-Werte. Beispiele:
+
+ min (3.0, 2.0) ==> 2.0
+ min (-2.0, 3.0) ==> -2.0
+
+ REAL PROC min (REAL CONST first, second)
+ Zweck: Liefert den Kleinsten der beiden REAL-Werte.
+
+MOD
+ INT OP MOD (INT CONST left, right)
+ Zweck: Liefert den Rest einer INT-Division. Beispiele:
+
+ 3 MOD 2 ==> 1
+ -3 MOD 2 ==> 1
+
+ Fehlerfall:
+ * DIV by 0
+ Division durch 0 ist verboten.
+
+ REAL OP MOD (REAL CONST left, right)
+ Zweck: Modulo-Funktion für REALs (liefert den Rest). Beispiele:
+
+ 5.0 MOD 2.0 ==> 1.0
+ 4.5 MOD 4.0 ==> 0.5
+
+no
+ BOOL PROC no (TEXT CONST question)
+ Zweck: Wirkt wie
+
+ NOT yes
+
+NOT
+ BOOL OP NOT (BOOL CONST a)
+ Zweck: Logische Negation.
+
+online
+ BOOL PROC online
+ Zweck: Liefert TRUE, wenn die Task mit einem Terminal gekoppelt ist.
+
+OR
+ BOOL OP OR (BOOL CONST a, b)
+ Zweck: Logisches oder.
+
+out
+ PROC out (TEXT CONST text)
+ Zweck: Ausgabe eines Textes auf dem Bildschirm. Im Unterschied zu 'put'
+ wird kein Blank an den ausgegebenen Text angefügt. 'out' kann
+ nicht umgeleitet werden (vergl. 'sysout').
+
+out subtext
+ PROC out subtext (TEXT CONST source, INT CONST from)
+ Zweck: Ausgabe eines Teiltextes von 'source' von der Position 'from' bis
+ Textende. Es wird keine Aktion vorgenommen für
+
+ from > LENGTH source
+
+ PROC out subtext (TEXT CONST source, INT CONST from, to)
+ Zweck: Ausgabe eines Teiltextes von 'source' von der Position 'from' bis
+ zur Position 'to'. Für
+
+ to > LENGTH source
+
+ wird für die fehlenden Zeichen Leerzeichen (blanks) ausgegeben.
+
+page
+ PROC page
+ Zweck: Es wird zum Anfang einer neuen Seite positioniert (hier: linke
+ obere Ecke des Bildschirms, wobei der Bildschirm gelöscht wird).
+
+pause
+ PROC pause (INT CONST time limit)
+ Zweck: Wartet 'time limit' in Zehntel-Sekunden. Bei negativen Werten ist
+ die Wirkung nicht definiert. Die Wartezeit wird nicht nur durch
+ das Erreichen der Grenze abgebrochen, sondern auch durch die
+ Eingabe eines beliebigen Zeichens.
+
+pi
+ REAL CONST pi
+ Zweck: Die Zahl pi (3.141593).
+
+pos
+ INT PROC pos (TEXT CONST source, pattern)
+ Zweck: Liefert die erste Position des ersten Zeichens von 'pattern' in
+ 'source', falls 'pattern' gefunden wird. Wird 'pattern' nicht
+ gefunden oder ist 'pattern' niltext, so wird der Wert '0' ge-
+ liefert. Beispiel:
+
+ TEXT VAR t1 :: "abcdefghijk...xyz",
+ t2 :: "cd";
+ ... pos (t1, t2) ... (* liefert 3 *)
+ ... pos (t2, t1) ... (* liefert 0 *)
+
+ INT PROC pos (TEXT CONST source, pattern, INT CONST from)
+ Zweck: Wie obige Prozedur, jedoch wird erst ab der Position 'from' ab
+ gesucht. Dabei gilt folgende Einschränkung:
+
+ length (pattern) < 255
+
+INT PROC pos (TEXT CONST source, low char, high char, INT CONST from)
+ Zweck: Liefert die Position des ersten Zeichens 'x' in 'source' ab der
+ Position 'from', so daß
+
+ low char <= x <= high char
+
+ 'low char' und 'high char' müssen TEXTe der Länge 1 sein. Wird
+ kein Zeichen in 'source' in dem Bereich zwischen 'low char' und
+ 'high char' gefunden, wird der Wert '0' geliefert. Beispiel:
+
+ (* Suche nach dem ersten Zeichen <> blank nach einer Leerspalte *)
+ TEXT VAR zeile :: "BlaBla Hier gehts weiter";
+ INT VAR pos erstes blank :: pos (zeile, " "),
+ ende leerspalte :: pos (zeile, ""33"", ""254"", pos erstes blank);
+
+put
+ PROC put (INT CONST number)
+ Zweck: Ausgabe eines INT-Wertes auf dem Bildschirm. Anschließend wird
+ ein Leerzeichen ausgegeben. Die Ausgabe kann umgeleitet werden
+ (vergl. 'sysout').
+
+ PROC put (REAL CONST real)
+ Zweck: Ausgabe eines REAL-Wertes auf dem Bildschirm. Anschließend wird
+ ein Leerzeichen ausgegeben. Die Ausgabe kann umgeleitet werden
+ (vergl. 'sysout')
+
+ PROC put (TEXT CONST text)
+ Zweck: Ausgabe eines Textes auf dem Bildschirm. Nach der Ausgabe von
+ 'text' wird ein Blank ausgegeben, um nachfolgenden Ausgaben auf
+ der gleichen Zeile voneinander zu trennen. Hardwareabhängig sind
+ die Aktionen, wenn eine Ausgabe über eine Zeilengrenze (hier:
+ Bildschirmzeile) vorgenommen wird. Meist wird die Ausgabe auf der
+ nächsten Zeile fortgesetzt. Die Ausgabe kann umgeleitet werden
+ (vergl. 'sysout').
+
+putline
+ PROC putline (TEXT CONST text)
+ Zweck: Ausgabe von 'text' auf dem Bildschirm. Nach der Ausgabe wird auf
+ den Anfang der nächsten Zeile positioniert. Gibt man TEXTe nur mit
+ 'putline' aus, so ist gesichert, daß jede Ausgabe auf einer neuen
+ Zeile beginnt. Hardwareabhängig sind die Aktionen, wenn eine Aus-
+ gabe über eine Zeilengrenze (hier: Bildschirmzeile) vorgenommen
+ wird. Meist wird die Ausgabe auf der nächsten Zeile fortgesetzt.
+ Die Ausgabe kann umgeleitet werden (vergl. 'sysout').
+
+random
+ INT PROC random (INT CONST lower bound, upper bound)
+ Zweck: Pseudo-Zufallszahlen-Generator im Intervall 'upper bound' und
+ 'lower bound' einschließlich. Es handelt sich hier um den "INT
+ Random Generator".
+
+ REAL PROC random
+ Zweck: Pseudo-Zufallszahlen-Generator im Intervall 0 und 1. Es handelt
+ sich hier um den "REAL Random Generator".
+
+real
+ REAL PROC real (INT CONST a)
+ Zweck: Konvertierungsprozedur.
+
+ REAL PROC real (TEXT CONST text)
+ Zweck: Konvertierung eines TEXTes 'text' in einen REAL-Wert. Achtung: Zur
+ Zeit werden keine Überprüfungen vorgenommen, d.h. in dem TEXT
+ muß ein REAL-Wert stehen.
+
+replace
+ PROC replace (TEXT VAR destination, INT CONST position, TEXT CONST source)
+ Zweck: Ersetzung eines Teiltextes in 'destination' durch 'source' an der
+ Position 'position' in 'destination'. Es muß gelten
+
+ 1 <= position <= LENGTH destination
+
+ d.h. 'position' muß innerhalb von 'destination' liegen und 'source'
+ muß von der Position 'position' ab in 'destination' einsetzbar
+ sein. Dabei bleibt die Länge von 'destination' unverändert.
+
+round
+ REAL PROC round (REAL CONST real, INT CONST digits)
+ Zweck: Runden eines REAL-Wertes auf 'digits' Stellen. Für positive Werte
+ wird auf Nachkommastellen gerundet. Beispiel:
+
+ round (3.14159, 3)
+
+ liefert '3.142'. Für negative 'digits'-Werte wird auf Vorkomma-
+ stellen gerundet. Beispiel:
+
+ round (123.456, -2)
+
+ liefert '100.0'. Abweichung vom Standard: Es wird mit 'digits'-
+ Ziffern gerundet.
+
+say
+ PROC say (TEXT CONST message)
+ Zweck: Sofern der Kommando-Dialog eingeschaltet ist (vergl. 'command
+ dialogue'), wird der TEXT 'message' an die augenblickliche Cursor-
+ Position geschrieben.
+
+sign
+ INT PROC sign (INT CONST argument)
+ Zweck: Feststellen des Vorzeichens eines INT-Wertes. Folgende Werte
+ werden geliefert:
+
+ argument > 0 ==> 1
+ argument = 0 ==> 0
+ argument < 0 ==> -1
+
+ INT OP SIGN (INT CONST argument)
+ Zweck: Feststellen des Vorzeichens eines INT-Wertes.
+
+ INT PROC sign (REAL CONST number)
+ Zweck: Feststellen des Vorzeichens eines REAL-Wertes.
+
+ INT OP SIGN (REAL CONST number)
+ Zweck: Feststellen des Vorzeichens eines REAL-Wertes.
+
+sin
+ REAL PROC sin (REAL CONST x)
+ Zweck: Sinus-Funktion. 'x' muß in Radiant (Bogenmaß) angegeben werden.
+
+sind
+ REAL PROC sind (REAL CONST x)
+ Zweck: Sinus-Funktion. 'x' muß im Winkelgrad angegeben werden.
+
+smallreal
+ REAL PROC smallreal
+ Zweck: Kleinster darstellbarer REAL-Wert im EUMEL-System für den
+
+ 1.0 - smallreal <> 1.0
+ 1.0 + smallreal <> 1.0
+
+ gilt (1.0E-12).
+
+sqrt
+ REAL PROC sqrt (REAL CONST z)
+ Zweck: Wurzel-Funktion.
+ Fehlerfall:
+ * sqrt von negativer Zahl
+ Das Argument muß größer gleich 0.0 sein.
+
+stop
+ PROC stop
+ Zweck: Abbruch (vergl. Fehlerbehandlung).
+
+SUB
+ TEXT OP SUB (TEXT CONST text, INT CONST pos)
+ Zweck: Liefert ein Zeichen aus 'text' an der Position 'pos'. Entspricht
+
+ subtext (text, pos, pos)
+
+ Anmerkung: Effizienter als obiger Prozedur-Aufruf. Für
+
+ pos <= 0
+ pos > LENGTH text
+
+ wird niltext geliefert.
+
+subtext
+ TEXT PROC subtext (TEXT CONST source, INT CONST from)
+ Zweck: Teiltext von 'source', der bei der Position 'from' anfängt. Die
+ Länge des Resultats ergibt sich also zu
+
+ LENGTH source - from + 1
+
+ d.h. von der Position 'from' bis zum Ende von 'source'. 'from' muß
+ innerhalb von 'source' liegen. Ist from < 1, dann wird 'source'
+ geliefert. Falls from > LENGTH source ist, wird niltext geliefert.
+
+ TEXT PROC subtext (TEXT CONST source, ITT CONST from, to)
+ Zweck: Teiltext von 'source' von der Position 'from' bis einschließlich
+ der Position 'to'. Die Länge des Resultats ist also
+
+ from - to + 1
+
+ Dabei muß gelten
+
+ 1 <= from <= to <= LENGTH source
+
+ d.h. die Positionen 'from' und 'to' müssen in dieser Reihenfolge
+ innerhalb von 'source' liegen. Ist
+
+ to >= LENGTH source
+
+ wird 'subtext (source, from)' ausgeführt. Für die Bedingungen für
+ 'from' siehe vorstehende Beschreibung von 'subtext'.
+
+sysin
+ PROC sysin (TEXT CONST file name)
+ Zweck: Eingabe-Routinen ('get', 'getline' und 'line') lesen nicht mehr
+ vom Benutzer-Terminal, sondern aus der Datei 'file name'.
+
+ TEXT PROC sysin
+ Zweck: Liefert den Namen der eingestellten 'sysin'-Datei. "" bezeichnet
+ das Benutzer-Terminal.
+
+sysout
+ PROC sysout (TEXT CONST file name)
+ Zweck: Ausgabe-Routinen ('put', 'putline', 'write', 'line') gehen nicht
+ mehr zum Benutzer-Terminal, sondern in die Datei 'file name'.
+
+ TEXT PROC sysout
+ Zweck: Liefert den Namen der eingestellten 'sysout'-Datei. "" bezeichnet
+ das Benutzer-Terminal.
+
+tan
+ REAL PROC tan (REAL CONST x)
+ Zweck: Tangens-Funktion. 'x' muß in Radiant angegeben werden.
+
+tand
+ REAL PROC tand (REAL CONST x)
+ Zweck: Tangens-Funktion. 'x' muß in Winkelgrad angegeben werden.
+
+text
+ TEXT PROC text (INT CONST number)
+ Zweck: Umwandlung eines INT-Wertes in einen Text. Negative Werte werden
+ mit einem "-"-Zeichen geliefert.
+
+ TEXT PROC text (INT CONST number, laenge)
+ Zweck: Umwandlung eines INT-Wertes 'number' in einen Text mit der Länge
+ 'laenge'. Für
+
+ LENGTH (text (number)) < laenge
+
+ werden die Ziffern rechtsbündig in einen Text mit der Länge
+ 'laenge' eingetragen. Fehlende Ziffern der gewünschten 'laenge'
+ werden im TEXT vorne mit Leerzeichen aufgefüllt. Für
+
+ LENGTH (text (number)) > laenge
+
+ wird ein Text mit der Länge 'laenge' geliefert, der mit
+ "*"-Zeichen gefüllt ist.
+
+ TEXT PROC text (REAL CONST real)
+ Zweck: Konvertierung eines REAL-Wertes in einen TEXT. Ggf. wird der TEXT
+ in Exponenten-Darstellung geliefert.
+
+ TEXT PROC text (REAL CONST real, laenge)
+ Zweck: Siehe oben. 'laenge' gibt die Anzahl von Zeichen an.
+
+ TEXT PROC text (REAL CONST real, INT CONST laenge, fracs)
+ Zweck: Konvertierung eines REAL-Wertes in einen TEXT. Dabei gibt 'laenge'
+ die Länge des Resultats einschließlich des Dezimalpunktes und
+ 'fracs' die Anzahl der Dezimalstellen an. Kann der REAL-Wert nicht
+ wie gewünscht dargestellt werden, wird
+
+ laenge * "*"
+
+ geliefert.
+
+ TEXT PROC text (TEXT CONST source, INT CONST laenge)
+ Zweck: Teiltext aus 'source' mit der Länge 'laenge', beginnend bei der
+ Position 1 von 'source'. Es muß gelten
+
+ 1 <= laenge <= LENGTH source
+
+ d.h. der gewünschte Teiltext muß aus 'source' ausblendbar sein.
+ Wenn
+
+ laenge > LENGTH source
+
+ die Länge des gewünschten Resultats ist größer als die Länge von
+ 'source' ist, wird der zu liefernde TEXT mit der an 'laenge'
+ fehlenden Zeichen mit Leerzeichen aufgefüllt.
+
+ TEXT PROC text (TEXT CONST source, INT CONST laenge, from)
+ Zweck: Teiltext aus 'source' mit der Länge 'laenge', beginnend an der
+ Position 'from' in dem TEXT 'source'. Entspricht
+
+ text (subtext (source, from, LENGTH source), laenge)
+
+ Es muß
+
+ laenge >= 0
+ 1 <= from <= LENGTH source
+
+ gelten, d.h. 'from' muß eine Position angeben, die innerhalb von
+ 'source' liegt. Für
+
+ laenge > LENGTH source - from + 1
+
+ also wenn die angegebene Länge 'laenge' größer ist als der auszu-
+ blendende Text, wird das Resultat rechts mit Leerzeichen aufge-
+ füllt. Wenn
+
+ laenge < LENGTH source - from + 1
+
+ d.h. wenn die angegebene Länge kleiner ist als der Teiltext von
+ 'from' bis zum letzten Zeichen von 'source', wird das Resultat mit
+ der Länge
+
+ LENGTH source - from + 1
+
+ geliefert.
+
+time
+ TEXT PROC time (REAL CONST time)
+ Zweck: Konvertierungsprozedur für die Zeiten der CPU-Zeituhr. Liefert die
+ Zeiten in der Form 'hh:mm:ss.s'. Vergl. dazu 'clock'.
+
+ TEXT PROC time (REAL CONST value, INT CONST laenge)
+ Zweck: Konvertiert die Zeit in externe Darstellung. Für die 'laenge'-
+ Werte ergibt sich:
+
+ laenge = 10 (* hh:mm:ss.s *)
+ laenge = 12 (* hhh:mm:ss.s *)
+
+REAL PROC time (TEXT CONST time)
+ Zweck: Konvertierungsprozedur für Texte der CPU-Zeituhr in REAL-Werte.
+
+time of day
+ TEXT PROC time of day (REAL CONST time)
+ Zweck: Konvertierungsprozedur für REALs, wie sie die Realzeituhr
+ liefert. Es wird die Tageszeit in der Form 'hh:mm' geliefert.
+ Beispiel:
+
+ put (time of day (clock (1))) (* z.B.: 17:25 *)
+
+
+ TEXT PROC time of day
+ Zweck: Liefert die aktuelle Tageszeit. Entspricht
+
+ time of day (clock (1))
+
+TIMESOUT
+ OP TIMESOUT (INT CONST times, TEXT CONST text)
+ Zweck: Ausgabe eines TEXTes 'text' 'times'mal. An die Ausgabe wird im
+ Gegensatz zu 'put' kein Leerzeichen angefügt. Es wird kein Text
+ ausgegeben für
+
+ times < 1
+
+write
+ PROC write (TEXT CONST text)
+ Zweck: Gibt 'text' ohne Trennblank aus ('put' mit Trennblank). Läßt sich
+ im Gegensatz zu 'out' in eine Datei umleiten (vergl. 'sysout').
+
+XOR
+ BOOL OP XOR (BOOL CONST a, b)
+ Zweck: Exklusives oder.
+
+yes
+ BOOL PROC yes (TEXT CONST question)
+ Zweck: Sofern der Kommando-Dialog (vergl. 'command dialogue') einge-
+ schaltet ist, wird der TEXT 'question' auf dem Bildschirm des
+ Benutzers geschrieben. Der TEXT 'question' wird dabei mit einem
+ Fragezeichen ergänzt. Der Benutzer kann nun am Terminal mit den
+ Zeichen 'j' oder 'n' antworten (oder: 'J', 'N', 'y', 'n', 'Y',
+ 'N'). Nach Eingabe eines dieser Zeichen wird von der Prozedur
+ 'yes' auf eine neue Zeile positioniert. Die Prozedur 'yes' liefert
+ den Wert TRUE bei der Eingabe von 'j' und den Wert FALSE bei der
+ Eingabe von 'n'. Ist der Kommando-Dialog nicht eingeschaltet,
+ liefert die Prozedur 'yes' den Wert TRUE.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil9 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil9
new file mode 100644
index 0000000..318dd06
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil9
@@ -0,0 +1,936 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 9: Standard-Datentypen
+
+1. VECTOR und MATRIX
+
+Vektoren und Matrizen enthalten Elemente vom Datentyp REAL. Für beide Daten-
+typen sind die üblichen Operatoren definiert. Im Unterschied zu "normalen"
+'ROW n REAL' bzw. 'ROW n ROW m REAL' brauchen die Anzahl der Elemente, die
+sich in einem Vektor bzw. in einer Matrix befinden, nicht bereits zur Über-
+setzungszeit deklariert, sondern können "dynamisch" zur Laufzeit eines ELAN-
+Programms festgelegt werden. Somit ist es möglich, eine zur Übersetzungszeit
+noch unbekannte Anzahl von REAL-Elementen zu bearbeiten und dabei nur soviel
+Speicherplatz wie notwendig zu verwenden. Bei beiden Datentypen ist die
+maximale Anzahl von Elementen jeweils 4 000.
+
+Bei VECTOR und MATRIX ist auf die üblichen Rundungsfehler bei der Verwendung
+von REALs zu achten, die bei umfangreicheren Rechnungen unvermeidlich ent-
+stehen. Rundungsfehler durch Ein- bzw. Ausgaberoutinen können z.Zt. im
+EUMEL-System jedoch nicht vorkommen, weil REAL-Werte dezimal im Rechner
+abgespeichert werden (13 Stellen, von denen jedoch nur 7 ausgegeben werden).
+
+
+
+VECTOR
+
+Folgende VECTOR-Operationen stehen zur Verfügung:
+
+vector Erzeugung eines VECTOR-Objekts
+get Eingabe der Elemente vom Terminal
+put Ausgabe der Elemente auf das Terminal
+replace Ersetzung eines Elementes eines VECTORs
+SUB Zugriff auf ein REAL-Element eines VECTORs
+LENGTH Anzahl der Elemente eines VECTORs
+length dito
+NORM Euklidische Norm
+ +
+ -
+ *
+ /
+ :=
+ =
+ <>
+
+
+
+Beschreibung der VECTOR-Operationen
+
+Aus Optimierungsgründen (Heapbelastung) wurde der Datentyp INITVECTOR ge-
+schaffen. Dieser wird im VECTOR-Paket intern gehalten (wird nicht über das
+Interface herausgereicht) und kann somit nicht in einer Deklaration benutzt
+werden. INITVECTOR wird nur für die Operationen
+
+ :=
+ vector
+
+verwendet. Bei Verwendung eines Datenobjekts vom Datentyp INITVECTOR wird
+nicht soviel Speicherplatz wie bei einem Objekt vom Datentyp VECTOR benötigt.
+
+=
+ BOOL OP = (VECTOR CONST a, b)
+ Zweck: Vergleich zweier Vektoren. Der Operator liefert FALSE, wenn die
+ Anzahl der Elemente von 'a' und 'b' ungleich ist oder wenn zwei
+ Elemente mit gleichem Index ungleich sind. Beispiel:
+
+ VECTOR VAR x :: vector (10, 1.0),
+ y :: vector (15, 2.0),
+ z :: vector (10, 1.0);
+ ... x = y ... (* FALSE *)
+ ... x = z ... (* TRUE *)
+
+<>
+ BOOL OP <> (VECTOR CONST a, b)
+ Zweck: Vergleich zweier Vektoren auf Ungleichheit (NOT (a = b)).
+
+:=
+ OP := (VECTOR VAR ziel, VECTOR CONST quelle)
+ Zweck: Zuweisung. Nach der Zuweisung gilt auch
+
+ length (quelle) = length (ziel)
+
+ d.h. der linke Operand besitzt nach der Zuweisung genauso viele
+ Elemente wie 'quelle', unabhängig davon, ob 'ziel' vor der Zu-
+ weisung mehr oder weniger Elemente als 'quelle' besaß. Beispiel:
+
+ VECTOR VAR y :: vector (10, 1.0),
+ z :: vector (15, 2.0);
+ ...
+ y := z; (* length (y) liefert nun 15 ! *)
+
+ OP := (VECTOR VAR ziel, INITVECTOR CONST quelle)
+ Zweck: Dient zur Initialisierung eines VECTORs. Beispiel:
+
+ VECTOR VAR x :: vector (17);
+
+ 'vector' erzeugt ein Objekt vom Datentyp INITVECTOR. Dieses
+ Objekt braucht nicht soviel Speicherplatz wie ein VECTOR-Objekt.
+ Dadurch wird vermieden, daß nach erfolgter Zuweisung nicht ein
+ durch 'vector' erzeugtes Objekt auf dem Heap unnötig Speicher-
+ platz verbraucht.
+
++
+ VECTOR OP + (VECTOR CONST a)
+ Zweck: Monadisches '+' für VECTOR. Keine Auswirkung.
+
+ VECTOR OP + (VECTOR CONST a, b)
+ Zweck: Elementweise Addition der Vektoren 'a' und 'b'. Beispiel:
+
+ VECTOR VAR x, (* 'x' hat undefinierte Laenge *)
+ a :: vector (10, 1.0),
+ b :: vector (10, 2.0);
+ ...
+ x := a + b; (* 'x' hat nun 10 Elemente mit Werten '3.0' *)
+ Fehlerfall:
+ * VECTOR OP + : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+-
+ VECTOR OP - (VECTOR CONST a)
+ Zweck: Monadisches '-'.
+
+ VECTOR OP - (VECTOR CONST a, b)
+ Zweck: Elementweise Subtraktion der Vektoren 'a' und 'b'.
+ Fehlerfall:
+ * VECTOR OP - : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+*
+ REAL OP * (VECTOR CONST a, b)
+ Zweck: Skalarprodukt zweier Vektoren. Liefert die Summe der element-
+ weisen Multiplikation der Vektoren 'a' und 'b'. Beachte even-
+ tuelle Rundungsfehler! Beispiel:
+
+ REAL VAR a;
+ VECTOR VAR b :: vector (10, 2.0),
+ c :: vector (10, 2.0);
+ ...
+ a := b * c; (* 40.0 *)
+ Fehlerfall:
+ * REAL OP * : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+ VECTOR OP * (VECTOR CONST a, REAL CONST s)
+ Zweck: Multiplikation des Vektors 'a' mit dem Skalar 's'.
+
+ VECTOR OP * (REAL CONST s, VECTOR CONST a)
+ Zweck: Multiplikation des Skalars 's' mit dem Vektor 'a'.
+
+/
+ VECTOR OP / (VECTOR CONST a, REAL CONST s)
+ Zweck: Division des Vektors 'a' durch den Skalar 's'. Beispiel:
+
+ VECTOR VAR a, (* 'a' hat undefinierte Laenge *)
+ b :: vector (10, 4.0);
+ ...
+ a := b / 2.0;
+ (* 'a' hat nun 10 Elemente mit Werten '2.0' *)
+
+get
+ PROC get (VECTOR VAR a, INT CONST l)
+ Zweck: Einlesen der Elemente von 'a' vom Terminal, wobei 'l' die Anzahl
+ der Elemente angibt.
+ Fehlerfall:
+ * PROC get : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+length
+ INT PROC length (VECTOR CONST a)
+ Zweck: Liefert die Anzahl der Elemente von 'a'. Beispiel:
+
+ VECTOR VAR a :: vector (10, 1.0),
+ b :: vector (15, 2.0);
+ ...
+ ... length (a) ... (* 10 *)
+ ... length (b) ... (* 15 *)
+
+LENGTH
+ INT OP LENGTH (VECTOR CONST a)
+ Zweck: Liefert die Anzahl der Elemente von 'a'.
+
+NORM
+ REAL OP NORM (VECTOR CONST v)
+ Zweck: Euklidische Norm (Wurzel aus der Summe der Quadrate der Elemente).
+
+put
+ PROC put (VECTOR CONST v)
+ Zweck: Ausgabe der Werte der Elemente von 'v' auf dem Terminal.
+
+replace
+ PROC replace (VECTOR VAR v, INT CONST i, REAL CONST r)
+ Zweck: Zuweisung des i-ten Elementes von 'v' mit dem Wert von 'r'.
+ Beispiel:
+
+ VECTOR VAR v :: ...;
+ ...
+ replace (v, 13, 3.14);
+ (* Das 13. Element von 'v' bekommt den Wert '3.14' *)
+ Fehlerfälle:
+ * PROC replace : subscript overflow
+ Der Index 'i' mit dem Wert 'm' liegt außerhalb des Vektors (i >
+ LENGTH v).
+ * PROC replace : subscript underflow
+ Der Index 'i' mit dem Wert 'm' liegt außerhalb des Vektors
+ (i < 1).
+
+SUB
+ REAL OP SUB (VECTOR CONST v, INT CONST i)
+ Zweck: Liefert das 'i'-te Element von 'v'.
+ Fehlerfälle:
+ * OP SUB : subscript overflow
+ Der Index 'i' mit dem Wert 'm' liegt außerhalb des Vektors (i >
+ LENGTH v).
+ * OP SUB : subscript underflow
+ Der Index 'i' mit dem Wert 'm' liegt außerhalb des Vektors
+ (i < 1).
+
+vector
+ INITVECTOR PROC vector (INT CONST l)
+ Zweck: Erzeugen eines Vektors mit 'l' Elementen. Ein INITVECTOR-Objekt
+ benötigt nicht soviel Speicherplatz wie ein VECTOR-Objekt. Die
+ Elemente werden mit dem Wert '0.0' initialisiert.
+ Fehlerfall:
+ * PROC vector : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+ INITVECTOR PROC vector (INT CONST l, REAL CONST value):
+ Zweck: Erzeugen eines Vektors mit 'l' Elementen. Ein INITVECTOR-Objekt
+ benötigt nicht soviel Speicherplatz wie ein VECTOR-Objekt. Die
+ Elemente werden mit dem Wert 'value' initialisiert. Beispiel:
+
+ VECTOR VAR v := vector (17, 3.14159);
+ (* 'v' hat 17 Elemente mit den Wert '3.14159' *)
+ Fehlerfall:
+ * PROC vector : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+
+
+MATRIX
+
+Folgende Operationen stehen für MATRIX zur Verfügung:
+
+matrix Erzeugung eines MATRIX-Objekts
+idn Erzeugung einer Einheitsmatrix
+put Ausgabe der MATRIX auf dem Terminal
+get Eingabe der Matrix vom Terminal
+replace row Ersetzung einer Zeile
+replace column Ersetzung einer Spalte
+replace element Ersetzung eines Elements
+row Liefert einen VECTOR (Zeile einer MATRIX)
+column Liefert einen VECTOR (Spalte einer MATRIX)
+sub Liefert ein REAL-Elemement
+COLUMNS Anzahl Spalten
+ROWS Anzahl Zeilen
+INV Inverse
+DET Determinante
+TRANSP Transponierte
+transp Transponierte (speicherfreundlich)
+ +
+ -
+ *
+ :=
+ =
+ <>
+
+
+
+Beschreibung der MATRIX-Operationen
+
+Aus Optimierungsgründen (Heapbelastung) wurde der Datentyp INITMATRIX
+geschaffen. Dieser wird im MATRIX-Paket intern gehalten (wird nicht über das
+Interface herausgereicht) und kann somit nicht in einer Deklaration benutzt
+werden. INITMATRIX wird nur für die Operationen
+
+ :=
+ idn
+ matrix
+
+verwendet. Bei Verwendung eines Objekts vom Datentyp INITMATRIX wird nicht
+der Speicherplatz für eine MATRIX benötigt.
+
++
+ MATRIX OP + (MATRIX CONST m)
+ Zweck: Monadisches '+'. Keine Auswirkungen.
+
+ MATRIX OP + (MATRIX CONST l, r)
+ Zweck: Addition zweier Matrizen. Die Anzahl der Reihen und der Spalten
+ muß gleich sein. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 43, 1.0),
+ b :: matrix (3, 43, 2.0),
+ summe;
+ summe := a + b;
+ (* Alle Elemente haben den Wert '3.0' *)
+ Fehlerfälle:
+ * MATRIX OP + : COLUMNS l <> COLUMNS r
+ Die Anzahl der Spalten von 'l' und 'r' sind nicht gleich.
+ * MATRIX OP + : ROWS l <> ROWS r
+ Die Anzahl der Zeilen von 'l' und 'r' sind nicht gleich.
+
+-
+ MATRIX OP - (MATRIX CONST m)
+ Zweck: Monadisches Minus. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4, 10.0)
+ a := - a; (* Alle Elemente haben den Wert '-10.0' *)
+
+ MATRIX OP - (MATRIX CONST l, r)
+ Zweck: Subtraktion zweier Matrizen. Die Anzahl der Reihen und Spalten
+ muß gleich sein.
+ Fehlerfälle:
+ * MATRIX OP - : COLUMNS l <> COLUMNS r
+ Die Anzahl der Spalten von 'l' und 'r' sind nicht gleich.
+ * MATRIX OP - : ROWS l <> ROWS r
+ Die Anzahl der Zeilen von 'l' und 'r' sind nicht gleich.
+
+*
+ MATRIX OP * (REAL CONST r, MATRIX CONST m)
+ Zweck: Multiplikation einer Matrix 'm' mit einem Skalar 'r'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4, 2.0);
+ ...
+ a := 3 * a; (* Alle Elemente haben den Wert '6.0' *)
+
+ MATRIX OP * (MATRIX CONST m, REAL CONST r)
+ Zweck: Multiplikation einer Matrix 'm' mit einem Skalar 'r'.
+
+ MATRIX OP * (MATRIX CONST l, r)
+ Zweck: Multiplikation zweier Matrizen. Die Anzahl der Spalten von 'l'
+ und die Anzahl der Zeilen von 'r' müssen gleich sein. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4, 2.0),
+ b :: matrix (4, 2, 3.0),
+ produkt;
+ produkt := a * b;
+ (* Alle Elemente haben den Wert '24.0' *)
+ Fehlerfall:
+ * MATRIX OP * : COLUMNS l <> ROWS r
+ Die Anzahl der Spalten von 'l' muß mit der Anzahl der Zeilen
+ von 'r' übereinstimmen.
+
+ VECTOR OP * (VECTOR CONST v, MATRIX CONST m)
+ Zweck: Multiplikation des Vektors 'v' mit der Matrix 'm'.
+ Fehlerfall:
+ * VECTOR OP * : LENGTH v <> ROWS m
+ Die Anzahl der Elemente von 'v' stimmt nicht mit den Anzahl der
+ Zeilen von 'm' überein.
+
+ VECTOR OP * (MATRIX CONST m, VECTOR CONST v)
+ Zweck: Multiplikation der Matrix 'm' mit dem Vektor 'v'.
+ Fehlerfall:
+ * VECTOR OP * : COLUMNS m <> LENGTH v
+ Die Anzahl der Spalten von 'm' stimmt nicht mit der Anzahl der
+ Elementen von 'v' überein.
+
+=
+ BOOL OP = (MATRIX CONST l, r)
+ Zweck: Vergleich zweier Matrizen. Der Operator '=' liefert FALSE, wenn
+ die Anzahl Spalten oder Reihen der Matrizen 'l' und 'r' ungleich
+ ist und wenn mindestens ein Element mit gleichen Indizes der zwei
+ Matrizen ungleiche Werte haben. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 3),
+ b :: matrix (3, 3, 1.0),
+ c :: matrix (4, 4);
+ ... a = b ...
+ (* FALSE wegen ungleicher Werte *)
+ ... a = c ...
+ (* FALSE wegen ungleicher Groesse *)
+ ... b = c ...
+ (* FALSE wegen ungleicher Groesse *)
+
+<>
+ BOOL OP <> (MATRIX CONST l, r)
+ Zweck: Vergleich der Matrizen 'l' und 'r' auf Ungleichheit.
+
+:=
+ OP := (MATRIX VAR l, MATRIX CONST r)
+ Zweck: Zuweisung von 'r' auf 'l'. Die MATRIX 'l' bekommt u.U. eine neue
+ Anzahl von Elementen. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4, 0.0),
+ b :: matrix (5, 5, 3.0);
+ ...
+ a := b; (* 'a' hat jetzt 5 x 5 Elemente *)
+
+ OP := (MATRIX VAR l, INITMATRIX CONST r)
+ Zweck: Dient zur Initialisierung einer Matrix. Beispiel:
+
+ MATRIX VAR x :: matrix (17, 4);
+
+ 'matrix' erzeugt ein Objekt vom Datentyp INITMATRIX. Dieses
+ Objekt braucht nicht soviel Speicherplatz wie ein MATRIX-Objekt.
+ Dadurch wird vermieden, daß nach erfolgter Zuweisung nicht ein
+ durch 'matrix' erzeugtes Objekt auf dem Heap unnötig Speicher-
+ platz verbraucht.
+
+column
+ VECTOR PROC column (MATRIX CONST m, INT CONST i)
+ Zweck: Die 'i'-te Spalte von 'm' wird als VECTOR mit 'ROWS m' Elementen
+ geliefert. Beispiel:
+
+ MATRIX CONST a :: matrix (3, 4);
+ VECTOR VAR b :: column (a, 1);
+ (* 'b' hat drei Elemente mit den Werten '0.0' *)
+ Fehlerfälle:
+ * PROC column : subscript overflow
+ Der Index 'i' liegt außerhalb der Matrix 'm' (i > COLUMNS m).
+ * PROC column : subscript underflow
+ Der Index 'i' liegt außerhalb der Matrix 'm' (i < 1).
+
+COLUMNS
+ INT OP COLUMNS (MATRIX CONST m)
+ Zweck: Liefert die Anzahl der Spalten von 'm'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4),
+ b :: matrix (7, 10);
+ put (COLUMNS a); (* 4 *)
+ put (COLUMNS b); (* 10 *)
+
+DET
+ REAL OP DET (MATRIX CONST m)
+ Zweck: Es wird der Wert der Determinanten von 'm' geliefert.
+ Fehlerfall:
+ * OP DET : no square matrix
+ Die Matrix ist nicht quadratisch, d.h. ROWS m <> COLUMNS m
+
+get
+ PROC get (MATRIX VAR m, INT CONST rows, columns)
+ Zweck: Einlesen von Werten für die Matrix 'm' vom Terminal mit 'rows'-
+ Zeilen und 'columns'-Spalten.
+
+idn
+ INITMATRIX PROC idn (INT CONST size)
+ Zweck: Erzeugen einer Einheitsmatrix vom Datentyp INITMATRIX. Beispiel:
+
+ MATRIX VAR a :: idn (10);
+ (* Erzeugt eine Matrix mit 10 x 10 Elementen,
+ deren Werte '0.0' sind, mit der Ausnahme der
+ Diagonalelemente, die den Wert '1.0' haben. *)
+ Fehlerfall:
+ * PROC idn : size <= 0
+ Die angeforderte 'size' Anzahl Spalten oder Zeilen muß > 0 sein.
+
+INV
+ MATRIX OP INV (MATRIX CONST m)
+ Zweck: Liefert als Ergebnis die Inverse von 'm' (Achtung: starke Run-
+ dungsfehler möglich).
+ Fehlerfälle:
+ * OP INV : no square matrix
+ Die Matrix 'm' ist nicht quadratisch, d.h. ROWS m <> COLUMNS m
+ * OP INV : singular matrix
+ Die Matrix ist singulär.
+
+matrix
+ INITMATRIX PROC matrix (INT CONST rows, columns)
+ Zweck: Erzeugen eines Datenobjekts vom Datentyp INITMATRIX mit 'rows'
+ Zeilen und 'columns' Spalten. Alle Elemente werden mit dem Wert
+ '0.0' initialisiert. Beispiel:
+
+ MATRIX CONST :: matrix (3, 3);
+ Fehlerfälle:
+ * PROC matrix : rows <= 0
+ Die angeforderte Zeilenanzahl 'rows' muß > 0 sein.
+ * PROC matrix : columns <= 0
+ Die angeforderte Spaltenanzahl 'columns' muß > 0 sein.
+
+ INITMATRIX PROC matrix (INT CONST rows, columns, REAL CONST value)
+ Zweck: Erzeugen eines Datenobjekts vom Datentyp MATRIX mit 'rows'
+ Zeilen und 'columns' Spalten. Alle Elemente der erzeugten MATRIX
+ werden mit dem Wert 'value' initialisiert. Beispiel:
+
+ MATRIX CONST :: matrix (3, 3, 3.14);
+ Fehlerfälle:
+ * PROC matrix : rows <= 0
+ Die angeforderte Zeilenanzahl 'rows' muß > 0 sein.
+ * PROC matrix : columns <= 0
+ Die angeforderte Spaltenanzahl 'columns' muß > 0 sein.
+
+put
+ PROC put (MATRIX CONST m)
+ Zweck: Ausgabe der Werte einer Matrix auf dem Terminal.
+
+replace column
+ PROC replace column (MATRIX VAR m, INT CONST column index,
+ VECTOR CONST column value)
+ Zweck: Ersetzung der durch 'column index' definierten Spalte in der
+ MATRIX 'm' durch den VECTOR 'column value'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 5, 1.0);
+ VECTOR VAR b :: vector (3, 2.0);
+ ...
+ replace column (a, 2, b);
+ (* Die zweite Spalte von 'a' wird durch die Werte von 'b'
+ ersetzt *)
+ Fehlerfälle:
+ * PROC replace column : LENGTH columnvalue <> ROWS m
+ Die Anzahl der Zeilen der MATRIX 'm' stimmt nicht mit der Anzahl
+ der Elemente von 'columnvalue' überein.
+ * PROC replace column : column subscript overflow
+ Der Index 'columnindex' liegt außerhalb von 'm'
+ (columnindex > COLUMNS m).
+ * PROC sub : column subscript underflow
+ Der Index 'columnindex' liegt außerhalb von 'm'
+ (columnindex < 1).
+
+replace element
+ PROC replace element (MATRIX VAR m , INT CONST row, column,
+ REAL CONST value)
+ Zweck: Ersetzung eines Elementes von 'm' in der 'row'-ten Zeile und
+ 'column'-ten Spalte durch den Wert 'value'. Beispiel:
+
+ MATRIX VAR a :: matrix (5, 5);
+ ...
+ replace element (1, 1, 3.14159);
+ Fehlerfälle:
+ * PROC replace element : row subscript overflow
+ Der Index 'row' liegt außerhalb von 'm' (row > ROWS m).
+ * PROC replace element : row subscript underflow
+ Der Index 'row' liegt außerhalb von 'm' (row < 1).
+ * PROC replace element : column subscript overflow
+ Der Index 'column' liegt außerhalb von 'm' (column > COLUMNS m).
+ * PROC replace element : row subscript underflow
+ Der Index 'column' liegt außerhalb von 'm' (column < 1).
+
+replace row
+ PROC replace row (MATRIX VAR m, INT CONST rowindex,
+ VECTOR CONST rowvalue)
+ Zweck: Ersetzung der Reihe 'rowindex' in der MATRIX 'm' durch den
+ VECTOR 'rowvalue'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 5, 1.0);
+ VECTOR VAR b :: vector (5, 2.0);
+ ...
+ replace row (a, 2, b);
+ (* Die 2. Reihe von 'a' wird durch Werte von 'b' ersetzt *)
+ Fehlerfälle:
+ * PROC replace row : LENGTH rowvalue <> COLUMNS m
+ Die Anzahl der Spalten der MATRIX 'm' stimmt nicht mit der Anzahl
+ der Elemente von 'rowvalue' überein.
+ * PROC replace row : row subscript overflow
+ Der Index 'rowindex' liegt außerhalb von 'm' (rowindex > ROWS m).
+ * PROC sub : row subscript underflow
+ Der Index 'rowindex' liegt außerhalb von 'm' (rowindex < 1).
+
+row
+ VECTOR PROC row (MATRIX CONST m, INT CONST i)
+ Zweck: Die 'i'-te Reihe von 'm' wird als VECTOR mit 'COLUMNS m'
+ Elementen geliefert. Beispiel:
+
+ MATRIX CONST a :: matrix (3, 4);
+ VECTOR VAR b :: row (a, 1);
+ (* 'b' hat vier Elemente mit den Werten '0.0'*)
+ Fehlerfälle:
+ * PROC row : subscript overflow
+ Der Index 'i' liegt außerhalb der Matrix 'm' (i > ROWS m).
+ * PROC row : subscript underflow
+ Der Index 'i' liegt außerhalb der Matrix 'm' (i < 1).
+
+ROWS
+ INT OP ROWS (MATRIX CONST m)
+ Zweck: Liefert die Anzahl der Zeilen von 'm'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4),
+ b :: matrix (7, 10);
+ ...
+ put (ROWS a); (* 3 *)
+ put (ROWS b); (* 7 *)
+
+sub
+ REAL PROC sub (MATRIX CONST m, INT CONST row, column)
+ Zweck: Liefert den Wert eines Elementes von 'm', welches durch die
+ Indizes 'row' und 'column' bestimmt wird. Beispiel:
+
+ MATRIX VAR m :: matrix (5, 10, 1.0);
+ put (sub (m, 3, 7));
+ Fehlerfälle:
+ * PROC sub : row subscript overflow
+ Der Index 'row' liegt außerhalb von 'm' (row > ROWS m).
+ * PROC sub : row subscript underflow
+ Der Index 'row' liegt außerhalb von 'm' (row < 1).
+ * PROC sub : column subscript overflow
+ Der Index 'column' liegt außerhalb von 'm' (column > ROWS m).
+ * PROC sub : row subscript underflow
+ Der Index 'column' liegt außerhalb von 'm' (column < 1).
+
+TRANSP
+ MATRIX OP TRANSP (MATRIX CONST m)
+ Zweck: Liefert als Ergebnis die transponierte Matrix 'm'.
+
+transp
+ PROC transp (MATRIX VAR m)
+ Zweck: Transponieren der Matrix 'm', wobei kaum zusätzlicher Speicher-
+ platz benötigt wird.
+
+
+
+2. COMPLEX
+
+Das COMPLEX-Paket ist im ausgelieferten Standard-System noch nicht vorüber-
+setzt, sondern wird im Quellcode ausgeliefert und kann so bei Bedarf von
+jeder EUMEL-Installation in die implementationsabhängigen Standard-Pakete
+aufgenommen werden.
+
+Folgende Operationen stehen für COMPLEX zur Verfügung:
+
+put Ausgabe auf dem Terminal
+get Eingabe auf dem Terminal
+complex zero Denotierungsprozedur
+complex one dito
+complex i dito
+complex dito
+real part Realteil eines komplexen Werts
+imag part Imaginärteil eines komplexen Werts
+phi Winkel in der Polardarstellung (Radiant)
+dphi dito, in Winkelgrad
+CONJ Konjugiert komplexer Wert
+sqrt Wurzelfunktion
+ +
+ -
+ *
+ /
+ :=
+ =
+ <>
+
+
+
+Beschreibung der COMPLEX-Operationen
+
+=
+ BOOL OP = (COMPLEX CONST a, b)
+ Zweck: Vergleich von 'a' und 'b' auf Gleichheit.
+
+:=
+ OP := (COMPLEX VAR a, COMPLEX CONST b)
+ Zweck: Zuweisung.
+
+<>
+ BOOL OP <> (COMPLEX CONST a, b)
+ Zweck: Vergleich von 'a' und 'b' auf Ungleichheit.
+
++
+ COMPLEX OP + (COMPLEX CONST a, b)
+ Zweck: Summe von 'a' und 'b'.
+
+-
+ COMPLEX OP - (COMPLEX CONST a, b)
+ Zweck: Differenz von 'a' und 'b'.
+
+*
+ COMPLEX OP * (COMPLEX CONST a, b)
+ Zweck: Multiplikation von 'a' mit 'b'.
+
+/
+ COMPLEX OP / (COMPLEX CONST a, b)
+ Zweck: Division von 'a' mit 'b'.
+
+ABS
+ REAL OP ABS (COMPLEX CONST x)
+ Zweck: REAL-Betrag von 'x'.
+
+complex
+ COMPLEX PROC complex (REAL CONST re, im)
+ Zweck: Denotierungsprozedur. Angabe in kartesischen Koordinaten.
+
+complex i
+ COMPLEX PROC complex i
+ Zweck: Denotierungsprozedur für den komplexen Wert '0.0 + i 1.0'.
+
+complex one
+ COMPLEX PROC complex one
+ Zweck: Denotierungsprozedur für den komplexen Wert '1.0 + i 0.0'.
+
+complex zero
+ COMPLEX PROC complex zero
+ Zweck: Denotierungsprozedur für den komplexen Wert '0.0 + i 0.0'.
+
+CONJ
+ COMPLEX OP CONJ (COMPLEX CONST number)
+ Zweck: Liefert den konjugiert komplexen Wert von 'number'.
+
+dphi
+ REAL PROC dphi (COMPLEX CONST x)
+ Zweck: Winkel von 'x' (Polardarstellung).
+
+get
+ PROC get (COMPLEX VAR a)
+ Zweck: Einlesen eines komplexen Wertes vom Bildschirm in der Form
+ zweier REAL-Denoter. Die Eingabe kann editiert werden.
+
+imag part
+ REAL PROC imag part (COMPLEX CONST number)
+ Zweck: Liefert den Imaginärteil des komplexen Wertes 'number'.
+
+phi
+ REAL PROC phi (COMPLEX CONST x)
+ Zweck: Winkel von 'x' (Polardarstellung) in Radiant.
+
+put
+ PROC put (COMPLEX CONST a)
+ Zweck: Ausgabe eines komplexen Wertes auf dem Bildschirm in Form zweier
+ REAL-Werte. Hinter jedem REAL-Wert wird ein Leerzeichen angefügt.
+
+real part
+ REAL PROC real part (COMPLEX CONST number)
+ Zweck: Liefert den Real-Teil des komplexen Wertes 'number'.
+
+sqrt
+ COMPLEX PROC sqrt (COMPLEX CONST x)
+ Zweck: Wurzelfunktion für komplexe Werte.
+
+
+
+3. LONGINT
+
+LONGINT ist ein Datentyp, für den (fast) alle Prozeduren und Operatoren des
+Datentyps INT implementiert wurden. LONGINT unterscheidet sich von INT
+dadurch, daß erheblich größere Werte darstellbar sind.
+
+Für den Datentyp LONGINT stehen folgende Operationen zur Verfügung:
+
+get Eingabe vom Terminal
+put Ausgabe vom Terminal
+ABS, abs Absolutbetrag
+INCR, DECR Addition und Zuweisung bzw. Subtraktion und Zuweisung
+DIV Division ohne Rest
+int, text Konvertierungen
+longint dito
+max, min Maximum bzw. Minimum zweier LONGINTs
+MOD Modulo-Funktion
+random Zufallszahlen
+sign Vorzeichen
+ <
+ >
+ <=
+ <>
+ =
+ -
+ +
+ *
+ **
+
+
+
+Beschreibung der LONGINT-Operationen
+
+<
+ BOOL OP < (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf kleiner.
+
+>
+ BOOL OP > (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf größer.
+
+<=
+ BOOL OP <= (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf kleiner gleich.
+
+>=
+ BOOL OP >= (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf größer gleich.
+
+<>
+ BOOL OP <> (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf Ungleichheit.
+
+=
+ BOOL OP = (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf Gleichheit.
+
+-
+ LONGINT OP - (LONGINT CONST argument)
+ Zweck: Vorzeichenumkehrung.
+
+ LONGINT OP - (LONGINT CONST left, right)
+ Zweck: Subtraktion zweier LONGINTs.
+
++
+ LONGINT OP + (LONGINT CONST argument)
+ Zweck: Monadischer Operator. Ohne Wirkung.
+
+ LONGINT OP + (LONGINT CONST left, right)
+ Zweck: Addition zweier LONGINTs.
+
+*
+ LONGINT OP * (LONGINT CONST left, right)
+ Zweck: Multiplikation von zwei LONGINTs.
+
+**
+ LONGINT OP ** (LONGINT CONST argument, exponent)
+ Zweck: Exponentiation zweier LONGINTs mit positivem Exponenten.
+ Fehlerfälle :
+ * LONGINT OP ** : negative exponent
+ Der 'exponent' muß >= 0 sein.
+ * 0 ** 0 is not defined
+ 'argument' und 'exponent' dürfen nicht gleich 0 sein.
+
+
+ LONGINT OP ** (LONGINT CONST argument, INT CONST exponent)
+ Zweck: Exponentiation eines LONGINT mit positiven INT Exponenten.
+ Fehlerfälle :
+ * LONGINT OP ** : negative exponent
+ Der 'exponent' muß >= 0 sein.
+ * 0 ** 0 is not defined
+ 'argument' und 'exponent' dürfen nicht gleich 0 sein.
+
+ABS
+ LONGINT OP ABS (LONGINT CONST argument)
+ Zweck: Absolutbetrag eines LONGINT.
+
+abs
+ LONGINT PROC abs (LONGINT CONST argument)
+ Zweck: Absolutbetrag eines LONGINT.
+
+DECR
+ OP DECR (LONGINT VAR resultat, LONGINT CONST ab)
+ Zweck: resultat := resultat - ab
+
+DIV
+ LONGINT OP DIV (LONGINT CONST left, right)
+ Zweck: Division zweier LONGINTs.
+ Fehlerfall :
+ * divide by zero
+ 'right' muß <> 0 sein.
+
+get
+ PROC get (LONGINT VAR zahl)
+ Zweck: Eingabe eines LONGINTs vom Terminal.
+
+ PROC get (FILE VAR file, LONGINT VAR zahl)
+ Zweck: Einlesen von 'zahl' aus der sequentiellen Datei 'file'. Die
+ Datei muß mit 'input' assoziiert sein (vergl. 'sequential file').
+ Fehlerfälle :
+ * file not open
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+ * input after end of file
+ Es wurde versucht, über die letzte Zeile einer Datei zu lesen.
+ * input access to output file
+ Es wurde versucht, von einem mit 'output' assoziierten FILE zu
+ lesen.
+
+INCR
+ LONGINT OP INCR (LONGINT VAR resultat, LONGINT CONST dazu)
+ Zweck: resultat := resultat + dazu
+
+int
+ INT PROC int (LONGINT CONST longint)
+ Zweck: Konvertierung von LONGINT nach INT.
+ Fehlerfall :
+ * integer overflow
+ 'longint' ist größer als 'maxint'.
+
+longint
+ LONGINT PROC longint (INT CONST int)
+ Zweck: Konvertierung von 'int' nach LONGINT.
+
+ LONGINT PROC longint (TEXT CONST text)
+ Zweck: Konvertierung von 'text' nach LONGINT.
+
+max
+ LONGINT PROC max (LONGINT CONST left, right)
+ Zweck: Liefert das Maximum zweier LONGINTs.
+
+min
+ LONGINT PROC min (LONGINT CONST left, right)
+ Zweck: Liefert das Minimum zweier LONGINTs.
+
+MOD
+ LONGINT OP MOD (LONGINT CONST left, right)
+ Zweck: Modulo-Funktion für LONGINTs. Der Rest einer LONGINT-Division
+ wird ermittelt.
+ Fehlerfall :
+ * text (left) + 'MOD 0'
+ 'right' muß ungleich null sein.
+
+put
+ PROC put (LONGINT CONST longint)
+ Zweck: Ausgabe eines LONGINTs auf dem Bildschirm. Anschließend wird
+ ein Leerzeichen ausgegeben. Hardwareabhängig sind die Aktionen,
+ wenn eine Ausgabe über die Bildschirmzeilengrenze vorgenommen
+ wird. Meist wird jedoch die Ausgabe auf der nächsten Zeile fort-
+ gesetzt.
+
+ PROC put (FILE VAR file, LONGINT CONST zahl)
+ Zweck: Ausgabe von 'zahl' in die sequentielle Datei 'file'. 'file' muß
+ mit 'output' assoziiert sein.
+ Fehlerfälle :
+ * file not open
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+ * output access to input file
+ Es wurde versucht, auf einem mit 'input' assoziierten FILE zu
+ schreiben.
+
+random
+ LONGINT PROC random (LONGINT CONST lower bound, upper bound)
+ Zweck: Pseudo-Zufallszahlen-Generator im Intervall 'lower bound' und
+ 'upper bound' einschließlich. Es handelt sich hier um den
+ 'LONGINT Random Generator'.
+
+SIGN
+ INT OP SIGN (LONGINT CONST longint)
+ Zweck: Feststellen des Vorzeichens von 'longint'. Liefert:
+
+ 0 wenn 'longint' = 0,
+ 1 wenn 'longint' > 0,
+ -1 wenn 'longint' < 0.
+
+sign
+ INT PROC sign (LONGINT CONST longint)
+ Zweck: Feststellen des Vorzeichens von 'longint'. Liefert:
+
+ 0 wenn 'longitt' = 0,
+ 1 wenn 'longint' > 0,
+ -1 wenn 'longint' < 0.
+
+text
+ TEXT PROC text (LONGINT CONST longint)
+ Zweck: Konvertierung von 'longint' nach TEXT.
+
+ TEXT PROC text (LONGINT CONST longint, INT CONST laenge)
+ Zweck: Konvertierung von 'longint' nach TEXT. Die Anzahl der Zeichen
+ soll 'laenge' betragen. Für
+
+ LENGTH (text (longint)) < laenge
+
+ werden die Zeichen rechtsbündig in einen Text mit der Länge
+ 'laenge' eingetragen. Ist der daraus entstehende TEXT kleiner
+ als 'laenge', werden die an 'laenge' fehlenden Zeichen im TEXT
+ mit Leerzeichen aufgefüllt. Für
+
+ LENGTH (text (longint)) > length
+
+ wird ein Text mit der Länge 'length' geliefert, der mit
+ '*'-Zeichen gefüllt ist.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/source-disk b/doc/user-manual/1.7.3-pd/doc/source-disk
new file mode 100644
index 0000000..f769920
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/source-disk
@@ -0,0 +1 @@
+173_publicdomain/03_benutzerhandbuch.img
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.1 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.1
new file mode 100644
index 0000000..7c8fec7
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.1
@@ -0,0 +1,580 @@
+____________________________________________________________________________
+
+
+#on("b")##on ("u")#
+#center#Betriebssystem E U M E L
+#off ("u")#
+
+
+#center#Benutzerhandbuch
+
+
+
+
+#off("b")#
+#center#Lizenzfreie Software der
+#on ("b")#
+
+#center#Gesellschaft für Mathematik und Datenverarbeitung mbH,
+#center#5205 Sankt Augustin
+
+
+#off("b")#
+#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für
+#center#nichtkommerzielle Zwecke gestattet.
+
+#center#Gewährleistung und Haftung werden ausgeschlossen
+
+
+____________________________________________________________________________
+#page#
+
+#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 1: Einleitung
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+1 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 1 - %
+#tableend##clearpos#
+#end#
+TEIL 1: Einleitung
+#free(1.0)#
+
+1.1. Vorwort
+#free(1.0)#
+
+Dieses Buch bietet Ihnen eine Anleitung zur Handhabung des Betriebssystems
+EUMEL in Hinblick auf die Textverarbeitung. Das Buch wendet sich somit an alle, die
+das leicht erlernbare EUMEL-System zur Erstellung von Texten jeglicher Art und
+jeden Umfangs nutzen wollen.
+
+Die Anleitung erfordert keinerlei Vorkenntnisse, weder von Computern im allgemei­
+nen noch von EUMEL im besonderen. Neulingen auf dem Gebiet der Benutzung eines
+Computers sei empfohlen, dieses erste Kapitel, das sich kurz mit der 'grauen Theorie'
+beschäftigt, mindestens zweimal zu lesen:
+
+- Der erste Durchgang sollte nur einer groben Orientierung dienen. Die Begriffe, die
+ teilweise erst im routinierteren Umgang Sinn gewinnen, sollten Sie 'mal gehört'
+ haben, um die folgenden Kapitel leichter lesen zu können.
+
+- Der zweite Durchgang erscheint uns sinnvoll, wenn Sie sich 'freigeschwommen'
+ haben. Wenn der Umgang mit dem EUMEL-System Ihnen nach einigen Tagen
+ schon vertrauter erscheint, ist es zweckmäßig, sich auf dem Hintergrund der
+ gemachten Erfahrungen die Erklärungen noch einmal durchzulesen. Einige der
+ Begriffe werden erst dann wirklich verständlich und manche Unsicherheit wird
+ beseitigt werden.
+
+Die weiteren Teile des Buches geben dann Anleitung vom ersten Einstieg ins
+EUMEL-System bis hin zur detaillierten Beschreibung der Textverarbeitung. Alle in
+Teil 3 und 4 enthaltenen Beispiele sollten Sie sorgfältig durchgehen und am Bild­
+schirm nachvollziehen. Aus dem Teil 5 können Sie nach eigener Einschätzung zu­
+nächst die Bereiche auswählen, die Sie selbst für besonders wichtig halten. Sie wer­
+den feststellen, daß Sie durch den Umgang mit der EUMEL-Textverarbeitung mit
+fortschreitender Routine immer mehr der gebotenen Möglichkeiten hinzunehmen
+werden.
+#free(1.0)#
+Was ist ein Betriebssystem ?
+
+Ein #ib#Betriebssystem#ie# ist eine Sammlung von Programmen, die dem Benutzer eines
+Computers die Arbeit mit diesem Gerät erst ermöglichen. Die Programme des Be­
+triebssystems stellen die Verbindung zwischen den Bausteinen eines Computers, der
+Hardware, und den Anwendungsprogrammen eines Benutzers her.
+
+Alle Programme, die diese riesige Lücke schließen und z.B. dafür sorgen, daß der
+Befehl: #on("i")#drucke ("diesen brief")#off("i")# tatsächlich dazu führt, daß der eben noch am Bild­
+schirm verfaßte Brief zum Drucker gesendet und dort ausgedruckt wird, sind soge­
+nannte Systemprogramme, Teile des Betriebssystems.
+
+Dieses Benutzerhandbuch zum Betriebssystem EUMEL wird Ihnen schrittweise die
+Befehle erklären, die Sie zur Nutzung aller Möglichkeiten der Textverarbeitung mit
+EUMEL verwenden können, und Ihnen somit einen Teil des Betriebssystems vorstel­
+len.
+#free(1.0)#
+Ist EUMEL anders als andere ?
+
+#on("b")#Ja.#off("b")# Das Betriebssystem EUMEL (#on("b")#E#off("b")#xtendable multi #on("b")#U#off("b")#ser #on("b")#M#off("b")#icroprocessor #on("b")#EL#off("b")#an Sy­
+stem) erklärt durch seinen voll ausgeschriebenen Namen einen wesentlichen Unter­
+schied zu anderen Systemen: "Erweiterbares Mehrbenutzer Mikroprozessor ELAN-
+System."
+
+Während andere auf Mikroprozessoren (und damit auf sogenannte Personal Compu­
+ter) abgestimmte Betriebssysteme #on("u")#einen#off("u")# Benutzer bei seiner Arbeit unterstützen, ist
+EUMEL fähig, #on("u")#mehreren#off("u")# Anwendern gleichzeitig die Benutzung eines Computers zu
+ermöglichen. Natürlich funktioniert EUMEL ebensogut für einen einzigen Benutzer. Es
+gibt aber bei EUMEL die Möglichkeit, durch Ankoppeln weiterer Bildschirme an den
+Rechner und #on("b")#ohne#off("b")# Kosten für zusätzliche Software mehreren Benutzern gleichzeitig
+die Arbeit an diesem Rechner zu ermöglichen.
+
+Zweitens ist EUMEL hardwareunabhängig, das heißt, gleichgültig von welchem Her­
+steller Ihr Computer stammt, die Bedienung und die Kommandosprache ist immer
+gleich. Auch können Disketten, die mit einem XY-Rechner beschrieben wurden, von
+einem ABC-Computer gelesen werden; durchaus keine Selbstverständlichkeit.
+
+Eine weitere Besonderheit des EUMEL-Systems macht alle froh, die damit arbeiten:
+EUMEL ist durchgängig in der Programmiersprache ELAN gehalten. Auch wenn Sie
+(noch) nicht programmieren möchten, erleichtert Ihnen ELAN das Leben dadurch, daß
+Sie schreiben können, was Sie meinen: eine Datei, die einen Geschäftsbrief fix und
+fertig und druckbereit enthält, heißt nicht etwa:
+
+ $TXT.PRT
+
+sondern:
+
+ Angebot an Fa.Müller 1.7.86
+
+
+Ein weiterer wichtiger Unterschied wird Ihnen bewußt werden, wenn Sie ein anderes
+Betriebssystem kennen: Die EUMEL-Textverarbeitung ist kein zusätzliches Programm
+mit eigener Kommandosprache, welches bei Bedarf geladen werden muß, sondern
+steht jederzeit, im wahrsten Sinne des Wortes auf Knopfdruck, zu Ihrer Verfügung.
+#free(1.5)#
+1.2. Wichtige Begriffe
+#free(1.0)#
+- #on("b")#TASK#off("b")#. Eine #ib#Task#ie# ist ein eigenständiger Prozeß innerhalb eines EUMEL-Systems,
+ der entweder zur Verwaltung des EUMEL-Systems oder zu einem Benutzer
+ gehört. Indem jedem Benutzer ein eigener Arbeitsbereich zugewiesen ist, wird
+ verhindert, daß unkontrolliert auf fremde Daten zugegriffen wird. Eine Task hat
+ einen Namen, mit dem sie angesprochen werden kann. Ein EUMEL-System
+ besteht aus mehreren Tasks.
+
+ Ein brauchbarer Vergleich mit einem EUMEL-Tasksystem ist ein Firmengebäude:
+ Es besteht aus vielen Räumen und jeder Raum ( = Task ) ist entweder ein nor­
+ males Arbeitszimmer oder ein Chefzimmer oder eine Werkstatt, in der Dienst­
+ leistungen für andere erledigt werden.
+
+ Eine solche Ordnung zeigt folgendes Tasksystem; der #on("i")#kursiv#off("i")# gesetzte Kommentar
+ zeigt die Benennung der 'Dienstposten' eines vergleichbaren Büros:
+
+
+ SUPERVISOR #on("i")#(* Zimmerverwalter *)#off("i")# -
+ -
+
+ SYSUR #on("i")#(* Werkstattmeister *)#off("i")#
+
+
+ ARCHIVE #on("i")#(* Archivar *)#off("i")#
+
+ configurator #on("i")#(* Elektriker *)#off("i")#
+
+ OPERATOR #on("i")#(* Hausmeister *)#off("i")#
+
+ shutup #on("i")#(* Nachtwächter *)#off("i")#
+
+ UR #on("i")#(* Aufsichtsrat *)#off("i")#
+
+ PUBLIC #on("i")#(* Abteilungsleiter *)#off("i")#
+
+ Meier #on("i")#(* Angestellter *)#off("i")#
+ Müller #on("i")#(* " *)#off("i")#
+ Schulze #on("i")#(* " *)#off("i")#
+
+
+ Bildlich gesprochen stellt eine Task also ein 'Arbeitszimmer' für einen EUMEL-
+ Benutzer dar. Als EUMEL Anwender richten Sie sich Ihre Task selbst ein, indem
+ Sie das Kommando 'begin ("taskname")' geben.
+
+ Nachdem Sie dieses Kommando einmal gegeben haben, existiert diese Task unter
+ dem von Ihnen gewählten Namen.
+
+ In der Task (also sinngemäß im Arbeitszimmer) arbeiten Sie - insbesondere legen
+ Sie Dateien (= Akten) an. Dateien existieren nur innerhalb einer Task.
+
+ Tasks werden durch den SUPERVISOR verwaltet, er regelt den Zugriff auf Tasks.
+ Um Ihre Task zu verlassen, geben Sie das Kommando 'break' an den
+ SUPERVISOR, um sie wieder zu betreten, das Kommando 'continue ("taskna­
+ me")'.
+
+
+- #on("b")#DATEI#off("b")#. Eine #ib#Datei#ie# ist eine Menge von zusammengehörigen Daten. Eine Datei in
+ einer Task entspricht einer Akte in einem Arbeitszimmer. Eine Task kann bis zu
+ 200 Dateien enthalten. Jede Datei in einer Task hat einen eigenen Namen, in ver­
+ schiedenen Tasks dürfen gleichnamige Dateien existieren. Eine Datei ist in Zeilen
+ unterteilt.
+
+ Für die Arbeit in einer Datei am Bildschirm muß auf die Datei mit dem Editor
+ zugegriffen werden: 'edit ("dateiname")', danach kann der Inhalt der Datei am
+ Terminal bearbeitet werden (siehe Kapitel 4 und 5).
+
+
+- #on("b")#KOMMANDO#off("b")#. Ein #ib#Kommando#ie# ist ein Befehl an den Rechner, eine Arbeit zu tun.
+ Welche Kommandos Sie dem Rechner zum jeweiligen Zeitpunkt geben können,
+ hängt davon ab, auf welcher 'Kommandoebene' Sie sich befinden. Als Anhalt gilt:
+
+ - Kommandos auf Supervisor-Ebene betreffen das Tasksystem.
+
+ - Kommandos auf Monitor-Ebene betreffen die eigene Task oder Dateien.
+
+ - Kommandos auf Editor- Ebene betreffen Zeilen, Worte oder einzelne Zeichen
+ der aktuellen Datei.
+
+ Auf welcher Ebene Sie sich befinden, werden Sie nach kurzer Gewöhnung leicht
+ am Bildschirm erkennen (siehe Teil 3).
+
+ Bei manchen Kommandos muß nicht nur gesagt werden, was getan werden soll,
+ sondern auch, womit es getan werden soll. Eine solche Angabe zum Kommando
+ heißt #ib#Parameter#ie#.
+ Kommando Parameter
+ | |
+ Beispiel: Lege neue Task an = begin ("taskname")
+ Drucke Datei = print ("dateiname").
+ Suche das Wort ENDE = down ("ENDE")
+
+ Parameter werden in runde Klammern gesetzt und ggf. durch Kommata voneinan­
+ der getrennt. Textparameter werden zusätzlich in Anführungsstriche gesetzt.
+
+ Ein Kommando kann keinen, einen oder viele Parameter benötigen; die
+ Beschreibung der Kommandos in diesem Buch zeigt jeweils alle Möglichkeiten.
+
+
+- #on("b")#SUPERVISOR#off("b")#. Spezielle Task zur Überwachung eines EUMEL-Systems. Ein
+ Benutzer kann durch die #ib#Supervisor#ie#-Kommandos Leistungen von dieser Task
+ fordern: neue Task einrichten, Task wiederaufnehmen und diverse Informationen.
+
+
+- #on("b")#MONITOR#off("b")#. Befehlsempfänger in einer Task. Jede Arbeit im EUMEL-System
+ findet in einer Task statt. Die Arbeit mit einem Computer besteht in wesentlichen
+ Teilen im Aufruf von Programmen durch Kommandos. Der Empfänger dieser
+ Kommandos in einer Task ist der #ib#Monitor#ie#. Der Monitor ist sichtbar durch eine
+ Zeile, in der 'gib kommando' steht. In diese Zeile werden #ib#Kommando#ie#s und erfor­
+ derliche Parameter eingegeben.
+
+
+- #on("b")#ARCHIVE#off("b")#. Spezielle Task zur Verwaltung des Diskettenlaufwerks. Da für die
+ längerfristige Datenhaltung und zur zusätzlichen Datensicherung Dateien auf
+ Disketten geschrieben werden, besitzt das EUMEL-System für diese Aufgabe
+ eine besondere Task, die die Bedienung vereinfacht und exklusiven Zugriff auf das
+ Laufwerk garantiert.
+
+
+- #on("b")#EDITOR#off("b")#. Programm zur Dateibearbeitung am Bildschirm. Das Programm wird
+ durch das ( Monitor- ) Kommando 'edit' und die Eingabe des Namens der ge­
+ wünschten Datei als Parameter gestartet.
+
+ Da ein Bildschirm normelerweise auf 80 Zeichen Zeilenbreite und 24 Zeilen be­
+ schränkt ist, kann der Editor als Fenster betrachtet werden, das über die mögli­
+ cherweise weitaus größere Datei bewegt wird und durch das der betrachtete Aus­
+ schnitt der Datei bearbeitet werden kann.
+
+
+ +-------------------------------------------------------------------+
+ i i
+ i i
+ +------------------------------------+ i
+ i i i
+ i Der Editor, Fenster zur i i
+ i Dateibearbeitung i i
+ i i i
+ +------------------------------------+ i
+ i i
+ +-------------------------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+1.3. Die Notation in diesem Buch
+#free(1.0)#
+Im weiteren Text werden Sie schrittweise in die Bedienung des Systems eingeführt.
+Für alle Kommandos und Arbeiten haben wir Beispiele in dieses Buch aufgenommen,
+die Sie direkt am Rechner nachvollziehen sollten.
+
+Beachten Sie dabei bitte folgende Regeln der Aufschreibung:
+
+- Es gibt eine Reihe von Tasten auf einer Computertastatur, die eine besondere
+ Bedeutung haben. Diese sogenannten Funktionstasten werden ebenso wie beson­
+ dere Tastenkombinationen explizit als Tasten dargestellt:
+
+
+ <SV>
+
+ <ESC> <e>
+
+ <CR>
+
+
+- Alles, was Sie am Bildschirm Ihres Rechners schreiben oder lesen sollen, ist in
+ Textbereiche, die einen Bildschirm darstellen, eingefaßt.
+
+ Beispiel:
+
+____________________________________________________________________________
+
+gib kommando:
+edit ("meine datei")
+
+____________________________________________________________________________
+
+
+- Innerhalb des Handbuchs sind in der Aufschreibung die Konventionen der
+ Programmiersprache ELAN, in der alle Programme des Betriebssystems geschrie­
+ ben sind, berücksichtigt. Dabei sind folgende Besonderheiten zu beachten:
+
+ 1) Kommandos werden grundsätzlich klein geschrieben.
+
+ 2) Dateinamen u.ä. werden in Klammern und Anführungsstriche gesetzt. In
+ diesem Buch steht an den Stellen, wo ein Dateiname auftaucht #on("i")# 'dateiname' #off("i")#;
+ den Namen, den Sie tatsächlich verwenden, können Sie frei wählen.
+
+ 3) Falls besondere Begriffe oder Beispiele innerhalb eines normalen Textes
+ auftreten, werden sie in einfache Anführungsstriche gesetzt.
+
+
+Also: Das Kommando 'edit' benötigt als Parameter einen Dateinamen. Wählen Sie
+ einen Namen und geben Sie 'edit ("dateiname")' ein. Falls Sie den Namen #on("i")#
+ "Geschäftsbrief" #off("i")# gewählt haben, müssen Sie am Bildschirm:
+
+
+edit ("Geschäftsbrief")
+
+
+tippen und das Kommando mit der <CR> Taste dem Monitor zur Bearbeitung überge­
+ben:
+
+____________________________________________________________________________
+
+gib kommando :
+edit ("Geschäftsbrief")
+
+____________________________________________________________________________
+
+
+
+
+#on("b")##on("i")#Die Eingabe von <CR> als 'Auslöser' für die Ausführung von
+Kommandos wird im weiteren nicht besonders hervorgehoben.#off("b")##off("i")#
+#page#
+1.4. Voraussetzungen
+
+#free(1.0)#
+Neben dem Computer an sich ist die vollständige Installation eines EUMEL-Systems
+auf diesem Computer Voraussetzung für alle im folgenden beschriebenen Aktivitäten.
+
+Die Beschreibung einer Systeminstallation finden Sie im Anhang I. Im weiteren gehen
+wir davon aus, daß Ihr Rechner sich in einem Zustand befindet, der durch Eingabe
+von <SV> oder <CNTL> <b> (gleichzeitig) die sogenannte EUMEL-Tapete zeigt und
+Supervisor-Kommandos annimmt.
+
+
+____________________________________________________________________________
+
+ Terminal 2
+
+
+ EUMEL Version 1.8/M
+
+
+ gib supervisor kommando:
+ begin("meine erste task")
+
+
+
+ ESC ? --> help
+ ESC b --> begin("") ESC h --> halt
+ ESC c --> continue("") ESC s --> storage info
+ ESC q --> break ESC t --> task info
+
+
+____________________________________________________________________________
+
+
+
+Weiterführende Information zum Aufbau eines EUMEL-Systems finden Sie im An­
+hang I.
+
+#page#
+Die Funktionstasten des EUMEL-Systems
+
+
+
+Die Lage der EUMEL-Funktionstasten entnehmen Sie bitte der speziellen Installa­
+tionsanleitung zu dem von Ihnen benutzten Gerät. #l pos (0.0)##l pos(4.0)#
+
+
+<,>,v,^ Positionierungstasten
+#table#
+#free(0.5)#
+<SHIFT> Umschalttaste
+#free(0.5)#
+<CR> Eingabe-/ Absatztaste
+#free(0.5)#
+<HOP> Verstärkertaste
+#free(0.5)#
+<RUBOUT> Löschtaste
+#free(0.5)#
+<RUBIN> Einfügetaste
+#free(0.5)#
+<TAB> Tabulatortaste
+#free(0.5)#
+<MARK> Markiertaste
+#free(0.5)#
+<ESC> Kommandotaste
+#free(0.5)#
+<SV> Supervisortaste
+#free(0.5)#
+<STOP> Stoptaste
+#free(0.5)#
+<WEITER> Weitertaste
+#tableend##clear pos#
+
+Task-Organisation
+#free(1.0)#
+
+Zum Verständnis der Handhabung des Systems sollten Sie versuchen, eine Vorstel­
+lung von der Organisation der Teile zu bekommen.
+
+Die einzelnen #ib#Task#ie#s eines EUMEL-Systems 'stehen nicht frei im Raum', sondern
+sind in einer baumartigen Beziehung organisiert:
+
+
+
+SUPERVISOR
+ -
+ SYSUR
+ configurator
+ OPERATOR
+
+ ARCHIVE
+UR
+ PUBLIC
+ Meyer
+ Müller
+ Schulze
+
+
+
+Das System besteht aus zwei Zweigen, die nebeneinander liegen:
+
+Dem Systemzweig mit der Wurzel SUPERVISOR
+
+ und
+
+dem Benutzerzweig mit der Wurzel UR.
+
+Der Systemzweig stellt Ihnen privilegierte Dienstleistungen zur Verfügung, der Benut­
+zerzweig stellt die normale Arbeitsumgebung dar.
+
+Alle unter diesen Wurzeln liegenden Tasks des EUMEL-Systems haben mindestens
+einen Vorgänger, es besteht also eine 'Vater-Sohn Beziehung' zwischen allen Tasks
+des Systems.
+
+Grundsätzlich können Dateien ohne besondere Kommandos zur Vater-Task geschickt
+und von der Vater-Task geholt werden, aber nicht zu beliebigen anderen Tasks.
+
+'Müller' kann eine Datei an '#ib#PUBLIC#ie#' schicken und 'Schulze' kann sie dann dort
+abholen, aber eine direkte Sendung von 'Müller' nach 'Schulze' ist in der Regel nicht
+möglich.
+
+Zur Sprechweise: jede Task, über die diese Art von 'Dateivermittlung' abgewickelt
+werden kann, heißt 'Manager-Task'. Jede Task kann zum '#ib#Manager#ie#' erklärt werden.
+1.5. Eine Beispielsitzung
+#free(1.0)#
+Der Ablauf zur Erstellung eines Schreibens stellt sich im EUMEL-System wie folgt
+dar:
+
+ <SV> SUPERVISOR aufrufen
+
+
+
+____________________________________________________________________________
+
+ Terminal 2
+
+
+ EUMEL Version 1.8/M
+
+
+ gib supervisor kommando:
+ begin("meine erste task")
+
+
+
+ ESC ? --> help
+ ESC b --> begin("") ESC h --> halt
+ ESC c --> continue("") ESC s --> storage info
+ ESC q --> break ESC t --> task info
+
+
+____________________________________________________________________________
+
+
+Durch das Kommando 'begin ("meine erste task")', welches durch <CR> abgeschlos­
+sen werden muß, wird eine Task mit dem Namen 'meine erste task' im Benutzer­
+zweig, also unterhalb von 'PUBLIC' angelegt. Würde diese Task bereits existieren, so
+könnten Sie sie mit 'continue ("meine erste task")' an das Terminal holen.
+
+____________________________________________________________________________
+
+gib kommando :
+edit ("Rechnung zum 31.12.86")
+
+____________________________________________________________________________
+
+
+In der Task eröffnen Sie eine Datei mit dem Kommando 'edit ("dateiname")'. Falls
+diese Datei neu ist, erfolgt eine Kontrollfrage (zur Kontrolle der gewünschten Schreib­
+weise des Dateinamens), die Sie durch <j> bejahen.
+
+Die Datei ist in diesem Beispiel bereits mit etwas Text gefüllt. Tippen Sie einen belie­
+bigen Text ein und beenden Sie die Bearbeitung dieser ersten Datei durch Drücken
+der Tasten <ESC> <q> (nacheinander!).
+
+
+____________________________________________________________________________
+.................... Rechnung zum 31.12.86 ...................... Zeile 1
+ G M D
+ Sankt Augustin
+ Schloß Birlinghoven
+
+Sehr geehrte Damen und Herren,
+>
+
+
+____________________________________________________________________________
+
+
+
+
+Um die Arbeit in der Task zu beenden, geben Sie auch an dieser Stelle <ESC> <q>
+(nacheinander!) ein.
+
+Nach Verlassen der Task ist wiederum die EUMEL-Tapete auf dem Bildschirm. Jede
+weitere Aktion wird wiederum von hier aus durch <SV> begonnen. Insbesondere zum
+#ib#Ausschalten des Geräts#ie# muß nach <SV> die Task '#ib#shutup#ie#' angestoßen werden (siehe
+auch Anhang I).
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.2 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.2
new file mode 100644
index 0000000..0153fae
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.2
@@ -0,0 +1,443 @@
+#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 2: Der Supervisor
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+2 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 2 - %
+#tableend##clearpos#
+#end#
+
+TEIL 2: Der Supervisor
+#free(1.0)#
+
+#ib(9)#2.1. Steuerkommandos#ie(9)#
+#free(1.0)#
+
+Jegliche Aktivität im EUMEL-System beginnt mit dem Aufruf des SUPERVISOR
+durch Drücken der Taste
+
+ <SV>
+
+
+Dieser Tastendruck koppelt Ihr Terminal an den Rechner an. Dieser Vorgang ist auch
+dann nötig, wenn diese Geräte praktisch eine Einheit bilden.
+
+
+____________________________________________________________________________
+
+ Terminal 2
+
+
+ EUMEL Version 1.8/M
+
+
+ gib supervisor kommando:
+
+
+
+
+ ESC ? --> help
+ ESC b --> begin("") ESC h --> halt
+ ESC c --> continue("") ESC s --> storage info
+ ESC q --> break ESC t --> task info
+
+
+____________________________________________________________________________
+
+
+Die auf den unteren Informationszeilen angezeigten Kommandos stehen nun zur
+Auswahl. Für alle diese Kommandos gilt, daß sie entweder durch zwei aufeinander­
+folgende Tastendrücke <ESC> und Kennzeichen oder auch durch vollständiges Eintip­
+pen eingegeben werden können und mit <CR> ausgelöst werden.
+
+Die Eingabe eines falschen Zeichens nach <ESC> oder eines falschen Kommandos
+wird abgewiesen. Die Eingabe ist dann zu wiederholen.
+
+
+Bedeutung der Kommandos:
+
+#on("b")#
+1) Steuerkommandos #off("b")#
+
+ #ib#ESC b#ie# #ib#begin#ie# ("taskname") Task einrichten.
+ #ib#ESC c#ie# #ib#continue#ie# ("taskname") Task wieder ankoppeln.
+ #ib#ESC q#ie# #ib#break#ie# Terminal abkoppeln.
+ #ib#ESC h#ie# #ib#halt#ie# Programmlauf abbrechen.
+
+
+
+#on("b")#
+2) Informationskommandos#off("b")# (nur Supervisor)
+
+ #ib#ESC ?#ie# #ib#help#ie# Information.
+ #ib#ESC s#ie# #ib#storage info#ie# Belegten Speicherplatz anzeigen.
+ #ib#ESC t#ie# #ib#task info#ie# Im System befindliche Tasks anzeigen.
+
+#page#
+2.2. Eine Task einrichten
+#free(1.0)#
+
+
+ Mit dem Kommando 'begin' wird eine neue Task eingerichtet.
+
+
+#free(1.0)#
+
+Zunächst koppeln Sie Terminal und Rechner, dann legen Sie eine neue Task an.
+
+ Terminal ankoppeln: <SV>
+
+ <ESC> <b>
+
+Die Tastenkombination 'ESC b' schaltet den Einfügemodus ein und positioniert
+den Cursor passend für die Eingabe des Tasknamens.
+
+____________________________________________________________________________
+
+gib supervisor kommando :
+begin ("")
+
+____________________________________________________________________________
+
+
+
+Dateinamen eintippen:
+
+____________________________________________________________________________
+
+ gib supervisor kommando:
+ begin ("taskname")
+
+____________________________________________________________________________
+
+
+Nachdem Sie den Namen eingegeben haben, betätigen Sie die <CR> Taste. Daraufhin
+meldet sich der Monitor der neuen Task und Sie können beliebige Monitor-
+Kommandos (siehe Teil 3) eingeben.
+
+Wird eine Task in dieser geschilderten Weise neu eingerichtet, so wird sie automa­
+tisch (von der Task SUPERVISOR) als Sohn der Task PUBLIC angelegt.
+
+
+Soll eine Task nicht als Sohn von PUBLIC, sondern als Sohn einer anderen Task
+angelegt werden, so ist das Kommando 'begin' mit zwei Parametern zu geben. Die
+neue Task wird dann als Sohn einer anderen Manager-Task angelegt (siehe Teil 3).
+
+
+____________________________________________________________________________
+
+ gib supervisor kommando:
+ begin ("taskname","name der vatertask")
+
+____________________________________________________________________________
+
+
+
+ACHTUNG: Die Task, die als Vater-Task angegeben wird, muß
+ eine Manager-Task sein, sonst passiert überhaupt nichts!
+ (s. Kap. 3.1.2.)
+
+#page#
+Task wiederankoppeln
+#free(1.0)#
+
+
+ Mit dem Kommando 'continue' wird eine existierende Task an das
+ Terminal angekoppelt.
+
+
+#free(1.0)#
+
+Wenn Sie die Arbeit in einer Task wiederaufnehmen wollen, holen Sie die Task mit
+dem Kommando 'continue' an das Terminal. Dieser Vorgang ähnelt dem Einrichten
+einer neuen Task:
+
+ Terminal ankoppeln: <SV>
+
+ <ESC> <c>
+
+Die Tastenkombination 'ESC c' schaltet den den Einfügemodus ein und positioniert
+den Cursor passend für die Eingabe des Tasknamens.
+
+
+____________________________________________________________________________
+
+ gib supervisor kommando:
+ continue ("taskname")
+
+____________________________________________________________________________
+
+
+Nach dieser Eingabe finden Sie die wiederaufgenommene Task so vor, wie Sie sie
+verlassen haben.
+
+#page#
+Terminal abkoppeln
+#free(1.0)#
+
+
+ Mit dem Kommando 'break' wird das Terminal vom Rechner abgekoppelt.
+
+
+#free(1.0)#
+
+Wenn Sie beispielsweise nach einem Informationskommando (siehe Teil 2.3.ff) das
+Terminal sofort vom Rechner abkoppeln möchten, geben Sie das 'break'-Kommando.
+Nach 'storage info' geht es jedoch nur mit <SV> weiter.
+
+____________________________________________________________________________
+
+ gib supervisor kommando:
+ break
+
+____________________________________________________________________________
+
+
+Nach dieser Eingabe ist das Terminal abgekoppelt. Jede neue Aktivität ist wiederum
+mit <SV> einzuleiten.
+#page#
+Laufendes Programm stoppen
+#free(1.0)#
+
+
+ Mit dem Kommando 'halt' wird ein Programm gestoppt, das am betreffenden Termi­
+ nal läuft.
+
+
+#free(1.0)#
+
+Dieses Kommando ist in besonderen Fehlersituationen von Wichtigkeit. Falls Sie ein
+Programm abbrechen wollen, aber keine regulären Eingaben am Bildschirm mehr
+möglich sind, so geben Sie zunächst <SV> ein.
+
+Sobald der Supervisor-Bildschirm erscheint, drücken Sie die Tasten
+
+#center# <ESC> <h> (oder tippen 'halt' und drücken 'CR').
+
+____________________________________________________________________________
+
+ gib supervisor kommando:
+ halt
+
+____________________________________________________________________________
+
+
+Nach dieser Eingabe wird das an diesem Terminal laufende Programm unterbrochen.
+Nach dem Abbruch kommen Sie wieder auf die Monitor-Ebene (s. Teil 3).
+#page#
+2.3. Informationskommandos
+#free(1.0)#
+
+
+ Mit den Informationskommandos können Informationen zum System abgerufen
+ werden.
+
+#free(1.0)#
+
+Die folgenden Informationskommandos können direkt an den SUPERVISOR gegeben
+werden.
+
+ Terminal ankoppeln: <SV>
+
+ <ESC> <s>
+
+
+beziehungsweise
+
+____________________________________________________________________________
+
+ gib supervisor kommando :
+ storage info
+
+____________________________________________________________________________
+
+
+gibt Auskunft über den belegten Speicherplatz auf dem EUMEL-Hintergrundspeicher.
+
+Das Kommando:
+
+
+____________________________________________________________________________
+
+ gib supervisor kommando :
+ task info
+
+____________________________________________________________________________
+
+
+gibt Auskunft über die Namen der im EUMEL-System befindlichen Tasks und die
+Struktur des Taskbaums. Verzweigungen im Taskbaum sind durch Einrückungen in
+den Ebenen des Taskbaums dargestellt.
+
+
+Alle in dem Schema der Task-Organisation (siehe Teil 1) fettgedruckten Tasks sind
+auch auf jedem Multi-User-Sysrtem zu finden, da sie zum Betrieb nötig sind.
+
+Die unterhalb von PUBLIC gelegenen Tasks werden, falls überhaupt schon vorhan­
+den, häufig nach ihrem 'Besitzer' oder der in ihnen erledigten Arbeit benannt sein.
+
+#page#
+2.4. Übersicht über Supervisor-Kommandos
+#free(1.0)#
+
+
+ In diesem Abschnitt werden alle Supervisor- und Task-Kommandos in der
+ ELAN-Notation dargestellt.
+
+#free(1.0)#
+
+Die Supervisor-Kommandos entsprechen - wie alle anderen Kommandos im
+EUMEL-System - der ELAN-Syntax (Kommando-Namen werden klein geschrie­
+ben, Parameter in Klammern, mehrere Parameter durch Kommata getrennt, TEXT-
+Parameter in Anführungsstrichen usw.).
+#free(1.0)#
+Die ELAN-Notation
+#free(1.0)#
+
+Diese Notation dient der präzisen Beschreibung von Konstrukten der Programmier­
+sprache ELAN. Im Anschluß an die teilweise eher informelle Formulierung innerhalb
+des Kapitels folgt jedem Teil eine Kurzbeschreibung der zu diesem Themenkreis
+gehörigen Konstrukte.
+
+Eine solche Beschreibung hat z.B. die Form:
+
+ PROC edit (TEXT CONST dateiname)
+
+Die klein geschriebenen Benennungen von Prozeduren, Parametern etc. sind hoffent­
+lich selbsterklärend, die groß geschriebenen Begriffe sind sogenannte Schlüsselworte
+und haben folgende Bedeutung:
+
+OP Operator
+ Ein Operator bewirkt eine elementare Operation. Operatoren werden stets
+ durch Großbuchstaben oder Sonderzeichen dargestellt.
+
+ Beispiel: + ( Addition zweier Zahlen)
+
+
+PROC Prozedur
+ Programm, welches unter seinem Namen aufrufbar ist, ggf. unter Anfügung
+ von Parametern. <CR> beendet die Eingabe und läßt das Programm ablaufen.
+
+ Beispiel: 'edit ("dateiname")'
+
+
+CONST Konstante
+ Unveränderbarer Wert.
+
+
+VAR Variable
+ Veränderbarer Wert.
+
+
+BOOL Wahrheitswert
+ Typ, der nur die Werte TRUE oder FALSE annnehmen kann.
+
+
+TEXT Text
+ Typ, der alle Buchstaben, Sonderzeichen, aber auch Ziffern umfaßt. Eine
+ TEXT CONST ist somit eine sogenannte Zeichenkette:
+
+ "meine datei"
+ "$abc123(XYZ)"
+ "abrechnung vom 30.09.86"
+
+
+ Eine im Editor erstellte Datei besteht ausschließlich aus TEXTen. Ein Text
+ wird in Anführungszeichen " " eingeschlossen.
+
+
+INT Integer
+ Ganze Zahl. Ein INT CONST ist also irgendeine ganze Zahl. Falls beschrie­
+ ben ist: 'INT CONST zeilennr', so ist gemeint, daß an dieser Stelle die Zeilen­
+ nummer der gewünschten Zeile der Datei anzugeben ist, also '25' oder '999'.
+
+
+REAL Real
+ Reelle Zahl. Eine REAL CONST bezeichnet eine Zahl mit Dezimalpunkt.
+
+ PROC sin (REAL CONST x) => sin (0.5)
+
+
+
+TASK Task
+ Eine TASK CONST bezeichnet eine existierende Task durch einen internen
+ Task-Bezeichner.
+
+
+
+THESAURUS
+ Ein THESAURUS ist eine Liste von Namen, z.B. eine Liste von Dateinamen.
+
+
+
+#page#
+Folgende Supervisor-Kommandos stehen zur Verfügung:
+
+
+#sy("begin
+ PROC begin (TEXT CONST task name)
+ Richtet eine neue Task als Sohn von PUBLIC ein.
+
+ PROC begin (TEXT CONST task name, father task name)
+ Richtet eine neue Task als Sohn der 'fathertaskname'-Task ein.
+
+
+break
+ PROC break
+ Das Terminal wird vom Rechner abgekoppelt.
+
+
+continue
+ PROC continue (TEXT CONST task name)
+ Eine existierende Task wird an das Terminal des Benutzers angekoppelt.
+
+halt
+ PROC halt
+ Das laufende Programm der dem Terminal aktuell zugeordneten Task wird
+ abgebrochen. Natürlich wird die Task nicht gelöscht.
+
+ Genauer:
+ Es wird der Fehler 'halt from terminal' induziert. Normalerweise wird das
+ Programm dadurch wie durch jeden anderen Fehler abgebrochen. Genaueres
+ findet man im Systemhandbuch unter Fehlerbehandlung.
+
+storage info
+ PROC storage info
+ Informationsprozedur über den Hintergrund-Speicher.
+
+task info
+ PROC task info
+ Informiert über alle Tasknamen im System unter gleichzeitiger Angabe der
+ Vater/Sohn-Beziehungen durch Einrückungen.
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.3 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.3
new file mode 100644
index 0000000..eb1c762
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.3
@@ -0,0 +1,2019 @@
+#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 3: Der Monitor
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+3 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 3 - %
+#tableend##clearpos#
+#end#
+
+TEIL 3: Der Monitor
+#free(1.0)#
+#ib(9)#3.1. Der Monitor#ie(9)#
+#free(1.0)#
+
+
+ Der Monitor nimmt die Kommandos des Benutzers entgegen, die dieser innerhalb
+ seiner Task gibt. In diesem Kapitel sind die gebräuchlichen Kommandos zur Text­
+ verarbeitung beschrieben.
+
+
+#free(1.0)#
+
+Der #ib#Monitor#ie# ist der Empfänger der Kommandos in einer EUMEL-Task. Jede Task
+und somit jeder aktive Benutzer eines EUMEL-Systems verfügt über einen eigenen
+Monitor. Halten Sie sich an dieser Stelle vor Augen:
+#on("i")##on("b")#
+
+
+Der SUPERVISOR ist die Task, die die Aufsicht über
+alle weiteren Tasks des EUMEL-Systems hat.
+
+Der Monitor ist der Befehlsempfänger in Ihrer Task.
+Jede Task hat einen Monitor.
+
+#goalpage("Mon-kdo")#
+Der Monitor in Ihrer Task macht sich direkt bemerkbar durch die Zeile:
+
+____________________________________________________________________________
+
+#ib#gib kommando#ie# :
+____________________________________________________________________________
+
+
+Die Kommandos der Monitor-Ebene, die Sie an dieser Stelle eingeben können,
+lassen sich in Gruppen ordnen:
+#on("b")#
+
+
+Informationskommandos #off("b")#
+
+ #ib#storage info#ie# Belegten Speicherplatz anzeigen.
+ #ib#task info#ie# Im System befindliche Tasks anzeigen.
+ #ib#task status#ie# Zustand der Task anzeigen.
+
+
+#on("b")#
+Kommandos zur Tasksteuerung #off("b")#
+
+ #ib#break#ie# Task abkoppeln.
+ #ib#end#ie# Task löschen.
+ #ib#global manager#ie# Task zum Manager machen, d.h.
+ Sohn-Tasks können eingerichtet
+ werden.
+
+
+#on("b")#
+Kommandos zur Dateibearbeitung #off("b")#
+
+ #ib#copy#ie# ("dateiname","kopie") Datei kopieren.
+ #ib#edit#ie# ("dateiname") Editor aufrufen.
+ #ib#forget#ie# ("dateiname") Datei löschen.
+ #ib#list#ie# Dateien auflisten.
+ #ib#rename#ie# ("dateiname","neu") Datei umbenennen.
+
+#on("b")#
+Transport von Dateien#off("b")#
+
+ #ib#fetch#ie# ("dateiname") Datei von Vater-Task holen.
+ #ib#erase#ie# ("dateiname") Datei in Vater-Task löschen.
+ #ib#save#ie# ("dateiname") Datei zu Vater-Task senden.
+
+
+#on("b")#
+Archiv-Kommandos#off("b")#
+
+ #ib#archive#ie# ("name") Archivlaufwerk reservieren.
+ #ib#fetch#ie# ("dateiname",archive) Datei von Archiv holen.
+ #ib#save#ie# ("dateiname",archive) Datei auf Archiv schreiben.
+ #ib#list (archive)#ie# Inhalt des Archivs listen.
+ #ib#check#ie# ("dateiname",archive) Datei auf Lesbarkeit prüfen.
+ #ib#clear#ie# (archive) Archiv löschen/umbenennen.
+ #ib#format (archive)#ie# Archivdiskette für Benutzung
+ vorbereiten.
+
+#on("b")#
+Textverarbeitung #off("b")#
+
+ #ib#list fonts#ie# Nennt die eingestellten
+ Schrifttypen.
+ #ib#fonttable#ie# Stellt die gewünschte Fonttabelle ein.
+ #ib#lineform#ie# ("dateiname") Zeilenweise formatieren.
+ #ib#autoform#ie# ("dateiname") Automatische Zeilenformatierung.
+ #ib#pageform#ie# ("dateiname") Seitenweise formatieren.
+ #ib#autopageform#ie# ("dateiname") Automatische Seitenformatierung.
+ #ib#index#ie# ("dateiname.p") Stichwortverzeichnis erzeugen.
+ #ib#outline#ie# ("dateiname") Übersicht bzw. Kurzfassung eines
+ Textes erstellen.
+ #ib#print#ie# ("dateiname") Datei drucken.
+
+
+
+#on("b")#
+Passwortschutz #off("b")#
+
+ #ib#task password#ie# ("geheim") Passwort für existierende Task festlegen.
+ #ib#begin password#ie# ("geheim") Passwort für neue Task festlegen.
+ #ib#family password#ie# ("geheim") Passwort für mehrere Tasks
+ festlegen.
+ #ib#enter password#ie# ("geheim") Passwort für Datei festlegen.
+
+#page#
+3.1.1. Informationskommandos
+#free(1.0)#
+
+
+ Mit den Informationskommandos können Informationen zur eigenen Task bzw. zum
+ gesamten System abgerufen werden.
+
+#free(0.5)#
+
+Bereits von Teil 2 bekannt sind die Informationskommandos 'ESC s' und 'ESC t'. Auf
+der Monitor-Ebene ist die abkürzende Schreibweise nicht voreingestellt.
+
+____________________________________________________________________________
+
+gib kommando :
+storage info
+
+____________________________________________________________________________
+
+
+gibt Auskunft über den belegten Speicherplatz auf dem EUMEL-Hintergrundspeicher.
+
+____________________________________________________________________________
+
+gib kommando :
+task info
+
+____________________________________________________________________________
+
+
+gibt Auskunft über die Namen der im EUMEL-System befindlichen Tasks und die
+Struktur des Taskbaums.
+#page#
+Auf Monitor-Ebene kann durch zusätzliche Angabe einer Zahl zwischen 1 und 3
+Zusatzinformation angefordert werden.
+
+____________________________________________________________________________
+
+gib kommando :
+task info (2)
+
+____________________________________________________________________________
+
+liefert:
+
+____________________________________________________________________________
+26.11.86 10:10 CPU PRIO CHAN STATUS
+SUPERVISOR........................... 0001:08:50 0 - wait
+ -................................ 0000:00:08 0 2 i/o
+ -................................ 0000:01:45 0 - wait
+ SYSUR............................ 0000:01:48 0 - wait
+ configurator................. 0000:00:43 0 - wait
+ OPERATOR..................... 0000:00:03 0 - i/o
+ shutup dialog............ 0000:03:08 0 - i/o
+ ARCHIVE...................... 0000:03:03 0 31 wait
+UR................................... 0000:00:43 0 - wait
+ PUBLIC........................... 0000:01:26 0 - i/o
+ agfa......................... 0000:00:11 0 - i/o
+ werner....................... 0000:06:00 0 - -busy-
+
+
+____________________________________________________________________________
+
+
+
+
+'task info (1)' entspricht dabei dem Kommando ohne Parameterangabe, '(2)' liefert
+zusätzlich die verbrauchte CPU-Zeit (=reine Rechenzeit), die Priorität, den Kanal
+(siehe S.#topage("Kanal")#) und den Taskstatus für jede Task des Systems. '(3)' liefert neben diesen
+Angaben auch noch den belegten Speicherplatz jeder Task. Die Ausführung von task
+info (3) ist sehr zeitaufwendig!
+
+Um insbesondere den belegten Speicherplatz der eigenen Task anzusehen, aber auch
+die übrigen der oben erwähnten Angaben, benutzt man das Kommando:
+
+____________________________________________________________________________
+
+ gib kommando :
+ task status
+
+24.12.86 18:30 TASK: wenni
+
+Speicher: 1000K
+CPU-Zeit: 0000.01:11
+Zustand : -busy-, (Prio 1), Kanal 1
+
+ gib kommando :
+
+____________________________________________________________________________
+#page#
+3.2. Tasksteuerung
+#free(1.0)#
+Task abkoppeln
+#free(1.0)#
+
+
+ Mit dem Kommando 'break' wird eine Task vom Terminal abgekoppelt.
+
+
+#free(1.0)#
+
+Durch die Eingabe des Kommandos 'break' auf Monitor-Ebene wird die Task vom
+Terminal abgekoppelt. Dieses Kommando bewirkt ansonsten keine Veränderungen.
+
+____________________________________________________________________________
+
+gib kommando :
+break
+
+____________________________________________________________________________
+
+
+
+Statt 'break' einzutippen, können Sie auch die Tastenkombination
+
+#center#<ESC> <q>
+
+benutzen.
+
+#page#
+
+Eine Manager-Task erzeugen
+#free(1.0)#
+
+
+ Eine Task kann zum #ib#Manager#ie#, d.h. zum Kommunikationspartner anderer Tasks,
+ erklärt werden. Insbesondere zwischen Manager-Tasks und anderen, die
+ zueinander in Vater-Sohn-Beziehung stehen, ist ein einfacher Dateitransfer
+ möglich (siehe S.#topage("Dateitrans")#).
+
+#free(1.0)#
+
+Normalerweise werden Benutzertasks als Sohn der Task PUBLIC eingerichtet. Es
+kann jedoch wünschenswert sein, selbst eine Task-Hierarchie aufzubauen und eine
+vorhandene Task zum Vater einer oder mehrerer in Zukunft einzurichtender Tasks zu
+machen, um somit auch eine Dateihierarchie mit den benötigten Operationen zu
+erhalten. Dazu wird diese Task zum 'Manager' erklärt:#goalpage("globalmanager")#
+
+____________________________________________________________________________
+
+gib kommando:
+global manager
+
+____________________________________________________________________________
+
+
+Durch das '#ib#global manager#ie#'-Kommando wird implizit ein 'break'-Kommando gege­
+ben, so daß Sie nach Eingabe dieses Kommandos wieder ein Supervisor-Kommando
+geben können. Wenn Sie nun zu irgendeinem Zeitpunkt diese (zunächst potentielle)
+Vater-Task wieder ankoppeln ('continue'-Kommando), meldet sich die Task nicht
+wie gewohnt mit 'gib kommando :', sondern mit:
+
+____________________________________________________________________________
+
+maintenance :
+
+____________________________________________________________________________
+
+
+um anzudeuten, daß es sich um eine Manager-Task handelt.
+
+Um eine Sohn-Task unterhalb einer Manager-Task einzurichten, wird zur Erzeu­
+gung dieser neuen Task nicht nur der gewünschte Name, sondern auch der Name der
+Vater-Task angegeben.#u#1)#e#
+#foot#
+#u#1)#e# Falls keine Vater-Task angegeben wird, so ist die neue Task Sohn der
+Manager-Task 'PUBLIC'.
+#end#
+
+____________________________________________________________________________
+
+ Terminal 2
+
+
+ EUMEL Version 1.8/M
+
+
+ gib supervisor kommando:
+ begin("sohntask","vatertask")
+
+
+
+ ESC ? --> help
+ ESC b --> begin("") ESC h --> halt
+ ESC c --> continue("") ESC s --> storage info
+ ESC q --> break ESC t --> task info
+
+
+____________________________________________________________________________
+
+
+
+
+In dieser Sohn-Task können dann mit einfachen Kommandos Dateien von der
+Vater-Task geholt und zur Vater-Task geschickt werden.
+
+Soll eine Task für alle anderen Tasks, nicht nur für Sohn-Tasks, des Gesamtsystems
+als Kommunikationspartner erreichbar sein, so muß diese Task als freier Manager
+deklariert werden:
+
+____________________________________________________________________________
+
+gib kommando:
+#ib#free global manager#ie#
+
+____________________________________________________________________________
+
+
+Auf eine solche Task kann von #on("u")#jeder#off("u")# anderen Task aus zugegriffen werden, ansonsten
+gilt das für gewöhnliche Manager-Tasks gesagte.
+#page#
+Task löschen
+#free(1.0)#
+
+
+ Eine Task kann mit dem '#ib#end#ie#' Kommando gelöscht werden (und mit ihr alle Daten).
+
+ #free(0.5)#
+Normale Benutzertasks werden meistens zweck- oder themengebunden eingerichtet.
+Sind die Aufgaben im Zusammenhang mit einer solchen Task erledigt, so sollte die
+Task gelöscht werden, nachdem alle Daten von Bedeutung auf Diskette gesichert
+wurden.
+
+____________________________________________________________________________
+
+gib kommando :
+end
+
+____________________________________________________________________________
+
+Wie bei allen Löschungen im EUMEL-System folgt eine Kontrollfrage durch den
+Monitor:
+
+____________________________________________________________________________
+
+gib kommando :
+end
+task "taskname" löschen (j/n) ?
+
+
+____________________________________________________________________________
+
+
+Nur bei der positiven Antwort wird gelöscht, alle Dateien sind unwiderruflich verlo­
+ren. Als positive Antwort auf derartige Abfragen wirken:
+
+#center#<j> <J> <y> <Y>
+
+<n> bzw. <N> unterdrücken die angebotene Aktion, andere Eingaben werden abgewie­
+sen.
+
+#on("b")#
+ACHTUNG: Wird eine Manager-Task gelöscht, so werden alle Sohn- Enkel- etc.
+ Tasks ohne zusätzliche Nachfrage gelöscht, falls die Sicherheitsabfrage
+ mit 'j' beantwortet wurde. #off("b")#
+#page#
+3.3. Dateibearbeitung
+#free(1.0)#
+Datei einrichten
+#free(1.0)#
+
+
+ Mit dem Editoraufruf 'edit' wird eine neue Datei eingerichtet, bzw. eine existierende
+ Datei zur Bearbeitung am Bildschirm gezeigt.
+
+
+
+#free(0.5)#
+
+Eine Datei enthält Texte, die logisch zusammengehören und sie wird über ihren
+Namen eindeutig gekennzeichnet.
+
+Das EUMEL-System speichert einmal geschriebene Texte, bis sie vom Benutzer
+gelöscht werden. In der Regel wird nicht nur ein (langer) Text oder ein Programm­
+text geschrieben, sondern mehrere und unterschiedliche. Um diese auseinanderhalten
+zu können, versehen wir sie jeweils mit einem Namen, der frei gewählt werden kann.
+Beispiele für Namen:
+
+
+ "Brief vom 1.12.86"
+ "1. Kapitel meines Buches"
+
+
+Eine Sammlung von Zeichen (also im Normalfall unsere geschriebenen Texte), die mit
+einem Namen versehen worden ist, nennt man eine #ib##on("b")#Datei#ie##off("b")#. Der Editor erstellt also eine
+Datei, wenn wir einen Text schreiben. Eine Datei kann bis zu 4 000 Zeilen fassen,
+wobei jede bis zu 32 000 Zeichen lang sein darf.
+
+
+Einrichten der ersten #ib#Datei#ie# in Ihrer Task:
+
+Der erste Schritt sollte darin bestehen, daß Sie sich einen vernünftigen Dateinamen
+ausdenken. Das EUMEL-System legt Ihnen praktisch keine Beschränkungen über
+Länge oder Form des Dateinamens auf, deshalb sollten Sie sich angewöhnen, Ihre
+Dateien so zu benennen, daß Sie anhand des Namens auch nach einer Woche oder
+länger noch erahnen können, was diese Datei enthält.
+
+Ein guter Name für die erste Datei wäre zum Beispiel: "meine erste Datei" oder
+"werners test vom 1.12.86". Im weiteren Text steht nur "dateiname" o. ä.. Setzen Sie
+dafür den von Ihnen gewählten Namen ein.
+
+____________________________________________________________________________
+
+gib kommando:
+edit ("dateiname")
+
+____________________________________________________________________________
+
+____________________________________________________________________________
+
+gib kommando:
+edit ("dateiname")
+
+"dateiname" neu einrichten (j/n)?
+
+____________________________________________________________________________
+
+Drücken Sie 'j', so wird eine neue Datei unter dem von Ihnen eingegebenen Namen
+eingerichtet. Die Datei ist zunächst leer:
+
+____________________________________________________________________________
+ ................... dateiname .................... Zeile 1
+
+____________________________________________________________________________
+
+
+
+Welche Möglichkeiten Sie bei der Bedienung des Editors haben, können Sie in Teil 4
+nachschlagen. Schreiben Sie an dieser Stelle nur einige Worte in die Datei, anhand
+derer der Dateiinhalt wiederzuerkennen ist. Sie können die Tastatur genauso benutzen
+wie die einer Schreibmaschine.
+
+____________________________________________________________________________
+ ................... dateiname .................... Zeile 1
+Inhalt der ersten Datei. 1234567890
+
+____________________________________________________________________________
+
+
+Die Datei sollte an dieser Stelle wieder geschlossen werden.
+
+Drücken Sie dazu <ESC> <q>.
+
+Dabei ist gleichgültig, wo der Cursor steht.
+
+Wiederholen Sie das Neuanlegen einer Datei mit einer zweiten Datei "anderer datein­
+ame". Bitte schreiben Sie wiederum einige Zeichen in die Datei.
+
+____________________________________________________________________________
+
+gib kommando :
+edit ("anderer dateiname")
+
+____________________________________________________________________________
+
+
+Vorschlag zur Eingabe:
+
+____________________________________________________________________________
+
+ .............. anderer dateiname ................. Zeile 1
+Halten Sie irgendeine Taste gedrücktttttttttttttttt
+
+____________________________________________________________________________
+
+
+Beenden Sie die Arbeit ebenfalls mit <ESC> <q> .
+
+
+#page#
+Dateinamen auflisten
+#free(1.0)#
+
+
+ Mit dem Kommando 'list' werden die Dateinamen der Dateien in der Task aus­
+ gegeben.
+
+
+#free(1.0)#
+
+Vor jedem Dateinamen wird das Datum der letzten Bearbeitung der Datei angezeigt.
+
+____________________________________________________________________________
+
+gib kommando:
+list
+
+____________________________________________________________________________
+
+bewirkt:
+____________________________________________________________________________
+
+ ..................... list ....................... Zeile 1
+
+01.08.86 "dateiname"
+01.08.86 "anderer dateiname"
+
+____________________________________________________________________________
+
+
+
+Auch bei dieser Auflistung der Dateinamen handelt es sich um eine EUMEL-Datei
+ (allerdings um eine schreibgeschützte), die Ausgabe wird also wie gewohnt durch
+ das Kommando <ESC> <q> beendet.
+#page#
+Datei duplizieren
+#free(1.0)#
+
+
+ Mit dem Kommando 'copy' wird eine existierende Datei dupliziert.
+
+
+#free(1.0)#
+
+Eine existierende Datei kann dupliziert werden durch das Kommando :
+
+____________________________________________________________________________
+
+gib kommando:
+copy ("dateiname","kopiename")
+
+____________________________________________________________________________
+
+
+Durch dieses Kommando wird eine Kopie der Datei "dateiname" unter dem Namen
+"kopiename" angelegt, der Inhalt der beiden Dateien ist zunächst identisch. Kontrol­
+lieren Sie die Richtigkeit dieser Behauptung, indem Sie nachsehen, ob der Inhalt der
+kopierten Datei gleich dem Inhalt der Ursprungsdateiname ist:
+
+____________________________________________________________________________
+
+gib kommando:
+edit ("kopiename")
+
+____________________________________________________________________________
+#page#
+Dateinamen ändern
+#free(1.0)#
+
+
+ Mit dem Kommando 'rename' wird der Name einer Datei geändert.
+
+
+#free(1.0)#
+
+Sollte Ihnen der Name einer Datei nicht gefallen, so besteht die Möglichkeit, den
+Namen zu ändern:
+
+____________________________________________________________________________
+
+gib kommando:
+rename ("dateiname","neuer dateiname")
+
+____________________________________________________________________________
+
+
+#page#
+Datei löschen
+#free(1.0)#
+
+
+ Mit dem Kommando 'forget' wird eine Datei gelöscht.
+
+
+#free(1.0)#
+
+Das Löschen einer Datei wird durch das Kommando:
+
+____________________________________________________________________________
+
+gib kommando:
+forget ("neuer dateiname")
+
+____________________________________________________________________________
+
+eingeleitet. Aus Gründen der Sicherheit erfolgt vor der Ausführung des Kommandos
+jedoch die Abfrage:
+
+____________________________________________________________________________
+
+gib kommando:
+forget ("neuer dateiname")
+
+"dateiname" löschen ? (j/n)
+
+____________________________________________________________________________
+
+Als positive Antwort auf derartige Abfragen wirken: <j> <J> <y> <Y>
+
+<n> bzw. <N> unterdrücken die angebotene Aktion, andere Eingaben werden abgewie­
+sen.
+
+#page#
+Dateien verschicken
+#free(1.0)#
+#goalpage("Dateitrans")#
+
+
+ Dateien können zur Vater-Task geschickt und von der Vater-Task geholt werden.
+
+#free(1.0)#
+
+Die Vereinbarung, daß Dateien in einer Task lokal sind, d.h. daß nur in dieser Task
+Zugriff auf die Daten möglich ist, ist häufig zu einschränkend. So kann es zweck­
+mäßig sein, von mehreren Arbeitsplätzen (= Tasks) aus die wesentlichen Ergebnisse
+an einer zentralen Stelle zu sammeln oder Ergebnisse aus Tasks, die nur kurzzeitig
+für eine spezielle Aufgabe eingerichtet wurden, länger aufzubewahren.
+
+Zu diesem Zweck wird eine Benutzertask zum Manager erklärt (siehe S.#topage("globalmanager")#) und es
+werden Söhne dieser Task eingerichtet.
+#page#
+Datei zur Vater-Task schicken
+#free(1.0)#
+
+
+ Mit dem Kommando 'save' wird die Kopie einer Datei zur Vater-Task geschickt.
+
+
+#free(1.0)#
+
+____________________________________________________________________________
+
+gib kommando:
+save ("dateiname")
+
+____________________________________________________________________________
+
+Wird eine Datei an die Vater-Task gesendet, wird eine Kopie der Ursprungsdateina­
+me unter dem Namen 'dateiname' in der Vater-Task eingerichtet. Danach sind diese
+beiden, zunächst gleichen Dateien unabhängig voneinander. Änderungen, welcher Art
+auch immer, haben keinen Einfluß auf die namensgleiche Kopie in der anderen Task.
+
+Falls in der Vater-Task bereits eine Datei mit dem Namen 'dateiname' existiert, sei
+es durch Zufall oder weil bereits einmal eine 'save'-Operation durchgeführt worden
+ist, erfolgt eine Abfrage:
+
+____________________________________________________________________________
+
+gib kommando:
+save ("dateiname")
+
+"dateiname" überschreiben ? (j/n)
+
+____________________________________________________________________________
+
+Nur wenn die positive Eingabe 'j' erfolgt, wird die Datei in der Vater-Task durch die
+eigene Datei überschrieben.
+#page#
+Datei von der Vater-Task holen
+#free(1.0)#
+
+
+ Mit dem Kommando 'fetch' wird die Kopie einer Datei von der Vater-Task geholt.
+
+
+#free(1.0)#
+
+Entsprechend dem Versenden einer Dateikopie können Sie eine Kopie von der Vater­
+Task holen und ggf., natürlich nach Abfrage, Ihre Datei dieses Namens überschrei­
+ben.
+
+____________________________________________________________________________
+
+gib kommando:
+fetch ("dateiname")
+
+____________________________________________________________________________
+
+#page#
+Datei in der Vater-Task löschen
+#free(1.0)#
+
+
+ Mit dem Kommando 'erase' wird eine Datei in der Vater-Task gelöscht.
+
+
+#free(1.0)#
+
+Soll eine Datei in der Vater-Task gelöscht werden, so kann dieses, dem 'forget'-
+Kommando analoge Kommando, in der Sohn-Task gegeben werden:
+
+____________________________________________________________________________
+
+gib kommando:
+erase ("dateiname")
+
+____________________________________________________________________________
+
+Falls die Datei in der Vater-Task existiert, wird sie nach Kontrollfrage gelöscht.
+
+____________________________________________________________________________
+
+gib kommando:
+erase ("dateiname")
+"dateiname" loeschen (j/n) j
+
+gib kommando :
+
+
+____________________________________________________________________________
+
+
+ Anm: Die Task 'PUBLIC' ist grundsätzlich eine Manager-Task. Da Benut­
+ zer-Tasks als Sohn von '#ib#PUBLIC#ie#' eingerichtet werden, falls Sie nicht als
+ Sohn einer besonderen Manager-Task eingerichtet wurden, beziehen sich
+ 'fetch'-, 'save'- und 'erase'-Kommandos auf 'PUBLIC'.
+#page#
+3.4. Das Archiv
+#free(1.0)#
+
+
+ Das Archiv dient der Speicherung von Dateien auf Disketten (Sicherung).
+
+#free(1.0)#
+
+Das #ib#Archiv#ie# übernimmt im EUMEL-System die Verwaltung der langfristigen Daten­
+haltung. Das Archiv sollen Sie benutzen, um:
+
+- Sicherungskopien wichtiger Dateien außerhalb des Rechners zu besitzen;
+
+- nicht benötigte Dateien außerhalb einer Task zu halten (Speicherplatzersparnis!);
+
+- Dateien auf andere Rechner zu übertragen.
+
+Das Archiv wird im EUMEL-System durch die Task 'ARCHIVE', die das Disketten­
+laufwerk des Rechners verwaltet, realisiert. Die Steuerung durch eine Task hat für Sie
+die erfreuliche Folge, daß die Handhabung des Archivs sich kaum von den schon
+bekannten Dateioperationen unterscheidet. In den Kommandos wird zusätzlich ange­
+geben, daß das Archiv angesprochen werden soll.
+
+#page#
+Archiv-Kommandos
+#free(1.0)#
+
+
+ Der Arbeitsablauf bei Benutzung des Archivs besteht immer aus der Reservierung,
+ dem Lese- oder Schreibzugriff und der Freigabe des Archivs nach Ende der
+ Arbeit. Jede Arbeit mit dem Archiv beginnt mit dem Reservierungskommando.
+
+
+#free(1.0)#
+
+Als ersten Schritt der Archivbenutzung müssen Sie das Archiv reservieren, das heißt
+der Verwaltung Ihres EUMEL-Systems mitteilen, daß Sie die Task 'ARCHIVE', die
+der Steuerung des Diskettenlaufwerks dient, für Ihre Task arbeiten lassen. Solange für
+Ihre Task das Archiv reserviert ist, kann keine andere Task das Archivlaufwerk benut­
+zen.
+
+Für die Reservierung müssen Sie bei Benutzung einer schon vorbereiteten oder sogar
+beschriebenen Diskette den Namen dieser Archivdiskette kennen (er sollte auf dem
+Diskettenaufkleber stehen) oder vor Benutzung einer neuen Diskette einen Namen
+festlegen (und auf dem Aufkleber vermerken). Wie gewohnt gibt es keine Vorschrif­
+ten für die Namensgebung.
+
+Erst nachdem Sie das Reservierungskommando gegeben haben:
+
+____________________________________________________________________________
+
+gib kommando:
+archive ("diskettenname")
+
+____________________________________________________________________________
+
+
+sollten Sie die Diskette in das Laufwerk einschieben, um zu verhindern, daß ein
+anderer Benutzer, der das Archiv bereits für sich reserviert hat, auf Ihrer zufällig
+gleichnamigen Datei arbeitet.
+
+
+Eine Datei wird mit dem Kommando:
+
+____________________________________________________________________________
+
+save ("dateiname",archive)
+
+
+____________________________________________________________________________
+
+
+auf eine Diskette geschrieben und mit dem Kommando:
+
+____________________________________________________________________________
+
+fetch ("dateiname",archive)
+
+____________________________________________________________________________
+
+
+von einer Diskette geholt.
+
+Das Inhaltsverzeichnis einer Diskette erhalten Sie durch:
+
+____________________________________________________________________________
+
+list (archive)
+
+____________________________________________________________________________
+
+#page#
+Benutzung einer neuen Archivdiskette
+#free(1.0)#
+
+
+ Eine neue Diskette muß für die Benutzung vorbereitet (formatiert) werden.
+
+
+
+#free(1.0)#
+Vor der erstmaligen Benutzung einer Archivdiskette muß diese formatiert, d.h. in
+Spuren und Sektoren für die Positionierung des Schreib-/Lesekopfes des Disketten­
+laufwerks eingeteilt werden, um überhaupt ein Beschreiben der Diskette zu ermög­
+lichen. Die Einteilung ist geräteabhängig, häufige Formate sind:
+
+ 40 Spuren zu je 9 Sektoren (360 K)
+ 80 Spuren zu je 9 Sektoren (720 K).
+
+Die #on("b")#Erst#off("b")#benutzung einer #ib#Archivdiskette#ie# erfordert nach der Reservierung des Archivs
+das Kommando:
+
+____________________________________________________________________________
+
+gib kommando:
+format (archive)
+
+____________________________________________________________________________
+
+
+Erst nach einer Kontrollabfrage:
+
+____________________________________________________________________________
+
+gib kommando:
+format (archive)
+
+Archiv "diskettenname" formatieren ? (j/n)
+
+____________________________________________________________________________
+
+wird tatsächlich formatiert und die Diskette steht mit dem Namen "diskettenname" für
+Archivoperationen zur Verfügung.
+
+#on("b")#
+ACHTUNG: Wird eine bereits beschriebene Diskette noch einmal formatiert, so sind
+ alle Daten, die auf der Diskette waren, verloren.#off("b")#
+
+
+Bei einigen Rechnern ist es möglich, die Formatierung zu variieren. Falls beim Forma­
+tieren auf einem solchen Rechner ein anderes als das Standardformat erzeugt werden
+soll, so ist die Codierung des gewünschten Formats mitanzugeben.
+
+
+Beispiel: Für ein Gerät mit 5μ Zoll Disketten wäre z.B. einstellbar:
+ code 0 : Standardformat
+ code 1 : 40 Spuren
+ code 2 : 80 Spuren
+ code 3 : High Density
+
+ 'format (archive)' erzeugt ebenso wie 'format (0,archive)' eine standard­
+ formatierte Diskette, 'format (3,archive)' erzeugt eine High Density
+ Formatierung.
+#page#
+Diskette löschen / umbenennen
+#free(1.0)#
+
+
+ Bereits benutzte Disketten können wieder gelöscht und auch umbenannt werden.
+
+
+#free(1.0)#
+
+Falls Sie den Inhalt einer beschriebenen Archivdiskette löschen oder den Namen einer
+Diskette ändern wollen, müssen Sie das Archiv unter dem gewünschten Namen reser­
+vieren: Falls Sie den Inhalt löschen möchten, tun Sie das unter dem bisherigen und
+bestehenden Namen. Falls Sie die Diskette umbenennen wollen, reservieren Sie das
+Archiv unter dem neuen gewünschten Namen. Beachten Sie, daß durch das Umbe­
+nennen eines Archivs alle darauf befindlichen Dateien gelöscht werden. Anschließend
+geben Sie das Kommando:
+
+____________________________________________________________________________
+
+gib kommando:
+#ib#clear#ie# (archive)
+
+____________________________________________________________________________
+
+Durch die Ausführung des Kommandos erhält die eingelegte Diskette den in der
+Reservierung angegebenen Namen. Das Inhaltsverzeichnis, das sich auf der Diskette
+befindet, wird gelöscht. Damit sind die Daten, die sich eventuell auf dieser Diskette
+befanden, nicht mehr auffindbar. Die Diskette entspricht einer neu formatierten Disket­
+te#u#1)#e#. #foot#
+#u#1)#e# Das Kommando 'format' enthält implizit 'clear'.
+#end#
+Eine Neuformatierung ist demnach bei Wiederverwendung der Diskette nicht notwen­
+dig.
+
+#page#
+Inhaltsverzeichnis der Diskette
+#free(1.0)#
+
+
+ Mit 'list (archive)' werden die Dateien auf der Diskette angezeigt.
+
+
+#free(1.0)#
+
+Eine formatierte Diskette kann nach der Archivanmeldung gelesen oder beschrieben
+werden. Um zu sehen, welche Dateien auf der Diskette zu holen (= lesen) sind bzw.
+wieviel Platz zum Beschreiben vorhanden ist, ist es zweckmäßig, zunächst das In­
+haltsverzeichnis der Diskette zu betrachten.
+
+____________________________________________________________________________
+
+gib kommando:
+list (archive)
+
+____________________________________________________________________________
+
+Beispiel:
+
+____________________________________________________________________________
+
+ ............diskettenname (100 K belegt von 720 K)..............
+
+01.05.86 25 K "rechnungen april"
+01.06.86 23 K "rechnungen mai"
+01.07.86 20 K "rechnungen juni"
+01.08.86 32 K "rechnungen juli"
+
+____________________________________________________________________________
+#page#
+Lesen und Schreiben auf Diskette
+#free(1.0)#
+
+
+ Lesen und Schreiben auf der Diskette entspricht den bekannten Operationen zum
+ Senden und Holen von Dateien.
+
+
+
+#free(1.0)#
+Das Schreiben einer Datei auf Diskette entspricht dem Übersenden einer Datei an die
+Vater-Task. Einziger Unterschied ist, daß Sie das Ziel explizit angeben müssen:
+
+____________________________________________________________________________
+
+gib kommando:
+#ib#save#ie# ("dateiname",archive)
+
+____________________________________________________________________________
+
+Entsprechend funktioniert auch das Lesen einer Datei von der Diskette:
+
+____________________________________________________________________________
+
+gib kommando:
+fetch ("dateiname",archive)
+
+____________________________________________________________________________
+
+Wie auch bei der Kommunikation zwischen Sohn- und Vater-Task werden nur
+Kopien der Dateien geholt bzw. geschrieben.
+#page#
+Wechsel der Archivdiskette
+#free(1.0)#
+Bei Einlegen einer anderen Archivdiskette müssen Sie erneut das Kommando
+
+____________________________________________________________________________
+
+gib kommando:
+archive ("diskettenname")
+
+____________________________________________________________________________
+
+geben, da mit der Archivreservierung zugleich die Prüfung von Diskettenname und
+-Inhaltsverzeichnis vorbereitet wird.
+#page#
+Beenden der Archivreservierung
+#free(1.0)#
+
+
+ Nach Benutzung Archiv freigeben!
+
+
+#free(1.0)#
+
+Wenn Sie alle gewünschten Arbeiten mit dem Archiv fertiggestellt haben, geben Sie
+das Archiv wieder frei.
+
+____________________________________________________________________________
+
+gib kommando:
+#ib#release#ie# (archive)
+
+____________________________________________________________________________
+
+Durch dieses Kommando kann die Task 'ARCHIVE' mit ihren Leistungen von einer
+anderen Task in Anspruch genommen werden. Falls Sie dieses Kommando nicht
+gegeben haben aber seit 5 Minuten keine Archivoperation ausgelöst haben, kann eine
+andere Task durch die Anforderung 'archive("diskettenname")' das Archiv reservieren.
+Durch diese Maßnahme wird verhindert, daß ein vergeßlicher Benutzer bei einem
+System mit mehreren Benutzern das Archiv blockiert.
+#page#
+Fehlermeldungen des Archivs
+#free(1.0)#
+
+
+ Bei Archiv-Operationen kann es zu Fehlersituationen kommen.
+
+#free(1.0)#
+
+Versucht man, eine Datei vom Archiv zu holen, kann es vorkommen, daß das Ar­
+chiv-System
+
+____________________________________________________________________________
+
+#ib#Lese-Fehler (Archiv)#ie#
+
+____________________________________________________________________________
+
+meldet und den Lese-Vorgang abbricht. Dies kann auftreten, wenn die Floppy
+beschädigt oder aus anderen Gründen nicht lesbar ist (z.B. nicht justierte Disket­
+ten-Geräte). In einem solchen Fall vermerkt das Archiv-System intern, daß die Datei
+nicht korrekt gelesen werden kann. Das sieht man z.B. bei 'list (archive)'. Dort ist der
+betreffende Datei-Name mit dem Zusatz 'mit Lese-Fehler' gekennzeichnet. Um
+diese Datei trotzdem zu lesen, muß man sie unter ihrem Dateinamen mit dem Zusatz
+'mit Lese-Fehler' lesen.
+
+____________________________________________________________________________
+
+gib kommando:
+fetch ("dateiname mit Lese-Fehler")
+
+____________________________________________________________________________
+
+Die Datei wird in diesem Fall trotz Lese-Fehler (Informationsverlust!) vom Archiv
+gelesen.
+
+Um solche Fälle möglichst zu vermeiden, sieht das EUMEL-System die Möglichkeit
+vor, Archive bzw. Archiv-Dateien nach Beschreiben zu prüfen. Das erfolgt mit dem
+Kommando
+
+____________________________________________________________________________
+
+gib kommando :
+#ib#check#ie# ("dateiname", archive)
+
+____________________________________________________________________________
+
+
+Durch dieses Kommando werden eventuelle Lese-Fehler gemeldet.
+
+Weitere Fehlermeldungen des Archivs:
+
+* Lesen unmöglich (Archiv)
+ Die Archiv-Diskette ist nicht eingelegt oder die Tür des Laufwerks ist nicht ge­
+ schlossen.
+=> Diskette einlegen bzw. Tür schließen.
+
+* Schreiben unmöglich (Archiv)
+ Die Diskette ist schreibgeschützt.
+=> falls wirklich gewünscht, Schreibschutz entfernen.
+
+* Archiv nicht angemeldet
+ Das Archiv wurde nicht angemeldet
+=> 'archive ("name")' geben.
+
+* Lese-Fehler (Archiv)
+ Siehe Lesen unmöglich
+
+* Schreibfehler (Archiv)
+ Die Diskette kann nicht (mehr) beschrieben werden.
+=> Andere Diskette verwenden.
+
+* Speicherengpass
+ Im System ist nicht mehr genügend Platz, um eine Datei vom Archiv zu laden, ggf.
+=> ggf. Dateien löschen.
+
+* RERUN bei Archiv-Zugriff Das System wurde bei einer Archiv-Operation durch
+ Ausschalten bzw. Reset unterbrochen.
+
+* "dateiname" gibt es nicht
+ Die Datei "dateiname" gibt es nicht auf dem Archiv.
+=> mit 'list(archive)' Archiv prüfen.
+
+* Archiv heißt ...
+ Die eingelegte Diskette hat einen anderen als den eingegebenen Archivnamen.
+=> Kommando 'archive' mit korrektem Namen geben.
+
+* Archiv wird von Task ... benutzt
+ Das Archiv wurde von einem anderen Benutzer reserviert.
+=> Abwarten.
+
+* "dateiname" kann nicht geschrieben werden (Archiv voll)
+ Die Datei ist zu groß für die eingelegte Diskette.
+=> Andere Diskette für diese Datei nehmen.
+
+* Archiv inkonsistent
+ Die eingelegte Diskette hat nicht die Struktur einer Archiv-Diskette.
+=> 'format (archive)' vergessen.
+
+* save/erase wegen Lese-Fehler verboten
+ Bei Archiven mit Lese-Fehler sind Schreiboperationen verboten, weil ein Erfolg
+ nicht garantiert werden kann.
+
+
+
+3.5. Kommandos für mehrere Dateien
+#free(1.0)#
+
+
+ Durch Anwendung der besonderen Operatoren 'ALL' und 'SOME' können Sie
+ mehrere Dateien mit einem Kommando behandeln.
+
+
+#free(1.0)#
+Oft ist es sehr zweckmäßig und erleichternd, einen Befehl für eine ganze Reihe von
+Dateien wirken zu lassen, wie z.B. beim Archivieren, wenn Sie etwa alle während des
+Tages veränderten Dateien mit deren neuen Stand auf Diskette schreiben möchten.
+
+Da Tasks einen Namen haben und jede Task ein Inhaltsverzeichnis ihrer Dateien
+führt, ist es möglich, Listen von Dateien zu benennen.
+#page#
+Interne Tasknamen
+#free(1.0)#
+Wenn Sie eine andere als die eigene oder die Vater-Task ansprechen wollen, ist es
+notwendig, den 'internen Tasknamen' anzugeben. Diese auf den ersten Blick etwas
+undurchsichtige Forderung hat folgenden Hintergrund:
+
+Durch die in der Einleitung vorgestellte Baumstruktur des EUMEL-Systems ist es
+ohne besondere Angaben nur möglich, Kommandos zu geben, die die eigene Task
+('edit'..) oder die Vater-Task ('save'..) betreffen. Beim Archivieren zum Beispiel wäre
+es demzufolge erforderlich, eine Datei über den Vater vom Vater vom Vater... an den
+Sohn des Sohnes... zu schicken, damit die Datei endlich in der Task 'ARCHIVE'
+landet. Statt dessen verwenden Sie eine Prozedur 'archive', die den internen Task­
+bezeichner liefert. Damit wird die gewünschte Task intern identifiziert, ohne daß Sie
+sich darum kümmern müssen.
+
+Wichtige Prozeduren, die interne Taskbezeichner liefern, sind:
+
+ myself Bezeichner der eigenen Task
+ public Bezeichner von PUBLIC
+ father Bezeichner der Vater-Task#u##count##e#
+ archive Bezeichner von ARCHIVE
+ printer Bezeichner von PRINTER #foot#
+#u##value##e# Falls kein besonderer Manager eingerichtet wurde, liefern 'father' und 'public'
+ natürlich dieselbe Task: PUBLIC. #end#
+#page#
+Dateiverzeichnisse
+#free(1.0)#
+Jede Task verfügt über ein Verzeichnis der in ihr befindlichen Dateien. Das Verzeich­
+nis Ihrer eigenen Task können Sie mit dem 'list'-Kommando betrachten. Das Ver­
+zeichnis einer anderen Task sehen Sie beispielsweise durch das Kommando 'list
+(archive)'. In diesem Fall müssen Sie dem eigentlichen Kommando den internen
+Taskbezeichner der gewünschten Task hinzugeben, um das Verzeichnis zu sehen.
+
+Um ein Verzeichnis in Verbindung mit anderen Kommandos benutzen zu können, gibt
+es besondere Operatoren:
+
+ #ib#ALL#ie# liefert das gesamte Verzeichnis
+ #ib#SOME#ie# bietet das Verzeichnis zur Auswahl von Einträgen an.
+
+
+In Verbindung mit einem internen Taskbezeichner wird einer der beiden Operatoren
+einem Monitor-Kommando als Parameter nachgestellt. Das Kommando wirkt dann
+nacheinander auf alle im Verzeichnis enthaltenen Dateien.
+
+
+____________________________________________________________________________
+
+gib kommando:
+fetch (ALL father)
+
+____________________________________________________________________________
+
+Alle Dateien der Vater-Task werden nacheinander geholt, bei Namensgleichheit
+erfolgt die bekannte Kontrollfrage, ob die gleichnamige Datei in der eigenen Task
+überschrieben werden soll.
+
+Falls nur einige Dateien des Verzeichnisses bearbeitet werden sollen, wird der Opera­
+tor 'SOME' dem Taskbezeichner vorangestellt:
+
+____________________________________________________________________________
+
+gib kommando:
+fetch (SOME father)
+
+____________________________________________________________________________
+
+
+Hier wird zunächst das Dateiverzeichnis der Task angeboten. Streichen Sie alle
+Dateien, die auf der Diskette sind, aber nicht in Ihre Task geholt werden sollen, aus
+dem Verzeichnis, indem Sie
+
+- den Dateinamen mit Blanks überschreiben
+
+ oder:
+
+- die Zeile mit <HOP> <RUBOUT> löschen
+
+ oder:
+
+- mehrere Zeilen markieren, indem Sie zu Beginn des zu markierenden Bereichs
+ 'mark' betätigen und mit Hilfe der Cursor-Tasten den Beereich so weit wie benö­
+ tigt ausdehnen. Im Anschluß daran können Sie diese Zeilen durch
+
+ <ESC> <RUBOUT> oder
+
+ <ESC> <p>
+
+ löschen.
+
+
+____________________________________________________________________________
+
+ .............................. .......................... #markoff#
+rechnungen april
+rechnungen mai
+rechnungen juni
+rechnungen juli
+
+
+
+____________________________________________________________________________
+
+
+
+In obigem Beispiel werden nach dem Kommando 'ESC RUBOUT' (=Löschen der
+markierten Zeilen) und dem Kommando 'ESC q' (=editieren beenden) die Dateien
+'rechnungen juni' und 'rechnungen juli' vom Archiv geholt.
+
+Als weitere Vereinfachung gibt es die Prozedur 'all' als Abkürzung für 'ALL myself'.
+
+Beispiel: alle Dateien auf Archivdiskette schreiben.
+
+____________________________________________________________________________
+
+gib kommando:
+save (all,archive)
+
+____________________________________________________________________________
+
+
+Für Fortgeschrittene:
+
+Sie können auch aus den Verzeichnissen mehrerer Tasks ein neues Verzeichnis
+bilden. Zu diesem Zweck sind folgende Mengenoperationen auf Verzeichnisse mög­
+lich:
+
+ #ib#-#ie# Differenzmenge
+ #ib#+#ie# Vereinigungsmenge
+ #ib#/#ie# Schnittmenge
+
+Beispiel:
+
+ fetch (ALL father - ALL myself)
+
+Alle Dateien der Vater-Task, die noch nicht in der eigenen Task sind, werden geholt.
+
+3.7. Passwortschutz
+#free(1.0)#
+
+
+ Das EUMEL- System ermöglicht Passwortschutz für Dateien, einzelne Tasks und
+ ganze Zweige des Taskbaumes.
+
+#free(1.0)#
+
+Falls Sie sicherstellen wollen (oder müssen), daß Teile Ihres EUMEL-Systems vor
+unberechtigter Benutzung geschützt sind, können Sie den Zugriff mit einem Passwort
+regeln.
+
+Als Passwort können Sie jeden beliebigen Text nehmen. Bedenken Sie jedoch, daß
+ein wirklich wirksamer Schutz nur dann gewährleistet ist, wenn Sie weder ein triviales
+Passwort (etwa den eigenen Vornamen) auswählen, noch eines, das Sie selbst nicht
+behalten. #u##count("1")#)#e# #foot#
+#u##value("1")#)#e# Man darf Passwörter nicht vergessen! Durch Passwörter geschützte Tasks kann
+niemand - außer durch die Angabe des korrekten Passworts - wieder ankoppeln.
+Hat man das Passwort vergessen, kann man nur noch die Task löschen.
+#end#
+
+ACHTUNG: Es gibt ein besonderes Passwort im EUMEL-System: "-". Dieses
+ Passwort verhindert, daß die Task in der es gegeben wurde (z.B. UR), an
+ ein Terminal geholt wird, es darf folglich nicht für normale
+ Manager-Tasks gegeben werden.
+#page#
+Eine Task mit Passwort schützen
+#free(1.0)#
+Das Monitor-Kommando '#ib#task password#ie#' sorgt dafür, daß eine Task fortan nur wieder
+mit einem 'continue'-Kommando 'betreten' werden kann, wenn man vorher das
+richtige Passwort angibt.
+
+____________________________________________________________________________
+
+gib kommando:
+task password ("rosebud")
+
+____________________________________________________________________________
+
+Versucht nun ein Benutzer, die mit dem Passwort geschützte Task mit dem 'conti­
+nue'-Kommando an sein Terminal anzukoppeln, wird er zunächst nach dem #ib#Pass­
+wort#ie# gefragt. Nur unter Angabe des Passworts wird die Task angekoppelt.
+
+Bei der Beantwortung des Passworts werden statt der eingegebenen Zeichen Punkte
+auf den Bildschirm geschrieben. Durch Betätigen von ESC können die getippten
+Zeichen lesbar gemacht werden.
+
+____________________________________________________________________________
+
+ gib supervisor kommando:
+ continue("taskname")
+ Passwort: .......
+
+
+____________________________________________________________________________
+
+
+Der Passwortschutz gewährleistet, daß kein unberechtigter Benutzer direkt an die
+Dateien und Programme der Task gelangen kann. Es gibt jedoch noch zwei Situatio­
+nen, die einen unberechtigten Zugang zu Dateien erlauben:
+
+a) Dateien in die Vater-Task schicken:
+ Transportiert man Dateien in die Vater-Task ('save'-Kommando) können Benut­
+ zer auf diese Dateien zugreifen (sofern sie Zugang zu dieser Task haben). Dies
+ kann man verhindern, indem man ein Datei-Passwort angibt. Man beachte, daß
+ das Passwort für Dateien und das oben beschriebene Passwort für Tasks nichts
+ miteinander zu tun haben.
+
+b) Dateien werden in eine Sohn-Task geholt:
+ Ist die Task als Vater-Task eingerichtet ('global manager'-Kommando), dann ist
+ es möglich, von der Sohn-Task Dateien ('fetch'-Kommando) aus der Vater-
+ Task zu holen, die mit einem Passwort geschützt ist. Darum muß man verhindern,
+ daß unberechtigte Benutzer Söhne einer mit Passwort geschützten Task einrich­
+ ten können. Das kann man mit dem Kommando
+
+____________________________________________________________________________
+
+maintenance :
+#ib#begin password#ie# ("geheim")
+
+____________________________________________________________________________
+
+
+ Wird dieses Kommando gegeben, wird man bei dem Versuch, eine Sohn-Task
+ einzurichten, nach einem Passwort gefragt. Beachten Sie, daß das 'begin pass­
+ word' nichts mit dem Task-Passwort und Datei-Passwort zu tun hat.
+
+
+Man kann einen ganzen Zweig eines EUMEL-Systems durch das Kommando 'family
+password' vor unberechtigtem Zugriff schützen. Das Kommando:
+
+____________________________________________________________________________
+
+maintenance:
+family password ("geheim")
+
+____________________________________________________________________________
+
+wird dazu (wie gewohnt als Monitor-Kommando) in der Vater-Task des zu schüt­
+zenden Zweigs des Taskbaumes gegeben. Damit ist das Passwort aller Söhne, Enkel
+usw. dieser Task auf 'geheim' gesetzt, falls sie vorher kein Passwort oder das gleiche
+Passwort wie die aufrufende Task haben. Eine Task in diesem Zweig, die bereits ein
+eigenes, vom 'family password' verschiedenes Passwort besitzt, behält dieses eigene
+Passwort.
+
+Bsp: Für 'PUBLIC' wird das Kommando '#ib#family password#ie# ("geheim")' gege­
+ ben. Dann ist das Passwort von 'PUBLIC' und aller Tasks des Benutzerzweiges
+ auf 'geheim' gesetzt.
+
+
+Es ist zu beachten, daß bei der Vergabe des 'family password' nur die aktuellen
+Söhne der Task berücksichtigt werden. Söhne, die nach der Vergabe des 'family
+password' eingerichtet werden, sind nicht durch dieses Passwort geschützt.
+
+Passwort löschen
+
+
+Um ein Passwort zu löschen, geben Sie das Passwort-Kommando mit "" als Para­
+meter:
+
+____________________________________________________________________________
+
+maintenance:
+begin password("")
+
+____________________________________________________________________________
+
+
+Durch diese Angabe haben Sie den Passwort einen leeren Text als Parameter gege­
+ben, der das bisherige Passwort 'überschreibt'.
+
+#page#
+Dateipasswort
+
+
+Etwas komplizierter gestaltet sich der Passwortschutz für einzelne Dateien einer
+Manager-Task, da in dieser Anwendung eine Unterscheidung nach Schreib- und
+Leseschutz vorgenommen wird.
+
+Da in dieser Anwendung nur einige Dateien der Vater-Task vor Lesen ('fetch'),
+Schreiben ('save','erase') oder beidem geschützt werden sollen, benötigt diese Proze­
+dur Angaben über Dateinamen, Schreibpasswort und Lesepasswort.
+
+____________________________________________________________________________
+
+maintenance :
+enter password ("dateiname","schreibschutz","leseschutz")
+
+____________________________________________________________________________
+
+Falls die Datei nicht gegen Lesen geschützt werden soll, wird (wie beim Löschen
+eines Passworts) '""' als Lesepasswort angegeben.
+
+Falls Schreiben und/oder Lesen für eine Datei gänzlich verboten#u#1)#e# sein soll, so ist
+"-" als entsprechendes Passwort anzugeben.
+#foot#
+1) Natürlich kann die Datei in der Manager-Task, der sie gehört, normal editiert
+ werden.
+#end#
+
+Um von einer Sohn-Task eine Datei mit Passwortschutz in der Vater-Task zu lesen
+oder zu schreiben muß vor dem 'fetch', 'save' oder 'erase' Kommando das 'enter
+password' Kommando eineggeben werden:
+
+____________________________________________________________________________
+
+gib kommando:
+enter password ("schreibpasswort/lesepasswort")
+
+____________________________________________________________________________
+
+In der Sohn-Task wird also nur ein Passwort eingegeben. Falls wie oben ein '/' in
+diesem Passwort enthalten ist, wird der erste Teil vor dem '/' als Schreibpasswort und
+der zweite Teil als Lesepasswort geprüft. Falls kein '/' in dem Passwort enthalten ist,
+wird das Wort sowohl als Schreib- als auch als Lesepasswort interpretiert.
+
+Beispiel:
+In einer Manager-Task wird eine Datei "texte" eingerichtet, die Textvorlagen enthält.
+In einigen Sohn-Tasks soll diese Datei geholt (= gelesen) werden können. Die
+bearbeitete, somit veränderte Datei darf aber nicht zurück in die Vater-Task ge­
+schrieben werden.
+
+In der Vater-Task: enter password ("texte","-","psw")
+
+
+In der Sohn-Task : enter password ("psw")
+
+
+Falls das Passwort in einer Sohn-Task fehlerhaft oder gar nicht eingegeben wurde,
+erscheint die Meldung :
+
+____________________________________________________________________________
+
+ gib kommando :
+ fetch ("geschützte datei")
+FEHLER : Passwort falsch
+
+____________________________________________________________________________
+
+
+Somit kann diese Datei nur von Benutzern, die das Lesepasswort kennen, geholt
+werden. Ein Überschreiben der Datei ist nicht möglich, da das Schreibpasswort nicht
+gegeben werden kann ("-" !).
+#page#
+3.8. Monitor-Kommandos
+#free(1.0)#
+ALL
+ THESAURUS OP ALL (TASK CONST task)
+ Liefert einen Thesaurus#u#1)#e#, der alle Dateinamen der angegebenen Task enthält
+ (auch der Benutzer-Task 'myself').
+#foot#
+1) Ein Thesaurus ist eine Liste, in diesem Zusammenhang eine Liste von Dateien.
+ (Siehe auch 2.4. Die ELAN-Notation
+#end#
+ fetch (ALL father)
+
+ THESAURUS OP ALL (TEXT CONST datei)
+ Liefert einen Thesaurus, der die in 'datei' vorhandenen Dateinamen (jede Zeile ein
+ Name) enthält.
+
+ fetch (ALL "dateiliste")
+
+archive
+ PROC archive (TEXT CONST archivname)
+ Anmeldung von Archiv-Operationen. 'archivname' wird zur Überprüfung für alle
+ folgenden Archiv-Operationen verwandt, um die unberechtigte Benutzung eines
+ Archivs zu verhindern. Die Anmeldung wird abgelehnt, wenn ein anderer Nutzer
+ das Archiv belegt hat.
+
+
+ archive ("textdiskette")
+
+
+ TASK PROC archive
+ Liefert den internen Task-Bezeichner für die Verwendung in Dateikommandos.
+
+
+ save ("dateiname", archive)
+
+
+
+begin password
+ PROC begin password (TEXT CONST geheim)
+ Verhindert das unberechtigte Einrichten einer Sohn-Task.
+
+
+ begin password("gmd")
+
+
+break
+ PROC break
+ Die zum Terminal aktuell zugeordnete Task wird abgekoppelt. Sie wird damit zu
+ einer Hintergrund-Task.
+
+
+brother
+ TASK PROC brother (TASK CONST task)
+ Liefert den internen Task-Bezeichner der angegebenen "Bruder"-Task.
+
+
+ list(brother)
+
+
+check
+ PROC check (TEXT CONST dateiname, TASK CONST task)
+ Überprüft, ob die Datei 'dateiname' auf dem Archiv lesbar ist.
+
+
+ check ("meine datei", archive)
+
+
+ PROC check (THESAURUS CONST t, TASK CONST task)
+ Überprüft, ob die in dem Thesaurus 't' enthaltenen Dateien auf dem Archiv lesbar
+ sind.
+
+
+ check (ALL archive, archive)
+
+
+
+clear
+ PROC clear (TASK CONST task)
+ Löscht alle Dateien der Task 'ARCHIVE'und benennt die Diskette um, falls ein
+ anderer als der bisherige Diskettenname bei der Reservierung angegeben wurde.
+
+
+ archive("disk1"); clear(archive)
+
+
+copy
+ PROC copy (TEXT CONST quelle, ziel)
+ Kopiert die Datei 'quelle' in eine neue Datei mit dem Namen 'ziel' in der
+ Benutzer-Task.
+
+
+ copy("datei","neue datei")
+
+ Fehlerfälle: "ziel" existiert bereits
+ "quelle" gibt es nicht
+ zu viele Dateien
+
+
+edit
+ PROC edit
+ a) Im Monitor:
+ Ruft den Editor mit den zuletzt verwandten Dateinamen auf.
+ b) Im Editor:
+ Der Dateiname wird erfragt.
+ Für jedes 'edit' gilt:
+ Wurde 'edit' zum ersten Mal aufgerufen, nimmt das Fenster den gesamten
+ Bildschirm ein. Bei erneutem 'edit'-Aufruf wird ein Fenster nach rechts unten ab
+ der aktuellen Cursor-Position eröffnet.
+
+ PROC edit (TEXT CONST dateiname)
+ Ruft den Editor mit 'dateiname' auf.
+
+
+ edit("handbuch teil3")
+
+
+
+ PROC edit (TEXT CONST dateiname, x, y, xbreite, yhöhe)
+ Wie obiger 'edit'-Aufruf, jedoch kann das Fenster, in dem 'dateiname' editierbar
+ ist, gesetzt werden. Die Parameter definieren ein Editor-Fenster mit der linken
+ oberen Ecke auf den Bildschirmkoordinaten 'x' und 'y' und einer Zeilenbreite
+ 'xbreite' und 'yhöhe' Zeilen. Wird der Editor mit 'edit ("dateiname")' aufgerufen,
+ wird implizit 'edit ("dateiname", 1, 1, 79, 24)' aufgerufen.
+
+
+ edit("notiz",5,5,44,12)
+
+
+ PROC edit (THESAURUS CONST t)
+ Editieren aller in dem Thesaurus 't' enthaltenen Dateien nacheinander.
+
+
+ edit (ALL father)
+
+
+
+end
+ PROC end
+ Die zum Terminal aktuell gehörende Task wird abgebrochen und gelöscht.
+
+enter password
+ PROC enter password (TEXT CONST datei, schreibpass, lesepass)
+ Die angegebene Datei wird mit Schreib- und Lesepassword versehen. Die
+ Passwörter werden in der eigenen Task nicht berücksichtigt.
+ Falls der Schutz total sein soll, so ist für die verbotene Operation "-" als
+ Passwort anzugeben.
+
+
+ enter password ("daten","sicher","heit")
+
+
+ PROC enter password (TEXT CONST password)
+ Gibt Schreib- und Lesepasswort für den Austausch mit Manager-Task an. Falls
+ zwei verschiedene Passwörter für Lesen und Schreiben vereinbart sind, so sind
+ sie als ein Text durch "/" getrennt einzugeben.
+
+
+ enter password ("lese/schreibpasswort")
+
+
+erase
+ PROC erase (TEXT CONST datei)
+ Löscht eine Datei mit dem Namen 'name' in der unmittelbaren Vater-Task.
+
+
+ erase("alte datei")
+
+
+ Fehlerfälle:
+ "datei" gibt es nicht
+ Passwort falsch
+
+ PROC erase (TEXT CONST name, TASK CONST manager)
+ Löscht eine Datei mit dem Namen 'name' in der Task 'manager'.
+
+
+ erase ("dateiname", father)
+
+
+ PROC erase (THESAURUS CONST thesaurus)
+ Löscht die im 'thesaurus' angegebenen Dateien in der Vater-Task.
+
+
+ erase (ALL myself)
+ (* löscht alle Dateien in der Vater-Task, die in der
+ Benutzer-Task vorhanden sind *)
+
+
+ PROC erase (THESAURUS CONST thesaurus, TASK CONST manager)
+
+
+ erase (all,father)
+ (* löscht alle Dateien in der Vater-Task, die in der
+ Benutzer-Task vorhanden sind *)
+
+
+
+father
+ TASK PROC father
+ Liefert den internen Task-Bezeichner der Vater-Task der Benutzer-Task.
+
+
+ list(father)
+
+
+ TASK PROC father (TASK CONST task)
+ Liefert den internen Task-Bezeichner von 'task'.
+
+
+ save ("dateiname", father (father))
+ (* Kopiert 'dateiname' zum "Großvater" *)
+
+
+
+fetch
+ PROC fetch (TEXT CONST name)
+ Kopieren einer Datei von der Vater-Task in die Benutzer-Task
+
+
+ fetch("sicherungskopie")
+
+ Fehlerfälle:
+ "datei" gibt es nicht
+ Passwort falsch
+ zu viele Dateien
+
+
+ PROC fetch (TEXT CONST name, TASK CONST manager)
+ Kopieren einer Datei in die Benutzer-Task von 'manager'.
+
+
+ fetch ("dateiname", /"global")
+
+
+ PROC fetch (THESAURUS CONST thesaurus)
+ Holt alle im 'thesaurus' enthaltenen Dateien von der Vater-Task.
+
+
+ fetch (ALL)
+
+
+ PROC fetch (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: Holt alle im 'thesaurus' enthaltenen Dateien von der 'manager'-Task.
+
+
+ fetch (ALL /"global", /"global")
+
+
+forget
+ PROC forget (TEXT CONST datei)
+ Löschen einer Datei mit dem Namen 'name' in der Benutzer-Task.
+
+
+ forget ("alte datei")
+
+ Fehlerfälle:
+ "datei" gibt es nicht
+
+ PROC forget (THESAURUS CONST thesaurus)
+ Löscht die im 'thesaurus' enthaltenen Dateien in der Benutzer-Task.
+
+
+ forget (SOME myself)
+
+
+format
+ PROC format (THESAURUS CONST thes)
+ Formatieren von Disketten und Einstellen des Namens.
+
+
+ format(archive)
+
+
+ PROC format (INT CONST art, THESAURUS CONST thes)
+ Formatieren von Disketten im Nichtstandardformat des benutzten Geräts
+
+
+ format(2,archive)
+
+
+global manager
+ PROC global manager
+ Durch den Aufruf der Prozedur wird die Benutzer-Task zu einem Datei-
+ Manager. Danach können Söhne dieser Task eingerichtet werden.
+
+
+list
+ PROC list
+ Listet alle Dateien der Benutzer-Task mit Namen und Datum des letzten Zugriffs
+ auf dem Terminal auf.
+
+ PROC list (TASK CONST task)
+ Listet alle Dateien der angegebenen 'task' mit Namen und Datum der letzten
+ Änderung auf dem Terminal auf.
+
+
+ list (father)
+
+
+
+myself
+ TASK PROC myself
+ Liefert den internen Task-Bezeichner der Benutzer-Task.
+
+
+ save (ALL myself, father)
+
+
+
+public
+ TASK PROC public
+ Liefert den internen Task-Bezeichner von "PUBLIC".
+
+
+ fetch ("dateiname", public)
+
+
+
+rename
+ PROC rename (TEXT CONST altername,neuername)
+ Umbenennen einer Datei von 'altername' in 'neuername'.
+
+
+ rename("altes handbuch","neues handbuch")
+
+
+save
+ PROC save (TEXT CONST dateiname)
+ Datei 'dateiname' wird an die unmittelbare Vater-Task übertragen.
+
+
+ save("neues handbuch")
+
+
+ Fehlerfälle:
+ "neues handbuch" gibt es nicht
+ zu viele Dateien
+ Passwort falsch
+
+ PROC save (TEXT CONST name, TASK CONST task)
+ Datei mit dem Namen 'name' in Task 'task' kopieren
+
+
+ save ("dateiname", /"global")
+
+
+ Fehlerfälle:
+ "dateiname" gibt es nicht
+ zu viele Dateien
+ Passwort falsch
+
+ PROC save (THESAURUS CONST thesaurus)
+ Kopiert die Dateien, die in 'thesaurus' enthalten sind, in die Vater-Task.
+
+
+ save (SOME myself)
+
+
+ PROC save (THESAURUS CONST thesaurus, TASK CONST manager)
+ Kopiert die Dateien, die in 'thesaurus' enthalten sind, in Task 'manager'.
+
+
+ save(SOME myself, /"global")
+
+
+SOME
+ THESAURUS OP SOME (THESAURUS CONST thesaurus)
+ Bietet den angegebenen 'thesaurus' zum Editieren an. Dabei können nicht
+ erwünschte Namen gestrichen werden.
+
+ THESAURUS OP SOME (TASK CONST task)
+ Bietet einen THESAURUS von 'task' zum Editieren an.
+
+ THESAURUS OP SOME (TEXT CONST dateiname)
+ Bietet einen 'thesaurus', der aus 'dateiname' gebildet wird, zum Editieren an.
+
+
+task
+ TASK PROC task (TEXT CONST task name)
+ Liefert den internen Task-Bezeichner von 'task name'.
+
+
+ save ("dateiname", task ("PUBLIC"))
+ = save ("dateiname", public)
+
+
+
+storage info
+ PROC storage info
+ Informationsprozedur über den belegten Hintergrund-Speicher.
+
+
+task info
+ PROC task info
+ Informiert über alle Tasknamen im System unter gleichzeitiger Angabe der
+ Vater/Sohn-Beziehungen (Angabe durch Einrückungen).
+
+ PROC task info (INT CONST art)
+ Informiert über alle Tasks im System. Mit 'art' kann man die Art der Zusatz-
+ Information auswählen. Für 'art' sind zur Zeit folgende Werte zugelassen:
+
+ art=1: entspricht 'task info' ohne Parameter, d.h. es gibt nur die Tasknamen
+ unter Angabe der Vater/Sohn-Beziehungen aus.
+
+ art=2: gibt die Tasknamen aus. Zusätzlich erhalten Sie Informationen über die
+ verbrauchte CPU-Zeit der Task, die Priorität, den Kanal, an dem die
+ Task angekoppelt ist, und den eigentlichen Taskstatus. Hierbei bedeuten:
+
+ 0 -busy- Task ist aktiv.
+ 1 i/o Task wartet auf Beendigung des Outputs oder auf
+ Eingabe.
+ 2 wait Task wartet auf Sendung von einer anderen Task.
+ 4 busy-blocked Task ist rechenwillig, aber blockiert.
+ 5 i/o -blocked Task wartet auf I/O, ist aber blockiert.
+ 6 wait-blocked Task wartet auf Sendung, ist aber blockiert.
+ Achtung: Die Task wird beim Eintreffen einer
+ Sendung automatisch entblockiert.
+
+ art=3: wie 2, aber zusätzlich wird der belegte Speicher angezeigt. (Achtung:
+ Prozedur ist zeitaufwendig!).
+
+
+ task info(2)
+
+
+task status
+ PROC task status
+ Informationsprozedur über den Zustand der eigenen Task. Informiert u.a. über
+ - Name der Task, Datum und Uhrzeit;
+ - verbrauchte CPU-Zeit;
+ - belegten Speicherplatz;
+ - Kanal, an den die Task angekoppelt ist;
+ - Zustand der Task (rechnend u.a.m.);
+ - Priorität.
+
+ PROC task status (TASK CONST t)
+ Wie obige Prozedur, aber über die Task mit dem internen Tasknamen 't'.
+
+
+ task status (father)
+
+
+
+task password
+ PROC task password (TEXT CONST geheim)
+ Einstellen eines Passworts für Benutzertask. Das Kommando 'task password' ist
+ ein Monitor-Kommando. Ist eine Task mit einem Paßwort geschützt, so wird
+ durch den Supervisor nach dem 'continue'-Kommando das Passwort angefragt.
+ Nur nach Eingabe des richtigen Passworts gelangt man in die gewünschte Task.
+ Das Passwort kann durch nochmaligen Aufruf von 'task password' geändert
+ werden, z.B. wenn es in regelmäßigen Abständen geändert werden muß, um
+ personenbezogene Daten zu schützen.
+
+ Es gibt keine Möglichkeit, ein einmal eingestelltes Passwort in Erfahrung zu
+ bringen. Sollte das Passwort vergessen werden, kann somit die Task nur noch
+ gelöscht werden.
+
+ Wird als Passwort ein '-'-Zeichen eingegeben, so wird verhindert, daß die
+ betreffende Task jemals wieder mit dem 'continue'-Kommando angekoppelt
+ werden kann. Dies ist z.B. für Manager-Tasks sinnvoll.
+
+
+ task password("mein geheimnis")
+
+
++
+ THESAURUS OP + (THESAURUS CONST links, rechts)
+ Vereinigungsmenge von 'links' und 'rechts'.
+
+ THESAURUS OP + (THESAURUS VAR thes, TEXT CONST name)
+ Nimmt den TEXT 'name' in den Thesaurus 'thes' auf.
+
+
+ save (SOME father + "rechnung", archive)
+
+
+
+-
+ THESAURUS OP - (THESAURUS CONST links, rechts)
+ Differenzmenge von 'links' und 'rechts'.
+
+ THESAURUS OP - (THESAURUS VAR thes, TEXT CONST name)
+ Liefert einen Thesaurus aus 'thes', aber ohne den Eintrag 'name'.
+
+
+ save (ALL myself - "rechnung", archive)
+
+
+
+/
+ THESAURUS OP / (THESAURUS CONST links, rechts)
+ Zweck: Schnittmenge von 'links' und 'rechts'.
+
+
+ save(ALL myself / ALL father, archive)
+
+
+ TASK OP / (TEXT CONST task name)
+ Liefert aus einem Tasknamen den internen Tasknamen. '/' kann überall dort
+ eingesetzt werden, wo ein interner Taskname verlangt wird.
+
+
+ fetch ("dateiname", /"global")
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.4 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.4
new file mode 100644
index 0000000..c13a091
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.4
@@ -0,0 +1,2242 @@
+#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 4: Der Editor
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+4 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 4 - %
+#tableend##clearpos#
+#end#
+TEIL 4: Der Editor
+#free(1.0)#
+
+4.0. Vorwort
+
+#free(1.0)#
+Mit dem #ib#EUMEL-Editor#ie# schreiben Sie alle Ihre Texte und Daten. Er bietet vielfäl­
+tige Möglichkeiten, um Autoren oder Programmierer bei dem Erstellen, Korrigieren und
+Gestalten von Manuskripten oder Programmen zu unterstützen. Die größte Hilfe beim
+Schreiben besteht (durch die Speicherfähigkeit von Computern) im beliebig häufigen
+Zugriff auf einmal geschriebene Informationen. Im Gegensatz zu einer Schreibmaschi­
+ne können Sie mit dem EUMEL-Editor (beliebig oft) Einfügungen vornehmen, Texte
+korrigieren, löschen und neu gestalten.
+
+Somit ist das Schreiben von Texten mittels des EUMEL-Systems besonders dann
+vorteilhaft und zeitsparend, wenn Texte häufig geändert werden oder wenn sie in
+einer besonders schönen Form gedruckt werden sollen. Weiterhin bietet der Editor
+Hilfen zum Schreiben an, wie z.B. automatischen Wortumbruch am Zeilenende, eine
+Einrückungsautomatik, "Lernen" von Texten u.a.m. Zusätzlich kann der Editor in
+seinen Fähigkeiten erweitert und somit für spezielle Schreibarbeiten angepaßt werden.
+Aber das soll in einem späteren Kapitel beschrieben werden.
+
+Bei der Entwicklung des Editors wurde besonderer Wert auf einfache Bedienung
+gelegt: innerhalb von wenigen Minuten können Sie schon Texte schreiben und Daten
+erfassen und sehen stets auf dem Bildschirm, was mit Ihrem Text passiert. Das
+Schreiben und Korrigieren werden durch einige wenige, aber leistungsstarke Funk­
+tionstasten unterstützt.
+
+Einige Gestaltungsmöglichkeiten für Texte kann man nicht direkt auf dem Terminal
+"sehen", wie z.B. Proportionalschriften, Fettdruck usw. Solche Leistungen können
+durch Anweisungen an die Textkosmetik-Programme und den EUMEL-Drucker
+angefordert werden. Diese Anweisungen müssen in den Text eingefügt werden. Lesen
+Sie hierzu Teil 5 ("Textkosmetik").
+#free(1.0)#
+
+#ib(9)#4.1. #ib#Ein- und Ausschalten des Editors#ie##ie(9)#
+
+#free("1.0")#
+ #on("i")#
+ Hier beschreiben wir, wie der Editor ein- und ausgeschaltet wird und wie der
+ Editor eine Datei einrichtet.
+
+ #off("i")##free(1.0)#
+Wenn in Ihrer Task auf dem Bildschirm die Aufforderung
+
+____________________________________________________________________________
+
+gib kommando :
+
+____________________________________________________________________________
+
+
+erscheint, tippen Sie
+
+____________________________________________________________________________
+
+#ib#edit#ie# ("dateiname")
+
+____________________________________________________________________________
+
+
+und der EUMEL-Editor wird eingeschaltet. Ist die Datei noch nicht vorhanden, d.h.
+kein Text unter dem angegebenen Namen im System gespeichert, folgt eine Anfrage,
+ob eine Datei unter dem eingegebenen Namen neu eingerichtet werden soll:
+
+____________________________________________________________________________
+
+"dateiname" neu einrichten (j/n) ?
+
+____________________________________________________________________________
+
+
+Dies dient zur Kontrolle von Schreibfehlern, die besonders bei ähnlichen Dateina­
+men auftreten. Man kann dann das Einrichten der Datei ablehnen, den Dateinamen
+verbessern und das Kommando erneut geben.
+
+Falls Sie die Datei neu anlegen wollen, bejahen Sie diese Frage mit
+
+#center##taste1(" j ")# #taste1(" J ")# #taste1(" y ")# oder #taste1(" Y ")#
+
+
+Es erscheint ein leerer Editorbildschirm. Die oberste Zeile des Bildschirms ist die
+#ib#Titelzeile#ie#. In ihr kann nicht geschrieben werden. Sie zeigt jedoch verschiedene
+nützliche Dinge an: den Namen der Datei, die Nummer der aktuellen Zeile, in der
+gerade geschrieben wird, Tabulatormarken, Einfügemodus, Lernmodus, Auftrennung
+usw.
+
+____________________________________________________________________________
+
+ ................. dateiname ...................... Zeile 1
+_
+
+
+____________________________________________________________________________
+
+
+In unserem Fall haben Sie eine neue Datei angelegt. Sie enthält noch keinen Text. In
+der Titelzeile sind jedoch schon der Name der Datei und die aktuelle Zeilennummer
+eingetragen. Bei einer neuen Datei ist der Bildschirm unterhalb der Titelzeile leer.
+Dieser Teil dient als "Schreibfläche". Der #ib#Cursor#ie# steht dann direkt unter der Titelzei­
+le. Er zeigt immer die aktuelle #ib# Schreibposition#ie# an. Jetzt kann sofort mit dem Schrei­
+ben begonnen werden, ganz wie mit einer normalen Schreibmaschine.
+
+Rufen Sie eine Datei auf, in die Sie schon Text geschrieben haben, zeigt Ihnen der
+Editor das zuletzt bearbeitete Textstück und Sie können normal weiter schreiben.
+
+Wollen Sie die #ib#Schreibarbeit beenden#ie# und den #ib#Editor ausschalten#ie#, so drücken Sie die
+beiden Tasten
+
+<ESC> <q>
+
+nacheinander. Es erscheint
+
+____________________________________________________________________________
+
+gib kommando:
+
+____________________________________________________________________________
+
+
+und Sie haben damit den #ib#Editor verlassen#ie# und befinden sich wieder im Monitor. #page#
+
+#ib(9)#4.2. Die wichtigsten Tasten des Editors#ie(9)#
+#free(1.0)#
+#ib(9)#4.2.1. Das #ib#Tastenfeld#ie##ie(9)#
+
+#free(1.0)#
+ #on("i")#
+ Auf dem Tastenfeld gibt es einige Tasten, die auf einer Schreibmaschine nicht vor­
+ handen sind.
+
+ #off("i")#
+#free(1.0)#
+Das Tastenfeld eines EUMEL-Terminals entspricht weitgehend dem einer Schreib­
+maschine. Sie finden also die Buchstaben a-z und die Ziffern 0-9 auf Tasten. Mit
+der #ib#SHIFT-Taste#ie# (Umschalttaste) und gleichzeitigem Drücken einer anderen Taste
+können Sie die großen Buchstaben und eine Reihe von speziellen anderen Zeichen,
+die #ib#Sonderzeichen#ie# genannt werden, schreiben. Die "Zwischenraumtaste" oder Leer­
+taste erzeugt immer ein Leerzeichen.
+
+Nun gibt es in der Praxis zwei unterschiedliche Tastaturen. Zum einen existiert die
+#ib#EDV-Tastatur#ie#, die zum Schreiben von Programmen benutzt wird. Sie erkennt man
+daran, daß keine #ib#Umlaute#ie# (ä, ö, ü) und kein ß auf den Tasten abgebildet sind. Dafür
+gibt es Tasten für eckige und geschweifte Klammern. Sollen auf einer solchen Tasta­
+tur die Umlaute geschrieben werden, muß man sich eines Tricks bedienen: mit der
+Taste ESC und nachfolgendem Betätigen einer anderen Taste (z.B. a, o, u) erhalten
+wir den entsprechenden Umlaut.
+
+In der Regel kann man die Umlaute auf dem Bildschirm eines solchen EDV-Ter­
+minals nicht sehen, sondern sie erscheinen als "a", "u", usw. Beim Druck eines
+Textes werden sie aber richtig dargestellt.
+
+Die andere Tastatur entspricht in der #ib#Tastenbelegung#ie# weitgehend einer deutschen
+Schreibmaschine und besitzt Tasten für die Umlaute und ß. Sollen vorwiegend deut­
+sche Texte geschrieben werden, empfiehlt es sich, solch ein Terminal zu verwenden.
+
+
+
+ Tastatur
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Neben diesen "einfachen" Tasten gibt es die Funktionstasten, die zur Bedienung des
+Editors (aber auch anderer Programme) notwendig sind. Wo die Tasten auf Ihrem
+Gerät liegen, hängt von dem jeweiligen Gerätetyp ab. Die Wirkung der Tasten
+erklären wir in den anschließenden Abschnitten. #count("1")#) #foot#
+#value("1")#) Es kann sein, daß die Tasten nicht richtig beschriftet sind. Die Installations­
+ anleitung muß dann die Entsprechungen beschreiben. Zusätzlich zu den im
+ folgenden beschriebenen können sich noch weitere Tasten auf Ihrem Terminal
+ befinden, die aber standardmäßig keine besondere Bedeutung für den Editor
+ haben.
+#end#
+#page#
+Die Funktionstasten des EUMEL-Systems
+#l pos (0.0)##l pos(4.0)#
+
+
+<,>,v,^ Positionierungstasten
+#table#
+#free(0.5)#
+<SHIFT> Umschalttaste
+#free(0.5)#
+<CR> Eingabe-/ Absatztaste
+#free(0.5)#
+<HOP> Verstärkertaste
+#free(0.5)#
+<RUBOUT> Löschtaste
+#free(0.5)#
+<RUBIN> Einfügetaste
+#free(0.5)#
+<TAB> Tabulatortaste
+#free(0.5)#
+<MARK> Markiertaste
+#free(0.5)#
+<ESC> Kommandotaste
+#free(0.5)#
+<SV> Supervisortaste
+#free(0.5)#
+<STOP> Stoptaste
+#free(0.5)#
+<WEITER> Weitertaste
+#tableend##clear pos#
+
+
+#page#
+Die Wirkung der Funktionstasten
+#free(0.5)#
+<SHIFT>
+
+#ib#Umschalttaste#ie#
+
+Wird diese Taste gleichzeitig mit einer anderen betätigt, so wird ein Buchstabe in
+Großschreibung, bei den übrigen Tasten das obere Zeichen, ausgegeben. So wird z.B.
+anstelle der "9" das Zeichen ")" ausgegeben.
+#free(1.5)#
+<CNTL>
+
+#ib#Kontroll-/Steuertaste#ie#
+
+Mit dieser Taste in Kombination mit Zusatztasten können Sonderfunktionen des
+Systems angewählt werden. Für EUMEL sind folgende drei Tastenkombinationen
+(wobei die Tasten gleichzeitig betätigt werden müssen) wichtig:
+
+<CTRL> <a> Anhalten der Bildschirmausgabe
+
+<CTRL> <b> Wirkung der SV-Taste (bei jedem Rechner)
+
+<CTRL> <c> Bildschirmausgabe fortführen
+#l pos (0.0)##l pos(4.0)#
+
+
+#free(1.5)#
+<CR>
+
+#ib#Eingabetaste / Absatztaste#ie#, Carriage Return, kurz: 'CR'
+
+Diese Taste wird im Editor betätigt, um das Ende eines Absatzes zu kennzeichnen.
+Die kontinuierliche Fließtexteingabe wird durch sie unterbrochen und es wird an den
+Beginn der nächsten Zeile positioniert. Einrückungen werden beibehalten. Eine Ab­
+satzmarke ist im Editor an der Inversmarkierung am rechten Bildschirmrand zu erken­
+nen.
+
+Die 'CR'-Taste ist oft mit einem geknicktem Pfeil nach links gekennzeichnet. Im
+Kommandomodus (also bei "gib kommando :") wird durch Betätigung dieser Taste ein
+gegebenes Kommando ausgeführt.
+
+Die sonstige Benutzung dieser Taste außerhalb des Editors wird in der jeweiligen
+Anwendung beschrieben, z.B. Bestätigung eines Trennvorschlags bei der Silbentren­
+nung.
+
+<, >, v, ^
+
+Tasten für die Positionierung
+
+#ib#Positionierung des Cursors#ie# um eine Spalten-/Zeilenposition in die jeweilige Richtung.
+#free(1.5)#
+<HOP>
+
+"#ib#Verstärkertaste#ie#"; wird als Vorschalttaste bedient.
+
+In Kombination mit anderen Funktionstasten wird deren Wirkung verstärkt. (vgl.
+4-#topage("HOP")#)
+
+#on("u")#Beispiel:#off("u")#
+
+
+<HOP> <v>
+
+Steht der Cursor nicht am unteren Bildrand, so wird er dorthin positioniert. Steht er
+am unteren Bildrand, so wird um einen Bildschirminhalt "weitergeblättert".
+
+Auch die Funktionen 'RUBIN'/'RUBOUT' werden in Kombination mit der HOP-Taste
+verstärkt.(vgl. 4-#topage("verstärkt")#ff) #free(1.5)#
+<RUBOUT>
+
+#ib#Löschtaste#ie#
+
+Das Zeichen, auf dem der Cursor steht, wird gelöscht. Wenn der Cursor hinter dem
+letzten Zeichen einer Zeile steht, wie bei fortlaufender Eingabe üblich, wird das letzte
+Zeichen gelöscht.
+
+#on("u")#Beispiel:#off("u")#
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 4
+
+Mit der RUBOUT-Taste ist es möglich, ein
+Zeichen nach dem anderen auf dem Bildschirm
+zu löschen. Steht der Cursor auf einem
+Zeichen, das irrtümlicherweise eingetipp?t
+wurde, kann dieses durch einmaliges
+Betätigen der RUBOUT-Taste aus der Datei
+gelöscht werden.
+
+____________________________________________________________________________
+
+
+Nach Betätigen der <RUBOUT> - Taste:
+
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 4
+
+Mit der RUBOUT-Taste ist es möglich, ein
+Zeichen nach dem anderen auf dem Bildschirm
+zu löschen. Steht der Cursor auf einem
+Zeichen, das irrtümlicherweise eingetippt
+wurde, kann dieses durch einmaliges
+Betätigen der RUBOUT-Taste aus der Datei
+gelöscht werden.
+
+____________________________________________________________________________
+
+#page#
+
+
+<RUBIN>
+
+#ib#Ein- bzw. Ausschalten des Einfügemodus.#ie#
+
+Das Betätigen der Taste schaltet in den Einfügemodus.Der Zustand wird durch das
+Wort "RUBIN" im linken Drittel der Titelzeile der Datei angezeigt. Vor dem Zeichen,
+auf dem der Cursor steht, wird eingefügt. Nochmaliges Betätigen der Taste schaltet
+den Einfügemodus aus.
+
+#on("u")#Beispiel:#off("u")#
+
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 5
+
+Das Betätigen der Taste schaltet in den
+Einfügemodus. Der Zustand wird durch das
+Wort "RUBIN" im linken Drittel der Titelzeile
+angezeigt. Vor dem Zeichen, auf dem der
+Cursor steht, wird ' ' eingefügt.
+Nochmaliges Betätigen der Taste schaltet den
+Einfügemodus aus.
+
+____________________________________________________________________________
+
+
+
+Nach Betätigen der <RUBIN> - Taste und Einfügen des Wortes " jetzt":
+
+____________________________________________________________________________
+ .......RUBIN...... dateiname .....................
+Zeile 5
+Das Betätigen der Taste schaltet in den
+Einfügemodus. Der Zustand wird durch das
+Wort "RUBIN" im linken Drittel der Titelzeile
+angezeigt. Vor dem Zeichen, auf dem der
+Cursor steht, wird jetzt ' ' eingefügt.
+Nochmaliges Betätigen der Taste schaltet den
+Einfügemodus aus.
+
+____________________________________________________________________________
+
+
+
+<TAB>
+
+#ib#Tabulatortaste#ie#
+
+Betätigen Sie die 'TAB'-Taste, um vom linken Bildschirmrand auf den Textbeginn in
+der Zeile bzw. eine Tabellenspalte zu positionieren. Erneutes Betätigen der 'TAB'-
+Taste positioniert den Cursor auf die nächste eingestellte Tabulator-Position. Die
+eingestellten Tabulatorpositionen erkennen Sie an den Tabulatorzeichen (Dachzei­
+chen) in der obersten Bildschirmzeile.
+
+Wenn keine TABs gesetzt sind, werden die beiden Schreibgrenzen, linker Bildschirm­
+rand und Ende der Zeile, als #on("i")#voreingestellte# #off("i")# TABs angesehen.
+#free(1.5)#
+<MARK>
+
+#ib#Ein- bzw. Ausschalten der Markierung#ie#.
+
+Bei Betätigung dieser Taste wird in einen speziellen #ib#Markierzustand#ie# geschaltet. Alles,
+was Sie jetzt schreiben bzw. durch Bewegen des Cursors in Richtung Dateiende
+kennzeichnen, steht als #on("i")#markierter# #off("i")# Bereich für die Bearbeitung zur Verfügung. Zur
+besseren Sichtbarkeit wird der markierte Bereich invers zum übrigen Text dargestellt.
+
+Wird der Cursor in eine Richtung bewegt, wird das gesamte Textstück zwischen
+Einschaltpunkt der Markierung und aktueller Cursorposition markiert. Rückwärtsbewe­
+gungen des Cursors verkürzen den markierten Bereich wieder.
+
+Einen derart markierten Bereich können Sie nun z.B. duplizieren, verschieben, lö­
+schen, durchsuchen oder weiterverarbeiten. (vgl. 4- #topage("mark")# ff).
+
+Durch erneutes Betätigen der MARK-Taste schalten Sie den Markier-Zustand auch
+wieder aus.
+
+#on("u")#Beispiel:#off("u")#
+
+Sie wollen einen Textteil markieren, um ihn an eine andere Stelle zu verschieben
+(evtl. um ihn an dieser Stelle später zu löschen):
+
+Sie positionieren den Cursor auf den Beginn des Textteils, gehen in den Markierzu­
+stand durch Betätigen der MARK-Taste und führen nun den Cursor mit Hilfe der
+Positioniertasten bis zum Ende des zu markierenden Bereichs.
+
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 5
+
+Mit dem Cursor positionieren Sie an die
+Stelle, ab der markiert werden soll und
+betätigen die MARK-Taste. Nun führen Sie den
+Cursor bis zu der Stelle, bis zu der
+markiert werden soll. Der markierte Text wird
+normalerweise "schwarz auf weiss"
+dargestellt.
+
+____________________________________________________________________________
+
+
+
+Mit weiteren Kommandos (vgl. ESC-Taste und Kommando-Verarbeitung, 4- #topage("ESC")#)
+kann der Bereich nun bearbeitet werden.
+#free(1.5)#
+<ESC>
+
+#ib#Kommandotaste#ie#
+
+Mit der ESC-Taste in Kombination mit einer Folgetaste können Sie vordefinierte
+Aktionen anwählen. Es gibt Aktionen, die vorprogrammiert zur Verfügung stehen, und
+Sie selbst können weitere hinzufügen. (vgl. 4-#topage("ESC")# ) #free(1.5)#
+<SV>
+
+#ib#SUPERVISOR-Taste im Mehrbenutzer-Betrieb#ie#
+
+Betätigen Sie diese Taste im Editor, dann unterbrechen Sie Ihre Editierarbeit und
+erhalten die Meldung
+
+____________________________________________________________________________
+
+ Terminal 2
+
+
+ EUMEL Version 1.8/M
+
+
+ gib supervisor kommando:
+
+
+
+
+ ESC ? --> help
+ ESC b --> begin("") ESC h --> halt
+ ESC c --> continue("") ESC s --> storage info
+ ESC q --> break ESC t --> task info
+
+
+____________________________________________________________________________
+
+
+Wollen Sie nun im Editor fortfahren bzw. haben Sie irrtümlich die SV-Taste betätigt,
+dann geben Sie das Kommando
+
+____________________________________________________________________________
+
+ gib supervisor kommmando :
+ continue ("Sekretariat")
+
+
+____________________________________________________________________________
+
+
+(falls Ihre Task, in der Sie arbeiteten, wirklich "Sekretariat" hieß!)
+
+Um Ihren in Bearbeitung befindlichen Text wieder vollständig auf dem Bildschirm zu
+sehen, betätigen die die Tasten
+
+<ESC> <b>
+
+Sie sind wieder an der Stelle, an der Sie den Text mit der SV-Taste verlassen ha­
+ben, und können normal weiterarbeiten.
+
+#on("u")#Achtung:#off("u")# Die SV-Taste kann, je nach Terminal, durch das Betätigen von zwei
+Tasten gleichzeitig realisiert sein (oft 'CTRL b'). Beachten Sie die Beschreibung Ihrer
+Tastatur!
+#free(1.5)#
+<STOP>
+
+#ib#Unterbrechen einer Ausgabe#ie# (oft auch als CTRL a realisiert).
+
+Haben Sie diese Taste aus Versehen betätigt, erkennen Sie dies daran, daß der
+Editor nicht "reagiert". Betätigen Sie die WEITER-Taste (oft auch CTRL c).
+#free(1.5)#
+<WEITER>
+
+Unterbrochene Ausgabe fortsetzen.
+
+Ein mit der STOP-Taste angehaltene Ausgabe können Sie durch Betätigen der
+#ib#WEITER-Taste#ie# fortsetzen.
+
+
+#on("u")#VORSICHT:#off("u")# Die STOP-Taste unterbricht nur die Ausgabe auf den Bildschirm.
+Zeichen, die während des STOP eingegeben werden, werden gespeichert und nach
+'WEITER' ausgegeben!
+
+
+#page#
+4.2.2 Speicherung von Texten
+#free(1.0)#
+ #on("i")#
+ In diesem Abschnitt wird der Begriff "Datei" erklärt und es wird erläutert, wie
+ unterschiedliche Texte auseinandergehalten werden können.
+ ## #off("i")#
+
+
+
+Das EUMEL-System speichert einmal geschriebene Texte, bis sie vom Benutzer
+gelöscht werden. In der Regel wird nicht nur ein (langer) Text oder ein Programm
+geschrieben, sondern mehrere und unterschiedliche. Um diese auseinanderhalten zu
+können, versehen wir sie jeweils mit einem Namen, der frei gewählt werden kann.
+Beispiele für Namen:
+
+
+ "Brief vom 1.12.86"
+ "1. Kapitel meines Buches"
+
+
+Eine Sammlung von Zeichen (also im Normalfall unsere geschriebenen Texte), die mit
+einem Namen versehen worden ist, nennt man eine #ib##on("bold")#Datei#ie##off("bold")#. Der Editor erstellt also eine
+Datei, wenn wir einen Text schreiben. Eine Datei kann bis zu 4 000 Zeilen fassen,
+wobei jede Zeile bis zu 32 000 Zeichen lang sein darf. Das Produkt aus der Anzahl
+der Zeilen und den Zeichen pro Zeile kann z.Zt. jedoch 1 000 000 Zeichen (=1MB)
+nicht übersteigen. #page#
+
+#ib(9)#4.2.3. #ib#Schreiben von Texten#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Texte werden fortlaufend geschrieben. Absätze werden durch die CR-Taste
+ markiert.
+ # #off("i")#
+
+#free(0.8)#
+
+Nach dieser etwas langen Vorrede können wir endlich losschreiben. Wird ein Zeichen
+geschrieben, rückt der #ib#Cursor#ie# automatisch nach rechts auf die nächste Schreibstelle.
+Durch den automatischen #ib#Wortumbruch#ie# werden angefangene Worte, die über ein
+Zeilenende hinausgehen würden, ohne Silbentrennung in die nächste Zeile gebracht.
+#u##count("6")#)#e#
+#foot#
+#u##value("6")#)#e# Nehmen Sie bitte keine Silbentrennung "per Hand" vor. Eingebrachte Trenn­
+ striche gelten als Bindestrich und bleiben somit auch bei Umformatierungen
+ erhalten, was unerwünscht ist. Für diese mühevolle Aufgabe gibt es in der Text­
+ verarbeitung ein Programm!
+#end#
+
+Die 'CR'-Taste (bei einer Schreibmaschine bedeutet sie "Wagenrücklauf") braucht
+also nur noch betätigt zu werden, wenn eine Zeile vorzeitig beendet werden soll, d.h.
+bei einem #ib#Absatz#ie# oder einer #ib#Leerzeile#ie#. Der Cursor wird dabei an den Anfang der
+nächsten Zeile positioniert. Gleichzeitig erscheint in der vorherigen Zeile am rechten
+Rand des Bildschirms eine Markierung, die anzeigt, daß hier ein Absatz gemacht
+wurde.
+
+Darum ist das Betätigen der 'CR'-Taste bei Tabellenzeilen und Programmtexten
+besonders wichtig, denn hier soll ja jede Zeile separat bleiben. Sie wirkt nur hinter
+dem letzten Zeichen.
+
+Der Editor ist auf das Schreiben von "normalen" Texten eingestellt. Bei normalen
+Texten soll ein Wort, welches über das Ende einer Zeile gehen würde, automatisch in
+die nächste Zeile gebracht werden. Diese Funktion wird "Wortumbruch" genannt.
+
+Ist kein Wortumbruch erwünscht, zum Beispiel bei der Beschreibung von Program­
+men, so geben Sie, bevor Sie den Editor aufrufen, im Monitor das Kommando
+
+____________________________________________________________________________
+gib kommando :
+#ib#word wrap (false)#ie#
+
+____________________________________________________________________________
+
+
+Der Wortumbruch kann durch das Kommando
+
+____________________________________________________________________________
+
+gib kommando :
+#ib#word wrap (true)#ie#
+
+____________________________________________________________________________
+
+
+wieder eingeschaltet werden. Der Editor ist standardmäßig auf "Wortumbruch" einge­
+stellt und Sie sollten nur in Ausnahmefällen diese Benutzungsart ausschalten.
+
+Ein Bildschirm faßt (neben der Titelzeile) üblicherweise 23 Zeilen, die mit Text be­
+schrieben werden können. Ist die letzte Zeile voll und muß eine neue Zeile begonnen
+werden, "rutscht" der Bildschirminhalt automatisch um eine Zeile nach oben. Damit
+ist Platz für eine Leerzeile, die nun ebenfalls beschrieben werden kann, usw. Keine
+Angst: die so verschwundenen Zeilen sind natürlich nicht "weg". Da ein Bildschirm
+immer nur eine beschränkte Anzahl von Zeilen hat, kann der Editor nur einen Aus­
+schnitt aus der Datei zeigen.
+#page#
+Einrückungen
+#free(1.0)#
+ #on("i")#
+ Die #ib#Einrückungautomatik#ie# erlaubt bei fortlaufendem Schreiben, die Einrückung zu
+ erhalten.
+ # #off("i")#
+#free(0.5)#
+Soll ein Text eingerückt werden, so betätigt man entsprechend oft die Leertaste. Die
+in dieser Zeile geschriebene Einrückung wird automatisch in den folgenden Zeilen
+beibehalten, bis sie durch die Cursor-Positionierungstasten wieder aufgehoben wird.
+
+#on("u")#Beispiele für Aufzählungen:#off("u")# Einrückung funktioniert automatisch ohne aktive Eingabe
+von Leerschritten.
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 1
+ - Der erste Typ der Aufzählungsform
+ ist die #ib#Aufzählung#ie# durch Voran­
+ stellen eines Sondersymbols.
+ Als Sondersymbole sind die beiden
+ Zeichen "-" und "*" zugelassen. An
+ ihnen erkennt der Editor eine
+ Aufzählung.
+
+ 12. Weiterhin können Aufzählungen
+ durch Begriffe, gefolgt von
+ einem Punkt oder einer ")", als
+ #ib#Aufzählungskriterium#ie# verwendet
+ werden.
+
+
+ Aufzählung: Auch diese Möglichkeit
+ steht Ihnen zur Verfü­
+ gung. Der Editor er­
+ kennt, daß Sie hier
+ einen Begriff erläutern
+ wollen.
+
+____________________________________________________________________________
+
+#page#
+Wann werden nun Aufzählungen vom Editor erkannt?
+
+Die hier aufgeführten Einzelheiten sollte nur der hieran interessierte Anfänger lesen!
+
+Wenn die Einrückung nicht funktionieren sollte, prüfen Sie die folgenden Punkte, die
+für das Einrücken erfüllt sein müssen:
+
+1) Die Vorgängerzeile hat eine Absatzmarke.
+
+ Wichtig: Innerhalb eines Aufzählungspunktes schaltet die Absatztaste die Aufzäh­
+ lungseinrückung aus!
+
+2) "*" bzw. "-" und mindestes ein Leerzeichen sind die ersten Zeichen in der
+ Zeile.
+
+3) "." bzw. ")" und mindestens ein Leerzeichen nach höchstens sieben Zeichen sind
+ die ersten Zeichen in der Zeile.
+
+4) ":" und mindestens ein Leerzeichen nach höchstens 19 Zeichen sind die ersten
+ Zeichen in der Zeile.
+#page#
+
+#ib(9)#4.2.4. #ib#Positionieren#ie# im Text#ie(9)#
+
+#free(1.0)#
+ #on("i")#
+ Um Korrekturen (Überschreiben, Löschen oder Einfügen) vorzunehmen, muß der
+ #ib#Cursor#ie#, der die aktuelle Schreibposition anzeigt, bewegt werden können. Bei
+ längeren Texten ist es möglich, den Cursor auch auf Zeilen zu positionieren, die
+ (noch nicht) auf dem Bildschirm angezeigt werden. Somit zeigt der Editor nicht nur
+ immer das Ende einer Datei, sondern einen beliebigen Ausschnitt, der auf dem
+ Bildschirm im sogenannten '#ib#Fenster#ie#' sichtbar ist.
+ #off("i")#
+#free(1.0)#
+Ist eine Korrektur notwendig, positionieren Sie den Cursor auf die Stelle, an der die
+Korrektur vorgenommen werden soll. Dazu verwenden Sie die #ib#Positionierungstasten#ie#
+LINKS, RECHTS, OBEN und UNTEN. LINKS und RECHTS bewegen den Cursor
+innerhalb einer Zeile. Stößt man mit RECHTS an das Ende einer Zeile, wird der
+Cursor an den Anfang der nachfolgenden Zeile bewegt.
+
+ v ^
+
+Ein #ib#Zeilenwechsel#ie# kann einfacher mit den Tasten OBEN und UNTEN vorgenommen
+werden. Die Taste OBEN bewegt den Cursor eine Zeile nach oben, die Taste UNTEN
+entsprechend eine Zeile tiefer.
+
+Was passiert nun, wenn Sie den unteren oder den oberen Rand des Bildschirms
+erreicht haben, und Sie positionieren darüber hinaus? In diesem Fall wird der Text
+zeilenweise nach oben oder nach unten verschoben und es erscheint die gewünschte
+Zeile, wobei am anderen Rand einige verschwinden". Wir sehen also, daß wir mit den
+Positionierungstasten den Bildschirm als Fenster über die Datei hinweggleiten lassen
+können. Den Text selbst können wir uns auf einem langen Band geschrieben vorstel­
+len. Die #ib#Zeilennummer#ie#, die die Position des Cursors angibt, wird stets in der Titel­
+zeile angezeigt.
+
+Vermeiden Sie es, den Cursor über das Textende hinaus nach unten laufen zu las­
+sen. Sie verlängern dadurch Ihren Text um Leerzeilen, die Sie beim Weiterschrei­
+ben nicht auffüllen, sondern vor sich herschieben.
+
+Innerhalb einer Zeile ist es etwas anders: Positionieren wir bei einer Zeile, die breiter
+als der Bildschirm ist, nach rechts, wird nicht das Fenster verschoben, sondern die
+Zeile 'gerollt'.(vgl. Sie hierzu das Verschieben des Gesamtfensters mit dem 'mar­
+gin'-Kommando 4-#topage("margin")#)
+4.2.5. Korrigieren im Text
+#free(1.0)#
+
+ #on("i")#
+ Einfache Korrekturen können durch #ib#Überschreiben von Zeichen#ie#, #ib#Löschen von
+ Zeichen#ie# und #ib#Einfügen von Zeichen#ie# vorgenommen werden.
+
+ #off("i")#
+#free(1.0)#
+<RUBOUT>
+
+Die einfachste Möglichkeit der Korrektur ist das #ib#Überschreiben#ie#. Soll z.B. ein Zeichen
+durch ein anderes ersetzt werden, so positioniert man der Cursor genau über dieses
+und tippt das richtige Zeichen ein. Das kann natürlich auch mit mehreren Zeichen
+nacheinander erfolgen.
+
+Korrekturen können Sie gleich beim Schreiben vornehmen, indem Sie die zuletzt
+geschriebenen Zeichen mit der #ib#RUBOUT-Taste#ie# löschen. Häufig bemerkt man aber
+#ib#Schreibfehler#ie# erst etwas später, so daß man diese Fehler nicht so leicht korrigieren
+kann. Für solche Zwecke müssen Sie den Cursor an die Textstelle bewegen, an der
+korrigiert werden soll.
+
+Wollen Sie ein #ib#Zeichen löschen#ie#, so positionieren Sie den Cursor auf dieses Zeichen
+und betätigen die Taste #ib#RUBOUT#ie#. Das Zeichen verschwindet und die Restzeile rückt
+heran. Sollen mehrere Zeichen gelöscht werden, muß die RUBOUT-Taste entspre­
+chend oft gedrückt werden.
+
+Steht der Cursor hinter dem letzten Zeichen der Zeile, wird immer das letzte Zeichen
+der Zeile gelöscht. Man kann also mit dieser Eigenschaft eine Zeile "von hinten
+wegradieren".(vgl. hierzu auch 4- #topage("ESC RUBOUT")#)
+
+
+
+<RUBIN>
+
+Fehlende Zeichen können Sie genauso einfach einfügen. Sie bringen den Cursor auf
+das Zeichen, vor das eingefügt werden soll. Dann drücken Sie die Taste #ib#RUBIN#ie#. Der
+Editor gelangt in den #ib#Einfügemodus#ie#, was in der Titelzeile durch RUBIN angezeigt
+wird. Er fügt alle Zeichen ein, die jetzt getippt werden (anstatt zu überschreiben). Der
+Teil der Zeile rechts vom Cursor rückt jeweils um entsprechend viele Stellen nach
+rechts.
+
+Wichtig ist, daß im RUBIN-Modus der Editor genauso funktioniert wie im Normalzu­
+stand (natürlich mit der Ausnahme, daß eingefügt statt überschrieben wird).
+
+Im eingeschalteten RUBIN-Modus können keine Zeichen verloren gehen. Viele
+Benutzer lassen darum den RUBIN-Modus immer eingeschaltet, um sich vor einem
+unbeabsichtigten Überschreiben von Texten zu schützen. Sie korrigieren, indem Sie
+die Verbesserung einfügen und den alten Text löschen.
+
+Durch erneutes Betätigen der RUBIN-Taste beenden Sie den Einfügemodus. Die
+RUBIN-Taste wirkt wie ein Schalter, der den Einfügemodus ein- und ausschaltet.
+Allerdings können Sie nur so viele Zeichen in eine Zeile einfügen, bis das letzte Wort
+der Zeile an das Zeilenende stößt. Das letzte Wort wird am Anfang der folgenden
+Zeile eingefügt, sofern dort noch Platz ist und es sich nicht offensichtlich um die
+letzte Zeile eines Absatzes handelt. Andernfalls wird automatisch eine neue Zeile für
+das angefangene Wort eingefügt.(vgl. Sie hierzu auch 4- #topage("ESC RUBIN")#) #free(1.5)#
+#page#
+Springen und Zeilen einfügen/löschen
+#free(1.0)#
+ #on("i")#
+ Bewegungen des Cursors sind mit den Positionierungstasten bei größeren "Ab­
+ ständen" etwas mühsam, ebenso bei umfangreichen Löschungen und Einfügun­
+ gen. Die "#ib#Verstärkertaste#ie#" HOP ermöglicht es, diese Operationen auf einfache
+ Weise zu beschleunigen. Mit der #ib#HOP-Taste#ie# kann man das Fenster über der
+ Datei nicht nur zeilenweise, sondern auch um jeweils eine Fensterlänge verschie­
+ ben. Das nennt man #ib#Blättern#ie#.
+
+ #off("i")#
+#free(1.0)#
+#goalpage("HOP")#
+Wird die HOP-Taste vor einer anderen der schon erklärten Funktionstasten gedrückt,
+verstärkt sie deren Wirkung. Die HOP-Taste ist eine "Präfix"-Taste: sie wird vor
+(und nicht gleichzeitig mit, wie z.B. die Umschalttaste SHIFT) einer anderen Taste ge­
+drückt. Zuerst das springende Positionieren:
+#free(1.0)#
+<HOP> <>>
+
+#ib#Sprung an das rechte Bildschirmende#ie#.
+
+Falls die Zeile länger als das Fenster breit ist, wird die Zeile um eine Fensterbreite
+nach links verschoben.
+#free(1.0)#
+<HOP> <<>
+
+#ib#Sprung an den Bildschirmrand links#ie# (ggf. seitlich blätternd).
+#free(1.0)#
+<HOP> <^>
+
+#ib#Sprung auf die erste Zeile des Bildschirms#ie#.
+
+Nochmaliges Betätigen dieser Tastenkombination positioniert den Cursor (und damit
+das Fenster in der Datei) um ein Fenster zurück. ("Blättern")
+#free(1.0)#
+<HOP> <v>
+
+#ib#Sprung auf die letzte Zeile des Bildschirms#ie#.
+
+Das Blättern erfolgt analog HOP OBEN.
+#free(1.0)#
+<HOP> <CR>
+
+Positioniert das Fenster so, daß die aktuelle Zeile zur ersten des Fensters wird.
+#free(1.0)#
+<HOP> <RUBIN>
+
+#ib#Einfügen von Textpassagen#ie#. #goalpage("verstärkt")# Die HOP-Taste in Verbindung mit RUBIN und
+RUBOUT wird zum "verstärkten" Löschen und Einfügen verwendet.
+
+Ab der aktuellen Position des Cursors "verschwindet" der restliche Text. Es kann wie
+bei der anfänglichen Texteingabe fortgefahren werden. Die Anzeige '#ib#REST#ie#' in der
+Titelzeile erinnert daran, daß noch ein Resttext existiert. Dieser erscheint nach einem
+neuerlichen Betätigen der beiden Tasten HOP RUBIN wieder auf dem Bildschirm (die
+Anzeige 'REST' verschwindet dann wieder).
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 4
+
+In diesem Text soll vor dem zweiten Satz
+etwas eingefügt werden. #cursor("H")#ierzu wird der
+Cursor an die Position geführt, an der
+ein beliebiger Text eingefügt werden soll.
+
+____________________________________________________________________________
+
+
+Nach Betätigen der Tasten <HOP> und <RUBIN> sieht der Bildschirm wie folgt
+aus:
+
+____________________________________________________________________________
+ ............... dateiname .........REST.......... Zeile 4
+
+In diesem Text soll vor dem zweiten Satz
+etwas eingefügt werden.
+
+
+____________________________________________________________________________
+
+
+
+Nun kann beliebig viel Text eingefügt werden. Nochmaliges Betätigen von HOP und
+RUBIN führt den Text-Rest wieder bündig heran.
+
+
+<HOP> <RUBOUT>
+
+Löscht die Zeile ab Cursor-Position bis Zeilenende.
+
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 4
+
+Soll eine ganze Zeile oder ein Textrest
+gelöscht werden, so positioniert man an die
+Stelle, ab der gelöscht werden soll. 'R'est löschen....
+Nach HOP RUBOUT ist der Zeilenrest gelöscht.
+
+
+____________________________________________________________________________
+
+
+Nach Betätigen der Tasten <HOP> und <RUBOUT> sieht der Bildschirm wie
+folgt aus:
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 4
+
+Soll eine ganze Zeile oder ein Textrest
+gelöscht werden, so positioniert man an die
+Stelle, ab der gelöscht werden soll.
+Nach HOP RUBOUT ist der Zeilenrest gelöscht.
+
+____________________________________________________________________________
+
+
+
+Steht der Cursor am Zeilenanfang, wird nach HOP RUBOUT dementsprechend die
+ganze Zeile gelöscht und die Lücke durch Nachrücken der Folgezeilen geschlossen
+(HOP RUBOUT betätigen).
+#page#
+Zeilen aufbrechen und Rückumbruch
+
+#free(1.0)#
+ #on("i")#
+ Um grössere Textpassagen einzufügen, betätigt man #ib#HOP RUBIN#ie# nacheinander.
+ Diese Tastenfolge kann benutzt werden, um eine Zeile bzw. eine längere Textpas­
+ sage aufzubrechen). #ib#HOP RUBOUT#ie# am Ende einer Zeile macht einen #ib#Rückum­
+ bruch#ie#.
+
+ #off("i")#
+#free(1.0)#
+<HOP> <RUBIN>
+
+Wie bereits beschrieben, bewirkt #ib#HOP RUBIN#ie# in einer Zeile, daß der Zeilenrest rechts
+des Cursors und alle Zeilen unterhalb der aktuellen Zeile scheinbar verschwinden.
+#ib#REST#ie# in der Titelzeile erinnert daran, daß ein Teil der Datei nicht sichtbar ist.
+
+Wird unmittelbar nach HOP RUBIN wiederum HOP RUBIN betätigt, wird der vorherige
+Zeilenrest als eigenständige Zeile dargestellt. Es ist damit eine Aufspaltung einer Zeile
+in zwei Zeilen vollzogen.
+
+
+<HOP> <RUBOUT>
+
+Der umgekehrte Fall, nämlich zwei Zeilen zu einer zusammenzufassen (sog. #ib# Rück­
+umbruch#ie#), ist durch #ib#HOP RUBOUT#ie# hinter dem letzten Zeichen einer Zeile möglich.
+Hinter das letzte Zeichen einer Zeile kann einfach mit dem Tabulator positioniert
+werden.
+
+Das Aufbrechen einer Zeile und der Rückumbruch zusammen angewandt stellen den
+ursprünglichen Zustand wieder her. Beispiel: Mit HOP RUBIN bricht man eine Zeile
+auf, der Rest der Zeile und nachfolgende Zeilen verschwinden vom Bildschirm. Erneu­
+tes HOP RUBIN stellt den rechten Zeilenteil auf der nächsten Zeile und die nachfol­
+genden Zeilen auf dem Bildschirm wieder dar. Da der Cursor sich noch immer am
+rechten Rand der aufgebrochenen Zeile befindet, kann man mit HOP RUBOUT den
+ursprünglichen rechten Zeilenteil wieder rekombinieren.
+#page#
+
+
+#ib(9)#4.2.6. Der #ib#Tabulator#ie##ie(9)#
+
+#free(1.0)#
+ #on("i")#
+ Eine weitere wichtige #ib#Positionierungshilfe#ie# innerhalb einer Zeile ist die #ib#TAB#ie#-Taste.
+ Sie wird u.a. zum Schreiben von Tabellen benötigt. Wie bei einer Schreibmaschine
+ können #ib#Tabulatormarken#ie# gesetzt bzw. gelöscht werden.
+
+ #off("i")#
+#free(1.0)#
+<TAB>
+
+Der Tabulator hat eine wichtige Funktion für das schnelle Positionieren, auch wenn
+keine Marken eingestellt wurden. #ib#Voreingestellte Tabulatormarken#ie# sind nämlich der
+Textanfang einer Zeile (Einrückung, falls vorhanden) und die Stelle direkt hinter dem
+letzten Zeichen der Zeile. Betätigt man also die Taste TAB, dann springt die Schreib­
+marke an die nächste dieser voreingestellten Positionen. So kann man schnell mit
+dem Cursor an den Anfang oder das Ende einer Zeile gelangen (und z.B. am Zeilen­
+ende Zeichen "von hinten" löschen oder dort weiterschreiben).
+
+<HOP> <TAB>
+
+Nun zum #ib#Setzen des Tabulators#ie#: Sie setzen ihn, indem Sie den Cursor auf die Zei­
+lenposition bringen, in der die Marke plaziert werden soll. Hier betätigen Sie nun #ib#HOP
+TAB#ie#. Die Tabulatorsetzung kann man in der Titelzeile an einer Markierung ("Dach­
+"-Zeichen) sehen, falls sie im Fensterbereich ist und die aktuelle Zeile nicht seitlich
+verschoben ist. Betätigt man nun an irgendeiner Position innerhalb einer Zeile die
+TAB-Taste, wird der Cursor auf die Position der nächsten Tabulatormarkierung (die
+sich rechts von dem Cursor befindet) oder eine der voreingestellten Positionen be­
+wegt.
+
+#ib#Gesetzte Tabulatormarken#ie# können gelöscht werden, indem man mit der TAB-Taste
+die Position der Tabulatormarke einstellt und dann HOP TAB betätigt. Die Marke ist
+dann gelöscht, das Dach verschwindet in der Titelzeile.
+
+Tabulatormarkierungen hinterlassen keine Spuren in der Datei, sondern dienen nur als
+Positionierungshilfen. mit 'HOP TAB' gesetzte Markierungen, die mit 'TAB' ange­
+sprungen werden, wirken beim Schreiben von Zahlen wie Dezimaltabulatoren, vgl. Sie
+dazu 4- #topage("zahlen")#.
+
+#on("u")#Beispiel:#off("u")#
+
+Es soll für den Textbeginn eine Tabulatorposition auf die 12. Spalte gesetzt werden.
+Hierzu wird der Cursor auf die 12. Spalte positioniert und die HOP- und die TAB-
+Taste nacheinander betätigt. Das "Dach"-Zeichen erscheint in der 12. Spalte in der
+Titelzeile und von nun an kann durch Betätigen der TAB-Taste diese Position direkt
+angesteuert werden.
+
+____________________________________________________________________________
+ ..........^....... dateiname ...................... Zeile 4
+
+HOP TAB wurde in der 12. Spalte betätigt.
+ Mit TAB stehen Sie auf der 12.
+ Spalte.
+
+____________________________________________________________________________
+
+
+Werden #ib#Tabulatormarken#ie# gesetzt (HOP TAB), gelten die voreingestellten Tabulator­
+marken (Anfang und Ende einer Zeile) nicht mehr. Dies ist z.B. bei dem Schreiben
+von Tabellen notwendig. Andererseits möchte man beim Schreiben von "normalem"
+Text wieder die voreingestellten Tabulatormarken bedienen können. Mit den Tasten
+
+<ESC> <TAB>
+
+kann man die gesetzten Tabulatormarken (erkenntlich an dem "Dach"-Zeichen in
+der Kopfzeile) vorübergehend verschwinden lassen. Dann gelten wieder die voreinge­
+stellten Marken. Erneutes #ib#ESC TAB#ie# stellt die gesetzten Tabulatormarken wieder her
+usw..
+#free(1.5)#
+Zahlentabellen schreiben: Dezimaltabulator
+#goalpage("zahlen")#
+
+#free(1.0)#
+ #on("i")#
+ Beim Schreiben von #ib#Zahlentabellen#ie# sollen die Zahlen oft rechtsbündig im Text
+ erscheinen. Dazu bietet der Editor den #ib#Dezimaltabulator#ie# an.
+
+ #off("i")#
+#free(1.0)#
+Für jede Zahlenkolonne wird die gewünschte Position der Einerstelle (also der letzten
+Stelle) mit Hilfe eines Tabulators eingestellt. Mit #ib#TAB#ie# wird der Cursor zur jeweils
+nächsten Tabulatormarke vorgerückt. Werden nun Ziffern geschrieben, so schreibt
+man nicht - wie gewohnt - nach rechts, sondern die Ziffern werden nach links
+eingerückt. Etwas genauer: Beim Drücken einer Zifferntaste wird, solange links vor
+der Zahl noch ein Blank, eine Zahl, "+", "-" oder ein Punkt sichtbar ist, diese
+gelöscht und die hierdurch neu entstandene Ziffernfolge rechtsbündig an der Tabula­
+torposition geschrieben. Das Schreiben von rechtsbündigen Zahlenkolonnen ist so
+leicht möglich #count("11")#):
+#foot#
+#value("11")#) Wird eine #ib#Proportionalschrift#ie# (Schrift, bei der die Zeichen unterschiedliche
+ Breiten haben) verwendet, sollte man zwischen den einzelnen Zahlenkolonnen
+ mindestens zwei Leerzeichen schreiben. Andernfalls bekommt man - auf Grund
+ der unterschiedlicher Zeichenbreiten - keine rechtsbündigen Kolonnen gedruckt.
+#end#
+
+
+ 12 12345,78
+ 1 0,23
+ 12345 1234,00
+
+
+
+Es gibt somit vier nützliche Automatiken: neben dem automatischen Dezimaltabulator
+den Wortumbruch, die Einrückautomatik und die Zeileneinfügeautomatik beim ein­
+fügenden Schreiben.
+4.2.7. Lernen im Editor
+
+#free(1.0)#
+
+ Beliebige Folgen von Tastenbetätigungen können gelernt und Tasten zugeordnet
+ werden. Das ist sinnvoll, wenn Sie wiederholt immer die gleichen Tastenbetä­
+ tigungen ausführen müssen, wie z.B. in Tabellenzeilen etwas einfügen oder wenn
+ des öfteren gleiche Texte geschrieben werden müssen, wie z.B. ein Absender,
+ Grußformeln usw.
+ #goalpage("ESC")#
+ #free(1.0)#
+< ESC> <HOP>
+
+Der #ib#Lernmodus#ie# wird durch Betätigen der Tasten #ib#ESC HOP#ie# eingeschaltet, es erscheint
+#ib#LEARN#ie# als Kontrolle rechts in der Titelzeile). Alle Tastenanschläge werden jetzt bis
+zum Ausschalten des Lernmodus gelernt. Auch Tastenanschläge wie 'CR'), so daß
+man kann demnach auch mehrere Zeilen lernen lassen kann.
+
+<ESC> <HOP> <'taste'> z.B. ESC HOP j
+
+Das Beenden oder Ausschalten des Lernmodus erfolgt durch Drücken der drei Tasten
+#ib#ESC HOP 'taste'#ie#. Dabei wird die gelernte Tastenanschlagsfolge, auch #ib#Lernsequenz#ie#
+genannt, der Taste 'taste' zugeordnet.
+
+<ESC> <'taste'> z.B. ESC j
+
+Durch späteres Betätigen der Tastenfolge ESC 'taste' kann der gelernte Text an jeder
+Stelle der Datei geschrieben werden.
+
+#on("u")#Beispiel:#off("u")#
+
+Ein Sachbearbeiter hat jeden Tag 50 mal die Worte 'Gesellschaft für Datenverarbei­
+tung' zu tippen. Er läßt den Editor diese Worte lernen mit
+
+
+ESC HOP Gesellschaft für Datenverarbeitung ESC HOP m
+
+Die Worte liegen jetzt auf der Taste 'm'. Wird 'm' gedrückt, erscheint ein 'm' auf dem
+Bildschirm. Mit ESC 'm' erscheinen die obigen Worte. ESC ist also notwendig, um
+das normale 'm' von der Lernsequenz zu unterscheiden.
+
+Welche Tasten dürfen zum #ib#Lernen#ie# belegt werden? Alle Tasten, außer
+
+- vom System benutzte Tasten, wie SV, CTRL;
+- vom Editor (je nach Anwendung) vorbelegte Tasten, wie die Tasten q oder ESC
+ und HOP;
+- durch Programmierung (siehe dieses Kapitel) fest belegte Tasten.
+
+Praktische Tips: Man sollte die Tastatur nicht mit Lernsequenzen überlasten, weil man
+sich zu viele Tasten nicht merken kann. Besser ist es, einige wenige Tasten fest zu
+belegen und andere für momentane Aufgaben einzusetzen.
+
+Der Einsatz von #ib#Lernsequenz#ie#en ist besonders sinnvoll für das Schreiben von Text­
+kosmetikanweisungen. Anweisungen wie z.B. 'Unterstreichen einschalten', Schrift­
+typ-Anweisungen usw. werden zweckmäßigerweise auf Tasten gelegt.
+
+Hat man sich einmal beim '#ib#Lernen#ie#' verschrieben, so ist das nicht weiter schlimm: es
+kann ohne Bedenken korrigiert werden (z.B. mit der Taste RUBOUT). Solche Tasten­
+anschläge werden dann allerdings auch gelernt, was aber bei der Benutzung der
+Lernsequenzen keine Bedeutung hat.
+4.2.8. Textabschnitte durch Markieren bearbeiten
+
+#free(1.0)#
+ #on("i")#
+ Oft ergibt sich die Notwendigkeit, mehrere Zeilen oder ganze Textpassagen zu
+ löschen oder zu verschieben. Hierbei hilft die Taste #ib#MARK#ie#, mit der man #ib#Texte
+ markieren#ie# (also kennzeichnen) kann. Die so markierten Texte können dann auf
+ verschiedene Weisen als Ganzes verarbeitet werden.
+ #goalpage("ESC")#
+
+ #free(1.0)#
+<MARK>
+
+Durch Drücken der Taste MARK wird die #ib#Markierung#ie# eingeschaltet und - bei erneu­
+ter Betätigung - wieder ausgeschaltet. Der Anfang der Markierung wird "festgehal­
+ten" und man kann nun das Markierende durch die Positionierungstasten und die
+HOP-Taste in Richtung auf das Dateiende verschieben, wobei die dazwischen lie­
+genden Zeichen markiert (in der Regel "schwarz auf weißem Grund" dargestellt)
+werden.
+
+
+<ESC> <RUBOUT>
+
+Ein so markierter Text kann mit #ib#ESC RUBOUT#ie# gelöscht werden. #ib#Markieren und
+löschen#ie# mit ESC RUBOUT ist eine bequeme und sichere Löschmethode, da man
+genau sieht, was gelöscht wird.#goalpage("ESC RUBOUT")#
+
+
+<ESC> <RUBIN>
+#goalpage("ESC RUBIN")#
+
+Der gelöschte Abschnitt ist aber nicht vollständig gelöscht, sondern er kann an ande­
+rer (oder an der gleichen) Stelle im Text durch #ib#ESC RUBIN#ie# wieder eingefügt werden.
+Der vorsichtig gelöschte Text landet in einem #ib#Zwischenspeicher#ie# und kann bei Bedarf
+mit #ib#ESC RUBIN#ie# wieder aufgerufen werden. Wird erneut vorsichtig gelöscht, so wird
+der letzte Text des Zwischenspeichers überschrieben. Im Zwischenspeicher ist nur für
+einen #on("u")#Text#off("u")# Platz. Auf diese Art kann ein Textabschnitt beliebiger Länge an eine
+andere Stelle des Textes sicher, schnell und bequem verschoben werden. Zusätzlich
+ist die nachträgliche Korrektur von fehlerhaften Löschungen möglich, weil der Text
+wieder mit ESC RUBIN reproduziert werden kann.
+
+Mit eingeschalteter Markierung kann auch geschrieben werden. Das #ib#markierende
+Schreiben#ie# ist eine besonders vorsichtige Art der Texterstellung, denn der Textein­
+schub bleibt erst durch Ausschalten der Markierung (MARK) wirklich bestehen. Er
+kann wieder gelöscht (ESC RUBOUT) und an eine andere Stelle gebracht werden
+(ESC RUBIN). Beim markierenden Schreiben wirkt RUBOUT immer auf das Zeichen
+vor der Cursorposition.
+
+Hinweis: Positionierungen sind nur innerhalb der Markierung möglich.
+#page#
+4.2.9. Der Fenstereditor
+#free(1.0)#
+
+ #on("i")#
+ Oft ist es notwendig, mit mehreren Dateien gleichzeitig zu arbeiten, z.B. wenn aus
+ einer Datei etwas in eine andere kopiert werden muß, wenn Fehler durch die
+ Textkosmetik-Programme oder einen Compiler gefunden werden oder wenn man
+ kurz etwas in einer anderen Datei nachschauen will. Zu diesem Zweck bietet der
+ Editor die Möglichkeit, zwei (oder mehr) Dateien zur gleichen Zeit zu bearbeiten. #off("i")#
+
+
+#free(1.0)#
+Der Editor ermöglicht dem Benutzer wie durch ein Fenster auf den zu bearbeitenden
+Text zu schauen. Es ist in diesem Zusammenhang nur natürlich, daß man bei der
+Bearbeitung eines Textes sich die Möglichkeit wünscht, weitere Texte gleichzeitig
+ansehen zu können. Dies kann notwendig sein, um zu vergleichen, Fehler zu entdek­
+ken oder Textteile aus einem Fenster in ein anderes zu übertragen.
+
+Um ein neues Editor-Fenster zu "öffnen", betätigt man im Editor
+
+<ESC> <e>
+
+Betätigt man ESC e ungefähr in der Mitte des Bildschirms, hat man das Fenster auf
+die neue Datei in der unteren Hälfte des Bildschirms und die "alte" Datei in der
+oberen Bildschirmhälfte. Zunächst wird der Dateiname erfragt. Nach dessen Eingabe
+und dem Betätigen der 'CR' Taste wird ein Fenster auf eine andere Datei eröffnet.
+Die obere linke Ecke des Fensters befindet sich an der aktuellen Cursor-Position.
+Dabei darf sich der Cursor nicht zu sehr am rechten oder unteren Rand befinden, weil
+das Fenster sonst zu klein würde. In diesem "Fenster" kann man dann genauso
+arbeiten wie im "normalen" Editor.
+
+
+Mit der Tastenfolge
+
+<ESC> <w>
+
+wechselt man von einem Fenster (zyklisch) in das benachbarte. Es gibt eine Hier­
+archie zwischen den Fenstern in der Reihenfolge, in der eines im anderen einge­
+richtet worden ist. Gibt man
+
+<ESC> <q>
+
+in einem Fenster, so verschwindet dieses und alle darin eingeschachtelten Fenster,
+und man befindet sich im übergeordneten Fenster.
+
+Wir schilderten zuvor, daß man mit ESC RUBOUT und ESC RUBIN Texte verschie­
+ben und löschen kann. Zwischen Dateien im Fenstereditor geht dies folgendermaßen:
+
+Durch
+
+<ESC> <p> oder <ESC> <d>
+
+schreibt man einen markierten Teil in eine temporäre Datei (einen Zwischenspeicher);
+durch ESC p wird ein markierter Text aus der Ursprungsdatei entfernt und in einen
+Zwischenspeicher geschrieben. Im Gegensatz dazu wird er durch ESC d kopiert.
+Durch
+
+<ESC> <g>
+
+fügt man ihn in eine andere (oder dieselbe) Datei ein. Im Unterschied zu ESC RUBIN
+wird die temporäre Datei dadurch nicht entleert.
+
+Die Funktionen ESC d und ESC g leisten auf schnellere Weise dasselbe wie die
+Kommandos 'PUT ""' und 'GET ""'.
+#page#
+4.2.10. Die wichtigsten vorbelegten Tasten
+#free(1.0)#
+
+ #on ("i")#
+ Lernsequenzen und Kommandos (d.h. ELAN-Programme) können Tasten zuge­
+ ordnet werden. Da einige Funktionen häufig benötigt werden, sind diese stan­
+ dardmäßig bestimmten Tasten zugeordnet. #off("i")#
+
+
+
+#free(1.0)#
+#ib#ESC q#ie# Verlassen des Editors bzw. der eingeschachtelten Fenster.
+
+#ib#ESC e#ie# Weiteres Editorfenster einschalten.
+
+#ib#ESC n#ie# Notizbuch "aufschlagen".
+
+#ib#ESC v#ie# Dateifenster auf ganzen Bildschirm vergrößern
+ bzw. Bildschirm rekonstruieren (eingeschachteltes Fenster verlas­
+ sen).
+
+#ib#ESC w#ie# Dateiwechsel beim Fenstereditor.
+
+#ib#ESC f#ie# Nochmalige Ausführung des letzten Kommandos.
+
+#ib#ESC b#ie# Das Fenster wird auf den linken Rand der aktuellen (ggf. verscho­
+ benen) Zeile gesetzt.
+
+ESC > Zum nächsten Wortanfang.
+
+ESC < Zum vorherigen Wortanfang.
+
+#ib#ESC 1#ie# Zum Anfang der Datei.
+
+#ib#ESC 9#ie# Zum Ende der Datei.
+#page#
+Lernen
+
+
+#ib#ESC HOP#ie# Lernen einschalten.
+
+#ib#ESC HOP taste#ie# Lernen ausschalten und Lernsequenz auf 'taste' legen.
+
+#ib#ESC HOP HOP#ie# Gelerntes vergessen. Bedingung ist, daß man die Lernsequenz in
+ der Task löscht, in der man sie hat lernen lassen.
+#free(1.0)#
+Operationen auf Markierungen
+
+#free(1.0)#
+#ib#ESC RUBOUT#ie# Markiertes "vorsichtig" löschen.
+
+#ib#ESC RUBIN#ie# Vorsichtig mit ESC RUBOUT Gelöschtes einfügen.
+
+#ib#ESC p#ie# Markiertes löschen und in die Notiz-Datei schreiben. Kann mit ESC
+ g an anderer Stelle reproduziert werden.
+
+#ib#ESC d#ie# Duplizieren:
+ Markiertes in die Notiz-Datei kopieren (PUT ""), anschließend die
+ Markierung abschalten. Kann mit ESC g beliebig oft reproduziert
+ werden.
+
+#ib#ESC g#ie# MIT ESC p gelöschten oder mit ESC d duplizierten Text an aktuelle
+ Cursor-Stelle schreiben, d.h. Notiz-Datei an aktueller Stelle einfü­
+ gen (GET "").
+#free(1.0)#
+#on("b")#Zeichen schreiben#u#1#e#
+#off("b")#
+#foot#
+1) Diese Tasten sind standardmäßig so vorbelegt wie hier aufgeführt, sie könne aber
+von Benutzern und in Anwenderprogrammen geändert werden.
+#end#
+#free(0.5)#
+#ib#ESC a#ie# Schreibt ein ä.
+#ib#ESC A#ie# Schreibt ein Ä.
+#ib#ESC o#ie# Schreibt ein ö.
+#ib#ESC O#ie# Schreibt ein Ö.
+#ib#ESC u#ie# Schreibt ein ü.
+#ib#ESC U#ie# Schreibt ein Ü.
+#ib#ESC s#ie# Schreibt ein ß.
+#ib#ESC (#ie# Schreibt eine [.
+#ib#ESC )#ie# Schreibt eine ].
+#ib#ESC <#ie# Schreibt eine {.
+#ib#ESC >#ie# Schreibt eine }.
+#ib#ESC \##ie# Schreibt ein \#, das auch gedruckt werden kann.
+#ib#ESC ­#ie# Schreibt einen (geschützten) Trennstrich, siehe Textverarbeitung.
+#ib#ESC k#ie# Schreibt ein (geschütztes) "k", siehe Textverarbeitung.
+#ib#ESC blank#ie# Schreibt ein (geschütztes) Leerzeichen, siehe Textverarbeitung.
+#free(1.0)#
+Kommando auf Taste legen
+
+#free(1.0)#
+#ib#ESC ESC#ie# Kommandodialog einschalten
+
+#ib#ESC ! taste#ie# Im Kommandodialog:
+ Geschriebenes Kommando auf Taste legen.
+
+#ib#ESC ? taste#ie# Im Kommandodialog:
+ Auf 'taste' gelegtes Kommando zum Editieren anzeigen.
+
+#ib#ESC k#ie# Im Kommandodialog:
+ Das zuletzt editierte Kommando (einzeilige ELAN-Programm)
+ anzeigen.
+
+Eine ausführliche Beschreibung des Kommandodialogs finden Sie im folgenden Kapi­
+tel.
+4.3. Die wichtigsten Editor-Kommandos
+#goalpage("ESC")#
+#free(0.5)#
+
+#ib(9)#4.3.1. Der #ib#Kommandodialog#ie##ie(9)#
+
+#free(1.0)#
+ #on("i")#
+ Einige Operationen kann man nur mühselig mit den bis jetzt beschriebenen Tasten
+ durchführen. Z.B. ist es sehr zeitaufwendig, eine bestimmte Textstelle zu finden.
+ Andere Operationen sind mit den im vorigen Kapitel beschriebenen Tasten über­
+ haupt nicht möglich, wie etwa die Zeilenbreite einzustellen oder Programme aufzu­
+ rufen, die die zu editierende Datei verarbeiten. Solche Operationen werden durch
+ Kommandos ermöglicht, die man auf Editorebene geben kann. #off("i")#
+
+
+#free(1.0)#
+Um Kommandos an den Editor geben zu können, schalten wir in den #ib#Kommando­
+zustand#ie#.
+
+<ESC> <ESC>
+
+Durch zweimaliges Betätigen von ESC erfolgt #on("u")#im Editor#off("u")# die Aufforderung
+
+____________________________________________________________________________
+ ................. dateiname ...................... Zeile 4
+
+Mit der ESC-Taste ist es möglich, den Kommandodialog
+gib kommando :
+
+____________________________________________________________________________
+
+
+
+Auf dem Bildschirm erscheint eine #ib#Kommandozeile#ie#, in der der Benutzer
+Kommandos schreiben kann. Durch Betätigen der Taste 'CR' wird das
+Kommando ausgeführt.
+#page#
+
+
+#ib(9)#4.3.2. Zeile und #ib#Textstelle anwählen#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Auf der Kommandoebene des Editors können Sie Kommandos erteilen, um an eine
+ beliebige Stelle in der Datei zu positionieren.#off ("i")#
+
+#free(1.0)#
+Sie haben einen (größeren) Text erstellt und stehen nun vor dem Problem, für die
+Korrektur die entsprechenden Textstellen aufzufinden.
+
+#on("u")#Beispiel:#off("u")#
+
+Bei der Durchsicht eines Ausdrucks Ihres Textes stellen Sie fest, daß Sie sich ver­
+schrieben haben. Anstelle von "diese Zeichen" haben Sie "diese Ziichen" geschrie­
+ben. Um diese Textstelle anzuwählen, gehen Sie wie folgt vor: Sie positionieren an
+den Beginn der Datei und betätigen die Tastenfolge
+
+
+<ESC> <ESC>
+
+
+Auf dem Bildschirm ersceint:
+
+____________________________________________________________________________
+
+gib kommando:
+
+____________________________________________________________________________
+
+
+Sie schreiben nun die zu suchende Textstelle auf:
+
+____________________________________________________________________________
+
+gib kommando: "diese Ziichen"
+
+____________________________________________________________________________
+
+
+Durch die Angabe eines TEXTes in Anführungsstrichen wird nach dem eingeschlosse­
+nen TEXT 'diese Ziichen' ab der aktuellen Cursor-Position gesucht. Wird 'diese
+Ziichen' gefunden, bleibt der Cursor auf dem gesuchten Text stehen. Andernfalls steht
+der Cursor am Ende der letzten Zeile der Datei.
+
+Eine andere Möglichkeit, an eine entferntere Stelle im Text zu kommen, ist die fol­
+gende:
+
+<ESC> <ESC>
+
+
+Es erscheint auf dem Bildschirm:
+
+____________________________________________________________________________
+
+gib kommando:
+
+____________________________________________________________________________
+
+
+Sie geben nun die Textzeile an, die Sie suchen:
+
+____________________________________________________________________________
+
+gib kommando: 134
+
+____________________________________________________________________________
+
+
+Durch dieses Kommando wird auf die 134. Zeile positioniert.
+#page#
+
+#ib(9)#4.3.3. #ib#Suchen und Ersetzen#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Auf der Kommandoebene des Editors können Sie wie auf der Monitor-Ebene
+ beliebige Kommandos geben. Diese können Sie zu (ELAN-) Programmen ver­
+ knüpfen. Zur Erstellung dieser Programme editieren Sie wie gewohnt in der Kom­
+ mandozeile. Für das Positionieren, Suchen und Ersetzen innerhalb Ihres ELAN-
+ Programms stehen Ihnen Kommandos zur Verfügung. Beliebige ELAN-Prog­
+ ramme sind zulässig.#off ("i")#
+
+#free(1.0)#
+Die #ib#Kommandozeile#ie# kann wie eine "normale" Textzeile editiert werden (Positionieren,
+Überschreiben, Einfügen, Löschen und Markieren). Bevor ein Programm eine Aus­
+gabe erzeugt oder fehlerhafte Kommandos Fehlermeldungen hervorrufen, wird der
+Cursor in die linke obere Ecke positioniert. Um die Meldungen festzuhalten, sollte das
+#ib#Kommando 'pause'#ie# folgen. Diese Meldungen werden dann in der ersten Zeile des
+Bildschirms angezeigt. Danach ist man wieder im Editor und kann wie gewohnt
+arbeiten.
+
+Kommandos werden durch ein Semikolon voneinander getrennt.
+
+#on("u")#Beispiel:#off("u")#
+
+____________________________________________________________________________
+
+gib kommando: T1; "Geschäftsführung";fetch("Lieferanten",archive)
+
+____________________________________________________________________________
+
+
+Ihr ELAN-Programm besteht aus zwei Kommandos: zunächst positionieren Sie in die
+erste Zeile und suchen ab dort nach dem Wort "Geschäftsführung". dann lesen Sie
+die Datei "Lieferanten" von der Diskette in den Arbeitsspeicher.
+
+Die beiden beschriebenen Kommandos (Text bzw. eine Zeile anwählen) sind Spezial­
+kommandos und können in dieser Form nicht durch ein Semikolon mit anderen Kom­
+mandos kombiniert werden. Deshalb gibt es für sie eine ELAN-Form, die es erlaubt,
+sie mit anderen Kommandos zusammen zu verwenden:
+
+a) Einen Text ab der aktuellen Cursor-Position suchen (D ist eine Abkürzung für
+ '#ib#DOWN#ie#'):
+
+____________________________________________________________________________
+
+gib kommando: "diese Zeichen"
+
+____________________________________________________________________________
+
+(* Kurzform *)
+
+
+____________________________________________________________________________
+
+gib kommando: #ib#D#ie# "diese Zeichen"
+
+____________________________________________________________________________
+
+(* Allgemeine Version *)
+
+
+
+b) Auf eine Zeile positionieren (#ib#T#ie# ist eine Abkürzung für '#ib#TO LINE#ie#'):
+
+____________________________________________________________________________
+
+gib kommando: 127
+
+____________________________________________________________________________
+
+
+(* Kurzform *)
+
+
+____________________________________________________________________________
+
+gib kommando: T 127
+
+____________________________________________________________________________
+
+
+(* Allgemeine Version *)
+
+
+Mehrere Kommandos können in der Kommandozeile angegeben werden. Die einzel­
+nen Kommandos müssen in diesem Fall mit ';' voneinander getrennt werden.
+
+#on("u")#Beispiel:#off("u")#
+
+<ESC> <ESC>
+
+schaltet in den Kommandomodus
+
+____________________________________________________________________________
+
+gib kommando: T 1; D "noch Zeichen"
+
+____________________________________________________________________________
+
+
+
+Diese zwei Kommandos werden nacheinander ausgeführt. Zuerst wird auf die erste
+Zeile positioniert und dann (von der ersten Zeile ab) nach 'noch Zeichen' gesucht.
+Damit ist es möglich, die Datei nicht nur ab der aktuellen Zeile zu durchsuchen,
+sondern die gesamte Datei. Soll nicht in Richtung auf das Dateiende, sondern in
+Richtung auf den Dateianfang (also nach "oben") gesucht werden, kann man das
+#ib#U-Kommando#ie# (Abkürzung für #ib#UP#ie#) verwenden:
+
+<ESC> <ESC>
+
+____________________________________________________________________________
+
+gib kommando: U "noch ein Text"
+
+____________________________________________________________________________
+
+
+
+Ein weiteres Kommando ist das #ib#C-Kommando#ie# (Abkürzung für '#ib#CHANGE#ie#'), mit
+welchem man einen TEXT sucht und diesen dann ersetzt.
+
+#on("u")#Beispiel:#off("u")#
+
+<ESC> <ESC>
+
+____________________________________________________________________________
+
+gib kommando: "alte Zeichen" C "neue Zeichen"
+
+____________________________________________________________________________
+
+
+Ab der aktuellen Cursor-Position wird nach 'alte Zeichen' gesucht. Wird der TEXT
+gefunden, wird er durch 'neue Zeichen' ersetzt. Der Cursor befindet sich in diesem
+Fall hinter dem ersetzten TEXT. Wird 'alte Zeichen' dagegen nicht in der Datei gefun­
+den, befindet sich der Cursor (wie beim erfolglosen Suchen mit D) am Ende der
+letzten Zeile der Datei.
+
+Wie alle anderen Kommandos kann auch das C-Kommando mit anderen Komman­
+dos verbunden werden.
+
+#on("u")#Beispiel:#off("u")#
+
+<ESC> <ESC>
+
+____________________________________________________________________________
+
+gib kommando: #ib#T#ie# 500; "Schreibfelher" #ib#C#ie# "Schreibfehler"
+
+____________________________________________________________________________
+
+
+
+Hier wird ab der 500. Zeile der Datei nach 'Schreibfelher' gesucht und ggf. ersetzt.
+Soll ein TEXT nicht nur einmal, sondern bei jedem Auftreten ersetzt werden, benutzt
+man das #ib#CA-Kommando#ie# (Abkürzung für #ib#CHANGE ALL#ie#):
+
+<ESC> <ESC>
+
+____________________________________________________________________________
+
+gib kommando: "dieser alte Text" CA "dieser neue Text"
+
+____________________________________________________________________________
+
+
+Dadurch wird 'dieser alte Text' bei jedem Auftreten ab der aktuellen Cursor-Position
+durch 'dieser neue Text' ersetzt.
+Pattern Matcher
+#free(1.0)#
+
+
+ Der #ib#Pattern Matcher#ie# ist ein Werkzeug zur #ib#Mustererkennung#ie#. Er dient zur
+ Beschreibung von Texten, die in verschiedenen Ausprägungen auftreten können.
+ Zum Suchen oder Ersetzen wird nicht ein Text fester Gestalt vorgegeben, sondern
+ eine Beschreibung der gesuchten Struktur.
+
+
+#free(1.0)#
+
+Häufig werden Sie #ib#Texte suchen#ie# oder ersetzen wollen, die in einigen Varianten inner­
+halb eines umfangreicheren Textes auftauchen können.
+
+Beispiel: Gesucht wird 'unser' in verschiedenen Zusammenstellungen, also auch
+ 'unsere' oder 'unserem'. Alle Textstellen, die diesem Muster entsprechen,
+ können in #on("u")#einem#off("u")# Suchverfahren gefunden werden, indem das Muster,
+ welches diese Texte beschreibt, für die Suche benutzt wird:
+
+____________________________________________________________________________
+Suchen nach Begriffen deren genaue Ausprägung unbekannt ist.
+gib kommando:D(" unser" + any + " ")
+
+
+____________________________________________________________________________
+
+
+
+ Leseweise:
+
+ Suche 'unser', gefolgt beliebigen Zeichen plus einem Leerzeichen, oder
+ auch nur einem Leerzeichen.
+
+
+ Dieses Suchkommando liefert Treffer bei 'unser', 'unsere', 'unseres' usw..
+
+#free(1.0)#
+Wie baut man ein Pattern ?
+
+#free(1.0)#
+
+
+ Texte werden durch ihr Konstruktionsmuster aus bekannten und unbekannten
+ Teilen beschrieben
+
+#free(1.0)#
+
+Ein Text, der in seiner konkreten Form nicht bekannt ist, dessen Aufbau jedoch durch
+ein Muster beschrieben werden kann, besteht aus Teilen, die als:
+
+ - bekannte Texte
+ - unbekannte Texte
+
+bezeichnet werden und die mit dem Operatoren:
+
+ '+' Zusammensetzen
+ 'OR' Alternative
+
+kombiniert werden können.
+
+
+Ein bekannter Text ist z.B. ein Stück eines gesuchten Textes, das als fest vorgegeben
+betrachtet werden kann, wie etwa der Wortstamm 'unser' in dem obigen Beispiel. Wie
+gewohnt wird ein solcher bekannter Text, in Anführungsstriche gesetzt, als TEXT
+CONST "text" notiert.
+
+Demgegenüber ist ein unbekannter Text von nicht näher zu beschreibender Gestalt.
+Das Muster, welches einen unbekannten Text beschreibt, steht für irgendeinen einer
+Vielzahl von Texten, die diesem Muster entsprechen.
+
+Mit der Prozedur:
+
+ any
+
+wird das Muster für einen beliebigen Text geliefert.
+
+Im einleitenden Beispiel ist der Wortstamm bekannt, das Teilwort 'unser' kann also im
+'Klartext' angegeben werden. Die Endungen sind je nach dem Zusammenhang in dem
+das gesuchte Wort auftritt verschieden, also zunächst unbekannt.
+Ein solcher unbekannter Text kann entweder durch Aufzählung der möglichen
+Alternativen seiner Erscheinung beschrieben werden oder durch die Prozedur 'any'.
+
+
+ (text + ("er" OR "es" OR "em" OR ..... )
+
+ alternative Verknüpfung durch OR
+
+
+ ("text" + any + .... )
+
+ additive Verknüpfung durch +
+
+Grundsätzlich ist zu beachten, daß der Suchvorgang des Pattern Matcher Zeichenket­
+ten untersucht und nicht etwa einzelne Worte und stets nach dem längstmöglichen
+Muster gesucht wird!
+
+Ein schlecht beschriebener Suchtext kostet somit nicht nur viel Rechenzeit, sondern
+liefert auch unerwünschte Ergebnisse: z.B. sollte der Artikel 'der' mit einem führenden
+Leerzeichen als " der" gesucht werden, da andernfalls jedes Wort, das die Silbe 'der'
+enthält, einen Treffer in der Suche ergibt.
+
+Da die Suche nach unbekannten Texten viele unerwünschte Ergebnisse liefern
+könnte, kann die Prozedur any in zweifacher Weise eingeschränkt werden:
+
+
+D(" d" + any (2) )
+
+ Die Länge der unbekannten Textes wird vorgegeben, indem die Anzahl
+ der Zeichen aus denen der Text besteht, angegeben wird. Die Angabe
+ steht in Klammern hinter 'any'. (In diesem Beispiel genau 2 Zeichen).
+
+
+D(" d" + any ("aeirs"))
+
+
+ Das Alphabet, aus dem der unbekannte Text bestehen darf, wird angege­
+ ben. (In diesem Beispiel darf der Text der einen Treffer ergibt nur aus
+ den Zeichen 'a', 'e', 'i', 'r', 's' bestehen, z.B: der, die, das oder auch
+ dies.)
+
+
+D(" d" + any (2,"aeirs")
+
+
+ Auch die Kombination der Beschränkungen ist möglich. (Jetzt liefern nur
+ noch 'der', 'die','das' etc. Treffer).
+
+
+#on("b")#
+ACHTUNG: Das Zeichen '*' nimmt eine Sonderstellung ein, da es als Abkürzung für
+ 'any' verwandt werden kann. Soll dieses Zeichen im Text gesucht oder
+ ersetzt werden, müssen Sie statt "*" 'any(1,"*")' schreiben.
+
+ Weitere Informationen zum Pattern Matcher finden Sie im EUMEL-
+ Handbuch zur Programmierung.
+#off("b")#
+#free(1.0)#
+4.3.4. Kommandos auf Tasten legen
+
+#free(1.0)#
+ #on("i")#
+ Oft benutzte Kommandos können auf Tasten gelegt werden. Damit ist es möglich,
+ den Editor auf Ihre speziellen Bedürfnisse einzurichten.#off ("i")#
+
+#free(1.0)#
+
+Oft benutzte Kommandos können mit der Drei-Tastenfolge
+
+<ESC> <!> <'taste'> auf eine Taste gelegt werden.
+
+#on("u")#Beispiel:#off("u")#
+
+
+<ESC> <ESC> (* die Kommandozeile erscheint *)
+
+____________________________________________________________________________
+
+gib kommando: save (SOME myself)
+
+____________________________________________________________________________
+
+
+<ESC> <!> <s> (* das Kommando 'save (SOME myself)' ist
+ nun auf die Taste 's' gelegt *)
+
+
+Wird nun die Taste 's' gedrückt, erscheint das Zeichen 's' auf dem Bildschirm. Mit
+#ib#ESC s#ie# wird das 'save'-Kommando ausgeführt. Natürlich können auch kompliziertere
+Kommandos auf Tasten gelegt werden.
+
+Möchten Sie ein Kommando, das auf eine Taste gelegt wurde, verändern, drücken Sie
+im Kommandodialog (!) die Drei-Tastenfolge
+
+<ESC> <?> <'taste'>
+
+
+#on("u")#Beispiel:#off("u")#
+
+<ESC> <ESC> (* in den Kommandodialog gehen *)
+
+
+<ESC> <?> <s> (* es erscheint nun: 'save (SOME myself)' *)
+
+Dieses Kommando kann nun z.B. verändert und ausgeführt (durch 'CR') oder
+wiederum auf die gleiche oder eine andere Taste gelegt werden (durch #ib#ESC ! 'taste'#ie#).
+
+Im Editor kann das letzte im Kommandodialog eingegebene Kommando durch '#ib#ESC f#ie#'
+wiederholt werden.
+#page#
+
+#ib(9)#4.3.5. Texte aus anderen Dateien benutzen#ie(9)#
+#free(1.0)#
+ #on("i")#
+ Manchmal ist es notwendig, einen Text in eine andere Datei zu schreiben (z.B.
+ wenn man diesen Text noch einmal verwenden will) oder einen Text einer anderen
+ Datei in den zu bearbeitenden Text einzufügen. Die '#ib#GET#ie#'- und '#ib#PUT#ie#'-Kom­
+ mandos bieten die Möglichkeit, Texte zwischen Dateien auszutauschen (vergl.
+ auch den Abschnitt über paralleles Editieren).#off ("i")#
+
+#free(1.0)#
+Mit dem #ib#'GET'-Kommando#ie# können wir Texte aus einer anderen Datei an die aktuelle
+Schreibposition kopieren.
+
+____________________________________________________________________________
+
+gib kommando: GET "absender"
+
+____________________________________________________________________________
+
+holt den Text 'absender'. Wenn also des öfteren Briefe geschrieben werden, braucht
+man sich den Absender nur einmalig in die Datei 'absender' zu schreiben und kann
+diesen mit dem Kommando 'GET' (was man auf eine Taste legen kann) u.U. mehr­
+mals an verschiedenen Stellen in die Datei einfügen.
+
+Mit dem #ib#'PUT'-Kommando#ie# können wir zuvor markierte Textteile in eine Datei schrei­
+ben.
+
+____________________________________________________________________________
+
+gib kommando: PUT "adressen"
+
+____________________________________________________________________________
+
+
+schreibt einen markierten Text in die Datei 'adressen'. 'adressen' wird ggf. eingerich­
+tet. Ist die Datei 'adressen' bereits vorhanden, so wird erfragt, ob die Datei gelöscht
+werden kann, um den markierten Text aufzunehmen (überschreiben). Andernfalls wird
+der markierte Text an den bereits vorhandenen Text in 'adressen' angefügt. Es ist
+somit durch mehrmaliges Markieren und das 'PUT'-Kommando möglich, Texte aus
+einer Datei zu sammeln und in eine neue Datei zu geben.
+#page#
+
+#ib(9)#4.3.6. #ib#Breitere Zeilen#ie# bearbeiten#ie(9)##goalpage("margin")#
+#free(1.0)#
+ #on("i")#
+ Der Editor ist auf eine Zeilenbreite von 77 Zeichen eingestellt. Oft ist es notwen­
+ dig, mit einer anderen Zeilenbreite zu schreiben, welche man mit dem #ib#'limit'-
+ Kommando#ie# einstellen kann. Aber auch die Positionierung innerhalb einer Zeile
+ wird dadurch anders, weil breitere Zeilen nicht als Ganzes auf den Bildschirm
+ passen. In diesem Fall wird "#ib#gerollt#ie#".#off ("i")#
+
+#free(1.0)#
+Eine andere Zeilenbreite stellt man durch 'limit' ein. Beachten Sie, daß die eingestell­
+te Zeilenbreite für die gesamte Datei gilt.
+
+#on("u")#Beispiel:#off("u")#
+
+____________________________________________________________________________
+
+gib kommando: limit (180)
+
+____________________________________________________________________________
+
+
+Nun können Sie wie gewohnt schreiben. Allerdings wird die aktuelle Zeile, in der man
+sich befindet, nicht wie gewohnt am Bildschirmende umgebrochen, sondern erst an
+der Spalte 180, sofern sie nicht vorher durch die 'CR'-Taste beendet wird. Wird über
+das rechte Bildschirmende hinaus geschrieben, bleibt die Cursor-Position am Ende
+des Bildschirms erhalten, aber die Zeile wird beim weiteren Schreiben nach links
+verschoben, "rollt" also nach links (der Anfang der Zeile verschwindet scheinbar nach
+links).
+
+Mit der Positionierung verhält es sich ähnlich. Wird mit RECHTS über den rechten
+Bildschirmrand positioniert, wird die Zeile ebenfalls gerollt. #ib#HOP RECHTS#ie# bewirkt ein
+#ib#Blättern#ie# innerhalb einer einzelnen Zeile nach rechts. Analog verläuft es bei verscho­
+bener Zeile, wenn nach links (LINKS bzw. #ib#HOP LINKS#ie#) positioniert wird.
+
+Beim Schreiben von Tabellen kann es sinnvoll sein, das Fenster vorübergehend auf
+eine andere Anfangsposition (als 1) einzustellen. Das kann mit dem
+#ib#'margin'-Kommando#ie# erfolgen.
+
+#on("u")#Beispiel:#off("u")#
+
+____________________________________________________________________________
+
+gib kommando:#ib#margin#ie# (50)
+
+____________________________________________________________________________
+
+
+Das Editorfenster zeigt nun einen Ausschnitt aus der Datei, beginnend ab der Spalte
+50. In der Titelzeile wird "M50" angezeigt.
+#page#
+
+#ib(9)#4.3.7. Die wichtigsten Kommandos#ie(9)#
+#free(1.0)#
+ #on("i")#
+ Einige Kommandos sind speziell für die Textverarbeitung im Editor programmiert.
+ Die wichtigsten werden hier vorgestellt.#off ("i")#
+
+#free(1.0)#
+any
+ TEXT PROC any
+ liefert ein Muster beliebiger Gestalt und Länge (also auch der Länge 0) für
+ Suchoperationen.
+
+
+ " ir" + any + "was"
+
+
+any
+ TEXT PROC any (TEXT CONST alphabet)
+ liefert den längstmöglichen Text, der aus den in 'alphabet' angegebenen Zeichen
+ besteht.
+
+
+ any ("1234567890") (* suche Zahlen *)
+
+
+any
+ TEXT PROC any (INT CONST laenge)
+ liefert ein Muster beliebiger Gestalt und der Länge 'laenge'.
+
+
+ " d" + any (2)
+
+
+any
+ TEXT PROC any (INT CONST laenge, TEXT CONST alphabet)
+ liefert ein Muster der Länge 'laenge', das nur aus Zeichen aus
+ 'alphabet' besteht.
+
+
+ " d" + any (2,"erias")
+
+
+
+C
+ OP C (TEXT CONST muster, ersatz)
+ Ab der aktuellen Positon wird 'muster' in Richtung Dateiende gesucht und durch
+ 'ersatz' ersetzt. Der Cursor steht danach hinter 'ersatz'.
+
+
+ "alt" C "neu"
+
+
+
+CA
+ OP CA (TEXT CONST muster, ersatz)
+ Arbeitet ab der aktuellen Position wie C. Die Aktion wird jedoch bis zum Erreichen
+ des Dateiendes wiederholt. Nach Ausführung ist somit jedes 'muster' durch
+ 'ersatz' ersetzt. Der Cursor steht danach hinter dem letzten Zeichen der Datei.
+
+
+ "alt" CA "neu"
+
+
+
+
+D
+ OP D (INT CONST n)
+ Positioniert das Fenster n Zeilen vorwärts in Richtung auf das Dateiende.
+
+
+ D 50
+
+
+ OP D (TEXT CONST muster)
+ Sucht 'muster' vorwärts in Richtung auf das Dateiende. Die Suche beginnt direkt
+ hinter der aktuellen Cursor-Position. Wird 'muster' nicht gefunden, steht der
+ Cursor hinter dem letzten Zeichen der Datei. Wird 'muster' gefunden, steht der
+ Cursor direkt auf dem ersten Zeichen von 'muster'.
+
+
+ D "muster"
+
+
+
+GET
+ OP GET (TEXT CONST dateiname)
+ Kopiert den Inhalt der Datei mit dem angegebenen Namen vor die aktuelle
+ Cursor-Position. Ist ein Teil der Quelldatei markiert, wird nur der markierte Teil
+ kopiert.
+
+
+ GET "quelldatei"
+
+
+ OP G (TEXT CONST dateiname)
+ Wie GET.
+
+
+limit
+ OP limit (INT CONST limit)
+ Setzt die rechte Schreibgrenze auf 'limit'.
+
+
+ limit (50)
+
+
+
+margin
+ PROC margin (INT CONST anfang)
+ Alle Zeilen erscheinen erst ab Spalte 'anfang' im Sichtfenster.
+
+
+ margin (50)
+
+
+
+OR
+ TEXT OP OR (TEXT CONST texteins,textzwei)
+ Liefert ein Muster, wenn texteins oder textzwei gefunden wird. Die Reihenfolge
+ spielt keine Rolle.
+
+
+ D ("Geschäfts" + ("führung" OR "leitung"))
+
+
+
+PUT
+ OP PUT (TEXT CONST dateiname)
+ Richtet eine Datei mit dem angegebenen Namen ein und kopiert den markierten
+ Textabschnitt in diese.
+
+
+ PUT ("meine hilfsdatei")
+
+
+ OP P (TEXT CONST dateiname)
+ Zweck: Wie PUT.
+
+
+T
+ OP T (INT CONST n)
+ Positioniert auf die Zeile 'n'.
+
+
+ T 999
+
+
+
+type
+ PROC type (TEXT CONST zeichenkette)
+
+ Fügt 'zeichenkette' in die aktuelle Position der editierten Datei ein. Besonders
+ nützlich in Verbindung mit der Prozedur 'code', um nicht auf der Tastatur enthal­
+ tene Zeichen in den Text zu bringen.
+
+
+ type(code(200))
+
+
+
+U
+ OP U (INT CONST n)
+ Positioniert das Fenster n Zeilen rückwärts in Richtung auf den Dateianfang.
+
+
+ U 100
+
+
+ OP U (TEXT CONST muster)
+ Sucht 'muster' rückwärts in Richtung auf den Dateianfang. Die Suche beginnt
+ links neben der aktuellen Cursor-Position. Vergl. D
+
+
+ U "muster"
+
+
+word wrap
+ PROC word wrap (BOOL CONST an)
+ Schaltet den automatischen Wortumbruch an (voreingestellt) bzw. aus.
+
+
+ word wrap (true) (* angeschaltet *)
+ word wrap (false) (* ausgeschaltet *)
+
+4.4. Fehlersituationen und Abhilfe
+
+#free(1.0)#
+ #on("i")#
+ Von Zeit zu Zeit werden Sie als Anfänger in Arbeitssituationen geraten, wo Sie
+ nicht weiterwissen. Hier sind einige Tips, wie Sie sich behelfen können.#off ("i")#
+
+#free(1.0)#
+
+Wie helfe ich mir, wenn...
+
+
+... nach
+ continue("taskname")
+
+ der Monitor #on("u")#nicht#off("u")#
+
+ gib kommando:
+
+ sagt, sondern "schweigt"?
+
+=> Sie haben die Task bei der letzten Benutzung nicht mit dem Kommando
+ 'break' verlassen (evtl. haben Sie SV betätigt?). Sie sind jetzt im Editor, sehen
+ aber den zuletzt bearbeiteten Textausschnitt nicht. Betätigen Sie die Tasten
+
+ ESC b
+
+ und der Text wird neu auf dem Bildschirm ausgegeben.
+#free(1.0)#
+... im Editor kein Tastendruck mehr akzeptiert wird?
+
+=> Sie haben irrtümlich die STOP-Taste (auch oft als CTRL a realisiert, abhängig
+ vom Terminal), d.h. Anhalten der Bildschirmausgabe betätigt.
+
+ Drücken Sie die WEITER-Taste (= CTRL c, d.h. Bildschirmausgabe fortfüh­
+ ren). Alle Tastenanschläge, die zwischenzeitlich zu keiner Reaktion führten,
+ werden jetzt ausgegeben.
+
+ Je nach Tastatur können STOP und WEITER auch auf anderen Tasten liegen. #free(1.0)#
+... der Lernmodus über lange Zeit (ungewollt) eingeschaltet war?
+
+=> a) Sie merken plötzlich, daß über einen unbestimmt langen Zeitraum alle Ihre
+ Tastenanschläge gelernt wurden (zu erkennen an der "LEARN"-Anzeige in
+ der Überschriftzeile).
+
+ #on("u")#Was ist zu tun?#off("u")#
+
+ Mit dem Kommando
+
+ ESC HOP HOP
+
+ vergessen Sie alles Gelernte und schalten den Lernmodus aus.
+
+=> b) Sie beenden den Editor mit ESC q und die Meldung
+
+____________________________________________________________________________
+
+ WARNUNG: Lernmodus nicht ausgeschaltet
+
+____________________________________________________________________________
+
+
+
+ erscheint auf dem Bildschirm.
+
+ #on("u")#Was ist zu tun?#off("u")#
+
+ Sie können mit
+
+ ESC HOP HOP
+
+ das Gelernte sofort vergessen.
+#free(1.0)#
+... Sie zu viele Absatzzeichen in Ihrem Text gesetzt haben und diese entfernen
+ müssen?
+
+=> Sie positionieren in die Zeile, in der die Absatzmarke gelöscht werden soll. Sie
+ betätigen dann die TAB-Taste, um hinter den Text zu positionieren, dann die
+ RUBOUT-Taste. Wenn Sie jetzt die Zeile mit den Cursor-Tasten nach oben
+ oder unter verlassen, verschwindet die Absatzmarkierung.
+#free(1.0)#
+... nach
+
+ save("dateiname","vatertask")
+
+ das Betriebssystem nicht mehr reagiert?
+
+=> Sie haben die Vater-Task nicht mit dem Kommando 'global manager' in
+ jenem Prozeß zum Empfang von Daten aus anderen Prozessen vorbereitet.
+#free(1.0)#
+... Sie in Ihrer Task das Archive mit dem Kommando
+
+ archive("archivname")
+
+ anmelden wollen und das System Ihnen die Meldung
+
+ "Fehler: Archive wird von Task "bib" benutzt"
+
+ zustellt?
+
+=> Es gibt zwei Möglichkeiten:
+ a) Ein anderer Benutzer benötigt das Archiv-Laufwerk in diesem Moment. Sie
+ müssen warten, bis er seine Arbeit beendet hat.
+
+ b) Ein anderer Benutzer (oder Sie selbst) hat vergessen, mit dem Kommando
+
+ release(archive)
+
+ das Archiv in jener Task freizugeben. Falls Sie es selbst waren, holen Sie
+ das nach. Ansonsten kann das Archiv-Kommando wieder erfolgreich gege­
+ ben werden, wenn fünf Minuten nicht auf das Archiv
+ zugegriffen wurde. #free(1.0)#
+... Sie eine (scheinbare oder echte) Endlosschleife auf einer Taste (z.B. Taste "x")
+ gelernt haben und diese (versehentlich oder bewußt) durch 'ESC x' aktivieren?
+
+=> Wie immer, wenn Sie eine endlos laufende Task beenden wollen, gelangen Sie
+ mit der SV-Taste in den Supervisor-Modus und mit dem Kommando
+
+ 'halt'
+
+ beenden Sie die Endlosschleife.
+
+ Mit
+
+ ESC HOP HOP x
+
+ wird danach das Gelernte 'vergessen'!
+#free(1.0)#
+... Sie Ihre Datei verlassen wollen und
+
+ 'ESC q'
+
+ (scheinbar) nicht funktioniert?
+
+=> Sie haben versehentlich den Feststeller für Großbuchstaben (SHIFT LOCK /
+ CAPS LOCK) betätigt und ESC q zeigt keine Wirkung (wie auch andere Tasten­
+ kombinationen mit Großbuchstaben evtl. keine Wirkung zeigen).
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.5a b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5a
new file mode 100644
index 0000000..1e907f0
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5a
@@ -0,0 +1,1446 @@
+#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 5: Textkosmetik und Druck
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+5 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 5 - %
+#tableend##clearpos#
+#end#
+
+#ib(9)#TEIL 5: Textkosmetik und Druck#ie(9)#
+#free(1.0)#
+#ib(9)#5.0. Vorwort#ie(9)#
+
+#free(1.0)#
+Die #ib#Textkosmetik-Programme#ie# des EUMEL-Systems bieten Ihnen eine einfach zu
+erlernende und zu bedienende Möglichkeit, Texte für den Druck zu gestalten (pro­
+grammtechnisch: #ib#formatieren#ie#) und zu manipulieren.
+
+Die Textkosmetik-Programme bearbeiten Ihre Dateien, die durch den EUMEL-Editor
+erstellt wurden. Darum sollten Sie sich zuerst mit dem EUMEL-Editor vertraut
+machen.
+
+Die Programme sind so konstruiert, daß die meisten Aufgaben durch in den Text
+eingefügte Anweisungen gesteuert werden. Solche Angaben für die Textkosmetik und
+den EUMEL-Drucker nennen wir im folgenden kurz #on("b")##on("i")#'Anweisung' #off("b")##off("i")#. Die Form der
+#ib#Anweisung#ie# ist für die Textkosmetik und den EUMEL-Drucker gleich und entspricht
+der ELAN-Syntax. Beachten Sie den #ib#Unterschied zwischen einem Kommando und
+einer Text-Anweisung#ie#: während ein Kommando direkt ausgeführt wird, wird eine in
+den Text eingebettete Anweisung erst nach dem Aufruf von Textkosmetik- und
+Drucker-Programmen wirksam.
+
+Die Wirkungsweise der Textkosmetik-Anweisungen ist leicht zu erlernen und kann
+vor allen Dingen stufenweise erfolgen. Deshalb ein guter Rat für Anfänger: Lesen Sie
+diesen Teil des Benutzer-Handbuchs erst oberflächlich, so daß Sie ungefähr
+Bescheid wissen, welche Möglichkeiten die Textkosmetik-Programme bieten. Dann
+können Sie diejenigen Teile der Textkosmetik auswählen und bei Bedarf anwenden,
+die Sie für Ihre spezielle Anwendung benötigen.
+#page#
+
+#ib(9)#5.1. Einführung in die Benutzung der
+ #ib#Textkosmetik#ie##ie(9)#
+
+#free(1.0)#
+ #on("i")#
+ In diesem Kapitel erhalten Sie eine Übersicht über die verfügbaren Programme der
+ Textkosmetik.
+
+#off("i")#
+#free(1.3)#
+Schreiben, Gestalten und Drucken von Texten
+
+#free(1.0)#
+ #on("i")#
+ Im EUMEL-System unterscheiden wir zwischen drei Stufen einer Textbehand­
+ lung:#on("b")# Erstellung, Gestaltung#off("b")# und #on("b")#Druck#off("b")#. Die Trennung in verschiedene Arbeits­
+ stufen hat den Vorteil, daß Sie sich zu einem Zeitpunkt nur auf einen Arbeitsschritt
+ konzentrieren müssen.
+ #off("i")#
+#free(1.3)#
+Texterstellung bzw. Textbearbeitung
+
+#free(1.0)#
+Das Schreiben von Texten wird mit Hilfe des Editors erledigt. In dieser Stufe der
+Texterstellung können Sie sich ausschließlich auf das Schreiben und die inhaltliche
+Korrektheit Ihres Textes konzentrieren. Wird ein Text ohne Anweisungen gedruckt,
+dann erscheint er so, wie er mit dem Editor geschrieben wurde. Bei der Erstellung
+des Textes können Sie aber auch bereits Textkosmetik-Anweisungen in den Text
+einfügen.
+
+____________________________________________________________________________
+
+ Es ist wichtig, daß Sie das Kapitel 'Editor'
+ \#on("b")\#sehr\#off("b")\# gründlich lesen.
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+Es ist wichtig, daß Sie das Kapitel 'Editor'
+#on("b")#sehr#off("b")# gründlich lesen.
+
+
+Sie sollten Texte im 'Fließtext'-Modus erstellen, d.h., dann werden Worte, die über
+Zeilengrenzen gehen, ohne Silbentrennung vom Editor in die nächste Zeile gebracht.
+#free(1.5)#
+Textkosmetik bzw. Textgestaltung
+
+#free(1.0)#
+Nachdem Sie einen Text geschrieben haben, können Sie ihn mit #ib#Textkosmetik-
+Programme#ie#n gestalten, ohne ihn inhaltlich zu verändern. Dies kann auch vor oder
+nach eventuellen Korrekturen erfolgen. Die Textkosmetik bietet zur Zeit vier Pro­
+gramme an, die je nach Bedarf eingesetzt werden können:
+
+--- #on("b")#'#ib#lineform'/'autoform#ie#'#off("b")# formatiert einen Text zeilenweise und vollzieht eine
+ Silbentrennung. Weiterhin erlaubt 'lineform'/'autoform' die Verwendung unter­
+ schiedlicher Schrifttypen und Schrifthöhen.
+
+--- #on("b")#'#ib#pageform#ie#'/'#ib#autopageform#ie#'#off("b")# gestattet die Formatierung eines Textes in Seiten
+ (drucktechnisch: "Seitenumbruch"). Dabei berücksichtigt 'pageform'/'auto­
+ pageform' unterschiedliche Schrifthöhen. Es ist mit 'pageform'/ 'autopage­
+ form' u.a. möglich, die Seiteneinteilung zu bestimmen, eine Seite in Spalten
+ zu formatieren ("Zeitungsformat"), Zeilen am Anfang bzw. Ende jeder Seite
+ einfügen zu lassen, eine Seitennumerierung (drucktechnisch: "Paginierung")
+ zu erhalten und Fußnoten zu gestalten.
+
+--- #on("b")#'#ib#index#ie#'#off("b")# erlaubt die Erstellung von Stichwort- und Inhaltsverzeichnissen aus
+ einer mit 'pageform'/'autopageform' bearbeiteten Datei.
+
+--- #on("b")#'#ib#outline#ie#'#off("b")# holt aus einer Datei alle mit Index-Anweisung gekennzeichneten
+ Überschriften und Stichworte. Es erstellt somit eine Übersicht bzw. Kurz­
+ fassung eines Textes.
+#free(1.5)#
+Drucken
+#free(1.0)#
+Zu jedem Zeitpunkt der Texterstellung kann gedruckt werden. Der EUMEL-Drucker
+beachtet die gleichen Anweisungen wie die Textkosmetik-Programme und noch
+einige zusätzliche, die nur für die Druckaufbereitung notwendig sind. Spezielle Druck­
+leistungen, wie z.B. verschiedenartige Schrifttypen, können nur auf besonderen
+Druckern erzeugt werden. Verfügt ein Drucker nicht über eine bestimmte Hardware-
+Eigenschaft, wird die von ihm geforderte Leistung ignoriert. Somit ist es möglich,
+Probedrucke für Korrekturen etc. auch auf preiswerten Druckern herzustellen. (siehe
+hierzu 5.6.1.)
+#page#
+
+ +-------------------------+
+ l Text-Eingabe l
+ l l
+ +->-+ Editor +->-+
+ l l l l
+ l l erstellt Datei l l
+ l +------------+------------+ l
+ l l l
+ l V l
+ l +------------+------------+ l
+ l l lineform l l
+ +-<-+ +->-+
+ l l formatiert Zeilen l l
+ l +------------+------------+ l
+ l l l
+ l V l
+ l +------------+------------+ l
+ l l outline l l +--------------------------+
+ l l l l l E U M E L - Drucker l
+ +-<-+ gibt Übersicht bzw. +->-+ ->--+ l
+ l l Kurzfassung eines Textesl l l Probe- bzw. l
+ l l l l l endgültiger Druck l
+ l l Dateiname + '.outline' l l +--------------------------+
+ l +------------+------------+ l
+ l l l
+ l V l
+ l +------------+------------+ l
+ l l pageform l l
+ l l l l
+ +-<-+ formatiert Seiten +->-+
+ l l l l
+ l l Druckdatei l l
+ l l Dateiname + ".p" l l
+ l +------------+------------+ l
+ l l l
+ l V l
+ l +------------+------------+ l
+ l l index l l
+ l l l l
+ l l erstellt Stichwort- und l l
+ +-<-+ Inhaltsverzeichnisse +->-+
+ l l
+ l Indexdatei(en) l
+ l Dateiname + "i<nummer>" l
+ +-------------------------+
+ #page#
+
+#ib(9)#5.1.1. Anweisungen für die Textkosmetik
+ und den Drucker#ie(9)#
+#free(1.0)#
+ #on("i")#
+ In diesem Abschnitt wird beschrieben, wie Sie #ib#Anweisungen#ie# für die Textkosme­
+ tik- und Druckprogramme in einen Text einfügen können. Beachten Sie, daß jede
+ Anweisung von '\#'-Zeichen eingeschlossen werden muß. Benötigen Sie das
+ '\#'-Zeichen in Ihrem Text, müssen Sie es mit 'ESC' schreiben.
+ #off("i")#
+#free(1.0)#
+Es gibt zwei Arten von Anweisungen:
+
+a) Anweisungen, die das gesamte Aussehen eines Manuskripts verändern (#on("i")##ib#"layout-
+ Anweisungen"#ie##off("i")#). Zu diesen Anweisungen gehören die Anweisungen \#limit (...)\#­
+ (Einstellen der Zeilenbreite), \#linefeed (...)\# (Zeilenabstand), \#page\# (neue Seite)
+ usw. Diese Anweisungen gelten erst ab der nächsten Zeile und Sie sollten sie
+ daher in eine extra Zeile zwischen den Text stellen.
+
+____________________________________________________________________________
+
+\#type ("trium8")\#\#limit (11.0)\#
+\#start(5.0,1.5)\#
+\#pagelength(17.4)\#\#pagenr("%",148)\#\#setcount(1)\#
+\#block\#\#pageblock\#
+\#count per page\#
+\#headeven\#
+\#lpos(0.0)\#\#cpos(5.5)\#\#rpos(11.0)\#
+\#table\#
+ EUMEL-Benutzerhandbuch
+\#fillchar(" ")\#
+\#on("u")\# \#off("u")\#
+\#table end\#\#clear pos\#
+
+\#end\#
+\#headodd\#
+\#lpos(0.0)\#\#cpos(5.5)\#\#rpos(11.0)\#\#fillchar(" ")\#
+\#table\#
+ Teil 5: Textkosmetik und Druck
+\#fillchar(" ")\#
+\#on("u")\# \#off("u")\#
+\#table end\#\#clear pos\#
+
+\#end\#
+
+____________________________________________________________________________
+
+
+ Das Druckbild (das Ergebnis der Anweisungen) sehen Sie im vorliegenden
+ Benutzerhandbuch.
+
+ Anweisungen, die für den Gesamttext gelten sollen, müssen Sie an den Anfang
+ der Datei stellen (noch vor \#head\#).
+
+b) Anweisungen, die unmittelbar auf den nachfolgenden Text wirken sollen, wie z.B.
+ \#type\# (Schrifttyp), \#on\#/\#off\# (Modifikationen wie unterstreichen oder fett druk­
+ ken), \#ib\#/\#ie\# (Markierung von Stichworten) usw. Solche Anweisungen werden
+ unmittelbar beachtet und können überall auf einer Zeile stehen (wie in dem fol­
+ genden Beispiel).
+
+____________________________________________________________________________
+
+ \#on("underline")\#Ausnahmen\#off("underline")\# werden bei der
+ Beschreibung der Anweisungen speziell erwähnt.
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+ #on("u")#Ausnahmen#off("u")# werden bei der
+ Beschreibung der Anweisungen speziell erwähnt.
+
+____________________________________________________________________________
+
+Weitere Beispiele für Textkosmetik-Anweisungen:
+
+____________________________________________________________________________
+
+\#page\#
+\#free(3.0)\#
+\#type("quadrato")\#
+
+____________________________________________________________________________
+
+
+Diese Anweisungen entsprechen - wie alle Kommandos im EUMEL-System - der
+ELAN-Syntax (u.a. müssen sie klein geschrieben werden; Parameter in runden
+Klammern; mehrere Parameter werden durch Kommata getrennt; #ib#TEXT-Parameter#ie# in
+Anführungsstrichen; #ib#REAL-Parameter#ie# mit Dezimalpunkt usw.). Leerzeichen spielen
+(außer in TEXT-Parametern) keine Rolle und können zur besseren Lesbarkeit belie­
+big verwendet werden.
+
+Die Zeichen, aus denen eine Anweisung besteht, werden bei der Formatierung einer
+Zeile oder Seite nicht mitgezählt und vom EUMEL-Drucker nicht gedruckt. Eine
+Zeile, die nur aus Anweisungen besteht, wird ebenso behandelt, auch wenn sie mit
+<CR> abgeschlossen wird.
+#page#
+#on("b")#
+
+#ib(9)#5.1.2. #ib#Aufruf der Textkosmetik-Programme#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ In diesem Abschnitt wird beschrieben, wie Sie die #ib#Textkosmetik-Programme
+ aktivieren#ie# können.
+ #off("i")#
+#free(1.0)#
+Sie rufen die Textkosmetik-Programme durch Kommandos auf (d.h. in der 'gib
+kommando'-Ebene). Sie geben ebenso wie zum Editieren den Namen des Pro­
+gramms und der Datei an.#goalpage("lineform")#
+
+____________________________________________________________________________
+
+ gib kommando:
+ lineform ("dateiname")
+
+____________________________________________________________________________
+
+
+ oder:
+ autoform ("dateiname")
+ pageform ("dateiname")
+ autopageform ("dateiname")
+ outline ("dateiname")
+#mark ("", "")#
+ index ("dateiname")
+
+
+
+
+'lineform'/'autoform' können Sie auch vom EUMEL-Editor aus aufrufen. Zu diesem
+Zweck markieren Sie den zu formatierenden Abschnitt der Datei und geben im
+Kommando-Zustand ( <ESC> <ESC> drücken) 'lineform' bzw. 'autoform' (ohne Para­
+meter).
+#mark ("", "")#
+
+Das Programm 'pageform'/'autopageform' erzeugt aus der Eingabedatei eine #ib#Druck­
+datei#ie#, die den Namen der angegebenen Eingabedatei mit dem Zusatz '.p' bekommt.
+
+____________________________________________________________________________
+
+ gib kommando:
+ pageform ("dateiname")
+
+____________________________________________________________________________
+
+
+Als Ergebnis erhalten Sie: "dateiname.p"
+
+
+
+
+Das Programm 'index' kann nur eine Druckdatei bearbeiten:
+
+____________________________________________________________________________
+
+ gib kommando:
+ index ("dateiname.p")
+
+____________________________________________________________________________
+
+
+und erstellt die angeforderten Verzeichnisse in Dateien, die mit dem Zusatz
+'.i<nummer>' gekennzeichnet werden.
+
+Beispiele: "dateiname.i1", "dateiname.i2" etc.
+
+
+
+
+'#ib#outline#ie#' erstellt ebenfalls eine neue Datei.
+
+____________________________________________________________________________
+
+ gib kommando:
+ outline ("dateiname")
+
+____________________________________________________________________________
+
+
+führt zu dem Ergebnis: "dateiname.outline" #mark ("", "")#
+#page#
+
+#ib(9)#5.1.3. Vorzeitiger #ib#Abbruch#ie# und
+ #ib#Fehlermeldungen#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Sie können alle Textkosmetik-Programme vorzeitig abbrechen. Eventuelle
+ Fehlermeldungen werden Ihnen in einem Fenster angezeigt.
+ #off("i")#
+#free(1.0)#
+Durch die #ib#<ESC>#ie(1,"-Abbruch")##ib##ie(1,"Abbruch mit ESC")#-Taste oder die #ib#<SV> #ie#-Taste und das Supervisor-Kommando 'halt'
+können Sie die Textkosmetik-Programme jederzeit vorzeitig abbrechen. Die Eingabe­
+datei steht Ihnen dann unverändert zur Verfügung. Ein #ib#vorzeitiger Abbruch#ie# kann
+notwendig sein, wenn Sie ein Programm mit einer falschen Datei aufgerufen haben
+oder zu viele Fehler gemeldet wurden.
+#mark ("", "")#
+
+Alle Textkosmetik-Programme melden Fehler, wenn Sie Anweisungen falsch be­
+nutzen. Die Fehlermeldungen werden auf dem Bildschirm angezeigt. Bei Beendigung
+eines Programms wird - falls Fehler entdeckt wurden - automatisch der #ib#Fenster-
+Editor#ie# aufgerufen, wobei die Fehlermeldungen im unteren #ib#Fenster#ie# (das ist das #ib#Notiz­
+buch#ie#) angezeigt werden, während Ihnen im oberen Fenster die Eingabedatei zur
+Korrektur angeboten wird.
+
+____________________________________________________________________________
+
+.......................dateiname.................Zeile 1
+
+ \#corner1("-5.0")\#\#on("i")\#
+ Sie können alle Textkosmetik-Programme vorzeitig abbrechen.
+ Eventuelle Fehlermeldungen werden Ihnen in einem Fenster ange­
+ zeigt.
+ \#box3("T","2","115.0")\#\#off("i")\#
+ #cursor(" ")#
+
+.......................notebook..................Zeile 1
+FEHLER Zeile 1: Unbekannte Anweisung (ignoriert): corner1("-5.0")
+ >>> Bitte Korrigieren
+FEHLER Zeile 5: Unbekannte Anweisung (ignoriert):
+ box3("T","2","115.0")
+ >>> Bitte Korrigieren
+
+____________________________________________________________________________
+
+
+
+
+
+Um von der Eingabedatei zum Notizbuch - und umgekehrt - zu wechseln, betätigen
+Sie <ESC> <w>.
+#page#
+
+#ib(9)#5.2. #ib#Lineform/Autoform#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Die Programme '#ib(1, "ff")#lineform#ie#' oder '#ib(1, "ff")#autoform#ie#' formatieren einen Text zeilenweise (ggf.
+ mit Silbentrennung) unter Berücksichtigung von Schrifttyp und Zeilenbreite.
+ #off("i")#
+#free(1.0)#
+Zur #ib#Zeilenformatierung#ie# werden Ihnen zwei Programme (Kommandos) angeboten, die
+sich nur in ihrem interaktiven Charakter unterscheiden (Behandlung von Silben­
+trennungen):
+
+---- #on("b")##ib#autoform#ie##off("b")#:
+ Zeilenformatierung mit automatischer #ib#Silbentrennung#ie#. Sie sollten 'autoform'
+ nur bei Texten einsetzen, in denen einige wenige Trennfehler nicht von
+ großer Bedeutung sind, z.B. bei Probedrucken.
+
+---- #on("b")##ib#lineform#ie##off("b")#:
+ Zeilenformatierung mit Silbentrennung "per Hand", wobei (nach deutschen
+ Trennregeln) ein sinnvoller Trennvorschlag gemacht wird. Die Trennstelle
+ kann interaktiv soweit verschoben werden, wie das zu trennende Wort noch
+ auf die Zeile paßt.
+
+
+'lineform'/'autoform' hat im wesentlichen vier Aufgaben:
+
+---- #ib#Auffüllen von Zeilen#ie#:
+ 'lineform'/'autoform' kann besonders gut nach Korrekturen eingesetzt wer­
+ den, bei denen - nach Einfügungen oder Löschungen - nicht vollständige
+ oder zu lange Zeilen in der Datei stehenbleiben können.
+
+---- Erstellen von Zeilen mit unterschiedlichen Schrifttypen:
+ Werden in einer Datei mehrere Schriftarten (\#type\#-Anweisung) verwendet,
+ berechnet 'lineform'/'autoform' nach der eingestellten Zeilenbreite die Anzahl
+ der Zeichen, die auf eine Zeile passen.
+
+---- Bearbeitung unterschiedlicher Zeilenbreiten:
+ Manchmal ist es notwendig, die Zeilenbreite zu verändern (\#limit\#-
+ Anweisung). Dies wird von 'autoform'/'lineform' berücksichtigt.
+
+---- Silbentrennung:
+ Automatische ('autoform') und interaktive Silbentrennung ('lineform').
+
+
+'lineform'/'autoform' akzeptiert als Eingabe eine Datei und verändert diese. Dafür wird
+eine (interne) Zwischendatei benötigt. Deshalb müssen Sie darauf achten, daß noch
+ausreichend Platz auf dem System ist, der jedoch nur zwischenzeitlich für den Forma­
+tierungsschritt benötigt wird.
+
+'lineform' und auch 'pageform' sind auf den ersten Schrifttyp der Fonttabelle, auf eine
+Zeilenbreite von 16.0 und eine Seitenhöhe von 25.0 initialisiert. Sind die ersten An­
+weisungen, die das verändern könnten, fehlerhaft, so bleiben diese Werte (wie auch
+sonst bei ignorierten Anweisungen) erhalten.
+
+'lineform'/'autoform'fragt nach dem Kommando an, mit welchem #ib#Schrifttyp#ie# und mit
+welcher #ib#Zeilenbreite#ie# die Datei formatiert werden soll. Dabei erscheinen zuerst die
+voreingestellten Anweisungen. Beispiel:
+
+____________________________________________________________________________
+
+LINEFORM (für ... Zeilen): dateiname
+
+Bitte Schrifttyp: micro
+Zeilenbreite (in cm): 16.0
+
+
+____________________________________________________________________________
+
+
+
+Diese Anweisungen können Sie jetzt durch Ihre gewünschten Anweisungen ersetzen.
+Diese Informationen werden von 'autoform'/'lineform' in Form von \#limit\#- und
+\#type\#-Anweisungen in der Datei vermerkt, so daß die Anfragen bei weiteren
+Datei-Bearbeitungen entfallen.
+
+Bei Zeilen, die länger als die angegebene Zeilenbreite sind, werden diejenigen Worte,
+die über die Zeilenbreite hinausgehen, in die nächste Zeile umgebrochen. Kürzere
+Zeilen werden aus der nachfolgenden Zeile bis zur Zeilenbreite aufgefüllt. Worte
+werden jedoch nicht über Absatzgrenzen hinweg verschoben. Deshalb sollten Sie vor
+Anwendung von 'lineform'/'autoform' darauf achten, daß Absätze richtig markiert
+wurden. Fehlende Markierungen sollten Sie nachträglich einfügen ( <CR> am Ende
+einer Zeile), andernfalls werden Zeilen über Absatzgrenzen zusammengezogen. Dies
+ist besonders bei Tabellenzeilen unangenehm.
+
+#ib#Einrückungen#ie# (Leerzeichen am Anfang einer Zeile) werden von 'lineform'/'autoform'
+ebenfalls bei der Formatierung von Zeilen eingehalten.
+#page#
+
+#ib(9)#5.2.1. #ib#Zeilenweise formatieren#ie##ie(9)#
+#free(1.0)#
+#ib(9)#5.2.1.1. #ib#Interaktive Silbentrennung#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ 'lineform' trennt Silben interaktiv, d.h., es werden Ihnen von 'lineform' #ib#Trennungs­
+ vorschläge#ie# gemacht, die Sie bestätigen oder ablehnen können.
+ #off("i")#
+#free(1.0)#
+Paßt ein Wort nicht mehr ganz auf eine Zeile, dann wird es zur interaktiven Tren­
+nung angeboten. Bei der Trennung werden Anweisungen innerhalb des Wortes ent­
+sprechend berücksichtigt. Die Umgebung dieses Wortes wird zur Erleichterung des
+Trennvorgangs mit angezeigt. Das Trennzeichen erscheint an einer sinnvollen Stelle
+im zu trennenden Wort.
+
+____________________________________________________________________________
+
+ Text vor dem Trennwort; das
+ Trenn-wort steht mit diesem Text in dieser Zeile
+
+____________________________________________________________________________
+
+
+Der Teil des zu trennenden Wortes, der noch auf die Zeile passen würde, wird mar­
+kiert angezeigt. Sie können das Trennzeichen mit Hilfe der Positionierungstasten
+innerhalb des Trennbereichs verschieben. An der gewünschten Trennposition (der
+Wortteil, der noch auf die Zeile kommen soll, steht links vom Trennstrich) kann die
+<CR>-Taste betätigt werden. <CR> zeigt dem Programm 'lineform' an, daß an dieser
+Stelle die Trennung erfolgen soll. 'lineform' fügt an den ersten Teil des Wortes das
+"-"-Zeichen an und schreibt den abgetrennten Wortteil in die nächste Zeile.
+#page#
+Es stehen folgende #ib(1)#Operationen bei der interaktiven Trennung#ie# zur Verfügung:
+#lpos(0.0)# #bpos(4.0, 11.0)# #table#
+
+#on("b")#Taste Bedeutung#off("b")#
+
+<CR> Trennen.
+
+
+<<> Trennzeichen um ein Zeichen nach links verschieben.
+
+
+<>> Trennstelle um ein Zeichen nach rechts verschieben.
+
+
+<HOP> <<> Trennstelle vor das Wort setzen (das Wort wird an
+ dieser Position nicht getrennt).
+
+
+<HOP> <>> Trennstelle an das Ende der Markierung setzen.
+
+
+<BLANK> Trennzeichen wird von "-" auf " " umgeschaltet.
+ Dies kann verwendet werden, um Worte, die nicht
+ zusammengeschrieben werden sollen, beim Trenn­
+ vorgang in zwei Worte aufzuspalten.
+
+
+<-> Schaltet das Trennzeichen von Leerzeichen (" ")
+ wieder auf den Trennstrich ("-") um.
+
+
+<ESC> Abbruch von 'lineform'/'autoform'. Die zu bearbeitende
+ Datei steht unverändert zur Verfügung.
+
+#tableend##clearpos#
+#page#
+Zwei Besonderheiten sind bei der interaktiven Trennung noch zu beachten:
+
+ - Bei Worten mit Bindestrich wird die Trennstelle hinter dem Bindestrich als Leer­
+ zeichen angezeigt.
+
+ - Bei einer Trennposition zwischen den Zeichen "ck" wird das Zeichen "c" in ein
+ "k" umgewandelt.
+
+ Beispiel: Druk-ker
+
+Sofern es für die Zeilenformatierung notwendig ist, macht die Prozedur 'lineform'
+bereits erfolgte Trennungen rückgängig (das Trennzeichen wird entfernt und die
+Wortteile werden wieder zusammengefügt), wenn sich das getrennte Wort (etwa durch
+Korrekturen oder Veränderungen der Zeilenbreite) nicht mehr am Zeilenende befinden
+sollte.
+
+Wenn Sie nicht Ihren Gesamttext mit 'lineform' bearbeiten möchten, haben Sie die
+Möglichkeit, #ib#'lineform' auf einen Textausschnitt#ie# anzuwenden. Hierfür markieren Sie
+den gewünschten Bereich, drücken <ESC> <ESC> und geben im Editor das Kommando
+'lineform'. (siehe S. #topage("lineform")#)
+
+____________________________________________________________________________
+
+...................dateiname................... Zeile 30
+
+
+Wenn Sie nicht Ihren Gesamttext mit 'lineform' bearbeiten
+möchten/brauchen, haben Sie die Möglichkeit,
+'lineform' für einen
+Textausschnitt anzuwenden. Hierfür markieren Sie den gewünschten
+Bereich, drücken 'ESC' 'ESC' und
+geben das Kommando 'lineform'.
+
+
+gib kommando:lineform
+
+
+____________________________________________________________________________
+
+
+#page#
+
+#ib(9)#5.2.1.2. #ib#Automatische Silbentrennung#ie# mit
+ '#ib#autoform#ie#'#ie(9)#
+#free(1.0)#
+ #on("i")#
+ 'autoform' arbeitet wie 'lineform', nur werden die Silbentrennungen automatisch
+ vorgenommen.
+ #off("i")#
+#free(1.0)#
+Ist eine Silbentrennung bei der Formatierung notwendig, übernimmt 'autoform' diese
+automatisch. Die Trennungen werden in das #ib#Notizbuch#ie# eingetragen. Nach Beendigung
+der Formatierung wird die bearbeitete Datei und das Notizbuch zur Kontrolle der
+Silbentrennungen angezeigt. Die automatische Silbentrennung arbeitet mit einer hohen
+#ib#Trenngüte#ie#; allerdings nur für deutsche Texte. Trotzdem kann es vorkommen, daß
+einige Trennungen, insbesondere bei zusammengesetzten Worten, falsch vorgenom­
+men werden. In einem solchen Fall müssen Sie diese nachträglich mit dem Editor
+korrigieren. (vgl. Sie dazu auch 5.8.4.)
+#page#
+
+#ib(9)#5.2.2. #ib#Unterschiedliche Schriften#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ #ib#Unterschiedliche Schrifttypen#ie# (Schriftarten) können Sie mit der \#type ("schrift­
+ name")\#-Anweisung anfordern.
+ #off("i")#
+#free(1.0)#
+Sie haben die Möglichkeit, mit 'lineform' verschiedenartige #ib#Schrifttypen#ie(1, ", unterschiedliche")# (kurz Typen
+genannt) verarbeiten zu lassen. Jede Type hat eine bestimmte Höhe und jedes Zei­
+chen hat eine bestimmte Breite. Alle Typen werden auf einer Grundlinie gedruckt.
+
+Es gibt zwei Arten von Schriften:
+bei#on("b")# #ib#äquidistanten Schriften#ie##off("b")# sind alle Zeichen gleich breit (wie bei einer Schreib­
+maschine).#on("b")# #ib#Proportionalschrift#ie##off("b")# findet man in gedruckten Büchern. Hier haben unter­
+schiedliche Zeichen auch unterschiedliche Breiten. Die Zeichen ".", "i", "!" sind z.B.
+schmaler als die Zeichen "w", "o", "m" usw.
+
+Mit der Anweisung:
+
+____________________________________________________________________________
+
+ \#type ("schriftname")\#
+
+____________________________________________________________________________
+
+
+kann auf einen anderen Schrifttyp umgeschaltet werden (auch mehrmals innerhalb
+einer Zeile). Diese Type gilt solange, bis wieder eine neue \#type ("schriftname")\#-
+Anweisung gegeben wird.
+
+____________________________________________________________________________
+
+
+ \#type ("micro")\#Jetzt schreiben wir mit einem
+ Schrifttyp, der 'micro' heißt. Und jetzt
+ \#type ("modern15")\#schalten wir auf eine an­
+ dere Schriftart um. Nun \#type ("modern12")\#
+ möchten wir mit einer größeren Type schrei­
+ ben. Um wieder zu unserem gewohnten Schrift­
+ typ zu gelangen, schalten wir auf \#type
+ ("trium8")\# zurück.
+
+
+____________________________________________________________________________
+
+
+Druckbild (ohne 'lineform'):
+
+
+Jetzt schreiben wir mit einem
+Schrifttyp, der 'micro' heißt. Und jetzt
+schalten wir auf eine an­
+dere Schriftart um. Nun
+möchten wir mit einer größeren Type schrei­
+ben. Um wieder zu unserem gewohnten Schrift­
+typ zu gelangen, schalten wir auf
+\#type ("trium8")\# zurück.
+
+
+
+Welche Schriftarten Ihnen zur Verfügung stehen, hängt natürlich von dem verfügbaren
+Drucker ab. Sie können die vorhandenen Schrifttypen mit dem Kommando 'list fonts'
+erfragen.
+
+Schrifttypen können modifiziert, d.h. verändert, gedruckt werden (vergl. Sie dazu den
+nächsten Abschnitt). Durch die Angabe einer \#type ("schriftname")\#-Anweisung
+werden alle Modifikationen ausgeschaltet.
+#page#
+#goalpage("on")##goalpage("off")#
+
+#ib(9)#5.2.3. #ib#Veränderung des Schrifttyps#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#on ("..."\#-#ie(1,"Anweisung")# und #ib#\#off ("...")\#-Anweisung#ie# können Sie einen Schrifttyp in
+ seinem Aussehen verändern. Die Schrift wird zwar nicht gewechselt, aber ver­
+ ändert gedruckt. Zur Zeit ist #ib##ie(1,"Unterstreichung")##ib# unterstrichen#ie#, #ib#fett#ie#, #ib#kursiv#ie# und der Druck von#ib# weiß auf
+ schwarz #ie#möglich (abhängig vom eingesetzten Drucker).
+ #off("i")#
+#free(0.7)#
+Die \#on\#/\#off\#-Anweisung wirkt wie ein Schalter, der die gewünschte #ib#Schrifttyp-
+Modifikation#ie# ein- bzw. ausschaltet. Die Anweisung \#on\# schaltet die Modifikation ein,
+\#off\# schaltet sie aus.
+
+____________________________________________________________________________
+
+ Das EUMEL-System ermöglicht es Ihnen,
+
+ \#on ("italic")\#kursiv\#off ("italic")\#
+ \#on ("i")\# \#off ("i")\#
+
+ und
+
+ \#on ("underline")\#unterstrichen\#off ("underline")\#
+ \#on ("u")\# \#off ("u")\#
+
+ und
+
+ \#on ("bold")\#fett\#off ("bold")\#
+ \#on ("b")\# \#off ("b")\#
+
+ und
+
+ \#on ("reverse")\#invers (weiß auf schwarz)\#off ("reverse")\#
+ \#on ("r")\# \#off ("r")\#
+
+ zu schreiben
+
+____________________________________________________________________________
+#page#
+Druckbild:
+
+
+ Das EUMEL-System ermöglicht es Ihnen,
+
+ #on("i")#kursiv#off("i")#
+
+ und
+
+ #on("underline")#unterstrichen#off("underline")#
+
+ und
+
+ #on("b")#fett#off("b")#
+
+ und
+
+ #on("reverse")#invers (weiß auf schwarz)#off("reverse")#
+
+ zu schreiben.
+
+
+
+Dabei sollten Sie folgendes beachten:
+
+a) Ein \#type\#-Anweisung schaltet immer eine vorausgehende Modifikation aus, d.h.
+ ein Schrifttypwechsel macht eventuelle \#off ("b")\#-, \#off ("u")\#-, \#off ("i")\#-
+ und \#off ("r")\#-Anweisungen überflüssig.
+
+b) 'lineform'/'autoform' erzeugt eine Warnung, falls Sie vergessen haben, eine Modi­
+ fikation auszuschalten.
+
+c) Nicht alle Drucker können die hier angegebenen Modifikationen auch drucken.
+ Welche Modifikationen gleichzeitig eingeschaltet werden können, ist ebenfalls
+ druckerabhängig.
+#page#
+
+#ib(9)#5.2.4. #ib#Gesperrt schreiben#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Die Silbentrennung an einem Leerzeichen verhindert man durch Verwendung des
+ geschützten Leerzeichens 'ESC' und 'Leertaste'.
+ #off("i")#
+#free(1.0)#
+Möchten Sie ein Wort g e s p e r r t schreiben, muß natürlich verhindert werden, daß
+dieses Wort beim Formatieren getrennt wird. Andere Worte, wie z.B. in Formeln,
+sollten ebenfalls zusammen auf eine Zeile geschrieben werden (z.B. 'sin (x)'). Dies
+können Sie erreichen, indem Sie nicht das Leerzeichen zwischen die Zeichen schrei­
+ben, denn das Leerzeichen bedeutet für 'autoform'/'lineform' immer das Ende eines
+Wortes. Stattdessen verwenden Sie <ESC> <Leertaste>. Das geschützte Leerzeichen
+erscheint auf dem Bildschirm zur besseren Identifizierung invers dargestellt bzw. als
+ein anderes Zeichen (abhängig von Ihrem Gerät). Beim Drucken wird jedoch wieder
+ein Leerzeichen produziert.
+
+
+
+____________________________________________________________________________
+
+ g e s p e r r t
+
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+ g e s p e r r t
+
+
+
+#page#
+#goalpage("limit")#
+
+#ib(9)#5.2.5. #ib#Zeilenbreite einstellen#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#limit\#-Anweisung#ie# können Sie die Zeilenbreite einstellen.
+ #off("i")#
+#free(1.0)#
+Die \#limit\#-Anweisung gibt in cm an, wie breit die Zeile sein soll. Beachten Sie, daß
+diese Anweisung nichts mit dem Editor-Kommando 'limit' zu tun hat. Dieses gibt an,
+wie viele Zeichen eine Bildschirmzeile lang sein soll.
+
+Die Zeilenbreite wird zusammen mit dem Schrifttyp beim erstmaligen Aufruf von
+'autoform'/'lineform' interaktiv erfragt und als \#limit\#-Anweisung (zusammen mit der
+\#type\#-Anweisung) in die erste Zeile der Datei eingetragen. Sie kann in einer Datei
+mehrmals verändert werden.
+
+Die neue Zeilenbreite gilt immer ab der #on("b")#nächsten#off("b")# Zeile, die der \#limit\#-Anweisung
+folgt. Beachten Sie, daß Sie als Parameter in der \#limit\#-Anweisung eine Zahl mit
+Dezimalpunkt und Nachkommastelle angeben müssen.
+
+____________________________________________________________________________
+
+
+\#limit(9.0)\#
+ Mit der \#limit\#-Anweisung können Sie Para­
+ graphen in einem anderen Format leicht gestal­
+ ten. Die rechte Schreibgrenze wird durch die
+ \#limit\#-Anweisung eingestellt, wobei Sie den
+ linken Rand durch eine entsprechende Ein­
+ rückung gestalten können.
+\#limit(11.0)\#
+
+____________________________________________________________________________
+
+
+Druckbild (mit 'lineform' bearbeitet):
+
+
+ Mit der \#limit\#-Anweisung können Sie Paragraphen in einem
+ anderen Format leicht gestalten. Die rechte Schreibgrenze
+ wird durch die \#limit\#-Anweisung eingestellt, wobei Sie den
+ linken Rand durch eine entsprechende Einrückung gestalten
+ können.
+
+
+
+Die folgende Tabelle gibt sinnvolle #ib#'limit'-Einstellungen#ie# für die am häufigsten ver­
+wendeten Papiergrößen an:
+
+
+ #on("b")#Format 'limit' Verbleibender
+ (Zeilenbreite) Rand#off("b")#
+
+ DIN A4 16.0 cm je 2.50 cm
+
+ DIN A5 12.0 cm je 1.42 cm
+
+ DIN A4 quer 25.0 cm je 2.35 cm
+#page#
+#goalpage("einfache Tabellen")#
+
+#ib(9)#5.2.6. Einfache #ib#Tabellen#ie(1,", einfache")# und #ib#Aufzählungen#ie#
+ schreiben#ie(9)#
+#free(1.0)#
+ #on("i")#
+ Aufzählungen und einfache #ib#Tabellen#ie(1, ", einfache")# werden automatisch richtig formatiert und
+ gedruckt, wenn Sie sich an einige einfache Regeln halten.
+ #off("i")#
+#free(1.0)#
+Verwenden Sie eine #ib#Proportionalschrift#ie# beim Tabellenschreiben, so sind die Spalten in
+der Regel unterschiedlich breit, selbst wenn Sie eine gleiche Anzahl Zeichen in jeder
+Spalte schreiben. Dies können Sie durch das Schreiben von einem "#ib#Doppelblank#ie#"
+("#ib#Mehrfachblank#ie#") vermeiden; für kompliziertere Tabellen gibt es spezielle Tabellen­
+anweisungen. (siehe auch S. #topage("tabellenanw")#)
+
+____________________________________________________________________________
+
+ iiii ooooo
+ mmmm lllll
+
+____________________________________________________________________________
+
+
+
+Druckbild:
+
+
+ iiii ooooo
+ mmmm lllll
+
+Erste und zweite Spalte stehen nicht untereinander.
+
+
+Aber mit Doppelblanks:
+
+____________________________________________________________________________
+
+ iiii ooooo
+ mmmm lllll
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+
+ iiii ooooo
+ mmmm lllll
+
+Erste und zweite Spalte stehen jetzt untereinander.
+
+Das Doppelblank dient 'lineform'/'autoform' und dem Drucker als Zeichen, daß die
+Positionen speziell berechnet und beim Druck berücksichtigt werden müssen. Das gilt
+nur nach einer Absatzzeile. In seltenen Fällen (insbesondere beim Einsatz von Schrift­
+typen, die in der Größe stark voneinander abweichen) kann es vorkommen, daß diese
+Tabellenautomatik nicht funktioniert und Spalten übereinander gedruckt werden. In
+solchen Fällen müssen Sie die Anzahl der trennenden Doppelblanks erhöhen.
+
+#on("b")##on("is")#Praktischer Tip:#off("is")##off("b")#
+Beachten Sie, daß es für das Funktionieren der "#ib#Tabellenautomatik#ie#" erforderlich ist,
+daß jede Tabellenzeile eine Absatzzeile ist. Man sollte diese Zeilen vor dem Druck
+daraufhin überprüfen oder durch 'lineform'/'autoform' die Datei bearbeiten lassen.
+Sollten durch die zeilenweise Formatierung einmal wegen fehlender Absatzkennzeich­
+nung zwei Zeilen zusammengezogen sein, können Sie diese leicht mit dem Editor
+wieder "auseinanderbrechen" ( <HOP> <RUBIN> , <CR> und <HOP> <RUBIN> ).
+
+
+Ähnliches gilt bei Aufzählungen.
+
+____________________________________________________________________________
+
+ 1) Das ist die erste Aufzählung.
+ Dieser Satz wird bündig gedruckt.
+ 2) Hier auch.
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+
+ 1) Das ist die erste Aufzählung.
+ Dieser Satz wird bündig gedruckt.
+ 2) Hier auch.
+
+
+Auch in solchen Fällen wird der gedruckte Text in der Regel richtig eingerückt. Die
+#ib#Tabellenautomatik#ie# wirkt nur nach einem Absatz. Hier aber ein Beispiel für eine
+typische Fehlersituation:
+
+____________________________________________________________________________
+
+ \#type("normal")\#
+ 1. Aufzählung
+ 2. Aufzählung
+ 3. Aufzählung
+
+ \#type("fett")\#M1. Aufzählung
+
+____________________________________________________________________________
+
+
+Die Einrückbreite wird durch den Schrifttyp bestimmt, der vor der Zeile herrscht, und
+den ganzen Absatz über beibehalten.
+
+
+Druckbild:
+
+
+ 1. Aufzählung
+ 2. Aufzählung
+ 3. Aufzählung
+
+ M1. Aufzählung
+
+
+Das Blank zwischen 'M1.' und 'Aufzählung' reicht nicht aus, um eine Überschreibung
+zu verhindern. Diesen Fehler können Sie umgehen, indem Sie die \#type\#-Anweisung
+in eine gesonderte Zeile stellen. Richtig wäre folgendes (gewünschter Schrifttyp vor
+die Zeile!):
+
+____________________________________________________________________________
+
+ \#type("trium8")\#
+ 1. Aufzählung
+ 2. Aufzählung
+ 3. Aufzählung
+
+ \#type("triumb14")\#
+ M1. Aufzählung
+
+____________________________________________________________________________
+
+
+
+Druckbild:
+
+
+ 1. Aufzählung
+ 2. Aufzählung
+ 3. Aufzählung
+
+
+ M1. Aufzählung
+
+
+Die genauen Regeln sind etwas kompliziert, so daß sie hier nicht einzeln aufgeführt
+werden (siehe S. 5-89#topage("block")# unter der Anweisung \#block\#). Treffen Sie auf einen der
+seltenen Fälle, wo die Tabellenautomatik nicht funktioniert, können Sie immer noch
+Tabellen-Anweisungen verwenden.
+#mark ("", "")#
+#page#
+
+#goalpage("tabellenanw")#
+#ib(9)#5.2.6.1. #ib#Tabellenanweisungen#ie##ie(9)#
+#free(1.0)#
+ Mit den Tabellenanweisungen der Textkosmetik können Sie auf einfache Art Tabel­
+ len auch mit Porportionalschriften gestalten.
+#free(1.0)#
+Es ist sehr einfach, eine Tabelle in einer äquidistanten Schrift zu schreiben, denn
+hierbei stimmt das Schriftbild auf dem Terminal weitgehend mit dem späteren Druck
+überein. Bei einer äquidistanten Schrift ist jedes Zeichen gleich breit - Sie können
+also "sehen", an welcher Zeilenposition eine neue Spalte beginnt.
+
+Etwas schwieriger sind Tabellen mit Proportionalschriften, da hier jedes Zeichen eine
+unterschiedliche Breite hat. Sie können somit einer Spaltenbreite nicht direkt "an­
+sehen", wie breit sie beim Druck wirklich wird. "Einfache" Tabellen können Sie mit
+dem Mehrfachblank gestalten (siehe S. 5-27). Bei komplizierteren Tabellen müssen
+Sie die folgenden Tabellenanweisungen benutzen.
+
+Um eine Tabelle zu gestalten, gehen Sie folgendermaßen vor:
+
+- Definieren Sie die Spaltenpositionen der Tabelle mit den folgenden Anweisungen.
+ Für die Punkte bei den Anweisungen müssen Sie entsprechende Parameter
+ einsetzen.
+
+#goalpage("lpos")##goalpage("rpos")##goalpage("cpos")##goalpage("dpos")##goalpage("bpos")#
+#goalpage("fillchar")#
+____________________________________________________________________________
+
+ #ib#\#l pos#ie(1,"-Anweisung")# (...)\# (* linksbündig *)
+ #ib#\#r pos#ie(1,"-Anweisung")# (...)\# (* rechtsbündig *)
+ #ib#\#c pos#ie(1,"-Anweisung")# (...)\# (* zentrierend *)
+ #ib#\#d pos#ie(1,"-Anweisung")# (..., ...)\# (* zentrierend um eine Zeichenkette *)
+ #ib#\#b pos#ie(1,"-Anweisung")# (..., ...)\# (* Blocksatz in einer Spalte *)
+ #ib#\#fillchar#ie(1,"-Anweisung")# (...)\# (* Füllzeichen zwischen Spalten *)
+
+____________________________________________________________________________
+
+
+ Die Zentrierung um eine Zeichenkette ist wie folgt zu verstehen: Die Spalte wird
+ bis zum Anfang der angegebenen Zeichenkette rechtsbündig und ab der Zeichen­
+ kette linksbündig geschrieben.
+
+#goalpage("table")#
+- Schreiben Sie dann die Tabelle. Sie muß von den Anweisungen
+
+____________________________________________________________________________
+
+ #ib#\#table\##ie(1,"-Anweisung")#
+
+
+ #ib#\#table end\##ie(1,"-Anweisung")#
+
+____________________________________________________________________________
+
+
+ eingefaßt werden. Die Spalten in der Tabelle müssen Sie durch mindestens zwei
+ Leerzeichen voneinander trennen. Es müssen alle Spalten in einer Tabelle vor­
+ handen sein. Soll einmal eine Spalte leer bleiben, müssen Sie für diese Spalte ein
+ #ib#geschütztes Leerzeichen#ie# verwenden.
+
+- Da die Spaltenpositionen erhalten bleiben (auch über die Anweisung \#table end\#
+ hinweg), sollten Sie direkt hinter dem Tabellenende die #ib#\#clear pos\#-Anweisung#ie#
+ geben.
+
+- Dann können Sie 'lineform'/'autoform' vornehmen.
+
+____________________________________________________________________________
+
+
+ \#r pos (2.2)\#\#c pos (3.8)\#\#l pos (5.8)\#\#d pos (8.8, ".")\#
+ \#table\#
+ erste Spalte zweite Spalte dritte Spalte vierte Spalte
+ rechtsbündig zentriert linksbündig dezi.mal
+ 1234 1234 1234 12.34
+ 12345 12345 12345 123.45
+ 123456 123456 123456 1234.56
+ \#table end\# \#clear pos\#
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+
+ #r pos (2.2)##c pos (3.8)##l pos (5.8)##d pos (8.8, ".")#
+ #table#
+ erste Spalte zweite Spalte dritte Spalte vierte. Spalte
+ rechtsbündig zentriert linksbündig dezi.mal
+ 1234 1234 1234 12.34
+ 12345 12345 12345 123.45
+ 123456 123456 123456 1234.56
+ #table end##clear pos#
+
+
+
+Solche Tabellen können Sie in \#head\#, \#bottom\# oder innerhalb von Fußnoten schrei­
+ben. Es ist jedoch nicht möglich, eine Fußnote innerhalb dieser Tabelle zu definieren.
+Ausweg: Tabelle um die Fußnote aufspalten.
+#page#
+
+#ib(9)#5.2.6.2. Einstellen der #ib#Tabellenpositionen#ie (1, ", Einstellen von")##ie(9)#
+#free(0.7)#
+ #on("i")#
+ Mit den \#pos\#-Anweisungen können Sie eine bestimmte Position innerhalb der
+ Tabelle einstellen, zugleich aber auch bestimmen, wie die Spalte gedruckt werden
+ soll. #off("i")#
+
+#free(0.7)#
+____________________________________________________________________________
+
+ \#l pos (5.0)\#\#r pos (10.0)\#\#d pos (15.0, ".")\#
+
+____________________________________________________________________________
+
+
+Die Anweisung oben stellt die erste Spalte der Tabelle auf 5 cm vom Rand ein (links­
+bündig). Die zweite Spalte endet 10 cm vom Rand, wobei diese Spalte rechtsbündig
+geschrieben werden soll. Die dritte wird an die Position 15, zentriert um den Dezimal­
+punkt, gedruckt#u##count#)#e#.#foot#
+#u##value#)#e# Spaltenposition < 0.0 und Spaltenposition > 'eingestelltes limit' sind nicht
+ erlaubt.
+#end#
+
+Beachten Sie, daß ein "Überlappen" von Spalten erfolgen kann (in unserem Beispiel
+kann die erste Spalte in die zweite hineinschreiben). 'lineform' bzw. 'autoform' meldet
+bei Spalten-Überschreibungen einen entsprechenden Fehler.
+
+Für jede Spaltenposition nehmen Sie ein Element einer Zeile. Die Elemente müssen
+Sie beim Schreiben im Editor durch mindestens zwei Leerzeichen voneinander tren­
+nen. Auf die erste Spaltenposition wird das erste Element gedruckt, auf die zweite
+Position das zweite Element usw. Für das Drucken der Spalten wird der eingeschal­
+tete Schrifttyp mit möglicherweise einer Modifikation genommen. Der Schrifttyp und
+die Modifikation können innerhalb der Tabelle geändert werden#u##count#)#e#.#foot#
+#u##value#)#e# Die Zwischenräume zwischen den Spalten werden nicht modifiziert (also z.B.
+ nicht unterstrichen).
+#end#
+
+Beachten Sie, daß die Tabellenpositionen so lange erhalten bleiben, bis sie explizit
+gelöscht werden (\#clear pos\#-Anweisung, siehe S. 5-38).
+#page#
+
+#ib(9)#5.2.6.3. #ib#Blocksatz innerhalb einer Spalte#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Für Blocksatz innerhalb einer Spalte verwenden Sie die \#b pos (...)\#-Anweisung.
+ #off("i")#
+#free(1.0)#
+____________________________________________________________________________
+
+\#l pos (0.0)\#\#b pos (2.2, 8.0)\#\#l pos (9.0)\#
+\#table\#
+1. Spalte Die mittlere Spalte wird bis zur Druck­ 3. Spalte
+1. Spalte position '8.0' in Blocksatz gedruckt. Um 3. Spalte
+1. Spalte in dieser Spalte einen Absatz zu bekom­ 3. Spalte
+1. Spalte men, muß ein geschütztes Leerzeichen am 3. Spalte
+1. Spalte Ende der Spalte stehen. #cursor(" ")# 3. Spalte
+\#table end\# \#clear pos\#
+
+____________________________________________________________________________
+
+
+
+Druckbild:
+
+#l pos (0.0)##b pos (2.2, 8.0)##l pos (9.0)#
+#table#
+1. Spalte Die mittlere Spalte wird bis zur Druck­ 3. Spalte
+1. Spalte position '8.0' in Blocksatz gedruckt. Um 3. Spalte
+1. Spalte in dieser Spalte einen Absatz zu bekom­ 3. Spalte
+1. Spalte men, muß ein geschütztes Leerzeichen am 3. Spalte
+1. Spalte Ende der Spalte stehen. 3. Spalte
+#table end##clear pos#
+#page#
+
+#ib(9)#5.2.6.4. #ib#Tabellenspalten auffüllen#ie# (#ib#Füllzeichen#ie#)#ie(9)#
+#free(1.0)#
+ #on("i")#
+ Mit der \#fillchar\#-Anweisung können Sie Spaltenzwischenräume füllen.
+ #off("i")#
+#free(1.0)#
+Angenommen, Sie möchten eine Rechnung erstellen. Die Warenposten sollen links­
+bündig an der Druckposition '0.0' und die Beträge rechtsbündig an der Position '9.0'
+gedruckt werden. Zwischen einem Warenposten und dem dazugehörigen Betrag sollen
+entsprechend viele Punkte ('.') gedruckt werden. Das folgende Druckbild:
+
+#l pos (0.0)##r pos (9.0)##fillchar(".")#
+#table#
+30 Benutzerhandbücher 450,-DM
+10 Systemhandbücher 150,-DM
+
+#table end##clear pos#
+
+wird mit
+
+____________________________________________________________________________
+
+ \#l pos (0.0)\#\#r pos (9.0)\#\#fillchar(".")\#
+ \#table\#
+ 30 Benutzerhandbücher 450,-DM
+ 10 Systemhandbücher 150,-DM
+
+ \#table end\#\#clear pos\#
+
+____________________________________________________________________________
+
+
+erreicht. Mit der Anweisung \##ib#fillchar#ie#\# stellen Sie das/die #ib#Füllzeichen#ie# ein. Somit wer­
+den entsprechend viele Füllzeichen (anstatt der Leerzeichen) von dem Textende einer
+Spalte bis zu dem Textanfang der nächsten Spalte gedruckt. Die Füllzeichen bleiben
+so lange eingestellt, bis erneut die Anweisung \#fillchar\# gegeben wird. Insbesondere
+bleibt das Füllzeichen - genauso wie auch die eingestellten Spaltenpositionen -
+über das Tabellenende erhalten. Die Anweisung \#clear pos\# löscht - zusätzlich zu
+den Tabellenpositionen - auch das eingestellte Füllzeichen (setzt das Zeichen auf ' '
+zurück).
+
+Beachten Sie, daß die Füllzeichen direkt gedruckt werden (also ohne Leerzeichen
+zwischen dem Spaltentext und den Füllzeichen). Möchten Sie einen Zwischenraum
+zwischen dem Spaltentext und den Füllzeichen haben, dann fügen Sie ein geschütz­
+tes Leerzeichen an den Spaltentext an oder setzen eins vor die nachfolgende Spalte.
+
+Die Anweisung \#fillchar\# gilt für Zwischenräume zwischen allen Spalten. Soll nur #on("i")#ein#off("i")#
+Spaltenzwischenraum ausgefüllt werden, müssen Sie die \#fillchar\#-Anweisung in der
+Tabelle entsprechend geben.
+
+____________________________________________________________________________
+
+ \#l pos (1.0)\#\#r pos (5.0)\#\#r pos (10.0)\#
+ \#table\#
+ 1\#fillchar(".")\# 3\#fillchar(" ")\# 4
+ 2\#fillchar(".")\# 17\#fillchar(" ")\# 6
+ \#table end\#
+
+____________________________________________________________________________
+
+
+
+Druckbild:
+
+#l pos (1.0)##r pos (5.0)##r pos(10.0)#
+#table#
+1#fillchar(".")# 3#fillchar(" ")# 4
+2#fillchar(".")# 17#fillchar(" ")# 6
+#tableend##clear pos#
+
+
+
+
+Eingeschaltete Modifikationen gelten in diesem Fall auch für die Spaltenzwischen­
+räume.
+#page#
+
+#ib(9)#5.2.6.5. #ib#Tabellenpositionen löschen#ie##ie(9)#
+#goalpage("clearpos")#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#clear pos\#-Anweisung#ie# löschen Sie alle eingestellten Positionen.
+ #off("i")#
+#free(1.0)#
+Sollen gänzlich neue Positionen eingestellt werden, benutzen Sie die Anweisung
+
+
+____________________________________________________________________________
+
+ \##ib#clear pos#ie(1,"-Anweisung")#\#
+
+____________________________________________________________________________
+
+
+
+ohne Parameter. Sie löscht alle eingestellten Tabellenpositionen. Beachten Sie, daß
+\#clear pos\# auch das Füllzeichen für die \#fillchar\#-Anweisung löscht (es wird wieder
+ein ' ' voreingestellt). Eine einzelne Tabellenposition können Sie z.B. mit
+
+
+____________________________________________________________________________
+
+ \#clear pos (10.0)\#
+
+____________________________________________________________________________
+
+
+löschen.
+#mark ("","")#
+#page#
+
+#goalpage("u")##goalpage("d")#
+#ib(9)#5.2.7. #ib#Indizes#ie# und #ib#Exponenten#ie##ie(9)#
+
+#free(1.0)#
+ #on("i")#
+ Mit den Anweisungen #ib#\#u\##ie(1, "-Anweisung")#, #ib#\#d\##ie(1,"-Anweisung")# und #ib#\#e\##ie(1,"-Anweisung")# können Sie Exponenten und Indizes
+ schreiben.
+ #off("i")#
+#free(1.0)#
+Die Anweisung \#u\# (steht für 'up') schaltet auf eine Exponenten-Schreibweise um
+und zwar so lange, bis die Anweisung \#e\# (steht für 'end') angetroffen wird. Dabei
+wird automatisch auf den nächst kleineren Schrifttyp umgeschaltet (sofern vorhanden).
+
+____________________________________________________________________________
+
+ a\#u\#i,k\#e\#
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+ a#u#i,k#e#
+
+
+
+Die \#d\#-Anweisung ('d' steht für 'down') ist für Indizes gedacht und arbeitet analog
+zur \#u\#-Anweisung.
+
+____________________________________________________________________________
+
+ a\#d\#i,k\#e\#
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+ a#d#i,k#e#
+
+
+Die automatische Umschaltung auf den nächst kleineren Schrifttyp erfolgt nur, wenn
+in der #ib#Fonttabelle#ie# ein nächst kleinerer Schrifttyp angegeben ist. Sonst wird der ein­
+gestellte Schrifttyp für den Exponenten beibehalten.
+
+Nach der \#e\#-Anweisung wird automatisch wieder der Schrifttyp eingestellt, der vor
+der zugehörigen \#u\#-Anweisung galt. Die \#u\#- und \#e\#-Anweisungen bilden also
+Klammern. Innerhalb einer Anweisung kann jede beliebige, sinnvolle Textkosmetik-
+Anweisung stehen. Beachten Sie, daß Anweisungen innerhalb einer Klammer die
+Zeilenhöhe nicht verändern sollen. Wenn Sie beispielsweise eine \#type\#-Anweisung
+in eine Klammer schreiben, wird zwar der Index/Exponent in diesem Schrifttyp ge­
+druckt, aber der Drucker geht davon aus, daß die Zeilenhöhe nicht überschritten wird.
+Deshalb ist es angeraten, nur einen kleineren Schrifttyp innerhalb eines Index/Expo­
+nenten zu verwenden. Wie bereits erwähnt, wird auch in diesem Beispiel nach dem
+Klammerende auf den vorher eingestellten Schrifttyp zurückgestellt.
+
+Die Index/Exponenten-Klammern können auch geschachtelt werden.
+
+____________________________________________________________________________
+
+ a\#u\#um 1 hoch\#u\#noch 1 hoch\#e\#um 1 zurück\#e\# Grundlinie
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+ a#u#um 1 hoch#u#noch 1 hoch#e#um 1 zurück#e# Grundlinie
+
+
+
+Es gelten folgende #on("b")#Einschränkungen#off("b")#:
+
+1. Ein Exponent (Index) wird so positioniert, daß es in der Regel keine Überschrei­
+ bung mit der vorhergehenden (nachfolgenden) Zeile gibt.
+
+2. Bei mehrfachen Exponenten oder Indizes oder bei Umschaltung auf einen anderen
+ Schrifttyp innerhalb eines Exponenten (Index) oder wenn nicht auf einen kleineren
+ Schrifttyp umgeschaltet werden kann, besteht die Möglichkeit, daß der Exponent
+ oder Index über die "normale" Zeile hinausragt. In diesem Fall kann es Über­
+ schreibungen geben, die Sie mit der #ib#\#linefeed\#-Anweisung#ie# ausgleichen können.
+
+3. Eine Exponenten- oder Index-Klammer muß als Ganzes auf einer Zeile stehen.
+
+4. Gleichzeitige Exponenten- und Index-Ausdrücke, die übereinander stehen
+ sollen, sind zur Zeit mit den \#u\#/\#d\#-Anweisungen nicht möglich. Jedoch funk­
+ tioniert folgendes:
+
+
+____________________________________________________________________________
+
+ a\#u\#Exponent\#d\#Index des Exponenten\#e\#\#e\#
+
+____________________________________________________________________________
+
+
+
+ Druckbild:
+
+ a#u#Exponent#d#Index des Exponenten#e##e#
+
+
+
+5. Doppelblanks spielen innerhalb einer solchen Klammer keine Rolle, wirken also
+ wie zwei "normale" Leerzeichen und nicht als implizite Positionierung. Innerhalb
+ einer solchen Klammer werden Blanks, sofern die Anweisung \#block\# gegeben
+ wurde, nicht verbreitert.
+
+6. Indizes oder Exponenten sollten nicht mit den Modifikationen \#underline\# und/oder
+ \#reverse\# zusammen verwendet werden, da z.B. ein Unterstreichen von Indizes
+ und Exponenten innerhalb einer unterstrichenen Zeile zu einem solchen Ergebnis
+ führt:
+
+
+ Druckbild:
+
+ #on("u")#Indizes und Exponenten a#d#i,k#e# a#u#i,k#e# sollten nicht unterstrichen werden!#off("u")#
+#page#
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.5b b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5b
new file mode 100644
index 0000000..748e398
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5b
@@ -0,0 +1,1632 @@
+#start(5.0,1.5)##pagenr("%",42)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 5: Textkosmetik und Druck
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+5 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 5 - %
+#tableend##clearpos#
+#end#
+
+#ib(9)#5.3. #ib#Pageform#ie##ie(9)#
+#free(1.0)#
+#ib(9)#5.3.1. #ib#Seitenweise formatieren#ie##ie(9)#
+#goalpage("pageform")##goalpage ("autopageform")#
+#free(1.0)#
+ #on("i")#
+ 'pageform'/'autopageform' formatiert eine Datei seitenweise und erledigt Routine­
+ arbeiten wie die Plazierung von Fußnoten, Seitennumerierung usw.
+ #off("i")#
+#free(1.0)#
+
+Das Programm 'pageform' können Sie mit dem Kommando
+
+____________________________________________________________________________
+
+ gib kommando:
+ pageform ("dateiname")
+
+____________________________________________________________________________
+
+
+
+aufrufen. 'pageform' erzeugt aus der Eingabedatei (z.B.: "dateiname") eine Druck­
+datei, deren Name durch ein angehängtes '.p' gebildet wird (z.B.: "dateiname.p").
+
+Die von 'pageform' erzeugte Druckdatei besteht aus der Eingabedatei mit ggf. neu
+eingefügten Zeilen. Die eingesetzten Zeilen stammen aus \#head\#-, \#bottom\#- oder
+\#foot\#-Anweisungen. Dadurch erhöht sich die Zeilenanzahl der Datei.
+
+Sie können in Kopf- oder Fußzeilen Seitennummern aufnehmen. Diese Seiten­
+nummern werden von 'pageform'/'autopageform' bei Seitenwechseln automatisch
+erhöht und an eine von Ihnen gekennzeichnete Stelle eingesetzt. Fußnoten können
+auch durch Nummern gekennzeichnet werden. Querverweise sind ebenfalls möglich.
+#page#
+Nachdem 'pageform' eventuelle Kopf-, Fuß- und Fußnotenzeilen eingefügt hat,
+berechnet es die Anzahl von Zeilen, die auf eine Seite passen, aus den Angaben für
+Seitenlänge und Zeilenvorschub und aus der Höhe der eingestellten Schrifttypen
+(\#type\#-Anweisung). Dann zeigt 'pageform' das errechnete Seitenende auf dem Bild­
+schirm an. Das Seitenende kann interaktiv verschoben werden, um es an eine ge­
+wünschte Stelle zu plazieren und es können Leerzeilen eingefügt/gelöscht werden, um
+Seiten gleich lang zu machen. Zusätzlich können Sie Seiten in Spalten ("Zeitungs­
+druck") aufteilen und diese interaktiv formatieren.
+
+Bei mehreren Schrifttypen innerhalb einer Zeile wird als Zeilenhöhe automatisch die
+des größten Schrifttyps genommen. Dabei müssen Sie bedenken, daß zu Beginn der
+Zeile immer der Schrifttyp der vorherigen Zeile eingeschaltet ist.
+#page#
+
+#ib(9)#5.3.1.1. #ib#Automatische Seitenformatierung#ie(9)##ie#
+#free(1.0)#
+
+ #on("i")#
+ 'autopageform' arbeitet wie 'pageform', jedoch werden die Seitenenden automa­
+ tisch plaziert.
+ #off("i")#
+#free(1.0)#
+'autopageform' sucht zuerst das rechnerische Seitenende. Ist dort ein Absatz vor­
+handen, wird die Seite an dieser Stelle beendet. Falls nicht, sucht 'autopageform'
+nach oben in den nächsten vier Zeilen nach einem Absatz. Wird keiner gefunden,
+wird die Seite am rechnerischen Seitenende beendet.
+
+Ist die \#pageblock\#-Anweisung gegeben, wird zuerst nach oben in den vier letzten
+Zeilen nach einem Absatz gesucht, um dort die Seite zu beenden. Ist dort keiner
+vorhanden, wird auch über das rechnerische Seitenende hinweg versucht, die Seiten­
+länge zu plazieren (4 Zeilen). 'autopageform' beachtet in einem solchen Fall die
+'pagelength'-Anweisung, indem der Zeilenabstand gestaucht wird.
+#page#
+
+#ib(9)#5.3.1.2. #ib#Seitenende interaktiv verschieben#ie# #ie(9)#
+#free(1.0)#
+ #on("i")#
+ In diesem Abschnitt wird beschrieben, welche interaktiven Möglichkeiten Ihnen
+ 'pageform' bietet, Seiten zu gestalten.
+ #off("i")#
+#free(1.0)#
+Auf dem Bildschirm wird das von 'pageform' errechnete jeweilige Seitenende unter
+Angabe der aktuellen Seitennummer angezeigt. Das Seitenende erscheint ungefähr in
+der Mitte des Bildschirmes und wird durch eine von 'pageform' erzeugte Zeile ge­
+kennzeichnet, die auch - nach erfolgter Seitenformatierung - in der Druckdatei zu
+sehen ist. Der EUMEL-Drucker druckt diese Zeile nicht.
+
+____________________________________________________________________________
+
+Mehrere Fußnoten innerhalb einer Seite werden von 'pageform'/­
+'autopageform' in der Reihenfolge ihres Auftretens gesammelt und
+am Ende der Seite plaziert. Für eine entsprechende Trennung der
+Fußnoten voneinander (z.B. durch Leerzeilen) müssen Sie selbst
+sorgen.
+\#page\#\#--------------------- Ende Seite 215 --------\#
+Unter Umständen paßt die Fußnote nicht mehr auf die aktuelle
+Seite und muß deshalb von 'pageform'/'autopageform' auf die näch­
+ste Seite gebracht werden. 'pageform'/'autopageform' geht davon
+aus, daß die Kennzeichnung der Fußnote in der Zeile unmittelbar
+vor der Fußnote steht und bringt diese Zeile ebenfalls auf die
+neue Seite.
+
+
+____________________________________________________________________________
+
+
+Über der Markierung erscheinen die letzten Zeilen der bereits verarbeiteten Seite,
+darunter die ersten Zeilen der nächsten Seite. Sie können nun mit Hilfe der Positio­
+nierungstasten die Markierung und damit das Seitenende nach oben verschieben.
+Damit vermeiden Sie, daß ein logisch zusammengehöriger Text auseinandergerissen
+wird und sogenannte "Waisenkinder" entstehen (letzte Zeile eines Abschnittes kommt
+auf die neue Seite).
+
+Bei der interaktiven #ib#Formatierung#ie (1, " für Seiten")# können Sie die Markierung nicht über das errech­
+nete Ende einer Seite nach unten oder über das vorherige, bereits verarbeitete Seiten­
+ende nach oben verschieben.
+
+Haben Sie jedoch zu Beginn die #ib#\#pageblock\##ie(1,"-Anweisung")#-Anweisung (siehe S. 5-91) gegeben,
+ist es erlaubt, die Seitenende-Markierung auch einige Zeilen über das rechnerische
+Seitenende hinaus zu bewegen. Betätigen Sie dann <CR> , wird der Drucker (sofern
+möglich) den Zeilenabstand auf dieser Seite stauchen. In diesem Fall sollten Sie
+darauf achten, daß das Seitenende bei einem Absatz immer #on("b")##on("i")#vor#off("b")##off("i")# eventuell vorhan­
+dene Leerzeilen plaziert wird. Andernfalls werden die Leerzeilen am Ende der Seite
+als Textzeile mitgezählt und es bleibt entsprechender Platz frei!
+
+Innerhalb einer Fußnote kann die Markierung nicht verschoben werden. In diesem Fall
+wird interaktiv angefragt, ob die Fußnote auf der nächsten Seite fortgesetzt werden
+soll. Verneinen Sie die Anfrage, positioniert 'pageform' vor die Fußnote. Von dieser
+Stelle aus können Sie das Seitenende wie gewohnt verschieben.
+
+Bejahen Sie dagegen die Anfrage nach dem Fußnotenumbruch, plaziert 'pageform'
+das Seitende an dieser Stelle innerhalb der Fußnote. Der restliche Teil der Fußnote
+kommt auf die nächste Seite mit einer Anmerkung ('Forts. von letzter Seite')#u##count#)#e#.
+#foot#
+#u##value#)#e# Bei fremdsprachlichen Texten sollten Sie nach 'pageform' diese Anmerkungen
+ in der '.p'-Datei ändern.
+#end#
+
+Entstehen bei der Seitenformatierung am Anfang einer Seite #ib#Leerzeilen#ie(1, " am Seitenanfang")# (z.B. durch
+Plazierung des Seitenendes zwischen zwei Absätzen), so werden diese von 'page­
+form' automatisch aus der Druckdatei entfernt. Möchten Sie #ib#Leerzeilen am Anfang
+einer Seite#ie#, dann sollten Sie die \#free\#-Anweisung in Verbindung mit der \#page\#-
+Anweisung verwenden.
+
+Zusätzlich können Sie Leerzeilen in eine Seite der Druckdatei einfügen und/oder
+beliebige Zeilen löschen (vergl. b).
+#page#
+Folgende Operationen stehen Ihnen bei der interaktiven Seitenformatierung zur Ver­
+fügung:
+
+#on("b")#a) #ib#Seitenende verschieben#ie#:#off("b")#
+
+'pageform' berechnet das "rechnerische" Seitenende und zeigt dieses auf dem Bild­
+schirm durch die Markierung an. Die Markierung kann interaktiv verschoben werden:
+
+ #on("b")#Taste Bedeutung#off("b")#
+
+ <CR> Seitenende an diese Stelle plazieren.
+
+
+ <^> Seitenende eine Zeile nach oben verschieben.
+
+
+ <v> Seitenende eine Zeile nach unten verschieben (wenn
+ vorher nach oben verschoben bzw. wenn \#pageblock\#-
+ Anweisung gegeben ist).
+
+
+ <HOP> <^> Seitenende um einen Bildschirm nach oben verschieben.
+
+
+ <HOP> <v> Seitenende um einen Bildschirm nach unten verschieben.
+
+
+ <ESC> Abbruch der Seitenformatierung.
+
+
+
+#on("b")#b) #ib#Leerzeilen einfügen#ie# und/oder #ib#Zeilen löschen#ie##off("b")#
+
+Ist nach den Berechnungen von 'pageform' der Text ungünstig auf der Seite plaziert,
+können Sie in die Seite (der Druckdatei!) Leerzeilen einfügen und/oder Zeilen löschen.
+Dies kann beispielsweise sinnvoll sein, wenn durch die Löschung einer Zeile ein
+Absatz noch auf die Seite passen würde oder durch die Einfügung von Leerzeilen ein
+Absatz auf der letzten Zeile der Seite endet. Oft ist es auch sinnvoll, daß alle Seiten
+gleich lang sind. In diesem Fall sollten vor Kapiteln und Absätzen Leerzeilen eingefügt
+oder gelöscht werden.
+
+Um Leerzeilen einzufügen und/oder Zeilen zu löschen, müssen Sie die Markierung
+wie unter a) beschrieben an die Stelle plazieren, an der die Änderung vorgenommen
+werden soll.
+
+
+ #on("b")#Taste Bedeutung#off("b")#
+
+
+ <HOP> <RUBIN> Leerzeilen einfügen. Anstatt der Markierung können
+ durch (u.U. mehrmaliges) <CR> Leerzeilen eingefügt
+ werden. <HOP> <RUBIN> beendet den Vorgang (wie
+ Zeileneinfügen im Editor).
+
+ <HOP> <RUBOUT> Zeile löschen. Die Zeile unmittelbar oberhalb der
+ Markierung wird gelöscht.
+
+
+
+Anschließend berechnet 'pageform' die Seite erneut.
+
+
+
+#on("b")#c) #ib(9)##ib#\#page\#-Anweisung bestätigen/löschen#ie(9)##ie##off ("bold")#
+
+Wird von der Prozedur 'pageform' eine #ib#\#page\#-Anweisung#ie# angetroffen, so wird das
+gewünschte Seitenende auf Ihrem Bildschirm angezeigt. Die \#page\#-Anweisung
+können Sie entweder bestätigen oder löschen.
+
+ #on("b")#Taste Bedeutung#off("b")#
+
+
+ <CR> Seitenende bestätigen.
+
+ <RUBOUT> \#page\#-Anweisung ignorieren. Die Prozedur 'pageform'
+ bearbeitet in diesem Fall die Datei weiter, als ob keine
+ \#page\#-Anweisung angetroffen wurde.
+
+ <ESC> Abbruch der Seitenformatierung.
+#page#
+
+#ib(9)#5.3.2. #ib#Seitenlänge einstellen#ie##ie(9)#
+#goalpage("pagelength")#
+#free(0.7)#
+ #on("i")#
+ 'pageform'/'autopageform' ist auf ein Schreibfeld von 25.0 cm eingestellt (ent­
+ spricht einem DIN A4-Schreibfeld). Wünschen Sie eine andere Seitenlänge,
+ müssen Sie die #ib#\#pagelength\#-Anweisung#ie# in den Text einfügen.
+ #off("i")#
+#free(0.7)#
+____________________________________________________________________________
+
+ \#pagelength (20.0)\#
+
+____________________________________________________________________________
+
+
+stellt die Seitenlänge auf 20 cm ein.
+
+Beachten Sie, daß
+
+1. die neu eingestellte Seitenlänge immer erst ab der nächsten Seite gilt (die bislang
+ eingestellte Seitenlänge gilt noch für die aktuelle Seite).
+
+2. die eingestellte Seitenlänge am Anfang der Datei (also vor der ersten Textzeile) für
+ die erste Seite gilt.
+#mark ("", "")#
+
+3. der Dezimalpunkt bei der Seitenlänge mit angegeben werden muß.
+
+Die folgende Tabelle gibt die Seitenlänge für die am häufigsten gewählten Papier­
+größen an:
+
+ #on("b")#Format Seitenlänge oberer und
+ (in cm) unterer Rand#off("b")#
+
+ DIN A4 25.0 je 2.35 cm
+
+ DIN A5 18.0 je 2.15 cm
+
+ DIN A4 quer 16.0 je 2.50 cm
+#page#
+
+#ib(9)#5.3.3. #ib#Zeilenabstand einstellen#ie##ie(9)#
+#goalpage ("linefeed")#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#linefeed\#-Anweisung#ie# stellen Sie einen #ib#Zeilenvorschub#ie# relativ zu der
+ #ib#Schrifthöhe#ie# des eingestellten Schrifttyps ein.
+ #off("i")#
+#free(1.0)#
+'pageform'/'autopageform' berechnet die Anzahl der Zeilen pro Seite immer in Ab­
+hängigkeit von dem eingestellten Schrifttyp. Haben Sie z.B. eine Schrift gewählt, die
+doppelt so hoch wie eine Schreibmaschinenschrift ist, bekommen Sie auch entspre­
+chend weniger Zeilen auf eine Seite. Um diesen Berechnungsvorgang brauchen Sie
+sich in der Regel nicht zu kümmern.
+
+Anders verhält es sich, wenn ein anderer #ib#Zeilenabstand#ie# als der "normale" Abstand
+zwischen Zeilen eingestellt werden soll. In diesem Fall wird die \#linefeed\#-
+Anweisung eingesetzt. Der Parameter gibt an, um welchen Faktor eine Zeilenhöhe #on("i")##on("b")#ab
+der nächsten druckbaren Zeile#off("b")##off("i")# erhöht oder verringert werden soll.
+
+____________________________________________________________________________
+
+ \#linefeed (2.0)\#
+
+____________________________________________________________________________
+
+
+druckt die folgenden Zeilen mit doppeltem Zeilenabstand. Nach Antreffen dieser An­
+weisung wird die Zeilenhöhe durch 2 * eingestellte Schrifttypgröße errechnet. Es wird
+also der Zeilenabstand zwischen den Zeilen entsprechend vergrößert, da die Schrift­
+größe gleich bleibt. Dies entspricht dem zweizeiligen Schreiben bei einer Schreib­
+maschine (wenn man davon absieht, daß auch hier unterschiedliche Schrifthöhen
+möglich sind). Ein 1 1/2 zeiliges Schreiben wäre mit
+
+____________________________________________________________________________
+
+ \#linefeed (1.5)\#
+
+____________________________________________________________________________
+
+
+einzustellen.
+
+____________________________________________________________________________
+
+ \#linefeed (0.5)\#
+
+____________________________________________________________________________
+
+
+stellt die Zeilenhöhe = 1/2 * eingestellte Schrifthöhe ein, so daß die Zeilen teilweise
+ineinander gedruckt werden (was bei manchen Druckern zu nicht lesbaren Resultaten
+führt). Bei \#linefeed (0.0)\# werden Zeilen übereinander gedruckt (druckerabhängig).
+
+Beachten Sie, daß die Angabe in der \#linefeed\#-Anweisung relativ erfolgt. Bei allen
+anderen Anweisungen der Textkosmetik werden Angaben in Zentimetern verlangt. Die
+\#linefeed\#-Anweisung bildet somit eine Ausnahme.
+#page#
+
+#ib(9)#5.3.4. #ib#Platz freihalten#ie# #ie(9)#
+#goalpage ("free")#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#free\#-Anweisung#ie# können Sie einen zusammenhängenden Teil auf einer
+ Seite freihalten.
+ #off("i")#
+#free(1.0)#
+Die \#free\#-Anweisung setzen Sie an solchen Stellen im Text ein, an denen - nach
+dem Druck - Zeichnungen, Tabellen und ähnliches eingeklebt werden sollen. Sie
+können sie auch zwischen Absätzen, Kapiteln usw. einsetzen, wenn der Abstand nicht
+gleich dem Vielfachen der Zeilenhöhe ist. Es wird der in der \#free\#-Anweisung
+angegebene Platz freigehalten.
+
+____________________________________________________________________________
+
+\#free (2.0)\#
+
+____________________________________________________________________________
+
+
+hält zwei Zentimeter frei. Paßt der angeforderte Platz nicht mehr auf die Seite, so wird
+er auf der nächsten Seite reserviert ('pageform'/'autopageform' plaziert das Seiten­
+ende vor die \#free\#-Anweisung).
+
+
+
+#on("i")##on("b")#Praktischer Tip:#off("b")##off("i")#
+Sie sollten eine \#free\#-Anweisung allein auf eine Zeile schreiben, damit Sie sie u.U.
+durch 'pageform' interaktiv entfernen können, wenn die \#free\#-Anweisung ungünstig
+an den Seitenanfang oder das Seitenende kommt.
+#page#
+
+#ib(9)#5.3.5. #ib#Neue Seite beginnen#ie##ie(9)#
+#goalpage("page")#
+#free(1.0)#
+ #on("i")#
+ An einigen Stellen im Text, z.B. zu Beginn eines neuen Kapitels, möchten Sie
+ unbedingt eine neue Seite anfangen. Dies erreichen Sie mit der #ib#\#page\#-
+ Anweisung#ie#.
+ #off("i")#
+#free(1.0)#
+'pageform' meldet in diesem Fall, nach wie vielen Zentimetern auf der Seite die An­
+weisung angetroffen wurde. Sie können nun mit <CR> das Seitenende bestätigen oder
+die Anweisung (in der Druckdatei) löschen. Im letzteren Fall berechnet 'pageform' die
+Seite neu, als ob die \#page\#-Anweisung nicht dagewesen wäre.
+
+Gleichzeitig können Sie mit Hilfe der #ib#\#page\#-Anweisung#ie(1, ", mit neuer Seitenummer")# eine neue Seitennummer
+für die neue Seite einstellen (vergl. Sie dazu die nächsten Abschnitte).
+#page#
+
+#ib(9)#5.3.6. #ib#Kopf- und Fußzeilen#ie##ie(9)#
+#goalpage("head")##goalpage("bottom")#
+#free(1.0)#
+ #on("i")#
+ Mit den #ib#\#head\#-#ie(1, "Anweisung")# und #ib#\#bottom\#-Anweisung#ie#en können Sie Zeilen am Anfang und
+ Ende jeder Seite einfügen.
+ #off("i")#
+#free(1.0)#
+Sie schreiben Zeilen am Anfang ("#ib#Kopfzeilen#ie#") und Ende ("#ib#Fußzeilen#ie#") jeder Seite nur
+einmal und kennzeichnen sie mit Anweisungen. Diese Zeilen fügt 'pageform'/­
+'autopageform' dann an den entsprechenden Stellen ein.
+
+____________________________________________________________________________
+
+ \#head\#
+ Unser EUMEL-Benutzerhandbuch
+
+ \#end\#
+
+____________________________________________________________________________
+
+
+Diese Zeile (also die zwischen den \#head\#- und #ib#\#end\#-Anweisung#ie#en eingeschlos­
+sene Zeile) wird von 'pageform'/'autopageform' an den Anfang jeder Seite in die
+Druckdatei plaziert.
+
+Entsprechendes gilt für Fußzeilen, die zwischen \#bottom\# und \#end\# eingeschlossen
+werden müssen:
+
+____________________________________________________________________________
+
+ \#bottom\#
+
+ Autor: I. Listig
+ \#end\#
+
+____________________________________________________________________________
+
+
+#on("b")#Praktischer Tip#off("b")#:
+
+Fügen Sie mindestens eine Leerzeile am Ende eines \#head\# bzw. am Anfang eines
+\#bottom\# ein, um den eigentlichen Text von den Kopf- bzw. Fußzeilen abzuheben.
+
+
+'pageform'/'autopageform' zählt die Seiten, beginnend mit der Seitennummer '1'. (Wie
+man Seitennummern in die Kopf- und Fußzeilen bekommt, erfahren Sie im nächsten
+Abschnitt). Sie können nun getrennte Kopf- und Fußzeilen für gerade und ungerade
+Seiten gestalten (wie in diesem Benutzerhandbuch). Dies erfolgt mit den Anweisungen
+\#headeven\# und \#headodd\# für Seiten mit geraden und ungeraden Seitennummern;
+ebenso \#bottomeven\# und \#bottomodd\#. Diese Anweisungen müssen ebenfalls jeweils
+mit einer \#end\#-Anweisung beendet werden.
+
+Sie haben die Möglichkeit, Kopf- und Fußzeilen mehrmals innerhalb einer Datei zu
+wechseln, um unterschiedliche Beschriftungen zu erhalten (z.B. kapitelweise). Dies ist
+jedoch nur sinnvoll, wenn es auf einer neuen Seite erfolgt, also unmittelbar #on("b")##on("is")#nach#off("b")##off("is")# einer
+\#page\#-Anweisung.
+
+____________________________________________________________________________
+
+ \#page\#
+ \#head\#
+ Neuer Seitenkopf
+
+ \#end\#
+
+____________________________________________________________________________
+
+
+Kopf- und Fußzeilen sollen überall gleiches Aussehen haben, unabhängig davon,
+welche Anweisungen im restlichen Text gegeben werden. Darum werden die bei der
+Definition einer Kopf- und Fußzeile aktuellen Werte für
+
+
+ limit
+ type
+ linefeed
+
+
+bei dem Einsetzen der Zeilen berücksichtigt. Für Kopf- oder Fußzeilen können Sie
+einen anderen Schrifttyp als im restlichen Text verwenden, indem Sie die \#type\#-
+Anweisung innerhalb eines \#head\#- oder \#bottom\#-Bereiches geben. Beachten Sie,
+daß nach \#head\#-, \#bottom\# und auch \#foot\#-Bereichen die oben genannten An­
+weisungen nicht automatisch zurückgestellt werden. Darum sollten Sie vor der
+\#end\#-Anweisung wieder auf die im übrigen Text verwendeten Werte zurückstellen.
+
+____________________________________________________________________________
+
+ \#bottom\#
+ \#type ("klein")\#
+ Autor: I. Listig
+ (Schrifttyp
+ zurückstellen):
+ \#type ("normal")\#
+ \#end\#
+
+____________________________________________________________________________
+
+
+#page#
+
+#ib(9)#5.3.7. #ib#Seiten numerieren#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ In den Kopf- und Fußzeilen steht das #ib#'%'-Zeichen#ie# für die aktuelle Seiten­
+ nummer.
+ #off("i")#
+#free(1.0)#
+Erscheint das '%'-Zeichen innerhalb eines Kopf- oder Fußbereiches, wird von
+'pageform'/'autopageform' beim Einsetzen dieser Zeilen auf jeder Seite die aktuelle
+#ib#Seitennummer#ie# eingesetzt (sind mehrere '%'-Zeichen vorhanden, wird die Seiten­
+nummer mehrmals eingesetzt).
+
+____________________________________________________________________________
+
+ \#head\#
+ Seite: - % -
+
+ \#end\#
+
+____________________________________________________________________________
+
+
+Wenn Sie die Seitenzahl in der Zeilenmitte oder am rechten Rand plazieren möchten,
+können Sie die Anweisungen \#center\# (siehe S. 5-93) oder \#right\# (siehe S. 5-94)
+verwenden.
+
+Durch das Einrichten eines Fußbereiches können Sie die Seitennummern auch am
+unteren Ende einer Seite erzeugen. Beachten Sie, daß sich bei mehrstelligen Seiten­
+nummern die Zeilenlänge durch das Einsetzen vergrößert.
+
+Um zum Beispiel das #ib#Vorhandensein einer Folgeseite#ie# in einem Fußbereich zu kenn­
+zeichnen, müssen Sie das '%'-Zeichen zweimal direkt hintereinander schreiben.
+
+____________________________________________________________________________
+
+ \#bottom\#
+
+ \#right\# %%
+ \#end\#
+
+____________________________________________________________________________
+
+
+In dem Beispiel oben wird die Seitenzahl rechtsbündig gedruckt.
+
+
+Manchmal ist es notwendig und sinnvoll, einen Text in mehreren Dateien zu halten.
+Bei einer Folgedatei müssen Sie die Seitennummer dann neu setzen. Das erfolgt mit
+der \#pagenr\#- oder der \#page\#-Anweisung.
+
+____________________________________________________________________________
+
+ \#page (4)\#
+
+____________________________________________________________________________
+
+
+bewirkt eine neue Seite. Die Seitennummer der neuen Seite ist '4'.
+
+#goalpage("pagenr")#
+
+Bei einigen Spezialanwendungen benötigen Sie unter Umständen mehr als eine
+Seitennummer. Beispielsweise soll ein Text nicht nur absolut, sondern auch jede Seite
+in jedem Kapitel separat durchgezählt werden.
+
+____________________________________________________________________________
+
+ \#page (4711)\#
+ \#pagenr ("$", 1)\#
+ \#head\#
+ Mein Buch Seite: % Kapitelseite: $
+
+ \#end\#
+
+____________________________________________________________________________
+
+
+Die Anweisung #ib#\#pagenr#ie# ("$",1)\# veranlaßt, daß ab der nächsten Seite eine neue
+Numerierung durchgeführt wird. Dabei steht '$' stellvertretend für die neue Zahl. Die
+'1' bedeutet, daß bei der Numerierung mit '1' begonnen wird. 'pageform'/­
+'autopageform' erhöht bei jeder neuen Seite das Zeichen um '1' und setzt es ggf. in
+die Kopf- und Fußzeilen. Es sind zwei zusätzliche Seitenzeichen (neben dem '%')
+möglich.
+
+Beachten Sie, daß die neuen Seitennummern immer erst ab der nächsten Seite gel­
+ten. Geben Sie die \#page (...)\#- oder die \#pagenr (...,...)\#-Anweisung am Anfang
+der Datei (also vor der ersten Textzeile), gelten die neuen Seitennummern für die
+erste Seite.
+#page#
+
+#ib(9)#5.3.8. #ib#Fußnoten#ie# schreiben#ie(9)#
+#goalpage("foot")#
+#free(1.0)#
+ #on("i")#
+ Fußnoten werden direkt im Text durch die Anweisungen \#foot\# und \#end\#
+ gekennzeichnet. Die Fußnoten plaziert 'pageform'/'autopageform' an das Ende
+ einer Seite.
+ #off("i")#
+#free(1.0)#
+#ib#Fußnoten#ie# schreiben Sie direkt in den Text, am besten an der Stelle, an der später die
+Fußnote aufgerufen werden soll. Die Fußnote wird von 'pageform'/'autopageform' an
+das Ende einer Seite, ggf. vor die Fußzeilen, plaziert. Für die Kennzeichnung von
+Fußnoten und die entsprechende Markierung im Text sind Sie selbst zuständig. Aller­
+dings werden von 'pageform'/'autopageform' bei dem Einsetzen einer Fußnote am
+Ende einer Seite Unterstriche vor die Fußnoten eingefügt, damit Fußnoten vom lau­
+fenden Text abgehoben werden.
+
+____________________________________________________________________________
+
+ \#foot\#
+ *) Das ist die erste Anmerkung auf dieser Seite.
+ \#end\#
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+______
+*) Das ist die erste Anmerkung auf dieser Seite.
+
+
+Mehrere Fußnoten innerhalb einer Seite werden von 'pageform'/'autopageform' in der
+Reihenfolge ihres Auftretens gesammelt und am Ende der Seite plaziert. Für eine
+entsprechende Trennung der Fußnoten voneinander (z.B. durch Leerzeilen) müssen
+Sie selbst sorgen.
+
+Unter Umständen paßt die Fußnote nicht mehr auf die aktuelle Seite und muß deshalb
+von 'pageform'/'autopageform' auf die nächste Seite gebracht werden. 'pageform'/­
+'autopageform' geht davon aus, daß die Kennzeichnung der Fußnote in der Zeile
+unmittelbar vor der Fußnote steht und bringt diese Zeile ebenfalls auf die neue Seite.
+
+____________________________________________________________________________
+
+Es ist auch möglich, eine Fußnote innerhalb eines Abschnitts zu
+schreiben, wie z.B. in dieser Zeile\#u\#*)\#e\#.\#foot\#
+\#u\#*)\#e\# Fußnote in einem Abschnitt!
+\#end\#
+Sie fahren anschließend ohne Unterbrechung mit dem Schreiben
+Ihres Textes fort.
+
+____________________________________________________________________________
+
+
+Druckbild (nach lineform):
+
+Es ist auch möglich, eine Fußnote innerhalb eines Abschnitts zu schreiben, wie z.B.
+in dieser Zeile#u#*)#e#. Sie fahren anschließend ohne Unterbrechung mit dem Schreiben#foot#
+#u#*)#e# Fußnote in einem Abschnitt!
+#end#
+Ihres Textes fort.
+
+
+In diesem Fall ist es wünschenswert, daß 'lineform' die Zeile, die \#foot\# vorausgeht,
+mit der Zeile, die \#end\# folgt, auffüllt. Dies geschieht unter folgenden Bedingungen:
+
+1. Hinter \#foot\# darf nichts mehr stehen, also auch kein Absatzzeichen.
+
+2. Es werden so lange Worte von der Zeile nach \#end\# vor die \#foot\#-Anweisung
+ plaziert, bis die Zeile gefüllt oder die Zeile nach \#end\# leergeräumt ist.
+
+3. Beachten Sie, daß Textkosmetik-Anweisungen ebenfalls mit über die Fußnote
+ genommen werden. Handelt es sich beispielsweise um eine \#type\#-Anweisung,
+ kann sich das Aussehen der Fußnote verändern! Darum ist es angeraten, even­
+ tuelle Anweisungen, die die Fußnote verändern sollen, innerhalb der Fußnote zu
+ plazieren.
+
+Sie sollten vermeiden, umfangreiche Texte in Fußnoten zu schreiben (beispielsweise
+längere Zitate). Aus programmtechnischen Gründen begrenzt 'pageform'/'autopage­
+form' die maximale Länge von Fußnoten auf einer Seite auf 85% des effektiven
+Schreibfeldes (effektives Schreibfeld: Seitenlänge minus Länge von \#head\#- bzw.
+\#bottom\#-Zeilen). Nimmt eine Fußnote einen größeren Raum ein, bricht 'pageform'/
+'autopageform' die Seitenformatierung mit einer Fehlermeldung ab.
+#page#
+
+#ib(9)#5.3.8.1. #ib#Fußnoten numerieren#ie##ie(9)#
+#goalpage("count")##goalpage("value")#
+#free(1.0)#
+ #on("i")#
+ Gleichartige Textteile wie Lehrsätze, Beispiele, Fußnoten usw. werden i. allg.
+ durchnumeriert. Da Sie bei der Abfassung eines längeren Textes ihre genaue
+ Anzahl meist nicht vorausplanen können, übernimmt 'pageform'/'autopageform' die
+ Zählung.
+ #off("i")#
+#free(1.0)#
+Durch die #ib#\#count\#-Anweisung#ie# wird 'pageform'/'autopageform' veranlaßt, einen
+internen Zähler (beginnend bei dem Wert 0) zu erhöhen und diesen Wert statt der
+\#count\#-Anweisungen in den Text einzusetzen.
+
+____________________________________________________________________________
+
+ \#count\#
+
+____________________________________________________________________________
+
+
+setzt den Wert 1 statt der Anweisung ein. Jede weitere \#count\#-Anweisung erhöht
+den internen Zähler und der Zählerwert wird wiederum eingesetzt:
+
+____________________________________________________________________________
+
+ \#count\#
+
+____________________________________________________________________________
+
+
+setzt den Wert 2 ein usw. Dadurch ist es möglich, beliebige Textteile (Kapitel,
+mathematische Sätze u.a.m.) fortlaufend zu numerieren, ohne auf die Numerierung
+beim Schreiben und Ändern des Textes zu achten.
+
+Anmerkung:
+Trifft 'lineform' auf eine \#count\#-Anweisung, so wird die Zeile berechnet, als ob drei
+Ziffern anstatt der Anweisung im Text ständen.
+
+Mit der \#value\#-Anweisung können Sie den #on("b")##on("i")#letzten#off("i")##off("b")# erreichten count-Wert nochmals
+einsetzen. Das ist insbesondere für Fußnoten sinnvoll einsetzbar.
+
+____________________________________________________________________________
+
+ Text ....... (\#count\#)
+ \#foot\#
+ (\#value\#) Text der Fußnote
+ \#end\#
+ Text .......
+
+____________________________________________________________________________
+
+
+Das Resultat sähe folgendermaßen aus:
+
+ Text ....... (3)
+ Text .......
+ ...............
+ ______
+ (3) Text der Fußnote
+
+Beachten Sie, daß in diesem Fall die \#value\#-Anweisung der \#count\#-Anweisung
+folgen muß, ohne daß eine weitere \#count\#-Anweisung dazwischen steht. Das liegt
+- wie bereits oben erwähnt - daran, daß die \#value\#-Anweisung immer den letzten
+\#count\#-Wert einsetzt.
+
+Das können Sie umgehen, indem Sie die \#count\#- und \#value\#-Anweisungen mit
+einem TEXT-Parameter versehen, der als Kennzeichnung dient.
+
+____________________________________________________________________________
+
+ \#count ("Merk1")\#
+
+____________________________________________________________________________
+
+
+\#count ("Merk1")\# arbeitet ebenso wie \#count\# ohne Parameter und setzt für unser
+Kapitel hier den Wert 4 ein. Zusätzlich zu dem fortlaufend gezählten Wert (fortlau­
+fende Numerierung der Fußnoten) vermerkt 'pageform'/'autopageform' einen Wert, der
+bei Bedarf an irgendeiner anderen Stelle im Text durch \#value ("Merk1")\# wieder
+aufgerufen werden kann, zum Beispiel, wenn Sie auf eine andere Fußnote verweisen
+möchten.
+
+____________________________________________________________________________
+
+ \#count\#\#count\#
+ \#value("Merk1")\#
+
+____________________________________________________________________________
+
+
+Die ersten zwei \#count\#-Anweisungen produzieren - in unserem Kapitel - die
+Werte 5 bzw. 6. Die \#value\#-Anweisung dagegen setzt den vermerkten Wert 4 ein.
+
+Dies ist insbesondere sinnvoll, wenn Sie im Text auf eine Fußnote verweisen möch­
+ten.
+
+Beispiel:
+
+Sie schreiben einen mehrseitigen Prospekt über ein neues Produkt. Auf Seite 5 möch­
+ten Sie auf eine Fußnote verweisen, die auf einer anderen Seite steht. Dann fügen Sie
+'siehe auch Anmerkung (\#value("liefertermin")\#) in Ihren Text ein und fahren mit dem
+Schreiben fort. 'pageform'/'autopageform' setzt später die entsprechende Zahl für den
+Verweis ein.
+
+Auf der Seite, auf die Sie Bezug nehmen, sieht das ganze folgendermaßen aus:
+
+____________________________________________________________________________
+
+ Der Textverarbeitungskurs ist ein Lernprogramm für Anfänger.
+ \#(count)("Liefertermin")\#)
+ \#foot\#
+ (\#(value)("Liefertermin")\#)
+ Der Textverarbeitungskurs wird ab August erhältlich sein.
+ \#end\#
+ Das Programm ist auf den neuesten Erkenntnissen der Lehr­
+ forschung aufgebaut. Der Kurs umfaßt Lehrbuch, Arbeitsbuch und
+ sechs Kassetten.
+
+____________________________________________________________________________
+
+
+#page#
+Soll die Zahl für den Verweis bzw. für die Fußnote hochgestellt werden, fügen Sie die
+Anweisungen \#u\# und \#e\# hinzu.
+
+____________________________________________________________________________
+
+ \#u\# (\#value("Liefertermin")\#)\#e\#
+
+____________________________________________________________________________
+
+
+
+
+Im gedruckten Prospekt sähe es (nach 'lineform') wie folgt aus:
+
+Der Textverarbeitungskurs ist ein Lernprogramm für Anfänger#u##count#)#e#.#foot#
+#u##value#)#e#Der Textverarbeitungskurs wird ab August erhältlich sein.
+#end#
+Das Programm ist auf den neuesten Erkenntnissen der Lehrforschung aufgebaut. Der
+Kurs umfaßt Lehrbuch, Arbeitsbuch und sechs Kassetten.
+
+Manchmal ist es notwendig (ebenso wie bei der Seitennummer), den internen Zähler
+neu zu setzen.
+
+____________________________________________________________________________
+
+ \#setcount (13)\#\#count\#
+
+____________________________________________________________________________
+#goalpage("setcount")#
+
+produziert den Wert 13.
+#page#
+
+#ib(9)#5.3.9. #ib#Querverweise#ie# #ie(9)#
+#goalpage("topage")##goalpage("goalpage")#
+#free(1.0)#
+ #on("i")#
+ Mit den Anweisungen #ib#\#topage\##ie(1,"-Anweisung")# und #ib#\#goalpage\##ie(1,"-Anweisung")# sind Querverweise möglich, die
+ von 'pageform'/'autopageform' in die Druckdatei eingefügt werden.
+ #off("i")#
+#free(1.0)#
+Mit Hilfe von Querverweisen soll auf andere Stellen im Text verwiesen werden, was
+nur bei längeren Texten üblich ist. Um dem Leser die mühselige Suche nach der
+Textstelle zu ersparen, gibt man in der Regel die Seitennummer an. Normalerweise
+steht die Seitennummer vor der Fertigstellung des Textes noch nicht fest. Auch in
+diesem Fall kann 'pageform'/'autopageform' helfen. Die \#topage\#-Anweisung ver­
+weist auf eine andere Seite im Text, an der sich eine Anweisung \#goalpage\# befinden
+muß. Statt der Anweisung \#topage\# wird die Seitennummer der Seite eingesetzt, auf
+der sich \#goalpage\# befindet. Damit jedes \#topage\# auch sein entsprechendes \#goal­
+page\# findet, geben Sie bei beiden Anweisungen einen TEXT-Parameter an.
+
+
+____________________________________________________________________________
+
+ ... siehe auch auf Seite \#topage("Funktionstasten")\# ...
+
+
+____________________________________________________________________________
+
+
+Auf einer anderen Seite befindet sich
+
+____________________________________________________________________________
+
+ ... \#goalpage("Funktionstasten")\#
+
+____________________________________________________________________________
+
+
+Nach 'Seite' wird die entsprechende Seitennummer eingesetzt.
+
+Es ist möglich, mehrmals auf die gleiche (Ziel-)Seite zu verweisen. Sie müssen nur
+darauf achten, daß Sie immer das gleiche Merkmal (TEXT-Parameter) verwenden.
+Beachten Sie auch, daß die \#goalpage\#-Anweisungen sich in den Zeilen befinden
+müssen, die tatsächlich gedruckt werden. Setzen Sie sie nicht in die ersten Zeilen
+einer Seite oder eines Textes, die Anweisungen für das Layout enthalten.
+
+Die Zahl der Querverweise darf 300 nicht übersteigen. #page#
+
+#ib(9)#5.3.10. Kombination von Tabellen, Fußnoten
+ und Kopf- bzw. Fußzeilen#ie(9)#
+#free(1.0)#
+ #on("i")#
+ In Fußnoten, \#head\#- oder \#bottom\#-Bereichen können Tabellen untergebracht
+ werden.
+ #off("i")#
+#free(1.0)#
+____________________________________________________________________________
+
+\#head\#
+\#lpos(0.0)\#\#cpos(5.0)\#\#rpos(11.0)\#
+\#table\#
+Korrekturen EUMEL-Benutzerhandbuch S.007
+
+\#table end\#
+\#end\#
+
+
+____________________________________________________________________________
+
+
+
+Die obigen Eingaben schreiben an jeden Seitenanfang folgenden Text:
+
+#lpos(0.0)##cpos(5.0)##rpos(11.0)#
+#table#
+Korrekturen EUMEL-Benutzerhandbuch S.007
+#table end##clear pos#
+
+Die Tabelle sollte also vollständig in den oben erwähnten Bereichen enthalten sein.
+#page#
+
+#ib(9)#5.3.11. #ib#Formatierung von Spalten#ie##ie(9)#
+#goalpage("columns")#
+#free(1.0)#
+ #on("i")#
+ Mit der \#columns\#-Anweisung ist es möglich, einen Text in #ib#Spalten#ie(1,"formatierung")# zu formatie­
+ ren ("Zeitungsdruck").
+ #off("i")#
+#free(1.0)#
+Durch die Angabe der \#columns\#-Anweisung wird 'pageform'/'autopageform' auf­
+gefordert, den Text in Spalten zu formatieren. Die Spaltenbreite müssen Sie mit der #ib#
+\#limit\#-Anweisung#ie (1, " für Spalten")# einstellen.
+
+____________________________________________________________________________
+
+ \#limit (18.0)\#
+ ...
+ \#columns (2, 2.0)\#
+ \#limit (8.0)\#
+ ...
+
+____________________________________________________________________________
+
+
+
+Anfangs schreiben Sie mit einer Zeilenbreite von 18 cm. Dann fordern Sie mit der
+\#columns\#-Anweisung zweispaltigen Druck an (zwischen den Spalten sollen 2 cm
+Abstand sein). Somit muß die \#limit\#-Anweisung (sie gilt für beide Spalten) auf 8 cm
+eingestellt werden.
+
+Die interaktive #ib#Spaltenformatierung#ie# wird von 'pageform' wie gewohnt vorgenommen.
+Auf dem Bildschirm erscheint nun das Spaltenende, wobei die Nummer der Spalte
+angezeigt wird. Fußnoten werden spaltenweise eingeordnet und müssen somit die
+gleiche Zeilenbreite haben wie die restlichen Spalten.
+
+'pageform'/'autopageform' erzeugt in der Druckdatei die Spalten hintereinander. Das
+folgende Beispiel zeigt einen Ausschnitt aus der Druckdatei mit Kopf- und Fußzeilen
+bei einem zweispaltigen Druck:
+
+____________________________________________________________________________
+
+ head-Zeilen
+ xx
+ xx
+ xx
+ bottom-Zeilen
+ \#page\#\#------- Ende Seite 1 Spalte 1 ----\#
+ xx
+ xx
+ xx
+ \#page\#\#------- Ende Seite 1 Spalte 2 ----\#
+
+____________________________________________________________________________
+
+
+Die zweite Spalte erscheint also ohne Kopf- und Fußzeilen, die jedoch bei der
+Berechnung berücksichtigt werden. Beachten Sie, daß die Kopf- und Fußzeilen über
+die Spalten gehen können. Dies erreichen Sie durch geeignete \#limit\#-Anweisungen
+in den genannten Bereichen.
+
+Die meisten Drucker plazieren die zweite Spalte im Druckbild neben die erste. Bei
+einigen wenigen Druckern müssen Sie die Spalten nebeneinander kleben.
+
+Alle Anweisungen funktionieren beim spaltenweisen Formatieren wie üblich. Die
+\#free\#-Anweisung z.B. hält entsprechenden Platz in einer Spalte frei. Eine Aus­
+nahme bildet die #ib#\#page\#-Anweisung#ie (1, " für Spaltenende")#. Sie vollzieht hier ein #ib#Spaltenende#ie#. Die
+\#page\#-Anweisung mit einem Parameter (welcher die Seitennummer der nächsten
+Seite angibt) vollzieht dagegen ein Seitenende.
+
+Die #ib#\#columns end\#-Anweisung#ie# beendet die spaltenweise #ib#Formatierung#ie(1, " spaltenweise")#. Sie wirkt wie
+eine \#page\#-Anweisung.
+
+#ib#Überschriften#ie (1, " in Spalten")# (bzw. Textblöcke) über mehrere Spalten hinweg sind nur auf der ersten
+Seite direkt hinter der \#columns\#-Anweisung möglich.
+
+____________________________________________________________________________
+
+ \#page\#
+ \#limit (10.0)\#
+ Überschriften (bzw. Textblöcke) über mehrere Spalten hinweg
+ sind nur auf der ersten Seite direkt hinter der \#columns\#-
+ Anweisung möglich.
+
+
+ \#columns (2,2.0)\#
+ \#limit (4.0)\#
+ Die erste Spalte soll nur wenige Zeilen beinhalten. Das vor­
+ zeitige Beendigen der Spalte erreicht man mit der \#page\#-
+ Anweisung.
+ \#page\#
+ In der zweiten Spalte kann dann mit dem Schreiben des Textes
+ fortgefahren werden.
+ .....................
+ .....................
+ .....................
+ .....................
+ .....................
+ \#columns end\#
+
+____________________________________________________________________________
+
+
+#page#
+Druckbild (mit 'lineform' bearbeitet):
+
+
+
+ Überschriften (bzw. Textblöcke) über mehrere Spalten hinweg sind nur auf
+ der ersten Seite direkt hinter der \#columns\#-Anweisung möglich.
+ #columns (2,2.0)#
+
+ Die erste Spalte soll nur
+ wenige Zeilen beinhalten.
+ Das vorzeitige Beendigen
+ der Spalte erreicht man mit
+ der \#page\#-Anweisung.
+ #page#
+
+
+ In der zweiten Spalte kann
+ dann mit dem Schreiben
+ des Textes fortgefahren
+ werden.
+ .....................
+ .....................
+ .....................
+
+#columns end#
+
+
+
+
+Die Zeilen für die zweispaltige Überschrift werden berücksichtigt. Dies gilt jedoch nur
+unmittelbar hinter der \#columns\#-Anweisung. Möchten Sie diesen Effekt nochmals
+erzeugen, beenden Sie mit \#columns end\#, schreiben die breite Überschrift und
+schalten die \#columns\#-Anweisung wieder ein (jeweils unter richtiger Setzung von
+\#limit\#).
+#page#
+
+#ib(9)#5.4. #ib#Index#ie##ie(9)#
+#free(1.0)#
+#ib(9)#5.4.1. Stichwort- und/oder#ib#
+ Inhaltsverzeichnis#ie#se erstellen#ie(9)#
+#free(1.0)#
+
+ #on("i")#
+ Mit dem Programm '#ib#index#ie(1, "-Kommando")#' können Sie Stichwort- und Inhaltsverzeichnisse er­
+ stellen. #ib#Stichwortverzeichnis#ie#se können sortiert werden. Mehrere Stichwortverzeich­
+ nisse können Sie durch 'index merge' zusammenführen.
+ #off("i")#
+#free(1.0)#
+Durch den Aufruf von:
+
+____________________________________________________________________________
+
+ gib kommando:
+ index ("dateiname.p")
+
+____________________________________________________________________________
+
+
+
+werden durch #ib#Indexanweisungen#ie# gekennzeichnete Worte in Dateien, den sogenannten
+Indexdateien, gespeichert.
+
+Die Worte, die in einen Index übernommen werden sollen, müssen Sie in der Druck­
+datei für 'index' durch Anweisungen kennzeichnen. Solche #ib(1,"ff")#Indexanweisungen#ie# werden
+von den anderen Textbe- und -verarbeitungs-Programmen ('lineform', 'pageform',
+EUMEL-Drucker) ignoriert. Sie können also bei dem Schreiben mit dem Editor
+gleich festlegen, welche Worte in einen Index aufgenommen werden sollen.
+
+Solche Verzeichnisse von Worten werden im EUMEL-System allgemein als #ib#Index#ie#
+bezeichnet. 'index' kann ebenfalls benutzt werden, um ein #ib#Inhaltsverzeichnis#ie# und/oder
+ein Verzeichnis aller Abbildungen zu erstellen oder Literaturhinweise zu überprüfen.
+
+Nachdem eine oder mehrere Indexdateien aus einer Druckdatei erstellt sind, werden
+die Indexdateien auf Anfrage alphabetisch sortiert. Bei einem Inhaltsverzeichnis sollten
+Sie die Sortierung natürlich ablehnen. Nach der Sortierung werden gleiche Einträge
+automatisch zusammengefaßt und die entsprechenden Seitennummern nacheinander
+aufgeführt.
+
+
+
+#on("b")##on("i")#Praktischer Tip:#off("b")##off("i")#
+Möchten Sie nur eine Sortierung, aber keine Zusammenfassung von Einträgen, dann
+lehnen Sie die Sortieranfrage ab. Anschließend können Sie die Indexdatei mit '#ib#lex sort#ie#
+("indexdateiname")' sortieren. Hierbei bleiben gleiche Einträge erhalten.
+
+
+
+Das Programm
+
+____________________________________________________________________________
+
+ gib kommando:
+ index merge ("dateiname.i1", "dateiname.i2")
+
+____________________________________________________________________________
+
+
+
+erlaubt es Ihnen, zwei durch 'index' erzeugte Verzeichnisse zusammenzuführen und
+- nach Anfrage - wieder zu sortieren.
+#page#
+
+#ib(9)#5.4.1.1. #ib#Worte für 'index' kennzeichnen#ie##ie(9)# #goalpage ("ib")##goalpage("ie")#
+#free(1.0)#
+ #on("i")#
+ Worte, die in einen Index übernommen werden sollen, kennzeichnen Sie mit \#ib\#
+ und \#ie\#.
+ #off("i")#
+#free(1.0)#
+Da in einem Index - neben dem eigentlichen Worteintrag - die #ib#Seitennummer#ie#
+enthalten sein soll, arbeitet das Programm 'index' nur mit einer #ib#Druckdatei#ie#, d.h. einer
+Ausgabedatei von 'pageform'/'autopageform'. Die Indexworte werden in #ib#Indexdateien#ie#
+gesammelt. Die Indexdateien erhalten den Namen der bearbeiteten Datei, an den ".i"
+und die Nummer des Index angefügt wird.
+
+____________________________________________________________________________
+
+ ... Hier wird eine Eigenschaft des \#ib(1)\#EUMEL-
+ Systems\#ie(1)\# beschrieben. ...
+
+____________________________________________________________________________
+
+
+Die durch die Anweisungen #ib#\#ib\##ie(1,"-Anweisung")# und #ib#\#ie\##ie(1,"-Anweisung")# gekennzeichneten Worte werden mit der
+dazugehörigen Seitennummer in die erste Indexdatei geschrieben.
+
+Die Einträge in einer Indexdatei werden von den Seitennummern durch mindestens
+drei Punkte getrennt. Werden diese nicht gewünscht, können Sie sie leicht mit dem
+Editor entfernen.
+
+
+Sie haben die Möglichkeit, bis zu neun unterschiedliche Indexdateien zu erstellen,
+z.B. gehen durch
+
+____________________________________________________________________________
+
+ \#ib (1)\# und \#ie (1)\#
+
+____________________________________________________________________________
+
+
+gekennzeichnete Worte in die Indexdatei mit der Nummer 1, durch
+
+____________________________________________________________________________
+
+ \#ib (9)\# und \#ie (9)\#
+
+____________________________________________________________________________
+
+
+gekennzeichnete Worte gehen in die Indexdatei mit der Nummer 9. Wenn Sie nur
+einen Index erstellen müssen, dürfen die \#ib\#- und \#ie\#-Anweisungen ohne Para­
+meter benutzt werden, was gleichbedeutend ist mit \#ib (1)\# und \#ie (1)\#.
+
+
+
+Die durch \#ib\#- und \#ie\#-Anweisungen gekennzeichneten Worte können auch über
+Zeilengrenzen (mit Silbentrennungen) gehen.
+
+____________________________________________________________________________
+
+ .... \#ib\#viele Index­
+ Anweisungen\#ie\# ...
+
+____________________________________________________________________________
+
+
+'index' zieht getrennte Worte zusammen (hier: 'viele Index-Anweisungen'). Möchten
+Sie einige Worte in verschiedenen Indexdateien haben, dürfen Sie die \#ib\#- und
+\#ie\#-Anweisungen auch "schachteln". Dies können Sie besonders bei Kapitelüber­
+schriften nutzen.
+
+
+
+____________________________________________________________________________
+
+ \#ib(9)\#Eine Anweisung: die '\#ib\#limit\#ie\#'-Anweisung\#ie(9)\#
+
+____________________________________________________________________________
+
+
+In diesem Beispiel wird das Inhaltsverzeichnis in die Indexdatei '9' gebracht, während
+der "allgemeine" Index in der Indexdatei '1' gesammelt wird.
+#page#
+
+#ib(9)#5.4.1.2. #ib#Nebeneinträge erzeugen#ie##ie(9)#
+
+#free(1.0)#
+ #on("i")#
+ Sie haben die Möglichkeit, an die Seitennummer eines Eintrags einen beliebigen
+ Text anfügen zu lassen.
+ #off("i")# #free(1.0)#
+Beispiel:
+
+
+ EUMEL-System ... 27ff.
+ Monitor ........ 13(Def.)
+
+
+
+
+
+Dies wird durch eine weitere Form der \#ib\#-Anweisung ermöglicht:
+
+____________________________________________________________________________
+
+ ... der \#ib(1,"(Kap.4)")\#EUMEL-Editor\#ie\# ist gut
+ geeignet, Texte zu erstellen ...
+
+____________________________________________________________________________
+
+
+
+erzeugt den folgenden Eintrag:
+
+
+
+Druckbild:
+
+ EUMEL-Editor ... 1(Kap.4)
+
+
+An einen Eintrag können Sie einen weiteren Text angefügen, um etwa Untereinträge
+zu bilden:
+
+Druckbild:
+
+ EUMEL-System .................................. 27
+
+ EUMEL-System, komplexes ....................... 29
+
+
+Das wird ebenfalls durch eine andere Form der \#ib\#-Anweisung ermöglicht:
+
+____________________________________________________________________________
+
+ ... ist das \#ib\#EUMEL-System\#ie(1,", benutzerfreundliches")\#
+ wirklich ein benutzerfreundliches System ...
+
+____________________________________________________________________________
+
+
+erzeugt den folgenden Eintrag:
+
+Druckbild:
+
+ EUMEL-System, benutzerfreundliches ............ 28
+
+
+
+Nach der Erstellung einer Indexdatei können - nach interaktiver Anfrage - die
+Einträge sortiert werden. Die Sortierung erfolgt alphabetisch nach DIN 5007, Abschnitt
+1 und 3.2 (Umlaute werden "richtig" eingeordnet).
+
+
+
+Wie bereits erwähnt, können Sie 'index' vielseitig einsetzen:
+
+a) Erstellung von Stichwortverzeichnissen:
+ Wie bereits beschrieben.
+
+b) Erstellung von Inhaltsverzeichnissen:
+ Kapitelüberschriften mit eigenen Indexanweisungen klammern und durch 'index'
+ wie beschrieben verarbeiten.
+
+ ____________________________________________________________________________
+
+ \#ib(9)\#6.1. Eine Datei drucken\#ie(9)\#
+
+ _________________________________________________________________________
+
+
+ Dann sind Sie sicher, daß das Inhaltsverzeichnis bezüglich Seitennummern und
+ Kapitelüberschriften korrekt ist.
+
+c) Erstellung von #ib#Abbildungsverzeichnisse#ie#n:
+ Abbildungsüberschriften- bzw. -unterschriften wie Kapitelüberschriften verarbei­
+ ten.
+
+d) Überprüfung von Literaturhinweisen auf Vollständigkeit:
+ Sie klammern alle Literaturhinweise mit gesonderten Indexanweisungen.
+
+ ____________________________________________________________________________
+
+ \#ib(8)\#/Meier82/\#ie(8)\#)
+
+ _________________________________________________________________________
+
+ und überprüfen dann mit Hilfe dieser Indexdatei die Literaturverweise. So können
+ Sie sichergehen, daß alle Literaturverweise im Text auch in der Literaturaufstellung
+ stehen.
+#page#
+
+#ib(9)#5.4.1.3. #ib#Indexdateien zusammenführen#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Durch das Programm '#ib#index merge#ie(1,"-Kommando")#' können Sie eine Indexdatei in eine zweite
+ "einmischen".
+ #off("i")#
+#free(1.0)#
+Es ist somit möglich, einen Index zu erstellen, der sich über mehrere Dateien er­
+streckt, indem Sie 'index' die Druckdateien dieser Dateien bearbeiten und an­
+schließend die entstandenen Indexdateien mit 'index merge' zusammenfassen lassen.
+Indexdateien können ggf. mit dem Editor bzw. 'lineform' und/oder 'pageform'/­
+'autopageform' bearbeitet und anschließend gedruckt werden.
+
+
+____________________________________________________________________________
+
+ gib kommando:
+ index merge ("1.kapitel.i1", "2.kapitel.i1")
+
+____________________________________________________________________________
+
+
+
+
+Hier wird die Indexdatei des 1. Kapitels in die Indexdatei des 2. Kapitels eingeordnet
+und auf Wunsch sortiert.
+#page#
+
+#ib(9)#5.5. #ib#Outline#ie##ie(9)#
+#goalpage("outline")#
+#free(1.0)#
+#ib(9)#5.5.1. Eine#ib# Strukturübersicht#ie# oder
+ #ib#Zusammenfassung#ie# erstellen#ie(9)#
+#free(1.0)#
+ #on("i")#
+ Das Programm 'outline' erstellt aus einem Text eine Zusammenfassung aller
+ (Kapitel-) Überschriften und Stichworte, sofern diese mit #ib#Index-Anweisungen#ie#
+ gekennzeichnet sind.
+ #off("i")#
+#free(1.0)#
+Manchmal sollen Stichworte oder das Inhaltsverzeichnis aus einem Text herausgeholt
+werden, ohne vorher 'pageform' durchlaufen zu müssen. Das ist dann nützlich, wenn
+Sie
+
+- Stichworte auf Korrektheit und Vollständigkeit überprüfen möchten;
+- die Reihenfolge von Kapiteln überprüfen müssen;
+- eine Übersicht durch Kapitel-Überschriften und Stichworte anfertigen möchten;
+- einen Text auf logische Zusammenstellung überprüfen.
+
+
+In solchen Fällen hilft das Programm 'outline', das mit dem Monitor-Kommando
+
+____________________________________________________________________________
+
+ gib kommando:
+ outline ("dateiname")
+
+____________________________________________________________________________
+
+
+
+aufgerufen wird. 'outline' arbeitet ähnlich wie 'index', indem es alle mit \#ib\# und \#ie\#
+markierten Textteile in eine Datei mit dem Zusatz 'outline' schreibt. Im Unterschied zu
+'index' muß die Eingabe-Datei keine Druckdatei ('.p'-Zusatz) sein.
+
+Das Programm 'outline' fragt zuerst, mit welcher Indexnummer das Inhaltsverzeichnis
+versehen ist. Das ist notwendig, weil die Kapitelüberschriften gegenüber Stichwörtern
+in der 'outline'-Datei hervorgehoben werden (Einrückungen).
+
+Eingabe-Datei ("dateiname"):
+
+____________________________________________________________________________
+
+ ...
+ \#ib(9)\#1. Kapitel\#ie(9)\#
+ ...
+ ...\#ib\#Stichwort 1\#ie\#
+ \#ib\#Stichwort 2\#ie\#...
+
+ \#ib(9)\#1.1. Kapitel\#ie(9)\#
+ ...
+ \#ib\#Stichwort 3\#ie\#
+ usw...
+
+____________________________________________________________________________
+
+
+
+Druckbild der erzeugten Datei ("dateiname.outline"):
+
+ 1. Kapitel
+ Stichwort 1
+ Stichwort 2
+ 1.1. Kapitel
+ Stichwort 3
+
+
+In diesem Beispiel werden alle Indizes mit Ausnahme der Kapitelüberschrift jeweils in
+einer Zeile aufgeführt und gegenüber der Kapitelüberschrift eingerückt. Ein neues
+Kapitel, sofern es dezimal gekennzeichnet ist, wird gegenüber einem Kapitel mit
+höherer Ordnung eingerückt.
+#page#
+
+#ib(9)#5.6. #ib#Print#ie##ie(9)##goalpage("print")#
+#free(1.0)#
+ #on("i")#
+ Der #ib#EUMEL-Drucker#ie#, der mit dem #ib#'print'#ie(1,"-Kommando")#-Kommando angesprochen wird, ist
+ eine Software-Schnittstelle zu einem angeschlossenen Drucker. In diesem Kapitel
+ wird erklärt, wie Sie mit dem EUMEL-Drucker eine Datei drucken können und
+ welche speziellen Anweisungen den Drucker steuern.
+ #off("i")#
+#free(1.0)#
+Jeder Drucker erbringt "hardwaremäßig" unterschiedliche Leistungen (z.B. Typen und
+Modifikationen). Diese Leistungen werden durch Eingabe spezieller Zeichenfolgen
+veranlaßt, die herstellerspezifisch sind.
+
+Um vom EUMEL-System unterschiedliche Drucker auf gleiche Weise ansprechen zu
+können, wurde eine Software-Schnittstelle geschaffen, die #ib#EUMEL-Drucker#ie# ge­
+nannt wird. Der EUMEL-Drucker akzeptiert eine Datei und veranlaßt, daß diese in
+geeigneter Weise gedruckt wird. Weiterhin beachtet der EUMEL-Drucker die An­
+weisungen der Textkosmetik. Die Form der Anweisungen der Textkosmetik und des
+EUMEL-Druckers sind identisch.
+#page#
+
+#ib(9)#5.6.1. #ib#Eine Datei drucken#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Mit dem Kommando '#ib#print#ie#' können Sie dem EUMEL-Drucker eine Datei zum
+ Drucken übergeben.
+ #off("i")#
+#free(1.0)#
+____________________________________________________________________________
+
+ gib kommando:
+ print ("dateiname")
+
+____________________________________________________________________________
+
+
+In der Regel ist im EUMEL-System (Multi-User) ein "Spooler" installiert, so daß Sie
+sofort mit der Arbeit fortfahren können. Der EUMEL-Drucker arbeitet in diesem Fall
+parallel zu Ihren anderen Arbeiten.
+#page#
+
+#ib(9)#5.6.2. #ib#Anweisungen für den EUMEL-Drucker#ie##ie(9)#
+#free(1.0)#
+Ein Text (eine Datei) kann vom Drucker auch ohne Anweisungen gedruckt werden,
+etwa für Probedrucke. Für diesen Fall hat der Drucker vernünftige Voreinstellungen.
+Für einen "normalen" Text brauchen Sie keine speziellen Druckeranweisungen in den
+zu druckenden Text einzufügen, denn die Anweisungen für die Textkosmetik reichen
+zur Druckersteuerung aus. Nur wenn besondere Leistungen verlangt werden, wie z.B.
+Blocksatz oder den gedruckten Text an eine bestimmte Stelle zu plazieren, sind
+Druckeranweisungen notwendig.
+
+Werden vom Drucker Leistungen verlangt, die hardwaremäßig nicht vorhanden sind,
+so sorgt der EUMEL-Drucker dafür, daß eine möglichst äquivalente Leistung erbracht
+wird. Fordern Sie beispielsweise einen nicht vorhandenen Schrifttyp an, wird mit
+dem Standard-Schrifttyp der jeweiligen Installation gedruckt. Damit ist es Ihnen
+möglich, einen Text, der eigentlich für einen anderen Drucker bestimmt ist, auf einem
+Drucker zu drucken, der die geforderte Type nicht kennt.
+
+Wie bereits erwähnt, beachtet der EUMEL-Drucker die gleichen Anweisungen wie
+die Textkosmetik-Programme, aber einige Anweisungen sind nur für den Drucker
+implementiert. Eine #ib#\#type\#-Anweisung#ie# beispielsweise, die einen bestimmten Schrift­
+typ anfordert, wird vom EUMEL-Drucker als Befehlsfolge an den angeschlossenen
+Hardware-Drucker übergeben, sofern der Schrifttyp auf dem Drucker vorhanden ist.
+Wie die Anweisungen geschrieben werden müssen, wurde in der Beschreibung der
+Textkosmetik geschildert.
+
+Anweisungen werden nicht gedruckt. Besteht eine Zeile nur aus Anweisungen, so wird
+diese Zeile vom EUMEL-Drucker nicht gedruckt. Im Gegensatz zu den Programmen
+der Textkosmetik werden unbekannte oder #ib#fehlerhafte Anweisungen#ie# vom EUMEL­
+Drucker ohne Fehlermeldung "verschluckt".
+
+Neben den "normalen" Anweisungen, die nur in "\#"-Zeichen eingeschlossen wer­
+den, gibt es noch eine andere Form:
+
+Kommentar-#ib#Anweisungen#ie(1,", Kommentar-")#:
+
+ Werden in "\#-" und "-\#"-Zeichen eingeschlossen. Solche Anweisungen wer­
+ den ignoriert.
+
+____________________________________________________________________________
+
+ ..........................
+ Text......................
+ ..........................
+ Kommentar-Anweisungen werden
+ beim Drucken ignoriert.
+ \#---- Ende der Seite 1 ---\#
+
+____________________________________________________________________________
+
+
+
+Die letze Zeile erscheint im gedruckten Text nicht.
+#page#
+#goalpage("block")#
+#ib(9)#5.6.3. #ib#Blocksatz#ie# #ie(9)#
+#free(1.0)#
+#ib(9)#5.6.3.1. #ib#Randausgleich#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Die Anweisung #ib#\#block\##ie(1,"-Anweisung")# bewirkt einen Blocksatz beim Druck.
+ #off("i")#
+#free(1.0)#
+Fügen Sie in den Text (meist am Anfang einer Datei) die Anweisung
+
+____________________________________________________________________________
+
+ \#block\#
+
+____________________________________________________________________________
+
+
+ein, druckt der Drucker ab dieser Stelle alle Zeilen, die nicht mit einem Absatzkenn­
+zeichen versehen sind, im #ib#Blocksatz#ie#. Das heißt, daß durch Vergrößern der Wort­
+abstände alle Zeilen an der gleichen Position enden (rechter #ib#Randausgleich#ie#). Preis­
+werte Drucker können dies nur durch Einfügen ganzer Leerzeichen zwischen den
+Worten vornehmen, was sich oft beim Lesen störend bemerkbar macht. Bei qualitativ
+hochwertigen Druckern wird dagegen der Blocksatz durch Einfügen kleinerer Abstän­
+de zwischen den Worten erreicht.
+
+Der Text einer Zeile wird durch Vergrößern der #ib#Wortlücken#ie(1, ", Vergrößern der")# auf die Zeilenlänge, die
+durch die \#limit\#-Anweisung eingestellt ist, verbreitert.
+
+
+a) Es werden nicht verbreitert:
+
+ - Absatzzeilen;
+ - der Text bis zum letzten #ib#Mehrfachblank#ie#;
+ - führende Leerzeichen (#ib#Einrückung#ie#);
+ - ein Leerzeichen hinter einer Aufzählung (siehe dazu b);
+ - geschützte Blanks.
+
+
+
+b) #ib#Aufzählungen#ie# gibt es nur nach einer Absatzzeile:
+
+ - "Spiegelstrich" (Bindestrich und Leerzeichen am Anfang der Zeile);
+ - Doppelpunkt als Ende des ersten Wortes (Position < 20);
+ - schliessende Klammer oder Punkt als Ende des ersten Wortes (Position < 7),
+ z.B. 1) oder 1.
+#page#
+#goalpage ("pageblock")#
+
+#ib(9)#5.6.3.2. #ib#Seitenausgleich#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#pageblock\#-Anweisung#ie# wird der Drucker veranlaßt, einen Seiten­
+ ausgleich (ähnlich wie bei der \#block\#-Anweisung für den rechten Rand­
+ ausgleich) vorzunehmen.
+ #off("i")#
+#free(1.0)#
+Durch die automatische oder interaktive Seitenformatierung oder durch einen Fuß­
+notenumbruch von 'pageform'/'autoform' bleiben oft am Ende einer Seite Zeilen leer.
+Dies können Sie durch die \#pageblock\#-Anweisung verhindern. Sie veranlaßt den
+Drucker, Zwischenräume (Fachbegriff: Durchschuß) zwischen den Zeilen einzufügen,
+so daß alle letzten Zeilen auf allen Seiten auf gleicher Höhe abschließen. Ebenso wie
+beim Randausgleich hängt die Güte des Druckergebnisses jedoch von den Fähig­
+keiten des angeschlossenen Druckers ab.
+
+Beachten Sie jedoch, daß manche Verlage so bearbeitete Seiten nicht wünschen, weil
+bei Verwendung von zu dünnem Papier beim Druck Zeilen "durchscheinen" können,
+so daß das Lesen erschwert wird.
+
+Ist die Anweisung \#pageblock\# gegeben, können Sie in 'pageform' die Seitengrenze
+auch über das rechnerische Seitenende hinaus plazieren. In diesem Fall werden die
+Zeilen vom Drucker gestaucht.
+#mark ("", "")#
+
+
+____________________________________________________________________________
+
+PAGEFORM für x Zeilen: dateiname ---> dateiname.p
+
+____________________________________________________________________________
+
+
+____________________________________________________________________________
+
+ Seitenende verschieben: UP, DOWN / bestaetigen: RETURN / Abbruch: ESC
+
+____________________________________________________________________________
+
+
+#page#
+
+#ib(9)#5.6.4. #ib#Schreibfeld verschieben#ie##ie(9)# #goalpage("start")#
+#free(1.0)#
+ #on("i")#
+ Durch die Anweisung #ib#\#start\# #ie(1,"-Anweisung")#ist es Ihnen möglich, das #ib#Schreibfeld#ie# beim Druck auf
+ dem Papier an eine andere Stelle zu plazieren.
+ #off("i")#
+#free(1.0)#
+Der EUMEL-Drucker plaziert das Schreibfeld auf einem Drucker automatisch derart,
+daß ein genügender Rand verbleibt. Die Wirkung dieser Voreinstellung ist natürlich
+abhängig vom Drucker und der Installation. Mit der \#start\#-Anweisung können Sie
+die automatische Einstellung verändern.
+
+
+____________________________________________________________________________
+
+ \#start (1.0, 2.0)\#
+
+____________________________________________________________________________
+
+
+legt die linke, obere Ecke des Schreibfeldes fest (vom linken Rand 1 cm, vom oberen
+Rand 2 cm). Die standardmäßige Voreinstellung ist \#start (2.54, 2.35)\#. Die \#start
+(...)\#-Anweisung können Sie nur einmal pro Seite geben.
+#page#
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.5c b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5c
new file mode 100644
index 0000000..010cacd
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5c
@@ -0,0 +1,711 @@
+#start(5.0,1.5)##pagenr("%",93)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 5: Textkosmetik und Druck
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+5 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 5 - %
+#tableend##clearpos#
+#end#
+#goalpage("center")#
+#ib(9)#5.6.5. #ib#Zentriert drucken#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#center\#-Anweisung#ie# können Sie einen Text in der Mitte der Zeile drucken
+ lassen.
+ #off("i")#
+#free(1.0)#
+
+Die \#center\#-Anweisung zentriert den Text einer Absatzzeile.
+
+
+____________________________________________________________________________
+
+ \#center\#Diese Zeile wird zentriert gedruckt.
+
+#mark ("", "")#
+
+____________________________________________________________________________
+
+
+Druckbild:
+
+ #center#Diese Zeile wird zentriert gedruckt.
+#page#
+
+#ib(9)#5.6.6. #ib#Rechtsbündig drucken#ie##ie(9)#
+#goalpage("right")#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#right\#-Anweisung#ie# können Sie einen Teil einer Absatzzeile rechtsbündig
+ drucken.
+ #off("i")#
+#free(1.0)#
+
+Die \#right\#-Anweisung veranlaßt, daß der nachfolgende Text rechtsbündig gedruckt
+wird.
+
+____________________________________________________________________________
+
+ \#head\#
+ \#center\#Diese Zeile wird zentriert\#right\#%
+
+ \#end\#
+
+____________________________________________________________________________
+
+
+
+Hierbei wird die Seitenzahl rechtsbündig gedruckt.
+
+Beachten Sie, daß die \#center\#- und die \#right\#-Anweisung zusammen verwendet
+werden können. Beide Anweisungen wirken jedoch nur, wenn sie in einer Absatzzeile
+stehen.
+
+#mark ("", "")#
+#page#
+
+#ib(9)#5.6.7. #ib#Übereinander drucken#ie##ie(9)#
+#goalpage ("b")#
+#free(1.0)#
+ #on("i")#
+ Mit der #ib#\#b\#-Anweisung#ie# können Sie zwei Zeichen übereinander drucken.
+ #off("i")#
+
+#free(1.0)#
+Die \#b\#-Anweisung veranlaßt, daß zwei aufeinanderfolgende Zeichen, die durch die
+\#b\#-Anweisung verbunden sind, übereinander gedruckt werden.
+
+
+____________________________________________________________________________
+
+... 0\#b\#/ ...
+
+____________________________________________________________________________
+
+
+
+
+Druckbild:
+
+... 0#b#/ ...
+
+
+Das Zeichen '/' wird über das Zeichen '0' gedruckt. 'lineform'/'autoform' nimmt für die
+Zeilenberechnung nur ein Zeichen. Beachten Sie, daß direkt vor oder nach der
+\#b\#-Anweisung keine Anweisung oder kein Blank stehen darf.
+#mark ("", "")#
+#page#
+
+#ib(9)#5.7. #ib#Textkosmetik-Makros#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ #ib#Makros#ie# verkürzen Ihren Arbeitsvorgang bei immer wiederkehrenden Textteilen
+ und/oder Anweisungen.
+ #off("i")#
+#free(1.0)#
+Unter 'Makro' verstehen wir eine "große" Anweisung, die aus vielen kleinen besteht
+und die Sie mit Hilfe des Makronamens aufrufen können.
+
+Textkosmetik-Makros kommen zum Einsatz bei:
+
+- immer wiederkehrenden Textteilen;
+- immer wiederkehrenden Anweisungssequenzen;
+- bei der Erstellung von Manuskripten, deren endgültige Form Sie anfänglich noch
+ nicht kennen oder die Sie noch ändern möchten;
+- oder bei Folgen von direkten Drucker-Anweisungen, die bestimmte Leistungen
+ erbringen.
+
+Die Definition von einem oder mehreren #ib#Makros#ie# wird mit dem Editor vorgenommen.
+Diese #ib#Makro-Datei#ie# wird dann geladen. Von diesem Augenblick an "kennen" 'line­
+form'/'autoform' und 'pageform'/'autopageform' die Makros, d.h. die Textzeilen und/
+oder Anweisungen, die sich unter dem #ib#Makronamen#ie# "verbergen".
+
+'lineform'/'autoform' beachtet die Anweisungen, die ggf. in den Makros enthalten sind.
+Sie erscheinen jedoch nicht in der Datei. Erst 'pageform'/'autopageform' setzt diese in
+die Druckdatei ein.
+#page#
+
+#ib(9)#5.7.1. Ein Makro-Beispiel#ie(9)#
+#free(1.0)#
+ #on("is")#
+ Hier wird Ihnen ein einfaches Beispiel für einen Briefkopf gezeigt.
+ #off("is")#
+#free(1.0)#
+Angenommen, Sie schreiben mit dem EUMEL-System Ihre Geschäftsbriefe. Sie
+haben einen Drucker zur Verfügung, mit dem Sie auch die Briefköpfe erstellen kön­
+nen. Für den #ib#Briefkopf#ie# schreiben Sie ein Makro \#kopf\# in eine Datei "macro defini­
+tionen":
+
+____________________________________________________________________________
+
+ \#*kopf\#
+ \#type("fett und gross")\#Firmenname
+ \#type("fett")\#Softwareprodukte
+ \#type("klein")\#Straße
+ Stadt
+ \#type ("normal")\#
+ \#*macro end\#
+
+____________________________________________________________________________
+
+
+Der Name des Makros ist \#kopf\#. Beachten Sie, daß eine #ib#Makro-Definition#ie# mit dem
+Namen des Makros beginnen muß. Der #ib#Makroname#ie# muß dabei mit einem #on("b")#*#off("b")# gekenn­
+zeichnet werden, um ihn von "normalen" Text-Anweisungen unterscheiden zu kön­
+nen. Jedes Makro wird mit einer \#*macro end\#-Anweisung beendet. Sie dürfen
+mehrere Makros hintereinander in die Datei schreiben.
+
+Nun müssen Sie das so definierte Makro 'laden':
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#load macros#ie# ("macro definitionen")
+
+____________________________________________________________________________
+#goalpage("load macros")##goalpage("list macros")#
+
+
+Zur Kontrolle können Sie sich die geladenen Makros in das Notizbuch ausgeben
+lassen:
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#list macros#ie#
+
+____________________________________________________________________________
+#mark ("", "")#
+
+
+
+Nun haben Sie von jetzt an eine neue Anweisung (mit dem Namen \#kopf\#) zur Ver­
+fügung, mit der Sie einen Briefkopf in jeden Brief drucken können. Sie schreiben nun
+folgenden Brief:
+
+____________________________________________________________________________
+
+ \#kopf\#
+
+ Sehr geehrter Herr ....
+
+ usw.
+
+____________________________________________________________________________
+
+
+Beachten Sie hierbei, daß das Makro in Ihrem Text als Anweisung ohne #on("b")#*#off("b")# steht. Der
+#ib#Aufruf eines Makros#ie#, welches z.B. in einer von 'lineform' zu bearbeitenden Datei
+steht, unterscheidet sich also nicht von einer "normalen" Textanweisung.
+
+Nachdem Sie mit 'lineform' den Brief zeilenweise formatiert haben, kontrollieren Sie
+die formatierte Datei. Hier hat sich noch nichts verändert. Die neue Anweisung \#kopf\#
+steht unverändert in der Datei. 'lineform' beachtet zwar alle Anweisungen und Text­
+zeilen eines Makros, setzt diese jedoch nicht in die Datei ein. Allerdings ist 'lineform'
+nicht in der Lage, die \#type\#- und \#limit\#-Anweisungen eines Makros zu erkennen,
+wenn es an erster Stelle in einer Datei steht und in dessen Definition gleich zu
+Anfang diese Anweisungen korrekt aufgeführt sind. Stattdessen fragt 'lineform' an­
+fangs 'type' und 'limit' an. Das können Sie umgehen, indem Sie mittels 'CR' die
+Abfrage in 'lineform' ignorieren.
+
+Nun formatieren Sie die Datei, die den Brief enthält, mit 'pageform'/'autopageform'. In
+der Druckdatei ist nun die Anweisung \#kopf\# verschwunden. Dort stehen nun die
+Zeilen des #ib#Makrorumpf#ie#es. 'pageform'/'autopageform' setzt die Zeilen des Makros in
+die Druckdatei ein:
+
+____________________________________________________________________________
+
+ \#type("fett und gross")\#Firmenname
+ \#type("fett")\#Softwareprodukte
+ \#type("klein")\#Straße
+ Stadt
+ \#type ("normal")\#
+
+
+ Sehr geehrter Herr ...
+ usw.
+
+
+____________________________________________________________________________
+
+
+
+#on("b")##on("i")#Anmerkung:#off("b")##off("i")#
+Makros, die den gleichen Namen haben, aber sich durch die Anzahl der Parameter
+unterscheiden, sind nicht erlaubt. Es ist auch nicht gestattet, Makros innerhalb einer
+Makro-Definition aufzurufen.
+
+Beachten Sie ferner, daß Makro-Texte so verwendet werden, wie sie mit 'load
+macros' geladen werden.
+
+____________________________________________________________________________
+
+ \#*textanfang\#
+ \#limit(11.0)\#
+ \#block\#
+ \#pageblock\#
+ \#type("trium8")\#
+ \#*macro end\#
+
+____________________________________________________________________________
+
+
+Betätigen Sie in der Makro-Datei nach jeder Zeile die #taste1(" CR ")#-Taste (Absatz), dann
+erhalten Sie nach jedem \#...\# einen Absatz, was zum Beispiel bei Kapitelüberschriften
+wünschenswert ist, nicht jedoch bei kleineren Anweisungen, bei denen dann mitten im
+Satz ein Absatz erschiene. In solchen Anwendungen sollten Sie Makros ohne Absätze
+speichern. Beachten Sie ferner, daß aus programmtechnischen Gründen eine \#foot\#-
+oder die abschließende \#end\#-Anweisung einer Fußnote nicht in einem Makro ent­
+halten sein darf.
+#page#
+
+#ib(9)#5.7.2. Ein Beispiel mit #ib#Makro-Parameter#ie#n#ie(9)#
+#free(1.0)#
+ #on("i")#
+ Makro-Parameter erlauben es Ihnen, immer wiederkehrende Textteile, die sich
+ nur geringfügig voneinander unterscheiden, zu erzeugen.
+ #off("i")#
+#free(1.0)#
+Ihnen fällt nun auf, daß Sie Ihr Makro noch etwas verbessern können. Sie möchten
+das Datum mit in den Briefkopf aufnehmen. Somit editieren Sie Ihre Makro-Datei
+folgendermaßen (beachten Sie die '$'-Zeichen):
+
+____________________________________________________________________________
+
+ \#*kopf ($1)\#
+ \#type("gross")\#Firmenname
+ \#type("fett")\#Softwareprodukte
+ \#type("klein")\#Straße
+ Stadtname
+ \#type ("normal")\#
+
+ Stadtname, den $1
+ \#*macro end\#
+
+____________________________________________________________________________
+
+
+Damit haben Sie dem \#kopf\#-Makro einen Parameter gegeben: '$1'; die Parameter
+werden numeriert. Ein zweiter Parameter würde '$2' heißen usw..
+
+Bei der Erstellung eines Briefes müssen Sie die Anweisung \#kopf\# mit dem jeweiligen
+Datum in einen Brief schreiben:
+
+____________________________________________________________________________
+
+ \#kopf ("20.8.1986")\#
+
+____________________________________________________________________________
+
+
+'pageform'/'autopageform' setzt nun das angegebene Datum direkt hinter 'Stadtname,
+den' in den Briefkopf ein (in der Druckdatei). Beachten Sie, daß alle Parameter einer
+Makro-Anweisung in Anführungszeichen stehen müssen (auch Zahlen).
+#page#
+
+#ib(9)#5.7.3. #ib#Makros für Manuskripte#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ Hier wird gezeigt, wie Sie mit Makros Anweisungen formulieren können, die
+ aussagen, um was es sich bei einem Text handelt, und nicht, in welchem Format
+ er gedruckt wird.
+ #off("i")#
+#free(1.0)#
+Bei Manuskripten für Artikel, Bücher und Manuals wissen Sie oft vorher nicht, in
+welchem Format das Manuskript gedruckt werden wird. Zu diesem Zweck ist es
+ebenfalls nützlich, Makros zu verwenden.
+
+____________________________________________________________________________
+
+ \#*kapitelanfang ($1)\#
+ \#free (2.0)\#
+ \#type ("gross")\#\#ib (9)\#$1\#ie (9)\#\#type ("normal")\#
+
+ \#*macro end\#
+
+____________________________________________________________________________
+
+
+In diesem Beispiel wird ein Makro für den Anfang eines Kapitels definiert. Zwischen
+zwei Kapiteln sollen hier zwei Zentimeter Zwischenraum bleiben, die Kapitel-
+Überschrift (als Parameter) wird in einer größeren Schrift gedruckt. Zusätzlich wird die
+Überschrift für ein Inhaltsverzeichnis in den 9. Index aufgenommen. Nach der Über­
+schrift wird eine Leerzeile eingeschoben, bevor der eigentliche Text anfängt.
+
+Der Anwender dieses Makros schreibt also z.B. folgende Anweisung:
+
+____________________________________________________________________________
+
+ \#kapitelanfang ("Ein Beispiel fuer Manuskripte")\#
+
+____________________________________________________________________________
+
+
+
+Beachten Sie, daß die Kapitel-Überschrift nicht länger als eine Textzeile sein darf.
+Das liegt daran, daß 'lineform'/'autoform' zwar die Zeile bearbeitet, aber nicht in den
+Text einsetzt. 'pageform'/'autopageform' setzt also die unveränderte - nicht umge­
+brochene - Textzeile ein.
+
+Sie können nun Makros für die meisten Textstrukturen definieren. Schreibkräfte
+brauchen dann in der Regel die meisten Text-Anweisungen nicht zu kennen, son­
+dern nur noch eine Anzahl von einfachen Makro-Anweisungen.
+
+Die Makro-Definitionen können jederzeit geändert werden, um wechselnden Bedürf­
+nissen angepaßt zu werden, z.B. wenn ein Verlag ein bestimmtes Schreibformat
+verbindlich vorschreibt. In diesem Fall brauchen nicht alle Text-Dateien geändert zu
+werden, sondern nur die Makro-Definitionen.
+
+Ein weiterer Vorteil einer solchen Vorgehensweise ist, daß die Makro-Anweisungen in
+diesem Fall angeben, #on("i")##on("b")#was#off("i")##off("b")# eine bestimmte Text-Struktur ist, und nicht, #on("i")##on("b")#wie#off("i")##off("b")# die
+Struktur behandelt werden soll.
+
+#on("b")#Anmerkung#off("b")#:
+In eine Makro-Definition sollten Sie ggf. \#limit\#-, \#type\#- und \#linefeed\#-
+Angaben einsetzen, um die Makros unabhängig von der Aufrufstelle zu machen. Ggf.
+sollten Sie auch die Datei vorher mit 'lineform' bearbeiten, um Trennungen vorzu­
+nehmen.
+#page#
+
+#ib(9)#5.8. Textkosmetik für Spezialisten#ie(9)#
+#free(1.0)#
+ #on("i")#
+ In diesem Abschnitt werden Ihnen Kommandos und Anweisungen vorgestellt, die
+ in der Regel nur für Spezialfälle benötigt werden.
+ #off("i")#
+#free(1.0)#
+
+#ib(9)#5.8.1. Schalter-Anweisungen für
+ #ib#Kopf- und Fußbereiche#ie(1, "Schalter-Anweisungen für")##ie(9)#
+#goalpage("head off")##goalpage("bottom off")#
+#free(1.0)#
+
+Mit den Textkosmetik-Anweisungen
+
+____________________________________________________________________________
+
+ #ib#\#head off\##ie#
+
+ #ib#\#bottom off\##ie#
+
+____________________________________________________________________________
+
+
+
+können Sie die Erzeugung von Kopf- oder Fußzeilen abschalten. Mit
+
+
+____________________________________________________________________________
+
+ #ib#\#head on\##ie#
+
+ #ib#\#bottom on\##ie#
+
+____________________________________________________________________________
+
+
+können Sie diese wieder erzeugen. Beachten Sie, daß diese Anweisungen an der
+Stelle beachtet werden, an der sie im Text stehen, d.h. diese Anweisungen gelten
+bereits für die Seite, auf der sie sich bei der 'pageform'-Bearbeitung befinden. Möch­
+ten Sie die Kopfzeilen für eine Seite abschalten, dann sollten Sie an dieser Stelle die
+#ib#\#head off\#-Anweisung#ie# geben. Um die Kopfzeilen für die nächste Seite wieder einzu­
+schalten, sollten Sie die #ib#\#head on\#-Anweisung#ie# an einer Stelle plazieren, von der Sie
+sicher sind, daß sie auf die folgende Seite gelangt (im Zweifelsfall nach einer
+\#page\#-Anweisung).
+#mark ("", "")#
+#page#
+
+#ib(9)#5.8.1.1. #ib#Kopf- und Fußbereiche abstellen#ie##ie(9)#
+#goalpage ("first head")##goalpage("last bottom")#
+#free(1.0)#
+ #on("i")#
+ Mit '#ib#first head#ie#' bzw. '#ib#last bottom#ie#' können Sie Kopf- oder Fußbereiche auf der
+ ersten (letzten) Seite ab- oder wieder anschalten.
+ #off("i")#
+#free(1.0)#
+Manchmal ist es notwendig, die Erzeugung von 'head'-Zeilen auf der ersten Seite
+(z.B. weil dort ein Briefkopf erscheint) und/oder 'bottom'-Zeilen auf der letzten Seite
+(weil keine Folgeseite existiert) zu verhindern. Mit dem Monitor-Kommando
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#first head (FALSE)#ie#
+
+____________________________________________________________________________
+
+
+können Sie bei 'pageform' die Erzeugung von 'head'-Zeilen auf der ersten Seite
+jeder Druckdatei abschalten. Die Erzeugung bleibt so lange abgeschaltet, bis sie
+wieder durch
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#first head (TRUE)#ie#
+
+____________________________________________________________________________
+
+
+angeschaltet wird. Das gleiche gilt analog für 'bottom'-Zeilen auf der letzten Seite:
+Ein- und Ausschalten durch
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#last bottom (FALSE)#ie#
+
+____________________________________________________________________________
+#mark("","")#
+
+bzw.
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#last bottom (TRUE)#ie#
+
+____________________________________________________________________________
+#page#
+
+#ib(9)#5.8.2. Textzeilen markieren#ie(9)#
+#goalpage("mark")#
+#free(1.0)#
+Mit der Anweisung
+
+
+____________________________________________________________________________
+
+ \#mark("markierungszeichen links","markierungszeichen rechts")\#
+
+____________________________________________________________________________
+
+
+
+können Sie einen Textabschnitt an den Rändern (außerhalb des Schreibfeldes!) mit
+Texten markieren, wie z.B. im folgenden mit der Anweisung
+
+#mark ("", "")#
+
+____________________________________________________________________________
+
+ \#mark ("> ", " <")\#
+
+____________________________________________________________________________
+
+
+#mark ("> ", " <")#
+Dabei gilt der erste Parameter für den linken und der zweite für den rechten Rand.
+Beachten Sie, daß Sie einen genügenden Zwischenraum zwischen der Markierung
+und dem Rand mit angeben müssen.
+
+Die Markierung ist insbesondere für Manuals interessant, wo Änderungen gegen­
+über der letzten Version hervorgehoben werden. Das Markierungszeichen wird neben
+den linken und rechten Rand gedruckt (also außerhalb des von \#start\# und \#limit\#
+begrenzten Textfeldes). Für das Drucken der Markierung wird der/die Schrifttyp/ Modi­
+fikationen benutzt, die an der Stelle der \#mark\#-Anweisung eingeschaltet ist. Der
+eigentliche Text bleibt selbstverständlich unberührt.
+#mark ("", "")#
+
+Um nur einen Rand zu markieren, kann auch ein leerer Parameter angegeben
+werden.
+
+____________________________________________________________________________
+
+ \#type ("pica")\#\#mark ("", " |")\#\#type ("normal")\#
+
+____________________________________________________________________________
+
+
+
+Mit der speziellen #ib#\#mark\#-Anweisung#ie#
+
+____________________________________________________________________________
+
+ \#mark ("", "")\#
+
+____________________________________________________________________________
+
+
+wird die Markierung ausgeschaltet.
+
+Soll ein Kopf-, Fuß-, Fußnoten- oder Tabellenbereich markiert werden, sollten sich
+die Markierungsein- und ausschalt-Anweisungen vollständig in dem Bereich be­
+finden.
+#page#
+
+#ib(9)#5.8.3. #ib#Fußnoten pro Seite zählen#ie##ie(9)#
+#goalpage("countperpage")#
+#free(1.0)#
+Manchmal wird gewünscht, daß die Fußnoten für jede Seite separat - also für jede
+Seite von 1 ab - gezählt werden. Das können Sie mit der Textkosmetik-Anweisung
+
+
+____________________________________________________________________________
+
+ \#count per page\#
+
+____________________________________________________________________________
+
+
+erreichen. Sie schaltet von einer fortlaufenden Zählung auf eine seitenweise Zählung
+um. Diese Anweisung sollte am Dateianfang stehen. Sie kann für die betreffende
+Datei nicht mehr abgeschaltet werden.
+#page#
+
+#ib(9)#5.8.4. Behandlung falscher #ib#Silbentrennungen#ie(1, ", Behandlung von falschen")#:
+ #ib#Ausnahmelexikon#ie##ie(9)#
+#free(1.0)#
+ #on("i")#
+ In das Ausnahmelexikon können fehlerhaft getrennte Worte aufgenommen
+ werden.
+ #off("i")#
+#free(1.0)#
+Es kann vorkommen, daß das Silbentrenn-Programm der Textkosmetik einige Worte
+immer wieder falsch trennt. Um dies zu vermeiden, können Sie diese Worte in ein
+#on("b")##on("i")#Ausnahmelexikon#off("b")##off("i")# speichern. Die Worte des Ausnahme-Lexikons werden bei einer
+Silbentrennung zuerst durchsucht. Wird ein Wort im Lexikon gefunden, dann wird das
+eigentliche Silbentrenn-Programm nicht mehr ausgeführt.
+
+Die Ausnahmen müssen Sie - wie unten beschrieben - in einer Datei notieren und
+mit dem Monitor-Kommando
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#lade ausnahmen#ie# ("dateiname")
+
+____________________________________________________________________________
+#goalpage("lade ausnahmen")#
+
+
+in das Lexikon laden. Die Ausnahmen müssen Sie folgendermaßen in die Datei
+schreiben:
+
+____________________________________________________________________________
+
+ Sprech-stun-de
+ ins-be-son-de-re
+ Raum
+ Bei-spiel
+ ...
+
+____________________________________________________________________________
+
+
+Sie können jederzeit neue Ausnahmen in das Lexikon hinzuladen (wiederum mit 'lade
+ausnahmen'). In diesem Fall wird angefragt, ob das Lexikon überschrieben werden
+soll.
+
+
+
+Um zu kontrollieren, welche oder wie viele Ausnahmen sich im Lexikon befinden,
+können Sie
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#entlade ausnahmen#ie# ("dateiname")
+
+____________________________________________________________________________
+ #goalpage("entlade ausnahmen")#
+
+geben. Das Lexikon wird dann in "dateiname" geschrieben. Auch hier können Sie
+weitere Ausnahmen hinzufügen und diese neu laden (aber diesmal überschreiben).
+#mark ("", "")#
+#page#
+
+#ib(9)#5.8.5. #ib#Voreinstellungen ändern#ie#:
+ Einige Monitor-Kommandos#ie(9)#
+#free(1.0)#
+#ib(9)#5.8.5.1. Wenige oder viele #ib#Silbentrennung#ie#en:
+ #ib#Trennpunkt einstellen#ie##ie(9)#
+#goalpage ("hyphenation width")#
+#free(1.0)#
+ #on("i")#
+ Mit dem Kommando 'hyphenation width' können Sie bestimmen, an welchem
+ Punkt Worte zur Trennung angeboten werden. Die Trennbreite können Sie
+ zwischen 4 und 20 Prozent der Zeilenbreite einstellen.
+ #off("i")#
+#free(1.0)#
+Viele Silbentrennungen in einem Text erschweren das Lesen. Nehmen Sie keine
+Silbentrennungen vor, wird der rechte Rand stark "ausgefranst" oder beim Blocksatz
+("rechter Randausgleich") müssen viele Zwischenräume zwischen den Worten ein­
+gefügt werden. Durch das Monitor-Kommando
+
+____________________________________________________________________________
+
+ gib kommando:
+ #ib#hyphenation width#ie# (prozentuale angabe)
+
+____________________________________________________________________________
+
+
+unmittelbar vor dem Aufruf von 'autoform' oder 'lineform' können Sie den Punkt, an
+dem die Silbentrennung einsetzen soll, einstellen. Die Klammern enthalten eine ganze
+Zahl, die für Prozent der Zeilenbreite steht. Minimum sind 4, Maximum 20 Prozent.
+Beispielsweise stellt 'hyphenation width (5)' den Trennpunkt auf 5% der Zeilenbreite
+ein (voreingestellt ist 7). Bei einer Angabe von 20 werden somit sehr wenige Worte
+zur Silbentrennung angeboten, d.h. je größer die Prozentangabe, desto weniger Worte
+werden zur Trennung angeboten. Die Einstellung des Trennpunktes bestimmt also, ab
+wann ein Wort zur Silbentrennung untersucht wird. Andererseits bestimmt die Ein­
+stellung auch, wieviel Zwischenraum zwischen Worten eingefügt werden muß, um
+einen rechten Randausgleich zu erzielen.
+#page#
+
+#ib(9)#5.8.5.2. Anzahl #ib#Leerzeilen vor Fußnoten#ie#
+ einstellen#ie(9)#
+#goalpage("number empty")#
+#free(1.0)#
+ #on("i")#
+ '#ib#number empty lines before foot#ie#' stellt die Anzahl der Leerzeilen vor Fußnoten ein.
+ #off("i")#
+#free(1.0)#
+Die Anzahl der Leerzeilen vor #ib#Fußnoten#ie(1, ", Leerzeilen davor")# (voreingestellt ist eine Leerzeile) können Sie
+durch das Monitor-Kommando 'number empty lines before foot' einstellen.
+
+
+
+____________________________________________________________________________
+
+ gib kommando:
+ number empty lines before foot (3)
+
+____________________________________________________________________________
+
+
+stellt drei Leerzeilen vor dem Fußnotenblock ein. Beachten Sie, daß diese Einstellung
+so lange gilt, bis Sie das Monitor-Kommando erneut geben.
+#mark("","")#
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.5d b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5d
new file mode 100644
index 0000000..8a61f29
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5d
@@ -0,0 +1,211 @@
+#start(5.0,1.5)##pagenr("%",116)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 5: Textkosmetik und Druck
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+5 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 5 - %
+#tableend##clearpos#
+#end#
+
+#ib(9)#5.9. Übersicht über die Anweisungen und
+ Kommandos der EUMEL-Textkosmetik#ie(9)#
+#free(1.0)#
+ #on ("i")#
+ Zuerst werden die am häufigsten benutzten Kommandos/Anweisungen beschrie­
+ ben. Danach sind (durch einen Strich getrennt) Kommandos/Anweisungen auf­
+ geführt, die seltener benötigt werden.
+ #off ("i")#
+#free(1.0)#
+#on("b")#
+#ib#Kommandos#ie##off("b")#
+#free(1.0)#
+ #on("i")#
+ Kommandos werden im Monitor gegeben ('gib kommando :').
+ #off("i")#
+#free(1.0)#
+#lpos(0.0)##lpos(4.6)#
+#table#
+#on("b")#Kommando Bedeutung#off("b")#
+#free(1.0)#
+#clearpos#
+#lpos(0.0)##lpos(4.6)#
+lineform ("x") Formatieren von Zeilen mit interaktiver Silben­
+ trennung.
+autoform ("x") Wie lineform, jedoch werden Silbentrennungen
+ automatisch vorgenommen.
+pageform ("x") Interaktives Formatieren von Seiten, mit Behand­
+ lung von Fußnoten, Kopf- und Fußzeilen, Seiten­
+ numerierung, Seitenquerverweisen usw. Erzeugt
+ eine Druckdatei (Zusatz '.p').
+autopageform ("x") Wie pageform, jedoch werden die Seitengrenzen
+ automatisch plaziert.
+print ("x") Datei drucken.
+print ("x.p") Eine mit 'pageform' bearbeitete Datei drucken.
+---------------- ----------------
+#page#
+index ("x.p") Erstellt aus einer Druckdatei ein Stichwort-
+ und/oder Inhaltsverzeichnis.
+index merge ("a.i1","b.i1") Führt Indexdateien zusammen.
+outline ("x") Erstellt eine Übersicht aus Kapitelüberschriften
+ und Stichworten.
+hyphenation width (int) Stellt die Trennbreite für die Silbentrennung ein.
+load macros ("x") Lädt Makros.
+list macros Zeigt geladene Makros.
+lade ausnahmen ("x") Lädt Wörter, die von der Trennhilfe nicht korrekt
+ getrennt werden, in einen Ausnahme-Speicher.
+entlade ausnahmen ("x") Entlädt die Worte aus dem Ausnahme-Speicher
+ in die angegebene Datei.
+first head (false) Schaltet Kopfzeilen auf erster Seite aus.
+first head (true) Schaltet Kopfzeilen auf erster Seite wieder ein.
+last bottom (false) Schaltet Fußzeilen auf letzter Seite aus.
+last bottom (true) Schaltet Fußzeilen auf letzter Seite wieder ein.
+number empty lines before foot Stellt die Anzahl der Leerzeilen vor einer Fußnote
+before foot ein.
+#tableend##clearpos#
+#page#
+#on("b")#
+#ib#Anweisungen#ie##off("b")#
+#free(1.0)#
+ #on ("i")#
+ Anweisungen werden in die Datei geschrieben. Jede Anweisung muß in Anwei­
+ sungszeichen eingeschlossen werden. Als Parameter (diese werden in Klammern
+ eingeschlossen) kommen in Frage:
+ 'int' bedeutet eine ganze Zahl: 17, 1, 311;
+ 'real' bedeutet eine Zahl mit Dezimalpunkt (meist cm-Angabe): 0.5, 1.25;
+ 'text' bedeutet eine Zeichen-Angabe. Muß in Anführungszeichen eingeschlos­
+ sen werden: "%", "meine datei".
+ #off ("i")#
+#free(1.0)#
+#lpos(0.0)##lpos(4.6)#
+#table#
+#on("b")#Anweisung Bedeutung#off("b")#
+#clearpos#
+#lpos(0.0)##lpos (4.6)#
+
+type (text) Schrifttyp einstellen: \#type("trium8")\#
+limit (real) Zeilenbreite einstellen: \#limit (16.0)\#
+on (text) Modifikation einschalten: \#on("bold")\#. Erlaubt
+ sind: b(bold), r(everse), i(talic), u(nderline)
+off (text) Modifikation ausschalten (siehe 'on').
+block Blocksatz (Randausgleich) einschalten.
+head Kopfzeilen (für Seiten mit geraden/ungeraden
+(bzw. headeven/headodd) Seitennummern) definieren.
+... -%- Platzhalter für Seitenzahl.
+end Kopfzeilen-Ende (pageform).
+bottom Wie oben, jedoch für Fußzeilen.
+(bzw.
+bottomeven/bottomodd)
+...
+end Fußzeilen-Ende
+pagenr (text, int) Seitennummer einstellen bzw. zusätzliches Sei­
+ enzeichen ab nächster Seite einführen:
+ \#pagenr ("%", 17)\#
+foot Fußnoten-Anfang.
+...
+end Fußnoten-Ende.
+free (real) Platz freihalten (in cm): \#free (1.27)\#
+page Neue Seite: \#page\#
+page (int) Neue Seite mit Seitennummer 17: \#page (17)\#
+linefeed (real) Zeilenhöhe relativ zum eingeschalteten Schrifttyp
+ verändern: \#linefeed (1.25)\#
+pagelength (real) Seitenlänge einstellen (ab nächster Seite in cm):
+ \#pagelength (24.0)\# Nachfolgenden Zeilentext
+center zentriert drucken.
+right Nachfolgenden Zeilentext rechtsbündig drucken.
+u ... e (steht für up) Exponent schreiben: \#u\#123\#e\#
+d ... e (steht für down) Index schreiben.
+start (real, real) Schriftfeld (linke obere Ecke) einstellen: \#start
+ (1.0, 2.0)\#
+------------ ------------
+b Zwei Zeichen übereinander drucken.
+bottom off Schaltet Fußzeilen aus.
+bottom on Schaltet Fußzeilen ein.
+bpos (real, real) Der Text zwischen den angegebenen Tabellen­
+ positionen wird im Blocksatz gedruckt.
+clearpos Löscht alle Tabellenpositionen.
+clearpos (real) Löscht die angegebene Tabellenposition.
+columns (int, real) Formatieren von Spalten mit Zwischenraum:
+ \#columns (3, 1.0)\#, 3 Spalten mit 1 cm Zwischen­
+ raum.
+columnsend Beendigung der Spaltenformatierung.
+count Interner Zähler für Fußnoten wird eingesetzt
+ (pageform).
+count (text) Wie oben, aber der Wert des internen Zählers
+ wird vermerkt: \#count ("neue Zahl")\#
+count per page Interner Zähler beginnt bei jeder Seite mit 1.
+cpos (real) Zentrierende Tabellenposition.
+dpos (real, text) Um den angegebenen Text zentrierende Tabel­
+ lenposition, meist Dezimalzeichen:
+ \#dpos (13.0, 2.")\#
+fillchar (text) Zwischenräume zwischen Tabellenpositionen wer­
+ den mit dem angegebenen Text beim Drucken
+ ausgefüllt. Beachten Sie, daß das Ausschalten der
+ Füllzeichen durch 'niltext' erfolgt.
+goalpage (text) Stelle, auf die obige Anweisung verweist: \#goal­
+ page ("1.Kapitel")\#
+head off Schaltet Kopfzeile(n) aus.
+head on Schaltet Kopfzeile(n) ein.
+ib Anfang eines Stichworts oder einer Kapitel­
+ überschrift kennzeichnen (Ablegen in Indexdatei
+ mit Zusatz '.i1'): \#ib\#ein Stichwort oder eine
+ Kapitelüberschrift\#ie\#
+ib (int) Wie oben, jedoch wird Stichwort in angegebener
+ Indexdatei abgelegt.
+ib (int, text) Wie oben, jedoch erhält Eintrag in der Indexdatei
+ den angegebenen Text an die Seiten­
+ nummer angefügt.
+ie Beendigung der Stichwortmarkierung.
+ie (int) Wie oben (int-Angabe muß der in der ib-An­
+ weisung entsprechen).
+ie (int, text) Wie oben, jedoch wird die Textangabe hinter das
+ markierte Stichwort angefügt.
+lpos (real) Linksbündige Tabellenposition.
+mark (text, text) Markierung rechts und links neben der Schreib­
+ fläche ein-/ausschalten.
+pageblock Einschalten des vertikalen Blocksatzes. Falls ein­
+ geschaltet, kann mit 'pageform' auch über das
+ (rechnerische) Seitenende formatiert werden.
+rpos (real) Rechtsbündige Tabellenposition.
+setcount (int) Zählerwert setzen: \#setcount (17)\#
+table Anfang einer Tabelle.
+...
+table end Ende einer Tabelle.
+topage (text) Seitenverweis (die Seitennummer, auf die verwie­
+ sen wird, wird eingesetzt):
+ \#topage ("1.Kapitel")\#
+value Letzter Zählerwert wird eingesetzt.
+value (text) Wie oben, jedoch wird ein vermerkter Zählerwert
+ eingesetzt: \#value ("Vermerk")\#
+#tableend#
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.5e b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5e
new file mode 100644
index 0000000..d515c6a
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5e
@@ -0,0 +1,223 @@
+#start(5.0,1.5)##pagelength(17.4)##pagenr("%",121)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 5: Textkosmetik und Druck
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+5 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 5 - %
+#tableend##clearpos#
+#end#
+
+#ib(9)#5.10. Fehlersituationen und Abhilfe#ie(9)#
+
+#free(1.0)#
+Was können Sie machen, wenn
+
+
+... bestimmte Anweisungen, die den Gesamttext betreffen, erst ab der zweiten
+ Seite wirksam werden?
+
+
+ Textkosmetik-Anweisungen, die ab der ersten Seite für den ganzen Text gelten
+ sollen, müssen Sie als erstes, d.h. in die erste Zeile einer Datei, schreiben. Dies
+ bezieht sich u.a. auf 'pagelength', 'start', 'block', 'pageblock' etc., die noch vor
+ \#head\#- oder \#bottom\#-Anweisungen gesetzt werden müssen.
+
+
+
+
+... sich der Cursor nicht mehr bewegen läßt?
+
+
+ Eine Möglichkeit besteht darin, daß Sie versehentlich die 'STOP' -Taste
+ (='CTRL a' gleichzeitig, d.h. Anhalten der Bildschirmausgabe) betätigt haben.
+ In diesem Fall drücken Sie die 'WEITER' -Taste ('CTRL c' gleichzeitig, d.h.
+ Bildschirmausgabe fortführen). Alle Tastenanschläge, die Sie in der Zwischen­
+ zeit vollzogen haben, werden jetzt ausgeführt.
+
+ Eine andere Möglichkeit wäre, daß Sie Ihre Datei/Task nicht ordnungsgemäß
+ verlassen haben. Versuchen Sie über die 'SV'-Taste und 'ESC h' wieder auf
+ die Monitor-Ebene zu gelangen, so daß Sie dann auf die Aufforderung 'gib
+ kommando' hin, wieder in Ihre Datei gelangen können.
+
+
+
+
+... Sie nur einen Dateiausschnitt löschen, duplizieren oder mit 'lineform' bearbeiten
+ möchten?
+
+
+ Der betreffende Ausschnitt muß markiert werden. Zum Löschen benutzen Sie
+ die Tasten 'ESC RUBOUT'. Der Ausschnitt ist hiermit aber noch nicht 'voll­
+ ständig verschwunden', sondern Sie können ihn mit 'ESC RUBIN' an gleicher
+ oder anderer Stelle wieder hervorbringen, so lange bis Sie die Tasten erneut
+ benutzen.
+
+ Das Duplizieren eines Textbereiches erfolgt nach dem Markieren durch das
+ Betätigen der Tastenfolge 'ESC d'. Hierbei bleibt der Originaltext erhalten und
+ kann beliebig oft dupliziert werden. Den duplizierten Text holen Sie sich mit
+ 'ESC g' an die gewünschte Stelle in Ihrer Datei.
+
+ Möchten Sie 'lineform' nur auf einen Ausschnitt anwenden, markieren Sie
+ diesen und geben nach 'ESC ESC' das Kommando 'lineform'.
+
+
+
+
+... beim Drucken die letzte bzw. die letzten beiden Zeilen auf einer gesonderten
+ Seite ausgedruckt werden?
+
+
+ a) Sie müssen die Fonttabelle noch einrichten.
+
+ oder
+
+ b) Sie setzen die \#pageblock\#-Anweisung zu Beginn des Textes und "stau­
+ chen" um zwei Zeilen.
+
+ oder
+
+ c) Sie wählen eine kleineren Schrifttyp.
+
+
+
+
+... in Ihrer Datei die Meldung
+
+ _______________________________________________________________________
+
+ FEHLER: FILE-Überlauf
+
+ gib kommando:
+ edit ("dateiname")
+
+ _______________________________________________________________________
+
+ erscheint und das Abschicken des Kommandos mittels der 'CR'-Taste aber nur
+ zu einer identischen Meldung (siehe oben) führt?
+
+
+ Wenn Sie auf dem oben dargestellten Weg nach mehrmaligem Versuchen nicht
+ wieder in Ihre Datei gelangen, haben Sie die Möglichkeit, mit dem Kommando
+
+ _______________________________________________________________________
+
+ gib kommando:
+ reorganize ("dateiname")
+
+ _______________________________________________________________________
+
+
+ Ihre Datei neu zu 'organisieren', um 'Lücken', die durch Einfügen oder Löschen
+ entstanden sind, zu eliminieren. Die Datei beansprucht dann in der Regel auch
+ weniger Speicherplatz.
+
+ Sind Sie wieder in Ihrer Datei, empfiehlt es sich, die große Datei in mehrere
+ kleine aufzuteilen. Entweder Sie halbieren oder (besser) Sie dritteln Ihre Text­
+ datei und verteilen den Text auf zwei bis drei Dateien. Zukünftig sollten Sie es
+ sich dann bei umfangreichen Texten zur Regel machen, nur ein logisch
+ zusammenhängendes Kapitel in einer Datei abzulegen. Sie sollten Ihre Datei nur
+ so groß halten, daß Ihnen noch genügend Raum zur Verfügung steht, Proze­
+ duren wie z.B. 'pageform' durchzuführen, durch die sich der Umfang einer Datei
+ (z.T. wesentlich) vergrößert.
+
+
+
+
+... bei Ihrem Text einige Wörter mit extrem großem Zwischenraum gedruckt
+ wurden?
+
+
+ Sie haben in diesem Fall wahrscheinlich vergessen, die Absatzmarkierung zu
+ setzen, so daß aufgrund der \#block\#-Anweisung ein rechter Randausgleich
+ erfolgte, den Sie an dieser Stelle nicht wünschten.
+
+
+
+
+... eine Überschreibung erfolgt ist bzw. wenn 'lineform' eine Überschreibung
+ meldet?
+
+
+ Eine solche Überschreibung kann auftreten, wenn Sie mit einer besonders
+ großen Type in Fettdruck (z.B. triumb14) schreiben (vgl. Sie hierzu auch Kapitel
+ 5.2.6.). Um dies zu verhindern, können Sie zum einen die Anzahl der Blanks
+ zwischen den einzelnen Gliedern erhöhen oder zum anderen auch die
+ \#type\#-Anweisung in die vorhergehende Zeile setzen (n i c h t direkt v o r den
+ betreffenden Text).
+
+
+
+
+... nach der erfolgten Prozedur 'lineform' Ihre Tabellen durcheinander geraten
+ sind?
+
+
+ Wenn Sie Tabellen schreiben, müssen Sie nach jeder Zeile die Absatzmarke
+ setzen. Sollen bei einigen Tabellenpositionen Spalten leer bleiben, müssen Sie
+ für diese Positionen ein geschütztes Blank einsetzen.
+
+
+
+
+... bei der Prozedur 'pageform' das Seitenende nicht interaktiv verschoben werden
+ kann, obwohl am Anfang der Datei eine \#pageblock\#-Anweisung gegeben
+ wurde?
+
+
+ Eine \#page\#-Anweisung im Text bewirkt, daß Sie an dieser Stelle das Seiten­
+ ende nur bestätigen, die Anweisung löschen oder als dritte Möglichkeit, die
+ Seitenformatierung abbrechen können. Für den Fall, daß die \#page\#-
+ Anweisung nicht mehr zutrifft bzw. falsch gesetzt wurde, sollten Sie die Anwei­
+ sung löschen und das Seitenende interaktiv plazieren.
+
+
+
+
+... Sie bei der Erstellung eines Inhaltsverzeichnisses oder eines Indexes keine
+ Füllzeichen zwischen Text und Seitenangabe haben möchten?
+
+
+ In diesem Fall gehen Sie mit 'ESC ESC' in den Kommandozustand und ändern
+ mit Hilfe von CA (Change All) die Füllzeichen in Leerzeichen um. Verwenden
+ Sie nicht nur einen Punkt, da sonst auch die Punkte zwischen den Ziffern der
+ Kapitelnumerierung verschwänden. Es kann bei einer ungeraden Anzahl von
+ Füllzeichen notwendig sein, nachträglich noch einige Punkte entfernen zu
+ müssen.
+
+ _______________________________________________________________________
+
+ gib kommando: ".." CA " "
+
+ _______________________________________________________________________
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.6 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.6
new file mode 100644
index 0000000..5e035d2
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.6
@@ -0,0 +1,474 @@
+#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Teil 6: Spezialitäten
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+6 - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD 6 - %
+#tableend##clearpos#
+#end#
+
+#kap("TEIL 6: Spezialitäten")#
+#free(1.0)#
+
+6.1. Notizbuch
+#free(1.0)#
+ Das Notizbuch erlaubt es u.a., Fehlermeldungen zwischenzeitig zu speichern und
+ am Ende einer Verarbeitung die Fehlermeldungen zusammen mit dem bearbeiteten
+ Text im Fenstereditor anzuzeigen.
+#free(1.0)#
+Das #ib#Notizbuch#ie# wird von den Programmen 'lineform' und 'pageform' zum Sammeln
+von Warnungen und Fehlermeldungen verwendet. Wenn das Fenster des Notizbuches
+an Bildschirm eröffnet ist, können Sie es handhaben wie das gewohnte Editorfenster.
+
+Falls Sie das Notizbuch selbst beim Editieren für Notizen verwenden möchten, drük­
+ken Sie statt <ESC> <e> für den Fenstereditor die Tasten <ESC> <n> an beliebiger
+Stelle des Bildschirms. Durch dieses Kommando wird das Notizbuch statt einer Datei
+gezeigt. Sie sparen somit die Eingabe eines Dateinamens und können direkt mit allen
+vorgestellten Editorfunktionen im Notizbuch arbeiten.
+
+
+#page#
+____________________________________________________________________________
+ ................ handbuch teil6 .............. Zeile 56
+\#kap("6.2. EUMEL-Zeichensatz")\#
+\#free(1.0)\#
+\#zus\#
+ \#corner1("-5.0")\#
+ Das EUMEL-System definiert einen Zeichensatz, der gewähr­
+ auf allen Maschinen überall gleich codiert werden. Dadurch ist
+ Dateien und Programme ohne Konvertierungen zwischen EUMEL-Syst
+ unterschiedlicher Hersteller zu übertragen. Der \#ib\#EUMEL-
+ dem ASCII-Zeichensatz (DIN 66 003) mit Erweiterungen.
+ \#box3("T","2","115.0")\#
+
+ ................. notebook ................... Zeile 1
+FEHLER Zeile 55: Modifikation nicht angeschaltet bei off: b
+ >>> Anweisung in angegebener Zeilennummer überprüfen
+WARNUNG Zeile 55: Umschaltung auf gleichen Schrifttyp: trium8
+ >>> Schrifttyp wurde darum nicht verändert!
+WARNUNG Zeile 75: Überschreibung nach >\#ib(9)\#6.2.< Fehlende
+ >>> Bitte fehlende Leerzeichen einfügen
+
+____________________________________________________________________________
+#page#
+6.2. EUMEL-Zeichensatz
+#free(1.0)#
+
+
+ Das EUMEL-System definiert einen Zeichensatz, der gewährleistet, daß Zeichen
+ auf allen Geräten gleich codiert werden. Dadurch ist es z.B. möglich, Dateien und
+ Programme ohne Konvertierungen zwischen EUMEL-Systemen unterschiedlicher
+ Hersteller zu übertragen. Der #ib#EUMEL-Zeichensatz#ie# beruht auf dem ASCII-
+ Zeichensatz (DIN 66 003) mit Erweiterungen.
+
+#free(1.0)#
+
+Die Darstellung der einzelnen Zeichen hängt vom Endgerät ab. Die hier aufgeführten
+Zeichen sind i.A. auf allen Geräten vorhanden. Ein erweiterter Zeichensatz (mit ma­
+thematischen, diakritischen und griechischen Zeichen) ist nur auf Spezialgeräten
+verfügbar und wird deshalb hier nicht angegeben.
+#page#
+Beispiele zum Lesen der Tabelle:
+
+ code (" ") -> 32
+ code ("m") -> 109
+ | 0 1 2 3 4 5 6 7 8 9
+--+----------------------------------------
+3 | SP ! " \# $ % & '
+ |
+4 | ( ) * + , - . / 0 1
+ |
+5 | 2 3 4 5 6 7 8 9 : ;
+ |
+6 | < = > ? § A B C D E
+ |
+7 | F G H I J K L M N O
+ |
+8 | P Q R S T U V W X Y
+ |
+9 | Z [ ��\� ] ^ _ ` a b c
+ |
+10| d e f g h i j k l m
+ |
+11| n o p q r s t u v w
+ |
+12| x y z | } ~
+ |
+13|
+ .
+ .
+ .
+20|
+ |
+21| Ä Ö Ü ä ö ü
+ |
+22| k ­ \# SP
+ |
+23|
+ |
+24|
+ |
+25| ß
+#page#
+
+
+Anmerkungen:
+
+1) SP bedeutet Leerzeichen ("blank").
+
+2) Die Zeichen 'k', '-' und 'SP' mit den Codes 220, 221, 223 werden für die Zwecke
+ der Textkosmetik benötigt (Trenn-'k' bei der Umwandlung von 'ck' in 'kk'; Trenn­
+ zeichen; geschütztes Leerzeichen).
+
+3) Das Zeichen '\#' (Code 222) ist druckbar, während das Zeichen '\#' (Code 35) nicht
+ druckbar ist (Einleitungszeichen für Anweisungen der Textkosmetik und Drucker).
+
+4) Das Zeichen SP (Code 223) wird zur besseren Identifizierung invers oder als
+ Unterstreichungsstrich auf dem Terminal dargestellt. In einem Ausdruck erscheint
+ es als ein Leerzeichen.
+
+Falls Sie Zeichen ausgeben möchten, die nicht auf der Tastatur sind, müssen Sie den
+Code der gewünschten Zeichen zu Hilfe nehmen.
+
+Bewegen Sie den Cursor dazu an die Stelle der Datei, an die das Sonderzeichen
+geschrieben werden soll und geben Sie nach <ESC> <ESC> ein:
+
+
+____________________________________________________________________________
+ ................. dateiname .................. Zeile 123
+
+ TABELLE 1
+ _____________________
+ | |
+ gib kommando : type(code(124))
+
+
+
+____________________________________________________________________________
+#page#
+6.3. Sortier-Programme
+#free(1.0)#
+
+
+ Es stehen zwei verschiedene Sortier-Programme zur Verfügung: 'sort' (Sortierung
+ nach ASCII-Reihenfolge) und 'lex sort' (Sortierung nach deutschem Alphabet).
+
+#free(1.0)#
+
+Die Sortierprogramme sortieren eine Datei zeilenweise.
+
+Beispiel:
+
+
+____________________________________________________________________________
+ ................. dateiname ................. Zeile 1
+ Berta ist eine Frau.
+ Adam ist ein Mann.
+ ...
+
+____________________________________________________________________________
+
+
+____________________________________________________________________________
+gib kommando :
+#ib#sort#ie# ("dateiname")
+
+____________________________________________________________________________
+
+
+
+
+____________________________________________________________________________
+ ................. dateiname ................. Zeile 1
+ Adam ist ein Mann.
+ Berta ist eine Frau.
+ ...
+
+____________________________________________________________________________
+
+
+
+
+Dabei werden die Zeilen-Anfänge solange zeichenweise miteinander verglichen, bis
+ein Unterschied auftritt und dann ggf. umgeordnet. Werden zwei ungleich lange Zeilen
+(Anzahl Zeichen/Zeile) miteinander verglichen, dann kann man sich die kürzere Zeile
+mit Leerzeichen auf die Länge der längeren Zeile verlängert denken.
+
+Die Reihenfolge, in der die Zeilen sortiert werden, erfolgt nach dem ASCII-
+Zeichensatz in aufsteigender Reihenfolge (vergl EUMEL-Zeichencode):
+
+
+ das Leerzeichen
+ einige Sonderzeichen
+ die Ziffern
+ einige Sonderzeichen
+ große Buchstaben
+ einige Sonderzeichen
+ kleine Buchstaben
+ einige Sonderzeichen
+ die Umlaute und ß
+
+
+Das bedeutet, daß z.B. folgendermaßen sortiert wird:
+
+
+____________________________________________________________________________
+ ................. dateiname ................. Zeile 1
+ Adam
+ Ball
+ Zuruf
+ aber das ist ein Satz
+ niemals
+ Überlauf
+
+____________________________________________________________________________
+
+
+
+
+Um zu erreichen, daß große und kleine Buchstaben gleichwertig behandelt werden,
+kann man das Kommando
+
+____________________________________________________________________________
+gib kommando :
+#ib#lex sort#ie# ("dateiname")
+
+____________________________________________________________________________
+
+
+
+geben.
+
+In diesem Fall würde die sortierte Datei folgendermaßen aussehen:
+
+____________________________________________________________________________
+ ................. dateiname ................. Zeile 1
+ aber das ist ein Satz
+ Adam
+ Ball
+ niemals
+ Überlauf
+ Zuruf
+
+____________________________________________________________________________
+
+
+Man beachte, daß der Umlaut 'Ü' wie 'Ue' behandelt wird (für die restlichen Umlaute
+gilt eine analoge Behandlung; ebenso wird 'ß' wie 'ss' behandelt). Weiterhin werden
+alle Sonderzeichen bei der Sortierreihenfolge ignoriert.
+
+6.4 Fonttabellen
+#free(1.0)#
+
+
+ Eine Fonttabelle enthält Angaben zu den druckbaren Zeichen.
+
+#free(1.0)#
+
+Die Einstellung einer Fonttabelle#u#1)#e# erfolgt automatisch beim Einrichten der Drucker-
+Task (siehe Anhang). Um den Namen der in der Task eingestellten Fonttabelle zu
+erhalten geben Sie ein:
+#foot#
+1) Fonttabelle: Beschreibung der druckbaren Schrifttypen.
+#end#
+
+____________________________________________________________________________
+
+gib kommando:
+put(fonttable)
+
+____________________________________________________________________________
+
+
+Die Ausgabe liefert den Namen der in der Task eingestellten Fonttabelle.
+
+____________________________________________________________________________
+
+gib kommando:
+put(fonttable)
+agfa9
+gib kommando:
+
+____________________________________________________________________________
+
+
+Um eine neue oder andere Fonttabelle einzustellen, etwa weil verschiedene Drucker
+benutzt werden können, geben Sie das 'fonttable' Kommando mit dem Namen der
+gewünschten Fonttabelle als Parameter an:
+
+____________________________________________________________________________
+
+gib kommando:
+fonttable("name der fonttabelle")
+
+____________________________________________________________________________
+
+
+
+Eine weitergehende Beschreibung der eingestellten Fonttabelle erhalten Sie durch das
+Kommando 'list fonts':
+
+____________________________________________________________________________
+
+gib kommando:
+list fonts
+
+____________________________________________________________________________
+
+
+Durch dieses Kommando erhalten Sie in das Notizbuch eine Aufstellung der Schrift­
+typen mit Angaben zu Namen der verfügbaren Schrifttypen in der Fonttabelle,
+Größenangaben zu den Schriftttypen etc.
+
+____________________________________________________________________________
+ ................. notebook .................. Zeile 1
+FONTTABELLE : "agfa9";
+ x einheit = 160.0;
+ y einheit = 160.0;
+
+ FONT : "micro", "elanlist", "bulletin22";
+ einrueckbreite = 20;
+ durchschuss = 7;
+ fonthoehe = 30;
+ fonttiefe = 8;
+ groesserer font = "";
+ kleinerer font = "";
+
+ FONT : "trium10";
+ einrueckbreite = 31;
+ durchschuss = 6;
+ fonthoehe = 54;
+ fonttiefe = 15;
+ groesserer font = "trium12";
+ kleinerer font = "trium8";
+
+____________________________________________________________________________
+
+
+
+Anmerkung:
+ - Falls mehrere Namen für einen Schrifttyp angegeben sind, können Sie
+ einen beliebigen dieser Namen in der \#type\#-Anweisung benutzen.
+
+ - Größenangaben sind in 'Mikroschritten', d.h. den kleinstmöglichen
+ Schritten des jeweiligen Druckers angegeben und nicht etwa in mm.
+
+ - Weitere Informationen entnehmen Sie ggf. dem Systemhandbuch.
+
+#page#
+6.5 Syntax der Kommandos
+#free(1.0)#
+code
+ TEXT PROC code (INT CONST zahl)
+ Wandelt 'zahl' in ein Zeichen um. Falls die Zahl kleiner als 32 oder größer als 254
+ ist, (siehe Codetabelle) muß mit unerwarteten Ergebnissen gerechnet werden.
+
+
+ type(code(92))
+
+
+ INT PROC code (TEXT CONST zeichen)
+ Wandelt 'zeichen' in die zugehörige EUMEL-Codierung um. Falls mehr als ein
+ Zeichen angegeben wird, ist das Resultat '-1'.
+
+
+ put(code(92))
+
+
+
+list fonts
+ PROC list fonts
+ Listet die Fonts der eingestellten Tabelle ins #on("i")#notebook#off("i")#.
+
+ PROC list fonts (TEXT CONST fonttable name)
+ Listet die Fonts der angegebenen Fonttabelle ins #on("i")#notebook#off("i")#. Die vorher eingestellte
+ Fonttabelle bleibt jedoch weiter eingestellt.
+
+
+ list fonts ("fonttab.alternativ")
+
+
+
+lex sort
+ PROC lex sort (TEXT CONST datei)
+
+ Zeilenweise Sortierung nach (deutscher) lexikographischer Reihenfolge nach DIN
+ 5007.
+
+
+ lex sort ("telephonliste")
+
+
+ PROC lex sort (TEXT CONST datei, INT CONST anfang)
+
+ Wie 'lex sort', jedoch wird bei der Sortierung bei 'anfang' jeder Zeile begonnen.
+
+
+ lex sort ("liste",20)
+
+
+sort
+ PROC sort (TEXT CONST datei)
+
+ Die Prozedur 'sort' sortiert die Datei 'datei' zeilenweise. Die Sortierung erfolgt
+ nach der Ordnung, die der EUMEL-Zeichencode vorschreibt. Beispielsweise
+ werden Zeilen ("Sätze"), die mit Ziffern beginnen, vor Sätzen, die mit Buchstaben
+ anfangen, eingeordnet. Sätze, die mit großen Buchstaben beginnen, werden vor
+ Sätzen mit kleinen Buchstaben einsortiert. Weiterhin werden die Umlaute und das
+ "ß" nach allen anderen Buchstaben eingeordnet.
+
+
+ sort ("liste")
+
+
+ PROC sort (TEXT CONST datei, INT CONST anfang)
+
+ Sortiert eine Datei wie obige Prozedur, jedoch wird bei der Sortierung nicht der
+ Anfang eines Satzes beachtet, sondern die Position 'anfang'.
+
+
+ sort ("liste",10)
+
+
+
+type
+ PROC type (TEXT CONST zeichenkette)
+
+ Fügt 'zeichenkette' in die aktuelle Position der editierten Datei ein. Besonders
+ nützlich in Verbindung mit der Prozedur 'code', um nicht auf der Tastatur enthal­
+ tene Zeichen in den Text zu bringen.
+
+
+ type(code(200))
+
diff --git a/doc/user-manual/1.8.7/doc/benutzerhandbuch.anhang b/doc/user-manual/1.8.7/doc/benutzerhandbuch.anhang
new file mode 100644
index 0000000..5a58f95
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.anhang
@@ -0,0 +1,484 @@
+#start(5.0,1.5)##pagenr("%",1)##setcount(1)##block##pageblock##count per page#
+#headeven#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+ EUMEL-Benutzerhandbuch
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#headodd#
+#lpos(0.0)##cpos(5.5)##rpos(11.0)##fillchar(" ")#
+#table#
+ Anhang
+#fillchar(" ")#
+#on("u")# #off("u")#
+#table end##clear pos#
+
+#end#
+#bottomeven#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+A - % GMD
+#tableend##clearpos#
+#end#
+#bottomodd#
+
+#lpos(0.0)##cpos(5.5)##rpos(11.0)#
+#table#
+#fillchar(" ")#
+#on("u")# #off("u")#
+#fillchar(" ")#
+GMD A - %
+#tableend##clearpos#
+#end#
+Aufbau und Installation
+#free(0.5)#
+ Diese Installationsanleitung dient nur als Beispiel und soll nicht die Anleitung zu
+ dem von Ihnen benutzten Gerät ersetzen. Insbesondere die hier beschriebene
+ Möglichkeit der Partitionierung ist kein Standard!
+#free(0.5)#
+Allgemeines über das Betriebssystem EUMEL
+#free(0.5)#
+
+Zum besseren Verständnis des Installierungsvorganges sei hier kurz der Aufbau des
+Betriebssystems EUMEL erläutert (Der EUMEL-Kenner mag diesen Abschnitt über­
+springen) :
+
+Das System besteht im wesentlichen aus den folgenden Komponenten :
+
+ - SHard (#on("i")##on("b")#S#off("b")##off("i")#oftware - #on("i")##on("b")#Hard#off("b")##off("i")#ware Interface)
+ - Systemkern (EUMEL-0)
+ - darauf aufbauende Systemteile
+
+Das #on("b")##ib#SHard#ie##off("b")# ist der #on("u")#hardwareabhängige#off("u")# Teil des Betriebssystems. Dieser Teil ist ver­
+antwortlich für den Informationsfluß zwischen der virtuellen Maschine EUMEL-0 und
+den einzelnen Hardwarekomponenten (Tastatur, Diskettenlaufwerk, Schnittstellen,
+usw.).
+
+Der #on("b")#Systemkern#off("b")# (auch mit EUMEL-0 oder Urlader bezeichnet) ist der #on("u")#prozessorab­
+hängige#off("u")# Teil des Systems. Er bestimmt im wesentlichen die Leistung des Betriebssy­
+stems, da er als virtueller Prozessor den Befehlsumfang für den ELAN-Compiler
+definiert. Dieser Befehlsumfang wird dann auf den tatsächlichen Befehlsvorrat des
+hardwaremäßig vorhandenen Prozessors abgebildet.
+
+Die auf dem Kern (EUMEL-0) #on("b")#aufbauenden Systemteile#off("b")# sind #on("u")#hardware- und prozes­
+sorunabhängig#off("u")#. Sie beinhalten den ELAN-Compiler und alle Tasks, Texte, insertier­
+ten ELAN-Pakete, benannte und unbenannte Datenräume eines EUMEL-Systems.
+Diese Systemteile bilden zusammen mit dem Systemkern EUMEL-0 den #goalpage("v2")##on("b")#EUMEL-
+Hintergrund#off("b")#, d.h. EUMEL-0 ist Teil des #ib#EUMEL-Hintergrundes#ie#. Momentan werden
+je nach Rechnertyp Diskette und Festplatte als Hintergrundspeichermedium für
+EUMEL unterstützt.
+
+Der Begriff EUMEL-Hintergrund (HG) resultiert aus dem Konzept des virtuellen
+Speichers. Bei diesem Konzept wird der RAM-Speicherbereich der Hardware nur als
+Pufferbereich nach dem Demand-Paging-Verfahren benutzt, mit Ausnahme der
+residenten Systemteile (SHard und EUMEL-0). Das macht den Benutzer bezüglich
+seiner Programme und Daten unabhängig von der eigentlichen Größe des RAM-
+Speichers. Diese bestimmt lediglich den Durchsatz (Performance) des Systems, d.h. je
+größer der RAM-Bereich Ihres Rechners ist, desto schneller arbeitet das EUMEL-
+System.
+
+EUMEL-0 befindet sich auf der ersten Hintergrunddiskette. Das Laden von
+EUMEL-0 und des restlichen EUMEL-Hintergrundes kann daher in einem Arbeits­
+gang geschehen.
+
+Der Auslieferungs-Hintergrund ist noch nicht konfiguriert und stellt ausschließlich die
+im Handbuch beschriebenen Leistungen des Betriebssystems zur Verfügung. Er
+besteht im wesentlichen aus insertierten ELAN-Paketen, die den Leistungsumfang
+des Systems bestimmen (Single- oder Multiuser, mit oder ohne Textverarbeitung).
+Steht dieser Hintergrund auf mehreren Disketten (Multiuser-Hintergründe), dann sind
+diese fortlaufend numeriert. Die erste Hintergrunddiskette hat die Nummer 0, um
+daran zu erinnern, daß sich auf dieser Diskette auch der Systemkern EUMEL-0
+befindet.
+
+Ein Hintergrund kann natürlich auch die Systemsicherung eines größeren Systems mit
+z.B. mehreren Megabytes sein. Sollten Sie später einmal Ihr bestehendes System
+durch ein anderes ersetzen wollen (Hintergrund überschreiben), so brechen Sie wäh­
+rend des Hochfahrens beim Speichertest das System durch Tastendruck ab und laden
+durch Anwahl von 2 'neuen Hintergrund vom Archiv laden' im Startdialog das neue
+System.
+
+#on("i")##on("u")#ACHTUNG:#off("u")##off("i")# Dabei gehen alle Daten des alten Systems unwiederbringlich verloren!
+ (Siehe dazu auch 'Laden eines EUMEL-Hintergrundes'.)
+
+Zur besseren Verständlichkeit sollen an dieser Stelle noch die Begriffe 'Systemstart'
+und 'Systemabschaltung' des EUMEL-Systems erläutert werden :
+
+#on("i")##on("b")##ib#Systemstart#ie# :#off("b")##off("i")#
+Wenn ein EUMEL-System gestartet wird (auch 'Hochfahren' genannt), und dies gilt
+auch für kleinere Diskettensysteme wie den 'Generierungseumel' (siehe Seite #topage("v1")#),
+wird zunächst das SHard geladen; dazu erscheint auf dem Bildschirm eine entspre­
+chende Meldung. Das SHard versucht nun den Systemkern vom Archivmedium (in der
+Regel Diskette) zu laden. Ist keine entsprechende Diskette eingelegt, so wird ver­
+sucht, EUMEL-0 vom Hintergrundmedium (Festplatte) zu laden.
+
+Danach wird EUMEL-0 aktiv; auf dem Bildschirm erscheinen Angaben zu verfügba­
+ren Kanälen, RAM- und Hintergrundspeicher-Größe. Dann führt EUMEL-0 einen
+Speichertest durch, was daran zu erkennen ist, daß eine Folge von Sternchen (*) auf
+den Schirm geschrieben wird. Wird währenddessen eine beliebige Taste gedrückt,
+dann gelangt man nach dem Speichertest in den 'Startdialog'.
+
+Nach dem Speichertest bzw. nach Wahl von <1> 'Systemstart' im Startdialog wird der
+Hintergrund aktiviert, was je nach Größe des Systems und Art des Hintergrundmedi­
+ums unterschiedlich lange dauert.
+
+#on("i")##on("b")##ib#Systemabschaltung#ie# :#off("b")##off("i")#
+Bevor man den Rechner ausschaltet, sollte jedes EUMEL-System ordnungsgemäß
+abgeschaltet werden. Das geschieht durch den Befehl 'shutup', den man in der Multi­
+user-Version von EUMEL im privilegierten Zweig des Taskbaumes erteilen muß. Nur
+dann ist gewährleistet, daß der aktuelle Zustand Ihres Systems gesichert ist.
+
+Andernfalls gilt das System als abgebrochen, was daran zu erkennen ist, daß sich das
+System beim nächsten Systemstart mit 'RERUN' meldet. Dann kann nur am letzten
+Fixpunkt wieder aufgesetzt werden, und Ihre in letzter Zeit (normalerweise ca. 15
+Minuten) gesammelten Daten können verloren sein.
+
+Installation des EUMEL-Systems
+#free (1.0)#
+
+#goalpage("a1")#A: Erforderliche Disketten
+
+ - EUMEL-Systemdiskette : "Generierungseumel XY"#u#1)#e#
+ - EUMEL-Hintergrunddisketten : "HG0" ... "HGn"
+ - EUMEL-Archivdisketten : "std..."
+ - EUMEL-Archivdiskette : "XY" (Typabhängig)
+ - MS-DOS-Diskette : "EUMELstart"
+
+#foot#
+1) XY steht für die Typbezeichnung eines Rechners wie: XT, AT, M24 usw.
+ Die Anzahl der ausgelieferten Disketten ist auch typabhängig, da z.B.
+ 'EUMELstart' nur benötigt wird, falls tatsächlich eine Partitionierung möglich ist.
+#end#
+
+Die Diskette #goalpage("v1")##on("u")#"Generierungseumel XY"#off("u")# ist ein kleines, jedoch vollständiges EUMEL-
+System. Auf diesem System laufen nach dem Hochfahren Programme ab, die im
+Dialog mit dem Benutzer die Generierung einer oder mehrerer EUMEL-Partitionen
+ermöglichen, diese Bereiche bezüglich schlechter Spuren untersuchen und das SHard
+auf der jeweiligen Partition installieren. #on("b")#Bei der Generierung darf diese Diskette nicht
+schreibgeschützt sein !#off("b")#
+
+Die #on ("u")#Hintergrunddisketten "HG0" ... "HGn"#off ("u")# beinhalten das eigentliche Betriebssystem
+EUMEL. Es sind dies der Systemkern EUMEL-0 und die darauf aufbauenden Sy­
+stemteile (siehe Seite #topage("v2")#).
+
+Die #on ("u")#Standardarchivdisketten "std..."#off ("u")# beinhalten ELAN-Programmpakete und Fontta­
+bellen, die Sie nach erfolgter Installation des Betriebssytems z.B. zum Zwecke einer
+Druckerinstallation oder erweiterter Rechenfunktionen benötigen werden. Sie finden
+dazu detaillierte Informationen in Ihrem Benutzer- und Systemhandbuch.
+
+Die #on("u")#Archivdiskette "XY"#off ("u")# beinhaltet ELAN-Programmpakete, die Funktionen, die nicht
+zu den Standardleistungen von EUMEL bzw. der vorliegenden SHard-Version zählen.
+
+Die Diskette #on("u")#"EUMELstart"#off("u")# ist eine MS-DOS Diskette und beinhaltet Kommando-
+Dateien. Falls Sie auch eine MS-DOS Partition eingerichtet haben, dann gewährlei­
+sten diese das Aktivieren einer EUMEL Partition mit gleichzeitigem Systemstart von
+MS-DOS aus.
+#free (1.0)#
+
+#goalpage("a2")#B: Partitionieren der Festplatte / Installation des SHard
+
+
+Wenn Sie bereits ein Betriebssystem auf Ihrer Festplatte installiert haben, müssen Sie
+darauf achten, daß noch ausreichend Platz für ein EUMEL-System übrig ist. Da z.B.
+MS-DOS standardmäßig die gesamte Festplatte belegt, muß dieses System gesi­
+chert, mit dem MS-DOS-Kommando 'fdisk' gelöscht und entsprechend kleiner neu
+eingerichtet werden. Sie können auch bei der EUMEL-Installation alle bereits beste­
+henden Systeme löschen; dazu bietet Ihnen der Generierungseumel die Option
+#on("i")#Löschen der gesamten Partitionstabelle #off("i")# an. Dabei gehen jedoch alle bestehenden
+Daten verloren. Achten Sie also darauf, daß sie alle Daten vorher gesichert haben !
+
+#on("u")##on("i")#Hinweis:#off("i")##off("u")# Bei Festplatten mit einer Kapazität über 32 Megabyte kann die Installa­
+ tion des SHard zu Problemen führen (Fehlermeldung #on("i")#Platte kann nicht
+ gelesen werden#off("i")# bei der Suche nach schlechten Spuren). Richten Sie
+ daher Ihre EUMEL-Partition(en) auf den ersten 32 Megabyte ein.
+
+Um nun die Partitionierung für Ihr EUMEL-System vorzunehmen, legen Sie die
+Diskette 'Generierungseumel' in das Boot-Laufwerk. Sollte die Diskette mit einer
+Schreibschutzmarke versehen sein, dann müssen Sie diese vorher entfernen.
+
+Schalten Sie nun den Rechner ein bzw. betätigen Sie den Tastatur-RESET, wenn Ihr
+Gerät bereits eingeschaltet ist, indem Sie die Tasten <CTRL> <ALT> <DEL> gleichzeitig
+betätigen.
+
+Der Generierungseumel meldet sich zunächst mit folgender SHard-Meldung:
+
+
+
+____________________________________________________________________________
+
+Setup - SHard für EUMEL auf XY und Kompatiblen V x.x
+Copyright (C) 1985,86
+EUMEL wird vom Hintergrund geladen
+
+____________________________________________________________________________
+
+
+
+Danach erscheinen die EUMEL-0 Meldungen zu HG-, RAM- und Pufferkapazität,
+bezogen auf den Diskettenhintergrundes des Generierungseumel.
+
+#on("i")##on("u")#ACHTUNG:#off("u")##off("i")# Der Generierungseumel soll während des Speichertests (Sternchen)
+ nicht unterbrochen werden. Geschieht dies versehentlich doch, dann
+ fahren Sie fort, indem Sie im Startdialog die Taste <1> für Systemstart
+ betätigen. Dann wird normal mit der Installation fortgefahren. Wählen
+ Sie keinesfalls <2> 'neuen Hintergrund vom Archive laden', solange sich
+ die Diskette 'Generierungseumel' im Archivlaufwerk befindet.
+
+Nach dem Hochfahren des 'Generierungseumel' wird Ihnen eine Tabelle angezeigt,
+der Sie entnehmen können, ob bereits Partitionen auf der Festplatte eingerichtet und
+wie diese spezifiziert sind.
+
+Angezeigt werden neben Größe, Start- und Endspur der einzelnen Partitionen auch
+eine Typ-Nr.; für EUMEL-Partitionen werden in aufsteigender Reihenfolge die
+Typ-Nummern 69 bis 72, für MS-DOS je nach Größe der eingerichteten Partition
+die Nummer 1 oder 4 vergeben. Die Typ-Nummern der eingerichteten Partitionen
+sollten Sie sich merken, da diese Angaben später von Bedeutung sind, wenn das
+Gesamtsystem für Partitionswechsel vorbereitet wird. Richten Sie mehrere EUMEL-
+Partitionen ein, dann können Sie diese ausschließlich über die Typ-Nummern identi­
+fizieren !
+
+Außerdem wird die gerade aktive Partition durch einen entsprechenden Eintrag in der
+Tabelle kenntlich gemacht. #on("b")#"Aktiv" ist die Partition, die nach dem nächsten Einschal­
+ten des Rechners bzw. nach dem nächsten Tastatur-RESET gebootet würde.#off("b")#
+
+Sie können nun eine der folgenden Funktionen auswählen :
+
+ - Generieren einer EUMEL-Partition
+ - Aktivieren einer Partition
+ - Löschen einer EUMEL-Partition
+ - Löschen der gesamten Partitionstabelle
+ - Generierung beenden
+
+Beim Generieren einer EUMEL-Partition werden lediglich Angaben zu Größe und
+Startzylinder abgefragt. Dafür werden Vorgaben gemacht, die Sie bestätigen können,
+indem Sie die <CR> Taste betätigen.
+
+Beim Neueinrichten orientiert sich die Vorgabe für die Partitionsgröße an dem größten
+zusammenhängenden Freiraum auf Ihrer Platte, die Vorgabe für den Startzylinder
+orientiert sich dann an dem kleinsten zusammenhängenden Freiraum, auf dem eine
+Partition der gewählten Größe eingerichtet werden kann.
+
+#on("i")##on("u")#ACHTUNG:#off("u")##off("i")# Soll eine EUMEL-Version installiert werden, die nur 16 Megabyte
+ verwalten kann (1.7.3 bzw. 1.8.0), dann darf die Partition nicht größer
+ eingerichtet werden. Es kann hier keine generelle Aussage über die
+ Anzahl der zu reservierenden Spuren gemacht werden, da sehr ver­
+ schiedene Plattenaufteilungen angeboten werden. Entnehmen Sie die
+ entsprechenden Angaben bitte dem Festplatten-Handbuch Ihres Hard­
+ wareherstellers.
+
+Das Löschen einer EUMEL-Partition geschieht nur logisch, nicht physisch, das heißt
+es wird nur der Eintrag in der Partitionstabelle gelöscht. Sollten Sie später an gleicher
+Stelle eine neue Partition einrichten und vorher diesen Bereich physisch nicht über­
+schrieben haben, dann würde nach dem Hochfahren des Rechners das alte System
+wieder gestartet. Die Meldung 'kein EUMEL-System gefunden'(siehe unten) erscheint
+dann nicht.
+
+Haben Sie Ihre EUMEL-Partition(en) eingerichtet, dann achten Sie darauf, daß Sie
+Ihren Generierungseumel ordnungsgemäß wieder verlassen, da es sich hier, wie
+bereits erwähnt, um ein vollständiges EUMEL-System mit Fixpoint/Rerun-Logik
+handelt. Das 'shutup' wird automatisch ausgeführt, wenn Sie die Funktion '0. Gene­
+rierung beenden' wählen.
+
+Wenn die Meldung 'ENDE' auf Ihrem Bildschirm erscheint, ist dieser Schritt der
+Installation beendet. Sie haben nun eine (oder mehrere) EUMEL-Partitionen einge­
+richtet und das SHard installiert. Bitte entfernen Sie jetzt die Diskette 'Generierungs­
+eumel' aus dem Diskettenlaufwerk.
+#free (1.0)#
+Laden eines EUMEL-Hintergrundes
+
+#free(1.0)#
+Im nächsten Schritt wird auf Ihrer Festplatte das EUMEL-System installiert, d.h. es
+wird ein Hintergrund auf der Festplatte erzeugt.
+
+Dazu müssen Sie nach dem ordnungsgemäßen Beenden des Generierungseumel und
+Entfernen der Diskette aus dem Laufwerk den Tastatur-RESET betätigen. Dies
+geschieht entweder durch gleichzeitiges Betätigen der Tasten <CNTL> <ALT> <DEL>
+auf der Tastatur oder durch AUS- und wieder EIN-Schalten des Rechners (Bitte
+warten Sie einen Augenblick zwischen dem AUS- und EIN-Schalten).
+
+Das System meldet sich nach kurzer Zeit mit folgender SHard-Meldung:
+
+
+____________________________________________________________________________
+
+SHard für EUMEL auf XY, V x.x
+Copyright (C) 1985,86
+kein EUMEL-System gefunden
+
+____________________________________________________________________________
+
+
+
+Sie legen nun die Hintergrunddiskette HG0 in das Boot-Laufwerk und betätigen eine
+Taste.
+
+Der Systemkern wird nun geladen und es erscheinen die bereits oben erwähnten
+Angaben zu HG-, RAM- und Pufferkapazität, sowie zu den angeschlossenen
+Kanälen, diesmal jedoch bezogen auf die eingerichtete Festplatten-Partition. Wäh­
+rend des Speichertests drücken Sie bitte erneut eine Taste, um in den Startdialog zu
+gelangen und damit zu verhindern, daß EUMEL-0 versucht, das System zu starten.
+Sollten Sie dies versäumen, so erscheint die Meldung 'HG ungültig'. Sie haben dann
+erneut die Möglichkeit, durch Betätigen einer Taste in den Startdialog zu gelangen.
+
+Hier wählen Sie den Menupunkt <2> 'neuen Hintergrund vom Archiv laden' und bestä­
+tigen die Frage 'Alten Hintergrund überschreiben' mit <j> für 'ja'.
+
+Es erscheint ein Zähler auf dem Bildschirm, der die gelesenen Blöcke anzeigt. Verteilt
+sich Ihr Hintergrund auf mehrere Disketten, dann müssen Sie bei bei der Frage
+'Neues HG-Archiv eingelegt' die nächste Diskette einlegen und mit <j># #off("i")# quittieren.
+Bitte beachten Sie dabei genau die Numerierung der HG-Disketten !
+
+Es können bei beschädigten Disketten Lesefehler auftreten; dann gibt das System
+eine der Meldungen 'Harter Lesefehler' bzw. 'Softerror' aus. Bei letzterem konnte der
+entsprechende Sektor nach mehrmaligem Versuch noch gelesen werden. Bei einem
+harten Lesefehler können Sie die Diskette nicht verwenden.
+
+Wenn alle Disketten eingelesen sind, müssen Sie ein letztes mal den Tastatur-
+RESET betätigen, um das System zu starten. Vergessen Sie nicht, vorher die Hinter­
+grunddiskette aus dem Diskettenlaufwerk zu entfernen.
+
+Wenn Sie jetzt während des Hochfahrens keine Taste drücken, dann startet der Lader
+durch und das EUMEL-System meldet sich mit 'System aufgebaut'. Dies dauert
+beim Auslieferungshintergrund wenige Sekunden, kann jedoch bei größeren Systemsi­
+cherungen auch mehrere Minuten in Anspruch nehmen; verlieren Sie dann bitte nicht
+allzu schnell die Geduld.
+
+Da der Auslieferungs-Hintergrund unkonfiguriert ist, gelangt das System beim ersten
+Hochfahren nach der Installation sofort in den 'configurator'. Sie müssen jetzt den
+Kanal 1 entsprechend der vorhandenen Tastatur als "PC.german" oder "PC.ascii"
+konfigurieren. Sollten Sie eine EUMEL-Version 1.7.3 benutzen und diesen Konfigura­
+tionsdatenraum nicht zur Verfügung haben, dann konfigurieren Sie den Kanal 1 als
+"PC" und Terminal. Näheres dazu finden Sie im Systemhandbuch (Teil 1).
+#page#
+ Die einzelnen Schritte der Installation im Überblick
+#free (0.5)#
+#linefeed(1.5)#
+ 1. Die Diskette 'Generierungseumel' in das Laufwerk stecken
+ 2. Rechner einschalten oder Tastatur-RESET mit <CTRL>, <ALT> <DEL>
+ 3. EUMEL-Partition einrichten
+ 4. Generierung beenden und auf 'ENDE'-Meldung warten
+ 5. Diskette 'Generierungseumel' entnehmen
+ 6. Tastatur-RESET
+ 7. Die Meldung 'Kein EUMEL-System gefunden' abwarten. Wenn die Meldung
+ 'EUMEL wird vom Hintergrund geladen' erscheint, dann weiter bei 9.
+ 8. Erste Hintergrunddiskette (HG0) einlegen und Taste drücken
+ 9. Beim Speichertest eine Taste betätigen, um in den Startdialog zu gelangen.
+ 10. Menupunkt <2> anwählen : Neuen Hintergrund vom Archiv laden
+ 11. Eventuell weitere HG-Disketten nach entsprechender Aufforderung einlegen
+ und mit <j> quittieren
+ 12. Tastatur-RESET nach entsprechender Aufforderung
+ 13. Nach dem Hochfahren des Systems Konfiguration lt. Systemhandbuch
+ vornehmen
+ 14. Ggf. in der Task 'SYSUR' ELAN-Pakete für Partitionswechsel insertieren.
+ #linefeed (1.0)#
+ Dazu - Falls eine EUMEL-Version 1.7.3 benutzt wird, zunächst das
+ Kommando #on("i")#free global manager#off("i")# in der Task 'configurator' absetzen
+ - Archivdiskette "XY" einlegen und anmelden : #on("i")#archive �("XY")#off("i")#
+ - Datei "XY install" von Archivdiskette lesen :
+ #on("i")#fetch ("XY install", archive)#off("i")#
+ - Insertierung starten : #on("i")#run#off("i")#
+Druckersoftware einrichten
+
+#free(0.5)#
+Um mit Ihrem EUMEL-System einen Drucker betreiben zu können, müssen Sie
+außer dem Anschluß des Druckers mit einem passenden Kabel auch die passende
+Software für diesen Drucker zur Verfügung stellen. Zu diesem Zweck dienen die
+Druckeranpassungen.
+
+Das Standardarchive "std.printer" enthält Druckeranpassungen für die Ansteuerung
+diverser gebräuchlicher Druckertypen. Soll einer dieser Drucker an das EUMEL-
+System angeschlossen werden, so muß zuerst eine Task "#ib#PRINTER#ie#" als Sohntask
+von "SYSUR" mit dem Supervisorkommando
+
+#linefeed (1.18)#
+ begin ("PRINTER", "SYSUR")
+#linefeed (1.0)#
+
+eingerichtet werden. In dieser Task müssen dann die folgenden Schritte vollzogen
+werden:
+
+- Archiv anmelden:
+#linefeed (1.18)#
+ archive ("std.printer")
+#linefeed (1.0)#
+
+- Druckeranpassung vom Archiv holen:
+#linefeed (1.18)#
+ fetch ("printer.druckertyp", archive)
+#linefeed (1.0)#
+
+- Zeilennummergenerierung bei der Insertierung abschalten:
+#linefeed (1.18)#
+ check off
+#linefeed (1.0)#
+
+- Druckeranpassung insertieren:
+#linefeed (1.18)#
+ insert ("printer.druckertyp")
+#linefeed (1.0)#
+
+Beispiel:
+#linefeed (1.18)#
+ archive ("std.printer")
+ fetch ("printer.epson.fx", archive);
+ check off;
+ insert ("printer.epson.fx")
+#linefeed (1.0)#
+
+Nach der Insertierung wird zuerst nach dem #ib#Druckerkanal#ie# gefragt. Dieser sollte mit
+der Gerätetabelle 'transparent' konfiguriert sein. Dann werden ggf. druckerspezifische
+Fragen zur Papierbreite, Positionierungsart oder ähnlichem gestellt, die mit 'j' oder 'n'
+beantwortet werden müssen. Dabei werden alle Alternativantworten zu der jeweili­
+gen Frage hintereinander angeboten, bis eine Alternative mit 'j' beantwortet wird.
+
+Als letzter Schritt kommt die Aufforderung das Archiv mit der passenden Fonttabelle
+einzulegen. Diese Fonttabelle, eine Beschreibung aller darstellbaren Zeichen in allen
+druckbaren Schrifttypen, ist meistens auf derselben Diskette wie die Druckeranpas­
+sung.
+
+Wenn die Generierung beendet ist, muß im Multi-User Betrieb in allen bestehenden
+Tasks - insbesondere in der Task 'PUBLIC' - die Fonttabelle mit dem fonttable-
+Kommando eingestellt werden.
+
+Beispiel:
+
+#linefeed (1.18)#
+ fonttable("fonttab.epson.fx")
+#linefeed (1.0)#
+
+Von jeder Task aus kann danach mit dem Kommando
+
+#linefeed (1.18)#
+ print ("dateiname")
+#linefeed (1.0)#
+
+wird eine Datei ausgedruckt werden.
+
+Das Einstellene einer Fonttabelle ist insbesondere Voraussetzung für 'lineform', 'page­
+form' etc.
+
+Befindet sich keine passende Druckeranpassung für den anzuschließenden Drucker­
+typ auf dem Standardarchiv "std.printer", so sollte die Druckeranpassung "printer.std"
+benutzt werden. Diese Druckeranpassung ist eine universelle Druckeranpassung für
+alle Drucker, die mit ASCII-Code 13 ein 'Carriage Return' (d.h. Bewegung des
+Druckkopfes an den linken Rand) und mit ASCII-Code 10 eine Zeilenschaltung von
+1/6 Zoll vornehmen. Mit ihr kann dann in einem Schrifttyp (entweder 10 oder 12
+Zeichen pro Zoll, je nachdem welche Fonttabelle eingestellt ist) gedruckt werden. So
+erhält man wenigstens eine Minimalansteuerung des Druckers.
+
+
+
+Druckersoftware im Single-User einrichten
+
+
+Die Installation der Druckersoftware im Single-User erfolgt ähnlich wie die im Mul­
+ti-User. Hier brauchen nur die Schritte durchgeführt zu werden, die im Multi-User
+in der Task "PRINTER" druchgeführt werden müssen. Eine Task "PRINTER" braucht
+nicht eingerichtet zu werden.
+
diff --git a/doc/user-manual/1.8.7/doc/source-disk b/doc/user-manual/1.8.7/doc/source-disk
new file mode 100644
index 0000000..97500ef
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/source-disk
@@ -0,0 +1 @@
+grundpaket/09_handbuecher.1.img